marty 2.3.7 → 2.3.8

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
  SHA1:
3
- metadata.gz: 56b3f0f54fc31cab7647f2955183a57624d2e250
4
- data.tar.gz: fe7e62a123c5a0e8189076e9f5d20dd290705a26
3
+ metadata.gz: f0af975202886f648f8d81d92d255498764df651
4
+ data.tar.gz: a7fc2c052155067f86004bb661879866961b4ac5
5
5
  SHA512:
6
- metadata.gz: 479aa0ed5a85663ae336e151c4c512fe92dc3da39c8fc5fa661f5307454cf6ed2b7bc0a4ad8e46698e80c32a637edb848ec245d826add0e95fbc7bc9a3e53cc0
7
- data.tar.gz: c225c6156c6ca637c51a4fbd69af307d50304e0d83e43da28aca9fa4c56ecf5255318b01d4124ed165a261fb920421d53770d01f1aa69a094f9b39452c674f83
6
+ metadata.gz: 93a37fff530d20a6116f4e6e8425a8abfb19e4258f297fadc1fcd53b0d891e2f1cd33359b2ee8849f6ee4e44335cab33183e6bb5676d851d2a202f707f2f761e
7
+ data.tar.gz: 61a1cce25ce6f50d2636e638d23ac11aaa331dfa6a12380e375b6d632653018e8ab5bcc06a7510311a92df096aa940482af1eac8fd47c94dd7e8ba2d8bb6077a
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- marty (2.3.7)
4
+ marty (2.3.8)
5
5
  aws-sigv4 (~> 1.0, >= 1.0.2)
6
6
  axlsx (= 3.0.0pre)
7
7
  coderay
@@ -174,9 +174,9 @@ class Marty::Grid < ::Netzke::Grid::Base
174
174
  end
175
175
 
176
176
  action :clear_filters do |a|
177
+ a.text = "X"
177
178
  a.tooltip = "Clear filters"
178
179
  a.handler = :clear_filters
179
- a.icon_cls = "fa fa-minus glyph"
180
180
  end
181
181
 
182
182
  # cosmetic changes
@@ -56,60 +56,104 @@ class Marty::DeloreanRule < Marty::BaseRule
56
56
  def self.grid_keys(grids, eclass)
57
57
  grids.keys.map{|k| eclass.grid_final_name(k) }
58
58
  end
59
+
60
+ class ComputeError < StandardError
61
+ attr_reader :input, :section
62
+
63
+ def initialize(msg, stack, input, section)
64
+ @input = input
65
+ @section = section
66
+ super(msg)
67
+ set_backtrace stack
68
+ end
69
+ end
70
+
59
71
  def self.base_compute2(ruleh, metadata_opts, params, dgparams=params)
60
- id, name, eclassname, computed_guards, grids, results, fixed_results =
61
- ruleh.values_at("id", "name", "engine", "computed_guards", "grids",
62
- "results", "fixed_results")
63
- eclass = eclassname && eclassname.constantize || Marty::RuleScriptSet
64
- engine = eclass.new(params["pt"]).get_engine(ruleh) if
65
- computed_guards.present? || results.present?
66
-
67
- if computed_guards.present?
68
- begin
69
- res = engine.evaluate(eclass.node_name,
70
- compg_keys(computed_guards),
71
- params.clone)
72
- rescue => e
73
- raise e, "Error (guard) in rule '#{id}:#{name}': #{e}", e.backtrace
72
+ begin
73
+ id, name, eclassname, computed_guards, grids, results, fixed_results =
74
+ ruleh.values_at("id", "name", "engine", "computed_guards", "grids",
75
+ "results", "fixed_results")
76
+ eclass = eclassname && eclassname.constantize || Marty::RuleScriptSet
77
+ engine = eclass.new(params["pt"]).get_engine(ruleh) if
78
+ computed_guards.present? || results.present?
79
+
80
+ result = OpenStruct.new(cg_keys: compg_keys(computed_guards))
81
+
82
+ if computed_guards.present?
83
+ begin
84
+ result.cg_vals = engine.evaluate(eclass.node_name, result.cg_keys,
85
+ params.clone)
86
+ rescue => e
87
+ result.err_message = e.message
88
+ result.err_stack = e.backtrace
89
+ result.err_section = 'computed_guards'
90
+ raise ComputeError.new(
91
+ "Error (guard) in rule '#{id}:#{name}': #{result.err_message}",
92
+ result.err_stack,
93
+ params.clone,
94
+ result.err_section)
95
+ end
96
+ result.cg_hash = Hash[result.cg_keys.zip(result.cg_vals)]
97
+ return result.cg_hash.select{|k,v| !v} unless result.cg_vals.all?
74
98
  end
