marty 2.5.6 → 2.5.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 89ed116d83e4c492715b16521b670d8cb76b7e26c24c50ae80e7feb15c0647f0
4
- data.tar.gz: 966828b387e0fde5e25d089955c24d17455803ccf374fe281de4d8267851456e
3
+ metadata.gz: e21e7788214cabe5b48e33e15fbefcdbc30ba526f1a8870a3c5c7ab240b48b4d
4
+ data.tar.gz: 285129ffcd5648deeaa816a7923efc6b146adc01ba2a75624f0a5944063c7372
5
5
  SHA512:
6
- metadata.gz: 422d57c6920da447203117add2a24298b754aa8bc4d08deb4476e5610a5b76be20ab324752966a5144f0221a8d14c036e43c7e6d39ab33841f6c03332b908f8f
7
- data.tar.gz: 6891166c6703a0149ba2c548da687ff041c1ad1ef472d2c47a778b3fa46040b7c9eed1cbee7a3ad1186e18585b20bd22246282e49be9d55f2264ab70b54025b9
6
+ metadata.gz: 16931641ca8a4478ee399f24fe50398989d35aae7353efebd550e371ad76d45de9faf465f4e139cf4bbb28ae5502fb734f0be49de1f9e054d2d85369c059b190
7
+ data.tar.gz: de0f280f2a9d0077134e8d717d2e5882c0e35cb3909b9049b4127435b9cb34040bdc8de5081946be80e5085325aee769e48fe8906a919f07fcdc217486e2cf3e
@@ -16,3 +16,9 @@ Layout/DotPosition:
16
16
  Style/StringLiterals:
17
17
  Enabled: true
18
18
  EnforcedStyle: single_quotes
19
+
20
+ Metrics/BlockLength:
21
+ Max: 400
22
+ Exclude:
23
+ - 'spec/**/*'
24
+
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- marty (2.5.6)
4
+ marty (2.5.7)
5
5
  aws-sigv4 (~> 1.0, >= 1.0.2)
6
6
  axlsx (= 3.0.0pre)
7
7
  coderay
@@ -51,50 +51,81 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
51
51
  end
52
52
  end
53
53
 
54
- def self.simple_to_hash(s)
54
+ # FSM to parse rule text into json
55
+ def self.ruletext_to_hash(s)
56
+ # states are
57
+ # :start - before any attr is defined
58
+ # :in_attr - defining an attr
59
+ # :end - end of input
60
+ state = :start
55
61
  result = {}
56
- save_linenos = {}
57
- last_key = nil
58
- s.lines.each.with_index(1) do |line, idx|
59
- next if /\A\s*\z/.match(line)
62
+ cur_attr = nil
63
+ idx = 0
64
+ input = s.lines
65
+
66
+ # events are
67
+ # :attr - starting with <identifier>\s*=
68
+ # :normal - line not starting with ident =
69
+ # :end - no more lines
70
+ # get_event returns [event, data]
71
+ get_event = lambda {
72
+ line = input.try(&:shift)
73
+ next [:end] unless line
60
74
 
61
75
  line.chomp!
62
- begin
63
- m = /\A\s*([a-z][a-z0-9_]*)\s*=\s*(.*)\s*\z/.match(line)
64
- if m
65
- k, v = m[1], m[2]
66
- raise DupKeyError.new(k, idx) if result.keys.include?(k)
67
-
68
- save_linenos[k] = idx
69
- result[k] = v
70
- last_key = k
71
- else
72
- raise unless last_key
76
+ idx += 1
77
+ m = /\A\s*([a-z][a-z0-9_]*)\s* = (.*)\z/.match(line)
78
+ next [:attr, m[1..-1]] if m
79
+
80
+ [:normal, line]
81
+ }
82
+
83
+ # start a new attribute
84
+ # data is [ attr_name, everything after = ]
85
+ new_attr = lambda { |data|
86
+ cur_attr = data.shift
87
+ raise DupKeyError.new(cur_attr, idx) if result[cur_attr]
73
88
 
74
- result[last_key] += "\n" + line.strip
89
+ result[cur_attr] = data[0]
90
+ }
91
+
92
+ begin
93
+ while state != :end
94
+ event, extra = get_event.call
95
+ case state
96
+ when :start
97
+ case event
98
+ when :attr
99
+ new_attr.call(extra)
100
+ state = :in_attr
101
+ when :normal
102
+ raise
103
+ when :end
104
+ state = :end
105
+ end
106
+ when :in_attr
107
+ case event
108
+ when :attr
109
+ new_attr.call(extra)
110
+ when :normal
111
+ result[cur_attr] += "\n" + extra
112
+ when :end
113
+ state = :end
114
+ end
75
115
  end
