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
+
+
+
+
+ File Name |
+ Line No. |
+ Tag |
+ Description |
+
+
+ <% @annotations.each do |file, annotations| %>
+ <% annotations.each.with_index do |annotation, index| %>
+
+ <% if index == 0 %>
+
+ <%= file %>
+ |
+ <% end %>
+ <%= annotation.line %> |
+ <%= annotation.tag %> |
+ <%= annotation.text %> |
+
+ <% end %>
+ <% end %>
+
+
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" }