chef-attribute-validator 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MGNhOTQ2Yzg2ZmNjODk4M2I3ZjAzM2U2YjAzNTgxMTExYmY0MGY0YQ==
4
+ NzA5OGRmZWY5NTA2YmRiMjkyNTFjOTY1ZDY2MzUzZjA0M2E1YzI5Mg==
5
5
  data.tar.gz: !binary |-
6
- MmRkZmM4Y2NmYWJhNzNmMzM2OGU1Mzc4MTU3M2ZkOTMzMGEwNDc3Yg==
6
+ ZTkwOGY2NDJhZmEwNTljMGZkM2VhMjE5ZTM3NzJhOWQ0NzcyMTNhMw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NDJkYWMxZDI4YzdhMWY2ZTVhYWRjMjU1YTg5ZmYyMTQwNjRkZjkwMGIzMTBl
10
- Y2VlMjgzNmM5OTVjMDM1N2I3YTU1Y2Y2OGRkZGRkOWE3NWVjYjg4ZGE5ODc5
11
- OTU2ZTk2MGU2NWVkZTVlMTRmY2MxOTVlZmVkZmUxNDEzZDViOGM=
9
+ ZDIyYzhmODk5Mzg2YTg0ZDgxZWRkYTgxZjE3NzllZTAzYWE2NmUyYmJiODQ4
10
+ ZTZlZGUxMmRmZDI0YTZjMmE5NjFlOWI2Mzk4ODcyNWMwNTU5NGRkODQ0YWZh
11
+ YTUyOWRiYzg5MDdiMzU5MWRhNGYxYjY5N2Y2YTk4OTljMDdlOWI=
12
12
  data.tar.gz: !binary |-
13
- ZjZjNzQ5Nzc5YjdmM2I3OTBiNzI0NDQ4NDM1Y2RiYzk3ZjAzYzg1MzQ5NGVh
14
- NjExYmM5ZmNlOWEzODNiYjIwNzgyYjVmOWMyYzE1YmI2NjY2ODJkMjE4YzE3
15
- OTczMjBjOGFiNDM2YTQ1NWY4ODhhYWFiMTg4ZDkzZDBjYjA0NmE=
13
+ ZGVkZmM2YzhlZDYyYmRmNmIzYjgzZmYyMWU3ZjA5MjY4ZmQwMmQ2NWM3Nzk3
14
+ MTIwNTE2NjhlNzEzODdjNzExYzQxNTRhZTY3NWU3MTA0OWNkZTNiOGVlZjJj
15
+ M2VlNzQxNjAyYWQxOGMyZWYwMzgyOTY2ODIwMmMyYTZhN2VjMzc=
data/CHANGES CHANGED
@@ -1,3 +1,6 @@
1
+ 2014-05-21 Clinton Wolfe 0.7.0
2
+ Added 'child_keys' check type
3
+
1
4
  2014-05-20 Clinton Wolfe 0.6.1
2
5
  Fixed issue #6, inconsistent behavior for 'enum' and 'type' checks when a attr has a nil value
3
6
  Fixed issue #5, pathfinder breaking when given a path containing a stringified integer and no wildcards
data/README.md CHANGED
@@ -50,7 +50,16 @@ Each rule gets a unique name. Each entry is hash structure with the following k
50
50
  The remaining entries describe criteria to enforce on the value of the attribute(s)
51
51
  referenced by 'path'. You may list zero or more.
52
52
 
53
- Note that nil is permitted as a value by all checks, except the 'required' check (which performs nilness checks) and the 'proc' check (which implements arbitrary user behavior).
53
+ Note that nil is permitted as a value by most checks, except the following:
54
+
55
+ 'required' check (which performs nilness checks)
56
+ 'proc' check (which implements arbitrary user behavior)
57
+ 'min_children', 'max_children' (which are restricted to operating on Hashes and Arrays)
58
+ 'child_keys' (which is restricted to operating on Hashes)
59
+
60
+ #### child_keys
61
+
62
+ Checks the immediate keys of the given path (which must be a Hash). Check argument may be an Array of Strings, in which case each key that is present must be in the list of valid keys, or else a Regexp, which will be matched against each key.
54
63
 
