yes_ship_it 0.0.5 → 0.0.6

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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/MIT-LICENSE +17 -0
  4. data/assertions/built_gem.rb +4 -10
  5. data/assertions/change_log.rb +6 -12
  6. data/assertions/published_gem.rb +7 -13
  7. data/assertions/pushed_code.rb +4 -6
  8. data/assertions/pushed_tag.rb +4 -6
  9. data/assertions/release_archive.rb +9 -14
  10. data/assertions/release_branch.rb +3 -4
  11. data/assertions/submitted_rpm.rb +21 -35
  12. data/assertions/tag.rb +5 -7
  13. data/assertions/version.rb +10 -6
  14. data/assertions/working_directory.rb +3 -4
  15. data/assertions/yes_it_shipped.rb +6 -12
  16. data/bin/yes_ship_it +23 -10
  17. data/lib/version.rb +1 -1
  18. data/lib/yes_ship_it/assertion.rb +9 -3
  19. data/lib/yes_ship_it/dry_executor.rb +15 -0
  20. data/lib/yes_ship_it/engine.rb +30 -18
  21. data/lib/yes_ship_it/exceptions.rb +3 -0
  22. data/lib/yes_ship_it/executor.rb +37 -0
  23. data/lib/yes_ship_it/git.rb +8 -7
  24. data/lib/yes_ship_it/init.rb +50 -0
  25. data/lib/yes_ship_it/plugin.rb +76 -0
  26. data/lib/yes_ship_it.rb +4 -0
  27. data/spec/data/init/ruby/lib/version.rb +3 -0
  28. data/spec/data/plugins/my_other_plugin.rb +14 -0
  29. data/spec/data/plugins/my_plugin.rb +14 -0
  30. data/spec/data/version/polkaversion.h +1 -0
  31. data/spec/data/yes_ship_it.plugins.conf +4 -0
  32. data/spec/integration/cli_spec.rb +155 -3
  33. data/spec/spec_helper.rb +2 -0
  34. data/spec/system/data/red_herring-checkout-dry-run.tar.gz +0 -0
  35. data/spec/system/data/red_herring-checkout-rpm.tar.gz +0 -0
  36. data/spec/system/dry_run_spec.rb +59 -0
  37. data/spec/system/rpm_spec.rb +62 -0
  38. data/spec/system/ruby_gem_spec.rb +2 -3
  39. data/spec/unit/assertion_spec.rb +11 -1
  40. data/spec/unit/assertions/change_log_spec.rb +6 -2
  41. data/spec/unit/assertions/published_gem_spec.rb +6 -4
  42. data/spec/unit/assertions/pushed_code_spec.rb +1 -1
  43. data/spec/unit/assertions/version_spec.rb +5 -0
  44. data/spec/unit/assertions/yes_it_shipped_spec.rb +1 -1
  45. data/spec/unit/dry_executor_spec.rb +5 -0
  46. data/spec/unit/engine_spec.rb +16 -0
  47. data/spec/unit/executor_spec.rb +26 -0
  48. data/spec/unit/git_spec.rb +5 -4
  49. data/spec/unit/init_spec.rb +49 -0
  50. data/spec/unit/plugin_spec.rb +18 -0
  51. data/spec/unit/support/assertion_examples.rb +4 -4
  52. data/spec/unit/support/executor_examples.rb +17 -0
  53. metadata +23 -3
@@ -1,15 +1,28 @@
1
1
  module YSI
2
2
  class Engine
3
3
  attr_reader :assertions
4
+ attr_reader :executor
4
5
  attr_accessor :version, :tag_date, :release_archive
5
6
  attr_accessor :out
6
- attr_accessor :dry_run
7
7
  attr_accessor :data_dir
8
8
 
9
9
  def initialize
10
10
  @assertions = []
11
11
  @out = STDOUT
12
12
  @data_dir = File.expand_path("~/.ysi")
