job-workflow 0.4.0 → 0.6.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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -2
  3. data/CHANGELOG.md +30 -0
  4. data/README.md +1 -1
  5. data/app/controllers/job_workflow/monitoring/application_controller.rb +11 -0
  6. data/app/controllers/job_workflow/monitoring/executions_controller.rb +28 -0
  7. data/app/controllers/job_workflow/monitoring/workflows_controller.rb +11 -0
  8. data/app/views/job_workflow/monitoring/executions/index.html.erb +57 -0
  9. data/app/views/job_workflow/monitoring/executions/show.html.erb +200 -0
  10. data/app/views/job_workflow/monitoring/workflows/index.html.erb +39 -0
  11. data/app/views/layouts/job_workflow/monitoring/application.html.erb +117 -0
  12. data/config/routes.rb +8 -0
  13. data/guides/API_REFERENCE.md +79 -6
  14. data/guides/DEPENDENCY_WAIT.md +9 -5
  15. data/guides/MONITORING_UI.md +74 -0
  16. data/guides/PARALLEL_PROCESSING.md +33 -21
  17. data/guides/PRODUCTION_DEPLOYMENT.md +1 -1
  18. data/guides/README.md +6 -1
  19. data/guides/THROTTLING.md +24 -0
  20. data/guides/WORKFLOW_STATUS_QUERY.md +7 -1
  21. data/lib/job_workflow/context.rb +68 -6
  22. data/lib/job_workflow/dsl.rb +1 -5
  23. data/lib/job_workflow/instrumentation/opentelemetry_subscriber.rb +1 -1
  24. data/lib/job_workflow/instrumentation.rb +14 -14
  25. data/lib/job_workflow/job_status.rb +16 -1
  26. data/lib/job_workflow/monitoring/dag_layout.rb +186 -0
  27. data/lib/job_workflow/monitoring/engine.rb +15 -0
  28. data/lib/job_workflow/monitoring/execution_page.rb +16 -0
  29. data/lib/job_workflow/monitoring/execution_registry.rb +50 -0
  30. data/lib/job_workflow/monitoring/execution_view_model.rb +262 -0
  31. data/lib/job_workflow/monitoring/parameter_filter.rb +37 -0
  32. data/lib/job_workflow/monitoring/workflow_definition.rb +24 -0
  33. data/lib/job_workflow/monitoring/workflow_registry.rb +24 -0
  34. data/lib/job_workflow/monitoring.rb +120 -0
  35. data/lib/job_workflow/queue_adapters/abstract.rb +7 -2
  36. data/lib/job_workflow/queue_adapters/null_adapter.rb +12 -1
  37. data/lib/job_workflow/queue_adapters/solid_queue_adapter.rb +42 -12
  38. data/lib/job_workflow/railtie.rb +12 -0
  39. data/lib/job_workflow/runner.rb +38 -15
  40. data/lib/job_workflow/sub_task_job.rb +93 -0
  41. data/lib/job_workflow/task.rb +7 -0
  42. data/lib/job_workflow/task_enqueue.rb +19 -12
  43. data/lib/job_workflow/version.rb +1 -1
  44. data/lib/job_workflow/workflow_status.rb +20 -1
  45. data/lib/job_workflow.rb +5 -1
  46. data/sig/generated/job_workflow/context.rbs +31 -7
  47. data/sig/generated/job_workflow/instrumentation/opentelemetry_subscriber.rbs +0 -1
  48. data/sig/generated/job_workflow/instrumentation.rbs +28 -28
  49. data/sig/generated/job_workflow/job_status.rbs +5 -2
  50. data/sig/generated/job_workflow/monitoring/dag_layout.rbs +80 -0
  51. data/sig/generated/job_workflow/monitoring/engine.rbs +8 -0
  52. data/sig/generated/job_workflow/monitoring/execution_page.rbs +14 -0
  53. data/sig/generated/job_workflow/monitoring/execution_registry.rbs +21 -0
  54. data/sig/generated/job_workflow/monitoring/execution_view_model.rbs +111 -0
  55. data/sig/generated/job_workflow/monitoring/parameter_filter.rbs +16 -0
  56. data/sig/generated/job_workflow/monitoring/workflow_definition.rbs +18 -0
  57. data/sig/generated/job_workflow/monitoring/workflow_registry.rbs +13 -0
  58. data/sig/generated/job_workflow/monitoring.rbs +38 -0
  59. data/sig/generated/job_workflow/queue_adapters/abstract.rbs +7 -4
  60. data/sig/generated/job_workflow/queue_adapters/null_adapter.rbs +5 -2
  61. data/sig/generated/job_workflow/queue_adapters/solid_queue_adapter.rbs +18 -6
  62. data/sig/generated/job_workflow/railtie.rbs +6 -0
  63. data/sig/generated/job_workflow/runner.rbs +8 -5
  64. data/sig/generated/job_workflow/sub_task_job.rbs +40 -0
  65. data/sig/generated/job_workflow/task.rbs +5 -0
  66. data/sig/generated/job_workflow/task_enqueue.rbs +5 -8
  67. data/sig/generated/job_workflow/workflow_status.rbs +6 -0
  68. data/sig-private/job-workflow.rbs +11 -0
  69. data/sig-private/rails.rbs +5 -0
  70. metadata +34 -1