76
- rescue DupKeyError => e
77
- raise
78
- rescue StandardError => e
79
- raise "syntax error on line #{idx}"
80
116
  end
117
+ rescue DupKeyError => e
118
+ raise
119
+ rescue StandardError => e
120
+ raise "syntax error on line #{idx}"
81
121
  end
82
122
  result
83
123
  end
84
124
 
85
- def self.hash_to_simple(h)
86
- return unless h && h.present?
87
-
88
- lhs_wid = h.keys.map(&:length).max
89
- fmt = "%-#{lhs_wid}s = %s"
90
- result = []
91
- h.map do |k, vstr|
92
- vlines = vstr.lines.map(&:chomp)
93
- fst = vlines.shift
94
- result << fmt % [k, fst]
95
- vlines.each { |l| result << ' ' * (lhs_wid + 3) + l }
125
+ def self.hash_to_ruletext(h)
126
+ h.each_with_object('') do |(k, v), out|
127
+ out << k + ' = ' + v + "\n"
96
128
  end
97
- result.join("\n")
98
129
  end
99
130
 
100
131
  def jsonb_getter(c)
@@ -102,7 +133,7 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
102
133
  end
103
134
 
104
135
  def jsonb_simple_getter(c)
105
- lambda { |r| Marty::BaseRuleView.hash_to_simple(r.send(c)) }
136
+ lambda { |r| Marty::BaseRuleView.hash_to_ruletext(r.send(c)) }
106
137
  end
107
138
 
108
139
  def jsonb_simple_setter(c)
@@ -111,7 +142,7 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
111
142
  return r.send(msg, nil) if v.blank?
112
143
 
113
144
  begin
114
- final = Marty::BaseRuleView.simple_to_hash(v)
145
+ final = Marty::BaseRuleView.ruletext_to_hash(v)
115
146
  rescue StandardError => e
116
147
  final = { "~~ERROR~~": e.message }
117
148
  end
@@ -205,14 +236,14 @@ class Marty::BaseRuleView < Marty::McflyGridPanel
205
236
  [jsonb_field(:computed_guards,
206
237
  getter: jsonb_simple_getter(:computed_guards),
207
238
  setter: jsonb_simple_setter(:computed_guards),
208
- height: 150)]
239
+ height: 100)]
209
240
  end
210
241
 
211
242
  def form_items_results
212
243
  [jsonb_field(:results,
213
244
  getter: jsonb_simple_getter(:results),
214
245
  setter: jsonb_simple_setter(:results),
215
- height: 150)]
246
+ height: 225)]
216
247
  end
217
248
 
218
249
  def default_form_items
@@ -200,4 +200,15 @@ class Marty::Promise < Marty::Base
200
200
  raw_conn.exec("UNLISTEN promise_#{id}")
201
201
  end
202
202
  end
203
+
204
+ delorean_fn :result_and_status, sig: 1 do |promise_id|
205
+ promise = find_by(id: promise_id)
206
+ next { error: 'not found' } if promise.nil?
207
+
208
+ {
209
+ completed: !promise.status.nil?,
210
+ status: promise.status,
211
+ result: promise.result
212
+ }
213
+ end
203
214
  end
@@ -0,0 +1,5 @@
1
+ Status:
2
+ promise_id =? nil
3
+
4
+ result = Marty::Promise.result_and_status(promise_id)
5
+
@@ -34,7 +34,7 @@ class Marty::RuleScriptSet < Delorean::AbstractContainer
34
34
 
35
35
  def write_attr(k, v)
36
36
  equals, rhs = v == :parameter ? [' =?', ''] :
37
- [' =', "\n" + v.lines.map { |l| ' ' * 8 + l }.join("\n")]
37
+ [' =', v.lines.map { |l| ' ' * 8 + l }.join]
38
38
  k + equals + rhs
39
39
  end
40
40
 
@@ -129,14 +129,23 @@ class Marty::RuleScriptSet < Delorean::AbstractContainer
129
129
  end
