parsecs 0.4.1 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/parsec.rb +16 -3
- data/test/test_parsec.rb +28 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4f491689b423601f13d531240c70349c9af27d4ba39bcf0194771b415ffd567d
|
4
|
+
data.tar.gz: 5d051aea5ed0a8538397084ca40c231e8fbc1a48297960d2598a3d21d1adf017
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0925569b881e6d3d6ac92b19024b4f4e065248fd049c85516fb1e535627b0b267f940e26ef449b39441a0d3b894cf64b02f94fdc53040b80d3039ca65939acc
|
7
|
+
data.tar.gz: 4dff210da8d09ace5f08df556ce49eaf48e2f511e395974853694276c18e7e044b233010ed26ae31c398664c8ff4edddaef486ab8084ee2e0904f1141d348a30
|
data/lib/parsec.rb
CHANGED
@@ -6,13 +6,19 @@ module Parsec
|
|
6
6
|
class Parsec
|
7
7
|
using StringToBooleanRefinements
|
8
8
|
|
9
|
-
VERSION = '0.
|
9
|
+
VERSION = '0.5.1'.freeze
|
10
10
|
|
11
|
-
# evaluates the equation
|
11
|
+
# evaluates the equation and returns only the result
|
12
12
|
def self.eval_equation(equation)
|
13
|
+
eval_equation_with_type(equation)[:value]
|
14
|
+
end
|
15
|
+
|
16
|
+
# evaluates the equation and returns the result and its data type
|
17
|
+
def self.eval_equation_with_type(equation)
|
13
18
|
remove(equation, true)
|
14
19
|
|
15
|
-
|
20
|
+
result = Libnativemath.native_eval(equation)
|
21
|
+
{ value: convert(result), type: result['type'].to_sym }
|
16
22
|
end
|
17
23
|
|
18
24
|
# returns true or raise an error
|
@@ -29,6 +35,13 @@ module Parsec
|
|
29
35
|
validate(Libnativemath.native_eval(equation), false)
|
30
36
|
end
|
31
37
|
|
38
|
+
def self.get_result_type(equation)
|
39
|
+
remove(equation, true)
|
40
|
+
|
41
|
+
result = Libnativemath.native_eval(equation)
|
42
|
+
result['type'].to_sym if validate(result, true)
|
43
|
+
end
|
44
|
+
|
32
45
|
private_class_method
|
33
46
|
|
34
47
|
def self.remove(equation, new_line = false)
|
data/test/test_parsec.rb
CHANGED
@@ -95,6 +95,12 @@ class TestParsec < Minitest::Test
|
|
95
95
|
assert_equal(true, parsec.validate_syntax("\n4\n+ \n 2\n"))
|
96
96
|
end
|
97
97
|
|
98
|
+
def test_equation_with_bad_syntax
|
99
|
+
parsec = Parsec::Parsec
|
100
|
+
assert_raises(SyntaxError) { parsec.eval_equation('concat(1, 2)') }
|
101
|
+
assert_raises(SyntaxError) { parsec.eval_equation('4 > 2 ? "smaller"') }
|
102
|
+
end
|
103
|
+
|
98
104
|
def test_validate_syntax
|
99
105
|
parsec = Parsec::Parsec
|
100
106
|
refute_equal(true, parsec.validate_syntax('((0.09/1.0)+2.58)-1.6+'))
|
@@ -116,4 +122,26 @@ class TestParsec < Minitest::Test
|
|
116
122
|
assert_equal(364, parsec.eval_equation('daysdiff("2100-01-01", "2100-12-31")'))
|
117
123
|
assert_equal(1, parsec.eval_equation('daysdiff("2018-01-01", "2017-12-31")'))
|
118
124
|
end
|
125
|
+
|
126
|
+
def test_eval_equation_with_type
|
127
|
+
parsec = Parsec::Parsec
|
128
|
+
assert_equal({ value: 10, type: :int }, parsec.eval_equation_with_type('(5 + 1) + (6 - 2)'))
|
129
|
+
assert_equal({ value: 362_880_0, type: :int }, parsec.eval_equation_with_type('10!'))
|
130
|
+
equation_date = 'daysdiff("2018-01-01", "2017-12-31")'
|
131
|
+
assert_equal({ value: 1, type: :int }, parsec.eval_equation_with_type(equation_date))
|
132
|
+
assert_equal({ value: 40.6853, type: :float }, parsec.eval_equation_with_type('10^log(3+2)'))
|
133
|
+
assert_equal({ value: 5.1, type: :float }, parsec.eval_equation_with_type('number("5.1")'))
|
134
|
+
equation_if = '4 > 2 ? "bigger" : "smaller"'
|
135
|
+
assert_equal({ value: "bigger", type: :string }, parsec.eval_equation_with_type(equation_if))
|
136
|
+
assert_equal({ value: "5.123", type: :string }, parsec.eval_equation_with_type('string(5.123)'))
|
137
|
+
equation_boolean = '2 == 2 ? true : false'
|
138
|
+
assert_equal({ value: true, type: :boolean }, parsec.eval_equation_with_type(equation_boolean))
|
139
|
+
equation_boolean = '(3==3) and (3!=3)'
|
140
|
+
assert_equal({ value: false, type: :boolean }, parsec.eval_equation_with_type(equation_boolean))
|
141
|
+
assert_equal({ value: 'Infinity', type: :float }, parsec.eval_equation_with_type('4 / 0'))
|
142
|
+
assert_equal({ value: 'nan', type: :float }, parsec.eval_equation_with_type('0 / 0'))
|
143
|
+
# invalid equations raises an error
|
144
|
+
assert_raises(SyntaxError) { parsec.eval_equation_with_type('concat(1, 2)') }
|
145
|
+
assert_raises(SyntaxError) { parsec.eval_equation_with_type('4 > 2 ? "smaller"') }
|
146
|
+
end
|
119
147
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parsecs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nilton Vasques
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2019-
|
13
|
+
date: 2019-03-01 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: minitest
|
@@ -82,7 +82,7 @@ requirements:
|
|
82
82
|
- swig
|
83
83
|
- cmake
|
84
84
|
rubyforge_project:
|
85
|
-
rubygems_version: 2.7.
|
85
|
+
rubygems_version: 2.7.3
|
86
86
|
signing_key:
|
87
87
|
specification_version: 4
|
88
88
|
summary: A gem to evaluate equations using muparserx C++ library
|