@@ -13,7 +13,7 @@ module JobWorkflow
13
13
 
14
14
  private
15
15
 
16
- attr_reader job: DSL
16
+ attr_reader job: _JobInterface
17
17
 
18
18
  # : () -> Workflow
19
19
  def workflow: () -> Workflow
@@ -30,11 +30,14 @@ module JobWorkflow
30
30
  # : (Task) -> bool
31
31
  def skip_task?: (Task) -> bool
32
32
 
33
- # : (Task, ?step: ActiveJob::Continuation::Step?) -> void
34
- def run_task: (Task, ?step: ActiveJob::Continuation::Step?) -> void
33
+ # : (Task, step: ActiveJob::Continuation::Step) -> void
34
+ def run_task: (Task, step: ActiveJob::Continuation::Step) -> void
35
35
 
36
- # : (Task, Context) -> void
37
- def run_each_task: (Task, Context) -> void
36
+ # : (Task, untyped) -> [Integer?, untyped]
37
+ def decode_task_cursor: (Task, untyped) -> [ Integer?, untyped ]
38
+
39
+ # : (Task, Context, step: ActiveJob::Continuation::Step, ?cursor: untyped) -> void
40
+ def run_each_task: (Task, Context, step: ActiveJob::Continuation::Step, ?cursor: untyped) -> void
38
41
 
39
42
  # : (Task, Context) { () -> void } -> void
40
43
  def run_hooks: (Task, Context) { () -> void } -> void
@@ -0,0 +1,40 @@
1
+ # Generated from lib/job_workflow/sub_task_job.rb with RBS::Inline
2
+
3
+ module JobWorkflow
4
+ class SubTaskJob < ActiveJob::Base
5
+ include ActiveJob::Continuable
6
+
7
+ # : (context: Context) -> SubTaskJob
8
+ def self.from_parent_context: (context: Context) -> SubTaskJob
9
+
10
+ # : (Context) -> void
11
+ private def self.validate_sub_task_context!: (Context) -> void
12
+
13
+ # : (Hash[untyped, untyped]) -> void
14
+ def perform: (Hash[untyped, untyped]) -> void
15
+
16
+ # : () -> Output
17
+ def output: () -> Output
18
+
19
+ attr_accessor _context: Context?
20
+
21
+ # : () -> Hash[String, untyped]
22
+ def serialize: () -> Hash[String, untyped]
23
+
24
+ # : (Hash[String, untyped]) -> void
25
+ def deserialize: (Hash[String, untyped]) -> void
26
+
27
+ private
28
+
29
+ attr_accessor serialized_job_workflow_context: Hash[String, untyped]?
30
+
31
+ # : (Hash[Symbol, untyped]) -> Context
32
+ def build_context: (Hash[Symbol, untyped]) -> Context
33
+
34
+ # : (job_class_name: String) -> Workflow
35
+ def resolve_workflow: (job_class_name: String) -> Workflow
36
+
37
+ # : (Hash[Symbol, untyped]) -> Hash[String, untyped]
38
+ def extract_context_data: (Hash[Symbol, untyped]) -> Hash[String, untyped]
39
+ end
40
+ end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module JobWorkflow
4
4
  class Task
5
+ DEFAULT_EACH: untyped
6
+
5
7
  attr_reader job_name: String
6
8
 
7
9
  attr_reader block: ^(untyped) -> void
@@ -50,6 +52,9 @@ module JobWorkflow
50
52
  # : () -> String
51
53
  def throttle_prefix_key: () -> String