130
130
 
131
131
  def get_parse_error_field(ruleh, exc)
132
- line = exc.line ? exc.line - self.class.body_lines : 0
133
- errs = code_section_counts(ruleh)
134
- line_count = 0
135
- errs.each do |k, v|
136
- line_count += v
137
- return k if line <= line_count
132
+ line = (exc.line || 1) - 1
133
+ errs = { class_body: self.class.body_lines } + code_section_counts(ruleh)
134
+ ranges0 = errs.values.reduce([0]) do |acc, len|
135
+ acc + [acc.last + len]
138
136
  end
139
- errs.keys.last
137
+ ranges = errs.keys.zip(ranges0.each_cons(2).to_a)
138
+ secnm, (st, en) = ranges.detect do |sec, (st, en)|
139
+ line.between?(st, en - 1)
140
+ end
141
+ [secnm, line - st + 1]
142
+ rescue StandardError => e
143
+ Marty::Logger.error('RuleScriptSet#get_parse_error_field',
144
+ error: e.message,
145
+ backtrace: e.backtrace,
146
+ ruleh: ruleh,
147
+ line: line)
148
+ ['Unknown', 0]
140
149
  end
141
150
 
142
151
  def get_engine(ruleh)
@@ -175,9 +184,10 @@ class Marty::RuleScriptSet < Delorean::AbstractContainer
175
184
  @@engines[[pt, sname]] = sset.parse_check(sname, get_code(ruleh))
176
185
  end
177
186
  rescue Delorean::ParseError => e
178
- f = get_parse_error_field(ruleh, e)
187
+ secnm, line = get_parse_error_field(ruleh, e)
179
188
  msg = e.message.capitalize
180
- raise "Error in rule '#{ruleh['name']}' field '#{f}': #{msg}"
189
+ raise "Error in rule '#{ruleh['name']}' field '#{secnm}' "\
190
+ "(line #{line}): #{msg}"
181
191
  end
182
192
 
183
193
  def self.indent(s)
@@ -1,3 +1,3 @@
1
1
  module Marty
2
- VERSION = '2.5.6'
2
+ VERSION = '2.5.7'
3
3
  end
@@ -524,6 +524,41 @@ describe Marty::RpcController do
524
524
  Delayed::Worker.delay_jobs = true
525
525
  end
526
526
 
527
+ it 'should be able to get background job status' do
528
+ Delayed::Worker.delay_jobs = false
529
+
530
+ post 'evaluate', params: {
531
+ format: :json,
532
+ script: 'M1',
533
+ node: 'B',
534
+ attrs: 'e',
535
+ tag: t1.name,
536
+ params: { a: 333, d: 5 }.to_json,
537
+ background: true,
538
+ }
539
+
540
+ res = ActiveSupport::JSON.decode response.body
541
+ expect(res).to include('job_id')
542
+ job_id = res['job_id']
543
+
544
+ marty_whodunnit
545
+ Marty::Script.load_scripts(File.join(Rails.root, '../../delorean'), Date.today)
546
+
547
+ post 'evaluate', params: {
548
+ format: :json,
549
+ script: 'Promises',
550
+ node: 'Status',
551
+ attrs: 'result',
552
+ params: { promise_id: job_id }.to_json
553
+ }
554
+
555
+ res = ActiveSupport::JSON.decode response.body
556
+ expect(res['completed']).to be true
557
+ expect(res['result']).to eq('e' => 4)
558
+
559
+ Delayed::Worker.delay_jobs = true
560
+ end
561
+
527
562
  it 'should be able to post background job with non-array attr' do
528
563
  Delayed::Worker.delay_jobs = false
