dynflow 0.8.3 → 0.8.4

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