marty 1.2.3 → 1.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/models/marty/delorean_rule.rb +26 -11
- data/lib/marty/data_exporter.rb +1 -1
- data/lib/marty/rule_script_set.rb +36 -34
- data/lib/marty/version.rb +1 -1
- data/spec/dummy/app/models/gemini/xyz_rule.rb +1 -1
- data/spec/dummy/lib/gemini/xyz_rule_script_set.rb +8 -8
- data/spec/models/rule_spec.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7a63225a41641bfe7a573dd21373cef1746df111
|
4
|
+
data.tar.gz: 46359fc851683968330d72b02a5695072ea81eec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 456016ef7f36a7474dcf5ce564b5616c2616525701db782a6f6582e9e3d638627b41c027838c603c89bec34f723ccac9b7cc94a6e59768a8c24b762d62efa27a
|
7
|
+
data.tar.gz: d1ba3c2c1366c034d76629ab4643a85ffd11d2d06400111fb30f33cf974a9b6ff6c8d43a55dda9bee7a964fd3a684c4e33b1aa14c50aeac477e745d1597c0ba4
|
@@ -11,13 +11,16 @@ class Marty::DeloreanRule < Marty::BaseRule
|
|
11
11
|
if computed_guards.present? || results.present?
|
12
12
|
begin
|
13
13
|
eclass = engine && engine.constantize || Marty::RuleScriptSet
|
14
|
-
eng = eclass.new('infinity').get_engine(
|
14
|
+
eng = eclass.new('infinity').get_engine(self_as_hash)
|
15
15
|
rescue => e
|
16
16
|
return errors[:computed] = "- " + e.message
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
+
def self_as_hash
|
22
|
+
self.as_json + {"classname"=>self.class.name}
|
23
|
+
end
|
21
24
|
def self.find_fixed(results)
|
22
25
|
results.each_with_object({}) do |(k, v), h|
|
23
26
|
v_wo_comment = /\A([^#]+)/.match(v)[1] if v.include?("#")
|
@@ -41,36 +44,40 @@ class Marty::DeloreanRule < Marty::BaseRule
|
|
41
44
|
"NOT DEFINED"
|
42
45
|
end
|
43
46
|
|
44
|
-
def compg_keys
|
47
|
+
def self.compg_keys(computed_guards)
|
45
48
|
computed_guards.keys
|
46
49
|
end
|
47
50
|
|
48
|
-
def comp_res_keys(ecl)
|
49
|
-
defkeys = (Marty::Config[
|
51
|
+
def self.comp_res_keys(results, grids, ecl)
|
52
|
+
defkeys = (Marty::Config[results_cfg_var] || {}).keys
|
50
53
|
results.keys.map {|k| k.ends_with?("_grid") ? ecl.grid_final_name(k) : k}.
|
51
|
-
select{|k| defkeys.include?(k)} + grid_keys(ecl)
|
54
|
+
select{|k| defkeys.include?(k)} + grid_keys(grids, ecl)
|
52
55
|
end
|
53
|
-
def grid_keys(eclass)
|
56
|
+
def self.grid_keys(grids, eclass)
|
54
57
|
grids.keys.map{|k| eclass.grid_final_name(k) }
|
55
58
|
end
|
56
|
-
def base_compute(params, dgparams=params)
|
59
|
+
def self.base_compute(ruleh, params, dgparams=params)
|
60
|
+
id, name, engine, computed_guards, grids, results, fixed_results =
|
61
|
+
ruleh.values_at("id", "name", "engine", "computed_guards", "grids",
|
62
|
+
"results", "fixed_results")
|
57
63
|
eclass = engine && engine.constantize || Marty::RuleScriptSet
|
58
|
-
engine = eclass.new(params["pt"]).get_engine(
|
64
|
+
engine = eclass.new(params["pt"]).get_engine(ruleh) if
|
59
65
|
computed_guards.present? || results.present?
|
60
66
|
|
61
67
|
if computed_guards.present?
|
62
68
|
begin
|
63
69
|
res = engine.evaluate(eclass.node_name,
|
64
|
-
compg_keys,
|
70
|
+
compg_keys(computed_guards),
|
65
71
|
params.clone)
|
66
72
|
rescue => e
|
67
73
|
raise e, "Error (guard) in rule '#{id}:#{name}': #{e}", e.backtrace
|
68
74
|
end
|
69
|
-
return Hash[compg_keys.zip(res).select{|k,v| !v}] unless
|
75
|
+
return Hash[compg_keys(computed_guards).zip(res).select{|k,v| !v}] unless
|
76
|
+
res.all?
|
70
77
|
end
|
71
78
|
grids_computed = false
|
72
79
|
grid_results = {}
|
73
|
-
crkeys = comp_res_keys(eclass)
|
80
|
+
crkeys = comp_res_keys(results, grids, eclass)
|
74
81
|
if (results.keys - fixed_results.keys).present?
|
75
82
|
begin
|
76
83
|
eval_result = engine.evaluate(
|
@@ -100,6 +107,14 @@ class Marty::DeloreanRule < Marty::BaseRule
|
|
100
107
|
end
|
101
108
|
result + grid_results
|
102
109
|
end
|
110
|
+
delorean_fn :route_compute, sig: 4 do
|
111
|
+
|ruleh, pt, params, grid_names_p|
|
112
|
+
kl = ruleh["classname"].constantize
|
113
|
+
kl.compute(ruleh, pt, params, grid_names_p)
|
114
|
+
end
|
115
|
+
def base_compute(params, dgparams=params)
|
116
|
+
self.class.base_compute(self_as_hash, params, dgparams)
|
117
|
+
end
|
103
118
|
|
104
119
|
def self.get_matches_(pt, attrs, params)
|
105
120
|
q = super(pt, attrs.except("rule_dt"), params)
|
data/lib/marty/data_exporter.rb
CHANGED
@@ -72,25 +72,27 @@ class Marty::RuleScriptSet < Delorean::AbstractContainer
|
|
72
72
|
newh.map { |k, v| write_attr(k, v) }.join("\n") + "\n"
|
73
73
|
end
|
74
74
|
|
75
|
-
def grid_code(
|
75
|
+
def grid_code(ruleh)
|
76
76
|
dgcache = {}
|
77
77
|
h = {}
|
78
|
-
|
79
|
-
expand_grid_code(h, k.ends_with?('_grid')?k:k+'_grid', %Q("#{v}"),
|
78
|
+
ruleh["grids"].each do |k, v|
|
79
|
+
expand_grid_code(h, k.ends_with?('_grid')?k:k+'_grid', %Q("#{v}"),
|
80
|
+
dgcache, {})
|
80
81
|
end
|
81
82
|
h.map { |k, v| write_attr(k, v) }.join("\n") + "\n"
|
82
83
|
end
|
83
84
|
|
84
|
-
def guard_code(
|
85
|
-
write_code(
|
85
|
+
def guard_code(ruleh)
|
86
|
+
write_code(ruleh["computed_guards"])
|
86
87
|
end
|
87
88
|
|
88
|
-
def result_code(
|
89
|
-
write_code(
|
89
|
+
def result_code(ruleh)
|
90
|
+
write_code(ruleh["results"])
|
90
91
|
end
|
91
92
|
|
92
|
-
def grid_init(
|
93
|
-
if
|
93
|
+
def grid_init(ruleh)
|
94
|
+
if ruleh["grids"].present? ||
|
95
|
+
ruleh["results"].keys.any?{|k|k.ends_with?("_grid")}
|
94
96
|
write_code({ "pt" => :parameter,
|
95
97
|
"dgparams__" => :parameter,
|
96
98
|
})
|
@@ -98,18 +100,18 @@ class Marty::RuleScriptSet < Delorean::AbstractContainer
|
|
98
100
|
''
|
99
101
|
end
|
100
102
|
end
|
101
|
-
def get_code(
|
102
|
-
grid_i = grid_init(
|
103
|
-
grid_c = grid_code(
|
104
|
-
result_c = result_code(
|
105
|
-
guard_c = guard_code(
|
103
|
+
def get_code(ruleh)
|
104
|
+
grid_i = grid_init(ruleh)
|
105
|
+
grid_c = grid_code(ruleh)
|
106
|
+
result_c = result_code(ruleh)
|
107
|
+
guard_c = guard_code(ruleh)
|
106
108
|
|
107
109
|
code = self.class.body_start + self.class.indent(grid_i +
|
108
110
|
guard_c +
|
109
111
|
grid_c +
|
110
112
|
result_c)
|
111
113
|
#puts '='*40
|
112
|
-
#puts
|
114
|
+
#puts ruleh["name"]
|
113
115
|
#puts '-'
|
114
116
|
#puts code
|
115
117
|
#puts '-'*10
|
@@ -117,17 +119,17 @@ class Marty::RuleScriptSet < Delorean::AbstractContainer
|
|
117
119
|
code
|
118
120
|
end
|
119
121
|
|
120
|
-
def code_section_counts(
|
122
|
+
def code_section_counts(ruleh)
|
121
123
|
errs = {}
|
122
|
-
errs[:grid_params] = grid_init(
|
123
|
-
errs[:computed_guards] = guard_code(
|
124
|
-
errs[:grids] = grid_code(
|
125
|
-
errs[:results] = result_code(
|
124
|
+
errs[:grid_params] = grid_init(ruleh).count("\n")
|
125
|
+
errs[:computed_guards] = guard_code(ruleh).count("\n")
|
126
|
+
errs[:grids] = grid_code(ruleh).count("\n")
|
127
|
+
errs[:results] = result_code(ruleh).count("\n")
|
126
128
|
errs
|
127
129
|
end
|
128
|
-
def get_parse_error_field(
|
130
|
+
def get_parse_error_field(ruleh, exc)
|
129
131
|
line = exc.line ? exc.line - self.class.body_lines : 0
|
130
|
-
errs = code_section_counts(
|
132
|
+
errs = code_section_counts(ruleh)
|
131
133
|
line_count = 0
|
132
134
|
errs.each do |k,v|
|
133
135
|
line_count += v
|
@@ -136,24 +138,24 @@ class Marty::RuleScriptSet < Delorean::AbstractContainer
|
|
136
138
|
errs.keys.last
|
137
139
|
end
|
138
140
|
|
139
|
-
def get_engine(
|
141
|
+
def get_engine(ruleh)
|
140
142
|
begin
|
141
143
|
# if rule is a str => importing a regular Script (i.e. not rule)
|
142
|
-
return sset.get_engine(
|
144
|
+
return sset.get_engine(ruleh) if ruleh.is_a? String
|
143
145
|
|
144
146
|
# on create rule doesn't have an id => don't cache
|
145
|
-
return sset.parse_check("New RULE #{
|
146
|
-
|
147
|
+
return sset.parse_check("New RULE #{ruleh['name']}", get_code(ruleh)) unless
|
148
|
+
ruleh["id"]
|
147
149
|
|
148
|
-
rule_pfx =
|
150
|
+
rule_pfx = ruleh["classname"].demodulize
|
149
151
|
|
150
152
|
# unique name for specific version of rule
|
151
|
-
sname = "#{rule_pfx}_#{
|
153
|
+
sname = "#{rule_pfx}_#{ruleh['group_id']}_#{ruleh['created_dt'].to_f}"
|
152
154
|
|
153
155
|
# is it a dev posting?
|
154
156
|
if Mcfly.is_infinity(pt)
|
155
|
-
max_dt =
|
156
|
-
|
157
|
+
max_dt = ruleh["classname"].constantize.order("created_dt DESC").
|
158
|
+
limit(1).pluck(:created_dt).first
|
157
159
|
|
158
160
|
@@dengines_dt ||= max_dt
|
159
161
|
|
@@ -164,17 +166,17 @@ class Marty::RuleScriptSet < Delorean::AbstractContainer
|
|
164
166
|
|
165
167
|
return engine if engine
|
166
168
|
|
167
|
-
@@dengines[sname] = sset.parse_check(sname, get_code(
|
169
|
+
@@dengines[sname] = sset.parse_check(sname, get_code(ruleh))
|
168
170
|
else
|
169
171
|
engine = @@engines[[pt, sname]]
|
170
172
|
|
171
173
|
return engine if engine
|
172
174
|
|
173
|
-
@@engines[[pt, sname]] = sset.parse_check(sname, get_code(
|
175
|
+
@@engines[[pt, sname]] = sset.parse_check(sname, get_code(ruleh))
|
174
176
|
end
|
175
177
|
rescue Delorean::ParseError => e
|
176
|
-
f = get_parse_error_field(
|
177
|
-
raise "Error in rule '#{
|
178
|
+
f = get_parse_error_field(ruleh, e)
|
179
|
+
raise "Error in rule '#{ruleh['name']}' field '#{f}': #{e}"
|
178
180
|
end
|
179
181
|
end
|
180
182
|
|
data/lib/marty/version.rb
CHANGED
@@ -53,7 +53,7 @@ class Gemini::XyzRule < Marty::DeloreanRule
|
|
53
53
|
return {} unless xyz_keys.present?
|
54
54
|
|
55
55
|
eclass = engine && engine.constantize || Marty::RuleScriptSet
|
56
|
-
engine = eclass.new(pt).get_engine(
|
56
|
+
engine = eclass.new(pt).get_engine(self_as_hash)
|
57
57
|
res = engine.evaluate("XyzNode", xyz_keys, {"xyz_param"=>xyz_param})
|
58
58
|
|
59
59
|
res.all?
|
@@ -5,18 +5,18 @@ 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_code(
|
9
|
-
write_code(
|
8
|
+
def xyz_code(ruleh)
|
9
|
+
write_code(ruleh["computed_guards"].select{|k,_|k.starts_with?("xyz_")})
|
10
10
|
end
|
11
|
-
def guard_code(
|
12
|
-
write_code(
|
11
|
+
def guard_code(ruleh)
|
12
|
+
write_code(ruleh["computed_guards"].reject{|k,_|k.starts_with?("xyz_")})
|
13
13
|
end
|
14
|
-
def get_code(
|
15
|
-
x = xyz_code(
|
14
|
+
def get_code(ruleh)
|
15
|
+
x = xyz_code(ruleh)
|
16
16
|
super + (x.blank? ? '' :
|
17
17
|
"XyzNode:\n xyz_param =? nil\n" + self.class.indent(x))
|
18
18
|
end
|
19
|
-
def code_section_counts(
|
20
|
-
super + { xyz: xyz_code(
|
19
|
+
def code_section_counts(ruleh)
|
20
|
+
super + { xyz: xyz_code(ruleh).count("\n") }
|
21
21
|
end
|
22
22
|
end
|
data/spec/models/rule_spec.rb
CHANGED
@@ -5,6 +5,7 @@ module Marty::RuleSpec
|
|
5
5
|
before(:all) do
|
6
6
|
@save_file = "/tmp/save_#{Process.pid}.psql"
|
7
7
|
save_clean_db(@save_file)
|
8
|
+
marty_whodunnit
|
8
9
|
Marty::Script.load_scripts
|
9
10
|
Marty::Config['RULEOPTS_MYRULE']={'simple_result'=>{},
|
10
11
|
'computed_value'=>{},
|
@@ -19,7 +20,6 @@ module Marty::RuleSpec
|
|
19
20
|
restore_clean_db(@save_file)
|
20
21
|
end
|
21
22
|
before(:each) do
|
22
|
-
marty_whodunnit
|
23
23
|
dt = DateTime.parse('2017-1-1')
|
24
24
|
p = File.expand_path('../../fixtures/csv/rule', __FILE__)
|
25
25
|
[Marty::DataGrid, Gemini::XyzRule, Gemini::MyRule].each do |klass|
|
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: 1.2.
|
4
|
+
version: 1.2.4
|
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-02-
|
17
|
+
date: 2018-02-15 00:00:00.000000000 Z
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
20
20
|
name: pg
|