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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails/generators/migration'
2
4
 
3
5
  module RailsWorkflow
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class CreateWorkflowProcesses < ActiveRecord::Migration
2
4
  def change
3
5
  create_tables
@@ -8,12 +10,12 @@ class CreateWorkflowProcesses < ActiveRecord::Migration
8
10
 
9
11
  def create_tables
10
12
  [
11
- [:workflow_processes, :rails_workflow_processes],
12
- [:workflow_operations, :rails_workflow_operations],
13
- [:workflow_process_templates, :rails_workflow_process_templates],
14
- [:workflow_operation_templates, :rails_workflow_operation_templates],
15
- [:workflow_contexts, :rails_workflow_contexts],
16
- [:workflow_errors, :rails_workflow_errors]
13
+ %i[workflow_processes rails_workflow_processes],
14
+ %i[workflow_operations rails_workflow_operations],
15
+ %i[workflow_process_templates rails_workflow_process_templates],
16
+ %i[workflow_operation_templates rails_workflow_operation_templates],
17
+ %i[workflow_contexts rails_workflow_contexts],
18
+ %i[workflow_errors rails_workflow_errors]
17
19
  ].map do |names|
18
20
  rename_table names[0], names[1] if table_exists? names[0]
19
21
 
@@ -23,13 +25,13 @@ class CreateWorkflowProcesses < ActiveRecord::Migration
23
25
 
24
26
  def create_indexes
25
27
  [
26
- [:rails_workflow_contexts, [:parent_id, :parent_type]],
27
- [:rails_workflow_errors, [:parent_id, :parent_type]],
28
- [:rails_workflow_operation_templates, :process_template_id],
29
- [:rails_workflow_operation_templates, :uuid],
30
- [:rails_workflow_process_templates, :uuid],
31
- [:rails_workflow_operations, :process_id],
32
- [:rails_workflow_operations, :template_id]
28
+ [:rails_workflow_contexts, %i[parent_id parent_type]],
29
+ [:rails_workflow_errors, %i[parent_id parent_type]],
30
+ %i[rails_workflow_operation_templates process_template_id],
31
+ %i[rails_workflow_operation_templates uuid],
32
+ %i[rails_workflow_process_templates uuid],
33
+ %i[rails_workflow_operations process_id],
34
+ %i[rails_workflow_operations template_id]
33
35
  ].each do |idx|
34
36
  add_index idx[0], idx[1] unless index_exists? idx[0], idx[1]
35
37
  end
@@ -38,92 +40,92 @@ class CreateWorkflowProcesses < ActiveRecord::Migration
38
40
  def create_columns
