dentaku 0.2.8 → 0.2.9

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.
@@ -20,6 +20,8 @@ module Dentaku
20
20
  T_COMBINATOR = TokenMatcher.new(:combinator)
21
21
  T_IF = TokenMatcher.new(:function, :if)
22
22
  T_ROUND = TokenMatcher.new(:function, :round)
23
+ T_ROUNDUP = TokenMatcher.new(:function, :roundup)
24
+ T_ROUNDDOWN = TokenMatcher.new(:function, :rounddown)
23
25
  T_NOT = TokenMatcher.new(:function, :not)
24
26
 
25
27
  T_NON_GROUP_STAR = TokenMatcher.new(:grouping).invert.star
@@ -38,12 +40,16 @@ module Dentaku
38
40
  P_IF = [T_IF, T_OPEN, T_NON_GROUP, T_COMMA, T_NON_GROUP, T_COMMA, T_NON_GROUP, T_CLOSE]
39
41
  P_ROUND_ONE = [T_ROUND, T_OPEN, T_NON_GROUP_STAR, T_CLOSE]
40
42
  P_ROUND_TWO = [T_ROUND, T_OPEN, T_NON_GROUP_STAR, T_COMMA, T_NUMERIC, T_CLOSE]
43
+ P_ROUNDUP = [T_ROUNDUP, T_OPEN, T_NON_GROUP_STAR, T_CLOSE]
44
+ P_ROUNDDOWN = [T_ROUNDDOWN, T_OPEN, T_NON_GROUP_STAR, T_CLOSE]
41
45
  P_NOT = [T_NOT, T_OPEN, T_NON_GROUP_STAR, T_CLOSE]
42
46
 
43
47
  RULES = [
44
48
  [P_IF, :if],
45
49
  [P_ROUND_ONE, :round],
46
50
  [P_ROUND_TWO, :round],
51
+ [P_ROUNDUP, :roundup],
52
+ [P_ROUNDDOWN, :rounddown],
47
53
  [P_NOT, :not],
48
54
 
49
55
  [P_GROUP, :evaluate_group],
@@ -171,6 +177,20 @@ module Dentaku
171
177
  Token.new(:numeric, value)
172
178
  end
173
179
 
180
+ def roundup(*args)
181
+ _, _, *tokens, _ = args
182
+
183
+ value = evaluate_token_stream(tokens).value
184
+ Token.new(:numeric, value.ceil)
185
+ end
186
+
187
+ def rounddown(*args)
188
+ _, _, *tokens, _ = args
189
+
190
+ value = evaluate_token_stream(tokens).value
191
+ Token.new(:numeric, value.floor)
192
+ end
193
+
174
194
  def not(*args)
175
195
  Token.new(:logical, ! evaluate_token_stream(args[2..-2]).value)
176
196
  end
@@ -36,9 +36,10 @@ module Dentaku
36
36
  when '=' then :eq
37
37
  end
38
38
  end),
39
- TokenScanner.new(:combinator, '(and|or)\b', lambda {|raw| raw.strip.downcase.to_sym }),
40
- TokenScanner.new(:function, '(if|round|not)\b', lambda {|raw| raw.strip.downcase.to_sym }),
41
- TokenScanner.new(:identifier, '\w+\b', lambda {|raw| raw.strip.downcase.to_sym })
39
+ TokenScanner.new(:combinator, '(and|or)\b', lambda {|raw| raw.strip.downcase.to_sym }),
40
+ TokenScanner.new(:function, '(if|round(up|down)?|not)\b',
41
+ lambda {|raw| raw.strip.downcase.to_sym }),
42
+ TokenScanner.new(:identifier, '\w+\b', lambda {|raw| raw.strip.downcase.to_sym })
42
43
  ]
43
44
 
44
45
  LPAREN = TokenMatcher.new(:grouping, :open)
@@ -1,3 +1,3 @@
1
1
  module Dentaku
2
- VERSION = "0.2.8"
2
+ VERSION = "0.2.9"
3
3
  end
@@ -57,7 +57,9 @@ describe Dentaku::Evaluator do
57
57
 
58
58
  describe 'functions' do
59
59
  it 'should evaluate function' do
60
- evaluator.evaluate(token_stream(:round, :open, 5, :divide, 3.0, :close)).should eq 2
60
+ evaluator.evaluate(token_stream(:round, :open, 5, :divide, 3.0, :close)).should eq 2
61
+ evaluator.evaluate(token_stream(:roundup, :open, 5, :divide, 1.2, :close)).should eq 5
62
+ evaluator.evaluate(token_stream(:rounddown, :open, 5, :divide, 1.2, :close)).should eq 4
61
63
  end
62
64
  end
63
65
 
@@ -22,7 +22,7 @@ def type_for(value)
22
22
  :combinator
23
23
  when :true, :false
24
24
  :logical
25
- when :if, :round, :not
25
+ when :if, :round, :roundup, :rounddown, :not
26
26
  :function
27
27
  else
28
28
  :identifier
@@ -87,7 +87,7 @@ describe Dentaku::Tokenizer do
87
87
  tokens.map(&:value).should eq([:if, :open, :x, :lt, 10, :comma, :y, :comma, :z, :close])
88
88
  end
89
89
 
90
- it 'include ROUND' do
90
+ it 'include ROUND/UP/DOWN' do
91
91
  tokens = tokenizer.tokenize('round(8.2)')
92
92
  tokens.length.should eq(4)
93
93
  tokens.map(&:category).should eq([:function, :grouping, :numeric, :grouping])
@@ -97,6 +97,16 @@ describe Dentaku::Tokenizer do
97
97
  tokens.length.should eq(6)
98
98
  tokens.map(&:category).should eq([:function, :grouping, :numeric, :grouping, :numeric, :grouping])
99
99
  tokens.map(&:value).should eq([:round, :open, 8.75, :comma, 1, :close])
100
+
101
+ tokens = tokenizer.tokenize('ROUNDUP(8.2)')
102
+ tokens.length.should eq(4)
103
+ tokens.map(&:category).should eq([:function, :grouping, :numeric, :grouping])
104
+ tokens.map(&:value).should eq([:roundup, :open, 8.2, :close])
105
+
106
+ tokens = tokenizer.tokenize('RoundDown(8.2)')
107
+ tokens.length.should eq(4)
108
+ tokens.map(&:category).should eq([:function, :grouping, :numeric, :grouping])
109
+ tokens.map(&:value).should eq([:rounddown, :open, 8.2, :close])
100
110
  end
101
111
 
102
112
  it 'include NOT' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dentaku
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.8
4
+ version: 0.2.9
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-09-30 00:00:00.000000000 Z
12
+ date: 2012-10-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -87,7 +87,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
87
87
  version: '0'
88
88
  segments:
89
89
  - 0
90
- hash: 4557179252548583095
90
+ hash: -4230531870219194848
91
91
  required_rubygems_version: !ruby/object:Gem::Requirement
92
92
  none: false
93
93
  requirements:
@@ -96,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
96
96
  version: '0'
97
97
  segments:
98
98
  - 0
99
- hash: 4557179252548583095
99
+ hash: -4230531870219194848
100
100
  requirements: []
101
101
  rubyforge_project: dentaku
102
102
  rubygems_version: 1.8.23