test-kitchen 1.24.0 → 1.25.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: 4f96d164d3286ff8f8445c248a0457012d3e633fd99cd27844cbd869409b971b
4
- data.tar.gz: dea0f61a598f25e833fe700381033a4c1b90c38c46c8177ef3518922c09eb860
3
+ metadata.gz: a6c10ada5565a14188f81198ab603201f831f7b7237def1517b92695fb851d49
4
+ data.tar.gz: 232f4a053884a07eef2edff6415cf4582d76e685464943eebfb547494dd887c6
5
5
  SHA512:
6
- metadata.gz: 26b4c8102ae775129437252c33c387d379e6099e2c7b4147a61e4c729a859fc6ee4816f38e4f157f406080ebe59c00976249df9d55854aed04819feda880a6ac
7
- data.tar.gz: 93a9e042dff74b4ef29870bb990edce9556fd559724666164c4aaa891e2b5e4cb4ea07ea0abfa66b6e5ba4fba2c0c7d64dd66e53613569abf9d7dd3ff6d45bcf
6
+ metadata.gz: 7594aa1002500ab9130b39293fdc795da406202e7438627b2f42fffc29b0d1c17f200ec79fd0c85b69a5a984a4b5062a889c9fdbd1ae685ba435e89e347d80d6
7
+ data.tar.gz: 4044d16718fa0b27425c4a0a91fc67ff50f0c77c2fab3266d8b88afaadec3259d67dfe51cb0db0f850410922d0901e081d9c9fcdc3ee5ea1094afd5a6d7fccdd
@@ -171,14 +171,14 @@ module Kitchen
171
171
  desc: <<-DESC.gsub(/^\s+/, "").tr("\n", " ")
172
172
  Run a #{action} against all matching instances concurrently. Only N
173
173
  instances will run at the same time if a number is given.
174
- DESC
174
+ DESC
175
175
  method_option :parallel,
176
176
  aliases: "-p",
177
177
  type: :boolean,
178
178
  desc: <<-DESC.gsub(/^\s+/, "").tr("\n", " ")
179
179
  [Future DEPRECATION, use --concurrency]
180
180
  Run a #{action} against all matching instances concurrently.
181
- DESC
181
+ DESC
182
182
  if action == :converge || action == :verify
183
183
  method_option :debug,
184
184
  aliases: "-D",
@@ -186,6 +186,11 @@ module Kitchen
186
186
  default: false,
187
187
  desc: "Run the #{action} with debugging enabled."
188
188
  end
189
+ method_option :fail_fast,
190
+ aliases: "-f",
191
+ type: :boolean,
192
+ desc: "Fail immediately when errors occur in concurrency mode"
193
+
189
194
  test_base_path
190
195
  log_options
191
196
  define_method(action) do |*args|
@@ -216,14 +221,14 @@ module Kitchen
216
221
  desc: <<-DESC.gsub(/^\s+/, "").tr("\n", " ")
217
222
  Run a test against all matching instances concurrently. Only N
218
223
  instances will run at the same time if a number is given.
219
- DESC
224
+ DESC
220
225
  method_option :parallel,
221
226
  aliases: "-p",
222
227
  type: :boolean,
223
228
  desc: <<-DESC.gsub(/^\s+/, "").tr("\n", " ")
224
229
  [Future DEPRECATION, use --concurrency]
225
230
  Run a test against all matching instances concurrently.
226
- DESC
231
+ DESC
227
232
  method_option :destroy,
228
233
  aliases: "-d",
229
234
  default: "passing",
@@ -300,7 +305,7 @@ module Kitchen
300
305
  "init", "Adds some configuration to your cookbook so Kitchen can rock"
301
306
  long_desc <<-D, for: "init"
302
307
  Init will add Test Kitchen support to an existing project for
