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
@@ -1,56 +0,0 @@
1
- module RailsWorkflow
2
- module OperationTemplates
3
- module DefaultBuilder
4
- extend ActiveSupport::Concern
5
-
6
- def build_operation(operation)
7
- # for customization
8
- end
9
-
10
- def build_operation!(process, completed_dependencies = [])
11
- attrs = attributes
12
- .with_indifferent_access
13
- .slice(:title, :async, :is_background)
14
- .merge(template: self,
15
- process: process,
16
- status: Operation::NOT_STARTED,
17
- manager: process.manager)
18
-
19
- attrs[:dependencies] = completed_dependencies.map do |dep|
20
- {
21
- operation_id: dep.id,
22
- status: dep.status
23
- }
24
- end
25
-
26
- operation = operation_class.create(attrs) do |op|
27
- op.context = RailsWorkflow::OperationTemplate.build_context! op, completed_dependencies
28
-
29
- build_operation op
30
- end
31
-
32
- if child_process.present?
33
- operation.child_process = RailsWorkflow::ProcessManager
34
- .build_process(
35
- child_process.id,
36
- operation.context.data
37
- )
38
- end
39
- operation
40
- end
41
-
42
- module ClassMethods
43
- def build_context(dependencies)
44
- dependencies.first.try(:context).try(:data)
45
- end
46
-
47
- def build_context!(operation, dependencies)
48
- RailsWorkflow::Context.new(
49
- parent: operation,
50
- data: build_context(dependencies) || operation.process.data
51
- )
52
- end
53
- end
54
- end
55
- end
56
- end
@@ -1,121 +0,0 @@
1
- module RailsWorkflow
2
- module Operations
3
- #
4
- # = Workflow::Operations::DefaultRunner contains operation starting,
5
- # completing etc logic.
6
- #
7
- module DefaultRunner
8
- extend ActiveSupport::Concern
9
-
10
- included do
11
- # in this default operation runner we don't need to wait anything
12
- # so we just can run operation. If you need to gather some other
13
- # information - feel free to redefine operation start logic but
14
- # try to gather all your custom logic in operation build method.
15
- # operation start can be usefull if you need to send some notifications
16
- # to external systems that operation is tarted etc...
17
- def start
18
- can_start? ? starting : waiting
19
- rescue => exception
20
- RailsWorkflow::Error.create_from exception, parent: self
21
- end
22
-
23
- def starting
24
- update_attribute(:status, self.class::IN_PROGRESS)
25
-
26
- is_background && RailsWorkflow.config.activejob_enabled ?
27
- OperationExecutionJob.perform_later(id) :
28
- OperationExecutionJob.perform_now(id)
29
- end
30
-
31
- # This method allows you to add requirements for operation to start. For example
32
- # some operation can't start because of some process or overal system conditions.
33
- # By default any operation can start :)
34
- def can_start?
35
- status == Operation::NOT_STARTED
36
- end
37
-
38
- # move operation to waiting status. for example - for user operations
39
- def waiting
40
- update_attribute(:status, self.class::WAITING)
41
- start_waiting if respond_to? :start_waiting
42
- rescue => exception
43
- RailsWorkflow::Error.create_from exception, parent: self
44
- end
45
-
46
- def execute_in_transaction
47
- status = nil
48
- self.class.transaction(requires_new: true) do
49
- begin
50
- child_process.start if child_process.present?
51
- status = execute
52
- rescue ActiveRecord::Rollback
53
- status = nil
54
- end
55
-
56
- raise ActiveRecord::Rollback unless status
57
- end
58
-
59
- if status
60
- context.save
61
- complete
62
- end
63
-
64
- rescue ActiveRecord::Rollback => exception
65
- # In case of rollback exception we do nothing -
66
- # this may be caused by usual validations
67
- rescue => exception
68
- RailsWorkflow::Error.create_from(
69
- exception, parent: self,
70
- target: self,
71
- method: :execute_in_transaction
72
- )
73
- end
74
-
75
- def execute
76
- true
77
- end
78
-
79
- def completed?
80
- completed_statuses.include? status
81
- end
82
-
83
- def can_complete?
84
- child_process.present? ?
85
- child_process.status == RailsWorkflow::Process::DONE :
86
- true
87
- end
88
-
89
- def complete(to_status = nil)
90
- if can_complete?
91
-
92
- on_complete if to_status.blank? && respond_to?(:on_complete)
93
-
94
- update_attributes(
95
- status: to_status || self.class::DONE,
96
- completed_at: Time.zone.now
97
- )
98
- manager.operation_completed self
99
- end
100
- rescue => exception
101
- RailsWorkflow::Error.create_from(
102
- exception, parent: self,
103
- target: self,
104
- method: :complete,
105
- args: [to_status]
106
- )
107
- end
108
-
109
- def cancel
110
- on_cancel if respond_to? :on_cancel
111
- complete self.class::CANCELED
112
- end
113
-
114
- def skip
115
- on_cancel if respond_to? :on_skip
116
- complete self.class::SKIPPED
117
- end
118
- end
119
- end
120
- end
121
- end
@@ -1,52 +0,0 @@
1
- require 'active_support/concern'
2
- module RailsWorkflow
3
- module ProcessTemplates
4
- # = DefaultBuilder
5
- #
6
- # Process Builder is used to build new process. All process building logic should be
7
- # gathered here. It defines how process is build using template (for example it can used
8
- # to gather some additional information from system - for example some information from
9
- # existing processes or it can handle hierarchical processes logic for parent / child
10
- # processes).
11
- #
12
- module DefaultBuilder
13
- def build_process!(context)
14
- process = process_class.create template: self
15
-
16
- process.class.transaction do
17
- process.update_attributes(title: title, status: Process::NOT_STARTED)
18
- process.create_context(data: context, parent: process)
19
-
20
- build_independent_operations process
21
- process
22
- end
23
- end
24
-
25
- # Independent operations is template operations that have no dependencies from
26
- # any other operations
27
- def build_independent_operations(process)
28
- independent_operations.each do |operation_template|
29
- build_operation process, operation_template
30
- end
31
- end
32
-
33
- # Important note: operation template contains Operation Class.
34
- # You can specify custom class on template
35
-
36
- def build_operation(process, template, completed_dependencies = [])
37
- operation = template.build_operation! process, completed_dependencies
38
-
39
- process.operations << operation if operation.present?
40
-
41
- operation
42
- rescue => exception
43
- RailsWorkflow::Error.create_from(
44
- exception, parent: process,
45
- target: process.template,
46
- method: :build_operation,
47
- args: [process, template, completed_dependencies]
48
- )
49
- end
50
- end
51
- end
52
- end
@@ -1,64 +0,0 @@
1
- module RailsWorkflow
2
- module Processes
3
- #= DefaultRunner
4
- #
5
- # This module contains logic of process start, stop, cancel etc.
6
- #
7
- module DefaultRunner
8
- def can_start?
9
- !operations.empty?
10
- end
11
-
12
- def start
13
- if can_start?
14
- update_attribute(:status, self.class::IN_PROGRESS)
15
- operations.where(status: RailsWorkflow::Operation::NOT_STARTED).map(&:start)
16
- end
17
- end
18
-
19
- def operation_exception
20
- self.status = self.class::ERROR
21
- end
22
-
23
- # Process can be completed if all sync operations is complete.
24
-
25
- def can_complete?
26
- if incomplete_statuses.include? status
27
- incompleted_operations.size.zero? &&
28
- workflow_errors.unresolved.size.zero?
29
- else
30
- false
31
- end
32
- end
33
-
34
- # Returns set or operation that not yet completed.
35
- # Operation complete in DONE, SKIPPED, CANCELED, etc many other statuses
36
- def incompleted_operations
37
- operations.reject(&:completed?)
38
- end
39
-
40
- # If operation is completed process is responsible for building new operations.
41
- # We need to calculate operations, depends on completed one and detect ones we
42
- # can build.
43
- def operation_complete(operation)
44
- build_dependencies operation
45
- end
46
-
47
- def set_done_status
48
- self.status = self.class::DONE
49
- save
50
- end
51
-
52
- def complete_parent_operation
53
- parent_operation.complete if parent_operation.present?
54
- end
55
-
56
- def complete
57
- if can_complete?
58
- set_done_status
59
- complete_parent_operation
60
- end
61
- end
62
- end
63
- end
64
- end
@@ -1,54 +0,0 @@
1
- module RailsWorkflow
2
- module Processes
3
- # = DependencyResolver
4
- #
5
- # New operation can be added to process if all it's dependencies are satisfied.
6
- # For example current operation can depend on some existing process operation which
7
- # should be completed - then current operation can be build
8
-
9
- module DependencyResolver
10
- extend ActiveSupport::Concern
11
-
12
- included do
13
- # This methods get's operations that depends on given one.
14
- # Operation::DependencyResolver resolves operation template dependencies
15
- # but we can define dependencies not only by template but by some other
16
- # business logic on process level. That is why I splitted operation
17
- # dependencies on process and operation level
18
- #
19
- def build_dependencies(operation)
20
- new_operations = []
21
-
22
- matched_templates(operation).each do |operation_template|
23
- completed_dependencies = [operation]
24
-
25
- if operation_template.resolve_dependency operation
26
- new_operations << operation_template.build_operation!(self, completed_dependencies)
27
- end
28
- end
29
-
30
- new_operations.each do |new_operation|
31
- if incomplete_statuses.include?(status)
32
- operations << new_operation
33
- new_operation.start
34
- end
35
- end
36
-
37
- rescue => exception
38
- RailsWorkflow::Error.create_from(
39
- exception, parent: self,
40
- target: self,
41
- method: :build_dependencies,
42
- args: [operation]
43
- )
44
- end
45
-
46
- private
47
-
48
- def matched_templates(operation)
49
- template.dependent_operations(operation) - operations.map(&:template)
50
- end
51
- end
52
- end
53
- end
54
- end
@@ -1,13 +0,0 @@
1
- module RailsWorkflow::ResetCache
2
- extend ActiveSupport::Concern
3
-
4
- included do
5
- after_commit :reset_cache
6
-
7
- def reset_cache
8
- RailsWorkflow.config.cache.clear
9
- end
10
-
11
- end
12
-
13
- end
@@ -1,40 +0,0 @@
1
- module RailsWorkflow
2
- # When some operation fails due to some exceptions this job
3
- # is responsible for setting operation to error status. Also it
4
- # check if there is parent processes / operations and set it
5
- # to error status.
6
- class OperationErrorJob < ActiveJob::Base
7
- queue_as :default
8
-
9
- def perform(*args)
10
- @target_id, @target_class = args
11
-
12
- target.status = target.class::ERROR
13
- target.save
14
-
15
- process_parents
16
- end
17
-
18
- private
19
-
20
- # Target is either operation or process
21
- def target
22
- @target ||= @target_class.constantize.find(@target_id)
23
- end
24
-
25
- # Target operation have parent process and target process may have
26
- # parent operation and they should also be moved to ERROR status
27
- def process_parents
28
- parent_methods.each do |parent_method|
29
- parent_target = target.public_send(parent_method)
30
- perform(parent_target.id, parent_target.class.to_s) if parent_target
31
- end
32
- end
33
-
34
- # Target operation respond to process, process respond to parent_operation
35
- def parent_methods
36
- [:parent_operation, :process]
37
- .select { |method_name| target.respond_to?(method_name) }
38
- end
39
- end
40
- end
@@ -1,40 +0,0 @@
1
- module RailsWorkflow
2
- # ProcessManager should be used to build and start processes.
3
- # It is top level hierarchy class that also can be used
4
- # to build enhancements. For example they can be used to implement
5
- # processes communications.
6
- class ProcessManager
7
- attr_accessor :process
8
- delegate :template, :operation_exception, to: :process
9
- delegate :complete, to: :process, prefix: true
10
-
11
- def initialize(process = nil)
12
- @process = process
13
- end
14
-
15
- def self.build_process(template_id, context)
16
- RailsWorkflow.config.template(template_id).build_process!(context)
17
- end
18
-
19
- def self.start_process(template_id, context)
20
- process = build_process template_id, context
21
- new(process).start_process
22
- process
23
- end
24
-
25
- def start_process
26
- process.start
27
- rescue => exception
28
- RailsWorkflow::Error.create_from exception, parent: process
29
- end
30
-
31
- def operation_completed(operation)
32
- process.operation_complete operation
33
- process_complete
34
- end
35
-
36
- def complete_process
37
- process.complete
38
- end
39
- end
40
- end