39
41
  {
40
42
  rails_workflow_contexts: [
41
- [:integer, :parent_id],
42
- [:string, :parent_type],
43
- [:text, :body],
44
- [:datetime, :created_at],
45
- [:datetime, :updated_at]
43
+ %i[integer parent_id],
44
+ %i[string parent_type],
45
+ %i[text body],
46
+ %i[datetime created_at],
47
+ %i[datetime updated_at]
46
48
  ],
47
49
 
48
50
  rails_workflow_errors: [
49
- [:string, :message],
50
- [:text, :stack_trace],
51
- [:integer, :parent_id],
52
- [:string, :parent_type],
53
- [:datetime, :created_at],
54
- [:datetime, :updated_at],
55
- [:boolean, :resolved]
51
+ %i[string message],
52
+ %i[text stack_trace],
53
+ %i[integer parent_id],
54
+ %i[string parent_type],
55
+ %i[datetime created_at],
56
+ %i[datetime updated_at],
57
+ %i[boolean resolved]
56
58
  ],
57
59
 
58
60
  rails_workflow_operation_templates: [
59
- [:string, :title],
60
- [:string, :version],
61
- [:string, :uuid],
62
- [:string, :tag],
63
- [:text, :source],
64
- [:text, :dependencies],
65
- [:string, :operation_class],
66
- [:integer, :process_template_id],
67
- [:datetime, :created_at],
68
- [:datetime, :updated_at],
69
- [:boolean, :async],
70
- [:integer, :child_process_id],
71
- [:integer, :assignment_id],
72
- [:string, :assignment_type],
73
- [:string, :kind],
74
- [:string, :role],
75
- [:string, :group],
76
- [:text, :instruction],
77
- [:boolean, :is_background],
78
- [:string, :type],
79
- [:string, :partial_name]
61
+ %i[string title],
62
+ %i[string version],
63
+ %i[string uuid],
64
+ %i[string tag],
65
+ %i[text source],
66
+ %i[text dependencies],
67
+ %i[string operation_class],
68
+ %i[integer process_template_id],
69
+ %i[datetime created_at],
70
+ %i[datetime updated_at],
71
+ %i[boolean async],
72
+ %i[integer child_process_id],
73
+ %i[integer assignment_id],
74
+ %i[string assignment_type],
75
+ %i[string kind],
76
+ %i[string role],
77
+ %i[string group],
78
+ %i[text instruction],
79
+ %i[boolean is_background],
80
+ %i[string type],
81
+ %i[string partial_name]
80
82
  ],
81
83
 
82
84
  rails_workflow_operations: [
83
- [:integer, :status],
84
- [:boolean, :async],
85
- [:string, :version],
86
- [:string, :tag],
87
- [:string, :title],
88
- [:datetime, :created_at],
89
- [:datetime, :updated_at],
90
- [:integer, :process_id],
91
- [:integer, :template_id],
92
- [:text, :dependencies],
93
- [:integer, :child_process_id],
94
- [:integer, :assignment_id],
95
- [:string, :assignment_type],
96
- [:datetime, :assigned_at],
97
- [:string, :type],
98
- [:boolean, :is_active],
99
- [:datetime, :completed_at],
100
- [:boolean, :is_background]
85
+ %i[integer status],
86
+ %i[boolean async],
87
+ %i[string version],
88
+ %i[string tag],
89
+ %i[string title],
90
+ %i[datetime created_at],
91
+ %i[datetime updated_at],
92
+ %i[integer process_id],
93
+ %i[integer template_id],
94
+ %i[text dependencies],
95
+ %i[integer child_process_id],
96
+ %i[integer assignment_id],
97
+ %i[string assignment_type],
98
+ %i[datetime assigned_at],
99
+ %i[string type],
100
+ %i[boolean is_active],
101
+ %i[datetime completed_at],
102
+ %i[boolean is_background]
101
103
  ],
102
104
 
103
105
  rails_workflow_process_templates: [
104
- [:string, :title],
105
- [:text, :source],
106
- [:string, :uuid],
107
- [:string, :version],
108
- [:string, :tag],
109
- [:string, :manager_class],
110
- [:string, :process_class],
111
- [:datetime, :created_at],
112
- [:datetime, :updated_at],
113
- [:string, :type],
114
- [:string, :partial_name]
106
+ %i[string title],
107
+ %i[text source],
108
+ %i[string uuid],
109
+ %i[string version],
110
+ %i[string tag],
111
+ %i[string manager_class],
112
+ %i[string process_class],
113
+ %i[datetime created_at],
114
+ %i[datetime updated_at],
115
+ %i[string type],
116
+ %i[string partial_name]
115
117
  ],
116
118
 
117
119
  rails_workflow_processes: [
118
- [:integer, :status],
119
- [:string, :version],
120
- [:string, :tag],
121
- [:boolean, :async],
122
- [:string, :title],
123
- [:datetime, :created_at],
124
- [:datetime, :updated_at],
125
- [:integer, :template_id],
126
- [:string, :type]
120
+ %i[integer status],
121
+ %i[string version],
122
+ %i[string tag],
123
+ %i[boolean async],
124
+ %i[string title],
125
+ %i[datetime created_at],
126
+ %i[datetime updated_at],
127
+ %i[integer template_id],
128
+ %i[string type]
127
129
  ]
128
130
  }.each do |table, columns|
129
131
  columns.map do |column|
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'singleton'
2
4
  require 'guid'
3
5
  require 'bootstrap-rails-engine'
@@ -7,40 +9,50 @@ require 'draper'
7
9
  require 'sidekiq'
