In Files

  • bundler/spec_set.rb

Class/Module Index [+]

Quicksearch

Bundler::SpecSet

Public Class Methods

new(specs) click to toggle source
 
               # File bundler/spec_set.rb, line 10
def initialize(specs)
  @specs = specs
end
            

Public Instance Methods

<<(spec) click to toggle source
 
               # File bundler/spec_set.rb, line 135
def <<(spec)
  @specs << spec
end
            
[](key) click to toggle source
 
               # File bundler/spec_set.rb, line 56
def [](key)
  key = key.name if key.respond_to?(:name)
  lookup[key].reverse
end
            
[]=(key, value) click to toggle source
 
               # File bundler/spec_set.rb, line 61
def []=(key, value)
  @specs << value
  @lookup = nil
  @sorted = nil
end
            
each(&b) click to toggle source
 
               # File bundler/spec_set.rb, line 151
def each(&b)
  sorted.each(&b)
end
            
empty?() click to toggle source
 
               # File bundler/spec_set.rb, line 147
def empty?
  @specs.empty?
end
            
find_by_name_and_platform(name, platform) click to toggle source
 
               # File bundler/spec_set.rb, line 124
def find_by_name_and_platform(name, platform)
  @specs.detect {|spec| spec.name == name && spec.match_platform(platform) }
end
            
for(dependencies, skip = [], check = false, match_current_platform = false, raise_on_missing = true) click to toggle source
 
               # File bundler/spec_set.rb, line 14
def for(dependencies, skip = [], check = false, match_current_platform = false, raise_on_missing = true)
  handled = []
  deps = dependencies.dup
  specs = []
  skip += ["bundler"]

  loop do
    break unless dep = deps.shift
    next if handled.include?(dep) || skip.include?(dep.name)

    handled << dep

    specs_for_dep = spec_for_dependency(dep, match_current_platform)
    if specs_for_dep.any?
      specs += specs_for_dep

      specs_for_dep.first.dependencies.each do |d|
        next if d.type == :development
        d = DepProxy.get_proxy(d, dep.__platform) unless match_current_platform
        deps << d
      end
    elsif check
      return false
    elsif raise_on_missing
      others = lookup[dep.name] if match_current_platform
      message = "Unable to find a spec satisfying #{dep} in the set. Perhaps the lockfile is corrupted?"
      message += " Found #{others.join(", ")} that did not match the current platform." if others && !others.empty?
      raise GemNotFound, message
    end
  end

  if spec = lookup["bundler"].first
    specs << spec
  end

  check ? true : SpecSet.new(specs)
end
            
length() click to toggle source
 
               # File bundler/spec_set.rb, line 139
def length
  @specs.length
end
            
materialize(deps, missing_specs = nil) click to toggle source
 
               # File bundler/spec_set.rb, line 79
def materialize(deps, missing_specs = nil)
  materialized = self.for(deps, [], false, true, !missing_specs).to_a
  deps = materialized.map(&:name).uniq
  materialized.map! do |s|
    next s unless s.is_a?(LazySpecification)
    s.source.dependency_names = deps if s.source.respond_to?(:dependency_names=)
    s.source.local!
    spec = s.__materialize__
    unless spec
      unless missing_specs
        raise GemNotFound, "Could not find #{s.full_name} in any of the sources"
      end
      missing_specs << s
    end
    spec
  end
  SpecSet.new(missing_specs ? materialized.compact : materialized)
end
            
materialized_for_all_platforms() click to toggle source

Materialize for all the specs in the spec set, regardless of what platform they’re for This is in contrast to how for does platform filtering (and specifically different from how `materialize` calls `for` only for the current platform) @return [Array<Gem::Specification>]

 
               # File bundler/spec_set.rb, line 101
def materialized_for_all_platforms
  names = @specs.map(&:name).uniq
  @specs.map do |s|
    next s unless s.is_a?(LazySpecification)
    s.source.dependency_names = names if s.source.respond_to?(:dependency_names=)
    s.source.local!
    s.source.remote!
    spec = s.__materialize__
    raise GemNotFound, "Could not find #{s.full_name} in any of the sources" unless spec
    spec
  end
end
            
merge(set) click to toggle source
 
               # File bundler/spec_set.rb, line 114
def merge(set)
  arr = sorted.dup
  set.each do |set_spec|
    full_name = set_spec.full_name
    next if arr.any? {|spec| spec.full_name == full_name }
    arr << set_spec
  end
  SpecSet.new(arr)
end
            
size() click to toggle source
 
               # File bundler/spec_set.rb, line 143
def size
  @specs.size
end
            
sort!() click to toggle source
 
               # File bundler/spec_set.rb, line 67
def sort!
  self
end
            
to_a() click to toggle source
 
               # File bundler/spec_set.rb, line 71
def to_a
  sorted.dup
end
            
to_hash() click to toggle source
 
               # File bundler/spec_set.rb, line 75
def to_hash
  lookup.dup
end
            
valid_for?(deps) click to toggle source
 
               # File bundler/spec_set.rb, line 52
def valid_for?(deps)
  self.for(deps, [], true)
end
            
what_required(spec) click to toggle source
 
               # File bundler/spec_set.rb, line 128
def what_required(spec)
  unless req = find {|s| s.dependencies.any? {|d| d.type == :runtime && d.name == spec.name } }
    return [spec]
  end
  what_required(req) << spec
end