heroku_hatchet 4.1.2 → 5.0.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.
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