55
64
  #### type
56
65
 
@@ -78,7 +87,7 @@ Boolean. If true, fails if the path matches zero attributes, or the value is ni
78
87
 
79
88
  #### looks_like
80
89
 
81
- String, one of 'email', 'guid', 'ip', 'url'. Applies canned regexes (or more sophisticated matchers, like constructing objects from the stdlib). Details:
90
+ String, one of 'email', 'guid', 'hostname', 'ip', 'url'. Applies canned regexes (or more sophisticated matchers, like constructing objects from the stdlib). Details:
82
91
 
83
92
  ##### email
84
93
 
@@ -134,7 +143,7 @@ Possibly eventually support for [<charclass>], or {<alternatives>}.
134
143
 
135
144
  #### Planned checks:
136
145
 
137
- name_regex - Regexp. Applies given regex to the last element in the attribute path ('basename', if you will)
146
+ Perhaps a hostname:port looks_like?
138
147
 
139
148
  ### Bugs and Defects
140
149
 
@@ -0,0 +1,46 @@
1
+ class Chef
2
+ class Attribute
3
+ class Validator
4
+ class Check
5
+ class ChildKeys < Check
6
+
7
+ register_check('child_keys', ChildKeys)
8
+
9
+ def validate_check_arg
10
+ if check_arg.kind_of?(Array)
11
+ unless check_arg.all? { |e| e.kind_of?(String) }
12
+ raise "Bad 'child_keys' check argument '#{check_arg}' for rule '#{rule_name}' - expected a Regexp or an Array of Strings."
13
+ end
14
+ elsif ! check_arg.kind_of?(Regexp)
15
+ raise "Bad 'child_keys' check argument '#{check_arg}' for rule '#{rule_name}' - expected a Regexp or an Array of Strings."
16
+ end
17
+ end
18
+
19
+ def check(attrset)
20
+ violations = []
21
+ attrset.each do |path, value|
22
+ # Must be hashlike
23
+ if [ Mash, Hash ].any? { |k| value.kind_of?(k) }
24
+ value.keys.each do |key|
25
+ if check_arg.kind_of?(Array)
26
+ unless check_arg.include?(key)
27
+ violations.push Chef::Attribute::Validator::Violation.new(rule_name, path + '/' + key, "Child Key #{key} must be one of #{check_arg.join(', ')}.")
28
+ end
29
+ elsif check_arg.kind_of?(Regexp)
30
+ unless check_arg.match(key)
31
+ violations.push Chef::Attribute::Validator::Violation.new(rule_name, path + '/' + key, "Child Key #{key} does not match regex '#{check_arg}'")
32
+ end
33
+ end
34
+ end
35
+ else
36
+ violations.push Chef::Attribute::Validator::Violation.new(rule_name, path, "Attribute's value is '#{value}', but must be a Hash-like thing to use child_keys")
37
+ end
38
+ end
39
+ violations
40
+ end
41
+
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,7 +1,7 @@
1
1
  class Chef
2
2
  class Attribute
3
3
  class Validator
