compliance_engine 0.3.0 → 0.4.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: ca4c111afd1a2840ec2a266bea8e12f195a9cc8c262eef7676280382b63868b5
4
- data.tar.gz: a59bc32c198332f65882d2a3950cfa2a89c8f48d0da58bf93d77d9e2cc555427
3
+ metadata.gz: f5129c30257114df1399ae314ff6a0fb5d383de5bd4782b8b31dc060ea274870
4
+ data.tar.gz: 8dfaa1d2feaf1a43ea6551851eac5a586f2d4e2b4148efcd14cad21c32c93cba
5
5
  SHA512:
6
- metadata.gz: 6503e8068deaec3d98bb6783689ae599fa149b3fe2299f1e101ca23f46488db680f4685f36a7670f68c3480977ce9ed539c96d0bb5b6df0f952ea5267d3ed935
7
- data.tar.gz: 0a0afadab618fa6d86fece7ebb270342e59b788d84b8e321f97c053758a8d0e2b7e68127ccaf4228e2ba65978566fd6ff3bec05b137f829e58ebfc15314b937e
6
+ metadata.gz: b4839e2648adfc6c1ea91d16c45a5494a6ad4da6521d816e16b9d0b3127b80d696d6f0cbb5249294cf6e0f21177809fbe9b8efd6c3665e3aae1bee6a02570134
7
+ data.tar.gz: 68a0a04f93e3c007eec4287a92d6d19ace0ba37e9a739200474802ef28c6cb24b01257cec5e23f8b8e2cb8f29cf397641ac1e2fc5a1c117ca1db43f1932c2c3d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ### 0.4.0 / 2026-04-20
2
+ * Route Puppet Hiera backend log messages through Puppet's logging system (#96)
3
+ * Fix JRuby compatibility: convert internal requires to require_relative so the library loads correctly inside Puppet Server / OpenVox Server when installed as a Puppet module rather than a standalone gem
4
+ * Replace PDK with puppet-modulebuilder for Puppet Forge builds
5
+ * Add Beaker acceptance test suite covering puppet apply, server/agent, cache leakage, and environment leakage scenarios
6
+
1
7
  ### 0.3.0 / 2026-03-19
