rails_workflow 0.3.9 → 0.4.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.
Files changed (161) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +2 -0
  3. data/app/concerns/rails_workflow/operation_status.rb +2 -0
  4. data/app/concerns/rails_workflow/operation_templates/assignments.rb +3 -1
  5. data/app/concerns/rails_workflow/operation_templates/dependencies.rb +18 -18
  6. data/app/concerns/rails_workflow/operations/assignments.rb +7 -5
  7. data/app/concerns/rails_workflow/operations/dependencies.rb +2 -0
  8. data/app/concerns/rails_workflow/status.rb +11 -15
  9. data/app/concerns/rails_workflow/user/assignment.rb +2 -0
  10. data/app/concerns/rails_workflow/uuid.rb +2 -0
  11. data/app/controllers/rails_workflow/application_controller.rb +2 -0
  12. data/app/controllers/rails_workflow/errors_controller.rb +2 -0
  13. data/app/controllers/rails_workflow/operation_templates_controller.rb +3 -1
  14. data/app/controllers/rails_workflow/operations_controller.rb +3 -1
  15. data/app/controllers/rails_workflow/process_templates_controller.rb +10 -8
  16. data/app/controllers/rails_workflow/processes_controller.rb +10 -8
  17. data/app/decorators/rails_workflow/context_decorator.rb +2 -0
  18. data/app/decorators/rails_workflow/decorator.rb +2 -0
  19. data/app/decorators/rails_workflow/operation_decorator.rb +2 -0
  20. data/app/decorators/rails_workflow/operation_helper_decorator.rb +2 -0
  21. data/app/decorators/rails_workflow/operation_template_decorator.rb +2 -0
  22. data/app/decorators/rails_workflow/paginating_decorator.rb +2 -0
  23. data/app/decorators/rails_workflow/process_decorator.rb +2 -0
  24. data/app/decorators/rails_workflow/process_template_decorator.rb +2 -0
  25. data/app/decorators/rails_workflow/status_decorator.rb +2 -0
  26. data/app/helpers/rails_workflow/application_helper.rb +2 -0
  27. data/app/jobs/rails_workflow/operation_execution_job.rb +11 -1
  28. data/app/models/rails_workflow/context.rb +3 -1
  29. data/app/models/rails_workflow/error.rb +23 -50
  30. data/app/models/rails_workflow/operation.rb +39 -3
  31. data/app/models/rails_workflow/operation_template.rb +2 -2
  32. data/app/models/rails_workflow/process.rb +34 -5
  33. data/app/models/rails_workflow/process_template.rb +12 -8
  34. data/app/models/rails_workflow/user_by_group_operation.rb +2 -0
  35. data/app/models/rails_workflow/user_by_role_operation.rb +2 -0
  36. data/app/models/rails_workflow/user_operation.rb +2 -0
  37. data/app/serializers/rails_workflow/operation_template_serializer.rb +2 -0
  38. data/app/serializers/rails_workflow/process_template_serializer.rb +2 -0
  39. data/app/services/rails_workflow/default_importer_preprocessor.rb +2 -0
  40. data/app/services/rails_workflow/process_importer.rb +2 -0
  41. data/app/views/rails_workflow/processes/index.html.slim +5 -5
  42. data/config/initializers/rails_workflow.rb +3 -3
  43. data/config/routes.rb +4 -2
  44. data/db/migrate/20150630174700_create_workflow_processes.rb +86 -84
  45. data/lib/generators/rails_workflow/install/install_generator.rb +2 -0
  46. data/lib/generators/rails_workflow/install/templates/create_workflow_processes.rb +86 -84
  47. data/lib/rails_workflow/config.rb +65 -24
  48. data/lib/rails_workflow/db/mysql.rb +3 -1
  49. data/lib/rails_workflow/db/pg.rb +3 -1
  50. data/lib/rails_workflow/dependency_resolver.rb +74 -0
  51. data/lib/rails_workflow/engine.rb +3 -1
  52. data/lib/rails_workflow/error_builder.rb +57 -0
  53. data/lib/rails_workflow/error_resolver.rb +72 -0
  54. data/lib/rails_workflow/operation_builder.rb +95 -0
  55. data/lib/rails_workflow/operation_runner.rb +113 -0
  56. data/lib/rails_workflow/process_builder.rb +57 -0
  57. data/lib/rails_workflow/process_manager.rb +66 -0
  58. data/lib/rails_workflow/process_runner.rb +72 -0
  59. data/lib/rails_workflow/version.rb +3 -1
  60. data/lib/rails_workflow.rb +2 -0
  61. data/lib/tasks/rails_workflow_tasks.rake +1 -0
  62. data/spec/concerns/status_spec.rb +25 -0
  63. data/spec/controllers/rails_workflow/operation_templates_controller_spec.rb +2 -0
  64. data/spec/controllers/rails_workflow/operations_controller_spec.rb +2 -0
  65. data/spec/controllers/rails_workflow/process_templates_controller_spec.rb +2 -0
  66. data/spec/controllers/rails_workflow/processes_controller_spec.rb +3 -1
  67. data/spec/dummy/Rakefile +2 -0
  68. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  69. data/spec/dummy/app/controllers/leads_controller.rb +2 -0
  70. data/spec/dummy/app/controllers/sales_contacts_controller.rb +2 -0
  71. data/spec/dummy/app/decorators/lead_decorator.rb +2 -0
  72. data/spec/dummy/app/decorators/sales_contact_decorator.rb +2 -0
  73. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  74. data/spec/dummy/app/helpers/leads_helper.rb +2 -0
  75. data/spec/dummy/app/helpers/sales_contacts_helper.rb +2 -0
  76. data/spec/dummy/app/models/bad_operation.rb +2 -0
  77. data/spec/dummy/app/models/bad_operation_template.rb +2 -0
  78. data/spec/dummy/app/models/lead.rb +2 -0
  79. data/spec/dummy/app/models/sales_contact.rb +2 -0
  80. data/spec/dummy/app/models/user.rb +2 -0
  81. data/spec/dummy/bin/bundle +2 -0
  82. data/spec/dummy/bin/rails +2 -0
  83. data/spec/dummy/bin/rake +2 -0
  84. data/spec/dummy/config/application.rb +2 -0
  85. data/spec/dummy/config/boot.rb +2 -0
  86. data/spec/dummy/config/database.yml.semaphore +2 -2
  87. data/spec/dummy/config/environment.rb +2 -0
  88. data/spec/dummy/config/environments/development.rb +2 -0
  89. data/spec/dummy/config/environments/production.rb +2 -0
  90. data/spec/dummy/config/environments/test.rb +2 -0
  91. data/spec/dummy/config/initializers/assets.rb +2 -0
  92. data/spec/dummy/config/initializers/backtrace_silencers.rb +1 -0
  93. data/spec/dummy/config/initializers/cookies_serializer.rb +2 -0
  94. data/spec/dummy/config/initializers/devise.rb +2 -0
  95. data/spec/dummy/config/initializers/filter_parameter_logging.rb +2 -0
  96. data/spec/dummy/config/initializers/inflections.rb +1 -0
  97. data/spec/dummy/config/initializers/mime_types.rb +1 -0
  98. data/spec/dummy/config/initializers/session_store.rb +2 -0
  99. data/spec/dummy/config/initializers/workflow.rb +2 -0
  100. data/spec/dummy/config/initializers/wrap_parameters.rb +2 -0
  101. data/spec/dummy/config/routes.rb +2 -0
  102. data/spec/dummy/config.ru +2 -0
  103. data/spec/dummy/db/migrate/20150127171613_devise_create_users.rb +2 -0
  104. data/spec/dummy/db/migrate/20150130042852_create_sales_contacts.rb +2 -0
  105. data/spec/dummy/db/migrate/20150130043008_create_leads.rb +2 -0
  106. data/spec/dummy/log/development.log +110 -0
  107. data/spec/dummy/log/test.log +0 -0
  108. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7O/7O5OddMZvWFGpj71BCdc0vA55rhj4YPoL0XjBV4_OYk.cache +1 -0
  109. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Cy/CyixQwp8QvorgpRadtYf6_zY35nZZp0JmrhkDN16XPM.cache +1 -0
  110. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/FW/FWR5Q7EP17cTcY35R1MscF6MX2HYiH5I2ZII89YLYxc.cache +1 -0
  111. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HQ/HQuQO1k4kOyLSDXJEc8p-XR2agdkPF7mIFyh2noiNrU.cache +1 -0
  112. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/N4/N4e3G5QNTts2OVqkL0kxoP1xnAdDWnumpnH1m6WAsuY.cache +0 -0
  113. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Rs/RsIG_ias53xeb4WHWRodcMcDmVyz1QvLQNy4gV2iBSo.cache +1 -0
  114. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/WI/WI2XYMfwCaPWcjvvouKVltl9oKqKZL-BHePPLhC-rzw.cache +1 -0
  115. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Yc/YcbQRZWzddLfawePxNTEXcFFiS7asAyrujZzciT99l0.cache +1 -0
  116. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ai/aihcJWCIJGiHDpamul8bzy4jMsxnhewX6XWtkdsQ9dc.cache +1 -0
  117. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fR/fRVQN4mU7z3MVJD9u1LMq8idpOH8o2tFh_YouMYGAM8.cache +1 -0
  118. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gU/gUFNMb7SgxFyz5ZZcGfp-VYRVIw711HUeiWonMzYrcU.cache +1 -0
  119. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/h8/h86FNb4MxO5dq40P8KcCgGwZ_uqd8nn_O2fMWGDApW8.cache +1 -0
  120. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/q7/q7cZDJXZFXTklMF8JAQSMr-MBxOKc7q1vZAPPR5RBf4.cache +2 -0
  121. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/s9/s98GbJDqEe4PG3moRH6h-ukIZmQz9Frq4LO_Z9vCBLM.cache +1 -0
  122. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xX/xXCd205lXu7u_BuyBL0kfZwkBGJLvocHDItBfU6tMm4.cache +2 -0
  123. data/spec/factories/context.rb +2 -0
  124. data/spec/factories/operation_templates.rb +2 -0
  125. data/spec/factories/operations.rb +3 -1
  126. data/spec/factories/process_templates.rb +2 -0
  127. data/spec/factories/processes.rb +3 -1
  128. data/spec/factories/user.rb +2 -0
  129. data/spec/factories/workflow_errors.rb +2 -0
  130. data/spec/features/operations_spec.rb +2 -0
  131. data/spec/features/process_template_spec.rb +2 -0
  132. data/spec/lib/error_builder_spec.rb +137 -0
  133. data/spec/lib/error_resolver_spec.rb +182 -0
  134. data/spec/lib/operation_builder_spec.rb +69 -0
  135. data/spec/lib/process_builder_spec.rb +19 -0
  136. data/spec/{core/rails_workflow → lib}/process_manager_spec.rb +17 -27
  137. data/spec/models/rails_workflow/context_spec.rb +6 -3
  138. data/spec/models/rails_workflow/error_spec.rb +20 -147
  139. data/spec/models/rails_workflow/operation_spec.rb +64 -97
  140. data/spec/models/rails_workflow/operation_template_spec.rb +24 -11
  141. data/spec/models/rails_workflow/process_spec.rb +5 -2
  142. data/spec/models/rails_workflow/process_template_spec.rb +2 -36
  143. data/spec/rails_helper.rb +2 -0
  144. data/spec/serializers/process_template_serializer_spec.rb +2 -0
  145. data/spec/services/process_importer_spec.rb +2 -0
  146. data/spec/spec_helper.rb +2 -0
  147. data/spec/support/controller_macros.rb +2 -0
  148. data/spec/support/pages/operations.rb +2 -0
  149. data/spec/support/rails_workflow/custom_operation.rb +2 -0
  150. data/spec/support/rails_workflow/custom_operation_template.rb +2 -0
  151. data/spec/{core → support}/rails_workflow/prepare_template.rb +3 -1
  152. data/spec/support/workflow_helper.rb +2 -0
  153. metadata +54 -28
  154. data/app/concerns/rails_workflow/operation_templates/default_builder.rb +0 -56
  155. data/app/concerns/rails_workflow/operations/default_runner.rb +0 -121
  156. data/app/concerns/rails_workflow/process_templates/default_builder.rb +0 -52
  157. data/app/concerns/rails_workflow/processes/default_runner.rb +0 -64
  158. data/app/concerns/rails_workflow/processes/dependency_resolver.rb +0 -54
  159. data/app/concerns/rails_workflow/reset_cache.rb +0 -13
  160. data/app/jobs/rails_workflow/operation_error_job.rb +0 -40
  161. data/app/managers/rails_workflow/process_manager.rb +0 -40
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 55fcad55bd2c2781da1a5af94e1bc0d4ebe57b9d
4
- data.tar.gz: 562678cf4dd8eb9d71061d4148e0e1036ce4d5de
3
+ metadata.gz: c07990497523e329c81feb05d053eb3954244513
4
+ data.tar.gz: 4a0ff979e6fa4d83a589ac544594949b6148f9b3
5
5
  SHA512:
