eqn 1.5.0 → 1.6.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.
- checksums.yaml +4 -4
- data/eqn.gemspec +1 -1
- data/lib/eqn/calculator.rb +5 -10
- data/lib/eqn/comparation.rb +5 -5
- data/lib/eqn/expression.rb +9 -9
- data/lib/eqn/function.rb +13 -13
- data/lib/eqn/number.rb +11 -11
- data/lib/eqn/terminal.rb +5 -5
- data/lib/eqn/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4c54bb4df4dbcf3350edbaa0c13994c8372cea5c
|
4
|
+
data.tar.gz: bde508e34f9491145d4c5b7968602a8dd220d5a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d3f356c8c7eb30b335c972085eaf70e23b30b2611cb46d0857dfad95b4fca6f3a9e8426f9fab50c22b546ca0533335a0421fb0ad358c0e44f3ff2f355367bbf5
|
7
|
+
data.tar.gz: 466d2723c70a6933469d1a3bbfa91affeb64e487edff0aa11525503af7b8c163359ca806b2b5584a4dc6be9c3f355c38fb49c04bdc7b13e3cc5699ae1c290a13
|
data/eqn.gemspec
CHANGED
@@ -4,7 +4,7 @@ lib = File.expand_path('../lib', __FILE__)
|
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
5
|
require 'eqn/version'
|
6
6
|
|
7
|
-
config_files = %w
|
7
|
+
config_files = %w[.rspec .rubocop.yml .ruby-version Appraisals circle.yml]
|
8
8
|
|
9
9
|
Gem::Specification.new do |spec|
|
10
10
|
spec.name = 'eqn'
|
data/lib/eqn/calculator.rb
CHANGED
@@ -14,7 +14,7 @@ module Eqn
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def method_missing(method, *args)
|
17
|
-
if %i
|
17
|
+
if %i[calculate calc valid?].include?(method)
|
18
18
|
self.class.send(method, @eqn, @vars)
|
19
19
|
elsif (match = method.to_s.match(/^[A-Za-z]+=$/))
|
20
20
|
@vars[match.to_s.delete('=').intern] = args.first
|
@@ -26,19 +26,14 @@ module Eqn
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def respond_to_missing?(method)
|
29
|
-
%i
|
29
|
+
%i[calculate calc valid?].include?(method) || method.to_s.match(/^[A-Za-z]+=$/) || (var = method.to_s.match(/^[A-Za-z]+$/).to_s.intern) && @vars.key?(var)
|
30
30
|
end
|
31
31
|
|
32
32
|
class << self
|
33
33
|
def calculate(data, vars = {})
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
raise ZeroDivisionError if result.is_a?(Float) && (result.abs == Float::INFINITY || result.nan?)
|
38
|
-
result
|
39
|
-
ensure
|
40
|
-
@@vars = nil
|
41
|
-
end
|
34
|
+
result = Parser.parse(data).value(vars)
|
35
|
+
raise ZeroDivisionError if result.is_a?(Float) && (result.abs == Float::INFINITY || result.nan?)
|
36
|
+
result
|
42
37
|
end
|
43
38
|
alias calc calculate
|
44
39
|
|
data/lib/eqn/comparation.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
module Eqn
|
2
2
|
class Comparation < Treetop::Runtime::SyntaxNode
|
3
|
-
def value
|
4
|
-
val_one = elements.shift.value
|
3
|
+
def value(vars = {})
|
4
|
+
val_one = elements.shift.value(vars)
|
5
5
|
if elements.empty?
|
6
6
|
val_one
|
7
7
|
else
|
8
|
-
val_one.send(*elements.shift.value)
|
8
|
+
val_one.send(*elements.shift.value(vars))
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
12
|
class CompGroup < Treetop::Runtime::SyntaxNode
|
13
|
-
def value
|
14
|
-
[elements.shift.value, elements.shift.value]
|
13
|
+
def value(vars = {})
|
14
|
+
[elements.shift.value(vars), elements.shift.value(vars)]
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
data/lib/eqn/expression.rb
CHANGED
@@ -8,17 +8,17 @@ module Eqn
|
|
8
8
|
elements.empty?
|
9
9
|
end
|
10
10
|
|
11
|
-
def value
|
11
|
+
def value(vars = {})
|
12
12
|
if elements.count == 1
|
13
|
-
elements.shift.value
|
13
|
+
elements.shift.value(vars)
|
14
14
|
else
|
15
|
-
base = elements.shift.value
|
15
|
+
base = elements.shift.value(vars)
|
16
16
|
|
17
17
|
# Aggressively consume left associative operators to maintain associativity.
|
18
18
|
while left_associative?
|
19
|
-
op, num_expr = elements.shift.value
|
19
|
+
op, num_expr = elements.shift.value(vars)
|
20
20
|
num_expr_operand = num_expr.elements.shift
|
21
|
-
base = base.send(op, num_expr_operand.value)
|
21
|
+
base = base.send(op, num_expr_operand.value(vars))
|
22
22
|
elements.push num_expr.elements.shift unless num_expr.term?
|
23
23
|
end
|
24
24
|
|
@@ -26,8 +26,8 @@ module Eqn
|
|
26
26
|
if term?
|
27
27
|
base
|
28
28
|
else
|
29
|
-
op, num_expr = elements.shift.value
|
30
|
-
base.send(op, num_expr.value)
|
29
|
+
op, num_expr = elements.shift.value(vars)
|
30
|
+
base.send(op, num_expr.value(vars))
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
@@ -37,8 +37,8 @@ module Eqn
|
|
37
37
|
elements.first.left_associative?
|
38
38
|
end
|
39
39
|
|
40
|
-
def value
|
41
|
-
[elements.shift.value, elements.shift]
|
40
|
+
def value(vars = {})
|
41
|
+
[elements.shift.value(vars), elements.shift]
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
data/lib/eqn/function.rb
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
module Eqn
|
2
2
|
module Function
|
3
3
|
class If < Treetop::Runtime::SyntaxNode
|
4
|
-
def value
|
5
|
-
comp_val = elements.shift.value
|
6
|
-
ls = elements.shift.value
|
7
|
-
rs = elements.shift.value
|
4
|
+
def value(vars = {})
|
5
|
+
comp_val = elements.shift.value(vars)
|
6
|
+
ls = elements.shift.value(vars)
|
7
|
+
rs = elements.shift.value(vars)
|
8
8
|
|
9
9
|
comp_val ? ls : rs
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
13
|
class RoundBase < Treetop::Runtime::SyntaxNode
|
14
|
-
def value(fn)
|
15
|
-
value = elements.shift.value
|
14
|
+
def value(fn, vars)
|
15
|
+
value = elements.shift.value(vars)
|
16
16
|
raise ZeroDivisionError if value.is_a?(Float) && (value.abs == Float::INFINITY || value.nan?)
|
17
17
|
if elements.empty?
|
18
18
|
value.send(fn)
|
19
19
|
else
|
20
|
-
decimals = elements.shift.value
|
20
|
+
decimals = elements.shift.value(vars)
|
21
21
|
(value * 10**decimals).send(fn).to_f / 10**decimals
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
26
|
class Round < RoundBase
|
27
|
-
def value
|
28
|
-
super(:round)
|
27
|
+
def value(vars = {})
|
28
|
+
super(:round, vars)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
32
|
class RoundUp < RoundBase
|
33
|
-
def value
|
34
|
-
super(:ceil)
|
33
|
+
def value(vars = {})
|
34
|
+
super(:ceil, vars)
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
38
|
class RoundDown < RoundBase
|
39
|
-
def value
|
40
|
-
super(:floor)
|
39
|
+
def value(vars = {})
|
40
|
+
super(:floor, vars)
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
data/lib/eqn/number.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
module Eqn
|
2
2
|
class Number < Treetop::Runtime::SyntaxNode
|
3
|
-
def value
|
4
|
-
base = elements.shift.value
|
3
|
+
def value(vars = {})
|
4
|
+
base = elements.shift.value(vars)
|
5
5
|
# Apply any exponent.
|
6
|
-
base *= elements.shift.value unless elements.empty?
|
6
|
+
base *= elements.shift.value(vars) unless elements.empty?
|
7
7
|
base
|
8
8
|
end
|
9
9
|
|
10
10
|
class SignedNumber < Treetop::Runtime::SyntaxNode
|
11
|
-
def value
|
11
|
+
def value(vars = {})
|
12
12
|
# Store sign if any.
|
13
13
|
sign_negative = elements.shift.negative? if elements.first.is_a? Terminal::Sign
|
14
14
|
|
15
15
|
# Evaluate float.
|
16
|
-
value = elements.shift.value
|
16
|
+
value = elements.shift.value(vars)
|
17
17
|
|
18
18
|
# Apply sign if any.
|
19
19
|
sign_negative ? -value : value
|
@@ -21,25 +21,25 @@ module Eqn
|
|
21
21
|
end
|
22
22
|
|
23
23
|
class Float < Treetop::Runtime::SyntaxNode
|
24
|
-
def value
|
25
|
-
base = elements.shift.value
|
24
|
+
def value(vars = {})
|
25
|
+
base = elements.shift.value(vars)
|
26
26
|
|
27
27
|
# Add any decimal.
|
28
|
-
base += elements.shift.value unless elements.empty?
|
28
|
+
base += elements.shift.value(vars) unless elements.empty?
|
29
29
|
|
30
30
|
base
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
34
|
class Decimal < Treetop::Runtime::SyntaxNode
|
35
|
-
def value
|
35
|
+
def value(_vars = {})
|
36
36
|
elements.shift.dec_value
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
40
|
class Exponent < Treetop::Runtime::SyntaxNode
|
41
|
-
def value
|
42
|
-
10**elements.shift.value
|
41
|
+
def value(vars = {})
|
42
|
+
10**elements.shift.value(vars)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
data/lib/eqn/terminal.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module Eqn
|
2
2
|
module Terminal
|
3
3
|
class Variable < Treetop::Runtime::SyntaxNode
|
4
|
-
def value
|
5
|
-
val =
|
4
|
+
def value(vars = {})
|
5
|
+
val = vars[text_value.intern]
|
6
6
|
raise NoVariableValueError, "No value given for: #{text_value}" unless val
|
7
7
|
raise NonNumericVariableError, "Variable #{text_value} value is nonnumeric: #{val}" unless val.is_a? Numeric
|
8
8
|
val
|
@@ -14,7 +14,7 @@ module Eqn
|
|
14
14
|
".#{text_value}".to_f
|
15
15
|
end
|
16
16
|
|
17
|
-
def value
|
17
|
+
def value(_vars = {})
|
18
18
|
text_value.to_f
|
19
19
|
end
|
20
20
|
end
|
@@ -30,7 +30,7 @@ module Eqn
|
|
30
30
|
is_a? LeftAssociativeOp
|
31
31
|
end
|
32
32
|
|
33
|
-
def value
|
33
|
+
def value(_vars = {})
|
34
34
|
text_value == '^' ? :** : text_value.intern
|
35
35
|
end
|
36
36
|
|
@@ -39,7 +39,7 @@ module Eqn
|
|
39
39
|
end
|
40
40
|
|
41
41
|
class CompOp < Treetop::Runtime::SyntaxNode
|
42
|
-
def value
|
42
|
+
def value(_vars = {})
|
43
43
|
text_value == '=' ? :== : text_value.intern
|
44
44
|
end
|
45
45
|
end
|
data/lib/eqn/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eqn
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zach Schneider
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03
|
11
|
+
date: 2017-05-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: treetop
|