dynflow 0.8.24 → 0.8.25

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8b848a13e89e2a73d08a697b3ac772e5eb0d9fc0
4
- data.tar.gz: 9d2693f7fcbf3670fe8b82b6d3aaea7de6a43bf7
3
+ metadata.gz: df86d8f76a1106ba36deefac06dbf223b7be53ac
4
+ data.tar.gz: b0e2c8049e5cb81b3d930002192f8d857418e264
5
5
  SHA512:
6
- metadata.gz: ce3762a492003730c50d5dd3ec537ac0bbd18f3dc4d37227f20e6d85fcde1b0ef18fb39fba4da12058398480ba4cc85d872e386fa677c0bf8cc89e73d5769396
7
- data.tar.gz: 0ed13a183242fcd1110b9f02805872918e9d89132891c127622eb3aa0343bcb4a63e6f2a14fe3271ac0f23ba7cda1a0c5eab59a5dc448c41431c223e0c0ed228
6
+ metadata.gz: 4559e454e25d46305c5438e0e9bdf68b23bca95a05e219cd727e839acedeec7037880d609683d598171b9f2d2df1e87937f697d4bc047a789ff424c39abe95dd
7
+ data.tar.gz: fdf35384c85d1d1d752ba05b94a14c24f73fb23b7398d5595cfd5199fcf881c3f12822363cb1d26656b8231a6ee184a648b7d8f0d0ca533b6556c8e6b3759286
@@ -3,7 +3,6 @@ language:
3
3
  - ruby
4
4
 
5
5
  rvm:
6
- - "1.9.3"
7
6
  - "2.0.0"
8
7
  - "2.1.5"
9
8
  - "2.2.0"
data/Gemfile CHANGED
@@ -25,6 +25,7 @@ end
25
25
 
26
26
  if RUBY_VERSION < "2.2.2"
27
27
  gem 'activesupport', '~> 4.2'
28
+ gem 'sinatra', '~> 1.4.8'
28
29
  end
29
30
 
30
31
  group :lint do
@@ -34,3 +35,9 @@ end
34
35
  group :memory_watcher do
35
36
  gem 'get_process_mem'
36
37
  end
38
+
39
+ group :rails do
40
+ gem 'daemons'
41
+ gem 'rails', '>= 4.2.9'
42
+ gem 'logging'
43
+ end
@@ -16,14 +16,14 @@ Gem::Specification.new do |s|
16
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
17
  s.require_paths = ["lib"]
18
18
 
19
- s.required_ruby_version = '>= 1.9.3'
19
+ s.required_ruby_version = '>= 2.0.0'
20
20
 
21
21
  s.add_dependency "multi_json"
22
22
  s.add_dependency "apipie-params"
23
- s.add_dependency "algebrick", '>= 0.7.0', '< 0.7.4'
23
+ s.add_dependency "algebrick", '~> 0.7.0'
24
24
  s.add_dependency "concurrent-ruby", '~> 1.0'
25
- s.add_dependency "concurrent-ruby-edge", '~> 0.2.3'
26
- s.add_dependency "sequel"
25
+ s.add_dependency "concurrent-ruby-edge", '~> 0.2.0'
26
+ s.add_dependency "sequel", '>= 4.0.0'
27
27
 
28
28
  s.add_development_dependency "rake"
29
29
  s.add_development_dependency "rack-test"
@@ -33,4 +33,5 @@ Gem::Specification.new do |s|
33
33
  s.add_development_dependency 'activejob', '< 5.0.0'
34
34
  s.add_development_dependency "sqlite3"
35
35
  s.add_development_dependency "sinatra"
36
+ s.add_development_dependency 'mocha'
36
37
  end
@@ -267,7 +267,7 @@ module Dynflow
267
267
  end
268
268
 
269
269
  # @api private
270
- # @return [Array<Fixnum>] - ids of steps referenced from action
270
+ # @return [Array<Integer>] - ids of steps referenced from action
271
271
  def required_step_ids(input = self.input)
272
272
  results = []
273
273
  recursion =-> value do
@@ -25,6 +25,14 @@ module Dynflow
25
25
  self.when <=> other.when
26
26
  end
27
27
 
