cheffish 16.0.6 → 17.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: c9942d4df141be9174914e00fec17d021ed3531e7bca901a8dcdeb581326ee00
4
- data.tar.gz: 160fee2c6189559aff41eaa0ad32741996cba3ddd29cb69318da36627d00756a
3
+ metadata.gz: 6a022a0802ceebdb2656147e6ada5348b95a0d6df170317ce7407d049502c741
4
+ data.tar.gz: ea8e169d0521142100ab4224be43a870c375f3c32a25f509ff0de15b7343384c
5
5
  SHA512:
6
- metadata.gz: '08babeb42e2eea142a10a25b1ece32ebb9412de0d623ac5629d7b9173db99640c88a2b511c9ff30994d3784efb809c94b04ae954149332cd6c2c7798e7d44024'
7
- data.tar.gz: cd0400c6de976a6aaf9b64eea00d2f5114edd53c69474192b89e514e3c0bedb40b02a2bd8ba564ff3047da8002b20c3bc260ae6f115159b8b808dc5a1d2bcf92
6
+ metadata.gz: f2ade13896c429b961aa71d2ff1c721102e7d896d7ba7d157b13a312dc9c3268de544e4d2883cccd48f5d68e09c915ce34217eff02b9fde2be73fb2bc597aef2
7
+ data.tar.gz: b6b89cfdc3d836c83330619ec878e503de1226591779728229fbff51b6cff6bb9cd4624796eba695ff51e8e326e97c90ffc913e1b0d39ed7b01f16535ef5c217
data/Gemfile CHANGED
@@ -3,19 +3,23 @@ source "https://rubygems.org"
3
3
  gemspec
4
4
 
5
5
  group :development do
6
- gem "chefstyle", "1.2.0"
6
+ gem "chefstyle", "1.7.5"
7
7
  gem "rake"
8
8
  gem "rspec", "~> 3.0"
9
9
  end
10
10
 
11
+
11
12
  # Allow Travis to run tests with different dependency versions
12
13
  if ENV["GEMFILE_MOD"]
13
14
  puts ENV["GEMFILE_MOD"]
14
15
  instance_eval(ENV["GEMFILE_MOD"])
15
16
  else
16
17
  group :development do
17
- gem "chef", "~> 16"
18
- gem "ohai", "~> 16"
18
+ # temporarily we only support building against master
19
+ gem "chef", github: "chef/chef", branch: "master"
20
+ gem "ohai", github: "chef/ohai", branch: "master"
21
+ # gem "chef", "~> 16"
22
+ # gem "ohai", "~> 16"
19
23
  end
20
24
  end
21
25
 
data/Rakefile CHANGED
@@ -39,4 +39,4 @@ task :console do
39
39
  IRB.start
40
40
  end
41
41
 
42
- task default: %i{style spec}
42
+ task default: %i{spec style}
data/cheffish.gemspec CHANGED
@@ -12,9 +12,10 @@ Gem::Specification.new do |s|
12
12
  s.email = "oss@chef.io"
13
13
  s.homepage = "https://github.com/chef/cheffish"
14
14
 
15
- s.required_ruby_version = ">= 2.6.0"
15
+ s.required_ruby_version = ">= 2.7.0"
16
16
 
17
17
  s.add_dependency "chef-zero", ">= 14.0"
18
+ s.add_dependency "chef-utils", ">= 17.0"
18
19
  s.add_dependency "net-ssh"
19
20
 
20
21
  s.bindir = "bin"
@@ -1,8 +1,10 @@
1
1
  require_relative "../../cheffish"
2
2
  require_relative "../../cheffish/base_resource"
3
3
  require "chef/chef_fs/data_handler/acl_data_handler"
4
- require "chef/chef_fs/parallelizer"
5
- require "uri"
4
+ require "chef-utils/parallel_map" unless defined?(ChefUtils::ParallelMap)
5
+ require "uri" unless defined?(URI)
6
+
7
+ using ChefUtils::ParallelMap
6
8
 
7
9
  class Chef
8
10
  class Resource
@@ -126,13 +128,13 @@ class Chef
126
128
  # the ACL has changed.
127
129
  if new_resource.recursive == true || (new_resource.recursive == :on_change && (!acl || changed))
