chef-attribute-validator 0.4.0 → 0.5.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,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZDJjZjdhYTFkYWNmMGU0ZTg1MDg4MzdlMWE5Nzg0ZGEwYzhlOGYxNQ==
4
+ NTQ4ZTZkNWViNzg0YmRiM2NiODkwOWE5NzM1MGU5YzFiMTk2MWU3NQ==
5
5
  data.tar.gz: !binary |-
6
- MmM1OTA0N2RiN2E1MjE3NmQxNTg1NDc5ZjRhN2E1OGJmMDdmNzY4MQ==
6
+ YjUyYjI3YTRmNmQ0ODJjMGUyOTZlZGY2MjVjMGJhNWE3ZjliMzQwMQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NGMxOTE3M2Y3NTk3ZDU0NmJiY2I2YTdlZGIyYjY2MzBiMmUzNzk3OWQ3ZDhj
10
- Yjc0NTA3MDZjN2M0NjAxYzVkMzM4MjEwMGI4NDRkYjFmYThjNGI0NzY2MTNi
11
- NjA4YjQ3ZWY5MWQyYmVkNGNkZWE3MDZjYzNjODk3OTBmOTQ3ZDI=
9
+ Mzk5MjVlOTQ0MzYzMmMzNTVlZWViN2VmZGQ3MGU0YWUxYWNlZGFhOGRjNjQw
10
+ YWQ2ODI3MDM3MDhhZDZiOWM1ZGQ5Nzk5MzExNGE0NmU4NDYwNjk1NDA1ZTcy
11
+ MDk1OTBjNjI1Yzc3YWJiZGI5NGQ5YzhjZmI5NjM1NmYyY2Q5YWI=
12
12
  data.tar.gz: !binary |-
13
- MDJlMjQ0YTZhM2JlYzE1YWRjMGJlZTY2NjE2NWMyNTdiZTBiYjRiNmJmNTQ2
14
- NWM4NTQ4ZTlhYjMyNWFiOWJjNGVlZDU3MzBhZjI4ZmNiZjI2N2FjMWFmZWJl
15
- N2Q2OWE0NWI4YWFjZDMwNmI3OGE0OTU1ZmE0OTdlNDc2YzIyZmI=
13
+ ZDVhNjc5MGE0YWE4Yzg0N2M2NWM4MWZlZjhlNDk5ZjBmMDBkMjg5NGVkYzNj
14
+ OGVmMDA1NWJmODRmMDU5YjYwYzhmYzk4NTBiNzAzYjFhNzkyZDU4MjIzZmI5
15
+ YzNlZDY4NjE5YTFhZDk3MTUwYmVkODA2MDc3N2I3M2FkM2JmMzI=
data/CHANGES CHANGED
@@ -1,3 +1,8 @@
1
+ 2013-12-05 Clinton Wolfe 0.5.0
2
+ Add looks_like => 'guid'
3
+ Add looks_like => 'email'
4
+ Add looks_like => 'hostname'
5
+
1
6
  2013-11-15 Clinton Wolfe 0.4.0
2
7
  Add 'present' check
3
8
  Reformat list of checks in README
data/README.md CHANGED
@@ -76,7 +76,27 @@ Boolean. If true, fails if the path matches zero attributes, or the value is ni
76
76
 
77
77
  #### looks_like
78
78
 
79
- String, one of 'url', 'ip'. Applies canned regexes (or more sophisticated matchers, like contructing objects from the stdlib).
79
+ String, one of 'email', 'guid', 'ip', 'url'. Applies canned regexes (or more sophisticated matchers, like constructing objects from the stdlib). Details:
80
+
81
+ ##### email
82
+
83
+ Uses a naive regex to do a simple sanity check. It may be too tight or too loose for you, in which case you can use a Proc and spend as much of your energy as you please solving that problem.
84
+
85
+ ##### guid
86
+
87
+ Uses a regex to match GUID/UUIDs, like 'ec73f2a8-510d-4e6a-be5d-7b234da03c92'
88
+
89
+ ##### hostname
90
+
91
+ Uses a regex to guess if it looks hostnamish. Does not require a dot. Accepts IPv4, and checks ranges.
92
+
93
+ ##### ip
94
+
95
+ Uses the stdlib 'ipaddr' library to try to construct an IPAddr object from the value. If it worked, it's an IP. IPv6 is supported; ranges are checked; CIDR notation is supported; and no you can't pass a hostname to this.
96
+
97
+ ##### url
98
+
99
+ Uses the stdlib 'url' library to try to construct an URI object from the value. If it worked, it's an URL. This is probably too loose; it will accept bare hostnames, for example.
80
100
 
