inspec-core 5.22.72 → 5.22.95

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: 1561e49537c4bd8b615a78d099d922a0915c71429fcdfb4ca6197105712ca3aa
4
- data.tar.gz: d756477c4172ff54a6a69f6905c0f0034b484f9ca38b45fda8a7d6efa7c5f748
3
+ metadata.gz: a7b225f8fda920cb03f73a84eb1edc2b98339058c824f2323bee26995b37c74b
4
+ data.tar.gz: 5b6eb547488c20ff9e8170066f0ba38871afeead368f91248254ccf171e33327
5
5
  SHA512:
6
- metadata.gz: 93849cdca52ac4bc4bec15aebd4933e623229f4c10378fb2d85316c6496d45cc9ebe7ed2e1c1aa4f1a296779237cb06b204f5d61af8f7d1a7b2642c9a9e4720a
7
- data.tar.gz: 54988d5e27e76412c03eca453f7887414a536ee16607fbf2c1ecd7e502136f555700bba9c88e59967ab6857fa198c4138b517090183f31b72e88f54a46926669
6
+ metadata.gz: 01e6f8d6a5749288c3a53d9fc0166d3b8e832437cbb63aa86dc67dfe09160a956c528a9fe06e43f7912b497d8201b99556d68f6b4569ba6ac044910db821fea0
7
+ data.tar.gz: d6e5f9d3e5b5393d3cc0fbe9754ddba827cb1f12df3911fe1486dfe314b1386d5dca7b32a52509b65f9ad10cc6870ba0d990e63b5bb38456df98a57b82667fc2
data/Gemfile CHANGED
@@ -39,12 +39,17 @@ group :test do
39
39
  gem "mocha"
40
40
  # Pinning this version as it breaking for ruby 3.1.0
41
41
  gem "nokogiri", "< 1.17.2"
42
- gem "pry-byebug"
42
+ # Pinning this version as it breaking for ruby 3.0.0
43
+ gem "pry-byebug", "< 3.12.0"
43
44
  gem "pry"
44
45
  gem "rake"
45
46
  gem "simplecov"
46
47
  gem "simplecov_json_formatter"
47
48
  gem "webmock"
49
+ gem "signet", "< 0.21.0" # 0.20.0+ requires min ruby 3.1
50
+ # Pinning to 1.15 as multi_json 1.16 require ruby 3.2 version
51
+ # Ref: https://buildkite.com/chef-oss/inspec-inspec-inspec-5-verify/builds/647#019808ca-087b-43bc-b1f9-40a36f59c5f4
52
+ gem "multi_json", "~> 1.15.0"
48
53
  end
49
54
 
50
55
  group :deploy do
@@ -52,12 +57,9 @@ group :deploy do
52
57
  end
53
58
 
54
59
  # Build is failing - see: https://buildkite.com/chef-oss/inspec-inspec-inspec-5-verify/builds/442
55
- # Error:
56
- # zeitwerk-2.7.1 requires Ruby >= 3.2, which is incompatible with the current version (Ruby 3.0.7p220)
57
-
60
+ # Error: zeitwerk-2.7.1 requires Ruby >= 3.2, which is incompatible with the current version (Ruby 3.0.7p220)
58
61
  # Dependency chain:
59
62
  # zeitwerk → dry-configurable, dry-struct, dry-types → k8s-ruby → train-kubernetes
60
-
61
63
  # Pinning zeitwerk to ~> 2.6 to avoid Ruby >= 3.2 requirement.
62
64
  # Remove this pin when upgrading to Ruby 3.2 or higher.
63
65
  gem "zeitwerk", "~> 2.6.0", "< 2.7"
data/inspec-core.gemspec CHANGED
@@ -13,9 +13,8 @@ Gem::Specification.new do |spec|
13
13
  spec.license = "Apache-2.0"
14
14
  spec.require_paths = ["lib"]
15
15
 
16
- # We want to support ruby 3.0 as Chef is using ruby to support AIX and we want to make sure InSpec works with it. (Ref: https://github.com/chef/chef/pull/13207)
17
- # TODO: Once we have Chef working fully with ruby 3.1 we can drop ruby 3.0
18
- spec.required_ruby_version = ">= 3.0.3"
16
+ # Chef will provide AIX support with ruby 3.0 in separate builds with older versions of InSpec 5, hence we can drop ruby 3.0 support
17
+ spec.required_ruby_version = ">= 3.1.0"
19
18
 
