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
- #source_file ⇒ 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.
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/inspec/rule.rb', line 32 def initialize(id, profile_id, _opts, &block) @impact = nil @title = nil @desc = nil @refs = [] @tags = {} # not changeable by the user: @__block = 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
151 152 153 |
# File 'lib/inspec/rule.rb', line 151 def self.checks(rule) rule.instance_variable_get(:@__checks) end |
.merge(dst, src) ⇒ Object
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 |
# File 'lib/inspec/rule.rb', line 179 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
163 164 165 |
# File 'lib/inspec/rule.rb', line 163 def self.merge_count(rule) rule.instance_variable_get(:@__merge_count) end |
.prepare_checks(rule) ⇒ Object
167 168 169 170 171 172 173 174 175 176 177 |
# File 'lib/inspec/rule.rb', line 167 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
147 148 149 |
# File 'lib/inspec/rule.rb', line 147 def self.profile_id(rule) rule.instance_variable_get(:@__profile_id) end |
.resource_dsl ⇒ Object
rubocop:disable Style/TrivialAccessors
28 29 30 |
# File 'lib/inspec/rule.rb', line 28 def self.resource_dsl # rubocop:disable Style/TrivialAccessors @resource_dsl end |
.rule_id(rule) ⇒ Object
139 140 141 |
# File 'lib/inspec/rule.rb', line 139 def self.rule_id(rule) rule.instance_variable_get(:@__rule_id) end |
.set_rule_id(rule, value) ⇒ Object
143 144 145 |
# File 'lib/inspec/rule.rb', line 143 def self.set_rule_id(rule, value) rule.instance_variable_set(:@__rule_id, value) end |
.set_skip_rule(rule, value) ⇒ Object
159 160 161 |
# File 'lib/inspec/rule.rb', line 159 def self.set_skip_rule(rule, value) rule.instance_variable_set(:@__skip_rule, value) end |
.skip_status(rule) ⇒ Object
155 156 157 |
# File 'lib/inspec/rule.rb', line 155 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.
22 23 24 25 26 |
# File 'lib/inspec/rule.rb', line 22 def self.with_resource_dsl(resource_dsl) include resource_dsl @resource_dsl = resource_dsl true end |
Instance Method Details
#desc(v = nil) ⇒ Object
71 72 73 74 |
# File 'lib/inspec/rule.rb', line 71 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
122 123 124 125 126 127 128 129 130 131 |
# File 'lib/inspec/rule.rb', line 122 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
133 134 135 136 137 |
# File 'lib/inspec/rule.rb', line 133 def expect(value, &block) target = Inspec::Expect.new(value, &with_dsl(block)) __add_check('expect', [value], target) target end |
#id(*_) ⇒ Object
56 57 58 59 |
# File 'lib/inspec/rule.rb', line 56 def id(*_) # never overwrite the ID @id end |
#impact(v = nil) ⇒ Object
61 62 63 64 |
# File 'lib/inspec/rule.rb', line 61 def impact(v = nil) @impact = v unless v.nil? @impact end |
#only_if ⇒ nil
Skip all checks if only_if is false
105 106 107 108 |
# File 'lib/inspec/rule.rb', line 105 def only_if return unless block_given? @__skip_rule ||= !yield end |
#ref(ref = nil, opts = {}) ⇒ Object
76 77 78 79 80 81 82 83 84 |
# File 'lib/inspec/rule.rb', line 76 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 |
#source_file ⇒ Object
97 98 99 |
# File 'lib/inspec/rule.rb', line 97 def source_file @__file end |
#tag(*args) ⇒ Object
86 87 88 89 90 91 92 93 94 95 |
# File 'lib/inspec/rule.rb', line 86 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
66 67 68 69 |
# File 'lib/inspec/rule.rb', line 66 def title(v = nil) @title = v unless v.nil? @title end |