class Gem::Commands::LockCommand

Public Class Methods

new() click to toggle source
Calls superclass method Gem::Command.new
# File lib/rubygems/commands/lock_command.rb, line 5
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 lib/rubygems/commands/lock_command.rb, line 60
def complain(message)
 if options[:strict] then
 raise Gem::Exception, message
 else
 say "# #{message}"
 end
end
execute() click to toggle source
# File lib/rubygems/commands/lock_command.rb, line 68
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? then
 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? then
 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 lib/rubygems/commands/lock_command.rb, line 101
def spec_path(gem_full_name)
 gemspecs = Gem.path.map { |path|
 File.join path, "specifications", "#{gem_full_name}.gemspec"
 }
 gemspecs.find { |path| File.exist? path }
end