75
- return Hash[compg_keys(computed_guards).zip(res).select{|k,v| !v}] unless
76
- res.all?
77
- end
78
99
 
79
- grids_computed = false
80
- grid_results = {}
81
- grkeys = grid_keys(grids, eclass)
82
- crkeys = comp_res_keys(results, grids, eclass, metadata_opts)
83
- if (crkeys - grkeys - fixed_results.keys).present?
100
+ grids_computed = false
101
+ result.gr_keys = grid_keys(grids, eclass)
102
+ result.res_keys = comp_res_keys(results, grids, eclass, metadata_opts)
103
+ if (result.res_keys - result.gr_keys - fixed_results.keys).present?
84
104
  begin
85
- eval_result = engine.evaluate(
105
+ result.res_vals = engine.evaluate(
86
106
  eclass.node_name,
87
- crkeys,
107
+ result.res_keys,
88
108
  params + {
89
109
  "dgparams__" => dgparams,
90
110
  })
91
111
  grids_computed = true
92
112
  rescue => e
93
- raise e, "Error (results) in rule '#{id}:#{name}': #{e}", e.backtrace
113
+ result.err_message = e.message
114
+ result.err_stack = e.backtrace
115
+ result.err_section = 'results'
116
+ raise ComputeError.new(
117
+ "Error (results) in rule '#{id}:#{name}': #{result.err_message}",
118
+ result.err_stack,
119
+ params + {
120
+ "dgparams__" => dgparams,
121
+ },
122
+ result.err_section)
94
123
  end
95
- result = Hash[crkeys.zip(eval_result)]
96
- else
97
- result = fixed_results.slice(*crkeys)
98
- end
124
+ result.res_hash = Hash[result.res_keys.zip(result.res_vals)]
125
+ else
126
+ result.res_hash = fixed_results.slice(*result.res_keys)
127
+ end
99
128
 
100
- if grids.present? && !grids_computed
101
- pt = params['pt']
102
- gres = {}
103
- grid_results = grids.each_with_object({}) do |(gvar, gname), h|
104
- usename = eclass.grid_final_name(gvar)
105
- next h[usename] = gres[gname] if gres[gname]
106
- dg = Marty::DataGrid.lookup_h(pt,gname)
107
- dgr = dg && Marty::DataGrid.lookup_grid_distinct_entry_h(pt, dgparams,
108
- dg)
109
- h[usename] = gres[gname] = dgr["result"] if dgr
129
+ if grids.present? && !grids_computed
130
+ pt = params['pt']
131
+ gres = {}
132
+ result.gr_hash = grids.each_with_object({}) do |(gvar, gname), h|
133
+ usename = eclass.grid_final_name(gvar)
134
+ next h[usename] = gres[gname] if gres[gname]
135
+ dg = Marty::DataGrid.lookup_h(pt,gname)
136
+ dgr = dg && Marty::DataGrid.lookup_grid_distinct_entry_h(pt, dgparams,
137
+ dg)
138
+ h[usename] = gres[gname] = dgr["result"] if dgr
139
+ end
110
140
  end
141
+ (result.res_hash||{}) + (result.gr_hash||{})
142
+ ensure
143
+ resh = result.to_h
144
+ [:res_keys, :res_vals].each {|k|resh.delete(k)} if
145
+ result.res_hash.present? || result.res_keys.blank?
146
+ [:cg_keys, :cg_vals].each {|k|resh.delete(k)} if
147
+ result.cg_hash.present? || result.cg_keys.blank?
148
+ resh.delete(:gr_keys) if result.gr_hash.present? || result.gr_keys.blank?
149
+ estack_full = resh.delete(:err_stack)
150
+ estack = estack_full && {
151
+ err_stack: estack_full.select{ |l| l.starts_with?('DELOREAN')}} || {}
152
+ Marty::Logger.info("Rule Log #{ruleh['name']}",
153
+ { input: params,
154
+ dgparams: dgparams } + resh + estack
155
+ ) if ruleh['fixed_results']['log__']
111
156
  end
112
- result + grid_results
113
157
  end
114
158
  def self.base_compute(ruleh, params, dgparams=params)
115
159
  base_compute2(ruleh, nil, params, dgparams)
data/lib/marty/logger.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  class Marty::Logger
2
+ include Delorean::Model
2
3
 
3
4
  def self.method_missing(m, *args, &block)
4
5
  return super unless
@@ -20,4 +21,10 @@ class Marty::Logger
20
21
  raise "#{error_message}: #{e.message}"
21
22
  end
22
23
  end
24
+
25
+ delorean_fn :dllog, sig: [2, 20] do
26
+ |*args|
27
+
28
+ info args[0], args[1..-1]
29
+ end
23
30
  end
data/lib/marty/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Marty
2
- VERSION = "2.3.7"
2
+ VERSION = "2.3.8"
3
3
  end
@@ -358,18 +358,18 @@ EOL
358
358
  "bv"=>"base_value"}}