128
130
  children, _error = list(path, "*")
129
- Chef::ChefFS::Parallelizer.parallel_do(children) do |child|
131
+ children.parallel_each do |child|
130
132
  next if child.split("/")[-1] == "containers"
131
133
 
132
134
  create_acl(child)
133
135
  end
134
136
  # containers mess up our descent, so we do them last
135
- Chef::ChefFS::Parallelizer.parallel_do(children) do |child|
137
+ children.parallel_each do |child|
136
138
  next if child.split("/")[-1] != "containers"
137
139
 
138
140
  create_acl(child)
@@ -301,7 +303,7 @@ class Chef
301
303
  #
302
304
  # Result: /*/foo = [ '/organizations/foo', '/users/foo' ]
303
305
  #
304
- matches = Chef::ChefFS::Parallelizer.parallelize(matches) do |pth|
306
+ matches = matches.parallel_map do |pth|
305
307
  found, error = list(pth, part)
306
308
  if error
307
309
  if parts[0..index - 1].all? { |p| p != "*" }
@@ -312,7 +314,7 @@ class Chef
312
314
  else
313
315
  found
314
316
  end
315
- end.flatten(1).to_a
317
+ end.flatten.to_a
316
318
  end
317
319
 
318
320
  matches
@@ -196,17 +196,15 @@ class Chef
196
196
  end
197
197
 
198
198
  def new_secret
199
- @new_secret ||= begin
200
- if new_resource.secret
201
- new_resource.secret
202
- elsif new_resource.secret_path
203
- Chef::EncryptedDataBagItem.load_secret(new_resource.secret_path)
204
- elsif new_resource.encrypt.nil?
205
- current_resource.secret
206
- else
207
- raise "Data bag item #{new_resource.name} has encryption on but no secret or secret_path is specified"
208
- end
209
- end
199
+ @new_secret ||= if new_resource.secret
200
+ new_resource.secret
201
+ elsif new_resource.secret_path
202
+ Chef::EncryptedDataBagItem.load_secret(new_resource.secret_path)
203
+ elsif new_resource.encrypt.nil?
204
+ current_resource.secret
205
+ else
206
+ raise "Data bag item #{new_resource.name} has encryption on but no secret or secret_path is specified"
207
+ end
210
208
  end
211
209
 
212
210
  def decrypt(json, secret)
@@ -238,15 +236,13 @@ class Chef
238
236
 
239
237
  # Get the current json decrypted, for comparison purposes
240
238
  def current_decrypted
241
- @current_decrypted ||= begin
242
- if current_resource.secret
243
- decrypt(current_resource.raw_data || { "id" => new_resource.id }, current_resource.secret)
244
- elsif current_resource.encrypt
245
- raise "Could not decrypt current data bag item #{current_resource.name}"
246
- else
247
- current_resource.raw_data || { "id" => new_resource.id }
248
- end
249
- end
239
+ @current_decrypted ||= if current_resource.secret
240
+ decrypt(current_resource.raw_data || { "id" => new_resource.id }, current_resource.secret)
241
+ elsif current_resource.encrypt
242
+ raise "Could not decrypt current data bag item #{current_resource.name}"
243
+ else
244
+ current_resource.raw_data || { "id" => new_resource.id }
245
+ end
250
246
  end
251
247
 
252
248
  # Figure out the differences between new and current
@@ -2,9 +2,11 @@ require_relative "../../cheffish"
2
2
  require_relative "../../cheffish/base_resource"
3
3
  require "chef/chef_fs/file_pattern"
4
4
  require "chef/chef_fs/file_system"
5
- require "chef/chef_fs/parallelizer"
6
5
  require "chef/chef_fs/file_system/chef_server/chef_server_root_dir"
7
6
  require "chef/chef_fs/file_system/repository/chef_repository_file_system_root_dir"
7
+ require "chef-utils/parallel_map" unless defined?(ChefUtils::ParallelMap)
8
+
9
+ using ChefUtils::ParallelMap
8
10
 
9
11
  class Chef
10
12
  class Resource
@@ -97,7 +99,7 @@ class Chef
97
99
  end
98
100
 
99
101
  # Honor concurrency
