polisher 0.9.1 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/gem_dependency_checker.rb +55 -25
- data/bin/git_gem_updater.rb +18 -7
- data/lib/polisher/bodhi.rb +11 -10
- data/lib/polisher/component.rb +43 -0
- data/lib/polisher/config.rb +32 -0
- data/lib/polisher/core.rb +59 -34
- data/lib/polisher/errata.rb +56 -56
- data/lib/polisher/fedora.rb +33 -33
- data/lib/polisher/gem.rb +316 -281
- data/lib/polisher/gem_state.rb +86 -0
- data/lib/polisher/gemfile.rb +85 -87
- data/lib/polisher/git/pkg.rb +232 -175
- data/lib/polisher/git/repo.rb +74 -61
- data/lib/polisher/koji.rb +136 -83
- data/lib/polisher/logger.rb +23 -0
- data/lib/polisher/rhn.rb +6 -5
- data/lib/polisher/rpm/requirement.rb +186 -177
- data/lib/polisher/rpm/spec.rb +420 -356
- data/lib/polisher/tag_mapper.rb +27 -0
- data/lib/polisher/version.rb +1 -1
- data/lib/polisher/version_checker.rb +86 -17
- data/lib/polisher/yum.rb +26 -19
- data/spec/component_spec.rb +53 -0
- data/spec/core_spec.rb +6 -0
- data/spec/gem_spec.rb +230 -47
- data/spec/git_spec.rb +63 -27
- data/spec/koji_spec.rb +60 -3
- data/spec/rpm/spec_spec.rb +7 -3
- data/spec/spec_helper.rb +2 -1
- data/spec/version_checker_spec.rb +97 -0
- data/spec/yum_spec.rb +5 -0
- metadata +34 -28
- data/lib/polisher/missing.rb +0 -12
@@ -0,0 +1,27 @@
|
|
1
|
+
# Polisher Tag Mapper, simple mechanism to associate
|
2
|
+
# tags with each other
|
3
|
+
#
|
4
|
+
# Licensed under the MIT license
|
5
|
+
# Copyright (C) 2013-2014 Red Hat, Inc.
|
6
|
+
|
7
|
+
require 'polisher/core'
|
8
|
+
|
9
|
+
module Polisher
|
10
|
+
class TagMapper
|
11
|
+
extend ConfHelpers
|
12
|
+
|
13
|
+
def self.method_missing(id, *args)
|
14
|
+
set(id.to_s, args.first)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.set(tag, value)
|
18
|
+
@tags ||= {}
|
19
|
+
@tags[tag] = value
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.map(tag)
|
23
|
+
@tags ||= {}
|
24
|
+
@tags[tag]
|
25
|
+
end
|
26
|
+
end # class TagMapper
|
27
|
+
end # module Polisher
|
data/lib/polisher/version.rb
CHANGED
@@ -4,9 +4,12 @@
|
|
4
4
|
# Copyright (C) 2013-2014 Red Hat, Inc.
|
5
5
|
|
6
6
|
require 'polisher/gem'
|
7
|
+
require 'polisher/logger'
|
7
8
|
|
8
9
|
module Polisher
|
9
10
|
class VersionChecker
|
11
|
+
extend Logging
|
12
|
+
|
10
13
|
GEM_TARGET = :gem
|
11
14
|
KOJI_TARGET = :koji
|
12
15
|
FEDORA_TARGET = :fedora
|
@@ -20,7 +23,7 @@ module Polisher
|
|
20
23
|
# Enable the specified target(s) in the list of target to check
|
21
24
|
def self.check(*target)
|
22
25
|
@check_list ||= []
|
23
|
-
target.each { |t| @check_list << t }
|
26
|
+
target.flatten.each { |t| @check_list << t }
|
24
27
|
end
|
25
28
|
|
26
29
|
def self.should_check?(target)
|
@@ -40,37 +43,88 @@ module Polisher
|
|
40
43
|
versions = {}
|
41
44
|
|
42
45
|
if should_check?(GEM_TARGET)
|
43
|
-
|
46
|
+
logger.debug "versions_for<gem>(#{name})..."
|
47
|
+
gem_versions = Gem.local_versions_for(name, &bl)
|
48
|
+
logger.debug gem_versions
|
49
|
+
versions.merge! :gem => gem_versions
|
44
50
|
end
|
45
51
|
|
46
52
|
if should_check?(FEDORA_TARGET)
|
47
|
-
|
48
|
-
|
53
|
+
begin
|
54
|
+
require 'polisher/fedora'
|
55
|
+
logger.debug "versions_for<fedora>(#{name})..."
|
56
|
+
fedora_versions = Fedora.versions_for(name, &bl)
|
57
|
+
logger.debug fedora_versions
|
58
|
+
versions.merge! :fedora => fedora_versions
|
59
|
+
rescue
|
60
|
+
logger.debug 'unknown'
|
61
|
+
versions.merge! :fedora => unknown_version(:fedora, name, &bl)
|
62
|
+
end
|
49
63
|
end
|
50
64
|
|
51
65
|
if should_check?(KOJI_TARGET)
|
52
|
-
|
53
|
-
|
66
|
+
begin
|
67
|
+
require 'polisher/koji'
|
68
|
+
logger.debug "versions_for<koji>(#{name})..."
|
69
|
+
koji_versions = Koji.versions_for(name, &bl)
|
70
|
+
logger.debug koji_versions
|
71
|
+
versions.merge! :koji => koji_versions
|
72
|
+
rescue
|
73
|
+
logger.debug 'unknown'
|
74
|
+
versions.merge! :koji => unknown_version(:koji, name, &bl)
|
75
|
+
end
|
54
76
|
end
|
55
77
|
|
56
78
|
if should_check?(GIT_TARGET)
|
57
|
-
|
58
|
-
|
79
|
+
begin
|
80
|
+
require 'polisher/git/pkg'
|
81
|
+
logger.debug "versions_for<git>(#{name})..."
|
82
|
+
git_versions = Git::Pkg.versions_for(name, &bl)
|
83
|
+
logger.debug git_versions
|
84
|
+
versions.merge! :git => git_versions
|
85
|
+
rescue
|
86
|
+
logger.debug 'unknown'
|
87
|
+
versions.merge! :git => unknown_version(:git, name, &bl)
|
88
|
+
end
|
59
89
|
end
|
60
90
|
|
61
91
|
if should_check?(YUM_TARGET)
|
62
|
-
|
63
|
-
|
92
|
+
begin
|
93
|
+
require 'polisher/yum'
|
94
|
+
logger.debug "versions_for<yum>(#{name})..."
|
95
|
+
yum_versions = [Yum.version_for(name, &bl)]
|
96
|
+
versions.merge! :yum => yum_versions
|
97
|
+
logger.debug yum_versions
|
98
|
+
rescue
|
99
|
+
logger.debug 'unknown'
|
100
|
+
versions.merge! :yum => unknown_version(:yum, name, &bl)
|
101
|
+
end
|
64
102
|
end
|
65
103
|
|
66
104
|
if should_check?(BODHI_TARGET)
|
67
|
-
|
68
|
-
|
105
|
+
begin
|
106
|
+
require 'polisher/bodhi'
|
107
|
+
logger.debug "versions_for<bodhi>(#{name})..."
|
108
|
+
bodhi_versions = Bodhi.versions_for(name, &bl)
|
109
|
+
versions.merge! :bodhi => bodhi_versions
|
110
|
+
logger.debug bodhi_versions
|
111
|
+
rescue
|
112
|
+
logger.debug 'unknown'
|
113
|
+
versions.merge! :bodhi => unknown_version(:bodhi, name, &bl)
|
114
|
+
end
|
69
115
|
end
|
70
116
|
|
71
117
|
if should_check?(ERRATA_TARGET)
|
72
|
-
|
73
|
-
|
118
|
+
begin
|
119
|
+
require 'polisher/errata'
|
120
|
+
logger.debug "versions_for<errata>(#{name})..."
|
121
|
+
errata_versions = Errata.versions_for(name, &bl)
|
122
|
+
versions.merge! :errata => errata_versions
|
123
|
+
logger.debug errata_versions
|
124
|
+
rescue
|
125
|
+
logger.debug 'unknown'
|
126
|
+
versions.merge! :errata => unknown_version(:errata, name, &bl)
|
127
|
+
end
|
74
128
|
end
|
75
129
|
|
76
130
|
versions
|
@@ -81,7 +135,12 @@ module Polisher
|
|
81
135
|
# returns the max.
|
82
136
|
def self.version_for(name)
|
83
137
|
versions = self.versions_for(name).values
|
84
|
-
versions.inject(
|
138
|
+
versions.inject(Hash.new(0)) { |total, i| total[i] += 1; total }.first
|
139
|
+
end
|
140
|
+
|
141
|
+
# Invoke block for specified target w/ an 'unknown' version
|
142
|
+
def self.unknown_version(tgt, name)
|
143
|
+
yield tgt, name, [:unknown]
|
85
144
|
end
|
86
145
|
end
|
87
146
|
|
@@ -98,11 +157,21 @@ module Polisher
|
|
98
157
|
def dependency_versions(args = {}, &bl)
|
99
158
|
args = {:recursive => true, :dev_deps => true}.merge(args)
|
100
159
|
versions = {}
|
101
|
-
|
102
|
-
gem = Polisher::Gem.retrieve(dep)
|
160
|
+
deps.each do |dep|
|
161
|
+
gem = Polisher::Gem.retrieve(dep.name)
|
103
162
|
versions.merge!(gem.versions(args, &bl))
|
104
163
|
end
|
105
164
|
versions
|
106
165
|
end
|
166
|
+
|
167
|
+
# Return list of states which gem dependencies are in
|
168
|
+
def dependency_states
|
169
|
+
states = {}
|
170
|
+
deps.each do |dep|
|
171
|
+
gem = Polisher::Gem.new :name => dep.name
|
172
|
+
states.merge dep.name => gem.state(:check => dep)
|
173
|
+
end
|
174
|
+
states
|
175
|
+
end
|
107
176
|
end
|
108
177
|
end
|
data/lib/polisher/yum.rb
CHANGED
@@ -3,28 +3,35 @@
|
|
3
3
|
# Licensed under the MIT license
|
4
4
|
# Copyright (C) 2013-2014 Red Hat, Inc.
|
5
5
|
|
6
|
-
require '
|
6
|
+
require 'polisher/core'
|
7
|
+
require 'polisher/component'
|
7
8
|
|
8
9
|
module Polisher
|
9
|
-
|
10
|
-
|
10
|
+
Component.verify("Yum", 'awesome_spawn') do
|
11
|
+
class Yum
|
12
|
+
include ConfHelpers
|
11
13
|
|
12
|
-
|
13
|
-
#
|
14
|
-
# @param [String] name name of gem to loopup
|
15
|
-
# @param [Callable] bl optional callback to invoke with version retrieved
|
16
|
-
# @returns [String] version of gem in yum or nil if not found
|
17
|
-
def self.version_for(name, &bl)
|
18
|
-
version = nil
|
19
|
-
result = AwesomeSpawn.run "#{YUM_CMD} info rubygem-#{name}"
|
20
|
-
out = result.output
|
14
|
+
conf_attr :yum_cmd, '/usr/bin/yum'
|
21
15
|
|
22
|
-
|
23
|
-
|
24
|
-
|
16
|
+
# Retrieve version of gem available in yum
|
17
|
+
#
|
18
|
+
# @param [String] name name of gem to loopup
|
19
|
+
# @param [Callable] bl optional callback to invoke with version retrieved
|
20
|
+
# @returns [String] version of gem in yum or nil if not found
|
21
|
+
def self.version_for(name, &bl)
|
22
|
+
require_cmd! yum_cmd
|
23
|
+
|
24
|
+
version = nil
|
25
|
+
result = AwesomeSpawn.run "#{yum_cmd} info rubygem-#{name}"
|
26
|
+
out = result.output
|
27
|
+
|
28
|
+
if out.include?("Version")
|
29
|
+
version = out.lines.to_a.detect { |l| l =~ /^Version.*/ }
|
30
|
+
version = version.split(':').last.strip
|
31
|
+
end
|
32
|
+
bl.call(:yum, name, [version]) unless bl.nil?
|
33
|
+
version
|
25
34
|
end
|
26
|
-
bl.call(:yum, name, [version]) unless(bl.nil?)
|
27
|
-
version
|
28
35
|
end
|
29
|
-
end
|
30
|
-
end
|
36
|
+
end # Component.verify("Yum")
|
37
|
+
end # module Polisher
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'polisher/component'
|
2
|
+
|
3
|
+
module Polisher
|
4
|
+
describe Component do
|
5
|
+
describe ".verify" do
|
6
|
+
it "executes block for no missing gems" do
|
7
|
+
silence_stream(STDERR) do
|
8
|
+
described_class.verify("Z", "rubygems", "rspec") do
|
9
|
+
module ::Polisher
|
10
|
+
class Z
|
11
|
+
def self.yielded_block_executed
|
12
|
+
true
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
expect(Polisher::Z.yielded_block_executed).to be_true
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "missing" do
|
23
|
+
subject do
|
24
|
+
silence_stream(STDERR) do
|
25
|
+
described_class.verify(@test_class, "missing_gem") {}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it "A" do
|
30
|
+
@test_class = "A"
|
31
|
+
subject
|
32
|
+
expect(Polisher::A).to eql Polisher::Component::Missing
|
33
|
+
expect { Polisher::A.new }.to raise_error
|
34
|
+
end
|
35
|
+
|
36
|
+
it "A::B" do
|
37
|
+
@test_class = "A::B"
|
38
|
+
subject
|
39
|
+
expect(Polisher::A).to eql Polisher::Component::Missing
|
40
|
+
expect(Polisher::A::B).to eql Polisher::Component::Missing
|
41
|
+
end
|
42
|
+
|
43
|
+
it "A::B::C" do
|
44
|
+
@test_class = "A::B::C"
|
45
|
+
subject
|
46
|
+
expect(Polisher::A).to eql Polisher::Component::Missing
|
47
|
+
expect(Polisher::A::B).to eql Polisher::Component::Missing
|
48
|
+
expect(Polisher::A::B::C).to eql Polisher::Component::Missing
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/spec/core_spec.rb
CHANGED
@@ -60,5 +60,11 @@ describe String do
|
|
60
60
|
it "returns string with rpm macros swapped in" do
|
61
61
|
"bin".rpmize.should == "%{_bindir}"
|
62
62
|
end
|
63
|
+
|
64
|
+
it "prefixes %{gem_instdir} to non-special files" do
|
65
|
+
"spec".rpmize.should == "%{gem_instdir}/spec"
|
66
|
+
"lib".rpmize.should == "%{gem_libdir}"
|
67
|
+
"%{gem_instdir}/foo".rpmize.should == "%{gem_instdir}/foo"
|
68
|
+
end
|
63
69
|
end
|
64
70
|
end # describe String
|
data/spec/gem_spec.rb
CHANGED
@@ -9,12 +9,20 @@ require 'polisher/gem'
|
|
9
9
|
|
10
10
|
module Polisher
|
11
11
|
describe Gem do
|
12
|
+
describe "#file_name" do
|
13
|
+
it "returns name-version.gem" do
|
14
|
+
expected = 'rails-4.0.0.gem'
|
15
|
+
Polisher::Gem.new(:name => 'rails', :version => '4.0.0')
|
16
|
+
.file_name.should == expected
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
12
20
|
describe "#initialize" do
|
13
21
|
it "sets gem attributes" do
|
14
|
-
gem =
|
15
|
-
|
16
|
-
|
17
|
-
|
22
|
+
gem = described_class.new :name => 'rails',
|
23
|
+
:version => '4.0.0',
|
24
|
+
:deps => %w(activesupport activerecord),
|
25
|
+
:dev_deps => ['rake']
|
18
26
|
gem.name.should == 'rails'
|
19
27
|
gem.version.should == '4.0.0'
|
20
28
|
gem.deps.should == ['activesupport', 'activerecord']
|
@@ -25,33 +33,67 @@ module Polisher
|
|
25
33
|
describe "#ignorable_file?" do
|
26
34
|
context "args matches an ignorable file" do
|
27
35
|
it "returns true" do
|
28
|
-
|
29
|
-
|
36
|
+
described_class.ignorable_file?('foo.gemspec').should be_true
|
37
|
+
described_class.ignorable_file?('Gemfile').should be_true
|
30
38
|
end
|
31
39
|
end
|
32
40
|
|
33
41
|
context "args does not match an ignorable file" do
|
34
42
|
it "returns false" do
|
35
|
-
|
36
|
-
|
43
|
+
described_class.ignorable_file?('.rvmra').should be_false
|
44
|
+
described_class.ignorable_file?('foo.gemspoc').should be_false
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#doc_file?" do
|
50
|
+
context "file is on doc file list" do
|
51
|
+
it "returns true" do
|
52
|
+
described_class.doc_file?('CHANGELOG').should be_true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context "file is not on doc file list" do
|
57
|
+
it "returns false" do
|
58
|
+
described_class.doc_file?('foobar.rb').should be_false
|
37
59
|
end
|
38
60
|
end
|
39
61
|
end
|
40
62
|
|
41
63
|
describe "#local_versions_for" do
|
42
|
-
|
43
|
-
|
64
|
+
before(:each) do
|
65
|
+
# XXX clear the cached version of the gem specification db
|
66
|
+
described_class.instance_variable_set(:@local_db, nil)
|
67
|
+
|
68
|
+
gem1 = ::Gem::Specification.new 'rake', '1.0'
|
69
|
+
gem2 = ::Gem::Specification.new 'rake', '2.0'
|
70
|
+
gem3 = ::Gem::Specification.new 'rails', '3.0'
|
71
|
+
::Gem::Specification.should_receive(:all).and_return([gem1, gem2, gem3])
|
72
|
+
|
73
|
+
@version1 = ::Gem::Version.new '1.0'
|
74
|
+
@version2 = ::Gem::Version.new '2.0'
|
75
|
+
end
|
76
|
+
|
77
|
+
it "returns versions of specified gem in local db" do
|
78
|
+
described_class.local_versions_for('rake').should == [@version1, @version2]
|
79
|
+
end
|
80
|
+
|
81
|
+
it "invokes cb with versions retrieved" do
|
82
|
+
cb = proc {}
|
83
|
+
cb.should_receive(:call).with(:local_gem, 'rake', [@version1, @version2])
|
84
|
+
described_class.local_versions_for('rake', &cb)
|
85
|
+
end
|
44
86
|
end
|
45
87
|
|
46
88
|
describe "#parse" do
|
47
89
|
it "returns new gem" do
|
48
|
-
gem =
|
49
|
-
gem.should be_an_instance_of(
|
90
|
+
gem = described_class.parse
|
91
|
+
gem.should be_an_instance_of(described_class)
|
50
92
|
end
|
51
93
|
|
52
94
|
it "parses gem from gem spec" do
|
53
95
|
spec = Polisher::Test::GEM_SPEC
|
54
|
-
gem =
|
96
|
+
gem = described_class.parse(:gemspec => spec[:path])
|
55
97
|
gem.name.should == spec[:name]
|
56
98
|
gem.version.should == spec[:version]
|
57
99
|
gem.deps.should == spec[:deps]
|
@@ -62,7 +104,7 @@ module Polisher
|
|
62
104
|
|
63
105
|
it "parses gem from metadata hash" do
|
64
106
|
gemj = Polisher::Test::GEM_JSON
|
65
|
-
gem =
|
107
|
+
gem = described_class.parse gemj[:json]
|
66
108
|
gem.name.should == gemj[:name]
|
67
109
|
gem.version.should == gemj[:version]
|
68
110
|
gem.deps.should == gemj[:deps]
|
@@ -70,45 +112,103 @@ module Polisher
|
|
70
112
|
end
|
71
113
|
end
|
72
114
|
|
115
|
+
describe "#remote_versions_for" do
|
116
|
+
it "retrieves versions from rubygems.org" do
|
117
|
+
curl = Curl::Easy.new
|
118
|
+
described_class.should_receive(:client)
|
119
|
+
.at_least(:once).and_return(curl)
|
120
|
+
curl.should_receive(:http_get)
|
121
|
+
|
122
|
+
# actual output too verbose, just including bits we need
|
123
|
+
curl.should_receive(:body_str)
|
124
|
+
.and_return([{'number' => 1.1}, {'number' => 2.2}].to_json)
|
125
|
+
described_class.remote_versions_for('polisher').should == [1.1, 2.2]
|
126
|
+
curl.url.should == "https://rubygems.org/api/v1/versions/polisher.json"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe "#lastest_version_of" do
|
131
|
+
it "retrieves latests version of gem available on rubygems.org" do
|
132
|
+
described_class.should_receive(:remote_versions_for)
|
133
|
+
.with('polisher')
|
134
|
+
.and_return([2.2, 1.1])
|
135
|
+
described_class.latest_version_of('polisher').should == 2.2
|
136
|
+
end
|
137
|
+
end
|
73
138
|
|
74
139
|
describe "#download_gem" do
|
75
140
|
context "gem in GemCache" do
|
76
|
-
it "returns GemCache gem"
|
141
|
+
it "returns GemCache gem" do
|
142
|
+
gem = described_class.new
|
143
|
+
GemCache.should_receive(:get).with('polisher', '1.1')
|
144
|
+
.and_return(gem)
|
145
|
+
described_class.download_gem('polisher', '1.1').should == gem
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
it "uses curl to download gem" do
|
150
|
+
GemCache.should_receive(:get).and_return(nil)
|
151
|
+
curl = Curl::Easy.new
|
152
|
+
described_class.should_receive(:client)
|
153
|
+
.at_least(:once).and_return(curl)
|
154
|
+
curl.should_receive(:http_get)
|
155
|
+
curl.should_receive(:body_str).and_return('') # stub out body_str
|
156
|
+
|
157
|
+
described_class.download_gem 'polisher', '2.2'
|
158
|
+
curl.url.should == "https://rubygems.org/gems/polisher-2.2.gem"
|
159
|
+
end
|
160
|
+
|
161
|
+
it "sets gem in gem cache" do
|
162
|
+
GemCache.should_receive(:get).and_return(nil)
|
163
|
+
curl = Curl::Easy.new
|
164
|
+
described_class.should_receive(:client)
|
165
|
+
.at_least(:once).and_return(curl)
|
166
|
+
curl.stub(:http_get) # stub out http_get
|
167
|
+
curl.should_receive(:body_str).and_return('gem')
|
168
|
+
GemCache.should_receive(:set)
|
169
|
+
.with('polisher', '1.1', 'gem')
|
170
|
+
described_class.download_gem 'polisher', '1.1'
|
77
171
|
end
|
78
172
|
|
79
|
-
it "
|
80
|
-
|
81
|
-
|
173
|
+
it "returns downloaded gem binary contents" do
|
174
|
+
GemCache.should_receive(:get).and_return(nil)
|
175
|
+
curl = Curl::Easy.new
|
176
|
+
described_class.should_receive(:client)
|
177
|
+
.at_least(:once).and_return(curl)
|
178
|
+
curl.stub(:http_get) # stub out http_get
|
179
|
+
curl.should_receive(:body_str).and_return('gem')
|
180
|
+
described_class.download_gem('polisher', '1.1').should == 'gem'
|
181
|
+
end
|
82
182
|
end
|
83
183
|
|
84
184
|
describe "#download_gem_path" do
|
85
185
|
it "downloads gem" do
|
86
|
-
gem =
|
87
|
-
|
186
|
+
gem = described_class.new
|
187
|
+
described_class.should_receive(:download_gem)
|
88
188
|
gem.downloaded_gem_path
|
89
189
|
end
|
90
190
|
|
91
191
|
it "returns gem cache path for gem" do
|
92
192
|
# stub out d/l
|
93
|
-
gem =
|
94
|
-
|
95
|
-
Polisher::GemCache.should_receive(:path_for)
|
96
|
-
|
97
|
-
|
98
|
-
|
193
|
+
gem = described_class.new :name => 'rails', :version => '1.0'
|
194
|
+
described_class.should_receive(:download_gem)
|
195
|
+
Polisher::GemCache.should_receive(:path_for)
|
196
|
+
.with('rails', '1.0')
|
197
|
+
.at_least(:once)
|
198
|
+
.and_return('rails_path')
|
99
199
|
gem.downloaded_gem_path.should == 'rails_path'
|
100
200
|
end
|
101
201
|
end
|
102
202
|
|
103
203
|
describe "#gem_path" do
|
104
204
|
it "returns specified path" do
|
105
|
-
gem =
|
205
|
+
gem = described_class.new :path => 'gem_path'
|
106
206
|
gem.gem_path.should == 'gem_path'
|
107
207
|
end
|
108
208
|
|
109
209
|
context "specified path is null" do
|
110
210
|
it "returns downloaded gem path" do
|
111
|
-
gem =
|
211
|
+
gem = described_class.new
|
112
212
|
gem.should_receive(:downloaded_gem_path).and_return('gem_path')
|
113
213
|
gem.gem_path.should == 'gem_path'
|
114
214
|
end
|
@@ -126,39 +226,122 @@ module Polisher
|
|
126
226
|
end
|
127
227
|
|
128
228
|
describe "#file_paths" do
|
129
|
-
it "returns list of file paths in gem"
|
229
|
+
it "returns list of file paths in gem" do
|
230
|
+
gem = described_class.new
|
231
|
+
gem.should_receive(:each_file).and_yield('file1').and_yield('file2')
|
232
|
+
gem.file_paths.should == %w(file1 file2)
|
233
|
+
end
|
130
234
|
end
|
131
235
|
|
132
236
|
describe "#retrieve" do
|
133
|
-
before(:each) do
|
134
|
-
@local_gem = Polisher::Test::LOCAL_GEM
|
135
|
-
end
|
136
|
-
|
137
237
|
it "returns gem retrieved from rubygems" do
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
238
|
+
curl = Curl::Easy.new
|
239
|
+
curl.should_receive(:body_str).and_return('spec')
|
240
|
+
|
241
|
+
url = "https://rubygems.org/api/v1/gems/rails.json"
|
242
|
+
Curl::Easy.should_receive(:http_get).with(url).and_return(curl)
|
243
|
+
|
244
|
+
gem = described_class.new
|
245
|
+
described_class.should_receive(:parse).with('spec').and_return(gem)
|
246
|
+
|
247
|
+
described_class.retrieve('rails').should == gem
|
144
248
|
end
|
145
249
|
end
|
146
250
|
|
147
251
|
describe "#versions" do
|
148
|
-
it "looks up and returns versions
|
252
|
+
it "looks up and returns versions of gem" do
|
253
|
+
gem = described_class.new :name => 'rails'
|
254
|
+
Polisher::VersionChecker.should_receive(:versions_for)
|
255
|
+
.with('rails')
|
256
|
+
.and_return(:koji => ['1.1.1'])
|
257
|
+
gem.versions.should == {'rails' => {:koji => ['1.1.1']}}
|
258
|
+
end
|
149
259
|
|
150
260
|
context "recursive is true" do
|
151
|
-
it "
|
261
|
+
it "retrieves dependency versions" do
|
262
|
+
# stub out version checker
|
263
|
+
retrieved = {:koji => ['1.0']}
|
264
|
+
Polisher::VersionChecker.should_receive(:versions_for)
|
265
|
+
.and_return(retrieved)
|
266
|
+
|
267
|
+
versions = {}
|
268
|
+
gem = described_class.new :name => 'rails'
|
269
|
+
gem.should_receive(:dependency_versions)
|
270
|
+
.with(:recursive => true, :versions => {'rails' => retrieved})
|
271
|
+
.and_call_original
|
272
|
+
gem.versions(:recursive => true, :versions => versions)
|
273
|
+
.should == {'rails' => {:koji => ['1.0']}}
|
274
|
+
end
|
275
|
+
|
152
276
|
context "dev_deps is true" do
|
153
|
-
it "
|
277
|
+
it "retrieves dev dependency versions" do
|
278
|
+
# stub out version checker
|
279
|
+
retrieved = {:koji => ['1.0']}
|
280
|
+
Polisher::VersionChecker.should_receive(:versions_for)
|
281
|
+
.and_return(retrieved)
|
282
|
+
|
283
|
+
versions = {}
|
284
|
+
gem = described_class.new :name => 'rails'
|
285
|
+
gem.should_receive(:dependency_versions)
|
286
|
+
.with(:recursive => true, :dev_deps => true,
|
287
|
+
:versions => {'rails' => retrieved})
|
288
|
+
.and_call_original
|
289
|
+
gem.should_receive(:dependency_versions)
|
290
|
+
.with(:recursive => true, :dev => true, :dev_deps => true,
|
291
|
+
:versions => {'rails' => retrieved})
|
292
|
+
.and_call_original
|
293
|
+
gem.versions(:recursive => true, :dev_deps => true,
|
294
|
+
:versions => versions)
|
295
|
+
.should == {'rails' => {:koji => ['1.0']}}
|
296
|
+
end
|
297
|
+
end
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
describe "#dependency_versions" do
|
302
|
+
it "retrieves dependency versions" do
|
303
|
+
gem = described_class.new
|
304
|
+
gem.should_receive(:deps).and_return([::Gem::Dependency.new('rake')])
|
305
|
+
described_class.should_receive(:retrieve)
|
306
|
+
.with('rake').and_return(gem)
|
307
|
+
|
308
|
+
versions = {'rake' => {:koji => ['2.1']}}
|
309
|
+
gem.should_receive(:versions).and_return(versions)
|
310
|
+
gem.dependency_versions.should == versions
|
311
|
+
end
|
312
|
+
|
313
|
+
it "retrieves dev dependency versions" do
|
314
|
+
gem = described_class.new
|
315
|
+
gem.should_receive(:dev_deps).and_return([::Gem::Dependency.new('rake')])
|
316
|
+
described_class.should_receive(:retrieve)
|
317
|
+
.with('rake').and_return(gem)
|
318
|
+
|
319
|
+
versions = {'rake' => {:koji => ['2.1']}}
|
320
|
+
gem.should_receive(:versions).and_return(versions)
|
321
|
+
gem.dependency_versions(:dev => true).should == versions
|
322
|
+
end
|
323
|
+
|
324
|
+
context "error during gem or version retrieval" do
|
325
|
+
it "sets version to 'unknown'" do
|
326
|
+
gem = described_class.new
|
327
|
+
gem.should_receive(:deps).and_return([::Gem::Dependency.new('rake')])
|
328
|
+
described_class.should_receive(:retrieve)
|
329
|
+
.with('rake').and_raise(RuntimeError)
|
330
|
+
|
331
|
+
versions = {:all => [:unknown]}
|
332
|
+
gem.should_not_receive(:versions)
|
333
|
+
Polisher::VersionChecker.should_receive(:unknown_version)
|
334
|
+
.with(:all, 'rake')
|
335
|
+
.and_return(versions)
|
336
|
+
gem.dependency_versions.should == {'rake' => versions}
|
154
337
|
end
|
155
338
|
end
|
156
339
|
end
|
157
340
|
|
158
341
|
describe "#diff" do
|
159
342
|
before(:each) do
|
160
|
-
@gem1 =
|
161
|
-
@gem2 =
|
343
|
+
@gem1 = described_class.new
|
344
|
+
@gem2 = described_class.new
|
162
345
|
|
163
346
|
@result = AwesomeSpawn::CommandResult.new '', 'diff_out', '', 0
|
164
347
|
end
|
@@ -166,9 +349,9 @@ module Polisher
|
|
166
349
|
it "runs diff against unpacked local and other gems and returns output" do
|
167
350
|
@gem1.should_receive(:unpack).and_return('dir1')
|
168
351
|
@gem2.should_receive(:unpack).and_return('dir2')
|
169
|
-
AwesomeSpawn.should_receive(:run)
|
170
|
-
with("#{Polisher::Gem
|
171
|
-
and_return(@result)
|
352
|
+
AwesomeSpawn.should_receive(:run)
|
353
|
+
.with("#{Polisher::Gem.diff_cmd} -r dir1 dir2")
|
354
|
+
.and_return(@result)
|
172
355
|
@gem1.diff(@gem2).should == @result.output
|
173
356
|
end
|
174
357
|
|