marty 1.2.3 → 1.2.4
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 +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
|