marty 1.0.15 → 1.0.17

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: 443c5c011284c9a2ea3e10f62be61aca86b5ee27
4
- data.tar.gz: c6bdf687627ec7971dabf549b7a8390c186a976a
3
+ metadata.gz: ddef9c94cc142b0d56475fd47ce2d8a91bdc988e
4
+ data.tar.gz: 46e3879a1402abf89018c5ac88323109d83ce905
5
5
  SHA512:
6
- metadata.gz: 4cb6dc2818dc2990744feb4fc44a8d8d97f6637237555b40e5c00a9cfdaacbe9a93e3941c6c8c54bb3e21bbcd247cc6dbf4dfea4466cc0688248fc2217a97b7c
7
- data.tar.gz: d15b0f44ed1d6825e38ac6626c27beb6b966741dade658d13eebf05f2001a214b6a20771bfc768983991309a411e16f883f566ceb66a052765772b5eb876431c
6
+ metadata.gz: 7cf2b4a830eb713c974a60909d6e777eacbcbcb773f6bfa217ae00d0a87d1df17ab982c8f725be17d4e5932f723c2afa11a83a58dbc1c048b77380a1b5acfbe8
7
+ data.tar.gz: 15ac135cf790bd8eb3bd8cb5f8bdda2c2930be1b62c9d880eb9e770bdc1ed0d835f6dcbf0f67cdd3ef78bea0c422e3cd50bc5a1bf58786c872b0265061d15ac4
@@ -55,7 +55,11 @@ class Marty::PromiseView < Netzke::Tree::Base
55
55
  config.root_visible = false
56
56
  config.paging = :none
57
57
  config.bbar = bbar
58
-
58
+ config.read_only = true
59
+ config.permissions = { update: false,
60
+ create: false,
61
+ delete: false,
62
+ }
59
63
  # garbage collect old promises (hacky to do this here)
60
64
  Marty::Promise.cleanup(false)
61
65
  end
@@ -17,29 +17,41 @@ class Marty::Event < Marty::Base
17
17
  self.comment = self.comment.truncate(255) if self.comment
18
18
  end
19
19
 
20
- BASE_QUERY = "SELECT ev.id,
21
- ev.klass,
22
- ev.subject_id,
23
- ev.enum_event_operation,
24
- ev.comment,
25
- coalesce(pr.start_dt, ev.start_dt) start_dt,
26
- coalesce(pr.end_dt, ev.end_dt) end_dt,
27
- expire_secs
28
- FROM marty_events ev
29
- LEFT JOIN marty_promises pr ON ev.promise_id = pr.id "
30
-
20
+ UPDATE_SQL =<<SQL
21
+ UPDATE marty_events as me
22
+ SET start_dt = p.start_dt,
23
+ end_dt = p.end_dt
24
+ FROM marty_promises p
25
+ WHERE me.promise_id = p.id
26
+ AND ( ( p.start_dt IS NOT NULL
27
+ AND me.start_dt IS NULL
28
+ )
29
+ OR ( p.end_dt IS NOT NULL
30
+ AND me.end_dt IS NULL
31
+ )
32
+ )
33
+ SQL
34
+ BASE_QUERY =<<SQL
35
+ SELECT id,
36
+ klass,
37
+ subject_id,
38
+ enum_event_operation,
39
+ comment,
40
+ start_dt,
41
+ end_dt,
42
+ expire_secs,
43
+ error
44
+ FROM marty_events
45
+ SQL
31
46
  def self.running_query(time_now_s)
32
- "SELECT * FROM
33
- (#{BASE_QUERY}
34
- WHERE coalesce(pr.start_dt, ev.start_dt, '1900-1-1') >=
35
- '#{time_now_s}'::timestamp - interval '24 hours') sub
36
- WHERE (end_dt IS NULL or end_dt > '#{time_now_s}'::timestamp)
47
+ "#{BASE_QUERY}
48
+ WHERE start_dt >= '#{time_now_s}'::timestamp - interval '24 hours'
49
+ AND (end_dt IS NULL or end_dt > '#{time_now_s}'::timestamp)
37
50
  AND (expire_secs IS NULL
38
51
  OR expire_secs > EXTRACT (EPOCH FROM '#{time_now_s}'::timestamp - start_dt))
39
52
  ORDER BY start_dt"
40
53
  end
