Class: Gem::SpecificationRecord
- Inherits:
- 
      Object
      
        - Object
- Gem::SpecificationRecord
 
- Includes:
- Enumerable
- Defined in:
- lib/rubygems/specification_record.rb
Class Method Summary collapse
Instance Method Summary collapse
- 
  
    
      #add_spec(spec)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Adds specto the the record, keeping the collection properly sorted.
- 
  
    
      #all  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Returns the list of all specifications in the record. 
- 
  
    
      #all=(specs)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Sets the specs known by the record to specs.
- 
  
    
      #all_names  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Return full names of all specs in the record in sorted order. 
- 
  
    
      #each  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Enumerate every known spec. 
- 
  
    
      #find_active_stub_by_path(path)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Return the best specification in the record that contains the file matching path, among those already activated.
- 
  
    
      #find_all_by_name(name, *requirements)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Returns every spec in the record that matches nameand optionalrequirements.
- 
  
    
      #find_by_path(path)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Return the best specification in the record that contains the file matching path.
- 
  
    
      #find_inactive_by_path(path)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Return the best specification in the record that contains the file matching pathamongst the specs that are not activated.
- 
  
    
      #initialize(dirs)  ⇒ SpecificationRecord 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    A new instance of SpecificationRecord. 
- 
  
    
      #latest_spec_for(name)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Return the latest installed spec in the record for gem name.
- 
  
    
      #latest_specs(prerelease)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Return the latest specs in the record, optionally including prerelease specs if prereleaseis true.
- 
  
    
      #remove_spec(spec)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Removes specfrom the record.
- 
  
    
      #stubs  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Returns a Gem::StubSpecification for every specification in the record. 
- 
  
    
      #stubs_for(name)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Returns a Gem::StubSpecification for every specification in the record named nameonly returns stubs that match Gem.platforms.
- 
  
    
      #stubs_for_pattern(pattern, match_platform = true)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Finds stub specifications matching a pattern in the record, optionally filtering out specs not matching the current platform. 
