marty 2.7.3 → 2.8.0

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
  SHA256:
3
- metadata.gz: 3f0011e12fd48a4e14d470ba22c2293428a0607316a8b278ffec4d651deaa0e3
4
- data.tar.gz: 49430e4e1cf9936c10d42cdb6fd0d71ac45856c53c9f28330a8ceb1d97e2cc71
3
+ metadata.gz: 1e99ecbf41a6cda553cf318fb21bbe9c3150ec13e46b074171eaa1bd1ea12aed
4
+ data.tar.gz: c6dcdf2a95d456e27189c1369ff54de3d62ce4cd58b5d7125bf8f83d57ba8d57
5
5
  SHA512:
6
- metadata.gz: 56459fc03c3ed9a6240cb7bf593bb6e0ced8badfa6eb665f1b51289bbdb6bae1dcf17ce545ebbd490dd4cc452da008e77395610409fc4cdc8c8f88c548102952
7
- data.tar.gz: 28893152b14ece8002bccfbb6c90077b5018764c6343fadd4e469e68721dfd32a9e65f8d29e682c85ae42411e2685fed3947681a28e132a9a2c123abe431d444
6
+ metadata.gz: a43ae65fe90a06f4c1c35652aaba4627431ea449fedc6c262aa37a384d5d4e02d879a47c145b9dab56c756025d42e92d2c49e1a9658301ba50598164dc3e514b
7
+ data.tar.gz: ef2702ad5285cb59f777faa7b1ecceecd570945e490100e6542cd3fe7e237e597d491e3b9e7f7b9de32149645959b9142481efc3bf8614330a344a234f9c2397
data/Gemfile.lock CHANGED
@@ -6,8 +6,9 @@ PATH
6
6
  axlsx (= 3.0.0pre)
7
7
  coderay
8
8
  daemons (~> 1.3.1)
9
+ delayed_cron_job
9
10
  delayed_job_active_record
10
- delorean_lang (~> 0.6.0)
11
+ delorean_lang (~> 0.6)
11
12
  json-schema
12
13
  mcfly (~> 0.0.20)
13
14
  net-ldap (~> 0.16.1)
@@ -89,6 +90,8 @@ GEM
89
90
  crass (1.0.4)
90
91
  daemons (1.3.1)
91
92
  database_cleaner (1.7.0)
93
+ delayed_cron_job (0.7.2)
94
+ delayed_job (>= 4.1)
92
95
  delayed_job (4.1.5)
93
96
  activesupport (>= 3.0, < 5.3)
94
97
  delayed_job_active_record (4.1.3)
data/README.md CHANGED
@@ -50,6 +50,13 @@ To delete scripts:
50
50
  ```
51
51
  $ rake marty:delete_scripts
52
52
  ```
53
+ # Scheduled Job
54
+
55
+ To use scheduled backgroud jobs, add to `config/application.rb`:
56
+
57
+ ```
58
+ config.active_job.queue_adapter = :delayed_job
59
+ ```
53
60
 
54
61
  # Dummy Application & Testing
55
62
 