28
+ def eql?(other)
29
+ object_id == other.object_id
30
+ end
31
+
32
+ def hash
33
+ object_id
34
+ end
35
+
28
36
  def apply
29
37
  if Algebrick::Some[Object] === what
30
38
  who.send where, what.value
@@ -57,7 +57,7 @@ module Dynflow
57
57
  CoordinatorAdapters::Sequel.new(world)
58
58
  end
59
59
 
60
- config_attr :pool_size, Fixnum do
60
+ config_attr :pool_size, Integer do
61
61
  5
62
62
  end
63
63
 
@@ -124,6 +124,10 @@ module Dynflow
124
124
  'threads in Dynflow pool.'
125
125
  end
126
126
  end
127
+
128
+ rescue ActiveRecord::ConnectionNotEstablished # rubocop:disable Lint/HandleExceptions
129
+ # If in tests or in an environment where ActiveRecord doesn't have a
130
+ # real DB connection, we want to skip AR configuration altogether
127
131
  end
128
132
  end
129
133
  end
@@ -11,7 +11,7 @@ module Dynflow
11
11
 
12
12
  Event = Algebrick.type do
13
13
  fields! execution_plan_id: String,
14
- step_id: Fixnum,
14
+ step_id: Integer,
15
15
  event: Object,
16
16
  result: Concurrent::Edge::Future
17
17
  end
@@ -3,7 +3,7 @@ module Dynflow
3
3
  Request = Algebrick.type do
4
4
  Event = type do
5
5
  fields! execution_plan_id: String,
6
- step_id: Fixnum,
6
+ step_id: Integer,
7
7
  event: Object
8
8
  end
9
9
 
@@ -1,4 +1,4 @@
1
- require 'sequel/no_core_ext' # to avoid sequel ~> 3.0 coliding with ActiveRecord
1
+ require 'sequel'
2
2
  require 'multi_json'
3
3
 
4
4
  module Dynflow
@@ -93,7 +93,7 @@ module Dynflow
93
93
 
94
94
  def find_past_delayed_plans(time)
95
95
  table(:delayed)
96
- .where('start_at <= ? OR (start_before IS NOT NULL AND start_before <= ?)', time, time)
96
+ .where(::Sequel.lit('start_at <= ? OR (start_before IS NOT NULL AND start_before <= ?)', time, time))
97
97
  .order_by(:start_at)
98
98
  .all
99
99
  .map { |plan| load_data(plan) }
@@ -17,7 +17,7 @@ Sequel.migration do
17
17
  create_table(:dynflow_actions) do
18
18
  foreign_key :execution_plan_uuid, :dynflow_execution_plans, type: String, size: 36, fixed: true
19
19
  index :execution_plan_uuid
20
- column :id, Fixnum
20
+ column :id, Integer
21
21
  primary_key [:execution_plan_uuid, :id]
22
22
  index [:execution_plan_uuid, :id], :unique => true
23
23
 
@@ -27,10 +27,10 @@ Sequel.migration do
27
27
  create_table(:dynflow_steps) do
28
28
  foreign_key :execution_plan_uuid, :dynflow_execution_plans, type: String, size: 36, fixed: true
29
29
  index :execution_plan_uuid
30
- column :id, Fixnum
30
+ column :id, Integer
31
31
  primary_key [:execution_plan_uuid, :id]
32
32
  index [:execution_plan_uuid, :id], :unique => true
33
- column :action_id, Fixnum
33
+ column :action_id, Integer
34
34
  foreign_key [:execution_plan_uuid, :action_id], :dynflow_actions
35
35
  index [:execution_plan_uuid, :action_id]
36
36
 
@@ -2,7 +2,7 @@ Sequel.migration do
2
2
  change do
3
3
  alter_table(:dynflow_actions) do
4
4
  add_column :caller_execution_plan_id, String, fixed: true, size: 36
5
- add_column :caller_action_id, Fixnum
5
+ add_column :caller_action_id, Integer
6
6
  add_index [:caller_execution_plan_id, :caller_action_id]
7
7
  end
8
8
  end
@@ -7,9 +7,10 @@ module Dynflow
7
7
 
8
8
  attr_reader :config
9
9
 
10
- def initialize(config = Rails::Configuration.new)
10
+ def initialize(world_class = nil, config = Rails::Configuration.new)
11
11
  @required = false