Constructor Details
#initialize(dirs) ⇒ SpecificationRecord
Returns a new instance of SpecificationRecord.
| 15 16 17 18 19 20 21 22 23 | # File 'lib/rubygems/specification_record.rb', line 15 def initialize(dirs) @all = nil @stubs = nil @stubs_by_name = {} @spec_with_requirable_file = {} @active_stub_with_requirable_file = {} @dirs = dirs end | 
Class Method Details
.dirs_from(paths) ⇒ Object
| 5 6 7 8 9 | # File 'lib/rubygems/specification_record.rb', line 5 def self.dirs_from(paths) paths.map do |path| File.join(path, "specifications") end end | 
.from_path(path) ⇒ Object
| 11 12 13 | # File 'lib/rubygems/specification_record.rb', line 11 def self.from_path(path) new(dirs_from([path])) end | 
Instance Method Details
#add_spec(spec) ⇒ Object
Adds spec to the the record, keeping the collection properly sorted.
| 78 79 80 81 82 83 84 85 86 87 | # File 'lib/rubygems/specification_record.rb', line 78 def add_spec(spec) return if all.include? spec all << spec stubs << spec (@stubs_by_name[spec.name] ||= []) << spec Gem::Specification._resort!(@stubs_by_name[spec.name]) Gem::Specification._resort!(stubs) end | 
#all ⇒ Object
Returns the list of all specifications in the record
| 32 33 34 | # File 'lib/rubygems/specification_record.rb', line 32 def all @all ||= stubs.map(&:to_spec) end | 
#all=(specs) ⇒ Object
Sets the specs known by the record to specs.
| 101 102 103 104 | # File 'lib/rubygems/specification_record.rb', line 101 def all=(specs) @stubs_by_name = specs.group_by(&:name) @all = @stubs = specs end | 
#all_names ⇒ Object
Return full names of all specs in the record in sorted order.
| 109 110 111 | # File 'lib/rubygems/specification_record.rb', line 109 def all_names all.map(&:full_name) end | 
#each ⇒ Object
Enumerate every known spec.
| 118 119 120 121 122 123 124 | # File 'lib/rubygems/specification_record.rb', line 118 def each return enum_for(:each) unless block_given? all.each do |x| yield x end end | 
#find_active_stub_by_path(path) ⇒ Object
Return the best specification in the record that contains the file matching path, among those already activated.
| 173 174 175 176 177 178 179 | # File 'lib/rubygems/specification_record.rb', line 173 def find_active_stub_by_path(path) stub = @active_stub_with_requirable_file[path] ||= stubs.find do |s| s.activated? && s.contains_requirable_file?(path) end || NOT_FOUND stub.this end | 
#find_all_by_name(name, *requirements) ⇒ Object
Returns every spec in the record that matches name and optional requirements.
| 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | # File 'lib/rubygems/specification_record.rb', line 129 def find_all_by_name(name, *requirements) req = Gem::Requirement.create(*requirements) env_req = Gem.env_requirement(name) matches = stubs_for(name).find_all do |spec| req.satisfied_by?(spec.version) && env_req.satisfied_by?(spec.version) end.map(&:to_spec) if name == "bundler" && !req.specific? require_relative "bundler_version_finder" Gem::BundlerVersionFinder.prioritize!(matches) end matches end | 
#find_by_path(path) ⇒ Object
Return the best specification in the record that contains the file matching path.
| 148 149 150 151 152 153 154 155 | # File 'lib/rubygems/specification_record.rb', line 148 def find_by_path(path) path = path.dup.freeze spec = @spec_with_requirable_file[path] ||= stubs.find do |s| s.contains_requirable_file? path end || NOT_FOUND spec.to_spec end | 
#find_inactive_by_path(path) ⇒ Object
Return the best specification in the record that contains the file matching path amongst the specs that are not activated.
| 161 162 163 164 165 166 167 | # File 'lib/rubygems/specification_record.rb', line 161 def find_inactive_by_path(path) stub = stubs.find do |s| next if s.activated? s.contains_requirable_file? path end stub&.to_spec end | 
#latest_spec_for(name) ⇒ Object
Return the latest installed spec in the record for gem name.
| 192 193 194 | # File 'lib/rubygems/specification_record.rb', line 192 def latest_spec_for(name) latest_specs(true).find {|installed_spec| installed_spec.name == name } end | 
#latest_specs(prerelease) ⇒ Object
Return the latest specs in the record, optionally including prerelease specs if prerelease is true.
| 185 186 187 | # File 'lib/rubygems/specification_record.rb', line 185 def latest_specs(prerelease) Gem::Specification._latest_specs stubs, prerelease end | 
#remove_spec(spec) ⇒ Object
Removes spec from the record.
| 92 93 94 95 96 | # File 'lib/rubygems/specification_record.rb', line 92 def remove_spec(spec) all.delete spec.to_spec stubs.delete spec (@stubs_by_name[spec.name] || []).delete spec end | 
#stubs ⇒ Object
Returns a Gem::StubSpecification for every specification in the record
| 39 40 41 42 43 44 45 46 47 | # File 'lib/rubygems/specification_record.rb', line 39 def stubs @stubs ||= begin pattern = "*.gemspec" stubs = stubs_for_pattern(pattern, false) @stubs_by_name = stubs.select {|s| Gem::Platform.match_spec? s }.group_by(&:name) stubs end end | 
#stubs_for(name) ⇒ Object
Returns a Gem::StubSpecification for every specification in the record named name only returns stubs that match Gem.platforms
| 53 54 55 56 57 58 59 60 61 | # File 'lib/rubygems/specification_record.rb', line 53 def stubs_for(name) if @stubs @stubs_by_name[name] || [] else @stubs_by_name[name] ||= stubs_for_pattern("#{name}-*.gemspec").select do |s| s.name == name end end end | 
#stubs_for_pattern(pattern, match_platform = true) ⇒ Object
Finds stub specifications matching a pattern in the record, optionally filtering out specs not matching the current platform
| 67 68 69 70 71 72 73 | # File 'lib/rubygems/specification_record.rb', line 67 def stubs_for_pattern(pattern, match_platform = true) installed_stubs = installed_stubs(pattern) installed_stubs.select! {|s| Gem::Platform.match_spec? s } if match_platform stubs = installed_stubs + Gem::Specification.default_stubs(pattern) Gem::Specification._resort!(stubs) stubs end |