@@ -0,0 +1,94 @@
1
+ class Marty::BackgroundJobScheduleView < Marty::Grid
2
+ ACCESSIBLE_BY = [:admin]
3
+
4
+ has_marty_permissions(
5
+ read: ACCESSIBLE_BY,
6
+ create: ACCESSIBLE_BY,
7
+ update: ACCESSIBLE_BY,
8
+ delete: ACCESSIBLE_BY,
9
+ destroy: ACCESSIBLE_BY,
10
+ edit_window__edit_form__submit: ACCESSIBLE_BY,
11
+ add_window__add_form__submit: ACCESSIBLE_BY
12
+ )
13
+
14
+ def configure(c)
15
+ super
16
+
17
+ c.title ||= I18n.t('delayed_jobs_schedule_view_title', default: 'Background Jobs Schedule')
18
+ c.model = 'Marty::BackgroundJob::Schedule'
19
+ c.paging = :buffered
20
+ c.editing = :in_form
21
+
22
+ c.attributes = [
23
+ :job_class,
24
+ :cron,
25
+ :state
26
+ ]
27
+ end
28
+
29
+ def default_context_menu
30
+ []
31
+ end
32
+
33
+ attribute :job_class do |c|
34
+ c.width = 400
35
+ end
36
+
37
+ attribute :cron do |c|
38
+ c.width = 400
39
+ end
40
+
41
+ attribute :state do |c|
42
+ c.width = 150
43
+ editor_config = {
44
+ trigger_action: :all,
45
+ xtype: :combo,
46
+ store: Marty::BackgroundJob::Schedule::ALL_STATES,
47
+ forceSelection: true,
48
+ }
49
+
50
+ c.column_config = { editor: editor_config }
51
+ c.field_config = editor_config
52
+ end
53
+
54
+ endpoint :edit_window__edit_form__submit do |params|
55
+ result = super(params)
56
+ next result if result.empty?
57
+
58
+ obj_hash = result.first
59
+ Marty::BackgroundJob::UpdateSchedule.call(id: obj_hash['id'], job_class: obj_hash['job_class'])
60
+
61
+ result
62
+ end
63
+
64
+ endpoint :add_window__add_form__submit do |params|
65
+ result = super(params)
66
+ next result if result.empty?
67
+
68
+ obj_hash = result.first
69
+ Marty::BackgroundJob::UpdateSchedule.call(id: obj_hash['id'], job_class: obj_hash['job_class'])
70
+
71
+ result
72
+ end
73
+
74
+ endpoint :multiedit_window__multiedit_form__submit do |_params|
75
+ client.netzke_notify 'Multiediting is disabled for cron schedules'
76
+ end
77
+
78
+ endpoint :destroy do |params|
79
+ res = params.each_with_object({}) do |id, hash|
80
+ job_class = model.find_by(id: id)&.job_class
81
+ result = super([id])
82
+
83
+ # Do nothing If it wasn't destroyed
84
+ next hash.merge(result) unless result[id.to_i] == 'ok'
85
+
86
+ Marty::BackgroundJob::UpdateSchedule.call(id: id, job_class: job_class)
87
+ hash.merge(result)
88
+ end
89
+
90
+ res
91
+ end
92
+ end
93
+
94
+ BackgroundJobScheduleView = Marty::BackgroundJobScheduleView
@@ -1,16 +1,17 @@
1
- require 'marty/scripting'
2
- require 'marty/reporting'
3
- require 'marty/posting_window'
4
- require 'marty/new_posting_window'
5
- require 'marty/import_type_view'
6
- require 'marty/user_view'
7
- require 'marty/event_view'
8
- require 'marty/promise_view'
9
1
  require 'marty/api_auth_view'
10
2
  require 'marty/api_config_view'
11
3
  require 'marty/api_log_view'
12
4
  require 'marty/config_view'
13
5
  require 'marty/data_grid_view'
6
+ require 'marty/background_job_schedule_view'
7
+ require 'marty/event_view'
8
+ require 'marty/import_type_view'
9
+ require 'marty/new_posting_window'
10
+ require 'marty/posting_window'
11
+ require 'marty/promise_view'
12
+ require 'marty/reporting'
13
+ require 'marty/scripting'
14
+ require 'marty/user_view'
14
15
 
15
16
  class Marty::MainAuthApp < Marty::AuthApp
16
17
  extend ::Marty::Permissions
@@ -112,6 +113,7 @@ class Marty::MainAuthApp < Marty::AuthApp
112
113
  :bg_status,
113
114
  :bg_stop,
114
115
  :bg_restart,
116
+ :background_job_schedule_view,
115
117
  ]
116
118
  },
117
119
  ]
@@ -276,6 +278,14 @@ class Marty::MainAuthApp < Marty::AuthApp
276
278
  a.disabled = !self.class.has_admin_perm?
277
279
  end
278
280
 