81
101
  #### enum
82
102
 
@@ -108,12 +128,10 @@ Open a github issue at https://github.com/clintoncwolfe/chef-attribute-validator
108
128
 
109
129
  #### Some wildcard syntax not yet supported
110
130
 
111
- Possibly eventually support for **, [<charclass>], or {<alternatives>}.
131
+ Possibly eventually support for [<charclass>], or {<alternatives>}.
112
132
 
113
133
  #### Planned checks:
114
134
 
115
- looks_like/hostname
116
- looks_like/email
117
135
  name_regex - Regexp. Applies given regex to the last element in the attribute path ('basename', if you will)
118
136
 
119
137
  ### Bugs and Defects
@@ -126,7 +144,6 @@ No real exception class, just raising a bare string exception, which could certa
126
144
 
127
145
  BrutalRegex is terrible.
128
146
 
129
-
130
147
  ## Author
131
148
 
132
149
  Clinton Wolfe
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Chef::Attribute::Validator::VERSION
9
9
  spec.authors = ["Clinton Wolfe"]
10
10
  spec.email = ["clinton@omniti.com"]
11
- spec.description = %q{Define, enforce, and handle violations of validation rules for Chef node attributes. This gem provides the validation engine, and can be used outside of a convergence run; a cookbook (attribute-validator) is availabel to perform validation during a chef run, at compile or converge time.}
11
+ spec.description = %q{Define, enforce, and handle violations of validation rules for Chef node attributes. This gem provides the validation engine, and can be used outside of a convergence run; a cookbook (attribute-validator) is available to perform validation during a chef run, at compile or converge time.}
12
12
  spec.summary = %q{A Rubygem implementing a rule engine for validating Chef node attributes.}
13
13
  spec.homepage = "https://github.com/clintoncwolfe/chef-attribute-validator"
14
14
  spec.license = "BSD (3-clause)"
@@ -12,6 +12,9 @@ class Chef
12
12
 
13
13
  def validate_check_arg
14
14
  expected = [
15
+ 'email',
16
+ 'guid',
17
+ 'hostname',
15
18
  'ip',
16
19
  'url',
17
20
  ]
@@ -26,25 +29,66 @@ class Chef
26
29
  attrset.each do |path, value|
27
30
  if val_scalar?(value) then
28
31
  next if value.nil?
29
- case check_arg
30
- when 'ip'
31
- begin
32
- IPAddr.new(value)
33
- rescue
34
- violations.push Chef::Attribute::Validator::Violation.new(rule_name, path, "Value '#{value}' does not look like an IP address")
35
- end
36
- when 'url'
37
- begin
38
- URI(value)
39
- rescue
40
- violations.push Chef::Attribute::Validator::Violation.new(rule_name, path, "Value '#{value}' does not look like a URL")
41
- end
32
+ unless value.respond_to?(:match)
33
+ violations.push Chef::Attribute::Validator::Violation.new(rule_name, path, "Value '#{value}' is not string-like, so it can't be a #{check_arg}")
34
+ next
42
35
  end
36
+ send(('ll_check_' + check_arg).to_sym, value, path, violations)
43
37
  end
44
38
  end
45
39
  violations
46
40
  end
47
41
 
42
+ private
43
+
44
+ def ll_check_guid(value, path, violations)
45
+ guid_regex = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/
46
+ unless value.match(guid_regex)
47
+ violations.push Chef::Attribute::Validator::Violation.new(rule_name, path, "Value '#{value}' does not look like a v4 UUID (see RFC 4122)")
48
+ end
49
+ end
50
+
51
+ def ll_check_ip(value, path, violations)
52
+ begin
53
+ IPAddr.new(value)
54
+ rescue
55
+ violations.push Chef::Attribute::Validator::Violation.new(rule_name, path, "Value '#{value}' does not look like an IP address")
56
+ end
57
+ end
58
+
59
+ def ll_check_url(value, path, violations)
60
+ begin
61
+ URI(value)
62
+ rescue
63
+ violations.push Chef::Attribute::Validator::Violation.new(rule_name, path, "Value '#{value}' does not look like a URL")
64
+ end
65
+ end
66
+
67
+ def ll_check_email(value, path, violations)
68
+ # This is simple and crude. Will reject some things you might wish it didn't:
69
+ # root@localhost
70
+ # root
71
+ #
72
+
73
+ # Email validation with regexes is stupid.
74
+ email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
75
+ unless value.match(email_regex)
76
+ violations.push Chef::Attribute::Validator::Violation.new(rule_name, path, "Value '#{value}' does not look like an email address, but I could be wrong. If I am wrong, use a Proc instead.")
77
+ end
78
+ end
79
+
80
+ def ll_check_hostname(value, path, violations)
81
+ ip_regex = /^(\d{1,3}\.){3}\d{1,3}$/
82
+ hostname_regex = /^([a-z0-9\-]+\.)*[a-z0-9\-]{2,}$/i
83
+
84
+ if value.match(ip_regex)
85
+ ll_check_ip(value, path, violations)
86
+ else
87
+ unless value.match(hostname_regex)
88
+ violations.push Chef::Attribute::Validator::Violation.new(rule_name, path, "Value '#{value}' does not look like a hostname, nor an IPv4.")
89
+ end
90
+ end
91
+ end
48
92
  end
