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.
119 120 121 |
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 119 def initialize(configurations) @configurations = configurations end |
Instance Attribute Details
#configurations ⇒ Object (readonly)
:nodoc:
115 116 117 |
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 115 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" }
139 140 141 142 143 144 145 146 147 |
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 139 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
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 150 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" }
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 179 def spec(config) spec = resolve(config).symbolize_keys raise(AdapterNotSpecified, "database configuration does not specify adapter") unless spec.key?(:adapter) path_to_adapter = "active_record/connection_adapters/#{spec[:adapter]}_adapter" begin require path_to_adapter rescue Gem::LoadError => e raise Gem::LoadError, "Specified '#{spec[:adapter]}' for database adapter, but the gem is not loaded. Add `gem '#{e.name}'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord)." rescue LoadError => e raise LoadError, "Could not load '#{path_to_adapter}'. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile.", e.backtrace 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 |