281
+ action :background_job_schedule_view do |a|
282
+ a.text = 'Schedule Background Jobs'
283
+ a.tooltip = 'Edit Delayed Jobs Cron schedules'
284
+ a.icon_cls = 'fa fa-cog glyph'
285
+ a.disabled = !self.class.has_admin_perm?
286
+ a.handler = :netzke_load_component_by_action
287
+ end
288
+
279
289
  action :log_view do |a|
280
290
  a.text = 'View Log'
281
291
  a.tooltip = 'View Log'
@@ -365,31 +375,44 @@ class Marty::MainAuthApp < Marty::AuthApp
365
375
  end
366
376
 
367
377
  ######################################################################
368
-
369
- component :scripting do |c|
370
- c.allow_edit = self.class.has_scripting_perm?
371
- end
372
- component :reporting
373
- component :promise_view
374
- component :posting_window
375
- component :new_posting_window do |c|
376
- c.disabled = Marty::Util.warped? || !self.class.has_posting_perm?
377
- end
378
- component :import_type_view
379
- component :user_view
380
- component :event_view
381
- component :config_view
382
- component :data_grid_view
383
378
  component :api_auth_view do |c|
384
379
  c.disabled = Marty::Util.warped?
385
380
  end
381
+
386
382
  component :api_log_view
383
+
387
384
  component :api_config_view
388
385
 
386
+ component :background_job_schedule_view
387
+
388
+ component :config_view
389
+
390
+ component :data_grid_view
391
+
392
+ component :event_view
393
+
394
+ component :import_type_view
395
+
389
396
  component :log_view do |c|
390
397
  c.klass = Marty::LogView
391
398
  end
392
399
 
400
+ component :new_posting_window do |c|
401
+ c.disabled = Marty::Util.warped? || !self.class.has_posting_perm?
402
+ end
403
+
404
+ component :posting_window
405
+
406
+ component :promise_view
407
+
408
+ component :reporting
409
+
410
+ component :scripting do |c|
411
+ c.allow_edit = self.class.has_scripting_perm?
412
+ end
413
+
414
+ component :user_view
415
+
393
416
  endpoint :reload_scripts do |_params|
394
417
  Marty::Script.load_scripts
395
418
  client.netzke_notify 'Scripts have been reloaded'