41
54
 
42
-
43
55
  def self.op_is_running?(klass, subject_id, operation)
44
56
  all_running.detect do |pm|
45
57
  pm["klass"] == klass && pm["subject_id"].to_i == subject_id.to_i &&
@@ -76,16 +88,17 @@ class Marty::Event < Marty::Base
76
88
  end
77
89
 
78
90
  def self.lookup_event(klass, subject_id, operation)
79
- get_data(BASE_QUERY +
80
- " WHERE klass = '#{klass}'
81
- AND subject_id = #{subject_id}
82
- and enum_event_operation = '#{operation}'")
91
+ get_data("#{BASE_QUERY}
92
+ WHERE klass = '#{klass}'
93
+ AND subject_id = #{subject_id}
94
+ AND enum_event_operation = '#{operation}'")
83
95
 
84
96
  #For now we return a bare hash
85
97
  #Marty::Event.find_by_id(hash["id"])
86
98
  end
87
99
 
88
- def self.finish_event(klass, subject_id, operation, comment=nil)
100
+ def self.finish_event(klass, subject_id, operation, error=false, comment=nil)
101
+ raise "error must be true or false" unless [true, false].include?(error)
89
102
  time_now_s = Time.zone.now.strftime('%Y-%m-%d %H:%M:%S.%6N')
90
103
 
91
104
  event = get_data(running_query(time_now_s)).detect do |ev|
@@ -98,6 +111,7 @@ class Marty::Event < Marty::Base
98
111
  ev = Marty::Event.find_by_id(event["id"])
99
112
  raise "can't explicitly finish a promise event" if ev.promise_id
100
113
  ev.end_dt = Time.zone.now
114
+ ev.error = error
101
115
  ev.comment = comment if comment
102
116
  ev.save!
103
117
  end
@@ -112,10 +126,11 @@ class Marty::Event < Marty::Base
112
126
 
113
127
  op_sql = "AND enum_event_operation = '#{operation}'" if operation
114
128
 
115
- get_data("SELECT * FROM (#{BASE_QUERY}) sub
129
+ get_data("#{BASE_QUERY}
116
130
  WHERE klass = '#{klass}'
117
- AND subject_id = #{subject_id} #{op_sql}
118
- ORDER BY end_dt desc").first
131
+ AND subject_id = #{subject_id} #{op_sql}
132
+ AND end_dt IS NOT NULL
133
+ ORDER BY end_dt desc").first
119
134
  end
120
135
 
121
136
  def self.currently_running(klass, subject_id)
@@ -142,6 +157,10 @@ class Marty::Event < Marty::Base
142
157
  hash['end_dt'] ? hash['end_dt'].strftime("%H:%M") : '---'
143
158
  end
144
159
 
160
+ def self.update_start_and_end
161
+ ActiveRecord::Base.connection.execute(UPDATE_SQL)
162
+ end
163
+
145
164
  def self.get_data(sql)
146
165
  ActiveRecord::Base.connection.execute(sql).to_a.map do |h|
147
166
  h["id"] = h["id"].to_i
@@ -150,6 +169,7 @@ class Marty::Event < Marty::Base
150
169
  h["end_dt"] = Time.zone.parse(h["end_dt"]) if h["end_dt"]
151
170
  h["expire_secs"] = h["expire_secs"].to_i if h["expire_secs"]
152
171
  h["comment"] = h["comment"]
172
+ h["error"] = h["error"]
153
173
  h
154
174
  end
155
175
  end
@@ -166,6 +186,7 @@ class Marty::Event < Marty::Base
166
186
  time_now_i = time_now.to_i
167
187
  time_now_s = time_now.strftime('%Y-%m-%d %H:%M:%S.%6N')
168
188
  if time_now_i - @all_running[:timestamp] > @poll_secs
189
+ update_start_and_end
169
190
  @all_running[:data] = get_data(running_query(time_now_s))
170
191
  @all_running[:timestamp] = time_now_i
171
192
  end
@@ -184,6 +205,7 @@ class Marty::Event < Marty::Base
184
205
  strftime('%Y-%m-%d %H:%M:%S.%6N')
185
206
 
186
207
  if time_now_i - @all_finished[:timestamp] > @poll_secs
208
+ update_start_and_end
187
209
  raw = get_data(
188
210
  "SELECT * FROM
189
211
  (SELECT ROW_NUMBER() OVER (PARTITION BY klass,
@@ -197,6 +219,14 @@ class Marty::Event < Marty::Base
197
219
  )
198
220
  @all_finished[:timestamp] = time_now_i
199
221
  raw.each_with_object(@all_finished[:data]) do |ev, hash|
222
+ if ev["end_dt"] && ev["error"].nil?
223
+ real_ev = Marty::Event.where(id: ev["id"]).first
224
+ promise = Marty::Promise.where(id: real_ev["promise_id"]).first
225
+ maybe_error = promise.result["error"]
226
+ ev["error"] = real_ev.error = !!maybe_error
227
+ real_ev.comment = maybe_error
228
+ real_ev.save!
229
+ end
200
230
  subhash = hash[[ev["klass"], ev["subject_id"]]] ||= {}
201
231
  subhash[ev["enum_event_operation"]] =
202
232
  ev["end_dt"].strftime("%Y-%m-%d %H:%M:%S")
@@ -0,0 +1,6 @@
1
+ class AddCompletionStatusToEvent < ActiveRecord::Migration
2
+ def change
3
+ add_column :marty_events, :error, :boolean, null: true
4
+ execute "update marty_events set error = 'f'"
5
+ end
6
+ end
data/lib/marty/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Marty
2
- VERSION = "1.0.15"
2
+ VERSION = "1.0.17"
3
3
  end
data/spec/job_helper.rb CHANGED
@@ -95,6 +95,13 @@ SLEEPER:
95
95
  a = Gemini::Helper.sleep(secs) && secs
96
96
  EOS
97
97
 
98
+ NAME_J = "PromiseJ"
99
+ SCRIPT_J = <<EOS
100
+ FAILER:
101
+ dummy =? nil
102
+ a = ERR('I had an error')
103
+ EOS
104
+
98
105
  def promise_bodies
99
106
  {
100
107
  NAME_A => SCRIPT_A,
@@ -106,5 +113,6 @@ def promise_bodies
106
113
  NAME_G => SCRIPT_G,
107
114
  NAME_H => SCRIPT_H,
108
115
  NAME_I => SCRIPT_I,
116
+ NAME_J => SCRIPT_J,
109
117
  }
110
118
  end
@@ -23,22 +23,26 @@ describe Marty::Event do
23
23
  @old_start = '1970-01-01 08:00:00'
24
24
  @old_end = '1970-01-01 09:00:00'
25
25
  # add events
26
- [['testcl1', 123, @time, nil, nil, 'AVM', 'a comment'],
27
- ['testcl1', 123, @time + 2.second, nil,nil, 'CRA', 'b comment'],
28
- ['testcl1', 123, @time + 4.seconds, nil,10000, 'PRICING', 'c comment'],
29
- ['testcl2', 123, @time, nil, 2, 'AVM', 'e comment'],
30
- ['testcl2', 123, @time + 1.second, nil, 4, 'CRA', 'f comment'],
26
+ [['testcl1', 123, @time, nil, nil, 'AVM', 'a comment',
27
+ nil],
28
+ ['testcl1', 123, @time + 2.second, nil,nil, 'CRA', 'b comment',
29
+ nil],
30
+ ['testcl1', 123, @time + 4.seconds, nil,10000, 'PRICING', 'c comment',
31
+ nil],
32
+ ['testcl2', 123, @time, nil, 2, 'AVM', 'e comment', nil],
33
+ ['testcl2', 123, @time + 1.second, nil, 4, 'CRA', 'f comment', nil],
31
34
  ['testcl2', 123, Time.zone.parse(@old_start),
32
- Time.zone.parse(@old_end), nil, 'PRICING', 'old event'],
35
+ Time.zone.parse(@old_end), nil, 'PRICING', 'old event', 0],
33
36
  ].each do
34
- |klass, subjid, startdt, enddt, expire, op, comment|
37
+ |klass, subjid, startdt, enddt, expire, op, comment, error|
35
38
  Marty::Event.create!(klass: klass,
36
39
  subject_id: subjid,
37
40
  start_dt: startdt,
38
41
  end_dt: enddt,
39
42
  expire_secs: expire,
40
43
  comment: comment,
41
- enum_event_operation: op)
44
+ enum_event_operation: op,
45
+ error: error)
42
46
  end
43
47
 
44
48
 
@@ -48,6 +52,12 @@ describe Marty::Event do
48
52
  id: 987,
49
53
  operation: 'PRICING'})
50
54
  res.force
55
+ engine = Marty::ScriptSet.new.get_engine(NAME_J)
56
+ res = engine.background_eval("FAILER", {"dummy" => "dummy"}, ["a"],
57
+ {klass: "testcl3",
58
+ id: 654,
59
+ operation: 'PRICING'})
60
+ res.force rescue nil
51
61
  sleep 5
52
62
  save_clean_db(@save_file)
53
63
  end
@@ -69,7 +79,6 @@ describe Marty::Event do
69
79
  ['AVM', 'CRA', 'PRICING'])
70
80
  expect(Marty::Event.currently_running('testcl2', 123)).to eq([])
71
81
  expect(Marty::Event.currently_running('testcl3', 987)).to eq([])
72
-
73
82
  expect(Marty::Event.last_event('testcl1', 123)).to include(
74
83
  {"klass"=>"testcl1",
75
84
  "subject_id"=>123,
@@ -78,9 +87,8 @@ describe Marty::Event do
78
87
  expect(Marty::Event.last_event('testcl2', 123)).to include(
79
88
  {"klass"=>"testcl2",
80
89
  "subject_id"=>123,
81
- "enum_event_operation"=>"CRA",
82
- "comment"=>"f comment",
83
- "expire_secs"=>4})
90
+ "enum_event_operation"=>"PRICING",
91
+ "comment"=>"old event"})
84
92
  expect(Marty::Event.last_event('testcl3', 987)).to include(
85
93
  {"klass"=>"testcl3",
86
94
  "subject_id"=>987,
@@ -112,9 +120,29 @@ describe Marty::Event do
112
120
  end
113
121
 
114
122
  it "misc API tests" do
115
-
123
+ ev1 = Marty::Event.where(klass: 'testcl3', subject_id: 987).first
124
+ ev2 = Marty::Event.where(klass: 'testcl3', subject_id: 654).first
116
125
  af = Marty::Event.all_finished
117
- expect(af.count).to eq(2)
126
+ ev3 = Marty::Event.where(klass: 'testcl3', subject_id: 987).first
127
+ ev4 = Marty::Event.where(klass: 'testcl3', subject_id: 654).first
128
+
129
+ # ev1/ev2 should have null start/end
130
+ # ev3/ev4 should have start/end populated from promise and error status
131
+ expect(ev1.start_dt).to be_nil
132
+ expect(ev1.end_dt).to be_nil
133
+ expect(ev1.error).to be_falsey
134
+ expect(ev2.start_dt).to be_nil
135
+ expect(ev2.end_dt).to be_nil
136
+ expect(ev2.error).to be_falsey
137
+
138
+ expect(ev3.start_dt).not_to be_nil
139
+ expect(ev3.end_dt).not_to be_nil
140
+ expect(ev3.error).to be_falsey
141
+ expect(ev4.start_dt).not_to be_nil
142
+ expect(ev4.end_dt).not_to be_nil
143
+ expect(ev4.error).to be_truthy
144
+
145
+ expect(af.count).to eq(3)
118
146
  expect(af).to include(['testcl3', 987])
119
147
  expect(af).to include(['testcl2', 123])
120
148
  expect(af[['testcl3', 987]]).to include('PRICING')
@@ -125,7 +153,7 @@ describe Marty::Event do
125
153
  expect(Marty::Event.currently_running('testcl1', 123)).to eq(
126
154
  ['AVM', 'CRA', 'PRICING'])
127
155
  expect(Marty::Event.op_is_running?('testcl1', 123, 'AVM')).to be_truthy
128
- Marty::Event.finish_event('testcl1', 123, 'AVM', 'wassup')
156
+ Marty::Event.finish_event('testcl1', 123, 'AVM', false, 'wassup')
129
157
  Marty::Event.clear_cache
130
158
  expect(Marty::Event.currently_running('testcl1', 123)).to eq(
131
159
  ['CRA', 'PRICING'])
@@ -138,7 +166,8 @@ describe Marty::Event do
138
166
  "subject_id"=>123,
139
167
  "enum_event_operation"=>"AVM",
140
168
  "comment"=>"wassup",
141
- "expire_secs"=>nil})
169
+ "expire_secs"=>nil,
170
+ "error"=>'f'})
142
171
  Marty::Event.update_comment(ev.first, "updated")
