dynflow 0.8.3 → 0.8.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +8 -8
  2. data/doc/pages/source/documentation/index.md +14 -14
  3. data/dynflow.gemspec +0 -1
  4. data/examples/future_execution.rb +7 -7
  5. data/lib/dynflow.rb +3 -3
  6. data/lib/dynflow/action.rb +7 -9
  7. data/lib/dynflow/action/with_sub_plans.rb +9 -3
  8. data/lib/dynflow/config.rb +2 -2
  9. data/lib/dynflow/coordinator.rb +3 -3
  10. data/lib/dynflow/delayed_executors.rb +9 -0
  11. data/lib/dynflow/{schedulers → delayed_executors}/abstract.rb +3 -3
  12. data/lib/dynflow/{schedulers → delayed_executors}/abstract_core.rb +7 -7
  13. data/lib/dynflow/{schedulers → delayed_executors}/polling.rb +6 -6
  14. data/lib/dynflow/{scheduled_plan.rb → delayed_plan.rb} +4 -4
  15. data/lib/dynflow/execution_plan.rb +10 -10
  16. data/lib/dynflow/execution_plan/output_reference.rb +2 -2
  17. data/lib/dynflow/execution_plan/steps/error.rb +1 -1
  18. data/lib/dynflow/execution_plan/steps/plan_step.rb +2 -2
  19. data/lib/dynflow/middleware.rb +1 -1
  20. data/lib/dynflow/middleware/stack.rb +1 -1
  21. data/lib/dynflow/middleware/world.rb +1 -1
  22. data/lib/dynflow/persistence.rb +10 -10
  23. data/lib/dynflow/persistence_adapters/abstract.rb +4 -4
  24. data/lib/dynflow/persistence_adapters/sequel.rb +17 -17
  25. data/lib/dynflow/persistence_adapters/sequel_migrations/008_rename_scheduled_plans_to_delayed_plans.rb +5 -0
  26. data/lib/dynflow/serializable.rb +1 -1
  27. data/lib/dynflow/serializer.rb +1 -1
  28. data/lib/dynflow/testing/assertions.rb +1 -1
  29. data/lib/dynflow/utils.rb +205 -0
  30. data/lib/dynflow/version.rb +1 -1
  31. data/lib/dynflow/web/console_helpers.rb +1 -1
  32. data/lib/dynflow/web/filtering_helpers.rb +3 -3
  33. data/lib/dynflow/world.rb +16 -16
  34. data/test/action_test.rb +4 -2
  35. data/test/future_execution_test.rb +32 -32
  36. data/test/middleware_test.rb +5 -5
  37. data/test/persistence_test.rb +3 -3
  38. data/test/support/dummy_example.rb +2 -2
  39. data/test/support/middleware_example.rb +5 -5
  40. data/test/test_helper.rb +1 -1
  41. data/test/testing_test.rb +1 -1
  42. data/web/views/show.erb +3 -3
  43. metadata +9 -21
  44. data/lib/dynflow/schedulers.rb +0 -9
@@ -1,3 +1,3 @@
1
1
  module Dynflow
2
- VERSION = '0.8.3'
2
+ VERSION = '0.8.4'
3
3
  end
@@ -133,7 +133,7 @@ module Dynflow
133
133
  end
134
134
 
135
135
  def updated_url(new_params)
136
- url(request.path_info + "?" + Rack::Utils.build_nested_query(params.merge(new_params.stringify_keys)))
136
+ url(request.path_info + "?" + Rack::Utils.build_nested_query(params.merge(Utils.stringify_keys(new_params))))
137
137
  end
138
138
 
139
139
  def paginated_url(delta)
@@ -20,16 +20,16 @@ module Dynflow
20
20
  filters = params[:filters]
21
21
  elsif supported_filter?('state')
22
22
  excluded_states = show_all ? [] : ['stopped']
23
- filters = { 'state' => ExecutionPlan.states.map(&:to_s) - excluded_states }
23
+ filters = { 'state' => ExecutionPlan.states.map(&:to_s) - excluded_states }
24
24
  else
25
25
  filters = {}
26
26
  end
27
- @filtering_options = { filters: filters }.with_indifferent_access
27
+ @filtering_options = Utils.indifferent_hash(filters: filters)
28
28
  return @filtering_options
29
29
  end
30
30
 