6
- metadata.gz: 8ab16df3b4cbf71908f5772f2d8e66a8b3a4967e82b443cde4fac6ee6a07ce63f44a859095fb5062de5dcad2046523c5d3816e3697ffba243f526a647d84af97
7
- data.tar.gz: 399aad732c6156c502327ed1cd0a31fbb0200728d61174a88c195ac63d4c2bd93d27811fcfbdabdfaae65a2af17319cc604365be01b089d00796f68997fc638b
6
+ metadata.gz: e9b13eb3223068b3db3fbbad1a2f1a42fb33f9af89f1eb9809911bb1b4b284188c6ae5b36b8e95a4c3043a8a36e365861a7d586d5754c7738513fd13226f35df
7
+ data.tar.gz: 3adbc1f3b1a9547aa6dc43e085e42800433ff148115f252499d1966af8088387a2cf3ff18d70514eba45e0499786070ed2f25f2883af305ebb68224f46ff11f0
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  begin
2
4
  require 'bundler/setup'
3
5
  rescue LoadError
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support/concern'
2
4
 
3
5
  module RailsWorkflow
@@ -1,4 +1,6 @@
1
1
 
2
+ # frozen_string_literal: true
3
+
2
4
  module RailsWorkflow
3
5
  module OperationTemplates
