marty 1.2.4 → 1.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +2 -2
- data/app/models/marty/data_grid.rb +72 -30
- data/app/models/marty/delorean_rule.rb +3 -2
- data/app/models/marty/script.rb +4 -2
- data/lib/marty/rule_script_set.rb +3 -3
- data/lib/marty/version.rb +1 -1
- data/other/marty/diagnostic/aws/ec2_instance.rb +16 -7
- data/spec/models/data_grid_spec.rb +57 -49
- 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: 7de135b5a4bf224982326860d6741402abea2d23
|
4
|
+
data.tar.gz: c24dfff6a7c31694b37ef0e6f0d0cae4ef843db3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a2649e6ea371e5dccc52aaa50ae0f9db245657f2ad0dc56ee65c8a7d1a823af0f2c97272dce953486f69a95420abe0e6ec5e42ab7604e57507e30f544202ffc
|
7
|
+
data.tar.gz: 298317fcd41ef5fee4d9687439a56e19c7f31ffe5cffbc55b4256f7f2adc2dcf67c558866d5a41cb69eb21969129f4fcf57047545dd383d96f5463d474be30dc
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
marty (1.2.
|
4
|
+
marty (1.2.5)
|
5
5
|
axlsx (= 2.1.0pre)
|
6
6
|
coderay
|
7
7
|
delorean_lang (~> 0.3.33)
|
@@ -83,7 +83,7 @@ GEM
|
|
83
83
|
delayed_job_active_record (4.1.2)
|
84
84
|
activerecord (>= 3.0, < 5.2)
|
85
85
|
delayed_job (>= 3.0, < 5)
|
86
|
-
delorean_lang (0.3.
|
86
|
+
delorean_lang (0.3.36)
|
87
87
|
activerecord (>= 3.2)
|
88
88
|
treetop (~> 1.5)
|
89
89
|
diff-lcs (1.3)
|
@@ -89,6 +89,13 @@ class Marty::DataGrid < Marty::Base
|
|
89
89
|
gen_mcfly_lookup :lookup, [:name], cache: true
|
90
90
|
gen_mcfly_lookup :get_all, [], mode: nil
|
91
91
|
|
92
|
+
cached_delorean_fn :lookup_h, sig: [2,3] do
|
93
|
+
|pt, name, fields = %w(id group_id created_dt metadata data_type)|
|
94
|
+
|
95
|
+
dga = get_all(pt).where(name: name).pluck(*fields).first
|
96
|
+
dga && Hash[fields.zip(dga)]
|
97
|
+
end
|
98
|
+
|
92
99
|
cached_mcfly_lookup :lookup_id, sig: 2 do
|
93
100
|
|pt, group_id|
|
94
101
|
find_by_group_id group_id
|
@@ -157,15 +164,18 @@ class Marty::DataGrid < Marty::Base
|
|
157
164
|
|
158
165
|
PLV_DT_FMT = "%Y-%m-%d %H:%M:%S.%N6"
|
159
166
|
|
160
|
-
def plv_lookup_grid_distinct(h_passed, ret_grid_data=false,
|
167
|
+
def self.plv_lookup_grid_distinct(h_passed, dgh, ret_grid_data=false,
|
168
|
+
distinct=true)
|
169
|
+
cd = dgh["created_dt"]
|
170
|
+
@@dtcache ||= {}
|
171
|
+
@@dtcache[cd] ||= cd.strftime(PLV_DT_FMT)
|
161
172
|
row_info = {
|
162
|
-
"id" => id,
|
163
|
-
"group_id" => group_id,
|
164
|
-
"created_dt" =>
|
165
|
-
@@dtcache ||= {})[created_dt] ||= created_dt.strftime(PLV_DT_FMT)
|
173
|
+
"id" => dgh["id"],
|
174
|
+
"group_id" => dgh["group_id"],
|
175
|
+
"created_dt" => @@dtcache[cd]
|
166
176
|
}
|
167
177
|
|
168
|
-
h = metadata.each_with_object({}) do |m, h|
|
178
|
+
h = dgh["metadata"].each_with_object({}) do |m, h|
|
169
179
|
attr = m["attr"]
|
170
180
|
inc = h_passed.fetch(attr, :__nf__)
|
171
181
|
next if inc == :__nf__
|
@@ -196,7 +206,8 @@ class Marty::DataGrid < Marty::Base
|
|
196
206
|
end
|
197
207
|
|
198
208
|
if ret_grid_data
|
199
|
-
|
209
|
+
dg = find(dgh["id"])
|
210
|
+
md, mmd = modify_grid(h_passed, dg.metadata, dg.data)
|
200
211
|
res["data"] = md
|
201
212
|
res["metadata"] = mmd
|
202
213
|
end
|
@@ -206,12 +217,26 @@ class Marty::DataGrid < Marty::Base
|
|
206
217
|
# FIXME: added for Apollo -- not sure where this belongs given that
|
207
218
|
# DGs were moved to marty. Should add documentation about callers
|
208
219
|
# keeping the hash small.
|
220
|
+
# DEPRECATED: should use lookup_grid_h instead
|
209
221
|
cached_delorean_fn :lookup_grid, sig: 4 do
|
210
222
|
|pt, dg, h, distinct|
|
211
223
|
raise "bad DataGrid #{dg}" unless Marty::DataGrid === dg
|
212
224
|
raise "non-hash arg #{h}" unless Hash === h
|
213
225
|
|
214
|
-
|
226
|
+
warn "DEPRECATED: lookup_grid. Use lookup_grid_h instead"
|
227
|
+
|
228
|
+
dgh = dg.attributes.slice("id","group_id","created_dt",
|
229
|
+
"metadata", "data_type")
|
230
|
+
res = plv_lookup_grid_distinct(h, dgh, false, distinct)
|
231
|
+
res["result"]
|
232
|
+
end
|
233
|
+
|
234
|
+
cached_delorean_fn :lookup_grid_h, sig: 4 do
|
235
|
+
|pt, dgh, h, distinct|
|
236
|
+
raise "bad DataGrid #{dgh}" unless Hash === dgh
|
237
|
+
raise "non-hash arg #{h}" unless Hash === h
|
238
|
+
|
239
|
+
res = plv_lookup_grid_distinct(h, dgh, false, distinct)
|
215
240
|
res["result"]
|
216
241
|
end
|
217
242
|
|
@@ -227,8 +252,8 @@ class Marty::DataGrid < Marty::Base
|
|
227
252
|
end
|
228
253
|
end
|
229
254
|
|
230
|
-
|
231
|
-
|
255
|
+
delorean_fn :lookup_grid_distinct_entry_h, sig: [3,6] do
|
256
|
+
|pt, h, dgh, visited=nil, follow=true, return_grid_data=false|
|
232
257
|
|
233
258
|
# Perform grid lookup, if result is another data_grid, and follow is true,
|
234
259
|
# then perform lookup on the resulting grid. Allows grids to be nested
|
@@ -240,33 +265,50 @@ class Marty::DataGrid < Marty::Base
|
|
240
265
|
# "name" => <grid name>
|
241
266
|
# "data" => <grid's data array>
|
242
267
|
# "metadata" => <grid's metadata (array of hashes)>
|
268
|
+
vhash = plv_lookup_grid_distinct(h, dgh, return_grid_data)
|
243
269
|
|
244
|
-
vhash
|
245
|
-
|
246
|
-
return vhash if vhash["result"].nil? || !data_type
|
270
|
+
next vhash if vhash["result"].nil? || !dgh['data_type']
|
247
271
|
|
248
|
-
c_data_type = Marty::DataGrid.convert_data_type(data_type)
|
272
|
+
c_data_type = Marty::DataGrid.convert_data_type(dgh['data_type'])
|
249
273
|
|
250
|
-
|
274
|
+
next vhash if String === c_data_type
|
251
275
|
|
252
276
|
res = vhash["result"]
|
253
277
|
|
254
|
-
v =
|
255
|
-
|
256
|
-
|
278
|
+
v = case
|
279
|
+
when Marty::PgEnum === res
|
280
|
+
c_data_type.find_by_name(res)
|
281
|
+
when Marty::DataGrid == c_data_type
|
282
|
+
follow ?
|
283
|
+
Marty::DataGrid.lookup_h(pt, res) :
|
284
|
+
Marty::DataGrid.lookup(pt, res)
|
285
|
+
else
|
286
|
+
Marty::DataConversion.find_row(c_data_type, {"name" => res}, pt)
|
287
|
+
end
|
257
288
|
|
258
|
-
|
289
|
+
next vhash.merge({"result" => v}) unless (Marty::DataGrid == c_data_type &&
|
290
|
+
follow)
|
259
291
|
|
260
292
|
visited ||= []
|
261
293
|
|
262
|
-
visited <<
|
294
|
+
visited << dgh['group_id']
|
263
295
|
|
264
296
|
raise "#{self.class} recursion loop detected -- #{visited}" if
|
265
|
-
visited.member?(v
|
297
|
+
visited.member?(v['group_id'])
|
266
298
|
|
267
|
-
|
299
|
+
lookup_grid_distinct_entry_h(pt, h, v, visited, follow, return_grid_data)
|
268
300
|
end
|
269
301
|
|
302
|
+
# DEPRECATED: use lookup_grid_distinct_entry_h instead
|
303
|
+
def lookup_grid_distinct_entry(pt, h, visited=nil, follow=true,
|
304
|
+
return_grid_data=false)
|
305
|
+
warn "DEPRECATED: instance method lookup_grid_distinct_entry. "\
|
306
|
+
"Use class method lookup_grid_distinct_entry_h instead"
|
307
|
+
dgh = self.attributes.slice("id","group_id","created_dt",
|
308
|
+
"metadata", "data_type")
|
309
|
+
self.class.lookup_grid_distinct_entry_h(pt, h, dgh, visited, follow,
|
310
|
+
return_grid_data)
|
311
|
+
end
|
270
312
|
delorean_instance_method :lookup_grid_distinct_entry,
|
271
313
|
[[Date, Time, ActiveSupport::TimeWithZone], Hash]
|
272
314
|
|
@@ -580,7 +622,7 @@ class Marty::DataGrid < Marty::Base
|
|
580
622
|
end
|
581
623
|
end
|
582
624
|
|
583
|
-
def modify_grid(params)
|
625
|
+
def self.modify_grid(params, metadata, data)
|
584
626
|
removes = ["h", "v"].each_with_object({}) {|dir, hash| hash[dir] = Set.new}
|
585
627
|
|
586
628
|
metadata_copy, data_copy = metadata.deep_dup, data.deep_dup
|
@@ -627,13 +669,13 @@ class Marty::DataGrid < Marty::Base
|
|
627
669
|
end
|
628
670
|
|
629
671
|
private
|
630
|
-
def remove_indices(orig_array, inds)
|
672
|
+
def self.remove_indices(orig_array, inds)
|
631
673
|
orig_array.each_with_object([]).with_index do |(item, new_array), index|
|
632
674
|
new_array.push(item) unless inds.include?(index)
|
633
675
|
end
|
634
676
|
end
|
635
677
|
|
636
|
-
def opposite_sign(op) # toggle sign and inclusivity
|
678
|
+
def self.opposite_sign(op) # toggle sign and inclusivity
|
637
679
|
{
|
638
680
|
:< => :>=,
|
639
681
|
:<= => :>,
|
@@ -642,7 +684,7 @@ class Marty::DataGrid < Marty::Base
|
|
642
684
|
}[op]
|
643
685
|
end
|
644
686
|
|
645
|
-
def compute_numeric_mods(keys, op, val)
|
687
|
+
def self.compute_numeric_mods(keys, op, val)
|
646
688
|
@keyhash ||= {}
|
647
689
|
prune_a, rewrite_a = [], []
|
648
690
|
|
@@ -695,7 +737,7 @@ class Marty::DataGrid < Marty::Base
|
|
695
737
|
end
|
696
738
|
|
697
739
|
# value is a list of what to keep
|
698
|
-
def compute_set_mods(keys, val)
|
740
|
+
def self.compute_set_mods(keys, val)
|
699
741
|
prune_a, rewrite_a, value = [], [], Array(val)
|
700
742
|
|
701
743
|
keys.each_with_index do |key, index|
|
@@ -718,7 +760,7 @@ class Marty::DataGrid < Marty::Base
|
|
718
760
|
[prune_a, rewrite_a]
|
719
761
|
end
|
720
762
|
|
721
|
-
def parse_range(key)
|
763
|
+
def self.parse_range(key)
|
722
764
|
match = key.match(/\A(\[|\()([0-9\.-]*),([0-9\.-]*)(\]|\))\z/)
|
723
765
|
raise "unrecognized pattern #{key}" unless match
|
724
766
|
|
@@ -730,7 +772,7 @@ class Marty::DataGrid < Marty::Base
|
|
730
772
|
[lboundary == '(' ? :> : :>=, lhv, rhv, rboundary == ')' ? :< : :<=]
|
731
773
|
end
|
732
774
|
|
733
|
-
def rewrite_range(lb, lhv, rhv, rb)
|
775
|
+
def self.rewrite_range(lb, lhv, rhv, rb)
|
734
776
|
lboundary = lb == :> ? '(' : '['
|
735
777
|
|
736
778
|
# even though numranges are float type, we don't want to output ".0"
|
@@ -742,7 +784,7 @@ class Marty::DataGrid < Marty::Base
|
|
742
784
|
lboundary + lvalue + ',' + rvalue + rboundary
|
743
785
|
end
|
744
786
|
|
745
|
-
def parse_bounds(key)
|
787
|
+
def self.parse_bounds(key)
|
746
788
|
match = key.match(/\A *(<|>|<=|>=)? *([a-z_]+) *\z/)
|
747
789
|
raise "unrecognized pattern #{key}" unless match
|
748
790
|
|
@@ -100,8 +100,9 @@ class Marty::DeloreanRule < Marty::BaseRule
|
|
100
100
|
grid_results = grids.each_with_object({}) do |(gvar, gname), h|
|
101
101
|
usename = eclass.grid_final_name(gvar)
|
102
102
|
next h[usename] = gres[gname] if gres[gname]
|
103
|
-
dg = Marty::DataGrid.
|
104
|
-
dgr = dg &&
|
103
|
+
dg = Marty::DataGrid.lookup_h(pt,gname)
|
104
|
+
dgr = dg && Marty::DataGrid.lookup_grid_distinct_entry_h(pt, dgparams,
|
105
|
+
dg)
|
105
106
|
h[usename] = gres[gname] = dgr["result"] if dgr
|
106
107
|
end
|
107
108
|
end
|
data/app/models/marty/script.rb
CHANGED
@@ -141,8 +141,10 @@ class Marty::Script < Marty::Base
|
|
141
141
|
|
142
142
|
engine = Marty::ScriptSet.new(tag).get_engine(script)
|
143
143
|
# IMPORTANT: engine evals (e.g. eval_to_hash) modify the
|
144
|
-
# params
|
145
|
-
|
144
|
+
# params, but it is possible that we may be passing in
|
145
|
+
# a frozen hash. To avoid performance impacts, we should first check if
|
146
|
+
# params is frozen to decide whether to dup (frozen) or clone (not frozen).
|
147
|
+
engine.evaluate(node, attr, params.frozen? ? params.dup : params.clone)
|
146
148
|
end
|
147
149
|
|
148
150
|
delorean_fn :pretty_print, sig: 1 do
|
@@ -49,12 +49,12 @@ class Marty::RuleScriptSet < Delorean::AbstractContainer
|
|
49
49
|
else
|
50
50
|
h[dgid] = dgname
|
51
51
|
h["#{dgid}_dg__"] = <<~EOS
|
52
|
-
Marty::DataGrid.
|
52
|
+
Marty::DataGrid.lookup_h(pt,#{dgid}) ||
|
53
53
|
ERR("grid '#{dgid}' ('%s') not found" % #{dgid})
|
54
54
|
EOS
|
55
55
|
h["#{dgid}_dgp__"] = "dgparams__ + \n" + self.class.indent(paramify_h(h))
|
56
|
-
lgde = "
|
57
|
-
h["#{dgid}_h__"] = "
|
56
|
+
lgde = "lookup_grid_distinct_entry_h"
|
57
|
+
h["#{dgid}_h__"] = "Marty::DataGrid.#{lgde}(pt,#{dgid}_dgp__,#{dgid}_dg__)"
|
58
58
|
h[final_name] = "#{dgid}_h__ && #{dgid}_h__.result"
|
59
59
|
cache[dgname] = final_name
|
60
60
|
end
|
data/lib/marty/version.rb
CHANGED
@@ -20,7 +20,6 @@ class Marty::Diagnostic::Aws::Ec2Instance
|
|
20
20
|
@nodes = get_private_ips
|
21
21
|
end
|
22
22
|
|
23
|
-
private
|
24
23
|
def self.get url
|
25
24
|
uri = URI.parse(url)
|
26
25
|
request = Net::HTTP.new(uri.host, uri.port)
|
@@ -90,11 +89,21 @@ class Marty::Diagnostic::Aws::Ec2Instance
|
|
90
89
|
end
|
91
90
|
|
92
91
|
def get_private_ips
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
92
|
+
begin
|
93
|
+
reservation_set_item = get_instances['reservationSet']['item']
|
94
|
+
reservation_set_item = [reservation_set_item] unless
|
95
|
+
reservation_set_item.is_a?(Array)
|
96
|
+
|
97
|
+
reservation_set_item.map{
|
98
|
+
|i|
|
99
|
+
instances_set_item = i['instancesSet']['item']
|
100
|
+
instances_set_item = [instances_set_item] unless
|
101
|
+
instances_set_item.is_a?(Array)
|
102
|
+
|
103
|
+
instances_set_item.map{|j| j['privateIpAddress']}
|
104
|
+
}.flatten
|
105
|
+
rescue => e
|
106
|
+
raise "Unexpected result came back from AWS. Error: (#{e.message})"
|
107
|
+
end
|
99
108
|
end
|
100
109
|
end
|
@@ -177,8 +177,8 @@ EOS
|
|
177
177
|
end
|
178
178
|
|
179
179
|
def lookup_grid_helper(pt, gridname, params, follow=false)
|
180
|
-
|
181
|
-
res=
|
180
|
+
dgh=Marty::DataGrid.lookup_h(pt, gridname)
|
181
|
+
res=Marty::DataGrid.lookup_grid_distinct_entry_h(pt, params, dgh, nil, follow)
|
182
182
|
[res["result"], res["name"]]
|
183
183
|
end
|
184
184
|
|
@@ -294,80 +294,80 @@ EOS
|
|
294
294
|
end
|
295
295
|
|
296
296
|
context "should handle NULL key values" do
|
297
|
-
let(:
|
297
|
+
let(:dgh) { Marty::DataGrid.lookup_h(pt, "Gf") }
|
298
298
|
|
299
299
|
it 'true returns Y' do
|
300
|
-
res = Marty::DataGrid.
|
300
|
+
res = Marty::DataGrid.lookup_grid_h(pt, dgh, {"b"=>true}, false)
|
301
301
|
expect(res).to eq('Y')
|
302
302
|
end
|
303
303
|
|
304
304
|
it '13 returns N' do
|
305
|
-
res = Marty::DataGrid.
|
305
|
+
res = Marty::DataGrid.lookup_grid_h(pt, dgh, {"i"=>13}, true)
|
306
306
|
expect(res).to eq('N')
|
307
307
|
end
|
308
308
|
|
309
309
|
it '13 & numrange 0 returns nil' do
|
310
|
-
res = Marty::DataGrid.
|
310
|
+
res = Marty::DataGrid.lookup_grid_h(pt, dgh, {"i"=>13, "n"=>0}, true)
|
311
311
|
expect(res).to eq('N')
|
312
312
|
end
|
313
313
|
|
314
314
|
it '13 & int4range 15 returns N' do
|
315
|
-
res = Marty::DataGrid.
|
315
|
+
res = Marty::DataGrid.lookup_grid_h(pt, dgh, {"i"=>13, "i4"=>15}, true)
|
316
316
|
expect(res).to eq('N')
|
317
317
|
end
|
318
318
|
|
319
319
|
it '13 & int4range 1 returns nil' do
|
320
|
-
res = Marty::DataGrid.
|
320
|
+
res = Marty::DataGrid.lookup_grid_h(pt, dgh, {"i"=>13, "i4"=>1}, true)
|
321
321
|
expect(res).to be_nil
|
322
322
|
end
|
323
323
|
|
324
324
|
it 'false, 3, numrange 15 returns N' do
|
325
325
|
res = Marty::DataGrid.
|
326
|
-
|
326
|
+
lookup_grid_h(pt, dgh, {"b"=>false, "i"=>3, "n"=>15}, true)
|
327
327
|
expect(res).to eq('N')
|
328
328
|
end
|
329
329
|
|
330
330
|
it '13, numrange 15 returns N' do
|
331
|
-
res = Marty::DataGrid.
|
331
|
+
res = Marty::DataGrid.lookup_grid_h(pt, dgh, {"i"=>13, "n"=>15}, true)
|
332
332
|
expect(res).to eq('N')
|
333
333
|
end
|
334
334
|
end
|
335
335
|
|
336
336
|
it "should handle ambiguous lookups" do
|
337
|
-
|
337
|
+
dgh = Marty::DataGrid.lookup_h(pt, "Gh")
|
338
338
|
|
339
339
|
h1 = {
|
340
340
|
"property_state" => "NY",
|
341
341
|
"county_name" => "R",
|
342
342
|
}
|
343
343
|
|
344
|
-
res = Marty::DataGrid.
|
344
|
+
res = Marty::DataGrid.lookup_grid_h(pt, dgh, h1, false)
|
345
345
|
expect(res).to eq(10)
|
346
346
|
end
|
347
347
|
|
348
348
|
it "should handle ambiguous lookups (2)" do
|
349
|
-
|
349
|
+
dgh = Marty::DataGrid.lookup_h(pt, "Gg")
|
350
350
|
res = Marty::DataGrid.
|
351
|
-
|
351
|
+
lookup_grid_h(pt, dgh, {"i1"=>2, "i2"=>1}, false)
|
352
352
|
expect(res).to eq(1)
|
353
353
|
|
354
354
|
res = Marty::DataGrid.
|
355
|
-
|
355
|
+
lookup_grid_h(pt, dgh, {"i1"=>3, "i2"=>1}, false)
|
356
356
|
expect(res).to eq(1)
|
357
357
|
|
358
358
|
res = Marty::DataGrid.
|
359
|
-
|
359
|
+
lookup_grid_h(pt, dgh, {"i1"=>2, "i2"=>3}, false)
|
360
360
|
expect(res).to eq(20)
|
361
361
|
end
|
362
362
|
|
363
363
|
it "should handle non-distinct lookups" do
|
364
|
-
|
365
|
-
res = Marty::DataGrid.
|
364
|
+
dgh = Marty::DataGrid.lookup_h(pt, "Ge")
|
365
|
+
res = Marty::DataGrid.lookup_grid_h(pt, dgh, {"ltv"=>500}, false)
|
366
366
|
|
367
367
|
expect(res).to eq(1.1)
|
368
368
|
|
369
369
|
expect {
|
370
|
-
Marty::DataGrid.
|
370
|
+
Marty::DataGrid.lookup_grid_h(pt, dgh, {"ltv"=>500}, true)
|
371
371
|
}.to raise_error(RuntimeError)
|
372
372
|
end
|
373
373
|
|
@@ -376,14 +376,14 @@ EOS
|
|
376
376
|
"client_id" => 700127,
|
377
377
|
"property_state" => "CA",
|
378
378
|
}
|
379
|
-
|
380
|
-
res = Marty::DataGrid.
|
379
|
+
dgh = Marty::DataGrid.lookup_h(pt, "Gj")
|
380
|
+
res = Marty::DataGrid.lookup_grid_h(pt, dgh, params, false)
|
381
381
|
|
382
382
|
# should return the upper left corner match
|
383
383
|
expect(res).to eq(0.25)
|
384
384
|
|
385
385
|
expect {
|
386
|
-
Marty::DataGrid.
|
386
|
+
Marty::DataGrid.lookup_grid_h(pt, dgh, params, true)
|
387
387
|
}.to raise_error(RuntimeError)
|
388
388
|
end
|
389
389
|
|
@@ -626,10 +626,10 @@ EOS
|
|
626
626
|
it "should handle typed (enum) data lookup_grid" do
|
627
627
|
pt = 'infinity'
|
628
628
|
ca = Gemini::State.find_by_name("CA")
|
629
|
-
|
629
|
+
dgh = Marty::DataGrid.lookup_h(pt, "Gb")
|
630
630
|
|
631
631
|
res = Marty::DataGrid.
|
632
|
-
|
632
|
+
lookup_grid_h(pt, dgh, {"property_state" => ca}, false)
|
633
633
|
|
634
634
|
expect(res).to eq 70
|
635
635
|
end
|
@@ -654,8 +654,9 @@ EOS
|
|
654
654
|
"keys"=>["[600,700)", "[700,750)", "[750,]"],
|
655
655
|
"type"=>"numrange"}]
|
656
656
|
|
657
|
-
|
658
|
-
res =
|
657
|
+
dgh = Marty::DataGrid.lookup_h(pt, 'G2')
|
658
|
+
res = Marty::DataGrid.lookup_grid_distinct_entry_h(pt, {}, dgh,
|
659
|
+
nil, true, true)
|
659
660
|
expect(res["data"]).to eq (expected_data)
|
660
661
|
expect(res["metadata"]).to eq (expected_metadata)
|
661
662
|
end
|
@@ -676,9 +677,11 @@ EOS
|
|
676
677
|
"attr"=>"fico",
|
677
678
|
"keys"=>["[600,700)", "[700,750)", "[750,]"],
|
678
679
|
"type"=>"numrange"}]
|
679
|
-
|
680
|
-
res =
|
681
|
-
|
680
|
+
dgh = Marty::DataGrid.lookup_h(pt, 'G8')
|
681
|
+
res = Marty::DataGrid.lookup_grid_distinct_entry_h(pt,
|
682
|
+
{ "ltv" => 10,
|
683
|
+
"state" => "RI" },
|
684
|
+
dgh, nil, true,
|
682
685
|
true)
|
683
686
|
expect(res["data"]).to eq (expected_data)
|
684
687
|
expect(res["metadata"]).to eq (expected_metadata)
|
@@ -690,44 +693,47 @@ EOS
|
|
690
693
|
"attr"=>"ltv",
|
691
694
|
"keys"=>["[,115]", "(115,135]", "(135,140]"],
|
692
695
|
"type"=>"numrange"}]
|
693
|
-
|
694
|
-
res =
|
695
|
-
|
696
|
+
dgh = Marty::DataGrid.lookup_h(pt, 'G8')
|
697
|
+
res = Marty::DataGrid.lookup_grid_distinct_entry_h(pt,
|
698
|
+
{ "ltv" => 10,
|
699
|
+
"state" => "RI" },
|
700
|
+
dgh, nil, false,
|
696
701
|
true)
|
697
702
|
expect(res["data"]).to eq (expected_data)
|
698
703
|
expect(res["metadata"]).to eq (expected_metadata)
|
699
704
|
end
|
700
705
|
|
701
706
|
it "should handle all characters in grid inputs" do
|
702
|
-
|
707
|
+
dgh = Marty::DataGrid.lookup_h(pt, 'G1')
|
703
708
|
5000.times do
|
704
709
|
st = 30.times.map{rand(224)+32}.pack('U*')
|
705
|
-
res =
|
706
|
-
|
707
|
-
|
708
|
-
|
710
|
+
res = Marty::DataGrid.lookup_grid_distinct_entry_h(pt,
|
711
|
+
{ "ltv" => 10,
|
712
|
+
"fico" => 690,
|
713
|
+
"state" => st },
|
714
|
+
dgh, nil, false, true)
|
709
715
|
end
|
710
716
|
end
|
711
717
|
it "should handle all quote chars in grid inputs" do
|
712
|
-
|
718
|
+
dgh = Marty::DataGrid.lookup_h(pt, 'G1')
|
713
719
|
# single, double, backslash, grave, acute, unicode quotes: left single,
|
714
720
|
# right single, left double, right double
|
715
721
|
quotes = ["'", '"', '\\', '`', "\u00b4", "\u2018", "\u2019",
|
716
722
|
"\u201C", "\u201D"]
|
717
723
|
100.times do
|
718
724
|
st = 30.times.map{quotes[rand(9)]}.join
|
719
|
-
res =
|
725
|
+
res = Marty::DataGrid.lookup_grid_distinct_entry_h(pt, { "ltv" => 10,
|
720
726
|
"fico" => 690,
|
721
|
-
"state" => st }, nil,
|
727
|
+
"state" => st }, dgh, nil,
|
722
728
|
false, true)
|
723
729
|
end
|
724
730
|
end
|
725
731
|
it "should handle quote chars in object name" do
|
726
|
-
|
732
|
+
dgh = Marty::DataGrid.lookup_h(pt, 'G1')
|
727
733
|
st = Gemini::State.new(name: "'\\")
|
728
|
-
res =
|
734
|
+
res = Marty::DataGrid.lookup_grid_distinct_entry_h(pt, { "ltv" => 10,
|
729
735
|
"fico" => 690,
|
730
|
-
"state" => st }, nil,
|
736
|
+
"state" => st }, dgh, nil,
|
731
737
|
false, true)
|
732
738
|
end
|
733
739
|
end
|
@@ -749,17 +755,19 @@ EOS
|
|
749
755
|
dgb.update_from_import("Gb", Gb.sub(/70/, "333"), '1/1/2015')
|
750
756
|
dgb.update_from_import("Gb", Gb.sub(/70/, "444"), '1/1/2016')
|
751
757
|
|
752
|
-
|
753
|
-
|
758
|
+
dgch = dgc.attributes.
|
759
|
+
slice("id","group_id","created_dt", "metadata", "data_type")
|
760
|
+
res = Marty::DataGrid.lookup_grid_distinct_entry_h('2/2/2014',
|
761
|
+
{"property_state" => "CA"}, dgch)
|
754
762
|
expect(res["result"]).to eq(70)
|
755
763
|
|
756
|
-
res =
|
757
|
-
{"property_state" => "CA"})
|
764
|
+
res = Marty::DataGrid.lookup_grid_distinct_entry_h('2/2/2015',
|
765
|
+
{"property_state" => "CA"}, dgch)
|
758
766
|
|
759
767
|
expect(res["result"]).to eq(333)
|
760
768
|
|
761
|
-
res =
|
762
|
-
{"property_state" => "CA"})
|
769
|
+
res = Marty::DataGrid.lookup_grid_distinct_entry_h('2/2/2016',
|
770
|
+
{"property_state" => "CA"}, dgch)
|
763
771
|
|
764
772
|
expect(res["result"]).to eq(444)
|
765
773
|
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: 1.2.
|
4
|
+
version: 1.2.5
|
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-23 00:00:00.000000000 Z
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
20
20
|
name: pg
|