Class: Inspec::Rule
- Inherits:
-
Object
- Object
- Inspec::Rule
- Includes:
- RSpec::Matchers
- Defined in:
- lib/inspec/rule.rb
Overview
rubocop:disable Metrics/ClassLength
Class Method Summary collapse
- .checks(rule) ⇒ Object
- .merge(dst, src) ⇒ Object
- .merge_count(rule) ⇒ Object
- .prepare_checks(rule) ⇒ Object
- .profile_id(rule) ⇒ Object
-
.resource_dsl ⇒ Object
rubocop:disable Style/TrivialAccessors.
- .rule_id(rule) ⇒ Object
- .set_rule_id(rule, value) ⇒ Object
- .set_skip_rule(rule, value) ⇒ Object
- .skip_status(rule) ⇒ Object
-
.with_resource_dsl(resource_dsl) ⇒ Object
Include any resources from the given resource DSL.
Instance Method Summary collapse
- #desc(v = nil) ⇒ Object
-
#describe(*values, &block) ⇒ nil|DescribeBase
Describe will add one or more tests to this control.
- #expect(value, &block) ⇒ Object
- #id(*_) ⇒ Object
- #impact(v = nil) ⇒ Object
-
#initialize(id, profile_id, _opts, &block) ⇒ Rule
constructor
A new instance of Rule.
-
#only_if ⇒ nil
Skip all checks if only_if is false.
- #ref(ref = nil, opts = {}) ⇒ Object
- #tag(*args) ⇒ Object
- #title(v = nil) ⇒ Object
- #to_s ⇒ Object
Constructor Details
#initialize(id, profile_id, _opts, &block) ⇒ Rule
Returns a new instance of Rule.
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/inspec/rule.rb', line 33 def initialize(id, profile_id, _opts, &block) @impact = nil @title = nil @desc = nil @refs = [] @tags = {} # not changeable by the user: @__block = block @__code = __get_block_source(&block) @__source_location = __get_block_source_location(&block) @__rule_id = id @__profile_id = profile_id @__checks = [] @__skip_rule = nil @__merge_count = 0 # evaluate the given definition instance_eval(&block) if block_given? end |
Class Method Details
.checks(rule) ⇒ Object
149 150 151 |
# File 'lib/inspec/rule.rb', line 149 def self.checks(rule) rule.instance_variable_get(:@__checks) end |
.merge(dst, src) ⇒ Object
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 |
# File 'lib/inspec/rule.rb', line 177 def self.merge(dst, src) if src.id != dst.id # TODO: register an error, this case should not happen return end sp = rule_id(src) dp = rule_id(dst) if sp != dp # TODO: register an error, this case should not happen return end # merge all fields dst.impact(src.impact) unless src.impact.nil? dst.title(src.title) unless src.title.nil? dst.desc(src.desc) unless src.desc.nil? # merge indirect fields # checks defined in the source will completely eliminate # all checks that were defined in the destination sc = checks(src) dst.instance_variable_set(:@__checks, sc) unless sc.empty? sr = skip_status(src) set_skip_rule(dst, sr) unless sr.nil? # increment merge count dst.instance_variable_set(:@__merge_count, merge_count(dst) + 1) end |
.merge_count(rule) ⇒ Object
161 162 163 |
# File 'lib/inspec/rule.rb', line 161 def self.merge_count(rule) rule.instance_variable_get(:@__merge_count) end |
.prepare_checks(rule) ⇒ Object
165 166 167 168 169 170 171 172 173 174 175 |
# File 'lib/inspec/rule.rb', line 165 def self.prepare_checks(rule) msg = skip_status(rule) return checks(rule) unless msg msg = 'Skipped control due to only_if condition.' if msg == true # TODO: we use os as the carrier here, but should consider # a separate resource to do skipping resource = rule.os resource.skip_resource(msg) [['describe', [resource], nil]] end |
.profile_id(rule) ⇒ Object
145 146 147 |
# File 'lib/inspec/rule.rb', line 145 def self.profile_id(rule) rule.instance_variable_get(:@__profile_id) end |
.resource_dsl ⇒ Object
rubocop:disable Style/TrivialAccessors
29 30 31 |
# File 'lib/inspec/rule.rb', line 29 def self.resource_dsl # rubocop:disable Style/TrivialAccessors @resource_dsl end |
.rule_id(rule) ⇒ Object
137 138 139 |
# File 'lib/inspec/rule.rb', line 137 def self.rule_id(rule) rule.instance_variable_get(:@__rule_id) end |
.set_rule_id(rule, value) ⇒ Object
141 142 143 |
# File 'lib/inspec/rule.rb', line 141 def self.set_rule_id(rule, value) rule.instance_variable_set(:@__rule_id, value) end |
.set_skip_rule(rule, value) ⇒ Object
157 158 159 |
# File 'lib/inspec/rule.rb', line 157 def self.set_skip_rule(rule, value) rule.instance_variable_set(:@__skip_rule, value) end |
.skip_status(rule) ⇒ Object
153 154 155 |
# File 'lib/inspec/rule.rb', line 153 def self.skip_status(rule) rule.instance_variable_get(:@__skip_rule) end |
.with_resource_dsl(resource_dsl) ⇒ Object
Include any resources from the given resource DSL. The passed resource_dsl will also be included in any Inspec::Expect objects we make.
23 24 25 26 27 |
# File 'lib/inspec/rule.rb', line 23 def self.with_resource_dsl(resource_dsl) include resource_dsl @resource_dsl = resource_dsl true end |
Instance Method Details
#desc(v = nil) ⇒ Object
73 74 75 76 |
# File 'lib/inspec/rule.rb', line 73 def desc(v = nil) @desc = unindent(v) unless v.nil? @desc end |
#describe(*values, &block) ⇒ nil|DescribeBase
Describe will add one or more tests to this control. There is 2 ways of calling it:
describe resource do ... end
or
describe.one do ... end
120 121 122 123 124 125 126 127 128 129 |
# File 'lib/inspec/rule.rb', line 120 def describe(*values, &block) if values.empty? && !block_given? dsl = self.class.ancestors[1] Class.new(DescribeBase) do include dsl end.new(method(:__add_check)) else __add_check('describe', values, with_dsl(block)) end end |
#expect(value, &block) ⇒ Object
131 132 133 134 135 |
# File 'lib/inspec/rule.rb', line 131 def expect(value, &block) target = Inspec::Expect.new(value, &with_dsl(block)) __add_check('expect', [value], target) target end |
#id(*_) ⇒ Object
58 59 60 61 |
# File 'lib/inspec/rule.rb', line 58 def id(*_) # never overwrite the ID @id end |
#impact(v = nil) ⇒ Object
63 64 65 66 |
# File 'lib/inspec/rule.rb', line 63 def impact(v = nil) @impact = v unless v.nil? @impact end |
#only_if ⇒ nil
Skip all checks if only_if is false
103 104 105 106 |
# File 'lib/inspec/rule.rb', line 103 def only_if return unless block_given? @__skip_rule ||= !yield end |
#ref(ref = nil, opts = {}) ⇒ Object
78 79 80 81 82 83 84 85 86 |
# File 'lib/inspec/rule.rb', line 78 def ref(ref = nil, opts = {}) return @refs if ref.nil? && opts.empty? if opts.empty? && ref.is_a?(Hash) opts = ref else opts[:ref] = ref end @refs.push(opts) end |
#tag(*args) ⇒ Object
88 89 90 91 92 93 94 95 96 97 |
# File 'lib/inspec/rule.rb', line 88 def tag(*args) args.each do |arg| if arg.is_a?(Hash) @tags.merge!(arg) else @tags[arg] ||= nil end end @tags end |
#title(v = nil) ⇒ Object
68 69 70 71 |
# File 'lib/inspec/rule.rb', line 68 def title(v = nil) @title = v unless v.nil? @title end |