@@ -0,0 +1,41 @@
1
+ class Marty::CronJob < ActiveJob::Base
2
+ class << self
3
+ def schedule
4
+ return reschedule if scheduled?
5
+
6
+ cron = cron_expression
7
+
8
+ return if cron.blank?
9
+
10
+ set(cron: cron).perform_later
11
+ end
12
+
13
+ def reschedule
14
+ dj = delayed_job
15
+ return dj.update(cron: cron_expression) if dj.locked_by?
16
+
17
+ remove
18
+ schedule
19
+ end
20
+
21
+ def remove
22
+ delayed_job.destroy if scheduled?
23
+ end
24
+
25
+ alias remove_schedule remove
26
+
27
+ def scheduled?
28
+ delayed_job.present?
29
+ end
30
+
31
+ def delayed_job
32
+ Delayed::Job.
33
+ where('handler LIKE ?', "%job_class: #{name}\n%").
34
+ first
35
+ end
36
+
37
+ def cron_expression
38
+ ::Marty::BackgroundJob::Schedule.on.find_by(job_class: name)&.cron
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,4 @@
1
+ module Marty
2
+ module BackgroundJob
3
+ end
4
+ end
@@ -0,0 +1,27 @@
1
+ module Marty
2
+ module BackgroundJob
3
+ class Schedule < Marty::Base
4
+ self.table_name = 'marty_background_job_schedules'
5
+
6
+ # Copied and adjusted:
7
+ # https://github.com/javan/whenever/blob/e4507e2ed2158c603f0c334a8b0a957711db343a/lib/whenever/cron.rb
8
+ REGEX = %r{\A(((\*?[\d/,\-]*)\s){3}(\*?([\d/,\-])*\s)(\*?([\d/,\-])*))\z}i
9
+
10
+ validates :job_class, :cron, :state, presence: true
11
+ validates :job_class, uniqueness: true
12
+ validates :cron, format: { with: REGEX }
13
+
14
+ validate :job_class_validation
15
+
16
+ ALL_STATES = %w[on off].freeze
17
+ enum state: ALL_STATES.zip(ALL_STATES).to_h
18
+
19
+ def job_class_validation
20
+ job_class.constantize.respond_to?(:schedule)
21
+ rescue NameError
22
+ errors.add(:job_class, "doesn't exist")
23
+ false
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,34 @@
1
+ module Marty
2
+ module BackgroundJob
3
+ module UpdateSchedule
4
+ def self.call(id:, job_class:)
5
+ model = Marty::BackgroundJob::Schedule.find_by(id: id)
6
+
7
+ return remove_schedule(job_class: job_class) unless model.present?
8
+ return remove_schedule(job_class: job_class) if model.off?
9
+ return schedule(job_class: job_class) if model.on?
10
+ end
11
+
12
+ def self.remove_schedule(job_class:)
13
+ klass = job_class.constantize
14
+ klass.remove_schedule if klass.respond_to?(:remove_schedule)
15
+
16
+ true
17
+ rescue NameError
18
+ false
19
+ end
20
+
21
+ def self.schedule(job_class:)
22
+ klass = job_class.constantize
23
+
24
+ return false unless klass.respond_to?(:schedule)
25
+
26
+ klass.schedule
27
+
28
+ true
29
+ rescue NameError
30
+ false
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,17 @@
1
+ module Marty
2
+ module Jobs
3
+ module Schedule
4
+ extend Delorean::Functions
5
+
6
+ delorean_fn :call, sig: 0 do
7
+ glob = Rails.root.join('app', 'jobs', '**', '*_job.rb')
8
+ Dir.glob(glob).each { |f| require f }
9
+
10
+ Marty::CronJob.subclasses.map do |klass|
11
+ klass.schedule
12
+ [klass.name, klass.cron_expression]
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ class AddCronToDelayedJobs < ActiveRecord::Migration[5.1]
2
+ def self.up
3
+ add_column :delayed_jobs, :cron, :string
4
+ end
5
+
6
+ def self.down
7
+ remove_column :delayed_jobs, :cron
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ class CreateMartyDelayedJobSchedules < ActiveRecord::Migration[5.1]
2
+ def change
3
+ create_table :marty_background_job_schedules do |t|
4
+ t.string :job_class, null: false
5
+ t.string :cron, null: false
6
+ t.string :state, null: false
7
+
8
+ t.timestamps
9
+ end
10
+
11
+ add_index :marty_background_job_schedules, :job_class, unique: true
12
+ end
13
+ end
data/lib/marty.rb CHANGED
@@ -20,3 +20,4 @@ require 'marty/json_schema'
20
20
  # application's Gemfile. Requiring it here removes the need to add it
21
21
  # to the Gemfile
22
22
  require 'net-ldap'
23
+ require 'delayed_cron_job'
data/lib/marty/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Marty
2
- VERSION = '2.7.3'
2
+ VERSION = '2.8.0'
3
3
  end
@@ -0,0 +1,8 @@
1
+ namespace :marty do
2
+ namespace :jobs do
3
+ desc 'Schedule all cron jobs'
4
+ task schedule: :environment do
5
+ ::Marty::Jobs::Schedule.call
6
+ end
7
+ end
8
+ end
data/make-dummy.mk CHANGED
@@ -2,10 +2,12 @@ dummy-app-build:
2
2
  docker-compose --file=docker-compose.dummy.yml build
3
3
 
4
4
  dummy-app:
5
- docker-compose --file=docker-compose.dummy.yml up
5
+ docker-compose --file=docker-compose.dummy.yml up -d app
6
+ docker attach marty_app_1
6
7
 
7
8
  dummy-app-start:
8
- docker-compose --file=docker-compose.dummy.yml up app
9
+ docker-compose --file=docker-compose.dummy.yml up -d app
10
+ docker attach marty_app_1
9
11
 
10
12
  dummy-app-stop:
11
13
  docker-compose --file=docker-compose.dummy.yml stop
