heroku_hatchet 4.1.2 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2b30075b5028dc2c364c35d338ad0d48e7a9318c088c9f433936664d60262318
4
- data.tar.gz: 4cc696dadc3e206ff256d252b756c950d4ca0a36e541f554d1c8d416005418f3
3
+ metadata.gz: d315483e6cd1509b1ea90279b800beb2a969f57956a44f7df08c5844ec9f539b
4
+ data.tar.gz: 5f66b2f956bd2820b80dc634d68cea6dc84c7e23079253ef990fe5be8d131d0c
5
5
  SHA512:
6
- metadata.gz: b19500cd4df7b71b00d9930f47aa732db1535108895cd23c04eddc34aaad9f35550a19ff6a596c5b3b52fa01afe2cc48e7243cb4223c1c9fe5419197095db6d6
7
- data.tar.gz: 283b420ef99004247dc2ef190771a43fe401052aec131dc55531c5ebebd1f4f0ca0d3d3976d9fe4f49e8a026193975bfce7e9d7485efdfa6fbbea0167dee9bf7
6
+ metadata.gz: 03570dbbf7075600e686b4f36d1a15d51c812582ab558574c28bb4eb3f80f76618c20bb1bb6d4473a644078fcff0d831360cbfbe12a653727d6609d5a8c66853
7
+ data.tar.gz: 107c8c3accdc9690cb7daafd1a0c9a20ea21e2730d9618de2913e6d7c5ff1d6a6191f552890272436ff0833c1456bce67ae8fbafc4eaa29da667a795c5fdd404
data/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  ## HEAD
2
2
 