4
6
  module Assignments
@@ -6,7 +8,7 @@ module RailsWorkflow
6
8
 
7
9
  included do
8
10
  belongs_to :assignment, polymorphic: true
9
- scope :for_user, -> (user) {
11
+ scope :for_user, ->(user) {
10
12
  keys = RailsWorkflow.config.assignment_by.select { |k| user.respond_to? k }
11
13
 
12
14
  assignment_condition = keys.map do |key|
@@ -1,34 +1,34 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support/concern'
2
4
 
3
5
  module RailsWorkflow
4
6
  module OperationTemplates
5
- # = Workflow::ProcessTemplate::Dependenceis
6
- #
7
- # Operation dependencies is a set of conditions. Operation can be build if all that
8
- # dependenceis / conditions are satisfied. This is default implementation of dependenceis
9
- # which used to build operation dependency on other operations. You can customize dependency
10
- # for example you can add some additional logic depending on existiong processes / operations
11
- # or other conditions in your system.
12
- #
13
-
7
+ # Dependencies defines which operations in which states should be.
14
8
  module Dependencies
15
9
  extend ActiveSupport::Concern
16
10
 
17
11
  included do
18
12
  serialize :dependencies, JSON
13
+ scope :independent_only, lambda {
14
+ where(
15
+ "dependencies is null or dependencies = 'null' or dependencies='[]'"
16
+ )
17
+ }
19
18
 
20
- def independent?
21
- dependencies.nil? || dependencies.empty? || dependencies == 'null'
22
- end
23
-
24
- def resolve_dependency(_operation)
19
+ # When some operation changes its status engine tries to
20
+ # resolve dependencies to understand if a new operation
21
+ # should be created.
22
+ # For example, if operation A depends on B (DONE) and C (DONE),
23
+ # by default it will be created if any of B or C changed status
24
+ # to DONE.
25
+ # Overwriting this method on some specific operation template
26
+ # allows you to modify this logic - for example, to build
27
+ # dependency B (DONE) AND C(DONE) etc.
28
+ def resolve_dependency(_completed_operation)
25
29
  true
26
30
  end
27
31
 
28
- # def dependencies=(dependencies)
29
- # write_attribute(:dependencies, dependencies.to_json.to_s)
30
- # end
31
- #
32
32
  def dependencies
33
33
  read_attribute(:dependencies) || []
34
34
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  module Operations
3
5
  module Assignments
@@ -6,22 +8,22 @@ module RailsWorkflow
6
8
  included do
7
9
  belongs_to :assignment, polymorphic: true
8
10
 
9
- scope :by_role, -> (role) { joins(:template).where(rails_workflow_operation_templates: { role: role }) }
10
- scope :by_group, -> (group) { joins(:template).where(rails_workflow_operation_templates: { group: group }) }
11
+ scope :by_role, ->(role) { joins(:template).where(rails_workflow_operation_templates: { role: role }) }
12
+ scope :by_group, ->(group) { joins(:template).where(rails_workflow_operation_templates: { group: group }) }
11
13
  scope :unassigned, -> { where(assignment_id: nil) }
12
14
 
13
15
  scope :waiting, -> { where(status: Operation.user_ready_statuses) }
14
16
 
15
- scope :available_for_user, -> (user) {
17
+ scope :available_for_user, ->(user) {
16
18
  waiting.unassigned.joins(:template)
17
19
  .merge(OperationTemplate.for_user(user))
18
20
  }
19
21
 
20
- scope :by_role_or_group, -> (role, group) do
22
+ scope :by_role_or_group, ->(role, group) do
21
23
  joins(:template).by_role_or_group(role, group)
22
24
  end
23
25
 
24
- scope :assigned_to, -> (user) {
26
+ scope :assigned_to, ->(user) {
25
27
  where(assignment_id: user.id, assignment_type: user.class.to_s)
26
28
  }
27
29
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support/concern'
2
4
 
3
5
  module RailsWorkflow
@@ -1,6 +1,7 @@
1
- require 'active_support/concern'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module RailsWorkflow
4
+ # Describes process and operation statuses
4
5
  module Status
5
6
  extend ActiveSupport::Concern
6
7
 
@@ -18,24 +19,19 @@ module RailsWorkflow
18
19
  (NOT_STARTED..ROLLBACK).to_a
19
20
  end
20
21
 
21
- def get_status_code(status)
22
- case status
23
- when 'in_progress'
24
- IN_PROGRESS
25
- when 'done'
26
- DONE
27
- when 'not_started'
28
- NOT_STARTED
29
- when 'waiting'
30
- WAITING
31
- when 'error'
32
- ERROR
33
- end
22
+ def status_code_for(status)
23
+ [
24
+ ['in_progress', IN_PROGRESS],
25
+ ['done', DONE],
26
+ ['not_started', NOT_STARTED],
27
+ ['waiting', WAITING],
28
+ ['error', ERROR]
29
+ ].assoc(status).last
34
30
  end
35
31
  end
36
32
 
37
33
  included do
38
- def incomplete_statuses
34
+ def uncompleted_statuses
39
35
  [NOT_STARTED, IN_PROGRESS, WAITING]
40
36
  end
41
37
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  module User
3
5
  module Assignment
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow::Uuid
2
4
  extend ActiveSupport::Concern
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  class ApplicationController < ::ApplicationController
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  class ErrorsController < ApplicationController
3
5
  def retry
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  class OperationTemplatesController < ApplicationController
3
5
  layout 'rails_workflow/application'
4
- before_action :set_operation_template, only: [:show, :edit, :update, :destroy]
6
+ before_action :set_operation_template, only: %i[show edit update destroy]
5
7
  before_action :set_process_template
6
8
  respond_to :html
7
9
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  # Operations controller. Allows to pickup (start),
3
5
  # skip, postpone, cancel, complete operations.
@@ -6,7 +8,7 @@ module RailsWorkflow
6
8
  respond_to :html
7
9
 
8
10
  before_action :set_operation,
9
- only: [:show, :edit, :pickup, :continue, :update, :destroy]
11
+ only: %i[show edit pickup continue update destroy]
10
12
 
11
13
  before_filter do
12
14
  if @process.present?
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  class ProcessTemplatesController < ApplicationController
3
5
  layout 'rails_workflow/application'
4
6
  respond_to :html, :json
5
7
 
6
- before_action :set_process_template, only: [:show, :edit, :update, :destroy]
8
+ before_action :set_process_template, only: %i[show edit update destroy]
7
9
 
8
10
  before_filter do
9
11
  @config_section_active = true
@@ -56,13 +58,13 @@ module RailsWorkflow
56
58
 
57
59
  def permitted_params
58
60
  params.permit(
59
- process_template: [
60
- :title,
61
- :source,
62
- :manager_class,
63
- :partial_name,
64
- :process_class,
65
- :type
61
+ process_template: %i[
62
+ title
63
+ source
64
+ manager_class
65
+ partial_name
66
+ process_class
67
+ type
66
68
  ]
67
69
  )[:process_template]
68
70
  end
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  class ProcessesController < ApplicationController
3
5
  layout 'rails_workflow/application'
4
6
  respond_to :html
5
- before_action :set_process, only: [:show, :edit, :update, :destroy]
7
+ before_action :set_process, only: %i[show edit update destroy]
6
8
 
7
9
  before_filter do
8
10
  @processes_section_active = true
@@ -17,7 +19,7 @@ module RailsWorkflow
17
19
 
18
20
  @open_user_operations = OperationDecorator
19
21
  .decorate_collection(
20
- RailsWorkflow::Operation.incompleted
22
+ RailsWorkflow::Operation.uncompleted
21
23
  .unassigned.includes(:template)
22
24
  .limit(20)
23
25
  )
@@ -54,11 +56,11 @@ module RailsWorkflow
54
56
 
55
57
  def permitted_params
56
58
  params.permit(
57
- process: [
58
- :status,
59
- :async,
60
- :title,
61
- :template_id
59
+ process: %i[
60
+ status
61
+ async
62
+ title
63
+ template_id
62
64
  ],
63
65
  filter: [:status]
64
66
  )[:process]
@@ -68,7 +70,7 @@ module RailsWorkflow
68
70
  collection_scope = Process.default_scoped
69
71
 
70
72
  if params[:filter]
71
- status = Process.get_status_code(params[:filter]['status'])
73
+ status = Process.status_code_for(params[:filter]['status'])
72
74
  collection_scope = collection_scope.by_status(status)
73
75
  end
74
76
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  class ContextDecorator < Draper::Decorator
3
5
  def partial_name
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  class Decorator < Draper::Decorator
3
5
  def self.collection_decorator_class
@@ -1,4 +1,6 @@
1
1
 
2
+ # frozen_string_literal: true
3
+
2
4
  module RailsWorkflow
3
5
  class OperationDecorator < OperationHelperDecorator
4
6
  delegate_all
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  class OperationHelperDecorator < Decorator
3
5
  include StatusDecorator
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  class OperationTemplateDecorator < Decorator
3
5
  delegate_all
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  class PaginatingDecorator < Draper::CollectionDecorator
3
5
  delegate :current_page, :per_page, :offset, :total_entries, :total_pages
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  class ProcessDecorator < Decorator
3
5
  include StatusDecorator
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  class ProcessTemplateDecorator < Decorator
3
5
  delegate_all
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  module StatusDecorator
3
5
  extend ActiveSupport::Concern
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  module ApplicationHelper
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  # Rails workflow operation can run in background
3
5
  # (if is_background = true). This job is responsible
@@ -9,7 +11,15 @@ module RailsWorkflow
9
11
  operation_id = args[0]
10
12
 
11
13
  operation = Operation.find operation_id
12
- operation.execute_in_transaction
14
+ operation_runner.new(operation).execute_in_transaction
15
+ end
16
+
17
+ def config
18
+ RailsWorkflow.config
19
+ end
20
+
21
+ def operation_runner
22
+ config.operation_runner
13
23
  end
14
24
  end
15
25
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  class Context < ActiveRecord::Base
3
5
  belongs_to :parent, polymorphic: true
@@ -23,7 +25,7 @@ module RailsWorkflow
23
25
  end
24
26
  elsif body.is_a? Hash
25
27
 
26
- if body.keys == %w(id class)
28
+ if body.keys == %w[id class]
27
29
  body['class'].constantize.find(body['id'])
28
30
  else
29
31
  res = {}
@@ -1,70 +1,43 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
4
+ # Stores error information
2
5
  class Error < ActiveRecord::Base
3
6
  belongs_to :parent, polymorphic: true
4
7
  has_one :context, class_name: 'RailsWorkflow::Context', as: :parent
5
8
  scope :unresolved, -> { where('resolved is null or resolved = false') }
6
9
 
7
10
  delegate :data, to: :context
11
+ delegate :retry, to: :error_resolver
8
12
 
9
- def retry
10
- update_attribute(:resolved, true)
11
-
12
- target = data[:target]
13
- method = data[:method]
14
- args = data[:args]
15
-
16
- target.send(method, *args)
17
-
18
- operation = parent if parent.is_a? RailsWorkflow::Operation
19
-
20
- process = if operation
21
- operation.process
22
- elsif target.is_a? RailsWorkflow::Process
23
- target
24
- elsif parent.is_a? RailsWorkflow::Process
25
- parent
26
- end
27
-
28
- if operation.present?
29
- operation.reload
30
- if operation.status == RailsWorkflow::Operation::ERROR
31
- operation.update_attribute(
32
- :status,
33
- RailsWorkflow::Operation::NOT_STARTED
34
- )
35
- end
36
- end
37
-
38
- if process.present? && can_restart_process(process)
39
- process.update_attribute(:status, RailsWorkflow::Process::IN_PROGRESS)
40
- process.start
41
- end
13
+ def can_restart_process?
14
+ process.unresolved_errors.count.zero?
42
15
  end
43
16
 
44
- def can_restart_process(process)
45
- process.workflow_errors
46
- .unresolved.where.not(id: id).count.zero?
17
+ def target
18
+ data[:target]
47
19
  end
48
20
 
49
- def self.create_from(exception, context)
50
- parent = context[:parent]
21
+ def operation
22
+ parent if parent.is_a? RailsWorkflow::Operation
23
+ end
51
24
 
52
- if parent.is_a? RailsWorkflow::Operation
53
- correct_parent = parent.becomes(RailsWorkflow::Operation)
25
+ def process
26
+ if operation
27
+ operation.process
28
+ elsif target.is_a? RailsWorkflow::Process
29
+ target
54
30
  elsif parent.is_a? RailsWorkflow::Process
55
- correct_parent = parent.becomes(RailsWorkflow::Process)
31
+ parent
56
32
  end
33
+ end
57
34
 
58
- error = RailsWorkflow::Error.create(
59
- parent_id: parent.id,
60
- parent_type: (correct_parent || parent).class.to_s,
61
- message: exception.message.first(250),
62
- stack_trace: exception.backtrace.join("<br/>\n")
63
- )
64
-
65
- error.create_context(data: context)
35
+ def config
36
+ RailsWorkflow.config
37
+ end
66
38
 
67
- RailsWorkflow::OperationErrorJob.new.perform(parent.id, parent.class.to_s)
39
+ def error_resolver
40
+ @error_resolver ||= config.error_resolver.new(self)
68
41
  end
69
42
  end
70
43
  end