12
12
  @config = config
13
+ @world_class = world_class
13
14
  end
14
15
 
15
16
  # call this method if your engine uses Dynflow
@@ -33,7 +34,7 @@ module Dynflow
33
34
  config.dynflow_logger.
34
35
  warn('Dynflow: lazy loading with PhusionPassenger might lead to unexpected results')
35
36
  end
36
- config.initialize_world.tap do |world|
37
+ init_world.tap do |world|
37
38
  @world = world
38
39
 
39
40
  unless config.remote?
@@ -91,5 +92,12 @@ module Dynflow
91
92
  def loaded_paths
92
93
  @loaded_paths ||= Set.new
93
94
  end
95
+
96
+ private
97
+
98
+ def init_world
99
+ return config.initialize_world(@world_class) if @world_class
100
+ config.initialize_world
101
+ end
94
102
  end
95
103
  end
@@ -1,3 +1,6 @@
1
+ require 'rails'
2
+ require 'active_record'
3
+
1
4
  module Dynflow
2
5
  class Rails
3
6
  class Configuration
@@ -22,6 +25,11 @@ module Dynflow
22
25
  # what rake tasks should run their own executor, not depending on the external one
23
26
  attr_accessor :rake_tasks_with_executor
24
27
 
28
+ # if true, the ForemanTasks::Concerns::ActionTriggering will make
29
+ # no effect. Useful for testing, where we mignt not want to execute
30
+ # the orchestration tied to the models.
31
+ attr_accessor :disable_active_record_actions
32
+
25
33
  def initialize
26
34
  self.pool_size = 5
27
35
  self.db_pool_size = pool_size + 5
@@ -1,18 +1,55 @@
1
1
  require 'fileutils'
2
+ require 'get_process_mem'
3
+ require 'dynflow/watchers/memory_consumption_watcher'
4
+ require 'active_support/core_ext/numeric/bytes'
2
5
 
3
6
  module Dynflow
4
7
  class Rails
5
8
  class Daemon
9
+ attr_reader :dynflow_memory_watcher_class, :daemons_class
10
+
11
+ # make Daemon dependency injection ready for testing purposes
12
+ def initialize(
13
+ dynflow_memory_watcher_class = ::Dynflow::Watchers::MemoryConsumptionWatcher,
14
+ non_default_daemons_class = nil
15
+ )
16
+ @dynflow_memory_watcher_class = dynflow_memory_watcher_class
17
+ @daemons_class = non_default_daemons_class
18
+ end
19
+
20
+ def daemons_class
21
+ @daemons_class || ::Daemons
22
+ end
23
+
6
24
  # Load the Rails environment and initialize the executor in this thread.
7
- def run(rails_root = Dir.pwd)
25
+ def run(rails_root = Dir.pwd, options = {})
8
26
  STDOUT.puts('Starting Rails environment')
9
27
  rails_env_file = File.expand_path('./config/environment.rb', rails_root)
10
28
  unless File.exist?(rails_env_file)
11
29
  raise "#{rails_root} doesn't seem to be a Rails root directory"
12
30
  end
31
+
32
+ STDERR.puts("Starting dynflow with the following options: #{options}")
33
+
13
34
  ::Rails.application.dynflow.executor!
35
+
36
+ if options[:memory_limit] && options[:memory_limit].to_i > 0
37
+ ::Rails.application.dynflow.config.on_init do |world|
38
+ memory_watcher = initialize_memory_watcher(world, options[:memory_limit], options)
39
+ world.terminated.on_completion do
40
+ STDOUT.puts("World has been terminated")
41
+ memory_watcher = nil # the object can be disposed
42
+ end
43
+ end
44
+ end
45
+
14
46
  require rails_env_file
15
- STDOUT.puts('Everything ready')
47
+ world_id = if ::Rails.application.dynflow.initialized?
48
+ ::Rails.application.dynflow.world.id
49
+ else
50
+ nil
51
+ end
52
+ STDOUT.puts("Everything ready for world: #{world_id}")
16
53
  sleep
17
54
  ensure
18
55
  STDOUT.puts('Exiting')
@@ -20,13 +57,6 @@ module Dynflow
20
57
 
21
58
  # run the executor as a daemon