31
31
  def find_execution_plans_options(show_all = false)
32
- options = HashWithIndifferentAccess.new
32
+ options = Utils.indifferent_hash({})
33
33
  options.merge!(filtering_options(show_all))
34
34
  options.merge!(pagination_options)
35
35
  options.merge!(ordering_options)
@@ -7,7 +7,7 @@ module Dynflow
7
7
  attr_reader :id, :client_dispatcher, :executor_dispatcher, :executor, :connector,
8
8
  :transaction_adapter, :logger_adapter, :coordinator,
9
9
  :persistence, :action_classes, :subscription_index,
10
- :middleware, :auto_rescue, :clock, :meta, :scheduler, :auto_validity_check, :validity_check_timeout
10
+ :middleware, :auto_rescue, :clock, :meta, :delayed_executor, :auto_validity_check, :validity_check_timeout
11
11
 
12
12
  def initialize(config)
13
13
  @id = SecureRandom.uuid
@@ -35,9 +35,9 @@ module Dynflow
35
35
  executor.initialized.wait
36
36
  end
37
37
  self.worlds_validity_check if auto_validity_check
38
- @scheduler = try_spawn_scheduler(config_for_world)
39
- @meta = config_for_world.meta
40
- @meta['scheduler'] = true if @scheduler
38
+ @delayed_executor = try_spawn_delayed_executor(config_for_world)
39
+ @meta = config_for_world.meta
40
+ @meta['delayed_executor'] = true if @delayed_executor
41
41
  coordinator.register_world(registered_world)
42
42
  @termination_barrier = Mutex.new
43
43
  @before_termination_hooks = Queue.new
@@ -49,7 +49,7 @@ module Dynflow
49
49
  end
50
50
  end
51
51
  self.auto_execute if config_for_world.auto_execute
52
- @scheduler.start if @scheduler
52
+ @delayed_executor.start if @delayed_executor
53
53
  end
54
54
 
55
55
  def before_termination(&block)
@@ -81,7 +81,7 @@ module Dynflow
81
81
  # TODO what happens with newly loaded classes
82
82
  @action_classes = @action_classes.map do |klass|
83
83
  begin
84
- klass.to_s.constantize
84
+ Utils.constantize(klass.to_s)
85
85
  rescue NameError
86
86
  nil # ignore missing classes
87
87
  end
@@ -146,10 +146,10 @@ module Dynflow
146
146
  end
147
147
  end
148
148
 
149
- def schedule(action_class, schedule_options, *args)
149
+ def delay(action_class, delay_options, *args)
150
150
  raise 'No action_class given' if action_class.nil?
151
151
  execution_plan = ExecutionPlan.new self
152
- execution_plan.schedule(action_class, schedule_options, *args)
152
+ execution_plan.delay(action_class, delay_options, *args)
153
153
  Scheduled[execution_plan.id]
154
154
  end
155
155
 
@@ -199,9 +199,9 @@ module Dynflow
199
199
  begin
200
200
  run_before_termination_hooks
201
201
 
202
- if scheduler
203
- logger.info "start terminating scheduler..."
204
- scheduler.terminate.wait
202
+ if delayed_executor
203
+ logger.info "start terminating delayed_executor..."
204
+ delayed_executor.terminate.wait
205
205
  end
206
206
 
207
207
  if executor
@@ -337,10 +337,10 @@ module Dynflow
337
337
  end
338
338
  end
339
339
 
340
- def try_spawn_scheduler(config_for_world)
341
- return nil if !executor || config_for_world.scheduler.nil?
342
- coordinator.acquire(Coordinator::SchedulerLock.new(self))
343
- config_for_world.scheduler
340
+ def try_spawn_delayed_executor(config_for_world)
341
+ return nil if !executor || config_for_world.delayed_executor.nil?
342
+ coordinator.acquire(Coordinator::DelayedExecutorLock.new(self))
343
+ config_for_world.delayed_executor
344
344
  rescue Coordinator::LockError => e
345
345
  nil
346
346
  end
@@ -352,7 +352,7 @@ module Dynflow
352
352
  action_classes.each_with_object(Hash.new { |h, k| h[k] = [] }) do |klass, index|
353
353
  next unless klass.subscribe
354
354
  Array(klass.subscribe).each do |subscribed_class|
