lib/polisher/rpm/requirement.rb in polisher-0.10.2 vs lib/polisher/rpm/requirement.rb in polisher-0.11.1
- old
+ new
@@ -1,197 +1,41 @@
-# Polisher RPM Requirement Represenation
+# Polisher RPM Requirement
#
# Licensed under the MIT license
# Copyright (C) 2013-2014 Red Hat, Inc.
-require 'polisher/gem'
-require 'polisher/core'
-require 'polisher/component'
+require 'polisher/util/conf_helpers'
-module Polisher
- deps = ['gem2rpm', 'versionomy', 'active_support/core_ext']
- Component.verify("RPM::Requirement", *deps) do
- module RPM
- class Requirement
- include ConfHelpers
+require 'polisher/rpm/requirement/attributes'
+require 'polisher/rpm/requirement/parser'
+require 'polisher/rpm/requirement/comparison'
- conf_attr :rubygem_prefix, 'rubygem'
- conf_attr :scl_prefix, '' # set to %{?scl_prefix} to enable scl's
+require 'polisher/rpm/requirement/gem_reference'
- def self.prefix
- "#{scl_prefix}#{rubygem_prefix}"
- end
+module Polisher
+ module RPM
+ class Requirement
+ include ConfHelpers
- # Bool indiciating if req is a BR
- attr_accessor :br
+ include RequirementAttributes
+ include RequirementParser
+ include RequirementComparison
- # Name of requirement
- attr_accessor :name
+ # TODO: make this mixin optional depending on if requirement corresponds to gem
+ include RequirementGemReference
- # Condition, eg >=, =, etc
- attr_accessor :condition
+ conf_attr :rubygem_prefix, 'rubygem'
+ conf_attr :scl_prefix, '' # set to %{?scl_prefix} to enable scl's
- # Version number
- attr_accessor :version
+ def initialize(args = {})
+ @br = args[:br] || false
+ @name = args[:name]
+ @condition = args[:condition]
+ @version = args[:version]
- # Requirement string
- def str
- sp = self.specifier
- sp.nil? ? "#{@name}" : "#{@name} #{sp}"
- end
-
- # Specified string
- def specifier
- @version.nil? ? nil : "#{@condition} #{@version}"
- end
-
- # Instantiate / return new rpm spec requirements from string
- def self.parse(str, opts={})
- stra = str.split
- br = str.include?('BuildRequires')
- name = condition = version = nil
-
- if str.include?('Requires')
- name = stra[1]
- condition = stra[2]
- version = stra[3]
-
- else
- name = stra[0]
- condition = stra[1]
- version = stra[2]
-
- end
-
- req = self.new({:name => name,
- :condition => condition,
- :version => version,
- :br => br}.merge(opts))
- req
- end
-
- # Instantiate / return new rpm spec requirements from gem dependency.
- #
- # Because a gem dependency may result in multiple spec requirements
- # this will always return an array of Requirement instances
- def self.from_gem_dep(gem_dep, br=false)
- gem_dep.requirement.to_s.split(',').collect { |req|
- expanded = Gem2Rpm::Helpers.expand_requirement [req.split]
- expanded.collect { |e|
- new :name => "#{prefix}(#{gem_dep.name})",
- :condition => e.first.to_s,
- :version => e.last.to_s,
- :br => br
- }
- }.flatten
- end
-
- def initialize(args={})
- @br = args[:br] || false
- @name = args[:name]
- @condition = args[:condition]
- @version = args[:version]
-
- @name.strip! unless @name.nil?
- @condition.strip! unless @condition.nil?
- @version.strip! unless @version.nil?
- end
-
- def ==(other)
- @br == other.br &&
- @name == other.name &&
- @condition == other.condition &&
- @version == other.version
- end
-
- # Greatest Common Denominator,
- # Max version in list that is less than the local version
- def gcd(versions)
- lversion = Versionomy.parse(self.version)
- versions.collect { |v| Versionomy.parse(v) }.
- sort { |a,b| a <=> b }.reverse.
- find { |v| v < lversion }.to_s
- end
-
- # Minimum gem version which satisfies this dependency
- def min_satisfying_version
- return "0.0" if self.version.nil? ||
- self.condition == '<' ||
- self.condition == '<='
- return self.version if self.condition == '=' ||
- self.condition == '>='
- Versionomy.parse(self.version).bump(:tiny).to_s # self.condition == '>'
- end
-
- # Max gem version which satisfies this dependency
- #
- # Can't automatically deduce in '<' case, so if that is the conditional
- # we require a version list, and will return the gcd from it
- def max_satisfying_version(versions=nil)
- return Float::INFINITY if self.version.nil? ||
- self.condition == '>' ||
- self.condition == '>='
- return self.version if self.condition == '=' ||
- self.condition == '<='
-
- raise ArgumentError if versions.nil?
- self.gcd(versions)
- end
-
- # Minimum gem version for which this dependency fails
- def min_failing_version
- raise ArgumentError if self.version.nil?
- return "0.0" if self.condition == '>' ||
- self.condition == '>='
- return self.version if self.condition == '<'
- Versionomy.parse(self.version).bump(:tiny).to_s # self.condition == '<=' and '='
- end
-
- # Max gem version for which this dependency fails
- #
- # Can't automatically deduce in '>=', and '=' cases, so if that is the
- # conditional we require a version list, and will return the gcd from it
- def max_failing_version(versions=nil)
- raise ArgumentError if self.version.nil? ||
- self.condition == '<=' ||
- self.condition == '<'
- return self.version if self.condition == '>'
-
- raise ArgumentError if versions.nil?
- self.gcd(versions)
- end
-
- # Return bool indicating if requirement matches specified
- # depedency.
- #
- # Comparison mechanism will depend on type of class
- # passed to this. Valid types include
- # - Polisher::RPM::Requirements
- # - ::Gem::Dependency
- def matches?(dep)
- return self == dep if dep.is_a?(self.class)
- raise ArgumentError unless dep.is_a?(::Gem::Dependency)
-
- return false if !self.gem? || self.gem_name != dep.name
- return true if self.version.nil?
-
- Gem2Rpm::Helpers.expand_requirement([dep.requirement.to_s.split]).
- any?{ |req|
- req.first == self.condition && req.last.to_s == self.version
- }
- end
-
- # Whether or not this requirement specified a ruby gem dependency
- def gem?
- !!(self.str =~ RPM::Spec::SPEC_GEM_REQ_MATCHER)
- end
-
- # Return the name of the gem which this requirement is for.
- # Returns nil if this is not a gem requirement
- def gem_name
- # XXX need to explicitly run regex here to get $1
- !!(self.str =~ RPM::Spec::SPEC_GEM_REQ_MATCHER) ? $1 : nil
- end
- end # class Requirement
- end # module RPM
- end # Component.verify("RPM::Requirement")
+ @name.strip! unless @name.nil?
+ @condition.strip! unless @condition.nil?
+ @version.strip! unless @version.nil?
+ end
+ end # class Requirement
+ end # module RPM
end # module Polisher