dynflow 1.8.2 → 1.8.3

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 (233) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -1
  3. data/.rubocop.yml +11 -5
  4. data/.rubocop_todo.yml +777 -345
  5. data/Gemfile +4 -3
  6. data/Rakefile +1 -0
  7. data/doc/pages/Gemfile +4 -3
  8. data/doc/pages/Rakefile +1 -0
  9. data/doc/pages/plugins/alert_block.rb +1 -0
  10. data/doc/pages/plugins/div_tag.rb +1 -0
  11. data/doc/pages/plugins/graphviz.rb +6 -6
  12. data/doc/pages/plugins/plantuml.rb +2 -3
  13. data/doc/pages/plugins/play.rb +1 -2
  14. data/doc/pages/plugins/tags.rb +2 -8
  15. data/doc/pages/plugins/toc.rb +1 -1
  16. data/dynflow.gemspec +11 -10
  17. data/examples/clock_benchmark.rb +1 -0
  18. data/examples/example_helper.rb +4 -3
  19. data/examples/future_execution.rb +0 -2
  20. data/examples/memory_limit_watcher.rb +8 -8
  21. data/examples/orchestrate.rb +9 -21
  22. data/examples/orchestrate_evented.rb +18 -33
  23. data/examples/remote_executor.rb +9 -11
  24. data/examples/singletons.rb +1 -0
  25. data/examples/sub_plan_concurrency_control.rb +0 -1
  26. data/examples/sub_plans.rb +1 -0
  27. data/examples/sub_plans_v2.rb +1 -0
  28. data/lib/dynflow/action/cancellable.rb +1 -0
  29. data/lib/dynflow/action/format.rb +1 -4
  30. data/lib/dynflow/action/missing.rb +4 -4
  31. data/lib/dynflow/action/polling.rb +2 -3
  32. data/lib/dynflow/action/progress.rb +1 -4
  33. data/lib/dynflow/action/rescue.rb +1 -2
  34. data/lib/dynflow/action/singleton.rb +1 -0
  35. data/lib/dynflow/action/suspended.rb +1 -0
  36. data/lib/dynflow/action/timeouts.rb +2 -1
  37. data/lib/dynflow/action/with_bulk_sub_plans.rb +1 -0
  38. data/lib/dynflow/action/with_polling_sub_plans.rb +1 -1
  39. data/lib/dynflow/action/with_sub_plans.rb +20 -19
  40. data/lib/dynflow/action.rb +37 -37
  41. data/lib/dynflow/active_job/queue_adapter.rb +2 -1
  42. data/lib/dynflow/actor.rb +2 -2
  43. data/lib/dynflow/actors/execution_plan_cleaner.rb +1 -0
  44. data/lib/dynflow/actors.rb +1 -0
  45. data/lib/dynflow/clock.rb +3 -4
  46. data/lib/dynflow/config.rb +6 -5
  47. data/lib/dynflow/connectors/abstract.rb +11 -10
  48. data/lib/dynflow/connectors/database.rb +2 -2
  49. data/lib/dynflow/connectors/direct.rb +2 -3
  50. data/lib/dynflow/connectors.rb +1 -0
  51. data/lib/dynflow/coordinator.rb +2 -6
  52. data/lib/dynflow/coordinator_adapters/abstract.rb +1 -0
  53. data/lib/dynflow/coordinator_adapters/sequel.rb +1 -0
  54. data/lib/dynflow/coordinator_adapters.rb +1 -2
  55. data/lib/dynflow/dead_letter_silencer.rb +1 -0
  56. data/lib/dynflow/debug/telemetry/persistence.rb +3 -2
  57. data/lib/dynflow/delayed_executors/abstract.rb +1 -2
  58. data/lib/dynflow/delayed_executors/abstract_core.rb +1 -1
  59. data/lib/dynflow/delayed_executors/polling.rb +1 -2
  60. data/lib/dynflow/delayed_executors.rb +1 -2
  61. data/lib/dynflow/delayed_plan.rb +6 -6
  62. data/lib/dynflow/director/execution_plan_manager.rb +1 -1
  63. data/lib/dynflow/director/flow_manager.rb +1 -0
  64. data/lib/dynflow/director/queue_hash.rb +2 -1
  65. data/lib/dynflow/director/running_steps_manager.rb +3 -2
  66. data/lib/dynflow/director/sequence_cursor.rb +1 -2
  67. data/lib/dynflow/director/sequential_manager.rb +1 -0
  68. data/lib/dynflow/director.rb +12 -11
  69. data/lib/dynflow/dispatcher/abstract.rb +1 -0
  70. data/lib/dynflow/dispatcher/client_dispatcher.rb +33 -33
  71. data/lib/dynflow/dispatcher/executor_dispatcher.rb +7 -6
  72. data/lib/dynflow/dispatcher.rb +8 -7
  73. data/lib/dynflow/errors.rb +1 -0
  74. data/lib/dynflow/execution_history.rb +2 -1
  75. data/lib/dynflow/execution_plan/dependency_graph.rb +1 -2
  76. data/lib/dynflow/execution_plan/hooks.rb +1 -1
  77. data/lib/dynflow/execution_plan/output_reference.rb +4 -4
  78. data/lib/dynflow/execution_plan/steps/abstract.rb +21 -20
  79. data/lib/dynflow/execution_plan/steps/abstract_flow_step.rb +1 -1
  80. data/lib/dynflow/execution_plan/steps/error.rb +10 -9
  81. data/lib/dynflow/execution_plan/steps/finalize_step.rb +1 -2
  82. data/lib/dynflow/execution_plan/steps/plan_step.rb +12 -11
  83. data/lib/dynflow/execution_plan/steps/run_step.rb +1 -1
  84. data/lib/dynflow/execution_plan/steps.rb +1 -2
  85. data/lib/dynflow/execution_plan.rb +46 -46
  86. data/lib/dynflow/executors/abstract/core.rb +4 -3
  87. data/lib/dynflow/executors/parallel/core.rb +3 -2
  88. data/lib/dynflow/executors/parallel/pool.rb +1 -4
  89. data/lib/dynflow/executors/parallel/worker.rb +1 -0
  90. data/lib/dynflow/executors/parallel.rb +3 -2
  91. data/lib/dynflow/executors/sidekiq/core.rb +2 -0
  92. data/lib/dynflow/executors/sidekiq/internal_job_base.rb +1 -0
  93. data/lib/dynflow/executors/sidekiq/orchestrator_jobs.rb +1 -0
  94. data/lib/dynflow/executors/sidekiq/redis_locking.rb +1 -0
  95. data/lib/dynflow/executors/sidekiq/serialization.rb +1 -0
  96. data/lib/dynflow/executors/sidekiq/worker_jobs.rb +1 -0
  97. data/lib/dynflow/executors.rb +1 -1
  98. data/lib/dynflow/extensions/msgpack.rb +5 -4
  99. data/lib/dynflow/extensions.rb +1 -0
  100. data/lib/dynflow/flows/abstract.rb +1 -1
  101. data/lib/dynflow/flows/abstract_composed.rb +1 -2
  102. data/lib/dynflow/flows/atom.rb +1 -2
  103. data/lib/dynflow/flows/concurrence.rb +1 -1
  104. data/lib/dynflow/flows/registry.rb +1 -0
  105. data/lib/dynflow/flows/sequence.rb +1 -1
  106. data/lib/dynflow/flows.rb +1 -2
  107. data/lib/dynflow/logger_adapters/abstract.rb +1 -1
  108. data/lib/dynflow/logger_adapters/delegator.rb +1 -1
  109. data/lib/dynflow/logger_adapters/formatters/abstract.rb +1 -0
  110. data/lib/dynflow/logger_adapters/formatters/exception.rb +1 -0
  111. data/lib/dynflow/logger_adapters/formatters.rb +1 -0
  112. data/lib/dynflow/logger_adapters/simple.rb +6 -5
  113. data/lib/dynflow/logger_adapters.rb +1 -0
  114. data/lib/dynflow/middleware/common/singleton.rb +1 -0
  115. data/lib/dynflow/middleware/common/transaction.rb +1 -0
  116. data/lib/dynflow/middleware/register.rb +1 -0
  117. data/lib/dynflow/middleware/resolver.rb +2 -3
  118. data/lib/dynflow/middleware/stack.rb +1 -0
  119. data/lib/dynflow/middleware/world.rb +1 -2
  120. data/lib/dynflow/middleware.rb +1 -0
  121. data/lib/dynflow/persistence.rb +4 -5
  122. data/lib/dynflow/persistence_adapters/abstract.rb +1 -1
  123. data/lib/dynflow/persistence_adapters/sequel.rb +14 -14
  124. data/lib/dynflow/persistence_adapters/sequel_migrations/001_initial.rb +2 -1
  125. data/lib/dynflow/persistence_adapters/sequel_migrations/002_incremental_progress.rb +1 -0
  126. data/lib/dynflow/persistence_adapters/sequel_migrations/003_parent_action.rb +1 -0
  127. data/lib/dynflow/persistence_adapters/sequel_migrations/004_coordinator_records.rb +1 -1
  128. data/lib/dynflow/persistence_adapters/sequel_migrations/005_envelopes.rb +1 -0
  129. data/lib/dynflow/persistence_adapters/sequel_migrations/006_fix_data_length.rb +1 -0
  130. data/lib/dynflow/persistence_adapters/sequel_migrations/007_future_execution.rb +1 -0
  131. data/lib/dynflow/persistence_adapters/sequel_migrations/008_rename_scheduled_plans_to_delayed_plans.rb +1 -0
  132. data/lib/dynflow/persistence_adapters/sequel_migrations/009_fix_mysql_data_length.rb +1 -1
  133. data/lib/dynflow/persistence_adapters/sequel_migrations/010_add_execution_plans_label.rb +1 -0
  134. data/lib/dynflow/persistence_adapters/sequel_migrations/011_placeholder.rb +1 -0
  135. data/lib/dynflow/persistence_adapters/sequel_migrations/012_add_delayed_plans_serialized_args.rb +1 -0
  136. data/lib/dynflow/persistence_adapters/sequel_migrations/013_add_action_columns.rb +1 -0
  137. data/lib/dynflow/persistence_adapters/sequel_migrations/014_add_step_columns.rb +1 -0
  138. data/lib/dynflow/persistence_adapters/sequel_migrations/015_add_execution_plan_columns.rb +1 -0
  139. data/lib/dynflow/persistence_adapters/sequel_migrations/016_add_step_queue.rb +1 -0
  140. data/lib/dynflow/persistence_adapters/sequel_migrations/017_add_delayed_plan_frozen.rb +1 -0
  141. data/lib/dynflow/persistence_adapters/sequel_migrations/018_add_uuid_column.rb +37 -30
  142. data/lib/dynflow/persistence_adapters/sequel_migrations/019_update_mysql_time_precision.rb +1 -0
  143. data/lib/dynflow/persistence_adapters/sequel_migrations/020_drop_duplicate_indices.rb +1 -0
  144. data/lib/dynflow/persistence_adapters/sequel_migrations/021_create_output_chunks.rb +4 -3
  145. data/lib/dynflow/persistence_adapters/sequel_migrations/023_sqlite_workarounds.rb +1 -0
  146. data/lib/dynflow/persistence_adapters.rb +1 -0
  147. data/lib/dynflow/rails/configuration.rb +1 -0
  148. data/lib/dynflow/rails/daemon.rb +1 -1
  149. data/lib/dynflow/rails.rb +3 -2
  150. data/lib/dynflow/round_robin.rb +2 -2
  151. data/lib/dynflow/semaphores/abstract.rb +1 -1
  152. data/lib/dynflow/semaphores/aggregating.rb +1 -2
  153. data/lib/dynflow/semaphores/dummy.rb +1 -1
  154. data/lib/dynflow/semaphores/stateful.rb +1 -1
  155. data/lib/dynflow/semaphores.rb +1 -0
  156. data/lib/dynflow/serializable.rb +1 -0
  157. data/lib/dynflow/serializer.rb +2 -2
  158. data/lib/dynflow/serializers/abstract.rb +1 -2
  159. data/lib/dynflow/serializers/noop.rb +1 -2
  160. data/lib/dynflow/serializers.rb +1 -2
  161. data/lib/dynflow/stateful.rb +1 -0
  162. data/lib/dynflow/telemetry.rb +11 -10
  163. data/lib/dynflow/telemetry_adapters/abstract.rb +1 -0
  164. data/lib/dynflow/telemetry_adapters/dummy.rb +1 -0
  165. data/lib/dynflow/telemetry_adapters/statsd.rb +2 -1
  166. data/lib/dynflow/testing/assertions.rb +7 -7
  167. data/lib/dynflow/testing/dummy_coordinator.rb +1 -0
  168. data/lib/dynflow/testing/dummy_execution_plan.rb +1 -0
  169. data/lib/dynflow/testing/dummy_executor.rb +1 -0
  170. data/lib/dynflow/testing/dummy_planned_action.rb +3 -1
  171. data/lib/dynflow/testing/dummy_step.rb +1 -0
  172. data/lib/dynflow/testing/dummy_world.rb +1 -0
  173. data/lib/dynflow/testing/factories.rb +42 -37
  174. data/lib/dynflow/testing/in_thread_executor.rb +1 -0
  175. data/lib/dynflow/testing/in_thread_world.rb +1 -0
  176. data/lib/dynflow/testing/managed_clock.rb +1 -1
  177. data/lib/dynflow/testing/mimic.rb +4 -4
  178. data/lib/dynflow/testing.rb +1 -0
  179. data/lib/dynflow/throttle_limiter.rb +1 -1
  180. data/lib/dynflow/transaction_adapters/abstract.rb +1 -0
  181. data/lib/dynflow/transaction_adapters/active_record.rb +1 -0
  182. data/lib/dynflow/transaction_adapters/none.rb +1 -0
  183. data/lib/dynflow/transaction_adapters.rb +1 -2
  184. data/lib/dynflow/utils/indifferent_hash.rb +7 -1
  185. data/lib/dynflow/utils/priority_queue.rb +1 -0
  186. data/lib/dynflow/utils.rb +1 -1
  187. data/lib/dynflow/version.rb +2 -1
  188. data/lib/dynflow/watchers/memory_consumption_watcher.rb +1 -1
  189. data/lib/dynflow/web/console.rb +1 -3
  190. data/lib/dynflow/web/console_helpers.rb +5 -4
  191. data/lib/dynflow/web/filtering_helpers.rb +1 -0
  192. data/lib/dynflow/web/world_helpers.rb +1 -0
  193. data/lib/dynflow/web.rb +3 -3
  194. data/lib/dynflow/web_console.rb +1 -0
  195. data/lib/dynflow/world/invalidation.rb +1 -0
  196. data/lib/dynflow/world.rb +19 -19
  197. data/lib/dynflow.rb +2 -5
  198. data/test/abnormal_states_recovery_test.rb +4 -8
  199. data/test/action_test.rb +10 -18
  200. data/test/activejob_adapter_test.rb +2 -2
  201. data/test/batch_sub_tasks_test.rb +1 -1
  202. data/test/clock_test.rb +2 -3
  203. data/test/concurrency_control_test.rb +6 -7
  204. data/test/coordinator_test.rb +1 -0
  205. data/test/daemon_test.rb +3 -2
  206. data/test/dead_letter_silencer_test.rb +2 -1
  207. data/test/dispatcher_test.rb +4 -5
  208. data/test/execution_plan_cleaner_test.rb +1 -0
  209. data/test/execution_plan_hooks_test.rb +1 -0
  210. data/test/execution_plan_test.rb +10 -32
  211. data/test/executor_test.rb +20 -37
  212. data/test/extensions_test.rb +1 -0
  213. data/test/flows_test.rb +2 -2
  214. data/test/future_execution_test.rb +2 -3
  215. data/test/memory_cosumption_watcher_test.rb +1 -0
  216. data/test/middleware_test.rb +4 -6
  217. data/test/persistence_test.rb +26 -26
  218. data/test/redis_locking_test.rb +1 -0
  219. data/test/rescue_test.rb +3 -11
  220. data/test/round_robin_test.rb +1 -0
  221. data/test/semaphores_test.rb +5 -7
  222. data/test/support/code_workflow_example.rb +11 -28
  223. data/test/support/dummy_example.rb +20 -19
  224. data/test/support/middleware_example.rb +2 -8
  225. data/test/support/rescue_example.rb +1 -14
  226. data/test/support/test_execution_log.rb +1 -2
  227. data/test/test_helper.rb +3 -7
  228. data/test/testing_test.rb +6 -8
  229. data/test/utils_test.rb +1 -0
  230. data/test/v2_sub_plans_test.rb +1 -0
  231. data/test/web_console_test.rb +4 -4
  232. data/test/world_test.rb +4 -3
  233. metadata +43 -43
