show grape routes
namespace :grape do
desc "show API routes"
task routes: :environment do
mapping = method_mapping
grape_klasses = ObjectSpace.each_object(Class).select { |klass| klass < Grape::API }
routes = grape_klasses.
flat_map(&:routes).
uniq { |r| r.send(mapping[:path]) + r.send(mapping[:method]).to_s }
method_width, path_width, version_width, desc_width = widths(routes, mapping)
routes.each do |api|
method = api.send(mapping[:method]).to_s.rjust(method_width)
path = api.send(mapping[:path]).to_s.ljust(path_width)
version = api.send(mapping[:version]).to_s.ljust(version_width)
desc = api.send(mapping[:description]).to_s.ljust(desc_width)
puts " #{method} | #{path} | #{version} | #{desc}"
end
end
def widths(routes, mapping)
[
routes.map { |r| r.send(mapping[:method]).try(:length) }.compact.max || 0,
routes.map { |r| r.send(mapping[:path]).try(:length) }.compact.max || 0,
routes.map { |r| r.send(mapping[:version]).try(:length) }.compact.max || 0,
routes.map { |r| r.send(mapping[:description]).try(:length) }.compact.max || 0
]
end
def method_mapping
if Gem.loaded_specs['grape'].version.to_s >= "0.15.1"
{
method: 'request_method',
path: 'path',
version: 'version',
description: 'description'
}
else
{
method: 'route_method',
path: 'route_path',
version: 'route_version',
description: 'route_description'
}
end
end
end