right_publish 0.2.0

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.
@@ -0,0 +1,101 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{right_publish}
8
+ s.version = "0.2.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Brian Szmyd", "Tony Spataro"]
12
+ s.date = %q{2013-07-03}
13
+ s.default_executable = %q{right_publish}
14
+ s.description = %q{A tool for maintaining S3-based DEB, GEM and RPM packages.}
15
+ s.email = %q{support@rightscale.com}
16
+ s.executables = ["right_publish"]
17
+ s.extra_rdoc_files = [
18
+ "README.rdoc"
19
+ ]
20
+ s.files = [
21
+ ".rspec",
22
+ "Gemfile",
23
+ "Gemfile.lock",
24
+ "README.rdoc",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "bin/right_publish",
28
+ "lib/right_publish.rb",
29
+ "lib/right_publish/profile.rb",
30
+ "lib/right_publish/repo.rb",
31
+ "lib/right_publish/repos/apt.rb",
32
+ "lib/right_publish/repos/gem.rb",
33
+ "lib/right_publish/repos/yum.rb",
34
+ "lib/right_publish/storage.rb",
35
+ "lib/right_publish/stores/local.rb",
36
+ "lib/right_publish/stores/s3.rb",
37
+ "right_publish.gemspec",
38
+ "spec/repo_manager_spec.rb",
39
+ "spec/repo_spec.rb",
40
+ "spec/repos/apt_spec.rb",
41
+ "spec/repos/gem_spec.rb",
42
+ "spec/repos/yum_spec.rb",
43
+ "spec/spec_helper.rb",
44
+ "spec/storage_manager_spec.rb",
45
+ "spec/storage_spec.rb",
46
+ "spec/stores/local_spec.rb",
47
+ "spec/stores/s3_spec.rb"
48
+ ]
49
+ s.homepage = %q{https://github.com/rightscale/right_publish}
50
+ s.licenses = ["Proprietary"]
51
+ s.require_paths = ["lib"]
52
+ s.rubygems_version = %q{1.3.7}
53
+ s.summary = %q{Package publishing and indexing tool}
54
+
55
+ if s.respond_to? :specification_version then
56
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
57
+ s.specification_version = 3
58
+
59
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
60
+ s.add_runtime_dependency(%q<builder>, [">= 0"])
61
+ s.add_runtime_dependency(%q<fog>, ["~> 1.9"])
62
+ s.add_runtime_dependency(%q<trollop>, ["~> 2.0"])
63
+ s.add_development_dependency(%q<rake>, ["~> 0.9"])
64
+ s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
65
+ s.add_development_dependency(%q<right_develop>, ["~> 1.0"])
66
+ s.add_development_dependency(%q<rdoc>, [">= 2.4.2"])
67
+ s.add_development_dependency(%q<rspec>, ["~> 2.0"])
68
+ s.add_development_dependency(%q<flexmock>, ["~> 0.9"])
69
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
70
+ s.add_development_dependency(%q<ruby-debug>, [">= 0.10"])
71
+ s.add_development_dependency(%q<ruby-debug19>, [">= 0.11.6"])
72
+ else
73
+ s.add_dependency(%q<builder>, [">= 0"])
74
+ s.add_dependency(%q<fog>, ["~> 1.9"])
75
+ s.add_dependency(%q<trollop>, ["~> 2.0"])
76
+ s.add_dependency(%q<rake>, ["~> 0.9"])
77
+ s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
78
+ s.add_dependency(%q<right_develop>, ["~> 1.0"])
79
+ s.add_dependency(%q<rdoc>, [">= 2.4.2"])
80
+ s.add_dependency(%q<rspec>, ["~> 2.0"])
81
+ s.add_dependency(%q<flexmock>, ["~> 0.9"])
82
+ s.add_dependency(%q<simplecov>, [">= 0"])
83
+ s.add_dependency(%q<ruby-debug>, [">= 0.10"])
84
+ s.add_dependency(%q<ruby-debug19>, [">= 0.11.6"])
85
+ end
86
+ else
87
+ s.add_dependency(%q<builder>, [">= 0"])
88
+ s.add_dependency(%q<fog>, ["~> 1.9"])
89
+ s.add_dependency(%q<trollop>, ["~> 2.0"])
90
+ s.add_dependency(%q<rake>, ["~> 0.9"])
91
+ s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
92
+ s.add_dependency(%q<right_develop>, ["~> 1.0"])
93
+ s.add_dependency(%q<rdoc>, [">= 2.4.2"])
94
+ s.add_dependency(%q<rspec>, ["~> 2.0"])
95
+ s.add_dependency(%q<flexmock>, ["~> 0.9"])
96
+ s.add_dependency(%q<simplecov>, [">= 0"])
97
+ s.add_dependency(%q<ruby-debug>, [">= 0.10"])
98
+ s.add_dependency(%q<ruby-debug19>, [">= 0.11.6"])
99
+ end
100
+ end
101
+
@@ -0,0 +1,65 @@
1
+ require 'right_publish/repo'
2
+ require 'spec_helper'
3
+
4
+ describe RightPublish::RepoManager do
5
+
6
+ def is_registered?(name, key, type)
7
+ @repo_types = RightPublish::RepoManager.repo_types
8
+ @repo_types.should have_key(name)
9
+ @repo_types[name].should equal(key)
10
+ RightPublish::RepoManager.get_repository(key).should be_instance_of(type)
11
+ end
12
+
13
+ it "should provide a hash of known repo types" do
14
+ RightPublish::RepoManager.repo_types.should be_instance_of(Hash)
15
+ end
16
+
17
+ it "returns nil for unknown repo types" do
18
+ RightPublish::RepoManager.get_repository(:doesnotexist_repo).should be_equal(nil)
19
+ end
20
+
21
+ it "should know about the apt repository" do
22
+ is_registered?('apt', :apt_repo, RightPublish::AptRepo)
23
+ end
24
+
25
+ it "should know about the gem repository" do
26
+ is_registered?('gem', :gem_repo, RightPublish::GemRepo)
27
+ end
28
+
29
+ it "should know about the yum repository" do
30
+ is_registered?('yum', :yum_repo, RightPublish::YumRepo)
31
+ end
32
+
33
+ context ".register_repo" do
34
+ it "rejects repos without a REPO_KEY" do
35
+ class MissingKey
36
+ end
37
+ expect { RightPublish::RepoManager.register_repo(MissingKey) }.to raise_error(NameError)
38
+ end
39
+
40
+ it "rejects repos whose key does not end in _repo" do
41
+ class BadKey
42
+ REPO_KEY = :bad_key
43
+ end
44
+ expect { RightPublish::RepoManager.register_repo(BadKey) }.to raise_error(TypeError)
45
+ end
46
+
47
+ it "rejects repos who do not provide options" do
48
+ class NoOptions
49
+ REPO_KEY = :nooptions_repo
50
+ end
51
+ expect { RightPublish::RepoManager.register_repo(NoOptions) }.to raise_error(NameError)
52
+ end
53
+
54
+ it "accpets repos who are properly defined" do
55
+ class GoodRepo
56
+ include RightPublish::Repo
57
+ REPO_KEY = :good_repo
58
+ REPO_OPTIONS = {}
59
+ end
60
+ RightPublish::RepoManager.register_repo(GoodRepo).should be_equal(nil)
61
+ is_registered?('good', :good_repo, GoodRepo)
62
+ end
63
+ end
64
+
65
+ end
data/spec/repo_spec.rb ADDED
@@ -0,0 +1,74 @@
1
+ require 'right_publish/repo'
2
+ require 'spec_helper'
3
+
4
+ describe RightPublish::Repo do
5
+
6
+ class FakeRepo
7
+ include RightPublish::Repo
8
+ REPO_KEY = :fake_repo
9
+ REPO_OPTIONS = {}
10
+ end
11
+
12
+ module MockLocal
13
+ STORAGE_KEY = :mocklocal_storage
14
+ STORAGE_OPTIONS = { }
15
+
16
+ def self.get_directories()
17
+ end
18
+ end
19
+
20
+ module MockRemote
21
+ STORAGE_KEY = :mockremote_storage
22
+ STORAGE_OPTIONS = { }
23
+
24
+ def self.get_directories()
25
+ end
26
+ end
27
+
28
+ before(:all) do
29
+ RightPublish::StorageManager.register_storage(MockLocal)
30
+ RightPublish::StorageManager.register_storage(MockRemote)
31
+ RightPublish::RepoManager.register_repo(FakeRepo)
32
+ end
33
+
34
+ before(:each) do
35
+ flexmock(RightPublish::Profile) do |obj|
36
+ obj.should_receive(:log).and_return { |str,dbg|
37
+ }
38
+
39
+ obj.should_receive(:config).and_return {
40
+ { :verbose=>false,
41
+ :remote_storage=>{:provider=>'mockremote'},
42
+ :local_storage=>{:provider=>'mocklocal'},
43
+ :fake_repo=>{:subdir=>'fake/'}
44
+ }
45
+ }
46
+ end
47
+
48
+ @repo = RightPublish::RepoManager.get_repository(:fake_repo)
49
+ end
50
+
51
+ context "#fetch" do
52
+ it "fetches from remote storage to local" do
53
+ flexmock(RightPublish::Storage).should_receive(:sync_dirs).and_return do |src,dest,options|
54
+ src.should be_equal(MockRemote)
55
+ dest.should be_equal(MockLocal)
56
+ nil
57
+ end
58
+ @repo.fetch
59
+ end
60
+ end
61
+
62
+ context "#store" do
63
+ it "stores from local storage to remote" do
64
+ flexmock(RightPublish::Storage).should_receive(:sync_dirs).and_return do |src,dest,options|
65
+ src.should be_equal(MockLocal)
66
+ dest.should be_equal(MockRemote)
67
+ nil
68
+ end
69
+ @repo.store
70
+ end
71
+ end
72
+
73
+ end
74
+
@@ -0,0 +1,288 @@
1
+ require 'right_publish/repo'
2
+ require 'spec_helper'
3
+
4
+ describe RightPublish::AptRepo do
5
+
6
+ before(:each) do
7
+ @cache_dir = 'somedir/'
8
+ @repo_subdir = 'fake/'
9
+
10
+ @repo = flexmock(RightPublish::RepoManager.get_repository(:apt_repo)) do |obj|
11
+ obj.should_receive(:fetch)
12
+ obj.should_receive(:store)
13
+ obj.should_receive(:do_in_subdir).and_return {|dir,block| block.call}
14
+ obj.should_receive(:prune_all)
15
+ obj.should_receive(:write_conf_file)
16
+ end
17
+
18
+ flexmock(RightPublish::Profile) do |obj|
19
+ obj.should_receive(:log).and_return { |str,dbg| }
20
+ end
21
+
22
+ flexmock(File) { |obj| obj.should_receive(:file?).and_return(true) }
23
+ end
24
+
25
+ context "#publish" do
26
+
27
+ # Test the Pool (not flat) repo profile type
28
+ [false, true].each do |should_sign|
29
+
30
+ context "Pool layout#{" (with signature)" if should_sign}" do
31
+
32
+ def build_expectations(pkgs, expected_dists)
33
+ pkgs = Array(pkgs)
34
+ expected_dists = Array(expected_dists)
35
+
36
+ pkgs.each do |pkg|
37
+ expected_dists.each do |dist|
38
+ @remove_expectations[dist] ||= []
39
+ @remove_expectations[dist] << RightPublish::AptRepo.pkg_parts(pkg)[:name]
40
+
41
+ @install_expectations[dist] ||= []
42
+ @install_expectations[dist] << pkg
43
+ end
44
+ end
45
+
46
+
47
+
48
+ system_calls = (pkgs.size * expected_dists.size) * 2
49
+ @repo.should_receive(@system_func).times(system_calls).and_return do |cmd|
50
+ path, subcmd, distro, pkg = /reprepro\s+(?:--ask-passphrase )?(?:-C main )?-b\s+(.+)\s+(includedeb|includedsc|removesrc|remove)\s+([^\s]+)\s+([^\s]+)\s+2>&1 >\/dev\/null\Z/.match(cmd).captures
51
+ path.should be_eql(File.join(@cache_dir,@repo_subdir))
52
+
53
+ if @remove_expectations.has_key?(distro) && @remove_expectations[distro].include?(pkg)
54
+ subcmd.should include('remove') #can be remove or removesrc
55
+ @remove_expectations.should be_has_key(distro)
56
+ @remove_expectations[distro].delete(pkg)
57
+ @remove_expectations.delete(distro) if @remove_expectations[distro].empty?
58
+ else
59
+ subcmd.should be_eql((pkg.end_with?(RightPublish::AptRepo::SRC_EXTENSION) && 'includedsc') || 'includedeb')
60
+ @install_expectations.should be_has_key(distro)
61
+ @install_expectations[distro].delete(pkg)
62
+ @install_expectations.delete(distro) if @install_expectations[distro].empty?
63
+ end
64
+ 0
65
+ end
66
+ end
67
+
68
+ before(:each) do
69
+ @apt_dists = ['quantal', 'precise', 'wheezy']
70
+ @install_expectations = {}
71
+ @remove_expectations = {}
72
+ @system_func = should_sign ? :shellout_with_password : :system
73
+ flexmock(RightPublish::Profile) do |obj|
74
+ obj.should_receive(:config).and_return {
75
+ { :verbose=>false,
76
+ :remote_storage=>{:provider=>'mockremote'},
77
+ :local_storage=>{:provider=>'mocklocal',:cache_dir=>@cache_dir},
78
+ :apt_repo=>{
79
+ :auto=>true,
80
+ :subdir=>@repo_subdir,
81
+ :dists=>@apt_dists,
82
+ :gpg_key_id=>should_sign,
83
+ :gpg_password=>"fakepass"}
84
+ }
85
+ }
86
+ end
87
+ end
88
+
89
+ after(:each) do
90
+ @install_expectations.should be_empty
91
+ @remove_expectations.should be_empty
92
+ end
93
+
94
+ # Test for publish noarch packages (multicasting)
95
+ context "NoArch Packages" do
96
+ it "installs a single noarch deb file to all dists" do
97
+ deb_file = 'foo_1_all.deb'
98
+ build_expectations(deb_file,@apt_dists)
99
+ @repo.publish(deb_file, nil)
100
+ end
101
+
102
+ it "installs a single src dsc file to all dists" do
103
+ dsc_file = 'foo_1.dsc'
104
+ build_expectations(dsc_file,@apt_dists)
105
+ @repo.publish(dsc_file, nil)
106
+ end
107
+
108
+ it "installs a list of noarch deb files to all dists" do
109
+ deb_files = ['foo_1_all.deb', 'bar_1_all.deb']
110
+ build_expectations(deb_files,@apt_dists)
111
+ @repo.publish(deb_files, nil)
112
+ end
113
+
114
+ it "globs and installs a directory of noarch deb files to all dists" do
115
+ deb_files = ['foo_1_all.deb', 'bar_1_all.deb']
116
+ build_expectations(deb_files,@apt_dists)
117
+ flexmock(File) { |obj| obj.should_receive(:directory?).and_return(true) }
118
+ flexmock(Dir) { |obj| obj.should_receive(:glob).and_return(deb_files) }
119
+ @repo.publish('somedir/', nil)
120
+ end
121
+
122
+ it "fails with no files in a dir" do
123
+ flexmock(File) { |obj| obj.should_receive(:directory?).and_return(true) }
124
+ flexmock(Dir) { |obj| obj.should_receive(:glob).and_return([]) }
125
+ @repo.should_receive(@system_func).never
126
+ expect { @repo.publish('some_dir/', nil) }.to raise_error(RuntimeError)
127
+ end
128
+
129
+ it "fails with files missing a deb extenstion" do
130
+ deb_files = ['foo_1_all.deb', 'bar.all.rpm']
131
+ @repo.should_receive(@system_func).never
132
+ expect { @repo.publish(deb_files, nil) }.to raise_error(RuntimeError)
133
+ end
134
+
135
+ it "fails with a mix of noarch and binary debs" do
136
+ deb_files = ['foo_1_all.deb', 'bar_2_amd64.deb']
137
+ @repo.should_receive(@system_func).never
138
+ expect { @repo.publish(deb_files, nil) }.to raise_error(RuntimeError)
139
+ end
140
+ end # end NoArch context
141
+
142
+ context "Architecture Dependant Packages" do
143
+ before(:each) do
144
+ @target_distribution_str = 'quantal'
145
+ end
146
+
147
+ it "installs a single amd64 deb file to a dist" do
148
+ deb_file = 'foo_1_amd64.deb'
149
+ build_expectations(deb_file,@target_distribution_str)
150
+ @repo.publish(deb_file, @target_distribution_str)
151
+ end
152
+
153
+ it "installs a list of amd64 debs to a dist" do
154
+ deb_files = ['foo1.9_1.2~precise_amd64.deb', 'bar_1_amd64.deb']
155
+ build_expectations(deb_files,@target_distribution_str)
156
+ @repo.publish(deb_files, @target_distribution_str)
157
+ end
158
+
159
+ it "installs a directory mixed of amd64 and i386 debs to a dist" do
160
+ deb_files = ['foo_1_amd64.deb', 'bar_1_i386.deb']
161
+ build_expectations(deb_files,@target_distribution_str)
162
+ flexmock(File) { |obj| obj.should_receive(:directory?).and_return(true) }
163
+ flexmock(Dir) { |obj| obj.should_receive(:glob).and_return(deb_files) }
164
+ @repo.publish('some_dir/', @target_distribution_str)
165
+ end
166
+
167
+ it "fails with no files in a dir" do
168
+ flexmock(File) { |obj| obj.should_receive(:directory?).and_return(true) }
169
+ flexmock(Dir) { |obj| obj.should_receive(:glob).and_return([]) }
170
+ @repo.should_receive(@system_func).never
171
+ expect { @repo.publish('some_dir/', @target_distribution_str) }.to raise_error(RuntimeError)
172
+ end
173
+
174
+ it "fails with files missing a deb extension" do
175
+ deb_files = ['foo_1_amd64.deb', 'bar_1_i386.rpm']
176
+ @repo.should_receive(@system_func).never
177
+ expect { @repo.publish(deb_files, @target_distribution_str) }.to raise_error(RuntimeError)
178
+ end
179
+
180
+ it "fails with unknown architectures" do
181
+ deb_files = ['foo.ppc.deb', 'bar.ppc.deb']
182
+ @repo.should_receive(@system_func).never
183
+ expect { @repo.publish(deb_files, @target_distribution_str) }.to raise_error(RuntimeError)
184
+ end
185
+
186
+ it "fails when not provided with a target" do
187
+ deb_files = ['foo_1_amd64.deb', 'bar_1_i386.deb']
188
+ @repo.should_receive(@system_func).never
189
+ expect { @repo.publish(deb_files, nil) }.to raise_error(RuntimeError)
190
+ end
191
+ end # end Architecture Dependant context
192
+ end # end Pool context
193
+ end
194
+
195
+ # Test the Flat repo profile type
196
+ context "Flat layout" do
197
+ def build_expectations(pkgs)
198
+ pkgs = Array(pkgs)
199
+
200
+ pkgs.each do |pkg|
201
+ dist_path = File.join(@repo_subdir, (pkg.end_with?(RightPublish::AptRepo::BIN_EXTENSION) && 'binaries') || 'sources')
202
+
203
+ @install_expectations[dist_path] ||= []
204
+ @install_expectations[dist_path] << pkg
205
+ end
206
+ @repo.should_receive(:install_file).and_return do |pkg,dir|
207
+ @install_expectations.should be_has_key(dir)
208
+ @install_expectations[dir].delete(pkg)
209
+ @install_expectations.delete(dir) if @install_expectations[dir].empty?
210
+ end
211
+ @repo.should_receive(:system).twice.and_return(0)
212
+ end
213
+
214
+ before(:each) do
215
+ @install_expectations = {}
216
+ flexmock(RightPublish::Profile) do |obj|
217
+ obj.should_receive(:config).and_return {
218
+ { :verbose=>false,
219
+ :remote_storage=>{:provider=>'mockremote'},
220
+ :local_storage=>{:provider=>'mocklocal',:cache_dir=>@cache_dir},
221
+ :apt_repo=>{
222
+ :apt=>false,
223
+ :subdir=>@repo_subdir }
224
+ }
225
+ }
226
+ end
227
+ end
228
+
229
+ after(:each) do
230
+ @install_expectations.should be_empty
231
+ end
232
+
233
+ it "installs a single deb file to repo" do
234
+ deb_file = 'foo_1_all.deb'
235
+ build_expectations(deb_file)
236
+ @repo.publish(deb_file, nil)
237
+ end
238
+
239
+ it "installs a single src deb file to repo" do
240
+ dsc_file = 'foo_1.dsc'
241
+ src_file = 'foo_1.orig.tar.gz'
242
+ diff_file = 'foo_1.diff.gz'
243
+ all_files = [dsc_file, src_file, diff_file]
244
+ flexmock(Dir).should_receive(:glob).and_return([src_file])
245
+ build_expectations(all_files)
246
+ @repo.publish(dsc_file, nil)
247
+ end
248
+
249
+ it "installs a list of deb files to repo" do
250
+ deb_files = ['foo_1_amd64.deb', 'bar_1_amd64.deb']
251
+ build_expectations(deb_files)
252
+ @repo.publish(deb_files, nil)
253
+ end
254
+
255
+ it "globs and installs a directory of deb files to repo" do
256
+ deb_files = ['foo_1_all.deb', 'bar_1.dsc']
257
+ src_file = 'bar_1.orig.tar.gz'
258
+ diff_file = 'bar_1.diff.gz'
259
+ all_files = ([deb_files, src_file, diff_file]).flatten
260
+ build_expectations(all_files)
261
+ flexmock(File) { |obj| obj.should_receive(:directory?).and_return(true) }
262
+ flexmock(Dir).should_receive(:glob).and_return do |pattern|
263
+ (pattern.end_with?('orig.tar.gz') && [src_file]) || deb_files
264
+ end
265
+ @repo.publish('somedir/', nil)
266
+ end
267
+
268
+ it "succeeds with a mix of noarch and binary debs" do
269
+ deb_files = ['foo_1_all.deb', 'bar_1_amd64.deb']
270
+ build_expectations(deb_files)
271
+ @repo.publish(deb_files, nil)
272
+ end
273
+
274
+ it "fails with no files in a dir" do
275
+ flexmock(File) { |obj| obj.should_receive(:directory?).and_return(true) }
276
+ flexmock(Dir) { |obj| obj.should_receive(:glob).and_return([]) }
277
+ @repo.should_receive(:system).never
278
+ expect { @repo.publish('some_dir/', nil) }.to raise_error(RuntimeError)
279
+ end
280
+
281
+ it "fails with files missing a deb extenstion" do
282
+ deb_files = ['foo_1_i386.deb', 'bar.all.rpm']
283
+ @repo.should_receive(:system).never
284
+ expect { @repo.publish('some_dir/', nil) }.to raise_error(RuntimeError)
285
+ end
286
+ end # end Trivial context
287
+ end # end #publish context
288
+ end
@@ -0,0 +1,79 @@
1
+ require 'right_publish/repo'
2
+ require 'spec_helper'
3
+
4
+ describe RightPublish::GemRepo do
5
+
6
+ before(:each) do
7
+ @install_expectations = []
8
+ @repo_subdir = 'fake/'
9
+ @repo = flexmock(RightPublish::RepoManager.get_repository(:gem_repo)) do |obj|
10
+ obj.should_receive(:fetch)
11
+ obj.should_receive(:store)
12
+ obj.should_receive(:do_in_subdir).and_return {|dir,block| block.call}
13
+ end
14
+
15
+ flexmock(File) { |obj| obj.should_receive(:file?).and_return(true) }
16
+
17
+ flexmock(RightPublish::Profile) do |obj|
18
+ obj.should_receive(:log).and_return { |str,dbg|
19
+ }
20
+
21
+ obj.should_receive(:config).and_return {
22
+ { :verbose=>false,
23
+ :remote_storage=>{:provider=>'mockremote'},
24
+ :local_storage=>{:provider=>'mocklocal'},
25
+ :gem_repo=>{:subdir=>@repo_subdir}
26
+ }
27
+ }
28
+ end
29
+ end
30
+
31
+ after(:each) do
32
+ @install_expectations.should be_empty
33
+ end
34
+
35
+ context "#publish" do
36
+ def build_expectations(pkgs)
37
+ @install_expectations = Array(pkgs)
38
+ @repo.should_receive(:install_file).and_return do |pkg,dir|
39
+ @install_expectations.delete(pkg)
40
+ dir.should be_eql(File.join(@repo_subdir, RightPublish::GemRepo::GEMS_SUBDIRECTORY ))
41
+ end
42
+ @repo.should_receive(:system).once.and_return(0)
43
+ end
44
+
45
+ it "should install a single gem file" do
46
+ gem_file = 'foo-1.gem'
47
+ build_expectations(gem_file)
48
+ @repo.publish(gem_file, nil)
49
+ end
50
+
51
+ it "should install a list of gem files" do
52
+ gem_files = ['foo-1.gem', 'bar-2.0.0.gem']
53
+ build_expectations(gem_files)
54
+ @repo.publish(gem_files, nil)
55
+ end
56
+
57
+ it "should glob a directory of gem files and install them" do
58
+ gem_files = ['foo-1.gem', 'bar_game-2.0.gem']
59
+ build_expectations(gem_files)
60
+ flexmock(File) { |obj| obj.should_receive(:directory?).and_return(true) }
61
+ flexmock(Dir) { |obj| obj.should_receive(:glob).and_return(gem_files) }
62
+ @repo.publish('some_dir/', nil)
63
+ end
64
+
65
+ it "should fail with no files in a dir" do
66
+ flexmock(File) { |obj| obj.should_receive(:directory?).and_return(true) }
67
+ flexmock(Dir) { |obj| obj.should_receive(:glob).and_return([]) }
68
+ @repo.should_receive(:system).never
69
+ expect { @repo.publish('some_dir/', nil) }.to raise_error(RuntimeError)
70
+ end
71
+
72
+ it "should fail with files without a gem extenstion" do
73
+ gem_files = ['foo-1.gem', 'bar-2.rpm']
74
+ @repo.should_receive(:system).never
75
+ expect { @repo.publish(gem_files, nil) }.to raise_error(RuntimeError)
76
+ end
77
+ end
78
+ end
79
+