20
19
  # the gemfile and gemspec are necessary for appbundler so don't remove it
21
20
  spec.files =
@@ -29,11 +28,11 @@ Gem::Specification.new do |spec|
29
28
  spec.add_dependency "license-acceptance", ">= 0.2.13", "< 3.0"
30
29
  # TODO: We should remove the thor pinning in next upcoming releases currently it's breaking our unit test in cli_args_test for aliases due to
31
30
  # recent changes made in thor library REF: https://github.com/rails/thor/releases/tag/v1.3.0 & https://github.com/rails/thor/pull/800
32
- spec.add_dependency "thor", ">= 0.20", "< 1.3.0"
31
+ spec.add_dependency "thor", ">= 0.20", "< 1.5.0"
33
32
  spec.add_dependency "method_source", ">= 0.8", "< 2.0"
34
- spec.add_dependency "rubyzip", ">= 1.2.2", "< 3.0"
35
- spec.add_dependency "rspec", ">= 3.9", "<= 3.12"
36
- spec.add_dependency "rspec-its", "~> 1.2"
33
+ spec.add_dependency "rubyzip", ">= 1.2.2", "< 4.0"
34
+ spec.add_dependency "rspec", ">= 3.9", "<= 3.14"
35
+ spec.add_dependency "rspec-its", ">= 1.2", "< 3.0"
37
36
  spec.add_dependency "pry", "~> 0.13"
38
37
  spec.add_dependency "hashie", ">= 3.4", "< 6.0"
39
38
  spec.add_dependency "mixlib-log", "~> 3.0", "< 3.2"
@@ -55,5 +54,5 @@ Gem::Specification.new do |spec|
55
54
  # which was causing a LoadError ('cannot load such file -- ast') for users/applications using 'inspec-core'.
56
55
  spec.add_dependency "cookstyle"
57
56
 
58
- spec.add_dependency "train-core", "~> 3.10"
57
+ spec.add_dependency "train-core", "~> 3.12.13" # Adding tight version constraint for train as it is compatible with Ruby 3.0.x
59
58
  end
@@ -12,5 +12,6 @@ module Inspec
12
12
  class ProfileSigningKeyNotFound < ArgumentError; end
13
13
  class WaiversFileNotReadable < ArgumentError; end
14
14
  class WaiversFileDoesNotExist < ArgumentError; end
15
+ class WaiversFileInvalidFormatting < ArgumentError; end
15
16
  end
16
17
  end
@@ -68,11 +68,21 @@ module Inspec::Fetcher
68
68
  else
69
69
  Dir.mktmpdir do |working_dir|
70
70
  checkout(working_dir)
71
+ if git_only_or_empty?(working_dir)
72
+ # If the temporary working directory is empty after checkout,
73
+ # this means the git repository did not contain any files (or the checkout failed).
74
+ # In this case, remove the destination directory to avoid
75
+ # leaving an empty or invalid profile directory.
76
+ if Dir.exist?(destination_path)
77
+ FileUtils.rm_rf(destination_path)
78
+ end
79
+ raise Inspec::FetcherFailure, "Profile git dependency failed for #{@remote_url} - no files found in the repository."
80
+ end
71
81
  if @relative_path
72
82
  perform_relative_path_fetch(destination_path, working_dir)
73
83
  else
74
84
  Inspec::Log.debug("Checkout of #{resolved_ref.nil? ? @remote_url : resolved_ref} successful. " \
75
- "Moving checkout to #{destination_path}")
85
+ "Moving checkout to #{destination_path}")
76
86
  FileUtils.cp_r(working_dir + "/.", destination_path)
77
87
  end
78
88
  end
@@ -80,6 +90,16 @@ module Inspec::Fetcher
80
90
  @repo_directory
81
91
  end
82
92
 
