delay_henka 0.3.3 → 0.5.3

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
- 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