marty 2.0.0 → 2.0.1

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: 5d9d9f5c0e9c2652723559940f1b2914b383a979
4
- data.tar.gz: 2070a22df262364639b039d103fc788e0c98636d
3
+ metadata.gz: 31ab53bcb7bcc26bfa4bd1d400c5e0c7861558d3
4
+ data.tar.gz: c12dae6177787b1cd2eefb4416c11b15155a4395
5
5
  SHA512:
6
- metadata.gz: a7548a3dd1274bbd4e8245cc7fc05186386b936801f22ab1ce3e8b1d9fdf17d4b7ffa096ed9a3d8232f612ee4a55f4c0295a3e27cad07aee8eb9665585547405
7
- data.tar.gz: 65a33ee22a28c6aedd262b505f5fc83d12ecf33821fe725f132c8cdfa1b7f1823da0ecb84283ac12696ed3eb5b04cf18a07f60f60e09b41249c43afbcb371b61
6
+ metadata.gz: 6c435cd40922422b864e5dc5ed4d20536ca8a50317b917a4b53b299a9d949ef67594ceb8707c38c822efd3024264e7a1832f3707ed8d2ae039957848681cf627
7
+ data.tar.gz: 17a9348a816387d216a59739eac52b9cca47790ec8dd5cb469eaee93c660c83a29d40f8b9afac1ccc422d4ea6245386948732c5a87632fc612793b5a0677d4c0
@@ -1,10 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- marty (1.2.9)
4
+ marty (2.0.1)
5
5
  axlsx (= 3.0.0pre)
6
6
  coderay
7
- delorean_lang (~> 0.3.33)
7
+ delorean_lang (~> 0.3.37)
8
8
  json-schema
9
9
  mcfly (= 0.0.20)
10
10
  net-ldap (= 0.12.1)
@@ -21,4 +21,60 @@ class Marty::Base < ActiveRecord::Base
21
21
  PLUCK_SIG = [1, 100]
22
22
  SELECT_SIG = [1, 100]
23
23
  WHERE_SIG = [0, 100]
24
+
25
+ class << self
26
+ attr_accessor :struct_attrs
27
+ end
28
+ def self.get_struct_attrs
29
+ self.struct_attrs ||= self.attribute_names -
30
+ ["id", "group_id", "created_dt", "obsoleted_dt", "user_id",
31
+ "o_user_id"] -
32
+ (self.const_defined?('MCFLY_UNIQUENESS') &&
33
+ self.const_get('MCFLY_UNIQUENESS') || []).map(&:to_s)
34
+ end
35
+
36
+ def self.get_final_attrs(opts)
37
+ return [] if opts["no_convert"] == true
38
+ include_attrs = [opts["include_attrs"] || []].flatten
39
+ final_attrs = get_struct_attrs + include_attrs
40
+ return final_attrs if final_attrs.present?
41
+
42
+ # otherwise raise with error line
43
+ raise "Marty::Base: no attributes for #{self}"
44
+
45
+ # for more detailed debugging use this code instead
46
+ # st = caller.detect{|s|s.starts_with?('DELOREAN__')}
47
+ # re = /DELOREAN__([A-Z][a-zA-Z0-9]*)[:]([0-9]+)[:]in `([a-z_0-9]+)__D'/
48
+ # m = re.match(st)
49
+ # if !m
50
+ # st = "No attributes #{st} #{self}"
51
+ # puts st unless File.readlines(Rails.root.join('tmp','dlchk')).
52
+ # map(&:chop).detect{|l|l==st}
53
+ # else
54
+ # loc = "#{m[1]}::#{self}::#{m[2]}"
55
+ # str = "*** No attributes %-40s %-20s %s" % [loc, m[3], attr]
56
+ # puts str unless File.readlines(Rails.root.join('tmp','dlchk')).
57
+ # map(&:chop).detect{|l|l==str}
58
+ # end
59
+ end
60
+
61
+ def self.make_openstruct(inst, opts={})
62
+ return nil unless inst
63
+ return inst if opts["no_convert"] == true
64
+ fa = opts["fa"] || get_final_attrs(opts)
65
+ os = OpenStruct.new(inst.attributes.slice(*fa))
66
+ (opts['link_attrs'] || []).each do |col, attr|
67
+ os[col] ||= OpenStruct.new
68
+ attrs = [attr].flatten
69
+ attrs.map { |attr| os[col][attr] = inst.send(col).try(attr) }
70
+ end
71
+ if self == Marty::DataGrid
72
+ def os.lookup_grid_distinct_entry(pt, params)
73
+ dgh = self.to_h.stringify_keys.slice("id","group_id","created_dt",
74
+ "metadata", "data_type")
75
+ Marty::DataGrid.lookup_grid_distinct_entry_h(pt, params, dgh)
76
+ end
77
+ end
78
+ os
79
+ end
24
80
  end
@@ -89,10 +89,11 @@ class Marty::DataGrid < Marty::Base
89
89
 
90
90
  def self.lookup_h(pt, name, fields = nil)
91
91
  fields ||= %w(id group_id created_dt metadata data_type)
92
- dga = get_all(pt).where(name: name).pluck(*fields).first
92
+ dga = mcfly_pt(pt).where(name: name).pluck(*fields).first
93
93
  dga && Hash[fields.zip(dga)]
94
94
  end
95
95
 
96
+ # deprecated - remove 2018-Oct
96
97
  cached_mcfly_lookup :lookup_id, sig: 2 do
97
98
  |pt, group_id|
98
99
  find_by_group_id group_id
@@ -103,6 +104,10 @@ class Marty::DataGrid < Marty::Base
103
104
  Marty::DataGrid.mcfly_pt(pt).where(name: name).exists?
104
105
  end
105
106
 
107
+ def self.get_struct_attrs
108
+ self.struct_attrs ||= super + ["id", "group_id", "created_dt"]
109
+ end
110
+
106
111
  def to_s
107
112
  name
108
113
  end
@@ -216,11 +221,15 @@ class Marty::DataGrid < Marty::Base
216
221
  res
217
222
  end
218
223
 
224
+ # deprecated - remove 2018-Oct
219
225
  cached_delorean_fn :lookup_grid, sig: 4 do
220
226
  |pt, dg, h, distinct|
221
- raise "bad DataGrid #{dg}" unless Marty::DataGrid === dg
227
+ dg_is_grid = Marty::DataGrid === dg
228
+ dg_is_os = dg.is_a?(OpenStruct)
229
+ raise "bad DataGrid #{dg}" unless dg_is_grid || dg_is_os
222
230
  raise "non-hash arg #{h}" unless Hash === h
