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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: cbdcde775e9289dbb082a616c1283ae3ff2f3f63
4
- data.tar.gz: 4a809b9c2f32a7048ce78a39eb215a4e9d25bff4
2
+ SHA256:
3
+ metadata.gz: e0c371d4bcae63640c6b5b2689d1340bf14654068a8e7eabd6085889ebd78d99
4
+ data.tar.gz: 0eada38daa2b68b70349ca3080809cdf590dc03bff10d2468c902dc229db3d23
5
5
  SHA512:
6
- metadata.gz: 7f4e5997974490a3b7b809adef7b9728e6a6cc5a8ddc05e4f84723a608a653d2b22d573d7a4dd4244dd6b4c820e0ef54f98b77025c483213f014ecf3a3c6561c
7
- data.tar.gz: 7a7fa29f2501a046e5bc85413b3f95d849ce0d0adefb0bfdbff56eddb07f8b642bdf26dbcdd3409c84d61991afd5b6f1138d93cff36dcee73b8b4a7360f28863
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
- update(state: STATES[:ERRORED], error_message: 'Target record cannot be found')
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
@@ -0,0 +1,14 @@
1
+ module DelayHenka
2
+ class ApplyActionsWorker
3
+
4
+ include Sidekiq::Worker
5
+
6
+ def perform
7
+ ScheduledAction.staged
8
+ .where('schedule_at <= ?', Time.current)
9
+ .includes(:actionable)
10
+ .find_each(&:apply_action)
11
+ end
12
+
13
+ end
14
+ end
@@ -1,6 +1,7 @@
1
1
  DelayHenka::Engine.routes.draw do
2
2
  namespace :web do
3
3
  namespace :admin do
4
+ resources :scheduled_actions, only: %i(index destroy)
4
5
  resources :scheduled_changes, only: %i(index destroy)
5
6
  end
6
7
  end
@@ -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
@@ -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
 
@@ -1,3 +1,3 @@
1
1
  module DelayHenka
2
- VERSION = '0.3.3'
2
+ VERSION = '0.5.3'
3
3
  end
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.3.3
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: 2019-03-31 00:00:00.000000000 Z
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.0.4
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.0.4
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.0.0
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.0.0
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
- rubyforge_project:
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