13
+ self.dry_run = false
14
+ end
15
+
16
+ def dry_run=(dry_run)
17
+ if dry_run
18
+ @executor = DryExecutor.new
19
+ else
20
+ @executor = Executor.new
21
+ end
22
+ end
23
+
24
+ def dry_run?
25
+ @executor.is_a?(DryExecutor)
13
26
  end
14
27
 
15
28
  def read_config(yaml)
@@ -61,7 +74,7 @@ module YSI
61
74
 
62
75
  def github_project_name
63
76
  if !@github_project_name
64
- origin = Git.new.origin
77
+ origin = Git.new(Executor.new).origin
65
78
  @github_project_name = origin.match("git@github.com:(.*)")[1]
66
79
  end
67
80
  @github_project_name
@@ -111,18 +124,18 @@ module YSI
111
124
  skipped_assertions << assertion
112
125
  next
113
126
  end
114
- success = assertion.check
115
- if success
116
- out.puts success
117
- else
118
- if assertion.error
119
- out.puts "error"
120
- out.puts " " + assertion.error
121
- errored_assertions.push(assertion)
127
+ begin
128
+ success = assertion.check
129
+ if success
130
+ out.puts success
122
131
  else
123
132
  out.puts "fail"
124
133
  failed_assertions.push(assertion)
125
134
  end
135
+ rescue AssertionError => e
136
+ out.puts "error"
137
+ out.puts " " + e.message
138
+ errored_assertions.push(assertion)
126
139
  end
127
140
  end
128
141
 
@@ -141,16 +154,15 @@ module YSI
141
154
  return 0
142
155
  else
143
156
  failed_assertions.each do |assertion|
144
- if dry_run
157
+ if dry_run?
145
158
  out.print "Dry run: "
146
159
  end
147
160
  out.print "Asserting #{assertion.display_name}: "
148
- success = assertion.assert(dry_run: dry_run)
149
- if !success
150
- if assertion.error
151
- out.puts "error"
152
- out.puts " " + assertion.error
153
- end
161
+ begin
162
+ success = assertion.assert(executor)
163
+ rescue AssertionError => e
164
+ out.puts "error"
165
+ out.puts " " + e.message
154
166
  out.puts
155
167
  out.puts "Ran into an error. Stopping shipping."
156
168
  return 1
@@ -159,7 +171,7 @@ module YSI
159
171
  end
160
172
 
161
173
  out.puts
162
- if dry_run
174
+ if dry_run?
163
175
  out.puts "Did a dry run of shipping #{project_name} #{version}." +
164
176
  " Nothing was changed."
165
177
  else
@@ -1,4 +1,7 @@
1
1
  module YSI
2
2
  class Error < StandardError
3
3
  end
4
+
5
+ class AssertionError < StandardError
6
+ end
4
7
  end
@@ -0,0 +1,37 @@
1
+ module YSI
2
+ class Executor
3
+ def run_command(args, working_directory: Dir.pwd)
4
+ begin
5
+ Dir.chdir(working_directory) do
6
+ Cheetah.run(args, stdout: :capture)
7
+ end
8
+ rescue Cheetah::ExecutionFailed => e
9
+ raise YSI::AssertionError.new(e.message)
10
+ end
11
+ end
12
+
13
+ def http_post(url, data)
14
+ begin
15
+ RestClient.post(url, data)
16
+ rescue RestClient::Exception => e
17
+ raise YSI::AssertionError.new(e.message)
18
+ end
19
+ end
20
+
21
+ def http_put(url, data, options)
22
+ begin
23
+ RestClient.put(url, data, options)
24
+ rescue RestClient::Exception => e
25
+ raise YSI::AssertionError.new(e.message)
26
+ end
27
+ end
28
+
29
+ def http_delete(url)
30
+ begin
31
+ RestClient.delete(url)
32
+ rescue RestClient::Exception => e
33
+ raise YSI::AssertionError.new(e.message)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,29 +1,30 @@
1
1
  module YSI