@@ -1,13 +1,12 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # frozen_string_literal: true
3
+
3
4
  require_relative 'test_helper'
4
5
  require 'ostruct'
5
6
 
6
7
  module Dynflow
7
8
  module ConsistencyCheckTest
8
-
9
9
  describe "consistency check" do
10
-
11
10
  include TestHelpers
12
11
 
13
12
  def with_invalidation_while_executing(finish)
@@ -43,7 +42,6 @@ module Dynflow
43
42
  let(:client_world_2) { create_world(false) }
44
43
 
45
44
  describe "for plans assigned to invalid world" do
46
-
47
45
  before do
48
46
  # mention the executors to make sure they are initialized
49
47
  [executor_world, executor_world_2]
@@ -187,7 +185,6 @@ module Dynflow
187
185
  end
188
186
 
189
187
  describe 'auto execute' do
190
-
191
188
  before do
192
189
  client_world.persistence.delete_execution_plans({})
193
190
  end
@@ -273,10 +270,10 @@ module Dynflow
273
270
  end
274
271
 
275
272
  it 'by default, the auto_validity_check is enabled only for executor words' do
276
- client_world_config = Config::ForWorld.new(Config.new.tap { |c| c.executor = false }, create_world )
273
+ client_world_config = Config::ForWorld.new(Config.new.tap { |c| c.executor = false }, create_world)
277
274
  _(client_world_config.auto_validity_check).must_equal false