data/marty.gemspec CHANGED
@@ -33,7 +33,7 @@ Gem::Specification.new do |s|
33
33
 
34
34
  s.add_dependency 'axlsx', '3.0.0pre'
35
35
 
36
- s.add_dependency 'delorean_lang', '~> 0.6.0'
36
+ s.add_dependency 'delorean_lang', '~> 0.6'
37
37
  s.add_dependency 'mcfly', '~> 0.0.20'
38
38
 
39
39
  s.add_dependency 'coderay'
@@ -46,5 +46,6 @@ Gem::Specification.new do |s|
46
46
  s.add_dependency 'aws-sigv4', '~> 1.0', '>= 1.0.2'
47
47
 
48
48
  s.add_dependency 'daemons', '~> 1.3.1'
49
+ s.add_dependency 'delayed_cron_job'
49
50
  s.add_dependency 'delayed_job_active_record'
50
51
  end
@@ -0,0 +1,4 @@
1
+ class TestJob < Marty::CronJob
2
+ def perform
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ class TestJob2 < Marty::CronJob
2
+ def perform
3
+ end
4
+ end
@@ -83,6 +83,8 @@ module Dummy
83
83
  #config.marty.default_posting_type = 'BASE'
84
84
  config.secret_key_base = "SECRET_KEY_BASE"
85
85
  config.marty.extjs_theme = 'crisp'
86
+
87
+ config.active_job.queue_adapter = :delayed_job
86
88
  end
87
89
  end
88
90
  require "marty/permissions"
@@ -0,0 +1,112 @@
1
+ require 'spec_helper'
2
+
3
+ feature 'Background jobs schedule view', js: true do
4
+ before do
5
+ Delayed::Job.delete_all
6
+ populate_test_users
7
+ end
8
+
9
+ context 'as dev' do
10
+ before do
11
+ log_in_as('dev1')
12
+ wait_for_ajax
13
+ press('System')
14
+ press('Background Jobs')
15
+ press('Schedule Background Jobs')
16
+ wait_for_ajax
17
+ end
18
+
19
+ it 'access denied' do
20
+ expect(page).to_not have_content 'Background Jobs Schedule'
21
+ end
22
+ end
23
+
24
+ context 'as admin' do
25
+ let(:schedule_view) { netzke_find('background_job_schedule_view') }
26
+
27
+ let!(:schedule) do
28
+ Marty::BackgroundJob::Schedule.create(
29
+ job_class: 'TestJob2',
30
+ cron: '0 0 * * *',
31
+ state: 'on'
32
+ ).tap do |job|
33
+ Marty::BackgroundJob::UpdateSchedule.call(
34
+ id: job.id,
35
+ job_class: job.job_class
36
+ )
37
+ end
38
+ end
39
+
40
+ before do
41
+ expect(TestJob2.scheduled?).to be true
42
+
43
+ log_in_as('admin1')
44
+ wait_for_ajax
45
+ press('System')
46
+ press('Background Jobs')
47
+ press('Schedule Background Jobs')
48
+
49
+ wait_for_ajax
50
+
51
+ expect(page).to have_content 'Background Jobs Schedule'
52
+ end
53
+
54
+ it 'creates new schedule' do
55
+ expect(TestJob.scheduled?).to be false
56
+
57
+ press('Add')
58
+
59
+ fill_in('Job class', with: 'TestJob')
60
+ fill_in('cron', with: '1 1 * * *')
61
+ fill_in('state', with: 'on')
62
+
63
+ press 'OK'
64
+ wait_for_ajax
65
+
66
+ find('.x-tool-refresh').click
67
+ crons = schedule_view.get_col_vals('cron', 2, 0)
68
+
69
+ expect(crons).to include('1 1 * * *')
70
+ expect(crons).to include('0 0 * * *')
71
+
72
+ expect(TestJob.scheduled?).to be true
73
+ expect(TestJob.delayed_job.cron).to eq '1 1 * * *'
74
+
75
+ expect(TestJob2.scheduled?).to be true
76
+ expect(TestJob2.delayed_job.cron).to eq '0 0 * * *'
77
+ end
78
+
79
+ it 'deletes schedule' do
80
+ find('.x-grid-item', text: 'TestJob2').click
81
+ press 'Delete'
82
+ press 'Yes'
83
+
84
+ wait_for_ajax
85
+
86
+ expect(TestJob2.scheduled?).to be false
87
+ end
88
+
89
+ it 'turns the schedule off' do
90
+ find('.x-grid-item', text: 'TestJob2').click
91
+ press 'Edit'
92
+ fill_in('state', with: 'off')
93
+
94
+ press 'OK'
95
+ wait_for_ajax
96
+ expect(TestJob2.scheduled?).to be false
97
+ end
98
+
99
+ it 'shows validation errors' do
100
+ press('Add')
101
+
102
+ fill_in('Job class', with: 'TestJob2')
103
+ fill_in('state', with: 'on')
104
+ fill_in('cron', with: '1')
105
+
106
+ press 'OK'
107
+ wait_for_ajax
108
+ expect(page).to have_content('Job class has already been taken')
109
+ expect(page).to have_content('Cron is invalid')
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+ require 'marty/background_job/schedule'
3
+
4
+ module Marty
5
+ module BackgroundJob
6
+ describe Schedule do
7
+ let(:subject) do
8
+ described_class.new(job_class: 'TestJob', cron: '* * * * *', state: 'on')
9
+ end
10
+
11
+ VALID_CRONS = [
12
+ '* * * * *',
13
+ '45 23 * * 6',
14
+ '0 7,17 * * *',
15
+ '0 17 * * 6',
16
+ '*/10 * * * *',
17
+ '30 10 * * *',
18
+ '0 * * * *',
19
+ '0 * * * *',
20
+ ].freeze
21
+
22
+ INVALID_CRONS = [
23
+ 'text 23 * * 6',
24
+ '1',
25
+ '* * *'
26
+ ].freeze
27
+
28
+ it 'valid with valid cron expression' do
29
+ VALID_CRONS.each do |cron|
30
+ subject.cron = cron
31
+ expect(subject).to be_valid
32
+ end
33
+ end
34
+
35
+ it 'invalid with valid cron expression' do
36
+ INVALID_CRONS.each do |cron|
37
+ subject.cron = cron
38
+ expect(subject).to_not be_valid
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -12,10 +12,20 @@ module Marty; module RSpec; module Chromedriver
12
12
  pageLoadStrategy: 'none',