2
2
  class Git
3
- def initialize(working_dir = Dir.pwd)
3
+ def initialize(executor, working_dir = Dir.pwd)
4
+ @executor = executor
4
5
  @working_dir = working_dir
5
6
  end
6
7
 
7
8
  def run_git(args)
8
9
  Dir.chdir(@working_dir) do
9
- `git #{args}`
10
+ @executor.run_command(["git"] + args)
10
11
  end
11
12
  end
12
13
 
13
14
  def origin
14
- run_git("remote -v").match(/origin\s+(.*?)(\.git)?\s+\(push\)/)[1]
15
+ run_git(["remote", "-v"]).match(/origin\s+(.*?)(\.git)?\s+\(push\)/)[1]
15
16
  end
16
17
 
17
18
  def needs_push?
18
- local_master = run_git("rev-parse master")
19
- remote_master = run_git("rev-parse origin/master")
20
- base = run_git("merge-base master origin/master")
19
+ local_master = run_git(["rev-parse", "master"])
20
+ remote_master = run_git(["rev-parse", "origin/master"])
21
+ base = run_git(["merge-base", "master", "origin/master"])
21
22
 
22
23
  remote_master == base && local_master != remote_master
23
24
  end
24
25
 
25
26
  def push
26
- `git push`
27
+ run_git(["push"])
27
28
  end
28
29
  end
29
30
  end
@@ -0,0 +1,50 @@
1
+ module YSI
2
+ class Init
3
+ attr_accessor :out
4
+
5
+ def initialize(path)
6
+ @path = path
7
+
8
+ @out = STDOUT
9
+ end
10
+
11
+ def setup_config
12
+ config_file = File.join(@path, "yes_ship_it.conf")
13
+
14
+ if File.exist?(config_file)
15
+ out.puts "There already is a file `yes_ship_it.conf`."
16
+ out.puts
17
+ out.puts "This project does not seem to need initialization."
18
+ return
19
+ end
20
+
21
+ out.puts "Initialized directory for shipping."
22
+ out.puts
23
+ File.open(config_file, "w") do |f|
24
+ f.puts "# Experimental release automation. See https://github.com/cornelius/yes_ship_it."
25
+ if File.exist?(File.join(@path, "lib", "version.rb"))
26
+ out.puts "It looks like this is is Ruby project."
27
+
28
+ f.puts "include:"
29
+ f.puts " ruby_gem"
30
+ else
31
+ out.puts "Couldn't determine type of project, wrote a generic template."
32
+
33
+ f.puts "assertions:"
34
+ f.puts " - release_branch"
35
+ f.puts " - working_directory"
36
+ f.puts " - version"
37
+ f.puts " - change_log"
38
+ f.puts " - tag"
39
+ f.puts " - pushed_tag"
40
+ f.puts " - pushed_code"
41
+ f.puts " - yes_it_shipped"
42
+ end
43
+ end
44
+ out.puts
45
+ out.puts "Check the file `yes_ship_it.conf` and adapt it to your needs."
46
+ out.puts
47
+ out.puts "Happy shipping!"
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,76 @@
1
+ module YSI
2
+ class Plugin
3
+ attr_accessor :out, :err
4
+
5
+ def initialize(path)
6
+ @plugin_dir = File.join(path, "yes_ship_it", "assertions")
7
+
8
+ @out = STDOUT
9
+ @err = STDERR
10
+ end
11
+
12
+ def load
13
+ plugin_paths = []
14
+ if File.exist?(@plugin_dir)
15
+ plugin_paths = Dir.glob("#{@plugin_dir}/*.rb").sort
16
+ end
17
+
18
+ plugins = {}
19
+ plugin_paths.each do |plugin_path|
20
+ plugin_name = File.basename(plugin_path, ".rb")
21
+ require plugin_path
22
+ plugins[plugin_name] = YSI::Assertion.class_for_name(plugin_name)
23
+ end
24
+
25
+ plugins
26
+ end
27
+
28
+ def list
29
+ plugins = load
30
+
31
+ if plugins.empty?
32
+ out.puts "There are no local plugins."
33
+ out.puts
34
+ out.puts "Create one with `yes_ship_it plugin init MyAssertion`."
35
+ out.puts
36
+ out.puts "Documentation about how to write plugins can be found at"
37
+ out.puts
38
+ out.puts " https://github.com/cornelius/yes_ship_it/wiki/plugins"
39
+ else
40
+ plugins.each do |plugin_name, plugin_class|
41
+ out.puts "#{plugin_name}: #{plugin_class.display_name}"
42
+ end
43
+ end
44
+ end
45
+
46
+ def generate(name, display_name)
47
+ plugin_path = File.join(@plugin_dir, name + ".rb")
48
+
49
+ if File.exist?(plugin_path)
50
+ err.puts "Can't generate plugin. Plugin already exists at `#{plugin_path}`."
51
+ exit 1
52
+ end
53
+
54
+ FileUtils.mkdir_p(@plugin_dir)
55
+
56
+ File.open(plugin_path, "w") do |f|
57
+ f.puts "module YSI"
58
+ f.puts " class #{YSI::Assertion.class_name(name)} < Assertion"
59
+ f.puts " def self.display_name"
60
+ f.puts " \"#{display_name}\""
61
+ f.puts " end"
62
+ f.puts
63
+ f.puts " def check"
64
+ f.puts " end"
65
+ f.puts
66
+ f.puts " def assert(executor)"
67
+ f.puts " \"help me to do it\""
68
+ f.puts " end"
69
+ f.puts " end"
70
+ f.puts "end"
71
+ end
72
+
73
+ out.puts "Generated assertion plugin at `#{plugin_path}`."
74
+ end
75
+ end
76
+ end
data/lib/yes_ship_it.rb CHANGED
@@ -10,6 +10,10 @@ require_relative "yes_ship_it/assertion.rb"
10
10
  require_relative "yes_ship_it/engine.rb"
