polisher 0.9.1 → 0.10.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,72 +3,85 @@
3
3
  # Licensed under the MIT license
4
4
  # Copyright (C) 2013-2014 Red Hat, Inc.
5
5
 
6
- require 'awesome_spawn'
7
6
  require 'polisher/core'
8
7
  require 'polisher/git_cache'
8
+ require 'polisher/component'
9
9
 
10
10
  module Polisher
11
11
  module Git
12
- # Git Repository
13
- class Repo
14
- extend ConfHelpers
15
-
16
- # TODO use ruby git api
17
- conf_attr :git_cmd, '/usr/bin/git'
18
-
19
- attr_accessor :url
20
-
21
- def initialize(args={})
22
- @url = args[:url]
23
- end
24
-
25
- def path
26
- GitCache.path_for(@url)
27
- end
28
-
29
- # Clobber the git repo
30
- def clobber!
31
- FileUtils.rm_rf path
32
- end
33
-
34
- def clone
35
- AwesomeSpawn.run "#{git_cmd} clone #{url} #{path}"
36
- end
37
-
38
- def cloned?
39
- File.directory?(path)
40
- end
41
-
42
- def in_repo
43
- Dir.chdir path do
44
- yield
12
+ Component.verify("Git::Repo", 'awesome_spawn') do
13
+ # Git Repository
14
+ class Repo
15
+ include ConfHelpers
16
+
17
+ # TODO use ruby git api
18
+ conf_attr :git_cmd, '/usr/bin/git'
19
+
20
+ attr_accessor :url
21
+ attr_accessor :path
22
+
23
+ def initialize(args={})
24
+ @url = args[:url]
25
+ @path = args[:path]
26
+ end
27
+
28
+ def path
29
+ @path || GitCache.path_for(@url)
30
+ end
31
+
32
+ # Clobber the git repo
33
+ def clobber!
34
+ FileUtils.rm_rf path
35
+ end
36
+
37
+ def clone
38
+ require_cmd! git_cmd
39
+ AwesomeSpawn.run! "#{git_cmd} clone #{url} #{path}"
40
+ end
41
+
42
+ def cloned?
43
+ File.directory?(path)
44
+ end
45
+
46
+ def in_repo
47
+ Dir.chdir path do
48
+ yield
49
+ end
50
+ end
51
+
52
+ def file_paths
53
+ in_repo { Dir['**/*'] }
54
+ end
55
+
56
+ def include?(file)
57
+ file_paths.include?(file)
58
+ end
59
+
60
+ # Note be careful when invoking:
61
+ def reset!
62
+ require_cmd! git_cmd
63
+ in_repo { AwesomeSpawn.run! "#{git_cmd} reset HEAD~ --hard" }
64
+ self
65
+ end
66
+
67
+ def pull
68
+ require_cmd! git_cmd
69
+ in_repo { AwesomeSpawn.run! "#{git_cmd} pull" }
70
+ self
71
+ end
72
+
73
+ def checkout(tgt)
74
+ require_cmd! git_cmd
75
+ in_repo { AwesomeSpawn.run! "#{git_cmd} checkout #{tgt}" }
76
+ self
77
+ end
78
+
79
+ def commit(msg)
80
+ require_cmd! git_cmd
81
+ in_repo { AwesomeSpawn.run! "#{git_cmd} commit -m '#{msg}'" }
82
+ self
45
83
  end
46
- end
47
-
48
- def file_paths
49
- in_repo { Dir['**/*'] }
50
- end
51
-
52
- # Note be careful when invoking:
53
- def reset!
54
- in_repo { AwesomeSpawn.run "#{git_cmd} reset HEAD~ --hard" }
55
- self
56
- end
57
-
58
- def pull
59
- in_repo { AwesomeSpawn.run "#{git_cmd} pull" }
60
- self
61
- end
62
-
63
- def checkout(tgt)
64
- in_repo { AwesomeSpawn.run "#{git_cmd} checkout #{tgt}" }
65
- self
66
- end
67
-
68
- def commit(msg)
69
- in_repo { AwesomeSpawn.run "#{git_cmd} commit -m '#{msg}'" }
70
- self
71
- end
72
- end # class Repo
84
+ end # class Repo
85
+ end # Component.verify("Git::Repo")
73
86
  end # module Git
