polisher 0.10.2 → 0.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. checksums.yaml +4 -4
  2. data/bin/binary_gem_resolver.rb +2 -2
  3. data/bin/bundler2yum.rb +51 -0
  4. data/bin/check_ruby_spec.rb +32 -0
  5. data/bin/gem_dependency_checker.rb +13 -242
  6. data/bin/gem_mapper.rb +27 -0
  7. data/bin/gems2update.rb +27 -0
  8. data/bin/git_gem_diff.rb +48 -0
  9. data/bin/git_gem_updater.rb +3 -3
  10. data/bin/missing_deps.rb +29 -0
  11. data/bin/polisher-config.rb +17 -0
  12. data/bin/ruby_rpm_spec_updater.rb +23 -2
  13. data/lib/polisher.rb +5 -12
  14. data/lib/polisher/adaptors/checker_loader.rb +78 -0
  15. data/lib/polisher/{upstream.rb → adaptors/upstream.rb} +1 -0
  16. data/lib/polisher/adaptors/version_checker.rb +57 -0
  17. data/lib/polisher/adaptors/version_checker/bodhi.rb +29 -0
  18. data/lib/polisher/adaptors/version_checker/errata.rb +29 -0
  19. data/lib/polisher/adaptors/version_checker/fedora.rb +29 -0
  20. data/lib/polisher/adaptors/version_checker/gem.rb +27 -0
  21. data/lib/polisher/adaptors/version_checker/git.rb +29 -0
  22. data/lib/polisher/adaptors/version_checker/koji.rb +29 -0
  23. data/lib/polisher/adaptors/version_checker/yum.rb +29 -0
  24. data/lib/polisher/cli/all.rb +22 -0
  25. data/lib/polisher/cli/bin/gem_dependency_checker.rb +85 -0
  26. data/lib/polisher/cli/bin/gem_mapper.rb +37 -0
  27. data/lib/polisher/cli/bin/gems2update.rb +86 -0
  28. data/lib/polisher/cli/bin/missing_deps.rb +35 -0
  29. data/lib/polisher/cli/conf.rb +18 -0
  30. data/lib/polisher/cli/default.rb +25 -0
  31. data/lib/polisher/cli/format.rb +130 -0
  32. data/lib/polisher/cli/sources.rb +106 -0
  33. data/lib/polisher/cli/specifier.rb +30 -0
  34. data/lib/polisher/cli/status.rb +50 -0
  35. data/lib/polisher/cli/targets.rb +88 -0
  36. data/lib/polisher/gem.rb +41 -338
  37. data/lib/polisher/gem/attributes.rb +20 -0
  38. data/lib/polisher/gem/dependencies.rb +63 -0
  39. data/lib/polisher/gem/diff.rb +39 -0
  40. data/lib/polisher/gem/files.rb +111 -0
  41. data/lib/polisher/gem/parser.rb +85 -0
  42. data/lib/polisher/gem/retriever.rb +137 -0
  43. data/lib/polisher/{gem_state.rb → gem/state.rb} +6 -6
  44. data/lib/polisher/gem/versions.rb +131 -0
  45. data/lib/polisher/gemfile.rb +20 -89
  46. data/lib/polisher/gemfile/attributes.rb +19 -0
  47. data/lib/polisher/gemfile/deps.rb +43 -0
  48. data/lib/polisher/gemfile/parser.rb +45 -0
  49. data/lib/polisher/git/pkg.rb +33 -238
  50. data/lib/polisher/git/pkg/attributes.rb +60 -0
  51. data/lib/polisher/git/pkg/builder.rb +47 -0
  52. data/lib/polisher/git/pkg/repo.rb +82 -0
  53. data/lib/polisher/git/pkg/updater.rb +53 -0
  54. data/lib/polisher/git/pkg/versions.rb +40 -0
  55. data/lib/polisher/git/project.rb +1 -1
  56. data/lib/polisher/git/repo.rb +79 -76
  57. data/lib/polisher/{vendor.rb → mixins/vendored_deps.rb} +4 -7
  58. data/lib/polisher/mixins/versioned_dependencies.rb +86 -0
  59. data/lib/polisher/record.rb +2 -0
  60. data/lib/polisher/rpm.rb +23 -0
  61. data/lib/polisher/rpm/patch.rb +10 -8
  62. data/lib/polisher/rpm/requirement.rb +33 -189
  63. data/lib/polisher/rpm/requirement/attributes.rb +43 -0
  64. data/lib/polisher/rpm/requirement/comparison.rb +97 -0
  65. data/lib/polisher/rpm/requirement/gem_reference.rb +46 -0
  66. data/lib/polisher/rpm/requirement/parser.rb +41 -0
  67. data/lib/polisher/rpm/spec.rb +97 -436
  68. data/lib/polisher/rpm/spec/check.rb +14 -0
  69. data/lib/polisher/rpm/spec/comparison.rb +64 -0
  70. data/lib/polisher/rpm/spec/files.rb +15 -0
  71. data/lib/polisher/rpm/spec/gem_files.rb +65 -0
  72. data/lib/polisher/rpm/spec/gem_reference.rb +59 -0
  73. data/lib/polisher/rpm/spec/gem_requirements.rb +73 -0
  74. data/lib/polisher/rpm/spec/parser.rb +106 -0
  75. data/lib/polisher/rpm/spec/requirements.rb +31 -0
  76. data/lib/polisher/rpm/spec/subpackages.rb +23 -0
  77. data/lib/polisher/rpm/spec/updater.rb +268 -0
  78. data/lib/polisher/specifier.rb +13 -0
  79. data/lib/polisher/targets.rb +36 -0
  80. data/lib/polisher/{apt.rb → targets/apt.rb} +1 -1
  81. data/lib/polisher/targets/bodhi.rb +43 -0
  82. data/lib/polisher/{bugzilla.rb → targets/bugzilla.rb} +1 -1
  83. data/lib/polisher/targets/errata.rb +55 -0
  84. data/lib/polisher/targets/errata/build.rb +24 -0
  85. data/lib/polisher/targets/fedora.rb +47 -0
  86. data/lib/polisher/targets/koji.rb +39 -0
  87. data/lib/polisher/targets/koji/builder.rb +38 -0
  88. data/lib/polisher/targets/koji/diff.rb +39 -0
  89. data/lib/polisher/targets/koji/rpc.rb +43 -0
  90. data/lib/polisher/targets/koji/versions.rb +67 -0
  91. data/lib/polisher/targets/rhn.rb +12 -0
  92. data/lib/polisher/targets/yum.rb +36 -0
  93. data/lib/polisher/{component.rb → util/component.rb} +3 -3
  94. data/lib/polisher/util/conf_helpers.rb +77 -0
  95. data/lib/polisher/util/config.rb +45 -0
  96. data/lib/polisher/util/core_ext.rb +59 -0
  97. data/lib/polisher/{error.rb → util/error.rb} +0 -0
  98. data/lib/polisher/{gem_cache.rb → util/gem_cache.rb} +1 -1
  99. data/lib/polisher/{git_cache.rb → util/git_cache.rb} +0 -0
  100. data/lib/polisher/{logger.rb → util/logger.rb} +2 -0
  101. data/lib/polisher/{tag_mapper.rb → util/tag_mapper.rb} +1 -1
  102. data/lib/polisher/version.rb +1 -1
  103. data/spec/{upstream_spec.rb → adaptors/upstream_spec.rb} +1 -1
  104. data/spec/{version_checker_spec.rb → adaptors/version_checker_spec.rb} +1 -6
  105. data/spec/data/activesupport-4.1.4.gem +0 -0
  106. data/spec/data/rubygem-activesupport-with-doc.spec +247 -0
  107. data/spec/data/rubygem-activesupport-without-requires.spec +232 -0
  108. data/spec/data/rubygem-activesupport.spec +0 -122
  109. data/spec/fixtures/gem_json.rb +49 -0
  110. data/spec/fixtures/gem_spec.rb +13 -0
  111. data/spec/fixtures/gemfile.rb +10 -0
  112. data/spec/fixtures/local_gem.rb +62 -0
  113. data/spec/fixtures/rpm_spec.rb +91 -0
  114. data/spec/gem/attributes_spec.rb +17 -0
  115. data/spec/gem/diff_spec.rb +80 -0
  116. data/spec/gem/files_spec.rb +171 -0
  117. data/spec/gem/parser_spec.rb +44 -0
  118. data/spec/gem/retriever_spec.rb +124 -0
  119. data/spec/gem/state_spec.rb +79 -0
  120. data/spec/gem/versions_spec.rb +148 -0
  121. data/spec/gem_spec.rb +5 -347
  122. data/spec/gemfile/deps_spec.rb +20 -0
  123. data/spec/gemfile/parser_spec.rb +26 -0
  124. data/spec/gemfile_spec.rb +0 -34
  125. data/spec/git/pkg/attributes_spec.rb +128 -0
  126. data/spec/git/pkg/builder_spec.rb +63 -0
  127. data/spec/git/pkg/repo_spec.rb +146 -0
  128. data/spec/git/pkg/updater_spec.rb +86 -0
  129. data/spec/git/pkg/versions_spec.rb +42 -0
  130. data/spec/git/pkg_spec.rb +21 -0
  131. data/spec/git/project_spec.rb +21 -0
  132. data/spec/git/repo_spec.rb +160 -0
  133. data/spec/{vendor_spec.rb → mixins/vendored_deps_spec.rb} +2 -4
  134. data/spec/mixins/versioned_dependencies_spec.rb +48 -0
  135. data/spec/rpm/patch_spec.rb +48 -0
  136. data/spec/rpm/requirement/attributes_spec.rb +34 -0
  137. data/spec/rpm/requirement/comparison_spec.rb +286 -0
  138. data/spec/rpm/requirement/gem_spec.rb +49 -0
  139. data/spec/rpm/requirement/parser_spec.rb +31 -0
  140. data/spec/rpm/requirement_spec.rb +8 -334
  141. data/spec/rpm/spec/check_spec.rb +25 -0
  142. data/spec/rpm/spec/comparison_spec.rb +55 -0
  143. data/spec/rpm/spec/files_spec.rb +17 -0
  144. data/spec/rpm/spec/gem_files_spec.rb +112 -0
  145. data/spec/rpm/spec/gem_reference_spec.rb +99 -0
  146. data/spec/rpm/spec/gem_requirement_spec.rb +38 -0
  147. data/spec/rpm/spec/parser_spec.rb +64 -0
  148. data/spec/rpm/spec/requirements_spec.rb +10 -0
  149. data/spec/rpm/spec/subpackages_spec.rb +38 -0
  150. data/spec/rpm/spec/updater_spec.rb +486 -0
  151. data/spec/rpm/spec_spec.rb +27 -174
  152. data/spec/spec_helper.rb +7 -107
  153. data/spec/support/coveralls.rb +10 -0
  154. data/spec/support/fixtures.rb +8 -0
  155. data/spec/support/paths.rb +20 -0
  156. data/spec/support/rspec.rb +20 -0
  157. data/spec/support/vcr.rb +11 -0
  158. data/spec/{bodhi_spec.rb → targets/bodhi_spec.rb} +3 -1
  159. data/spec/{errata_spec.rb → targets/errata_spec.rb} +2 -2
  160. data/spec/{fedora_spec.rb → targets/fedora_spec.rb} +3 -3
  161. data/spec/targets/koji/builder_spec.rb +48 -0
  162. data/spec/targets/koji/diff_spec.rb +36 -0
  163. data/spec/targets/koji/rpc_spec.rb +28 -0
  164. data/spec/{koji_spec.rb → targets/koji/versions_spec.rb} +1 -59
  165. data/spec/targets/koji_spec.rb +11 -0
  166. data/spec/{yum_spec.rb → targets/yum_spec.rb} +1 -1
  167. data/spec/{component_spec.rb → util/component_spec.rb} +1 -1
  168. data/spec/{core_spec.rb → util/core_ext_spec.rb} +2 -3
  169. metadata +278 -88
  170. data/lib/polisher/bodhi.rb +0 -23
  171. data/lib/polisher/config.rb +0 -32
  172. data/lib/polisher/core.rb +0 -101
  173. data/lib/polisher/errata.rb +0 -75
  174. data/lib/polisher/fedora.rb +0 -46
  175. data/lib/polisher/git.rb +0 -8
  176. data/lib/polisher/koji.rb +0 -159
  177. data/lib/polisher/rhn.rb +0 -15
  178. data/lib/polisher/version_checker.rb +0 -177
  179. data/lib/polisher/yum.rb +0 -37
  180. data/spec/git_spec.rb +0 -445
