class EacLauncher::Ruby::Gem::Build

Public Class Methods

new(original_gem_root) click to toggle source
# File lib/eac_launcher/ruby/gem/build.rb, line 14
def initialize(original_gem_root)
  @original_gem_root = original_gem_root
end

Public Instance Methods

build() click to toggle source
# File lib/eac_launcher/ruby/gem/build.rb, line 28
def build
  return if builded?

  copy_gem_files
  build_gem
  check_gem_empty_size
  check_gem_version
end
builded?() click to toggle source
# File lib/eac_launcher/ruby/gem/build.rb, line 24
def builded?
  output_file.present? && ::File.exist?(output_file)
end
close() click to toggle source
# File lib/eac_launcher/ruby/gem/build.rb, line 37
def close
  ::FileUtils.remove_entry(@gem_root) if @gem_root && ::File.directory?(@gem_root)
  @gem_root = nil
end
output_file() click to toggle source
# File lib/eac_launcher/ruby/gem/build.rb, line 18
def output_file
  return nil unless @gem_root

  @gem_root.find_files_with_extension('.gem').first
end

Private Instance Methods

build_gem() click to toggle source
# File lib/eac_launcher/ruby/gem/build.rb, line 49
def build_gem
  info("Building gemspec #{gemspec_file}...")
  clear_gems
  Dir.chdir @gem_root do
    isolated_build_gem
  end
end
bundle_dependencies() click to toggle source
# File lib/eac_launcher/ruby/gem/build.rb, line 96
def bundle_dependencies
  gemfile = @gem_root.subpath('Gemfile')
  return unless ::File.exist?(gemfile)

  Dir.chdir(@gem_root) do
    EacRubyUtils::Envs.local.command('bundle', 'install').execute!
  end
end
check_gem_empty_size() click to toggle source
# File lib/eac_launcher/ruby/gem/build.rb, line 63
def check_gem_empty_size
  Dir.mktmpdir do |dir|
    Dir.chdir dir do
      EacRubyUtils::Envs.local.command('gem', 'unpack', gem).system
      gs = File.join(dir, File.basename(gem, '.gem'))
      if (Dir.entries(gs) - %w[. ..]).empty?
        raise "\"#{dir}\" (Unpacked from #{gem}) has no source code"
      end
    end
  end
end
check_gem_version() click to toggle source
# File lib/eac_launcher/ruby/gem/build.rb, line 89
def check_gem_version
  spec = ::EacLauncher::Ruby::Gem::Specification.new(gemspec_file)
  return if ::File.basename(output_file, '.gem') == spec.full_name

  raise("Builded gem is not the same version of gemspec (#{spec}, #{output_file})")
end
clear_gems() click to toggle source
# File lib/eac_launcher/ruby/gem/build.rb, line 75
def clear_gems
  @gem_root.find_files_with_extension('.gem').each do |f|
    FileUtils.rm_rf(f)
  end
end
copy_gem_files() click to toggle source
# File lib/eac_launcher/ruby/gem/build.rb, line 44
def copy_gem_files
  @gem_root = ::EacLauncher::Paths::Real.new(::Dir.mktmpdir)
  FileUtils.cp_r "#{@original_gem_root}/.", @gem_root
end
envvars_starting_with(start_with_vars) click to toggle source
# File lib/eac_launcher/ruby/gem/build.rb, line 117
def envvars_starting_with(start_with_vars)
  ENV.select { |k, _v| start_with_vars.any? { |var| k.start_with?(var) } }
end
gem() click to toggle source
# File lib/eac_launcher/ruby/gem/build.rb, line 85
def gem
  @gem_root.find_file_with_extension('.gem')
end
gemspec_file() click to toggle source
# File lib/eac_launcher/ruby/gem/build.rb, line 81
def gemspec_file
  @gem_root.find_file_with_extension('.gemspec')
end
isolated_build_gem() click to toggle source
# File lib/eac_launcher/ruby/gem/build.rb, line 57
def isolated_build_gem
  on_clean_ruby do
    EacRubyUtils::Envs.local.command('gem', 'build', gemspec_file).execute!
  end
end
on_clean_ruby() { || ... } click to toggle source
# File lib/eac_launcher/ruby/gem/build.rb, line 105
def on_clean_ruby
  on_clear_envvars('BUNDLE', 'RUBY') { yield }
end
on_clear_envvars(*start_with_vars) { || ... } click to toggle source
# File lib/eac_launcher/ruby/gem/build.rb, line 109
def on_clear_envvars(*start_with_vars)
  old_values = envvars_starting_with(start_with_vars)
  old_values.each_key { |k| ENV.delete(k) }
  yield
ensure
  old_values&.each { |k, v| ENV[k] = v }
end