74
87
  end # module Polisher
@@ -3,104 +3,157 @@
3
3
  # Licensed under the MIT license
4
4
  # Copyright (C) 2013-2014 Red Hat, Inc.
5
5
 
6
- require 'xmlrpc/client'
7
- require 'active_support/core_ext/kernel/reporting'
8
- silence_warnings do
9
- XMLRPC::Config::ENABLE_NIL_PARSER = true
10
- XMLRPC::Config::ENABLE_NIL_CREATE = true
11
- end
12
-
13
6
  require 'polisher/core'
7
+ require 'polisher/component'
14
8
 
15
9
  module Polisher
16
- class Koji
17
- extend ConfHelpers
10
+ deps = ['awesome_spawn', 'xmlrpc/client', 'active_support',
11
+ 'active_support/core_ext/kernel/reporting']
12
+ Component.verify("Koji", *deps) do
13
+ silence_warnings do
14
+ XMLRPC::Config::ENABLE_NIL_PARSER = true
15
+ XMLRPC::Config::ENABLE_NIL_CREATE = true
16
+ end
18
17
 
19
- # TODO Koji#build (on class or instance?)
18
+ class Koji
19
+ include ConfHelpers
20
20
 
21
- conf_attr :koji_url, 'koji.fedoraproject.org/kojihub'
22
- conf_attr :koji_tag, 'f21'
23
- conf_attr :package_prefix, 'rubygem-'
21
+ conf_attr :koji_url, 'koji.fedoraproject.org/kojihub'
22
+ conf_attr :koji_tag, 'f21'
23
+ conf_attr :package_prefix, 'rubygem-'
24
24
 
25
- def self.koji_tags
26
- [koji_tag].flatten
27
- end
25
+ # XXX don't like having to shell out to koji but quickest
26
+ # way to get an authenticated session so as to launch builds
27
+ conf_attr :build_cmd, '/usr/bin/koji'
28
+ conf_attr :build_tgt, 'rawhide'
28
29
 
29
- # Retrieve shared instance of xmlrpc client to use
30
- def self.client
31
- @client ||= begin
32
- url = koji_url.split('/')
33
- XMLRPC::Client.new(url[0..-2].join('/'),
34
- "/#{url.last}")
30
+ def self.koji_tags
31
+ [koji_tag].flatten
35
32
  end
36
- end
37
33
 
38
- # Return bool indiciating if koji has a build exactly
39
- # matching the specified version
40
- def self.has_build?(name, version)
41
- versions = self.versions_for name
42
- versions.include?(version)
43
- end
34
+ def self.package_prefixes
35
+ [package_prefix].flatten
36
+ end
44
37
 
45
- # Return bool indicating if koji has a build which
46
- # satisfies the specified ruby dependency
47
- def self.has_build_satisfying?(name, version)
48
- dep = ::Gem::Dependency.new name, version
49
- self.versions_for(name).any? { |v|
50
- dep.match?(name, v)
51
- }
52
- end
38
+ # Retrieve shared instance of xmlrpc client to use
39
+ def self.client
40
+ @client ||= begin
41
+ url = koji_url.split('/')
42
+ XMLRPC::Client.new(url[0..-2].join('/'),
43
+ "/#{url.last}")
44
+ end
45
+ end
53
46
 
54
- # Return list of tags for which a package exists
55
- #
56
- # @param [String] name of package to lookup
57
- # @return [Hash<String,String>] hash of tag names to package versions for tags
58
- # which package was found in
59
- def self.tagged_in(name)
60
- # tagid userid pkgid prefix inherit with_dups
61
- pkgs = client.call('listPackages', nil, nil, "rubygem-#{name}", nil, false, true)
62
- pkgs.collect { |pkg| pkg['tag_name'] }
63
- end
47
+ # Return bool indiciating if koji has a build exactly
48
+ # matching the specified version
49
+ def self.has_build?(name, version)
50
+ versions = versions_for name
51
+ versions.include?(version)
52
+ end
64
53
 