355
- index[subscribed_class.to_s.constantize] << klass
355
+ index[Utils.constantize(subscribed_class.to_s)] << klass
356
356
  end
357
357
  end.tap { |o| o.freeze }
358
358
  end
@@ -392,14 +392,16 @@ module Dynflow
392
392
  specify "it saves the information about number for sub plans in the output" do
393
393
  execution_plan.entry_action.output.must_equal('total_count' => 2,
394
394
  'failed_count' => 0,
395
- 'success_count' => 2)
395
+ 'success_count' => 2,
396
+ 'pending_count' => 0)
396
397
  end
397
398
 
398
399
  specify "when a sub plan fails, the caller action fails as well" do
399
400
  FailureSimulator.fail_in_child_run = true
400
401
  execution_plan.entry_action.output.must_equal('total_count' => 2,
401
402
  'failed_count' => 2,
402
- 'success_count' => 0)
403
+ 'success_count' => 0,
404
+ 'pending_count' => 0)
403
405
  execution_plan.state.must_equal :paused
404
406
  execution_plan.result.must_equal :error
405
407
  end
@@ -11,19 +11,19 @@ module Dynflow
11
11
 
12
12
  before do
13
13
  @start_at = Time.now.utc + 180
14
- world.persistence.delete_scheduled_plans(:execution_plan_uuid => [])
14
+ world.persistence.delete_delayed_plans(:execution_plan_uuid => [])
15
15
  end
16
16
 
17
17
  let(:world) { WorldFactory.create_world }
18
- let(:scheduled_plan) do
19
- scheduled = world.schedule(::Support::DummyExample::Dummy, { :start_at => @start_at })
20
- scheduled.must_be :scheduled?
21
- world.persistence.load_scheduled_plan(scheduled.execution_plan_id)
18
+ let(:delayed_plan) do
19
+ delayed_plan = world.delay(::Support::DummyExample::Dummy, { :start_at => @start_at })
20
+ delayed_plan.must_be :scheduled?
21
+ world.persistence.load_delayed_plan(delayed_plan.execution_plan_id)
22
22
  end
23
23
  let(:history_names) do
24
24
  ->(execution_plan) { execution_plan.execution_history.map(&:name) }
25
25
  end
26
- let(:execution_plan) { scheduled_plan.execution_plan }
26
+ let(:execution_plan) { delayed_plan.execution_plan }
27
27
 
28
28
  it 'returns the progress as 0' do
29
29
  execution_plan.progress.must_equal 0
@@ -31,45 +31,45 @@ module Dynflow
31
31
 
32
32
  it 'marks the plan as failed when issues in serialied phase' do
33
33
  world.persistence.delete_execution_plans({})
34
- e = proc { world.schedule(::Support::DummyExample::DummyCustomScheduleSerializer, { :start_at => @start_at }, :fail) }.must_raise RuntimeError
34
+ e = proc { world.delay(::Support::DummyExample::DummyCustomDelaySerializer, { :start_at => @start_at }, :fail) }.must_raise RuntimeError
35
35
  e.message.must_equal 'Enforced serializer failure'
36
36
  plan = world.persistence.find_execution_plans(page: 0, per_page: 1, order_by: :ended_at, desc: true).first
37
37
  plan.state.must_equal :stopped
38
38
  plan.result.must_equal :error
39
39
  end
40
40
 
41
- it 'schedules the action' do
41
+ it 'delays the action' do
42
42
  execution_plan.steps.count.must_equal 1
43
- scheduled_plan.start_at.inspect.must_equal (@start_at).inspect
44
- history_names.call(execution_plan).must_equal ['schedule']
43
+ delayed_plan.start_at.inspect.must_equal (@start_at).inspect
44
+ history_names.call(execution_plan).must_equal ['delay']
45
45
  end
46
46
 
47
- it 'allows cancelling the scheduled plan' do
47
+ it 'allows cancelling the delayed plan' do
48
48
  execution_plan.state.must_equal :scheduled
49
49
  execution_plan.cancellable?.must_equal true
50
50
  execution_plan.cancel.each(&:wait)
51
51
  execution_plan = world.persistence.load_execution_plan(self.execution_plan.id)
52
52
  execution_plan.state.must_equal :stopped
53
53
  execution_plan.result.must_equal :error
54
- execution_plan.schedule_record.must_equal nil
54
+ execution_plan.delay_record.must_equal nil
55
55
  end
