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.
117 118 119 |
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 117 def initialize(configurations) @configurations = configurations end |
Instance Attribute Details
#configurations ⇒ Object (readonly)
:nodoc:
113 114 115 |
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 113 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" }
137 138 139 140 141 142 143 144 145 |
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 137 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
148 149 150 151 152 153 154 |
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 148 def resolve_all config = configurations.dup 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" }
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
# File 'lib/active_record/connection_adapters/connection_specification.rb', line 168 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 'mysql', 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile.", e.backtrace end adapter_method = "#{spec[:adapter]}_connection" ConnectionSpecification.new(spec, adapter_method) end |