require "action_dispatch/routing/inspector"
begin
namespace :krakend do
task :routes => :environment do
inspector = ActionDispatch::Routing::RoutesInspector.new(Rails.application.routes.routes)
formatter = CustomRoutesFormatter.new
routes_filter = {}
puts inspector.format(formatter, routes_filter)
end
end
end
class CustomRoutesFormatter < ActionDispatch::Routing::ConsoleFormatter::Expanded
def section_title(title)
end
def section(routes)
@buffer << draw_expanded_section(routes)
end
private
def draw_expanded_section(routes)
routes.map.each_with_index do |r, i|
path = r[:path].gsub("(.:format)", "").gsub(/:([a-z_]*)/, "{\\1}")
<<~MESSAGE.chomp
{
"endpoint": "#{path}",
"method": "#{r[:verb]}",
"querystring_params": ["*"],
"extra_config": {},
"output_encoding": "no-op",
"concurrent_calls": 1,
"headers_to_pass": ["*"],
"backend": [
{
"url_pattern": "#{path}",
"encoding": "no-op",
"extra_config": {},
"sd": "static",
"host": [
"http://rails-app"
],
"disable_host_sanitize": true
}
]
},
MESSAGE
end
end
end
This approach can help you easily build krakend.json for your rails application.