65
- # Retrieve list of the versions of the specified package in koji
66
- #
67
- # @param [String] name name of package to lookup
68
- # @param [Callable] bl optional block to invoke with versions retrieved
69
- # @return [Array<String>] versions retrieved, empty array if none found
70
- def self.versions_for(name, &bl)
71
- # koji xmlrpc call
72
- builds =
73
- koji_tags.collect do |tag|
74
- client.call('listTagged', tag, nil, false, nil, false,
75
- "#{package_prefix}#{name}")
76
- end.flatten
77
- versions = builds.collect { |b| b['version'] }
78
- bl.call(:koji, name, versions) unless(bl.nil?)
79
- versions
80
- end
54
+ # Return bool indicating if koji has a build which
55
+ # satisfies the specified ruby dependency
56
+ def self.has_build_satisfying?(name, version)
57
+ dep = ::Gem::Dependency.new name, version
58
+ versions_for(name).any? { |v| dep.match?(name, v) }
59
+ end
81
60
 
82
- # Return diff between list of packages in two tags in koji
83
- def self.diff(tag1, tag2)
84
- builds1 = client.call('listTagged', tag1, nil, false, nil, false)
85
- builds2 = client.call('listTagged', tag2, nil, false, nil, false)
86
- builds = {}
87
- builds1.each do |build|
88
- name = build['package_name']
89
- build2 = builds2.find { |b| b['name'] == name }
90
- version1 = build['version']
91
- version2 = build2 && build2['version']
92
- builds[name] = {tag1 => version1, tag2 => version2}
61
+ # Return list of tags for which a package exists
62
+ #
63
+ # @param [String] name of package to lookup
64
+ # @return [Hash<String,String>] hash of tag names to package versions for tags
65
+ # which package was found in
66
+ def self.tagged_in(name)
67
+ # tagid userid pkgid prefix inherit with_dups
68
+ pkgs = client.call('listPackages', nil, nil, "rubygem-#{name}", nil, false, true)
69
+ pkgs.collect { |pkg| pkg['tag_name'] }
93
70
  end
94
71
 
95
- builds2.each do |build|
96
- name = build['package_name']
97
- next if builds.key?(name)
72
+ # Retrieve list of the versions of the specified package in koji
73
+ #
74
+ # @param [String] name name of package to lookup
75
+ # @param [Callable] bl optional block to invoke with versions retrieved
76
+ # @return [Array<String>] versions retrieved, empty array if none found
77
+ def self.versions_for(name, &bl)
78
+ # koji xmlrpc call
79
+ versions = tagged_versions_for(name).values.flatten.uniq
80
+ bl.call(:koji, name, versions) unless bl.nil?
81
+ versions
82
+ end
98
83
 
99
- version = build['version']
100
- builds[name] = {tag1 => nil, tag2 => version}
84
+ def self.tagged_versions_for(name)
85
+ versions = {}
86
+ koji_tags.each do |tag|
87
+ versions[tag] = versions_for_tag(name, tag).flatten.uniq
88
+ end
89
+ versions
101
90
  end
102
91
 