22
59
  def run_background(command = 'start', options = {})
23
- default_options = { rails_root: Dir.pwd,
24
- process_name: 'dynflow_executor',
25
- pid_dir: File.join(::Rails.root, 'tmp', 'pids'),
26
- log_dir: File.join(::Rails.root, 'log'),
27
- wait_attempts: 300,
28
- wait_sleep: 1,
29
- executors_count: (ENV['EXECUTORS_COUNT'] || 1).to_i }
30
60
  options = default_options.merge(options)
31
61
  FileUtils.mkdir_p(options[:pid_dir])
32
62
  begin
@@ -42,23 +72,19 @@ module Dynflow
42
72
  STDOUT.puts("Dynflow Executor: #{command} in progress")
43
73
 
44
74
  options[:executors_count].times do
45
- Daemons.run_proc(options[:process_name],
46
- :multiple => true,
47
- :dir => options[:pid_dir],
48
- :log_dir => options[:log_dir],
49
- :dir_mode => :normal,
50
- :monitor => true,
51
- :log_output => true,
52
- :ARGV => [command]) do |*_args|
53
- begin
54
- ::Logging.reopen
55
- run(options[:rails_root])
56
- rescue => e
57
- STDERR.puts e.message
58
- ::Rails.logger.exception('Failed running Dynflow daemon', e)
59
- exit 1
60
- end
61
- end
75
+ daemons_class.run_proc(
76
+ options[:process_name],
77
+ daemons_options(command, options)
78
+ ) do |*_args|
79
+ begin
80
+ ::Logging.reopen
81
+ run(options[:rails_root], options)
82
+ rescue => e
83
+ STDERR.puts e.message
84
+ ::Rails.logger.exception('Failed running Dynflow daemon', e)
85
+ exit 1
86
+ end
87
+ end
62
88
  end
63
89
  end
64
90
 
@@ -67,6 +93,88 @@ module Dynflow
67
93
  def world
68
94
  ::Rails.application.dynflow.world
69
95
  end
96
+
97
+ private
98
+
99
+ def daemons_options(command, options)
100
+ {
101
+ :multiple => true,
102
+ :dir => options[:pid_dir],
103
+ :log_dir => options[:log_dir],
104
+ :dir_mode => :normal,
105
+ :monitor => true,
106
+ :log_output => true,
107
+ :log_output_syslog => true,
108
+ :monitor_interval => [options[:memory_polling_interval] / 2, 30].min,
109
+ :ARGV => [command]
110
+ }
111
+ end
112
+
113
+ def default_options
114
+ {
115
+ rails_root: Dir.pwd,
116
+ process_name: 'dynflow_executor',
117
+ pid_dir: "#{::Rails.root}/tmp/pids",
118
+ log_dir: File.join(::Rails.root, 'log'),
119
+ wait_attempts: 300,
120
+ wait_sleep: 1,
121
+ executors_count: (ENV['EXECUTORS_COUNT'] || 1).to_i,
122
+ memory_limit: begin
123
+ to_gb((ENV['EXECUTOR_MEMORY_LIMIT'] || '')).gigabytes
124
+ rescue RuntimeError
125
+ ENV['EXECUTOR_MEMORY_LIMIT'].to_i
126
+ end,
127
+ memory_init_delay: (ENV['EXECUTOR_MEMORY_MONITOR_DELAY'] || 7200).to_i, # 2 hours
128
+ memory_polling_interval: (ENV['EXECUTOR_MEMORY_MONITOR_INTERVAL'] || 60).to_i
129
+ }
130
+ end
131
+
132
+ def initialize_memory_watcher(world, memory_limit, options)
133
+ watcher_options = {}
134
+ watcher_options[:polling_interval] = options[:memory_polling_interval]
135
+ watcher_options[:initial_wait] = options[:memory_init_delay]
136
+ watcher_options[:memory_checked_callback] = ->(current_memory, memory_limit) do
137
+ log_memory_within_limit(current_memory, memory_limit)
138
+ end
139
+ watcher_options[:memory_limit_exceeded_callback] = ->(current_memory, memory_limit) do
140
+ log_memory_limit_exceeded(current_memory, memory_limit)
141
+ end
142
+ dynflow_memory_watcher_class.new(world, memory_limit, watcher_options)
143
+ end
144
+
145
+ def log_memory_limit_exceeded(current_memory, memory_limit)
146
+ message = "Memory level exceeded, registered #{current_memory} bytes, which is greater than #{memory_limit} limit."
147
+ world.dynflow_logger.error(message)
148
+ end
149
+
150
+ def log_memory_within_limit(current_memory, memory_limit)
151
+ message = "Memory level OK, registered #{current_memory} bytes, which is less than #{memory_limit} limit."
152
+ world.dynflow_logger.debug(message)
153
+ end
154
+
155
+ private
156
+
157
+ # Taken straight from https://github.com/theforeman/foreman/blob/develop/lib/core_extensions.rb#L142
158
+ # in order to make this class work with any Rails project
159
+ def to_gb(string)
160
+ match_data = string.match(/^(\d+(\.\d+)?) ?(([KMGT]i?B?|B|Bytes))?$/i)
161
+ if match_data.present?
162
+ value, _, unit = match_data[1..3]
163
+ else
164
+ raise "Unknown string: #{string.inspect}!"
165
+ end
166
+ unit ||= :byte # default to bytes if no unit given
167
+
168
+ case unit.downcase.to_sym
169
+ when :b, :byte, :bytes then (value.to_f / 1.gigabyte)
170
+ when :tb, :tib, :t, :terabyte then (value.to_f * 1.kilobyte)
171
+ when :gb, :gib, :g, :gigabyte then value.to_f
172
+ when :mb, :mib, :m, :megabyte then (value.to_f / 1.kilobyte)
173
+ when :kb, :kib, :k, :kilobyte then (value.to_f / 1.megabyte)
174
+ else raise "Unknown unit: #{unit.inspect}!"
175
+ end
176
+ end
177
+
70
178
  end