143
172
  ev = Marty::Event.lookup_event('testcl1', 123, 'AVM')
144
173
  expect(ev.first).to include({"comment"=>"updated"})
@@ -148,11 +177,10 @@ describe Marty::Event do
148
177
  expect(Marty::Event.pretty_op(ev)).to eq('Pricing')
149
178
 
150
179
  af = Marty::Event.all_finished
151
- expect(af.count).to eq(3)
180
+ expect(af.count).to eq(4)
152
181
  expect(af[['testcl3', 987]]).to include('PRICING')
153
182
  expect(af[['testcl1', 123]]).to include('AVM')
154
183
  expect(af[['testcl1', 123]]['AVM']).to start_with(@date_string)
155
-
156
184
  end
157
185
 
158
186
  it "raises on error" do
@@ -164,20 +192,24 @@ describe Marty::Event do
164
192
  to raise_error(%r!AVM is already running for testcl/1234!)
165
193
  expect {Marty::Event.create_event('testcl', 2345, 'AVM', Time.zone.now, 600,
166
194
  "the comment") }.not_to raise_error
167
- expect {Marty::Event.finish_event('testcl', 1234, 'AVM', "new comment") }.
195
+ expect {Marty::Event.finish_event('testcl', 1234, 'AVM', false,
196
+ "new comment") }.
168
197
  not_to raise_error