359
359
 
360
360
  expect(r.first.as_json).to include(exp)
361
- expect(xrv.col_values(:g_string, 5, 0)).to eq(["aaa", "bbb", "ccc",
362
- "ddd", "eee"])
361
+ expect(xrv.col_values(:g_string, 8, 0)).to eq(["aaa", "bbb", "ccc", "ddd",
362
+ "eee", "eee", "eee", "eee"])
363
363
  click_column(xrv, "String list Guard")
364
- expect(xrv.col_values(:g_string, 5, 0)).to eq(["eee", "ddd", "ccc",
365
- "bbb", "aaa"])
364
+ expect(xrv.col_values(:g_string, 8, 0)).to eq(["eee", "eee", "eee", "eee",
365
+ "ddd", "ccc", "bbb", "aaa"])
366
366
  column_filter(xrv, "String list Guard", "eee")
367
367
  rc = xrv.row_count
368
- expect(xrv.col_values(:g_string,rc,0)).to eq(["eee"])
368
+ expect(xrv.col_values(:g_string,rc,0)).to eq(["eee", "eee", "eee", "eee"])
369
369
  column_filter_toggle(xrv, "String list Guard")
370
370
  rc = xrv.row_count
371
- expect(xrv.col_values(:g_string,rc,0)).to eq(["eee", "ddd", "ccc",
372
- "bbb", "aaa"])
371
+ expect(xrv.col_values(:g_string,rc,0)).to eq(["eee", "eee", "eee", "eee",
372
+ "ddd", "ccc", "bbb", "aaa"])
373
373
  column_filter(xrv, "Grids", "Grid1")
374
374
  rc = xrv.row_count
375
375
  # netzke reports jsonb as string
@@ -378,6 +378,9 @@ EOL
378
378
  column_filter_toggle(xrv, "Grids")
379
379
  rc = xrv.row_count