52
54
 
55
+ # : () -> bool
56
+ def each?: () -> bool
57
+
53
58
  private
54
59
 
55
60
  attr_reader name: Symbol
@@ -6,22 +6,19 @@ module JobWorkflow
6
6
 
7
7
  attr_reader queue: String?
8
8
 
9
- attr_reader concurrency: Integer?
10
-
11
9
  # : (true | false | ^(Context) -> bool | Hash[Symbol, untyped] | nil) -> TaskEnqueue
12
10
  def self.from_primitive_value: (true | false | ^(Context) -> bool | Hash[Symbol, untyped] | nil) -> TaskEnqueue
13
11
 
12
+ # : (Hash[Symbol, untyped]) -> void
13
+ private def self.validate_hash_keys!: (Hash[Symbol, untyped]) -> void
14
+
14
15
  # : (
15
16
  # ?condition: true | false | ^(Context) -> bool,
16
- # ?queue: String?,
17
- # ?concurrency: Integer?
17
+ # ?queue: String?
18
18
  # ) -> void
19
- def initialize: (?condition: true | false | ^(Context) -> bool, ?queue: String?, ?concurrency: Integer?) -> void
19
+ def initialize: (?condition: true | false | ^(Context) -> bool, ?queue: String?) -> void
20
20
 
21
21
  # : (Context) -> bool
22
22
  def should_enqueue?: (Context) -> bool
23
-
24
- # : () -> bool
25
- def should_limits_concurrency?: () -> bool
26
23
  end
27
24
  end
@@ -22,6 +22,12 @@ module JobWorkflow
22
22
  # : (Hash[String, untyped]) -> WorkflowStatus
23
23
  def self.from_job_data: (Hash[String, untyped]) -> WorkflowStatus
24
24
 
25
+ # : (Hash[String, untyped], Workflow) -> Context
26
+ private def self.context_from_job_data: (Hash[String, untyped], Workflow) -> Context
27
+
28
+ # : (Hash[String, untyped]) -> Hash[String, untyped]?
29
+ private def self.workflow_arguments_data: (Hash[String, untyped]) -> Hash[String, untyped]?
30
+
25
31
  # : (context: Context, job_class_name: String, status: status_type) -> void
26
32
  def initialize: (context: Context, job_class_name: String, status: status_type) -> void
27
33
 
@@ -0,0 +1,11 @@
1
+ module JobWorkflow
2
+ interface _JobInterface
3
+ def job_id: () -> String
4
+ def queue_name: () -> String
5
+ def serialize: () -> Hash[String, untyped]
6
+ def _context: () -> JobWorkflow::Context?
7
+ def _context=: (JobWorkflow::Context) -> JobWorkflow::Context
8
+ def step: (Symbol, ?start: ActiveJob::Continuation::_Succ, ?isolated: bool) -> void
9
+ | (Symbol, ?start: ActiveJob::Continuation::_Succ, ?isolated: bool) { (ActiveJob::Continuation::Step) -> void } -> void
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ module Rails
2
+ class Engine
3
+ def self.isolate_namespace: (Module) -> void
4
+ end
5
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: job-workflow
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - shoma07
@@ -38,6 +38,14 @@ files:
38
38
  - README.md
39
39
  - Rakefile
40
40
  - Steepfile
41
+ - app/controllers/job_workflow/monitoring/application_controller.rb
42
+ - app/controllers/job_workflow/monitoring/executions_controller.rb
43
+ - app/controllers/job_workflow/monitoring/workflows_controller.rb
44
+ - app/views/job_workflow/monitoring/executions/index.html.erb
45
+ - app/views/job_workflow/monitoring/executions/show.html.erb
46
+ - app/views/job_workflow/monitoring/workflows/index.html.erb
47
+ - app/views/layouts/job_workflow/monitoring/application.html.erb
48
+ - config/routes.rb
41
49
  - guides/API_REFERENCE.md
42
50
  - guides/BEST_PRACTICES.md
43
51
  - guides/CACHE_STORE_INTEGRATION.md
@@ -49,6 +57,7 @@ files:
49
57
  - guides/GETTING_STARTED.md
50
58
  - guides/INSTRUMENTATION.md
51
59
  - guides/LIFECYCLE_HOOKS.md
60
+ - guides/MONITORING_UI.md
52
61
  - guides/OPENTELEMETRY_INTEGRATION.md