71
179
  end
72
180
  end
@@ -40,12 +40,12 @@ module Dynflow
40
40
  if values.size == 1
41
41
  value = values.first
42
42
  case value
43
- when Numeric, String, Symbol, TrueClass, FalseClass, NilClass
43
+ when String, Numeric, Symbol, TrueClass, FalseClass, NilClass
44
44
  value
45
- when Array
46
- value.map { |v| recursive_to_hash v }
47
45
  when Hash
48
46
  value.inject({}) { |h, (k, v)| h.update k => recursive_to_hash(v) }
47
+ when Array
48
+ value.map { |v| recursive_to_hash v }
49
49
  else
50
50
  value.to_hash
51
51
  end
@@ -37,7 +37,6 @@ module Dynflow
37
37
  def persistence
38
38
  nil
39
39
  end
40
-
41
40
  end
42
41
  end
43
42
  end
@@ -1,3 +1,3 @@
1
1
  module Dynflow
2
- VERSION = '0.8.24'
2
+ VERSION = '0.8.25'
3
3
  end
@@ -0,0 +1,104 @@
1
+ require 'test_helper'
2
+ require 'active_support'
3
+ require 'mocha/mini_test'
4
+ require 'logging'
5
+ require 'dynflow/testing'
6
+ require_relative '../lib/dynflow/rails'
7
+
8
+ class DaemonTest < ActiveSupport::TestCase
9
+ setup do
10
+ @dynflow_memory_watcher = mock('memory_watcher')
11
+ @daemons = mock('daemons')
12
+ @daemon = ::Dynflow::Rails::Daemon.new(
13
+ @dynflow_memory_watcher,
14
+ @daemons
15
+ )
16
+ @world_class = mock('dummy world factory')
17
+ @dummy_world = ::Dynflow::Testing::DummyWorld.new
18
+ @dummy_world.stubs(:auto_execute)
19
+ @event = Concurrent.event
20
+ @dummy_world.stubs(:terminated).returns(@event)
21
+ @world_class.stubs(:new).returns(@dummy_world)
22
+ @dynflow = ::Dynflow::Rails.new(
23
+ @world_class,
24
+ ::Dynflow::Rails::Configuration.new
25
+ )
26
+ ::Rails.stubs(:application).returns(OpenStruct.new(:dynflow => @dynflow))
27
+ ::Rails.stubs(:root).returns('support/rails')
28
+ ::Rails.stubs(:logger).returns(Logging.logger(STDOUT))
29
+ @dynflow.require!
30
+ @daemon.stubs(:sleep).returns(true) # don't pause the execution
31
+ @current_folder = File.expand_path('../support/rails/', __FILE__)
32
+ ::ActiveRecord::Base.configurations = { 'development' => {} }
33
+ ::Dynflow::Rails::Configuration.any_instance.stubs(:initialize_persistence).
34
+ returns(WorldFactory.persistence_adapter)
35
+ end
36
+
37
+ teardown do
38
+ @event.complete
39
+ @event.wait
40
+ end
41
+
42
+ test 'run command works withou memory_limit option specified' do
43
+ @daemon.run(@current_folder)
44
+ @dynflow.initialize!
45
+ end
46
+
47
+ test 'run command creates a watcher if memory_limit option specified' do
48
+ @dynflow_memory_watcher.expects(:new).with do |_world, memory_limit, _watcher_options|
49
+ memory_limit == 1000
50
+ end
51
+
52
+ @daemon.run(@current_folder, memory_limit: 1000)
53
+ # initialization should be performed inside the foreman environment,
54
+ # which is mocked here
55
+ @dynflow.initialize!
56
+ end
57
+
58
+ test 'run command sets parameters to watcher' do
59
+ @dynflow_memory_watcher.expects(:new).with do |_world, memory_limit, watcher_options|
60
+ memory_limit == 1000 &&
61
+ watcher_options[:polling_interval] == 100 &&
62
+ watcher_options[:initial_wait] == 200
63
+ end
64
+
65
+ @daemon.run(
66
+ @current_folder,
67
+ memory_limit: 1000,
68
+ memory_polling_interval: 100,
69
+ memory_init_delay: 200
70
+ )
71
+ @dynflow.initialize!
72
+ end
73
+
74
+ test 'run_background command executes run with all params set as a daemon' do
75
+ @daemon.expects(:run).twice.with do |_folder, options|
76
+ options[:memory_limit] == 1000 &&
77
+ options[:memory_init_delay] == 100 &&
78
+ options[:memory_polling_interval] == 200
79
+ end
80
+ @daemons.expects(:run_proc).twice.yields
81
+
82
+ @daemon.run_background(
83
+ 'start',
84
+ executors_count: 2,
85
+ memory_limit: 1000,
86
+ memory_init_delay: 100,
87
+ memory_polling_interval: 200
88
+ )
89
+ end
90
+
91
+ test 'default options read values from ENV' do
92
+ ENV['EXECUTORS_COUNT'] = '2'
93
+ ENV['EXECUTOR_MEMORY_LIMIT'] = '1gb'
94
+ ENV['EXECUTOR_MEMORY_MONITOR_DELAY'] = '3'
95
+ ENV['EXECUTOR_MEMORY_MONITOR_INTERVAL'] = '4'
96
+
97
+ actual = @daemon.send(:default_options)
98
+
99
+ assert_equal 2, actual[:executors_count]
100
+ assert_equal 1.gigabytes, actual[:memory_limit]
101
+ assert_equal 3, actual[:memory_init_delay]
102
+ assert_equal 4, actual[:memory_polling_interval]
103
+ end
104
+ end
@@ -11,7 +11,7 @@ module Dynflow
11
11
 
