claus 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +19 -13
- data/lib/claus.rb +13 -8
- data/test/test_claus.rb +8 -0
- metadata +1 -1
data/README.md
CHANGED
@@ -6,19 +6,25 @@ Simple rule expression using a combination of Array and Hash.
|
|
6
6
|
|
7
7
|
```ruby
|
8
8
|
|
9
|
-
require 'claus'
|
10
|
-
claus = Claus.new(foo: 1, bar: 2)
|
11
|
-
claus.match(foo: 1, bar: 2) #=> true
|
12
|
-
claus.match(foo: 1, bar: 3) #=> false
|
13
|
-
claus.match(foo: 1, bar: 2, baz: 3) #=> true
|
14
|
-
|
15
|
-
claus = Claus.new(foo: 1, bar: 1..2)
|
16
|
-
claus.match(foo: 1, bar: 2) #=> true
|
17
|
-
|
18
|
-
claus = Claus.new([{foo:1}, {bar:2}])
|
19
|
-
claus.match?(foo: 1) #=> true
|
20
|
-
claus.match?(bar: 2) #=> true
|
21
|
-
claus.match?(baz: 3) #=> false
|
9
|
+
require 'claus'
|
10
|
+
claus = Claus.new(foo: 1, bar: 2)
|
11
|
+
claus.match(foo: 1, bar: 2) #=> true
|
12
|
+
claus.match(foo: 1, bar: 3) #=> false
|
13
|
+
claus.match(foo: 1, bar: 2, baz: 3) #=> true
|
14
|
+
|
15
|
+
claus = Claus.new(foo: 1, bar: 1..2)
|
16
|
+
claus.match(foo: 1, bar: 2) #=> true
|
17
|
+
|
18
|
+
claus = Claus.new([{foo:1}, {bar:2}])
|
19
|
+
claus.match?(foo: 1) #=> true
|
20
|
+
claus.match?(bar: 2) #=> true
|
21
|
+
claus.match?(baz: 3) #=> false
|
22
|
+
|
23
|
+
# Chaining AST nodes - same as above.
|
24
|
+
claus = Claus.new [{foo: 1}, Claus.new(bar: 2)]
|
25
|
+
claus.match?(foo: 1) #=> true
|
26
|
+
claus.match?(bar: 2) #=> true
|
27
|
+
claus.match?(baz: 3) #=> false
|
22
28
|
```
|
23
29
|
|
24
30
|
# License
|
data/lib/claus.rb
CHANGED
@@ -15,6 +15,8 @@
|
|
15
15
|
# claus.match?(baz: 3) #=> false
|
16
16
|
#
|
17
17
|
class Claus
|
18
|
+
attr_reader :ast
|
19
|
+
|
18
20
|
def initialize expression
|
19
21
|
@ast = compile(expression)
|
20
22
|
end
|
@@ -26,9 +28,10 @@ class Claus
|
|
26
28
|
protected
|
27
29
|
def compile expression
|
28
30
|
case expression
|
29
|
-
when Hash
|
30
|
-
when Array
|
31
|
-
|
31
|
+
when Hash then AST::Hash.new(expression)
|
32
|
+
when Array then AST::List.new(expression)
|
33
|
+
when AST::Node then expression
|
34
|
+
else raise ArgumentError, "invalid expression at #{expression}"
|
32
35
|
end
|
33
36
|
end
|
34
37
|
|
@@ -56,7 +59,8 @@ class Claus
|
|
56
59
|
when ::Hash then h[k] = Hash.new(v)
|
57
60
|
when ::Array then h[k] = List.new(v)
|
58
61
|
when ::Range then h[k] = List.new(v)
|
59
|
-
|
62
|
+
when Claus then h[k] = v.ast
|
63
|
+
else h[k] = v.kind_of?(Node) ? v : Node.new(v)
|
60
64
|
end
|
61
65
|
end
|
62
66
|
end
|
@@ -74,10 +78,11 @@ class Claus
|
|
74
78
|
def compile expression
|
75
79
|
expression.map do |v|
|
76
80
|
case v
|
77
|
-
when ::Hash
|
78
|
-
when ::Array
|
79
|
-
when ::Range
|
80
|
-
|
81
|
+
when ::Hash then Hash.new(v)
|
82
|
+
when ::Array then List.new(v)
|
83
|
+
when ::Range then List.new(v)
|
84
|
+
when Claus then v.ast
|
85
|
+
else v.kind_of?(Node) ? v : Node.new(v)
|
81
86
|
end
|
82
87
|
end
|
83
88
|
end
|
data/test/test_claus.rb
CHANGED
@@ -48,4 +48,12 @@ describe 'claus' do
|
|
48
48
|
assert_equal false, claus.match?(foo: 1)
|
49
49
|
assert_equal false, claus.match?(foo: 2)
|
50
50
|
end
|
51
|
+
|
52
|
+
it 'should allow ast chaining' do
|
53
|
+
claus = Claus.new([Claus.new(foo: 1), Claus.new(bar: 2).ast])
|
54
|
+
assert_equal true, claus.match?(foo: 1)
|
55
|
+
assert_equal true, claus.match?(bar: 2)
|
56
|
+
assert_equal false, claus.match?(foo: 2)
|
57
|
+
assert_equal false, claus.match?(bar: 1)
|
58
|
+
end
|
51
59
|
end
|