223
- dgh = dg.attributes.slice('id', 'group_id', 'created_dt', 'metadata')
231
+ dgh = dg_is_os ? dg.to_h.stringify_keys :
232
+ dg.attributes.slice('id', 'group_id', 'created_dt', 'metadata')
224
233
  res = plv_lookup_grid_distinct(h, dgh, false, distinct)
225
234
  res["result"]
226
235
  end
@@ -248,8 +257,8 @@ class Marty::DataGrid < Marty::Base
248
257
  end
249
258
  end
250
259
 
251
- delorean_fn :lookup_grid_distinct_entry_h, sig: [3,6] do
252
- |pt, h, dgh, visited=nil, follow=true, return_grid_data=false, distinct=true|
260
+ def self.lookup_grid_distinct_entry_h(pt, h, dgh, visited=nil, follow=true,
261
+ return_grid_data=false, distinct=true)
253
262
 
254
263
  # Perform grid lookup, if result is another data_grid, and follow is true,
255
264
  # then perform lookup on the resulting grid. Allows grids to be nested
@@ -263,11 +272,11 @@ class Marty::DataGrid < Marty::Base
263
272
  # "metadata" => <grid's metadata (array of hashes)>
264
273
  vhash = plv_lookup_grid_distinct(h, dgh, return_grid_data, distinct)
265
274
 
266
- next vhash if vhash["result"].nil? || !dgh['data_type']
275
+ return vhash if vhash["result"].nil? || !dgh['data_type']
267
276
 
268
277
  c_data_type = Marty::DataGrid.convert_data_type(dgh['data_type'])
269
278
 
270
- next vhash if String === c_data_type
279
+ return vhash if String === c_data_type
271
280
 
272
281
  res = vhash["result"]
273
282
 
@@ -282,7 +291,7 @@ class Marty::DataGrid < Marty::Base
282
291
  Marty::DataConversion.find_row(c_data_type, {"name" => res}, pt)
283
292
  end
284
293
 