8
10
  require 'active_model_serializers'
9
11
  require 'rails_workflow/db/mysql'
12
+ require_relative './error_builder'
13
+ require_relative './error_resolver'
14
+ require_relative './process_builder'
15
+ require_relative './operation_builder'
16
+ require_relative './process_runner'
17
+ require_relative './operation_runner'
18
+ require_relative './dependency_resolver'
19
+ require_relative './process_manager'
10
20
  require 'rails_workflow/db/pg'
11
21
 
12
22
  module RailsWorkflow
23
+ # Engine configuration. Allows to set default or custom classes
24
+ # and other engine settings.
13
25
  class Config
14
26
  include Singleton
15
27
 
16
- attr_accessor :operation_types, :activejob_enabled
17
- attr_writer :sql_dialect, :assignment_by, :import_preprocessor, :process_class
18
- attr_reader :cache
28
+ attr_accessor :operation_types
29
+ attr_accessor :activejob_enabled
19
30
 
20
- def initialize
21
- @default_operation_types = {
22
- default: {
23
- title: 'Default Operation',
24
- class: 'RailsWorkflow::Operation'
25
- },
26
- user_role: {
27
- title: 'Operation for User By Role',
28
- class: 'RailsWorkflow::UserByRoleOperation'
29
- },
30
- user_group: {
31
- title: 'Operation by User Group',
32
- class: 'RailsWorkflow::UserByGroupOperation'
33
- }
34
- }
35
- @default_import_preprocessor = 'RailsWorkflow::DefaultImporterPreprocessor'
31
+ def initialize # rubocop: disable Metrics/MethodLength
32
+ init_default_operation_types
33
+ # TODO: rework
34
+ @default_assignment_by = %i[group role]
35
+
36
+ @default_import_preprocessor =
37
+ 'RailsWorkflow::DefaultImporterPreprocessor'
36
38
  @default_operation_template_type = 'RailsWorkflow::OperationTemplate'
37
39
  @default_process_manager = 'RailsWorkflow::ProcessManager'
40
+ @default_process_builder = 'RailsWorkflow::ProcessBuilder'
41
+ @default_operation_builder = 'RailsWorkflow::OperationBuilder'
42
+ @default_error_builder = 'RailsWorkflow::ErrorBuilder'
43
+ @default_error_resolver = 'RailsWorkflow::ErrorResolver'
38
44
  @default_process_class = 'RailsWorkflow::Process'
39
45
  @default_process_template_type = 'RailsWorkflow::ProcessTemplate'
40
- @default_assignment_by = [:group, :role]
46
+
41
47
  @default_sql_dialect = 'pg'
48
+ @default_process_runner = 'RailsWorkflow::ProcessRunner'
49
+ @default_operation_runner = 'RailsWorkflow::OperationRunner'
50
+ @default_dependency_resolver = 'RailsWorkflow::DependencyResolver'
42
51
  end
43
52
 
53
+ # TODO: rework defaults
54
+
55
+ attr_writer :sql_dialect
44
56
  def sql_dialect
45
57
  case @sql_dialect || @default_sql_dialect
46
58
  when 'pg'
@@ -50,6 +62,7 @@ module RailsWorkflow
50
62
  end
51
63
  end
52
64
 
65
+ attr_writer :assignment_by
53
66
  def assignment_by
54
67
  @assignment_by || @default_assignment_by
55
68
  end
@@ -58,10 +71,13 @@ module RailsWorkflow
58
71
  @default_operation_types.merge(@operation_types || {})
59
72
  end
60
73
 
74
+ # TODO: fix
61
75
  def operation_template_klass=(value)
62
76
  @operation_template_type = value
63
77
  end
64
78
 
79
+ attr_writer :import_preprocessor
80
+
65
81
  def import_preprocessor
66
82
  processor = @import_preprocessor || @default_import_preprocessor
67
83
  processor.constantize.new
@@ -79,6 +95,8 @@ module RailsWorkflow
79
95
  @process_manager || @default_process_manager
80
96
  end
81
97
 
