diff --git a/railties/lib/initializer.rb b/railties/lib/initializer.rb index 9e6e02e..3a3a794 100644 --- a/railties/lib/initializer.rb +++ b/railties/lib/initializer.rb @@ -9,7 +9,8 @@ require 'rails/plugin/locator' require 'rails/plugin/loader' require 'rails/gem_dependency' require 'rails/rack' - +require 'rails/database_spec_generator' +require 'rails/database_configurator' RAILS_ENV = (ENV['RAILS_ENV'] || 'development').dup unless defined?(RAILS_ENV) @@ -702,7 +703,7 @@ module Rails # contents of the file are processed via ERB before being sent through # YAML::load. def database_configuration - YAML::load(ERB.new(IO.read(database_configuration_file)).result) + Rails::DatabaseConfigurator.config(database_configuration_file) end # The path to the current environment's file (development.rb, etc.). By diff --git a/railties/lib/rails/database_configurator.rb b/railties/lib/rails/database_configurator.rb new file mode 100644 index 0000000..8179cf2 --- /dev/null +++ b/railties/lib/rails/database_configurator.rb @@ -0,0 +1,34 @@ +module Rails + class DatabaseConfigurator + def self.config(filename) + new(filename).specs + end + + attr_reader :filename + + def initialize(filename) + @filename = filename + end + + def specs + if ruby_config? + load filename + DatabaseSpecGenerator.specs + elsif yaml_config? + YAML::load(ERB.new(IO.read(filename)).result) + else + raise 'Unknown database configuration format' + end + end + + protected + + def ruby_config? + filename[-2, 2] == 'rb' + end + + def yaml_config? + filename[-3, 3] == 'yml' + end + end +end \ No newline at end of file diff --git a/railties/lib/rails/database_spec_generator.rb b/railties/lib/rails/database_spec_generator.rb new file mode 100644 index 0000000..db94730 --- /dev/null +++ b/railties/lib/rails/database_spec_generator.rb @@ -0,0 +1,22 @@ +module Rails + class DatabaseSpecGenerator + @@specs = {} + + def method_missing(env, *args) + options = args.extract_options! + @@specs[env.to_s] = options[:config] + end + + def self.map(&block) + returning(new) { |db| yield db } + end + + def self.specs + @@specs + end + + def self.reset + @@specs = {} + end + end +end \ No newline at end of file diff --git a/railties/test/database_configurator_test.rb b/railties/test/database_configurator_test.rb new file mode 100644 index 0000000..bb5d65b --- /dev/null +++ b/railties/test/database_configurator_test.rb @@ -0,0 +1,12 @@ +require 'abstract_unit' +require 'rails/database_configurator' + +class TestDatabaseConfigurator < Test::Unit::TestCase + def test_ruby_config + assert Rails::DatabaseConfigurator.new('database.rb').send(:ruby_config?) + end + + def test_yaml_config + assert Rails::DatabaseConfigurator.new('database.yml').send(:yaml_config?) + end +end diff --git a/railties/test/database_spec_generator_test.rb b/railties/test/database_spec_generator_test.rb new file mode 100644 index 0000000..8b8fe12 --- /dev/null +++ b/railties/test/database_spec_generator_test.rb @@ -0,0 +1,18 @@ +require 'abstract_unit' +require 'rails/database_spec_generator' + +class DatabaseSpecGeneratorTest < Test::Unit::TestCase + def setup + Rails::DatabaseSpecGenerator.reset + end + + def test_generate_config_block_form + Rails::DatabaseSpecGenerator.map do |db| + db.development :config => {:database => 'development.sqlite3', :adapter => 'sqlite3'} + db.test :config => {:database => 'test.sqlite3', :adapter => 'sqlite3'} + db.production :config => {:database => 'production.sqlite3', :adapter => 'sqlite3'} + end + + assert_equal({"development" => {:database => 'development.sqlite3', :adapter => 'sqlite3'}, "test" => {:database => 'test.sqlite3', :adapter => 'sqlite3'}, "production" => {:database => 'production.sqlite3', :adapter => 'sqlite3'}}, Rails::DatabaseSpecGenerator.specs) + end +end \ No newline at end of file