49
93
  end
50
94
  end
@@ -1,7 +1,7 @@
1
1
  class Chef
2
2
  class Attribute
3
3
  class Validator
4
- VERSION = "0.4.0"
4
+ VERSION = "0.5.0"
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,6 @@
1
+ rules = default['attribute-validator']['rules']
2
+ rules['check-looks-like-arg-email'] = {
3
+ 'path' => '/nil',
4
+ 'looks_like' => 'email',
5
+ }
6
+
@@ -0,0 +1,6 @@
1
+ rules = default['attribute-validator']['rules']
2
+ rules['check-looks-like-arg-guid'] = {
3
+ 'path' => '/nil',
4
+ 'looks_like' => 'guid',
5
+ }
6
+
@@ -0,0 +1,6 @@
1
+ rules = default['attribute-validator']['rules']
2
+ rules['check-looks-like-arg-hostname'] = {
3
+ 'path' => '/nil',
4
+ 'looks_like' => 'hostname',
5
+ }
6
+
@@ -0,0 +1,74 @@
1
+
2
+ default['nil'] = nil
3
+ default['empty'] = ''
4
+
5
+ default['email']['joe'] = 'joe@example.com'
6
+ default['email']['case']['lower'] = 'ray@cartalk.com'
7
+ default['email']['case']['upper'] = 'TOMMY@CARTALK.COM'
8
+ default['email']['tagged'] = 'joe+tag@foo.com'
9
+
10
+ default['email']['no']['user'] = '@foo.com'
11
+ default['email']['no']['hostname'] = 'johnny@'
12
+
13
+ default['email']['bad']['quotes'] = '"Click and Clack" <show@cartalk.com>'
14
+ default['email']['bad']['spaces'] = '"Click and Clack" <show@cartalk.com>'
15
+ default['email']['bad']['phonetic'] = 'joeATfoo.com'
16
+
17
+ rules = default['attribute-validator']['rules']
18
+ rules['email-missing'] = {
19
+ 'path' => '/nope',
20
+ 'looks_like' => 'email',
21
+ }
22
+
23
+ rules['email-nil'] = {
24
+ 'path' => '/nil',
25
+ 'looks_like' => 'email',
26
+ }
27
+
28
+ rules['email-empty'] = {
29
+ 'path' => '/empty',
30
+ 'looks_like' => 'email',
31
+ }
32
+
33
+ rules['email-spaces'] = {
34
+ 'path' => '/email/bad/spaces',
35
+ 'looks_like' => 'email',
36
+ }
37
+
38
+ rules['email-case-upper'] = {
39
+ 'path' => '/email/case/upper',
40
+ 'looks_like' => 'email',
41
+ }
42
+
43
+ rules['email-joe'] = {
44
+ 'path' => '/email/joe',
45
+ 'looks_like' => 'email',
46
+ }
47
+
48
+ rules['email-tagged'] = {
49
+ 'path' => '/email/tagged',
50
+ 'looks_like' => 'email',
51
+ }
52
+
53
+ rules['email-no-user'] = {
54
+ 'path' => '/email/no/user',
55
+ 'looks_like' => 'email',
56
+ }
57
+
58
+ rules['email-no-hostname'] = {
59
+ 'path' => '/email/no/hostname',
60
+ 'looks_like' => 'email',
61
+ }
62
+
63
+ rules['email-quotes'] = {
64
+ 'path' => '/email/bad/quotes',
65
+ 'looks_like' => 'email',
66
+ }
67
+
68
+ rules['email-phonetic-at'] = {
69
+ 'path' => '/email/bad/phonetic',
70
+ 'looks_like' => 'email',
71
+ }
72
+
73
+
74
+
@@ -0,0 +1,38 @@
1
+
2
+ default['nil'] = nil
3
+ default['empty'] = ''
4
+
5
+ default['guid']['case']['lower'] = 'ec73f2a8-510d-4e6a-be5d-7b234da03c92'
6
+ default['guid']['case']['upper'] = 'ACCF642E-2CD3-4D20-921E-A80E91EAFEC8'
7
+ default['guid']['spaces'] = 'db592238 8175 491b a914 f1e4eaf732bf'
8
+
9
+ rules = default['attribute-validator']['rules']
10
+ rules['guid-missing'] = {
11
+ 'path' => '/nope',
12
+ 'looks_like' => 'guid',
13
+ }
14
+
15
+ rules['guid-nil'] = {
16
+ 'path' => '/nil',
17
+ 'looks_like' => 'guid',
18
+ }
19
+
20
+ rules['guid-empty'] = {
21
+ 'path' => '/empty',
22
+ 'looks_like' => 'guid',
23
+ }
24
+
25
+ rules['guid-spaces'] = {
26
+ 'path' => '/guid/spaces',
27
+ 'looks_like' => 'guid',
28
+ }
29
+
30
+ rules['guid-upper-case'] = {
31
+ 'path' => '/guid/case/upper',
32
+ 'looks_like' => 'guid',
33
+ }
34
+
35
+ rules['guid-lower-case'] = {
36
+ 'path' => '/guid/case/lower',
37
+ 'looks_like' => 'guid',
38
+ }
@@ -0,0 +1,70 @@
1
+
2
+ default['nil'] = nil
3
+ default['empty'] = ''
4
+
5
+ default['hostname']['case']['lower'] = 'wombat.example.org'
6
+ default['hostname']['case']['upper'] = 'WOMBAT.EXAMPLE.ORG'
7
+ default['hostname']['spaces'] = 'wombat example.org'
8
+ default['hostname']['localhost'] = 'localhost'
9
+ default['hostname']['underscore'] = 'under_score.org'
10
+ default['hostname']['iad'] = 'foo.iad'
11
+ default['hostname']['ip']['i127'] = '127.0.0.1'
12
+ default['hostname']['ip']['i300'] = '300.300.300.300'
13
+
14
+ rules = default['attribute-validator']['rules']
15
+ rules['hostname-missing'] = {
16
+ 'path' => '/nope',
17
+ 'looks_like' => 'hostname',
18
+ }
19
+
20
+ rules['hostname-nil'] = {
21
+ 'path' => '/nil',
22
+ 'looks_like' => 'hostname',
23
+ }
24
+
25
+ rules['hostname-empty'] = {
26
+ 'path' => '/empty',
27
+ 'looks_like' => 'hostname',
28
+ }
29
+
30
+ rules['hostname-case-lower'] = {
31
+ 'path' => '/hostname/case/lower',
32
+ 'looks_like' => 'hostname',
33
+ }
34
+
35
+ rules['hostname-case-upper'] = {
36
+ 'path' => '/hostname/case/upper',
37
+ 'looks_like' => 'hostname',
38
+ }
39
+
40
+ rules['hostname-localhost'] = {
41
+ 'path' => '/hostname/localhost',
42
+ 'looks_like' => 'hostname',
43
+ }
44
+
45
+ rules['hostname-iad'] = {
46
+ 'path' => '/hostname/iad',
47
+ 'looks_like' => 'hostname',
48
+ }
49
+
50
+ rules['hostname-ip-127'] = {
51
+ 'path' => '/hostname/ip/i127',
52
+ 'looks_like' => 'hostname',
53
+ }
54
+
55
+ rules['hostname-ip-300'] = {
56
+ 'path' => '/hostname/ip/i300',
57
+ 'looks_like' => 'hostname',
58
+ }
59
+
60
+ rules['hostname-underscore'] = {
61
+ 'path' => '/hostname/underscore',
62
+ 'looks_like' => 'hostname',
63
+ }
64
+
65
+ rules['hostname-spaces'] = {
66
+ 'path' => '/hostname/spaces',
67
+ 'looks_like' => 'hostname',
68
+ }
69
+
70
+
@@ -12,6 +12,18 @@ describe "'looks_like' check" do
12
12
  end