285
- next vhash.merge({"result" => v}) unless (Marty::DataGrid == c_data_type &&
294
+ return vhash.merge({"result" => v}) unless (Marty::DataGrid == c_data_type &&
286
295
  follow)
287
296
 
288
297
  visited ||= []
@@ -378,7 +387,7 @@ class Marty::DataGrid < Marty::Base
378
387
 
379
388
  def export
380
389
  # return null string when called from Netzke on add_in_form
381
- return "" if metadata.nil? && data.nil?
390
+ return "" if metadata.nil? && data.nil?
382
391
 
383
392
  meta_rows, h_key_rows, data_rows = export_array
384
393
 
@@ -389,7 +398,11 @@ class Marty::DataGrid < Marty::Base
389
398
  gsub(/\"\"/, '') # remove "" to beautify output
390
399
  end
391
400
 
392
- delorean_instance_method :export, []
401
+ delorean_fn :export, sig: 1 do
402
+ |os|
403
+ dg = find(os.id)
404
+ dg.export
405
+ end
393
406
 
394
407
  def self.parse_fvalue(pt, v, type, klass)
395
408
  return unless v
@@ -19,7 +19,7 @@ class Marty::DeloreanRule < Marty::BaseRule
19
19
  end
20
20
 
21
21
  def self_as_hash
22
- self.as_json + {"classname"=>self.class.name}
22
+ self.attributes + {"classname"=>self.class.name}
23
23
  end
24
24
  def self.find_fixed(results)
25
25
  results.each_with_object({}) do |(k, v), h|
@@ -75,6 +75,7 @@ class Marty::DeloreanRule < Marty::BaseRule
75
75
  return Hash[compg_keys(computed_guards).zip(res).select{|k,v| !v}] unless
76
76
  res.all?
77
77
  end
78
+
78
79
  grids_computed = false
79
80
  grid_results = {}
80
81
  crkeys = comp_res_keys(results, grids, eclass)
@@ -94,6 +95,7 @@ class Marty::DeloreanRule < Marty::BaseRule
94
95
  elsif fixed_results.keys.sort == results.keys.sort
95
96
  result = fixed_results
96
97
  end
98
+
97
99
  if grids.present? && !grids_computed
98
100
  pt = params['pt']
99
101
  gres = {}
@@ -113,6 +115,22 @@ class Marty::DeloreanRule < Marty::BaseRule
113
115
  kl = ruleh["classname"].constantize
114
116
  kl.compute(ruleh, pt, params, grid_names_p)
115
117
  end
118
+ delorean_fn :route_compute_rs, sig: 3 do
119
+ |ruleh, pt, features|
120
+ kl = ruleh["classname"].constantize
121
+ kl.compute_rs(ruleh, pt, features)
122
+ end
123
+ delorean_fn :route_validate_results, sig: [1, 2] do
124
+ |ruleh, reqchk=false|
125
+ kl = ruleh["classname"].constantize
126
+ kl.validate_results(ruleh, reqchk)
127
+ end
128
+ delorean_fn :route_validate_grid_attrs, sig: [2, 3] do
129
+ |ruleh, gridname, addl_attrs=nil|
130
+ kl = ruleh["classname"].constantize
131
+ kl.validate_grid_attrs(ruleh, gridname, addl_attrs)
132
+ end
133
+
116
134
  def base_compute(params, dgparams=params)
117
135
  self.class.base_compute(self_as_hash, params, dgparams)
118
136
  end
@@ -140,5 +158,4 @@ class Marty::DeloreanRule < Marty::BaseRule
140
158
  def self.init_dg_handler
141
159
  Marty::DataGrid.register_rule_handler(get_grid_rename_handler(self))
142
160
  end
143
-
144
161
  end
@@ -40,13 +40,4 @@ class Marty::ImportType < Marty::Base
40
40
  def allow_import?
41
41
  Mcfly.whodunnit && Mcfly.whodunnit.roles.pluck(:id).include?(role_id)
42
42
  end
43
-
44
- delorean_fn :lookup, sig: 1 do
45
- |name|
46
- self.find_by_name(name)
47
- end
48
-
49
- delorean_fn :get_all, sig: 0 do
50
- self.all
51
- end
52
43
  end
@@ -40,19 +40,24 @@ class Marty::Posting < Marty::Base
40
40
  o
41
41
  end
42
42
 
43
+ def self.get_struct_attrs
44
+ self.struct_attrs ||= super + ["created_dt", "name"]
45
+ end
46
+
43
47
  # Not using mcfly_lookup since we don't want these time-warp markers
44
48
  # time-warped. FIXME: perhaps this should use mcfly_lookup since we
45
49
  # may allow deletion of postings. i.e. a new one with same name
46
50
  # might be created. Or, use regular validates_uniqueness_of instead
47
51
  # of mcfly_validates_uniqueness_of.
48
- delorean_fn :lookup, sig: 1 do
49
- |name|
50
- self.find_by_name(name)
52
+ delorean_fn :lookup, sig: [1, 2] do
53
+ |name, opts={}|
54
+ p = select(get_struct_attrs).find_by_name(name)
55
+ make_openstruct(p, opts)
51
56
  end
52
57
 
53
58
  delorean_fn :lookup_dt, sig: 1 do
54
59
  |name|
55
- lookup(name).try(:created_dt)
60
+ find_by_name(name).try(:created_dt)
56
61
  end
57
62
 
58
63
  delorean_fn :first_match, sig: [1, 2] do
@@ -62,35 +67,25 @@ class Marty::Posting < Marty::Base
62
67
 
63
68
  q = where("created_dt <= ?", dt)
64
69
  q = q.where(posting_type_id: posting_type.id) if posting_type
65
- q.order("created_dt DESC").first
70
+ q.order("created_dt DESC").first.attributes
66
71
  end
67
72
 
68
- delorean_fn :get_latest, sig: [1, 2] do
69
- |limit, is_test=nil|
73
+ def self.get_latest(limit, is_test=nil)
70
74
  # IMPORTANT: is_test arg is ignored (KEEP for backward compat.)
71
75
 
72
- where("created_dt <> 'infinity'").
73
- order("created_dt DESC").limit(limit).to_a
76
+ q=where("created_dt <> 'infinity'").
77
+ order("created_dt DESC").limit(limit)
74
78
  end
75
79
 
76
- delorean_fn :get_latest_by_type, sig: [2, 2] do
80
+ delorean_fn :get_latest_by_type, sig: [1, 2] do
77
81
  |limit, posting_types=[]|
78
82
  raise "missing posting types list" unless posting_types
79
83
  raise "bad posting types list" unless posting_types.is_a?(Array)
80
84
 
81
- joins(:posting_type).where("created_dt <> 'infinity'").
82
- where(marty_posting_types: { name: posting_types } ).
83
- order("created_dt DESC").limit(limit || 1).to_a
84
- end
85
-
86
- delorean_fn :get_last, sig: [0, 1] do
87
- |posting_type=nil|
88
-
89
- raise "bad posting type" if
90
- posting_type && !posting_type.is_a?(Marty::PostingType)
91
-
92
- q = where("created_dt <> 'infinity'")
93
- q = q.where(posting_type_id: posting_type.id) if posting_type
94
- q.order("created_dt DESC").first
85
+ q=joins(:posting_type).where("created_dt <> 'infinity'").
86
+ where(marty_posting_types: { name: posting_types } ).
87
+ select(get_struct_attrs).
88
+ order("created_dt DESC").limit(limit || 1)
89
+ q.map{|ar| ar.attributes}
95
90
  end
96
91
  end
@@ -3,10 +3,4 @@ class Marty::PostingType < Marty::Base
3
3
 
4
4
  validates_presence_of :name
5
5
  validates_uniqueness_of :name
6
-
7
- # NOTE: lookup fn for backward compat -- to index enums, use []
8
- delorean_fn :lookup, sig: 1 do
9
- |name|
10
- self.find_by_name(name)
11
- end
12
6
  end
@@ -11,12 +11,11 @@ class Marty::Script < Marty::Base
11
11
  belongs_to :user, class_name: "Marty::User"
12
12
 
13
13
  gen_mcfly_lookup :lookup, [:name], cache: true
14
- gen_mcfly_lookup :get_all, {}, mode: nil
15
14
 
16
15
  # find script by name/tag
17
16
  def self.find_script(sname, tag=nil)
18
17
  tag = Marty::Tag.map_to_tag(tag)
19
- Marty::Script.lookup(tag.created_dt, sname)
18
+ Marty::Script.lookup(tag.created_dt, sname, {"no_convert"=>true})
20
19
  end
21
20
 
22
21
  def find_tag
@@ -33,7 +32,7 @@ class Marty::Script < Marty::Base
33
32
  end
34
33
 
35
34
  def self.load_a_script(sname, body, dt=nil)
36
- s = Marty::Script.lookup('infinity', sname)
35
+ s = Marty::Script.lookup('infinity', sname, {"no_convert"=>true})
37
36
 
38
37
  if !s
39
38
  s = Marty::Script.new
@@ -6,6 +6,10 @@ class Marty::Tag < Marty::Base
6
6
 
7
7
  belongs_to :user, class_name: "Marty::User"
8
8
 
9
+ def self.get_struct_attrs
10
+ self.struct_attrs ||= super + ["id", "created_dt"]
11
+ end
12
+
9
13
  def self.make_name(dt)
10
14
  return 'DEV' if Mcfly.is_infinity(dt)
11
15
 
@@ -38,7 +42,7 @@ class Marty::Tag < Marty::Base
38
42
  def self.map_to_tag(tag_id)
39
43
  # FIXME: this is really hacky. This function should not take so
40
44
  # many different types of arguments.
41
-
45
+ nc = {"no_convert"=>true}
42
46
  case tag_id
43
47
  when Integer, /\A[0-9]+\z/
44
48
  tag = find_by_id(tag_id)
@@ -47,8 +51,8 @@ class Marty::Tag < Marty::Base
47
51
  # if tag name wasn't found, look for a matching
48
52
  # posting, then find the tag whose created_dt <= posting dt.
49
53
  if !tag
50
- posting = Marty::Posting.lookup(tag_id)
51
- tag = find_match(Mcfly.normalize_infinity(posting.created_dt)) if
54
+ posting = Marty::Posting.lookup(tag_id, nc)
55
+ tag = find_match(Mcfly.normalize_infinity(posting['created_dt'])) if
52
56
  posting
53
57
  end
54
58
  when nil
@@ -56,44 +60,28 @@ class Marty::Tag < Marty::Base
56
60
  else
57
61
  tag = tag_id
58
62
  end
59
-
60
- raise "bad tag identifier #{tag_id.inspect}" unless tag.is_a? Marty::Tag
63
+ raise "bad tag identifier #{tag_id.inspect}" unless tag.is_a?(Marty::Tag)
61
64
  tag
62
65
  end
63
66
 
64
67
  cached_delorean_fn :lookup, sig: 1 do
65
68
  |name|
66
- self.find_by_name(name)
69
+ t = self.find_by_name(name).select(get_struct_attrs)
70
+ t && t.attributes
67
71
  end
68
72
 
69
- # Performance hack to cache AR object
70
- cached_delorean_fn :lookup_id, sig: 1 do
71
- |id|
72
- find_by_id(id)
73
+ def self.get_latest1
74
+ order("created_dt DESC").find_by("created_dt <> 'infinity'")
73
75
  end
74
76
 
75
- delorean_fn :lookup_dt, sig: 1 do
76
- |name|
77
- lookup(name).try(:created_dt)
78
- end
79
-
80
- delorean_fn :get_latest1, sig: 0 do
81
- where("created_dt <> 'infinity'").order("created_dt DESC").first
82
- end
83
-
84
- delorean_fn :find_match, sig: 1 do
85
- |dt|
86
- id = select(:id).where("created_dt <= ?", dt).order("created_dt DESC").first.id
87
-
88
- # performance hack to use cached version
89
- id && lookup_id(id)
77
+ def self.find_match(dt)
78
+ order("created_dt DESC").find_by("created_dt <= ?", dt)
90
79
  end
91
80
 
92
81
  # Performance hack for script sets -- FIXME: making find_mtach
93
82
  # cached breaks Gemini tests. Need to look into it.
94
- cached_delorean_fn :cached_find_match, sig: 1 do
95
- |dt|
96
-
97
- find_match dt
83
+ def self.cached_find_match(dt)
84
+ @@CACHE_FIND_BY_DT ||= {}
85
+ @@CACHE_FIND_BY_DT[dt] ||= find_match(dt)
98
86
  end
99
87
  end
@@ -21,7 +21,7 @@ class Marty::DataChange
21
21
 
22
22
  changes.each_with_object({}) do |(group_id, ol), h|
23
23
  h[group_id] = ol.each_with_index.map do |o, i|
24
- profile = {"obj" => o}
24
+ profile = {"obj" => o.attributes}
25
25
 
26
26
  # Create a profile hash for each object in the group.
27
27
  # "status" tells us if the object is old/new/mod. If
@@ -128,7 +128,7 @@ class Marty::DataChange
128
128
  klass = k.constantize
129
129
  next (klass.is_a? Marty::PgEnum) ? klass.get_all : []
130
130
  end
131
-
131
+
132
132
  delorean_fn :export_changes, sig: 3 do
133
133
  |t0, t1, class_name|
134
134
 
@@ -27,7 +27,6 @@ module Mcfly::Model
27
27
  cache_key = [name, ts] + args.map{ |a|
28
28
  a.is_a?(ActiveRecord::Base) ? a.id : a
29
29
  } unless Mcfly.is_infinity(ts)
30
-
31
30
  next @LOOKUP_CACHE[cache_key] if
32
31
  cache_key && @LOOKUP_CACHE.has_key?(cache_key)
33
32
 
@@ -53,19 +52,54 @@ module Mcfly::Model
53
52
  end
54
53
  end
55
54
 
56
- # FIXME: duplicate code from Mcfly's mcfly_lookup.
57
- def cached_mcfly_lookup(name, options = {}, &block)
58
- cached_delorean_fn(name, options) do |ts, *args|
59
- raise "nil timestamp" if ts.nil?
55
+ def base_mcfly_lookup(meth, name, options = {}, &block)
56
+
57
+ sig = options[:sig]
58
+ newsig = sig.is_a?(Array) ? [sig[0], sig[1]+1] :
59
+ sig == -1 ? sig : [sig, sig+1]
60
+ options[:sig] = newsig
61
+ asig = options[:asig] || newsig[1]-1
62
+
63
+ send(meth, name, options) do |ts, *pargs|
64
+ raise "time cannot be nil" if ts.nil?
65
+
66
+ args, opts = pargs.last.is_a?(Hash) && pargs.length == asig ?
67
+ [pargs[0..-2], pargs.last] :
68
+ [pargs, {}]
60
69
 
61
70
  ts = Mcfly.normalize_infinity(ts)
62
71
 
63
- self.mcfly_pt(ts).scoping do
72
+ q = self.where("#{table_name}.obsoleted_dt >= ? AND " +
73
+ "#{table_name}.created_dt < ?", ts, ts).scoping do
64
74
  block.call(ts, *args)
65
75
  end
76
+ fa = get_final_attrs(opts)
77
+ opts += {"fa"=>fa}
78
+
79
+ q = q.select(*fa) if fa.present? &&
80
+ q.respond_to?(:select) && !q.is_a?(Array) &&
81
+ !q.is_a?(Hash)
82
+
83
+ case
84
+ when opts["no_convert"] == true
85
+ q
86
+ when q.is_a?(ActiveRecord::Relation)
87
+ q.map{|ar| make_openstruct(ar, opts)}
88
+ when q.is_a?(ActiveRecord::Base)
89
+ make_openstruct(q, opts)
90
+ else
91
+ q
92
+ end
66
93
  end
67
94
  end
68
95
 
96
+ def cached_mcfly_lookup(name, options = {}, &block)
97
+ base_mcfly_lookup(:cached_delorean_fn, name, options, &block)
98
+ end
99
+ def mcfly_lookup(name, options = {}, &block)
100
+ base_mcfly_lookup(:delorean_fn, name, options, &block)
101
+ end
102
+
69
103
  # FIXME: add private mode. This should make the function
70
104
  # unavailable to delorean.
71
105
  def gen_mcfly_lookup(name, attrs, options={})
@@ -99,14 +133,11 @@ module Mcfly::Model
99
133
  raise "bad attrs" unless Array === attrs
100
134
  end
101
135
 
102
- fn = cache ? :cached_mcfly_lookup : :mcfly_lookup
103
-
104
- # hacky: if private, set sig to bad value -- i.e. can't be
105
- # called from delorean. Ideally, we should have a 'private'
106
- # option for delorean_fn.
107
- sig = options[:private] ? -1 : attrs.length+1
136
+ actual_sig = attrs.length + 1
137
+ fn = cache ? :cached_delorean_fn : :delorean_fn
138
+ sig = options[:private] ? -1 : actual_sig
108
139
 
109
- send(fn, name, sig: sig) do
140
+ base_mcfly_lookup(fn, name, {sig: sig, asig: actual_sig}) do
110
141
  |t, *attr_list|
111
142
 
112
143
  attr_list_ids = attr_list.each_with_index.map {|x, i|
@@ -264,6 +264,7 @@ args_hack = [[ActiveRecord::Relation, ActiveRecord::QueryMethods::WhereChain]] +
264
264
  Delorean::RUBY_WHITELIST.merge!(
265
265
  count: [ActiveRecord::Relation],
266
266
  distinct: args_hack,
267
+ find_by: args_hack,
267
268
  group: args_hack,
268
269
  joins: args_hack,
269
270
  limit: [ActiveRecord::Relation, Integer],
@@ -275,6 +276,9 @@ Delorean::RUBY_WHITELIST.merge!(
275
276
  mcfly_pt: [ActiveRecord::Relation,
276
277
  [Date, Time, ActiveSupport::TimeWithZone, String],
277
278
  [nil, Class]],
279
+ lookup_grid_distinct_entry: [OpenStruct,
280
+ [Date, Time, ActiveSupport::TimeWithZone, String],
281
+ Hash],
278
282
  )
279
283
 
280
284
  ######################################################################
@@ -285,3 +289,24 @@ module Mcfly::Controller
285
289
  find_current_user rescue nil
286
290
  end
287
291
  end
292
+
293
+ ######################################################################
294
+
295
+ class OpenStruct
296
+ def save
297
+ loc = %r([^/]+:[0-9]+).match(caller.first)[0]
298
+ raise "save called from #{loc} on #{self}"
299
+ end
300
+ def save!
301
+ loc = %r([^/]+:[0-9]+).match(caller.first)[0]
302
+ raise "save! called from #{loc} on #{self}"
303
+ end
304
+ def reload
305
+ loc = %r([^/]+:[0-9]+).match(caller.first)[0]
306
+ raise "reload called from #{loc} on #{self}"
307
+ end
308
+ #def method_missing(meth, *args)
309
+ # puts caller[0..8]
310
+ # super
311
+ #end
312
+ end
@@ -23,7 +23,6 @@ class Delorean::BaseModule::NodeCall
23
23
  end
24
24
  script, tag = engine.module_name, engine.sset.tag
25
25
  nn = node.is_a?(Class) ? node.name : node.to_s
26
-
27
26
  begin
28
27
  # make sure params is serialzable before starting a Job
29
28
  Marshal.dump(params)
@@ -1,3 +1,3 @@
1
1
  module Marty
2
- VERSION = "2.0.0"
2
+ VERSION = "2.0.1"
3
3
  end
@@ -32,8 +32,7 @@ Gem::Specification.new do |s|
32
32
 
33
33
  s.add_dependency 'axlsx', '3.0.0pre'
34
34
 
35
-
36
- s.add_dependency 'delorean_lang', '~> 0.3.33'
35
+ s.add_dependency 'delorean_lang', '~> 0.3.37'
37
36
  s.add_dependency 'mcfly', '0.0.20'
38
37
 
39
38
  s.add_dependency 'coderay'
@@ -20,7 +20,7 @@ describe Marty::RpcController do
20
20
 
21
21
 
22
22
  # create an untagged version for DEV
23
- s = Marty::Script.lookup('infinity', "A")
23
+ s = Marty::Script.lookup('infinity', "A", {"no_convert"=>true})
24
24
  s.body = "A:\n a = 3\n"
25
25
  s.save!
26
26
  }
@@ -21,18 +21,20 @@ class Gemini::Helper
21
21
 
22
22
  # Just for testing
23
23
  delorean_fn :import_data, sig: [2, 3] do
24
- |import_type, data, col_sep|
24
+ |import_type_name, data, col_sep|
25
25
 
26
26
  col_sep ||= "\t"
27
27
 
28
+ imp_t = Marty::ImportType.find_by_name(import_type_name)
29
+
28
30
  raise "Insufficient permissions to run the data import" unless
29
- import_type.allow_import?
31
+ imp_t.allow_import?
30
32
 
31
- Marty::DataImporter.do_import_summary(import_type.get_model_class,
33
+ Marty::DataImporter.do_import_summary(imp_t.get_model_class,
32
34
  data,
33
35
  'infinity',
34
- import_type.cleaner_function,
35
- import_type.validation_function,
36
+ imp_t.cleaner_function,
37
+ imp_t.validation_function,
36
38
  col_sep,
37
39
  false)
38
40
  end
@@ -2,7 +2,9 @@ import Fields
2
2
  import Styles
3
3
 
4
4
  PostingField2: Fields::PostingField2
5
- store = ["NOW"] + [lp.name for lp in Marty::Posting.get_latest(10, nil)]
5
+ store = ["NOW"] + Marty::Posting.
6
+ where("created_dt <> 'infinity'").
7
+ order("created_dt DESC").limit(10).pluck("name")
6
8
 
7
9
  StyleRow:
8
10
  profile =?
@@ -70,7 +70,7 @@ ImportTypeField:
70
70
  field_label = "Import Type"
71
71
  name = "import_type"
72
72
  xtype = ":combo"
73
- store = [imp.name for imp in Marty::ImportType.get_all].sort
73
+ store = Marty::ImportType.pluck("name").sort
74
74
  value = store[0]
75
75
 
76
76
  CommaSepField:
@@ -92,11 +92,8 @@ DataImportReport:
92
92
 
93
93
  data_import_field =?
94
94
 
95
- import_type_rec = Marty::ImportType.lookup(import_type) ||
96
- ERR("NULL ImportType", import_type)
97
-
98
95
  result = Gemini::Helper.import_data(
99
- import_type_rec,
96
+ import_type,
100
97
  data_import_field,
101
98
  if comma_sep then "," else nil
102
99
  )
@@ -2,7 +2,9 @@ PostingField:
2
2
  field_label = "Posting"
3
3
  xtype = ":combo"
4
4
  name = "pt_name"
5
- store = [lp.name for lp in Marty::Posting.get_latest(10)]
5
+ store = Marty::Posting.
6
+ where("created_dt <> 'infinity'").
7
+ order("created_dt DESC").limit(10).pluck("name")
6
8
  value = store[0]
7
9
 
8
10
  ######################################################################
@@ -83,7 +83,9 @@ feature 'under Applications menu, Reports using Data Import', js: true do
83
83
  import_type_combo = netzke_find('Import Type', 'combobox')
84
84
  import_type_combo.select_values('FB')
85
85
  bud_id = Gemini::BudCategory.first.id
86
- paste("bud_category_id\tnote_rate\tsettlement_mm\tsettlement_yy\tbuy_up\tbuy_down\n#{bud_id}\t9.500\t9\t2014\t0\t0\n#{bud_id}\t9.750\t9\t2014\t0\t0\n",
86
+ paste("bud_category_id\tnote_rate\tsettlement_mm\tsettlement_yy\t"\
87
+ "buy_up\tbuy_down\n#{bud_id}\t9.500\t9\t2014\t0\t0\n"\
88
+ "#{bud_id}\t9.750\t9\t2014\t0\t0\n",
87
89
  'data_import_field')
88
90
  end
89
91
  end
@@ -37,7 +37,9 @@ PostingField:
37
37
  field_label = "Posting"
38
38
  xtype = ":combo"
39
39
  name = "pt_name"
40
- store = [lp.name for lp in Marty::Posting.get_latest(10)]
40
+ store = Marty::Posting.
41
+ where("created_dt <> 'infinity'").
42
+ order("created_dt DESC").limit(10).pluck("name")
41
43
 
42
44
  RateField:
43
45
  field_label = "Note Rate"
@@ -117,8 +117,8 @@ feature 'rule view', js: true do
117
117
  "results"=>"",
118
118
  })
119
119
 
120
- r = Gemini::MyRule.lookup('infinity','abc')
121
- expect(r.as_json).to include({"user_id"=>1,
120
+ r = Gemini::MyRule.lookup('infinity','abc', {"no_convert"=>true})
121
+ expect(r.attributes).to include({"user_id"=>1,
122
122
  "o_user_id"=>nil,
123
123
  "name"=>"abc",
124
124
  "engine"=>"Gemini::MyRuleScriptSet",
@@ -172,7 +172,7 @@ feature 'rule view', js: true do
172
172
  "results"=>"",
173
173
  }
174
174
  r = Gemini::MyRule.lookup('infinity','abc')
175
- expect(r.as_json["simple_guards"]["g_nullbool"]).to eq(false)
175
+ expect(r["simple_guards"]["g_nullbool"]).to eq(false)
176
176
  expect(mrv.get_row_vals(1)).to include(exp)
177
177
  # grid edits
178
178
  press("Edit")
@@ -189,7 +189,7 @@ feature 'rule view', js: true do
189
189
  "grids"=>
190
190
  "{\"grid1\":\"DataGrid1\"}"})
191
191
  r = Gemini::MyRule.lookup('infinity','abc')
192
- expect(r.as_json["simple_guards"]).not_to include('g_nullbool')
192
+ expect(r["simple_guards"]).not_to include('g_nullbool')
193
193
  # computed fields
194
194
  press("Edit")
195
195
  fill_in(:computed_guards, with: 'sadf asdf ljsf')
@@ -240,8 +240,8 @@ feature 'rule view', js: true do
240
240
  fill_in("Range Guard 2", with: "[30,40)")
241
241
  press("OK")
242
242
  r = Gemini::XyzRule.get_matches('infinity', {}, {"g_range1"=> 150,
243
- "g_range2"=> 35})
244
-
243
+ "g_range2"=> 35},
244
+ {"no_convert"=>true})
245
245
  expect(r.to_a.count).to eq(1)
246
246
  exp = {"user_id"=>1,
247
247
  "o_user_id"=>nil,
@@ -54,7 +54,7 @@ DELOREAN
54
54
  }, Date.today)
55
55
 
56
56
  # add a DEV version of M1.
57
- s = Marty::Script.lookup('infinity', "M1")
57
+ s = Marty::Script.lookup('infinity', "M1", {"no_convert"=>true})
58
58
  s.body = sample_script.gsub(/A/, "AA") + ' e =? "hello"'
59
59
  s.save!
60
60
  }
