array_logic 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -39,25 +39,6 @@ and *blockers*:
39
39
 
40
40
  See test/array_logic/rule_test for more examples
41
41
 
42
- == Combinations that match
43
-
44
- Two methods allow you to determine sample combinations that match the current
45
- rule.
46
-
47
- rule = ArrayLogic::Rule.new 'a1 and a2'
48
-
49
- rule.matching_combinations --> [[1,2]]
50
- rule.blocking_combinations --> [[1],[2]]
51
-
52
- To limit the number of samples presented, both only use ids used within
53
- the rule. For the example above, an array that includes [1,2] would match,
54
- and so would [1,2,3]. However, arrays that only contain 1 or 2 would not match
55
- (for example [1,3])
56
-
57
- Run example.rb to see some more examples
58
-
59
- ruby /lib/example.rb
60
-
61
42
  == Functions
62
43
 
63
44
  Version 0.2 introduces the concept of functions to ArrayLogic. The function
@@ -123,3 +104,35 @@ functions can be combined with other rules:
123
104
 
124
105
  rule = ArrayLogic::Rule.new '(sum(:id) == 12) and not a6'
125
106
  rule.match(answers) --> false
107
+
108
+ == Combinations that match
109
+
110
+ Two methods allow you to determine sample combinations that match the current
111
+ rule.
112
+
113
+ rule = ArrayLogic::Rule.new 'a1 and a2'
114
+
115
+ rule.matching_combinations --> [[1,2]]
116
+ rule.blocking_combinations --> [[1],[2]]
117
+
118
+ To limit the number of samples presented, both only use ids used within
119
+ the rule. For the example above, an array that includes [1,2] would match,
120
+ and so would [1,2,3]. However, arrays that only contain 1 or 2 would not match
121
+ (for example [1,3])
122
+
123
+ === Combinations and functions
124
+
125
+ Combinations are determined by analysing arrays of integers matching the ids
126
+ found in the rule. This works for most rules but not those that contain functions.
127
+
128
+ Therefore, when either matching_combinations, or blocking_combinations are called
129
+ on a rule that contains a function, an exception is raised.
130
+
131
+ rule = ArrayLogic::Rule.new 'sum(:id) > 5'
132
+ rule.matching_combinations --> raises ArrayLogic::UnableToDetermineCombinationsError
133
+
134
+ Thereby handling this issue is passed back to the host application
135
+
136
+ Run example.rb to see some more examples
137
+
138
+ ruby /lib/example.rb
@@ -1,4 +1,5 @@
1
1
  require_relative('array_logic/rule')
2
+ require_relative('array_logic/exceptions')
2
3
  module ArrayLogic
3
4
 
4
5
  end
@@ -0,0 +1,6 @@
1
+
2
+ module ArrayLogic
3
+ class UnableToDetermineCombinationsError < StandardError
4
+
5
+ end
6
+ end
@@ -65,6 +65,9 @@ module ArrayLogic
65
65
  end
66
66
 
67
67
  def combinations_of_identifiers_in_rule_that_pass(&test)
68
+ if function_pattern =~ rule
69
+ raise UnableToDetermineCombinationsError, "Unable to determine combinations for rules that include functions"
70
+ end
68
71
  if rule_valid?
69
72
  combinations = Array.new
70
73
  (1..id_count).each{|n| object_ids_used.combination(n).each{|c| combinations << c if test.call(c)}}
@@ -1,10 +1,16 @@
1
1
  module ArrayLogic
2
- VERSION = "0.2.3"
2
+ VERSION = "0.2.4"
3
3
  end
4
4
 
5
5
  # History
6
6
  # =======
7
7
  #
8
+ # Version 0.2.4
9
+ # -------------
10
+ # Adds mechanism for handling issue of being unable to determine combinations
11
+ # for rules with functions, without increasing complexity of combinations methods.
12
+ # Choice of how to handle the issue can be made in the host app.
13
+ #
8
14
  # Version 0.2.3
9
15
  # -------------
10
16
  # Bug fix: Identification of ids in rule would see a number preceded by a number
@@ -448,6 +448,13 @@ module ArrayLogic
448
448
  assert_equal(1, @rule.matching_combinations.length, "should not identify combinations for both occurancies of each id")
449
449
  end
450
450
 
451
+ def test_matching_combinations_with_function
452
+ @rule.rule = 'sum(:id) == 1'
453
+ assert_raise UnableToDetermineCombinationsError do
454
+ @rule.matching_combinations
455
+ end
456
+ end
457
+
451
458
  def test_blocking_combinations
452
459
  @rule.rule = 't1 or t2'
453
460
  assert_equal([], @rule.blocking_combinations)
@@ -467,6 +474,13 @@ module ArrayLogic
467
474
  assert_equal([], @rule.blocking_combinations)
468
475
  end
469
476
 
477
+ def test_blocking_combinations_with_function
478
+ @rule.rule = 'sum(:id) == 1 and t1'
479
+ assert_raise UnableToDetermineCombinationsError do
480
+ @rule.blocking_combinations
481
+ end
482
+ end
483
+
470
484
  def test_assigning_rule_on_creation
471
485
  text = 'a1 and a2'
472
486
  rule = Rule.new(text)
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.3
4
+ version: 0.2.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -20,6 +20,7 @@ extensions: []
20
20
  extra_rdoc_files: []
21
21
  files:
22
22
  - lib/array_logic/version.rb
23
+ - lib/array_logic/exceptions.rb
23
24
  - lib/array_logic/rule.rb
24
25
  - lib/array_logic.rb
25
26
  - lib/example.rb