parsecs 0.6.2 → 0.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 10d47b41fa674a87e82389eb1b269e54c4c64ad02a6682708c2d2b8c970c9f29
4
- data.tar.gz: e5691c43532a99952c5e12d5f191a3f27382936b35b94f082edb087095d5938a
3
+ metadata.gz: 60a45f7bed4f8e37362535038632693c74a4aad9d4efd7294d65a2455e218e05
4
+ data.tar.gz: 91f3e5ef94961ad9a7020f425f9cd4ce5a295d2b5c17215e3dffeaf7a252498c
5
5
  SHA512:
6
- metadata.gz: d8ab0c269d1051285d9d562edd6a7a525278a2317c932b42033b559034420e474e72ffa9818074ea5f091e7f6e7369d63cabb8991d34a5c30c7b79d9ac3a8da4
7
- data.tar.gz: 9cf6c8c8c994f33e7c4add7f1ee86de4347512910b41cf59790aed42730d43ad369e862b11d440dc034800f0654382172fb4594bceae4e44fcb6f13b9bd31d14
6
+ metadata.gz: a507bc067a5cd679c909fe2f582962f8d52050b0a869ce4de18f177a5724d985f807864867df3ac3ebab3e595da243227b84aeb5e211654b5137ae688c05463c
7
+ data.tar.gz: 81dad90965c2e7c822844762c27053b1f6615bc8d049ab0d6589222bbd59ca21ce0e9b788cf7ddf1b0616488889ee89e5c04d64fb05fdd0d97f21328cd0d5001
@@ -38,7 +38,7 @@ libs.each do |lib|
38
38
  end
39
39
 
40
40
  GIT_REPOSITORY = 'https://github.com/niltonvasques/equations-parser.git'.freeze
41
- COMMIT = 'eae00acfc8c4ea9fb7ff16dff11e51bdd260035f'.freeze
41
+ COMMIT = '8acd8d964531f1b78ef905ccdace7b7b038e9d8d'.freeze
42
42
 
43
43
  Dir.chdir(BASEDIR) do
44
44
  system('git init')
data/lib/parsec.rb CHANGED
@@ -6,7 +6,7 @@ module Parsec
6
6
  class Parsec
7
7
  using StringToBooleanRefinements
8
8
 
9
- VERSION = '0.6.2'.freeze
9
+ VERSION = '0.9.0'.freeze
10
10
 
11
11
  # evaluates the equation and returns only the result
12
12
  def self.eval_equation(equation)
@@ -15,7 +15,7 @@ module Parsec
15
15
 
16
16
  # evaluates the equation and returns the result and its data type
17
17
  def self.eval_equation_with_type(equation)
18
- sanitize(equation, true)
18
+ equation = sanitize(equation, true)
19
19
 
20
20
  result = Libnativemath.native_eval(equation)
21
21
  { value: convert(result), type: result['type'].to_sym }
@@ -23,20 +23,20 @@ module Parsec
23
23
 
24
24
  # returns true or raise an error
25
25
  def self.validate_syntax!(equation)
26
- sanitize(equation)
26
+ equation = sanitize(equation)
27
27
 
28
28
  validate(Libnativemath.native_eval(equation), true)
29
29
  end
30
30
 
31
31
  # returns true or an error string
32
32
  def self.validate_syntax(equation)
33
- sanitize(equation)
33
+ equation = sanitize(equation)
34
34
 
35
35
  validate(Libnativemath.native_eval(equation), false)
36
36
  end
37
37
 
38
38
  def self.get_result_type(equation)
39
- sanitize(equation, true)
39
+ equation = sanitize(equation, true)
40
40
 
41
41
  result = Libnativemath.native_eval(equation)
42
42
  result['type'].to_sym if validate(result, true)
@@ -45,18 +45,20 @@ module Parsec
45
45
  private_class_method
46
46
 
47
47
  def self.sanitize(equation, new_line = false)
48
- equation.gsub!(/[\n\t\r]/, ' ')
48
+ equation = equation.gsub(/[\n\t\r]/, ' ')
49
49
 
50
50
  # The following regex remove all spaces that are not between quot marks
51
51
  # https://tinyurl.com/ybc7bng3
