class Bundler::SpecSet
Public Class Methods
new(specs)
click to toggle source
# File lib/bundler/spec_set.rb, line 9 def initialize(specs) @specs = specs end
Public Instance Methods
<<(spec)
click to toggle source
# File lib/bundler/spec_set.rb, line 118 def <<(spec) @specs << spec end
[](key)
click to toggle source
# File lib/bundler/spec_set.rb, line 45 def [](key) key = key.name if key.respond_to?(:name) lookup[key].reverse end
[]=(key, value)
click to toggle source
# File lib/bundler/spec_set.rb, line 50 def []=(key, value) @specs << value @lookup = nil @sorted = nil end
each(&b)
click to toggle source
# File lib/bundler/spec_set.rb, line 134 def each(&b) sorted.each(&b) end
empty?()
click to toggle source
# File lib/bundler/spec_set.rb, line 130 def empty? @specs.empty? end
find_by_name_and_platform(name, platform)
click to toggle source
# File lib/bundler/spec_set.rb, line 107 def find_by_name_and_platform(name, platform) @specs.detect {|spec| spec.name == name && spec.match_platform(platform) } end
for(dependencies, check = false, match_current_platform = false)
click to toggle source
# File lib/bundler/spec_set.rb, line 13 def for(dependencies, check = false, match_current_platform = false) handled = [] deps = dependencies.dup specs = [] loop do break unless dep = deps.shift next if handled.any?{|d| d.name == dep.name && (match_current_platform || d.__platform == dep.__platform) } || dep.name == "bundler" handled << dep specs_for_dep = spec_for_dependency(dep, match_current_platform) if specs_for_dep.any? match_current_platform ? specs += specs_for_dep : 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 end end if spec = lookup["bundler"].first specs << spec end check ? true : specs end
length()
click to toggle source
# File lib/bundler/spec_set.rb, line 122 def length @specs.length end
materialize(deps)
click to toggle source
# File lib/bundler/spec_set.rb, line 68 def materialize(deps) materialized = self.for(deps, false, true) materialized.map! do |s| next s unless s.is_a?(LazySpecification) s.source.local! s.__materialize__ || s end SpecSet.new(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 lib/bundler/spec_set.rb, line 82 def materialized_for_all_platforms @specs.map do |s| next s unless s.is_a?(LazySpecification) 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 lib/bundler/spec_set.rb, line 97 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
missing_specs()
click to toggle source
# File lib/bundler/spec_set.rb, line 93 def missing_specs @specs.select {|s| s.is_a?(LazySpecification) } end
size()
click to toggle source
# File lib/bundler/spec_set.rb, line 126 def size @specs.size end
sort!()
click to toggle source
# File lib/bundler/spec_set.rb, line 56 def sort! self end
to_a()
click to toggle source
# File lib/bundler/spec_set.rb, line 60 def to_a sorted.dup end
to_hash()
click to toggle source
# File lib/bundler/spec_set.rb, line 64 def to_hash lookup.dup end
what_required(spec)
click to toggle source
# File lib/bundler/spec_set.rb, line 111 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
Private Instance Methods
extract_circular_gems(error)
click to toggle source
# File lib/bundler/spec_set.rb, line 152 def extract_circular_gems(error) error.message.scan(/@name="(.*?)"/).flatten end
lookup()
click to toggle source
# File lib/bundler/spec_set.rb, line 156 def lookup @lookup ||= begin lookup = Hash.new {|h, k| h[k] = [] } Index.sort_specs(@specs).reverse_each do |s| lookup[s.name] << s end lookup end end
sorted()
click to toggle source
# File lib/bundler/spec_set.rb, line 140 def sorted rake = @specs.find {|s| s.name == "rake" } begin @sorted ||= ([rake] + tsort).compact.uniq rescue TSort::Cyclic => error cgems = extract_circular_gems(error) raise CyclicDependencyError, "Your bundle requires gems that depend" \ " on each other, creating an infinite loop. Please remove either" \ " gem '#{cgems[1]}' or gem '#{cgems[0]}' and try again." end end
spec_for_dependency(dep, match_current_platform)
click to toggle source
# File lib/bundler/spec_set.rb, line 171 def spec_for_dependency(dep, match_current_platform) specs_for_platforms = lookup[dep.name] if match_current_platform GemHelpers.select_best_platform_match(specs_for_platforms.select{|s| Gem::Platform.match_spec?(s) }, Bundler.local_platform) else GemHelpers.select_best_platform_match(specs_for_platforms, dep.__platform) end end
tsort_each_child(s) { |s2| ... }
click to toggle source
# File lib/bundler/spec_set.rb, line 180 def tsort_each_child(s) s.dependencies.sort_by(&:name).each do |d| next if d.type == :development lookup[d.name].each {|s2| yield s2 } end end
tsort_each_node() { |s| ... }
click to toggle source
# File lib/bundler/spec_set.rb, line 166 def tsort_each_node # MUST sort by name for backwards compatibility @specs.sort_by(&:name).each {|s| yield s } end