module Excursion::Pool

Public Class Methods

active_record_datastore() click to toggle source
# File lib/excursion/pool.rb, line 104
def self.active_record_datastore
  raise TableDoesNotExist, "To use the :active_record datastore you must first run `rails generate excursion:active_record` followed by `rake db:migrate` to create the storage table" unless Excursion::RoutePool.table_exists?
  @@datastore ||= Excursion::Datastores::ActiveRecord.new
end
active_record_with_memcache_datastore() click to toggle source
# File lib/excursion/pool.rb, line 109
def self.active_record_with_memcache_datastore
  raise MemcacheConfigurationError, "You must configure the :active_record_with_memcache datastore with a memcache_server" if Excursion.configuration.memcache_server.nil?
  raise TableDoesNotExist, "To use the :active_record_with_memcache datastore you must first run `rails generate excursion:active_record` followed by `rake db:migrate` to create the storage table" unless Excursion::RoutePool.table_exists?
  @@datastore ||= Excursion::Datastores::ActiveRecord.new(Excursion.configuration.memcache_server)
end
all_applications() click to toggle source
# File lib/excursion/pool.rb, line 10
def self.all_applications
  datastore.all_apps.each do |app|
    @@applications[app.name] = app
  end
  @@applications
end
app_hash_defaults() click to toggle source
# File lib/excursion/pool.rb, line 25
def self.app_hash_defaults
  {default_url_options: Excursion.configuration.default_url_options, routes: {}, registered_at: Time.now}
end
application(name) click to toggle source
# File lib/excursion/pool.rb, line 17
def self.application(name)
  check_local_cache
  return @@applications[name.to_s] if @@applications.has_key?(name.to_s) && !@@applications[name.to_s].nil?
  
  app = datastore.app(name)
  @@applications[name.to_s] = app unless app.nil?
end
check_local_cache() click to toggle source
# File lib/excursion/pool.rb, line 127
def self.check_local_cache
  (@@refreshed = Time.now.to_i) && (@@applications = {}) if pool_updated > pool_refreshed
end
datastore() click to toggle source
# File lib/excursion/pool.rb, line 80
def self.datastore
  raise NoDatastoreError, "You must configure excursion with a datastore." if Excursion.configuration.datastore.nil?
  require "excursion/datastores/#{Excursion.configuration.datastore.to_s}"

  send "#{Excursion.configuration.datastore.to_sym}_datastore"
end
datastore_class(type) click to toggle source
# File lib/excursion/pool.rb, line 87
def self.datastore_class(type)
  "Excursion::Datastores::#{type.to_s.capitalize}".constantize
end
file_datastore() click to toggle source
# File lib/excursion/pool.rb, line 96
def self.file_datastore
  simple_datastore(:file, :datastore_file)
end
memcache_datastore() click to toggle source
# File lib/excursion/pool.rb, line 100
def self.memcache_datastore
  simple_datastore(:memcache, :memcache_server)
end
pool_refreshed() click to toggle source
# File lib/excursion/pool.rb, line 123
def self.pool_refreshed
  @@refreshed ||= 0
end
pool_updated() click to toggle source
# File lib/excursion/pool.rb, line 119
def self.pool_updated
  datastore.get('_pool_updated').to_i || 0
end
register_application(app=nil, opts={}, &block) click to toggle source
# File lib/excursion/pool.rb, line 29
def self.register_application(app=nil, opts={}, &block)
  raise ArgumentError, "app must be an instance of Rails::Application" unless app.is_a?(Rails::Application) || block_given?
  opts = {store: true}.merge(opts)
  
  if app.is_a?(Rails::Application)
    name = app.class.name.underscore.split("/").first
    config = {default_url_options: Excursion.configuration.default_url_options}
    routes = app.routes.named_routes
    @@applications[name] = Application.new(name, config, routes)
  end
  
  if block_given?
    if name && @@applications.has_key?(name)
      DSL.block_eval(@@applications[name], &block)
    else
      block_app = DSL.block_eval(&block)
      name = block_app.name
      @@applications[name] = block_app
    end
  end
  
  if opts[:store]
    datastore.set(name, @@applications[name].to_cache)
    datastore.set('_pool_updated', Time.now.to_i)
  end
  @@applications[name]
end
register_hash(app_hash, opts={}) click to toggle source
# File lib/excursion/pool.rb, line 57
def self.register_hash(app_hash, opts={})
  raise ArgumentError, "you must provide at minimum a hash with a :name key" unless app_hash.is_a?(Hash) && app_hash.has_key?(:name)
  opts = {store: true}.merge(opts)
  
  app_hash = app_hash_defaults.merge(app_hash)
  name = app_hash[:name]

  if opts[:store]
    datastore.set(name, app_hash)
    datastore.set('_pool_updated', Time.now.to_i)
  end
  @@applications[name.to_s] = datastore.app(name)
end
remove_application(app) click to toggle source
# File lib/excursion/pool.rb, line 71
def self.remove_application(app)
  raise ArgumentError, "app must be an instance of Rails::Application" unless app.is_a?(Rails::Application)
  
  name = app.class.name.underscore.split("/").first
  datastore.delete(name)
  @@applications.delete(name)
  datastore.set('_pool_updated', Time.now.to_i)
end
secret_key_base() click to toggle source
# File lib/excursion/pool.rb, line 135
def self.secret_key_base
  key = datastore.get('_secret_key_base') || set_secret_key_base
end
set_secret_key_base() click to toggle source
# File lib/excursion/pool.rb, line 131
def self.set_secret_key_base
  datastore.set('_secret_key_base', Digest::MD5.hexdigest(SecureRandom.base64(32)))
end
simple_datastore(type, config_opt) click to toggle source
# File lib/excursion/pool.rb, line 91
def self.simple_datastore(type, config_opt)
  raise DatastoreConfigurationError, "You must configure the :#{type.to_s} datastore with a #{config_opt.to_s}" if Excursion.configuration.send(config_opt.to_sym).nil?
  @@datastore ||= datastore_class(type).new(Excursion.configuration.send(config_opt.to_sym))
end
test_datastore() click to toggle source
# File lib/excursion/pool.rb, line 115
def self.test_datastore
    @@datastore ||= Excursion::Datastores::Test.new
end