56
56
 
57
- it 'finds scheduled plans' do
57
+ it 'finds delayed plans' do
58
58
  @start_at = Time.now.utc - 100
59
- scheduled_plan
60
- past_scheduled_plans = world.persistence.find_past_scheduled_plans(@start_at + 10)
61
- past_scheduled_plans.length.must_equal 1
62
- past_scheduled_plans.first.execution_plan_uuid.must_equal execution_plan.id
59
+ delayed_plan
60
+ past_delayed_plans = world.persistence.find_past_delayed_plans(@start_at + 10)
61
+ past_delayed_plans.length.must_equal 1
62
+ past_delayed_plans.first.execution_plan_uuid.must_equal execution_plan.id
63
63
  end
64
64
 
65
- it 'scheduled plans can be planned and executed' do
65
+ it 'delayed plans can be planned and executed' do
66
66
  execution_plan.state.must_equal :scheduled
67
- scheduled_plan.plan
67
+ delayed_plan.plan
68
68
  execution_plan.state.must_equal :planned
69
69
  execution_plan.result.must_equal :pending
70
70
  assert_planning_success execution_plan
71
- history_names.call(execution_plan).must_equal ['schedule']
72
- executed = scheduled_plan.execute
71
+ history_names.call(execution_plan).must_equal ['delay']
72
+ executed = delayed_plan.execute
73
73
  executed.wait
74
74
  executed.value.state.must_equal :stopped
75
75
  executed.value.result.must_equal :success
@@ -77,36 +77,36 @@ module Dynflow
77
77
  end
78
78
 
79
79
  it 'expired plans can be failed' do
80
- scheduled_plan.timeout
80
+ delayed_plan.timeout
81
81
  execution_plan.state.must_equal :stopped
82
82
  execution_plan.result.must_equal :error
83
83
  execution_plan.errors.first.message.must_match /could not be started before set time/
84
- history_names.call(execution_plan).must_equal %W(schedule timeout)
84
+ history_names.call(execution_plan).must_equal %W(delay timeout)
85
85
  end
86
86
 
87
87
  end
88
88
 
89
- describe 'polling scheduler' do
89
+ describe 'polling delayed executor' do
90
90
  let(:dummy_world) { Dynflow::Testing::DummyWorld.new }
91
91
  let(:persistence) { MiniTest::Mock.new }
92
92
  let(:options) { { :poll_interval => 15, :time_source => -> { dummy_world.clock.current_time } } }
93
- let(:scheduler) { Schedulers::Polling.new(dummy_world, options) }
93
+ let(:delayed_executor) { DelayedExecutors::Polling.new(dummy_world, options) }
94
94
  let(:klok) { dummy_world.clock }
95
95
 
96
- it 'checks for scheduled plans in regular intervals' do
96
+ it 'checks for delayed plans in regular intervals' do
97
97
  start_time = klok.current_time
98
- persistence.expect(:find_past_scheduled_plans, [], [start_time])
99
- persistence.expect(:find_past_scheduled_plans, [], [start_time + options[:poll_interval]])
98
+ persistence.expect(:find_past_delayed_plans, [], [start_time])
99
+ persistence.expect(:find_past_delayed_plans, [], [start_time + options[:poll_interval]])
100
100
  dummy_world.stub :persistence, persistence do
101
101
  klok.pending_pings.length.must_equal 0
102
- scheduler.start.wait
102
+ delayed_executor.start.wait
103
103
  klok.pending_pings.length.must_equal 1
104
- klok.pending_pings.first.who.ref.must_be_same_as scheduler.core
104
+ klok.pending_pings.first.who.ref.must_be_same_as delayed_executor.core
105
105
  klok.pending_pings.first.when.must_equal start_time + options[:poll_interval]
106
106
  klok.progress
107
- scheduler.terminate.wait
107
+ delayed_executor.terminate.wait
108
108
  klok.pending_pings.length.must_equal 1
109
- klok.pending_pings.first.who.ref.must_be_same_as scheduler.core
109
+ klok.pending_pings.first.who.ref.must_be_same_as delayed_executor.core
110
110
  klok.pending_pings.first.when.must_equal start_time + 2 * options[:poll_interval]
111
111
  klok.progress
112
112
  klok.pending_pings.length.must_equal 0