11
11
  require_relative "yes_ship_it/exceptions.rb"
12
12
  require_relative "yes_ship_it/git.rb"
13
+ require_relative "yes_ship_it/executor.rb"
14
+ require_relative "yes_ship_it/dry_executor.rb"
15
+ require_relative "yes_ship_it/init.rb"
16
+ require_relative "yes_ship_it/plugin.rb"
13
17
 
14
18
  assertions_dir = File.expand_path("../../assertions", __FILE__)
15
19
  Dir[File.join(assertions_dir, "*.rb")].each { |f| require(f) }
@@ -0,0 +1,3 @@
1
+ module YSI
2
+ VERSION = "0.0.5"
3
+ end
@@ -0,0 +1,14 @@
1
+ module YSI
2
+ class MyOtherPlugin < Assertion
3
+ def self.display_name
4
+ "My other even more awesome plugin"
5
+ end
6
+
7
+ def check
8
+ end
9
+
10
+ def assert(executor)
11
+ "done"
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module YSI
2
+ class MyPlugin < Assertion
3
+ def self.display_name
4
+ "My awesome plugin"
5
+ end
6
+
7
+ def check
8
+ end
9
+
10
+ def assert(executor)
11
+ "help me to do it"
12
+ end
13
+ end
14
+ end
@@ -0,0 +1 @@
1
+ #define POLKA_VERSION "0.8"
@@ -0,0 +1,4 @@
1
+ assertions:
2
+ my_plugin:
3
+ my_other_plugin:
4
+
@@ -221,6 +221,33 @@ EOT
221
221
  file_list = `tar tzf #{release_archive}`.split("\n").sort
222
222
  expect(file_list).to eq(expected_file_list.split("\n").sort)
223
223
  end