529
564
  post 'evaluate', params: {
@@ -5,18 +5,24 @@ class Gemini::XyzRuleScriptSet < Marty::RuleScriptSet
5
5
  def self.body_start
6
6
  "import BaseCode\n#{node_name}: BaseCode::BaseCode\n"
7
7
  end
8
+ def xyz_header
9
+ "XyzNode:\n xyz_param =? nil\n"
10
+ end
8
11
  def xyz_code(ruleh)
9
- write_code(ruleh["computed_guards"].select{|k,_|k.starts_with?("xyz_")})
12
+ c = write_code(ruleh["computed_guards"].select{|k,_|k.starts_with?("xyz_")})
13
+ c.blank? ? '' : self.class.indent(c)
10
14
  end
11
15
  def guard_code(ruleh)
12
16
  write_code(ruleh["computed_guards"].reject{|k,_|k.starts_with?("xyz_")})
13
17
  end
14
18
  def get_code(ruleh)
15
19
  x = xyz_code(ruleh)
16
- super + (x.blank? ? '' :
17
- "XyzNode:\n xyz_param =? nil\n" + self.class.indent(x))
20
+ super +
21
+ xyz_header +
22
+ xyz_code(ruleh)
18
23
  end
19
24
  def code_section_counts(ruleh)
20
- super + { xyz: xyz_code(ruleh).count("\n") }
25
+ super + { xyz_header: xyz_header.count("\n"),
26
+ xyz: xyz_code(ruleh).count("\n") }
21
27
  end
22
28
  end
@@ -203,7 +203,8 @@ feature 'rule view', js: true do
203
203
  fill_in(:computed_guards, with: 'sadf asdf ljsf')
204
204
  press('OK')
205
205
  wait_for_ajax
206
- exp = "Computed - Error in rule 'abc' field 'computed_guards': Syntax error on line 1"
206
+ exp = "Computed - Error in rule 'abc' field 'computed_guards': "\
207
+ 'Syntax error on line 1'
207
208
  expect(page).to have_content(exp)
208
209
  sleep 2 # sleep needed for message to clear, otherwise failing tests could
209
210
  # pass due to prior messages
@@ -212,84 +213,94 @@ feature 'rule view', js: true do
212
213
  fill_in(:computed_guards, with: '0sadf = 123j')
213
214
  press('OK')
214
215
  wait_for_ajax
215
- exp = "Computed - Error in rule 'abc' field 'computed_guards': Syntax error on line 1"
216
+ exp = "Computed - Error in rule 'abc' field 'computed_guards': "\
217
+ 'Syntax error on line 1'
216
218
  expect(page).to have_content(exp)
217
219
  sleep 2
218
220
 
219
221
  # bad rhs - delorean compile will raise
220
- fill_in(:computed_guards, with: 'var = 123j')
222
+ fill_in(:computed_guards, with: "x = true\ny = false\nvar = 123j\nz = true")
221
223
  press('OK')
222
224
  wait_for_ajax
223
- exp = "Computed - Error in rule 'abc' field 'computed_guards': Syntax error"
225
+ exp = "Computed - Error in rule 'abc' field 'computed_guards' (line 3): "\
226
+ 'Syntax error'
224
227
  expect(page).to have_content(exp)
225
228
  sleep 2
226
229
 
227
230
  fill_in(:computed_guards, with: %Q(var1 = "good"\nvar2 = 123\nvar3 = 123j))
228
231
  press('OK')
229
232
  wait_for_ajax
230
- exp = "Computed - Error in rule 'abc' field 'computed_guards': Syntax error"
233
+ exp = "Computed - Error in rule 'abc' field 'computed_guards' (line 3): "\
234
+ 'Syntax error'
231
235
  expect(page).to have_content(exp)
232
236
  sleep 2
233
237
 
234
238
  fill_in(:computed_guards, with: '')
235
- fill_in(:results, with: %Q(var1 = "good"\nvar2 = 123\nvar3 = 123j))
239
+ fill_in(:results, with: %Q(var3 = 123j\nvar1 = "good"\nvar2 = 123))
236
240
  press('OK')
237
241
  wait_for_ajax
238
- exp = "Computed - Error in rule 'abc' field 'results': Syntax error"
242
+ exp = "Computed - Error in rule 'abc' field 'results' (line 1): "\
243
+ 'Syntax error'
239
244
  expect(page).to have_content(exp)
240
245
  sleep 2
241
246
 
242
- fill_in(:results, with: %Q(abc = "def"\ndef = 5\nxyz=def+10\nsadf asdf lsf))
247
+ fill_in(:results, with: %Q(abc = "def"\ndef = 5\nxyz = def+10\nsadf asdf lsf))
243
248
  press('OK')
244
249
  wait_for_ajax
245
- exp = "Computed - Error in rule 'abc' field 'results': Syntax error"
250
+ exp = "Computed - Error in rule 'abc' field 'results' (line 4): Syntax error"
246
251
  expect(page).to have_content(exp)
247
252
  sleep 2
248
253
 
249
254
  fill_in(:results,
250
255
  with: %Q(abc = "def"\ndef = "abc"\nklm = "3"\nabc = "xyz"))
251
- exp = "Computed - Error in rule 'abc' field 'results': Keyword 'abc' specified more"\
252
- ' than once (line 4)'
256
+
257
+ exp = "Computed - Error in rule 'abc' field 'results': Keyword 'abc' "\
258
+ 'specified more than once (line 4)'
253
259
  press('OK')
254
260
  wait_for_ajax
255
261
  expect(page).to have_content(exp)
256
262
  sleep 2
257
263
 
258
- multi_line = <<-EOL
259
- abc = "def"
260
- def = "abc"
261
- klm = 3 +
262
- 4 +
263
- if true then 5 else 0
264
+ klm = " 3 + \n\n# hi mom\n 4 +\n if true then 5 else 0\n\n"
265
+ bogus = <<-EOL
266
+
267
+ # comment line
268
+
264
269
  EOL
265
- multi_line_fixed = <<-EOL
270
+
271
+ multi_line = <<-EOL
266
272
  abc = "def"
267
273
  def = "abc"
268
- klm = 3 +
269
- 4 +
270
- if true then 5 else 0
274
+ klm = #{klm}
271
275
  EOL
272
276
 
277
+ fill_in(:results, with: bogus + multi_line)
278
+ press('OK')
279
+ wait_for_ajax
280
+ exp = "Computed - Error in rule 'abc' field 'results': "\
281
+ 'Syntax error on line 1'
282
+ expect(page).to have_content(exp)
283
+
273
284
  fill_in(:results, with: multi_line)
274
285
  press('OK')
275
286
  wait_for_ajax
276
287
 
277
- # re-edit twice to make sure re-indentation and stripping are correct
288
+ # re-edit twice to make sure identation and comments are preserved
278
289
  press('Edit')
279
290
  wait_for_ajax
280
- expect(find_field(:results).value).to eq(multi_line_fixed.chomp)
291
+ expect(find_field(:results).value).to eq(multi_line)
281
292
  press('OK')
282
293
  wait_for_ajax
283
294
 
284
295
  press('Edit')
285
296
  wait_for_ajax
286
- expect(find_field(:results).value).to eq(multi_line_fixed.chomp)
297
+ expect(find_field(:results).value).to eq(multi_line)
287
298
  press('OK')
288
299
  wait_for_ajax
289
300
 
290
301
  # when stored in rule, all lines of a multi line value s/b stripped
291
302
  r = Gemini::MyRule.where(name: 'abc', obsoleted_dt: 'infinity').first
292
- expect(r.results['klm']).to eq("3 +\n4 +\nif true then 5 else 0")
303
+ expect(r.results['klm']).to eq(klm)
293
304
 
294
305
  # make sure change of key/value order is recognized as a change
295
306
  press('Edit')
@@ -302,22 +313,23 @@ EOL
302
313
  wait_for_ajax
303
314
  press('Edit')
304
315
  wait_for_ajax
305
- val = find_field(:results).value + "\n"
316
+ val = find_field(:results).value
306
317
  expect(val).to eq(newval)
307
318
  press('OK')
308
319
  wait_for_ajax
309
320
 
310
- exp = <<EOL
311
- simple_result = "c value"
321
+ exp = <<-EOL
322
+ simple_result = "c value"
312
323
  computed_value = if paramb
313
- then param1 / (grid1_grid_result||1)
314
- else (grid2_grid_result||1) / param1
324
+ then param1 / (grid1_grid_result||1)
325
+ else (grid2_grid_result||1) / param1
315
326
  EOL
327
+
316
328
  names = mrv.get_col_vals(:name, 9, 0)
317
329
  idx = names.index { |n| n == 'Rule3' } + 1
318
330
  mrv.select_row(idx)
319
331
  press('Edit')
320
- expect(find_field(:results).value).to eq(exp.chomp)
332
+ expect(find_field(:results).value).to eq(exp)
321
333
  press('OK')
322
334
  wait_for_ajax
323
335
 
@@ -10,6 +10,6 @@ Rule2,SimpleRule,2017-2-1 14:00:00,2017-4-1,true,"{""g_array"":[""G1V2""],""g_si
10
10
  Rule2a,SimpleRule,2017-2-1 14:00:00,2017-4-1,true,"{""g_array"":[""G1V2""],""g_single"":""G2V3"",""g_string"":""abc"",""g_bool"":true,""g_range"":""(,50]"",""g_integer"":99}",,,"{""simple_result"":""\""b value\"""", ""sr2"":""true"", ""sr3"": ""123""}"
11
11
  Rule2b,SimpleRule,2017-2-1 14:00:00,2017-4-1,true,"{""g_array"":[""G1V2""],""g_single"":""G2V3"",""g_string"":""abc"",""g_bool"":true,""g_range"":""(,50]"",""g_integer"":999}",,"{""grid1"":""DataGrid1"",""grid2"":""DataGrid2""}",
12
12
  Rule2c,SimpleRule,2017-2-1 14:00:00,2017-4-1,true,"{""g_array"":[""G1V2""],""g_single"":""G2V3"",""g_string"":""abc"",""g_bool"":false,""g_range"":""(,50]"",""g_integer"":10}",,"{""grid1"":""DataGrid1"",""grid2"":""DataGrid2""}",
13
- Rule3,ComplexRule,2017-3-1 00:00:00,2017-4-1,false,"{""g_array"":[""G1V2"",""G1V3""],""g_string"":""def"",""g_integer"":11}","{""cguard1"":""1==1"",""cguard2"":""[param2 == 'abc', \""a string\""]""}","{""grid1"":""DataGrid1"",""grid2"":""DataGrid2""}","{""simple_result"":""\""c value\"""",""computed_value"":""if paramb\nthen param1 / (grid1_grid_result||1)\nelse (grid2_grid_result||1) / param1""}"
13
+ Rule3,ComplexRule,2017-3-1 00:00:00,2017-4-1,false,"{""g_array"":[""G1V2"",""G1V3""],""g_string"":""def"",""g_integer"":11}","{""cguard1"":""1==1"",""cguard2"":""[param2 == 'abc', \""a string\""]""}","{""grid1"":""DataGrid1"",""grid2"":""DataGrid2""}","{""simple_result"":""\""c value\"""",""computed_value"":""if paramb\n then param1 / (grid1_grid_result||1)\n else (grid2_grid_result||1) / param1""}"
14
14
  Rule4,ComplexRule,2017-4-1 15:00:01,2017-5-1,,"{""g_array"":[""G1V2"",""G1V3""],""g_string"":""Hi Mom"",""g_integer"":11}","{""cguard1"":""1==1"",""cguard2"":""param2 == \""abc\""""}","{""grid1"":""DataGrid1"",""grid2"":""DataGrid2""}","{""computed_name_grid"":""\""DataGrid\""+\""X\"""", ""simple_result"":""computed_name_grid"",""grid_sum"":""computed_name_grid_result + (grid1_grid_result||0)+(grid2_grid_result||0)""}"
15
15
  Rule5,ComplexRule,2017-4-2 15:00:01,2017-5-1,,"{""g_string"":""zzz"",""g_integer"":3757,""g_has_default"":""foo""}","{""cguard1"":""[1==1, \""a string\""]""}",,"{""flavor"": ""[\""cherry\"",\""lemon\""][param2]"",""other_grid"": ""\""DataGrid4\"""",""final_value"": ""other_grid_result * 3""}"