3
+ ## 5.0.0
4
+
5
+ - Shelling out to `heroku` commands no longer uses `Bundler.with_clean_env` (https://github.com/heroku/hatchet/pull/74)
6
+ - CI runs can now happen multiple times against the same app/pipeline (https://github.com/heroku/hatchet/pull/75)
7
+ - Breaking change: Do not allow App#run to escape to system shell by default (https://github.com/heroku/hatchet/pull/72)
8
+
9
+ > Note: If you were relying on this behavior, use the `raw: true` option.
10
+
11
+ - ReplRunner use with App#run is now deprecated (https://github.com/heroku/hatchet/pull/72)
12
+ - Calling App#run with a nil in the second argument is now deprecated (https://github.com/heroku/hatchet/pull/72)
13
+
3
14
  ## 4.1.2
4
15
 
5
16
  - Hatchet::App.default_buildpack is aliased to `:default` symbol while passing in buildpacks as an array to Hatchet::App (https://github.com/heroku/hatchet/pull/73)
data/README.md CHANGED
@@ -242,19 +242,62 @@ Hatchet::Runner.new("rails3_mri_193").deploy do |app|
242
242
  end
243
243
  ```
244
244
 
245
- This is the prefered way to run commands against the app. You can also string together commands in a session, but it's less deterministic due to difficulties in driving a REPL programatically via [repl_runner](http://github.com/schneems/repl_runner).
245
+ By default commands will be shell escaped (to prevent commands from escaping the `heroku run` command), if you want to manage your own quoting you can use the `raw: true` option:
246
246
 
247
+ ```
248
+ app.run('echo \$HELLO \$NAME', raw: true)
249
+ ```
247
250
 
248
- ```ruby
249
- Hatchet::Runner.new("rails3_mri_193").deploy do |app|
250
- app.run("bash") do |bash|
251
- bash.run("ls") {|result| assert_match "Gemfile.lock", result }
252
- bash.run("cat Procfile") {|result| assert_match "web:", result }
253
- end
254
- end
251
+ You can specify Heroku flags to the `heroku run` command by passing in the `heroku:` key along with a hash.
252
+
253
+ ```
254
+ app.run("nproc", heroku: { "size" => "performance-l" })
255
+ # => 8
255
256
  ```
256
257
 
257
- Please read the docs on [repl_runner](http://github.com/schneems/repl_runner) for more info. The only interactive commands that are supported out of the box are `rails console`, `bash`, and `irb`. It is fairly easy to add your own though.
258
+ You can see a list of Heroku flags by running:
259
+
260
+ ```
261
+ $ heroku run --help
262
+ run a one-off process inside a heroku dyno
263
+
264
+ USAGE
265
+ $ heroku run
266
+
267
+ OPTIONS
268
+ -a, --app=app (required) app to run command against
269
+ -e, --env=env environment variables to set (use ';' to split multiple vars)
270
+ -r, --remote=remote git remote of app to use
271
+ -s, --size=size dyno size
272
+ -x, --exit-code passthrough the exit code of the remote command
273
+ --no-notify disables notification when dyno is up (alternatively use HEROKU_NOTIFICATIONS=0)
274
+ --no-tty force the command to not run in a tty
275
+ --type=type process type
276
+ ```
277
+
278
+ By default Hatchet will set the app name and the exit code
279
+
280
+
281
+ ```
282
+ app.run("exit 127")
283
+ puts $?.exitcode
284
+ # => 127
285
+ ```
286
+
287
+ To skip a value you can use the constant:
288
+
289
+ ```
290
+ app.run("exit 127", heroku: { "exit-code" => Hatchet::App::SkipDefaultOption})
291
+ puts $?.exitcode
292
+ # => 0
293
+ ```
294
+
295
+ To specify a flag that has no value (such as `--no-notify`, `no-tty`, or `--exit-code`) pass a `nil` value:
296
+
297
+ ```
298
+ app.run("echo 'foo'", heroku: { "no-notify" => nil })
299
+ # This is the same as `heroku run echo 'foo' --no-notify`
300
+ ```
258
301
 
259
302
  ## Modify Application Files on Disk
260
303
 
@@ -302,6 +345,10 @@ Hatchet supports testing Heroku CI.
302
345
  ```ruby
303
346
  Hatchet::Runner.new("rails5_ruby_schema_format").run_ci do |test_run|
304
347
  assert_match "Ruby buildpack tests completed successfully", test_run.output
348
+
349
+ test_run.run_again # Runs tests again, for example to make sure the cache was used
350
+
351
+ assert_match "Using rake", test_run.output
305
352
  end
306
353
  ```
307
354
 
data/bin/hatchet CHANGED
@@ -96,7 +96,7 @@ class HatchetCLI < Thor
96
96
  desc "destroy [NAME]", "Deletes applications"
97
97
  option :all, :type => :boolean
98
98
  def destroy(name=nil)
99
- api_key = ENV['HEROKU_API_KEY'] || bundle_exec {`heroku auth:token`.chomp }
99
+ api_key = ENV['HEROKU_API_KEY'] || `heroku auth:token`.chomp
100
100
  platform_api = PlatformAPI.connect_oauth(api_key, cache: Moneta.new(:Null))
101
101
  api_rate_limit = ApiRateLimit.new(platform_api)
102
102
  reaper = Hatchet::Reaper.new(api_rate_limit: api_rate_limit)
@@ -113,7 +113,7 @@ class HatchetCLI < Thor
113
113
  private
114
114
  def load_lockfile
115
115
  return YAML.safe_load(File.read('hatchet.lock')).to_h
116
- rescue Errno::ENOENT => e
116
+ rescue Errno::ENOENT
117
117
  raise "No such file found `hatchet.lock` please run `$ bundle exec hatchet lock`"
118
118
  end
119
119
 
@@ -161,16 +161,6 @@ class HatchetCLI < Thor
161
161
  cmd("cd #{path} && git clone #{git_repo} --quiet", quiet: quiet)
162
162
  end
163
163
 
164
- def bundle_exec
165
- if defined?(Bundler)
166
- Bundler.with_clean_env do
167
- yield
168
- end
169
- else
170
- yield
171
- end
172
- end
173
-
174
164
  def cmd(command, let_fail: false, stdin: nil, quiet: true)
175
165
  command = "printf '#{stdin}' | #{command}" if stdin
176
166
  puts "Running: #{command}" unless quiet
data/hatchet.gemspec CHANGED
@@ -26,9 +26,9 @@ Gem::Specification.new do |gem|
26
26
  gem.add_dependency "threaded", "~> 0"
27
27
  gem.add_dependency 'minitest-retry', '~> 0.1.9'
28
28
 
29
- gem.add_development_dependency "minitest", "~> 5.1"
30
- gem.add_development_dependency "rake", "~> 10"
31
- gem.add_development_dependency "mocha", "~> 1"
32
- gem.add_development_dependency "parallel_tests", "~> 2"
33
- gem.add_development_dependency "travis", "~> 1"
29
+ gem.add_development_dependency "minitest", ">= 5.1"
30
+ gem.add_development_dependency "rake", ">= 10"
31
+ gem.add_development_dependency "mocha", ">= 1"
32
+ gem.add_development_dependency "parallel_tests", ">= 2"
33
+ gem.add_development_dependency "travis", ">= 1"
34
34
  end
data/hatchet.lock CHANGED
@@ -6,7 +6,7 @@
6
6
  - - test/fixtures/repos/ci/rails5_ruby_schema_format
7
7
  - 3e63c3e13f435cf4ab11265e9abd161cc28cc552
8
8
  - - test/fixtures/repos/default/default_ruby
9
- - da748a59340be8b950e7bbbfb32077eb67d70c3c
9
+ - 6e642963acec0ff64af51bd6fba8db3c4176ed6e
10
10
  - - test/fixtures/repos/lock/lock_fail
11
11
  - da748a59340be8b950e7bbbfb32077eb67d70c3c
12
12
  - - test/fixtures/repos/rails2/rails2blog
data/lib/hatchet.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require 'active_support/core_ext/object/blank'
2
2
  require 'rrrretry'
3
- require 'repl_runner'
4
3
 
5
4
  require 'json'
6
5
  require 'stringio'
data/lib/hatchet/app.rb CHANGED
@@ -46,6 +46,8 @@ module Hatchet
46
46
  @buildpacks = buildpack || buildpacks || buildpack_url || self.class.default_buildpack
47
47
  @buildpacks = Array(@buildpacks)
48
48
  @buildpacks.map! {|b| b == :default ? self.class.default_buildpack : b}
49
+ @already_in_dir = nil
50
+ @app_is_setup = nil
49
51
 
50
52
  @before_deploy = before_deploy
51
53
  @app_config = config
@@ -108,10 +110,25 @@ module Hatchet
108
110
  end
109
111
  end
110
112
 
113
+ DefaultCommand = Object.new
111
114
  # runs a command on heroku similar to `$ heroku run #foo`
112
115
  # but programatically and with more control
113
- def run(cmd_type, command = nil, options = {}, &block)
114
- command = cmd_type.to_s if command.nil?
116
+ def run(cmd_type, command = DefaultCommand, options = {}, &block)
117
+ case command
118
+ when Hash
119
+ options.merge!(command)
120
+ command = cmd_type.to_s
121
+ when nil
122
+ STDERR.puts "Calling App#run with an explicit nil value in the second argument is deprecated."
123
+ STDERR.puts "You can pass in a hash directly as the second argument now.\n#{caller.join("\n")}"
124
+ command = cmd_type.to_s
125
+ when DefaultCommand
126
+ command = cmd_type.to_s
127
+ else
128
+ command = command.to_s
129
+ end
130
+ command = command.shellescape unless options.delete(:raw)
131
+
115
132
  default_options = { "app" => name, "exit-code" => nil }
116
133
  heroku_options = (default_options.merge(options.delete(:heroku) || {})).map do |k,v|
117
134
  next if v == Hatchet::App::SkipDefaultOption # for forcefully removing e.g. --exit-code, a user can pass this
@@ -120,12 +137,14 @@ module Hatchet
120
137
  arg
121
138
  end.join(" ")
122
139
  heroku_command = "heroku run #{heroku_options} -- #{command}"
123
- bundle_exec do
124
- if block_given?
125
- ReplRunner.new(cmd_type, heroku_command, options).run(&block)
126
- else
127
- `#{heroku_command}`
128
- end
140
+
141
+ if block_given?
142
+ STDERR.puts "Using App#run with a block is deprecated, support for ReplRunner is being removed.\n#{caller}"
143
+ # When we deprecated this we can get rid of the "cmd_type" from the method signature
144
+ require 'repl_runner'
145
+ ReplRunner.new(cmd_type, heroku_command, options).run(&block)
146
+ else
147
+ `#{heroku_command}`
129
148
  end
130
149
  end
131
150
 
@@ -280,6 +299,7 @@ module Hatchet
280
299
  return "" if attempt == max_retries
281
300
  msg = "\nRetrying failed Attempt ##{attempt}/#{max_retries} to push for '#{name}' due to error: \n"<<
282
301
  "#{error.class} #{error.message}\n #{error.backtrace.join("\n ")}"
302
+ return msg
283
303
  end
284
304
 
285
305
  def output
@@ -287,7 +307,7 @@ module Hatchet
287
307
  end
288
308
 
289
309
  def api_key
290
- @api_key ||= ENV['HEROKU_API_KEY'] || bundle_exec {`heroku auth:token`.chomp }
310
+ @api_key ||= ENV['HEROKU_API_KEY'] || `heroku auth:token`.chomp
291
311
  end
292
312
 
293
313
  def heroku
@@ -317,12 +337,15 @@ module Hatchet
317
337
  app: self,
318
338
  pipeline: @pipeline_id,
319
339
  api_rate_limit: api_rate_limit
320
- )
340
+ )
341
+ in_directory do
342
+ call_before_deploy
321
343
 
322
- Hatchet::RETRIES.times.retry do
323
- test_run.create_test_run
344
+ Hatchet::RETRIES.times.retry do
345
+ test_run.create_test_run
346
+ end
347
+ test_run.wait!(&block)
324
348
  end
325
- test_run.wait!(&block)
326
349
  ensure
327
350
  delete_pipeline(@pipeline_id) if @pipeline_id
328
351
  @pipeline_id = nil
@@ -377,7 +400,7 @@ module Hatchet
377
400
  end
378
401
 
379
402
  private def is_git_repo?
380
- out = `git rev-parse --git-dir > /dev/null 2>&1`
403
+ `git rev-parse --git-dir > /dev/null 2>&1`
381
404
  $?.success?
382
405
  end
383
406
 
@@ -408,16 +431,6 @@ module Hatchet
408
431
 
409
432
  commit! if needs_commit?
410
433
  end
411
-
412
- private def bundle_exec
413
- if defined?(Bundler)
414
- Bundler.with_clean_env do
415
- yield
416
- end
417
- else
418
- yield
419
- end
420
- end
421
434
  end
422
435
  end
423
436
 
@@ -46,6 +46,17 @@ module Hatchet
46
46
  end
47
47
  attr_reader :app
48
48
 
49
+ def run_again(&block)
50
+ @mutex.synchronize do
51
+ @status = false
52
+ end
53
+
54
+ Hatchet::RETRIES.times.retry do
55
+ create_test_run
56
+ end
57
+ wait!(&block)
58
+ end
59
+
49
60
  def create_test_run
50
61
  @mutex.synchronize do
51
62
  raise "Test is already running" if @status
@@ -116,11 +127,11 @@ module Hatchet
116
127
  info
117
128
  case @status
118
129
  when :succeeded
119
- yield self
130
+ yield self if block_given?
120
131
  return self
121
132
  when :failed, :errored
122
133
  raise FailedTestError.new(self.app, self.output) unless app.allow_failure?
123
- yield self
134
+ yield self if block_given?
124
135
  return self
125
136
  else
126
137
  # keep looping
@@ -165,7 +176,8 @@ module Hatchet
165
176
  app_json["stack"] ||= @app.stack if @app.stack && !@app.stack.empty?
166
177
  File.open("app.json", "w") {|f| f.write(JSON.generate(app_json)) }
167
178
 
168
- `tar c . | gzip -9 > slug.tgz`
179
+ out = `tar c . | gzip -9 > slug.tgz`
180
+ raise "Tar command failed: #{out}" unless $?.success?
169
181
 
170
182
  source_put_url = @app.create_source
171
183
  Hatchet::RETRIES.times.retry do
@@ -195,7 +207,7 @@ module Hatchet
195
207
  end
196
208
 
197
209
  def raw_excon_request(options)
198
- version = options[:version] || 3
210
+ version = options.delete(:version) || 3
199
211
  options[:headers] = {
200
212
  "Authorization" => "Bearer #{@token}",
201
213
  "Accept" => "application/vnd.heroku+json; version=#{version}",
@@ -210,4 +222,4 @@ module Hatchet
210
222
  end
211
223
  end
212
224
  end
213
- end
225
+ end
@@ -1,3 +1,3 @@
1
1
  module Hatchet
2
- VERSION = "4.1.2"
2
+ VERSION = "5.0.0"
3
3
  end
@@ -71,18 +71,26 @@ class AppTest < Minitest::Test
71
71
  def test_run
72
72
  app = Hatchet::GitApp.new("default_ruby")
73
73
  app.deploy do
74
- assert_match /ls: cannot access 'foo bar #baz': No such file or directory\s+Gemfile/, app.run("ls -a Gemfile 'foo bar #baz'")
74
+ assert_match(/ls: cannot access 'foo bar #baz': No such file or directory\s+Gemfile/, app.run("ls -a Gemfile 'foo bar #baz'"))
75
75
  assert (0 != $?.exitstatus) # $? is from the app.run use of backticks
76
- sleep(3)
77
- app.run("ls erpderp", nil, { :heroku => { "exit-code" => Hatchet::App::SkipDefaultOption } } )
76
+ sleep(4) # Dynos don't exit right away and free dynos can't have more than one running at a time, wait before calling `run` again
77
+
78
+ app.run("ls erpderp", { :heroku => { "exit-code" => Hatchet::App::SkipDefaultOption } } )
78
79
  assert (0 == $?.exitstatus) # $? is from the app.run use of backticks, but we asked the CLI not to return the program exit status by skipping the default "exit-code" option
79
- sleep(3)
80
- app.run("ls erpderp", nil, { :heroku => { "no-tty" => nil } } )
80
+ sleep(4)
81
+
82
+ app.run("ls erpderp", { :heroku => { "no-tty" => nil } } )
81
83
  assert (0 != $?.exitstatus) # $? is from the app.run use of backticks
82
- sleep(3)
83
- assert_match /ohai world/, app.run('echo \$HELLO \$NAME', nil, { :heroku => { "env" => "HELLO=ohai;NAME=world" } } )
84
- sleep(3)
85
- refute_match /ohai world/, app.run('echo \$HELLO \$NAME', nil, { :heroku => { "env" => "" } } )
84
+ sleep(4)
85
+
86
+ assert_match(/ohai world/, app.run('echo \$HELLO \$NAME', { raw: true, :heroku => { "env" => "HELLO=ohai;NAME=world" } } ))
87
+ sleep(4)
88
+
89
+ refute_match(/ohai world/, app.run('echo \$HELLO \$NAME', { raw: true, :heroku => { "env" => "" } } ))
90
+ sleep(4)
91
+
92
+ random_name = SecureRandom.hex
93
+ assert_match(/#{random_name}/, app.run("mkdir foo; touch foo/#{random_name}; ls foo/"))
86
94
  end
87
95
  end
88
96
  end
@@ -0,0 +1,19 @@
1
+ require 'test_helper'
2
+
3
+ class CIFourTest < Minitest::Test
4
+ def test_error_with_bad_app
5
+ string = SecureRandom.hex
6
+ Hatchet::GitApp.new("default_ruby").run_ci do |test_run|
7
+ refute_match(string, test_run.output)
8
+ assert_match("Installing rake" , test_run.output)
9
+
10
+ run!(%Q{echo 'puts "#{string}"' >> Rakefile})
11
+ test_run.run_again
12
+
13
+ assert_match(string, test_run.output)
14
+ assert_match("Using rake" , test_run.output)
15
+
16
+ refute_match("Installing rake" , test_run.output)
17
+ end
18
+ end
19
+ end
@@ -14,13 +14,12 @@ class ConfigTest < Minitest::Test
14
14
  {
15
15
  "test/fixtures/repos/bundler/no_lockfile" => "https://github.com/sharpstone/no_lockfile.git",
16
16
  "test/fixtures/repos/default/default_ruby" => "https://github.com/sharpstone/default_ruby.git",
17
- "test/fixtures/repos/default/default_ruby" => "https://github.com/sharpstone/default_ruby.git",
18
17
  "test/fixtures/repos/rails2/rails2blog" => "https://github.com/sharpstone/rails2blog.git",
19
18
  "test/fixtures/repos/rails3/rails3_mri_193" => "https://github.com/sharpstone/rails3_mri_193.git"
20
19
  }.each do |key, value|
21
20
  assert_include(key, value, @config.dirs)
22
21
  end
23
- end
22
+ end
24
23
 
25
24
  def test_config_repos
26
25
  {
@@ -13,7 +13,7 @@ class EditRepoTest < Minitest::Test
13
13
  end
14
14
 
15
15
  Hatchet::GitApp.new("default_ruby").in_directory do |app|
16
- refute_match /foo/, `ls`
16
+ refute_match(/foo/, `ls`)
17
17
  end
18
18
  end
19
19
  end
@@ -4,8 +4,8 @@ class MultiCmdRunnerTest < Minitest::Test
4
4
  # slow but needed, there are ghosts in the machine
5
5
  # by running common command multiple times we can find them
6
6
  def test_multi_repl_commands
7
+ require 'repl_runner'
7
8
  Hatchet::GitApp.new("default_ruby").deploy do |app|
8
-
9
9
  assert_raise(ReplRunner::UnregisteredCommand) do
10
10
  app.run("ls", 2) do |ls| # will return right away, should raise error
11
11
  ls.run("cat")
data/test/test_helper.rb CHANGED
@@ -7,16 +7,11 @@ Bundler.require
7
7
  # require 'test/unit'
8
8
 
9
9
  require 'minitest/autorun'
10
- require "mocha/setup"
10
+ require "mocha/minitest"
11
11
 
12
12
  require 'minitest/retry'
13
13
  Minitest::Retry.use!
14
14
 
15
- # Not needed if you're using the most recent version
16
- if defined?(MiniTest::Unit::TestCase)
17
- Minitest::Test = MiniTest::Unit::TestCase
18
- end
19
-
20
15
  def assert_raise(*args, &block)
21
16
  assert_raises(*args, &block)
22
17
  end
@@ -25,3 +20,9 @@ end
25
20
  ENV['HATCHET_BUILDPACK_BRANCH'] = "master"
26
21
 
27
22
  require 'parallel_tests/test/runtime_logger' if ENV['RECORD_RUNTIME']
23
+
24
+ def run!(cmd)
25
+ out = `#{cmd}`
26
+ raise "Error running #{cmd}, output: #{out}" unless $?.success?
27
+ out
28
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heroku_hatchet
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.2
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Schneeman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-13 00:00:00.000000000 Z
11
+ date: 2020-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: platform-api
@@ -112,70 +112,70 @@ dependencies:
112
112
  name: minitest
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - "~>"
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
117
  version: '5.1'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - "~>"
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '5.1'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rake
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - "~>"
129
+ - - ">="
130
130
  - !ruby/object:Gem::Version
131
131
  version: '10'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - "~>"
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '10'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: mocha
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - "~>"
143
+ - - ">="
144
144
  - !ruby/object:Gem::Version
145
145
  version: '1'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - "~>"
150
+ - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '1'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: parallel_tests
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - "~>"
157
+ - - ">="
158
158
  - !ruby/object:Gem::Version
159
159
  version: '2'
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
- - - "~>"
164
+ - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '2'
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: travis
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
- - - "~>"
171
+ - - ">="
172
172
  - !ruby/object:Gem::Version
173
173
  version: '1'
174
174
  type: :development
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
- - - "~>"
178
+ - - ">="
179
179
  - !ruby/object:Gem::Version
180
180
  version: '1'
181
181
  description: Hatchet is a an integration testing library for developing Heroku buildpacks.
@@ -219,6 +219,7 @@ files:
219
219
  - test/fixtures/buildpacks/null-buildpack/readme.md
220
220
  - test/hatchet/allow_failure_git_test.rb
221
221
  - test/hatchet/app_test.rb
222
+ - test/hatchet/ci_four_test.rb
222
223
  - test/hatchet/ci_test.rb
223
224
  - test/hatchet/ci_three_test.rb
224
225
  - test/hatchet/ci_too_test.rb
@@ -265,6 +266,7 @@ test_files:
265
266
  - test/fixtures/buildpacks/null-buildpack/readme.md
266
267
  - test/hatchet/allow_failure_git_test.rb
267
268
  - test/hatchet/app_test.rb
269
+ - test/hatchet/ci_four_test.rb
268
270
  - test/hatchet/ci_test.rb
269
271
  - test/hatchet/ci_three_test.rb
270
272
  - test/hatchet/ci_too_test.rb