52
- equation.gsub!(/( |(".*?"))/, '\\2') if new_line == true
52
+ equation = equation.gsub(/( |(".*?"))/, '\\2') if new_line == true
53
+
54
+ equation
53
55
  end
54
56
 
55
57
  def self.convert(ans)
56
58
  case ans['value']
57
59
  when 'inf' then return 'Infinity'
58
60
  when '-inf' then return '-Infinity'
59
- when 'nan' then return ans['value']
61
+ when 'nan', '-nan' then return 'nan'
60
62
  end
61
63
 
62
64
  case ans['type']
data/test/test_parsec.rb CHANGED
@@ -60,6 +60,12 @@ class TestParsec < Minitest::Test
60
60
  assert_equal(5, parser.eval_equation('number("5")'))
61
61
  assert_equal('Hello', parser.eval_equation('left("Hello World", 5)'))
62
62
  assert_equal('World', parser.eval_equation('right("Hello World", 5)'))
63
+ assert_equal('<a href=\"http://foo.bar\">Title</a>', parser.eval_equation('link("Title", "http://foo.bar")'))
64
+ assert_equal('<a href=\"#\">Title</a>', parser.eval_equation('link("Title", "#")'))
65
+ assert_equal('<a href=\"/test\">Test title</a>', parser.eval_equation('link("Test title", "/test")'))
66
+ assert_raises(SyntaxError) { parser.eval_equation_with_type('link()') }
67
+ assert_raises(SyntaxError) { parser.eval_equation_with_type('link(1, 2, 3)') }
68
+ assert_raises(SyntaxError) { parser.eval_equation_with_type('link(1, "2")') }
63
69
  end
64
70
 
65
71
  def test_complex_string_manipulation
@@ -115,7 +121,8 @@ class TestParsec < Minitest::Test
115
121
 
116
122
  def test_date_functions
117
123
  parsec = Parsec::Parsec
118
- assert_equal(Date.today, Date.parse(parsec.eval_equation("current_date()")))
124
+ assert_equal(Date.today, Date.parse(parsec.eval_equation('current_date()')))
125
+ assert_match(/^\d{4}-\d{2}-\d{2}$/, parsec.eval_equation('current_date()'))
119
126
  assert_equal(364, parsec.eval_equation('daysdiff("2018-01-01", "2018-12-31")'))
120
127
  assert_equal(365, parsec.eval_equation('daysdiff("2016-01-01", "2016-12-31")'))
121
128
  assert_equal(365, parsec.eval_equation('daysdiff("2000-01-01", "2000-12-31")'))
@@ -126,10 +133,19 @@ class TestParsec < Minitest::Test
126
133
  def test_datetime_functions
127
134
  parsec = Parsec::Parsec
128
135
  assert_equal(24, parsec.eval_equation('hoursdiff("2018-01-01", "2018-01-02")'))
136
+ assert_equal(24, parsec.eval_equation('hoursdiff("2018-01-01", "2018-1-02")'))
137
+ assert_equal(24, parsec.eval_equation('hoursdiff("2018-1-01", "2018-01-02")'))
138
+ assert_equal(24, parsec.eval_equation('hoursdiff("2018-1-01", "2018-1-02")'))
139
+ assert_equal(24, parsec.eval_equation('hoursdiff("2018-01-01", "2018-01-2")'))
140
+ assert_equal(24, parsec.eval_equation('hoursdiff("2018-01-1", "2018-01-02")'))
141
+ assert_equal(24, parsec.eval_equation('hoursdiff("2018-01-1", "2018-01-2")'))
142
+ assert_equal(24, parsec.eval_equation('hoursdiff("2018-1-1", "2018-1-2")'))
129
143
  assert_equal(288, parsec.eval_equation('hoursdiff("2019-02-01", "2019-02-13")'))
130
144
  assert_equal(4, parsec.eval_equation('hoursdiff("2019-02-01T08:00", "2019-02-01T12:00")'))
131
145
  assert_equal(28, parsec.eval_equation('hoursdiff("2019-02-01T08:00", "2019-02-02T12:00")'))
132
146
  assert_equal(3.67, parsec.eval_equation('hoursdiff("2019-02-01T08:20", "2019-02-01T12:00")'))