303
- convergence integration testing. A default .kitchen.yml file (which is
308
+ convergence integration testing. A default kitchen.yml file (which is
304
309
  intended to be customized) is created in the project's root directory
305
310
  and one or more gems will be added to the project's Gemfile.
306
311
  D
@@ -111,10 +111,10 @@ module Kitchen
111
111
  result = begin
112
112
  @config.instances.get(regexp) ||
113
113
  @config.instances.get_all(/#{regexp}/)
114
- rescue RegexpError => e
115
- die "Invalid Ruby regular expression, " \
116
- "you may need to single quote the argument. " \
117
- "Please try again or consult http://rubular.com/ (#{e.message})"
114
+ rescue RegexpError => e
115
+ die "Invalid Ruby regular expression, " \
116
+ "you may need to single quote the argument. " \
117
+ "Please try again or consult http://rubular.com/ (#{e.message})"
118
118
  end
119
119
  result = Array(result)
120
120
 
@@ -170,6 +170,7 @@ module Kitchen
170
170
  end
171
171
  end
172
172
  end
173
+ Thread.abort_on_exception = true if options[:fail_fast]
173
174
  threads.map(&:join)
174
175
  report_errors
175
176
  end
@@ -35,7 +35,7 @@ module Kitchen
35
35
  desc: <<-D.gsub(/^\s+/, "").tr("\n", " ")
36
36
  One or more Kitchen Driver gems to be installed or added to a
37
37
  Gemfile
38
- D
38
+ D
39
39
 
40
40
  class_option :provisioner,
41
41
  type: :string,
@@ -43,7 +43,7 @@ module Kitchen
43
43
  default: "chef_solo",
44
44
  desc: <<-D.gsub(/^\s+/, "").tr("\n", " ")
45
45
  The default Kitchen Provisioner to use
46
- D
46
+ D
47
47
 
48
48
  class_option :create_gemfile,
49
49
  type: :boolean,
@@ -51,7 +51,7 @@ module Kitchen
51
51
  desc: <<-D.gsub(/^\s+/, "").tr("\n", " ")
52
52
  Whether or not to create a Gemfile if one does not exist.
53
53
  Default: false
54
- D
54
+ D
55
55
 
56
56
  # Invoke the command.
57
57
  def init
@@ -405,6 +405,7 @@ module Kitchen
405
405
  if legacy_ssh_base_driver?
406
406
  legacy_ssh_base_converge(state)
407
407
  else
408
+ provisioner.check_license
408
409
  provisioner.call(state)
409
410
  end
410
411
  end
@@ -196,6 +196,10 @@ module Kitchen
196
196
  raise UserError, "Both #{kitchen_yml} and #{dot_kitchen_yml} found. Please use the un-dotted variant: #{kitchen_yml}."
197
197
  end
198
198
 
199
+ if !File.exist?(kitchen_yml) && !File.exist?(dot_kitchen_yml)
200
+ return kitchen_yml
201
+ end
202
+
199
203
  File.exist?(kitchen_yml) ? kitchen_yml : dot_kitchen_yml
200
204
  end
201
205
 
@@ -221,11 +225,12 @@ module Kitchen
221
225
 
222
226
  undot_config = default_local_config.sub(/^\./, "")
223
227
  dot_config = ".#{undot_config}"
228
+
224
229
  if File.exist?(File.join(config_dir, undot_config)) && File.exist?(File.join(config_dir, dot_config))
225
230
  raise UserError, "Both #{undot_config} and #{dot_config} found in #{config_dir}. Please use #{default_local_config} which matches your #{config_file}."
226
231
  end
227
232
 
228
- File.join(config_dir, default_local_config)
233
+ File.exist?(File.join(config_dir, dot_config)) ? File.join(config_dir, dot_config) : File.join(config_dir, undot_config)
229
234
  end
230
235
 
231
236
  # Determines the default absolute path to the Kitchen global YAML file,
@@ -251,8 +256,8 @@ module Kitchen
251
256
 
252
257
  hash = begin
253
258
  send(component)
254
- rescue => e
255
- failure_hash(e, file)
259
+ rescue => e
260
+ failure_hash(e, file)
256
261
  end
257
262
 
258
263
  { filename: file, raw_data: hash }
@@ -347,7 +352,14 @@ module Kitchen
347
352
  def parse_yaml_string(string, file_name)
348
353
  return {} if string.nil? || string.empty?
349
354
 
350
- result = ::YAML.safe_load(string, [Symbol], [], true) || {}
355
+ result =
356
+ if Gem::Requirement.new(">= 3.1.0").satisfied_by?(Gem::Version.new(Psych::VERSION))
357
+ # ruby >= 2.6.0
358
+ ::YAML.safe_load(string, permitted_classes: [Symbol], permitted_symbols: [], aliases: true) || {}
359
+ else
360
+ # ruby < 2.6.0
361
+ ::YAML.safe_load(string, [Symbol], [], true) || {}
362
+ end
351
363
  unless result.is_a?(Hash)
352
364
  raise UserError, "Error parsing #{file_name} as YAML " \
353
365
  "(Result of parse was not a Hash, but was a #{result.class}).\n" \
@@ -105,6 +105,12 @@ module Kitchen
105
105
  false
106
106
  end
107
107
 
108
+ # Certain products that Test Kitchen uses to provision require accepting
109
+ # a license to use. Overwrite this method in the specific provisioner
110
+ # to implement this check.
111
+ def check_license
112
+ end
113
+
108
114
  # Generates a command string which will install and configure the
109
115
  # provisioner software on an instance. If no work is required, then `nil`
110
116
  # will be returned.
@@ -89,14 +89,15 @@ module Kitchen
89
89
  # @api private
90
90
  def policyfile
91
91
  basename = config[:policyfile_path] || config[:policyfile] || "Policyfile.rb"
92
- File.join(config[:kitchen_root], basename)
92
+ File.expand_path(basename, config[:kitchen_root])
93
93
  end
94
94
 
95
95
  # @return [String] an absolute path to a Berksfile, relative to the
96
96
  # kitchen root
97
97
  # @api private
98
98
  def berksfile
99
- File.join(config[:kitchen_root], "Berksfile")
99
+ basename = config[:berksfile_path] || "Berksfile"
100
+ File.expand_path(basename, config[:kitchen_root])
100
101
  end
101
102
 
102
103
  # @return [String] an absolute path to a Cheffile, relative to the
@@ -179,8 +180,8 @@ module Kitchen
179
180
  #
180
181
  # @api private
181
182
  def make_fake_cookbook
182
- info("Berksfile, Cheffile, cookbooks/, or metadata.rb not found " \
183
- "so Chef will run with effectively no cookbooks. Is this intended?")
183
+ info("Policyfile, Berksfile, Cheffile, cookbooks/, or metadata.rb not found " \
184
+ "so Chef Infra Client will run, but do nothing. Is this intended?")
184
185
  name = File.basename(config[:kitchen_root])
185
186
  fake_cb = File.join(tmpbooks_dir, name)
186
187
  FileUtils.mkdir_p(fake_cb)
@@ -292,7 +293,7 @@ module Kitchen
292
293
 
293
294
  def update_dna_for_policyfile
294
295
  if !config[:run_list].nil? && !config[:run_list].empty?
295
- warn("You must set your run_list in your policyfile instead of "\
296
+ warn("You must set your run_list in your Policyfile instead of "\
296
297
  "kitchen config. The run_list in your config will be ignored.")
297
298
  warn("Ignored run_list: #{config[:run_list].inspect}")
298
299
  end
@@ -87,7 +87,7 @@ module Kitchen
87
87
 
88
88
  private
89
89
 
90
- # @return [String] path to a Berksfile
90
+ # @return [String] path to a Policyfile
91
91
  # @api private
92
92
  attr_reader :policyfile
93
93
 
@@ -139,8 +139,8 @@ module Kitchen
139
139
  File.exist?(File.join(p, "chef"))
140
140
  end
141
141
  logger.fatal("The `chef` executable cannot be found in your " \
142
- "PATH. Ensure you have installed ChefDK from " \
143
- "https://downloads.chef.io and that your PATH " \
142
+ "PATH. Ensure you have installed ChefDK or Chef Workstation " \
143
+ "from https://downloads.chef.io and that your PATH " \
144
144
  "setting includes the path to the `chef` comand.")
145
145
  raise UserError,
146
146
  "Could not find the chef executable in your PATH."
@@ -107,6 +107,7 @@ module Kitchen
107
107
  "--no-color",
108
108
  ]
109
109
  args << "--logfile #{config[:log_file]}" if config[:log_file]
110
+ args << "--chef-license #{config[:chef_license]}" if config[:chef_license]
110
111
 
111
112
  lines << wrap_shell_code(
112
113
  [cmd, *args].join(" ")
@@ -28,6 +28,7 @@ require "kitchen/provisioner/chef/librarian"
28
28
  require "kitchen/util"
29
29
  require "mixlib/install"
30
30
  require "mixlib/install/script_generator"
31
+ require "license_acceptance/acceptor"
31
32
 
32
33
  begin
33
34
  require "chef-config/config"
@@ -45,6 +46,7 @@ module Kitchen
45
46
  default_config :require_chef_omnibus, true
46
47
  default_config :chef_omnibus_url, "https://omnitruck.chef.io/install.sh"
47
48
  default_config :chef_omnibus_install_options, nil
49
+ default_config :chef_license, nil
48
50
  default_config :run_list, []
49
51
  default_config :attributes, {}
50
52
  default_config :config_path, nil
@@ -58,6 +60,9 @@ module Kitchen
58
60
  # Will try to autodetect by searching for `Policyfile.rb` if not set.
59
61
  # If set, will error if the file doesn't exist.
60
62
  default_config :policyfile_path, nil
63
+ # Will try to autodetect by searching for `Berksfile` if not set.
64
+ # If set, will error if the file doesn't exist.
65
+ default_config :berksfile_path, nil
61
66
  # If set to true (which is the default from `chef generate`), try to update
62
67
  # backend cookbook downloader on every kitchen run.
63
68
  default_config :always_update_cookbooks, false
@@ -244,6 +249,43 @@ module Kitchen
244
249
  end
245
250
  end
246
251
 
252
+ # gives us the product version from either require_chef_omnibus or product_version
253
+ # If the non-default (true) value of require_chef_omnibus is present use that
254
+ # otherwise use config[:product_version] which defaults to :latest and is the actual
255
+ # default for chef provisioners
256
+ #
257
+ # @return [String,Symbol,NilClass] version or nil if not applicable
258
+ def product_version
259
+ case config[:require_chef_omnibus]
260
+ when FalseClass
261
+ nil
262
+ when TrueClass
263
+ config[:product_version]
264
+ else
265
+ config[:require_chef_omnibus]
266
+ end
267
+ end
268
+
269
+ # (see Base#check_license)
270
+ def check_license
271
+ name = config[:product_name] || "chef"
272
+ version = product_version
273
+ debug("Checking if we need to prompt for license acceptance on product: #{name} version: #{version}.")
274
+
275
+ acceptor = LicenseAcceptance::Acceptor.new(logger: Kitchen.logger, provided: config[:chef_license])
276
+ if acceptor.license_required?(name, version)
277
+ debug("License acceptance required for #{name} version: #{version}. Prompting")
278
+ license_id = acceptor.id_from_mixlib(name)
279
+ begin
280
+ acceptor.check_and_persist(license_id, version.to_s)
281
+ rescue LicenseAcceptance::LicenseNotAcceptedError => e
282
+ error("Cannot converge without accepting the #{e.product.pretty_name} License. Set it in your kitchen.yml or using the CHEF_LICENSE environment variable")
283
+ raise
284
+ end
285
+ config[:chef_license] ||= acceptor.acceptance_value
286
+ end
287
+ end
288
+
247
289
  # (see Base#create_sandbox)
248
290
  def create_sandbox
249
291
  super
@@ -316,14 +358,15 @@ module Kitchen
316
358
  # @api private
317
359
  def policyfile
318
360
  policyfile_basename = config[:policyfile_path] || config[:policyfile] || "Policyfile.rb"
319
- File.join(config[:kitchen_root], policyfile_basename)
361
+ File.expand_path(policyfile_basename, config[:kitchen_root])
320
362
  end
321
363
 
322
364
  # @return [String] an absolute path to a Berksfile, relative to the
323
365
  # kitchen root
324
366
  # @api private
325
367
  def berksfile
326
- File.join(config[:kitchen_root], "Berksfile")
368
+ berksfile_basename = config[:berksfile_path] || config[:berksfile] || "Berksfile"
369
+ File.expand_path(berksfile_basename, config[:kitchen_root])
327
370
  end
328
371
 
329
372
  # @return [String] an absolute path to a Cheffile, relative to the
@@ -341,7 +384,7 @@ module Kitchen
341
384
  def default_config_rb # rubocop:disable Metrics/MethodLength
342
385
  root = config[:root_path].gsub("$env:TEMP", "\#{ENV['TEMP']\}")
343
386
 
344
- {
387
+ config_rb = {
345
388
  node_name: instance.name,
346
389
  checksum_path: remote_path_join(root, "checksums"),
347
390
  file_cache_path: remote_path_join(root, "cache"),
@@ -364,6 +407,8 @@ module Kitchen
364
407
  ),
365
408
  treat_deprecation_warnings_as_errors: config[:deprecations_as_errors],
366
409
  }
410
+ config_rb[:chef_license] = config[:chef_license] unless config[:chef_license].nil?
411
+ config_rb
367
412
  end
368
413
 
369
414
  # Generates a rendered client.rb/solo.rb/knife.rb formatted file as a
@@ -427,10 +472,10 @@ module Kitchen
427
472
  def load_needed_dependencies!
428
473
  super
429
474
  if File.exist?(policyfile)
430
- debug("Policyfile found at #{policyfile}, using Policyfile to resolve dependencies")
475
+ debug("Policyfile found at #{policyfile}, using Policyfile to resolve cookbook dependencies")
431
476
  Chef::Policyfile.load!(logger: logger)
432
477
  elsif File.exist?(berksfile)
433
- debug("Berksfile found at #{berksfile}, loading Berkshelf")
478
+ debug("Berksfile found at #{berksfile}, using Berkshelf to resolve cookbook dependencies")
434
479
  Chef::Berkshelf.load!(logger: logger)
435
480
  elsif File.exist?(cheffile)
436
481
  debug("Cheffile found at #{cheffile}, loading Librarian-Chef")
@@ -537,13 +582,18 @@ module Kitchen
537
582
  if (config[:policyfile_path] || config[:policyfile]) && !File.exist?(policyfile)
538
583
  raise UserError, "policyfile_path set in config "\
539
584
  "(#{config[:policyfile_path]} could not be found. " \
540
- "Expected to find it at full path #{policyfile} " \
585
+ "Expected to find it at full path #{policyfile}."
586
+ end
587
+ if config[:berksfile_path] && !File.exist?(berksfile)
588
+ raise UserError, "berksfile_path set in config "\
589
+ "(#{config[:berksfile_path]} could not be found. " \
590
+ "Expected to find it at full path #{berksfile}."
541
591
  end
542
592
  if File.exist?(policyfile) && !supports_policyfile?
543
593
  raise UserError, "policyfile detected, but provisioner " \
544
- "#{self.class.name} doesn't support policyfiles. " \
594
+ "#{self.class.name} doesn't support Policyfiles. " \
545
595
  "Either use a different provisioner, or delete/rename " \
546
- "#{policyfile}"
596
+ "#{policyfile}."
547
597
  end
548
598
  end
549
599
 
@@ -88,7 +88,6 @@ module Kitchen
88
88
  args << "--logfile #{config[:log_file]}" if config[:log_file]
89
89
  args << "--profile-ruby" if config[:profile_ruby]
90
90
  args << "--legacy-mode" if config[:legacy_mode]
91
-
92
91
  args
93
92
  end
94
93
  end
@@ -69,7 +69,7 @@ module Kitchen
69
69
  if (-Not (Test-Path "#{root}")) {
70
70
  New-Item "#{root}" -ItemType directory | Out-Null
71
71
  }
72
- POWERSHELL
72
+ POWERSHELL
73
73
  else
74
74
  "#{sudo('rm')} -rf #{data} ; mkdir -p #{root}"
75
75
  end
@@ -232,7 +232,7 @@ module Kitchen
232
232
  Errno::EACCES, Errno::EALREADY, Errno::EADDRINUSE, Errno::ECONNREFUSED, Errno::ETIMEDOUT,
233
233
  Errno::ECONNRESET, Errno::ENETUNREACH, Errno::EHOSTUNREACH, Errno::EPIPE,
234
234
  Net::SSH::Disconnect, Net::SSH::AuthenticationFailed, Net::SSH::ConnectionTimeout,
235
- Timeout::Error
235
+ Net::SSH::Proxy::ConnectError, Timeout::Error
236
236
  ].freeze
237
237
 
238
238
  # @return [Integer] cap on number of parallel ssh sessions we can use
@@ -182,7 +182,7 @@ module Kitchen
182
182
  # to be under /tmp/verifier
183
183
  args = gem
184
184
  args += " --version #{version}" if version
185
- args += " --no-rdoc --no-ri --no-format-executable -n #{gem_bin}"
185
+ args += " --no-document --no-format-executable -n #{gem_bin}"
186
186
  args += " --no-user-install"
187
187
  args
188
188
  end
@@ -17,5 +17,5 @@
17
17
  # limitations under the License.
18
18
 
19
19
  module Kitchen
20
- VERSION = "1.24.0".freeze
20
+ VERSION = "1.25.0".freeze
21
21
  end
@@ -18,9 +18,9 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_dependency 'test-kitchen', '~> 1.0.0.alpha.3'
21
+ spec.add_dependency 'test-kitchen', '~> 1.0.0'
22
22
 
23
- spec.add_development_dependency 'bundler', '~> 1.3'
23
+ spec.add_development_dependency 'bundler'
24
24
  spec.add_development_dependency 'rake'
25
25
 
26
26
  spec.add_development_dependency 'cane'
@@ -1,9 +1,9 @@
1
1
  language: ruby
2
2
 
3
3
  rvm:
4
- - 2.0.0
5
- - 1.9.3
6
- - 1.9.2
4
+ - 2.4
5
+ - 2.5
6
+ - 2.6
7
7
  - ruby-head
8
8
 
9
9
  matrix:
@@ -6,7 +6,7 @@ provisioner:
6
6
  name: <%= config[:provisioner] %>
7
7
 
8
8
  platforms:
9
- - name: ubuntu-16.04
9
+ - name: ubuntu-18.04
10
10
  - name: centos-7
11
11
 
12
12
  suites:
@@ -24,17 +24,20 @@ Gem::Specification.new do |gem|
24
24
  gem.required_ruby_version = ">= 2.3"
25
25
 
26
26
  gem.add_dependency "mixlib-shellout", ">= 1.2", "< 3.0"
27
- gem.add_dependency "net-scp", "~> 1.1"
27
+ gem.add_dependency "net-scp", ">= 1.1", "< 3.0" # pinning until we can confirm 3+ works
28
28
  gem.add_dependency "net-ssh", ">= 2.9", "< 5.0"
29
- gem.add_dependency "net-ssh-gateway", "~> 1.2"
29
+ gem.add_dependency "net-ssh-gateway", ">= 1.2", "< 3.0" # pinning until we can confirm 3+ works
30
30
  gem.add_dependency "thor", "~> 0.19"
31
31
  gem.add_dependency "mixlib-install", "~> 3.6"
32
32
  gem.add_dependency "winrm", "~> 2.0"
33
33
  gem.add_dependency "winrm-elevated", "~> 1.0"
34
34
  gem.add_dependency "winrm-fs", "~> 1.1"
35
35
 
36
- gem.add_development_dependency "rb-readline"
36
+ # Required to run the Chef provisioner local license check for remote systems
37
+ # TK is not under Chef EULA
38
+ gem.add_dependency "license-acceptance", "~> 1.0", ">= 1.0.11"
37
39
 
40
+ gem.add_development_dependency "rb-readline"
38
41
  gem.add_development_dependency "bundler"
39
42
  gem.add_development_dependency "rake"
40
43
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: test-kitchen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.24.0
4
+ version: 1.25.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fletcher Nichol
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-26 00:00:00.000000000 Z
11
+ date: 2019-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mixlib-shellout
@@ -34,16 +34,22 @@ dependencies:
34
34
  name: net-scp
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - "~>"
37
+ - - ">="
38
38
  - !ruby/object:Gem::Version
39
39
  version: '1.1'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '3.0'
40
43
  type: :runtime
41
44
  prerelease: false
42
45
  version_requirements: !ruby/object:Gem::Requirement
43
46
  requirements:
44
- - - "~>"
47
+ - - ">="
45
48
  - !ruby/object:Gem::Version
46
49
  version: '1.1'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '3.0'
47
53
  - !ruby/object:Gem::Dependency
48
54
  name: net-ssh
49
55
  requirement: !ruby/object:Gem::Requirement
@@ -68,16 +74,22 @@ dependencies:
68
74
  name: net-ssh-gateway
69
75
  requirement: !ruby/object:Gem::Requirement
70
76
  requirements:
71
- - - "~>"
77
+ - - ">="
72
78
  - !ruby/object:Gem::Version
73
79
  version: '1.2'
80
+ - - "<"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
74
83
  type: :runtime
75
84
  prerelease: false
76
85
  version_requirements: !ruby/object:Gem::Requirement
77
86
  requirements:
78
- - - "~>"
87
+ - - ">="
79
88
  - !ruby/object:Gem::Version
80
89
  version: '1.2'
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: '3.0'
81
93
  - !ruby/object:Gem::Dependency
82
94
  name: thor
83
95
  requirement: !ruby/object:Gem::Requirement
@@ -148,6 +160,26 @@ dependencies:
148
160
  - - "~>"
149
161
  - !ruby/object:Gem::Version
150
162
  version: '1.1'
163
+ - !ruby/object:Gem::Dependency
164
+ name: license-acceptance
165
+ requirement: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - "~>"
168
+ - !ruby/object:Gem::Version
169
+ version: '1.0'
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: 1.0.11
173
+ type: :runtime
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '1.0'
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ version: 1.0.11
151
183
  - !ruby/object:Gem::Dependency
152
184
  name: rb-readline
153
185
  requirement: !ruby/object:Gem::Requirement
@@ -425,8 +457,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
425
457
  - !ruby/object:Gem::Version
426
458
  version: '0'
427
459
  requirements: []
428
- rubyforge_project:
429
- rubygems_version: 2.7.7
460
+ rubygems_version: 3.0.3
430
461
  signing_key:
431
462
  specification_version: 4
432
463
  summary: Test Kitchen is an integration tool for developing and testing infrastructure