224
+
225
+ it "loads plugins" do
226
+ dir = nil
227
+ given_directory do
228
+ dir = given_directory "red_herring" do
229
+ given_file("yes_ship_it.conf", from: "yes_ship_it.plugins.conf")
230
+ given_directory "yes_ship_it" do
231
+ given_directory_from_data "assertions", from: "plugins"
232
+ end
233
+ end
234
+ end
235
+
236
+ expected_output = <<EOT
237
+ Shipping...
238
+
239
+ Checking My awesome plugin: fail
240
+ Checking My other even more awesome plugin: fail
241
+
242
+ Dry run: Asserting My awesome plugin: help me to do it
243
+ Dry run: Asserting My other even more awesome plugin: done
244
+
245
+ Did a dry run of shipping red_herring . Nothing was changed.
246
+ EOT
247
+ expect(run_command(args: ["--dry-run"],
248
+ working_directory: File.join(dir))).
249
+ to exit_with_success(expected_output)
250
+ end
224
251
  end
225
252
 
226
253
  describe "changelog helper" do
@@ -250,12 +277,29 @@ EOT
250
277
  end
251
278
 
252
279
  describe "init" do
280
+ it "fails if there already is a config" do
281
+ dir = given_directory do
282
+ given_dummy_file("yes_ship_it.conf")
283
+ end
284
+
285
+ expected_output = <<EOT
286
+ There already is a file `yes_ship_it.conf`.
287
+
288
+ This project does not seem to need initialization.
289
+ EOT
290
+
291
+ expect(run_command(args: ["init"], working_directory: dir)).
292
+ to exit_with_success(expected_output)
293
+ end
294
+
253
295
  it "initializes directory with generic template" do
254
296
  dir = given_directory
255
297
 
256
298
  expected_output = <<EOT
257
299
  Initialized directory for shipping.
258
300
 
301
+ Couldn't determine type of project, wrote a generic template.
302
+
259
303
  Check the file `yes_ship_it.conf` and adapt it to your needs.
260
304
 
261
305
  Happy shipping!
@@ -263,10 +307,118 @@ EOT
263
307
 
264
308
  expect(run_command(args: ["init"], working_directory: dir)).
265
309
  to exit_with_success(expected_output)
310
+ end
266
311
 