@@ -37,6 +37,12 @@ A:
37
37
  select("note_rate").
38
38
  first.note_rate
39
39
 
40
+ oo = Gemini::FannieBup.
41
+ order("note_rate", "buy_down ASC").
42
+ select("note_rate").
43
+ find_by("obsoleted_dt = 'infinity'").
44
+ note_rate
45
+
40
46
  g = Gemini::FannieBup.
41
47
  select("settlement_yy*settlement_mm AS x, count(*) AS c").
42
48
  group("settlement_mm", "settlement_yy").
@@ -124,6 +130,16 @@ EOF
124
130
  first.note_rate
125
131
  end
126
132
 
133
+ it "perfroms order+find_by" do
134
+ res = @engine.evaluate("A", "oo", {})
135
+
136
+ expect(res).to eq Gemini::FannieBup.
137
+ order("note_rate", "buy_down ASC").
138
+ select("note_rate").
139
+ find_by("obsoleted_dt = 'infinity'").
140
+ note_rate
141
+ end
142
+
127
143
  it "perfroms group+count" do
128
144
  res = @engine.evaluate("A", "gg", {})
129
145
 
@@ -50,7 +50,7 @@ module Marty
50
50
 
51
51
  it "should allow a tagged script version to be associated when a DEV " +
52
52
  "version of that script also exists" do