278
275
 
279
- executor_world_config = Config::ForWorld.new(Config.new.tap { |c| c.executor = Executors::Parallel::Core }, create_world )
276
+ executor_world_config = Config::ForWorld.new(Config.new.tap { |c| c.executor = Executors::Parallel::Core }, create_world)
280
277
  _(executor_world_config.auto_validity_check).must_equal true
281
278
  end
282
279
 
@@ -304,7 +301,7 @@ module Dynflow
304
301
  _(client_world.coordinator.find_worlds(false, id: [invalid_world.id, invalid_world_2.id]).size).must_equal 2
305
302
 
306
303
  results = client_world.worlds_validity_check(true, :id => invalid_world.id)
307
- _(results).must_equal(invalid_world.id => :invalidated)
304
+ _(results).must_equal(invalid_world.id => :invalidated)
308
305
  _(client_world.coordinator.find_worlds(false, id: [invalid_world.id, invalid_world_2.id]).size).must_equal 1
309
306
  end
310
307
  end
@@ -382,4 +379,3 @@ module Dynflow
382
379
  end
383
380
  end
384
381
  end
385
-
data/test/action_test.rb CHANGED
@@ -1,14 +1,13 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'test_helper'
3
4
  require 'mocha/minitest'
4
5
 
5
6
  module Dynflow
