rails_workflow 0.3.9 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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