4
- VERSION = "0.6.1"
4
+ VERSION = "0.7.0"
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,6 @@
1
+ rules = default['attribute-validator']['rules']
2
+ rules['check-child-keys-arg-array'] = {
3
+ 'path' => '/nil',
4
+ 'child_keys' => ['thing','thang','thung']
5
+ }
6
+
@@ -0,0 +1,6 @@
1
+ rules = default['attribute-validator']['rules']
2
+ rules['check-child-keys-arg-literal-regex'] = {
3
+ 'path' => '/nil',
4
+ 'child_keys' => /^$/,
5
+ }
6
+
@@ -0,0 +1,6 @@
1
+ rules = default['attribute-validator']['rules']
2
+ rules['check-child-keys-arg-nil'] = {
3
+ 'path' => '/nil',
4
+ 'child_keys' => nil,
5
+ }
6
+
@@ -0,0 +1,6 @@
1
+ rules = default['attribute-validator']['rules']
2
+ rules['check-child-keys-arg-regexp-object'] = {
3
+ 'path' => '/nil',
4
+ 'child_keys' => Regexp.new('foo')
5
+ }
6
+
@@ -0,0 +1,6 @@
1
+ rules = default['attribute-validator']['rules']
2
+ rules['check-child-keys-arg-string'] = {
3
+ 'path' => '/nil',
4
+ 'child_keys' => 'thing',
5
+ }
6
+
@@ -0,0 +1,90 @@
1
+ default['nil'] = nil
2
+ default['scalar'] = 'thing'
3
+ default['array'] = [ 1, 2, 3 ]
4
+ default['empty-hash'] = {}
5
+ default['three']['foo'] = 1
6
+ default['three']['oofoo'] = 2
7
+ default['three']['foof'] = 3
8
+ default['two']['foo'] = 1
9
+ default['two']['goof'] = 1
10
+
11
+ default['foo']['foo'] = 1
12
+ default['bar']['bar'] = 1
13
+ default['barfoo']['bar'] = 1
14
+ default['barfoo']['foo'] = 1
15
+ default['foobarbaz']['foo'] = 1
16
+ default['foobarbaz']['bar'] = 1
17
+ default['foobarbaz']['baz'] = 1
18
+ default['baz']['baz'] = 1
19
+
20
+ rules = default['attribute-validator']['rules']
21
+ rules['re-foo-nil'] = {
22
+ 'path' => '/nil',
23
+ 'child_keys' => /foo/,
24
+ }
25
+ rules['re-foo-scalar'] = {
26
+ 'path' => '/scalar',
27
+ 'child_keys' => /foo/,
28
+ }
29
+ rules['re-foo-array'] = {
30
+ 'path' => '/array',
31
+ 'child_keys' => /foo/,
32
+ }
33
+ rules['re-foo-empty-hash'] = {
34
+ 'path' => '/empty-hash',
35
+ 'child_keys' => /foo/,
36
+ }
37
+ rules['re-foo-three'] = {
38
+ 'path' => '/three',
39
+ 'child_keys' => /foo/,
40
+ }
41
+ rules['re-foo-two'] = {
42
+ 'path' => '/two',
43
+ 'child_keys' => /foo/,
44
+ }
45
+
46
+
47
+
48
+ rules['ar-foo-nil'] = {
49
+ 'path' => '/nil',
50
+ 'child_keys' => ['foo', 'bar'],
51
+ }
52
+ rules['ar-foo-scalar'] = {
53
+ 'path' => '/scalar',
54
+ 'child_keys' => ['foo', 'bar'],
55
+ }
56
+ rules['ar-foo-array'] = {
57
+ 'path' => '/array',
58
+ 'child_keys' => ['foo', 'bar'],
59
+ }
60
+ rules['ar-foo-empty-hash'] = {
61
+ 'path' => '/empty-hash',
62
+ 'child_keys' => ['foo', 'bar'],
63
+ }
64
+ rules['ar-foo-foo'] = {
65
+ 'path' => '/foo',
66
+ 'child_keys' => ['foo', 'bar'],
67
+ }
68
+ rules['ar-foo-bar'] = {
69
+ 'path' => '/bar',
70
+ 'child_keys' => ['foo', 'bar'],
71
+ }
72
+ rules['ar-foo-barfoo'] = {
73
+ 'path' => '/barfoo',
74
+ 'child_keys' => ['foo', 'bar'],
75
+ }
76
+ rules['ar-foo-foobarbaz'] = {
77
+ 'path' => '/foobarbaz',
78
+ 'child_keys' => ['foo', 'bar'],
79
+ }
80
+ rules['ar-foo-baz'] = {
81
+ 'path' => '/baz',
82
+ 'child_keys' => ['foo', 'bar'],
83
+ }
84
+
85
+
86
+
87
+
88
+
89
+
90
+
@@ -0,0 +1,109 @@
1
+ require_relative './spec_helper'
2
+
3
+ # Verify that the 'child_keys' check works correctly
4
+
5
+ describe "'child_keys' check" do
6
+
7
+ describe "check registry" do
8
+ it "should be present in the Check registry" do
9
+ expect(Chef::Attribute::Validator::Check.list_check_types).to include('child_keys')
10
+ end
11
+ end
12
+
13
+ describe "check_arg checks" do
14
+ it "should accept a // literal regex" do
15
+ node = CAVHelper.load_fixture_attributes('check_child_keys_arg_literal_regex')
16
+ expect { Chef::Attribute::Validator.new(node) }.not_to raise_error
17
+ end
18
+ it "should accept a Regexp object" do
19
+ node = CAVHelper.load_fixture_attributes('check_child_keys_arg_regexp_object')
20
+ expect { Chef::Attribute::Validator.new(node) }.not_to raise_error
21
+ end
22
+ it "should accept an Array of Strings" do
23
+ node = CAVHelper.load_fixture_attributes('check_child_keys_arg_array')
24
+ expect { Chef::Attribute::Validator.new(node) }.not_to raise_error
25
+ end
26
+ it "should reject a string" do
27
+ node = CAVHelper.load_fixture_attributes('check_child_keys_arg_string')
28
+ expect { Chef::Attribute::Validator.new(node) }.to raise_error
29
+ end
30
+ it "should reject a nil regex" do
31
+ node = CAVHelper.load_fixture_attributes('check_child_keys_arg_nil')
32
+ expect { Chef::Attribute::Validator.new(node) }.to raise_error
33
+ end
34
+ end
35
+
36
+ describe "assorted regexes" do
37
+ let(:node) { CAVHelper.load_fixture_attributes('check_child_keys_assorted') }
38
+ let(:av) { Chef::Attribute::Validator.new(node) }
39
+
40
+ # Must be a hash to have keys - empty hash OK
41
+ it "/foo/ should violate on nil" do
42
+ expect(av.validate_rule('re-foo-nil')).not_to be_empty
43
+ end
44
+
45
+ it "/foo/ should violate on a scalar" do
46
+ expect(av.validate_rule('re-foo-scalar')).not_to be_empty
47
+ end
48
+
49
+ it "/foo/ should violate on an array" do
50
+ expect(av.validate_rule('re-foo-array')).not_to be_empty
51
+ end
52
+
53
+ it "/foo/ should not violate on empty hash" do
54
+ expect(av.validate_rule('re-foo-empty-hash')).to be_empty
55
+ end
56
+
57
+ it "/foo/ should not violate on foo, oofoo, foof" do
58
+ expect(av.validate_rule('re-foo-three')).to be_empty
59
+ end
60
+
61
+ it "/foo/ should violate on foo, goof" do
62
+ expect(av.validate_rule('re-foo-two')).not_to be_empty
63
+ end
64
+ end
65
+
66
+ describe "assorted arrays" do
67
+ let(:node) { CAVHelper.load_fixture_attributes('check_child_keys_assorted') }
68
+ let(:av) { Chef::Attribute::Validator.new(node) }
69
+
70
+ # Must be a hash to have keys - empty hash OK
71
+ it "['foo', 'bar'] should violate on nil" do
72
+ expect(av.validate_rule('ar-foo-nil')).not_to be_empty
73
+ end
74
+
75
+ it "['foo', 'bar'] should violate on a scalar" do
76
+ expect(av.validate_rule('ar-foo-scalar')).not_to be_empty
77
+ end
78
+
79
+ it "['foo', 'bar'] should violate on an array" do
80
+ expect(av.validate_rule('ar-foo-array')).not_to be_empty
81
+ end
82
+
83
+ it "['foo', 'bar'] should not violate on empty hash" do
84
+ expect(av.validate_rule('ar-foo-empty-hash')).to be_empty
85
+ end
86
+
87
+ it "['foo', 'bar'] should not violate on foo" do
88
+ expect(av.validate_rule('ar-foo-foo')).to be_empty
89
+ end
90
+
91
+ it "['foo', 'bar'] should not violate on bar" do
92
+ expect(av.validate_rule('ar-foo-bar')).to be_empty
93
+ end
94
+
95
+ it "['foo', 'bar'] should not violate on bar, foo" do
96
+ expect(av.validate_rule('ar-foo-barfoo')).to be_empty
97
+ end
98
+
99
+ it "['foo', 'bar'] should violate on foo, bar, baz" do
100
+ expect(av.validate_rule('ar-foo-foobarbaz')).not_to be_empty
101
+ end
102
+
103
+ it "['foo', 'bar'] should violate on baz" do
104
+ expect(av.validate_rule('ar-foo-baz')).not_to be_empty
105
+ end
106
+
107
+ end
108
+
109
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-attribute-validator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clinton Wolfe
@@ -74,6 +74,7 @@ files:
74
74
  - lib/chef-attribute-validator.rb