53
- s = Marty::Script.lookup('infinity', 'Script1')
53
+ s = Marty::Script.lookup('infinity', 'Script1', {"no_convert"=>true})
54
54
  s.body = "A:\n a = 3\n"
55
55
  s.save!
56
56
 
@@ -204,9 +204,10 @@ EOS
204
204
  dg_from_import("G8", G8)
205
205
  dg_from_import("Ga", Ga)
206
206
 
207
- expect(Marty::DataGrid.lookup('infinity', "G1").name).to eq "G1"
208
- expect(Marty::DataGrid.lookup('infinity', "G2").name).to eq "G2"
209
- expect(Marty::DataGrid.lookup('infinity', "G3").name).to eq "G3"
207
+ inc = {"include_attrs"=>"name"}
208
+ expect(Marty::DataGrid.lookup('infinity', "G1", inc).name).to eq "G1"
209
+ expect(Marty::DataGrid.lookup('infinity', "G2", inc).name).to eq "G2"
210
+ expect(Marty::DataGrid.lookup('infinity', "G3", inc).name).to eq "G3"
210
211
  end
211
212
 
212
213
  it "should not allow bad axis types" do
@@ -415,7 +416,7 @@ EOS
415
416
  expect(res).to eq [5.6,"G2"]
416
417
  }
