diff options
Diffstat (limited to 'lib/bundler/resolver/spec_group.rb')
-rw-r--r-- | lib/bundler/resolver/spec_group.rb | 111 |
1 files changed, 40 insertions, 71 deletions
diff --git a/lib/bundler/resolver/spec_group.rb b/lib/bundler/resolver/spec_group.rb index 232520de77..5cee444e5e 100644 --- a/lib/bundler/resolver/spec_group.rb +++ b/lib/bundler/resolver/spec_group.rb @@ -3,107 +3,76 @@ module Bundler class Resolver class SpecGroup - attr_accessor :name, :version, :source - attr_accessor :activated_platforms - - def self.create_for(specs, all_platforms, specific_platform) - specific_platform_specs = specs[specific_platform] - return unless specific_platform_specs.any? - - platforms = all_platforms.select {|p| specs[p].any? } - - new(specific_platform_specs.first, specs, platforms) + def initialize(specs) + @specs = specs end - def initialize(exemplary_spec, specs, relevant_platforms) - @exemplary_spec = exemplary_spec - @name = exemplary_spec.name - @version = exemplary_spec.version - @source = exemplary_spec.source - - @activated_platforms = relevant_platforms - @dependencies = Hash.new do |dependencies, platforms| - dependencies[platforms] = dependencies_for(platforms) - end - @specs = specs + def empty? + @specs.empty? end - def to_specs - activated_platforms.map do |p| - specs = @specs[p] - next unless specs.any? - - specs.map do |s| - lazy_spec = LazySpecification.new(name, version, s.platform, source) - lazy_spec.dependencies.replace s.dependencies - lazy_spec - end - end.flatten.compact.uniq + def name + @name ||= exemplary_spec.name end - def to_s - activated_platforms_string = sorted_activated_platforms.join(", ") - "#{name} (#{version}) (#{activated_platforms_string})" + def version + @version ||= exemplary_spec.version end - def dependencies_for_activated_platforms - @dependencies[activated_platforms] + def source + @source ||= exemplary_spec.source end - def ==(other) - return unless other.is_a?(SpecGroup) - name == other.name && - version == other.version && - sorted_activated_platforms == other.sorted_activated_platforms && - source == other.source + def to_specs(force_ruby_platform) + @specs.map do |s| + lazy_spec = LazySpecification.from_spec(s) + lazy_spec.force_ruby_platform = force_ruby_platform + lazy_spec + end end - def eql?(other) - return unless other.is_a?(SpecGroup) - name.eql?(other.name) && - version.eql?(other.version) && - sorted_activated_platforms.eql?(other.sorted_activated_platforms) && - source.eql?(other.source) + def to_s + sorted_spec_names.join(", ") end - def hash - name.hash ^ version.hash ^ sorted_activated_platforms.hash ^ source.hash + def dependencies + @dependencies ||= @specs.map do |spec| + __dependencies(spec) + metadata_dependencies(spec) + end.flatten.uniq end protected - def sorted_activated_platforms - activated_platforms.sort_by(&:to_s) + def sorted_spec_names + @sorted_spec_names ||= @specs.map(&:full_name).sort end private - def dependencies_for(platforms) - platforms.map do |platform| - __dependencies(platform) + metadata_dependencies(platform) - end.flatten + def exemplary_spec + @specs.first end - def __dependencies(platform) + def __dependencies(spec) dependencies = [] - @specs[platform].first.dependencies.each do |dep| + spec.dependencies.each do |dep| next if dep.type == :development - dependencies << DepProxy.get_proxy(dep, platform) + dependencies << Dependency.new(dep.name, dep.requirement) end dependencies end - def metadata_dependencies(platform) - spec = @specs[platform].first - return [] if spec.is_a?(LazySpecification) - dependencies = [] - if !spec.required_ruby_version.nil? && !spec.required_ruby_version.none? - dependencies << DepProxy.get_proxy(Gem::Dependency.new("Ruby\0", spec.required_ruby_version), platform) - end - if !spec.required_rubygems_version.nil? && !spec.required_rubygems_version.none? - dependencies << DepProxy.get_proxy(Gem::Dependency.new("RubyGems\0", spec.required_rubygems_version), platform) - end - dependencies + def metadata_dependencies(spec) + [ + metadata_dependency("Ruby", spec.required_ruby_version), + metadata_dependency("RubyGems", spec.required_rubygems_version), + ].compact + end + + def metadata_dependency(name, requirement) + return if requirement.nil? || requirement.none? + + Dependency.new("#{name}\0", requirement) end end end |