93
+ def git_only_or_empty?(dir)
94
+ return false unless Dir.exist?(dir)
95
+
96
+ children = Dir.children(dir)
97
+ # Return true if:
98
+ # - directory is completely empty
99
+ # - or it contains only one entry: '.git'
100
+ children.empty? || (children - [".git"]).empty?
101
+ end
102
+
83
103
  def perform_relative_path_fetch(destination_path, working_dir)
84
104
  Inspec::Log.debug("Checkout of #{resolved_ref.nil? ? @remote_url : resolved_ref} successful. " \
85
105
  "Moving #{@relative_path} to #{destination_path}")
@@ -256,7 +256,14 @@ module Inspec
256
256
  # # Pull together waiver
257
257
  waived_control_ids = []
258
258
  waiver_paths.each do |waiver_path|
259
- waiver_content = YAML.load_file(waiver_path)
259
+ # Ruby 3.1 treats YAML load as a dangerous operation by default, requiring us to declare date and time classes as permitted
260
+ # It's not a valid option in 3.0.x
261
+ if Gem.ruby_version >= Gem::Version.new("3.1.0")
262
+ waiver_content = ::YAML.load_file(waiver_path, permitted_classes: [Date, Time])
263
+ else
264
+ waiver_content = YAML.load_file(waiver_path)
265
+ end
266
+
260
267
  unless waiver_content
261
268
  # Note that we will have already issued a detailed warning
262
269
  Inspec::Log.error "YAML parsing error in #{waiver_path}"
@@ -575,7 +582,7 @@ module Inspec
575
582
  include_tests: include_tests)
576
583
 
577
584
  # Collect all metadata defined in the control block and inputs defined inside the control block
578
- src.ast.each_node { |n|
585
+ src.ast&.each_node { |n|
579
586
  ctl_id_collector.process(n)
580
587
  input_collector.process(n)
581
588
  }
@@ -637,7 +644,7 @@ module Inspec
637
644
  }
638
645
  source_location_ref = @source_reader.target.abs_path(control_filename)
639
646
  Inspec::Profile::AstHelper::TitleCollector.new(group_data)
640
- .process(src.ast.child_nodes.first) # Picking the title defined for the whole controls file
647
+ .process(src.ast&.child_nodes&.first) # Picking the title defined for the whole controls file
641
648
  group_controls = @info_from_parse[:controls].select { |control| control[:source_location][:ref] == source_location_ref }
642
649
  group_data[:controls] = group_controls.map { |control| control[:id] }
643
650
 
@@ -39,11 +39,17 @@ module Inspec::Resources
39
39
  # expected result:
40
40
  # Machine Name,Policy Target,Subcategory,Subcategory GUID,Inclusion Setting,Exclusion Setting
41
41
  # WIN-MB8NINQ388J,System,Kerberos Authentication Service,{0CCE9242-69AE-11D9-BED3-505054503030},No Auditing,
42
- result ||= inspec.command("Auditpol /get /subcategory:'#{key}' /r").stdout
42
+ auditpol_cmd = "Auditpol /get /subcategory:'#{key}' /r"
43
+ result ||= inspec.command(auditpol_cmd)
44
+
45
+ unless result.exit_status == 0
46
+ error = result.stdout + "\n" + result.stderr
47
+ raise Inspec::Exceptions::ResourceFailed, "Error while executing #{auditpol_cmd} command: #{error}"
48
+ end
43
49
 
44
50
  # find line
45
51
  target = nil
46
- result.each_line do |s|
52
+ result.stdout.each_line do |s|
47
53
  target = s.strip if s =~ /\b.*#{key}.*\b/
48
54
  end
49
55
 
@@ -18,18 +18,20 @@ module Secrets
18
18
  def initialize(target)
19
19
  # Ruby 3.1 treats YAML load as a dangerous operation by default, requiring us to declare date and time classes as permitted
20
20
  # It's not a valid option in 3.0.x
21
- if Gem.ruby_version >= Gem::Version.new("3.1.0")
22
- @inputs = ::YAML.load_file(target, permitted_classes: [Date, Time])
23
- else
24
- @inputs = ::YAML.load_file(target)
25
- end
21
+ @inputs = ::YAML.load_file(target, permitted_classes: [Date, Time])
26
22
 