417
418
 
418
- dg = Marty::DataGrid.lookup('infinity', "G1")
419
+ dg = Marty::DataGrid.lookup('infinity', "G1", {"no_convert"=>true})
419
420
 
420
421
  h = {
421
422
  "fico" => 600,
@@ -562,7 +563,6 @@ EOS
562
563
  it "should handle multi DataGrid lookups" do
563
564
  expect(Marty::DataGrid.lookup('infinity', "G8").data_type).
564
565
  to eq "Marty::DataGrid"
565
- g1 = Marty::DataGrid.lookup('infinity', "G1")
566
566
 
567
567
  h = {
568
568
  "fico" => 600,
@@ -581,7 +581,7 @@ EOS
581
581
  end
582
582
 
583
583
  it "should handle DataGrid typed data grids" do
584
- g1 = Marty::DataGrid.lookup('infinity', "G1")
584
+ g1 = Marty::DataGrid.lookup('infinity', "G1", {"no_convert"=>true})
585
585
 
586
586
  res = lookup_grid_helper('infinity',
587
587
  "Ga",
@@ -824,8 +824,9 @@ EOS
824
824
 
825
825
  expect(sum).to eq({create: 1})
826
826
 
827
- g1 = Marty::DataGrid.lookup('infinity', "G1")
828
- g11 = Marty::DataGrid.lookup('infinity', "G11")
827
+ nc = {"no_convert"=>true}
828
+ g1 = Marty::DataGrid.lookup('infinity', "G1", nc)
829
+ g11 = Marty::DataGrid.lookup('infinity', "G11", nc)
829
830
 
830
831
  expect(g1.export).to eq g11.export
831
832
  end
@@ -69,31 +69,38 @@ module Marty
69
69
  # First param is just the limit (max) to return
70
70
  res = Posting.get_latest_by_type(10, ['BASE'])
71
71
  expect(res.count).to eq 1
72
- expect(res[0].comment).to eq 'base posting'
72
+ r0 = Posting.find_by_name(res[0]['name'])
73
+ expect(r0.comment).to eq 'base posting'
73
74
  end
74
75
 
75
76
  it "filters on multiple posting types" do
76
77
  res = Posting.get_latest_by_type(10, ['BASE', 'SNAPSHOT'])
77
78
  expect(res.count).to eq 4
78
79
  # snapshot3 is most recent with this filter
79
- expect(res[0].comment).to eq 'snapshot3 posting'
80
- expect(res[3].comment).to eq 'base posting'
80
+ r0 = Posting.find_by_name(res[0]['name'])
81
+ r3 = Posting.find_by_name(res[3]['name'])
82
+ expect(r0.comment).to eq 'snapshot3 posting'
83
+ expect(r3.comment).to eq 'base posting'
81
84
  end
82
85
 
83
86
  it "filters on posting types that are single or double quoted" do
84
87
  res = Posting.get_latest_by_type(10, ['SNAPSHOT', "OTHER"])
85
88
  expect(res.count).to eq 5
86
89
  # other2 is most recent with this filter
87
- expect(res[0].comment).to eq 'other2 posting'
88
- expect(res[4].comment).to eq 'snapshot1 posting'
90
+ r0 = Posting.find_by_name(res[0]['name'])
91
+ r4 = Posting.find_by_name(res[4]['name'])
92
+ expect(r0.comment).to eq 'other2 posting'
93
+ expect(r4.comment).to eq 'snapshot1 posting'
89
94
  end
90
95
 
91
96
  it "filters and limits on multiple posting types" do
92
97
  res = Posting.get_latest_by_type(3, ['SNAPSHOT', 'OTHER'])
93
98
  expect(res.count).to eq 3
94
99
  # other2 is most recent with this filter
95
- expect(res[0].comment).to eq 'other2 posting'
96
- expect(res[2].comment).to eq 'other1 posting'
100
+ r0 = Posting.find_by_name(res[0]['name'])
101
+ r2 = Posting.find_by_name(res[2]['name'])
102
+ expect(r0.comment).to eq 'other2 posting'
103
+ expect(r2.comment).to eq 'other1 posting'
97
104
  end
98
105
 
99
106
  it "returns nothing with an empty posting type list" do
@@ -170,66 +170,68 @@ module Marty::RuleSpec
170
170
 
171
171
  context "lookups" do
172
172
  it "matches" do
173
+ nc = {"no_convert"=>true}
173
174
  lookup = Gemini::MyRule.get_matches('infinity',
174
175
  {'rule_type'=>'SimpleRule'},
175
- {'g_array'=>'G1V3'})
176
+ {'g_array'=>'G1V3'}, nc)
176
177
  expect(lookup.to_a.count).to eq(1)
177
178
  expect(lookup.first.name).to eq("Rule1")
178
179
  lookup = Gemini::MyRule.get_matches('infinity',
179
180
  {'rule_type'=>'SimpleRule',
181
+
180
182
  'other_flag'=>true},
181
- {})
183
+ {}, nc)
182
184
  expect(lookup.to_a.count).to eq(4)
183
185
  expect(lookup.map{|l|l.name}.to_set).to eq(Set["Rule2","Rule2a",
184
186
  "Rule2b", "Rule2c"])
185
187
  lookup = Gemini::MyRule.get_matches('infinity',
186
188
  {'rule_type'=>'ComplexRule',
187
189
  'other_flag'=>false},
188
- {})
190
+ {}, nc)
189
191
  expect(lookup.to_a.count).to eq(1)
