Class: Kettle::Dev::GemSourceProbe

Inherits:
Object
  • Object
show all
Defined in:
lib/kettle/dev/gem_source_probe.rb

Constant Summary collapse

UNBUNDLED_ENV_KEYS =
(BundlerEnvGuard::RESET_ENV_KEYS + %w[
  RUBYGEMS_GEMDEPS
  RUBYLIB
  RUBYOPT
]).freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(source_url:, ruby: Gem.ruby) ⇒ GemSourceProbe

Returns a new instance of GemSourceProbe.



18
19
20
21
# File 'lib/kettle/dev/gem_source_probe.rb', line 18

def initialize(source_url:, ruby: Gem.ruby)
  @source_url = source_url
  @ruby = ruby
end

Class Method Details

.bundler_inline_script(name:, version:, source_url:) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/kettle/dev/gem_source_probe.rb', line 50

def self.bundler_inline_script(name:, version:, source_url:)
  <<~RUBY
    # frozen_string_literal: true

    require "bundler/inline"

    gem_name = #{name.dump}
    version = #{version.dump}

    gemfile(true) do
      source #{source_url.dump}
      gem gem_name, "= \#{version}", require: false
    end

    spec = Gem::Specification.find_all_by_name(gem_name, "= \#{version}").first
    abort("resolved no \#{gem_name} \#{version} spec from #{source_url}") unless spec
    puts "Validated \#{gem_name} \#{version} from #{source_url}"
  RUBY
end

Instance Method Details

#available?(name, version) ⇒ Boolean

Returns:

  • (Boolean)


23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/kettle/dev/gem_source_probe.rb', line 23

def available?(name, version)
  stderr = nil
  BundlerEnvGuard.warn_unexpected_env!
  with_probe_gem_home do |gem_home|
    _stdout, stderr, status = Open3.capture3(
      probe_env(gem_home),
      "gem",
      "install",
      name,
      "-v",
      "= #{version}",
      "--source",
      source_url,
      "--clear-sources",
      "--ignore-dependencies",
      "--no-document",
      "--install-dir",
      gem_home
    )
    status.success?
  end
rescue SystemCallError => error
  raise Error, "Could not verify #{name} #{version} from #{source_url}: #{error.message}"
ensure
  warn(stderr) if ENV["KETTLE_DEV_DEBUG"] == "true" && stderr && !stderr.empty?
end