marty 2.3.7 → 2.3.8

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
  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