190
192
  expect(lookup.first.name).to eq("Rule3")
191
193
  # bool false matches bool nil
192
194
  lookup = Gemini::MyRule.get_matches('infinity',
193
195
  {'rule_type'=>'ComplexRule',
194
196
  'other_flag'=>false},
195
- {'g_bool'=>false})
197
+ {'g_bool'=>false}, nc)
196
198
  expect(lookup.to_a.count).to eq(1)
197
199
  expect(lookup.first.name).to eq("Rule3")
198
200
  lookup = Gemini::MyRule.get_matches('infinity',
199
201
  {'rule_type'=>'ComplexRule'},
200
- {'g_string'=>'def'})
202
+ {'g_string'=>'def'}, nc)
201
203
  expect(lookup.to_a.count).to eq(1)
202
204
  expect(lookup.first.name).to eq("Rule3")
203
205
  lookup = Gemini::MyRule.get_matches('infinity',
204
206
  {'rule_type'=>'ComplexRule'},
205
- {'g_string'=>'abc'})
207
+ {'g_string'=>'abc'}, nc)
206
208
  expect(lookup).to eq([])
207
209
  lookup = Gemini::MyRule.get_matches('infinity',
208
210
  {'rule_type'=>'SimpleRule'},
209
211
  {'g_bool'=>true, "g_range"=>25,
210
- 'g_integer'=>99})
212
+ 'g_integer'=>99}, nc)
211
213
  expect(lookup.to_a.count).to eq(1)
212
214
  expect(lookup.first.name).to eq("Rule2a")
213
215
  lookup = Gemini::MyRule.get_matches('infinity',
214
216
  {'rule_type'=>'SimpleRule'},
215
- {'g_bool'=>true, "g_range"=>75})
217
+ {'g_bool'=>true, "g_range"=>75}, nc)
216
218
  expect(lookup.to_a.count).to eq(1)
217
219
  expect(lookup.first.name).to eq("Rule1")
218
220
  lookup = Gemini::MyRule.get_matches('infinity',
219
221
  {'rule_type'=>'SimpleRule'},
220
222
  {'g_bool'=>true, "g_range"=>75,
221
- 'g_integer'=>11})
223
+ 'g_integer'=>11}, nc)
222
224
  expect(lookup).to eq([])