27
- if @inputs == false || !@inputs.is_a?(Hash)
28
- Inspec::Log.warn("#{self.class} unable to parse #{target}: invalid YAML or contents is not a Hash")
23
+ # In case of empty yaml file raise the warning else raise the parsing error.
24
+ if !@inputs || @inputs.empty?
25
+ Inspec::Log.warn("Unable to parse #{target}: YAML file is empty.")
29
26
  @inputs = nil
27
+ elsif !@inputs.is_a?(Hash)
28
+ # Exits with usage error.
29
+ Inspec::Log.error("Unable to parse #{target}: invalid YAML or contents is not a Hash")
30
+ Inspec::UI.new.exit(:usage_error)
30
31
  end
31
32
  rescue => e
32
- raise "Error reading InSpec inputs: #{e}"
33
+ # Any other error related to Yaml parsing will be raised here.
34
+ raise "Error reading YAML file #{target}: #{e}"
33
35
  end
34
36
  end
35
37
  end
@@ -1,3 +1,3 @@
1
1
  module Inspec
2
- VERSION = "5.22.72".freeze
2
+ VERSION = "5.22.95".freeze
3
3
  end
@@ -5,6 +5,8 @@ require "inspec/utils/waivers/json_file_reader"
5
5
  module Inspec
6
6
  class WaiverFileReader
7
7
 
8
+ SUPPORTED_FILE_EXTENSION = %w{.yaml .yml .csv .json}.freeze
9
+
8
10
  def self.fetch_waivers_by_profile(profile_id, files)
9
11
  read_waivers_from_file(profile_id, files) if @waivers_data.nil? || @waivers_data[profile_id].nil?
10
12
  @waivers_data[profile_id]
@@ -15,49 +17,105 @@ module Inspec
15
17
  output = {}
16
18
 
17
19
  files.each do |file_path|
18
- file_extension = File.extname(file_path)
19
- data = nil
20
- if [".yaml", ".yml"].include? file_extension
21
- data = Secrets::YAML.resolve(file_path)
22
- unless data.nil?
23
- data = data.inputs
24
- validate_json_yaml(data)
25
- end
26
- elsif file_extension == ".csv"
27
- data = Waivers::CSVFileReader.resolve(file_path)
28
- headers = Waivers::CSVFileReader.headers
29
- validate_headers(headers)
30
- elsif file_extension == ".json"
31
- data = Waivers::JSONFileReader.resolve(file_path)
32
- validate_json_yaml(data) unless data.nil?
33
- end
34
- output.merge!(data) if !data.nil? && data.is_a?(Hash)
20
+ next unless valid_waiver_file?(file_path)
35
21
 
36
- if data.nil?
37
- raise Inspec::Exceptions::WaiversFileNotReadable,
38
- "Cannot find parser for waivers file '#{file_path}'. " \
39
- "Check to make sure file has the appropriate extension."
40
- end
22
+ data = parse_waiver_file(file_path)
23
+ output.merge!(data) if data.is_a?(Hash)
24
+ rescue Inspec::Exceptions::WaiversFileNotReadable, Inspec::Exceptions::WaiversFileInvalidFormatting => e
25
+ Inspec::Log.error "Error reading waivers file #{file_path}. #{e.message}"
26
+ Inspec::UI.new.exit(:usage_error)
41
27
  end
42
28
 
43
29
  @waivers_data[profile_id] = output
44
30
  end
45
31
 
46
- def self.validate_headers(headers, json_yaml = false)
47
- required_fields = json_yaml ? %w{justification} : %w{control_id justification}
48
- all_fields = %w{control_id justification expiration_date run}
32
+ def self.valid_waiver_file?(file_path)
33
+ # Check if the file is readable
34
+ file_extension = File.extname(file_path).downcase
35
+ unless SUPPORTED_FILE_EXTENSION.include?(file_extension)
36
+ raise Inspec::Exceptions::WaiversFileNotReadable,
37
+ "Unsupported file extension for '#{file_path}'. Allowed waiver file extensions: #{SUPPORTED_FILE_EXTENSION.join(", ")}"
38
+ end
39
+
40
+ # Check if the file is empty
41
+ if File.zero?(file_path)
42
+ Inspec::Log.warn "Waivers file '#{file_path}' is empty. Skipping waivers."
43
+ return false
44
+ end
49
45
 