100
- Chef::ChefFS::Parallelizer.threads = new_resource.concurrency - 1
102
+ ChefUtils::DefaultThreadPool.instance.threads = new_resource.concurrency - 1
101
103
 
102
104
  # We don't let the user pass absolute paths; we want to reserve those for
103
105
  # multi-org support (/organizations/foo).
@@ -1,6 +1,6 @@
1
1
  require "openssl/cipher"
2
2
  require_relative "../../cheffish/base_resource"
3
- require "openssl"
3
+ require "openssl" unless defined?(OpenSSL)
4
4
  require_relative "../../cheffish/key_formatter"
5
5
 
6
6
  class Chef
@@ -78,7 +78,7 @@ class Chef
78
78
  desired_output = encode_private_key(new_source_key)
79
79
  if current_resource.path == :none || desired_output != IO.read(new_path)
80
80
  converge_by "reformat key at #{new_resource.source_key_path} to #{new_resource.format} private key #{new_path} (#{new_resource.pass_phrase ? ", #{new_resource.cipher} password" : ""})" do
81
- IO.write(new_path, desired_output)
81
+ IO.binwrite(new_path, desired_output)
82
82
  end
83
83
  end
84
84
 
@@ -137,7 +137,7 @@ class Chef
137
137
  converge_by "change format of #{new_resource.type} private key #{new_path} from #{current_resource.format} to #{new_resource.format}" do
138
138
  write_private_key(current_private_key)
139
139
  end
140
- elsif (@current_file_mode & 0077) != 0
140
+ elsif RUBY_PLATFORM !~ /mswin|mingw32|windows/ && (@current_file_mode & 0077) != 0
141
141
  new_mode = @current_file_mode & 07700
142
142
  converge_by "change mode of private key #{new_path} to #{new_mode.to_s(8)}" do
143
143
  ::File.chmod(new_mode, new_path)
@@ -171,25 +171,23 @@ class Chef
171
171
  end
172
172
 
173
173
  def write_private_key(key)
174
- ::File.open(new_path, "w") do |file|
174
+ ::File.open(new_path, "wb") do |file|
175
175
  file.chmod(0600)
176
176
  file.write(encode_private_key(key))
177
177
  end
178
178
  end
179
179
 
180
180
  def new_source_key
181
- @new_source_key ||= begin
182
- if new_resource.source_key.is_a?(String)
183
- source_key, _source_key_format = Cheffish::KeyFormatter.decode(new_resource.source_key, new_resource.source_key_pass_phrase)
184
- source_key
185
- elsif new_resource.source_key
186
- new_resource.source_key
187
- elsif new_resource.source_key_path
188
- source_key, _source_key_format = Cheffish::KeyFormatter.decode(IO.read(new_resource.source_key_path), new_resource.source_key_pass_phrase, new_resource.source_key_path)
189
- source_key
190
- else
191
- nil
192
- end
181
+ @new_source_key ||= if new_resource.source_key.is_a?(String)
182
+ source_key, _source_key_format = Cheffish::KeyFormatter.decode(new_resource.source_key, new_resource.source_key_pass_phrase)
183
+ source_key
184
+ elsif new_resource.source_key
185
+ new_resource.source_key
186
+ elsif new_resource.source_key_path
187
+ source_key, _source_key_format = Cheffish::KeyFormatter.decode(IO.read(new_resource.source_key_path), new_resource.source_key_pass_phrase, new_resource.source_key_path)
188
+ source_key
189
+ else
190
+ nil
193
191
  end
194
192
  end
195
193
 
@@ -1,6 +1,6 @@
1
1
  require "openssl/cipher"
2
2
  require_relative "../../cheffish/base_resource"
3
- require "openssl"
3
+ require "openssl" unless defined?(OpenSSL)
4
4
  require_relative "../../cheffish/key_formatter"
5
5
 
6
6
  class Chef
@@ -31,7 +31,7 @@ class Chef
31
31
  desired_output = encode_public_key(new_source_key)
32
32
  if Array(current_resource.action) == [ :delete ] || desired_output != IO.read(new_resource.path)
33
33
  converge_by "write #{new_resource.format} public key #{new_resource.path} from #{new_source_key_publicity} key #{new_resource.source_key_path}" do
