marty 4.0.0.rc2 → 5.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +7 -0
- data/.rubocop.yml +1 -0
- data/.rubocop_todo.yml +3 -16
- data/.ssh-docker/.keep +0 -0
- data/Dockerfile.dummy +3 -0
- data/Gemfile +19 -15
- data/app/components/marty/base_rule_view.rb +104 -10
- data/app/components/marty/base_rule_view/client/base_rule_view.js +24 -0
- data/app/components/marty/data_grid_user_view.rb +39 -0
- data/app/components/marty/data_grid_view.rb +68 -18
- data/app/components/marty/extras/layout.rb +1 -1
- data/app/components/marty/grid.rb +1 -1
- data/app/components/marty/grid/client/grid.js +29 -13
- data/app/components/marty/import_view.rb +3 -3
- data/app/components/marty/main_auth_app.rb +11 -1
- data/app/components/marty/report_form.rb +6 -6
- data/app/components/marty/script_form.rb +5 -5
- data/app/components/marty/script_tester.rb +2 -2
- data/app/components/marty/user_view.rb +3 -9
- data/app/models/marty/base_rule.rb +92 -32
- data/app/models/marty/data_grid.rb +92 -22
- data/app/models/marty/event.rb +2 -2
- data/app/models/marty/promise.rb +4 -4
- data/app/models/marty/role_type.rb +14 -1
- data/app/services/marty/data_grid_view/save_grid.rb +2 -2
- data/app/services/marty/promises/delorean/create.rb +2 -2
- data/app/services/marty/promises/ruby/create.rb +2 -2
- data/config/locales/en.yml +11 -2
- data/db/migrate/108_add_data_grid_perms.rb +16 -0
- data/db/migrate/508_add_not_to_data_grids_tables.rb +18 -0
- data/db/migrate/509_update_dg_plpgsql_v1_fns.rb +13 -0
- data/db/sql/query_grid_dir_v1.sql +16 -2
- data/docker-compose.dummy.yml +1 -0
- data/lib/marty/content_handler.rb +2 -2
- data/lib/marty/data_change.rb +1 -1
- data/lib/marty/data_conversion.rb +3 -4
- data/lib/marty/data_importer.rb +4 -4
- data/lib/marty/mcfly_model.rb +7 -10
- data/lib/marty/migrations.rb +1 -1
- data/lib/marty/monkey.rb +2 -2
- data/lib/marty/promise_job.rb +5 -5
- data/lib/marty/promise_proxy.rb +2 -2
- data/lib/marty/promise_ruby_job.rb +4 -4
- data/lib/marty/version.rb +1 -1
- data/make-app.mk +1 -1
- data/marty.gemspec +13 -18
- data/other/marty/diagnostic/aws/ec2_instance.rb +17 -2
- data/other/marty/diagnostic/aws/error.rb +8 -0
- data/other/marty/diagnostic/database.rb +2 -2
- data/other/marty/diagnostic/delayed_job_version.rb +0 -1
- data/spec/dummy/app/components/gemini/my_rule_view.rb +32 -6
- data/spec/dummy/app/models/gemini/fannie_bup.rb +13 -20
- data/spec/dummy/app/models/gemini/my_rule.rb +4 -0
- data/spec/dummy/app/models/gemini/xyz_rule.rb +3 -1
- data/spec/dummy/config/application.rb +1 -0
- data/spec/dummy/config/initializers/secret_token.rb +1 -1
- data/spec/dummy/db/migrate/20190702115241_add_simple_guards_options_to_rules.rb +37 -0
- data/spec/features/data_grid_spec.rb +109 -47
- data/spec/features/reporting_spec.rb +4 -4
- data/spec/features/rule_spec.rb +62 -31
- data/spec/features/scripting_spec.rb +3 -3
- data/spec/features/user_view_spec.rb +17 -8
- data/spec/fixtures/csv/rule/MyRule.csv +4 -1
- data/spec/lib/data_importer_spec.rb +8 -8
- data/spec/lib/mcfly_model_spec.rb +6 -6
- data/spec/models/data_grid_spec.rb +139 -7
- data/spec/models/rule_spec.rb +116 -9
- data/spec/spec_helper.rb +2 -2
- data/spec/support/netzke.rb +4 -3
- metadata +55 -54
- data/Gemfile.lock +0 -289
data/app/models/marty/event.rb
CHANGED
@@ -311,7 +311,7 @@ SQL
|
|
311
311
|
|
312
312
|
def self.cleanup
|
313
313
|
where('start_dt < ?', Time.zone.now - 48.hours).delete_all
|
314
|
-
rescue StandardError =>
|
315
|
-
Marty::Util.logger.error("event GC error: #{
|
314
|
+
rescue StandardError => e
|
315
|
+
Marty::Util.logger.error("event GC error: #{e}")
|
316
316
|
end
|
317
317
|
end
|
data/app/models/marty/promise.rb
CHANGED
@@ -132,9 +132,9 @@ class Marty::Promise < Marty::Base
|
|
132
132
|
# log "OFF0 #{Process.pid} #{last}"
|
133
133
|
begin
|
134
134
|
work_off_job(job)
|
135
|
-
rescue StandardError =>
|
135
|
+
rescue StandardError => e
|
136
136
|
# log "OFFERR #{exc}"
|
137
|
-
error = exception_to_result(
|
137
|
+
error = exception_to_result(e)
|
138
138
|
last.set_result(error)
|
139
139
|
end
|
140
140
|
# log "OFF1 #{Process.pid} #{last}"
|
@@ -215,8 +215,8 @@ class Marty::Promise < Marty::Base
|
|
215
215
|
'start_dt < ? AND parent_id IS NULL',
|
216
216
|
DateTime.now - (all ? 0.hours : 4.hours)
|
217
217
|
).destroy_all
|
218
|
-
rescue StandardError =>
|
219
|
-
Marty::Util.logger.error("promise GC error: #{
|
218
|
+
rescue StandardError => e
|
219
|
+
Marty::Util.logger.error("promise GC error: #{e}")
|
220
220
|
end
|
221
221
|
|
222
222
|
def exception_to_result(promise:, exception:)
|
@@ -5,6 +5,19 @@ class Marty::RoleType < Marty::Base
|
|
5
5
|
'admin',
|
6
6
|
'user_manager',
|
7
7
|
'dev',
|
8
|
-
'viewer'
|
8
|
+
'viewer',
|
9
|
+
'data_grid_editor'
|
9
10
|
]
|
11
|
+
|
12
|
+
def self.from_nice_names(roles)
|
13
|
+
Marty::RoleType.get_all.select do |role|
|
14
|
+
roles.include?(I18n.t("roles.#{role}", default: role))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.to_nice_names(roles)
|
19
|
+
roles.map do |role|
|
20
|
+
I18n.t("roles.#{role}", default: role)
|
21
|
+
end
|
22
|
+
end
|
10
23
|
end
|
@@ -15,8 +15,9 @@ module Marty
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.call(params)
|
18
|
-
user_perm = Marty::DataGridView.get_edit_save_permission
|
19
18
|
rec_id = params['record_id']
|
19
|
+
dg = Marty::DataGrid.mcfly_pt('infinity').find_by(group_id: rec_id)
|
20
|
+
user_perm = Marty::DataGridView.get_edit_permission(dg.permissions)
|
20
21
|
data = params['data']
|
21
22
|
raise GridError.new('entered with view permissions', data, rec_id) if
|
22
23
|
user_perm == 'view'
|
@@ -24,7 +25,6 @@ module Marty
|
|
24
25
|
data_as_array = data.map do |row|
|
25
26
|
row.keys.map { |key| row[key] }
|
26
27
|
end
|
27
|
-
dg = Marty::DataGrid.mcfly_pt('infinity').find_by(group_id: rec_id)
|
28
28
|
vcnt = dg.metadata.select { |md| md['dir'] == 'v' }.count
|
29
29
|
hcnt = dg.metadata.select { |md| md['dir'] == 'h' }.count
|
30
30
|
cur_data_dim = [dg.data.length, dg.data[0].length]
|
@@ -31,9 +31,9 @@ module Marty
|
|
31
31
|
)
|
32
32
|
|
33
33
|
job = Delayed::Job.enqueue(promise_job)
|
34
|
-
rescue StandardError =>
|
34
|
+
rescue StandardError => e
|
35
35
|
# log "CALLERR #{exc}"
|
36
|
-
res = ::Delorean::Engine.grok_runtime_exception(
|
36
|
+
res = ::Delorean::Engine.grok_runtime_exception(e)
|
37
37
|
promise.set_start
|
38
38
|
promise.set_result(res)
|
39
39
|
# log "CALLERRSET #{res}"
|
data/config/locales/en.yml
CHANGED
@@ -18,8 +18,10 @@ en:
|
|
18
18
|
create_posting: Create
|
19
19
|
api_auth: API Authorization
|
20
20
|
event_view: Event View
|
21
|
-
data_grid_view: Data Grids
|
22
|
-
data_grid: Data Grids
|
21
|
+
data_grid_view: Data Grids Admin
|
22
|
+
data_grid: Data Grids Admin
|
23
|
+
data_grid_user: Data Grids
|
24
|
+
data_grid_user_view: Data Grids
|
23
25
|
|
24
26
|
data_import_view:
|
25
27
|
import: Import
|
@@ -30,6 +32,7 @@ en:
|
|
30
32
|
admin: Admin
|
31
33
|
dev: Developer
|
32
34
|
user_manager: User Manager
|
35
|
+
data_grid_editor: Data Grid Editor
|
33
36
|
|
34
37
|
posting_types:
|
35
38
|
BASE: BASE
|
@@ -176,3 +179,9 @@ en:
|
|
176
179
|
grid:
|
177
180
|
base:
|
178
181
|
view_record: "%{model} (Read-only)"
|
182
|
+
|
183
|
+
data_grid_view_perms:
|
184
|
+
perm_view: Can View
|
185
|
+
perm_edit_data: Can Edit Data
|
186
|
+
perm_edit_all: Can Edit All
|
187
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class AddDataGridPerms < ActiveRecord::Migration[4.2]
|
2
|
+
def self.up
|
3
|
+
default = {
|
4
|
+
view: [],
|
5
|
+
edit_data: [],
|
6
|
+
edit_all: []
|
7
|
+
}
|
8
|
+
table = :marty_data_grids
|
9
|
+
add_column table, :permissions, :jsonb, null: false, default: default
|
10
|
+
add_index table, "(permissions->'view')", using: "GIN",
|
11
|
+
name: :marty_data_grids_perm_idx
|
12
|
+
end
|
13
|
+
def self.down
|
14
|
+
remove_column :marty_data_grids, :permissions
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class AddNotToDataGridsTables < ActiveRecord::Migration[5.1]
|
2
|
+
include Marty::Migrations
|
3
|
+
|
4
|
+
TABLES = {
|
5
|
+
marty_grid_index_booleans: :btree,
|
6
|
+
marty_grid_index_int4ranges: :gist,
|
7
|
+
marty_grid_index_integers: :gin,
|
8
|
+
marty_grid_index_numranges: :gist,
|
9
|
+
marty_grid_index_strings: :gin
|
10
|
+
}
|
11
|
+
|
12
|
+
def change
|
13
|
+
TABLES.each do |table, index_type|
|
14
|
+
add_column table, :not, :boolean, null: false, default: false
|
15
|
+
add_index table, [:not, :key]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class UpdateDgPlpgsqlV1Fns < ActiveRecord::Migration[4.2]
|
2
|
+
def up
|
3
|
+
marty_path = Gem.loaded_specs["marty"].full_gem_path
|
4
|
+
Dir.glob("#{marty_path}/db/sql/*_v1.sql") do |f|
|
5
|
+
connection.execute(File.read(f))
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def down
|
10
|
+
# Load functions once again
|
11
|
+
up
|
12
|
+
end
|
13
|
+
end
|
@@ -24,11 +24,17 @@ DECLARE
|
|
24
24
|
sql_scripts_arr_intersect text;
|
25
25
|
sql_filter text;
|
26
26
|
|
27
|
+
includes_nots boolean;
|
28
|
+
|
27
29
|
BEGIN
|
28
30
|
FOR i IN 1 .. COALESCE(array_upper(infos, 1), 0)
|
29
31
|
LOOP
|
30
32
|
attr_type := infos[i] ->> 'type';
|
31
33
|
attr_name := infos[i] ->> 'attr';
|
34
|
+
|
35
|
+
-- Use not condition only if given type indexes has rows with 'not' = true
|
36
|
+
includes_nots = COALESCE(infos[i] -> 'nots', '[]'::JSONB) @> 'true';
|
37
|
+
|
32
38
|
attr_value := h ->> attr_name;
|
33
39
|
h_key_exists := h ? attr_name;
|
34
40
|
|
@@ -50,7 +56,7 @@ BEGIN
|
|
50
56
|
END CASE;
|
51
57
|
|
52
58
|
sql_script = 'SELECT DISTINCT index from ' || table_name ||
|
53
|
-
-- Convertion to FLOAT is
|
59
|
+
-- Convertion to FLOAT is needed to make numbers like 2005.0 work
|
54
60
|
' WHERE data_grid_id = ($1 ->> ' || sqlidx || ')::FLOAT::INTEGER' ||
|
55
61
|
' AND created_dt = ($1 ->> ' || (sqlidx + 1) || ')::TIMESTAMP' ||
|
56
62
|
' AND attr = $1 ->> ' || (sqlidx + 2) || ' ';
|
@@ -83,7 +89,15 @@ BEGIN
|
|
83
89
|
args := args || attr_value;
|
84
90
|
END IF;
|
85
91
|
|
86
|
-
|
92
|
+
|
93
|
+
-- Use not condition only if given type indexes has rows with 'not' = true
|
94
|
+
IF includes_nots THEN
|
95
|
+
sql_script := sql_script || ' AND CASE WHEN ' || table_name ||'.not '
|
96
|
+
'THEN NOT (' || sql_filter || 'key IS NULL) '
|
97
|
+
'ELSE (' || sql_filter || 'key IS NULL) END';
|
98
|
+
ELSE
|
99
|
+
sql_script := sql_script || ' AND (' || sql_filter || 'key is NULL) ';
|
100
|
+
END IF;
|
87
101
|
|
88
102
|
sql_scripts_arr := sql_scripts_arr || sql_script;
|
89
103
|
END LOOP;
|
data/docker-compose.dummy.yml
CHANGED
@@ -34,9 +34,9 @@ module Marty::ContentHandler
|
|
34
34
|
else
|
35
35
|
res, format = { error: "Unknown format: #{format}" }.to_json, 'json'
|
36
36
|
end
|
37
|
-
rescue StandardError =>
|
37
|
+
rescue StandardError => e
|
38
38
|
res, format =
|
39
|
-
{ error: "Failed conversion #{format}: #{
|
39
|
+
{ error: "Failed conversion #{format}: #{e}" }.to_json, 'json'
|
40
40
|
end
|
41
41
|
|
42
42
|
type, disposition = GEN_FORMATS[format]
|
data/lib/marty/data_change.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
class Marty::DataConversion
|
2
2
|
EXCEL_START_DATE = Date.parse('1/1/1900') - 2
|
3
3
|
|
4
|
-
FLOAT_PAT =
|
4
|
+
FLOAT_PAT = /\A-?\d+(\.?\d+)?([eE][-+]?[0-9]+)?\z/
|
5
5
|
|
6
6
|
PATS = {
|
7
7
|
integer: /^-?\d+(\.0+)?$/,
|
@@ -58,13 +58,13 @@ class Marty::DataConversion
|
|
58
58
|
begin
|
59
59
|
v =~ FLOAT_PAT ? EXCEL_START_DATE + v.to_f :
|
60
60
|
Mcfly.is_infinity(v) ? 'infinity' : v.to_date
|
61
|
-
rescue StandardError =>
|
61
|
+
rescue StandardError => e
|
62
62
|
raise "date conversion failed for #{v.inspect}}"
|
63
63
|
end
|
64
64
|
when :datetime
|
65
65
|
begin
|
66
66
|
Mcfly.is_infinity(v) ? 'infinity' : v.to_datetime
|
67
|
-
rescue StandardError =>
|
67
|
+
rescue StandardError => e
|
68
68
|
raise "datetime conversion failed for #{v.inspect}}"
|
69
69
|
end
|
70
70
|
when :numrange, :int4range, :int8range
|
@@ -98,7 +98,6 @@ class Marty::DataConversion
|
|
98
98
|
|
99
99
|
@@associations[klass] ||= klass.reflect_on_all_associations.
|
100
100
|
each_with_object({}) do |assoc, h|
|
101
|
-
|
102
101
|
h[assoc.name.to_s] = {
|
103
102
|
assoc_keys: assoc_keys(assoc.klass),
|
104
103
|
assoc_class: assoc.klass,
|
data/lib/marty/data_importer.rb
CHANGED
@@ -77,9 +77,9 @@ module Marty
|
|
77
77
|
|
78
78
|
Marty::DataConversion.create_or_update(klass, row, dt)
|
79
79
|
end
|
80
|
-
rescue StandardError =>
|
80
|
+
rescue StandardError => e
|
81
81
|
# to find problems with the importer, comment out the rescue block
|
82
|
-
raise Error.new(
|
82
|
+
raise Error.new(e.to_s, [eline])
|
83
83
|
end
|
84
84
|
|
85
85
|
ids = {}
|
@@ -96,8 +96,8 @@ module Marty
|
|
96
96
|
# Validate affected rows if necessary
|
97
97
|
klass.send(validation_function.to_sym, ids.keys) if
|
98
98
|
validation_function
|
99
|
-
rescue StandardError =>
|
100
|
-
raise Error.new(
|
99
|
+
rescue StandardError => e
|
100
|
+
raise Error.new(e.to_s, [])
|
101
101
|
end
|
102
102
|
|
103
103
|
remainder_ids = cleaner_ids - ids.keys
|
data/lib/marty/mcfly_model.rb
CHANGED
@@ -6,10 +6,8 @@ module Mcfly::Model
|
|
6
6
|
end
|
7
7
|
|
8
8
|
module ClassMethods
|
9
|
-
def hash_if_necessary(q,
|
10
|
-
|
11
|
-
|
12
|
-
q
|
9
|
+
def hash_if_necessary(q, private)
|
10
|
+
!private && q.is_a?(ActiveRecord::Base) ? make_openstruct(q) : q
|
13
11
|
end
|
14
12
|
|
15
13
|
def base_mcfly_lookup(name, options = {}, &block)
|
@@ -43,7 +41,7 @@ module Mcfly::Model
|
|
43
41
|
|
44
42
|
q = q.first if q.respond_to?(:first) && options[:mode] == :first
|
45
43
|
|
46
|
-
hash_if_necessary(q, options
|
44
|
+
hash_if_necessary(q, options[:private])
|
47
45
|
end
|
48
46
|
end
|
49
47
|
|
@@ -57,7 +55,7 @@ module Mcfly::Model
|
|
57
55
|
|
58
56
|
def gen_mcfly_lookup(name, attrs, options = {})
|
59
57
|
raise "bad options #{options.keys}" unless
|
60
|
-
|
58
|
+
(options.keys - [:mode, :cache, :private]).empty?
|
61
59
|
|
62
60
|
mode = options.fetch(:mode, :first)
|
63
61
|
|
@@ -88,7 +86,6 @@ module Mcfly::Model
|
|
88
86
|
|
89
87
|
base_mcfly_lookup(name, options + { sig: attrs.length + 1,
|
90
88
|
mode: mode }) do |_t, *attr_list|
|
91
|
-
|
92
89
|
attr_list_ids = attr_list.each_with_index.map do |_x, i|
|
93
90
|
assoc.member?(attrs[i]) ?
|
94
91
|
(attr_list[i] && attr_list[i].id) : attr_list[i]
|
@@ -137,7 +134,7 @@ module Mcfly::Model
|
|
137
134
|
|
138
135
|
pc_name = "pc_#{name}".to_sym
|
139
136
|
|
140
|
-
gen_mcfly_lookup(pc_name, pc_attrs, options + { private: true
|
137
|
+
gen_mcfly_lookup(pc_name, pc_attrs, options + { private: true })
|
141
138
|
|
142
139
|
lpi = attrs.keys.index rel_attr
|
143
140
|
|
@@ -145,7 +142,7 @@ module Mcfly::Model
|
|
145
142
|
raise "need #{rel_attr} argument" unless lpi
|
146
143
|
|
147
144
|
# cache if mode is not nil
|
148
|
-
|
145
|
+
priv = options[:private]
|
149
146
|
|
150
147
|
# cache if mode is not explicitly set to nil or cache is true
|
151
148
|
cache = options.fetch(:cache) { options.fetch(:mode, :first) }
|
@@ -168,7 +165,7 @@ module Mcfly::Model
|
|
168
165
|
send(cat_attr_id)
|
169
166
|
|
170
167
|
q = send(pc_name, ts, *args)
|
171
|
-
hash_if_necessary(q,
|
168
|
+
hash_if_necessary(q, priv)
|
172
169
|
end
|
173
170
|
end
|
174
171
|
end
|
data/lib/marty/migrations.rb
CHANGED
data/lib/marty/monkey.rb
CHANGED
@@ -54,8 +54,8 @@ class Delorean::BaseModule::NodeCall
|
|
54
54
|
begin
|
55
55
|
# make sure params is serialzable before starting a Job
|
56
56
|
JSON.dump(params)
|
57
|
-
rescue StandardError =>
|
58
|
-
raise "non-serializable parameters: #{params} #{
|
57
|
+
rescue StandardError => e
|
58
|
+
raise "non-serializable parameters: #{params} #{e}"
|
59
59
|
end
|
60
60
|
|
61
61
|
Marty::Promises::Delorean::Create.call(
|
data/lib/marty/promise_job.rb
CHANGED
@@ -41,9 +41,9 @@ class Marty::PromiseJob < Struct.new(:promise,
|
|
41
41
|
end
|
42
42
|
|
43
43
|
# log "DONE #{Process.pid} #{promise.id} #{Time.now.to_f} #{res}"
|
44
|
-
rescue StandardError =>
|
45
|
-
res = Delorean::Engine.grok_runtime_exception(
|
46
|
-
# log "ERR- #{Process.pid} #{promise.id} #{Time.now.to_f} #{
|
44
|
+
rescue StandardError => e
|
45
|
+
res = Delorean::Engine.grok_runtime_exception(e)
|
46
|
+
# log "ERR- #{Process.pid} #{promise.id} #{Time.now.to_f} #{e}"
|
47
47
|
end
|
48
48
|
promise.set_result(res)
|
49
49
|
process_hook(res)
|
@@ -53,8 +53,8 @@ class Marty::PromiseJob < Struct.new(:promise,
|
|
53
53
|
return unless hook
|
54
54
|
|
55
55
|
hook.run(params: params, result: res)
|
56
|
-
rescue StandardError =>
|
57
|
-
Marty::Util.logger.error "promise hook failed: #{
|
56
|
+
rescue StandardError => e
|
57
|
+
Marty::Util.logger.error "promise hook failed: #{e}"
|
58
58
|
end
|
59
59
|
|
60
60
|
def max_attempts
|
data/lib/marty/promise_proxy.rb
CHANGED
@@ -55,8 +55,8 @@ class Marty::PromiseProxy < BasicObject
|
|
55
55
|
begin
|
56
56
|
@result = @promise.wait_for_result(@timeout)
|
57
57
|
@result = @result[@attr] if @attr && !@result['error']
|
58
|
-
rescue ::Exception =>
|
59
|
-
@result = ::Delorean::Engine.grok_runtime_exception(
|
58
|
+
rescue ::Exception => e
|
59
|
+
@result = ::Delorean::Engine.grok_runtime_exception(e)
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
@@ -25,8 +25,8 @@ class Marty::PromiseRubyJob < Struct.new(:promise,
|
|
25
25
|
|
26
26
|
mod = module_name.constantize
|
27
27
|
res = { 'result' => mod.send(method_name, *method_args) }
|
28
|
-
rescue StandardError =>
|
29
|
-
res = ::Marty::Promise.exception_to_result(promise: promise, exception:
|
28
|
+
rescue StandardError => e
|
29
|
+
res = ::Marty::Promise.exception_to_result(promise: promise, exception: e)
|
30
30
|
end
|
31
31
|
|
32
32
|
promise.set_result(res)
|
@@ -37,8 +37,8 @@ class Marty::PromiseRubyJob < Struct.new(:promise,
|
|
37
37
|
return unless hook
|
38
38
|
|
39
39
|
hook.run(params: method_args, result: res)
|
40
|
-
rescue StandardError =>
|
41
|
-
Marty::Util.logger.error "promise hook failed: #{
|
40
|
+
rescue StandardError => e
|
41
|
+
Marty::Util.logger.error "promise hook failed: #{e}"
|
42
42
|
end
|
43
43
|
|
44
44
|
def max_attempts
|