module Polisher::RPM::SpecComparison

Public Instance Methods

compare(upstream_source) click to toggle source

Compare this spec to a sepecified upstream gem source and return result.

upstream_source should be an instance of Polisher::Gem, Polisher::Gemfile, or other class defining a ‘deps’ accessor that returns an array of Gem::Requirement dependencies

Result will be a hash containing the shared dependencies as well as those that differ and their respective differences

# File lib/polisher/rpm/spec/comparison.rb, line 18
def compare(upstream_source)
  same = {}
  diff = {}
  upstream_source.deps.each do |d|
    spec_reqs = requirements_for_gem(d.name)
    spec_reqs_specifier = spec_reqs.empty? ? nil :
         spec_reqs.collect { |req| req.specifier }

    if spec_reqs.nil?
      diff[d.name] = {:spec     => nil,
                      :upstream => d.requirement.to_s}

    elsif !spec_reqs.any? { |req| req.matches?(d) } ||
          !self.has_all_requirements_for?(d)
      diff[d.name] = {:spec     => spec_reqs_specifier,
                      :upstream => d.requirement.to_s}

    elsif !diff.has_key?(d.name)
      same[d.name] = {:spec     => spec_reqs_specifier,
                      :upstream => d.requirement.to_s}
    end
  end

  @metadata[:requires].each do |req|
    next unless req.gem?

    upstream_dep = upstream_source.deps.find { |d| d.name == req.gem_name }

    if upstream_dep.nil?
      diff[req.gem_name] = {:spec     => req.specifier,
                            :upstream => nil}

    elsif !req.matches?(upstream_dep)
      diff[req.gem_name] = {:spec     => req.specifier,
                            :upstream => upstream_dep.requirement.to_s}

    elsif !diff.has_key?(req.gem_name)
      same[req.gem_name] = {:spec     => req.specifier,
                            :upstream => upstream_dep.requirement.to_s}
    end
  end unless @metadata[:requires].nil?

  {:same => same, :diff => diff}
end