Class Gem::Commands::DependencyCommand
In: lib/rubygems/commands/dependency_command.rb
Parent: Gem::Command

Methods

Included Modules

Gem::LocalRemoteOptions Gem::VersionOption

Public Class methods

[Source]

    # File lib/rubygems/commands/dependency_command.rb, line 11
11:   def initialize
12:     super 'dependency',
13:           'Show the dependencies of an installed gem',
14:           :version => Gem::Requirement.default, :domain => :local
15: 
16:     add_version_option
17:     add_platform_option
18: 
19:     add_option('-R', '--[no-]reverse-dependencies',
20:                'Include reverse dependencies in the output') do
21:       |value, options|
22:       options[:reverse_dependencies] = value
23:     end
24: 
25:     add_option('-p', '--pipe',
26:                "Pipe Format (name --version ver)") do |value, options|
27:       options[:pipe_format] = value
28:     end
29: 
30:     add_local_remote_options
31:   end

Public Instance methods

[Source]

     # File lib/rubygems/commands/dependency_command.rb, line 45
 45:   def execute
 46:     options[:args] << '' if options[:args].empty?
 47:     specs = {}
 48: 
 49:     source_indexes = Hash.new do |h, source_uri|
 50:       h[source_uri] = Gem::SourceIndex.new
 51:     end
 52: 
 53:     pattern = if options[:args].length == 1 and
 54:                  options[:args].first =~ /\A\/(.*)\/(i)?\z/m then
 55:                 flags = $2 ? Regexp::IGNORECASE : nil
 56:                 Regexp.new $1, flags
 57:               else
 58:                 /\A#{Regexp.union(*options[:args])}/
 59:               end
 60: 
 61:     dependency = Gem::Dependency.new pattern, options[:version]
 62: 
 63:     if options[:reverse_dependencies] and remote? and not local? then
 64:       alert_error 'Only reverse dependencies for local gems are supported.'
 65:       terminate_interaction 1
 66:     end
 67: 
 68:     if local? then
 69:       Gem.source_index.search(dependency).each do |spec|
 70:         source_indexes[:local].add_spec spec
 71:       end
 72:     end
 73: 
 74:     if remote? and not options[:reverse_dependencies] then
 75:       fetcher = Gem::SpecFetcher.fetcher
 76: 
 77:       begin
 78:         fetcher.find_matching(dependency).each do |spec_tuple, source_uri|
 79:           spec = fetcher.fetch_spec spec_tuple, URI.parse(source_uri)
 80: 
 81:           source_indexes[source_uri].add_spec spec
 82:         end
 83:       rescue Gem::RemoteFetcher::FetchError => e
 84:         raise unless fetcher.warn_legacy e do
 85:           require 'rubygems/source_info_cache'
 86: 
 87:           specs = Gem::SourceInfoCache.search_with_source dependency, false
 88: 
 89:           specs.each do |spec, source_uri|
 90:             source_indexes[source_uri].add_spec spec
 91:           end
 92:         end
 93:       end
 94:     end
 95: 
 96:     if source_indexes.empty? then
 97:       patterns = options[:args].join ','
 98:       say "No gems found matching #{patterns} (#{options[:version]})" if
 99:         Gem.configuration.verbose
100: 
101:       terminate_interaction 1
102:     end
103: 
104:     specs = {}
105: 
106:     source_indexes.values.each do |source_index|
107:       source_index.gems.each do |name, spec|
108:         specs[spec.full_name] = [source_index, spec]
109:       end
110:     end
111: 
112:     reverse = Hash.new { |h, k| h[k] = [] }
113: 
114:     if options[:reverse_dependencies] then
115:       specs.values.each do |_, spec|
116:         reverse[spec.full_name] = find_reverse_dependencies spec
117:       end
118:     end
119: 
120:     if options[:pipe_format] then
121:       specs.values.sort_by { |_, spec| spec }.each do |_, spec|
122:         unless spec.dependencies.empty?
123:           spec.dependencies.each do |dep|
124:             say "#{dep.name} --version '#{dep.version_requirements}'"
125:           end
126:         end
127:       end
128:     else
129:       response = ''
130: 
131:       specs.values.sort_by { |_, spec| spec }.each do |_, spec|
132:         response << print_dependencies(spec)
133:         unless reverse[spec.full_name].empty? then
134:           response << "  Used by\n"
135:           reverse[spec.full_name].each do |sp, dep|
136:             response << "    #{sp} (#{dep})\n"
137:           end
138:         end
139:         response << "\n"
140:       end
141: 
142:       say response
143:     end
144:   end

[Source]

     # File lib/rubygems/commands/dependency_command.rb, line 175
175:   def find_gems(name, source_index)
176:     specs = {}
177: 
178:     spec_list = source_index.search name, options[:version]
179: 
180:     spec_list.each do |spec|
181:       specs[spec.full_name] = [source_index, spec]
182:     end
183: 
184:     specs
185:   end

Retuns list of [specification, dep] that are satisfied by spec.

[Source]

     # File lib/rubygems/commands/dependency_command.rb, line 158
158:   def find_reverse_dependencies(spec)
159:     result = []
160: 
161:     Gem.source_index.each do |name, sp|
162:       sp.dependencies.each do |dep|
163:         dep = Gem::Dependency.new(*dep) unless Gem::Dependency === dep
164: 
165:         if spec.name == dep.name and
166:            dep.version_requirements.satisfied_by?(spec.version) then
167:           result << [sp.full_name, dep]
168:         end
169:       end
170:     end
171: 
172:     result
173:   end

[Source]

     # File lib/rubygems/commands/dependency_command.rb, line 146
146:   def print_dependencies(spec, level = 0)
147:     response = ''
148:     response << '  ' * level + "Gem #{spec.full_name}\n"
149:     unless spec.dependencies.empty? then
150:       spec.dependencies.each do |dep|
151:         response << '  ' * level + "  #{dep}\n"
152:       end
153:     end
154:     response
155:   end

[Validate]