12
12
  before do
13
13
  @start_at = Time.now.utc + 180
14
- world.persistence.delete_delayed_plans(:execution_plan_uuid => [])
14
+ world.persistence.delete_delayed_plans({})
15
15
  end
16
16
 
17
17
  let(:world) { WorldFactory.create_world }
@@ -51,7 +51,7 @@ module Dynflow
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.delay_record.must_equal nil
54
+ assert_nil execution_plan.delay_record
55
55
  end
56
56
 
57
57
  it 'finds delayed plans' do
@@ -0,0 +1 @@
1
+ # This is a mock
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.24
4
+ version: 0.8.25
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Necas
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-05-03 00:00:00.000000000 Z
12
+ date: 2017-07-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_json
@@ -43,22 +43,16 @@ dependencies:
43
43
  name: algebrick
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - ">="
46
+ - - "~>"
47
47
  - !ruby/object:Gem::Version
48
48
  version: 0.7.0
49
- - - "<"
50
- - !ruby/object:Gem::Version
51
- version: 0.7.4
52
49
  type: :runtime
53
50
  prerelease: false
54
51
  version_requirements: !ruby/object:Gem::Requirement
55
52
  requirements:
56
- - - ">="
53
+ - - "~>"
57
54
  - !ruby/object:Gem::Version