103
- builds
104
- end
105
- end
106
- end
92
+ def self.tagged_version_for(name)
93
+ versions = {}
94
+ tagged_versions_for(name).each do |tag, tagged_versions|
95
+ versions[tag] = tagged_versions.first
96
+ end
97
+ versions
98
+ end
99
+
100
+ def self.versions_for_tag(name, tag)
101
+ metadata =
102
+ package_prefixes.collect do |prefix|
103
+ # tag event inherit prefix latest
104
+ client.call('listTagged', tag, nil, true, nil, false,
105
+ "#{prefix}#{name}")
106
+ end
107
+
108
+ metadata.flatten.collect { |b| b['version'] }.uniq
109
+ end
110
+
111
+ # Run a build against the specified target using the specified rpm
112
+ def self.build(args = {})
113
+ require_cmd! build_cmd
114
+
115
+ target = args[:target] || build_tgt
116
+ srpm = args[:srpm]
117
+ scratch = args[:scratch] ? '--scratch' : ''
118
+
119
+ cmd = "#{build_cmd} build #{scratch} #{target} #{srpm}"
120
+ result = AwesomeSpawn.run(cmd)
121
+ url = parse_url(result.output)
122
+ raise url if result.exit_status != 0
123
+ url
124
+ end
125
+
126
+ # Parse a koji build url from output
127
+ def self.parse_url(output)
128
+ task_info = output.lines.detect { |l| l =~ /Task info:.*/ }
129
+ task_info ? task_info.split.last : ''
130
+ end
131
+
132
+ # def self.build_logs(url) # TODO
133
+
134
+ # Return diff between list of packages in two tags in koji
135
+ def self.diff(tag1, tag2)
136
+ builds1 = client.call('listTagged', tag1, nil, false, nil, false)
137
+ builds2 = client.call('listTagged', tag2, nil, false, nil, false)
138
+ builds = {}
139
+ builds1.each do |build|
140
+ name = build['package_name']
141
+ build2 = builds2.detect { |b| b['name'] == name }
142
+ version1 = build['version']
143
+ version2 = build2 && build2['version']
144
+ builds[name] = {tag1 => version1, tag2 => version2}
145
+ end
146
+
147
+ builds2.each do |build|
148
+ name = build['package_name']
149
+ next if builds.key?(name)
150
+
151
+ version = build['version']
152
+ builds[name] = {tag1 => nil, tag2 => version}
153
+ end
154
+
155
+ builds
156
+ end
157
+ end # class Koji
158
+ end # Component.verify("Koji")
159
+ end # module Polisher
@@ -0,0 +1,23 @@
1
+ # Polisher Logging Module
2
+ #
3
+ # Licensed under the MIT license
4
+ # Copyright (C) 2014 Red Hat, Inc.
5
+
6
+ module Polisher
7
+ module Logging
8
+ # This is the magical bit that gets mixed into your classes
9
+ def logger
10
+ Logging.logger
11
+ end
12
+
13
+ # Set the log level
14
+ def self.level=(level)
15
+ logger.level = Logger.const_get(level.to_s.upcase)
16
+ end
17
+
18
+ # Global, memoized, lazy initialized instance of a logger
19
+ def self.logger
20
+ @logger ||= Logger.new(STDOUT)
21
+ end
22
+ end # module Logging
23
+ end # module Polisher
@@ -2,13 +2,14 @@
2
2
  #
3
3
  # Licensed under the MIT license
4
4
  # Copyright (C) 2013-2014 Red Hat, Inc.
5
-
6
- require 'pkgwat'
5
+ require 'polisher/component'
7
6
 
8
7
  module Polisher
9
- class RHN
10
- def self.version_for(name)
11
- # TODO
8
+ Component.verify("RHN", "pkgwat") do
9
+ class RHN
10
+ def self.version_for(name)
11
+ # TODO
12
+ end
12
13
  end
13
14
  end
14
15
  end
@@ -3,186 +3,195 @@
3
3
  # Licensed under the MIT license
4
4
  # Copyright (C) 2013-2014 Red Hat, Inc.
5
5
 
6
- require 'gem2rpm'
7
- require 'versionomy'
8
- require 'active_support/core_ext'
9
-
10
- require 'polisher/core'
11
6
  require 'polisher/gem'
7
+ require 'polisher/core'
8
+ require 'polisher/component'
12
9
 
13
10
  module Polisher
