diff options
author | Xavier Noria <fxn@hashref.com> | 2010-03-31 07:47:58 -0700 |
---|---|---|
committer | Xavier Noria <fxn@hashref.com> | 2010-03-31 07:47:58 -0700 |
commit | 824fa10f4d1306cc1e310a7d5de7e95cfb07d6f8 (patch) | |
tree | 1967c2a945d6e131d467fb4f0178a0f60e01ae8a /actionpack | |
parent | 1ed1652bef981d9402797b6cb9f0920a40eea21a (diff) | |
parent | db28d407f76a790a31e27bf51560e23425dd6944 (diff) | |
download | rails-824fa10f4d1306cc1e310a7d5de7e95cfb07d6f8.tar.gz rails-824fa10f4d1306cc1e310a7d5de7e95cfb07d6f8.tar.bz2 rails-824fa10f4d1306cc1e310a7d5de7e95cfb07d6f8.zip |
Merge commit 'rails/master'
Diffstat (limited to 'actionpack')
56 files changed, 466 insertions, 205 deletions
diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb index 5797282b41..46a175d2fa 100644 --- a/actionpack/lib/action_controller/base.rb +++ b/actionpack/lib/action_controller/base.rb @@ -64,8 +64,7 @@ module ActionController filter end - ActionController.run_base_hooks(self) - + ActiveSupport.run_load_hooks(:action_controller, self) end end diff --git a/actionpack/lib/action_controller/deprecated/base.rb b/actionpack/lib/action_controller/deprecated/base.rb index bbde570ca9..2fd60aacc7 100644 --- a/actionpack/lib/action_controller/deprecated/base.rb +++ b/actionpack/lib/action_controller/deprecated/base.rb @@ -66,6 +66,18 @@ module ActionController Rails.application.config.action_dispatch.ip_spoofing_check end + def cookie_verifier_secret=(value) + ActiveSupport::Deprecation.warn "ActionController::Base.cookie_verifier_secret= is deprecated. " << + "Please configure it on your application with config.cookie_secret=", caller + ActionController::Base.config.secret = value + end + + def cookie_verifier_secret + ActiveSupport::Deprecation.warn "ActionController::Base.cookie_verifier_secret is deprecated. " << + "Please use ActionController::Base.config.secret instead.", caller + ActionController::Base.config.secret + end + def trusted_proxies=(value) ActiveSupport::Deprecation.warn "ActionController::Base.trusted_proxies= is deprecated. " << "Please configure it on your application with config.action_dispatch.trusted_proxies=", caller diff --git a/actionpack/lib/action_controller/metal/cookies.rb b/actionpack/lib/action_controller/metal/cookies.rb index 7aa687b52c..75e5d40a63 100644 --- a/actionpack/lib/action_controller/metal/cookies.rb +++ b/actionpack/lib/action_controller/metal/cookies.rb @@ -6,7 +6,6 @@ module ActionController #:nodoc: included do helper_method :cookies - cattr_accessor :cookie_verifier_secret end private diff --git a/actionpack/lib/action_controller/metal/http_authentication.rb b/actionpack/lib/action_controller/metal/http_authentication.rb index 6ec788f302..424828f7e8 100644 --- a/actionpack/lib/action_controller/metal/http_authentication.rb +++ b/actionpack/lib/action_controller/metal/http_authentication.rb @@ -1,4 +1,5 @@ require 'active_support/base64' +require 'active_support/core_ext/object/blank' module ActionController module HttpAuthentication diff --git a/actionpack/lib/action_controller/metal/renderers.rb b/actionpack/lib/action_controller/metal/renderers.rb index d906e1fb5b..aebd71e867 100644 --- a/actionpack/lib/action_controller/metal/renderers.rb +++ b/actionpack/lib/action_controller/metal/renderers.rb @@ -1,4 +1,5 @@ require 'active_support/core_ext/class/attribute' +require 'active_support/core_ext/object/blank' module ActionController def self.add_renderer(key, &block) diff --git a/actionpack/lib/action_controller/railtie.rb b/actionpack/lib/action_controller/railtie.rb index 0ec89928af..29d8523ee1 100644 --- a/actionpack/lib/action_controller/railtie.rb +++ b/actionpack/lib/action_controller/railtie.rb @@ -41,7 +41,7 @@ module ActionController log_subscriber :action_controller, ActionController::Railties::LogSubscriber.new initializer "action_controller.logger" do - ActionController.base_hook { self.logger ||= Rails.logger } + ActiveSupport.on_load(:action_controller) { self.logger ||= Rails.logger } end initializer "action_controller.set_configs" do |app| @@ -53,23 +53,23 @@ module ActionController ac.stylesheets_dir = paths.public.stylesheets.to_a.first ac.secret = app.config.cookie_secret - ActionController.base_hook do + ActiveSupport.on_load(:action_controller) do self.config.merge!(ac) end end initializer "action_controller.initialize_framework_caches" do - ActionController.base_hook { self.cache_store ||= RAILS_CACHE } + ActiveSupport.on_load(:action_controller) { self.cache_store ||= RAILS_CACHE } end initializer "action_controller.set_helpers_path" do |app| - ActionController.base_hook do + ActiveSupport.on_load(:action_controller) do self.helpers_path = app.config.paths.app.helpers.to_a end end initializer "action_controller.url_helpers" do |app| - ActionController.base_hook do + ActiveSupport.on_load(:action_controller) do extend ::ActionController::Railties::UrlHelpers.with(app.routes) end diff --git a/actionpack/lib/action_controller/railties/log_subscriber.rb b/actionpack/lib/action_controller/railties/log_subscriber.rb index c2299d0b05..00ac3bdf67 100644 --- a/actionpack/lib/action_controller/railties/log_subscriber.rb +++ b/actionpack/lib/action_controller/railties/log_subscriber.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/object/blank' + module ActionController module Railties class LogSubscriber < Rails::LogSubscriber diff --git a/actionpack/lib/action_controller/railties/url_helpers.rb b/actionpack/lib/action_controller/railties/url_helpers.rb index 5f95e1c621..9df5665542 100644 --- a/actionpack/lib/action_controller/railties/url_helpers.rb +++ b/actionpack/lib/action_controller/railties/url_helpers.rb @@ -1,14 +1,14 @@ module ActionController module Railties module UrlHelpers - def self.with(router) + def self.with(routes) Module.new do define_method(:inherited) do |klass| super(klass) - klass.send(:include, router.url_helpers) + klass.send(:include, routes.url_helpers) end end end end end -end
\ No newline at end of file +end diff --git a/actionpack/lib/action_controller/record_identifier.rb b/actionpack/lib/action_controller/record_identifier.rb index 3f966b1b64..7fdaffe3eb 100644 --- a/actionpack/lib/action_controller/record_identifier.rb +++ b/actionpack/lib/action_controller/record_identifier.rb @@ -76,8 +76,8 @@ module ActionController # method that replaces all characters that are invalid inside DOM ids, with valid ones. You need to # make sure yourself that your dom ids are valid, in case you overwrite this method. def record_key_for_dom_id(record) - return record.id unless record.respond_to?(:to_model) - key = record.to_model.to_key + record = record.to_model if record.respond_to?(:to_model) + key = record.to_key key ? sanitize_dom_id(key.join('_')) : key end diff --git a/actionpack/lib/action_controller/test_case.rb b/actionpack/lib/action_controller/test_case.rb index 120f34460e..2d4cf2fafb 100644 --- a/actionpack/lib/action_controller/test_case.rb +++ b/actionpack/lib/action_controller/test_case.rb @@ -1,4 +1,5 @@ require 'rack/session/abstract/id' +require 'active_support/core_ext/object/blank' module ActionController module TemplateAssertions @@ -117,9 +118,9 @@ module ActionController end end - def assign_parameters(router, controller_path, action, parameters = {}) + def assign_parameters(routes, controller_path, action, parameters = {}) parameters = parameters.symbolize_keys.merge(:controller => controller_path, :action => action) - extra_keys = router.extra_keys(parameters) + extra_keys = routes.extra_keys(parameters) non_path_parameters = get? ? query_parameters : request_parameters parameters.each do |key, value| if value.is_a? Fixnum @@ -321,7 +322,7 @@ module ActionController def process(action, parameters = nil, session = nil, flash = nil, http_method = 'GET') # Sanity check for required instance variables so we can give an # understandable error message. - %w(@router @controller @request @response).each do |iv_name| + %w(@routes @controller @request @response).each do |iv_name| if !(instance_variable_names.include?(iv_name) || instance_variable_names.include?(iv_name.to_sym)) || instance_variable_get(iv_name).nil? raise "#{iv_name} is nil: make sure you set it in your test's setup method." end @@ -337,7 +338,7 @@ module ActionController @request.env['REQUEST_METHOD'] = http_method parameters ||= {} - @request.assign_parameters(@router, @controller.class.name.underscore.sub(/_controller$/, ''), action.to_s, parameters) + @request.assign_parameters(@routes, @controller.class.name.underscore.sub(/_controller$/, ''), action.to_s, parameters) @request.session = ActionController::TestSession.new(session) unless session.nil? @request.session["flash"] = @request.flash.update(flash || {}) @@ -446,7 +447,7 @@ module ActionController :relative_url_root => nil, :_path_segments => @request.symbolized_path_parameters) - url, query_string = @router.url_for(options).split("?", 2) + url, query_string = @routes.url_for(options).split("?", 2) @request.env["SCRIPT_NAME"] = @controller.config.relative_url_root @request.env["PATH_INFO"] = url diff --git a/actionpack/lib/action_dispatch/http/cache.rb b/actionpack/lib/action_dispatch/http/cache.rb index d2404e63c5..9b9e81440b 100644 --- a/actionpack/lib/action_dispatch/http/cache.rb +++ b/actionpack/lib/action_dispatch/http/cache.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/object/blank' + module ActionDispatch module Http module Cache diff --git a/actionpack/lib/action_dispatch/http/filter_parameters.rb b/actionpack/lib/action_dispatch/http/filter_parameters.rb index e42b4d09b0..152aaa2e67 100644 --- a/actionpack/lib/action_dispatch/http/filter_parameters.rb +++ b/actionpack/lib/action_dispatch/http/filter_parameters.rb @@ -1,5 +1,6 @@ require 'active_support/core_ext/object/blank' require 'active_support/core_ext/hash/keys' +require 'active_support/core_ext/object/duplicable' module ActionDispatch module Http diff --git a/actionpack/lib/action_dispatch/http/mime_negotiation.rb b/actionpack/lib/action_dispatch/http/mime_negotiation.rb index fec250e928..be89924015 100644 --- a/actionpack/lib/action_dispatch/http/mime_negotiation.rb +++ b/actionpack/lib/action_dispatch/http/mime_negotiation.rb @@ -5,7 +5,7 @@ module ActionDispatch # # For backward compatibility, the post \format is extracted from the # X-Post-Data-Format HTTP header if present. - def content_type + def content_mime_type @env["action_dispatch.request.content_type"] ||= begin if @env['CONTENT_TYPE'] =~ /^([^,\;]*)/ Mime::Type.lookup($1.strip.downcase) @@ -15,13 +15,17 @@ module ActionDispatch end end + def content_type + content_mime_type && content_mime_type.to_s + end + # Returns the accepted MIME type for the request. def accepts @env["action_dispatch.request.accepts"] ||= begin header = @env['HTTP_ACCEPT'].to_s.strip if header.empty? - [content_type] + [content_mime_type] else Mime::Type.parse(header) end diff --git a/actionpack/lib/action_dispatch/http/mime_type.rb b/actionpack/lib/action_dispatch/http/mime_type.rb index 3f1a77295d..d6a805bf3b 100644 --- a/actionpack/lib/action_dispatch/http/mime_type.rb +++ b/actionpack/lib/action_dispatch/http/mime_type.rb @@ -1,5 +1,6 @@ require 'set' require 'active_support/core_ext/class/attribute_accessors' +require 'active_support/core_ext/object/blank' module Mime class Mimes < Array diff --git a/actionpack/lib/action_dispatch/http/request.rb b/actionpack/lib/action_dispatch/http/request.rb index ea9f0f99c2..8b8426b5aa 100755 --- a/actionpack/lib/action_dispatch/http/request.rb +++ b/actionpack/lib/action_dispatch/http/request.rb @@ -96,11 +96,11 @@ module ActionDispatch end def forgery_whitelisted? - method == :get || xhr? || content_type.nil? || !content_type.verify_request? + method == :get || xhr? || content_mime_type.nil? || !content_mime_type.verify_request? end def media_type - content_type.to_s + content_mime_type.to_s end # Returns the content length of the request as an integer. @@ -157,7 +157,7 @@ module ActionDispatch end def form_data? - FORM_DATA_MEDIA_TYPES.include?(content_type.to_s) + FORM_DATA_MEDIA_TYPES.include?(content_mime_type.to_s) end def body_stream #:nodoc: diff --git a/actionpack/lib/action_dispatch/http/response.rb b/actionpack/lib/action_dispatch/http/response.rb index 9cfe5a5ea9..362e5ec970 100644 --- a/actionpack/lib/action_dispatch/http/response.rb +++ b/actionpack/lib/action_dispatch/http/response.rb @@ -1,5 +1,6 @@ require 'digest/md5' require 'active_support/core_ext/module/delegation' +require 'active_support/core_ext/object/blank' module ActionDispatch # :nodoc: # Represents an HTTP response generated by a controller action. One can use diff --git a/actionpack/lib/action_dispatch/http/upload.rb b/actionpack/lib/action_dispatch/http/upload.rb index dc6121b911..81d2517304 100644 --- a/actionpack/lib/action_dispatch/http/upload.rb +++ b/actionpack/lib/action_dispatch/http/upload.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/object/blank' + module ActionDispatch module Http module UploadedFile diff --git a/actionpack/lib/action_dispatch/middleware/cookies.rb b/actionpack/lib/action_dispatch/middleware/cookies.rb index ab7130ab08..cb0d12cab1 100644 --- a/actionpack/lib/action_dispatch/middleware/cookies.rb +++ b/actionpack/lib/action_dispatch/middleware/cookies.rb @@ -168,12 +168,12 @@ module ActionDispatch class SignedCookieJar < CookieJar #:nodoc: def initialize(parent_jar) - unless ActionController::Base.cookie_verifier_secret - raise "You must set ActionController::Base.cookie_verifier_secret to use signed cookies" + unless ActionController::Base.config.secret + raise "You must set ActionController::Base.config.secret" end @parent_jar = parent_jar - @verifier = ActiveSupport::MessageVerifier.new(ActionController::Base.cookie_verifier_secret) + @verifier = ActiveSupport::MessageVerifier.new(ActionController::Base.config.secret) end def [](name) diff --git a/actionpack/lib/action_dispatch/middleware/params_parser.rb b/actionpack/lib/action_dispatch/middleware/params_parser.rb index f4c4324fb0..18a3688bb0 100644 --- a/actionpack/lib/action_dispatch/middleware/params_parser.rb +++ b/actionpack/lib/action_dispatch/middleware/params_parser.rb @@ -25,7 +25,9 @@ module ActionDispatch return false if request.content_length.zero? - mime_type = content_type_from_legacy_post_data_format_header(env) || request.content_type + mime_type = content_type_from_legacy_post_data_format_header(env) || + request.content_mime_type + strategy = @parsers[mime_type] return false unless strategy @@ -53,7 +55,7 @@ module ActionDispatch raise { "body" => request.raw_post, - "content_type" => request.content_type, + "content_type" => request.content_mime_type, "content_length" => request.content_length, "exception" => "#{e.message} (#{e.class})", "backtrace" => e.backtrace } diff --git a/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb b/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb index 311880cabc..dddedc832f 100644 --- a/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb +++ b/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb @@ -1,5 +1,6 @@ require 'rack/utils' require 'rack/request' +require 'active_support/core_ext/object/blank' module ActionDispatch module Session diff --git a/actionpack/lib/action_dispatch/middleware/session/cookie_store.rb b/actionpack/lib/action_dispatch/middleware/session/cookie_store.rb index 22da82479e..3331b7c25e 100644 --- a/actionpack/lib/action_dispatch/middleware/session/cookie_store.rb +++ b/actionpack/lib/action_dispatch/middleware/session/cookie_store.rb @@ -1,4 +1,5 @@ require 'active_support/core_ext/hash/keys' +require 'active_support/core_ext/object/blank' module ActionDispatch module Session diff --git a/actionpack/lib/action_dispatch/routing/deprecated_mapper.rb b/actionpack/lib/action_dispatch/routing/deprecated_mapper.rb index 58beaf4824..e8c2e74314 100644 --- a/actionpack/lib/action_dispatch/routing/deprecated_mapper.rb +++ b/actionpack/lib/action_dispatch/routing/deprecated_mapper.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/object/blank' + module ActionDispatch module Routing class RouteSet diff --git a/actionpack/lib/action_dispatch/routing/mapper.rb b/actionpack/lib/action_dispatch/routing/mapper.rb index 39260f7ff9..74d0297898 100644 --- a/actionpack/lib/action_dispatch/routing/mapper.rb +++ b/actionpack/lib/action_dispatch/routing/mapper.rb @@ -1,4 +1,5 @@ require 'active_support/core_ext/hash/except' +require 'active_support/core_ext/object/blank' module ActionDispatch module Routing @@ -258,6 +259,7 @@ module ActionDispatch def scope(*args) options = args.extract_options! + options = options.dup case args.first when String @@ -423,8 +425,13 @@ module ActionDispatch singular end + # Checks for uncountable plurals, and appends "_index" if they're. def collection_name - plural + uncountable? ? "#{plural}_index" : plural + end + + def uncountable? + singular == plural end def name_for_action(action) @@ -439,6 +446,32 @@ module ActionDispatch def id_segment ":#{singular}_id" end + + def constraints + options[:constraints] || {} + end + + def id_constraint? + options[:id] && options[:id].is_a?(Regexp) || constraints[:id] && constraints[:id].is_a?(Regexp) + end + + def id_constraint + options[:id] || constraints[:id] + end + + def collection_options + (options || {}).dup.tap do |options| + options.delete(:id) + options[:constraints] = options[:constraints].dup if options[:constraints] + options[:constraints].delete(:id) if options[:constraints].is_a?(Hash) + end + end + + def nested_options + options = { :name_prefix => member_name } + options["#{singular}_id".to_sym] = id_constraint if id_constraint? + options + end end class SingletonResource < Resource #:nodoc: @@ -483,12 +516,14 @@ module ActionDispatch yield if block_given? end - get :show if resource.actions.include?(:show) - post :create if resource.actions.include?(:create) - put :update if resource.actions.include?(:update) - delete :destroy if resource.actions.include?(:destroy) - get :new, :as => resource.name if resource.actions.include?(:new) - get :edit, :as => resource.name if resource.actions.include?(:edit) + scope(resource.options) do + get :show if resource.actions.include?(:show) + post :create if resource.actions.include?(:create) + put :update if resource.actions.include?(:update) + delete :destroy if resource.actions.include?(:destroy) + get :new, :as => resource.name if resource.actions.include?(:new) + get :edit, :as => resource.name if resource.actions.include?(:edit) + end end end @@ -509,17 +544,21 @@ module ActionDispatch yield if block_given? with_scope_level(:collection) do - get :index if resource.actions.include?(:index) - post :create if resource.actions.include?(:create) - get :new, :as => resource.singular if resource.actions.include?(:new) + scope(resource.collection_options) do + get :index if resource.actions.include?(:index) + post :create if resource.actions.include?(:create) + get :new, :as => resource.singular if resource.actions.include?(:new) + end end with_scope_level(:member) do scope(':id') do - get :show if resource.actions.include?(:show) - put :update if resource.actions.include?(:update) - delete :destroy if resource.actions.include?(:destroy) - get :edit, :as => resource.singular if resource.actions.include?(:edit) + scope(resource.options) do + get :show if resource.actions.include?(:show) + put :update if resource.actions.include?(:update) + delete :destroy if resource.actions.include?(:destroy) + get :edit, :as => resource.singular if resource.actions.include?(:edit) + end end end end @@ -558,7 +597,7 @@ module ActionDispatch end with_scope_level(:nested) do - scope(parent_resource.id_segment, :name_prefix => parent_resource.member_name) do + scope(parent_resource.id_segment, parent_resource.nested_options) do yield end end diff --git a/actionpack/lib/action_dispatch/testing/assertions/routing.rb b/actionpack/lib/action_dispatch/testing/assertions/routing.rb index 1bb81ede3b..b7e9b0c95a 100644 --- a/actionpack/lib/action_dispatch/testing/assertions/routing.rb +++ b/actionpack/lib/action_dispatch/testing/assertions/routing.rb @@ -80,7 +80,7 @@ module ActionDispatch expected_path = "/#{expected_path}" unless expected_path[0] == ?/ # Load routes.rb if it hasn't been loaded. - generated_path, extra_keys = @router.generate_extras(options, defaults) + generated_path, extra_keys = @routes.generate_extras(options, defaults) found_extras = options.reject {|k, v| ! extra_keys.include? k} msg = build_message(message, "found extras <?>, not <?>", found_extras, extras) @@ -125,7 +125,7 @@ module ActionDispatch end # A helper to make it easier to test different route configurations. - # This method temporarily replaces @router + # This method temporarily replaces @routes # with a new RouteSet instance. # # The new instance is yielded to the passed block. Typically the block @@ -142,9 +142,9 @@ module ActionDispatch # end # def with_routing - old_routes, @router = @router, ActionDispatch::Routing::RouteSet.new + old_routes, @routes = @routes, ActionDispatch::Routing::RouteSet.new old_controller, @controller = @controller, @controller.clone if @controller - _router = @router + _routes = @routes # Unfortunately, there is currently an abstraction leak between AC::Base # and AV::Base which requires having the URL helpers in both AC and AV. @@ -153,14 +153,14 @@ module ActionDispatch # # TODO: Make this unnecessary if @controller - @controller.singleton_class.send(:include, _router.url_helpers) + @controller.singleton_class.send(:include, _routes.url_helpers) @controller.view_context_class = Class.new(@controller.view_context_class) do - include _router.url_helpers + include _routes.url_helpers end end - yield @router + yield @routes ensure - @router = old_routes + @routes = old_routes if @controller @controller = old_controller end @@ -168,7 +168,7 @@ module ActionDispatch # ROUTES TODO: These assertions should really work in an integration context def method_missing(selector, *args, &block) - if @controller && @router.named_routes.helpers.include?(selector) + if @controller && @routes && @routes.named_routes.helpers.include?(selector) @controller.send(selector, *args, &block) else super @@ -185,7 +185,7 @@ module ActionDispatch request.env["REQUEST_METHOD"] = request_method.to_s.upcase if request_method request.path = path - params = @router.recognize_path(path, { :method => request.method }) + params = @routes.recognize_path(path, { :method => request.method }) request.path_parameters = params.with_indifferent_access request diff --git a/actionpack/lib/action_dispatch/testing/performance_test.rb b/actionpack/lib/action_dispatch/testing/performance_test.rb index 1b9a6c18b7..33a5c68b9d 100644 --- a/actionpack/lib/action_dispatch/testing/performance_test.rb +++ b/actionpack/lib/action_dispatch/testing/performance_test.rb @@ -1,7 +1,7 @@ require 'active_support/testing/performance' require 'active_support/testing/default' -if defined?(ActiveSupport::Testing::Performance) +begin module ActionDispatch # An integration test that runs a code profiler on your test methods. # Profiling output for combinations of each test method, measurement, and @@ -14,4 +14,6 @@ if defined?(ActiveSupport::Testing::Performance) include ActiveSupport::Testing::Default end end +rescue NameError + $stderr.puts "Specify ruby-prof as application's dependency in Gemfile to run benchmarks." end
\ No newline at end of file diff --git a/actionpack/lib/action_dispatch/testing/test_request.rb b/actionpack/lib/action_dispatch/testing/test_request.rb index 20288aa7a5..090e03cf44 100644 --- a/actionpack/lib/action_dispatch/testing/test_request.rb +++ b/actionpack/lib/action_dispatch/testing/test_request.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/object/blank' + module ActionDispatch class TestRequest < Request DEFAULT_ENV = Rack::MockRequest.env_for('/') diff --git a/actionpack/lib/action_view/base.rb b/actionpack/lib/action_view/base.rb index 919b1e3470..a9b0715b2e 100644 --- a/actionpack/lib/action_view/base.rb +++ b/actionpack/lib/action_view/base.rb @@ -173,7 +173,7 @@ module ActionView #:nodoc: delegate :logger, :to => 'ActionController::Base', :allow_nil => true end - ActionView.run_base_hooks(self) + ActiveSupport.run_load_hooks(:action_view, self) attr_accessor :base_path, :assigns, :template_extension, :lookup_context attr_internal :captures, :request, :controller, :template, :config diff --git a/actionpack/lib/action_view/helpers/active_model_helper.rb b/actionpack/lib/action_view/helpers/active_model_helper.rb index 80b3d3a664..44e193f18e 100644 --- a/actionpack/lib/action_view/helpers/active_model_helper.rb +++ b/actionpack/lib/action_view/helpers/active_model_helper.rb @@ -6,7 +6,7 @@ require 'active_support/core_ext/kernel/reporting' require 'active_support/core_ext/object/blank' module ActionView - ActionView.base_hook do + ActiveSupport.on_load(:action_view) do class ActionView::Base @@field_error_proc = Proc.new{ |html_tag, instance| "<div class=\"fieldWithErrors\">#{html_tag}</div>".html_safe } cattr_accessor :field_error_proc @@ -97,10 +97,10 @@ module ActionView end # Returns a string containing the error message attached to the +method+ on the +object+ if one exists. - # This error message is wrapped in a <tt>DIV</tt> tag, which can be extended to include a <tt>:prepend_text</tt> - # and/or <tt>:append_text</tt> (to properly explain the error), and a <tt>:css_class</tt> to style it - # accordingly. +object+ should either be the name of an instance variable or the actual object. The method can be - # passed in either as a string or a symbol. + # This error message is wrapped in a <tt>DIV</tt> tag by default or with <tt>:html_tag</tt> if specified, + # which can be extended to include a <tt>:prepend_text</tt> and/or <tt>:append_text</tt> (to properly explain + # the error), and a <tt>:css_class</tt> to style it accordingly. +object+ should either be the name of an + # instance variable or the actual object. The method can be passed in either as a string or a symbol. # As an example, let's say you have a model <tt>@post</tt> that has an error message on the +title+ attribute: # # <%= error_message_on "post", "title" %> @@ -112,25 +112,28 @@ module ActionView # <%= error_message_on "post", "title", # :prepend_text => "Title simply ", # :append_text => " (or it won't work).", + # :html_tag => "span", # :css_class => "inputError" %> + # # => <span class="inputError">Title simply can't be empty (or it won't work).</span> def error_message_on(object, method, *args) options = args.extract_options! unless args.empty? ActiveSupport::Deprecation.warn('error_message_on takes an option hash instead of separate ' + - 'prepend_text, append_text, and css_class arguments', caller) + 'prepend_text, append_text, html_tag, and css_class arguments', caller) options[:prepend_text] = args[0] || '' options[:append_text] = args[1] || '' - options[:css_class] = args[2] || 'formError' + options[:html_tag] = args[2] || 'div' + options[:css_class] = args[3] || 'formError' end - options.reverse_merge!(:prepend_text => '', :append_text => '', :css_class => 'formError') + options.reverse_merge!(:prepend_text => '', :append_text => '', :html_tag => 'div', :css_class => 'formError') object = convert_to_model(object) if (obj = (object.respond_to?(:errors) ? object : instance_variable_get("@#{object}"))) && (errors = obj.errors[method]).presence - content_tag("div", - "#{options[:prepend_text]}#{ERB::Util.h(errors.first)}#{options[:append_text]}".html_safe, + content_tag(options[:html_tag], + (options[:prepend_text].html_safe << errors.first).safe_concat(options[:append_text]), :class => options[:css_class] ) else diff --git a/actionpack/lib/action_view/helpers/asset_tag_helper.rb b/actionpack/lib/action_view/helpers/asset_tag_helper.rb index 02ad41719b..e4ec17467e 100644 --- a/actionpack/lib/action_view/helpers/asset_tag_helper.rb +++ b/actionpack/lib/action_view/helpers/asset_tag_helper.rb @@ -108,7 +108,7 @@ module ActionView # "http://asset%d.example.com", "https://asset1.example.com" # ) # - # === Using asset timestamps + # === Customizing the asset path # # By default, Rails appends asset's timestamps to all asset paths. This allows # you to set a cache-expiration date for the asset far into the future, but @@ -133,6 +133,65 @@ module ActionView # will request the same assets over and over again even thought they didn't # change. You can use something like Live HTTP Headers for Firefox to verify # that the cache is indeed working. + # + # This strategy works well enough for most server setups and requires the + # least configuration, but if you deploy several application servers at + # different times - say to handle a temporary spike in load - then the + # asset time stamps will be out of sync. In a setup like this you may want + # to set the way that asset paths are generated yourself. + # + # Altering the asset paths that Rails generates can be done in two ways. + # The easiest is to define the RAILS_ASSET_ID environment variable. The + # contents of this variable will always be used in preference to + # calculated timestamps. A more complex but flexible way is to set + # <tt>ActionController::Base.config.asset_path</tt> to a proc + # that takes the unmodified asset path and returns the path needed for + # your asset caching to work. Typically you'd do something like this in + # <tt>config/environments/production.rb</tt>: + # + # # Normally you'd calculate RELEASE_NUMBER at startup. + # RELEASE_NUMBER = 12345 + # config.action_controller.asset_path_template = proc { |asset_path| + # "/release-#{RELEASE_NUMBER}#{asset_path}" + # } + # + # This example would cause the following behaviour on all servers no + # matter when they were deployed: + # + # image_tag("rails.png") + # # => <img alt="Rails" src="/release-12345/images/rails.png" /> + # stylesheet_link_tag("application") + # # => <link href="/release-12345/stylesheets/application.css?1232285206" media="screen" rel="stylesheet" type="text/css" /> + # + # Changing the asset_path does require that your web servers have + # knowledge of the asset template paths that you rewrite to so it's not + # suitable for out-of-the-box use. To use the example given above you + # could use something like this in your Apache VirtualHost configuration: + # + # <LocationMatch "^/release-\d+/(images|javascripts|stylesheets)/.*$"> + # # Some browsers still send conditional-GET requests if there's a + # # Last-Modified header or an ETag header even if they haven't + # # reached the expiry date sent in the Expires header. + # Header unset Last-Modified + # Header unset ETag + # FileETag None + # + # # Assets requested using a cache-busting filename should be served + # # only once and then cached for a really long time. The HTTP/1.1 + # # spec frowns on hugely-long expiration times though and suggests + # # that assets which never expire be served with an expiration date + # # 1 year from access. + # ExpiresActive On + # ExpiresDefault "access plus 1 year" + # </LocationMatch> + # + # # We use cached-busting location names with the far-future expires + # # headers to ensure that if a file does change it can force a new + # # request. The actual asset filenames are still the same though so we + # # need to rewrite the location from the cache-busting location to the + # # real asset location so that we can serve it. + # RewriteEngine On + # RewriteRule ^/release-\d+/(images|javascripts|stylesheets)/(.*)$ /$1/$2 [L] module AssetTagHelper JAVASCRIPT_DEFAULT_SOURCES = ['prototype', 'effects', 'dragdrop', 'controls', 'rails'].freeze unless const_defined?(:JAVASCRIPT_DEFAULT_SOURCES) @@ -646,7 +705,7 @@ module ActionView source += ".#{ext}" if rewrite_extension?(source, dir, ext) source = "/#{dir}/#{source}" unless source[0] == ?/ - source = rewrite_asset_path(source) + source = rewrite_asset_path(source, config.asset_path) has_request = controller.respond_to?(:request) if has_request && include_host && source !~ %r{^#{controller.config.relative_url_root}/} @@ -710,7 +769,13 @@ module ActionView # Break out the asset path rewrite in case plugins wish to put the asset id # someplace other than the query string. - def rewrite_asset_path(source) + def rewrite_asset_path(source, path = nil) + if path && path.respond_to?(:call) + return path.call(source) + elsif path && path.is_a?(String) + return path % [source] + end + asset_id = rails_asset_id(source) if asset_id.blank? source diff --git a/actionpack/lib/action_view/helpers/capture_helper.rb b/actionpack/lib/action_view/helpers/capture_helper.rb index f0be814700..20598237e9 100644 --- a/actionpack/lib/action_view/helpers/capture_helper.rb +++ b/actionpack/lib/action_view/helpers/capture_helper.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/object/blank' + module ActionView module Helpers # CaptureHelper exposes methods to let you extract generated markup which diff --git a/actionpack/lib/action_view/helpers/form_helper.rb b/actionpack/lib/action_view/helpers/form_helper.rb index 2ba5339b7d..89560d0b49 100644 --- a/actionpack/lib/action_view/helpers/form_helper.rb +++ b/actionpack/lib/action_view/helpers/form_helper.rb @@ -4,6 +4,7 @@ require 'action_view/helpers/tag_helper' require 'action_view/helpers/form_tag_helper' require 'active_support/core_ext/class/inheritable_attributes' require 'active_support/core_ext/hash/slice' +require 'active_support/core_ext/object/blank' module ActionView module Helpers @@ -1220,7 +1221,7 @@ module ActionView end end - ActionView.base_hook do + ActiveSupport.on_load(:action_view) do class ActionView::Base cattr_accessor :default_form_builder @@default_form_builder = ::ActionView::Helpers::FormBuilder diff --git a/actionpack/lib/action_view/helpers/form_options_helper.rb b/actionpack/lib/action_view/helpers/form_options_helper.rb index 4c523d4b20..11c6351bd3 100644 --- a/actionpack/lib/action_view/helpers/form_options_helper.rb +++ b/actionpack/lib/action_view/helpers/form_options_helper.rb @@ -1,6 +1,7 @@ require 'cgi' require 'erb' require 'action_view/helpers/form_helper' +require 'active_support/core_ext/object/blank' module ActionView module Helpers diff --git a/actionpack/lib/action_view/helpers/form_tag_helper.rb b/actionpack/lib/action_view/helpers/form_tag_helper.rb index 07694f5ebb..ca100e102e 100644 --- a/actionpack/lib/action_view/helpers/form_tag_helper.rb +++ b/actionpack/lib/action_view/helpers/form_tag_helper.rb @@ -1,6 +1,7 @@ require 'cgi' require 'action_view/helpers/tag_helper' require 'active_support/core_ext/object/returning' +require 'active_support/core_ext/object/blank' module ActionView module Helpers diff --git a/actionpack/lib/action_view/helpers/number_helper.rb b/actionpack/lib/action_view/helpers/number_helper.rb index 719b64b940..605e5d5873 100644 --- a/actionpack/lib/action_view/helpers/number_helper.rb +++ b/actionpack/lib/action_view/helpers/number_helper.rb @@ -1,5 +1,6 @@ require 'active_support/core_ext/big_decimal/conversions' require 'active_support/core_ext/float/rounding' +require 'active_support/core_ext/object/blank' module ActionView module Helpers #:nodoc: diff --git a/actionpack/lib/action_view/helpers/prototype_helper.rb b/actionpack/lib/action_view/helpers/prototype_helper.rb index ccdc8181db..ebe0b4e876 100644 --- a/actionpack/lib/action_view/helpers/prototype_helper.rb +++ b/actionpack/lib/action_view/helpers/prototype_helper.rb @@ -1,6 +1,7 @@ require 'set' require 'active_support/json' require 'active_support/core_ext/object/returning' +require 'active_support/core_ext/object/blank' module ActionView module Helpers diff --git a/actionpack/lib/action_view/helpers/tag_helper.rb b/actionpack/lib/action_view/helpers/tag_helper.rb index 9b4cacd4d7..c09d01eeee 100644 --- a/actionpack/lib/action_view/helpers/tag_helper.rb +++ b/actionpack/lib/action_view/helpers/tag_helper.rb @@ -1,3 +1,4 @@ +require 'active_support/core_ext/object/blank' require 'set' module ActionView diff --git a/actionpack/lib/action_view/helpers/text_helper.rb b/actionpack/lib/action_view/helpers/text_helper.rb index 27be1690dd..0e1bc139ff 100644 --- a/actionpack/lib/action_view/helpers/text_helper.rb +++ b/actionpack/lib/action_view/helpers/text_helper.rb @@ -1,3 +1,4 @@ +require 'active_support/core_ext/object/blank' require 'action_view/helpers/tag_helper' module ActionView diff --git a/actionpack/lib/action_view/railtie.rb b/actionpack/lib/action_view/railtie.rb index 9cf007cd2b..c606a71e18 100644 --- a/actionpack/lib/action_view/railtie.rb +++ b/actionpack/lib/action_view/railtie.rb @@ -10,14 +10,14 @@ module ActionView initializer "action_view.cache_asset_timestamps" do |app| unless app.config.cache_classes - ActionView.base_hook do + ActiveSupport.on_load(:action_view) do ActionView::Helpers::AssetTagHelper.cache_asset_timestamps = false end end end initializer "action_view.set_configs" do |app| - ActionView.base_hook do + ActiveSupport.on_load(:action_view) do app.config.action_view.each do |k,v| send "#{k}=", v end diff --git a/actionpack/lib/action_view/render/partials.rb b/actionpack/lib/action_view/render/partials.rb index 17d16556b9..f04a89c1ac 100644 --- a/actionpack/lib/action_view/render/partials.rb +++ b/actionpack/lib/action_view/render/partials.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/object/blank' + module ActionView # There's also a convenience method for rendering sub templates within the current controller that depends on a # single object (we call this kind of sub templates for partials). It relies on the fact that partials should diff --git a/actionpack/lib/action_view/template/resolver.rb b/actionpack/lib/action_view/template/resolver.rb index 8e8afaa43f..a223b3a55f 100644 --- a/actionpack/lib/action_view/template/resolver.rb +++ b/actionpack/lib/action_view/template/resolver.rb @@ -35,12 +35,7 @@ module ActionView def cached(key, prefix, name, partial) return yield unless key && caching? - scope = @cached[key][prefix][name] - if scope.key?(partial) - scope[partial] - else - scope[partial] = yield - end + @cached[key][prefix][name][partial] ||= yield end end diff --git a/actionpack/lib/action_view/test_case.rb b/actionpack/lib/action_view/test_case.rb index b0ababe344..23b0c6e121 100644 --- a/actionpack/lib/action_view/test_case.rb +++ b/actionpack/lib/action_view/test_case.rb @@ -1,3 +1,4 @@ +require 'active_support/core_ext/object/blank' require 'action_controller/test_case' require 'action_view' diff --git a/actionpack/test/abstract_unit.rb b/actionpack/test/abstract_unit.rb index 5b2ff3e871..143491a640 100644 --- a/actionpack/test/abstract_unit.rb +++ b/actionpack/test/abstract_unit.rb @@ -95,7 +95,7 @@ module ActiveSupport map.connect ':controller/:action/:id' end - ActionController::IntegrationTest.app.router.draw do |map| + ActionController::IntegrationTest.app.routes.draw do |map| # FIXME: match ':controller(/:action(/:id))' map.connect ':controller/:action/:id' end @@ -104,12 +104,11 @@ module ActiveSupport end class RoutedRackApp - attr_reader :router - alias routes router + attr_reader :routes - def initialize(router, &blk) - @router = router - @stack = ActionDispatch::MiddlewareStack.new(&blk).build(@router) + def initialize(routes, &blk) + @routes = routes + @stack = ActionDispatch::MiddlewareStack.new(&blk).build(@routes) end def call(env) @@ -234,7 +233,7 @@ module ActionView # Must repeat the setup because AV::TestCase is a duplication # of AC::TestCase setup do - @router = SharedTestRoutes + @routes = SharedTestRoutes end end end @@ -250,7 +249,7 @@ module ActionController include ActionDispatch::TestProcess setup do - @router = SharedTestRoutes + @routes = SharedTestRoutes end end end diff --git a/actionpack/test/activerecord/polymorphic_routes_test.rb b/actionpack/test/activerecord/polymorphic_routes_test.rb index 5643ad5ad6..9f5e8ec657 100644 --- a/actionpack/test/activerecord/polymorphic_routes_test.rb +++ b/actionpack/test/activerecord/polymorphic_routes_test.rb @@ -40,12 +40,12 @@ class PolymorphicRoutesTest < ActionController::TestCase end def test_with_record - with_test_routes do + with_test_routes do @project.save assert_equal "http://example.com/projects/#{@project.id}", polymorphic_url(@project) end end - + def test_with_class with_test_routes do assert_equal "http://example.com/projects", polymorphic_url(@project.class) @@ -53,67 +53,67 @@ class PolymorphicRoutesTest < ActionController::TestCase end def test_with_new_record - with_test_routes do + with_test_routes do assert_equal "http://example.com/projects", polymorphic_url(@project) end end def test_with_destroyed_record - with_test_routes do + with_test_routes do @project.destroy assert_equal "http://example.com/projects", polymorphic_url(@project) end end def test_with_record_and_action - with_test_routes do + with_test_routes do assert_equal "http://example.com/projects/new", polymorphic_url(@project, :action => 'new') end end def test_url_helper_prefixed_with_new - with_test_routes do + with_test_routes do assert_equal "http://example.com/projects/new", new_polymorphic_url(@project) end end def test_url_helper_prefixed_with_edit - with_test_routes do + with_test_routes do @project.save assert_equal "http://example.com/projects/#{@project.id}/edit", edit_polymorphic_url(@project) end end - + def test_url_helper_prefixed_with_edit_with_url_options - with_test_routes do + with_test_routes do @project.save assert_equal "http://example.com/projects/#{@project.id}/edit?param1=10", edit_polymorphic_url(@project, :param1 => '10') end end - + def test_url_helper_with_url_options - with_test_routes do + with_test_routes do @project.save assert_equal "http://example.com/projects/#{@project.id}?param1=10", polymorphic_url(@project, :param1 => '10') end end def test_format_option - with_test_routes do + with_test_routes do @project.save assert_equal "http://example.com/projects/#{@project.id}.pdf", polymorphic_url(@project, :format => :pdf) end end - + def test_format_option_with_url_options - with_test_routes do + with_test_routes do @project.save assert_equal "http://example.com/projects/#{@project.id}.pdf?param1=10", polymorphic_url(@project, :format => :pdf, :param1 => '10') end end - + def test_id_and_format_option - with_test_routes do + with_test_routes do @project.save assert_equal "http://example.com/projects/#{@project.id}.pdf", polymorphic_url(:id => @project, :format => :pdf) end @@ -126,14 +126,14 @@ class PolymorphicRoutesTest < ActionController::TestCase assert_equal "http://example.com/projects/#{@project.id}/tasks/#{@task.id}", polymorphic_url([@project, @task]) end end - + def test_with_nested_unsaved with_test_routes do @project.save assert_equal "http://example.com/projects/#{@project.id}/tasks", polymorphic_url([@project, @task]) end end - + def test_with_nested_destroyed with_test_routes do @project.save @@ -141,63 +141,63 @@ class PolymorphicRoutesTest < ActionController::TestCase assert_equal "http://example.com/projects/#{@project.id}/tasks", polymorphic_url([@project, @task]) end end - + def test_with_nested_class with_test_routes do @project.save assert_equal "http://example.com/projects/#{@project.id}/tasks", polymorphic_url([@project, @task.class]) end end - + def test_class_with_array_and_namespace - with_admin_test_routes do + with_admin_test_routes do assert_equal "http://example.com/admin/projects", polymorphic_url([:admin, @project.class]) end end - + def test_new_with_array_and_namespace - with_admin_test_routes do + with_admin_test_routes do assert_equal "http://example.com/admin/projects/new", polymorphic_url([:admin, @project], :action => 'new') end end - + def test_unsaved_with_array_and_namespace - with_admin_test_routes do + with_admin_test_routes do assert_equal "http://example.com/admin/projects", polymorphic_url([:admin, @project]) end end - + def test_nested_unsaved_with_array_and_namespace - with_admin_test_routes do + with_admin_test_routes do @project.save assert_equal "http://example.com/admin/projects/#{@project.id}/tasks", polymorphic_url([:admin, @project, @task]) end end - + def test_nested_with_array_and_namespace - with_admin_test_routes do + with_admin_test_routes do @project.save @task.save assert_equal "http://example.com/admin/projects/#{@project.id}/tasks/#{@task.id}", polymorphic_url([:admin, @project, @task]) end end - + def test_ordering_of_nesting_and_namespace - with_admin_and_site_test_routes do + with_admin_and_site_test_routes do @project.save @task.save @step.save assert_equal "http://example.com/admin/projects/#{@project.id}/site/tasks/#{@task.id}/steps/#{@step.id}", polymorphic_url([:admin, @project, :site, @task, @step]) end end - + def test_nesting_with_array_ending_in_singleton_resource with_test_routes do @project.save assert_equal "http://example.com/projects/#{@project.id}/bid", polymorphic_url([@project, :bid]) end end - + def test_nesting_with_array_containing_singleton_resource with_test_routes do @project.save @@ -205,7 +205,7 @@ class PolymorphicRoutesTest < ActionController::TestCase assert_equal "http://example.com/projects/#{@project.id}/bid/tasks/#{@task.id}", polymorphic_url([@project, :bid, @task]) end end - + def test_nesting_with_array_containing_singleton_resource_and_format with_test_routes do @project.save @@ -213,7 +213,7 @@ class PolymorphicRoutesTest < ActionController::TestCase assert_equal "http://example.com/projects/#{@project.id}/bid/tasks/#{@task.id}.pdf", polymorphic_url([@project, :bid, @task], :format => :pdf) end end - + def test_nesting_with_array_containing_namespace_and_singleton_resource with_admin_test_routes do @project.save @@ -221,47 +221,47 @@ class PolymorphicRoutesTest < ActionController::TestCase assert_equal "http://example.com/admin/projects/#{@project.id}/bid/tasks/#{@task.id}", polymorphic_url([:admin, @project, :bid, @task]) end end - + def test_nesting_with_array_containing_nil with_test_routes do @project.save assert_equal "http://example.com/projects/#{@project.id}/bid", polymorphic_url([@project, nil, :bid]) end end - + def test_with_array_containing_single_object - with_test_routes do + with_test_routes do @project.save assert_equal "http://example.com/projects/#{@project.id}", polymorphic_url([nil, @project]) end end - + def test_with_array_containing_single_name - with_test_routes do + with_test_routes do @project.save assert_equal "http://example.com/projects", polymorphic_url([:projects]) end end - + def test_with_array_containing_symbols with_test_routes do assert_equal "http://example.com/series/new", polymorphic_url([:new, :series]) end end - + def test_with_hash - with_test_routes do + with_test_routes do @project.save assert_equal "http://example.com/projects/#{@project.id}", polymorphic_url(:id => @project) end end - + def test_polymorphic_path_accepts_options - with_test_routes do + with_test_routes do assert_equal "/projects/new", polymorphic_path(@project, :action => 'new') end end - + def test_polymorphic_path_does_not_modify_arguments with_admin_test_routes do @project.save @@ -275,108 +275,108 @@ class PolymorphicRoutesTest < ActionController::TestCase assert_equal original_args, [object_array, options] end end - + # Tests for names where .plural.singular doesn't round-trip def test_with_irregular_plural_record - with_test_routes do + with_test_routes do @tax.save assert_equal "http://example.com/taxes/#{@tax.id}", polymorphic_url(@tax) end end - + def test_with_irregular_plural_class - with_test_routes do + with_test_routes do assert_equal "http://example.com/taxes", polymorphic_url(@tax.class) end end - + def test_with_irregular_plural_new_record - with_test_routes do + with_test_routes do assert_equal "http://example.com/taxes", polymorphic_url(@tax) end end def test_with_irregular_plural_destroyed_record with_test_routes do - @tax.destroy + @tax.destroy assert_equal "http://example.com/taxes", polymorphic_url(@tax) end end - + def test_with_irregular_plural_record_and_action - with_test_routes do + with_test_routes do assert_equal "http://example.com/taxes/new", polymorphic_url(@tax, :action => 'new') end end - + def test_irregular_plural_url_helper_prefixed_with_new - with_test_routes do + with_test_routes do assert_equal "http://example.com/taxes/new", new_polymorphic_url(@tax) end end - + def test_irregular_plural_url_helper_prefixed_with_edit - with_test_routes do + with_test_routes do @tax.save assert_equal "http://example.com/taxes/#{@tax.id}/edit", edit_polymorphic_url(@tax) end end - + def test_with_nested_irregular_plurals - with_test_routes do + with_test_routes do @tax.save @fax.save assert_equal "http://example.com/taxes/#{@tax.id}/faxes/#{@fax.id}", polymorphic_url([@tax, @fax]) end end - + def test_with_nested_unsaved_irregular_plurals - with_test_routes do + with_test_routes do @tax.save assert_equal "http://example.com/taxes/#{@tax.id}/faxes", polymorphic_url([@tax, @fax]) end end - + def test_new_with_irregular_plural_array_and_namespace - with_admin_test_routes do + with_admin_test_routes do assert_equal "http://example.com/admin/taxes/new", polymorphic_url([:admin, @tax], :action => 'new') end end - + def test_class_with_irregular_plural_array_and_namespace - with_admin_test_routes do + with_admin_test_routes do assert_equal "http://example.com/admin/taxes", polymorphic_url([:admin, @tax.class]) end end - + def test_unsaved_with_irregular_plural_array_and_namespace - with_admin_test_routes do + with_admin_test_routes do assert_equal "http://example.com/admin/taxes", polymorphic_url([:admin, @tax]) end end - + def test_nesting_with_irregular_plurals_and_array_ending_in_singleton_resource - with_test_routes do + with_test_routes do @tax.save assert_equal "http://example.com/taxes/#{@tax.id}/bid", polymorphic_url([@tax, :bid]) end end - + def test_with_array_containing_single_irregular_plural_object - with_test_routes do + with_test_routes do @tax.save assert_equal "http://example.com/taxes/#{@tax.id}", polymorphic_url([nil, @tax]) end end - + def test_with_array_containing_single_name_irregular_plural - with_test_routes do + with_test_routes do @tax.save assert_equal "http://example.com/taxes", polymorphic_url([:taxes]) end end - - # Tests for uncountable names + + # Tests for uncountable names def test_uncountable_resource with_test_routes do @series.save @@ -400,11 +400,11 @@ class PolymorphicRoutesTest < ActionController::TestCase map.resources :series end - self.class.send(:include, @router.url_helpers) + self.class.send(:include, @routes.url_helpers) yield end end - + def with_admin_test_routes(options = {}) with_routing do |set| set.draw do |map| @@ -422,11 +422,11 @@ class PolymorphicRoutesTest < ActionController::TestCase end end - self.class.send(:include, @router.url_helpers) + self.class.send(:include, @routes.url_helpers) yield end end - + def with_admin_and_site_test_routes(options = {}) with_routing do |set| set.draw do |map| @@ -441,7 +441,7 @@ class PolymorphicRoutesTest < ActionController::TestCase end end - self.class.send(:include, @router.url_helpers) + self.class.send(:include, @routes.url_helpers) yield end end diff --git a/actionpack/test/controller/caching_test.rb b/actionpack/test/controller/caching_test.rb index f0ad652d50..217260fdcd 100644 --- a/actionpack/test/controller/caching_test.rb +++ b/actionpack/test/controller/caching_test.rb @@ -81,9 +81,9 @@ class PageCachingTest < ActionController::TestCase match '/', :to => 'posts#index', :as => :main end @params[:format] = 'rss' - assert_equal '/posts.rss', @router.url_for(@params) + assert_equal '/posts.rss', @routes.url_for(@params) @params[:format] = nil - assert_equal '/', @router.url_for(@params) + assert_equal '/', @routes.url_for(@params) end end @@ -518,7 +518,7 @@ class ActionCacheTest < ActionController::TestCase @request = ActionController::TestRequest.new @response = ActionController::TestResponse.new @controller = ActionCachingTestController.new - @controller.singleton_class.send(:include, @router.url_helpers) + @controller.singleton_class.send(:include, @routes.url_helpers) @request.host = 'hostname.com' end diff --git a/actionpack/test/controller/cookie_test.rb b/actionpack/test/controller/cookie_test.rb index 36498d13a9..278cae1415 100644 --- a/actionpack/test/controller/cookie_test.rb +++ b/actionpack/test/controller/cookie_test.rb @@ -1,6 +1,6 @@ require 'abstract_unit' -ActionController::Base.cookie_verifier_secret = "thisISverySECRET123" +ActionController::Base.config.secret = "thisISverySECRET123" class CookieTest < ActionController::TestCase class TestController < ActionController::Base diff --git a/actionpack/test/controller/integration_test.rb b/actionpack/test/controller/integration_test.rb index c9782856bd..1e2ee06adc 100644 --- a/actionpack/test/controller/integration_test.rb +++ b/actionpack/test/controller/integration_test.rb @@ -430,3 +430,50 @@ class MetalIntegrationTest < ActionController::IntegrationTest assert_equal 'http://www.example.com/foo', url_for(:controller => "foo") end end + +class ApplicationIntegrationTest < ActionController::IntegrationTest + class TestController < ActionController::Base + def index + render :text => "index" + end + end + + def self.call(env) + routes.call(env) + end + + def self.routes + @routes ||= ActionDispatch::Routing::RouteSet.new + end + + routes.draw do + match 'foo', :to => 'application_integration_test/test#index', :as => :foo + match 'bar', :to => 'application_integration_test/test#index', :as => :bar + end + + def app + self.class + end + + test "includes route helpers" do + assert_equal '/foo', foo_path + assert_equal '/bar', bar_path + end + + test "route helpers after controller access" do + get '/foo' + assert_equal '/foo', foo_path + + get '/bar' + assert_equal '/bar', bar_path + end + + test "missing route helper before controller access" do + assert_raise(NameError) { missing_path } + end + + test "missing route helper after controller access" do + get '/foo' + assert_raise(NameError) { missing_path } + end +end diff --git a/actionpack/test/controller/resources_test.rb b/actionpack/test/controller/resources_test.rb index 17c645c04c..a9d1c55c05 100644 --- a/actionpack/test/controller/resources_test.rb +++ b/actionpack/test/controller/resources_test.rb @@ -126,7 +126,7 @@ class ResourcesTest < ActionController::TestCase def test_with_custom_conditions with_restful_routing :messages, :conditions => { :subdomain => 'app' } do - assert @router.recognize_path("/messages", :method => :get, :subdomain => 'app') + assert @routes.recognize_path("/messages", :method => :get, :subdomain => 'app') end end @@ -395,7 +395,7 @@ class ResourcesTest < ActionController::TestCase assert_restful_routes_for :messages do |options| assert_recognizes(options.merge(:action => "new"), :path => "/messages/new", :method => :get) assert_raise(ActionController::RoutingError) do - @router.recognize_path("/messages/new", :method => :post) + @routes.recognize_path("/messages/new", :method => :post) end end end @@ -505,7 +505,7 @@ class ResourcesTest < ActionController::TestCase def test_restful_routes_dont_generate_duplicates with_restful_routing :messages do - routes = @router.routes + routes = @routes.routes routes.each do |route| routes.each do |r| next if route === r # skip the comparison instance @@ -1169,8 +1169,8 @@ class ResourcesTest < ActionController::TestCase options[:shallow_options] = options[:options] end - new_action = @router.resources_path_names[:new] || "new" - edit_action = @router.resources_path_names[:edit] || "edit" + new_action = @routes.resources_path_names[:new] || "new" + edit_action = @routes.resources_path_names[:edit] || "edit" if options[:path_names] new_action = options[:path_names][:new] if options[:path_names][:new] @@ -1237,7 +1237,7 @@ class ResourcesTest < ActionController::TestCase end @controller = "#{options[:options][:controller].camelize}Controller".constantize.new - @controller.singleton_class.send(:include, @router.url_helpers) + @controller.singleton_class.send(:include, @routes.url_helpers) @request = ActionController::TestRequest.new @response = ActionController::TestResponse.new get :index, options[:options] @@ -1307,7 +1307,7 @@ class ResourcesTest < ActionController::TestCase def assert_singleton_named_routes_for(singleton_name, options = {}) (options[:options] ||= {})[:controller] ||= singleton_name.to_s.pluralize @controller = "#{options[:options][:controller].camelize}Controller".constantize.new - @controller.singleton_class.send(:include, @router.url_helpers) + @controller.singleton_class.send(:include, @routes.url_helpers) @request = ActionController::TestRequest.new @response = ActionController::TestResponse.new get :show, options[:options] diff --git a/actionpack/test/controller/test_test.rb b/actionpack/test/controller/test_test.rb index f6ba275849..8910454b8b 100644 --- a/actionpack/test/controller/test_test.rb +++ b/actionpack/test/controller/test_test.rb @@ -478,8 +478,8 @@ XML end def test_with_routing_places_routes_back - assert @router - routes_id = @router.object_id + assert @routes + routes_id = @routes.object_id begin with_routing { raise 'fail' } @@ -487,8 +487,8 @@ XML rescue RuntimeError end - assert @router - assert_equal routes_id, @router.object_id + assert @routes + assert_equal routes_id, @routes.object_id end def test_remote_addr diff --git a/actionpack/test/controller/url_rewriter_test.rb b/actionpack/test/controller/url_rewriter_test.rb index 7b46a48a1d..a8d7b75372 100644 --- a/actionpack/test/controller/url_rewriter_test.rb +++ b/actionpack/test/controller/url_rewriter_test.rb @@ -10,8 +10,8 @@ class UrlRewriterTests < ActionController::TestCase } end - def rewrite(router, options) - router.url_for(@options.merge(options)) + def rewrite(routes, options) + routes.url_for(@options.merge(options)) end end @@ -23,63 +23,63 @@ class UrlRewriterTests < ActionController::TestCase def test_port assert_equal('http://test.host:1271/c/a/i', - @rewriter.rewrite(@router, :controller => 'c', :action => 'a', :id => 'i', :port => 1271) + @rewriter.rewrite(@routes, :controller => 'c', :action => 'a', :id => 'i', :port => 1271) ) end def test_protocol_with_and_without_separator assert_equal('https://test.host/c/a/i', - @rewriter.rewrite(@router, :protocol => 'https', :controller => 'c', :action => 'a', :id => 'i') + @rewriter.rewrite(@routes, :protocol => 'https', :controller => 'c', :action => 'a', :id => 'i') ) assert_equal('https://test.host/c/a/i', - @rewriter.rewrite(@router, :protocol => 'https://', :controller => 'c', :action => 'a', :id => 'i') + @rewriter.rewrite(@routes, :protocol => 'https://', :controller => 'c', :action => 'a', :id => 'i') ) end def test_user_name_and_password assert_equal( 'http://david:secret@test.host/c/a/i', - @rewriter.rewrite(@router, :user => "david", :password => "secret", :controller => 'c', :action => 'a', :id => 'i') + @rewriter.rewrite(@routes, :user => "david", :password => "secret", :controller => 'c', :action => 'a', :id => 'i') ) end def test_user_name_and_password_with_escape_codes assert_equal( 'http://openid.aol.com%2Fnextangler:one+two%3F@test.host/c/a/i', - @rewriter.rewrite(@router, :user => "openid.aol.com/nextangler", :password => "one two?", :controller => 'c', :action => 'a', :id => 'i') + @rewriter.rewrite(@routes, :user => "openid.aol.com/nextangler", :password => "one two?", :controller => 'c', :action => 'a', :id => 'i') ) end def test_anchor assert_equal( 'http://test.host/c/a/i#anchor', - @rewriter.rewrite(@router, :controller => 'c', :action => 'a', :id => 'i', :anchor => 'anchor') + @rewriter.rewrite(@routes, :controller => 'c', :action => 'a', :id => 'i', :anchor => 'anchor') ) end def test_anchor_should_call_to_param assert_equal( 'http://test.host/c/a/i#anchor', - @rewriter.rewrite(@router, :controller => 'c', :action => 'a', :id => 'i', :anchor => Struct.new(:to_param).new('anchor')) + @rewriter.rewrite(@routes, :controller => 'c', :action => 'a', :id => 'i', :anchor => Struct.new(:to_param).new('anchor')) ) end def test_anchor_should_be_cgi_escaped assert_equal( 'http://test.host/c/a/i#anc%2Fhor', - @rewriter.rewrite(@router, :controller => 'c', :action => 'a', :id => 'i', :anchor => Struct.new(:to_param).new('anc/hor')) + @rewriter.rewrite(@routes, :controller => 'c', :action => 'a', :id => 'i', :anchor => Struct.new(:to_param).new('anc/hor')) ) end def test_trailing_slash options = {:controller => 'foo', :action => 'bar', :id => '3', :only_path => true} - assert_equal '/foo/bar/3', @rewriter.rewrite(@router, options) - assert_equal '/foo/bar/3?query=string', @rewriter.rewrite(@router, options.merge({:query => 'string'})) + assert_equal '/foo/bar/3', @rewriter.rewrite(@routes, options) + assert_equal '/foo/bar/3?query=string', @rewriter.rewrite(@routes, options.merge({:query => 'string'})) options.update({:trailing_slash => true}) - assert_equal '/foo/bar/3/', @rewriter.rewrite(@router, options) + assert_equal '/foo/bar/3/', @rewriter.rewrite(@routes, options) options.update({:query => 'string'}) - assert_equal '/foo/bar/3/?query=string', @rewriter.rewrite(@router, options) + assert_equal '/foo/bar/3/?query=string', @rewriter.rewrite(@routes, options) end end diff --git a/actionpack/test/controller/webservice_test.rb b/actionpack/test/controller/webservice_test.rb index 05545395fb..5942950b15 100644 --- a/actionpack/test/controller/webservice_test.rb +++ b/actionpack/test/controller/webservice_test.rb @@ -245,7 +245,7 @@ class WebServiceTest < ActionController::IntegrationTest private def with_params_parsers(parsers = {}) old_session = @integration_session - @app = ActionDispatch::ParamsParser.new(app.router, parsers) + @app = ActionDispatch::ParamsParser.new(app.routes, parsers) reset! yield ensure diff --git a/actionpack/test/dispatch/rack_test.rb b/actionpack/test/dispatch/rack_test.rb index 94eba2a24f..504bebbb86 100644 --- a/actionpack/test/dispatch/rack_test.rb +++ b/actionpack/test/dispatch/rack_test.rb @@ -122,7 +122,7 @@ class RackRequestTest < BaseRackTest test "cgi environment variables" do assert_equal "Basic", @request.auth_type assert_equal 0, @request.content_length - assert_equal nil, @request.content_type + assert_equal nil, @request.content_mime_type assert_equal "CGI/1.1", @request.gateway_interface assert_equal "*/*", @request.accept assert_equal "UTF-8", @request.accept_charset @@ -177,12 +177,12 @@ end class RackRequestContentTypeTest < BaseRackTest test "html content type verification" do @request.env['CONTENT_TYPE'] = Mime::HTML.to_s - assert @request.content_type.verify_request? + assert @request.content_mime_type.verify_request? end test "xml content type verification" do @request.env['CONTENT_TYPE'] = Mime::XML.to_s - assert !@request.content_type.verify_request? + assert !@request.content_mime_type.verify_request? end end diff --git a/actionpack/test/dispatch/request_test.rb b/actionpack/test/dispatch/request_test.rb index badef4e92e..9093e1ed65 100644 --- a/actionpack/test/dispatch/request_test.rb +++ b/actionpack/test/dispatch/request_test.rb @@ -295,7 +295,7 @@ class RequestTest < ActiveSupport::TestCase test "content type" do request = stub_request 'CONTENT_TYPE' => 'text/html' - assert_equal Mime::HTML, request.content_type + assert_equal Mime::HTML, request.content_mime_type end test "can override format with parameter" do @@ -310,17 +310,17 @@ class RequestTest < ActiveSupport::TestCase test "no content type" do request = stub_request - assert_equal nil, request.content_type + assert_equal nil, request.content_mime_type end test "content type is XML" do request = stub_request 'CONTENT_TYPE' => 'application/xml' - assert_equal Mime::XML, request.content_type + assert_equal Mime::XML, request.content_mime_type end test "content type with charset" do request = stub_request 'CONTENT_TYPE' => 'application/xml; charset=UTF-8' - assert_equal Mime::XML, request.content_type + assert_equal Mime::XML, request.content_mime_type end test "user agent" do diff --git a/actionpack/test/dispatch/routing_test.rb b/actionpack/test/dispatch/routing_test.rb index c4e71a8689..e58653cb8c 100644 --- a/actionpack/test/dispatch/routing_test.rb +++ b/actionpack/test/dispatch/routing_test.rb @@ -114,6 +114,8 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest resources :comments, :except => :destroy end + resources :sheep + match 'sprockets.js' => ::TestRoutingMapper::SprocketsApp match 'people/:id/update', :to => 'people#update', :as => :update_person @@ -171,6 +173,12 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest resources :descriptions root :to => 'projects#index' end + + resources :products, :constraints => { :id => /\d{4}/ } do + resources :images + end + + resource :dashboard, :constraints => { :ip => /192\.168\.1\.\d{1,3}/ } end end @@ -525,6 +533,23 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest end end + def test_resource_with_slugs_in_ids + with_test_routes do + get '/posts/rails-rocks' + assert_equal 'posts#show', @response.body + assert_equal '/posts/rails-rocks', post_path(:id => 'rails-rocks') + end + end + + def test_resources_for_uncountable_names + with_test_routes do + assert_equal '/sheep', sheep_index_path + assert_equal '/sheep/1', sheep_path(1) + assert_equal '/sheep/new', new_sheep_path + assert_equal '/sheep/1/edit', edit_sheep_path(1) + end + end + def test_path_names with_test_routes do get '/es/projeto' @@ -794,6 +819,26 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest end end + def test_resource_constraints + with_test_routes do + assert_raise(ActionController::RoutingError) { get '/products/1' } + get '/products' + assert_equal 'products#index', @response.body + get '/products/0001' + assert_equal 'products#show', @response.body + + assert_raise(ActionController::RoutingError) { get '/products/1/images' } + get '/products/0001/images' + assert_equal 'images#index', @response.body + get '/products/0001/images/1' + assert_equal 'images#show', @response.body + + assert_raise(ActionController::RoutingError) { get '/dashboard', {}, {'REMOTE_ADDR' => '10.0.0.100'} } + get '/dashboard', {}, {'REMOTE_ADDR' => '192.168.1.100'} + assert_equal 'dashboards#show', @response.body + end + end + private def with_test_routes yield diff --git a/actionpack/test/template/active_model_helper_test.rb b/actionpack/test/template/active_model_helper_test.rb index 7a665b00bc..1a5316a689 100644 --- a/actionpack/test/template/active_model_helper_test.rb +++ b/actionpack/test/template/active_model_helper_test.rb @@ -266,6 +266,10 @@ class ActiveModelHelperTest < ActionView::TestCase assert_dom_equal "<div class=\"differentError\">beforecan't be emptyafter</div>", error_message_on(:post, :author_name, :css_class => 'differentError', :prepend_text => 'before', :append_text => 'after') end + def test_error_message_on_with_tag_option_in_options_hash + assert_dom_equal "<span class=\"differentError\">beforecan't be emptyafter</span>", error_message_on(:post, :author_name, :html_tag => "span", :css_class => 'differentError', :prepend_text => 'before', :append_text => 'after') + end + def test_error_message_on_handles_empty_errors assert_equal "", error_message_on(@post, :tag) end diff --git a/actionpack/test/template/asset_tag_helper_test.rb b/actionpack/test/template/asset_tag_helper_test.rb index c471df861d..fbd504ae7d 100644 --- a/actionpack/test/template/asset_tag_helper_test.rb +++ b/actionpack/test/template/asset_tag_helper_test.rb @@ -373,6 +373,22 @@ class AssetTagHelperTest < ActionView::TestCase assert_equal %(<img alt="Rails" src="/images/rails.png?#{expected_time}" />), image_tag("rails.png") end + def test_string_asset_id + @controller.config.asset_path = "/assets.v12345%s" + + expected_path = "/assets.v12345/images/rails.png" + assert_equal %(<img alt="Rails" src="#{expected_path}" />), image_tag("rails.png") + end + + def test_proc_asset_id + @controller.config.asset_path = Proc.new do |asset_path| + "/assets.v12345#{asset_path}" + end + + expected_path = "/assets.v12345/images/rails.png" + assert_equal %(<img alt="Rails" src="#{expected_path}" />), image_tag("rails.png") + end + def test_timebased_asset_id_with_relative_url_root @controller.config.relative_url_root = "/collaboration/hieraki" expected_time = File.stat(File.expand_path(File.dirname(__FILE__) + "/../fixtures/public/images/rails.png")).mtime.to_i.to_s diff --git a/actionpack/test/template/test_case_test.rb b/actionpack/test/template/test_case_test.rb index 195a6ea3ae..c1a38a25de 100644 --- a/actionpack/test/template/test_case_test.rb +++ b/actionpack/test/template/test_case_test.rb @@ -114,7 +114,7 @@ module ActionView end test "is able to use routes" do - controller.request.assign_parameters(@router, 'foo', 'index') + controller.request.assign_parameters(@routes, 'foo', 'index') assert_equal '/foo', url_for assert_equal '/bar', url_for(:controller => 'bar') end |