58
55
  version: 0.7.0
59
- - - "<"
60
- - !ruby/object:Gem::Version
61
- version: 0.7.4
62
56
  - !ruby/object:Gem::Dependency
63
57
  name: concurrent-ruby
64
58
  requirement: !ruby/object:Gem::Requirement
@@ -79,28 +73,28 @@ dependencies:
79
73
  requirements:
80
74
  - - "~>"
81
75
  - !ruby/object:Gem::Version
82
- version: 0.2.3
76
+ version: 0.2.0
83
77
  type: :runtime
84
78
  prerelease: false
85
79
  version_requirements: !ruby/object:Gem::Requirement
86
80
  requirements:
87
81
  - - "~>"
88
82
  - !ruby/object:Gem::Version
89
- version: 0.2.3
83
+ version: 0.2.0
90
84
  - !ruby/object:Gem::Dependency
91
85
  name: sequel
92
86
  requirement: !ruby/object:Gem::Requirement
93
87
  requirements:
94
88
  - - ">="
95
89
  - !ruby/object:Gem::Version
96
- version: '0'
90
+ version: 4.0.0
97
91
  type: :runtime
98
92
  prerelease: false
99
93
  version_requirements: !ruby/object:Gem::Requirement
100
94
  requirements:
101
95
  - - ">="
102
96
  - !ruby/object:Gem::Version
103
- version: '0'
97
+ version: 4.0.0
104
98
  - !ruby/object:Gem::Dependency
105
99
  name: rake
106
100
  requirement: !ruby/object:Gem::Requirement
@@ -213,6 +207,20 @@ dependencies:
213
207
  - - ">="
214
208
  - !ruby/object:Gem::Version
215
209
  version: '0'
210
+ - !ruby/object:Gem::Dependency
211
+ name: mocha
212
+ requirement: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ version: '0'
217
+ type: :development
218
+ prerelease: false
219
+ version_requirements: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - ">="
222
+ - !ruby/object:Gem::Version
223
+ version: '0'
216
224
  description: Ruby workflow/orchestration engine
217
225
  email:
218
226
  - inecas@redhat.com
@@ -511,6 +519,7 @@ files:
511
519
  - test/clock_test.rb
512
520
  - test/concurrency_control_test.rb
513
521
  - test/coordinator_test.rb
522
+ - test/daemon_test.rb
514
523
  - test/dispatcher_test.rb
515
524
  - test/execution_plan_test.rb
516
525
  - test/executor_test.rb
@@ -525,6 +534,7 @@ files:
525
534
  - test/support/code_workflow_example.rb
526
535
  - test/support/dummy_example.rb
527
536
  - test/support/middleware_example.rb
537
+ - test/support/rails/config/environment.rb
528
538
  - test/support/rescue_example.rb
529
539
  - test/support/test_execution_log.rb
530
540
  - test/test_helper.rb
@@ -571,7 +581,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
571
581
  requirements:
572
582
  - - ">="
573
583
  - !ruby/object:Gem::Version
574
- version: 1.9.3
584
+ version: 2.0.0
575
585
  required_rubygems_version: !ruby/object:Gem::Requirement
576
586
  requirements:
577
587
  - - ">="
@@ -591,6 +601,7 @@ test_files:
591
601
  - test/clock_test.rb
592
602
  - test/concurrency_control_test.rb
593
603
  - test/coordinator_test.rb
604
+ - test/daemon_test.rb
594
605
  - test/dispatcher_test.rb
595
606
  - test/execution_plan_test.rb
596
607
  - test/executor_test.rb
@@ -605,6 +616,7 @@ test_files:
605
616
  - test/support/code_workflow_example.rb
606
617
  - test/support/dummy_example.rb
607
618
  - test/support/middleware_example.rb
619
+ - test/support/rails/config/environment.rb
608
620
  - test/support/rescue_example.rb
609
621
  - test/support/test_execution_log.rb
610
622
  - test/test_helper.rb