14
- module RPM
15
- class Requirement
16
- # Bool indiciating if req is a BR
17
- attr_accessor :br
18
-
19
- # Name of requirement
20
- attr_accessor :name
21
-
22
- # Condition, eg >=, =, etc
23
- attr_accessor :condition
24
-
25
- # Version number
26
- attr_accessor :version
27
-
28
- # Requirement string
29
- def str
30
- sp = self.specifier
31
- sp.nil? ? "#{@name}" : "#{@name} #{sp}"
32
- end
33
-
34
- # Specified string
35
- def specifier
36
- @version.nil? ? nil : "#{@condition} #{@version}"
37
- end
38
-
39
- # Instantiate / return new rpm spec requirements from string
40
- def self.parse(str, opts={})
41
- stra = str.split
42
- br = str.include?('BuildRequires')
43
- name = condition = version = nil
44
-
45
- if str.include?('Requires')
46
- name = stra[1]
47
- condition = stra[2]
48
- version = stra[3]
49
-
50
- else
51
- name = stra[0]
52
- condition = stra[1]
53
- version = stra[2]
11
+ deps = ['gem2rpm', 'versionomy', 'active_support/core_ext']
12
+ Component.verify("RPM::Requirement", *deps) do
13
+ module RPM
14
+ class Requirement
15
+ include ConfHelpers
16
+
17
+ conf_attr :rubygem_prefix, 'rubygem'
18
+ conf_attr :scl_prefix, '' # set to %{?scl_prefix} to enable scl's
19
+
20
+ def self.prefix
21
+ "#{scl_prefix}#{rubygem_prefix}"
22
+ end
23
+
24
+ # Bool indiciating if req is a BR
25
+ attr_accessor :br
26
+
27
+ # Name of requirement
28
+ attr_accessor :name
29
+
30
+ # Condition, eg >=, =, etc
31
+ attr_accessor :condition
32
+
33
+ # Version number
34
+ attr_accessor :version
35
+
36
+ # Requirement string
37
+ def str
38
+ sp = self.specifier
39
+ sp.nil? ? "#{@name}" : "#{@name} #{sp}"
40
+ end
41
+
42
+ # Specified string
43
+ def specifier
44
+ @version.nil? ? nil : "#{@condition} #{@version}"
45
+ end
46
+
47
+ # Instantiate / return new rpm spec requirements from string
48
+ def self.parse(str, opts={})
49
+ stra = str.split
50
+ br = str.include?('BuildRequires')
51
+ name = condition = version = nil
52
+
53
+ if str.include?('Requires')
54
+ name = stra[1]
55
+ condition = stra[2]
56
+ version = stra[3]
57
+
58
+ else
59
+ name = stra[0]
60
+ condition = stra[1]
61
+ version = stra[2]
62
+
63
+ end
64
+
65
+ req = self.new({:name => name,
66
+ :condition => condition,
67
+ :version => version,
68
+ :br => br}.merge(opts))
69
+ req
70
+ end
71
+
72
+ # Instantiate / return new rpm spec requirements from gem dependency.
73
+ #
74
+ # Because a gem dependency may result in multiple spec requirements
75
+ # this will always return an array of Requirement instances
76
+ def self.from_gem_dep(gem_dep, br=false)
77
+ gem_dep.requirement.to_s.split(',').collect { |req|
78
+ expanded = Gem2Rpm::Helpers.expand_requirement [req.split]
79
+ expanded.collect { |e|
80
+ new :name => "#{prefix}(#{gem_dep.name})",
81
+ :condition => e.first.to_s,
82
+ :version => e.last.to_s,
83
+ :br => br
84
+ }
85
+ }.flatten
86
+ end
54
87
 
88
+ def initialize(args={})
89
+ @br = args[:br] || false
90
+ @name = args[:name]
91
+ @condition = args[:condition]
92
+ @version = args[:version]
93
+
94
+ @name.strip! unless @name.nil?
95
+ @condition.strip! unless @condition.nil?
96
+ @version.strip! unless @version.nil?
97
+ end
98
+
99
+ def ==(other)
100
+ @br == other.br &&
101
+ @name == other.name &&
102
+ @condition == other.condition &&
103
+ @version == other.version
104
+ end
105
+
106
+ # Greatest Common Denominator,
107
+ # Max version in list that is less than the local version
108
+ def gcd(versions)
109
+ lversion = Versionomy.parse(self.version)
110
+ versions.collect { |v| Versionomy.parse(v) }.
111
+ sort { |a,b| a <=> b }.reverse.
112
+ find { |v| v < lversion }.to_s
113
+ end
114
+
115
+ # Minimum gem version which satisfies this dependency
116
+ def min_satisfying_version
117
+ return "0.0" if self.version.nil? ||
118
+ self.condition == '<' ||
119
+ self.condition == '<='
120
+ return self.version if self.condition == '=' ||
121
+ self.condition == '>='
122
+ Versionomy.parse(self.version).bump(:tiny).to_s # self.condition == '>'
123
+ end
124
+
125
+ # Max gem version which satisfies this dependency
126
+ #
127
+ # Can't automatically deduce in '<' case, so if that is the conditional
128
+ # we require a version list, and will return the gcd from it
129
+ def max_satisfying_version(versions=nil)
130
+ return Float::INFINITY if self.version.nil? ||
131
+ self.condition == '>' ||
132
+ self.condition == '>='
133
+ return self.version if self.condition == '=' ||
134
+ self.condition == '<='
135
+
136
+ raise ArgumentError if versions.nil?
137
+ self.gcd(versions)
55
138
  end