98
+ attr_writer :process_class
99
+
82
100
  def process_template_klass=(value)
83
101
  @process_template_type = value
84
102
  end
@@ -91,10 +109,33 @@ module RailsWorkflow
91
109
  @process_template_type || @default_process_template_type
92
110
  end
93
111
 
94
- # template_id - Process Template Id
95
- def template(template_id)
96
- @cache ||= {}
97
- @cache[template_id.to_i] ||= RailsWorkflow::ProcessTemplate.eager_load(:operations).find(template_id)
112
+ def process_manager
113
+ # Todo add custom managers support
114
+ ProcessManager
115
+ end
116
+
117
+ %i[dependency_resolver operation_runner process_runner
118
+ operation_builder process_builder error_builder error_resolver]
119
+ .each do |key|
120
+ instance_eval { attr_writer key }
121
+ class_eval <<-METHOD
122
+ def #{key}
123
+ (@#{key} || @default_#{key}).constantize
124
+ end
125
+ METHOD
126
+ end
127
+
128
+ private
129
+
130
+ def init_default_operation_types
131
+ @default_operation_types = {
132
+ default: { title: 'Default Operation',
133
+ class: 'RailsWorkflow::Operation' },
134
+ user_role: { title: 'Operation for User By Role',
135
+ class: 'RailsWorkflow::UserByRoleOperation' },
136
+ user_group: { title: 'Operation by User Group',
137
+ class: 'RailsWorkflow::UserByGroupOperation' }
138
+ }
98
139
  end
99
140
  end
100
141
  end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  module Db
3
5
  module Mysql
4
- COUNT_STATUSES = <<-SQL.freeze
6
+ COUNT_STATUSES = <<-SQL
5
7
  SELECT status, cnt FROM
6
8
  (
7
9
  SELECT @row_number:=CASE
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsWorkflow
2
4
  module Db
3
5
  module Pg
4
- COUNT_STATUSES = <<-SQL.freeze
6
+ COUNT_STATUSES = <<-SQL
5
7
  select status, cnt from (
6
8
  select row_number() over (partition by status),
7
9
  count(*) over (partition by status) cnt,
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsWorkflow
4
+ # DependencyResolver
5
+ #
6
+ # New operation can be added to process if all it's dependencies
7
+ # are satisfied. For example current operation can depend on some
8
+ # existing process operation which should be completed - then current
9
+ # operation can be build
10
+ class DependencyResolver
11
+ attr_accessor :process
12
+
13
+ delegate :template, :operations, :uncompleted_statuses, to: :process
14
+
15
+ def initialize(process)
16
+ @process = process
17
+ end
18
+
19
+ def build_new_operations(operation)
20
+ [].tap do |new_operations|
21
+ matched_templates(operation).each do |operation_template|
22
+ completed_dependencies = [operation]
23
+
24
+ new_operations << operation_builder.new(
25
+ process, operation_template, completed_dependencies
26
+ ).create_operation
27
+ end
28
+ end.compact
29
+ rescue => exception
30
+ handle_exception(exception, operation)
31
+ end
32
+
33
+ private
34
+
35
+ def handle_exception(exception, operation)
36
+ error_builder.handle(
37
+ exception,
38
+ parent: process, target: :dependency_resolver,
39
+ method: :build_new_operations, args: [operation]
40
+ )
41
+ end
42
+
43
+ def error_builder
44
+ config.error_builder
45
+ end
46
+
47
+ def config
48
+ RailsWorkflow.config
49
+ end
50
+
51
+ def operation_runner
52
+ config.operation_runner
53
+ end
54
+
55
+ def operation_builder
56
+ config.operation_builder
57
+ end
58
+
59
+ def matched_templates(operation)
60
+ (dependent_templates(operation) - already_built_templates)
61
+ .select do |operation_template|
62
+ operation_template.resolve_dependency operation
63
+ end
64
+ end
65
+
66
+ def dependent_templates(operation)
67
+ template.dependent_operations(operation)
68
+ end
69
+
70
+ def already_built_templates
71
+ operations.map(&:template)
72
+ end
73
+ end
74
+ end