267
- expect(File.read(File.join(dir, "yes_ship_it.conf"))).to eq(
268
- "# Experimental release automation. See https://github.com/cornelius/yes_ship_it.\ninclude:\n ruby_gem\n"
269
- )
312
+ it "initializes directory with specific template" do
313
+ dir = nil
314
+ given_directory("init") do
315
+ dir = given_directory_from_data("ruby", from: "init/ruby" )
316
+ end
317
+
318
+ expected_output = <<EOT
319
+ Initialized directory for shipping.
320
+
321
+ It looks like this is is Ruby project.
322
+
323
+ Check the file `yes_ship_it.conf` and adapt it to your needs.
324
+
325
+ Happy shipping!
326
+ EOT
327
+
328
+ expect(run_command(args: ["init"], working_directory: dir)).
329
+ to exit_with_success(expected_output)
330
+ end
331
+ end
332
+
333
+ describe "plugin" do
334
+ it "fails when no sub command is given" do
335
+ expect(run_command(args: ["plugin"])).to exit_with_error(1, /Invalid command/)
336
+ end
337
+
338
+ it "fails when invalid sub command is given" do
339
+ result = run_command(args: ["plugin", "xxx"])
340
+ expect(result).to exit_with_error(1, /Invalid command/)
341
+ expect(result.stderr).to match /Usage:/
342
+ end
343
+
344
+ describe "list" do
345
+ it "shows message when there are no plugins" do
346
+ dir = given_directory
347
+
348
+ expected_output = <<EOT
349
+ There are no local plugins.
350
+
351
+ Create one with `yes_ship_it plugin init MyAssertion`.
352
+
353
+ Documentation about how to write plugins can be found at
354
+
355
+ https://github.com/cornelius/yes_ship_it/wiki/plugins
356
+ EOT
357
+
358
+ expect(run_command(args: ["plugin", "list"], working_directory: dir)).
359
+ to exit_with_success(expected_output)
360
+ end
361
+
362
+ it "lists plugins" do
363
+ dir = given_directory do
364
+ given_directory "yes_ship_it" do
365
+ given_directory_from_data "assertions", from: "plugins"
366
+ end
367
+ end
368
+
369
+ expected_output = <<EOT
370
+ my_other_plugin: My other even more awesome plugin
371
+ my_plugin: My awesome plugin
372
+ EOT
373
+
374
+ expect(run_command(args: ["plugin", "list"], working_directory: dir)).
375
+ to exit_with_success(expected_output)
376
+ end
377
+ end
378
+
379
+ describe "generate" do
380
+ it "fails when arguments are missing" do
381
+ expected_output = <<EOT
382
+ Parameters are missing. Use for example
383
+
384
+ yes_ship_it plugin generate my_plugin "My plugin"
385
+
386
+ to generate a plugin `my_plugin` with a display name of "My plugin".
387
+ EOT
388
+ expect(run_command(args: ["plugin", "generate"])).to exit_with_error(1, expected_output)
389
+ end
390
+
391
+ it "fails when plugin already exists" do
392
+ dir = given_directory do
393
+ given_directory "yes_ship_it" do
394
+ given_directory "assertions" do
395
+ given_dummy_file "my_plugin.rb"
396
+ end
397
+ end
398
+ end
399
+
400
+ plugin_path = File.join(dir, "yes_ship_it", "assertions", "my_plugin.rb")
401
+
402
+ expected_output = <<EOT
403
+ Can't generate plugin. Plugin already exists at `#{plugin_path}`.
404
+ EOT
405
+ expect(run_command(args: ["plugin", "generate", "my_plugin", "My Plugin"], working_directory: dir)).
406
+ to exit_with_error(1, expected_output)
407
+ end
408
+
409
+ it "creates new plugin" do
410
+ dir = given_directory
411
+ plugin_path = File.join(dir, "yes_ship_it", "assertions", "my_plugin.rb")
412
+
413
+ expected_output = <<EOT
414
+ Generated assertion plugin at `#{plugin_path}`.
415
+ EOT
416
+ expect(run_command(args: ["plugin", "generate", "my_plugin", "My awesome plugin"], working_directory: dir)).
417
+ to exit_with_success(expected_output)
418
+
419
+ expected_code = File.read(given_file("plugins/my_plugin.rb"))
420
+ expect(File.read(plugin_path)).to eq(expected_code)
421
+ end
270
422
  end
271
423
  end
272
424
  end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require "given_filesystem/spec_helpers"
2
2
 
3
+ include GivenFilesystemSpecHelpers
4
+
3
5
  def setup_test_git_repo(version, dir)
4
6
  tarball = "spec/data/red_herring-#{version}.tar.gz"
5
7
  tarball_path = File.expand_path(tarball)