56
139
 
57
- req = self.new({:name => name,
58
- :condition => condition,
59
- :version => version,
60
- :br => br}.merge(opts))
61
- req
62
- end
63
-
64
- # Instantiate / return new rpm spec requirements from gem dependency.
65
- #
66
- # Because a gem dependency may result in multiple spec requirements
67
- # this will always return an array of Requirement instances
68
- def self.from_gem_dep(gem_dep, br=false)
69
- gem_dep.requirement.to_s.split(',').collect { |req|
70
- expanded = Gem2Rpm::Helpers.expand_requirement [req.split]
71
- expanded.collect { |e|
72
- self.new :name => "rubygem(#{gem_dep.name})",
73
- :condition => e.first.to_s,
74
- :version => e.last.to_s,
75
- :br => br
76
- }
77
- }.flatten
78
- end
79
-
80
- def initialize(args={})
81
- @br = args[:br] || false
82
- @name = args[:name]
83
- @condition = args[:condition]
84
- @version = args[:version]
85
-
86
- @name.strip! unless @name.nil?
87
- @condition.strip! unless @condition.nil?
88
- @version.strip! unless @version.nil?
89
- end
90
-
91
- def ==(other)
92
- @br == other.br &&
93
- @name == other.name &&
94
- @condition == other.condition &&
95
- @version == other.version
96
- end
97
-
98
- # Greatest Common Denominator,
99
- # Max version in list that is less than the local version
100
- def gcd(versions)
101
- lversion = Versionomy.parse(self.version)
102
- versions.collect { |v| Versionomy.parse(v) }.
103
- sort { |a,b| a <=> b }.reverse.
104
- find { |v| v < lversion }.to_s
105
- end
106
-
107
- # Minimum gem version which satisfies this dependency
108
- def min_satisfying_version
109
- return "0.0" if self.version.nil? ||
110
- self.condition == '<' ||
111
- self.condition == '<='
112
- return self.version if self.condition == '=' ||
113
- self.condition == '>='
114
- Versionomy.parse(self.version).bump(:tiny).to_s # self.condition == '>'
115
- end
116
-
117
- # Max gem version which satisfies this dependency
118
- #
119
- # Can't automatically deduce in '<' case, so if that is the conditional
120
- # we require a version list, and will return the gcd from it
121
- def max_satisfying_version(versions=nil)
122
- return Float::INFINITY if self.version.nil? ||
123
- self.condition == '>' ||
124
- self.condition == '>='
125
- return self.version if self.condition == '=' ||
126
- self.condition == '<='
127
-
128
- raise ArgumentError if versions.nil?
129
- self.gcd(versions)
130
- end
131
-
132
- # Minimum gem version for which this dependency fails
133
- def min_failing_version
134
- raise ArgumentError if self.version.nil?
135
- return "0.0" if self.condition == '>' ||
136
- self.condition == '>='
137
- return self.version if self.condition == '<'
138
- Versionomy.parse(self.version).bump(:tiny).to_s # self.condition == '<=' and '='
139
- end
140
-
141
- # Max gem version for which this dependency fails
142
- #
143
- # Can't automatically deduce in '>=', and '=' cases, so if that is the
144
- # conditional we require a version list, and will return the gcd from it
145
- def max_failing_version(versions=nil)
146
- raise ArgumentError if self.version.nil? ||
147
- self.condition == '<=' ||
148
- self.condition == '<'
149
- return self.version if self.condition == '>'
150
-
151
- raise ArgumentError if versions.nil?
152
- self.gcd(versions)
153
- end
154
-
155
- # Return bool indicating if requirement matches specified
156
- # depedency.
157
- #
158
- # Comparison mechanism will depend on type of class
159
- # passed to this. Valid types include
160
- # - Polisher::RPM::Requirements
161
- # - ::Gem::Dependency
162
- def matches?(dep)
163
- return self == dep if dep.is_a?(self.class)
164
- raise ArgumentError unless dep.is_a?(::Gem::Dependency)
165
-
166
- return false if !self.gem? || self.gem_name != dep.name
167
- return true if self.version.nil?
168
-
169
- Gem2Rpm::Helpers.expand_requirement([dep.requirement.to_s.split]).
170
- any?{ |req|
171
- req.first == self.condition && req.last.to_s == self.version
172
- }
173
- end
174
-
175
- # Whether or not this requirement specified a ruby gem dependency
176
- def gem?
177
- !!(self.str =~ RPM::Spec::SPEC_GEM_REQ_MATCHER)
178
- end
179
-
180
- # Return the name of the gem which this requirement is for.
181
- # Returns nil if this is not a gem requirement
182
- def gem_name
183
- # XXX need to explicitly run regex here to get $1
184
- !!(self.str =~ RPM::Spec::SPEC_GEM_REQ_MATCHER) ? $1 : nil
185
- end
186
- end # class Requirement
187
- end # module RPM
188
- end
140
+ # Minimum gem version for which this dependency fails
141
+ def min_failing_version
142
+ raise ArgumentError if self.version.nil?
143
+ return "0.0" if self.condition == '>' ||
144
+ self.condition == '>='
145
+ return self.version if self.condition == '<'
146
+ Versionomy.parse(self.version).bump(:tiny).to_s # self.condition == '<=' and '='
147
+ end
148
+
149
+ # Max gem version for which this dependency fails
150
+ #
151
+ # Can't automatically deduce in '>=', and '=' cases, so if that is the
152
+ # conditional we require a version list, and will return the gcd from it
153
+ def max_failing_version(versions=nil)
154
+ raise ArgumentError if self.version.nil? ||
155
+ self.condition == '<=' ||
156
+ self.condition == '<'
157
+ return self.version if self.condition == '>'
158
+
159
+ raise ArgumentError if versions.nil?
160
+ self.gcd(versions)
161
+ end
162
+
163
+ # Return bool indicating if requirement matches specified
164
+ # depedency.
165
+ #
166
+ # Comparison mechanism will depend on type of class
167
+ # passed to this. Valid types include
168
+ # - Polisher::RPM::Requirements
169
+ # - ::Gem::Dependency
170
+ def matches?(dep)
171
+ return self == dep if dep.is_a?(self.class)
172
+ raise ArgumentError unless dep.is_a?(::Gem::Dependency)
173
+
174
+ return false if !self.gem? || self.gem_name != dep.name
175
+ return true if self.version.nil?
176
+
177
+ Gem2Rpm::Helpers.expand_requirement([dep.requirement.to_s.split]).
178
+ any?{ |req|
179
+ req.first == self.condition && req.last.to_s == self.version
180
+ }
181
+ end
182
+
183
+ # Whether or not this requirement specified a ruby gem dependency
184
+ def gem?
185
+ !!(self.str =~ RPM::Spec::SPEC_GEM_REQ_MATCHER)
186
+ end
187
+
188
+ # Return the name of the gem which this requirement is for.
189
+ # Returns nil if this is not a gem requirement
190
+ def gem_name
191
+ # XXX need to explicitly run regex here to get $1
192
+ !!(self.str =~ RPM::Spec::SPEC_GEM_REQ_MATCHER) ? $1 : nil
193
+ end
194
+ end # class Requirement
195
+ end # module RPM
196
+ end # Component.verify("RPM::Requirement")
197
+ end # module Polisher