34
- IO.write(new_resource.path, desired_output)
34
+ IO.binwrite(new_resource.path, desired_output)
35
35
  # TODO permissions on file?
36
36
  end
37
37
  end
@@ -62,7 +62,7 @@ class Chef
62
62
  elsif new_resource.source_key
63
63
  source_key = new_resource.source_key
64
64
  elsif new_resource.source_key_path
65
- source_key, _source_key_format = Cheffish::KeyFormatter.decode(IO.read(new_resource.source_key_path), new_resource.source_key_pass_phrase, new_resource.source_key_path)
65
+ source_key, _source_key_format = Cheffish::KeyFormatter.decode(IO.binread(new_resource.source_key_path), new_resource.source_key_pass_phrase, new_resource.source_key_path)
66
66
  else
67
67
  return nil
68
68
  end
data/lib/cheffish.rb CHANGED
@@ -32,11 +32,13 @@ module Cheffish
32
32
  end
33
33
 
34
34
  def self.load_chef_config(chef_config = Chef::Config)
35
- if ::Gem::Version.new(::Chef::VERSION) >= ::Gem::Version.new("12.0.0")
36
- chef_config.config_file = ::Chef::Knife.chef_config_dir
37
- else
38
- chef_config.config_file = ::Chef::Knife.locate_config_file
39
- end
35
+ chef_config.config_file = if ::Gem::Version.new(::Chef::VERSION) >= ::Gem::Version.new("12.0.0")
36
+ require "chef/workstation_config_loader"
37
+ Chef::WorkstationConfigLoader.new(nil, Chef::Log).chef_config_dir
38
+ else
39
+ require "chef/knife"
40
+ Chef::Knife.locate_config_file
41
+ end
40
42
  config_fetcher = Chef::ConfigFetcher.new(chef_config.config_file, chef_config.config_file_jail)
41
43
  if chef_config.config_file.nil?
42
44
  Chef::Log.warn("No config file found or specified on command line, using command line options.")
@@ -120,11 +122,17 @@ module Cheffish
120
122
  end
121
123
 
122
124
  # Include all recipe objects so require 'cheffish' brings in the whole recipe DSL
123
-
124
125
  require "chef/run_list/run_list_item"
125
126
  require_relative "cheffish/basic_chef_client"
126
127
  require_relative "cheffish/server_api"
127
- require "chef/knife"
128
+
129
+ # Starting with the version below, knife is no longer in the chef gem and is
130
+ # not available during a chef-client run. We'll keep it here for older versions
131
+ # to retain backward-compatibility.
132
+ if ::Gem::Version.new(::Chef::VERSION) < ::Gem::Version.new("17.0.178")
133
+ require "chef/knife"
134
+ end
135
+
128
136
  require "chef/config_fetcher"
129
137
  require "chef/log"
130
138
  require "chef/application"
@@ -5,7 +5,7 @@ require "chef/event_dispatch/dispatcher"
5
5
  require "chef/node"
6
6
  require "chef/run_context"
7
7
  require "chef/runner"
8
- require "forwardable"
8
+ require "forwardable" unless defined?(Forwardable)
9
9
  require "chef/providers"
10
10
  require "chef/resources"
11
11
 
@@ -74,38 +74,36 @@ module Cheffish
74
74
  end
75
75
 
76
76
  def new_public_key
77
- @new_public_key ||= begin
78
- if new_resource.source_key
79
- if new_resource.source_key.is_a?(String)
80
- key, _key_format = Cheffish::KeyFormatter.decode(new_resource.source_key)
77
+ @new_public_key ||= if new_resource.source_key
78
+ if new_resource.source_key.is_a?(String)
79
+ key, _key_format = Cheffish::KeyFormatter.decode(new_resource.source_key)
81
80
 