13
13
 
14
14
  describe "check_arg checks" do
15
+ it "should accept 'email'" do
16
+ node = CAVHelper.load_fixture_attributes('check_looks_like_arg_email')
17
+ expect { Chef::Attribute::Validator.new(node) }.not_to raise_error
18
+ end
19
+ it "should accept 'guid'" do
20
+ node = CAVHelper.load_fixture_attributes('check_looks_like_arg_guid')
21
+ expect { Chef::Attribute::Validator.new(node) }.not_to raise_error
22
+ end
23
+ it "should accept 'hostname'" do
24
+ node = CAVHelper.load_fixture_attributes('check_looks_like_arg_hostname')
25
+ expect { Chef::Attribute::Validator.new(node) }.not_to raise_error
26
+ end
15
27
  it "should accept 'ip'" do
16
28
  node = CAVHelper.load_fixture_attributes('check_looks_like_arg_ip')
17
29
  expect { Chef::Attribute::Validator.new(node) }.not_to raise_error
@@ -101,6 +113,135 @@ describe "'looks_like' check" do
101
113
 
102
114
  end
103
115
 
116
+ context "when the mode is 'guid'" do
117
+ let(:node) { CAVHelper.load_fixture_attributes('check_looks_like_guid') }
118
+ let(:av) { Chef::Attribute::Validator.new(node) }
119
+
120
+ it "should not violate on missing" do
121
+ expect(av.validate_rule('guid-missing')).to be_empty
122
+ end
123
+
124
+ it "should not violate on nil" do
125
+ expect(av.validate_rule('guid-nil')).to be_empty
126
+ end
127
+
128
+ it "should not violate on a lower-case guid" do
129
+ expect(av.validate_rule('guid-lower-case')).to be_empty
130
+ end
131
+
132
+ it "should not violate on a upper-case guid" do
133
+ expect(av.validate_rule('guid-upper-case')).to be_empty
134
+ end
135
+
136
+ it "should violate on a guid without dashes" do
137
+ expect(av.validate_rule('guid-spaces')).not_to be_empty
138
+ end
139
+
140
+ it "should violate on an empty string" do
141
+ expect(av.validate_rule('guid-empty')).not_to be_empty
142
+ end
143
+
144
+ end
145
+
146
+ context "when the mode is 'email'" do
147
+ let(:node) { CAVHelper.load_fixture_attributes('check_looks_like_email') }
148
+ let(:av) { Chef::Attribute::Validator.new(node) }
149
+
150
+ it "should not violate on missing" do
151
+ expect(av.validate_rule('email-missing')).to be_empty
152
+ end
153
+
154
+ it "should not violate on nil" do
155
+ expect(av.validate_rule('email-nil')).to be_empty
156
+ end
157
+
158
+ it "should violate on an empty string" do
159
+ expect(av.validate_rule('email-empty')).not_to be_empty
160
+ end
161
+
162
+ it "should not violate on joe@example.com" do
163
+ expect(av.validate_rule('email-joe')).to be_empty
164
+ end
165
+
166
+ it "should not violate on a upper-case email" do
167
+ expect(av.validate_rule('email-case-upper')).to be_empty
168
+ end
169
+
170
+ it "should not violate on a joe+tag@foo.com" do
171
+ expect(av.validate_rule('email-tagged')).to be_empty
172
+ end
173
+
174
+ it "should violate on a email without a user" do
175
+ expect(av.validate_rule('email-no-user')).not_to be_empty
176
+ end
177
+
178
+ it "should violate on a email without a hostname" do
179
+ expect(av.validate_rule('email-no-hostname')).not_to be_empty
180
+ end
181
+
182
+ it "should violate on a email with spaces" do
183
+ expect(av.validate_rule('email-spaces')).not_to be_empty
184
+ end
185
+
186
+ it "should violate on a email with quotes" do
187
+ expect(av.validate_rule('email-quotes')).not_to be_empty
188
+ end
189
+
190
+ it "should violate on phonetic-at" do
191
+ expect(av.validate_rule('email-phonetic-at')).not_to be_empty
192
+ end
193
+
194
+ end
195
+
196
+ context "when the mode is 'hostname'" do
197
+ let(:node) { CAVHelper.load_fixture_attributes('check_looks_like_hostname') }
198
+ let(:av) { Chef::Attribute::Validator.new(node) }
199
+
200
+ it "should not violate on missing" do
201
+ expect(av.validate_rule('hostname-missing')).to be_empty
202
+ end
203
+
204
+ it "should not violate on nil" do
205
+ expect(av.validate_rule('hostname-nil')).to be_empty
206
+ end
104
207
 
208
+ it "should violate on an empty string" do
209
+ expect(av.validate_rule('hostname-empty')).not_to be_empty
210
+ end
211
+
212
+ it "should not violate on a lower-case hostname" do
213
+ expect(av.validate_rule('hostname-case-lower')).to be_empty
214
+ end
215
+
216
+ it "should not violate on a upper-case hostname" do
217
+ expect(av.validate_rule('hostname-case-upper')).to be_empty
218
+ end
219
+
220
+ it "should not violate on a 'localhost'" do
221
+ expect(av.validate_rule('hostname-localhost')).to be_empty
222
+ end
223
+
224
+ it "should not violate on 'foo.iad'" do
225
+ expect(av.validate_rule('hostname-iad')).to be_empty
226
+ end
227
+
228
+ it "should not violate on '127.0.0.1'" do
229
+ expect(av.validate_rule('hostname-ip-127')).to be_empty
230
+ end
231
+
232
+ it "should violate on '300.300.300.300'" do
233
+ expect(av.validate_rule('hostname-ip-300')).not_to be_empty
234
+ end
235
+
236
+ it "should violate on 'under_score.com'" do
237
+ expect(av.validate_rule('hostname-underscore')).not_to be_empty
238
+ end
239
+
240
+ it "should violate on spaces" do
241
+ expect(av.validate_rule('hostname-spaces')).not_to be_empty
242
+ end
243
+
244
+ end
245
+
105
246
 