169
- expect {Marty::Event.finish_event('testcl', 1234, 'AVM', "new comment") }.
198
+ expect {Marty::Event.finish_event('testcl', 1234, 'AVM', false,
199
+ "new comment") }.
170
200
  to raise_error(%r!event testcl/1234/AVM not found!)
171
- expect {Marty::Event.finish_event('testcl', 2345, 'AVM', 'foobar') }.
201
+ expect {Marty::Event.finish_event('testcl', 2345, 'AVM', false, 'foobar') }.
172
202
  not_to raise_error
173
- expect {Marty::Event.finish_event('testcl', 2345, 'AVM', 'foobar') }.
203
+ expect {Marty::Event.finish_event('testcl', 2345, 'AVM', false, 'foobar') }.
174
204
  to raise_error(%r!event testcl/2345/AVM not found!)
205
+ expect {Marty::Event.finish_event('testcl', 2345, 'AVM', nil, 'foobar') }.
206
+ to raise_error(/error must be true or false/)
175
207
  expect {Marty::Event.create_event('testcl', 1234, 'AMV', Time.zone.now, 600,
176
208
  "the comment") }.
177
209
  to raise_error(%r!PG::.*invalid input value for enum.*"AMV"!)
178
210
  Marty::Event.clear_cache
179
211
  af = Marty::Event.all_finished
