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
- .rule_id(rule) ⇒ Object
- .set_rule_id(rule, value) ⇒ Object
- .set_skip_rule(rule, value) ⇒ Object
- .skip_status(rule) ⇒ Object
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.
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/inspec/rule.rb', line 15 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
131 132 133 |
# File 'lib/inspec/rule.rb', line 131 def self.checks(rule) rule.instance_variable_get(:@__checks) end |
.merge(dst, src) ⇒ Object
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
# File 'lib/inspec/rule.rb', line 159 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
143 144 145 |
# File 'lib/inspec/rule.rb', line 143 def self.merge_count(rule) rule.instance_variable_get(:@__merge_count) end |
.prepare_checks(rule) ⇒ Object
147 148 149 150 151 152 153 154 155 156 157 |
# File 'lib/inspec/rule.rb', line 147 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
127 128 129 |
# File 'lib/inspec/rule.rb', line 127 def self.profile_id(rule) rule.instance_variable_get(:@__profile_id) end |
.rule_id(rule) ⇒ Object
119 120 121 |
# File 'lib/inspec/rule.rb', line 119 def self.rule_id(rule) rule.instance_variable_get(:@__rule_id) end |
.set_rule_id(rule, value) ⇒ Object
123 124 125 |
# File 'lib/inspec/rule.rb', line 123 def self.set_rule_id(rule, value) rule.instance_variable_set(:@__rule_id, value) end |
.set_skip_rule(rule, value) ⇒ Object
139 140 141 |
# File 'lib/inspec/rule.rb', line 139 def self.set_skip_rule(rule, value) rule.instance_variable_set(:@__skip_rule, value) end |
.skip_status(rule) ⇒ Object
135 136 137 |
# File 'lib/inspec/rule.rb', line 135 def self.skip_status(rule) rule.instance_variable_get(:@__skip_rule) end |
Instance Method Details
#desc(v = nil) ⇒ Object
55 56 57 58 |
# File 'lib/inspec/rule.rb', line 55 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
102 103 104 105 106 107 108 109 110 111 |
# File 'lib/inspec/rule.rb', line 102 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, block) end end |
#expect(value, &block) ⇒ Object
113 114 115 116 117 |
# File 'lib/inspec/rule.rb', line 113 def expect(value, &block) target = Inspec::Expect.new(value, &block) __add_check('expect', [value], target) target end |
#id(*_) ⇒ Object
40 41 42 43 |
# File 'lib/inspec/rule.rb', line 40 def id(*_) # never overwrite the ID @id end |
#impact(v = nil) ⇒ Object
45 46 47 48 |
# File 'lib/inspec/rule.rb', line 45 def impact(v = nil) @impact = v unless v.nil? @impact end |
#only_if ⇒ nil
Skip all checks if only_if is false
85 86 87 88 |
# File 'lib/inspec/rule.rb', line 85 def only_if return unless block_given? @__skip_rule ||= !yield end |
#ref(ref = nil, opts = {}) ⇒ Object
60 61 62 63 64 65 66 67 68 |
# File 'lib/inspec/rule.rb', line 60 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
70 71 72 73 74 75 76 77 78 79 |
# File 'lib/inspec/rule.rb', line 70 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
50 51 52 53 |
# File 'lib/inspec/rule.rb', line 50 def title(v = nil) @title = v unless v.nil? @title end |