delay_henka 0.3.3 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/app/controllers/delay_henka/web/admin/scheduled_actions_controller.rb +26 -0
- data/app/models/delay_henka/scheduled_action.rb +61 -0
- data/app/models/delay_henka/scheduled_change.rb +3 -3
- data/app/views/delay_henka/web/admin/scheduled_actions/_summary_table.html.haml +20 -0
- data/app/views/delay_henka/web/admin/scheduled_actions/index.html.haml +23 -0
- data/app/workers/delay_henka/apply_actions_worker.rb +14 -0
- data/config/routes.rb +1 -0
- data/db/migrate/20190408130947_create_delay_henka_scheduled_actions.rb +15 -0
- data/lib/delay_henka.rb +5 -0
- data/lib/delay_henka/version.rb +1 -1
- metadata +19 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e0c371d4bcae63640c6b5b2689d1340bf14654068a8e7eabd6085889ebd78d99
|
4
|
+
data.tar.gz: 0eada38daa2b68b70349ca3080809cdf590dc03bff10d2468c902dc229db3d23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8f89a6353eb0099c36d97deff1abed8685554b824b4964dbb64c3b85a672b6a3e1978077a9ec49b9f72a6455d0f2fb466633367213393fd3740361a8337753d
|
7
|
+
data.tar.gz: 8b11d1fa0972838bc36f857b8c45f4b8a3e7fe07f633f881faa6542785ed42e88000408a88da65f00af6637daeae9d5c2f80b1c39ea31f993f3010dc89533a6f
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module DelayHenka
|
2
|
+
module Web
|
3
|
+
module Admin
|
4
|
+
class ScheduledActionsController < DelayHenka.base_view_controller.constantize
|
5
|
+
|
6
|
+
before_action :set_scheduled_action, only: %i(destroy)
|
7
|
+
|
8
|
+
def index
|
9
|
+
@actions = ScheduledAction.order('created_at DESC')
|
10
|
+
end
|
11
|
+
|
12
|
+
def destroy
|
13
|
+
@action.destroy!
|
14
|
+
redirect_back fallback_location: web_admin_scheduled_actions_path, flash: { success: 'Destroy succeeded' }
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def set_scheduled_action
|
20
|
+
@action = ScheduledAction.find(params[:id])
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module DelayHenka
|
2
|
+
class ScheduledAction < ApplicationRecord
|
3
|
+
|
4
|
+
STATES = {
|
5
|
+
STAGED: 'staged',
|
6
|
+
COMPLETED: 'completed',
|
7
|
+
ERRORED: 'errored'
|
8
|
+
}
|
9
|
+
|
10
|
+
belongs_to :actionable, polymorphic: true
|
11
|
+
|
12
|
+
validates :submitted_by_id, :schedule_at, presence: true
|
13
|
+
validates :state, inclusion: { in: STATES.values }
|
14
|
+
after_initialize :set_initial_state, if: :new_record?
|
15
|
+
|
16
|
+
scope :staged, -> { where(state: STATES[:STAGED]) }
|
17
|
+
|
18
|
+
def self.schedule(record:, method_name:, argument: nil, by_id:, schedule_at: Time.current)
|
19
|
+
Keka.run do
|
20
|
+
begin
|
21
|
+
arity = record.method(method_name.to_sym).arity
|
22
|
+
Keka.err_unless! (arity == 0 && argument.nil?) || (arity == 1 && !argument.nil?), 'wrong arity'
|
23
|
+
DelayHenka::ScheduledAction.create(
|
24
|
+
actionable: record,
|
25
|
+
method_name: method_name,
|
26
|
+
argument: argument.to_json,
|
27
|
+
submitted_by_id: by_id,
|
28
|
+
schedule_at: schedule_at
|
29
|
+
)
|
30
|
+
rescue NameError => e
|
31
|
+
Keka.err_if! true, e.message
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def apply_action
|
37
|
+
unless actionable
|
38
|
+
# Caution: model validations are bypassed
|
39
|
+
update_columns(state: STATES[:ERRORED], error_message: 'Target record cannot be found')
|
40
|
+
return
|
41
|
+
end
|
42
|
+
|
43
|
+
begin
|
44
|
+
output = actionable.method(method_name.to_sym).arity == 0 ?
|
45
|
+
actionable.send(method_name) :
|
46
|
+
actionable.send(method_name, JSON.parse(argument))
|
47
|
+
update!(state: STATES[:COMPLETED], return_value: output.to_json)
|
48
|
+
rescue => e
|
49
|
+
update!(state: STATES[:ERRORED], error_message: e.message)
|
50
|
+
raise e
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def set_initial_state
|
57
|
+
self.state ||= STATES[:STAGED]
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -49,12 +49,12 @@ module DelayHenka
|
|
49
49
|
def apply_change
|
50
50
|
if changeable
|
51
51
|
if changeable.update(attribute_name => new_value)
|
52
|
-
update(state: STATES[:COMPLETED])
|
52
|
+
update!(state: STATES[:COMPLETED])
|
53
53
|
else
|
54
|
-
update(state: STATES[:ERRORED], error_message: changeable.errors.full_messages.join(', '))
|
54
|
+
update!(state: STATES[:ERRORED], error_message: changeable.errors.full_messages.join(', '))
|
55
55
|
end
|
56
56
|
else
|
57
|
-
|
57
|
+
update_columns(state: STATES[:ERRORED], error_message: 'Target record cannot be found')
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
-# This partial is rendered by including application.
|
2
|
+
-# Required local variables:
|
3
|
+
-# * scheduled_actions
|
4
|
+
-# To render this partial:
|
5
|
+
-# = render 'delay_henka/web/admin/scheduled_actions/summary_table', scheduled_actions: @actions
|
6
|
+
|
7
|
+
%table.table.table-bordered.table-responsive
|
8
|
+
%thead
|
9
|
+
%tr
|
10
|
+
%th Action
|
11
|
+
%th Arguments
|
12
|
+
%th Schedule At
|
13
|
+
%th Action
|
14
|
+
%tbody
|
15
|
+
- scheduled_actions.each do |action|
|
16
|
+
%tr
|
17
|
+
%td= action.method_name
|
18
|
+
%td= action.argument
|
19
|
+
%td= action.schedule_at
|
20
|
+
%td= link_to 'Delete', delay_henka.web_admin_scheduled_action_path(action), method: :delete
|
@@ -0,0 +1,23 @@
|
|
1
|
+
%h1 Scheduled Actions
|
2
|
+
%table.table
|
3
|
+
%thead
|
4
|
+
%tr
|
5
|
+
%th Type
|
6
|
+
%th Id
|
7
|
+
%th Method
|
8
|
+
%th Argument
|
9
|
+
%th State
|
10
|
+
%th Return Value
|
11
|
+
%th Schedule At
|
12
|
+
%th Submitted By
|
13
|
+
%tbody
|
14
|
+
- @actions.each do |action|
|
15
|
+
%tr
|
16
|
+
%td= action.actionable_type
|
17
|
+
%td= action.actionable_id
|
18
|
+
%td= action.method_name
|
19
|
+
%td= action.argument
|
20
|
+
%td= action.state
|
21
|
+
%td= action.return_value
|
22
|
+
%td= action.schedule_at
|
23
|
+
%td= action.submitted_by_id
|
data/config/routes.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
class CreateDelayHenkaScheduledActions < ActiveRecord::Migration[5.2]
|
2
|
+
def change
|
3
|
+
create_table :delay_henka_scheduled_actions do |t|
|
4
|
+
t.references :actionable, polymorphic: true, null: false, index: { name: 'actionable_index' }
|
5
|
+
t.string :method_name, null: false
|
6
|
+
t.string :state, null: false, index: true
|
7
|
+
t.string :error_message
|
8
|
+
t.integer :submitted_by_id, null: false
|
9
|
+
t.datetime :schedule_at, index: true, null: false
|
10
|
+
t.jsonb :argument
|
11
|
+
t.jsonb :return_value
|
12
|
+
t.timestamps
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/delay_henka.rb
CHANGED
@@ -10,6 +10,11 @@ module DelayHenka
|
|
10
10
|
->{ staged.order('created_at DESC') },
|
11
11
|
class_name: 'DelayHenka::ScheduledChange',
|
12
12
|
as: :changeable
|
13
|
+
|
14
|
+
has_many :upcoming_actions,
|
15
|
+
->{ staged.order('created_at DESC') },
|
16
|
+
class_name: 'DelayHenka::ScheduledAction',
|
17
|
+
as: :actionable
|
13
18
|
end
|
14
19
|
end
|
15
20
|
|
data/lib/delay_henka/version.rb
CHANGED
metadata
CHANGED
@@ -1,57 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delay_henka
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- zino
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '5.2'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '5.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: haml
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 5
|
33
|
+
version: '5'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 5
|
40
|
+
version: '5'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: sidekiq
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 5
|
47
|
+
version: '5'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 5
|
54
|
+
version: '5'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: keka
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,18 +122,24 @@ files:
|
|
122
122
|
- app/assets/javascripts/delay_henka/application.js
|
123
123
|
- app/assets/stylesheets/delay_henka/application.css
|
124
124
|
- app/controllers/delay_henka/application_controller.rb
|
125
|
+
- app/controllers/delay_henka/web/admin/scheduled_actions_controller.rb
|
125
126
|
- app/controllers/delay_henka/web/admin/scheduled_changes_controller.rb
|
126
127
|
- app/helpers/delay_henka/application_helper.rb
|
127
128
|
- app/models/delay_henka/application_record.rb
|
129
|
+
- app/models/delay_henka/scheduled_action.rb
|
128
130
|
- app/models/delay_henka/scheduled_change.rb
|
129
131
|
- app/services/delay_henka/whether_schedule.rb
|
132
|
+
- app/views/delay_henka/web/admin/scheduled_actions/_summary_table.html.haml
|
133
|
+
- app/views/delay_henka/web/admin/scheduled_actions/index.html.haml
|
130
134
|
- app/views/delay_henka/web/admin/scheduled_changes/_summary_table.html.haml
|
131
135
|
- app/views/delay_henka/web/admin/scheduled_changes/index.html.haml
|
132
136
|
- app/views/layouts/delay_henka/application.html.erb
|
137
|
+
- app/workers/delay_henka/apply_actions_worker.rb
|
133
138
|
- app/workers/delay_henka/apply_changes_worker.rb
|
134
139
|
- config/routes.rb
|
135
140
|
- db/migrate/20181228205218_create_delay_henka_scheduled_changes.rb
|
136
141
|
- db/migrate/20190225140848_add_schedule_at.rb
|
142
|
+
- db/migrate/20190408130947_create_delay_henka_scheduled_actions.rb
|
137
143
|
- lib/delay_henka.rb
|
138
144
|
- lib/delay_henka/engine.rb
|
139
145
|
- lib/delay_henka/version.rb
|
@@ -157,8 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
157
163
|
- !ruby/object:Gem::Version
|
158
164
|
version: '0'
|
159
165
|
requirements: []
|
160
|
-
|
161
|
-
rubygems_version: 2.6.14
|
166
|
+
rubygems_version: 3.0.3
|
162
167
|
signing_key:
|
163
168
|
specification_version: 4
|
164
169
|
summary: Rails engine for scheduled changes
|