@@ -0,0 +1,59 @@
1
+ require_relative "spec_helper"
2
+
3
+ describe "dry run" do
4
+ before(:all) do
5
+ out = StringIO.new
6
+ @test = Httpotemkin::Test.new(out: out)
7
+ @test.add_server("rubygems")
8
+ @test.add_server("api.rubygems")
9
+ @test.add_server("obs")
10
+ @test.up
11
+ end
12
+
13
+ after(:all) do
14
+ @test.down
15
+ end
16
+
17
+ before(:each) do
18
+ @client = @test.start_client
19
+ @client.install_gem_from_spec("yes_ship_it.gemspec")
20
+ remote_tar = File.expand_path("../data/red_herring-remote.tar.gz", __FILE__)
21
+ @client.inject_tarball(remote_tar)
22
+ end
23
+
24
+ after(:each) do
25
+ @test.stop_client
26
+ end
27
+
28
+ it "doesn't do changes" do
29
+ checkout_tar = File.expand_path("../data/red_herring-checkout-dry-run.tar.gz", __FILE__)
30
+ @client.inject_tarball(checkout_tar)
31
+
32
+ @client.execute(["yes_ship_it.ruby2.1", "--dry-run"], working_directory: "red_herring")
33
+
34
+ expected_output = <<EOT
35
+ Shipping...
36
+
37
+ Checking release branch: master
38
+ Checking working directory: clean
39
+ Checking version number: 0.0.2
40
+ Checking change log: CHANGELOG.md
41
+ Checking tag: fail
42
+ Checking built gem: fail
43
+ Checking published gem: fail
44
+ Checking pushed tag: fail
45
+ Checking pushed code: fail
46
+
47
+ Dry run: Asserting tag: v0.0.2
48
+ Dry run: Asserting built gem: red_herring-0.0.2.gem
49
+ Dry run: Asserting published gem: red_herring-0.0.2.gem
50
+ Dry run: Asserting pushed tag: v0.0.2
51
+ Dry run: Asserting pushed code: pushed
52
+
53
+ Did a dry run of shipping red_herring 0.0.2. Nothing was changed.
54
+ EOT
55
+ expect(@client.err).to eq("")
56
+ expect(@client.out).to eq(expected_output)
57
+ expect(@client.exit_code).to eq(0)
58
+ end
59
+ end
@@ -0,0 +1,62 @@
1
+ require_relative "spec_helper"
2
+
3
+ describe "rpm" do
4
+ before(:all) do
5
+ out = StringIO.new
6
+ @test = Httpotemkin::Test.new(out: out)
7
+ @test.add_server("rubygems")
8
+ @test.add_server("api.rubygems")
9
+ @test.add_server("obs")
10
+ @test.up
11
+ end
12
+
13
+ after(:all) do
14
+ @test.down
15
+ end
16
+
17
+ before(:each) do
18
+ @client = @test.start_client
19
+ @client.install_gem_from_spec("yes_ship_it.gemspec")
20
+ remote_tar = File.expand_path("../data/red_herring-remote.tar.gz", __FILE__)
21
+ @client.inject_tarball(remote_tar)
22
+ end
23
+
24
+ after(:each) do
25
+ @test.stop_client
26
+ end
27
+
28
+ it "pushes to obs" do
29
+ checkout_tar = File.expand_path("../data/red_herring-checkout-rpm.tar.gz", __FILE__)
30
+ @client.inject_tarball(checkout_tar)
31
+
32
+ @client.execute(["yes_ship_it.ruby2.1"], working_directory: "red_herring")
33
+
34
+ expected_output = <<EOT
35
+ Shipping...
36
+
37
+ Checking release branch: master
38
+ Checking working directory: clean
39
+ Checking version number: 0.0.2
40
+ Checking change log: CHANGELOG.md
41
+ Checking tag: fail
42
+ Checking release archive: fail
43
+ Checking submitted RPM: fail
44
+ Checking pushed tag: fail
45
+ Checking pushed code: fail
46
+
47
+ Asserting tag: v0.0.2
48
+ Asserting release archive: red_herring-0.0.2.tar.gz
49
+ Asserting submitted RPM: ...
50
+ Uploading release archive 'red_herring-0.0.2.tar.gz'
51
+ Uploading spec file 'red_herring.spec'
52
+ ... home:cschum:go/red_herring
53
+ Asserting pushed tag: v0.0.2
54
+ Asserting pushed code: pushed
55
+
56
+ Shipped red_herring 0.0.2. Hooray!
57
+ EOT
58
+ expect(@client.err).to eq("")
59
+ expect(@client.out).to eq(expected_output)
60
+ expect(@client.exit_code).to eq(0)
61
+ end
62
+ end