From 43073b393d234acd094ac7c220163f4e419d11f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20Mendon=C3=A7a=20Fran=C3=A7a?= Date: Tue, 19 Aug 2014 19:41:15 -0300 Subject: Revert "Improve custom configuration" This reverts commit de4891344ccc074f6d5693f4fac6ad610584e336. Conflicts: railties/lib/rails/railtie/configuration.rb It added regression. Will be back after the beta --- guides/source/4_2_release_notes.md | 18 +++-- guides/source/configuring.md | 16 ++--- railties/CHANGELOG.md | 16 ++--- railties/lib/rails/application/configuration.rb | 14 +++- railties/lib/rails/railtie/configuration.rb | 38 +--------- .../test/application/configuration/base_test.rb | 6 +- .../test/application/configuration/custom_test.rb | 81 ++-------------------- railties/test/railties/engine_test.rb | 2 +- 8 files changed, 46 insertions(+), 145 deletions(-) diff --git a/guides/source/4_2_release_notes.md b/guides/source/4_2_release_notes.md index b90e5025e2..f710b8bac9 100644 --- a/guides/source/4_2_release_notes.md +++ b/guides/source/4_2_release_notes.md @@ -78,24 +78,22 @@ Please refer to the [Changelog][railties] for detailed changes. * Introduced an `after_bundle` callback for use in Rails templates. ([Pull Request](https://github.com/rails/rails/pull/16359)) -* Custom configuration options can be chained: +* Introduced the `x` namespace for defining custom configuration options: ```ruby # config/environments/production.rb - config.payment_processing.schedule = :daily - config.payment_processing.retries = 3 - config.resque = { timeout: 60, inline_jobs: :always } - config.super_debugger = true + config.x.payment_processing.schedule = :daily + config.x.payment_processing.retries = 3 + config.x.super_debugger = true ``` These options are then available through the configuration object: ```ruby - Rails.configuration.payment_processing.schedule # => :daily - Rails.configuration.payment_processing.retries # => 3 - Rails.configuration.resque.timeout # => 60 - Rails.configuration.resque.inline_jobs # => :always - Rails.configuration.super_debugger # => true + Rails.configuration.x.payment_processing.schedule # => :daily + Rails.configuration.x.payment_processing.retries # => 3 + Rails.configuration.x.super_debugger # => true + Rails.configuration.x.super_debugger.not_set # => nil ``` ([Commit](https://github.com/rails/rails/commit/611849772dd66c2e4d005dcfe153f7ce79a8a7db)) diff --git a/guides/source/configuring.md b/guides/source/configuring.md index 6922dd681a..801cef5ca6 100644 --- a/guides/source/configuring.md +++ b/guides/source/configuring.md @@ -1006,18 +1006,16 @@ Custom configuration You can configure your own code through the Rails configuration object with custom configuration. It works like this: ```ruby - config.payment_processing.schedule = :daily - config.payment_processing.retries = 3 - config.resque = { timeout: 60, inline_jobs: :always } - config.super_debugger = true + config.x.payment_processing.schedule = :daily + config.x.payment_processing.retries = 3 + config.x.super_debugger = true ``` These configuration points are then available through the configuration object: ```ruby - Rails.configuration.payment_processing.schedule # => :daily - Rails.configuration.payment_processing.retries # => 3 - Rails.configuration.resque.timeout # => 60 - Rails.configuration.resque.inline_jobs # => :always - Rails.configuration.super_debugger # => true + Rails.configuration.x.payment_processing.schedule # => :daily + Rails.configuration.x.payment_processing.retries # => 3 + Rails.configuration.x.super_debugger # => true + Rails.configuration.x.super_debugger.not_set # => nil ``` diff --git a/railties/CHANGELOG.md b/railties/CHANGELOG.md index fdc6d1806e..9f3c3ccdf5 100644 --- a/railties/CHANGELOG.md +++ b/railties/CHANGELOG.md @@ -20,18 +20,16 @@ configure your own code through the Rails configuration object with custom configuration: # config/environments/production.rb - config.payment_processing.schedule = :daily - config.payment_processing.retries = 3 - config.resque = { timeout: 60, inline_jobs: :always } - config.super_debugger = true + config.x.payment_processing.schedule = :daily + config.x.payment_processing.retries = 3 + config.x.super_debugger = true These configuration points are then available through the configuration object: - Rails.configuration.payment_processing.schedule # => :daily - Rails.configuration.payment_processing.retries # => 3 - Rails.configuration.resque.timeout # => 60 - Rails.configuration.resque.inline_jobs # => :always - Rails.configuration.super_debugger # => true + Rails.configuration.x.payment_processing.schedule # => :daily + Rails.configuration.x.payment_processing.retries # => 3 + Rails.configuration.x.super_debugger # => true + Rails.configuration.x.super_debugger.not_set # => nil *DHH* diff --git a/railties/lib/rails/application/configuration.rb b/railties/lib/rails/application/configuration.rb index 5e8f4de847..782bc4b0f1 100644 --- a/railties/lib/rails/application/configuration.rb +++ b/railties/lib/rails/application/configuration.rb @@ -13,7 +13,7 @@ module Rails :railties_order, :relative_url_root, :secret_key_base, :secret_token, :serve_static_assets, :ssl_options, :static_cache_control, :session_options, :time_zone, :reload_classes_only_on_change, - :beginning_of_week, :filter_redirect + :beginning_of_week, :filter_redirect, :x attr_writer :log_level attr_reader :encoding @@ -48,6 +48,7 @@ module Rails @eager_load = nil @secret_token = nil @secret_key_base = nil + @x = Custom.new @assets = ActiveSupport::OrderedOptions.new @assets.enabled = true @@ -154,6 +155,17 @@ module Rails def annotations SourceAnnotationExtractor::Annotation end + + private + class Custom + def initialize + @configurations = Hash.new + end + + def method_missing(method, *args) + @configurations[method] ||= ActiveSupport::OrderedOptions.new + end + end end end end diff --git a/railties/lib/rails/railtie/configuration.rb b/railties/lib/rails/railtie/configuration.rb index c15cc1a144..eb3b2d8ef4 100644 --- a/railties/lib/rails/railtie/configuration.rb +++ b/railties/lib/rails/railtie/configuration.rb @@ -88,45 +88,11 @@ module Rails def method_missing(name, *args, &blk) if name.to_s =~ /=$/ - key = $`.to_sym - value = args.first - - if value.is_a?(Hash) - @@options[key] = ChainedConfigurationOptions.new value - else - @@options[key] = value - end + @@options[$`.to_sym] = args.first elsif @@options.key?(name) @@options[name] else - @@options[name] = ActiveSupport::OrderedOptions.new - end - end - - class ChainedConfigurationOptions < ActiveSupport::OrderedOptions # :nodoc: - def initialize(value) - value.each_pair { |k, v| set_value k, v } - end - - def method_missing(meth, *args) - if meth =~ /=$/ - key = $`.to_sym - value = args.first - - set_value key, value - else - self.fetch(meth) { super } - end - end - - private - - def set_value(key, value) - if value.is_a?(Hash) - value = self.class.new(value) - end - - self[key] = value + super end end end diff --git a/railties/test/application/configuration/base_test.rb b/railties/test/application/configuration/base_test.rb index 6e2b618160..d6a82b139d 100644 --- a/railties/test/application/configuration/base_test.rb +++ b/railties/test/application/configuration/base_test.rb @@ -5,8 +5,6 @@ require 'env_helpers' module ApplicationTests module ConfigurationTests class BaseTest < ActiveSupport::TestCase - include ActiveSupport::Testing::Isolation - def setup build_app boot_rails @@ -32,8 +30,8 @@ module ApplicationTests end def require_environment - require "#{app_path}/config/environment" + require "#{app_path}/config/environment" end end end -end +end \ No newline at end of file diff --git a/railties/test/application/configuration/custom_test.rb b/railties/test/application/configuration/custom_test.rb index e8c7a37913..045537fc28 100644 --- a/railties/test/application/configuration/custom_test.rb +++ b/railties/test/application/configuration/custom_test.rb @@ -1,84 +1,15 @@ require 'application/configuration/base_test' class ApplicationTests::ConfigurationTests::CustomTest < ApplicationTests::ConfigurationTests::BaseTest - test 'configuration top level can be chained' do + test 'access custom configuration point' do add_to_config <<-RUBY - config.resque.inline_jobs = :always - config.resque.timeout = 60 + config.x.resque.inline_jobs = :always + config.x.resque.timeout = 60 RUBY require_environment - assert_equal :always, Rails.configuration.resque.inline_jobs - assert_equal 60, Rails.configuration.resque.timeout - assert_nil Rails.configuration.resque.nothing - end - - test 'configuration top level accept normal values' do - add_to_config <<-RUBY - config.timeout = 60 - config.something_nil = nil - config.something_false = false - config.something_true = true - RUBY - require_environment - - assert_equal 60, Rails.configuration.timeout - assert_equal nil, Rails.configuration.something_nil - assert_equal false, Rails.configuration.something_false - assert_equal true, Rails.configuration.something_true - end - - test 'configuration top level builds options from hashes' do - add_to_config <<-RUBY - config.resque = { timeout: 60, inline_jobs: :always } - RUBY - require_environment - - assert_equal :always, Rails.configuration.resque.inline_jobs - assert_equal 60, Rails.configuration.resque.timeout - assert_nil Rails.configuration.resque.nothing - end - - test 'configuration top level builds options from hashes with string keys' do - add_to_config <<-RUBY - config.resque = { 'timeout' => 60, 'inline_jobs' => :always } - RUBY - require_environment - - assert_equal :always, Rails.configuration.resque.inline_jobs - assert_equal 60, Rails.configuration.resque.timeout - assert_nil Rails.configuration.resque.nothing - end - - test 'configuration top level builds nested options from hashes with symbol keys' do - add_to_config <<-RUBY - config.resque = { timeout: 60, inline_jobs: :always, url: { host: 'localhost', port: 8080 } } - config.resque.url.protocol = 'https' - config.resque.queues = { production: ['low_priority'] } - RUBY - require_environment - - assert_equal(:always, Rails.configuration.resque.inline_jobs) - assert_equal(60, Rails.configuration.resque.timeout) - assert_equal({ host: 'localhost', port: 8080, protocol: 'https' }, Rails.configuration.resque.url) - assert_equal('localhost', Rails.configuration.resque.url.host) - assert_equal(8080, Rails.configuration.resque.url.port) - assert_equal('https', Rails.configuration.resque.url.protocol) - assert_equal(['low_priority'], Rails.configuration.resque.queues.production) - assert_nil(Rails.configuration.resque.nothing) - end - - test 'configuration top level builds nested options from hashes with string keys' do - add_to_config <<-RUBY - config.resque = { 'timeout' => 60, 'inline_jobs' => :always, 'url' => { 'host' => 'localhost', 'port' => 8080 } } - RUBY - require_environment - - assert_equal(:always, Rails.configuration.resque.inline_jobs) - assert_equal(60, Rails.configuration.resque.timeout) - assert_equal({ host: 'localhost', port: 8080 }, Rails.configuration.resque.url) - assert_equal('localhost', Rails.configuration.resque.url.host) - assert_equal(8080, Rails.configuration.resque.url.port) - assert_nil(Rails.configuration.resque.nothing) + assert_equal :always, Rails.configuration.x.resque.inline_jobs + assert_equal 60, Rails.configuration.x.resque.timeout + assert_nil Rails.configuration.x.resque.nothing end end diff --git a/railties/test/railties/engine_test.rb b/railties/test/railties/engine_test.rb index da4eccd2b7..ec64ce5941 100644 --- a/railties/test/railties/engine_test.rb +++ b/railties/test/railties/engine_test.rb @@ -840,7 +840,7 @@ YAML Rails.application.load_seed assert Rails.application.config.app_seeds_loaded - assert_empty Bukkits::Engine.config.bukkits_seeds_loaded + assert_raise(NoMethodError) { Bukkits::Engine.config.bukkits_seeds_loaded } Bukkits::Engine.load_seed assert Bukkits::Engine.config.bukkits_seeds_loaded -- cgit v1.2.3