75
75
  - lib/chef-attribute-validator/attribute_set.rb
76
76
  - lib/chef-attribute-validator/check.rb
77
+ - lib/chef-attribute-validator/checks/child_keys.rb
77
78
  - lib/chef-attribute-validator/checks/enum.rb
78
79
  - lib/chef-attribute-validator/checks/looks_like.rb
79
80
  - lib/chef-attribute-validator/checks/max_children.rb
@@ -91,6 +92,12 @@ files:
91
92
  - lib/chef-attribute-validator/wildcard_expander/no_wildcards.rb
92
93
  - test/fixtures/attr_set.rb
93
94
  - test/fixtures/check_child_count.rb
95
+ - test/fixtures/check_child_keys_arg_array.rb
96
+ - test/fixtures/check_child_keys_arg_literal_regex.rb
97
+ - test/fixtures/check_child_keys_arg_nil.rb
98
+ - test/fixtures/check_child_keys_arg_regexp_object.rb
99
+ - test/fixtures/check_child_keys_arg_string.rb
100
+ - test/fixtures/check_child_keys_assorted.rb
94
101
  - test/fixtures/check_enum_array_empty.rb
95
102
  - test/fixtures/check_enum_array_mixed.rb
96
103
  - test/fixtures/check_enum_array_strings.rb
