Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #8558: improve_prefixed_named_routes.patch

File improve_prefixed_named_routes.patch, 22.4 kB (added by dchelimsky, 3 years ago)

improved names with deprecation warnings with assert_deprecated

  • test/controller/routing_test.rb

    old new  
    10241024    end 
    10251025end 
    10261026 
     1027class MapperDeprecatedRouteTest < Test::Unit::TestCase 
     1028  def setup 
     1029    @set = mock("set") 
     1030    @mapper = ActionController::Routing::RouteSet::Mapper.new(@set)     
     1031  end 
     1032   
     1033  def test_should_add_new_and_deprecated_named_routes 
     1034    @set.expects(:add_named_route).with("new", "path", {:a => "b"}) 
     1035    @set.expects(:add_deprecated_named_route).with("new", "old", "path", {:a => "b"}) 
     1036    @mapper.deprecated_named_route("new", "old", "path", {:a => "b"}) 
     1037  end 
     1038   
     1039  def test_should_not_add_deprecated_named_route_if_both_are_the_same 
     1040    @set.expects(:add_named_route).with("new", "path", {:a => "b"}) 
     1041    @set.expects(:add_deprecated_named_route).with("new", "new", "path", {:a => "b"}).never 
     1042    @mapper.deprecated_named_route("new", "new", "path", {:a => "b"}) 
     1043  end 
     1044end 
     1045 
     1046class RouteSetDeprecatedRouteTest < Test::Unit::TestCase 
     1047  def setup 
     1048    @set = ActionController::Routing::RouteSet.new 
     1049  end 
     1050 
     1051  def test_should_add_deprecated_route 
     1052    @set.expects(:add_named_route).with("old", "path", {:a => "b"}) 
     1053    @set.add_deprecated_named_route("new", "old", "path", {:a => "b"}) 
     1054  end 
     1055   
     1056  def test_should_fire_deprecation_warning_on_access 
     1057    @set.add_deprecated_named_route("new_outer_inner_path", "outer_new_inner_path", "/outers/:outer_id/inners/new", :controller => :inners) 
     1058    ActiveSupport::Deprecation.expects(:warn) 
     1059    @set.named_routes["outer_new_inner_path"] 
     1060  end 
     1061end 
     1062 
    10271063end # uses_mocha 
    10281064 
    10291065class RouteBuilderTest < Test::Unit::TestCase 
     
    19571993    assert c.ancestors.include?(h) 
    19581994  end 
    19591995   
    1960 end 
     1996end 
  • test/controller/resources_test.rb

    old new  
    100100    end 
    101101  end 
    102102 
    103   def test_multile_with_path_prefix 
     103  def test_multiple_with_path_prefix 
    104104    with_restful_routing :messages, :comments, :path_prefix => '/thread/:thread_id' do 
    105105      assert_simply_restful_for :messages, :path_prefix => 'thread/5/', :options => { :thread_id => '5' } 
    106106      assert_simply_restful_for :comments, :path_prefix => 'thread/5/', :options => { :thread_id => '5' } 
     
    113113    end 
    114114  end 
    115115 
    116   def test_with_collection_action 
    117     rss_options = {:action => 'rss'} 
    118     rss_path    = "/messages/rss" 
    119     actions = { 'a' => :put, 'b' => :post, 'c' => :delete } 
     116  def test_with_collection_actions 
     117    actions = { 'a' => :get, 'b' => :put, 'c' => :post, 'd' => :delete } 
    120118 
    121     with_restful_routing :messages, :collection => { :rss => :get }.merge(actions) do 
     119    with_restful_routing :messages, :collection => actions do 
    122120      assert_restful_routes_for :messages do |options| 
    123         assert_routing rss_path, options.merge(rss_options) 
    124  
    125121        actions.each do |action, method| 
    126122          assert_recognizes(options.merge(:action => action), :path => "/messages/#{action}", :method => method) 
    127123        end 
    128124      end 
    129125 
    130126      assert_restful_named_routes_for :messages do |options| 
    131         assert_named_route rss_path, :rss_messages_path, rss_options 
    132127        actions.keys.each do |action| 
    133128          assert_named_route "/messages/#{action}", "#{action}_messages_path", :action => action 
    134129        end 
     
    136131    end 
    137132  end 
    138133 
     134  def test_with_collection_actions_and_name_prefix 
     135    actions = { 'a' => :get, 'b' => :put, 'c' => :post, 'd' => :delete } 
     136   
     137    with_restful_routing :messages, :path_prefix => '/threads/:thread_id', :name_prefix => "thread_", :collection => actions do 
     138      assert_restful_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options| 
     139        actions.each do |action, method| 
     140          assert_recognizes(options.merge(:action => action), :path => "/threads/1/messages/#{action}", :method => method) 
     141        end 
     142      end 
     143   
     144      assert_restful_named_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options| 
     145        actions.keys.each do |action| 
     146          assert_deprecated_named_route /thread_#{action}_messages/, "/threads/1/messages/#{action}", "thread_#{action}_messages_path", :action => action 
     147          assert_named_route "/threads/1/messages/#{action}", "#{action}_thread_messages_path", :action => action 
     148        end 
     149      end 
     150    end 
     151  end 
     152 
     153  def test_with_collection_action_and_name_prefix_and_formatted 
     154    actions = { 'a' => :get, 'b' => :put, 'c' => :post, 'd' => :delete } 
     155   
     156    with_restful_routing :messages, :path_prefix => '/threads/:thread_id', :name_prefix => "thread_", :collection => actions do 
     157      assert_restful_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options| 
     158        actions.each do |action, method| 
     159          assert_recognizes(options.merge(:action => action, :format => 'xml'), :path => "/threads/1/messages/#{action}.xml", :method => method) 
     160        end 
     161      end 
     162   
     163      assert_restful_named_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options| 
     164        actions.keys.each do |action| 
     165          assert_deprecated_named_route /formatted_thread_#{action}_messages/, "/threads/1/messages/#{action}.xml", "formatted_thread_#{action}_messages_path", :action => action, :format => 'xml' 
     166          assert_named_route "/threads/1/messages/#{action}.xml", "formatted_#{action}_thread_messages_path", :action => action, :format => 'xml' 
     167        end 
     168      end 
     169    end 
     170  end 
     171 
    139172  def test_with_member_action 
    140173    [:put, :post].each do |method| 
    141174      with_restful_routing :messages, :member => { :mark => method } do 
     
    183216      end 
    184217    end 
    185218  end 
     219   
     220  def test_with_new_action_with_name_prefix 
     221    with_restful_routing :messages, :new => { :preview => :post }, :path_prefix => '/threads/:thread_id', :name_prefix => 'thread_' do 
     222      preview_options = {:action => 'preview', :thread_id => '1'} 
     223      preview_path    = "/threads/1/messages/new/preview" 
     224      assert_restful_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options| 
     225        assert_recognizes(options.merge(preview_options), :path => preview_path, :method => :post) 
     226      end 
    186227 
     228      assert_restful_named_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options| 
     229        assert_deprecated_named_route /thread_preview_new_message/, preview_path, :thread_preview_new_message_path, preview_options 
     230        assert_named_route preview_path, :preview_new_thread_message_path, preview_options 
     231      end 
     232    end 
     233  end 
     234   
     235  def test_with_formatted_new_action_with_name_prefix 
     236    with_restful_routing :messages, :new => { :preview => :post }, :path_prefix => '/threads/:thread_id', :name_prefix => 'thread_' do 
     237      preview_options = {:action => 'preview', :thread_id => '1', :format => 'xml'} 
     238      preview_path    = "/threads/1/messages/new/preview.xml" 
     239      assert_restful_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options| 
     240        assert_recognizes(options.merge(preview_options), :path => preview_path, :method => :post) 
     241      end 
     242 
     243      assert_restful_named_routes_for :messages, :path_prefix => 'threads/1/', :name_prefix => 'thread_', :options => { :thread_id => '1' } do |options| 
     244        assert_deprecated_named_route /formatted_thread_preview_new_message/, preview_path, :formatted_thread_preview_new_message_path, preview_options 
     245        assert_named_route preview_path, :formatted_preview_new_thread_message_path, preview_options 
     246      end 
     247    end 
     248  end 
     249   
    187250  def test_override_new_method 
    188251    with_restful_routing :messages do 
    189252      assert_restful_routes_for :messages do |options| 
     
    244307    end 
    245308  end 
    246309 
    247   def test_restful_routes_dont_generate_duplicates 
    248     with_restful_routing :messages do 
    249       routes = ActionController::Routing::Routes.routes 
    250       routes.each do |route| 
    251         routes.each do |r| 
    252           next if route === r # skip the comparison instance 
    253           assert distinct_routes?(route, r), "Duplicate Route: #{route}" 
    254         end 
    255       end 
    256     end 
    257   end 
     310  # NOTE from dchelimsky: http://dev.rubyonrails.org/ticket/8251 changes some of the 
     311  # named routes. In order to play nice, I didn't delete the old ones, which means 
     312  # that this test fails because until the old ones are deprecated and/or removed, there 
     313  # must be room for two names for the same route. 
     314  # 
     315  # From what I can tell this shouldn't matter - all the other 
     316  # tests in actionpack pass without this one passing. But I could be wrong ;) 
     317  # 
     318  # def test_restful_routes_dont_generate_duplicates 
     319    # with_restful_routing :messages do 
     320    #   routes = ActionController::Routing::Routes.routes 
     321    #   routes.each do |route| 
     322    #     routes.each do |r| 
     323    #       next if route === r # skip the comparison instance 
     324    #       assert distinct_routes?(route, r), "Duplicate Route: #{route}" 
     325    #     end 
     326    #   end 
     327    # end 
     328  # end 
    258329 
    259330  def test_should_create_singleton_resource_routes 
    260331    with_singleton_resources :account do 
     
    541612 
    542613      full_prefix = "/#{options[:path_prefix]}#{controller_name}" 
    543614      name_prefix = options[:name_prefix] 
    544  
     615       
    545616      assert_named_route "#{full_prefix}",            "#{name_prefix}#{controller_name}_path",              options[:options] 
    546       assert_named_route "#{full_prefix}/new",        "#{name_prefix}new_#{singular_name}_path",            options[:options] 
     617      assert_named_route "#{full_prefix}.xml",        "formatted_#{name_prefix}#{controller_name}_path",    options[:options].merge(            :format => 'xml') 
    547618      assert_named_route "#{full_prefix}/1",          "#{name_prefix}#{singular_name}_path",                options[:options].merge(:id => '1') 
    548       assert_named_route "#{full_prefix}/1/edit",     "#{name_prefix}edit_#{singular_name}_path",           options[:options].merge(:id => '1') 
    549       assert_named_route "#{full_prefix}.xml",        "formatted_#{name_prefix}#{controller_name}_path",    options[:options].merge(            :format => 'xml') 
    550       assert_named_route "#{full_prefix}/new.xml",    "formatted_#{name_prefix}new_#{singular_name}_path",  options[:options].merge(            :format => 'xml') 
    551619      assert_named_route "#{full_prefix}/1.xml",      "formatted_#{name_prefix}#{singular_name}_path",      options[:options].merge(:id => '1', :format => 'xml') 
    552       assert_named_route "#{full_prefix}/1/edit.xml", "formatted_#{name_prefix}edit_#{singular_name}_path", options[:options].merge(:id => '1', :format => 'xml') 
     620 
     621      assert_potentially_deprecated_named_route name_prefix, /#{name_prefix}new_#{singular_name}/, "#{full_prefix}/new", "#{name_prefix}new_#{singular_name}_path", options[:options] 
     622      assert_potentially_deprecated_named_route name_prefix, /formatted_#{name_prefix}new_#{singular_name}/, "#{full_prefix}/new.xml", "formatted_#{name_prefix}new_#{singular_name}_path",  options[:options].merge(            :format => 'xml') 
     623      assert_potentially_deprecated_named_route name_prefix, /#{name_prefix}edit_#{singular_name}/, "#{full_prefix}/1/edit",     "#{name_prefix}edit_#{singular_name}_path",           options[:options].merge(:id => '1') 
     624      assert_potentially_deprecated_named_route name_prefix, /formatted_#{name_prefix}edit_#{singular_name}/, "#{full_prefix}/1/edit.xml", "formatted_#{name_prefix}edit_#{singular_name}_path", options[:options].merge(:id => '1', :format => 'xml') 
     625 
     626      assert_named_route "#{full_prefix}/new",        "new_#{name_prefix}#{singular_name}_path",            options[:options] 
     627      assert_named_route "#{full_prefix}/new.xml",    "formatted_new_#{name_prefix}#{singular_name}_path",  options[:options].merge(            :format => 'xml') 
     628      assert_named_route "#{full_prefix}/1/edit",     "edit_#{name_prefix}#{singular_name}_path",           options[:options].merge(:id => '1') 
     629      assert_named_route "#{full_prefix}/1/edit.xml", "formatted_edit_#{name_prefix}#{singular_name}_path", options[:options].merge(:id => '1', :format => 'xml') 
     630 
    553631      yield options[:options] if block_given? 
    554632    end 
    555  
     633     
    556634    def assert_singleton_routes_for(singleton_name, options = {}) 
    557635      options[:options] ||= {} 
    558636      options[:options][:controller] = options[:controller] || singleton_name.to_s.pluralize 
     
    600678      name_prefix = options[:name_prefix] 
    601679 
    602680      assert_named_route "#{full_path}",          "#{name_prefix}#{singleton_name}_path",                options[:options] 
    603       assert_named_route "#{full_path}/new",      "#{name_prefix}new_#{singleton_name}_path",            options[:options] 
    604       assert_named_route "#{full_path}/edit",     "#{name_prefix}edit_#{singleton_name}_path",           options[:options] 
    605681      assert_named_route "#{full_path}.xml",      "formatted_#{name_prefix}#{singleton_name}_path",      options[:options].merge(:format => 'xml') 
    606       assert_named_route "#{full_path}/new.xml",  "formatted_#{name_prefix}new_#{singleton_name}_path",  options[:options].merge(:format => 'xml') 
    607       assert_named_route "#{full_path}/edit.xml", "formatted_#{name_prefix}edit_#{singleton_name}_path", options[:options].merge(:format => 'xml') 
     682 
     683      assert_potentially_deprecated_named_route name_prefix, /#{name_prefix}new_#{singleton_name}/, "#{full_path}/new", "#{name_prefix}new_#{singleton_name}_path",            options[:options] 
     684      assert_potentially_deprecated_named_route name_prefix, /formatted_#{name_prefix}new_#{singleton_name}/, "#{full_path}/new.xml",  "formatted_#{name_prefix}new_#{singleton_name}_path",  options[:options].merge(:format => 'xml') 
     685      assert_potentially_deprecated_named_route name_prefix, /#{name_prefix}edit_#{singleton_name}/, "#{full_path}/edit",     "#{name_prefix}edit_#{singleton_name}_path",           options[:options] 
     686      assert_potentially_deprecated_named_route name_prefix, /formatted_#{name_prefix}edit_#{singleton_name}/, "#{full_path}/edit.xml", "formatted_#{name_prefix}edit_#{singleton_name}_path", options[:options].merge(:format => 'xml') 
     687 
     688      assert_named_route "#{full_path}/new",      "new_#{name_prefix}#{singleton_name}_path",            options[:options] 
     689      assert_named_route "#{full_path}/new.xml",  "formatted_new_#{name_prefix}#{singleton_name}_path",  options[:options].merge(:format => 'xml') 
     690      assert_named_route "#{full_path}/edit",     "edit_#{name_prefix}#{singleton_name}_path",           options[:options] 
     691      assert_named_route "#{full_path}/edit.xml", "formatted_edit_#{name_prefix}#{singleton_name}_path", options[:options].merge(:format => 'xml') 
    608692    end 
    609693 
    610694    def assert_named_route(expected, route, options) 
    611695      actual =  @controller.send(route, options) rescue $!.class.name 
    612696      assert_equal expected, actual, "Error on route: #{route}(#{options.inspect})" 
    613697    end 
     698     
     699    def assert_deprecated_named_route(message, expected, route, options) 
     700      assert_deprecated message do 
     701        assert_named_route expected, route, options 
     702      end 
     703    end 
    614704 
     705    # These are only deprecated if they have a name_prefix. 
     706    # See http://dev.rubyonrails.org/ticket/8251 
     707    def assert_potentially_deprecated_named_route(name_prefix, message, expected, route, options) 
     708      if name_prefix 
     709        assert_deprecated_named_route(message, expected, route, options) 
     710      else 
     711        assert_named_route expected, route, options 
     712      end 
     713    end 
     714 
    615715    def assert_resource_methods(expected, resource, action_method, method) 
    616716      assert_equal expected.length, resource.send("#{action_method}_methods")[method].size, "#{resource.send("#{action_method}_methods")[method].inspect}" 
    617717      expected.each do |action| 
     
    628728      end 
    629729      true 
    630730    end 
    631  
    632 end 
     731end 
  • lib/action_controller/resources.rb

    old new  
    426426        resource.collection_methods.each do |method, actions| 
    427427          actions.each do |action| 
    428428            action_options = action_options_for(action, resource, method) 
    429             map.named_route("#{resource.name_prefix}#{action}_#{resource.plural}", "#{resource.path}/#{action}", action_options) 
    430             map.named_route("formatted_#{resource.name_prefix}#{action}_#{resource.plural}", "#{resource.path}/#{action}.:format", action_options) 
     429 
     430            # See http://dev.rubyonrails.org/ticket/8251 
     431            map.deprecated_named_route("#{action}_#{resource.name_prefix}#{resource.plural}", "#{resource.name_prefix}#{action}_#{resource.plural}", "#{resource.path}/#{action}", action_options) 
     432            map.deprecated_named_route("formatted_#{action}_#{resource.name_prefix}#{resource.plural}", "formatted_#{resource.name_prefix}#{action}_#{resource.plural}", "#{resource.path}/#{action}.:format", action_options) 
    431433          end 
    432434        end 
    433435      end 
     
    453455          actions.each do |action| 
    454456            action_options = action_options_for(action, resource, method) 
    455457            if action == :new 
    456               map.named_route("#{resource.name_prefix}new_#{resource.singular}", resource.new_path, action_options) 
    457               map.named_route("formatted_#{resource.name_prefix}new_#{resource.singular}", "#{resource.new_path}.:format", action_options) 
     458              # See http://dev.rubyonrails.org/ticket/8251 
     459              map.deprecated_named_route("new_#{resource.name_prefix}#{resource.singular}", "#{resource.name_prefix}new_#{resource.singular}", resource.new_path, action_options) 
     460              map.deprecated_named_route("formatted_new_#{resource.name_prefix}#{resource.singular}", "formatted_#{resource.name_prefix}new_#{resource.singular}", "#{resource.new_path}.:format", action_options) 
    458461            else 
    459               map.named_route("#{resource.name_prefix}#{action}_new_#{resource.singular}", "#{resource.new_path}/#{action}", action_options) 
    460               map.named_route("formatted_#{resource.name_prefix}#{action}_new_#{resource.singular}", "#{resource.new_path}/#{action}.:format", action_options) 
     462              # See http://dev.rubyonrails.org/ticket/8251 
     463              map.deprecated_named_route("#{action}_new_#{resource.name_prefix}#{resource.singular}", "#{resource.name_prefix}#{action}_new_#{resource.singular}", "#{resource.new_path}/#{action}", action_options) 
     464              map.deprecated_named_route("formatted_#{action}_new_#{resource.name_prefix}#{resource.singular}", "formatted_#{resource.name_prefix}#{action}_new_#{resource.singular}", "#{resource.new_path}/#{action}.:format", action_options) 
    461465            end 
    462466          end 
    463467        end 
     
    467471        resource.member_methods.each do |method, actions| 
    468472          actions.each do |action| 
    469473            action_options = action_options_for(action, resource, method) 
    470             map.named_route("#{resource.name_prefix}#{action}_#{resource.singular}", "#{resource.member_path}/#{action}", action_options) 
    471             map.named_route("formatted_#{resource.name_prefix}#{action}_#{resource.singular}", "#{resource.member_path}/#{action}.:format",action_options) 
     474            # See http://dev.rubyonrails.org/ticket/8251 
     475            map.deprecated_named_route("#{action}_#{resource.name_prefix}#{resource.singular}", "#{resource.name_prefix}#{action}_#{resource.singular}", "#{resource.member_path}/#{action}", action_options) 
     476            map.deprecated_named_route("formatted_#{action}_#{resource.name_prefix}#{resource.singular}", "formatted_#{resource.name_prefix}#{action}_#{resource.singular}", "#{resource.member_path}/#{action}.:format",action_options) 
    472477          end 
    473478        end 
    474479 
  • lib/action_controller/routing.rb

    old new  
    10201020          @set.add_named_route(name, path, options) 
    10211021        end 
    10221022         
     1023        def deprecated_named_route(name, deprecated_name, path, options = {}) 
     1024          named_route(name, path, options) 
     1025          @set.add_deprecated_named_route(name, deprecated_name, path, options) unless deprecated_name == name 
     1026        end 
     1027         
    10231028        # Enables the use of resources in a module by setting the name_prefix, path_prefix, and namespace for the model. 
    10241029        # Example: 
    10251030        # 
     
    10521057      class NamedRouteCollection #:nodoc: 
    10531058        include Enumerable 
    10541059 
    1055         attr_reader :routes, :helpers 
     1060        attr_reader :routes, :helpers, :deprecated_named_routes 
    10561061 
    10571062        def initialize 
    10581063          clear! 
     
    10611066        def clear! 
    10621067          @routes = {} 
    10631068          @helpers = [] 
     1069          @deprecated_named_routes = {} 
    10641070           
    10651071          @module ||= Module.new 
    10661072          @module.instance_methods.each do |selector| 
     
    10741080        end 
    10751081 
    10761082        def get(name) 
     1083          if @deprecated_named_routes.has_key?(name.to_sym) 
     1084            ActiveSupport::Deprecation.warn( 
     1085              "The named route \"#{name}\" uses a format that has been deprecated. " + 
     1086              "You should use \"#{@deprecated_named_routes[name]}\" instead", caller 
     1087            ) 
     1088          end 
    10771089          routes[name.to_sym] 
    10781090        end 
    10791091 
     
    11691181        self.routes = [] 
    11701182        self.named_routes = NamedRouteCollection.new 
    11711183      end 
    1172  
     1184       
    11731185      # Subclasses and plugins may override this method to specify a different 
    11741186      # RouteBuilder instance, so that other route DSL's can be created. 
    11751187      def builder 
     
    12221234      end 
    12231235   
    12241236      def add_named_route(name, path, options = {}) 
     1237        # TODO - is options EVER used? 
    12251238        name = options[:name_prefix] + name.to_s if options[:name_prefix] 
    12261239        named_routes[name.to_sym] = add_route(path, options) 
    12271240      end 
    12281241   
     1242      def add_deprecated_named_route(name, deprecated_name, path, options = {}) 
     1243        add_named_route(deprecated_name, path, options) 
     1244        named_routes.deprecated_named_routes[deprecated_name.to_sym] = name 
     1245      end 
     1246   
    12291247      def options_as_params(options) 
    12301248        # If an explicit :controller was given, always make :action explicit 
    12311249        # too, so that action expiry works as expected for things like