array_logic 0.0.2 → 0.0.3
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 +20 -1
- data/lib/array_logic/rule.rb +35 -6
- data/lib/array_logic/version.rb +1 -1
- data/lib/example.rb +25 -0
- data/test/array_logic/rule_test.rb +32 -1
- metadata +9 -8
data/README.rdoc
CHANGED
@@ -29,4 +29,23 @@ The *match* and *matches* methods allow arrays to be tested against these rules:
|
|
29
29
|
rule_two.match([a1, a2]) --> false
|
30
30
|
rule_two.matches([a1, a2], [a1]) --> [[a1]]
|
31
31
|
|
32
|
-
See test/array_logic/rule_test for more examples
|
32
|
+
See test/array_logic/rule_test for more examples
|
33
|
+
|
34
|
+
=== Combinations that match
|
35
|
+
|
36
|
+
Two methods allow you to determine sample combinations that match the current
|
37
|
+
rule.
|
38
|
+
|
39
|
+
rule = ArrayLogic::Rule.new
|
40
|
+
rule.rule = 'a1 and a2'
|
41
|
+
rule.combinations_that_match --> [[1,2]]
|
42
|
+
rule.combinations_that_do_not_match --> [[1],[2]]
|
43
|
+
|
44
|
+
To limit the number of samples presented, both only use ids used within
|
45
|
+
the rule. For the example about, an array that includes [1,2] would match,
|
46
|
+
and so would [1,2,3]. However, arrays that only contain 1 or 2 would not match
|
47
|
+
(for example [1,3])
|
48
|
+
|
49
|
+
Run example.rb to see some more examples
|
50
|
+
|
51
|
+
ruby /lib/example.rb
|
data/lib/array_logic/rule.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module ArrayLogic
|
2
2
|
class Rule
|
3
3
|
attr_accessor :rule
|
4
|
-
attr_reader :things
|
4
|
+
attr_reader :things, :thing_ids
|
5
5
|
|
6
6
|
def initialize
|
7
7
|
|
@@ -14,6 +14,7 @@ module ArrayLogic
|
|
14
14
|
def match(things)
|
15
15
|
rule_valid?
|
16
16
|
@things = things
|
17
|
+
@thing_ids = things.collect(&:id)
|
17
18
|
logic
|
18
19
|
end
|
19
20
|
|
@@ -29,19 +30,43 @@ module ArrayLogic
|
|
29
30
|
def replace_item(pattern, processor)
|
30
31
|
@processed_rule = processed_rule.gsub(pattern) {|x| processor.call(x)}
|
31
32
|
end
|
33
|
+
|
34
|
+
def object_ids_used
|
35
|
+
chrs_after_first = 1..-1
|
36
|
+
objects_identifiers_in_rule.collect{|i| i[chrs_after_first].to_i}
|
37
|
+
end
|
38
|
+
|
39
|
+
def combinations_that_match
|
40
|
+
combinations_of_identifiers_in_rule.delete_if{|ids| ! match_ids(ids)}
|
41
|
+
end
|
42
|
+
|
43
|
+
def combinations_that_do_not_match
|
44
|
+
combinations_of_identifiers_in_rule.delete_if{|ids| match_ids(ids)}
|
45
|
+
end
|
32
46
|
|
33
47
|
private
|
34
|
-
def
|
35
|
-
|
48
|
+
def match_ids(ids)
|
49
|
+
rule_valid?
|
50
|
+
@thing_ids = ids
|
51
|
+
logic
|
36
52
|
end
|
37
|
-
|
53
|
+
|
54
|
+
def combinations_of_identifiers_in_rule
|
55
|
+
ids = object_ids_used
|
56
|
+
combinations = Array.new
|
57
|
+
(1..ids.length).each{|n| ids.combination(n).each{|c| combinations << c}}
|
58
|
+
return combinations
|
59
|
+
end
|
60
|
+
|
61
|
+
def objects_identifiers_in_rule
|
62
|
+
rule_without_punctuation.split.delete_if{|x| !(thing_id_pattern =~ x)}
|
63
|
+
end
|
64
|
+
|
38
65
|
def expression
|
39
66
|
rule_processing_steps
|
40
67
|
return final_processed_rule
|
41
68
|
end
|
42
69
|
|
43
|
-
|
44
|
-
|
45
70
|
def rule_processing_steps
|
46
71
|
add_space_around_puctuation_characters
|
47
72
|
make_everything_lower_case
|
@@ -100,6 +125,10 @@ module ArrayLogic
|
|
100
125
|
def reset_processed_rule_ready_for_next_comparison
|
101
126
|
@processed_rule = nil
|
102
127
|
end
|
128
|
+
|
129
|
+
def rule_without_punctuation
|
130
|
+
rule.gsub(/[[:punct:]]/, '')
|
131
|
+
end
|
103
132
|
|
104
133
|
def check_rule_entered
|
105
134
|
raise "You must define a rule before trying to match" unless rule.kind_of? String
|
data/lib/array_logic/version.rb
CHANGED
data/lib/example.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'array_logic'
|
2
|
+
|
3
|
+
rule_sets = [
|
4
|
+
"(t1 and t2) or (t3 and t4)",
|
5
|
+
"t1 and not t2",
|
6
|
+
"2 in t1 t2 t3",
|
7
|
+
"(2 in t1 t2 t3) and (1 in t4 t5)"
|
8
|
+
]
|
9
|
+
|
10
|
+
rule_sets.each do |rule_set|
|
11
|
+
|
12
|
+
rule = ArrayLogic::Rule.new
|
13
|
+
rule.rule = rule_set
|
14
|
+
|
15
|
+
puts "----------------------------\n"
|
16
|
+
puts "The rule '#{rule_set}' would match the following:"
|
17
|
+
|
18
|
+
rule.combinations_that_match.each{|c| puts "\t#{c.inspect}"}
|
19
|
+
|
20
|
+
puts "\nAnd would not match"
|
21
|
+
|
22
|
+
rule.combinations_that_do_not_match.each{|c| puts "\t#{c.inspect}"}
|
23
|
+
|
24
|
+
puts "\n\n"
|
25
|
+
end
|
@@ -49,7 +49,7 @@ module ArrayLogic
|
|
49
49
|
assert_no_thing_match([3], @rule)
|
50
50
|
end
|
51
51
|
|
52
|
-
def
|
52
|
+
def test_one_or_one_and_version_two
|
53
53
|
@rule.rule = '( t1 or t2 ) and t3'
|
54
54
|
assert_no_thing_match([1, 2], @rule)
|
55
55
|
assert_thing_match([1, 2, 3], @rule)
|
@@ -210,5 +210,36 @@ module ArrayLogic
|
|
210
210
|
assert_equal(expected, result)
|
211
211
|
end
|
212
212
|
|
213
|
+
def test_match_with_empty_rule
|
214
|
+
@rule.rule = ""
|
215
|
+
things = get_things([1, 2])
|
216
|
+
assert(!@rule.match([things.first]), "Should be no match when rule empty")
|
217
|
+
end
|
218
|
+
|
219
|
+
def test_matches_with_empty_rule
|
220
|
+
@rule.rule = ""
|
221
|
+
things = get_things([1, 2])
|
222
|
+
assert_equal([], @rule.matches([things.first], [things.last]))
|
223
|
+
end
|
224
|
+
|
225
|
+
def test_object_ids_used
|
226
|
+
@rule.rule = '(t1 && 1 in t2 t3) || t4'
|
227
|
+
assert_equal([1, 2, 3, 4], @rule.object_ids_used)
|
228
|
+
end
|
229
|
+
|
230
|
+
def test_combinations_that_match
|
231
|
+
@rule.rule = 't1 or t2'
|
232
|
+
assert_equal([[1], [2], [1,2]], @rule.combinations_that_match)
|
233
|
+
@rule.rule = 't1 and t2'
|
234
|
+
assert_equal([[1,2]], @rule.combinations_that_match)
|
235
|
+
end
|
236
|
+
|
237
|
+
def test_combinations_that_do_not_match
|
238
|
+
@rule.rule = 't1 or t2'
|
239
|
+
assert_equal([], @rule.combinations_that_do_not_match)
|
240
|
+
@rule.rule = 't1 and t2'
|
241
|
+
assert_equal([[1],[2]], @rule.combinations_that_do_not_match)
|
242
|
+
end
|
243
|
+
|
213
244
|
end
|
214
245
|
end
|
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.0.
|
4
|
+
version: 0.0.3
|
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: 2012-11-
|
12
|
+
date: 2012-11-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.
|
@@ -19,16 +19,17 @@ executables: []
|
|
19
19
|
extensions: []
|
20
20
|
extra_rdoc_files: []
|
21
21
|
files:
|
22
|
-
- lib/array_logic.rb
|
23
|
-
- lib/array_logic/thing.rb
|
24
22
|
- lib/array_logic/version.rb
|
23
|
+
- lib/array_logic/thing.rb
|
25
24
|
- lib/array_logic/rule.rb
|
25
|
+
- lib/array_logic.rb
|
26
|
+
- lib/example.rb
|
26
27
|
- MIT-LICENSE
|
27
28
|
- Rakefile
|
28
29
|
- README.rdoc
|
29
|
-
- test/array_logic/thing_test.rb
|
30
|
-
- test/array_logic/rule_test.rb
|
31
30
|
- test/array_logic/test_case.rb
|
31
|
+
- test/array_logic/rule_test.rb
|
32
|
+
- test/array_logic/thing_test.rb
|
32
33
|
homepage: https://github.com/reggieb/array_logic
|
33
34
|
licenses: []
|
34
35
|
post_install_message:
|
@@ -54,6 +55,6 @@ signing_key:
|
|
54
55
|
specification_version: 3
|
55
56
|
summary: Matches arrays of objects against logical rules.
|
56
57
|
test_files:
|
57
|
-
- test/array_logic/thing_test.rb
|
58
|
-
- test/array_logic/rule_test.rb
|
59
58
|
- test/array_logic/test_case.rb
|
59
|
+
- test/array_logic/rule_test.rb
|
60
|
+
- test/array_logic/thing_test.rb
|