array_logic 0.2.0 → 0.2.1

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.
data/README.rdoc CHANGED
@@ -69,7 +69,7 @@ where:
69
69
 
70
70
  [function] One of the functions listed below
71
71
  [object_method] A method that can be called on all of the objects in the array
72
- [operator] one of: <, <=, >, >=, ==
72
+ [operator] one of: <, <=, >, >=, ==, !=
73
73
  [number] a number to compare with the result
74
74
 
75
75
  Using this array as an example:
@@ -117,7 +117,7 @@ module ArrayLogic
117
117
  end
118
118
 
119
119
  def function_pattern
120
- /(#{array_functions.keys.join('|')})\(\s*\:(\w+[\?\!]?)\s*\)\s*((==|[\<\>]=?)\s*\d+(\.\d+)?)/
120
+ /(#{array_functions.keys.join('|')})\(\s*\:(\w+[\?\!]?)\s*\)\s*((==|[\<\>\!]=?)\s*\d+(\.\d+)?)/
121
121
  end
122
122
 
123
123
  def array_functions
@@ -132,10 +132,18 @@ module ArrayLogic
132
132
  lambda do |string|
133
133
  all, array_function, function, operator = function_pattern.match(string).to_a
134
134
  values = things.collect &function.to_sym
135
+ numbers_booleans_or_nils?(values)
135
136
  result = values.instance_eval(array_functions[array_function.to_sym])
136
137
  "( #{result} #{operator} )"
137
138
  end
138
139
  end
140
+
141
+ def numbers_booleans_or_nils?(values)
142
+ errors = values.reject{|v| v.nil? || v.is_a?(Numeric) || !!v == v}
143
+ unless errors.empty?
144
+ raise "Values must be numbers or nils. The problem is here: #{errors.join(", ")}"
145
+ end
146
+ end
139
147
 
140
148
  def processed_rule
141
149
  @processed_rule ||= rule.clone
@@ -1,10 +1,14 @@
1
1
  module ArrayLogic
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
4
4
 
5
5
  # History
6
6
  # =======
7
7
  #
8
+ # Version 0.2.1
9
+ # =============
10
+ # Improved handling of errors in functions and add != operator
11
+ #
8
12
  # Version 0.2.0
9
13
  # =============
10
14
  # Adds functions: sum, count and average
@@ -238,6 +238,14 @@ module ArrayLogic
238
238
  assert_no_thing_match([4], @rule)
239
239
  end
240
240
 
241
+ def test_count_with_not_equal_operator
242
+ @rule.rule = 'count(:id_odd?) != 1'
243
+ assert_no_thing_match([1, 2], @rule)
244
+ assert_thing_match([1, 2, 3], @rule)
245
+ assert_no_thing_match([3], @rule)
246
+ assert_thing_match([4], @rule)
247
+ end
248
+
241
249
  def test_function_with_other_rule
242
250
  @rule.rule = 'sum(:id) >= 3 and t3'
243
251
  assert_no_thing_match([1, 2], @rule)
@@ -254,6 +262,48 @@ module ArrayLogic
254
262
  assert_no_thing_match([4], @rule)
255
263
  end
256
264
 
265
+ def test_function_with_non_existent_object_method
266
+ @rule.rule = 'sum(:something) > 3'
267
+ assert_raise NoMethodError do
268
+ @rule.match(get_things([1, 2]))
269
+ end
270
+ end
271
+
272
+ def test_function_with_unsupported_function
273
+ @rule.rule = 'hat_stand(:id) > 3'
274
+ assert_raise RuntimeError do
275
+ @rule.match(get_things([1, 2]))
276
+ end
277
+ end
278
+
279
+ def test_function_with_unsupported_operator
280
+ @rule.rule = 'sum(:id) || 3'
281
+ assert_raise RuntimeError do
282
+ @rule.match(get_things([1, 2]))
283
+ end
284
+ end
285
+
286
+ def test_function_with_single_equals
287
+ @rule.rule = 'sum(:id) = 3'
288
+ assert_raise RuntimeError do
289
+ @rule.match(get_things([1, 2]))
290
+ end
291
+ end
292
+
293
+ def test_function_without_number
294
+ @rule.rule = 'sum(:id) == a1'
295
+ assert_raise RuntimeError do
296
+ @rule.match(get_things([1, 2]))
297
+ end
298
+ end
299
+
300
+ def test_function_with_object_method_that_does_not_return_number
301
+ @rule.rule = 'sum(:methods) == 1'
302
+ assert_raise RuntimeError do
303
+ @rule.match(get_things([1, 2]))
304
+ end
305
+ end
306
+
257
307
  def test_match_without_rule
258
308
  assert_raise RuntimeError do
259
309
  @rule.match([1, 2])
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: array_logic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-26 00:00:00.000000000 Z
12
+ date: 2013-03-27 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Allow a user to define a set of rules, and then test to see if an array
15
15
  of object match those rules.