class Gem::Commands::LockCommand

Public Class Methods

new() click to toggle source
Calls superclass method Gem::Command::new
# File rubygems/commands/lock_command.rb, line 6
def initialize
  super "lock", "Generate a lockdown list of gems",
        strict: false

  add_option "-s", "--[no-]strict",
             "fail if unable to satisfy a dependency" do |strict, options|
    options[:strict] = strict
  end
end

Public Instance Methods

complain(message) click to toggle source
# File rubygems/commands/lock_command.rb, line 61
def complain(message)
  if options[:strict]
    raise Gem::Exception, message
  else
    say "# #{message}"
  end
end
execute() click to toggle source
# File rubygems/commands/lock_command.rb, line 69
def execute
  say "require 'rubygems'"

  locked = {}

  pending = options[:args]

  until pending.empty? do
    full_name = pending.shift

    spec = Gem::Specification.load spec_path(full_name)

    if spec.nil?
      complain "Could not find gem #{full_name}, try using the full name"
      next
    end

    say "gem '#{spec.name}', '= #{spec.version}'" unless locked[spec.name]
    locked[spec.name] = true

    spec.runtime_dependencies.each do |dep|
      next if locked[dep.name]
      candidates = dep.matching_specs

      if candidates.empty?
        complain "Unable to satisfy '#{dep}' from currently installed gems"
      else
        pending << candidates.last.full_name
      end
    end
  end
end
spec_path(gem_full_name) click to toggle source
# File rubygems/commands/lock_command.rb, line 102
def spec_path(gem_full_name)
  gemspecs = Gem.path.map do |path|
    File.join path, "specifications", "#{gem_full_name}.gemspec"
  end

  gemspecs.find {|path| File.exist? path }
end