Skip to content

Commit

Permalink
Improve routes task code and print the application as :to => RackApp. [
Browse files Browse the repository at this point in the history
…#5338 state:resolved]
  • Loading branch information
josevalim committed Aug 15, 2010
1 parent 99f3997 commit ada8c66
Showing 1 changed file with 24 additions and 12 deletions.
36 changes: 24 additions & 12 deletions railties/lib/rails/tasks/routes.rake
@@ -1,23 +1,35 @@
desc 'Print out all defined routes in match order, with names. Target specific controller with CONTROLLER=x.'
task :routes => :environment do
Rails.application.reload_routes!
all_routes = ENV['CONTROLLER'] ? Rails.application.routes.routes.select { |route| route.defaults[:controller] == ENV['CONTROLLER'] } : Rails.application.routes.routes

all_routes = Rails.application.routes.routes
named_routes = Rails.application.routes.named_routes.routes

if ENV['CONTROLLER']
all_routes = all_routes.select{ |route| route.defaults[:controller] == ENV['CONTROLLER'] }
end

routes = all_routes.collect do |route|
# TODO: The :index method is deprecated in 1.9 in favor of :key
# but we don't have :key in 1.8.7. We can remove this check when
# stop supporting 1.8.x
key_method = Hash.method_defined?('key') ? 'key' : 'index'
name = Rails.application.routes.named_routes.routes.send(key_method, route).to_s
reqs = route.requirements.empty? ? "" : route.requirements.inspect
app = route.app.to_s =~ /ActionDispatch.*/ ? "" : route.app.to_s
{:name => name, :verb => route.verb.to_s, :path => route.path, :reqs => reqs, :app => app}
key = Hash.method_defined?('key') ? 'key' : 'index'
name = named_routes.send(key, route).to_s

reqs = route.requirements.dup
reqs[:to] = route.app unless route.app.is_a?(ActionDispatch::Routing::RouteSet::Dispatcher)
reqs = reqs.empty? ? "" : reqs.inspect

{:name => name, :verb => route.verb.to_s, :path => route.path, :reqs => reqs}
end
routes.reject!{ |r| r[:path] == "/rails/info/properties" } # skip the route if it's internal info route
name_width = routes.collect {|r| r[:name]}.collect {|n| n.length}.max
verb_width = routes.collect {|r| r[:verb]}.collect {|v| v.length}.max
path_width = routes.collect {|r| r[:path]}.collect {|s| s.length}.max
app_width = routes.collect {|r| r[:app]}.collect {|a| a.length}.max

routes.reject! { |r| r[:path] == "/rails/info/properties" } # Skip the route if it's internal info route

name_width = routes.map{ |r| r[:name] }.map(&:length).max
verb_width = routes.map{ |r| r[:verb] }.map(&:length).max
path_width = routes.map{ |r| r[:path] }.map(&:length).max

routes.each do |r|
puts "#{r[:name].rjust(name_width)} #{r[:verb].ljust(verb_width)} #{r[:path].ljust(path_width)} #{r[:reqs]} #{(r[:app].length > 0 ? '=> ' + r[:app] : '').ljust(app_width)}"
puts "#{r[:name].rjust(name_width)} #{r[:verb].ljust(verb_width)} #{r[:path].ljust(path_width)} #{r[:reqs]}"
end
end

1 comment on commit ada8c66

@amerine
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Brilliant simplification of the code. It seems so obvious after you see it this way. Good job.

Please sign in to comment.