marty 9.5.1 → 10.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -0
- data/README.md +40 -31
- data/app/components/marty/background_job/schedule_jobs_dashboard.rb +2 -2
- data/app/components/marty/background_job/schedule_jobs_grid.rb +22 -5
- data/app/components/marty/background_job/schedule_jobs_logs.rb +12 -0
- data/app/components/marty/base_rule_view.rb +0 -4
- data/app/components/marty/delorean_rule_view.rb +11 -5
- data/app/components/marty/promise_view.rb +15 -0
- data/app/jobs/marty/cron_job.rb +30 -28
- data/app/jobs/marty/delorean_background_job.rb +8 -0
- data/app/models/marty/background_job/schedule.rb +24 -1
- data/app/models/marty/delorean_rule.rb +1 -1
- data/app/models/marty/vw_promise.rb +6 -4
- data/app/services/marty/background_job/fetch_missing_in_schedule_cron_jobs.rb +8 -6
- data/app/services/marty/background_job/update_schedule.rb +15 -8
- data/app/services/marty/jobs/schedule.rb +8 -4
- data/app/services/marty/promises/delorean/create.rb +2 -1
- data/app/services/marty/promises/ruby/create.rb +2 -1
- data/config/locales/en.yml +1 -0
- data/db/migrate/510_schedule_job_to_remove_old_promises.rb +4 -2
- data/db/migrate/523_add_timeout_to_promises.rb +5 -0
- data/db/migrate/524_add_timeout_to_promise_view.rb +45 -0
- data/db/migrate/525_add_arguments_to_jobs_schedules.rb +10 -0
- data/db/migrate/526_add_schedule_id_to_delayed_jobs.rb +14 -0
- data/lib/marty/delayed_job/queue_adapter.rb +38 -0
- data/lib/marty/delayed_job/scheduled_job_plugin.rb +9 -6
- data/lib/marty/diagnostic/environment_variables.rb +1 -1
- data/lib/marty/monkey.rb +11 -0
- data/lib/marty/promise_job.rb +2 -1
- data/lib/marty/promise_ruby_job.rb +2 -1
- data/lib/marty/version.rb +1 -1
- data/spec/dummy/.foreman +2 -0
- data/spec/dummy/Procfile +2 -0
- data/spec/dummy/app/jobs/test_failing_job.rb +5 -1
- data/spec/dummy/app/models/gemini/my_rule.rb +2 -0
- data/spec/dummy/app/models/gemini/xyz_rule.rb +2 -0
- data/spec/dummy/delorean/jobs.dl +6 -0
- data/spec/features/delayed_jobs_grid_spec.rb +3 -2
- data/spec/features/schedule_jobs_dashboard_spec.rb +12 -12
- data/spec/jobs/cron_job_spec.rb +16 -12
- data/spec/jobs/delorean_background_job_spec.rb +50 -0
- data/spec/models/promise_spec.rb +1 -0
- data/spec/services/background_job/fetch_missing_in_schedule_cron_jobs_spec.rb +5 -3
- data/spec/services/jobs/schedule_spec.rb +5 -4
- metadata +12 -2
@@ -29,11 +29,12 @@ feature 'Delayed Jobs Dashboard', js: true do
|
|
29
29
|
Marty::BackgroundJob::Schedule.create(
|
30
30
|
job_class: klass_name,
|
31
31
|
cron: '0 0 * * *',
|
32
|
-
state: 'on'
|
32
|
+
state: 'on',
|
33
|
+
arguments: []
|
33
34
|
).tap do |job|
|
34
35
|
Marty::BackgroundJob::UpdateSchedule.call(
|
35
36
|
id: job.id,
|
36
|
-
job_class: job.job_class
|
37
|
+
job_class: job.job_class,
|
37
38
|
)
|
38
39
|
end
|
39
40
|
end
|
@@ -28,17 +28,18 @@ feature 'Schedule Jobs Dashboard', js: true do
|
|
28
28
|
Marty::BackgroundJob::Schedule.create(
|
29
29
|
job_class: 'Test2Job',
|
30
30
|
cron: '0 0 * * *',
|
31
|
-
state: 'on'
|
31
|
+
state: 'on',
|
32
|
+
arguments: []
|
32
33
|
).tap do |job|
|
33
34
|
Marty::BackgroundJob::UpdateSchedule.call(
|
34
35
|
id: job.id,
|
35
|
-
job_class: job.job_class
|
36
|
+
job_class: job.job_class,
|
36
37
|
)
|
37
38
|
end
|
38
39
|
end
|
39
40
|
|
40
41
|
before do
|
41
|
-
expect(Test2Job.scheduled?).to be true
|
42
|
+
expect(Test2Job.scheduled?(schedule_id: schedule.id)).to be true
|
42
43
|
|
43
44
|
log_in_as('admin1')
|
44
45
|
wait_for_ajax
|
@@ -52,8 +53,6 @@ feature 'Schedule Jobs Dashboard', js: true do
|
|
52
53
|
end
|
53
54
|
|
54
55
|
it 'creates new schedule' do
|
55
|
-
expect(TestJob.scheduled?).to be false
|
56
|
-
|
57
56
|
press('Add')
|
58
57
|
|
59
58
|
fill_in('Job class', with: 'TestJob')
|
@@ -69,11 +68,12 @@ feature 'Schedule Jobs Dashboard', js: true do
|
|
69
68
|
expect(crons).to include('1 1 * * *')
|
70
69
|
expect(crons).to include('0 0 * * *')
|
71
70
|
|
72
|
-
|
73
|
-
expect(TestJob.
|
71
|
+
new_schedule = Marty::BackgroundJob::Schedule.order(:created_at).last
|
72
|
+
expect(TestJob.scheduled?(schedule_id: new_schedule.id)).to be true
|
73
|
+
expect(new_schedule.delayed_job.cron).to eq '1 1 * * *'
|
74
74
|
|
75
|
-
expect(Test2Job.scheduled?).to be true
|
76
|
-
expect(
|
75
|
+
expect(Test2Job.scheduled?(schedule_id: schedule.id)).to be true
|
76
|
+
expect(schedule.delayed_job.cron).to eq '0 0 * * *'
|
77
77
|
end
|
78
78
|
|
79
79
|
it 'deletes schedule' do
|
@@ -83,7 +83,7 @@ feature 'Schedule Jobs Dashboard', js: true do
|
|
83
83
|
|
84
84
|
wait_for_ajax
|
85
85
|
|
86
|
-
expect(Test2Job.scheduled?).to be false
|
86
|
+
expect(Test2Job.scheduled?(schedule_id: schedule.id)).to be false
|
87
87
|
end
|
88
88
|
|
89
89
|
it 'turns the schedule off' do
|
@@ -93,7 +93,7 @@ feature 'Schedule Jobs Dashboard', js: true do
|
|
93
93
|
|
94
94
|
press 'OK'
|
95
95
|
wait_for_ajax
|
96
|
-
expect(Test2Job.scheduled?).to be false
|
96
|
+
expect(Test2Job.scheduled?(schedule_id: schedule.id)).to be false
|
97
97
|
end
|
98
98
|
|
99
99
|
it 'shows validation errors' do
|
@@ -105,7 +105,7 @@ feature 'Schedule Jobs Dashboard', js: true do
|
|
105
105
|
|
106
106
|
press 'OK'
|
107
107
|
wait_for_ajax
|
108
|
-
expect(page).to have_content('
|
108
|
+
expect(page).to have_content('Arguments are not unique')
|
109
109
|
expect(page).to have_content('Cron is invalid')
|
110
110
|
end
|
111
111
|
end
|
data/spec/jobs/cron_job_spec.rb
CHANGED
@@ -7,20 +7,21 @@ describe 'Cron jobs' do
|
|
7
7
|
Marty::BackgroundJob::Schedule.create!(
|
8
8
|
job_class: klass.name,
|
9
9
|
cron: '* * * * *',
|
10
|
-
state: 'on'
|
10
|
+
state: 'on',
|
11
|
+
arguments: []
|
11
12
|
).tap do |job|
|
12
13
|
Marty::BackgroundJob::UpdateSchedule.call(
|
13
14
|
id: job.id,
|
14
|
-
job_class: job.job_class
|
15
|
+
job_class: job.job_class,
|
15
16
|
)
|
16
17
|
|
17
|
-
dj =
|
18
|
+
dj = job.delayed_job
|
18
19
|
dj.update!(run_at: 1.minute.ago)
|
19
20
|
end
|
20
21
|
end
|
21
22
|
|
22
23
|
def run_job
|
23
|
-
expect(
|
24
|
+
expect(schedule.delayed_job).to be_present
|
24
25
|
expect(Delayed::Job.count).to eq 1
|
25
26
|
worker = Delayed::Worker.new
|
26
27
|
worker.work_off
|
@@ -34,8 +35,8 @@ describe 'Cron jobs' do
|
|
34
35
|
end
|
35
36
|
|
36
37
|
it 'job is recreated' do
|
37
|
-
expect(klass).to
|
38
|
-
expect(
|
38
|
+
expect(klass.scheduled?(schedule_id: schedule.id)).to be true
|
39
|
+
expect(schedule.delayed_job).to be_present
|
39
40
|
end
|
40
41
|
end
|
41
42
|
|
@@ -46,8 +47,8 @@ describe 'Cron jobs' do
|
|
46
47
|
end
|
47
48
|
|
48
49
|
it 'job is not recreated' do
|
49
|
-
expect(klass).
|
50
|
-
expect(
|
50
|
+
expect(klass.scheduled?(schedule_id: schedule.id)).to be false
|
51
|
+
expect(schedule.reload.delayed_job).to_not be_present
|
51
52
|
end
|
52
53
|
end
|
53
54
|
end
|
@@ -59,8 +60,8 @@ describe 'Cron jobs' do
|
|
59
60
|
end
|
60
61
|
|
61
62
|
it 'job is not recreated' do
|
62
|
-
expect(klass).
|
63
|
-
expect(
|
63
|
+
expect(klass.scheduled?(schedule_id: schedule.id)).to be false
|
64
|
+
expect(schedule.reload.delayed_job).to_not be_present
|
64
65
|
end
|
65
66
|
end
|
66
67
|
end
|
@@ -75,7 +76,7 @@ describe 'Cron jobs' do
|
|
75
76
|
log = Marty::BackgroundJob::Log.find_by(job_class: klass.name)
|
76
77
|
expect(log.error).to be_present
|
77
78
|
expect(log.failure?).to be true
|
78
|
-
expect(klass).to
|
79
|
+
expect(klass.scheduled?(schedule_id: schedule.id)).to be true
|
79
80
|
end
|
80
81
|
|
81
82
|
it 'logs success' do
|
@@ -85,7 +86,10 @@ describe 'Cron jobs' do
|
|
85
86
|
log = Marty::BackgroundJob::Log.find_by(job_class: klass.name)
|
86
87
|
expect(log.error).to_not be_present
|
87
88
|
expect(log.success?).to be true
|
88
|
-
expect(klass).to
|
89
|
+
expect(klass.scheduled?(schedule_id: schedule.id)).to be true
|
90
|
+
|
91
|
+
dj = schedule.reload.delayed_job
|
92
|
+
expect(dj.schedule_id).to eq schedule.id
|
89
93
|
end
|
90
94
|
end
|
91
95
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
# Most of the code is tested in cron_job_spec.rb
|
4
|
+
describe 'Delorean Background Jobs' do
|
5
|
+
let(:klass) { Marty::DeloreanBackgroundJob }
|
6
|
+
|
7
|
+
before do
|
8
|
+
Marty::Script.load_scripts(nil)
|
9
|
+
end
|
10
|
+
|
11
|
+
let!(:schedule) do
|
12
|
+
Marty::BackgroundJob::Schedule.create!(
|
13
|
+
job_class: klass.name,
|
14
|
+
cron: '* * * * *',
|
15
|
+
state: 'on',
|
16
|
+
arguments: ['Jobs', 'TestJob1', 'perform']
|
17
|
+
).tap do |job|
|
18
|
+
Marty::BackgroundJob::UpdateSchedule.call(
|
19
|
+
id: job.id,
|
20
|
+
job_class: job.job_class,
|
21
|
+
)
|
22
|
+
|
23
|
+
dj = job.delayed_job
|
24
|
+
dj.update!(run_at: 1.minute.ago)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def run_job
|
29
|
+
expect(schedule.delayed_job).to be_present
|
30
|
+
expect(Delayed::Job.count).to eq 1
|
31
|
+
worker = Delayed::Worker.new
|
32
|
+
worker.work_off
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'logs' do
|
36
|
+
it 'logs success' do
|
37
|
+
allow(klass).to receive(:trigger_failure).and_return(nil)
|
38
|
+
|
39
|
+
expect { run_job }.to change { Marty::BackgroundJob::Log.count }.by 1
|
40
|
+
log = Marty::BackgroundJob::Log.find_by(job_class: klass.name)
|
41
|
+
expect(log.error).to_not be_present
|
42
|
+
expect(log.arguments).to eq ['Jobs', 'TestJob1', 'perform']
|
43
|
+
expect(log.success?).to be true
|
44
|
+
expect(klass.scheduled?(schedule_id: schedule.id)).to be true
|
45
|
+
|
46
|
+
dj = schedule.reload.delayed_job
|
47
|
+
expect(dj.schedule_id).to eq schedule.id
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/spec/models/promise_spec.rb
CHANGED
@@ -11,16 +11,18 @@ module Marty
|
|
11
11
|
|
12
12
|
Marty::Jobs::Schedule.call
|
13
13
|
|
14
|
-
dj =
|
14
|
+
dj = schedule.delayed_job
|
15
15
|
|
16
|
-
|
16
|
+
schedule.delayed_job.dup.tap do |new_dj|
|
17
17
|
new_dj.handler = new_dj.handler.gsub('TestJob', 'Test2Job')
|
18
|
+
new_dj.schedule_id = nil
|
18
19
|
new_dj.cron = nil
|
19
20
|
new_dj.save!
|
20
21
|
end
|
21
22
|
|
22
|
-
|
23
|
+
schedule.delayed_job.dup.tap do |new_dj|
|
23
24
|
new_dj.handler = new_dj.handler.gsub('TestJob', 'MissingJob')
|
25
|
+
new_dj.schedule_id = nil
|
24
26
|
new_dj.save!
|
25
27
|
end
|
26
28
|
end
|
@@ -5,20 +5,21 @@ module Marty
|
|
5
5
|
let!(:schedule) do
|
6
6
|
Marty::BackgroundJob::Schedule.create!(
|
7
7
|
job_class: 'TestJob',
|
8
|
+
arguments: [],
|
8
9
|
cron: '0 0 * * *',
|
9
10
|
state: 'on'
|
10
11
|
)
|
11
12
|
end
|
12
13
|
|
13
14
|
it 'schedules jobs' do
|
14
|
-
expect(TestJob).
|
15
|
+
expect(TestJob.scheduled?(schedule_id: schedule.id)).to be false
|
15
16
|
described_class.call
|
16
|
-
expect(TestJob).to
|
17
|
+
expect(TestJob.scheduled?(schedule_id: schedule.id)).to be true
|
17
18
|
end
|
18
19
|
|
19
20
|
it 'deletes previously scheduled jobs' do
|
20
21
|
described_class.call
|
21
|
-
expect(TestJob).to
|
22
|
+
expect(TestJob.scheduled?(schedule_id: schedule.id)).to be true
|
22
23
|
schedule.destroy!
|
23
24
|
|
24
25
|
non_cron_job = Delayed::Job.create!(handler: 'Non cron job')
|
@@ -29,7 +30,7 @@ module Marty
|
|
29
30
|
|
30
31
|
described_class.call
|
31
32
|
|
32
|
-
expect(TestJob).
|
33
|
+
expect(TestJob.scheduled?(schedule_id: schedule.id)).to be false
|
33
34
|
any_old_scheduled_jobs = Delayed::Job.where('handler ILIKE ?', '%WrongTestJob%').any?
|
34
35
|
expect(any_old_scheduled_jobs).to be false
|
35
36
|
|
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:
|
4
|
+
version: 10.0.0
|
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: 2020-
|
17
|
+
date: 2020-03-06 00:00:00.000000000 Z
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
20
20
|
name: actioncable
|
@@ -391,6 +391,7 @@ files:
|
|
391
391
|
- app/helpers/marty/enum_helper.rb
|
392
392
|
- app/helpers/marty/script_set.rb
|
393
393
|
- app/jobs/marty/cron_job.rb
|
394
|
+
- app/jobs/marty/delorean_background_job.rb
|
394
395
|
- app/jobs/marty/remove_old_promises_job.rb
|
395
396
|
- app/models/marty/api_auth.rb
|
396
397
|
- app/models/marty/api_config.rb
|
@@ -512,6 +513,10 @@ files:
|
|
512
513
|
- db/migrate/520_create_marty_notifications.rb
|
513
514
|
- db/migrate/521_create_marty_notifications_deliveries.rb
|
514
515
|
- db/migrate/522_create_marty_notifications_config.rb
|
516
|
+
- db/migrate/523_add_timeout_to_promises.rb
|
517
|
+
- db/migrate/524_add_timeout_to_promise_view.rb
|
518
|
+
- db/migrate/525_add_arguments_to_jobs_schedules.rb
|
519
|
+
- db/migrate/526_add_schedule_id_to_delayed_jobs.rb
|
515
520
|
- db/seeds.rb
|
516
521
|
- db/sql/lookup_grid_distinct_v1.sql
|
517
522
|
- db/sql/query_grid_dir_v1.sql
|
@@ -538,6 +543,7 @@ files:
|
|
538
543
|
- lib/marty/data_conversion.rb
|
539
544
|
- lib/marty/data_exporter.rb
|
540
545
|
- lib/marty/data_importer.rb
|
546
|
+
- lib/marty/delayed_job/queue_adapter.rb
|
541
547
|
- lib/marty/delayed_job/scheduled_job_plugin.rb
|
542
548
|
- lib/marty/diagnostic/aws/ec2_instance.rb
|
543
549
|
- lib/marty/diagnostic/aws/error.rb
|
@@ -594,6 +600,8 @@ files:
|
|
594
600
|
- spec/controllers/job_controller_spec.rb
|
595
601
|
- spec/controllers/rpc_controller_spec.rb
|
596
602
|
- spec/controllers/rpc_import_spec.rb
|
603
|
+
- spec/dummy/.foreman
|
604
|
+
- spec/dummy/Procfile
|
597
605
|
- spec/dummy/README.rdoc
|
598
606
|
- spec/dummy/Rakefile
|
599
607
|
- spec/dummy/app/assets/config/manifest.js
|
@@ -683,6 +691,7 @@ files:
|
|
683
691
|
- spec/dummy/delorean/delorean_fn.dl
|
684
692
|
- spec/dummy/delorean/enum_report.dl
|
685
693
|
- spec/dummy/delorean/fields.dl
|
694
|
+
- spec/dummy/delorean/jobs.dl
|
686
695
|
- spec/dummy/delorean/styles.dl
|
687
696
|
- spec/dummy/delorean/table_report.dl
|
688
697
|
- spec/dummy/delorean/test_namespace/nested_namespace/test.dl
|
@@ -1753,6 +1762,7 @@ files:
|
|
1753
1762
|
- spec/fixtures/scripts/load_tests/script2.dl
|
1754
1763
|
- spec/job_helper.rb
|
1755
1764
|
- spec/jobs/cron_job_spec.rb
|
1765
|
+
- spec/jobs/delorean_background_job_spec.rb
|
1756
1766
|
- spec/lib/data_blame_spec.rb
|
1757
1767
|
- spec/lib/data_conversion_spec.rb
|
1758
1768
|
- spec/lib/data_exporter_spec.rb
|