180
- expect(af.count).to eq(4)
212
+ expect(af.count).to eq(5)
181
213
  expect(af).to include(['testcl', 1234])
182
214
  expect(af).to include(['testcl', 2345])
183
215
  expect(af[['testcl', 1234]]).to include('AVM')
@@ -200,7 +232,7 @@ describe Marty::Event do
200
232
 
201
233
  Marty::Event.create_event('testcl', 789, 'AVM', Time.zone.now, 600,
202
234
  "comment")
203
- Marty::Event.finish_event('testcl', 789, 'AVM', long_comment)
235
+ Marty::Event.finish_event('testcl', 789, 'AVM', false, long_comment)
204
236
 
205
237
  e1 = Marty::Event.lookup_event('testcl', 123, 'PRICING').first
206
238
  e2 = Marty::Event.lookup_event('testcl', 456, 'CRA').first
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.0.15
4
+ version: 1.0.17
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: 2016-11-29 00:00:00.000000000 Z
17
+ date: 2016-12-29 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: pg
@@ -436,6 +436,7 @@ files:
436
436
  - db/migrate/106_make_grid_indexes_nullable.rb
437
437
  - db/migrate/200_create_marty_event_operation_enum.rb
438
438
  - db/migrate/201_create_marty_events.rb
439
+ - db/migrate/202_add_completion_status_to_event.rb
439
440
  - db/seeds.rb
440
441
  - gemini_deprecations.md
441
442
  - lib/marty.rb