53
62
  - guides/PARALLEL_PROCESSING.md
54
63
  - guides/PRODUCTION_DEPLOYMENT.md
@@ -83,6 +92,15 @@ files:
83
92
  - lib/job_workflow/instrumentation/opentelemetry_subscriber.rb
84
93
  - lib/job_workflow/job_status.rb
85
94
  - lib/job_workflow/logger.rb
95
+ - lib/job_workflow/monitoring.rb
96
+ - lib/job_workflow/monitoring/dag_layout.rb
97
+ - lib/job_workflow/monitoring/engine.rb
98
+ - lib/job_workflow/monitoring/execution_page.rb
99
+ - lib/job_workflow/monitoring/execution_registry.rb
100
+ - lib/job_workflow/monitoring/execution_view_model.rb
101
+ - lib/job_workflow/monitoring/parameter_filter.rb
102
+ - lib/job_workflow/monitoring/workflow_definition.rb
103
+ - lib/job_workflow/monitoring/workflow_registry.rb
86
104
  - lib/job_workflow/output.rb
87
105
  - lib/job_workflow/output_def.rb
88
106
  - lib/job_workflow/queue.rb
@@ -90,9 +108,11 @@ files:
90
108
  - lib/job_workflow/queue_adapters/abstract.rb
91
109
  - lib/job_workflow/queue_adapters/null_adapter.rb
92
110
  - lib/job_workflow/queue_adapters/solid_queue_adapter.rb
111
+ - lib/job_workflow/railtie.rb
93
112
  - lib/job_workflow/runner.rb
94
113
  - lib/job_workflow/schedule.rb
95
114
  - lib/job_workflow/semaphore.rb
115
+ - lib/job_workflow/sub_task_job.rb
96
116
  - lib/job_workflow/task.rb
97
117
  - lib/job_workflow/task_callable.rb
98
118
  - lib/job_workflow/task_context.rb
@@ -111,7 +131,9 @@ files:
111
131
  - sig-private/activejob.rbs
112
132
  - sig-private/activesupport.rbs
113
133
  - sig-private/aws.rbs
134
+ - sig-private/job-workflow.rbs
114
135
  - sig-private/opentelemetry.rbs
136
+ - sig-private/rails.rbs
115
137
  - sig-private/solid_queue.rbs
116
138
  - sig/generated/job-workflow.rbs
117
139
  - sig/generated/job_workflow.rbs
@@ -134,6 +156,15 @@ files:
134
156
  - sig/generated/job_workflow/instrumentation/opentelemetry_subscriber.rbs
135
157
  - sig/generated/job_workflow/job_status.rbs
136
158
  - sig/generated/job_workflow/logger.rbs
159
+ - sig/generated/job_workflow/monitoring.rbs
160
+ - sig/generated/job_workflow/monitoring/dag_layout.rbs
161
+ - sig/generated/job_workflow/monitoring/engine.rbs
162
+ - sig/generated/job_workflow/monitoring/execution_page.rbs
163
+ - sig/generated/job_workflow/monitoring/execution_registry.rbs
164
+ - sig/generated/job_workflow/monitoring/execution_view_model.rbs
165
+ - sig/generated/job_workflow/monitoring/parameter_filter.rbs
166
+ - sig/generated/job_workflow/monitoring/workflow_definition.rbs
167
+ - sig/generated/job_workflow/monitoring/workflow_registry.rbs
137
168
  - sig/generated/job_workflow/output.rbs
138
169
  - sig/generated/job_workflow/output_def.rbs
139
170
  - sig/generated/job_workflow/queue.rbs
@@ -141,9 +172,11 @@ files:
141
172
  - sig/generated/job_workflow/queue_adapters/abstract.rbs
142
173
  - sig/generated/job_workflow/queue_adapters/null_adapter.rbs
143
174
  - sig/generated/job_workflow/queue_adapters/solid_queue_adapter.rbs
175
+ - sig/generated/job_workflow/railtie.rbs
144
176
  - sig/generated/job_workflow/runner.rbs
145
177
  - sig/generated/job_workflow/schedule.rbs
146
178
  - sig/generated/job_workflow/semaphore.rbs
179
+ - sig/generated/job_workflow/sub_task_job.rbs
147
180
  - sig/generated/job_workflow/task.rbs
148
181
  - sig/generated/job_workflow/task_callable.rbs
149
182
  - sig/generated/job_workflow/task_context.rbs