@@ -73,33 +73,44 @@ module Marty::RuleSpec
73
73
  it 'detects errors in computed guards' do
74
74
  @rule_type = 'SimpleRule'
75
75
  @computed_guards = { 'guard1' => 'zvjsdf12.z8*' }
76
- exp = /Computed - Error in rule 'testrule' field 'computed_guards': Syntax error/
76
+ exp = Regexp.new("Computed - Error in rule 'testrule' field "\
77
+ "'computed_guards' .line 1.: Syntax error")
77
78
  expect { subject }.to raise_error(exp)
78
79
  end
79
80
  it 'detects errors in computed results' do
80
81
  @rule_type = 'SimpleRule'
81
- @results = { 'does_not_compute' => 'zvjsdf12.z8*' }
82
+ @results = { 'does_compute' => '1+2',
83
+ 'does_not_compute' => 'zvjsdf12.z8*' }
82
84
  @grids = { 'grid1' => 'DataGrid1', 'grid2' => 'DataGrid2' }
83
- exp = /Computed - Error in rule 'testrule' field 'results': Syntax error/
85
+ exp = Regexp.new("Computed - Error in rule 'testrule' field "\
86
+ "'results' .line 2.: Syntax error")
84
87
  expect { subject }.to raise_error(exp)
85
88
  end
