formula_dsl 0.3.0 → 0.4.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 CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.4.0
data/formula_dsl.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "formula_dsl"
8
- s.version = "0.3.0"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Sergio Junior"]
12
- s.date = "2012-04-03"
12
+ s.date = "2012-04-11"
13
13
  s.description = " External DSL to express math operations like you do in MSExcel formula bar. The parser generate a AST (Hash) for a given expression. "
14
14
  s.email = "sergior.jr@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -6,6 +6,7 @@ module FormulaDSL
6
6
  rule(:lparen) { str('(') >> space? }
7
7
  rule(:rparen) { str(')') >> space? }
8
8
  rule(:comma) { str(',') >> space? }
9
+ rule(:dot) { str('.') >> space? }
9
10
 
10
11
  # non significant character's
11
12
  rule(:space) { match('\s').repeat(1) }
@@ -14,12 +15,12 @@ module FormulaDSL
14
15
  # Literal's
15
16
  rule(:number) { match('\d').repeat(1) }
16
17
  rule(:quote) { match('"') }
17
- rule(:string) { quote >> space? >> match('.') >> space? >> quote}
18
18
  rule(:identifier) { match['\w'].repeat(1) }
19
+ rule(:string) { quote >> space? >> (str('"').absnt? >> any).repeat(1) >> space? >> quote}
19
20
 
20
21
  # Argument
21
- rule (:argument) { identifier | number }
22
- rule (:arglist) { (argument >> comma.maybe).repeat }
22
+ rule (:argument) { function | identifier | number | string}
23
+ rule (:arglist) { ( argument >> comma.maybe).repeat }
23
24
 
24
25
  # Operators
25
26
  rule(:add_operator ) { match(['+']) }
@@ -8,6 +8,16 @@ module FormulaDSL
8
8
 
9
9
  context "Single Expression's" do
10
10
 
11
+ it "should recognize a number '2' " do
12
+ ast = parser.parse('2')
13
+ ast.to_s.should == '2'
14
+ end
15
+
16
+ it "should recognize a string '\"abc\"' " do
17
+ ast = parser.parse('"abc"')
18
+ ast.to_s.should == %Q("abc")
19
+ end
20
+
11
21
  it "should recognize expression '2 + 1' " do
12
22
  ast = parser.parse('2 + 1')
13
23
  ast.to_s.should == %Q({:+=>{:left=>"2"@0, :right=>"1"@4}})
@@ -62,12 +72,35 @@ module FormulaDSL
62
72
 
63
73
  end
64
74
 
65
- context "Composed expression's " do
75
+ context "Functions" do
76
+ it "should recognize functions with string arguments 'FormatDate(\"MM/yyyy\")'" do
77
+ ast = parser.parse('FormatDate("MM/yyyy")')
78
+ ast.to_s.should == %Q({:function=>{:name=>"FormatDate"@0, :args=>"\\\"MM/yyyy\\\""@11}})
79
+ end
80
+
66
81
  it "should recognize a function like 'Month(data)' " do
67
82
  ast = parser.parse('Month(data)')
68
83
  ast.to_s.should == %Q({:function=>{:name=>"Month"@0, :args=>"data"@6}})
69
84
  end
70
85
 
86
+ it "should recognize expression with composed functions 'Max( Year(data) )'" do
87
+ ast = parser.parse('Max( Year(data) )')
88
+ ast.to_s.should == %Q({:function=>{:name=>"Max"@0, :args=>[{:function=>{:name=>"Year"@5, :args=>"data"@10}}]}})
89
+ end
90
+
91
+ it "should recognize expression with composed functions with 2 arguments 'Max( Year(data), Month(data) )'" do
92
+ ast = parser.parse('Max(Year(data), Month(data))')
93
+ ast.to_s.should == %Q({:function=>{:name=>"Max"@0, :args=>[{:function=>{:name=>"Year"@4, :args=>"data"@9}}, {:function=>{:name=>"Month"@16, :args=>"data"@22}}]}})
94
+ end
95
+
96
+ it "should recognize expression with composed functions with 2 arguments 'FormatDate( PriorMonth(data), \"MM/yyyy\" )'" do
97
+ ast = parser.parse('FormatDate( PriorMonth(data), "MM/yyyy")')
98
+ ast.to_s.should == %Q({:function=>{:name=>"FormatDate"@0, :args=>[{:function=>{:name=>"PriorMonth"@12, :args=>"data"@23}}]}})
99
+ end
100
+
101
+ end
102
+
103
+ context "Composed expression's " do
71
104
  it "should recognize the expression 'Month(data) - 1' " do
72
105
  ast = parser.parse('Month(data) - 1')
73
106
  ast.to_s.should == %Q({:-=>{:left=>{:function=>{:name=>"Month"@0, :args=>"data"@6}}, :right=>"1"@14}})
@@ -87,6 +120,7 @@ module FormulaDSL
87
120
  ast = parser.parse('Month(data) + Year(data)')
88
121
  ast.to_s.should == %Q({:+=>{:left=>{:function=>{:name=>"Month"@0, :args=>"data"@6}}, :right=>{:function=>{:name=>"Year"@14, :args=>"data"@19}}}})
89
122
  end
123
+
90
124
  end
91
125
 
92
126
  context "Expressions with string concatenation" do
@@ -112,17 +146,17 @@ module FormulaDSL
112
146
 
113
147
  it " should recognize expression with string concat 'Month(data) - 1 + \"/\" + Year(data)'" do
114
148
  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}}}}}}}})
149
+ ast.to_s.should == %Q({:-=>{:left=>{:function=>{:name=>"Month"@0, :args=>"data"@6}}, :right=>{:+=>{:left=>{:+=>{:left=>"1"@14, :right=>"\\\"/\\\""@18}}, :right=>{:function=>{:name=>"Year"@24, :args=>"data"@29}}}}}})
116
150
  end
117
151
 
118
152
  it " should recognize expression with string concat 'Month(data) - 1 + \"/\" + Year(data)'" do
119
153
  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}}}}}}}})
154
+ ast.to_s.should == %Q({:*=>{:left=>{:function=>{:name=>"Month"@0, :args=>"data"@6}}, :right=>{:+=>{:left=>{:+=>{:left=>"1"@14, :right=>"\\\"/\\\""@18}}, :right=>{:function=>{:name=>"Year"@24, :args=>"data"@29}}}}}})
121
155
  end
122
156
 
123
157
  it " should recognize expression with string concat 'Month(data) - 1 + \"/\" + Year(data)'" do
124
158
  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}}}}}}}})
159
+ ast.to_s.should == %Q({:/=>{:left=>{:function=>{:name=>"Month"@0, :args=>"data"@6}}, :right=>{:+=>{:left=>{:+=>{:left=>"1"@14, :right=>"\\\"/\\\""@18}}, :right=>{:function=>{:name=>"Year"@24, :args=>"data"@29}}}}}})
126
160
  end
127
161
 
128
162
  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.3.0
4
+ version: 0.4.0
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-04-03 00:00:00.000000000 Z
12
+ date: 2012-04-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: parslet
@@ -125,7 +125,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
125
125
  version: '0'
126
126
  segments:
127
127
  - 0
128
- hash: -3658736757412770386
128
+ hash: -6232718774881797
129
129
  required_rubygems_version: !ruby/object:Gem::Requirement
130
130
  none: false
131
131
  requirements: