compliance_engine 0.1.2 → 0.1.3

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: fee65bb4492e02e3223e589aa7b567e8b64e1b8140183ad4f8eecab01998ad85
4
- data.tar.gz: c259b00c35ffbe1f4bfa0e6878a471ae31ecaeea7ac688222e66aaa9a496a14c
3
+ metadata.gz: 44cfaff67ac82f027fdab7db4b4b66b268ded7849821d8b9a8593caa6e3c7d67
4
+ data.tar.gz: c4992a17de18bd49ebbe72e9bec2f56598460e4e20aeb04b50386bf014af8283
5
5
  SHA512:
6
- metadata.gz: 97c8b3ea7970037515a1af146301b088b7c3c042f6b5e8f0c1c2388287eaa06429fbf5d6bfc5cbaa5a27e214ca904bc2bb9dd647e2d89b08a6d3aa8e52c3f8be
7
- data.tar.gz: 87d12eb35f45db3a6e56e69d5038c33f29fd10e6f2a32014dc0d6d44c9c8299aa1c0300599fb527c4189910533b57cf16cc61b58ae2b11cec82d7f0763ad3c29
6
+ metadata.gz: ce7186407c8ab23404b1b1a075509df73c6ba026587c901d14c8849c1c4f6490a88a7f89a4a575e327f276f39b97ce2ca10fb107fdcb275f1affeac0bf884fbf
7
+ data.tar.gz: 5ed4621f0623213d00987271328f15177157249e563bc7c0036b6009c339b6579aba8e65971a9a0d9e22020b4af31a31ac4abd92305598a532133b92c6aa51cb
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ### 0.1.3 / 2025-05-20
2
+ * Add dependency on observer gem (#47)
3
+ * Add Ruby 3.4 to testing matrix
4
+ * Sort directory entries to fix GHA test failures
5
+
1
6
  ### 0.1.2 / 2024-12-04
2
7
  * Fix environment loading (#35)
3
8
 
@@ -25,8 +25,9 @@ Gem::Specification.new do |spec|
25
25
  spec.require_paths = ['lib']
26
26
 
27
27
  spec.add_dependency 'deep_merge', '~> 1.2'
28
- spec.add_dependency 'thor', '~> 1.3'
29
28
  spec.add_dependency 'irb', '~> 1.14'
30
- spec.add_dependency 'semantic_puppet', '~> 1.1'
29
+ spec.add_dependency 'observer', '~> 0.1'
31
30
  spec.add_dependency 'rubyzip', '~> 2.3'
31
+ spec.add_dependency 'semantic_puppet', '~> 1.1'
32
+ spec.add_dependency 'thor', '~> 1.3'
32
33
  end
@@ -10,6 +10,8 @@ class ComplianceEngine::CLI < Thor
10
10
  class_option :module, type: :array, default: []
11
11
  class_option :modulepath, type: :array
12
12
  class_option :modulezip, type: :string
13
+ class_option :verbose, type: :boolean
14
+ class_option :debug, type: :boolean
13
15
 
14
16
  desc 'version', 'Print the version'
15
17
  def version
@@ -58,7 +60,14 @@ class ComplianceEngine::CLI < Thor
58
60
  def data
59
61
  return @data unless @data.nil?
60
62
 
61
- @data = ComplianceEngine::Data.new(facts: facts, enforcement_tolerance: options[:enforcement_tolerance])
63
+ if options[:debug]
64
+ ComplianceEngine.log.level = Logger::DEBUG
65
+ elsif options[:verbose]
66
+ ComplianceEngine.log.level = Logger::INFO
67
+ end
68
+ @data = ComplianceEngine::Data.new
69
+ @data.facts = facts
70
+ @data.enforcement_tolerance = options[:enforcement_tolerance]
62
71
  if options[:modulezip]
63
72
  @data.open_environment_zip(options[:modulezip])
64
73
  elsif options[:modulepath]
@@ -7,8 +7,8 @@ require 'deep_merge'
7
7
  class ComplianceEngine::Component
8
8
  # A generic compliance engine data component
9
9
  #
10
- # @param [String] component The component key
11
- # @param [ComplianceEngine::Data, ComplianceEngine::Collection, NilClass] data The data to initialize the object with
10
+ # @param component [String] The component key
11
+ # @param data [ComplianceEngine::Data, ComplianceEngine::Collection, NilClass] The data to initialize the object with
12
12
  def initialize(name, data: nil)
13
13
  context_variables.each { |var| instance_variable_set(var, data&.instance_variable_get(var)) }
14
14
  @component ||= { key: name, fragments: {} }
@@ -124,9 +124,9 @@ class ComplianceEngine::Component
124
124
 
125
125
  # Compare a fact value against a confine value
126
126
  #
127
- # @param [Object] fact The fact value
128
- # @param [Object] confine The confine value
129
- # @param [Integer] depth The depth of the recursion
127
+ # @param fact [Object] The fact value
128
+ # @param confine [Object] The confine value
129
+ # @param depth [Integer] The depth of the recursion
130
130
  # @return [TrueClass, FalseClass] true if the fact value matches the confine value
131
131
  def fact_match?(fact, confine, depth = 0)
132
132
  if confine.is_a?(String)
@@ -146,7 +146,7 @@ class ComplianceEngine::Component
146
146
 
147
147
  # Check if a fragment is confined
148
148
  #
149
- # @param [Hash] fragment The fragment to check
149
+ # @param fragment [Hash] The fragment to check
150
150
  # @return [TrueClass, FalseClass] true if the fragment should be dropped
151
151
  def confine_away?(fragment)
152
152
  return false unless fragment.key?('confine')
@@ -161,13 +161,13 @@ class ComplianceEngine::Component
161
161
  begin
162
162
  return true unless SemanticPuppet::VersionRange.parse(module_version).include?(SemanticPuppet::Version.parse(environment_data[v]))
163
163
  rescue => e
164
- warn "Failed to compare #{v} #{environment_data[v]} with version confinement #{module_version}: #{e.message}"
164
+ ComplianceEngine.log.error "Failed to compare #{v} #{environment_data[v]} with version confinement #{module_version}: #{e.message}"
165
165
  return true
166
166
  end
167
167
  end
168
168
  end
169
169
  elsif k == 'module_version'
170
- warn "Missing module name for #{fragment}" unless fragment['confine'].key?('module_name')
170
+ ComplianceEngine.log.error "Missing module name for #{fragment}" unless fragment['confine'].key?('module_name')
171
171
  else
172
172
  # Confinement based on Puppet facts
173
173
  unless facts.nil?
@@ -215,14 +215,14 @@ class ComplianceEngine::Component
215
215
  message = "Remediation disabled for #{fragment}"
216
216
  reason = fragment['remediation']['disabled']&.map { |value| value['reason'] }&.reject { |value| value.nil? }&.join("\n")
217
217
  message += "\n#{reason}" unless reason.nil?
218
- warn message
218
+ ComplianceEngine.log.info message
219
219
  next
220
220
  end
221
221
 
222
222
  if fragment['remediation'].key?('risk')
223
223
  risk_level = fragment['remediation']['risk']&.map { |value| value['level'] }&.select { |value| value.is_a?(Integer) }&.max
224
224
  if risk_level.is_a?(Integer) && risk_level >= enforcement_tolerance
225
- warn "Remediation risk #{risk_level} exceeds enforcement tolerance #{enforcement_tolerance} for #{fragment}"
225
+ ComplianceEngine.log.info "Remediation risk #{risk_level} exceeds enforcement tolerance #{enforcement_tolerance} for #{fragment}"
226
226
  next
227
227
  end
228
228
  end
@@ -243,7 +243,7 @@ class ComplianceEngine::Component
243
243
  @element = {}
244
244
 
245
245
  fragments.each_value do |fragment|
246
- @element = @element.deep_merge!(fragment)
246
+ @element = DeepMerge.deep_merge!(fragment, @element)
247
247
  end
248
248
 
249
249
  @element
@@ -24,9 +24,9 @@ require 'json'
24
24
 
25
25
  # Work with compliance data
26
26
  class ComplianceEngine::Data
27
- # @param [Array<String>] paths The paths to the compliance data files
28
- # @param [Hash] facts The facts to use while evaluating the data
29
- # @param [Integer] enforcement_tolerance The tolerance to use while evaluating the data
27
+ # @param paths [Array<String>] The paths to the compliance data files
28
+ # @param facts [Hash] The facts to use while evaluating the data
29
+ # @param enforcement_tolerance [Integer] The tolerance to use while evaluating the data
30
30
  def initialize(*paths, facts: nil, enforcement_tolerance: nil)
31
31
  @data ||= {}
32
32
  @facts = facts
@@ -38,35 +38,35 @@ class ComplianceEngine::Data
38
38
  attr_reader :data, :facts, :enforcement_tolerance, :environment_data, :modulepath
39
39
 
40
40
  # Set the object data
41
- # @param [Hash] data The data to initialize the object with
41
+ # @param data [Hash] The data to initialize the object with
42
42
  def data=(value)
43
43
  @data = value
44
44
  invalidate_cache
45
45
  end
46
46
 
47
47
  # Set the facts
48
- # @param [Hash] facts The facts to initialize the object with
48
+ # @param facts [Hash] The facts to initialize the object with
49
49
  def facts=(value)
50
50
  @facts = value
51
51
  invalidate_cache
52
52
  end
53
53
 
54
54
  # Set the enforcement tolerance
55
- # @param [Hash] enforcement_tolerance The enforcement tolerance to initialize
55
+ # @param enforcement_tolerance [Hash] The enforcement tolerance to initialize
56
56
  def enforcement_tolerance=(value)
57
57
  @enforcement_tolerance = value
58
58
  invalidate_cache
59
59
  end
60
60
 
61
61
  # Set the environment data
62
- # @param [Hash] environment_data The environment data to initialize the object with
62
+ # @param environment_data [Hash] The environment data to initialize the object with
63
63
  def environment_data=(value)
64
64
  @environment_data = value
65
65
  invalidate_cache
66
66
  end
67
67
 
68
68
  # Set the modulepath
69
- # @param [Array<String>] modulepath The Puppet modulepath
69
+ # @param modulepath [Array<String>] The Puppet modulepath
70
70
  def modulepath=(value)
71
71
  @modulepath = value
72
72
  invalidate_cache
@@ -89,7 +89,7 @@ class ComplianceEngine::Data
89
89
  end
90
90
 
91
91
  # Scan a Puppet environment from a zip file
92
- # @param [String] path The Puppet environment archive file
92
+ # @param path [String] The Puppet environment archive file
93
93
  # @return [NilClass]
94
94
  def open_environment_zip(path)
95
95
  require 'compliance_engine/environment_loader/zip'
@@ -100,7 +100,7 @@ class ComplianceEngine::Data
100
100
  end
101
101
 
102
102
  # Scan a Puppet environment
103
- # @param [Array<String>] paths The Puppet modulepath components
103
+ # @param paths [Array<String>] The Puppet modulepath components
104
104
  # @return [NilClass]
105
105
  def open_environment(*paths)
106
106
  environment = ComplianceEngine::EnvironmentLoader.new(*paths)
@@ -110,9 +110,9 @@ class ComplianceEngine::Data
110
110
 
111
111
  # Scan paths for compliance data files
112
112
  #
113
- # @param [Array<String>] paths The paths to the compliance data files
114
- # @param [Class] fileclass The class to use for reading files
115
- # @param [Class] dirclass The class to use for reading directories
113
+ # @param paths [Array<String>] The paths to the compliance data files
114
+ # @param fileclass [Class] The class to use for reading files
115
+ # @param dirclass [Class] The class to use for reading directories
116
116
  # @return [NilClass]
117
117
  def open(*paths, fileclass: File, dirclass: Dir)
118
118
  modules = {}
@@ -162,11 +162,11 @@ class ComplianceEngine::Data
162
162
 
163
163
  # Update the data for a given file
164
164
  #
165
- # @param [String] file The path to the compliance data file
166
- # @param [String] key The key to use for the data
167
- # @param [Class] fileclass The class to use for reading files
168
- # @param [Integer] size The size of the file
169
- # @param [Time] mtime The modification time of the file
165
+ # @param file [String] The path to the compliance data file
166
+ # @param key [String] The key to use for the data
167
+ # @param fileclass [Class] The class to use for reading files
168
+ # @param size [Integer] The size of the file
169
+ # @param mtime [Time] The modification time of the file
170
170
  # @return [NilClass]
171
171
  def update(
172
172
  filename,
@@ -207,7 +207,7 @@ class ComplianceEngine::Data
207
207
 
208
208
  reset_collection
209
209
  rescue => e
210
- warn e.message
210
+ ComplianceEngine.log.error e.message
211
211
  end
212
212
 
213
213
  # Get a list of files with compliance data
@@ -220,7 +220,7 @@ class ComplianceEngine::Data
220
220
 
221
221
  # Get the compliance data for a given file
222
222
  #
223
- # @param [String] file The path to the compliance data file
223
+ # @param file [String] The path to the compliance data file
224
224
  # @return [Hash]
225
225
  def get(file)
226
226
  data[file][:content]
@@ -268,7 +268,7 @@ class ComplianceEngine::Data
268
268
  collection.each_value do |v|
269
269
  v.to_a.each do |component|
270
270
  next unless component.key?('confine')
271
- @confines = @confines.deep_merge!(component['confine'])
271
+ @confines = DeepMerge.deep_merge!(component['confine'], @confines)
272
272
  end
273
273
  end
274
274
  end
@@ -278,7 +278,7 @@ class ComplianceEngine::Data
278
278
 
279
279
  # Return all Hiera data from checks that map to the requested profiles
280
280
  #
281
- # @param [Array<String>] requested_profiles The requested profiles
281
+ # @param requested_profiles [Array<String>] The requested profiles
282
282
  # @return [Hash]
283
283
  def hiera(requested_profiles = [])
284
284
  # If we have no valid profiles, we won't have any hiera data.
@@ -293,7 +293,7 @@ class ComplianceEngine::Data
293
293
  valid_profiles = []
294
294
  requested_profiles.each do |profile|
295
295
  if profiles[profile].nil?
296
- warn "Requested profile '#{profile}' not defined"
296
+ ComplianceEngine.log.error "Requested profile '#{profile}' not defined"
297
297
  next
298
298
  end
299
299
 
@@ -310,7 +310,7 @@ class ComplianceEngine::Data
310
310
 
311
311
  valid_profiles.reverse_each do |profile|
312
312
  check_mapping(profile).each_value do |check|
313
- parameters = parameters.deep_merge!(check.hiera)
313
+ parameters = DeepMerge.deep_merge!(check.hiera, parameters)
314
314
  end
315
315
  end
316
316
 
@@ -319,7 +319,7 @@ class ComplianceEngine::Data
319
319
 
320
320
  # Return all checks that map to the requested profile or CE
321
321
  #
322
- # @param [ComplianceEngine::Profile, ComplianceEngine::Ce] profile_or_ce The requested profile or CE
322
+ # @param profile_or_ce [ComplianceEngine::Profile, ComplianceEngine::Ce] The requested profile or CE
323
323
  # @return [Hash]
324
324
  def check_mapping(profile_or_ce)
325
325
  raise ArgumentError, 'Argument must be a ComplianceEngine::Profile object' unless profile_or_ce.is_a?(ComplianceEngine::Profile) || profile_or_ce.is_a?(ComplianceEngine::Ce)
@@ -367,8 +367,8 @@ class ComplianceEngine::Data
367
367
 
368
368
  # Return true if the check is mapped to the profile or CE
369
369
  #
370
- # @param [ComplianceEngine::Check] check The check
371
- # @param [ComplianceEngine::Profile, ComplianceEngine::Ce] profile_or_ce The profile or CE
370
+ # @param check [ComplianceEngine::Check] The check
371
+ # @param profile_or_ce [ComplianceEngine::Profile, ComplianceEngine::Ce] The profile or CE
372
372
  # @return [TrueClass, FalseClass]
373
373
  def mapping?(check, profile_or_ce)
374
374
  raise ArgumentError, 'Argument must be a ComplianceEngine::Profile object' unless profile_or_ce.is_a?(ComplianceEngine::Profile) || profile_or_ce.is_a?(ComplianceEngine::Ce)
@@ -404,8 +404,8 @@ class ComplianceEngine::Data
404
404
 
405
405
  # Correlate between arrays and hashes
406
406
  #
407
- # @param [Array] a An array
408
- # @param [Hash] b A hash
407
+ # @param a [Array] An array
408
+ # @param b [Hash] A hash
409
409
  # @return [TrueClass, FalseClass]
410
410
  def correlate(a, b)
411
411
  return false if a.nil? || b.nil?
@@ -416,11 +416,4 @@ class ComplianceEngine::Data
416
416
 
417
417
  a.any? { |item| b[item] }
418
418
  end
419
-
420
- # Print debugging messages to the console.
421
- #
422
- # @param [String] msg The message to print
423
- def debug(msg)
424
- warn msg
425
- end
426
419
  end
@@ -7,9 +7,9 @@ require 'compliance_engine/data_loader'
7
7
  class ComplianceEngine::DataLoader::File < ComplianceEngine::DataLoader
8
8
  # Initialize a new instance of the ComplianceEngine::DataLoader::File class
9
9
  #
10
- # @param [String] file The path to the file to be loaded
11
- # @param [Class] fileclass The class to use for file operations, defaults to `::File`
12
- # @param [String] key The key to use for identifying the data, defaults to the file path
10
+ # @param file [String] The path to the file to be loaded
11
+ # @param fileclass [Class] The class to use for file operations, defaults to `::File`
12
+ # @param key [String] The key to use for identifying the data, defaults to the file path
13
13
  def initialize(file, fileclass: ::File, key: file)
14
14
  @fileclass = fileclass
15
15
  @filename = file
@@ -10,7 +10,7 @@ class ComplianceEngine::DataLoader
10
10
  # Initialize a new instance of the ComplianceEngine::DataLoader::File class
11
11
  #
12
12
  # @param value [Hash] The data to initialize the object with
13
- # @param [String] key The key to use for identifying the data
13
+ # @param key [String] The key to use for identifying the data
14
14
  def initialize(value = {}, key: nil)
15
15
  self.data = value
16
16
  @key = key
@@ -18,6 +18,7 @@ class ComplianceEngine::EnvironmentLoader
18
18
  .grep(%r{\A[a-z][a-z0-9_]*\Z})
19
19
  .select { |child| fileclass.directory?(File.join(path, child)) }
20
20
  .map { |child| File.join(path, child) }
21
+ .sort
21
22
  rescue
22
23
  []
23
24
  end
@@ -26,7 +26,7 @@ class ComplianceEngine::ModuleLoader
26
26
  @name = metadata.data['name']
27
27
  @version = metadata.data['version']
28
28
  rescue => e
29
- warn "Could not parse #{metadata_json}: #{e.message}"
29
+ ComplianceEngine.log.warn "Could not parse #{metadata_json}: #{e.message}"
30
30
  end
31
31
  end
32
32
 
@@ -37,7 +37,6 @@ class ComplianceEngine::ModuleLoader
37
37
  .map { |dir|
38
38
  ['yaml', 'json'].map { |type| File.join(path, dir, '**', "*.#{type}") }
39
39
  }.flatten
40
- # debug "Globs: #{globs}"
41
40
  # Using .each here to make mocking with rspec easier.
42
41
  globs.each do |glob|
43
42
  dirclass.glob(glob).each do |file|
@@ -53,7 +52,7 @@ class ComplianceEngine::ModuleLoader
53
52
  end
54
53
  @files << loader
55
54
  rescue => e
56
- warn "Could not load #{file}: #{e.message}"
55
+ ComplianceEngine.log.warn "Could not load #{file}: #{e.message}"
57
56
  end
58
57
  end
59
58
  end
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ComplianceEngine
4
- VERSION = '0.1.2'
4
+ VERSION = '0.1.3'
5
5
 
6
6
  # Handle supported compliance data versions
7
7
  class Version
8
8
  # Verify that the version is supported
9
9
  #
10
- # @param [String] version The version to verify
10
+ # @param version [String] The version to verify
11
11
  def initialize(version)
12
12
  raise 'Missing version' if version.nil?
13
13
  raise "Unsupported version '#{version}'" unless version == '2.0.0'
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'compliance_engine/version'
4
4
  require 'compliance_engine/data'
5
+ require 'logger'
5
6
 
6
7
  # Work with compliance data
7
8
  module ComplianceEngine
@@ -9,7 +10,7 @@ module ComplianceEngine
9
10
 
10
11
  # Open compliance data
11
12
  #
12
- # @param [Array<String>] paths The paths to the compliance data files
13
+ # @param paths [Array<String>] The paths to the compliance data files
13
14
  # @return [ComplianceEngine::Data]
14
15
  def self.open(*paths)
15
16
  Data.new(*paths)
@@ -17,9 +18,26 @@ module ComplianceEngine
17
18
 
18
19
  # Open compliance data
19
20
  #
20
- # @param [Array<String>] paths The paths to the compliance data files
21
+ # @param paths [Array<String>] The paths to the compliance data files
21
22
  # @return [ComplianceEngine::Data]
22
23
  def self.new(*paths)
23
24
  Data.new(*paths)
24
25
  end
26
+
27
+ # Get the logger
28
+ #
29
+ # @return [Logger]
30
+ def self.log
31
+ return @log unless @log.nil?
32
+
33
+ @log = Logger.new(STDERR)
34
+ @log.level = Logger::WARN
35
+ @log
36
+ end
37
+
38
+ # Set the logger
39
+ # @param logger [Logger] The logger to use
40
+ def self.log=(value)
41
+ @log = value
42
+ end
25
43
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: compliance_engine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steven Pritchard
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-12-04 00:00:00.000000000 Z
11
+ date: 2025-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: deep_merge
@@ -25,33 +25,47 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.2'
27
27
  - !ruby/object:Gem::Dependency
28
- name: thor
28
+ name: irb
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.3'
33
+ version: '1.14'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.3'
40
+ version: '1.14'
41
41
  - !ruby/object:Gem::Dependency
42
- name: irb
42
+ name: observer
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.14'
47
+ version: '0.1'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.14'
54
+ version: '0.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubyzip
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.3'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.3'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: semantic_puppet
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -67,20 +81,20 @@ dependencies:
67
81
  - !ruby/object:Gem::Version
68
82
  version: '1.1'
69
83
  - !ruby/object:Gem::Dependency
70
- name: rubyzip
84
+ name: thor
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: '2.3'
89
+ version: '1.3'
76
90
  type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: '2.3'
83
- description:
96
+ version: '1.3'
97
+ description:
84
98
  email:
85
99
  - steve@sicura.us
86
100
  executables:
@@ -120,9 +134,9 @@ licenses:
120
134
  metadata:
121
135
  homepage_uri: https://simp-project.com/docs/sce/
122
136
  source_code_uri: https://github.com/simp/rubygem-simp-compliance_engine
123
- changelog_uri: https://github.com/simp/rubygem-simp-compliance_engine/releases/tag/0.1.2
137
+ changelog_uri: https://github.com/simp/rubygem-simp-compliance_engine/releases/tag/0.1.3
124
138
  bug_tracker_uri: https://github.com/simp/rubygem-simp-compliance_engine/issues
125
- post_install_message:
139
+ post_install_message:
126
140
  rdoc_options: []
127
141
  require_paths:
128
142
  - lib
@@ -138,7 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
152
  version: '0'
139
153
  requirements: []
140
154
  rubygems_version: 3.1.6
141
- signing_key:
155
+ signing_key:
142
156
  specification_version: 4
143
157
  summary: Parser for Sicura Compliance Engine data
144
158
  test_files: []