147
+ assert_equal(0, parsec.eval_equation('hoursdiff(current_date(), current_date())'))
148
+ assert_operator(parsec.eval_equation('hoursdiff(current_date(), "2000-01-01")'), :<, 0)
133
149
  assert_equal(0, parsec.eval_equation('hoursdiff("2018-01-01", "2018-01-01")'))
134
150
  assert_equal(-20, parsec.eval_equation('hoursdiff("2018-01-02T08:00", "2018-01-01T12:00")'))
135
151
  assert_raises(SyntaxError) { parsec.eval_equation('hoursdiff("2018-01-01", "INVALID2")') }
@@ -138,6 +154,74 @@ class TestParsec < Minitest::Test
138
154
  assert_raises(SyntaxError) { parsec.eval_equation('hoursdiff(2, 3)') }
139
155
  assert_raises(SyntaxError) { parsec.eval_equation('hoursdiff("2018-01-01", "2018-01-01T12:00")') }
140
156
  assert_raises(SyntaxError) { parsec.eval_equation('hoursdiff("2018-01-01T12:00", "2018-01-01")') }
157
+ assert_raises(SyntaxError) { parsec.eval_equation('hoursdiff(current_date(), "2010-01-01T08:30")') }
158
+ end
159
+
160
+ def test_add_days
161
+ parsec = Parsec::Parsec
162
+
163
+ # With Dates
164
+ assert_equal('2019-01-01', parsec.eval_equation('add_days("2019-01-01", 0)'))
165
+ assert_equal('2019-01-02', parsec.eval_equation('add_days("2019-01-01", 1)'))
166
+ assert_equal('2018-12-31', parsec.eval_equation('add_days("2019-01-01", -1)'))
167
+ assert_equal('2019-01-04', parsec.eval_equation('add_days("2019-01-01", 3)'))
168
+
169
+ # # With DateTimes
170
+ assert_equal('2019-01-01T08:30', parsec.eval_equation('add_days("2019-01-01T08:30", 0)'))
171
+ assert_equal('2019-02-01T12:30', parsec.eval_equation('add_days("2019-01-01T12:30", 31)'))
172
+ assert_equal('2019-01-02T15:30', parsec.eval_equation('add_days("2019-01-01T15:30", 1)'))
173
+ assert_equal('2019-01-02T20:30', parsec.eval_equation('add_days("2019-01-01T08:30", 1.5)'))
174
+ assert_equal('2018-12-31T08:30', parsec.eval_equation('add_days("2019-01-01T08:30", -1)'))
175
+
176
+ # With Errors
177
+ assert_raises(SyntaxError) { parsec.eval_equation_with_type('add_days("2019-01-33", 0)') }
178
+ # assert_raises(SyntaxError) { parsec.eval_equation_with_type('add_days("2019-01-01T08:61", 0)') } # Dont work on Linux
179
+ assert_raises(SyntaxError) { parsec.eval_equation_with_type('add_days()') }
180
+ assert_raises(SyntaxError) { parsec.eval_equation_with_type('add_days(1, 2, 3)') }
181
+ assert_raises(SyntaxError) { parsec.eval_equation_with_type('add_days(1, 2)') }
182
+ end
183
+
184
+ def test_mask
185
+ parsec = Parsec::Parsec
186
+ assert_equal('123-456', parsec.eval_equation('mask("000-000", 123456)'))
187
+ assert_equal('00014', parsec.eval_equation('mask("00000", 14)'))
188
+ assert_equal('000 14', parsec.eval_equation('mask("000 00", 14)'))
189
+ assert_equal('#123', parsec.eval_equation('concat("#", mask("000", 123))'))
190
+ assert_equal('12345', parsec.eval_equation('mask("0000", 12345)'))
191
+ assert_equal('123 45', parsec.eval_equation('mask("00 00", 12345)'))
192
+ assert_equal('3-5591-1801', parsec.eval_equation('mask("0-0000-0000", 355911801)'))
193
+ assert_equal('35-5591-1801', parsec.eval_equation('mask("00-0000-0000", 3555911801)'))
194
+ assert_equal('12-1234-1234-1234', parsec.eval_equation('mask("00-0000-0000-0000", 12123412341234)'))
195
+ assert_equal('1-1234-1234-1234-1234', parsec.eval_equation('mask("0-0000-0000-0000-0000", 11234123412341234)'))
196
+ end
197
+
198
+ def test_default_value
199
+ parsec = Parsec::Parsec
200
+
201
+ # Success Scenarios
202
+ assert_equal(10, parsec.eval_equation('default_value(10, 1)'))
203
+ assert_equal(1, parsec.eval_equation('default_value(NULL, 1)'))
204
+ assert_equal(10.4, parsec.eval_equation('default_value(10.4, 1.01)'))
205
+ assert_equal(1.01, parsec.eval_equation('default_value(NULL, 1.01)'))
206
+ assert_equal('filled', parsec.eval_equation('default_value("filled", "default")'))
207
+ assert_equal('default', parsec.eval_equation('default_value(NULL, "default")'))
208
+ assert_equal(false, parsec.eval_equation('default_value(false, true)'))
209
+ assert_equal(true, parsec.eval_equation('default_value(NULL, true)'))
210
+
211
+ # Mixing number types
212
+ assert_equal(1, parsec.eval_equation('default_value(1, 4.5)'))
213
+ assert_equal(1, parsec.eval_equation('default_value(1, 10)'))
214
+ assert_equal(1, parsec.eval_equation('default_value(1, 10.0)'))
215
+ assert_equal(1, parsec.eval_equation('default_value(1.0, 10)'))
216
+ assert_equal(1, parsec.eval_equation('default_value(1.0, 10.0)'))
217
+ assert_equal(1.5, parsec.eval_equation('default_value(1.5, 10)'))
218
+ assert_equal(1.5, parsec.eval_equation('default_value(1.5, 10.0)'))
219
+ assert_equal(1.5, parsec.eval_equation('default_value(1.5, 10.5)'))
220
+
221
+ # Error Scenarios
222
+ assert_raises(SyntaxError) { parsec.eval_equation('default_value(4.5, "string")') }
223
+ assert_raises(SyntaxError) { parsec.eval_equation('default_value("string", true)') }
224
+ assert_raises(SyntaxError) { parsec.eval_equation('default_value(true, 1)') }
141
225
  end
