jcrvalidator 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 42b7b9f30fbdce18d3eb52e3fbea46a1a8a1350e
4
+ data.tar.gz: 80f3a34f4134303c2bc2c2e153330e316b4c0bef
5
+ SHA512:
6
+ metadata.gz: 660737cced532d5aefa2de290c374eb3a69184d7628215ebfed9feac7d99f92ee7307fb470af295982641bb4dfb688497bfe15f45dc4bb6b53d134f5ad31488c
7
+ data.tar.gz: 6fd4e1d6b0cde8f89794d7529d5f19af9a13d6c51a8c1ab31c8350d1bd8dc58122c8e888304e496374899c4df20bcf92eca0ffd7a558a2637de059ce23250e00
data/bin/jcr ADDED
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+ # Copyright (c) 2014-2015 American Registry for Internet Numbers
3
+ #
4
+ # Permission to use, copy, modify, and/or distribute this software for any
5
+ # purpose with or without fee is hereby granted, provided that the above
6
+ # copyright notice and this permission notice appear in all copies.
7
+ #
8
+ # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
+ # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
+ # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
+ # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
+ # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
+ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
14
+ # IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
+
16
+ require 'rubygems'
17
+ begin
18
+ require 'jcr'
19
+ rescue LoadError
20
+ lib = File.expand_path("../lib",File.dirname(__FILE__))
21
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
22
+ require 'jcr'
23
+ end
24
+
25
+ JCR.main
26
+
@@ -0,0 +1,195 @@
1
+ # Copyright (c) 2015 American Registry for Internet Numbers
2
+ #
3
+ # Permission to use, copy, modify, and/or distribute this software for any
4
+ # purpose with or without fee is hereby granted, provided that the above
5
+ # copyright notice and this permission notice appear in all copies.
6
+ #
7
+ # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8
+ # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
+ # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10
+ # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
+ # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12
+ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
13
+ # IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14
+
15
+ require 'jcr/parser'
16
+ require 'jcr/map_rule_names'
17
+
18
+ module JCR
19
+
20
+ def self.check_groups( tree, mapping )
21
+ if tree.is_a? Array
22
+ tree.each do |node|
23
+ check_groups( node, mapping )
24
+ end
25
+ else # is a hash
26
+ if tree[:rule]
27
+ check_groups( tree[:rule], mapping )
28
+ elsif tree[:primitive_rule]
29
+ check_value_for_group( tree[:primitive_rule], mapping )
30
+ elsif tree[:type_choice_signifier]
31
+ check_value_for_group( tree, mapping )
32
+ elsif tree[:member_rule]
33
+ check_member_for_group( tree[:member_rule], mapping )
34
+ elsif tree[:array_rule]
35
+ check_array_for_group( tree[:array_rule], mapping )
36
+ elsif tree[:object_rule]
37
+ check_object_for_group( tree[:object_rule], mapping )
38
+ end
39
+ end
40
+ end
41
+
42
+ def self.check_value_for_group node, mapping
43
+ if node[:group_rule]
44
+ disallowed_group_in_value?( node[:group_rule], mapping )
45
+ end
46
+ end
47
+
48
+ def self.disallowed_group_in_value? node, mapping
49
+ if node.is_a? Hash
50
+ node = [ node ]
51
+ end
52
+ node.each do |groupee|
53
+ if groupee[:sequence_combiner]
54
+ raise_group_error( 'AND (comma) operation in group rule of value rule', groupee[:sequence_combiner] )
55
+ end
56
+ if groupee[:group_rule]
57
+ disallowed_group_in_value?( groupee[:group_rule], mapping )
58
+ elsif groupee[:target_rule_name]
59
+ trule = get_name_mapping( groupee[:target_rule_name][:rule_name], mapping )
60
+ disallowed_group_in_value?( trule[:rule], mapping )
61
+ elsif groupee[:member_rule]
62
+ raise_group_error( "groups in value rules cannot have member rules", groupee[:member_rule] )
63
+ elsif groupee[:object_rule]
64
+ raise_group_error( "groups in value rules cannot have object rules", groupee[:member_rule] )
65
+ elsif groupee[:array_rule]
66
+ raise_group_error( "groups in value rules cannot have array rules", groupee[:member_rule] )
67
+ elsif groupee[:primitive_rule]
68
+ disallowed_group_in_value?( groupee[:primitive_rule], mapping )
69
+ end
70
+ end
71
+ end
72
+
73
+ def self.check_member_for_group node, mapping
74
+ if node[:target_rule_name]
75
+ trule = get_name_mapping( node[:target_rule_name][:rule_name], mapping )
76
+ disallowed_group_in_member?( trule, mapping )
77
+ elsif node[:group_rule]
78
+ disallowed_group_in_member?( node[:group_rule], mapping )
79
+ else
80
+ check_groups( node, mapping )
81
+ end
82
+ end
83
+
84
+ def self.disallowed_group_in_member? node, mapping
85
+ if node.is_a? Hash
86
+ node = [ node ]
87
+ end
88
+ node.each do |groupee|
89
+ if groupee[:sequence_combiner]
90
+ raise_group_error( 'AND (comma) operation in group rule of member rule', groupee[:sequence_combiner] )
91
+ end
92
+ if groupee[:group_rule]
93
+ disallowed_group_in_member?( groupee[:group_rule], mapping )
94
+ elsif groupee[:target_rule_name]
95
+ trule = get_name_mapping( groupee[:target_rule_name][:rule_name], mapping )
96
+ if trule[:group_rule]
97
+ disallowed_group_in_member?( trule[:group_rule], mapping )
98
+ end
99
+ elsif groupee[:member_rule]
100
+ raise_group_error( "groups in member rules cannot have member rules", groupee[:member_rule] )
101
+ else
102
+ check_groups( groupee, mapping )
103
+ end
104
+ end
105
+ end
106
+
107
+ def self.check_array_for_group node, mapping
108
+ if node.is_a?( Array )
109
+ node.each do |child_node|
110
+ check_array_for_group( child_node, mapping )
111
+ end
112
+ elsif node.is_a? Hash
113
+ if node[:target_rule_name]
114
+ trule = get_name_mapping(node[:target_rule_name][:rule_name], mapping)
115
+ disallowed_group_in_array?(trule, mapping)
116
+ elsif node[:group_rule]
117
+ disallowed_group_in_array?(node[:group_rule], mapping)
118
+ else
119
+ check_groups(node, mapping)
120
+ end
121
+ end
122
+ end
123
+
124
+ def self.disallowed_group_in_array? node, mapping
125
+ if node.is_a? Hash
126
+ node = [ node ]
127
+ end
128
+ node.each do |groupee|
129
+ if groupee[:group_rule]
130
+ disallowed_group_in_array?( groupee[:group_rule], mapping )
131
+ elsif groupee[:target_rule_name]
132
+ trule = get_name_mapping( groupee[:target_rule_name][:rule_name], mapping )
133
+ if trule[:group_rule]
134
+ disallowed_group_in_array?( trule[:group_rule], mapping )
135
+ end
136
+ elsif groupee[:member_rule]
137
+ raise_group_error( "groups in array rules cannot have member rules", groupee[:member_rule] )
138
+ else
139
+ check_groups( groupee, mapping )
140
+ end
141
+ end
142
+ end
143
+
144
+ def self.check_object_for_group node, mapping
145
+ if node.is_a?( Array )
146
+ node.each do |child_node|
147
+ check_object_for_group( child_node, mapping )
148
+ end
149
+ elsif node.is_a? Hash
150
+ if node[:target_rule_name]
151
+ trule = get_name_mapping(node[:target_rule_name][:rule_name], mapping)
152
+ disallowed_group_in_object?(trule, mapping)
153
+ elsif node[:group_rule]
154
+ disallowed_group_in_object?(node[:group_rule], mapping)
155
+ else
156
+ check_groups(node, mapping)
157
+ end
158
+ end
159
+ end
160
+
161
+ def self.disallowed_group_in_object? node, mapping
162
+ if node.is_a? Hash
163
+ node = [ node ]
164
+ end
165
+ node.each do |groupee|
166
+ if groupee[:group_rule]
167
+ disallowed_group_in_object?( groupee[:group_rule], mapping )
168
+ elsif groupee[:target_rule_name]
169
+ trule = get_name_mapping( groupee[:target_rule_name][:rule_name], mapping )
170
+ if trule[:group_rule]
171
+ disallowed_group_in_object?( trule[:group_rule], mapping )
172
+ end
173
+ elsif groupee[:array_rule]
174
+ raise_group_error( "groups in object rules cannot have array rules", groupee[:member_rule] )
175
+ elsif groupee[:object_rule]
176
+ raise_group_error( "groups in object rules cannot have other object rules", groupee[:member_rule] )
177
+ elsif groupee[:primitive_rule]
178
+ raise_group_error( "groups in object rules cannot have value rules", groupee[:member_rule] )
179
+ else
180
+ check_groups( groupee, mapping )
181
+ end
182
+ end
183
+ end
184
+
185
+ def self.raise_group_error str, node
186
+ if node.is_a?( Parslet::Slice )
187
+ pos = node.line_and_column
188
+ name = node.to_str
189
+ raise "group rule error at line " + pos[0].to_s + " column " + pos[1].to_s + " name '" + name + "' :" + str
190
+ else
191
+ raise "group rule error with '" + node.to_s + "' :" + str
192
+ end
193
+ end
194
+
195
+ end
@@ -0,0 +1,270 @@
1
+ # Copyright (c) 2015 American Registry for Internet Numbers
2
+ #
3
+ # Permission to use, copy, modify, and/or distribute this software for any
4
+ # purpose with or without fee is hereby granted, provided that the above
5
+ # copyright notice and this permission notice appear in all copies.
6
+ #
7
+ # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8
+ # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
+ # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10
+ # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
+ # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12
+ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
13
+ # IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14
+
15
+ require 'ipaddr'
16
+ require 'time'
17
+ require 'addressable/uri'
18
+ require 'addressable/template'
19
+ require 'email_address_validator'
20
+ require 'big-phoney'
21
+
22
+ require 'jcr/parser'
23
+ require 'jcr/map_rule_names'
24
+ require 'jcr/check_groups'
25
+ require 'jcr/evaluate_rules'
26
+
27
+ module JCR
28
+
29
+ class ArrayBehavior
30
+ attr_accessor :checked_hash, :last_index, :ordered, :extra_prohibited
31
+
32
+ def initialize( current_behavior = nil )
33
+ if current_behavior
34
+ @checked_hash = {}
35
+ @checked_hash.merge!( current_behavior.checked_hash )
36
+ @last_index = current_behavior.last_index
37
+ @ordered = current_behavior.ordered
38
+ @extra_prohibited = false
39
+ else
40
+ @checked_hash = {}
41
+ @last_index = 0
42
+ @ordered = true
43
+ @extra_prohibited = true
44
+ end
45
+ end
46
+ end
47
+
48
+ def self.evaluate_array_rule jcr, rule_atom, data, econs, behavior = nil
49
+
50
+ rules, annotations = get_rules_and_annotations( jcr )
51
+
52
+ ordered = true
53
+
54
+ if behavior && behavior.is_a?( ArrayBehavior )
55
+ ordered = behavior.ordered
56
+ end
57
+
58
+ annotations.each do |a|
59
+ if a[:unordered_annotation]
60
+ ordered = false
61
+ break
62
+ end
63
+ end
64
+
65
+ # if the data is not an array
66
+ return evaluate_reject( annotations,
67
+ Evaluation.new( false, "#{data} is not an array at #{jcr} from #{rule_atom}") ) unless data.is_a? Array
68
+
69
+ # if the array is zero length and there are zero sub-rules (it is suppose to be empty)
70
+ return evaluate_reject( annotations,
71
+ Evaluation.new( true, nil ) ) if rules.empty? && data.empty?
72
+
73
+ # if the array is not empty and there are zero sub-rules (it is suppose to be empty)
74
+ return evaluate_reject( annotations,
75
+ Evaluation.new( false, "Non-empty array at #{jcr} from #{rule_atom}" ) ) if rules.empty? && data.length != 0
76
+
77
+ if ordered
78
+ return evaluate_reject( annotations, evaluate_array_rule_ordered( rules, rule_atom, data, econs, behavior ) )
79
+ else
80
+ return evaluate_reject( annotations, evaluate_array_rule_unordered( rules, rule_atom, data, econs, behavior ) )
81
+ end
82
+ end
83
+
84
+ def self.evaluate_array_rule_ordered jcr, rule_atom, data, econs, behavior = nil
85
+ retval = nil
86
+
87
+ behavior = ArrayBehavior.new unless behavior
88
+ array_index = behavior.last_index
89
+
90
+
91
+ jcr.each do |rule|
92
+
93
+ # short circuit logic
94
+ if rule[:choice_combiner] && retval && retval.success
95
+ next
96
+ elsif rule[:sequence_combiner] && retval && !retval.success
97
+ break
98
+ end
99
+
100
+ repeat_min, repeat_max = get_repetitions( rule )
101
+
102
+ # group rules must be evaluated differently
103
+ # groups require the effects of the evaluation to be discarded if they are false
104
+ # groups must also be given the entire array
105
+
106
+ if (grule = get_group(rule, econs))
107
+
108
+ if repeat_min == 0
109
+ retval = Evaluation.new( true, nil )
110
+ else
111
+ for i in 1..repeat_min do
112
+ if array_index == data.length
113
+ return Evaluation.new( false, "array is not large enough for #{jcr} from #{rule_atom}" )
114
+ else
115
+ group_behavior = ArrayBehavior.new( behavior )
116
+ group_behavior.last_index = array_index
117
+ retval = evaluate_rule( grule, rule_atom, data, econs, group_behavior )
118
+ if retval.success
119
+ behavior.checked_hash.merge!( group_behavior.checked_hash )
120
+ array_index = group_behavior.last_index
121
+ else
122
+ break;
123
+ end
124
+ end
125
+ end
126
+ end
127
+ if !retval || retval.success
128
+ for i in behavior.checked_hash.length..repeat_max-1 do
129
+ break if array_index == data.length
130
+ group_behavior = ArrayBehavior.new( behavior )
131
+ group_behavior.last_index = array_index
132
+ e = evaluate_rule( grule, rule_atom, data, econs, group_behavior )
133
+ if e.success
134
+ behavior.checked_hash.merge!( group_behavior.checked_hash )
135
+ array_index = group_behavior.last_index
136
+ else
137
+ break;
138
+ end
139
+ end
140
+ end
141
+
142
+ else # else not grule (group)
143
+
144
+ if repeat_min == 0
145
+ retval = Evaluation.new( true, nil )
146
+ else
147
+ for i in 1..repeat_min do
148
+ if array_index == data.length
149
+ return Evaluation.new( false, "array is not large enough for #{jcr} from #{rule_atom}" )
150
+ else
151
+ retval = evaluate_rule( rule, rule_atom, data[ array_index ], econs, nil )
152
+ break unless retval.success
153
+ array_index = array_index + 1
154
+ behavior.checked_hash[ i + behavior.last_index ] = retval.success
155
+ end
156
+ end
157
+ end
158
+ if !retval || retval.success
159
+ for i in behavior.checked_hash.length..repeat_max-1 do
160
+ break if array_index == data.length
161
+ e = evaluate_rule( rule, rule_atom, data[ array_index ], econs, nil )
162
+ break unless e.success
163
+ array_index = array_index + 1
164
+ end
165
+ end
166
+
167
+ end # end if grule else
168
+
169
+ end
170
+
171
+ behavior.last_index = array_index
172
+
173
+ if data.length > array_index && behavior.extra_prohibited
174
+ retval = Evaluation.new( false, "More itmes in array than specified for #{jcr} from #{rule_atom}" )
175
+ end
176
+
177
+ return retval
178
+
179
+ end
180
+
181
+ def self.evaluate_array_rule_unordered jcr, rule_atom, data, econs, behavior = nil
182
+
183
+ retval = nil
184
+ unless behavior
185
+ behavior = ArrayBehavior.new
186
+ behavior.ordered = false
187
+ end
188
+ highest_index = 0
189
+
190
+ jcr.each do |rule|
191
+
192
+ # short circuit logic
193
+ if rule[:choice_combiner] && retval && retval.success
194
+ next
195
+ elsif rule[:sequence_combiner] && retval && !retval.success
196
+ break
197
+ end
198
+
199
+ repeat_min, repeat_max = get_repetitions( rule )
200
+
201
+ # group rules must be evaluated differently
202
+ # groups require the effects of the evaluation to be discarded if they are false
203
+ # groups must also be given the entire array
204
+
205
+ if (grule = get_group(rule, econs))
206
+
207
+ successes = 0
208
+ for i in 0..repeat_max-1
209
+ group_behavior = ArrayBehavior.new( behavior )
210
+ group_behavior.last_index = highest_index
211
+ group_behavior.ordered = false
212
+ e = evaluate_rule( grule, rule_atom, data, econs, group_behavior )
213
+ if e.success
214
+ highest_index = group_behavior.last_index
215
+ behavior.checked_hash.merge!( group_behavior.checked_hash )
216
+ successes = successes + 1
217
+ else
218
+ break;
219
+ end
220
+ end
221
+
222
+ if successes == 0 && repeat_min > 0
223
+ retval = Evaluation.new( false, "array does not contain #{rule} for #{jcr} from #{rule_atom}")
224
+ elsif successes < repeat_min
225
+ retval = Evaluation.new( false, "array does not have enough #{rule} for #{jcr} from #{rule_atom}")
226
+ elsif successes > repeat_max
227
+ retval = Evaluation.new( false, "array has too many #{rule} for #{jcr} from #{rule_atom}")
228
+ else
229
+ retval = Evaluation.new( true, nil )
230
+ end
231
+
232
+ else # else not group rule
233
+
234
+ successes = 0
235
+ for i in behavior.last_index..data.length
236
+ break if successes == repeat_max
237
+ unless behavior.checked_hash[ i ]
238
+ e = evaluate_rule( rule, rule_atom, data[ i ], econs, nil )
239
+ if e.success
240
+ behavior.checked_hash[ i ] = e.success
241
+ highest_index = i if i > highest_index
242
+ successes = successes + 1
243
+ end
244
+ end
245
+ end
246
+
247
+ if successes == 0 && repeat_min > 0
248
+ retval = Evaluation.new( false, "array does not contain #{rule} for #{jcr} from #{rule_atom}")
249
+ elsif successes < repeat_min
250
+ retval = Evaluation.new( false, "array does not have enough #{rule} for #{jcr} from #{rule_atom}")
251
+ elsif successes > repeat_max
252
+ retval = Evaluation.new( false, "array has too many #{rule} for #{jcr} from #{rule_atom}")
253
+ else
254
+ retval = Evaluation.new( true, nil)
255
+ end
256
+
257
+ end # if grule else
258
+
259
+ end
260
+
261
+ behavior.last_index = highest_index
262
+
263
+ if data.length > behavior.checked_hash.length && behavior.extra_prohibited
264
+ retval = Evaluation.new( false, "More itmes in array than specified for #{jcr} from #{rule_atom}" )
265
+ end
266
+
267
+ return retval
268
+ end
269
+
270
+ end
@@ -0,0 +1,46 @@
1
+ # Copyright (c) 2015 American Registry for Internet Numbers
2
+ #
3
+ # Permission to use, copy, modify, and/or distribute this software for any
4
+ # purpose with or without fee is hereby granted, provided that the above
5
+ # copyright notice and this permission notice appear in all copies.
6
+ #
7
+ # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8
+ # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
+ # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10
+ # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
+ # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12
+ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
13
+ # IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14
+
15
+ require 'ipaddr'
16
+ require 'time'
17
+ require 'addressable/uri'
18
+ require 'addressable/template'
19
+ require 'email_address_validator'
20
+ require 'big-phoney'
21
+
22
+ require 'jcr/parser'
23
+ require 'jcr/map_rule_names'
24
+ require 'jcr/check_groups'
25
+
26
+ module JCR
27
+
28
+ def self.evaluate_group_rule jcr, rule_atom, data, econs, behavior = nil
29
+
30
+ rules, annotations = get_rules_and_annotations( jcr )
31
+
32
+ retval = nil
33
+
34
+ rules.each do |rule|
35
+ if rule[:choice_combiner] && retval && retval.success
36
+ return evaluate_reject( annotations, retval ) # short circuit
37
+ elsif rule[:sequence_combiner] && retval && !retval.success
38
+ return evaluate_reject( annotations, retval ) # short circuit
39
+ end
40
+ retval = evaluate_rule( rule, rule_atom, data, econs, behavior )
41
+ end
42
+
43
+ return evaluate_reject( annotations, retval )
44
+ end
45
+
46
+ end
@@ -0,0 +1,61 @@
1
+ # Copyright (c) 2015 American Registry for Internet Numbers
2
+ #
3
+ # Permission to use, copy, modify, and/or distribute this software for any
4
+ # purpose with or without fee is hereby granted, provided that the above
5
+ # copyright notice and this permission notice appear in all copies.
6
+ #
7
+ # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8
+ # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
+ # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10
+ # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
+ # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12
+ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
13
+ # IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14
+
15
+ require 'ipaddr'
16
+ require 'time'
17
+ require 'addressable/uri'
18
+ require 'addressable/template'
19
+ require 'email_address_validator'
20
+ require 'big-phoney'
21
+
22
+ require 'jcr/parser'
23
+ require 'jcr/map_rule_names'
24
+ require 'jcr/check_groups'
25
+
26
+ module JCR
27
+
28
+ def self.evaluate_member_rule jcr, rule_atom, data, econs
29
+
30
+ # unlike the other evaluate functions, here data is not just the json data.
31
+ # it is an array, the first element being the member name or regex and the
32
+ # second being the json data to be furthered on to other evaluation functions
33
+
34
+ rules, annotations = get_rules_and_annotations( jcr )
35
+ rule = rules[0]
36
+
37
+ member_match = false
38
+
39
+ if rule[:member_name]
40
+ match_spec = rule[:member_name][:q_string].to_s
41
+ if match_spec == data[ 0 ]
42
+ member_match = true
43
+ end
44
+ else # must be regex
45
+ match_spec = Regexp.new( rule[:member_regex][:regex].to_s )
46
+ if match_spec =~ data[ 0 ]
47
+ member_match = true
48
+ end
49
+ end
50
+
51
+ if member_match
52
+ e = evaluate_rule( rule, rule_atom, data[ 1 ], econs )
53
+ return evaluate_reject( annotations, e )
54
+ end
55
+
56
+ return evaluate_reject( annotations,
57
+ Evaluation.new( false, "#{match_spec} does not match #{data[0]} for #{jcr} from #{rule_atom}" ) )
58
+
59
+ end
60
+
61
+ end