@@ -143,6 +150,7 @@ files:
143
150
  - test/unit/attr_set_spec.rb
144
151
  - test/unit/attr_set_spec_wildcard.rb
145
152
  - test/unit/check_child_count_spec.rb
153
+ - test/unit/check_child_keys_spec.rb
146
154
  - test/unit/check_enum_spec.rb
147
155
  - test/unit/check_looks_like_spec.rb
148
156
  - test/unit/check_present_spec.rb
@@ -180,6 +188,12 @@ summary: A Rubygem implementing a rule engine for validating Chef node attribute
180
188
  test_files:
181
189
  - test/fixtures/attr_set.rb
182
190
  - test/fixtures/check_child_count.rb
191
+ - test/fixtures/check_child_keys_arg_array.rb
192
+ - test/fixtures/check_child_keys_arg_literal_regex.rb
193
+ - test/fixtures/check_child_keys_arg_nil.rb
194
+ - test/fixtures/check_child_keys_arg_regexp_object.rb
195
+ - test/fixtures/check_child_keys_arg_string.rb
196
+ - test/fixtures/check_child_keys_assorted.rb
183
197
  - test/fixtures/check_enum_array_empty.rb
184
198
  - test/fixtures/check_enum_array_mixed.rb
185
199
  - test/fixtures/check_enum_array_strings.rb
@@ -232,6 +246,7 @@ test_files:
232
246
  - test/unit/attr_set_spec.rb
233
247
  - test/unit/attr_set_spec_wildcard.rb
234
248
  - test/unit/check_child_count_spec.rb
249
+ - test/unit/check_child_keys_spec.rb
235
250
  - test/unit/check_enum_spec.rb
236
251
  - test/unit/check_looks_like_spec.rb
237
252
  - test/unit/check_present_spec.rb