Class: ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver
- Inherits:
-
Object
- Object
- ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver
- Defined in:
- lib/active_record/connection_adapters/connection_specification.rb
Overview
Builds a ConnectionSpecification from user input.
Instance Attribute Summary collapse
-
#configurations ⇒ Object
readonly
:nodoc:.
Instance Method Summary collapse
-
#initialize(configurations) ⇒ Resolver
constructor
Accepts a hash two layers deep, keys on the first layer represent environments such as “production”.
-
#resolve(config) ⇒ Object
Returns a hash with database connection information.
-
#resolve_all ⇒ Object
Expands each key in @configurations hash into fully resolved hash.
-
#spec(config) ⇒ Object
Returns an instance of ConnectionSpecification for a given adapter.
Constructor Details
#initialize(configurations) ⇒ Resolver
Accepts a hash two layers deep, keys on the first layer represent environments such as “production”. Keys must be strings.
121 122 123 |
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 121 def initialize(configurations) @configurations = configurations end |
Instance Attribute Details
#configurations ⇒ Object (readonly)
:nodoc:
117 118 119 |
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 117 def configurations @configurations end |
Instance Method Details
#resolve(config) ⇒ Object
Returns a hash with database connection information.
Examples
Full hash Configuration.
configurations = { "production" => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" } }
Resolver.new(configurations).resolve(:production)
# => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3"}
Initialized with URL configuration strings.
configurations = { "production" => "postgresql://localhost/foo" }
Resolver.new(configurations).resolve(:production)
# => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
141 142 143 144 145 146 147 148 149 |
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 141 def resolve(config) if config resolve_connection config elsif env = ActiveRecord::ConnectionHandling::RAILS_ENV.call resolve_symbol_connection env.to_sym else raise AdapterNotSpecified end end |
#resolve_all ⇒ Object
Expands each key in @configurations hash into fully resolved hash
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 152 def resolve_all config = configurations.dup if env = ActiveRecord::ConnectionHandling::DEFAULT_ENV.call env_config = config[env] if config[env].is_a?(Hash) && !(config[env].key?("adapter") || config[env].key?("url")) end config.reject! { |k, v| v.is_a?(Hash) && !(v.key?("adapter") || v.key?("url")) } config.merge! env_config if env_config config.each do |key, value| config[key] = resolve(value) if value end config end |
#spec(config) ⇒ Object
Returns an instance of ConnectionSpecification for a given adapter. Accepts a hash one layer deep that contains all connection information.
Example
config = { "production" => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" } }
spec = Resolver.new(config).spec(:production)
spec.adapter_method
# => "sqlite3_connection"
spec.config
# => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" }
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 |
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 181 def spec(config) spec = resolve(config).symbolize_keys raise(AdapterNotSpecified, "database configuration does not specify adapter") unless spec.key?(:adapter) # Require the adapter itself and give useful feedback about # 1. Missing adapter gems and # 2. Adapter gems' missing dependencies. path_to_adapter = "active_record/connection_adapters/#{spec[:adapter]}_adapter" begin require path_to_adapter rescue LoadError => e # We couldn't require the adapter itself. Raise an exception that # points out config typos and missing gems. if e.path == path_to_adapter # We can assume that a non-builtin adapter was specified, so it's # either misspelled or missing from Gemfile. raise e.class, "Could not load the '#{spec[:adapter]}' Active Record adapter. Ensure that the adapter is spelled correctly in config/database.yml and that you've added the necessary adapter gem to your Gemfile.", e.backtrace # Bubbled up from the adapter require. Prefix the exception message # with some guidance about how to address it and reraise. else raise e.class, "Error loading the '#{spec[:adapter]}' Active Record adapter. Missing a gem it depends on? #{e.}", e.backtrace end end adapter_method = "#{spec[:adapter]}_connection" unless ActiveRecord::Base.respond_to?(adapter_method) raise AdapterNotFound, "database configuration specifies nonexistent #{spec.config[:adapter]} adapter" end ConnectionSpecification.new(spec.delete(:name) || "primary", spec, adapter_method) end |