diff --git a/railties/lib/rails/application/finisher.rb b/railties/lib/rails/application/finisher.rb index 61a7be9291..a968110bfb 100644 --- a/railties/lib/rails/application/finisher.rb +++ b/railties/lib/rails/application/finisher.rb @@ -143,6 +143,7 @@ def self.complete(_state) app.routes.prepend do get "/rails/info/properties" => "rails/info#properties", internal: true get "/rails/info/routes" => "rails/info#routes", internal: true + get "/rails/info/notes" => "rails/info#notes", internal: true get "/rails/info" => "rails/info#index", internal: true end diff --git a/railties/lib/rails/info_controller.rb b/railties/lib/rails/info_controller.rb index 8038795944..fec6a6d84a 100644 --- a/railties/lib/rails/info_controller.rb +++ b/railties/lib/rails/info_controller.rb @@ -32,6 +32,14 @@ def routes end end + def notes + @annotations = Rails::SourceAnnotationExtractor.new( + Rails::SourceAnnotationExtractor::Annotation.tags.join("|") + ).find( + Rails::SourceAnnotationExtractor::Annotation.directories + ) + end + private def matching_routes(query:, exact_match:) return [] if query.blank? diff --git a/railties/lib/rails/templates/rails/info/notes.html.erb b/railties/lib/rails/templates/rails/info/notes.html.erb new file mode 100644 index 0000000000..6393d1985e --- /dev/null +++ b/railties/lib/rails/templates/rails/info/notes.html.erb @@ -0,0 +1,65 @@ + + +

+ Notes +

+ + + + + + + + + + <% @annotations.each do |file, annotations| %> + <% annotations.each.with_index do |annotation, index| %> + + <% if index == 0 %> + + <% end %> + + + + + <% end %> + <% end %> + +
File NameLine No.TagDescription
+ <%= file %> + <%= annotation.line %><%= annotation.tag %><%= annotation.text %>
diff --git a/railties/test/rails_info_controller_test.rb b/railties/test/rails_info_controller_test.rb index f3547d3fc0..6ed61c1c19 100644 --- a/railties/test/rails_info_controller_test.rb +++ b/railties/test/rails_info_controller_test.rb @@ -19,6 +19,7 @@ def setup end get "/rails/info/properties" => "rails/info#properties" get "/rails/info/routes" => "rails/info#routes" + get "/rails/info/notes" => "rails/info#notes" post "/rails/:test/properties" => "rails/info#properties" put "/rails/:test/named_properties" => "rails/info#properties", as: "named_rails_info_properties" end @@ -118,10 +119,11 @@ def fuzzy_results assert exact_results.size == 0, "should not case-insensitive match HTTP Verb methods" get :routes, params: { query: "GET" } - assert exact_results.size == 3, "should match complete HTTP Verb methods" + assert exact_results.size == 4, "should match complete HTTP Verb methods" assert exact_results.include? "/test/nested_route(.:format)" assert exact_results.include? "/rails/info/properties(.:format)" assert exact_results.include? "/rails/info/routes(.:format)" + assert exact_results.include? "/rails/info/notes(.:format)" end test "info controller search returns exact matches for route Controller#Action(s)" do @@ -140,9 +142,10 @@ def fuzzy_results assert exact_results.size == 0, "should not match unnamed routes" get :routes, params: { query: "rails_info" } - assert fuzzy_results.size == 3, "should match incomplete route names" + assert fuzzy_results.size == 4, "should match incomplete route names" assert fuzzy_results.include? "/rails/info/properties(.:format)" assert fuzzy_results.include? "/rails/info/routes(.:format)" + assert fuzzy_results.include? "/rails/info/notes(.:format)" assert fuzzy_results.include? "/rails/:test/named_properties(.:format)" get :routes, params: { query: "/rails/info/routes" }