380
380
  expect(xrv.col_values(:grids,rc,0)).to eq([%Q({"grid1":"DataGrid3"}),
381
+ %Q({"grid1":"DataGrid3"}),
382
+ %Q({"grid1":"DataGrid3"}),
383
+ %Q({"grid1":"DataGrid3"}),
381
384
  %Q({"grid1":"DataGrid3"}),
382
385
  %Q({"grid1":"DataGrid2"}),
383
386
  %Q({"grid1":"DataGrid1"}),
@@ -4,3 +4,24 @@ ZRule2,ZRule,2017-2-1 09:01:00,"{""g_string"":""bbb"",""g_range1"":""[20,30)"","
4
4
  ZRule3,ZRule,2017-3-1 10:00:00,"{""g_string"":""ccc"",""g_range1"":""[30,40)"",""g_integer"":3,""g_date"":""2017-1-3"",""g_datetime"":""2017-1-1 12:00:03""}","{}","{""grid1"":""DataGrid2""}","{""bvlen"": ""base_value.length"", ""bv"":""base_value""}"
5
5
  ZRule4,ZRule,2017-3-1 11:00:00,"{""g_string"":""ddd"",""g_range1"":""[40,50)"",""g_integer"":2,""g_date"":""2017-1-4"",""g_datetime"":""2017-1-1 12:00:04""}","{}","{""grid1"":""DataGrid3""}","{""bvlength"": ""base_value.length"", ""bv"":""base_value""}"
6
6
  ZRule5,ZRule,2017-3-1 11:00:01,"{""g_string"":""eee"",""g_range1"":""[50,60)"",""g_integer"":1,""g_date"":""2017-1-5"",""g_datetime"":""2017-1-1 12:00:05""}","{}","{""grid1"":""DataGrid3""}","{""bvlen"": ""base_value.length"", ""bv"":""base_value""}"
7
+ ZRule6,ZRule,2017-3-1 11:00:01,"{""g_string"":""eee"",""g_range1"":""[50,60)"",""g_integer"":6,""g_date"":""2017-1-5"",""g_datetime"":""2017-1-1 12:00:05""}","{}","{""grid1"":""DataGrid3""}","{
8
+ ""log__"":""true"",
9
+ ""tmp_var1"":""base_value.length*2"",
10
+ ""tmp_var2"":""tmp_var1*2"",
11
+ ""tmp_var3"":""tmp_var2*2"",
12
+ ""tmp_var4"":""\""a string\"" * tmp_var1"",
13
+ ""bvlen"": ""base_value.length"", ""bv"":""tmp_var4""}"
14
+ ZRule7,ZRule,2017-3-1 11:00:01,"{""g_string"":""eee"",""g_range1"":""[50,60)"",""g_integer"":7,""g_date"":""2017-1-5"",""g_datetime"":""2017-1-1 12:00:05""}","{
15
+ ""some_guard"":""true""}","{
16
+ ""grid1"":""DataGrid3""}","{
17
+ ""log__"":""true"",
18
+ ""tmp_var1"":""base_value.length*2"",
19
+ ""tmp_var2"":""tmp_var1*2"",
20
+ ""tmp_var3"":""tmp_var2*2"",
21
+ ""tmp_var4"":""\""a string\"" + tmp_var1"",
22
+ ""bvlen"": ""tmp_var4"", ""bv"":""tmp_var4""}"
23
+ ZRule8,ZRule,2017-3-1 11:00:01,"{""g_string"":""eee"",""g_range1"":""[50,60)"",""g_integer"":8,""g_date"":""2017-1-5"",""g_datetime"":""2017-1-1 12:00:05""}","{
24
+ ""cg1"":""1/0""
25
+ }","{""grid1"":""DataGrid3""}","{
26
+ ""log__"":""true"",
27
+ ""bvlen"": ""1"", ""bv"":""2""}"
@@ -266,7 +266,7 @@ module Marty::RuleSpec
266
266
  let(:complex) { Gemini::MyRule.get_matches('infinity',
267
267
  {'rule_type'=>'ComplexRule'},
268
268
  {'g_string'=>'def'}).first }
