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