ManageIQ/polisher

View on GitHub
lib/polisher/cli/cross_ref.rb

Summary

Maintainability
A
1 hr
Test Coverage
#!/usr/bin/ruby
# Polisher CLI Cross Reference Utils
#
# Licensed under the MIT license
# Copyright (C) 2015 Red Hat, Inc.
###########################################################

module Polisher
  module CLI
    def missing_deps
      @missing_deps ||= {}
    end

    def alt_deps
      @alt_deps ||= {}
    end

    def missing_dep?(dep)
      if dep.is_a?(String)
        missing_deps.key?(dep)
      else
        # XXX : need to nullify dep.type for this lookup
        dep.instance_variable_set(:@type, :runtime)
        missing_deps.key?(dep.name) && missing_deps[dep.name].any? { |gdep| gdep == dep }
      end
    end

    def missing_downstream?(dep)
      Polisher::VersionChecker.matching_versions(dep).empty?
    end

    def alternative?(name)
      alt_deps.key?(name)
    end

    def latest_alt(name)
      alt_deps[name].max
    end

    def alt_versions(name)
      Polisher::VersionChecker.known_versions_for(name).values.flatten
    end

    def check_missing_dep(dep)
      dep_already_processed = missing_dep?(dep)      # determine if this requirement was already recorded
      gem_already_processed = missing_dep?(dep.name) # determine if previous requirement was not satified & recorded in deps

      # even if current dep is not missing downstream we need to record all deps for gems with at least one missing dep
      if (!dep_already_processed && missing_downstream?(dep)) || gem_already_processed
        missing_deps[dep.name] ||= []
        missing_deps[dep.name]  << dep unless dep_already_processed
        alt_deps[dep.name]       = alt_versions(dep.name) unless alternative?(dep.name)
      end
    end

    def upstream_versions(name)
      @upstream_versions       ||= {}
      @upstream_versions[name] ||= Polisher::Gem.remote_versions_for(name)
                                                .select { |v| missing_deps[name].all? { |dep| dep.match?(name, v)} }
    end

    def upstream_version?(name)
      !upstream_versions(name).empty?
    end

    def updatable_versions(name)
      latest         = latest_alt(name)
      latest_version = ::Gem::Version.new(latest)
      matching       = upstream_versions(name)
      latest.nil? ? matching : matching.select { |m| ::Gem::Version.new(m) > latest_version }
    end
  end # module CLI
end # module Polisher