106
247
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-attribute-validator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clinton Wolfe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-15 00:00:00.000000000 Z
11
+ date: 2013-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -56,7 +56,7 @@ dependencies:
56
56
  version: 11.6.0
57
57
  description: Define, enforce, and handle violations of validation rules for Chef node
58
58
  attributes. This gem provides the validation engine, and can be used outside of
59
- a convergence run; a cookbook (attribute-validator) is availabel to perform validation
59
+ a convergence run; a cookbook (attribute-validator) is available to perform validation
60
60
  during a chef run, at compile or converge time.
61
61
  email:
62
62
  - clinton@omniti.com
@@ -97,10 +97,16 @@ files:
97
97
  - test/fixtures/check_enum_assorted.rb
98
98
  - test/fixtures/check_enum_nil.rb
99
99
  - test/fixtures/check_enum_string.rb
100
+ - test/fixtures/check_looks_like_arg_email.rb
101
+ - test/fixtures/check_looks_like_arg_guid.rb
102
+ - test/fixtures/check_looks_like_arg_hostname.rb
100
103
  - test/fixtures/check_looks_like_arg_ip.rb
101
104
  - test/fixtures/check_looks_like_arg_regex.rb
102
105
  - test/fixtures/check_looks_like_arg_url.rb
103
106
  - test/fixtures/check_looks_like_arg_your_mom.rb
107
+ - test/fixtures/check_looks_like_email.rb
108
+ - test/fixtures/check_looks_like_guid.rb
109
+ - test/fixtures/check_looks_like_hostname.rb
104
110
  - test/fixtures/check_looks_like_ip.rb
105
111
  - test/fixtures/check_looks_like_url.rb
106
112
  - test/fixtures/check_present_assorted.rb
@@ -177,10 +183,16 @@ test_files:
177
183
  - test/fixtures/check_enum_assorted.rb
178
184
  - test/fixtures/check_enum_nil.rb
179
185
  - test/fixtures/check_enum_string.rb
186
+ - test/fixtures/check_looks_like_arg_email.rb
187
+ - test/fixtures/check_looks_like_arg_guid.rb
188
+ - test/fixtures/check_looks_like_arg_hostname.rb
180
189
  - test/fixtures/check_looks_like_arg_ip.rb
181
190
  - test/fixtures/check_looks_like_arg_regex.rb
182
191
  - test/fixtures/check_looks_like_arg_url.rb
183
192
  - test/fixtures/check_looks_like_arg_your_mom.rb
193
+ - test/fixtures/check_looks_like_email.rb
194
+ - test/fixtures/check_looks_like_guid.rb
195
+ - test/fixtures/check_looks_like_hostname.rb
184
196
  - test/fixtures/check_looks_like_ip.rb
185
197
  - test/fixtures/check_looks_like_url.rb
186
198
  - test/fixtures/check_present_assorted.rb