formula_dsl 0.2.0 → 0.3.0
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/VERSION +1 -1
- data/formula_dsl.gemspec +1 -1
- data/lib/formula_dsl/parser.rb +8 -8
- data/spec/formula_dsl/parser_spec.rb +44 -0
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/formula_dsl.gemspec
CHANGED
data/lib/formula_dsl/parser.rb
CHANGED
@@ -33,19 +33,19 @@ module FormulaDSL
|
|
33
33
|
|
34
34
|
#binary operations + - / *
|
35
35
|
rule :addition do
|
36
|
-
(
|
36
|
+
( argument.as(:left) >> space? >> add_operator >> space? >> ( argument ).as(:right) ).as(:+)
|
37
37
|
end
|
38
38
|
|
39
39
|
rule :subtraction do
|
40
|
-
(
|
40
|
+
( argument.as(:left) >> space? >> sub_operator >> space? >> ( argument ).as(:right) ).as(:-)
|
41
41
|
end
|
42
42
|
|
43
43
|
rule :multiplication do
|
44
|
-
(
|
44
|
+
( argument.as(:left) >> space? >> mult_operator >> space? >> ( argument ).as(:right) ).as(:*)
|
45
45
|
end
|
46
46
|
|
47
47
|
rule :division do
|
48
|
-
(
|
48
|
+
( argument.as(:left) >> space? >> div_operator >> space? >> ( argument ).as(:right) ).as(:/)
|
49
49
|
end
|
50
50
|
|
51
51
|
rule :function do
|
@@ -63,19 +63,19 @@ module FormulaDSL
|
|
63
63
|
# expression with other expression (compose expression)
|
64
64
|
# Ex: expression >> some_op >> number === [ Mont(data) - 1 ]
|
65
65
|
rule :subtraction_expression do
|
66
|
-
(single_expression.as(:left) >> space? >> sub_operator >> space? >> (
|
66
|
+
(single_expression.as(:left) >> space? >> sub_operator >> space? >> ( expression_list | argument).as(:right) ).as(:-)
|
67
67
|
end
|
68
68
|
|
69
69
|
rule :addition_expression do
|
70
|
-
(single_expression.as(:left) >> space? >> add_operator >> space? >> ( expression_list |
|
70
|
+
(single_expression.as(:left) >> space? >> add_operator >> space? >> ( expression_list | argument ).as(:right) ).as(:+)
|
71
71
|
end
|
72
72
|
|
73
73
|
rule :multiplication_expression do
|
74
|
-
(single_expression.as(:left) >> space? >> mult_operator >> space? >> (
|
74
|
+
(single_expression.as(:left) >> space? >> mult_operator >> space? >> (expression_list | argument).as(:right) ).as(:*)
|
75
75
|
end
|
76
76
|
|
77
77
|
rule :division_expression do
|
78
|
-
(single_expression.as(:left) >> space? >> div_operator >> space? >> (
|
78
|
+
(single_expression.as(:left) >> space? >> div_operator >> space? >> (expression_list | argument).as(:right) ).as(:/)
|
79
79
|
end
|
80
80
|
|
81
81
|
rule :string_concat_expression do
|
@@ -34,6 +34,34 @@ module FormulaDSL
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
context "Expressions based on identifier names (aka variables)" do
|
38
|
+
it "should recognize expression 'budget + fee' " do
|
39
|
+
ast = parser.parse('budget + fee')
|
40
|
+
ast.to_s.should == %Q({:+=>{:left=>"budget"@0, :right=>"fee"@9}})
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should recognize expression 'budget - fee' " do
|
44
|
+
ast = parser.parse('budget - fee')
|
45
|
+
ast.to_s.should == %Q({:-=>{:left=>"budget"@0, :right=>"fee"@9}})
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should recognize expression 'budget * fee' " do
|
49
|
+
ast = parser.parse('budget * fee')
|
50
|
+
ast.to_s.should == %Q({:*=>{:left=>"budget"@0, :right=>"fee"@9}})
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should recognize expression 'budget + 1 + fee' " do
|
54
|
+
ast = parser.parse('budget + 1 + fee')
|
55
|
+
ast.to_s.should == %Q({:+=>{:left=>{:+=>{:left=>"budget"@0, :right=>"1"@9}}, :right=>"fee"@13}})
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should recognize expression 'budget * 1 + fee' " do
|
59
|
+
ast = parser.parse('budget * 1 + fee')
|
60
|
+
ast.to_s.should == %Q({:+=>{:left=>{:*=>{:left=>"budget"@0, :right=>"1"@9}}, :right=>"fee"@13}})
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
37
65
|
context "Composed expression's " do
|
38
66
|
it "should recognize a function like 'Month(data)' " do
|
39
67
|
ast = parser.parse('Month(data)')
|
@@ -81,6 +109,22 @@ module FormulaDSL
|
|
81
109
|
ast = parser.parse('Month(data) + "/" + Year(data)')
|
82
110
|
ast.to_s.should == %Q({:+=>{:left=>{:function=>{:name=>"Month"@0, :args=>"data"@6}}, :right=>{:+=>{:left=>"\\\"/\\\""@14, :right=>{:function=>{:name=>"Year"@20, :args=>"data"@25}}}}}})
|
83
111
|
end
|
112
|
+
|
113
|
+
it " should recognize expression with string concat 'Month(data) - 1 + \"/\" + Year(data)'" do
|
114
|
+
ast = parser.parse('Month(data) - 1 + "/" + Year(data)')
|
115
|
+
ast.to_s.should == %Q({:-=>{:left=>{:function=>{:name=>\"Month\"@0, :args=>\"data\"@6}}, :right=>{:+=>{:left=>\"1\"@14, :right=>{:+=>{:left=>\"\\\"/\\\"\"@18, :right=>{:function=>{:name=>\"Year\"@24, :args=>\"data\"@29}}}}}}}})
|
116
|
+
end
|
117
|
+
|
118
|
+
it " should recognize expression with string concat 'Month(data) - 1 + \"/\" + Year(data)'" do
|
119
|
+
ast = parser.parse('Month(data) * 1 + "/" + Year(data)')
|
120
|
+
ast.to_s.should == %Q({:*=>{:left=>{:function=>{:name=>\"Month\"@0, :args=>\"data\"@6}}, :right=>{:+=>{:left=>\"1\"@14, :right=>{:+=>{:left=>\"\\\"/\\\"\"@18, :right=>{:function=>{:name=>\"Year\"@24, :args=>\"data\"@29}}}}}}}})
|
121
|
+
end
|
122
|
+
|
123
|
+
it " should recognize expression with string concat 'Month(data) - 1 + \"/\" + Year(data)'" do
|
124
|
+
ast = parser.parse('Month(data) / 1 + "/" + Year(data)')
|
125
|
+
ast.to_s.should == %Q({:/=>{:left=>{:function=>{:name=>\"Month\"@0, :args=>\"data\"@6}}, :right=>{:+=>{:left=>\"1\"@14, :right=>{:+=>{:left=>\"\\\"/\\\"\"@18, :right=>{:function=>{:name=>\"Year\"@24, :args=>\"data\"@29}}}}}}}})
|
126
|
+
end
|
127
|
+
|
84
128
|
end
|
85
129
|
|
86
130
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: formula_dsl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -125,7 +125,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
125
125
|
version: '0'
|
126
126
|
segments:
|
127
127
|
- 0
|
128
|
-
hash:
|
128
|
+
hash: -3658736757412770386
|
129
129
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
130
|
none: false
|
131
131
|
requirements:
|