50
- Inspec::Log.warn "Missing column headers: #{(required_fields - headers)}" unless (required_fields - headers).empty?
51
- Inspec::Log.warn "Invalid column header: Column can't be nil" if headers.include? nil
52
- Inspec::Log.warn "Extra column headers: #{(headers - all_fields)}" unless (headers - all_fields).empty?
46
+ true
47
+ end
48
+
49
+ def self.parse_waiver_file(file_path)
50
+ file_extension = File.extname(file_path).downcase
51
+
52
+ case file_extension
53
+ when ".yaml", ".yml"
54
+ data = Secrets::YAML.resolve(file_path)&.inputs
55
+ validate_json_yaml(data)
56
+ when ".csv"
57
+ data = Waivers::CSVFileReader.resolve(file_path)
58
+ validate_csv_headers(Waivers::CSVFileReader.headers)
59
+ when ".json"
60
+ data = Waivers::JSONFileReader.resolve(file_path)
61
+ validate_json_yaml(data)
62
+ end
63
+
64
+ data
65
+ end
66
+
67
+ def self.all_fields
68
+ %w{control_id justification expiration_date run}
69
+ end
70
+
71
+ def self.validate_csv_headers(headers)
72
+ invalid_headers_info = fetch_invalid_headers_info(headers)
73
+ # Warn if blank column found in csv file
74
+ Inspec::Log.warn "Invalid column headers: Column can't be nil" if invalid_headers_info[:blank_column]
75
+ # Warn if extra header found in csv file
76
+ Inspec::Log.warn "Extra header/s #{invalid_headers_info[:extra_headers]}" unless invalid_headers_info[:extra_headers].empty?
77
+ unless invalid_headers_info[:missing_required_fields].empty?
78
+ raise Inspec::Exceptions::WaiversFileInvalidFormatting,
79
+ "Missing required header/s #{invalid_headers_info[:missing_required_fields]}. Fix headers in file to proceed."
80
+ end
81
+ end
82
+
83
+ def self.fetch_invalid_headers_info(headers, json_yaml = false)
84
+ required_fields = json_yaml ? %w{justification} : %w{control_id justification}
85
+ data = {}
86
+ data[:missing_required_fields] = []
87
+ # Finds missing required fields
88
+ unless (required_fields - headers).empty?
89
+ data[:missing_required_fields] = required_fields - headers
90
+ end
91
+ # If column with no header found set the blank_column flag. Only applicable for csv
92
+ data[:blank_column] = headers.include?(nil) ? true : false
93
+ # Find extra headers/parameters
94
+ data[:extra_headers] = (headers - all_fields)
95
+ data
53
96
  end
54
97
 
55
98
  def self.validate_json_yaml(data)
56
- headers = []
57
- data.each_value do |value|
58
- headers.push value.keys
99
+ return if data.nil?
100
+
101
+ missing_required_field = false
102
+ data.each do |key, value|
103
+ # In case of yaml or json we need to validate headers/parametes for each value
104
+ invalid_headers_info = fetch_invalid_headers_info(value.keys, true)
105
+ # WARN in case of extra parameters found in each waived control
106
+ Inspec::Log.warn "Control ID #{key}: extra parameter/s #{invalid_headers_info[:extra_headers]}" unless invalid_headers_info[:extra_headers].empty?
107
+ unless invalid_headers_info[:missing_required_fields].empty?
108
+ missing_required_field = true
109
+ # Log error for each waived control
110
+ Inspec::Log.error "Control ID #{key}: missing required parameter/s #{invalid_headers_info[:missing_required_fields]}"
111
+ end
112
+ end
113
+
114
+ # Raise error if any of the waived control has missing required filed
115
+ if missing_required_field
116
+ raise Inspec::Exceptions::WaiversFileInvalidFormatting,
117
+ "Missing required parameter [justification]. Fix parameters in file to proceed."
59
118
  end
60
- validate_headers(headers.flatten.uniq, true)
61
119
  end
62
120
  end
