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 +4 -4
- data/CHANGELOG.md +5 -0
- data/compliance_engine.gemspec +3 -2
- data/lib/compliance_engine/cli.rb +10 -1
- data/lib/compliance_engine/component.rb +11 -11
- data/lib/compliance_engine/data.rb +29 -36
- data/lib/compliance_engine/data_loader/file.rb +3 -3
- data/lib/compliance_engine/data_loader.rb +1 -1
- data/lib/compliance_engine/environment_loader.rb +1 -0
- data/lib/compliance_engine/module_loader.rb +2 -3
- data/lib/compliance_engine/version.rb +2 -2
- data/lib/compliance_engine.rb +20 -2
- metadata +30 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 44cfaff67ac82f027fdab7db4b4b66b268ded7849821d8b9a8593caa6e3c7d67
|
4
|
+
data.tar.gz: c4992a17de18bd49ebbe72e9bec2f56598460e4e20aeb04b50386bf014af8283
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce7186407c8ab23404b1b1a075509df73c6ba026587c901d14c8849c1c4f6490a88a7f89a4a575e327f276f39b97ce2ca10fb107fdcb275f1affeac0bf884fbf
|
7
|
+
data.tar.gz: 5ed4621f0623213d00987271328f15177157249e563bc7c0036b6009c339b6579aba8e65971a9a0d9e22020b4af31a31ac4abd92305598a532133b92c6aa51cb
|
data/CHANGELOG.md
CHANGED
data/compliance_engine.gemspec
CHANGED
@@ -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 '
|
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
|
-
|
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]
|
11
|
-
# @param [ComplianceEngine::Data, ComplianceEngine::Collection, NilClass]
|
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]
|
128
|
-
# @param [Object]
|
129
|
-
# @param [Integer]
|
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]
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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 =
|
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>]
|
28
|
-
# @param [Hash]
|
29
|
-
# @param [Integer]
|
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]
|
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]
|
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]
|
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]
|
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>]
|
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]
|
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>]
|
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>]
|
114
|
-
# @param [Class]
|
115
|
-
# @param [Class]
|
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]
|
166
|
-
# @param [String]
|
167
|
-
# @param [Class]
|
168
|
-
# @param [Integer]
|
169
|
-
# @param [Time]
|
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
|
-
|
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]
|
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 =
|
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>]
|
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
|
-
|
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 =
|
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]
|
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]
|
371
|
-
# @param [ComplianceEngine::Profile, ComplianceEngine::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]
|
408
|
-
# @param [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]
|
11
|
-
# @param [Class]
|
12
|
-
# @param [String]
|
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]
|
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
|
@@ -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.
|
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]
|
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'
|
data/lib/compliance_engine.rb
CHANGED
@@ -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>]
|
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>]
|
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.
|
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:
|
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:
|
28
|
+
name: irb
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
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.
|
40
|
+
version: '1.14'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: observer
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '1
|
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
|
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:
|
84
|
+
name: thor
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
87
|
- - "~>"
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
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: '
|
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.
|
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: []
|