82
- if key.private?
83
- key.public_key
84
- else
85
- key
86
- end
87
- elsif new_resource.source_key.private?
88
- new_resource.source_key.public_key
89
- else
90
- new_resource.source_key
91
- end
92
- elsif new_resource.source_key_path
93
- source_key_path = new_resource.source_key_path
94
- if Pathname.new(source_key_path).relative?
95
- source_key_str, source_key_path = Cheffish.get_private_key_with_path(source_key_path, run_context.config)
96
- else
97
- source_key_str = IO.read(source_key_path)
98
- end
99
- source_key, _source_key_format = Cheffish::KeyFormatter.decode(source_key_str, new_resource.source_key_pass_phrase, source_key_path)
100
- if source_key.private?
101
- source_key.public_key
102
- else
103
- source_key
104
- end
105
- else
106
- nil
107
- end
108
- end
81
+ if key.private?
82
+ key.public_key
83
+ else
84
+ key
85
+ end
86
+ elsif new_resource.source_key.private?
87
+ new_resource.source_key.public_key
88
+ else
89
+ new_resource.source_key
90
+ end
91
+ elsif new_resource.source_key_path
92
+ source_key_path = new_resource.source_key_path
93
+ if Pathname.new(source_key_path).relative?
94
+ source_key_str, source_key_path = Cheffish.get_private_key_with_path(source_key_path, run_context.config)
95
+ else
96
+ source_key_str = IO.read(source_key_path)
97
+ end
98
+ source_key, _source_key_format = Cheffish::KeyFormatter.decode(source_key_str, new_resource.source_key_pass_phrase, source_key_path)
99
+ if source_key.private?
100
+ source_key.public_key
101
+ else
102
+ source_key
103
+ end
104
+ else
105
+ nil
106
+ end
109
107
  end
110
108
 
111
109
  def augment_new_json(json)
@@ -41,7 +41,7 @@ module Cheffish
41
41
  chef_config[:log_location] = StringIOTee.new(chef_config[:log_location])
42
42
  @client = ::Cheffish::BasicChefClient.new(nil,
43
43
  [ event_sink, Chef::Formatters.new(:doc, chef_config[:stdout], chef_config[:stderr]) ],
44
- chef_config)
44
+ **chef_config)
45
45
  end
46
46
  end
47
47
 
@@ -1,9 +1,9 @@
1
- require "openssl"
2
- require "net/ssh"
3
- require "etc"
4
- require "socket"
5
- require "digest/md5"
6
- require "base64"
1
+ require "openssl" unless defined?(OpenSSL)
2
+ require "net/ssh" unless defined?(Net::SSH)
3
+ require "etc" unless defined?(Etc)
4
+ require "socket" unless defined?(Socket)
5
+ require "digest/md5" unless defined?(Digest::MD5)
6
+ require "base64" unless defined?(Base64)
7
7
 
8
8
  module Cheffish
9
9
  class KeyFormatter
@@ -62,13 +62,11 @@ class Chef
62
62
  string_key = "#{type}_path"
63
63
  symbol_key = "#{type}_path".to_sym
64
64
 
65
- options[symbol_key] ||= begin
66
- if options[:chef_repo_path].is_a?(String)
67
- Chef::Util::PathHelper.join(options[:chef_repo_path], "#{type}s")
68
- else
69
- options[:chef_repo_path].map { |path| Chef::Util::PathHelper.join(path, "#{type}s") }
70
- end
71
- end
65
+ options[symbol_key] ||= if options[:chef_repo_path].is_a?(String)
66
+ Chef::Util::PathHelper.join(options[:chef_repo_path], "#{type}s")
67
+ else
68
+ options[:chef_repo_path].map { |path| Chef::Util::PathHelper.join(path, "#{type}s") }
69
+ end
72
70
 
73
71
  # Copy over to string keys for things that use string keys (ChefFS)...
74
72
  # TODO: Fix ChefFS to take symbols or use something that is insensitive to the difference
@@ -1,7 +1,7 @@
1
1
  require "chef_zero/rspec"
2
2
  require "chef/server_api"
3
3
  require_relative "repository_support"
4
- require "uri"
4
+ require "uri" unless defined?(URI)
5
5
  require_relative "../chef_run"
6
6
  require_relative "recipe_run_wrapper"
7
7
  require_relative "matchers"
@@ -1,5 +1,5 @@
1
1
  require_relative "../chef_run"
2
- require "forwardable"
2
+ require "forwardable" unless defined?(Forwardable)
3
3
 
4
4
  module Cheffish
5
5
  module RSpec
