class Dynflow::Rails::Configuration

Attributes

db_pool_size[RW]

the size of db connection pool

eager_load_paths[RW]
lazy_initialization[RW]
pool_size[RW]

the number of threads in the pool handling the execution

rake_tasks_with_executor[RW]

what rake tasks should run their own executor, not depending on the external one

remote[RW]

set true if the executor runs externally (by default true in procution, othewise false)

remote?[RW]

set true if the executor runs externally (by default true in procution, othewise false)

transaction_adapter[RW]

what transaction adapater should be used, by default, it uses the ActiveRecord based adapter, expecting ActiveRecord is used as ORM in the application

Public Class Methods

new() click to toggle source
# File lib/dynflow/rails/configuration.rb, line 25
def initialize
  self.pool_size                = 5
  self.db_pool_size             = pool_size + 5
  self.remote                   = ::Rails.env.production?
  self.transaction_adapter      = ::Dynflow::TransactionAdapters::ActiveRecord.new
  self.eager_load_paths         = []
  self.lazy_initialization      = !::Rails.env.production?
  self.rake_tasks_with_executor = %w(db:migrate db:seed)

  @on_init = []
end

Public Instance Methods

action_logger() click to toggle source

Action related info such as exceptions raised inside the actions' methods To be overridden in the Rails application

# File lib/dynflow/rails/configuration.rb, line 39
def action_logger
  ::Rails.logger
end
dynflow_logger() click to toggle source

Dynflow related info about the progress of the execution To be overridden in the Rails application

# File lib/dynflow/rails/configuration.rb, line 45
def dynflow_logger
  ::Rails.logger
end
increase_db_pool_size() click to toggle source

To avoid pottential timeouts on db connection pool, make sure we have the pool bigger than the thread pool

# File lib/dynflow/rails/configuration.rb, line 83
def increase_db_pool_size
  if increase_db_pool_size?
    ::ActiveRecord::Base.connection_pool.disconnect!

    config = ::ActiveRecord::Base.configurations[::Rails.env]
    config['pool'] = db_pool_size if config['pool'].to_i < db_pool_size
    ::ActiveRecord::Base.establish_connection(config)
  end
end
increase_db_pool_size?() click to toggle source
# File lib/dynflow/rails/configuration.rb, line 77
def increase_db_pool_size?
  !::Rails.env.test?
end
initialize_world(world_class = ::Dynflow::World) click to toggle source
# File lib/dynflow/rails/configuration.rb, line 57
def initialize_world(world_class = ::Dynflow::World)
  world_class.new(world_config)
end
on_init(&block) click to toggle source
# File lib/dynflow/rails/configuration.rb, line 49
def on_init(&block)
  @on_init << block
end
rake_task_with_executor?() click to toggle source
# File lib/dynflow/rails/configuration.rb, line 69
def rake_task_with_executor?
  return false unless defined?(::Rake)

  ::Rake.application.top_level_tasks.any? do |rake_task|
    rake_tasks_with_executor.include?(rake_task)
  end
end
run_on_init_hooks(world) click to toggle source
# File lib/dynflow/rails/configuration.rb, line 53
def run_on_init_hooks(world)
  @on_init.each { |init| init.call(world) }
end
world_config() click to toggle source

generates the options hash consumable by the Dynflow's world

# File lib/dynflow/rails/configuration.rb, line 94
def world_config
  ::Dynflow::Config.new.tap do |config|
    config.auto_rescue         = true
    config.logger_adapter      = ::Dynflow::LoggerAdapters::Delegator.new(action_logger, dynflow_logger)
    config.pool_size           = 5
    config.persistence_adapter = initialize_persistence
    config.transaction_adapter = transaction_adapter
    config.executor            = ->(world, _) { initialize_executor(world) }
    config.connector           = ->(world, _) { initialize_connector(world) }

    # we can't do any operation until the Rails.application.dynflow.world is set
    config.auto_execute        = false
  end
end

Protected Instance Methods

default_sequel_adapter_options() click to toggle source
# File lib/dynflow/rails/configuration.rb, line 111
def default_sequel_adapter_options
  db_config            = ::ActiveRecord::Base.configurations[::Rails.env].dup
  db_config['adapter'] = 'postgres' if db_config['adapter'] == 'postgresql'
  db_config['max_connections'] = db_pool_size if increase_db_pool_size?

  if db_config['adapter'] == 'sqlite3'
    db_config['adapter'] = 'sqlite'
    database = db_config['database']
    unless database == ':memory:'
      # We need to create separate database for sqlite
      # to avoid lock conflicts on the database
      db_config['database'] = "#{File.dirname(database)}/dynflow-#{File.basename(database)}"
    end
  end
  db_config
end
initialize_connector(world) click to toggle source
# File lib/dynflow/rails/configuration.rb, line 136
def initialize_connector(world)
  ::Dynflow::Connectors::Database.new(world)
end
initialize_executor(world) click to toggle source
# File lib/dynflow/rails/configuration.rb, line 128
def initialize_executor(world)
  if remote?
    false
  else
    ::Dynflow::Executors::Parallel.new(world, pool_size)
  end
end
initialize_persistence() click to toggle source

Sequel adapter based on Rails app database.yml configuration

# File lib/dynflow/rails/configuration.rb, line 141
def initialize_persistence
  ::Dynflow::PersistenceAdapters::Sequel.new(default_sequel_adapter_options)
end