6
7
  describe 'action' do
7
-
8
8
  let(:world) { WorldFactory.create_world }
9
9
 
10
10
  describe Action::Missing do
11
-
12
11
  let :action_data do
13
12
  { class: 'RenamedAction',
14
13
  id: 1,
@@ -32,7 +31,6 @@ module Dynflow
32
31
  end
33
32
 
34
33
  describe 'children' do
35
-
36
34
  smart_action_class = Class.new(Dynflow::Action)
37
35
  smarter_action_class = Class.new(smart_action_class)
38
36
 
@@ -50,7 +48,6 @@ module Dynflow
50
48
  end
51
49
 
52
50
  describe Action::Present do
53
-
54
51
  let :execution_plan do
55
52
  result = world.trigger(Support::CodeWorkflowExample::IncomingIssues, issues_data)
56
53
  _(result).must_be :planned?
@@ -74,7 +71,6 @@ module Dynflow
74
71
  end
75
72
 
76
73
  describe 'serialization' do
77
-
78
74
  include Testing
79
75
 
80
76
  it 'fails when input is not serializable' do
@@ -196,10 +192,9 @@ module Dynflow
196
192
  end
197
193
 
198
194
  class TestPollingAction < Dynflow::Action
199
-
200
195
  class Config
201
196
  attr_accessor :external_service, :poll_max_retries,
202
- :poll_intervals, :attempts_before_next_interval
197
+ :poll_intervals, :attempts_before_next_interval
203
198
 
204
199
  def initialize
205
200
  @external_service = ExternalService.new
@@ -383,7 +378,6 @@ module Dynflow
383
378
  end
384
379
 
385
380
  describe Action::WithSubPlans do
386
-
387
381
  class FailureSimulator
388
382
  class << self
389
383
  attr_accessor :fail_in_child_plan, :fail_in_child_run
@@ -399,7 +393,6 @@ module Dynflow
399
393
  end
400
394
 
401
395
  class ParentAction < Dynflow::Action
402
-
403
396
  include Dynflow::Action::WithSubPlans
404
397
 
405
398
  def plan(*_)
@@ -413,7 +406,7 @@ module Dynflow
413
406
 
414
407
  def resume(*args)
415
408
  output[:custom_resume] = true
416
- super *args
409
+ super(*args)
417
410
  end
418
411
  end
419
412
 
@@ -481,7 +474,6 @@ module Dynflow
481
474
  def batch(from, size)
482
475
  total_count.times.drop(from).take(size)
483
476
  end
484
-
485
477
  end
486
478
 
487
479
  let(:execution_plan) { world.trigger(ParentAction, count: 2).finished.value }
@@ -506,7 +498,7 @@ module Dynflow
506
498
  end
507
499
 
508
500
  specify "it saves the information about number for sub plans in the output" do
509
- _(execution_plan.entry_action.output).must_equal('total_count' => 2,
501
+ _(execution_plan.entry_action.output).must_equal('total_count' => 2,
510
502
  'failed_count' => 0,
511
503
  'success_count' => 2,
512
504
  'pending_count' => 0)
@@ -514,7 +506,7 @@ module Dynflow
514
506
 
515
507
  specify "when a sub plan fails, the caller action fails as well" do
516
508
  FailureSimulator.fail_in_child_run = true
517
- _(execution_plan.entry_action.output).must_equal('total_count' => 2,
509
+ _(execution_plan.entry_action.output).must_equal('total_count' => 2,
518
510
  'failed_count' => 2,
519
511
  'success_count' => 0,
520
512
  'pending_count' => 0)
@@ -789,7 +781,7 @@ module Dynflow
789
781
  plan = world.plan(SingletonAction)
790
782
  _(plan.state).must_equal :planned
791
783
  lock_filter = ::Dynflow::Coordinator::SingletonActionLock
792
- .unique_filter plan.entry_action.class.name
784
+ .unique_filter plan.entry_action.class.name
793
785
  _(world.coordinator.find_locks(lock_filter).count).must_equal 1
794
786
  plan = world.execute(plan.id).wait!.value
795
787
  _(plan.state).must_equal :stopped
@@ -801,7 +793,7 @@ module Dynflow
801
793
  plan = world.plan(SingletonActionWithFinalize)
802
794
  _(plan.state).must_equal :planned
803
795
  lock_filter = ::Dynflow::Coordinator::SingletonActionLock
804
- .unique_filter plan.entry_action.class.name
796
+ .unique_filter plan.entry_action.class.name
805
797
  _(world.coordinator.find_locks(lock_filter).count).must_equal 1
806
798
  plan = world.execute(plan.id).wait!.value
807
799
  _(plan.state).must_equal :stopped
@@ -813,7 +805,7 @@ module Dynflow
813
805
  plan = world.plan(SuspendedSingletonAction)
814
806
  _(plan.state).must_equal :planned
815
807
  lock_filter = ::Dynflow::Coordinator::SingletonActionLock
816
- .unique_filter plan.entry_action.class.name
808
+ .unique_filter plan.entry_action.class.name
817
809
  _(world.coordinator.find_locks(lock_filter).count).must_equal 1
818
810
  future = world.execute(plan.id)
819
811
  wait_for do
@@ -859,7 +851,7 @@ module Dynflow
859
851
 
860
852
  # The lock was released when plan3 stopped
861
853
  lock_filter = ::Dynflow::Coordinator::SingletonActionLock
862
- .unique_filter plan3.entry_action.class.name
854
+ .unique_filter plan3.entry_action.class.name
863
855
  _(world.coordinator.find_locks(lock_filter)).must_be :empty?
864
856
  end
865
857
 
@@ -868,7 +860,7 @@ module Dynflow
868
860
  plan1 = world.plan(BadAction, true)
869
861
  _(plan1.state).must_equal :planned
870
862
  lock_filter = ::Dynflow::Coordinator::SingletonActionLock
871
- .unique_filter plan1.entry_action.class.name
863
+ .unique_filter plan1.entry_action.class.name
872
864
  _(world.coordinator.find_locks(lock_filter).count).must_equal 0
873
865
  plan2 = world.plan(BadAction, false)
874
866
  _(plan2.state).must_equal :planned
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'test_helper'
3
4
  require 'active_job'
4
5
  require 'dynflow/active_job/queue_adapter'
@@ -21,7 +22,7 @@ module Dynflow
21
22
  end
22
23
 
23
24
  before(:all) do
24
- ::ActiveJob::QueueAdapters.send(:include, ::Dynflow::ActiveJob::QueueAdapters)
25
+ ::ActiveJob::QueueAdapters.include ::Dynflow::ActiveJob::QueueAdapters
25
26
  ::ActiveJob::Base.queue_adapter = :dynflow
26
27
  dynflow_mock = Minitest::Mock.new
27
28
  dynflow_mock.expect(:world, world)
@@ -71,4 +72,3 @@ module Dynflow
71
72
  end
72
73
  end
73
74
  end
74
-
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'test_helper'
3
4
 
4
5
  module Dynflow
@@ -109,7 +110,6 @@ module Dynflow
109
110
  _(action.send(:can_spawn_next_batch?)).must_equal false
110
111
  _(action.current_batch).must_be :empty?
111
112
  end
112
-
113
113
  end
114
114
  end
115
115
  end
data/test/clock_test.rb CHANGED
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'test_helper'
3
4
  require 'logger'
4
5
 
5
6
  clock_class = Dynflow::Clock
6
7
 
7
8
  describe clock_class do
8
-
9
9
  let(:clock) { clock_class.spawn 'clock' }
10
10
 
11
11
  it 'refuses who without #<< method' do
@@ -48,7 +48,6 @@ describe clock_class do
48
48
  assert_equal (0...times).to_a, Array.new(times) { q.pop }.sort
49
49
  end
50
50
  end
51
- threads.each &:join
51
+ threads.each(&:join)
52
52
  end
53
-
54
53
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'test_helper'
3
4
 
4
5
  module Dynflow
@@ -81,8 +82,8 @@ module Dynflow
81
82
  end
82
83
 
83
84
  def check_step(plan, total, finished)
84
- _(world.throttle_limiter.observe(plan.id).length).must_equal (total - finished)
85
- _(plan.sub_plans.select { |sub| planned? sub }.count).must_equal (total - finished)
85
+ _(world.throttle_limiter.observe(plan.id).length).must_equal(total - finished)
86
+ _(plan.sub_plans.select { |sub| planned? sub }.count).must_equal(total - finished)
86
87
  _(plan.sub_plans.select { |sub| successful? sub }.count).must_equal finished
87
88
  end
88
89
 
@@ -95,14 +96,12 @@ module Dynflow
95
96
  end
96
97
 
97
98
  class LoggingThrottleLimiter < Dynflow::ThrottleLimiter
98
-
99
99
  class LoggingCore < Dynflow::ThrottleLimiter::Core
100
-
101
100
  attr_reader :running
102
101
 
103
102
  def initialize(*args)
104
103
  @running = [0]
105
- super *args
104
+ super(*args)
106
105
  end
107
106
 
108
107
  def release(*args)
@@ -233,12 +232,12 @@ module Dynflow
233
232
  planned, running = plan.sub_plans.partition { |sub| planned? sub }
234
233
  _(planned.count).must_equal total - level
235
234
  _(running.count).must_equal level
236
- _(world.throttle_limiter.observe(plan.id).length).must_equal (total - 1)
235
+ _(world.throttle_limiter.observe(plan.id).length).must_equal(total - 1)
237
236
  4.times { klok.progress }
238
237
  wait_for { future.resolved? }
239
238
  finished, stopped = plan.sub_plans.partition { |sub| successful? sub }
240
239
  _(finished.count).must_equal level
241
- _(stopped.count).must_equal (total - level)
240
+ _(stopped.count).must_equal(total - level)
242
241
  end
243
242
  end
244
243
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'test_helper'
3
4
  require 'fileutils'
4
5
 
data/test/daemon_test.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
  require 'active_support'
4
5
  require 'mocha/minitest'
@@ -34,8 +35,8 @@ class DaemonTest < ActiveSupport::TestCase
34
35
  @daemon.stubs(:sleep).returns(true) # don't pause the execution
35
36
  @current_folder = File.expand_path('../support/rails/', __FILE__)
36
37
  ::ActiveRecord::Base.configurations = { 'development' => {} }
37
- ::Dynflow::Rails::Configuration.any_instance.stubs(:initialize_persistence).
38
- returns(WorldFactory.persistence_adapter)
38
+ ::Dynflow::Rails::Configuration.any_instance.stubs(:initialize_persistence)
39
+ .returns(WorldFactory.persistence_adapter)
39
40
  end
40
41
 
41
42
  teardown do
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'test_helper'
3
4
  require 'ostruct'
4
5
 
@@ -12,7 +13,7 @@ module Dynflow
12
13
 
13
14
  it 'is started for each world' do
14
15
  _(world.dead_letter_handler.actor_class)
15
- .must_equal ::Dynflow::DeadLetterSilencer
16
+ .must_equal ::Dynflow::DeadLetterSilencer
16
17
  end
17
18
 
18
19
  describe ::Dynflow::DeadLetterSilencer::Matcher do
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'test_helper'
3
4
 
4
5
  module Dynflow
5
6
  module DispatcherTest
6
7
  describe "dispatcher" do
7
-
8
8
  include TestHelpers
9
9
 
10
10
  let(:persistence_adapter) { WorldFactory.persistence_adapter }
@@ -27,8 +27,8 @@ module Dynflow
27
27
  it 'succeeds when expected' do
28
28
  result = client_world.trigger(Support::DummyExample::DeprecatedEventedAction, :timeout => 3)
29
29
  step = wait_for do
30
- client_world.persistence.load_execution_plan(result.id).
31
- steps_in_state(:suspended).first
30
+ client_world.persistence.load_execution_plan(result.id)
31
+ .steps_in_state(:suspended).first
32
32
  end
33
33
  client_world.event(step.execution_plan_id, step.id, 'finish')
34
34
  plan = result.finished.value
@@ -53,7 +53,7 @@ module Dynflow
53
53
  it 'does not error on dispatching an optional event' do
54
54
  request = client_world.event('123', 1, nil, optional: true)
55
55
  request.wait(20)
56
- assert_match /Could not find an executor for optional .*, discarding/, request.reason.message
56
+ assert_match(/Could not find an executor for optional .*, discarding/, request.reason.message)
57
57
  end
58
58
  end
59
59
  end
@@ -72,7 +72,6 @@ module Dynflow
72
72
  assert_plan_reexecuted(plan)
73
73
  end
74
74
  end
75
-
76
75
  end
77
76
 
78
77
  def self.supports_ping_pong
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'test_helper'
3
4
  require 'mocha/minitest'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'test_helper'
3
4
 
4
5
  module Dynflow
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require_relative 'test_helper'
3
4
 
4
5
  module Dynflow
5
6
  module ExecutionPlanTest
6
7
  describe ExecutionPlan do
7
-
8
8
  include PlanAssertions
9
9
 
10
10
  let(:world) { WorldFactory.create_world }
@@ -15,7 +15,6 @@ module Dynflow
15
15
  end
16
16
 
17
17
  describe 'serialization' do
18
-
19
18
  let :execution_plan do
20
19
  world.plan(Support::CodeWorkflowExample::FastCommit, 'sha' => 'abc123')
21
20
  end
@@ -25,7 +24,6 @@ module Dynflow
25
24
  end
26
25
 
27
26
  describe 'serialized execution plan' do
28
-
29
27
  before { execution_plan.save }
30
28
  after { world.persistence.delete_execution_plans(:uuid => execution_plan.id) }
31
29
 
@@ -46,26 +44,24 @@ module Dynflow
46
44
 
47
45
  it 'handles issues with loading the data' do
48
46
  world.persistence.adapter.send(:table, :step)
49
- .where(execution_plan_uuid: execution_plan.id).delete
47
+ .where(execution_plan_uuid: execution_plan.id).delete
50
48
  refute deserialized_execution_plan.valid?
51
49
  assert_equal Dynflow::Errors::DataConsistencyError, deserialized_execution_plan.exception.class
52
50
  [:label, :state, :started_at, :ended_at].each do |attr|
53
51
  assert_equal execution_plan.send(attr).to_s,
54
- deserialized_execution_plan.send(attr).to_s,
55
- "invalid plan is supposed to still store #{attr}"
52
+ deserialized_execution_plan.send(attr).to_s,
53
+ "invalid plan is supposed to still store #{attr}"
56
54
  end
57
55
  [:execution_time, :real_time].each do |attr|
58
56
  assert_equal execution_plan.send(attr).to_f,
59
- deserialized_execution_plan.send(attr).to_f,
60
- "invalid plan is supposed to still store #{attr}"
57
+ deserialized_execution_plan.send(attr).to_f,
58
+ "invalid plan is supposed to still store #{attr}"
61
59
  end
62
60
  assert_equal execution_plan.execution_history.events,
63
- deserialized_execution_plan.execution_history.events,
64
- "invalid plan is supposed to still store execution history"
61
+ deserialized_execution_plan.execution_history.events,
62
+ "invalid plan is supposed to still store execution history"
65
63
  end
66
-
67
64
  end
68
-
69
65
  end
70
66
 
71
67
  describe '#label' do
@@ -83,24 +79,20 @@ module Dynflow
83
79
  end
84
80
  end
85
81
  describe '#result' do
86
-
87
82
  let :execution_plan do
88
83
  world.plan(Support::CodeWorkflowExample::FastCommit, 'sha' => 'abc123')
89
84
  end
90
85
 
91
86
  describe 'for error in planning phase' do
92
-
93
87
  before { execution_plan.steps[2].set_state :error, true }
94
88
 
95
89
  it 'should be :error' do
96
90
  _(execution_plan.result).must_equal :error
97
91
  _(execution_plan.error?).must_equal true
98
92
  end
99
-
100
93
  end
101
94
 
102
95
  describe 'for error in running phase' do
103
-
104
96
  before do
105
97
  step_id = execution_plan.run_flow.all_step_ids[2]
106
98
  execution_plan.steps[step_id].set_state :error, true
@@ -109,11 +101,9 @@ module Dynflow
109
101
  it 'should be :error' do
110
102
  _(execution_plan.result).must_equal :error
111
103
  end
112
-
113
104
  end
114
105
 
115
106
  describe 'for pending step in running phase' do
116
-
117
107
  before do
118
108
  step_id = execution_plan.run_flow.all_step_ids[2]
119
109
  execution_plan.steps[step_id].set_state :pending, true
@@ -122,11 +112,9 @@ module Dynflow
122
112
  it 'should be :pending' do
123
113
  _(execution_plan.result).must_equal :pending
124
114
  end
125
-
126
115
  end
127
116
 
128
117
  describe 'for all steps successful or skipped' do
129
-
130
118
  before do
131
119
  execution_plan.run_flow.all_step_ids.each_with_index do |step_id, index|
132
120
  step = execution_plan.steps[step_id]
@@ -137,9 +125,7 @@ module Dynflow
137
125
  it 'should be :warning' do
138
126
  _(execution_plan.result).must_equal :warning
139
127
  end
140
-
141
128
  end
142
-
143
129
  end
144
130
 
145
131
  describe 'sub plans' do
@@ -171,11 +157,9 @@ module Dynflow
171
157
  NotifyAssignee
172
158
  PLAN_STEPS
173
159
  end
174
-
175
160
  end
176
161
 
177
162
  describe 'persisted action' do
178
-
179
163
  let :execution_plan do
180
164
  world.plan(Support::CodeWorkflowExample::IncomingIssues, issues_data)
181
165
  end
@@ -206,7 +190,6 @@ module Dynflow
206
190
  end
207
191
 
208
192
  describe 'planning algorithm' do
209
-
210
193
  describe 'single dependencies' do
211
194
  let :execution_plan do
212
195
  world.plan(Support::CodeWorkflowExample::IncomingIssues, issues_data)
@@ -225,7 +208,6 @@ module Dynflow
225
208
  18: NotifyAssignee(pending) {"triage"=>Step(13).output}
226
209
  RUN_FLOW
227
210
  end
228
-
229
211
  end
230
212
 
231
213
  describe 'error in planning phase' do
@@ -286,7 +268,6 @@ module Dynflow
286
268
  end
287
269
 
288
270
  describe 'finalize flow' do
289
-
290
271
  let :execution_plan do
291
272
  world.plan(Support::CodeWorkflowExample::IncomingIssues, issues_data)
292
273
  end
@@ -301,7 +282,6 @@ module Dynflow
301
282
  20: IncomingIssues(pending) {\"issues\"=>[{\"author\"=>\"Peter Smith\", \"text\"=>\"Failing test\"}, {\"author\"=>\"John Doe\", \"text\"=>\"Internal server error\"}]}
302
283
  RUN_FLOW
303
284
  end
304
-
305
285
  end
306
286
  end
307
287
 
@@ -355,7 +335,6 @@ module Dynflow
355
335
  end
356
336
 
357
337
  describe ExecutionPlan::Steps::Error do
358
-
359
338
  it "doesn't fail when deserializing with missing class" do
360
339
  error = ExecutionPlan::Steps::Error.new_from_hash(exception_class: "RenamedError",
361
340
  message: "This errror is not longer here",
@@ -364,7 +343,6 @@ module Dynflow
364
343
  _(error.exception_class.to_s).must_equal "Dynflow::Errors::UnknownError[RenamedError]"
365
344
  _(error.exception.inspect).must_equal "Dynflow::Errors::UnknownError[RenamedError]: This errror is not longer here"
366
345
  end
367
-
368
346
  end
369
347
 
370
348
  describe 'with singleton actions' do
@@ -382,7 +360,7 @@ module Dynflow
382
360
  plan = world.plan(SingletonAction)
383
361
  _(plan.state).must_equal :planned
384
362
  lock_filter = ::Dynflow::Coordinator::SingletonActionLock
385
- .unique_filter plan.entry_action.class.name
363
+ .unique_filter plan.entry_action.class.name
386
364
  _(world.coordinator.find_locks(lock_filter).count).must_equal 1
387
365
  plan = world.execute(plan.id).wait!.value
388
366
  _(plan.state).must_equal :stopped
@@ -394,7 +372,7 @@ module Dynflow
394
372
  plan = world.plan(SingletonAction, :fail => true)
395
373
  _(plan.state).must_equal :planned
396
374
  lock_filter = ::Dynflow::Coordinator::SingletonActionLock
397
- .unique_filter plan.entry_action.class.name
375
+ .unique_filter plan.entry_action.class.name
398
376
  _(world.coordinator.find_locks(lock_filter).count).must_equal 1
399
377
  plan = world.execute(plan.id).wait!.value
400
378
  _(plan.state).must_equal :paused