2
8
  * Hash-like Collection methods return Collection objects (#37)
3
9
 
@@ -25,7 +25,7 @@ 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 'irb', '~> 1.14'
28
+ spec.add_dependency 'irb', '~> 1.14' unless RUBY_PLATFORM == 'java'
29
29
  spec.add_dependency 'logger', '~> 1.4'
30
30
  spec.add_dependency 'observer', '~> 0.1'
31
31
  spec.add_dependency 'rubyzip', '>= 2.3', '< 4'
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
3
+ require_relative '../compliance_engine'
4
4
 
5
5
  # A compliance engine data CE
6
6
  class ComplianceEngine::Ce < ComplianceEngine::Component
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
3
+ require_relative '../compliance_engine'
4
4
 
5
5
  # A collection of compliance engine data CEs
6
6
  class ComplianceEngine::Ces < ComplianceEngine::Collection
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
3
+ require_relative '../compliance_engine'
4
4
 
5
5
  # A compliance engine data check
6
6
  class ComplianceEngine::Check < ComplianceEngine::Component
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
3
+ require_relative '../compliance_engine'
4
4
 
5
5
  # A collection of compliance engine data checks
6
6
  class ComplianceEngine::Checks < ComplianceEngine::Collection
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
3
+ require_relative '../compliance_engine'
4
4
  require 'thor'
5
5
 
6
6
  # Compliance Engine CLI
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
3
+ require_relative '../compliance_engine'
4
4
 
5
5
  # A generic compliance engine data collection
6
6
  class ComplianceEngine::Collection
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
3
+ require_relative '../compliance_engine'
4
4
  require 'deep_merge'
5
5
 
6
6
  # A generic compliance engine data component
@@ -216,14 +216,14 @@ class ComplianceEngine::Component
216
216
 
217
217
  if fragment['remediation'].key?('disabled')
218
218
  message = "Remediation disabled for #{fragment}"
219
- reason = fragment['remediation']['disabled']&.map { |value| value['reason'] }&.reject(&:nil?)&.join("\n")
219
+ reason = fragment['remediation']['disabled']&.map { |value| value['reason'] }&.compact&.join("\n")
220
220
  message += "\n#{reason}" unless reason.nil?
221
221
  ComplianceEngine.log.info message
222
222
  return true
223
223
  end
224
224
 
225
225
  if fragment['remediation'].key?('risk')
226
- risk_level = fragment['remediation']['risk']&.map { |value| value['level'] }&.select { |value| value.is_a?(Integer) }&.max
226
+ risk_level = fragment['remediation']['risk']&.map { |value| value['level'] }&.grep(Integer)&.max
227
227
  if risk_level.is_a?(Integer) && risk_level >= enforcement_tolerance
228
228
  ComplianceEngine.log.info "Remediation risk #{risk_level} exceeds enforcement enforcement_tolerance #{enforcement_tolerance} for #{fragment}"
229
229
  return true
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
3
+ require_relative '../compliance_engine'
4
4
 
5
5
  # A compliance engine data control
6
6
  class ComplianceEngine::Control < ComplianceEngine::Component
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
3
+ require_relative '../compliance_engine'
4
4
 
5
5
  # A collection of compliance engine data controls
6
6
  class ComplianceEngine::Controls < ComplianceEngine::Collection
@@ -1,23 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
4
- require 'compliance_engine/version'
5
- require 'compliance_engine/component'
6
- require 'compliance_engine/ce'
7
- require 'compliance_engine/check'
8
- require 'compliance_engine/control'
9
- require 'compliance_engine/profile'
10
- require 'compliance_engine/collection'
11
- require 'compliance_engine/ces'
12
- require 'compliance_engine/checks'
13
- require 'compliance_engine/controls'
14
- require 'compliance_engine/profiles'
15
-
16
- require 'compliance_engine/data_loader'
17
- require 'compliance_engine/data_loader/json'
18
- require 'compliance_engine/data_loader/yaml'
19
- require 'compliance_engine/module_loader'
20
- require 'compliance_engine/environment_loader'
3
+ require_relative '../compliance_engine'
4
+ require_relative 'version'
5
+ require_relative 'component'
6
+ require_relative 'ce'
7
+ require_relative 'check'
8
+ require_relative 'control'
9
+ require_relative 'profile'
10
+ require_relative 'collection'
11
+ require_relative 'ces'
12
+ require_relative 'checks'
13
+ require_relative 'controls'
14
+ require_relative 'profiles'
15
+
16
+ require_relative 'data_loader'
17
+ require_relative 'data_loader/json'
18
+ require_relative 'data_loader/yaml'
19
+ require_relative 'module_loader'
20
+ require_relative 'environment_loader'
21
21
 
22
22
  require 'deep_merge'
23
23
  require 'json'
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
4
- require 'compliance_engine/data_loader'
3
+ require_relative '../../compliance_engine'
4
+ require_relative '../data_loader'
5
5
 
6
6
  # Load compliance engine data from a file
7
7
  class ComplianceEngine::DataLoader::File < ComplianceEngine::DataLoader
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
4
- require 'compliance_engine/data_loader/file'
3
+ require_relative '../../compliance_engine'
4
+ require_relative 'file'
5
5
 
6
6
  require 'json'
7
7
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
4
- require 'compliance_engine/data_loader/file'
3
+ require_relative '../../compliance_engine'
4
+ require_relative 'file'
5
5
 
6
6
  require 'yaml'
7
7
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
3
+ require_relative '../compliance_engine'
4
4
  require 'observer'
5
5
 
6
6
  # Load compliance engine data
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
4
- require 'compliance_engine/environment_loader'
3
+ require_relative '../../compliance_engine'
4
+ require_relative '../environment_loader'
5
5
  require 'zip/filesystem'
6
6
 
7
7
  # Load compliance engine data from a zip file containing a Puppet environment
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
4
- require 'compliance_engine/module_loader'
3
+ require_relative '../compliance_engine'
4
+ require_relative 'module_loader'
5
5
 
6
6
  # Load compliance engine data from a Puppet environment
7
7
  class ComplianceEngine::EnvironmentLoader
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
4
- require 'compliance_engine/data_loader/json'
5
- require 'compliance_engine/data_loader/yaml'
3
+ require_relative '../compliance_engine'
4
+ require_relative 'data_loader/json'
5
+ require_relative 'data_loader/yaml'
6
6
 
7
7
  # Load compliance engine data from a Puppet module
8
8
  class ComplianceEngine::ModuleLoader
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
3
+ require_relative '../compliance_engine'
4
4
 
5
5
  # A compliance engine data profile
6
6
  class ComplianceEngine::Profile < ComplianceEngine::Component
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine'
3
+ require_relative '../compliance_engine'
4
4
 
5
5
  # A collection of compliance engine data profiles
6
6
  class ComplianceEngine::Profiles < ComplianceEngine::Collection
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ComplianceEngine
4
+ # Routes ComplianceEngine log messages through Puppet's logging system.
5
+ # Used as a drop-in replacement for the default Logger when running inside Puppet.
6
+ class PuppetLogger
7
+ def initialize(*_args, **_kwargs)
8
+ ensure_puppet_available!
9
+ end
10
+
11
+ def debug(msg)
12
+ ensure_puppet_available!
13
+ ::Puppet.debug(msg)
14
+ end
15
+
16
+ def info(msg)
17
+ ensure_puppet_available!
18
+ ::Puppet.info(msg)
19
+ end
20
+
21
+ def warn(msg)
22
+ ensure_puppet_available!
23
+ ::Puppet.warning(msg)
24
+ end
25
+
26
+ def error(msg)
27
+ ensure_puppet_available!
28
+ ::Puppet.err(msg)
29
+ end
30
+
31
+ def fatal(msg)
32
+ ensure_puppet_available!
33
+ ::Puppet.crit(msg)
34
+ end
35
+
36
+ def level; end
37
+
38
+ def level=(_val); end
39
+
40
+ private
41
+
42
+ def ensure_puppet_available!
43
+ return if defined?(::Puppet)
44
+
45
+ raise ComplianceEngine::Error,
46
+ 'ComplianceEngine::PuppetLogger requires Puppet to be loaded, but ::Puppet is not defined'
47
+ end
48
+ end
49
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ComplianceEngine
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
 
6
6
  # Handle supported compliance data versions
7
7
  class Version
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'compliance_engine/version'
4
- require 'compliance_engine/data'
3
+ require_relative 'compliance_engine/version'
4
+ require_relative 'compliance_engine/data'
5
5
  require 'logger'
6
6
 
7
7
  # Work with compliance data
@@ -26,7 +26,7 @@ module ComplianceEngine
26
26
 
27
27
  # Get the logger
28
28
  #
29
- # @return [Logger]
29
+ # @return [Logger, ComplianceEngine::PuppetLogger]
30
30
  def self.log
31
31
  return @log unless @log.nil?
32
32
 
@@ -36,8 +36,20 @@ module ComplianceEngine
36
36
  end
37
37
 
38
38
  # Set the logger
39
- # @param logger [Logger] The logger to use
39
+ #
40
+ # @param value [Logger, ComplianceEngine::PuppetLogger] The logger to use
40
41
  def self.log=(value)
41
42
  @log = value
42
43
  end
44
+
45
+ # Install a PuppetLogger unless a logger has already been explicitly configured.
46
+ # Extracted so the behaviour can be unit-tested without reloading enforcement.rb.
47
+ #
48
+ # @return [void]
49
+ def self.install_puppet_logger
50
+ return unless @log.nil?
51
+
52
+ require_relative 'compliance_engine/puppet_logger'
53
+ @log = PuppetLogger.new
54
+ end
43
55
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: compliance_engine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steven Pritchard
@@ -147,6 +147,7 @@ files:
147
147
  - lib/compliance_engine/module_loader.rb
148
148
  - lib/compliance_engine/profile.rb
149
149
  - lib/compliance_engine/profiles.rb
150
+ - lib/compliance_engine/puppet_logger.rb
150
151
  - lib/compliance_engine/version.rb
151
152
  homepage: https://simp-project.com/docs/sce/
152
153
  licenses:
@@ -154,7 +155,7 @@ licenses:
154
155
  metadata:
155
156
  homepage_uri: https://simp-project.com/docs/sce/
156
157
  source_code_uri: https://github.com/simp/rubygem-simp-compliance_engine
157
- changelog_uri: https://github.com/simp/rubygem-simp-compliance_engine/releases/tag/0.3.0
158
+ changelog_uri: https://github.com/simp/rubygem-simp-compliance_engine/releases/tag/0.4.0
158
159
  bug_tracker_uri: https://github.com/simp/rubygem-simp-compliance_engine/issues
159
160
  rdoc_options: []
160
161
  require_paths: