TalentBox/sequel-rails

View on GitHub
lib/sequel_rails/configuration.rb

Summary

Maintainability
A
1 hr
Test Coverage
require 'active_support/core_ext/class/attribute_accessors'
require 'sequel_rails/db_config'

module SequelRails
  mattr_accessor :configuration

  def self.setup(environment)
    configuration.connect environment
  end

  class Configuration < ActiveSupport::OrderedOptions
    def self.for(root, database_yml_hash)
      ::SequelRails.configuration ||= begin
        config = new
        config.root = root
        config.raw = database_yml_hash
        config
      end
    end

    def initialize(*)
      super
      self.root = Rails.root
      self.raw = nil
      self.logger = nil
      self.migration_dir = nil
      self.schema_dump = default_schema_dump
      self.load_database_tasks = true
      self.after_connect = nil
      self.after_new_connection = nil
      self.skip_connect = nil
      self.test_connect = true
    end

    def environment_for(name)
      environments[name.to_s] || environments[name.to_sym]
    end

    def environments
      @environments ||= raw.reduce(
        # default config - use just the environment variable
        Hash.new(normalize_repository_config({}))
      ) do |normalized, environment|
        name = environment.first
        config = environment.last
        normalized[name] = normalize_repository_config(config)
        normalized
      end
    end

    def connect(environment)
      normalized_config = environment_for environment

      unless (normalized_config.keys & %w[adapter url]).any?
        raise "Database not configured.\n" \
            'Please create config/database.yml or set DATABASE_URL in environment.'
      end

      if normalized_config['url']
        ::Sequel.connect normalized_config['url'], SequelRails.deep_symbolize_keys(normalized_config)
      else
        ::Sequel.connect SequelRails.deep_symbolize_keys(normalized_config)
      end.tap { after_connect.call if after_connect.respond_to?(:call) }
    end

    private

    def default_schema_dump
      !%w[test production].include? Rails.env
    end

    def normalize_repository_config(hash)
      config = DbConfig.new hash, :root => root

      config['max_connections'] = max_connections if max_connections
      config['search_path'] = search_path if search_path
      config['servers'] = servers if servers
      config['test'] = test_connect
      config['after_connect'] = after_new_connection if after_new_connection

      url = ENV['DATABASE_URL']
      config['url'] ||= url if url

      # create the url if neccessary
      config['url'] ||= config.url if config['adapter'] =~ /^(jdbc|do):/

      config
    end
  end
end