From c6d928f3cae28e3b531d3cc4bcde2ddca0323f11 Mon Sep 17 00:00:00 2001
From: Benoit Tigeot <benoit@hopsandfork.com>
Date: Sun, 25 Feb 2018 18:25:55 +0100
Subject: Add --expanded option to "rails routes"

When using rails routes with small terminal or complicated routes it can be
very difficult to understand where is the element listed in header. psql
had the same issue, that's why they created "expanded mode" you can
switch using `\x` or by starting psql with
```
-x
--expanded

    Turn on the expanded table formatting mode. This is equivalent to the \x command.
```
The output is similar to one implemented here for rails routes:

db_user-# \du
List of roles
-[ RECORD 1 ]----------------------------------------------
Role name  | super
Attributes | Superuser, Create role, Create DB
Member of  | {}
-[ RECORD 2 ]----------------------------------------------
Role name  | role
Attributes | Superuser, Create role, Create DB, Replication
Member of  | {}
---
 railties/CHANGELOG.md                              | 19 +++++++++
 .../lib/rails/commands/routes/routes_command.rb    |  8 +++-
 railties/test/application/rake_test.rb             | 40 ------------------
 railties/test/commands/routes_test.rb              | 47 ++++++++++++++++++++++
 4 files changed, 73 insertions(+), 41 deletions(-)

(limited to 'railties')

diff --git a/railties/CHANGELOG.md b/railties/CHANGELOG.md
index 51f6e1f0ac..a38888afe5 100644
--- a/railties/CHANGELOG.md
+++ b/railties/CHANGELOG.md
@@ -1,5 +1,24 @@
 ## Rails 6.0.0.alpha (Unreleased) ##
 
+*   Add "rails routes --expanded" option to output routes in expanded mode like
+    "psql --expanded". Result looks like:
+
+    ```
+    $ rails routes --expanded
+    --[ Route 1 ]------------------------------------------------------------
+    Prefix            | high_scores
+    Verb              | GET
+    URI               | /high_scores(.:format)
+    Controller#Action | high_scores#index
+    --[ Route 2 ]------------------------------------------------------------
+    Prefix            | new_high_score
+    Verb              | GET
+    URI               | /high_scores/new(.:format)
+    Controller#Action | high_scores#new
+    ```
+
+    *Benoit Tigeot*
+
 *   Rails 6 requires Ruby 2.4.1 or newer.
 
     *Jeremy Daer*
diff --git a/railties/lib/rails/commands/routes/routes_command.rb b/railties/lib/rails/commands/routes/routes_command.rb
index c4fd6c7eb5..c4f3717095 100644
--- a/railties/lib/rails/commands/routes/routes_command.rb
+++ b/railties/lib/rails/commands/routes/routes_command.rb
@@ -7,12 +7,14 @@ module Rails
     class RoutesCommand < Base # :nodoc:
       class_option :controller, aliases: "-c", type: :string, desc: "Specifies the controller."
       class_option :grep_pattern, aliases: "-g", type: :string, desc: "Specifies grep pattern."
+      class_option :expanded_format, aliases: "--expanded", type: :string, desc: "Turn on expanded format mode."
 
       no_commands do
         def help
           say "Usage: Print out all defined routes in match order, with names."
           say ""
           say "Target specific controller with -c option, or grep routes using -g option"
+          say "Use expanded format with --expanded option"
           say ""
         end
       end
@@ -24,7 +26,11 @@ module Rails
         all_routes = Rails.application.routes.routes
         inspector = ActionDispatch::Routing::RoutesInspector.new(all_routes)
 
-        say inspector.format(ActionDispatch::Routing::ConsoleFormatter.new, routes_filter)
+        if options.has_key?("expanded_format")
+          say inspector.format(ActionDispatch::Routing::ConsoleFormatter::Expanded.new, routes_filter)
+        else
+          say inspector.format(ActionDispatch::Routing::ConsoleFormatter::Sheet.new, routes_filter)
+        end
       end
 
       private
diff --git a/railties/test/application/rake_test.rb b/railties/test/application/rake_test.rb
index f7d301e125..9683230d07 100644
--- a/railties/test/application/rake_test.rb
+++ b/railties/test/application/rake_test.rb
@@ -122,46 +122,6 @@ module ApplicationTests
         rails("stats")
     end
 