@@ -12,13 +12,13 @@ module Dynflow
12
12
  end
13
13
 
14
14
  it "wraps the action method calls" do
15
- schedule = world.schedule(Support::MiddlewareExample::LoggingAction, { :start_at => Time.now.utc - 60 }, {})
16
- plan = world.persistence.load_scheduled_plan schedule.execution_plan_id
15
+ delay = world.delay(Support::MiddlewareExample::LoggingAction, { :start_at => Time.now.utc - 60 }, {})
16
+ plan = world.persistence.load_delayed_plan delay.execution_plan_id
17
17
  plan.plan
18
18
  plan.execute.wait
19
- log.must_equal %w[LogMiddleware::before_schedule
20
- schedule
21
- LogMiddleware::after_schedule
19
+ log.must_equal %w[LogMiddleware::before_delay
20
+ delay
21
+ LogMiddleware::after_delay
22
22
  LogMiddleware::before_plan_phase
23
23
  LogMiddleware::before_plan
24
24
  plan
@@ -148,7 +148,7 @@ module Dynflow
148
148
  prepare_action('plan1')
149
149
  loaded_action = adapter.load_action('plan1', action_id)
150
150
  loaded_action[:id].must_equal action_id
151
- loaded_action.must_equal(action_data.stringify_keys)
151
+ loaded_action.must_equal(Utils.stringify_keys(action_data))
152
152
 
153
153
  adapter.save_action('plan1', action_id, nil)
154
154
  -> { adapter.load_action('plan1', action_id) }.must_raise KeyError
@@ -164,7 +164,7 @@ module Dynflow
164
164
  prepare_step('plan1')
165
165
  loaded_step = adapter.load_step('plan1', step_id)
166
166
  loaded_step[:id].must_equal step_id
167
- loaded_step.must_equal(step_data.stringify_keys)
167
+ loaded_step.must_equal(Utils.stringify_keys(step_data))
168
168
  end
169
169
  end
170
170
  end
@@ -189,7 +189,7 @@ module Dynflow
189
189
  it "supports connector's needs for exchaning envelopes" do
190
190
  client_world_id = '5678'
191
191
  executor_world_id = '1234'
192
- envelope_hash = ->(envelope) { Dynflow.serializer.dump(envelope).with_indifferent_access }
192
+ envelope_hash = ->(envelope) { Dynflow::Utils.indifferent_hash(Dynflow.serializer.dump(envelope)) }
193
193
  executor_envelope = envelope_hash.call(Dispatcher::Envelope[123, client_world_id, executor_world_id, Dispatcher::Execution['111']])
194
194
  client_envelope = envelope_hash.call(Dispatcher::Envelope[123, executor_world_id, client_world_id, Dispatcher::Accepted])
195
195
  envelopes = [client_envelope, executor_envelope]
@@ -19,8 +19,8 @@ module Support
19
19
  end
20
20
  end
21
21
 
22
- class DummyCustomScheduleSerializer < Dynflow::Action
23
- def schedule(schedule_options, *args)
22
+ class DummyCustomDelaySerializer < Dynflow::Action
23
+ def delay(delay_options, *args)
24
24
  MySerializer.new(args)
25
25
  end
26
26
  def run; end
@@ -14,10 +14,10 @@ module Support
14
14
  LogMiddleware.log << "#{self.class.name[/\w+$/]}::#{message}"
15
15
  end
16
16
 
17
- def schedule(*args)
18
- log 'before_schedule'
17
+ def delay(*args)
18
+ log 'before_delay'
19
19
  pass *args
20
- log 'after_schedule'
20
+ log 'after_delay'
21
21
  end
22
22
 
23
23
  def plan(args)
@@ -78,8 +78,8 @@ module Support
78
78
  LogMiddleware.log << message
79
79
  end
80
80
 
81
- def schedule(schedule_options, *args)
82
- log 'schedule'
81
+ def delay(delay_options, *args)
82
+ log 'delay'
83
83
  Dynflow::Serializers::Noop.new(args)
84
84
  end
85
85
 
@@ -88,7 +88,7 @@ module WorldFactory
88
88
  config.persistence_adapter = persistence_adapter
89
89
  config.logger_adapter = logger_adapter
90
90
  config.coordinator_adapter = coordinator_adapter
91
- config.scheduler = nil
91
+ config.delayed_executor = nil
92
92
  config.auto_rescue = false
93
93
  config.exit_on_terminate = false
94
94
  config.auto_execute = false
@@ -118,7 +118,7 @@ module Dynflow
118
118
  let(:runned_action) { run_action planned_action }
119
119
 
120
120
  it 'plans' do
121
- planned_action.input.must_equal input.stringify_keys
121
+ planned_action.input.must_equal Utils.stringify_keys(input)
122
122
  assert_run_phase planned_action, { commit: "sha", reviewer: "name", result: true}
123
123
  refute_finalize_phase planned_action
124
124
 
@@ -14,14 +14,14 @@
14
14
  <%= h(@plan.result) %>
15
15
  </p>
16
16
 
17
- <% if @plan.state == :scheduled && @plan.schedule_record %>
17
+ <% if @plan.state == :scheduled && @plan.delay_record %>
18
18
  <p>
19
19
  <b>Start at:</b>
20
- <%= h(@plan.schedule_record.start_at) %>
20
+ <%= h(@plan.delay_record.start_at) %>
21
21
  </p>
22
22
  <p>
23
23
  <b>Start before:</b>
24
- <%= h(@plan.schedule_record.start_before || "-") %>
24
+ <%= h(@plan.delay_record.start_before || "-") %>
25
25
  </p>
26
26
  <% end %>
27
27
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynflow
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.3
4
+ version: 0.8.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Necas
@@ -9,22 +9,8 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-08-13 00:00:00.000000000 Z
12
+ date: 2015-08-14 00:00:00.000000000 Z
13
13
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: activesupport
16
- requirement: !ruby/object:Gem::Requirement
17
- requirements:
18
- - - ! '>='
19
- - !ruby/object:Gem::Version
20
- version: '0'
21
- type: :runtime
22
- prerelease: false
23
- version_requirements: !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ! '>='
26
- - !ruby/object:Gem::Version
27
- version: '0'
28
14
  - !ruby/object:Gem::Dependency
29
15
  name: multi_json
30
16
  requirement: !ruby/object:Gem::Requirement
@@ -369,6 +355,11 @@ files:
369
355
  - lib/dynflow/coordinator_adapters.rb
370
356
  - lib/dynflow/coordinator_adapters/abstract.rb
371
357
  - lib/dynflow/coordinator_adapters/sequel.rb
358
+ - lib/dynflow/delayed_executors.rb
359
+ - lib/dynflow/delayed_executors/abstract.rb
360
+ - lib/dynflow/delayed_executors/abstract_core.rb
361
+ - lib/dynflow/delayed_executors/polling.rb
362
+ - lib/dynflow/delayed_plan.rb
372
363
  - lib/dynflow/dispatcher.rb
373
364
  - lib/dynflow/dispatcher/abstract.rb
374
365
  - lib/dynflow/dispatcher/client_dispatcher.rb
@@ -426,12 +417,8 @@ files:
426
417
  - lib/dynflow/persistence_adapters/sequel_migrations/005_envelopes.rb
427
418
  - lib/dynflow/persistence_adapters/sequel_migrations/006_fix_data_length.rb
428
419
  - lib/dynflow/persistence_adapters/sequel_migrations/007_future_execution.rb
420
+ - lib/dynflow/persistence_adapters/sequel_migrations/008_rename_scheduled_plans_to_delayed_plans.rb
429
421
  - lib/dynflow/round_robin.rb
430
- - lib/dynflow/scheduled_plan.rb
431
- - lib/dynflow/schedulers.rb
432
- - lib/dynflow/schedulers/abstract.rb
433
- - lib/dynflow/schedulers/abstract_core.rb
434
- - lib/dynflow/schedulers/polling.rb
435
422
  - lib/dynflow/serializable.rb
436
423
  - lib/dynflow/serializer.rb
437
424
  - lib/dynflow/serializers.rb
@@ -452,6 +439,7 @@ files:
452
439
  - lib/dynflow/transaction_adapters/abstract.rb
453
440
  - lib/dynflow/transaction_adapters/active_record.rb
454
441
  - lib/dynflow/transaction_adapters/none.rb
442
+ - lib/dynflow/utils.rb
455
443
  - lib/dynflow/version.rb
456
444
  - lib/dynflow/web.rb
457
445
  - lib/dynflow/web/console.rb