86
89
  it 'detects errors in computed results 2' do
87
90
  @rule_type = 'SimpleRule'
88
91
  @results = { 'does_not_compute' => 'zvjsdf12.z8*' }
89
- @grids = { 'grid1' => 'DataGrid1', 'grid2' => 'DataGrid1', 'grid3' => 'DataGrid3' }
90
- exp = /Computed - Error in rule 'testrule' field 'results': Syntax error/
92
+ @grids = { 'grid1' => 'DataGrid1', 'grid2' => 'DataGrid1',
93
+ 'grid3' => 'DataGrid3' }
94
+ exp = Regexp.new("Computed - Error in rule 'testrule' field "\
95
+ "'results' .line 1.: Syntax error")
91
96
  expect { subject }.to raise_error(exp)
92
97
  end
93
98
  it 'detects errors in computed results 3' do
94
99
  @rule_type = 'SimpleRule'
95
- @results = { 'does_not_compute' => 'zvjsdf12.z8*' }
96
- @grids = { 'grid1' => 'DataGrid1', 'grid2' => 'DataGrid1', 'grid3' => 'DataGrid1' }
97
- exp = /Computed - Error in rule 'testrule' field 'results': Syntax error/
100
+ @results = { 'does_compute' => '1+2',
101
+ 'does_compute2' => '"string".length',
102
+ 'does_not_compute' => 'zvjsdf12.z8*',
103
+ 'does_compute3' => '[does_compute].sum' }
104
+ @grids = { 'grid1' => 'DataGrid1', 'grid2' => 'DataGrid1',
105
+ 'grid3' => 'DataGrid1' }
106
+ exp = Regexp.new("Computed - Error in rule 'testrule' field "\
107
+ "'results' .line 3.: Syntax error")
98
108
  expect { subject }.to raise_error(exp)