13
13
  }
14
14
 
15
+ options = ::Selenium::WebDriver::Chrome::Options.new
16
+
17
+ # Add arguments to the driver using the Options interface
18
+ if opts[:args]
19
+ opts[:args].each do |arg|
20
+ options.add_argument("--#{arg}")
21
+ end
22
+ end
23
+
15
24
  caps = Selenium::WebDriver::Remote::Capabilities.chrome(copts)
16
25
  driver = Capybara::Selenium::Driver.new(app,
17
26
  browser: :chrome,
18
- desired_capabilities: caps)
27
+ desired_capabilities: caps,
28
+ options: options)
19
29
  yield driver if block_given?
20
30
  driver
21
31
  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: 2.7.3
4
+ version: 2.8.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: 2019-06-07 00:00:00.000000000 Z
17
+ date: 2019-06-12 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.6.0
67
+ version: '0.6'
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.6.0
74
+ version: '0.6'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: mcfly
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -190,6 +190,20 @@ dependencies:
190
190
  - - "~>"
191
191
  - !ruby/object:Gem::Version
192
192
  version: 1.3.1
193
+ - !ruby/object:Gem::Dependency
194
+ name: delayed_cron_job
195
+ requirement: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ type: :runtime
201
+ prerelease: false
202
+ version_requirements: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - ">="
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
193
207
  - !ruby/object:Gem::Dependency
194
208
  name: delayed_job_active_record
195
209
  requirement: !ruby/object:Gem::Requirement
@@ -240,6 +254,7 @@ files:
240
254
  - app/components/marty/api_log_view.rb
