Class: Gem::Commands::LockCommand

Inherits:
Gem::Command show all
Defined in:
lib/rubygems/commands/lock_command.rb

Instance Attribute Summary

Attributes inherited from Gem::Command

#command, #defaults, #options, #program_name, #summary

Instance Method Summary collapse

Methods inherited from Gem::Command

add_common_option, #add_extra_args, #add_option, add_specific_extra_args, #begins?, build_args, build_args=, #check_deprecated_options, common_options, #deprecate_option, extra_args, extra_args=, #get_all_gem_names, #get_all_gem_names_and_versions, #get_one_gem_name, #get_one_optional_argument, #handle_options, #handles?, #invoke, #invoke_with_build_args, #merge_options, #remove_option, #show_help, #show_lookup_failure, specific_extra_args, specific_extra_args_hash, #when_invoked

Methods included from UserInteraction

#alert, #alert_error, #alert_warning, #ask, #ask_for_password, #ask_yes_no, #choose_from_list, #say, #terminate_interaction, #verbose

Methods included from DefaultUserInteraction

ui, #ui, ui=, #ui=, use_ui, #use_ui

Methods included from Text

#clean_text, #format_text, #levenshtein_distance, #min3, #truncate_text

Constructor Details

#initializeLockCommand

Returns a new instance of LockCommand.



6
7
8
9
10
11
12
13
14
# File 'lib/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

Instance Method Details

#argumentsObject

:nodoc:



16
17
18
# File 'lib/rubygems/commands/lock_command.rb', line 16

def arguments # :nodoc:
  "GEMNAME       name of gem to lock\nVERSION       version of gem to lock"
end

#complain(message) ⇒ Object



61
62
63
64
65
66
67
# File 'lib/rubygems/commands/lock_command.rb', line 61

def complain(message)
  if options[:strict]
    raise Gem::Exception, message
  else
    say "# #{message}"
  end
end

#defaults_strObject

:nodoc:



20
21
22
# File 'lib/rubygems/commands/lock_command.rb', line 20

def defaults_str # :nodoc:
  "--no-strict"
end

#descriptionObject

:nodoc:



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
49
50
51
52
53
54
55
# File 'lib/rubygems/commands/lock_command.rb', line 24

def description # :nodoc:
  <<-EOF
The lock command will generate a list of +gem+ statements that will lock down
the versions for the gem given in the command line.  It will specify exact
versions in the requirements list to ensure that the gems loaded will always
be consistent.  A full recursive search of all effected gems will be
generated.

Example:

gem lock rails-1.0.0 > lockdown.rb

will produce in lockdown.rb:

require "rubygems"
gem 'rails', '= 1.0.0'
gem 'rake', '= 0.7.0.1'
gem 'activesupport', '= 1.2.5'
gem 'activerecord', '= 1.13.2'
gem 'actionpack', '= 1.11.2'
gem 'actionmailer', '= 1.1.5'
gem 'actionwebservice', '= 1.0.0'

Just load lockdown.rb from your application to ensure that the current
versions are loaded.  Make sure that lockdown.rb is loaded *before* any
other require statements.

Notice that rails 1.0.0 only requires that rake 0.6.2 or better be used.
Rake-0.7.0.1 is the most recent version installed that satisfies that, so we
lock it down to the exact version.
  EOF
end

#executeObject



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/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) ⇒ Object



102
103
104
105
106
107
108
# File 'lib/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

#usageObject

:nodoc:



57
58
59
# File 'lib/rubygems/commands/lock_command.rb', line 57

def usage # :nodoc:
  "#{program_name} GEMNAME-VERSION [GEMNAME-VERSION ...]"
end