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