diff options
124 files changed, 696 insertions, 398 deletions
diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb index 9eee5783a0..69e77871b0 100644 --- a/actionmailer/lib/action_mailer/base.rb +++ b/actionmailer/lib/action_mailer/base.rb @@ -465,48 +465,48 @@ module ActionMailer #:nodoc:      def create!(method_name, *parameters) #:nodoc:        initialize_defaults(method_name)        __send__(method_name, *parameters) - +              # If an explicit, textual body has not been set, we check assumptions.        unless String === @body          # First, we look to see if there are any likely templates that match,          # which include the content-type in their file name (i.e.,          # "the_template_file.text.html.erb", etc.). Only do this if parts          # have not already been specified manually. -        if @parts.empty? -          Dir.glob("#{template_path}/#{@template}.*").each do |path| -            template = template_root.find_by_parts("#{mailer_name}/#{File.basename(path)}") - -            # Skip unless template has a multipart format -            next unless template && template.multipart? - +        # if @parts.empty? +          template_root.find_all_by_parts(@template, {}, template_path).each do |template|              @parts << Part.new( -              :content_type => template.content_type, +              :content_type => Mime::Type.lookup_by_extension(template.content_type || "text").to_s,                :disposition => "inline",                :charset => charset,                :body => render_template(template, @body)              )            end -          unless @parts.empty? +           +          if @parts.size > 1              @content_type = "multipart/alternative" if @content_type !~ /^multipart/              @parts = sort_parts(@parts, @implicit_parts_order)            end -        end - +        # end +                  # Then, if there were such templates, we check to see if we ought to          # also render a "normal" template (without the content type). If a          # normal template exists (or if there were no implicit parts) we render          # it. -        template_exists = @parts.empty? -        template_exists ||= template_root.find_by_parts("#{mailer_name}/#{@template}") -        @body = render_message(@template, @body) if template_exists +        # ==== +        # TODO: Revisit this +        # template_exists = @parts.empty? +        # template_exists ||= template_root.find_by_parts("#{mailer_name}/#{@template}") +        # @body = render_message(@template, @body) if template_exists          # Finally, if there are other message parts and a textual body exists,          # we shift it onto the front of the parts and set the body to nil (so          # that create_mail doesn't try to render it in addition to the parts). -        if !@parts.empty? && String === @body -          @parts.unshift Part.new(:charset => charset, :body => @body) -          @body = nil -        end +        # ==== +        # TODO: Revisit this +        # if !@parts.empty? && String === @body +        #   @parts.unshift Part.new(:charset => charset, :body => @body) +        #   @body = nil +        # end        end        # If this is a multipart e-mail add the mime_version if it is not @@ -580,7 +580,7 @@ module ActionMailer #:nodoc:            if file              prefix = mailer_name unless file =~ /\// -            template = view_paths.find_by_parts(file, formats, prefix) +            template = view_paths.find_by_parts(file, {:formats => formats}, prefix)            end            layout = _pick_layout(layout,  @@ -611,7 +611,7 @@ module ActionMailer #:nodoc:        end        def template_path -        "#{template_root}/#{mailer_name}" +        "#{mailer_name}"        end        def initialize_template_class(assigns) @@ -622,7 +622,7 @@ module ActionMailer #:nodoc:        def sort_parts(parts, order = [])          order = order.collect { |s| s.downcase } - +                  parts = parts.sort do |a, b|            a_ct = a.content_type.downcase            b_ct = b.content_type.downcase @@ -663,10 +663,13 @@ module ActionMailer #:nodoc:          headers.each { |k, v| m[k] = v }          real_content_type, ctype_attrs = parse_content_type - +                  if @parts.empty?            m.set_content_type(real_content_type, nil, ctype_attrs)            m.body = normalize_new_lines(body) +        elsif @parts.size == 1 && @parts.first.parts.empty? +          m.set_content_type(real_content_type, nil, ctype_attrs) +          m.body = normalize_new_lines(@parts.first.body)          else            if String === body              part = TMail::Mail.new diff --git a/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/mail.rb b/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/mail.rb index c3a8803dc4..23a3f75de3 100644 --- a/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/mail.rb +++ b/actionmailer/lib/action_mailer/vendor/tmail-1.2.3/tmail/mail.rb @@ -518,6 +518,7 @@ module TMail      def parse_body( f = nil )        return if @body_parsed +              if f          parse_body_0 f        else diff --git a/actionmailer/test/fixtures/auto_layout_mailer/multipart.text.html.erb b/actionmailer/test/fixtures/auto_layout_mailer/multipart.html.erb index 6d73f199c4..6d73f199c4 100644 --- a/actionmailer/test/fixtures/auto_layout_mailer/multipart.text.html.erb +++ b/actionmailer/test/fixtures/auto_layout_mailer/multipart.html.erb diff --git a/actionmailer/test/fixtures/auto_layout_mailer/multipart.text.plain.erb b/actionmailer/test/fixtures/auto_layout_mailer/multipart.text.erb index f4b91e4031..f4b91e4031 100644 --- a/actionmailer/test/fixtures/auto_layout_mailer/multipart.text.plain.erb +++ b/actionmailer/test/fixtures/auto_layout_mailer/multipart.text.erb diff --git a/actionmailer/test/fixtures/test_mailer/_subtemplate.text.plain.erb b/actionmailer/test/fixtures/test_mailer/_subtemplate.text.erb index 3b4ba35f20..3b4ba35f20 100644 --- a/actionmailer/test/fixtures/test_mailer/_subtemplate.text.plain.erb +++ b/actionmailer/test/fixtures/test_mailer/_subtemplate.text.erb diff --git a/actionmailer/test/fixtures/test_mailer/custom_templating_extension.text.html.haml b/actionmailer/test/fixtures/test_mailer/custom_templating_extension.html.haml index 847d065c37..847d065c37 100644 --- a/actionmailer/test/fixtures/test_mailer/custom_templating_extension.text.html.haml +++ b/actionmailer/test/fixtures/test_mailer/custom_templating_extension.html.haml diff --git a/actionmailer/test/fixtures/test_mailer/custom_templating_extension.text.plain.haml b/actionmailer/test/fixtures/test_mailer/custom_templating_extension.text.haml index 847d065c37..847d065c37 100644 --- a/actionmailer/test/fixtures/test_mailer/custom_templating_extension.text.plain.haml +++ b/actionmailer/test/fixtures/test_mailer/custom_templating_extension.text.haml diff --git a/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.html.erb b/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.html.erb index 946d99ede5..946d99ede5 100644 --- a/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.html.erb +++ b/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.html.erb diff --git a/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.html.erb~ b/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.html.erb~ index 946d99ede5..946d99ede5 100644 --- a/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.html.erb~ +++ b/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.html.erb~ diff --git a/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.plain.erb b/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.erb index a6c8d54cf9..a6c8d54cf9 100644 --- a/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.plain.erb +++ b/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.erb diff --git a/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.yaml.erb b/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.yaml.erb index c14348c770..c14348c770 100644 --- a/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.text.yaml.erb +++ b/actionmailer/test/fixtures/test_mailer/implicitly_multipart_example.yaml.erb diff --git a/actionmailer/test/fixtures/test_mailer/included_subtemplate.text.plain.erb b/actionmailer/test/fixtures/test_mailer/included_subtemplate.text.erb index a93c30ea1a..a93c30ea1a 100644 --- a/actionmailer/test/fixtures/test_mailer/included_subtemplate.text.plain.erb +++ b/actionmailer/test/fixtures/test_mailer/included_subtemplate.text.erb diff --git a/actionmailer/test/fixtures/test_mailer/rxml_template.builder b/actionmailer/test/fixtures/test_mailer/rxml_template.builder deleted file mode 100644 index d566bd8d7c..0000000000 --- a/actionmailer/test/fixtures/test_mailer/rxml_template.builder +++ /dev/null @@ -1,2 +0,0 @@ -xml.instruct! -xml.test
\ No newline at end of file diff --git a/actionmailer/test/mail_service_test.rb b/actionmailer/test/mail_service_test.rb index b7d5fd5dd3..b27bda49be 100644 --- a/actionmailer/test/mail_service_test.rb +++ b/actionmailer/test/mail_service_test.rb @@ -338,6 +338,7 @@ class ActionMailerTest < Test::Unit::TestCase    def test_nested_parts_with_body      created = nil +    TestMailer.create_nested_multipart_with_body(@recipient)      assert_nothing_raised { created = TestMailer.create_nested_multipart_with_body(@recipient)}      assert_equal 1,created.parts.size      assert_equal 2,created.parts.first.parts.size @@ -351,8 +352,8 @@ class ActionMailerTest < Test::Unit::TestCase    def test_attachment_with_custom_header      created = nil -    assert_nothing_raised { created = TestMailer.create_attachment_with_custom_header(@recipient)} -    assert_equal "<test@test.com>", created.parts[1].header['content-id'].to_s +    assert_nothing_raised { created = TestMailer.create_attachment_with_custom_header(@recipient) } +    assert created.parts.any? { |p| p.header['content-id'].to_s == "<test@test.com>" }    end    def test_signed_up @@ -824,7 +825,7 @@ EOF      assert_equal 3, mail.parts.length      assert_equal "1.0", mail.mime_version      assert_equal "multipart/alternative", mail.content_type -    assert_equal "text/yaml", mail.parts[0].content_type +    assert_equal "application/x-yaml", mail.parts[0].content_type      assert_equal "utf-8", mail.parts[0].sub_header("content-type", "charset")      assert_equal "text/plain", mail.parts[1].content_type      assert_equal "utf-8", mail.parts[1].sub_header("content-type", "charset") @@ -835,11 +836,11 @@ EOF    def test_implicitly_multipart_messages_with_custom_order      assert ActionView::Template.template_handler_extensions.include?("bak"), "bak extension was not registered" -    mail = TestMailer.create_implicitly_multipart_example(@recipient, nil, ["text/yaml", "text/plain"]) +    mail = TestMailer.create_implicitly_multipart_example(@recipient, nil, ["application/x-yaml", "text/plain"])      assert_equal 3, mail.parts.length      assert_equal "text/html", mail.parts[0].content_type      assert_equal "text/plain", mail.parts[1].content_type -    assert_equal "text/yaml", mail.parts[2].content_type +    assert_equal "application/x-yaml", mail.parts[2].content_type    end    def test_implicitly_multipart_messages_with_charset @@ -938,8 +939,7 @@ EOF    def test_multipart_with_template_path_with_dots      mail = FunkyPathMailer.create_multipart_with_template_path_with_dots(@recipient)      assert_equal 2, mail.parts.length -    assert_equal 'text/plain', mail.parts[0].content_type -    assert_equal 'utf-8', mail.parts[0].charset +    assert mail.parts.any? {|part| part.content_type == "text/plain" && part.charset == "utf-8"}    end    def test_custom_content_type_attributes diff --git a/actionpack/lib/action_controller/abstract/layouts.rb b/actionpack/lib/action_controller/abstract/layouts.rb index 478b301a26..0039e67c5a 100644 --- a/actionpack/lib/action_controller/abstract/layouts.rb +++ b/actionpack/lib/action_controller/abstract/layouts.rb @@ -38,7 +38,7 @@ module AbstractController          else            self.class_eval %{              def _layout -              if view_paths.find_by_parts?("#{_implied_layout_name}", formats, "layouts") +              if view_paths.find_by_parts?("#{_implied_layout_name}", {:formats => formats}, "layouts")                  "#{_implied_layout_name}"                else                  super @@ -62,7 +62,7 @@ module AbstractController          raise ArgumentError, "String, false, or nil expected; you passed #{name.inspect}"        end -      name && view_paths.find_by_parts(name, formats, "layouts") +      name && view_paths.find_by_parts(name, {:formats => formats}, "layouts")      end      def _default_layout(require_layout = false) diff --git a/actionpack/lib/action_controller/abstract/renderer.rb b/actionpack/lib/action_controller/abstract/renderer.rb index a86eef889e..e31accbbfc 100644 --- a/actionpack/lib/action_controller/abstract/renderer.rb +++ b/actionpack/lib/action_controller/abstract/renderer.rb @@ -29,7 +29,7 @@ module AbstractController      def render_to_body(options = {})        name = options[:_template_name] || action_name -      template = options[:_template] || view_paths.find_by_parts(name.to_s, formats, options[:_prefix]) +      template = options[:_template] || view_paths.find_by_parts(name.to_s, {:formats => formats}, options[:_prefix])        _render_template(template, options)      end diff --git a/actionpack/lib/action_controller/base/layout.rb b/actionpack/lib/action_controller/base/layout.rb index 4fcef6c5d9..1ad5191c73 100644 --- a/actionpack/lib/action_controller/base/layout.rb +++ b/actionpack/lib/action_controller/base/layout.rb @@ -182,7 +182,7 @@ module ActionController #:nodoc:        def memoized_find_layout(layout, formats) #:nodoc:          return layout if layout.nil? || layout.respond_to?(:render)          prefix = layout.to_s =~ /layouts\// ? nil : "layouts" -        view_paths.find_by_parts(layout.to_s, formats, prefix) +        view_paths.find_by_parts(layout.to_s, {:formats => formats}, prefix)        end        def find_layout(*args) diff --git a/actionpack/lib/action_controller/base/render.rb b/actionpack/lib/action_controller/base/render.rb index 606df58518..33695cd78e 100644 --- a/actionpack/lib/action_controller/base/render.rb +++ b/actionpack/lib/action_controller/base/render.rb @@ -254,7 +254,7 @@ module ActionController          render_for_text(js)        elsif json = options[:json] -        json = json.to_json unless json.is_a?(String) +        json = ActiveSupport::JSON.encode(json) unless json.is_a?(String)          json = "#{options[:callback]}(#{json})" unless options[:callback].blank?          response.content_type ||= Mime::JSON          render_for_text(json) @@ -374,8 +374,13 @@ module ActionController          render_for_file(name.sub(/^\//, ''), [layout, true], options)        end      end -   + +    # ==== Arguments +    # parts<Array[String, Array[Symbol*], String, Boolean]>:: +    #     Example: ["show", [:html, :xml], "users", false]      def render_for_parts(parts, layout, options = {}) +      parts[1] = {:formats => parts[1], :locales => [I18n.locale]} +              tmp = view_paths.find_by_parts(*parts)        layout = _pick_layout(*layout) unless tmp.exempt_from_layout? diff --git a/actionpack/lib/action_view/helpers/number_helper.rb b/actionpack/lib/action_view/helpers/number_helper.rb index dea958deaf..c02692b09a 100644 --- a/actionpack/lib/action_view/helpers/number_helper.rb +++ b/actionpack/lib/action_view/helpers/number_helper.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/float/rounding' +  module ActionView    module Helpers #:nodoc:      # Provides methods for converting numbers into formatted strings. diff --git a/actionpack/lib/action_view/helpers/prototype_helper.rb b/actionpack/lib/action_view/helpers/prototype_helper.rb index 6bad11e354..fb8122af35 100644 --- a/actionpack/lib/action_view/helpers/prototype_helper.rb +++ b/actionpack/lib/action_view/helpers/prototype_helper.rb @@ -973,7 +973,7 @@ module ActionView              def loop_on_multiple_args(method, ids)                record(ids.size>1 ?                  "#{javascript_object_for(ids)}.each(#{method})" : -                "#{method}(#{ids.first.to_json})") +                "#{method}(#{ActiveSupport::JSON.encode(ids.first)})")              end              def page @@ -997,7 +997,7 @@ module ActionView              end              def javascript_object_for(object) -              object.respond_to?(:to_json) ? object.to_json : object.inspect +              ActiveSupport::JSON.encode(object)              end              def arguments_for_call(arguments, block = nil) @@ -1139,7 +1139,7 @@ module ActionView      class JavaScriptElementProxy < JavaScriptProxy #:nodoc:        def initialize(generator, id)          @id = id -        super(generator, "$(#{id.to_json})") +        super(generator, "$(#{ActiveSupport::JSON.encode(id)})")        end        # Allows access of element attributes through +attribute+. Examples: @@ -1184,10 +1184,12 @@ module ActionView          true        end -      def to_json(options = nil) +      def rails_to_json(options = nil)          @variable        end +      alias to_json rails_to_json +        private          def append_to_function_chain!(call)            @generator << @variable if @empty @@ -1211,7 +1213,7 @@ module ActionView            enumerate :eachSlice, :variable => variable, :method_args => [number], :yield_args => %w(value index), :return => true, &block          else            add_variable_assignment!(variable) -          append_enumerable_function!("eachSlice(#{number.to_json});") +          append_enumerable_function!("eachSlice(#{ActiveSupport::JSON.encode(number)});")          end        end @@ -1232,7 +1234,7 @@ module ActionView        def pluck(variable, property)          add_variable_assignment!(variable) -        append_enumerable_function!("pluck(#{property.to_json});") +        append_enumerable_function!("pluck(#{ActiveSupport::JSON.encode(property)});")        end        def zip(variable, *arguments, &block) @@ -1296,7 +1298,7 @@ module ActionView      class JavaScriptElementCollectionProxy < JavaScriptCollectionProxy #:nodoc:\        def initialize(generator, pattern) -        super(generator, "$$(#{pattern.to_json})") +        super(generator, "$$(#{ActiveSupport::JSON.encode(pattern)})")        end      end    end diff --git a/actionpack/lib/action_view/helpers/scriptaculous_helper.rb b/actionpack/lib/action_view/helpers/scriptaculous_helper.rb index e16935ea87..04af2781d7 100644 --- a/actionpack/lib/action_view/helpers/scriptaculous_helper.rb +++ b/actionpack/lib/action_view/helpers/scriptaculous_helper.rb @@ -43,7 +43,7 @@ module ActionView        # You can change the behaviour with various options, see        # http://script.aculo.us for more documentation.        def visual_effect(name, element_id = false, js_options = {}) -        element = element_id ? element_id.to_json : "element" +        element = element_id ? ActiveSupport::JSON.encode(element_id) : "element"          js_options[:queue] = if js_options[:queue].is_a?(Hash)            '{' + js_options[:queue].map {|k, v| k == :limit ? "#{k}:#{v}" : "#{k}:'#{v}'" }.join(',') + '}' @@ -138,7 +138,7 @@ module ActionView        end        def sortable_element_js(element_id, options = {}) #:nodoc: -        options[:with]     ||= "Sortable.serialize(#{element_id.to_json})" +        options[:with]     ||= "Sortable.serialize(#{ActiveSupport::JSON.encode(element_id)})"          options[:onUpdate] ||= "function(){" + remote_function(options) + "}"          options.delete_if { |key, value| PrototypeHelper::AJAX_OPTIONS.include?(key) } @@ -149,7 +149,7 @@ module ActionView          options[:containment] = array_or_string_for_javascript(options[:containment]) if options[:containment]          options[:only] = array_or_string_for_javascript(options[:only]) if options[:only] -        %(Sortable.create(#{element_id.to_json}, #{options_for_javascript(options)});) +        %(Sortable.create(#{ActiveSupport::JSON.encode(element_id)}, #{options_for_javascript(options)});)        end        # Makes the element with the DOM ID specified by +element_id+ draggable. @@ -164,7 +164,7 @@ module ActionView        end        def draggable_element_js(element_id, options = {}) #:nodoc: -        %(new Draggable(#{element_id.to_json}, #{options_for_javascript(options)});) +        %(new Draggable(#{ActiveSupport::JSON.encode(element_id)}, #{options_for_javascript(options)});)        end        # Makes the element with the DOM ID specified by +element_id+ receive @@ -219,7 +219,7 @@ module ActionView          # Confirmation happens during the onDrop callback, so it can be removed from the options          options.delete(:confirm) if options[:confirm] -        %(Droppables.add(#{element_id.to_json}, #{options_for_javascript(options)});) +        %(Droppables.add(#{ActiveSupport::JSON.encode(element_id)}, #{options_for_javascript(options)});)        end      end    end diff --git a/actionpack/lib/action_view/paths.rb b/actionpack/lib/action_view/paths.rb index 1d0279889c..e48088f344 100644 --- a/actionpack/lib/action_view/paths.rb +++ b/actionpack/lib/action_view/paths.rb @@ -33,18 +33,18 @@ module ActionView #:nodoc:        super(*objs.map { |obj| self.class.type_cast(obj) })      end -    def find_by_parts(path, extension = nil, prefix = nil, partial = false) +    def find_by_parts(path, details = {}, prefix = nil, partial = false)        template_path = path.sub(/^\//, '')        each do |load_path| -        if template = load_path.find_by_parts(template_path, extension, prefix, partial) +        if template = load_path.find_by_parts(template_path, details, prefix, partial)            return template          end        end        Template.new(path, self)      rescue ActionView::MissingTemplate => e -      extension ||= [] +      extension = details[:formats] || []        raise ActionView::MissingTemplate.new(self, "#{prefix}/#{path}.{#{extension.join(",")}}")      end diff --git a/actionpack/lib/action_view/render/partials.rb b/actionpack/lib/action_view/render/partials.rb index e337dcb63b..43f8a1edf8 100644 --- a/actionpack/lib/action_view/render/partials.rb +++ b/actionpack/lib/action_view/render/partials.rb @@ -187,6 +187,7 @@ module ActionView            path = ActionController::RecordIdentifier.partial_path(object, controller_path)          end          _, _, prefix, object = parts = partial_parts(path, options) +        parts[1] = {:formats => parts[1]}          template = find_by_parts(*parts)          _render_partial_object(template, options, (object unless object == true))        end @@ -225,7 +226,7 @@ module ActionView        def _render_partial_with_layout(layout, options)          if layout            prefix = controller && !layout.include?("/") ? controller.controller_path : nil -          layout = find_by_parts(layout, formats, prefix, true) +          layout = find_by_parts(layout, {:formats => formats}, prefix, true)          end          content = _render_partial(options)          return _render_content_with_layout(content, layout, options[:locals]) @@ -253,7 +254,7 @@ module ActionView        def _render_partial_with_layout(layout, options)          if layout            prefix = controller && !layout.include?("/") ? controller.controller_path : nil -          layout = find_by_parts(layout, formats, prefix, true) +          layout = find_by_parts(layout, {:formats => formats}, prefix, true)          end          content = _render_partial(options)          return _render_content_with_layout(content, layout, options[:locals]) @@ -321,7 +322,7 @@ module ActionView        def _pick_partial_template(partial_path) #:nodoc:          prefix = controller_path unless partial_path.include?('/') -        find_by_parts(partial_path, formats, prefix, true) +        find_by_parts(partial_path, {:formats => formats}, prefix, true)        end        memoize :_pick_partial_template    end diff --git a/actionpack/lib/action_view/render/rendering.rb b/actionpack/lib/action_view/render/rendering.rb index a9b2acecd5..4213b09e48 100644 --- a/actionpack/lib/action_view/render/rendering.rb +++ b/actionpack/lib/action_view/render/rendering.rb @@ -23,10 +23,10 @@ module ActionView          return _render_partial_with_layout(layout, options) if options.key?(:partial)          return _render_partial_with_block(layout, block, options) if block_given? -        layout = find_by_parts(layout, formats) if layout +        layout = find_by_parts(layout, {:formats => formats}) if layout          if file = options[:file] -          template = find_by_parts(file, formats) +          template = find_by_parts(file, {:formats => formats})            _render_template_with_layout(template, layout, :locals => options[:locals])          elsif inline = options[:inline]            _render_inline(inline, layout, options) diff --git a/actionpack/lib/action_view/template/handlers.rb b/actionpack/lib/action_view/template/handlers.rb index fb85f28851..448ab6731b 100644 --- a/actionpack/lib/action_view/template/handlers.rb +++ b/actionpack/lib/action_view/template/handlers.rb @@ -16,6 +16,10 @@ module ActionView #:nodoc:      @@template_handlers = {}      @@default_template_handlers = nil +     +    def self.extensions +      @@template_handlers.keys +    end      # Register a class that knows how to handle template files with the given      # extension. This can be used to implement new template types. diff --git a/actionpack/lib/action_view/template/path.rb b/actionpack/lib/action_view/template/path.rb index 9709549b70..660a7e91a2 100644 --- a/actionpack/lib/action_view/template/path.rb +++ b/actionpack/lib/action_view/template/path.rb @@ -1,13 +1,81 @@  module ActionView    class Template +  # Abstract super class      class Path -      attr_reader :path, :paths -      delegate :hash, :inspect, :to => :path -              def initialize(options) -        @cache = options[:cache] +        @cache  = options[:cache] +        @cached = {}        end - +     +      # Normalizes the arguments and passes it on to find_template +      def find_by_parts(*args) +        find_all_by_parts(*args).first +      end +       +      def find_all_by_parts(name, details = {}, prefix = nil, partial = nil) +        details[:locales] = [I18n.locale] +        name = name.to_s.gsub(handler_matcher, '').split("/") +        find_templates(name.pop, details, [prefix, *name].compact.join("/"), partial) +      end +     +    private +       +      # This is what child classes implement. No defaults are needed +      # because Path guarentees that the arguments are present and +      # normalized. +      def find_templates(name, details, prefix, partial) +        raise NotImplementedError +      end +   +      # TODO: Refactor this to abstract out the file system +      def initialize_template(file) +        t = Template.new(file.split("#{self}/").last, self) +        t.load! +        t +      end +       +      def valid_handlers +        @valid_handlers ||= TemplateHandlers.extensions +      end +       +      def handler_matcher +        @handler_matcher ||= begin +          e = valid_handlers.join('|') +          /\.(?:#{e})$/ +        end +      end +       +      def handler_glob +        e = TemplateHandlers.extensions.join(',') +        ".{#{e}}" +      end +       +      def formats_glob +        @formats_glob ||= begin +          formats = Mime::SET.map { |m| m.symbol } +          '{' + formats.map { |l| ".#{l}," }.join + '}' +        end +      end +       +      def cached(key) +        return yield unless @cache +        return @cached[key] if @cached.key?(key) +        @cached[key] = yield +      end +    end +   +    class FileSystemPath < Path +     +      def initialize(path, options = {}) +        raise ArgumentError, "path already is a Path class" if path.is_a?(Path) +        super(options) +        @path = path +      end +     +      # TODO: This is the currently needed API. Make this suck less +      # ==== <suck> +      attr_reader :path +            def to_s          if defined?(RAILS_ROOT)            path.to_s.sub(/^#{Regexp.escape(File.expand_path(RAILS_ROOT))}\//, '') @@ -27,61 +95,36 @@ module ActionView        def eql?(path)          to_str == path.to_str        end - -      def find_by_parts(name, extensions = nil, prefix = nil, partial = nil) -        path = prefix ? "#{prefix}/" : "" +      # ==== </suck> -        name = name.to_s.split("/") -        name[-1] = "_#{name[-1]}" if partial -     -        path << name.join("/") - -        template = nil - -        Array(extensions).each do |extension| -          extensioned_path = extension ? "#{path}.#{extension}" : path -          break if (template = find_template(extensioned_path)) +      def find_templates(name, details, prefix, partial) +        if glob = parts_to_glob(name, details, prefix, partial) +          cached(glob) do +            Dir[glob].map do |path| +              initialize_template(path) unless File.directory?(path) +            end.compact +          end          end -        template || find_template(path)        end -   -    private -      def create_template(file) -        Template.new(file.split("#{self}/").last, self) -      end -    end - -    class FileSystemPath < Path -      def initialize(path, options = {}) -        raise ArgumentError, "path already is a Path class" if path.is_a?(Path)         -         -        super(options) -        @path, @paths = path, {} -         -        # **/*/** is a hax for symlinked directories -        load_templates("#{@path}/{**/*,**}/**") if @cache -      end - -    private -     -      def load_template(template) -        template.load! -        template.accessible_paths.each do |path| -          @paths[path] = template -        end -      end -     -      def find_template(path) -        load_templates("#{@path}/#{path}{,.*}") unless @cache -        @paths[path] -      end     -      def load_templates(glob) -        Dir[glob].each do |file| -          load_template(create_template(file)) unless File.directory?(file) +    private +   +      def parts_to_glob(name, details, prefix, partial) +        path = "" +        path << "#{prefix}/" unless prefix.empty? +        path << (partial ? "_#{name}" : name) +       +        extensions = "" +        [:locales, :formats].each do |k| +          extensions << if exts = details[k] +            '{' + exts.map {|e| ".#{e},"}.join + '}' +          else +            k == :formats ? formats_glob : '' +          end          end +         +        "#{@path}/#{path}#{extensions}#{handler_glob}"        end -            end    end  end
\ No newline at end of file diff --git a/actionpack/lib/action_view/template/template.rb b/actionpack/lib/action_view/template/template.rb index b6967a2013..e541336613 100644 --- a/actionpack/lib/action_view/template/template.rb +++ b/actionpack/lib/action_view/template/template.rb @@ -101,7 +101,7 @@ module ActionView #:nodoc:      end          def content_type -      format.gsub('.', '/') +      format && format.gsub('.', '/')      end        private diff --git a/actionpack/test/abstract_controller/abstract_controller_test.rb b/actionpack/test/abstract_controller/abstract_controller_test.rb index 918062c7db..f1dcb39ef1 100644 --- a/actionpack/test/abstract_controller/abstract_controller_test.rb +++ b/actionpack/test/abstract_controller/abstract_controller_test.rb @@ -139,10 +139,10 @@ module AbstractController        private        def self.layout(formats)          begin -          view_paths.find_by_parts(name.underscore, formats, "layouts") +          view_paths.find_by_parts(name.underscore, {:formats => formats}t, "layouts")          rescue ActionView::MissingTemplate            begin -            view_paths.find_by_parts("application", formats, "layouts") +            view_paths.find_by_parts("application", {:formats => formats}, "layouts")            rescue ActionView::MissingTemplate            end          end diff --git a/actionpack/test/controller/render_test.rb b/actionpack/test/controller/render_test.rb index 9a34bcebe6..bf72730bea 100644 --- a/actionpack/test/controller/render_test.rb +++ b/actionpack/test/controller/render_test.rb @@ -194,19 +194,19 @@ class TestController < ActionController::Base    end    def render_json_hello_world -    render :json => {:hello => 'world'}.to_json +    render :json => ActiveSupport::JSON.encode(:hello => 'world')    end    def render_json_hello_world_with_callback -    render :json => {:hello => 'world'}.to_json, :callback => 'alert' +    render :json => ActiveSupport::JSON.encode(:hello => 'world'), :callback => 'alert'    end    def render_json_with_custom_content_type -    render :json => {:hello => 'world'}.to_json, :content_type => 'text/javascript' +    render :json => ActiveSupport::JSON.encode(:hello => 'world'), :content_type => 'text/javascript'    end    def render_symbol_json -    render :json => {:hello => 'world'}.to_json +    render :json => ActiveSupport::JSON.encode(:hello => 'world')    end    def render_json_with_render_to_string @@ -875,31 +875,31 @@ class RenderTest < ActionController::TestCase    def test_render_json      get :render_json_hello_world -    assert_equal '{"hello": "world"}', @response.body +    assert_equal '{"hello":"world"}', @response.body      assert_equal 'application/json', @response.content_type    end    def test_render_json_with_callback      get :render_json_hello_world_with_callback -    assert_equal 'alert({"hello": "world"})', @response.body +    assert_equal 'alert({"hello":"world"})', @response.body      assert_equal 'application/json', @response.content_type    end    def test_render_json_with_custom_content_type      get :render_json_with_custom_content_type -    assert_equal '{"hello": "world"}', @response.body +    assert_equal '{"hello":"world"}', @response.body      assert_equal 'text/javascript', @response.content_type    end    def test_render_symbol_json      get :render_symbol_json -    assert_equal '{"hello": "world"}', @response.body +    assert_equal '{"hello":"world"}', @response.body      assert_equal 'application/json', @response.content_type    end    def test_render_json_with_render_to_string      get :render_json_with_render_to_string -    assert_equal '{"hello": "partial html"}', @response.body +    assert_equal '{"hello":"partial html"}', @response.body      assert_equal 'application/json', @response.content_type    end diff --git a/actionpack/test/template/prototype_helper_test.rb b/actionpack/test/template/prototype_helper_test.rb index cd6ee6ea11..28851f113f 100644 --- a/actionpack/test/template/prototype_helper_test.rb +++ b/actionpack/test/template/prototype_helper_test.rb @@ -328,28 +328,28 @@ class JavaScriptGeneratorTest < PrototypeHelperBaseTest    def test_remove      assert_equal 'Element.remove("foo");',        @generator.remove('foo') -    assert_equal '["foo", "bar", "baz"].each(Element.remove);', +    assert_equal '["foo","bar","baz"].each(Element.remove);',        @generator.remove('foo', 'bar', 'baz')    end    def test_show      assert_equal 'Element.show("foo");',        @generator.show('foo') -    assert_equal '["foo", "bar", "baz"].each(Element.show);', +    assert_equal '["foo","bar","baz"].each(Element.show);',        @generator.show('foo', 'bar', 'baz')    end    def test_hide      assert_equal 'Element.hide("foo");',        @generator.hide('foo') -    assert_equal '["foo", "bar", "baz"].each(Element.hide);', +    assert_equal '["foo","bar","baz"].each(Element.hide);',        @generator.hide('foo', 'bar', 'baz')    end    def test_toggle      assert_equal 'Element.toggle("foo");',        @generator.toggle('foo') -    assert_equal '["foo", "bar", "baz"].each(Element.toggle);', +    assert_equal '["foo","bar","baz"].each(Element.toggle);',        @generator.toggle('foo', 'bar', 'baz')    end @@ -386,7 +386,7 @@ class JavaScriptGeneratorTest < PrototypeHelperBaseTest      assert_equal <<-EOS.chomp, @generator.to_s  Element.insert("element", { top: "\\u003Cp\\u003EThis is a test\\u003C/p\\u003E" });  Element.insert("element", { bottom: "\\u003Cp\\u003EThis is a test\\u003C/p\\u003E" }); -["foo", "bar"].each(Element.remove); +["foo","bar"].each(Element.remove);  Element.update("baz", "\\u003Cp\\u003EThis is a test\\u003C/p\\u003E");      EOS    end @@ -555,8 +555,8 @@ return (value.className == "welcome");      end      assert_equal <<-EOS.strip, @generator.to_s -var a = [1, 2, 3].zip([4, 5, 6], [7, 8, 9]); -var b = [1, 2, 3].zip([4, 5, 6], [7, 8, 9], function(array) { +var a = [1, 2, 3].zip([4,5,6], [7,8,9]); +var b = [1, 2, 3].zip([4,5,6], [7,8,9], function(array) {  return array.reverse();  });      EOS @@ -607,7 +607,7 @@ return value.reverse();    def test_literal      literal = @generator.literal("function() {}") -    assert_equal "function() {}", literal.to_json +    assert_equal "function() {}", ActiveSupport::JSON.encode(literal)      assert_equal "", @generator.to_s    end diff --git a/actionpack/test/template/render_test.rb b/actionpack/test/template/render_test.rb index 8843f6fdd7..7191df0dfd 100644 --- a/actionpack/test/template/render_test.rb +++ b/actionpack/test/template/render_test.rb @@ -29,23 +29,19 @@ module RenderTestCases    end    def test_render_file_with_localization -    pending do -      begin -        old_locale = I18n.locale -        I18n.locale = :da -        assert_equal "Hey verden", @view.render(:file => "test/hello_world") -      ensure -        I18n.locale = old_locale -      end +    begin +      old_locale = I18n.locale +      I18n.locale = :da +      assert_equal "Hey verden", @view.render(:file => "test/hello_world") +    ensure +      I18n.locale = old_locale      end    end    def test_render_file_with_dashed_locale      old_locale = I18n.locale -    pending do -      I18n.locale = :"pt-BR" -      assert_equal "Ola mundo", @view.render(:file => "test/hello_world") -    end +    I18n.locale = :"pt-BR" +    assert_equal "Ola mundo", @view.render(:file => "test/hello_world")    ensure      I18n.locale = old_locale    end diff --git a/activemodel/lib/active_model/core.rb b/activemodel/lib/active_model/core.rb index 6b2bee53d9..b4b020defc 100644 --- a/activemodel/lib/active_model/core.rb +++ b/activemodel/lib/active_model/core.rb @@ -1,7 +1,7 @@  begin    require 'active_support'  rescue LoadError -  activesupport_path = "#{File.dirname(__FILE__)}/../../activesupport/lib" +  activesupport_path = "#{File.dirname(__FILE__)}/../../../activesupport/lib"    if File.directory?(activesupport_path)      $:.unshift activesupport_path      require 'active_support' diff --git a/activerecord/lib/active_record/serializers/json_serializer.rb b/activerecord/lib/active_record/serializers/json_serializer.rb index c709c3f1eb..e9cb8bfca9 100644 --- a/activerecord/lib/active_record/serializers/json_serializer.rb +++ b/activerecord/lib/active_record/serializers/json_serializer.rb @@ -74,13 +74,17 @@ module ActiveRecord #:nodoc:      #                   {"comments": [{"body": "Don't think too hard"}],      #                    "title": "So I was thinking"}]}      def to_json(options = {}) +      json = JsonSerializer.new(self, options).to_s        if include_root_in_json -        "{#{self.class.json_class_name}: #{JsonSerializer.new(self, options).to_s}}" +        "{#{self.class.json_class_name}:#{json}}"        else -        JsonSerializer.new(self, options).to_s +        json        end      end +    # For compatibility with ActiveSupport::JSON.encode +    alias rails_to_json to_json +      def from_json(json)        self.attributes = ActiveSupport::JSON.decode(json)        self @@ -88,7 +92,7 @@ module ActiveRecord #:nodoc:      class JsonSerializer < ActiveRecord::Serialization::Serializer #:nodoc:        def serialize -        serializable_record.to_json +        ActiveSupport::JSON.encode(serializable_record)        end      end diff --git a/activerecord/test/cases/json_serialization_test.rb b/activerecord/test/cases/json_serialization_test.rb index 975acde096..0ffbc9bf3b 100644 --- a/activerecord/test/cases/json_serialization_test.rb +++ b/activerecord/test/cases/json_serialization_test.rb @@ -26,19 +26,19 @@ class JsonSerializationTest < ActiveRecord::TestCase      NamespacedContact.include_root_in_json = true      @contact = NamespacedContact.new :name => 'whatever'      json = @contact.to_json -    assert_match %r{^\{"namespaced_contact": \{}, json +    assert_match %r{^\{"namespaced_contact":\{}, json    end    def test_should_include_root_in_json      Contact.include_root_in_json = true      json = @contact.to_json -    assert_match %r{^\{"contact": \{}, json -    assert_match %r{"name": "Konata Izumi"}, json -    assert_match %r{"age": 16}, json -    assert json.include?(%("created_at": #{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))})) -    assert_match %r{"awesome": true}, json -    assert_match %r{"preferences": \{"shows": "anime"\}}, json +    assert_match %r{^\{"contact":\{}, json +    assert_match %r{"name":"Konata Izumi"}, json +    assert_match %r{"age":16}, json +    assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))})) +    assert_match %r{"awesome":true}, json +    assert_match %r{"preferences":\{"shows":"anime"\}}, json    ensure      Contact.include_root_in_json = false    end @@ -46,31 +46,31 @@ class JsonSerializationTest < ActiveRecord::TestCase    def test_should_encode_all_encodable_attributes      json = @contact.to_json -    assert_match %r{"name": "Konata Izumi"}, json -    assert_match %r{"age": 16}, json -    assert json.include?(%("created_at": #{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))})) -    assert_match %r{"awesome": true}, json -    assert_match %r{"preferences": \{"shows": "anime"\}}, json +    assert_match %r{"name":"Konata Izumi"}, json +    assert_match %r{"age":16}, json +    assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))})) +    assert_match %r{"awesome":true}, json +    assert_match %r{"preferences":\{"shows":"anime"\}}, json    end    def test_should_allow_attribute_filtering_with_only      json = @contact.to_json(:only => [:name, :age]) -    assert_match %r{"name": "Konata Izumi"}, json -    assert_match %r{"age": 16}, json -    assert_no_match %r{"awesome": true}, json -    assert !json.include?(%("created_at": #{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))})) -    assert_no_match %r{"preferences": \{"shows": "anime"\}}, json +    assert_match %r{"name":"Konata Izumi"}, json +    assert_match %r{"age":16}, json +    assert_no_match %r{"awesome":true}, json +    assert !json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))})) +    assert_no_match %r{"preferences":\{"shows":"anime"\}}, json    end    def test_should_allow_attribute_filtering_with_except      json = @contact.to_json(:except => [:name, :age]) -    assert_no_match %r{"name": "Konata Izumi"}, json -    assert_no_match %r{"age": 16}, json -    assert_match %r{"awesome": true}, json -    assert json.include?(%("created_at": #{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))})) -    assert_match %r{"preferences": \{"shows": "anime"\}}, json +    assert_no_match %r{"name":"Konata Izumi"}, json +    assert_no_match %r{"age":16}, json +    assert_match %r{"awesome":true}, json +    assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))})) +    assert_match %r{"preferences":\{"shows":"anime"\}}, json    end    def test_methods_are_called_on_object @@ -79,12 +79,12 @@ class JsonSerializationTest < ActiveRecord::TestCase      def @contact.favorite_quote; "Constraints are liberating"; end      # Single method. -    assert_match %r{"label": "Has cheezburger"}, @contact.to_json(:only => :name, :methods => :label) +    assert_match %r{"label":"Has cheezburger"}, @contact.to_json(:only => :name, :methods => :label)      # Both methods.      methods_json = @contact.to_json(:only => :name, :methods => [:label, :favorite_quote]) -    assert_match %r{"label": "Has cheezburger"}, methods_json -    assert_match %r{"favorite_quote": "Constraints are liberating"}, methods_json +    assert_match %r{"label":"Has cheezburger"}, methods_json +    assert_match %r{"favorite_quote":"Constraints are liberating"}, methods_json    end  end @@ -99,42 +99,42 @@ class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase    def test_includes_uses_association_name      json = @david.to_json(:include => :posts) -    assert_match %r{"posts": \[}, json +    assert_match %r{"posts":\[}, json -    assert_match %r{"id": 1}, json -    assert_match %r{"name": "David"}, json +    assert_match %r{"id":1}, json +    assert_match %r{"name":"David"}, json -    assert_match %r{"author_id": 1}, json -    assert_match %r{"title": "Welcome to the weblog"}, json -    assert_match %r{"body": "Such a lovely day"}, json +    assert_match %r{"author_id":1}, json +    assert_match %r{"title":"Welcome to the weblog"}, json +    assert_match %r{"body":"Such a lovely day"}, json -    assert_match %r{"title": "So I was thinking"}, json -    assert_match %r{"body": "Like I hopefully always am"}, json +    assert_match %r{"title":"So I was thinking"}, json +    assert_match %r{"body":"Like I hopefully always am"}, json    end    def test_includes_uses_association_name_and_applies_attribute_filters      json = @david.to_json(:include => { :posts => { :only => :title } }) -    assert_match %r{"name": "David"}, json -    assert_match %r{"posts": \[}, json +    assert_match %r{"name":"David"}, json +    assert_match %r{"posts":\[}, json -    assert_match %r{"title": "Welcome to the weblog"}, json -    assert_no_match %r{"body": "Such a lovely day"}, json +    assert_match %r{"title":"Welcome to the weblog"}, json +    assert_no_match %r{"body":"Such a lovely day"}, json -    assert_match %r{"title": "So I was thinking"}, json -    assert_no_match %r{"body": "Like I hopefully always am"}, json +    assert_match %r{"title":"So I was thinking"}, json +    assert_no_match %r{"body":"Like I hopefully always am"}, json    end    def test_includes_fetches_second_level_associations      json = @david.to_json(:include => { :posts => { :include => { :comments => { :only => :body } } } }) -    assert_match %r{"name": "David"}, json -    assert_match %r{"posts": \[}, json +    assert_match %r{"name":"David"}, json +    assert_match %r{"posts":\[}, json -    assert_match %r{"comments": \[}, json -    assert_match %r{\{"body": "Thank you again for the welcome"\}}, json -    assert_match %r{\{"body": "Don't think too hard"\}}, json -    assert_no_match %r{"post_id": }, json +    assert_match %r{"comments":\[}, json +    assert_match %r{\{"body":"Thank you again for the welcome"\}}, json +    assert_match %r{\{"body":"Don't think too hard"\}}, json +    assert_no_match %r{"post_id":}, json    end    def test_includes_fetches_nth_level_associations @@ -151,11 +151,11 @@ class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase          }      }) -    assert_match %r{"name": "David"}, json -    assert_match %r{"posts": \[}, json +    assert_match %r{"name":"David"}, json +    assert_match %r{"posts":\[}, json -    assert_match %r{"taggings": \[}, json -    assert_match %r{"tag": \{"name": "General"\}}, json +    assert_match %r{"taggings":\[}, json +    assert_match %r{"tag":\{"name":"General"\}}, json    end    def test_should_not_call_methods_on_associations_that_dont_respond @@ -163,20 +163,20 @@ class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase      json = @david.to_json(:include => :posts, :methods => :favorite_quote)      assert !@david.posts.first.respond_to?(:favorite_quote) -    assert_match %r{"favorite_quote": "Constraints are liberating"}, json -    assert_equal %r{"favorite_quote": }.match(json).size, 1 +    assert_match %r{"favorite_quote":"Constraints are liberating"}, json +    assert_equal %r{"favorite_quote":}.match(json).size, 1    end    def test_should_allow_only_option_for_list_of_authors      authors = [@david, @mary] -    assert_equal %([{"name": "David"}, {"name": "Mary"}]), authors.to_json(:only => :name) +    assert_equal %([{"name":"David"},{"name":"Mary"}]), authors.to_json(:only => :name)    end    def test_should_allow_except_option_for_list_of_authors      authors = [@david, @mary] -    assert_equal %([{"id": 1}, {"id": 2}]), authors.to_json(:except => [:name, :author_address_id, :author_address_extra_id]) +    assert_equal %([{"id":1},{"id":2}]), authors.to_json(:except => [:name, :author_address_id, :author_address_extra_id])    end    def test_should_allow_includes_for_list_of_authors @@ -188,8 +188,8 @@ class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase        }      ) -    ['"name": "David"', '"posts": [', '{"id": 1}', '{"id": 2}', '{"id": 4}', -     '{"id": 5}', '{"id": 6}', '"name": "Mary"', '"posts": [{"id": 7}]'].each do |fragment| +    ['"name":"David"', '"posts":[', '{"id":1}', '{"id":2}', '{"id":4}', +     '{"id":5}', '{"id":6}', '"name":"Mary"', '"posts":[{"id":7}]'].each do |fragment|        assert json.include?(fragment), json       end    end @@ -200,6 +200,6 @@ class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase        2 => @mary      } -    assert_equal %({"1": {"name": "David"}}), authors_hash.to_json(:only => [1, :name]) +    assert_equal %({"1":{"name":"David"}}), authors_hash.to_json(:only => [1, :name])    end  end diff --git a/activeresource/lib/active_resource/base.rb b/activeresource/lib/active_resource/base.rb index 6cb5beb789..2e742267ba 100644 --- a/activeresource/lib/active_resource/base.rb +++ b/activeresource/lib/active_resource/base.rb @@ -887,9 +887,12 @@ module ActiveResource      #   person.to_json(:except => ["first_name"])      #   # => {"last_name": "Smith"}      def to_json(options={}) -      attributes.to_json(options) +      ActiveSupport::JSON.encode(attributes, options)      end +    # For compatibility with ActiveSupport::JSON.encode +    alias rails_to_json to_json +      # Returns the serialized string representation of the resource in the configured      # serialization format specified in ActiveResource::Base.format. The options      # applicable depend on the configured encoding format. diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG index cd7b47d780..ca5ab13a46 100644 --- a/activesupport/CHANGELOG +++ b/activesupport/CHANGELOG @@ -1,5 +1,20 @@  *Edge* +* Add ActiveSupport.parse_json_times to disable time parsing in JSON backends that don't support it or don't need it. [rick] + +* Add pluggable JSON backends with support for the JSON gem. [rick] +    Example: ActiveSupport::JSON.backend = "JSONGem" + + All internal Rails JSON encoding is now handled by ActiveSupport::JSON.encode().  Use of #to_json is not recommended, as it may clash with other libraries that overwrite it.  However, you can recover Rails specific functionality + if you really want to use #to_json. + +    gem 'json' +    ActiveSupport::JSON.backend = "JSONGem" + +    class ActiveRecord::Base +      alias to_json rails_to_json +    end +  * require 'active_support' no longer orders the whole menu of core extensions. Ask for just what you need: e.g. require 'active_support/core/time' to use timezones, durations, and stdlib date/time extensions. [Jeremy Kemper]  * Removed rarely-used DRb cache store.  [Jeremy Kemper] diff --git a/activesupport/Rakefile b/activesupport/Rakefile index f7fd52c7d8..a4e8200a43 100644 --- a/activesupport/Rakefile +++ b/activesupport/Rakefile @@ -21,6 +21,12 @@ Rake::TestTask.new { |t|    t.verbose = true    t.warning = true  } +task :isolated_test do  +  Dir['test/**/*_test.rb'].all? do |file| +    ruby = File.join(*RbConfig::CONFIG.values_at('bindir', 'RUBY_INSTALL_NAME')) +    system(ruby, '-Ilib:test', file) +  end or raise "Failures" +end  # Create compressed packages  dist_dirs = [ "lib", "test"] diff --git a/activesupport/lib/active_support/cache.rb b/activesupport/lib/active_support/cache.rb index 4b2eebb007..feb6b1f2cf 100644 --- a/activesupport/lib/active_support/cache.rb +++ b/activesupport/lib/active_support/cache.rb @@ -2,6 +2,7 @@ require 'benchmark'  require 'active_support/core_ext/benchmark'  require 'active_support/core_ext/exception'  require 'active_support/core_ext/class/attribute_accessors' +require 'active_support/core_ext' # FIXME: pulling in all to_param extensions  module ActiveSupport    # See ActiveSupport::Cache::Store for documentation. diff --git a/activesupport/lib/active_support/cache/strategy/local_cache.rb b/activesupport/lib/active_support/cache/strategy/local_cache.rb index 84d9a0e6d8..4bbcd8e4c4 100644 --- a/activesupport/lib/active_support/cache/strategy/local_cache.rb +++ b/activesupport/lib/active_support/cache/strategy/local_cache.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/object/duplicable' +  module ActiveSupport    module Cache      module Strategy diff --git a/activesupport/lib/active_support/callbacks.rb b/activesupport/lib/active_support/callbacks.rb index 4bac8292e2..f049189b9a 100644 --- a/activesupport/lib/active_support/callbacks.rb +++ b/activesupport/lib/active_support/callbacks.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/array/extract_options' +  module ActiveSupport    # Callbacks are hooks into the lifecycle of an object that allow you to trigger logic    # before or after an alteration of the object state. diff --git a/activesupport/lib/active_support/core_ext/array/conversions.rb b/activesupport/lib/active_support/core_ext/array/conversions.rb index 81e466779e..5f1ce4142f 100644 --- a/activesupport/lib/active_support/core_ext/array/conversions.rb +++ b/activesupport/lib/active_support/core_ext/array/conversions.rb @@ -1,3 +1,7 @@ +require 'active_support/core_ext/hash/keys' +require 'active_support/core_ext/hash/reverse_merge' +require 'active_support/inflector' +  class Array    # Converts the array to a comma-separated sentence where the last element is joined by the connector word. Options:    # * <tt>:words_connector</tt> - The sign or word used to join the elements in arrays with two or more elements (default: ", ") @@ -155,7 +159,7 @@ class Array      raise "Not all elements respond to to_xml" unless all? { |e| e.respond_to? :to_xml }      require 'builder' unless defined?(Builder) -    options[:root]     ||= all? { |e| e.is_a?(first.class) && first.class.to_s != "Hash" } ? first.class.to_s.underscore.pluralize : "records" +    options[:root]     ||= all? { |e| e.is_a?(first.class) && first.class.to_s != "Hash" } ? ActiveSupport::Inflector.pluralize(ActiveSupport::Inflector.underscore(first.class.name)) : "records"      options[:children] ||= options[:root].singularize      options[:indent]   ||= 2      options[:builder]  ||= Builder::XmlMarkup.new(:indent => options[:indent]) diff --git a/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb b/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb index 75e481fc54..74ce85a1c2 100644 --- a/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb +++ b/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/array/extract_options' +  # Extends the class object with class and instance accessors for class attributes,  # just like the native attr* accessors for instance attributes.  # diff --git a/activesupport/lib/active_support/core_ext/class/delegating_attributes.rb b/activesupport/lib/active_support/core_ext/class/delegating_attributes.rb index b0784d8416..fd029544c3 100644 --- a/activesupport/lib/active_support/core_ext/class/delegating_attributes.rb +++ b/activesupport/lib/active_support/core_ext/class/delegating_attributes.rb @@ -1,4 +1,4 @@ -require 'active_support/core_ext/blank' +require 'active_support/core_ext/object/blank'  class Class    def superclass_delegating_reader(*names) diff --git a/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb b/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb index 2f18666ab9..cca93a0b9f 100644 --- a/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb +++ b/activesupport/lib/active_support/core_ext/class/inheritable_attributes.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/object/duplicable' +  # Retain for backward compatibility.  Methods are now included in Class.  module ClassInheritableAttributes # :nodoc:  end @@ -216,4 +218,4 @@ class Class      extlib_inheritable_reader(*syms)      extlib_inheritable_writer(*syms)    end -end
\ No newline at end of file +end diff --git a/activesupport/lib/active_support/core_ext/class/removal.rb b/activesupport/lib/active_support/core_ext/class/removal.rb index 10660edb2c..2dea3c24d5 100644 --- a/activesupport/lib/active_support/core_ext/class/removal.rb +++ b/activesupport/lib/active_support/core_ext/class/removal.rb @@ -1,3 +1,6 @@ +require 'active_support/core_ext/object/extending' +require 'active_support/core_ext/module/introspection' +  class Class #:nodoc:    # Unassociates the class with its subclasses and removes the subclasses diff --git a/activesupport/lib/active_support/core_ext/date/calculations.rb b/activesupport/lib/active_support/core_ext/date/calculations.rb index 59efdbd1b6..04a32edefd 100644 --- a/activesupport/lib/active_support/core_ext/date/calculations.rb +++ b/activesupport/lib/active_support/core_ext/date/calculations.rb @@ -1,3 +1,5 @@ +require 'active_support/duration' +  class Date    class << self      # Returns a new Date representing the date 1 day ago (i.e. yesterday's date). diff --git a/activesupport/lib/active_support/core_ext/date/conversions.rb b/activesupport/lib/active_support/core_ext/date/conversions.rb index f6c870035b..54facf4430 100644 --- a/activesupport/lib/active_support/core_ext/date/conversions.rb +++ b/activesupport/lib/active_support/core_ext/date/conversions.rb @@ -1,4 +1,6 @@  require 'active_support/inflector' +require 'active_support/core_ext/time/conversions' +require 'active_support/core_ext/date_time/conversions'  class Date    DATE_FORMATS = { diff --git a/activesupport/lib/active_support/core_ext/date_time.rb b/activesupport/lib/active_support/core_ext/date_time.rb index 83a11da1c7..004fd0ad29 100644 --- a/activesupport/lib/active_support/core_ext/date_time.rb +++ b/activesupport/lib/active_support/core_ext/date_time.rb @@ -1,5 +1,4 @@ -require 'date' - +require 'active_support/core_ext/time'  require 'active_support/core_ext/date_time/acts_like'  require 'active_support/core_ext/date_time/calculations'  require 'active_support/core_ext/date_time/conversions' diff --git a/activesupport/lib/active_support/core_ext/hash/conversions.rb b/activesupport/lib/active_support/core_ext/hash/conversions.rb index fa171720f9..f9dddec687 100644 --- a/activesupport/lib/active_support/core_ext/hash/conversions.rb +++ b/activesupport/lib/active_support/core_ext/hash/conversions.rb @@ -1,6 +1,8 @@  require 'date'  require 'active_support/core_ext/object/conversions'  require 'active_support/core_ext/array/conversions' +require 'active_support/core_ext/hash/reverse_merge' +require 'active_support/core/time'  class Hash    # This module exists to decorate files deserialized using Hash.from_xml with diff --git a/activesupport/lib/active_support/core_ext/logger.rb b/activesupport/lib/active_support/core_ext/logger.rb index 858da7aa07..22749229a3 100644 --- a/activesupport/lib/active_support/core_ext/logger.rb +++ b/activesupport/lib/active_support/core_ext/logger.rb @@ -1,6 +1,7 @@ -# Adds the 'around_level' method to Logger. +require 'active_support/core_ext/class/attribute_accessors' -class Logger +# Adds the 'around_level' method to Logger. +class Logger #:nodoc:    def self.define_around_helper(level)      module_eval <<-end_eval        def around_#{level}(before_message, after_message, &block)  # def around_debug(before_message, after_message, &block) diff --git a/activesupport/lib/active_support/core_ext/module/attr_internal.rb b/activesupport/lib/active_support/core_ext/module/attr_internal.rb index b66c0d7500..d052bfed2d 100644 --- a/activesupport/lib/active_support/core_ext/module/attr_internal.rb +++ b/activesupport/lib/active_support/core_ext/module/attr_internal.rb @@ -22,11 +22,11 @@ class Module    alias_method :attr_internal, :attr_internal_accessor -  private -    mattr_accessor :attr_internal_naming_format -    self.attr_internal_naming_format = '@_%s' +  class << self; attr_accessor :attr_internal_naming_format end +  self.attr_internal_naming_format = '@_%s' +  private      def attr_internal_ivar_name(attr) -      attr_internal_naming_format % attr +      Module.attr_internal_naming_format % attr      end  end diff --git a/activesupport/lib/active_support/core_ext/module/introspection.rb b/activesupport/lib/active_support/core_ext/module/introspection.rb index 7708d573fa..23a1063901 100644 --- a/activesupport/lib/active_support/core_ext/module/introspection.rb +++ b/activesupport/lib/active_support/core_ext/module/introspection.rb @@ -1,3 +1,5 @@ +require 'active_support/inflector' +  class Module    # Returns the name of the module containing this one.    # @@ -26,7 +28,7 @@ class Module    #   p Module.new.parent # => Object    #    def parent -    parent_name ? parent_name.constantize : Object +    parent_name ? ActiveSupport::Inflector.constantize(parent_name) : Object    end    # Returns all the parents of this module according to its name, ordered from @@ -47,7 +49,7 @@ class Module      if parent_name        parts = parent_name.split('::')        until parts.empty? -        parents << (parts * '::').constantize +        parents << ActiveSupport::Inflector.constantize(parts * '::')          parts.pop        end      end diff --git a/activesupport/lib/active_support/core_ext/module/model_naming.rb b/activesupport/lib/active_support/core_ext/module/model_naming.rb index 004b96a3c1..36fde87b23 100644 --- a/activesupport/lib/active_support/core_ext/module/model_naming.rb +++ b/activesupport/lib/active_support/core_ext/module/model_naming.rb @@ -1,13 +1,15 @@ +require 'active_support/inflector' +  module ActiveSupport    class ModelName < String      attr_reader :singular, :plural, :cache_key, :partial_path      def initialize(name)        super -      @singular = underscore.tr('/', '_').freeze -      @plural = @singular.pluralize.freeze +      @singular = ActiveSupport::Inflector.underscore(self).tr('/', '_').freeze +      @plural = ActiveSupport::Inflector.pluralize(@singular).freeze        @cache_key = tableize.freeze -      @partial_path = "#{@cache_key}/#{demodulize.underscore}".freeze +      @partial_path = "#{@cache_key}/#{ActiveSupport::Inflector.underscore(ActiveSupport::Inflector.demodulize(self))}".freeze      end    end  end diff --git a/activesupport/lib/active_support/core_ext/module/synchronization.rb b/activesupport/lib/active_support/core_ext/module/synchronization.rb index 069db3fed0..f72d512340 100644 --- a/activesupport/lib/active_support/core_ext/module/synchronization.rb +++ b/activesupport/lib/active_support/core_ext/module/synchronization.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/module/aliasing' +  class Module    # Synchronize access around a method, delegating synchronization to a    # particular mutex. A mutex (either a Mutex, or any object that responds to  diff --git a/activesupport/lib/active_support/core_ext/numeric/time.rb b/activesupport/lib/active_support/core_ext/numeric/time.rb index 2955e8ff1d..d1062805c5 100644 --- a/activesupport/lib/active_support/core_ext/numeric/time.rb +++ b/activesupport/lib/active_support/core_ext/numeric/time.rb @@ -1,3 +1,5 @@ +require 'active_support/duration' +  class Numeric    # Enables the use of time calculations and declarations, like 45.minutes + 2.hours + 4.years.    # diff --git a/activesupport/lib/active_support/core_ext/object.rb b/activesupport/lib/active_support/core_ext/object.rb index 96385d2b87..04e8f06b3d 100644 --- a/activesupport/lib/active_support/core_ext/object.rb +++ b/activesupport/lib/active_support/core_ext/object.rb @@ -1,3 +1,4 @@ +require 'active_support/core_ext/object/acts_like'  require 'active_support/core_ext/object/blank'  require 'active_support/core_ext/object/duplicable'  require 'active_support/core_ext/object/try' diff --git a/activesupport/lib/active_support/core_ext/range/blockless_step.rb b/activesupport/lib/active_support/core_ext/range/blockless_step.rb index f4792d03b7..db42ef5c47 100644 --- a/activesupport/lib/active_support/core_ext/range/blockless_step.rb +++ b/activesupport/lib/active_support/core_ext/range/blockless_step.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/module/aliasing' +  class Range    begin      (1..2).step diff --git a/activesupport/lib/active_support/core_ext/string/conversions.rb b/activesupport/lib/active_support/core_ext/string/conversions.rb index 39c2b1b8ed..3f05db62c3 100644 --- a/activesupport/lib/active_support/core_ext/string/conversions.rb +++ b/activesupport/lib/active_support/core_ext/string/conversions.rb @@ -1,4 +1,5 @@  require 'date' +require 'active_support/core_ext/time/calculations'  class String    # 'a'.ord == 'a'[0] for Ruby 1.9 forward compatibility. diff --git a/activesupport/lib/active_support/core_ext/string/multibyte.rb b/activesupport/lib/active_support/core_ext/string/multibyte.rb index 0f0dfb2443..13208c6ee2 100644 --- a/activesupport/lib/active_support/core_ext/string/multibyte.rb +++ b/activesupport/lib/active_support/core_ext/string/multibyte.rb @@ -1,4 +1,5 @@  # encoding: utf-8 +require 'active_support/multibyte'  class String    unless '1.9'.respond_to?(:force_encoding) diff --git a/activesupport/lib/active_support/dependencies.rb b/activesupport/lib/active_support/dependencies.rb index 1804c14618..855b720ef1 100644 --- a/activesupport/lib/active_support/dependencies.rb +++ b/activesupport/lib/active_support/dependencies.rb @@ -1,11 +1,13 @@  require 'set'  require 'thread' -require 'active_support/inflector' -require 'active_support/core_ext/name_error' -require 'active_support/core_ext/object/blank'  require 'active_support/core_ext/module/aliasing'  require 'active_support/core_ext/module/attribute_accessors'  require 'active_support/core_ext/module/introspection' +require 'active_support/core_ext/object/blank' +require 'active_support/core_ext/load_error' +require 'active_support/core_ext/name_error' +require 'active_support/core_ext/string/starts_ends_with' +require 'active_support/inflector'  module ActiveSupport #:nodoc:    module Dependencies #:nodoc: diff --git a/activesupport/lib/active_support/deprecation/method_wrappers.rb b/activesupport/lib/active_support/deprecation/method_wrappers.rb index b35d4daf9a..b9eb539aa7 100644 --- a/activesupport/lib/active_support/deprecation/method_wrappers.rb +++ b/activesupport/lib/active_support/deprecation/method_wrappers.rb @@ -1,4 +1,5 @@  require 'active_support/core_ext/module/deprecation' +require 'active_support/core_ext/module/aliasing'  module ActiveSupport    class << Deprecation diff --git a/activesupport/lib/active_support/deprecation/proxy_wrappers.rb b/activesupport/lib/active_support/deprecation/proxy_wrappers.rb index 1c268d0d9c..ec54efe08e 100644 --- a/activesupport/lib/active_support/deprecation/proxy_wrappers.rb +++ b/activesupport/lib/active_support/deprecation/proxy_wrappers.rb @@ -1,3 +1,5 @@ +require 'active_support/inflector' +  module ActiveSupport    module Deprecation      class DeprecationProxy #:nodoc: @@ -61,7 +63,7 @@ module ActiveSupport        private          def target -          @new_const.to_s.constantize +          ActiveSupport::Inflector.constantize(@new_const.to_s)          end          def warn(callstack, called, args) diff --git a/activesupport/lib/active_support/duration.rb b/activesupport/lib/active_support/duration.rb index f64661c5b1..a33586f77f 100644 --- a/activesupport/lib/active_support/duration.rb +++ b/activesupport/lib/active_support/duration.rb @@ -1,4 +1,5 @@  require 'active_support/basic_object' +require 'active_support/core_ext/array/conversions'  module ActiveSupport    # Provides accurate date and time measurements using Date#advance and  diff --git a/activesupport/lib/active_support/inflector.rb b/activesupport/lib/active_support/inflector.rb index 614afa1bd6..ff70d6d76e 100644 --- a/activesupport/lib/active_support/inflector.rb +++ b/activesupport/lib/active_support/inflector.rb @@ -1,6 +1,7 @@  # encoding: utf-8  require 'iconv' - +require 'active_support/core_ext/object/blank' +require 'active_support/core_ext/string/access'  require 'active_support/core_ext/string/multibyte'  module ActiveSupport diff --git a/activesupport/lib/active_support/json.rb b/activesupport/lib/active_support/json.rb index 91f19f8a70..fc433de582 100644 --- a/activesupport/lib/active_support/json.rb +++ b/activesupport/lib/active_support/json.rb @@ -1,8 +1,37 @@ +require 'active_support/core_ext/module/delegation'  require 'active_support/core_ext/module/attribute_accessors'  module ActiveSupport    # If true, use ISO 8601 format for dates and times. Otherwise, fall back to the Active Support legacy format.    mattr_accessor :use_standard_json_time_format +  # Look for and parse json strings that look like ISO 8601 times. +  mattr_accessor :parse_json_times + +  module JSON +    # matches YAML-formatted dates +    DATE_REGEX = /^(?:\d{4}-\d{2}-\d{2}|\d{4}-\d{1,2}-\d{1,2}[ \t]+\d{1,2}:\d{2}:\d{2}(\.[0-9]*)?(([ \t]*)Z|[-+]\d{2}?(:\d{2})?))$/ + +    class << self +      attr_reader :backend +      delegate :decode, :to => :backend +     +      def backend=(name) +        if name.is_a?(Module) +          @backend = name +        else +          require "active_support/json/backends/#{name.to_s.downcase}.rb" +          @backend = ActiveSupport::JSON::Backends::const_get(name) +        end +      end +     +      def with_backend(name) +        old_backend, self.backend = backend, name +        yield +      ensure +        self.backend = old_backend +      end +    end +  end    class << self      def escape_html_entities_in_json @@ -19,7 +48,8 @@ module ActiveSupport        @escape_html_entities_in_json = value      end    end + +  JSON.backend = 'Yaml'  end -require 'active_support/json/encoding' -require 'active_support/json/decoding' +require 'active_support/json/encoding'
\ No newline at end of file diff --git a/activesupport/lib/active_support/json/backends/jsongem.rb b/activesupport/lib/active_support/json/backends/jsongem.rb new file mode 100644 index 0000000000..de847e30a3 --- /dev/null +++ b/activesupport/lib/active_support/json/backends/jsongem.rb @@ -0,0 +1,36 @@ +module ActiveSupport +  module JSON +    ParseError = ::JSON::ParserError + +    module Backends +      module JSONGem +        extend self + +        # Converts a JSON string into a Ruby object. +        def decode(json) +          data = ::JSON.parse(json) +          if ActiveSupport.parse_json_times +            convert_dates_from(data) +          else +            data +          end +        end + +      private +        def convert_dates_from(data) +          case data +            when DATE_REGEX +              DateTime.parse(data) +            when Array +              data.map! { |d| convert_dates_from(d) } +            when Hash +              data.each do |key, value| +                data[key] = convert_dates_from(value) +              end +            else data +          end +        end +      end +    end +  end +end
\ No newline at end of file diff --git a/activesupport/lib/active_support/json/backends/yaml.rb b/activesupport/lib/active_support/json/backends/yaml.rb new file mode 100644 index 0000000000..c7db508c23 --- /dev/null +++ b/activesupport/lib/active_support/json/backends/yaml.rb @@ -0,0 +1,83 @@ +require 'active_support/core_ext/string/starts_ends_with' + +module ActiveSupport +  module JSON +    class ParseError < StandardError +    end + +    module Backends +      module Yaml +        extend self + +        # Converts a JSON string into a Ruby object. +        def decode(json) +          YAML.load(convert_json_to_yaml(json)) +        rescue ArgumentError => e +          raise ParseError, "Invalid JSON string" +        end +     +        protected +          # Ensure that ":" and "," are always followed by a space +          def convert_json_to_yaml(json) #:nodoc: +            require 'strscan' unless defined? ::StringScanner +            scanner, quoting, marks, pos, times = ::StringScanner.new(json), false, [], nil, [] +            while scanner.scan_until(/(\\['"]|['":,\\]|\\.)/) +              case char = scanner[1] +              when '"', "'" +                if !quoting +                  quoting = char +                  pos = scanner.pos +                elsif quoting == char +                  if json[pos..scanner.pos-2] =~ DATE_REGEX +                    # found a date, track the exact positions of the quotes so we can remove them later. +                    # oh, and increment them for each current mark, each one is an extra padded space that bumps +                    # the position in the final YAML output +                    total_marks = marks.size +                    times << pos+total_marks << scanner.pos+total_marks +                  end +                  quoting = false +                end +              when ":","," +                marks << scanner.pos - 1 unless quoting +              end +            end + +            if marks.empty? +              json.gsub(/\\([\\\/]|u[[:xdigit:]]{4})/) do +                ustr = $1 +                if ustr.start_with?('u') +                  [ustr[1..-1].to_i(16)].pack("U") +                elsif ustr == '\\' +                  '\\\\' +                else +                  ustr +                end +              end +            else +              left_pos  = [-1].push(*marks) +              right_pos = marks << scanner.pos + scanner.rest_size +              output    = [] +              left_pos.each_with_index do |left, i| +                scanner.pos = left.succ +                output << scanner.peek(right_pos[i] - scanner.pos + 1).gsub(/\\([\\\/]|u[[:xdigit:]]{4})/) do +                  ustr = $1 +                  if ustr.start_with?('u') +                    [ustr[1..-1].to_i(16)].pack("U") +                  elsif ustr == '\\' +                    '\\\\' +                  else +                    ustr +                  end +                end +              end +              output = output * " " + +              times.each { |i| output[i-1] = ' ' } +              output.gsub!(/\\\//, '/') +              output +            end +          end +      end +    end +  end +end diff --git a/activesupport/lib/active_support/json/decoding.rb b/activesupport/lib/active_support/json/decoding.rb deleted file mode 100644 index 70e9f40fc7..0000000000 --- a/activesupport/lib/active_support/json/decoding.rb +++ /dev/null @@ -1,82 +0,0 @@ -require 'active_support/core_ext/string/starts_ends_with' - -module ActiveSupport -  module JSON -    class ParseError < StandardError -    end -     -    class << self -      # Converts a JSON string into a Ruby object. -      def decode(json) -        YAML.load(convert_json_to_yaml(json)) -      rescue ArgumentError => e -        raise ParseError, "Invalid JSON string" -      end -       -      protected -        # matches YAML-formatted dates -        DATE_REGEX = /^(?:\d{4}-\d{2}-\d{2}|\d{4}-\d{1,2}-\d{1,2}[ \t]+\d{1,2}:\d{2}:\d{2}(\.[0-9]*)?(([ \t]*)Z|[-+]\d{2}?(:\d{2})?)?)$/ - -        # Ensure that ":" and "," are always followed by a space -        def convert_json_to_yaml(json) #:nodoc: -          require 'strscan' unless defined? ::StringScanner -          scanner, quoting, marks, pos, times = ::StringScanner.new(json), false, [], nil, [] -          while scanner.scan_until(/(\\['"]|['":,\\]|\\.)/) -            case char = scanner[1] -            when '"', "'" -              if !quoting -                quoting = char -                pos = scanner.pos -              elsif quoting == char -                if json[pos..scanner.pos-2] =~ DATE_REGEX -                  # found a date, track the exact positions of the quotes so we can remove them later. -                  # oh, and increment them for each current mark, each one is an extra padded space that bumps -                  # the position in the final YAML output -                  total_marks = marks.size -                  times << pos+total_marks << scanner.pos+total_marks -                end -                quoting = false -              end -            when ":","," -              marks << scanner.pos - 1 unless quoting -            end -          end - -          if marks.empty? -            json.gsub(/\\([\\\/]|u[[:xdigit:]]{4})/) do -              ustr = $1 -              if ustr.start_with?('u') -                [ustr[1..-1].to_i(16)].pack("U") -              elsif ustr == '\\' -                '\\\\' -              else -                ustr -              end -            end -          else -            left_pos  = [-1].push(*marks) -            right_pos = marks << scanner.pos + scanner.rest_size -            output    = [] -            left_pos.each_with_index do |left, i| -              scanner.pos = left.succ -              output << scanner.peek(right_pos[i] - scanner.pos + 1).gsub(/\\([\\\/]|u[[:xdigit:]]{4})/) do -                ustr = $1 -                if ustr.start_with?('u') -                  [ustr[1..-1].to_i(16)].pack("U") -                elsif ustr == '\\' -                  '\\\\' -                else -                  ustr -                end -              end -            end -            output = output * " " -             -            times.each { |i| output[i-1] = ' ' } -            output.gsub!(/\\\//, '/') -            output -          end -        end -    end -  end -end diff --git a/activesupport/lib/active_support/json/encoders/date.rb b/activesupport/lib/active_support/json/encoders/date.rb index cc84de1388..79c3957362 100644 --- a/activesupport/lib/active_support/json/encoders/date.rb +++ b/activesupport/lib/active_support/json/encoders/date.rb @@ -11,11 +11,13 @@ class Date    #   # With ActiveSupport.use_standard_json_time_format = false    #   Date.new(2005,2,1).to_json    #   # => "2005/02/01" -  def to_json(options = nil) +  def rails_to_json(options = nil)      if ActiveSupport.use_standard_json_time_format        %("#{strftime("%Y-%m-%d")}")      else        %("#{strftime("%Y/%m/%d")}")      end    end + +  alias to_json rails_to_json  end diff --git a/activesupport/lib/active_support/json/encoders/date_time.rb b/activesupport/lib/active_support/json/encoders/date_time.rb index 6c85824105..cdfc39b9f3 100644 --- a/activesupport/lib/active_support/json/encoders/date_time.rb +++ b/activesupport/lib/active_support/json/encoders/date_time.rb @@ -11,11 +11,13 @@ class DateTime    #   # With ActiveSupport.use_standard_json_time_format = false    #   DateTime.civil(2005,2,1,15,15,10).to_json    #   # => "2005/02/01 15:15:10 +0000" -  def to_json(options = nil) +  def rails_to_json(options = nil)      if ActiveSupport.use_standard_json_time_format        xmlschema.inspect      else        strftime('"%Y/%m/%d %H:%M:%S %z"')      end    end + +  alias to_json rails_to_json  end diff --git a/activesupport/lib/active_support/json/encoders/enumerable.rb b/activesupport/lib/active_support/json/encoders/enumerable.rb index 881b1d62c1..e1c3ec249d 100644 --- a/activesupport/lib/active_support/json/encoders/enumerable.rb +++ b/activesupport/lib/active_support/json/encoders/enumerable.rb @@ -6,7 +6,9 @@ module Enumerable    #   # => users.to_json(:only => :name)    #    # will pass the <tt>:only => :name</tt> option to each user. -  def to_json(options = {}) #:nodoc: -    "[#{map { |value| ActiveSupport::JSON.encode(value, options) } * ', '}]" +  def rails_to_json(options = {}) #:nodoc: +    "[#{map { |value| ActiveSupport::JSON.encode(value, options) } * ','}]"    end + +  alias to_json rails_to_json  end diff --git a/activesupport/lib/active_support/json/encoders/false_class.rb b/activesupport/lib/active_support/json/encoders/false_class.rb index bf0844334b..a7657cca37 100644 --- a/activesupport/lib/active_support/json/encoders/false_class.rb +++ b/activesupport/lib/active_support/json/encoders/false_class.rb @@ -1,5 +1,7 @@  class FalseClass -  def to_json(options = nil) #:nodoc: +  def rails_to_json(options = nil) #:nodoc:      'false'    end + +  alias to_json rails_to_json  end diff --git a/activesupport/lib/active_support/json/encoders/hash.rb b/activesupport/lib/active_support/json/encoders/hash.rb index d87b880743..19b97d7b8c 100644 --- a/activesupport/lib/active_support/json/encoders/hash.rb +++ b/activesupport/lib/active_support/json/encoders/hash.rb @@ -30,7 +30,7 @@ class Hash    # would pass the <tt>:include => :posts</tt> option to <tt>users</tt>,    # allowing the posts association in the User model to be converted to JSON    # as well. -  def to_json(options = {}) #:nodoc: +  def rails_to_json(options = {}) #:nodoc:      hash_keys = self.keys      if except = options[:except] @@ -41,8 +41,10 @@ class Hash      result = '{'      result << hash_keys.map do |key| -      "#{ActiveSupport::JSON.encode(key.to_s)}: #{ActiveSupport::JSON.encode(self[key], options)}" -    end * ', ' +      "#{ActiveSupport::JSON.encode(key.to_s)}:#{ActiveSupport::JSON.encode(self[key], options)}" +    end * ','      result << '}'    end + +  alias to_json rails_to_json  end diff --git a/activesupport/lib/active_support/json/encoders/nil_class.rb b/activesupport/lib/active_support/json/encoders/nil_class.rb index 4763471ac4..b31e1dd249 100644 --- a/activesupport/lib/active_support/json/encoders/nil_class.rb +++ b/activesupport/lib/active_support/json/encoders/nil_class.rb @@ -1,5 +1,7 @@  class NilClass -  def to_json(options = nil) #:nodoc: +  def rails_to_json(options = nil) #:nodoc:      'null'    end + +  alias to_json rails_to_json  end diff --git a/activesupport/lib/active_support/json/encoders/numeric.rb b/activesupport/lib/active_support/json/encoders/numeric.rb index 38713fb369..491b330c39 100644 --- a/activesupport/lib/active_support/json/encoders/numeric.rb +++ b/activesupport/lib/active_support/json/encoders/numeric.rb @@ -1,5 +1,7 @@  class Numeric -  def to_json(options = nil) #:nodoc: +  def rails_to_json(options = nil) #:nodoc:      to_s    end + +  alias to_json rails_to_json  end diff --git a/activesupport/lib/active_support/json/encoders/object.rb b/activesupport/lib/active_support/json/encoders/object.rb index 0475967aee..d68f50562e 100644 --- a/activesupport/lib/active_support/json/encoders/object.rb +++ b/activesupport/lib/active_support/json/encoders/object.rb @@ -2,7 +2,9 @@ require 'active_support/core_ext/object/instance_variables'  class Object    # Dumps object in JSON (JavaScript Object Notation). See www.json.org for more info. -  def to_json(options = {}) +  def rails_to_json(options = {})      ActiveSupport::JSON.encode(instance_values, options)    end + +  alias to_json rails_to_json  end diff --git a/activesupport/lib/active_support/json/encoders/regexp.rb b/activesupport/lib/active_support/json/encoders/regexp.rb index b6116b70b5..63ccd7c490 100644 --- a/activesupport/lib/active_support/json/encoders/regexp.rb +++ b/activesupport/lib/active_support/json/encoders/regexp.rb @@ -1,5 +1,7 @@  class Regexp -  def to_json(options = nil) #:nodoc: +  def rails_to_json(options = nil) #:nodoc:      inspect    end + +  alias to_json rails_to_json  end diff --git a/activesupport/lib/active_support/json/encoders/string.rb b/activesupport/lib/active_support/json/encoders/string.rb index 5ef797955a..27bef3b9cc 100644 --- a/activesupport/lib/active_support/json/encoders/string.rb +++ b/activesupport/lib/active_support/json/encoders/string.rb @@ -22,7 +22,7 @@ end  ActiveSupport.escape_html_entities_in_json = true  class String -  def to_json(options = nil) #:nodoc: +  def rails_to_json(options = nil) #:nodoc:      json = '"' + gsub(ActiveSupport::JSON::Encoding.escape_regex) { |s|        ActiveSupport::JSON::Encoding::ESCAPED_CHARS[s]      } @@ -33,4 +33,6 @@ class String        s.unpack("U*").pack("n*").unpack("H*")[0].gsub(/.{4}/, '\\\\u\&')      } + '"'    end + +  alias to_json rails_to_json  end diff --git a/activesupport/lib/active_support/json/encoders/symbol.rb b/activesupport/lib/active_support/json/encoders/symbol.rb index 485112f97c..6487bf8cb7 100644 --- a/activesupport/lib/active_support/json/encoders/symbol.rb +++ b/activesupport/lib/active_support/json/encoders/symbol.rb @@ -1,5 +1,7 @@  class Symbol -  def to_json(options = {}) #:nodoc: +  def rails_to_json(options = {}) #:nodoc:      ActiveSupport::JSON.encode(to_s, options)    end + +  alias to_json rails_to_json  end diff --git a/activesupport/lib/active_support/json/encoders/time.rb b/activesupport/lib/active_support/json/encoders/time.rb index f45a0059e8..2699672949 100644 --- a/activesupport/lib/active_support/json/encoders/time.rb +++ b/activesupport/lib/active_support/json/encoders/time.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/time/conversions' +  class Time    # Returns a JSON string representing the time. If ActiveSupport.use_standard_json_time_format is set to true, the    # ISO 8601 format is used. @@ -11,11 +13,13 @@ class Time    #   # With ActiveSupport.use_standard_json_time_format = false    #   Time.utc(2005,2,1,15,15,10).to_json    #   # => "2005/02/01 15:15:10 +0000" -  def to_json(options = nil) +  def rails_to_json(options = nil)      if ActiveSupport.use_standard_json_time_format        xmlschema.inspect      else        %("#{strftime("%Y/%m/%d %H:%M:%S")} #{formatted_offset(false)}")      end    end + +  alias to_json rails_to_json  end diff --git a/activesupport/lib/active_support/json/encoders/true_class.rb b/activesupport/lib/active_support/json/encoders/true_class.rb index 037d812b3f..ac7c7d1e87 100644 --- a/activesupport/lib/active_support/json/encoders/true_class.rb +++ b/activesupport/lib/active_support/json/encoders/true_class.rb @@ -1,5 +1,7 @@  class TrueClass -  def to_json(options = nil) #:nodoc: +  def rails_to_json(options = nil) #:nodoc:      'true'    end + +  alias to_json rails_to_json  end diff --git a/activesupport/lib/active_support/json/encoding.rb b/activesupport/lib/active_support/json/encoding.rb index aaaa3cdfd2..42a217cedc 100644 --- a/activesupport/lib/active_support/json/encoding.rb +++ b/activesupport/lib/active_support/json/encoding.rb @@ -8,7 +8,7 @@ module ActiveSupport        seen = (options[:seen] ||= [])        raise CircularReferenceError, 'object references itself' if seen.include?(value)        seen << value -      value.send(:to_json, options) +      value.send(:rails_to_json, options)      ensure        seen.pop      end diff --git a/activesupport/lib/active_support/json/variable.rb b/activesupport/lib/active_support/json/variable.rb index 7fd23b0a9e..3ee152ee3c 100644 --- a/activesupport/lib/active_support/json/variable.rb +++ b/activesupport/lib/active_support/json/variable.rb @@ -2,7 +2,7 @@ module ActiveSupport    module JSON      # A string that returns itself as its JSON-encoded form.      class Variable < String -      def to_json(options=nil) +      def rails_to_json(options=nil)          self        end      end diff --git a/activesupport/lib/active_support/memoizable.rb b/activesupport/lib/active_support/memoizable.rb index 2b85fd7be4..edf626802a 100644 --- a/activesupport/lib/active_support/memoizable.rb +++ b/activesupport/lib/active_support/memoizable.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/object/metaclass' +  module ActiveSupport    module SafelyMemoizable      def safely_memoize(*symbols) diff --git a/activesupport/lib/active_support/multibyte.rb b/activesupport/lib/active_support/multibyte.rb index 65a96af49a..d8d58f3bce 100644 --- a/activesupport/lib/active_support/multibyte.rb +++ b/activesupport/lib/active_support/multibyte.rb @@ -4,6 +4,8 @@ require 'active_support/multibyte/chars'  require 'active_support/multibyte/exceptions'  require 'active_support/multibyte/unicode_database' +require 'active_support/core_ext/module/attribute_accessors' +  module ActiveSupport #:nodoc:    module Multibyte      # A list of all available normalization forms. See http://www.unicode.org/reports/tr15/tr15-29.html for more diff --git a/activesupport/lib/active_support/new_callbacks.rb b/activesupport/lib/active_support/new_callbacks.rb index 356d70b650..7a48dbac04 100644 --- a/activesupport/lib/active_support/new_callbacks.rb +++ b/activesupport/lib/active_support/new_callbacks.rb @@ -1,3 +1,6 @@ +require 'active_support/core_ext/array/wrap' +require 'active_support/core_ext/class/inheritable_attributes' +  module ActiveSupport    # Callbacks are hooks into the lifecycle of an object that allow you to trigger logic    # before or after an alteration of the object state. diff --git a/activesupport/lib/active_support/testing/assertions.rb b/activesupport/lib/active_support/testing/assertions.rb index ca51adba1e..c529b92240 100644 --- a/activesupport/lib/active_support/testing/assertions.rb +++ b/activesupport/lib/active_support/testing/assertions.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/array/wrap' +  module ActiveSupport    module Testing      module Assertions diff --git a/activesupport/lib/active_support/time_with_zone.rb b/activesupport/lib/active_support/time_with_zone.rb index aa448debda..1949ce0ad3 100644 --- a/activesupport/lib/active_support/time_with_zone.rb +++ b/activesupport/lib/active_support/time_with_zone.rb @@ -130,14 +130,16 @@ module ActiveSupport      #   # With ActiveSupport.use_standard_json_time_format = false      #   Time.utc(2005,2,1,15,15,10).in_time_zone.to_json      #   # => "2005/02/01 15:15:10 +0000" -    def to_json(options = nil) -      if ActiveSupport.use_standard_json_time_format +    def rails_to_json(options = nil) +      if !ActiveSupport.respond_to?(:use_standard_json_time_format) || ActiveSupport.use_standard_json_time_format          xmlschema.inspect        else          %("#{time.strftime("%Y/%m/%d %H:%M:%S")} #{formatted_offset(false)}")        end      end +    alias to_json rails_to_json +      def to_yaml(options = {})        if options.kind_of?(YAML::Emitter)          utc.to_yaml(options) diff --git a/activesupport/lib/active_support/xml_mini.rb b/activesupport/lib/active_support/xml_mini.rb index ccd1349491..f22fbcc0e1 100644 --- a/activesupport/lib/active_support/xml_mini.rb +++ b/activesupport/lib/active_support/xml_mini.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/module/delegation' +  module ActiveSupport    # = XmlMini    # diff --git a/activesupport/lib/active_support/xml_mini/rexml.rb b/activesupport/lib/active_support/xml_mini/rexml.rb index 771109514c..5033210aae 100644 --- a/activesupport/lib/active_support/xml_mini/rexml.rb +++ b/activesupport/lib/active_support/xml_mini/rexml.rb @@ -1,3 +1,5 @@ +require 'active_support/core_ext/object/blank' +  # = XmlMini ReXML implementation  module ActiveSupport    module XmlMini_REXML #:nodoc: diff --git a/activesupport/test/buffered_logger_test.rb b/activesupport/test/buffered_logger_test.rb index d48c7fcc54..7a0ec2e910 100644 --- a/activesupport/test/buffered_logger_test.rb +++ b/activesupport/test/buffered_logger_test.rb @@ -4,11 +4,13 @@ require 'fileutils'  require 'active_support/buffered_logger'  class BufferedLoggerTest < Test::Unit::TestCase +  Logger = ActiveSupport::BufferedLogger +    def setup      @message = "A debug message"      @integer_message = 12345      @output  = StringIO.new -    @logger  = ActiveSupport::BufferedLogger.new(@output) +    @logger  = Logger.new(@output)    end    def test_should_log_debugging_message_when_debugging @@ -76,9 +78,9 @@ class BufferedLoggerTest < Test::Unit::TestCase      define_method "test_disabling_auto_flush_with_#{disable.inspect}_should_flush_at_max_buffer_size_as_failsafe" do        @logger.auto_flushing = disable -      assert_equal ActiveSupport::BufferedLogger::MAX_BUFFER_SIZE, @logger.auto_flushing +      assert_equal Logger::MAX_BUFFER_SIZE, @logger.auto_flushing -      (ActiveSupport::BufferedLogger::MAX_BUFFER_SIZE - 1).times do +      (Logger::MAX_BUFFER_SIZE - 1).times do          @logger.info 'wait for it..'          assert @output.string.empty?, @output.string        end @@ -89,8 +91,8 @@ class BufferedLoggerTest < Test::Unit::TestCase    end    def test_should_know_if_its_loglevel_is_below_a_given_level -    ActiveSupport::BufferedLogger::Severity.constants.each do |level| -      @logger.level = ActiveSupport::BufferedLogger::Severity.const_get(level) - 1 +    Logger::Severity.constants.each do |level| +      @logger.level = Logger::Severity.const_get(level) - 1        assert @logger.send("#{level.downcase}?"), "didn't know if it was #{level.downcase}? or below"      end    end @@ -111,7 +113,7 @@ class BufferedLoggerTest < Test::Unit::TestCase      tmp_directory = File.join(File.dirname(__FILE__), "tmp")      log_file = File.join(tmp_directory, "development.log")      assert !File.exist?(tmp_directory) -    @logger  = ActiveSupport::BufferedLogger.new(log_file) +    @logger  = Logger.new(log_file)      assert File.exist?(tmp_directory)    ensure      FileUtils.rm_rf(tmp_directory) diff --git a/activesupport/test/core_ext/array_ext_test.rb b/activesupport/test/core_ext/array_ext_test.rb index 112cb998b1..24d33896ce 100644 --- a/activesupport/test/core_ext/array_ext_test.rb +++ b/activesupport/test/core_ext/array_ext_test.rb @@ -1,6 +1,9 @@  require 'abstract_unit'  require 'active_support/core_ext/array'  require 'active_support/core_ext/big_decimal' +require 'active_support/core_ext/object/conversions' + +require 'active_support/core_ext' # FIXME: pulling in all to_xml extensions  class ArrayExtAccessTests < Test::Unit::TestCase    def test_from diff --git a/activesupport/test/core_ext/blank_test.rb b/activesupport/test/core_ext/blank_test.rb index 00fea74639..1dbbf3ff30 100644 --- a/activesupport/test/core_ext/blank_test.rb +++ b/activesupport/test/core_ext/blank_test.rb @@ -1,4 +1,5 @@  require 'abstract_unit' +require 'active_support/core_ext/object/blank'  class EmptyTrue    def empty?() true; end diff --git a/activesupport/test/core_ext/class/attribute_accessor_test.rb b/activesupport/test/core_ext/class/attribute_accessor_test.rb index 85d0dd89e2..2214ba9894 100644 --- a/activesupport/test/core_ext/class/attribute_accessor_test.rb +++ b/activesupport/test/core_ext/class/attribute_accessor_test.rb @@ -1,4 +1,5 @@  require 'abstract_unit' +require 'active_support/core_ext/class/attribute_accessors'  class ClassAttributeAccessorTest < Test::Unit::TestCase    def setup diff --git a/activesupport/test/core_ext/class/class_inheritable_attributes_test.rb b/activesupport/test/core_ext/class/class_inheritable_attributes_test.rb index 7f859772e7..eeda468d9c 100644 --- a/activesupport/test/core_ext/class/class_inheritable_attributes_test.rb +++ b/activesupport/test/core_ext/class/class_inheritable_attributes_test.rb @@ -1,4 +1,5 @@  require 'abstract_unit' +require 'active_support/core_ext/class/inheritable_attributes'  class ClassInheritableAttributesTest < Test::Unit::TestCase    def setup diff --git a/activesupport/test/core_ext/date_time_ext_test.rb b/activesupport/test/core_ext/date_time_ext_test.rb index 45eb52c720..a7b179b2be 100644 --- a/activesupport/test/core_ext/date_time_ext_test.rb +++ b/activesupport/test/core_ext/date_time_ext_test.rb @@ -1,4 +1,5 @@  require 'abstract_unit' +require 'active_support/core_ext/date_time'  class DateTimeExtCalculationsTest < Test::Unit::TestCase    def test_to_s diff --git a/activesupport/test/core_ext/duplicable_test.rb b/activesupport/test/core_ext/duplicable_test.rb index 8b6127f31e..6e1f876959 100644 --- a/activesupport/test/core_ext/duplicable_test.rb +++ b/activesupport/test/core_ext/duplicable_test.rb @@ -1,4 +1,6 @@  require 'abstract_unit' +require 'bigdecimal' +require 'active_support/core_ext/object/duplicable'  class DuplicableTest < Test::Unit::TestCase    NO  = [nil, false, true, :symbol, 1, 2.3, BigDecimal.new('4.56'), Class.new] diff --git a/activesupport/test/core_ext/duration_test.rb b/activesupport/test/core_ext/duration_test.rb index d4a4627e3e..ea6979bc6b 100644 --- a/activesupport/test/core_ext/duration_test.rb +++ b/activesupport/test/core_ext/duration_test.rb @@ -1,4 +1,5 @@  require 'abstract_unit' +require 'active_support/core/time'  class DurationTest < ActiveSupport::TestCase    def test_inspect diff --git a/activesupport/test/core_ext/exception_test.rb b/activesupport/test/core_ext/exception_test.rb index dabd8c7c06..e63842c0bd 100644 --- a/activesupport/test/core_ext/exception_test.rb +++ b/activesupport/test/core_ext/exception_test.rb @@ -1,4 +1,5 @@  require 'abstract_unit' +require 'active_support/core_ext/exception'  class ExceptionExtTests < Test::Unit::TestCase diff --git a/activesupport/test/core_ext/hash_ext_test.rb b/activesupport/test/core_ext/hash_ext_test.rb index bbb1c631f9..d65a5323bf 100644 --- a/activesupport/test/core_ext/hash_ext_test.rb +++ b/activesupport/test/core_ext/hash_ext_test.rb @@ -1,5 +1,7 @@  require 'abstract_unit'  require 'active_support/core_ext/hash' +require 'bigdecimal' +require 'active_support/core_ext/string/access'  class HashExtTest < Test::Unit::TestCase    def setup diff --git a/activesupport/test/core_ext/module/attr_accessor_with_default_test.rb b/activesupport/test/core_ext/module/attr_accessor_with_default_test.rb index 7c59348af9..7c0d0bb242 100644 --- a/activesupport/test/core_ext/module/attr_accessor_with_default_test.rb +++ b/activesupport/test/core_ext/module/attr_accessor_with_default_test.rb @@ -1,4 +1,5 @@  require 'abstract_unit' +require 'active_support/core_ext/module/attr_accessor_with_default'  class AttrAccessorWithDefaultTest < Test::Unit::TestCase    def setup diff --git a/activesupport/test/core_ext/module/attr_internal_test.rb b/activesupport/test/core_ext/module/attr_internal_test.rb index 52833019e7..93578c9610 100644 --- a/activesupport/test/core_ext/module/attr_internal_test.rb +++ b/activesupport/test/core_ext/module/attr_internal_test.rb @@ -1,4 +1,5 @@  require 'abstract_unit' +require 'active_support/core_ext/module/attr_internal'  class AttrInternalTest < Test::Unit::TestCase    def setup @@ -37,8 +38,8 @@ class AttrInternalTest < Test::Unit::TestCase    end    def test_naming_format -    assert_equal '@_%s', @target.attr_internal_naming_format -    assert_nothing_raised { @target.attr_internal_naming_format = '@abc%sdef' } +    assert_equal '@_%s', Module.attr_internal_naming_format +    assert_nothing_raised { Module.attr_internal_naming_format = '@abc%sdef' }      @target.attr_internal :foo      assert !@instance.instance_variable_defined?('@_foo') @@ -47,6 +48,6 @@ class AttrInternalTest < Test::Unit::TestCase      assert !@instance.instance_variable_defined?('@_foo')      assert @instance.instance_variable_defined?('@abcfoodef')    ensure -    @target.attr_internal_naming_format = '@_%s' +    Module.attr_internal_naming_format = '@_%s'    end  end diff --git a/activesupport/test/core_ext/module/attribute_accessor_test.rb b/activesupport/test/core_ext/module/attribute_accessor_test.rb index 96975085cf..bd9461e62c 100644 --- a/activesupport/test/core_ext/module/attribute_accessor_test.rb +++ b/activesupport/test/core_ext/module/attribute_accessor_test.rb @@ -1,4 +1,5 @@  require 'abstract_unit' +require 'active_support/core_ext/module/attribute_accessors'  class ModuleAttributeAccessorTest < Test::Unit::TestCase    def setup diff --git a/activesupport/test/core_ext/module/model_naming_test.rb b/activesupport/test/core_ext/module/model_naming_test.rb index d08349dd97..da3b6c4932 100644 --- a/activesupport/test/core_ext/module/model_naming_test.rb +++ b/activesupport/test/core_ext/module/model_naming_test.rb @@ -1,4 +1,5 @@  require 'abstract_unit' +require 'active_support/core_ext/module/model_naming'  class ModelNamingTest < Test::Unit::TestCase    def setup diff --git a/activesupport/test/core_ext/name_error_test.rb b/activesupport/test/core_ext/name_error_test.rb index bae004809f..10913e2ade 100644 --- a/activesupport/test/core_ext/name_error_test.rb +++ b/activesupport/test/core_ext/name_error_test.rb @@ -1,4 +1,5 @@  require 'abstract_unit' +require 'active_support/core_ext/name_error'  class NameErrorTest < Test::Unit::TestCase    def test_name_error_should_set_missing_name diff --git a/activesupport/test/core_ext/numeric_ext_test.rb b/activesupport/test/core_ext/numeric_ext_test.rb index 9cca4d3aaf..74b086fa9c 100644 --- a/activesupport/test/core_ext/numeric_ext_test.rb +++ b/activesupport/test/core_ext/numeric_ext_test.rb @@ -1,6 +1,7 @@  require 'abstract_unit' - -require 'active_support/core_ext/numeric/bytes' +require 'active_support/core_ext/numeric' +require 'active_support/core_ext/integer' +require 'active_support/core/time'  class NumericExtTimeAndDateTimeTest < Test::Unit::TestCase    def setup diff --git a/activesupport/test/core_ext/object_and_class_ext_test.rb b/activesupport/test/core_ext/object_and_class_ext_test.rb index c919698c0f..8869b053e6 100644 --- a/activesupport/test/core_ext/object_and_class_ext_test.rb +++ b/activesupport/test/core_ext/object_and_class_ext_test.rb @@ -1,5 +1,7 @@  require 'abstract_unit'  require 'active_support/core_ext/object' +require 'active_support/core_ext/class/removal' +require 'active_support/core/time'  class ClassA; end  class ClassB < ClassA; end diff --git a/activesupport/test/core_ext/proc_test.rb b/activesupport/test/core_ext/proc_test.rb index 29f85371de..dc7b2c957d 100644 --- a/activesupport/test/core_ext/proc_test.rb +++ b/activesupport/test/core_ext/proc_test.rb @@ -1,4 +1,5 @@  require 'abstract_unit' +require 'active_support/core_ext/proc'  class ProcTests < Test::Unit::TestCase    def test_bind_returns_method_with_changed_self diff --git a/activesupport/test/core_ext/range_ext_test.rb b/activesupport/test/core_ext/range_ext_test.rb index 76e05e9954..2565c56b8a 100644 --- a/activesupport/test/core_ext/range_ext_test.rb +++ b/activesupport/test/core_ext/range_ext_test.rb @@ -1,5 +1,6 @@  require 'abstract_unit'  require 'active_support/core_ext/range' +require 'active_support/core_ext/date/conversions'  class RangeTest < Test::Unit::TestCase    def test_to_s_from_dates diff --git a/activesupport/test/core_ext/string_ext_test.rb b/activesupport/test/core_ext/string_ext_test.rb index a357ba5852..237a843f9a 100644 --- a/activesupport/test/core_ext/string_ext_test.rb +++ b/activesupport/test/core_ext/string_ext_test.rb @@ -4,6 +4,7 @@ require 'abstract_unit'  require 'inflector_test_cases'  require 'active_support/core_ext/string' +require 'active_support/core_ext/time'  class StringInflectionsTest < Test::Unit::TestCase    include InflectorTestCases diff --git a/activesupport/test/core_ext/time_ext_test.rb b/activesupport/test/core_ext/time_ext_test.rb index 8ee4904036..3bf7b789ce 100644 --- a/activesupport/test/core_ext/time_ext_test.rb +++ b/activesupport/test/core_ext/time_ext_test.rb @@ -1,4 +1,5 @@  require 'abstract_unit' +require 'active_support/core/time'  class TimeExtCalculationsTest < Test::Unit::TestCase    def test_seconds_since_midnight diff --git a/activesupport/test/core_ext/time_with_zone_test.rb b/activesupport/test/core_ext/time_with_zone_test.rb index 3dec4c95f4..0380c28c17 100644 --- a/activesupport/test/core_ext/time_with_zone_test.rb +++ b/activesupport/test/core_ext/time_with_zone_test.rb @@ -1,5 +1,6 @@  require 'abstract_unit'  require 'active_support/time_with_zone' +require 'active_support/json'  class TimeWithZoneTest < Test::Unit::TestCase @@ -56,12 +57,12 @@ class TimeWithZoneTest < Test::Unit::TestCase    end    def test_to_json -    assert_equal "\"1999/12/31 19:00:00 -0500\"", @twz.to_json +    assert_equal "\"1999/12/31 19:00:00 -0500\"", ActiveSupport::JSON.encode(@twz)    end    def test_to_json_with_use_standard_json_time_format_config_set_to_true      old, ActiveSupport.use_standard_json_time_format = ActiveSupport.use_standard_json_time_format, true -    assert_equal "\"1999-12-31T19:00:00-05:00\"", @twz.to_json +    assert_equal "\"1999-12-31T19:00:00-05:00\"", ActiveSupport::JSON.encode(@twz)    ensure      ActiveSupport.use_standard_json_time_format = old    end diff --git a/activesupport/test/dependencies_test.rb b/activesupport/test/dependencies_test.rb index 01c1d67f4c..99c53924c2 100644 --- a/activesupport/test/dependencies_test.rb +++ b/activesupport/test/dependencies_test.rb @@ -1,6 +1,8 @@  require 'abstract_unit'  require 'pp'  require 'active_support/dependencies' +require 'active_support/core_ext/module/loading' +require 'active_support/core_ext/kernel/reporting'  module ModuleWithMissing    mattr_accessor :missing_count diff --git a/activesupport/test/i18n_test.rb b/activesupport/test/i18n_test.rb index 7535f4ad7a..2a08abfb3e 100644 --- a/activesupport/test/i18n_test.rb +++ b/activesupport/test/i18n_test.rb @@ -1,4 +1,6 @@  require 'abstract_unit' +require 'active_support/core/time' +require 'active_support/core_ext/array/conversions'  class I18nTest < Test::Unit::TestCase    def setup diff --git a/activesupport/test/inflector_test.rb b/activesupport/test/inflector_test.rb index 6b9fbd3156..8c4d831a39 100644 --- a/activesupport/test/inflector_test.rb +++ b/activesupport/test/inflector_test.rb @@ -1,4 +1,6 @@  require 'abstract_unit' +require 'active_support/inflector' +  require 'inflector_test_cases'  module Ace diff --git a/activesupport/test/json/decoding_test.rb b/activesupport/test/json/decoding_test.rb index 9b4b207c88..7e1bfcca84 100644 --- a/activesupport/test/json/decoding_test.rb +++ b/activesupport/test/json/decoding_test.rb @@ -1,49 +1,75 @@  # encoding: UTF-8  require 'abstract_unit'  require 'active_support/json' +require 'active_support/core_ext/kernel/reporting'  class TestJSONDecoding < ActiveSupport::TestCase    TESTS = {      %q({"returnTo":{"\/categories":"\/"}})        => {"returnTo" => {"/categories" => "/"}}, -    %q({returnTo:{"\/categories":"\/"}})          => {"returnTo" => {"/categories" => "/"}},      %q({"return\\"To\\":":{"\/categories":"\/"}}) => {"return\"To\":" => {"/categories" => "/"}},      %q({"returnTo":{"\/categories":1}})          => {"returnTo" => {"/categories" => 1}},      %({"returnTo":[1,"a"]})                    => {"returnTo" => [1, "a"]},      %({"returnTo":[1,"\\"a\\",", "b"]})        => {"returnTo" => [1, "\"a\",", "b"]}, -    %({a: "'", "b": "5,000"})                  => {"a" => "'", "b" => "5,000"}, -    %({a: "a's, b's and c's", "b": "5,000"})   => {"a" => "a's, b's and c's", "b" => "5,000"}, +    %({"a": "'", "b": "5,000"})                  => {"a" => "'", "b" => "5,000"}, +    %({"a": "a's, b's and c's", "b": "5,000"})   => {"a" => "a's, b's and c's", "b" => "5,000"},      # multibyte      %({"matzue": "松江", "asakusa": "浅草"}) => {"matzue" => "松江", "asakusa" => "浅草"}, -    %({a: "2007-01-01"})                       => {'a' => Date.new(2007, 1, 1)},  -    %({a: "2007-01-01 01:12:34 Z"})            => {'a' => Time.utc(2007, 1, 1, 1, 12, 34)},  +    %({"a": "2007-01-01"})                       => {'a' => Date.new(2007, 1, 1)},  +    %({"a": "2007-01-01 01:12:34 Z"})            => {'a' => Time.utc(2007, 1, 1, 1, 12, 34)},       # no time zone -    %({a: "2007-01-01 01:12:34"})              => {'a' => "2007-01-01 01:12:34"},  +    %({"a": "2007-01-01 01:12:34"})              => {'a' => "2007-01-01 01:12:34"},       # needs to be *exact* -    %({a: " 2007-01-01 01:12:34 Z "})          => {'a' => " 2007-01-01 01:12:34 Z "}, -    %({a: "2007-01-01 : it's your birthday"})  => {'a' => "2007-01-01 : it's your birthday"}, +    %({"a": " 2007-01-01 01:12:34 Z "})          => {'a' => " 2007-01-01 01:12:34 Z "}, +    %({"a": "2007-01-01 : it's your birthday"})  => {'a' => "2007-01-01 : it's your birthday"},      %([])    => [],      %({})    => {}, -    %(1)     => 1, -    %("")    => "", -    %("\\"") => "\"", -    %(null)  => nil, -    %(true)  => true, -    %(false) => false, -    %q("http:\/\/test.host\/posts\/1") => "http://test.host/posts/1", -    %q("\u003cunicode\u0020escape\u003e") => "<unicode escape>", -    %q("\\\\u0020skip double backslashes") => "\\u0020skip double backslashes", -    %q({a: "\u003cbr /\u003e"}) => {'a' => "<br />"}, -    %q({b:["\u003ci\u003e","\u003cb\u003e","\u003cu\u003e"]}) => {'b' => ["<i>","<b>","<u>"]} +    %({"a":1})     => {"a" => 1}, +    %({"a": ""})    => {"a" => ""}, +    %({"a":"\\""}) => {"a" => "\""}, +    %({"a": null})  => {"a" => nil}, +    %({"a": true})  => {"a" => true}, +    %({"a": false}) => {"a" => false}, +    %q({"a": "http:\/\/test.host\/posts\/1"}) => {"a" => "http://test.host/posts/1"}, +    %q({"a": "\u003cunicode\u0020escape\u003e"}) => {"a" => "<unicode escape>"}, +    %q({"a": "\\\\u0020skip double backslashes"}) => {"a" => "\\u0020skip double backslashes"}, +    %q({"a": "\u003cbr /\u003e"}) => {'a' => "<br />"}, +    %q({"b":["\u003ci\u003e","\u003cb\u003e","\u003cu\u003e"]}) => {'b' => ["<i>","<b>","<u>"]}    } -   -  TESTS.each do |json, expected| -    test "json decodes #{json}" do -      assert_nothing_raised do -        assert_equal expected, ActiveSupport::JSON.decode(json) + +  backends = %w(Yaml) +  begin +    gem 'json', '>= 1.1' +    require 'json' +    backends << "JSONGem" +  rescue Gem::LoadError +    # Skip JSON gem tests +  end + +  backends.each do |backend| +    TESTS.each do |json, expected| +      test "json decodes #{json} with the #{backend} backend" do +        ActiveSupport.parse_json_times = true +        silence_warnings do +          ActiveSupport::JSON.with_backend backend do +            assert_nothing_raised do +              assert_equal expected, ActiveSupport::JSON.decode(json) +            end +          end +        end +      end +    end +  end + +  if backends.include?("JSONGem") +    test "json decodes time json with time parsing disabled" do +      ActiveSupport.parse_json_times = false +      expected = {"a" => "2007-01-01 01:12:34 Z"} +      ActiveSupport::JSON.with_backend "JSONGem" do +        assert_equal expected, ActiveSupport::JSON.decode(%({"a": "2007-01-01 01:12:34 Z"}))        end      end    end -   +    def test_failed_json_decoding      assert_raise(ActiveSupport::JSON::ParseError) { ActiveSupport::JSON.decode(%({: 1})) }    end diff --git a/activesupport/test/json/encoding_test.rb b/activesupport/test/json/encoding_test.rb index 9e6b4fa501..db24b3d96a 100644 --- a/activesupport/test/json/encoding_test.rb +++ b/activesupport/test/json/encoding_test.rb @@ -19,14 +19,14 @@ class TestJSONEncoding < Test::Unit::TestCase                     [ 'a "string" with quotes & an ampersand', %("a \\"string\\" with quotes \\u0026 an ampersand") ],                     [ 'http://test.host/posts/1', %("http://test.host/posts/1")]] -  ArrayTests    = [[ ['a', 'b', 'c'],          %([\"a\", \"b\", \"c\"])          ], -                   [ [1, 'a', :b, nil, false], %([1, \"a\", \"b\", null, false]) ]] +  ArrayTests    = [[ ['a', 'b', 'c'],          %([\"a\",\"b\",\"c\"])          ], +                   [ [1, 'a', :b, nil, false], %([1,\"a\",\"b\",null,false]) ]]    SymbolTests   = [[ :a,     %("a")    ],                     [ :this,  %("this") ],                     [ :"a b", %("a b")  ]] -  ObjectTests   = [[ Foo.new(1, 2), %({\"a\": 1, \"b\": 2}) ]] +  ObjectTests   = [[ Foo.new(1, 2), %({\"a\":1,\"b\":2}) ]]    VariableTests = [[ ActiveSupport::JSON::Variable.new('foo'), 'foo'],                     [ ActiveSupport::JSON::Variable.new('alert("foo")'), 'alert("foo")']] @@ -47,7 +47,7 @@ class TestJSONEncoding < Test::Unit::TestCase          ActiveSupport.escape_html_entities_in_json  = class_tests !~ /^Standard/          ActiveSupport.use_standard_json_time_format = class_tests =~ /^Standard/          self.class.const_get(class_tests).each do |pair| -          assert_equal pair.last, pair.first.to_json +          assert_equal pair.last, ActiveSupport::JSON.encode(pair.first)          end        ensure          ActiveSupport.escape_html_entities_in_json  = false @@ -57,45 +57,45 @@ class TestJSONEncoding < Test::Unit::TestCase    end    def test_hash_encoding -    assert_equal %({\"a\": \"b\"}), { :a => :b }.to_json -    assert_equal %({\"a\": 1}), { 'a' => 1  }.to_json -    assert_equal %({\"a\": [1, 2]}), { 'a' => [1,2] }.to_json -    assert_equal %({"1": 2}), { 1 => 2 }.to_json +    assert_equal %({\"a\":\"b\"}), ActiveSupport::JSON.encode(:a => :b) +    assert_equal %({\"a\":1}), ActiveSupport::JSON.encode('a' => 1) +    assert_equal %({\"a\":[1,2]}), ActiveSupport::JSON.encode('a' => [1,2]) +    assert_equal %({"1":2}), ActiveSupport::JSON.encode(1 => 2) -    sorted_json = '{' + {:a => :b, :c => :d}.to_json[1..-2].split(', ').sort.join(', ') + '}' -    assert_equal %({\"a\": \"b\", \"c\": \"d\"}), sorted_json +    sorted_json = '{' + ActiveSupport::JSON.encode(:a => :b, :c => :d)[1..-2].split(',').sort.join(',') + '}' +    assert_equal %({\"a\":\"b\",\"c\":\"d\"}), sorted_json    end    def test_utf8_string_encoded_properly_when_kcode_is_utf8      with_kcode 'UTF8' do -      assert_equal '"\\u20ac2.99"', '€2.99'.to_json -      assert_equal '"\\u270e\\u263a"', '✎☺'.to_json +      assert_equal '"\\u20ac2.99"', ActiveSupport::JSON.encode('€2.99') +      assert_equal '"\\u270e\\u263a"', ActiveSupport::JSON.encode('✎☺')      end    end    def test_exception_raised_when_encoding_circular_reference      a = [1]      a << a -    assert_raise(ActiveSupport::JSON::CircularReferenceError) { a.to_json } +    assert_raise(ActiveSupport::JSON::CircularReferenceError) { ActiveSupport::JSON.encode(a) }    end    def test_hash_key_identifiers_are_always_quoted      values = {0 => 0, 1 => 1, :_ => :_, "$" => "$", "a" => "a", :A => :A, :A0 => :A0, "A0B" => "A0B"} -    assert_equal %w( "$" "A" "A0" "A0B" "_" "a" "0" "1" ).sort, object_keys(values.to_json) +    assert_equal %w( "$" "A" "A0" "A0B" "_" "a" "0" "1" ).sort, object_keys(ActiveSupport::JSON.encode(values))    end    def test_hash_should_allow_key_filtering_with_only -    assert_equal %({"a": 1}), { 'a' => 1, :b => 2, :c => 3 }.to_json(:only => 'a') +    assert_equal %({"a":1}), ActiveSupport::JSON.encode({'a' => 1, :b => 2, :c => 3}, :only => 'a')    end    def test_hash_should_allow_key_filtering_with_except -    assert_equal %({"b": 2}), { 'foo' => 'bar', :b => 2, :c => 3 }.to_json(:except => ['foo', :c]) +    assert_equal %({"b":2}), ActiveSupport::JSON.encode({'foo' => 'bar', :b => 2, :c => 3}, :except => ['foo', :c])    end    def test_time_to_json_includes_local_offset      ActiveSupport.use_standard_json_time_format = true      with_env_tz 'US/Eastern' do -      assert_equal %("2005-02-01T15:15:10-05:00"), Time.local(2005,2,1,15,15,10).to_json +      assert_equal %("2005-02-01T15:15:10-05:00"), ActiveSupport::JSON.encode(Time.local(2005,2,1,15,15,10))      end    ensure      ActiveSupport.use_standard_json_time_format = false @@ -109,7 +109,7 @@ class TestJSONEncoding < Test::Unit::TestCase            :latitude => 123.234          }        } -      result = hash.to_json +      result = ActiveSupport::JSON.encode(hash)      end    end @@ -134,6 +134,6 @@ class JsonOptionsTests < Test::Unit::TestCase      ActiveSupport::JSON.expects(:encode).with(2, json_options)      ActiveSupport::JSON.expects(:encode).with('foo', json_options) -    [1, 2, 'foo'].to_json(json_options) +    [1, 2, 'foo'].rails_to_json(json_options)    end  end diff --git a/activesupport/test/new_callbacks_test.rb b/activesupport/test/new_callbacks_test.rb index 5cde078b65..abe7790ebf 100644 --- a/activesupport/test/new_callbacks_test.rb +++ b/activesupport/test/new_callbacks_test.rb @@ -19,11 +19,11 @@ module NewCallbacksTest      class << self        def callback_symbol(callback_method) -        returning(:"#{callback_method}_method") do |method_name| -          define_method(method_name) do -            history << [callback_method, :symbol] -          end +        method_name = :"#{callback_method}_method" +        define_method(method_name) do +          history << [callback_method, :symbol]          end +        method_name        end        def callback_string(callback_method) @@ -381,4 +381,4 @@ module NewCallbacksTest        assert_equal ["first", "second", "third", "second", "first"], terminator.history      end    end -end
\ No newline at end of file +end diff --git a/activesupport/test/test_test.rb b/activesupport/test/test_test.rb index d250b10822..40d3d612e7 100644 --- a/activesupport/test/test_test.rb +++ b/activesupport/test/test_test.rb @@ -1,4 +1,5 @@  require 'abstract_unit' +require 'active_support/core_ext/kernel/reporting'  class AssertDifferenceTest < ActiveSupport::TestCase    def setup diff --git a/activesupport/test/time_zone_test.rb b/activesupport/test/time_zone_test.rb index 7e8047566e..87d6ccc30d 100644 --- a/activesupport/test/time_zone_test.rb +++ b/activesupport/test/time_zone_test.rb @@ -1,4 +1,5 @@  require 'abstract_unit' +require 'active_support/core/time'  class TimeZoneTest < Test::Unit::TestCase    def test_utc_to_local diff --git a/activesupport/test/xml_mini/nokogiri_engine_test.rb b/activesupport/test/xml_mini/nokogiri_engine_test.rb index e5174a0b57..886a9d1aba 100644 --- a/activesupport/test/xml_mini/nokogiri_engine_test.rb +++ b/activesupport/test/xml_mini/nokogiri_engine_test.rb @@ -1,5 +1,6 @@  require 'abstract_unit'  require 'active_support/xml_mini' +require 'active_support/core_ext/hash/conversions'  begin    gem 'nokogiri', '>= 1.1.1' diff --git a/railties/test/gem_dependency_test.rb b/railties/test/gem_dependency_test.rb index 189ad02b76..d9cd5148a3 100644 --- a/railties/test/gem_dependency_test.rb +++ b/railties/test/gem_dependency_test.rb @@ -18,7 +18,7 @@ class GemDependencyTest < Test::Unit::TestCase    def test_configuration_adds_gem_dependency      config = Rails::Configuration.new      config.gem "xaws-s3x", :lib => "aws/s3", :version => "0.4.0" -    assert_equal [["install", "xaws-s3x", "--version", '"= 0.4.0"']], config.gems.collect(&:install_command) +    assert_equal [["install", "xaws-s3x", "--version", '"= 0.4.0"']], config.gems.collect { |g| g.install_command }    end    def test_gem_creates_install_command diff --git a/railties/test/plugin_locator_test.rb b/railties/test/plugin_locator_test.rb index 471d9fc7c3..855ac7d82f 100644 --- a/railties/test/plugin_locator_test.rb +++ b/railties/test/plugin_locator_test.rb @@ -42,15 +42,15 @@ class PluginFileSystemLocatorTest < Test::Unit::TestCase    end    def test_should_return_all_plugins_found_under_the_set_plugin_paths -    assert_equal ["a", "acts_as_chunky_bacon", "engine", "gemlike", "plugin_with_no_lib_dir", "stubby"].sort, @locator.plugins.map(&:name).sort +    assert_equal ["a", "acts_as_chunky_bacon", "engine", "gemlike", "plugin_with_no_lib_dir", "stubby"].sort, @locator.plugins.map { |p| p.name }.sort    end    def test_should_find_plugins_only_under_the_plugin_paths_set_in_configuration      @configuration.plugin_paths = [File.join(plugin_fixture_root_path, "default")] -    assert_equal ["acts_as_chunky_bacon", "gemlike", "plugin_with_no_lib_dir", "stubby"].sort, @locator.plugins.map(&:name).sort +    assert_equal ["acts_as_chunky_bacon", "gemlike", "plugin_with_no_lib_dir", "stubby"].sort, @locator.plugins.map { |p| p.name }.sort      @configuration.plugin_paths = [File.join(plugin_fixture_root_path, "alternate")] -    assert_equal ["a"], @locator.plugins.map(&:name) +    assert_equal ["a"], @locator.plugins.map { |p| p.name }    end    def test_should_not_raise_any_error_and_return_no_plugins_if_the_plugin_path_value_does_not_exist diff --git a/railties/test/plugin_test_helper.rb b/railties/test/plugin_test_helper.rb index f8c094d19f..93d50dc07f 100644 --- a/railties/test/plugin_test_helper.rb +++ b/railties/test/plugin_test_helper.rb @@ -24,6 +24,6 @@ class Test::Unit::TestCase      end      def assert_plugins(list_of_names, array_of_plugins, message=nil) -      assert_equal list_of_names.map(&:to_s), array_of_plugins.map(&:name), message +      assert_equal list_of_names.map { |n| n.to_s }, array_of_plugins.map { |p| p.name }, message      end     -end
\ No newline at end of file +end  | 
