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.
- checksums.yaml +4 -4
- data/Rakefile +2 -0
- data/app/concerns/rails_workflow/operation_status.rb +2 -0
- data/app/concerns/rails_workflow/operation_templates/assignments.rb +3 -1
- data/app/concerns/rails_workflow/operation_templates/dependencies.rb +18 -18
- data/app/concerns/rails_workflow/operations/assignments.rb +7 -5
- data/app/concerns/rails_workflow/operations/dependencies.rb +2 -0
- data/app/concerns/rails_workflow/status.rb +11 -15
- data/app/concerns/rails_workflow/user/assignment.rb +2 -0
- data/app/concerns/rails_workflow/uuid.rb +2 -0
- data/app/controllers/rails_workflow/application_controller.rb +2 -0
- data/app/controllers/rails_workflow/errors_controller.rb +2 -0
- data/app/controllers/rails_workflow/operation_templates_controller.rb +3 -1
- data/app/controllers/rails_workflow/operations_controller.rb +3 -1
- data/app/controllers/rails_workflow/process_templates_controller.rb +10 -8
- data/app/controllers/rails_workflow/processes_controller.rb +10 -8
- data/app/decorators/rails_workflow/context_decorator.rb +2 -0
- data/app/decorators/rails_workflow/decorator.rb +2 -0
- data/app/decorators/rails_workflow/operation_decorator.rb +2 -0
- data/app/decorators/rails_workflow/operation_helper_decorator.rb +2 -0
- data/app/decorators/rails_workflow/operation_template_decorator.rb +2 -0
- data/app/decorators/rails_workflow/paginating_decorator.rb +2 -0
- data/app/decorators/rails_workflow/process_decorator.rb +2 -0
- data/app/decorators/rails_workflow/process_template_decorator.rb +2 -0
- data/app/decorators/rails_workflow/status_decorator.rb +2 -0
- data/app/helpers/rails_workflow/application_helper.rb +2 -0
- data/app/jobs/rails_workflow/operation_execution_job.rb +11 -1
- data/app/models/rails_workflow/context.rb +3 -1
- data/app/models/rails_workflow/error.rb +23 -50
- data/app/models/rails_workflow/operation.rb +39 -3
- data/app/models/rails_workflow/operation_template.rb +2 -2
- data/app/models/rails_workflow/process.rb +34 -5
- data/app/models/rails_workflow/process_template.rb +12 -8
- data/app/models/rails_workflow/user_by_group_operation.rb +2 -0
- data/app/models/rails_workflow/user_by_role_operation.rb +2 -0
- data/app/models/rails_workflow/user_operation.rb +2 -0
- data/app/serializers/rails_workflow/operation_template_serializer.rb +2 -0
- data/app/serializers/rails_workflow/process_template_serializer.rb +2 -0
- data/app/services/rails_workflow/default_importer_preprocessor.rb +2 -0
- data/app/services/rails_workflow/process_importer.rb +2 -0
- data/app/views/rails_workflow/processes/index.html.slim +5 -5
- data/config/initializers/rails_workflow.rb +3 -3
- data/config/routes.rb +4 -2
- data/db/migrate/20150630174700_create_workflow_processes.rb +86 -84
- data/lib/generators/rails_workflow/install/install_generator.rb +2 -0
- data/lib/generators/rails_workflow/install/templates/create_workflow_processes.rb +86 -84
- data/lib/rails_workflow/config.rb +65 -24
- data/lib/rails_workflow/db/mysql.rb +3 -1
- data/lib/rails_workflow/db/pg.rb +3 -1
- data/lib/rails_workflow/dependency_resolver.rb +74 -0
- data/lib/rails_workflow/engine.rb +3 -1
- data/lib/rails_workflow/error_builder.rb +57 -0
- data/lib/rails_workflow/error_resolver.rb +72 -0
- data/lib/rails_workflow/operation_builder.rb +95 -0
- data/lib/rails_workflow/operation_runner.rb +113 -0
- data/lib/rails_workflow/process_builder.rb +57 -0
- data/lib/rails_workflow/process_manager.rb +66 -0
- data/lib/rails_workflow/process_runner.rb +72 -0
- data/lib/rails_workflow/version.rb +3 -1
- data/lib/rails_workflow.rb +2 -0
- data/lib/tasks/rails_workflow_tasks.rake +1 -0
- data/spec/concerns/status_spec.rb +25 -0
- data/spec/controllers/rails_workflow/operation_templates_controller_spec.rb +2 -0
- data/spec/controllers/rails_workflow/operations_controller_spec.rb +2 -0
- data/spec/controllers/rails_workflow/process_templates_controller_spec.rb +2 -0
- data/spec/controllers/rails_workflow/processes_controller_spec.rb +3 -1
- data/spec/dummy/Rakefile +2 -0
- data/spec/dummy/app/controllers/application_controller.rb +2 -0
- data/spec/dummy/app/controllers/leads_controller.rb +2 -0
- data/spec/dummy/app/controllers/sales_contacts_controller.rb +2 -0
- data/spec/dummy/app/decorators/lead_decorator.rb +2 -0
- data/spec/dummy/app/decorators/sales_contact_decorator.rb +2 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/helpers/leads_helper.rb +2 -0
- data/spec/dummy/app/helpers/sales_contacts_helper.rb +2 -0
- data/spec/dummy/app/models/bad_operation.rb +2 -0
- data/spec/dummy/app/models/bad_operation_template.rb +2 -0
- data/spec/dummy/app/models/lead.rb +2 -0
- data/spec/dummy/app/models/sales_contact.rb +2 -0
- data/spec/dummy/app/models/user.rb +2 -0
- data/spec/dummy/bin/bundle +2 -0
- data/spec/dummy/bin/rails +2 -0
- data/spec/dummy/bin/rake +2 -0
- data/spec/dummy/config/application.rb +2 -0
- data/spec/dummy/config/boot.rb +2 -0
- data/spec/dummy/config/database.yml.semaphore +2 -2
- data/spec/dummy/config/environment.rb +2 -0
- data/spec/dummy/config/environments/development.rb +2 -0
- data/spec/dummy/config/environments/production.rb +2 -0
- data/spec/dummy/config/environments/test.rb +2 -0
- data/spec/dummy/config/initializers/assets.rb +2 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +1 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +2 -0
- data/spec/dummy/config/initializers/devise.rb +2 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +2 -0
- data/spec/dummy/config/initializers/inflections.rb +1 -0
- data/spec/dummy/config/initializers/mime_types.rb +1 -0
- data/spec/dummy/config/initializers/session_store.rb +2 -0
- data/spec/dummy/config/initializers/workflow.rb +2 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +2 -0
- data/spec/dummy/config/routes.rb +2 -0
- data/spec/dummy/config.ru +2 -0
- data/spec/dummy/db/migrate/20150127171613_devise_create_users.rb +2 -0
- data/spec/dummy/db/migrate/20150130042852_create_sales_contacts.rb +2 -0
- data/spec/dummy/db/migrate/20150130043008_create_leads.rb +2 -0
- data/spec/dummy/log/development.log +110 -0
- data/spec/dummy/log/test.log +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7O/7O5OddMZvWFGpj71BCdc0vA55rhj4YPoL0XjBV4_OYk.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Cy/CyixQwp8QvorgpRadtYf6_zY35nZZp0JmrhkDN16XPM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/FW/FWR5Q7EP17cTcY35R1MscF6MX2HYiH5I2ZII89YLYxc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HQ/HQuQO1k4kOyLSDXJEc8p-XR2agdkPF7mIFyh2noiNrU.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/N4/N4e3G5QNTts2OVqkL0kxoP1xnAdDWnumpnH1m6WAsuY.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Rs/RsIG_ias53xeb4WHWRodcMcDmVyz1QvLQNy4gV2iBSo.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/WI/WI2XYMfwCaPWcjvvouKVltl9oKqKZL-BHePPLhC-rzw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Yc/YcbQRZWzddLfawePxNTEXcFFiS7asAyrujZzciT99l0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ai/aihcJWCIJGiHDpamul8bzy4jMsxnhewX6XWtkdsQ9dc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fR/fRVQN4mU7z3MVJD9u1LMq8idpOH8o2tFh_YouMYGAM8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gU/gUFNMb7SgxFyz5ZZcGfp-VYRVIw711HUeiWonMzYrcU.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/h8/h86FNb4MxO5dq40P8KcCgGwZ_uqd8nn_O2fMWGDApW8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/q7/q7cZDJXZFXTklMF8JAQSMr-MBxOKc7q1vZAPPR5RBf4.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/s9/s98GbJDqEe4PG3moRH6h-ukIZmQz9Frq4LO_Z9vCBLM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xX/xXCd205lXu7u_BuyBL0kfZwkBGJLvocHDItBfU6tMm4.cache +2 -0
- data/spec/factories/context.rb +2 -0
- data/spec/factories/operation_templates.rb +2 -0
- data/spec/factories/operations.rb +3 -1
- data/spec/factories/process_templates.rb +2 -0
- data/spec/factories/processes.rb +3 -1
- data/spec/factories/user.rb +2 -0
- data/spec/factories/workflow_errors.rb +2 -0
- data/spec/features/operations_spec.rb +2 -0
- data/spec/features/process_template_spec.rb +2 -0
- data/spec/lib/error_builder_spec.rb +137 -0
- data/spec/lib/error_resolver_spec.rb +182 -0
- data/spec/lib/operation_builder_spec.rb +69 -0
- data/spec/lib/process_builder_spec.rb +19 -0
- data/spec/{core/rails_workflow → lib}/process_manager_spec.rb +17 -27
- data/spec/models/rails_workflow/context_spec.rb +6 -3
- data/spec/models/rails_workflow/error_spec.rb +20 -147
- data/spec/models/rails_workflow/operation_spec.rb +64 -97
- data/spec/models/rails_workflow/operation_template_spec.rb +24 -11
- data/spec/models/rails_workflow/process_spec.rb +5 -2
- data/spec/models/rails_workflow/process_template_spec.rb +2 -36
- data/spec/rails_helper.rb +2 -0
- data/spec/serializers/process_template_serializer_spec.rb +2 -0
- data/spec/services/process_importer_spec.rb +2 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/support/controller_macros.rb +2 -0
- data/spec/support/pages/operations.rb +2 -0
- data/spec/support/rails_workflow/custom_operation.rb +2 -0
- data/spec/support/rails_workflow/custom_operation_template.rb +2 -0
- data/spec/{core → support}/rails_workflow/prepare_template.rb +3 -1
- data/spec/support/workflow_helper.rb +2 -0
- metadata +54 -28
- data/app/concerns/rails_workflow/operation_templates/default_builder.rb +0 -56
- data/app/concerns/rails_workflow/operations/default_runner.rb +0 -121
- data/app/concerns/rails_workflow/process_templates/default_builder.rb +0 -52
- data/app/concerns/rails_workflow/processes/default_runner.rb +0 -64
- data/app/concerns/rails_workflow/processes/dependency_resolver.rb +0 -54
- data/app/concerns/rails_workflow/reset_cache.rb +0 -13
- data/app/jobs/rails_workflow/operation_error_job.rb +0 -40
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c07990497523e329c81feb05d053eb3954244513
|
4
|
+
data.tar.gz: 4a0ff979e6fa4d83a589ac544594949b6148f9b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9b13eb3223068b3db3fbbad1a2f1a42fb33f9af89f1eb9809911bb1b4b284188c6ae5b36b8e95a4c3043a8a36e365861a7d586d5754c7738513fd13226f35df
|
7
|
+
data.tar.gz: 3adbc1f3b1a9547aa6dc43e085e42800433ff148115f252499d1966af8088387a2cf3ff18d70514eba45e0499786070ed2f25f2883af305ebb68224f46ff11f0
|
data/Rakefile
CHANGED
@@ -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, ->
|
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
|
-
#
|
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
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
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, ->
|
10
|
-
scope :by_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, ->
|
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, ->
|
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, ->
|
26
|
+
scope :assigned_to, ->(user) {
|
25
27
|
where(assignment_id: user.id, assignment_type: user.class.to_s)
|
26
28
|
}
|
27
29
|
|
@@ -1,6 +1,7 @@
|
|
1
|
-
|
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
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
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
|
34
|
+
def uncompleted_statuses
|
39
35
|
[NOT_STARTED, IN_PROGRESS, WAITING]
|
40
36
|
end
|
41
37
|
|
@@ -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: [
|
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: [
|
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: [
|
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
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
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: [
|
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.
|
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
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
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.
|
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
|
# 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
|
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
|
10
|
-
|
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
|
45
|
-
|
46
|
-
.unresolved.where.not(id: id).count.zero?
|
17
|
+
def target
|
18
|
+
data[:target]
|
47
19
|
end
|
48
20
|
|
49
|
-
def
|
50
|
-
parent
|
21
|
+
def operation
|
22
|
+
parent if parent.is_a? RailsWorkflow::Operation
|
23
|
+
end
|
51
24
|
|
52
|
-
|
53
|
-
|
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
|
-
|
31
|
+
parent
|
56
32
|
end
|
33
|
+
end
|
57
34
|
|
58
|
-
|
59
|
-
|
60
|
-
|
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
|
-
|
39
|
+
def error_resolver
|
40
|
+
@error_resolver ||= config.error_resolver.new(self)
|
68
41
|
end
|
69
42
|
end
|
70
43
|
end
|