223
225
  lookup = Gemini::MyRule.get_matches('infinity',
224
226
  {'rule_type'=>'SimpleRule'},
225
227
  {'g_bool'=>true, "g_range"=>75,
226
- 'g_integer'=>10})
228
+ 'g_integer'=>10}, nc)
227
229
  expect(lookup.to_a.count).to eq(1)
228
230
  expect(lookup.first.name).to eq("Rule1")
229
231
  lookup = Gemini::MyRule.get_matches('infinity',
230
232
  {'rule_type'=>'SimpleRule'},
231
233
  {'g_bool'=>false, "g_range"=>25,
232
- 'g_integer'=>10})
234
+ 'g_integer'=>10}, nc)
233
235
  expect(lookup.to_a.count).to eq(1)
234
236
  expect(lookup.first.name).to eq("Rule2c")
235
237
  lookup = Gemini::MyRule.get_matches('infinity',
@@ -237,13 +239,13 @@ module Marty::RuleSpec
237
239
  expect(lookup.to_a.count).to eq(5)
238
240
  lookup = Gemini::MyRule.get_matches('infinity',
239
241
  {'rule_dt'=>"2017-3-1 02:00:00"},
240
- {})
242
+ {}, nc)
241
243
  expect(lookup.to_a.count).to eq(6)
242
244
  expect(lookup.pluck(:name).to_set).to eq(Set["Rule1", "Rule2", "Rule2a",
243
245
  "Rule2b", "Rule2c", "Rule3"])
244
246
  lookup = Gemini::MyRule.get_matches('infinity',
245
247
  {'rule_dt'=>"2017-4-1 16:00:00"},
246
- {})
248
+ {}, nc)
247
249
  expect(lookup.to_a.count).to eq(1)
248
250
  expect(lookup.pluck(:name).first).to eq("Rule4")
249
251
  lookup = Gemini::MyRule.get_matches('infinity',
@@ -254,38 +256,40 @@ module Marty::RuleSpec
254
256
  expect(lookup.to_a).to eq([])
255
257
  lookup = Gemini::MyRule.get_matches('infinity', {},
256
258
  {"g_bool_def"=>false,
257
- "g_nbool_def"=>true})
259
+ "g_nbool_def"=>true}, nc)
258
260
  expect(lookup.to_a.count).to eq(1)
259
261
  expect(lookup.pluck(:name).first).to eq("Rule1")
260
262
  end
261
263
  end
262
264
  context "rule compute" do
265
+ let(:nc) {{"no_convert"=>true}}
263
266
  let(:complex) { Gemini::MyRule.get_matches('infinity',
264
267
  {'rule_type'=>'ComplexRule'},
265
- {'g_string'=>'def'}).first }
268
+ {'g_string'=>'def'}, nc).first }
266
269
  let(:xyz) { Gemini::XyzRule.get_matches('infinity',
267
270
  {'rule_type'=>'ZRule'},
268
- {'g_integer'=> 2}).first }
271
+ {'g_integer'=> 2}, nc).first }
269
272
  let(:simple) {
270
273
  Gemini::MyRule.get_matches('infinity',
271
274
  {'rule_type'=>'SimpleRule'},
272
- {'g_bool'=>true, "g_range"=>25}).first }
275
+ {'g_bool'=>true, "g_range"=>25}, nc).first }
273
276
  let(:simple2a) {
274
277
  Gemini::MyRule.get_matches('infinity',
275
278
  {'rule_type'=>'SimpleRule'},
276
- {'g_bool'=>true, "g_integer"=>99}).first }
279
+ {'g_bool'=>true, "g_integer"=>99}, nc).first }
277
280
  let(:simple2b) {
278
281
  Gemini::MyRule.get_matches('infinity',
279
282
  {'rule_type'=>'SimpleRule'},
280
- {'g_bool'=>true, "g_integer"=>999}).first }
283
+ {'g_bool'=>true, "g_integer"=>999}, nc).first }
281
284
  let(:altgridmethod) {
282
285
  Gemini::MyRule.get_matches('infinity',
283
286
  {'rule_type'=>'ComplexRule'},
284
- {"g_integer"=>3757}).first }
287
+ {"g_integer"=>3757}, nc).first }
285
288
  let(:gridcomputedname) {
286
289
  Gemini::MyRule.get_matches('infinity',
287
290
  {'rule_type'=>'ComplexRule'},
288
- {"g_string"=>"Hi Mom", "g_integer"=>11}).first }
291
+ {"g_string"=>"Hi Mom",
292
+ "g_integer"=>11}, nc).first }
289
293
  it "computed guards work" do
290
294
  c = complex.compute({"pt"=>Time.zone.now,
291
295
  'param2'=>'def'})
@@ -17,7 +17,8 @@ describe Marty::Script do
17
17
  it "creates a new script if it doesn't already exist" do
18
18
  expect { Marty::Script.load_a_script('TestNew', s1, now) }.
19
19
  to change(Marty::Script, :count).by(1)
20
- expect(Marty::Script.lookup('infinity', 'TestNew').created_dt.to_s).
20
+ expect(Marty::Script.lookup('infinity', 'TestNew', {"no_convert"=>true}).
21
+ created_dt.to_s).
21
22
  to eq(now.to_s)
22
23
  end
23
24
 
@@ -39,8 +40,8 @@ describe Marty::Script do
39
40
  s2, now) }.
40
41
  to change { Marty::Script.where(name: 'TestExistsAndDifferent2',
41
42
  obsoleted_dt: 'infinity').count }.by(0)
42
- expect(Marty::Script.lookup('infinity', 'TestExistsAndDifferent2').
43
- created_dt.to_s).to eq(now.to_s)
43
+ expect(Marty::Script.lookup('infinity', 'TestExistsAndDifferent2',
44
+ {"no_convert"=>true}).created_dt.to_s).to eq(now.to_s)
44
45
  end
45
46
  end
46
47
 
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.0.0
4
+ version: 2.0.1
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-03-30 00:00:00.000000000 Z
17
+ date: 2018-04-09 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: pg
@@ -64,14 +64,14 @@ dependencies:
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: 0.3.33
67
+ version: 0.3.37
68
68
  type: :runtime
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: 0.3.33
74
+ version: 0.3.37
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: mcfly
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -508,7 +508,6 @@ files:
508
508
  - other/marty/diagnostic/request.rb
509
509
  - other/marty/diagnostic/version.rb
510
510
  - script/rails
511
- - script_id,
512
511
  - spec/controllers/application_controller_spec.rb
513
512
  - spec/controllers/diagnostic/controller_spec.rb
514
513
  - spec/controllers/job_controller_spec.rb
data/script_id, DELETED
File without changes