99
109
  end
100
110
  it 'reports bad grid names' do
101
111
  @rule_type = 'SimpleRule'
102
- @grids = { 'grid1' => 'xyz', 'grid2' => 'DataGrid2', 'grid3' => 'DataGrid1' }
112
+ @grids = { 'grid1' => 'xyz', 'grid2' => 'DataGrid2',
113
+ 'grid3' => 'DataGrid1' }
103
114
  exp = /Grids - Bad grid name 'xyz' for 'grid1'/
104
115
  expect { subject }.to raise_error(exp)
105
116
  end
@@ -133,19 +144,22 @@ module Marty::RuleSpec
133
144
  it 'detects script errors' do
134
145
  @rule_type = 'XRule'
135
146
  @results = { 'x' => 'zx sdf wer' }
136
- exp = /Computed - Error in rule 'testrule' field 'results': Syntax error/
147
+ exp = Regexp.new("Computed - Error in rule 'testrule' field "\
148
+ "'results' .line 1.: Syntax error")
137
149
  expect { subject }.to raise_error(exp)
138
150
  end
139
151
  it 'rule script stuff overrides 1' do
140
152
  @rule_type = 'XRule'
141
153
  @computed_guards = { 'abc' => 'true', 'xyz_guard' => 'err err err' }
142
- exp = /Computed - Error in rule 'testrule' field 'xyz': Syntax error/
154
+ exp = Regexp.new("Computed - Error in rule 'testrule' field "\
155
+ "'xyz' .line 1.: Syntax error")
143
156
  expect { subject }.to raise_error(exp)
144
157
  end
145
158
  it 'rule script stuff overrides 2' do
146
159
  @rule_type = 'XRule'
147
160
  @computed_guards = { 'abc' => 'err err err', 'xyz_guard' => 'xyz_param' }
148
- exp = /Computed - Error in rule 'testrule' field 'computed_guards': Syntax error/
161
+ exp = Regexp.new("Computed - Error in rule 'testrule' field "\
162
+ "'computed_guards' .line 1.: Syntax error")
149
163
  expect { subject }.to raise_error(exp)
150
164
  end
151
165
  it 'rule script stuff overrides 3' do