63
121
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inspec-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.22.72
4
+ version: 5.22.95
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chef InSpec Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-03-03 00:00:00.000000000 Z
11
+ date: 2025-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chef-telemetry
@@ -59,7 +59,7 @@ dependencies:
59
59
  version: '0.20'
60
60
  - - "<"
61
61
  - !ruby/object:Gem::Version
62
- version: 1.3.0
62
+ version: 1.5.0
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
@@ -69,7 +69,7 @@ dependencies:
69
69
  version: '0.20'
70
70
  - - "<"
71
71
  - !ruby/object:Gem::Version
72
- version: 1.3.0
72
+ version: 1.5.0
73
73
  - !ruby/object:Gem::Dependency
74
74
  name: method_source
75
75
  requirement: !ruby/object:Gem::Requirement
@@ -99,7 +99,7 @@ dependencies:
99
99
  version: 1.2.2
100
100
  - - "<"
101
101
  - !ruby/object:Gem::Version
102
- version: '3.0'
102
+ version: '4.0'
103
103
  type: :runtime
104
104
  prerelease: false
105
105
  version_requirements: !ruby/object:Gem::Requirement
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: 1.2.2
110
110
  - - "<"
111
111
  - !ruby/object:Gem::Version
112
- version: '3.0'
112
+ version: '4.0'
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: rspec
115
115
  requirement: !ruby/object:Gem::Requirement
@@ -119,7 +119,7 @@ dependencies:
119
119
  version: '3.9'
120
120
  - - "<="
121
121
  - !ruby/object:Gem::Version
122
- version: '3.12'
122
+ version: '3.14'
123
123
  type: :runtime
124
124
  prerelease: false
125
125
  version_requirements: !ruby/object:Gem::Requirement
@@ -129,21 +129,27 @@ dependencies:
129
129
  version: '3.9'
130
130
  - - "<="
131
131
  - !ruby/object:Gem::Version
132
- version: '3.12'
132
+ version: '3.14'
133
133
  - !ruby/object:Gem::Dependency
134
134
  name: rspec-its
135
135
  requirement: !ruby/object:Gem::Requirement
136
136
  requirements:
137
- - - "~>"
137
+ - - ">="
138
138
  - !ruby/object:Gem::Version
139
139
  version: '1.2'
140
+ - - "<"
141
+ - !ruby/object:Gem::Version
142
+ version: '3.0'
140
143
  type: :runtime
141
144
  prerelease: false
142
145
  version_requirements: !ruby/object:Gem::Requirement
143
146
  requirements:
144
- - - "~>"
147
+ - - ">="
145
148
  - !ruby/object:Gem::Version
146
149
  version: '1.2'
150
+ - - "<"
151
+ - !ruby/object:Gem::Version
152
+ version: '3.0'
147
153
  - !ruby/object:Gem::Dependency
148
154
  name: pry
149
155
  requirement: !ruby/object:Gem::Requirement
@@ -390,14 +396,14 @@ dependencies:
390
396
  requirements:
391
397
  - - "~>"
392
398
  - !ruby/object:Gem::Version
393
- version: '3.10'
399
+ version: 3.12.13
394
400
  type: :runtime
395
401
  prerelease: false
396
402
  version_requirements: !ruby/object:Gem::Requirement
397
403
  requirements:
398
404
  - - "~>"
399
405
  - !ruby/object:Gem::Version
400
- version: '3.10'
406
+ version: 3.12.13
401
407
  description: InSpec provides a framework for creating end-to-end infrastructure tests.
402
408
  You can use it for integration or even compliance testing. Create fully portable
403
409
  test profiles and use them in your workflow to ensure stability and security. Integrate
@@ -867,14 +873,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
867
873
  requirements:
868
874
  - - ">="
869
875
  - !ruby/object:Gem::Version
870
- version: 3.0.3
876
+ version: 3.1.0
871
877
  required_rubygems_version: !ruby/object:Gem::Requirement
872
878
  requirements:
873
879
  - - ">="
874
880
  - !ruby/object:Gem::Version
875
881
  version: '0'
876
882
  requirements: []
877
- rubygems_version: 3.2.3
883
+ rubygems_version: 3.3.27
878
884
  signing_key:
879
885
  specification_version: 4
880
886
  summary: Infrastructure and compliance testing. Core library.