dentaku 2.0.2 → 2.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +2 -2
- data/lib/dentaku/ast/arithmetic.rb +17 -1
- data/lib/dentaku/parser.rb +1 -0
- data/lib/dentaku/version.rb +1 -1
- data/spec/ast/addition_spec.rb +1 -1
- data/spec/ast/and_spec.rb +1 -1
- data/spec/ast/division_spec.rb +29 -0
- data/spec/ast/function_spec.rb +1 -1
- data/spec/calculator_spec.rb +3 -1
- data/spec/parser_spec.rb +1 -1
- data/spec/tokenizer_spec.rb +2 -2
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34a03b8d224b161ba7b6cdbfd0d5f1fd344f932c
|
4
|
+
data.tar.gz: 20e97d8a754981e1597748723afd4f54285a0e19
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 510851224ae2e3e6b6a19b229cfe6095a28eaf9c6ac978edd6ea40295f4dc9a37b2fdb03d6f0072ef79b9fcfe1bf34f715f3f910d21b79491ce72643e66cddaf
|
7
|
+
data.tar.gz: b27e2dfc0c821f04475310eb47e6d30d908c02a77ba7da7512ed703a21b99c62e6a85a21be25d34db8540d9e10d131971ca45dfd54be554aed0a29e71e9b1b50
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
-
## [v2.0.
|
3
|
+
## [v2.0.3] 2015-08-25
|
4
4
|
- bug fixes
|
5
5
|
- performance enhancements
|
6
6
|
- code cleanup
|
@@ -80,7 +80,7 @@
|
|
80
80
|
## [v0.1.0] 2012-01-20
|
81
81
|
- initial release
|
82
82
|
|
83
|
-
[v2.0.
|
83
|
+
[v2.0.3]: https://github.com/rubysolo/dentaku/compare/v2.0.1...v2.0.3
|
84
84
|
[v2.0.1]: https://github.com/rubysolo/dentaku/compare/v2.0.0...v2.0.1
|
85
85
|
[v2.0.0]: https://github.com/rubysolo/dentaku/compare/v1.2.6...v2.0.0
|
86
86
|
[v1.2.6]: https://github.com/rubysolo/dentaku/compare/v1.2.5...v1.2.6
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative './operation'
|
2
|
+
require 'bigdecimal'
|
2
3
|
|
3
4
|
module Dentaku
|
4
5
|
module AST
|
@@ -51,7 +52,22 @@ module Dentaku
|
|
51
52
|
|
52
53
|
class Division < Arithmetic
|
53
54
|
def value(context={})
|
54
|
-
|
55
|
+
r = BigDecimal.new(right.value(context))
|
56
|
+
raise ZeroDivisionError if r.zero?
|
57
|
+
|
58
|
+
v = BigDecimal.new(left.value(context)) / r
|
59
|
+
v = v.to_i if v.frac.zero?
|
60
|
+
v
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.precedence
|
64
|
+
20
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
class Modulo < Arithmetic
|
69
|
+
def value(context={})
|
70
|
+
left.value(context) % right.value(context)
|
55
71
|
end
|
56
72
|
|
57
73
|
def self.precedence
|
data/lib/dentaku/parser.rb
CHANGED
data/lib/dentaku/version.rb
CHANGED
data/spec/ast/addition_spec.rb
CHANGED
@@ -17,7 +17,7 @@ describe Dentaku::AST::Addition do
|
|
17
17
|
it 'requires numeric operands' do
|
18
18
|
expect {
|
19
19
|
described_class.new(five, t)
|
20
|
-
}.to raise_error
|
20
|
+
}.to raise_error(RuntimeError, /requires numeric operands/)
|
21
21
|
|
22
22
|
expression = Dentaku::AST::Multiplication.new(five, five)
|
23
23
|
group = Dentaku::AST::Grouping.new(expression)
|
data/spec/ast/and_spec.rb
CHANGED
@@ -17,7 +17,7 @@ describe Dentaku::AST::And do
|
|
17
17
|
it 'requires logical operands' do
|
18
18
|
expect {
|
19
19
|
described_class.new(t, five)
|
20
|
-
}.to raise_error
|
20
|
+
}.to raise_error(RuntimeError, /requires logical operands/)
|
21
21
|
|
22
22
|
expression = Dentaku::AST::LessThanOrEqual.new(five, five)
|
23
23
|
expect {
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'dentaku/ast/arithmetic'
|
3
|
+
|
4
|
+
require 'dentaku/token'
|
5
|
+
|
6
|
+
describe Dentaku::AST::Division do
|
7
|
+
let(:five) { Dentaku::AST::Logical.new Dentaku::Token.new(:numeric, 5) }
|
8
|
+
let(:six) { Dentaku::AST::Logical.new Dentaku::Token.new(:numeric, 6) }
|
9
|
+
|
10
|
+
let(:t) { Dentaku::AST::Numeric.new Dentaku::Token.new(:logical, true) }
|
11
|
+
|
12
|
+
it 'performs division' do
|
13
|
+
node = described_class.new(five, six)
|
14
|
+
expect(node.value.round(4)).to eq 0.8333
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'requires numeric operands' do
|
18
|
+
expect {
|
19
|
+
described_class.new(five, t)
|
20
|
+
}.to raise_error(RuntimeError, /requires numeric operands/)
|
21
|
+
|
22
|
+
expression = Dentaku::AST::Multiplication.new(five, five)
|
23
|
+
group = Dentaku::AST::Grouping.new(expression)
|
24
|
+
|
25
|
+
expect {
|
26
|
+
described_class.new(group, five)
|
27
|
+
}.not_to raise_error
|
28
|
+
end
|
29
|
+
end
|
data/spec/ast/function_spec.rb
CHANGED
@@ -7,7 +7,7 @@ describe Dentaku::AST::Function do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
it 'raises an exception when trying to access an undefined function' do
|
10
|
-
expect { described_class.get("flarble") }.to raise_error
|
10
|
+
expect { described_class.get("flarble") }.to raise_error(RuntimeError, /undefined function/i)
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'registers a custom function' do
|
data/spec/calculator_spec.rb
CHANGED
@@ -27,6 +27,8 @@ describe Dentaku::Calculator do
|
|
27
27
|
expect(calculator.evaluate('0 * 10 ^ -5')).to eq(0)
|
28
28
|
expect(calculator.evaluate('3 + 0 * -3')).to eq(3)
|
29
29
|
expect(calculator.evaluate('3 + 0 / -3')).to eq(3)
|
30
|
+
expect(calculator.evaluate('15 % 8')).to eq(7)
|
31
|
+
expect(calculator.evaluate('(((695759/735000)^(1/(1981-1991)))-1)*1000').round(4)).to eq(5.5018)
|
30
32
|
end
|
31
33
|
|
32
34
|
describe 'memory' do
|
@@ -81,7 +83,7 @@ describe Dentaku::Calculator do
|
|
81
83
|
it "lets you know about a cycle if one occurs" do
|
82
84
|
expect do
|
83
85
|
calculator.solve!(health: "happiness", happiness: "health")
|
84
|
-
end.to raise_error
|
86
|
+
end.to raise_error(TSort::Cyclic)
|
85
87
|
end
|
86
88
|
|
87
89
|
it 'is case-insensitive' do
|
data/spec/parser_spec.rb
CHANGED
@@ -82,7 +82,7 @@ describe Dentaku::Parser do
|
|
82
82
|
x = Dentaku::Token.new(:identifier, :x)
|
83
83
|
|
84
84
|
node = described_class.new([five, times, x]).parse
|
85
|
-
expect { node.value }.to raise_error
|
85
|
+
expect { node.value }.to raise_error(Dentaku::UnboundVariableError)
|
86
86
|
expect(node.value(x: 3)).to eq 15
|
87
87
|
end
|
88
88
|
|
data/spec/tokenizer_spec.rb
CHANGED
@@ -142,8 +142,8 @@ describe Dentaku::Tokenizer do
|
|
142
142
|
end
|
143
143
|
|
144
144
|
it 'detects unbalanced parentheses' do
|
145
|
-
expect { tokenizer.tokenize('(5+3') }.to raise_error
|
146
|
-
expect { tokenizer.tokenize(')') }.to raise_error
|
145
|
+
expect { tokenizer.tokenize('(5+3') }.to raise_error(RuntimeError, /too many opening parentheses/)
|
146
|
+
expect { tokenizer.tokenize(')') }.to raise_error(RuntimeError, /too many closing parentheses/)
|
147
147
|
end
|
148
148
|
|
149
149
|
it 'recognizes identifiers that share initial substrings with combinators' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dentaku
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Solomon White
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -105,6 +105,7 @@ files:
|
|
105
105
|
- lib/dentaku/version.rb
|
106
106
|
- spec/ast/addition_spec.rb
|
107
107
|
- spec/ast/and_spec.rb
|
108
|
+
- spec/ast/division_spec.rb
|
108
109
|
- spec/ast/function_spec.rb
|
109
110
|
- spec/ast/node_spec.rb
|
110
111
|
- spec/ast/numeric_spec.rb
|
@@ -146,6 +147,7 @@ summary: A formula language parser and evaluator
|
|
146
147
|
test_files:
|
147
148
|
- spec/ast/addition_spec.rb
|
148
149
|
- spec/ast/and_spec.rb
|
150
|
+
- spec/ast/division_spec.rb
|
149
151
|
- spec/ast/function_spec.rb
|
150
152
|
- spec/ast/node_spec.rb
|
151
153
|
- spec/ast/numeric_spec.rb
|