241
255
  - app/components/marty/auth_app.rb
242
256
  - app/components/marty/auth_app/client/auth_app.js
257
+ - app/components/marty/background_job_schedule_view.rb
243
258
  - app/components/marty/base_rule_view.rb
244
259
  - app/components/marty/config_view.rb
245
260
  - app/components/marty/data_grid_view.rb
@@ -302,8 +317,11 @@ files:
302
317
  - app/helpers/marty/application_helper.rb
303
318
  - app/helpers/marty/enum_helper.rb
304
319
  - app/helpers/marty/script_set.rb
320
+ - app/jobs/marty/cron_job.rb
305
321
  - app/models/marty/api_auth.rb
306
322
  - app/models/marty/api_config.rb
323
+ - app/models/marty/background_job.rb
324
+ - app/models/marty/background_job/schedule.rb
307
325
  - app/models/marty/base.rb
308
326
  - app/models/marty/base_rule.rb
309
327
  - app/models/marty/config.rb
@@ -333,6 +351,8 @@ files:
333
351
  - app/models/marty/user.rb
334
352
  - app/models/marty/user_role.rb
335
353
  - app/models/marty/vw_promise.rb
354
+ - app/services/marty/background_job/update_schedule.rb
355
+ - app/services/marty/jobs/schedule.rb
336
356
  - app/services/marty/promises/delorean.rb
337
357
  - app/services/marty/promises/delorean/create.rb
338
358
  - app/services/marty/promises/ruby.rb
@@ -385,6 +405,8 @@ files:
385
405
  - db/migrate/502_add_promise_type_enum.rb
386
406
  - db/migrate/503_add_promise_type_to_promises.rb
387
407
  - db/migrate/504_remove_plv8_extension.rb
408
+ - db/migrate/505_add_cron_to_delayed_jobs.rb
409
+ - db/migrate/506_create_marty_delayed_job_schedules.rb
388
410
  - db/seeds.rb
389
411
  - db/sql/lookup_grid_distinct_v1.sql
390
412
  - db/sql/query_grid_dir_v1.sql
@@ -428,6 +450,7 @@ files:
428
450
  - lib/pyxll/gemini.py
429
451
  - lib/pyxll/pyxll.cfg
430
452
  - lib/pyxll/sample.xlsx
453
+ - lib/tasks/marty_jobs.rake
431
454
  - lib/tasks/marty_tasks.rake
432
455
  - lib/tasks/scripts_tasks.rake
433
456
  - make-dummy.mk
@@ -464,6 +487,8 @@ files:
464
487
  - spec/dummy/app/controllers/application_controller.rb
465
488
  - spec/dummy/app/controllers/components_controller.rb
466
489
  - spec/dummy/app/helpers/application_helper.rb
490
+ - spec/dummy/app/jobs/test_job.rb
491
+ - spec/dummy/app/jobs/test_job2.rb
467
492
  - spec/dummy/app/mailers/.gitkeep
468
493
  - spec/dummy/app/models/.gitkeep
469
494
  - spec/dummy/app/models/gemini/amortization_type.rb
@@ -1557,6 +1582,7 @@ files:
1557
1582
  - spec/dummy/spec/features/javascripts
1558
1583
  - spec/dummy/tmp/.gitkeep
1559
1584
  - spec/features/auth_app_spec.rb
1585
+ - spec/features/background_job_schedule_spec.rb
1560
1586
  - spec/features/data_import_spec.rb
1561
1587
  - spec/features/endpoint_access.rb
1562
1588
  - spec/features/enum_spec.rb
@@ -1592,6 +1618,7 @@ files:
1592
1618
  - spec/lib/xl_spec.rb
1593
1619
  - spec/lib/xl_styles_spec.rb
1594
1620
  - spec/models/api_auth_spec.rb
1621
+ - spec/models/background_job/schedule.rb
1595
1622
  - spec/models/config_spec.rb
1596
1623
  - spec/models/data_grid_spec.rb
1597
1624
  - spec/models/event_spec.rb