-    def test_rails_routes_calls_the_route_inspector
-      app_file "config/routes.rb", <<-RUBY
-        Rails.application.routes.draw do
-          get '/cart', to: 'cart#show'
-        end
-      RUBY
-
-      output = rails("routes")
-      assert_equal <<~MESSAGE, output
-                              Prefix Verb URI Pattern                                                                       Controller#Action
-                                cart GET  /cart(.:format)                                                                   cart#show
-                  rails_service_blob GET  /rails/active_storage/blobs/:signed_id/*filename(.:format)                        active_storage/blobs#show
-                rails_blob_variation GET  /rails/active_storage/variants/:signed_blob_id/:variation_key/*filename(.:format) active_storage/variants#show
-                  rails_blob_preview GET  /rails/active_storage/previews/:signed_blob_id/:variation_key/*filename(.:format) active_storage/previews#show
-                  rails_disk_service GET  /rails/active_storage/disk/:encoded_key/*filename(.:format)                       active_storage/disk#show
-           update_rails_disk_service PUT  /rails/active_storage/disk/:encoded_token(.:format)                               active_storage/disk#update
-                rails_direct_uploads POST /rails/active_storage/direct_uploads(.:format)                                    active_storage/direct_uploads#create
-      MESSAGE
-    end
-
-    def test_singular_resource_output_in_rake_routes
-      app_file "config/routes.rb", <<-RUBY
-        Rails.application.routes.draw do
-          resource :post
-        end
-      RUBY
-
-      expected_output = ["   Prefix Verb   URI Pattern          Controller#Action",
-                         " new_post GET    /post/new(.:format)  posts#new",
-                         "edit_post GET    /post/edit(.:format) posts#edit",
-                         "     post GET    /post(.:format)      posts#show",
-                         "          PATCH  /post(.:format)      posts#update",
-                         "          PUT    /post(.:format)      posts#update",
-                         "          DELETE /post(.:format)      posts#destroy",
-                         "          POST   /post(.:format)      posts#create\n"].join("\n")
-
-      output = rails("routes", "-c", "PostController")
-      assert_equal expected_output, output
-    end
-
     def test_logger_is_flushed_when_exiting_production_rake_tasks
       add_to_config <<-RUBY
         rake_tasks do
diff --git a/railties/test/commands/routes_test.rb b/railties/test/commands/routes_test.rb
index 030dcc7217..24af5de73a 100644
--- a/railties/test/commands/routes_test.rb
+++ b/railties/test/commands/routes_test.rb
@@ -119,6 +119,53 @@ class Rails::Command::RoutesTest < ActiveSupport::TestCase
     MESSAGE
   end
 
+  test "test rails routes with expanded option" do
+    app_file "config/routes.rb", <<-RUBY
+        Rails.application.routes.draw do
+          get '/cart', to: 'cart#show'
+        end
+    RUBY
+
+    output = rails("routes", "--expanded")
+    assert_equal <<~MESSAGE, output
+    --[ Route 1 ]------------------------------------------------------------
+    Prefix            | cart
+    Verb              | GET
+    URI               | /cart(.:format)
+    Controller#Action | cart#show
+    --[ Route 2 ]------------------------------------------------------------
+    Prefix            | rails_service_blob
+    Verb              | GET
+    URI               | /rails/active_storage/blobs/:signed_id/*filename(.:format)
+    Controller#Action | active_storage/blobs#show
+    --[ Route 3 ]------------------------------------------------------------
+    Prefix            | rails_blob_variation
+    Verb              | GET
+    URI               | /rails/active_storage/variants/:signed_blob_id/:variation_key/*filename(.:format)
+    Controller#Action | active_storage/variants#show
+    --[ Route 4 ]------------------------------------------------------------
+    Prefix            | rails_blob_preview
+    Verb              | GET
+    URI               | /rails/active_storage/previews/:signed_blob_id/:variation_key/*filename(.:format)
+    Controller#Action | active_storage/previews#show
+    --[ Route 5 ]------------------------------------------------------------
+    Prefix            | rails_disk_service
+    Verb              | GET
+    URI               | /rails/active_storage/disk/:encoded_key/*filename(.:format)
+    Controller#Action | active_storage/disk#show
+    --[ Route 6 ]------------------------------------------------------------
+    Prefix            | update_rails_disk_service
+    Verb              | PUT
+    URI               | /rails/active_storage/disk/:encoded_token(.:format)
+    Controller#Action | active_storage/disk#update
+    --[ Route 7 ]------------------------------------------------------------
+    Prefix            | rails_direct_uploads
+    Verb              | POST
+    URI               | /rails/active_storage/direct_uploads(.:format)
+    Controller#Action | active_storage/direct_uploads#create
+    MESSAGE
+  end
+
   private
 
     def run_routes_command(args = [])
-- 
cgit v1.2.3