142
226
 
143
227
  def test_eval_equation_with_type
@@ -149,8 +233,8 @@ class TestParsec < Minitest::Test
149
233
  assert_equal({ value: 40.6853, type: :float }, parsec.eval_equation_with_type('10^log(3+2)'))
150
234
  assert_equal({ value: 5.1, type: :float }, parsec.eval_equation_with_type('number("5.1")'))
151
235
  equation_if = '4 > 2 ? "bigger" : "smaller"'
152
- assert_equal({ value: "bigger", type: :string }, parsec.eval_equation_with_type(equation_if))
153
- assert_equal({ value: "5.123", type: :string }, parsec.eval_equation_with_type('string(5.123)'))
236
+ assert_equal({ value: 'bigger', type: :string }, parsec.eval_equation_with_type(equation_if))
237
+ assert_equal({ value: '5.123', type: :string }, parsec.eval_equation_with_type('string(5.123)'))
154
238
  equation_boolean = '2 == 2 ? true : false'
155
239
  assert_equal({ value: true, type: :boolean }, parsec.eval_equation_with_type(equation_boolean))
156
240
  equation_boolean = '(3==3) and (3!=3)'
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parsecs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nilton Vasques
8
8
  - Victor Cordeiro
9
9
  - Beatriz Fagundes
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-03-14 00:00:00.000000000 Z
13
+ date: 2021-03-11 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: minitest
@@ -62,7 +62,7 @@ homepage: https://github.com/niltonvasques/parsec
62
62
  licenses:
63
63
  - MIT
64
64
  metadata: {}
65
- post_install_message:
65
+ post_install_message:
66
66
  rdoc_options: []
67
67
  require_paths:
68
68
  - lib
@@ -81,9 +81,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
81
81
  requirements:
82
82
  - swig
83
83
  - cmake
84
- rubyforge_project:
85
- rubygems_version: 2.7.7
86
- signing_key:
84
+ rubygems_version: 3.0.9
85
+ signing_key:
87
86
  specification_version: 4
88
87
  summary: A gem to evaluate equations using muparserx C++ library
89
88
  test_files: