yes_ship_it 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
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