@@ -376,9 +390,9 @@ module Marty::RuleSpec
376
390
  rescue Marty::DeloreanRule::ComputeError => e
377
391
  exp = 'no implicit conversion of Integer into String'
378
392
  expect(e.message).to include(exp)
379
- expres = [/DELOREAN__XyzRule_\d+_1483228800.0:23:in .+'/,
380
- /DELOREAN__XyzRule_\d+_1483228800.0:23:in .tmp_var4__D'/,
381
- /DELOREAN__XyzRule_\d+_1483228800.0:27:in .bv__D'/]
393
+ expres = [/DELOREAN__XyzRule_\d+_1483228800.0:\d+:in .+'/,
394
+ /DELOREAN__XyzRule_\d+_1483228800.0:\d+:in .tmp_var4__D'/,
395
+ /DELOREAN__XyzRule_\d+_1483228800.0:\d+:in .bv__D'/]
382
396
  expres.each_with_index do |expre, i|
383
397
  expect(e.backtrace[i]).to match(expre)
384
398
  end
@@ -390,8 +404,8 @@ module Marty::RuleSpec
390
404
  rescue Marty::DeloreanRule::ComputeError => e
391
405
  exp = 'divided by 0'
392
406
  expect(e.message).to include(exp)
393
- expres = [%r(DELOREAN__XyzRule_\d+_1483228800.0:5:in ./'),
394
- /DELOREAN__XyzRule_\d+_1483228800.0:5:in .cg1__D'/]
407
+ expres = [%r(DELOREAN__XyzRule_\d+_1483228800.0:\d+:in ./'),
408
+ /DELOREAN__XyzRule_\d+_1483228800.0:\d+:in .cg1__D'/]
395
409
  expres.each_with_index do |expre, i|
396
410
  expect(e.backtrace[i]).to match(expre)
397
411
  end
@@ -429,9 +443,9 @@ module Marty::RuleSpec
429
443
  'err_section' => 'results',
430
444
  'err_message' => 'no implicit conversion of Integer into String' }
431
445
  expect(log_ents[1].details.except('err_stack')).to eq(exp)
432
- expres = [/DELOREAN__XyzRule_\d+_1483228800.0:23:in .+'/,
433
- /DELOREAN__XyzRule_\d+_1483228800.0:23:in .tmp_var4__D'/,
434
- /DELOREAN__XyzRule_\d+_1483228800.0:27:in .bv__D'/]
446
+ expres = [/DELOREAN__XyzRule_\d+_1483228800.0:\d+:in .+'/,
447
+ /DELOREAN__XyzRule_\d+_1483228800.0:\d+:in .tmp_var4__D'/,
448
+ /DELOREAN__XyzRule_\d+_1483228800.0:\d+:in .bv__D'/]
435
449
  expres.each_with_index do |expre, i|
436
450
  expect(log_ents[1].details['err_stack'][i]).to match(expre)
437
451
  end
@@ -445,8 +459,8 @@ module Marty::RuleSpec
445
459
  'err_section' => 'computed_guards',
446
460
  'err_message' => 'divided by 0' }
447
461
  expect(log_ents[2].details.except('err_stack')).to eq(exp)
448
- expres = [%r(DELOREAN__XyzRule_\d+_1483228800.0:5:in ./'),
449
- /DELOREAN__XyzRule_\d+_1483228800.0:5:in .cg1__D'/]
462
+ expres = [%r(DELOREAN__XyzRule_\d+_1483228800.0:\d+:in ./'),
463
+ /DELOREAN__XyzRule_\d+_1483228800.0:\d+:in .cg1__D'/]
450
464
  expres.each_with_index do |expre, i|
451
465
  expect(log_ents[2].details['err_stack'][i]).to match(expre)
452
466
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marty
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.6
4
+ version: 2.5.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arman Bostani
@@ -14,7 +14,7 @@ authors:
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
- date: 2019-02-21 00:00:00.000000000 Z
17
+ date: 2019-03-05 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: pg
@@ -383,6 +383,7 @@ files:
383
383
  - delorean/blame_report.dl
384
384
  - delorean/diagnostics.dl
385
385
  - delorean/marty_fields.dl
386
+ - delorean/promises.dl
386
387
  - delorean/script_report.dl
387
388
  - delorean/table_report.dl
388
389
  - docker-compose.dummy.yml