@@ -1,3 +1,3 @@
1
1
  module Cheffish
2
- VERSION = "16.0.6".freeze
2
+ VERSION = "17.0.0".freeze
3
3
  end
@@ -224,7 +224,7 @@ describe Chef::Resource::PrivateKey do
224
224
  end
225
225
  end.to have_updated "private_key[#{repo_path}/blah]", :create
226
226
  expect(IO.read("#{repo_path}/blah")).not_to start_with("-----BEGIN")
227
- expect(OpenSSL::PKey.read(IO.read("#{repo_path}/blah"))).to be_kind_of(OpenSSL::PKey::RSA)
227
+ expect(OpenSSL::PKey.read(IO.binread("#{repo_path}/blah"))).to be_kind_of(OpenSSL::PKey::RSA)
228
228
  end
229
229
  end
230
230
 
@@ -4,7 +4,11 @@ require "cheffish/rspec/chef_run_support"
4
4
  describe "Cheffish::RSpec::ChefRunSupport" do
5
5
  extend Cheffish::RSpec::ChefRunSupport
6
6
 
7
- let(:temp_file) { Tempfile.new("test") }
7
+ let(:temp_file) do
8
+ f = Tempfile.new("test")
9
+ f.close
10
+ f
11
+ end
8
12
 
9
13
  context "#recipe" do
10
14
  it "recipe { file ... } updates the file" do
@@ -1,10 +1,10 @@
1
1
  RSpec::Matchers.define :be_public_key_for do |private_key, pass_phrase|
2
2
  match do |public_key|
3
3
  if public_key.is_a?(String)
4
- public_key, _public_key_format = Cheffish::KeyFormatter.decode(IO.read(File.expand_path(public_key)), pass_phrase, public_key)
4
+ public_key, _public_key_format = Cheffish::KeyFormatter.decode(IO.binread(File.expand_path(public_key)), pass_phrase, public_key)
5
5
  end
6
6
  if private_key.is_a?(String)
7
- private_key, _private_key_format = Cheffish::KeyFormatter.decode(IO.read(File.expand_path(private_key)), pass_phrase, private_key)
7
+ private_key, _private_key_format = Cheffish::KeyFormatter.decode(IO.binread(File.expand_path(private_key)), pass_phrase, private_key)
8
8
  end
9
9
 
10
10
  encrypted = public_key.public_encrypt("hi there")
@@ -15,10 +15,10 @@ end
15
15
  RSpec::Matchers.define :match_private_key do |expected, pass_phrase|
16
16
  match do |actual|
17
17
  if expected.is_a?(String)
18
- expected, _format = Cheffish::KeyFormatter.decode(IO.read(File.expand_path(expected)), pass_phrase, expected)
18
+ expected, _format = Cheffish::KeyFormatter.decode(IO.binread(File.expand_path(expected)), pass_phrase, expected)
19
19
  end
20
20
  if actual.is_a?(String)
21
- actual, _format = Cheffish::KeyFormatter.decode(IO.read(File.expand_path(actual)), pass_phrase, actual)
21
+ actual, _format = Cheffish::KeyFormatter.decode(IO.binread(File.expand_path(actual)), pass_phrase, actual)
22
22
  end
23
23
 
24
24
  encrypted = actual.public_encrypt("hi there")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cheffish
3
3
  version: !ruby/object:Gem::Version
4
- version: 16.0.6
4
+ version: 17.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chef Software Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-06 00:00:00.000000000 Z
11
+ date: 2021-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef-zero
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '14.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: chef-utils
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '17.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '17.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: net-ssh
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -120,14 +134,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
120
134
  requirements:
121
135
  - - ">="
122
136
  - !ruby/object:Gem::Version
123
- version: 2.6.0
137
+ version: 2.7.0
124
138
  required_rubygems_version: !ruby/object:Gem::Requirement
125
139
  requirements:
126
140
  - - ">="
127
141
  - !ruby/object:Gem::Version
128
142
  version: '0'
129
143
  requirements: []
130
- rubygems_version: 3.0.3
144
+ rubygems_version: 3.1.4
131
145
  signing_key:
132
146
  specification_version: 4
133
147
  summary: A set of Chef resources for configuring Chef Infra.