@@ -0,0 +1,55 @@
1
+ #
2
+ # Licensed under the MIT license
3
+ # Copyright (C) 2014 Red Hat, Inc.
4
+
5
+ require 'polisher/rpm/spec'
6
+
7
+ module Polisher::RPM
8
+ describe Spec do
9
+ describe "#compare" do
10
+ it "returns requirements in spec but not in gem" do
11
+ req = Requirement.parse 'rubygem(rails) > 3.0.0'
12
+ spec = described_class.new :requires => [req]
13
+ gem = Polisher::Gem.new
14
+
15
+ spec.compare(gem).should ==
16
+ {:same => {}, :diff => {'rails' =>
17
+ {:spec => '> 3.0.0', :upstream => nil}}}
18
+ end
19
+
20
+ it "returns requirements in gem but not in spec" do
21
+ req = ::Gem::Dependency.new('rails', '> 3.0.0')
22
+ spec = described_class.new
23
+ gem = Polisher::Gem.new :deps => [req]
24
+
25
+ spec.compare(gem).should ==
26
+ {:same => {}, :diff => {'rails' =>
27
+ {:spec => nil, :upstream => '> 3.0.0'}}}
28
+ end
29
+
30
+ it "returns shared requirements with different specifiers" do
31
+ greq = ::Gem::Dependency.new('rails', '< 5.0.0')
32
+ gem = Polisher::Gem.new :deps => [greq]
33
+
34
+ sreq = Requirement.parse 'rubygem(rails) > 3.0.0'
35
+ spec = described_class.new :requires => [sreq]
36
+
37
+ spec.compare(gem).should ==
38
+ {:same => {}, :diff => {'rails' =>
39
+ {:spec => '> 3.0.0', :upstream => '< 5.0.0'}}}
40
+ end
41
+
42
+ it "returns shared requirements" do
43
+ greq = ::Gem::Dependency.new('rails', '< 3.0.0')
44
+ gem = Polisher::Gem.new :deps => [greq]
45
+
46
+ sreq = Requirement.parse 'rubygem(rails) < 3.0.0'
47
+ spec = described_class.new :requires => [sreq]
48
+
49
+ spec.compare(gem).should ==
50
+ {:diff => {}, :same => {'rails' =>
51
+ {:spec => '< 3.0.0', :upstream => '< 3.0.0'}}}
52
+ end
53
+ end
54
+ end # describe Spec
55
+ end # module Polisher::RPM
@@ -0,0 +1,17 @@
1
+ #
2
+ # Licensed under the MIT license
3
+ # Copyright (C) 2014 Red Hat, Inc.
4
+
5
+ require 'polisher/rpm/spec'
6
+
7
+ module Polisher::RPM
8
+ describe Spec do
9
+ describe "#files" do
10
+ it "returns flattened files in all packages" do
11
+ spec = described_class.new :pkg_files => {'foo' => ['file1'],
12
+ 'doc' => ['docfile']}
13
+ spec.files.should == %w(file1 docfile)
14
+ end
15
+ end
16
+ end # describe Spec
17
+ end # module Polisher::RPM
@@ -0,0 +1,112 @@
1
+ #
2
+ # Licensed under the MIT license
3
+ # Copyright (C) 2014 Red Hat, Inc.
4
+
5
+ require 'polisher/rpm/spec'
6
+
7
+ module Polisher::RPM
8
+ describe Spec do
9
+ describe "::file_satisfies?" do
10
+ context "spec file is same as gemfile" do
11
+ it "returns true" do
12
+ described_class.file_satisfies?('file1', 'file1').should be_true
13
+ end
14
+ end
15
+
16
+ context "spec file is dir containing gemfile" do
17
+ it "returns true" do
18
+ described_class.file_satisfies?('dir', 'dir/file1').should be_true
19
+ end
20
+ end
21
+
22
+ context "spec file and gem file are not related" do
23
+ it "returns false" do
24
+ described_class.file_satisfies?('foo', 'bar').should be_false
25
+ end
26
+ end
27
+ end
28
+
29
+ describe "#missing_gem_file?" do
30
+ context "no spec files satisfies specified gem file" do
31
+ it "returns true" do
32
+ spec = described_class.new
33
+ spec.should_receive(:files).and_return(['file1'])
34
+ described_class.should_receive(:file_satisfies?)
35
+ .with('file1', 'gem_file')
36
+ .and_return(false)
37
+ spec.missing_gem_file?('gem_file').should be_true
38
+ end
39
+ end
40
+
41
+ context "at least one spec file satisfying specified gem file" do
42
+ it "returns false" do
43
+ spec = described_class.new
44
+ spec.should_receive(:files).and_return(%w(file1 file2))
45
+ described_class.should_receive(:file_satisfies?)
46
+ .with('file1', 'gem_file')
47
+ .and_return(false)
48
+ described_class.should_receive(:file_satisfies?)
49
+ .with('file2', 'gem_file')
50
+ .and_return(true)
51
+ spec.missing_gem_file?('gem_file').should be_false
52
+ end
53
+ end
54
+ end
55
+
56
+ describe "#missing_files_for" do
57
+ it "returns gem files for which there are no satisfying spec files" do
58
+ gem = Polisher::Gem.new
59
+ gem.should_receive(:file_paths).and_return(%w(file1 file2))
60
+
61
+ spec = described_class.new
62
+ spec.should_receive(:missing_gem_file?)
63
+ .with('file1').and_return(false)
64
+ spec.should_receive(:missing_gem_file?)
65
+ .with('file2').and_return(true)
66
+ spec.missing_files_for(gem).should == ['file2']
67
+ end
68
+ end
69
+
70
+ describe "#excluded files" do
71
+ it "returns files excluded from upstream gem" do
72
+ gem = Polisher::Gem.new
73
+ spec = described_class.new
74
+ spec.should_receive(:upstream_gem).and_return(gem)
75
+ spec.should_receive(:missing_files_for)
76
+ .with(gem).and_return(['file1'])
77
+ spec.excluded_files.should == ['file1']
78
+ end
79
+ end
80
+
81
+ describe "#excludes_file?" do
82
+ context "file on excluded files list" do
83
+ it "returns true" do
84
+ spec = described_class.new
85
+ spec.should_receive(:excluded_files).and_return(%w(file1 file2))
86
+ spec.excludes_file?('file1').should be_true
87
+ end
88
+ end
89
+
90
+ context "file not on excluded files list" do
91
+ it "returns false" do
92
+ spec = described_class.new
93
+ spec.should_receive(:excluded_files).and_return(%w(file1 file2))
94
+ spec.excludes_file?('foobar').should be_false
95
+ end
96
+ end
97
+ end
98
+
99
+ describe "#extra_gem_files" do
100
+ it "returns pkg files not in specified gem" do
101
+ gem = Polisher::Gem.new
102
+ gem.should_receive(:has_file_satisfied_by?).with('foo').and_return(true)
103
+ gem.should_receive(:has_file_satisfied_by?).with('var').and_return(false)
104
+ gem.should_receive(:has_file_satisfied_by?).with('bar').and_return(false)
105
+
106
+ spec = described_class.new :name => 'rubygem-rails'
107
+ spec.should_receive(:pkg_files).and_return({:rails => ['var'], :doc => ['foo', 'bar']})
108
+ spec.extra_gem_files(gem).should == {:rails => ['var'], :doc => ['bar']}
109
+ end
110
+ end
111
+ end # describe Spec
112
+ end # module Polisher::RPM
@@ -0,0 +1,99 @@
1
+ #
2
+ # Licensed under the MIT license
3
+ # Copyright (C) 2014 Red Hat, Inc.
4
+
5
+ require 'polisher/rpm/spec'
6
+ require 'polisher/gem'
7
+
8
+ module Polisher::RPM
9
+ describe Spec do
10
+ let(:spec) { described_class.new }
11
+ let(:gem) { Polisher::Gem.new }
12
+
13
+ describe "#upstream_gem" do
14
+ it "sets & returns upstream gem" do
15
+ gem_name = 'polisher'
16
+ version = 5.0
17
+ Polisher::Gem.should_receive(:from_rubygems)
18
+ .with(gem_name, version).and_return(gem)
19
+ spec = described_class.new :gem_name => gem_name, :version => version
20
+ spec.upstream_gem.should == gem
21
+ spec.upstream_gem.object_id.should == spec.upstream_gem.object_id
22
+ end
23
+ end
24
+
25
+ describe "#missing_deps_for" do
26
+ it "returns gem deps without corresponding requirements" do
27
+ gem.deps = local_gem.deps
28
+ spec.should_receive(:requirements_for_gem)
29
+ .with(gem.deps.first.name).and_return([])
30
+ spec.should_receive(:requirements_for_gem)
31
+ .exactly(gem.deps.length-1).times.and_return(['req'])
32
+ spec.missing_deps_for(gem).should == [gem.deps.first]
33
+ end
34
+ end
35
+
36
+ describe "#missing_dev_deps_for" do
37
+ it "returns gem dev deps without corresponding build requirements" do
38
+ gem.dev_deps = local_gem.deps
39
+ spec.should_receive(:build_requirements_for_gem)
40
+ .with(gem.dev_deps.first.name).and_return([])
41
+ spec.should_receive(:build_requirements_for_gem)
42
+ .exactly(gem.dev_deps.length-1).times.and_return(['req'])
43
+ spec.missing_dev_deps_for(gem).should == [gem.dev_deps.first]
44
+ end
45
+ end
46
+
47
+ describe "#excluded_deps" do
48
+ it "returns missing deps for upstream gem" do
49
+ expected = ['deps']
50
+ spec.gem = gem
51
+ spec.should_receive(:missing_deps_for).with(gem).and_return(expected)
52
+ spec.excluded_deps.should == expected
53
+ end
54
+ end
55
+
56
+ describe "#excludes_dep?" do
57
+ context "upstream gem excludes specified gem" do
58
+ it "returns true" do
59
+ deps = [::Gem::Dependency.new('rails')]
60
+ spec.should_receive(:excluded_deps).and_return(deps)
61
+ spec.excludes_dep?('rails').should be_true
62
+ end
63
+ end
64
+
65
+ context "upstream gem does not exclude specified gem" do
66
+ it "returns false" do
67
+ spec.should_receive(:excluded_deps).and_return([])
68
+ spec.excludes_dep?('rails').should be_false
69
+ end
70
+ end
71
+ end
72
+
73
+ describe "#excluded_dev_deps" do
74
+ it "returns missing dev deps for upstream gem" do
75
+ expected = ['deps']
76
+ spec.gem = gem
77
+ spec.should_receive(:missing_dev_deps_for).with(gem).and_return(expected)
78
+ spec.excluded_dev_deps.should == expected
79
+ end
80
+ end
81
+
82
+ describe "#excludes_dev_dep?" do
83
+ context "upstream gem excludes specified gem from dev deps" do
84
+ it "returns true" do
85
+ deps = [::Gem::Dependency.new('rails')]
86
+ spec.should_receive(:excluded_dev_deps).and_return(deps)
87
+ spec.excludes_dev_dep?('rails').should be_true
88
+ end
89
+ end
90
+
91
+ context "upstream gem does not exclude specified gem from dev deps" do
92
+ it "returns false" do
93
+ spec.should_receive(:excluded_dev_deps).and_return([])
94
+ spec.excludes_dev_dep?('rails').should be_false
95
+ end
96
+ end
97
+ end
98
+ end # describe Spec
99
+ end # module Polisher::RPM
@@ -0,0 +1,38 @@
1
+ #
2
+ # Licensed under the MIT license
3
+ # Copyright (C) 2014 Red Hat, Inc.
4
+
5
+ require 'polisher/rpm/spec'
6
+
7
+ module Polisher::RPM
8
+ describe Spec do
9
+ describe "#requirements_for_gem" do
10
+ it "returns requirements for specified gem name" do
11
+ spec = described_class.new :requires =>
12
+ [Requirement.new(:name => 'rubygem(rake)')]
13
+ spec.requirements_for_gem('rake').should == [spec.requires.first]
14
+ end
15
+
16
+ context "spec has no requirement with specified name" do
17
+ it "returns empty array" do
18
+ spec = described_class.new
19
+ spec.requirements_for_gem('rake').should be_empty
20
+ end
21
+ end
22
+ end
23
+
24
+ describe "#build_requirements_for_gem" do
25
+ it "returns build requirements for specified gem name" do
26
+ spec = described_class.new :build_requires => [Requirement.new(:name => 'rubygem(rake)')]
27
+ spec.build_requirements_for_gem('rake').should == [spec.build_requires.first]
28
+ end
29
+
30
+ context "spec has no requirement with specified name" do
31
+ it "returns empty array" do
32
+ spec = described_class.new
33
+ spec.build_requirements_for_gem('rake').should be_empty
34
+ end
35
+ end
36
+ end
37
+ end # describe Spec
38
+ end # module Polisher::RPM
@@ -0,0 +1,64 @@
1
+ #
2
+ # Licensed under the MIT license
3
+ # Copyright (C) 2014 Red Hat, Inc.
4
+
5
+ require 'polisher/rpm/spec'
6
+
7
+ module Polisher::RPM
8
+ describe Spec do
9
+ describe "#parse" do
10
+ it "returns new rpmspec instance" do
11
+ pspec = described_class.parse rpm_spec[:contents]
12
+ pspec.should be_an_instance_of(described_class)
13
+ end
14
+
15
+ it "parses contents from spec" do
16
+ pspec = described_class.parse rpm_spec[:contents]
17
+ pspec.contents.should == rpm_spec[:contents]
18
+ end
19
+
20
+ it "parses name from spec" do
21
+ pspec = described_class.parse rpm_spec[:contents]
22
+ pspec.gem_name.should == rpm_spec[:name]
23
+ end
24
+
25
+ it "parses version from spec" do
26
+ pspec = described_class.parse rpm_spec[:contents]
27
+ pspec.version.should == rpm_spec[:version]
28
+ end
29
+
30
+ it "parses release from spec" do
31
+ pspec = described_class.parse rpm_spec[:contents]
32
+ pspec.release.should == rpm_spec[:release]
33
+ end
34
+
35
+ it "parses requires from spec" do
36
+ pspec = described_class.parse rpm_spec[:contents]
37
+ pspec.requires.should == rpm_spec[:requires]
38
+ end
39
+
40
+ it "parses build requires from spec" do
41
+ pspec = described_class.parse rpm_spec[:contents]
42
+ pspec.build_requires.should == rpm_spec[:build_requires]
43
+ end
44
+
45
+ it "parses changelog from spec" do
46
+ pspec = described_class.parse rpm_spec[:contents]
47
+ pspec.changelog.should == rpm_spec.changelog
48
+ end
49
+
50
+ it "parses unrpmized files from spec" do
51
+ pspec = described_class.parse rpm_spec[:contents]
52
+ pspec.pkg_files.should == rpm_spec[:files]
53
+ end
54
+
55
+ it "parses %check from spec" do
56
+ pspec = described_class.parse rpm_spec[:contents]
57
+ pspec.has_check?.should be_true
58
+
59
+ pspec = described_class.parse ""
60
+ pspec.has_check?.should be_false
61
+ end
62
+ end
63
+ end # describe Spec
64
+ end # module Polisher::RPM
@@ -0,0 +1,10 @@
1
+ #
2
+ # Licensed under the MIT license
3
+ # Copyright (C) 2014 Red Hat, Inc.
4
+
5
+ require 'polisher/rpm/spec'
6
+
7
+ module Polisher::RPM
8
+ describe Spec do
9
+ end # describe Spec
10
+ end # module Polisher::RPM
@@ -0,0 +1,38 @@
1
+ #
2
+ # Licensed under the MIT license
3
+ # Copyright (C) 2014 Red Hat, Inc.
4
+
5
+ require 'polisher/rpm/spec'
6
+
7
+ module Polisher::RPM
8
+ describe Spec do
9
+ describe "#subpkg_containing" do
10
+ it "returns subpackage containing specified file" do
11
+ spec = described_class.new :pkg_files => {'foo' => ['file1']}
12
+ spec.subpkg_containing('file1').should == 'foo'
13
+ end
14
+
15
+ context "no subpackage contains specified file" do
16
+ it "returns nil" do
17
+ spec = described_class.new :pkg_files => {}
18
+ spec.subpkg_containing('anything').should be_nil
19
+ end
20
+ end
21
+ end
22
+
23
+ describe "#has_doc_subpkg?" do
24
+ context "spec has doc subpackage" do
25
+ it "returns true" do
26
+ spec = described_class.new :contents => "foo\n%package doc\nbar"
27
+ spec.has_doc_subpkg?.should be_true
28
+ end
29
+ end
30
+
31
+ context "spec does not have doc subpackage" do
32
+ it "returns false" do
33
+ described_class.new.has_doc_subpkg?.should be_false
34
+ end
35
+ end
36
+ end
37
+ end # describe Spec
38
+ end # module Polisher::RPM
@@ -0,0 +1,486 @@
1
+ #
2
+ # Licensed under the MIT license
3
+ # Copyright (C) 2014 Red Hat, Inc.
4
+
5
+ require 'polisher/rpm/spec'
6
+ require 'polisher/rpm/requirement'
7
+ require 'polisher/gem'
8
+
9
+ module Polisher::RPM
10
+ describe Spec do
11
+ let(:gem) do
12
+ Polisher::Gem.new :path => local_gem.gem_path
13
+ end
14
+
15
+ let(:spec) do
16
+ spec = described_class.new
17
+ spec.gem = gem
18
+ spec
19
+ end
20
+
21
+ describe "#update_to" do
22
+ it "updates dependencies" do
23
+ spec.should_receive(:update_deps_from).with(gem)
24
+ spec.update_to(gem)
25
+ end
26
+
27
+ it "updates files" do
28
+ spec.should_receive(:update_files_from).with(gem)
29
+ spec.update_to(gem)
30
+ end
31
+
32
+ it "updates metadata" do
33
+ spec.should_receive(:update_metadata_from).with(gem)
34
+ spec.update_to(gem)
35
+ end
36
+
37
+ it "updates contents" do
38
+ spec.should_receive(:update_contents)
39
+ spec.update_to(gem)
40
+ end
41
+ end
42
+
43
+ describe "#updated_requires_for" do
44
+ it "returns array of updated requires" do
45
+ spec.updated_requires_for(gem).should be_an_instance_of(Array)
46
+ end
47
+
48
+ it "returns non gem requirements" do
49
+ expected = ['non', 'gem', 'reqs']
50
+ spec.should_receive(:non_gem_requirements).and_return(expected)
51
+ result = spec.updated_requires_for(gem)
52
+ expected.each { |req| result.should include(req) }
53
+ end
54
+
55
+ it "returns extra gem requirements" do
56
+ expected = ['extra', 'gem', 'reqs']
57
+ spec.should_receive(:extra_gem_requirements)
58
+ .with(gem).and_return(expected)
59
+ result = spec.updated_requires_for(gem)
60
+ expected.each { |req| result.should include(req) }
61
+ end
62
+
63
+ it "returns new source dependencies" do
64
+ gem.deps = gem_json.deps
65
+ spec.should_receive(:excludes_dep?)
66
+ .exactly(gem.deps.length).times.and_return(false)
67
+ expected = gem.deps.collect { |d| Requirement.from_gem_dep(d) }.flatten
68
+ result = spec.updated_requires_for(gem)
69
+ expected.each { |req| result.should include(req) }
70
+ end
71
+
72
+ context "spec excludes new source dep" do
73
+ it "does not return it" do
74
+ gem.deps = gem_json.deps
75
+ spec.should_receive(:excludes_dep?)
76
+ .with(gem.deps.first.name).and_return(true)
77
+ spec.should_receive(:excludes_dep?)
78
+ .exactly(gem.deps.length-1).times.and_return(false)
79
+ result = spec.updated_requires_for(gem)
80
+ result.any? { |req| req.matches?(gem.deps.first) }.should be_false
81
+ end
82
+ end
83
+ end
84
+
85
+ describe "#updated_build_requires_for" do
86
+ it "returns array of updated build requires" do
87
+ spec.updated_build_requires_for(gem).should be_an_instance_of(Array)
88
+ end
89
+
90
+ it "returns non gem build requirements" do
91
+ expected = ['non', 'gem', 'reqs']
92
+ spec.should_receive(:non_gem_build_requirements).and_return(expected)
93
+ result = spec.updated_build_requires_for(gem)
94
+ expected.each { |req| result.should include(req) }
95
+ end
96
+
97
+ it "returns extra gem build requirements" do
98
+ expected = ['extra', 'gem', 'reqs']
99
+ spec.should_receive(:extra_gem_build_requirements)
100
+ .with(gem).and_return(expected)
101
+ result = spec.updated_build_requires_for(gem)
102
+ expected.each { |req| result.should include(req) }
103
+ end
104
+
105
+ it "returns new source dev dependencies" do
106
+ gem.dev_deps = gem_json.deps
107
+ spec.should_receive(:excludes_dev_dep?)
108
+ .exactly(gem.dev_deps.length).times.and_return(false)
109
+ expected = gem.dev_deps.collect { |d| Requirement.from_gem_dep(d, true) }.flatten
110
+ result = spec.updated_build_requires_for(gem)
111
+ expected.each { |req| result.should include(req) }
112
+ end
113
+
114
+ context "spec excludes new source dev dep" do
115
+ it "does not return it" do
116
+ gem.dev_deps = gem_json.deps
117
+ spec.should_receive(:excludes_dev_dep?)
118
+ .with(gem.dev_deps.first.name).and_return(true)
119
+ spec.should_receive(:excludes_dev_dep?)
120
+ .exactly(gem.dev_deps.length-1).times.and_return(false)
121
+ result = spec.updated_build_requires_for(gem)
122
+ result.any? { |req| req.matches?(gem.dev_deps.first) }.should be_false
123
+ end
124
+ end
125
+ end
126
+
127
+ describe "#changelog_index" do
128
+ it "returns position of the changelog in spec" do
129
+ spec.contents = "blah\nblah\n%changelog\nmore"
130
+ spec.changelog_index.should == 10
131
+ end
132
+ end
133
+
134
+ describe "#changelog_end_index" do
135
+ it "returns position of the end of the changelog in spec" do
136
+ spec.contents = "blah\nblah\n%changelog\nmore"
137
+ spec.changelog_end_index.should == 21
138
+ end
139
+
140
+ context "no changelog in spec" do
141
+ it "returns the last position in the spec" do
142
+ contents = "blah\nblah"
143
+ spec.contents = contents
144
+ spec.changelog_end_index.should == contents.length - 1
145
+ end
146
+ end
147
+ end
148
+
149
+ describe "#requires_contents" do
150
+ it "returns generated spec Requires from metadata" do
151
+ spec.requires = rpm_spec.requires
152
+ expected = spec.requires.collect { |r| "Requires: #{r.str}" }.join("\n")
153
+ spec.requires_contents.should == expected
154
+ end
155
+ end
156
+
157
+ describe "#build_requires_contents" do
158
+ it "returns generated spec BuildRequires from metadata" do
159
+ spec.build_requires = rpm_spec.build_requires
160
+ expected = spec.build_requires.collect { |r| "BuildRequires: #{r.str}" }.join("\n")
161
+ spec.build_requires_contents.should == expected
162
+ end
163
+ end
164
+
165
+ describe "#first_requires_index" do
166
+ it "returns the position of the first requires in the spec" do
167
+ spec.contents = "blah\nRequires: foo\nRequires: bar\nother"
168
+ spec.first_requires_index.should == 5
169
+
170
+ spec.contents = ""
171
+ spec.first_requires_index.should be_nil
172
+ end
173
+ end
174
+
175
+ describe "#first_build_requires_index" do
176
+ it "returns the position of the first build requires in the spec" do
177
+ spec.contents = "blah\nRequires: foo\nBuildRequires: bar\nBuildRequires: baz\nother"
178
+ spec.first_build_requires_index.should == 19
179
+
180
+ spec.contents = ""
181
+ spec.first_build_requires_index.should be_nil
182
+ end
183
+ end
184
+
185
+ describe "#requirement_section_index" do
186
+ context "no Requires" do
187
+ it "returns index of first build requires" do
188
+ spec.contents = "blah\nBuildRequires: bar\nBuildRequires: baz\nother"
189
+ spec.requirement_section_index.should == 5
190
+
191
+ spec.contents = ""
192
+ spec.requirement_section_index.should be_nil
193
+ end
194
+ end
195
+
196
+ context "first Requires is before first BuildRequires" do
197
+ it "returns index of first requires" do
198
+ spec.contents = "blah\nRequires: bar\nBuildRequires: baz\nother"
199
+ spec.requirement_section_index.should == 5
200
+ end
201
+ end
202
+
203
+ context "first BuildRequires is before first Requires" do
204
+ it "returns index of first BuildRequires" do
205
+ spec.contents = "blah\nBuildRequires: bar\nRequires: baz\nother"
206
+ spec.requirement_section_index.should == 5
207
+ end
208
+ end
209
+ end
210
+
211
+ describe "#last_main_package_index" do
212
+ context "spec has description section" do
213
+ it "returns position of description section" do
214
+ spec.contents = "blah\nmore\n%description\ninfo\nmore"
215
+ spec.last_main_package_index.should == 10
216
+ end
217
+ end
218
+
219
+ context "spec has at least one subpkg" do
220
+ it "returns position of first subpackage" do
221
+ spec.contents = "blah\nmore\n%package foo\ninfo\nmore"
222
+ spec.last_main_package_index.should == 10
223
+ end
224
+ end
225
+
226
+ context "spec has a prep section" do
227
+ it "returns position of prep section" do
228
+ spec.contents = "metadata\nmore\n%prep\ncmd\nantoher"
229
+ spec.last_main_package_index.should == 14
230
+ end
231
+ end
232
+
233
+ context "no description, subpackages, prep sections" do
234
+ it "returns -1" do
235
+ spec.contents = ""
236
+ spec.last_main_package_index.should == -1
237
+ end
238
+ end
239
+ end
240
+
241
+ describe "#description_index" do
242
+ it "returns position of description section" do
243
+ spec.contents = "meta\ndata\n%description\ndescript\n"
244
+ spec.description_index.should == 10
245
+ end
246
+ end
247
+
248
+ describe "#prep_index" do
249
+ it "returns position of prep section" do
250
+ spec.contents = "foo\n%prep\nbar"
251
+ spec.prep_index.should == 4
252
+ end
253
+ end
254
+
255
+ describe "#subpkg_index" do
256
+ it "returns position of the first subpackage" do
257
+ spec.contents = "foo\n%package bar\nstuff\n%package baz\nmore stuff"
258
+ spec.subpkg_index.should == 4
259
+ end
260
+ end
261
+
262
+ describe "#last_requires_index" do
263
+ it "returns the position of the last Requires in the spec" do
264
+ spec.contents = "foo\nRequires: abc\nRequires: def\nBuildRequires: 123\nok"
265
+ spec.last_requires_index.should == 18
266
+ end
267
+
268
+ context "no Requires in the spec" do
269
+ it "returns -1" do
270
+ spec.contents = ""
271
+ spec.last_requires_index.should == -1
272
+ end
273
+ end
274
+ end
275
+
276
+ describe "#last_build_requires_index" do
277
+ it "returns the position of the last BuildRequires in the spec" do
278
+ spec.contents = "foo\nRequires: abc\nBuildRequires: def\nBuildRequires: 123\nok"
279
+ spec.last_build_requires_index.should == 37
280
+ end
281
+
282
+ context "no BuildRequires in the spec" do
283
+ it "returns -1" do
284
+ spec.contents = ""
285
+ spec.last_build_requires_index.should == -1
286
+ end
287
+ end
288
+ end
289
+
290
+ describe "#last_requirement_index" do
291
+ context "last Requires is after last BuildRequires" do
292
+ it "returns last_requires_index" do
293
+ spec.contents = "info\nBuildRequires: br\nRequires: r\nmore stuff"
294
+ spec.last_requirement_index.should == 23
295
+ end
296
+ end
297
+
298
+ context "last BuildRequires is after last Requires" do
299
+ it "returns last_build_requires_index" do
300
+ spec.contents = "info\nRequires: br\nBuildRequires: r\nmore stuff"
301
+ spec.last_requirement_index.should == 18
302
+ end
303
+ end
304
+ end
305
+
306
+ describe "#requirement_section_end_index" do
307
+ it "returns the position of the newline following the last_requires_index" do
308
+ spec.contents = "info\nRequires: br\nBuildRequires: r\nmore stuff"
309
+ spec.requirement_section_end_index.should == 34
310
+ end
311
+ end
312
+
313
+ describe "#new_files_contents_for" do
314
+ it "returns generated files section for main package" do
315
+ files = ["file1", "foobar"]
316
+ expected = "%files\n" + files.join("\n") + "\n"
317
+ spec.metadata[:new_files] = {spec.gem_name => files}
318
+ spec.new_files_contents_for(spec.gem_name).should == expected
319
+ end
320
+
321
+ it "returns generated files section for specified subpkg" do
322
+ files = ["file1", "foobar"]
323
+ expected = "%files doc\n" + files.join("\n") + "\n"
324
+ spec.metadata[:new_files] = {'doc' => files}
325
+ spec.new_files_contents_for('doc').should == expected
326
+ end
327
+ end
328
+
329
+ describe "#excludes_contents" do
330
+ context "excludes are specified" do
331
+ it "returns generated excluded files contents" do
332
+ files = ['file1', 'foobar']
333
+ expected = files.collect{ |e| "%exclude #{e}" }.join("\n") + "\n\n"
334
+ spec.metadata[:pkg_excludes] = {spec.gem_name => files}
335
+ spec.excludes_contents.should == expected
336
+ end
337
+ end
338
+
339
+ context "excludes are not specified" do
340
+ it "returns blank string" do
341
+ spec.excludes_contents.should == ""
342
+ end
343
+ end
344
+ end
345
+
346
+ describe "#files_index" do
347
+ it "returns position of files section in spec" do
348
+ spec.contents = "lot\nof\metadata\n%files\nlist\nfile1\nfiles2"
349
+ spec.files_index.should == 15
350
+ end
351
+ end
352
+
353
+ describe "#files_end_index" do
354
+ it "returns position of changelog section in spec" do
355
+ spec.contents = "lot\nof\metadata\n%files\nlist\n%changelog\nentry1"
356
+ spec.files_end_index.should == 27
357
+ end
358
+ end
359
+
360
+
361
+ describe "#update_requires" do
362
+ it "updates requirements section" do
363
+ spec.should_receive(:requires_contents).and_return('requires_contents')
364
+ spec.should_receive(:build_requires_contents).and_return('build_requires_contents')
365
+ spec.contents = "foo\nRequires: bar\nBuildRequires: baz\nRequires: biz\n"
366
+ expected = "foo\nrequires_contents\nbuild_requires_contents\n"
367
+ spec.send(:update_requires)
368
+ spec.contents.should == expected
369
+ end
370
+ end
371
+
372
+ describe "#update_files" do
373
+ it "tbd"
374
+ end
375
+
376
+ describe "#update_deps_from" do
377
+ it "updates requires from new source" do
378
+ spec.should_receive(:update_requires_from).with(gem)
379
+ spec.send(:update_deps_from, gem)
380
+ end
381
+
382
+ it "updates build requires from new source" do
383
+ spec.should_receive(:update_build_requires_from).with(gem)
384
+ spec.send(:update_deps_from, gem)
385
+ end
386
+ end
387
+
388
+ describe "#update_requires_from" do
389
+ it "sets Requires from updated requires" do
390
+ expected = ['req', 'uires']
391
+ spec.should_receive(:updated_requires_for)
392
+ .with(gem)
393
+ .and_return(expected)
394
+ spec.send(:update_requires_from, gem)
395
+ spec.requires.should == expected
396
+ end
397
+ end
398
+
399
+ describe "#update_build_requires_from" do
400
+ it "sets BuildRequires from updated build requires" do
401
+ expected = ['req', 'uires']
402
+ spec.should_receive(:updated_build_requires_for)
403
+ .with(gem)
404
+ .and_return(expected)
405
+ spec.send(:update_build_requires_from, gem)
406
+ spec.build_requires.should == expected
407
+ end
408
+ end
409
+
410
+ describe "#update_files_from" do
411
+ it "tbd"
412
+ end
413
+
414
+ describe "#update_metadata_from" do
415
+ it "updates version" do
416
+ gem.version = '1.2.3'
417
+ spec.send(:update_metadata_from, gem)
418
+ spec.version.should == '1.2.3'
419
+ end
420
+
421
+ it "resets release" do
422
+ spec.release = '1000000'
423
+ spec.send(:update_metadata_from, gem)
424
+ spec.release.should == '1%{?dist}'
425
+ end
426
+
427
+ it "invalidates local gem" do
428
+ spec.instance_variable_set(:@update_gem, false)
429
+ spec.send(:update_metadata_from, gem)
430
+ spec.instance_variable_get(:@update_gem).should be_true
431
+ end
432
+
433
+ it "adds changelog entry" do
434
+ spec.send(:update_metadata_from, gem)
435
+ spec.changelog_entries.length.should == 1
436
+ end
437
+
438
+ it "generates valid changelog entry"
439
+ end
440
+
441
+ describe "#update_metadata_contents" do
442
+ it "updates spec version and release" do
443
+ before = "Name: foo\nVersion: 0.1\nRelease: 2?%{dist}\n%package"
444
+ after = "Name: foo\nVersion: 1.0\nRelease: 1?%{dist}\n%package"
445
+
446
+ spec.metadata[:contents] = before
447
+ spec.version = 1.0
448
+ spec.release = '1?%{dist}'
449
+ spec.send(:update_metadata_contents)
450
+ spec.contents.should == after
451
+ end
452
+ end
453
+
454
+ describe "#update_changelog" do
455
+ it "updates the changelog in the spec" do
456
+ spec.metadata[:changelog_entries] = ['*entry0', '*entry01']
457
+ spec.contents = "foo\n%changelog\n*entry1\n*entry2"
458
+ expected = "foo\n%changelog\n*entry0\n\n*entry01"
459
+ spec.send(:update_changelog)
460
+ spec.contents.should == expected
461
+ end
462
+ end
463
+
464
+ describe "#update_contents" do
465
+ it "updates metadata contents" do
466
+ spec.should_receive(:update_metadata_contents)
467
+ spec.send(:update_contents)
468
+ end
469
+
470
+ it "updates changelog" do
471
+ spec.should_receive(:update_changelog)
472
+ spec.send(:update_contents)
473
+ end
474
+
475
+ it "updates requires" do
476
+ spec.should_receive(:update_requires)
477
+ spec.send(:update_contents)
478
+ end
479
+
480
+ it "updates files" do
481
+ spec.should_receive(:update_files)
482
+ spec.send(:update_contents)
483
+ end
484
+ end
485
+ end # describe Spec
486
+ end # module Polisher::RPM