269
- let(:xyz) { Gemini::XyzRule.get_matches('infinity',
269
+ let(:xyz) { Gemini::XyzRule.get_matches('infinity',
270
270
  {'rule_type'=>'ZRule'},
271
271
  {'g_integer'=> 2}).first }
272
272
  let(:simple) {
@@ -352,6 +352,98 @@ module Marty::RuleSpec
352
352
  'param2' => 1})
353
353
  expect(v["final_value"]).to eq(15)
354
354
  end
355
+ it "exceptions/logging" do
356
+ r6, r7, r8 = [6, 7, 8].map do |i|
357
+ Gemini::XyzRule.get_matches('infinity',
358
+ {'rule_type'=>'ZRule'},
359
+ {'g_integer'=>i}).first
360
+ end
361
+ pt = Time.zone.now+1
362
+ input = {"pt"=>pt,
363
+ "p1"=>12,
364
+ "p2"=>3,
365
+ "flavor"=>"cherry"}
366
+ v1 = r6.compute(input)
367
+ begin
368
+ v2 = r7.compute(input)
369
+ rescue Marty::DeloreanRule::ComputeError => e
370
+ exp = 'no implicit conversion of Fixnum into String'
371
+ expect(e.message).to include(exp)
372
+ expres = [/DELOREAN__XyzRule_\d+_1483228800.0:23:in .+'/,
373
+ /DELOREAN__XyzRule_\d+_1483228800.0:23:in .tmp_var4__D'/,
374
+ /DELOREAN__XyzRule_\d+_1483228800.0:27:in .bv__D'/]
375
+ expres.each_with_index do |expre, i|
376
+ expect(e.backtrace[i]).to match(expre)
377
+ end
378
+ expect(e.input).to eq(input + {'dgparams__'=>input})
379
+ expect(e.section).to eq('results')
380
+ end
381
+ begin
382
+ v2 = r8.compute(input)
383
+ rescue Marty::DeloreanRule::ComputeError => e
384
+ exp = 'divided by 0'
385
+ expect(e.message).to include(exp)
386
+ expres = [%r(DELOREAN__XyzRule_\d+_1483228800.0:5:in ./'),
387
+ /DELOREAN__XyzRule_\d+_1483228800.0:5:in .cg1__D'/]
388
+ expres.each_with_index do |expre, i|
389
+ expect(e.backtrace[i]).to match(expre)
390
+ end
391
+ expect(e.input).to eq(input)
392
+ expect(e.section).to eq('computed_guards')
393
+ end
394
+ log_ents = Marty::Log.all
395
+ expect(log_ents.map{|le|le.message}).to eq(['Rule Log ZRule6',
396
+ 'Rule Log ZRule7',
397
+ 'Rule Log ZRule8'])
398
+ ptjson = pt.as_json
399
+ exp = {"input"=>{"p1"=>12, "p2"=>3,
400
+ "pt"=>ptjson,
401
+ "flavor"=>"cherry"},
402
+ "dgparams"=>{"p1"=>12, "p2"=>3,
403
+ "pt"=>ptjson,
404
+ "flavor"=>"cherry"},
405
+ "gr_keys"=>["grid1_grid_result"],
406
+ "res_hash"=>
407
+ {"bv"=>"a stringa stringa stringa stringa stringa stringa stringa "\
408
+ "stringa stringa stringa stringa stringa stringa stringa "\
409
+ "stringa stringa stringa stringa stringa stringa stringa "\
410
+ "stringa stringa stringa stringa string",
411
+ "grid1_grid_result"=>19}}
412
+ expect(log_ents[0].details).to eq(exp)
413
+ exp = {"input"=>{"p1"=>12, "p2"=>3,
414
+ "pt"=>ptjson,
415
+ "flavor"=>"cherry"},
416
+ "cg_hash"=>{"some_guard"=>true},
417
+ "gr_keys"=>["grid1_grid_result"],
418
+ "dgparams"=>{"p1"=>12, "p2"=>3,
419
+ "pt"=>ptjson,
420
+ "flavor"=>"cherry"},
421
+ "res_keys"=>["bv", "grid1_grid_result"],
422
+ "err_section"=>"results",
423
+ "err_message"=>"no implicit conversion of Fixnum into String"}
424
+ expect(log_ents[1].details.except('err_stack')).to eq(exp)
425
+ expres = [/DELOREAN__XyzRule_\d+_1483228800.0:23:in .+'/,
426
+ /DELOREAN__XyzRule_\d+_1483228800.0:23:in .tmp_var4__D'/,
427
+ /DELOREAN__XyzRule_\d+_1483228800.0:27:in .bv__D'/]
428
+ expres.each_with_index do |expre, i|
429
+ expect(log_ents[1].details['err_stack'][i]).to match(expre)
430
+ end
431
+ exp = {"input"=>{"p1"=>12, "p2"=>3,
432
+ "pt"=>ptjson,
433
+ "flavor"=>"cherry"},
434
+ "cg_keys"=>["cg1"],
435
+ "dgparams"=>{"p1"=>12, "p2"=>3,
436
+ "pt"=>ptjson,
437
+ "flavor"=>"cherry"},
438
+ "err_section"=>"computed_guards",
439
+ "err_message"=>"divided by 0"}
440
+ expect(log_ents[2].details.except('err_stack')).to eq(exp)
441
+ expres = [%r(DELOREAN__XyzRule_\d+_1483228800.0:5:in ./'),
442
+ /DELOREAN__XyzRule_\d+_1483228800.0:5:in .cg1__D'/]
443
+ expres.each_with_index do |expre, i|
444
+ expect(log_ents[2].details['err_stack'][i]).to match(expre)
445
+ end
446
+ end
355
447
  end
356
448
  end
357
449
  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.3.7
4
+ version: 2.3.8
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: 2018-09-14 00:00:00.000000000 Z
17
+ date: 2018-09-25 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: pg