lib/grape-swagger/doc_methods.rb
require 'grape-swagger/doc_methods/status_codes'
require 'grape-swagger/doc_methods/produces_consumes'
require 'grape-swagger/doc_methods/data_type'
require 'grape-swagger/doc_methods/extensions'
require 'grape-swagger/doc_methods/operation_id'
require 'grape-swagger/doc_methods/optional_object'
require 'grape-swagger/doc_methods/path_string'
require 'grape-swagger/doc_methods/tag_name_description'
require 'grape-swagger/doc_methods/parse_params'
require 'grape-swagger/doc_methods/move_params'
require 'grape-swagger/doc_methods/headers'
require 'grape-swagger/doc_methods/build_model_definition'
require 'grape-swagger/doc_methods/version'
module GrapeSwagger
module DocMethods
def name
@@class_name
end
def hide_documentation_path
@@hide_documentation_path
end
def mount_path
@@mount_path
end
def setup(options)
options = defaults.merge(options)
# options could be set on #add_swagger_documentation call,
# for available options see #defaults
target_class = options[:target_class]
guard = options[:swagger_endpoint_guard]
formatter = options[:format]
class_variables_from(options)
if formatter
[:format, :default_format, :default_error_formatter].each do |method|
send(method, formatter)
end
end
send(guard.split.first.to_sym, *guard.split(/[\s,]+/).drop(1)) unless guard.nil?
output_path_definitions = proc do |combi_routes, endpoint|
output = endpoint.swagger_object(
target_class,
endpoint.request,
options
)
paths, definitions = endpoint.path_and_definition_objects(combi_routes, options)
tags = GrapeSwagger::DocMethods::TagNameDescription.build(paths)
output[:tags] = tags unless tags.empty? || paths.blank?
output[:paths] = paths unless paths.blank?
output[:definitions] = definitions unless definitions.blank?
output
end
get mount_path do
header['Access-Control-Allow-Origin'] = '*'
header['Access-Control-Request-Method'] = '*'
output_path_definitions.call(target_class.combined_namespace_routes, self)
end
params do
requires :name, type: String, desc: 'Resource name of mounted API'
optional :locale, type: Symbol, desc: 'Locale of API documentation'
end
get "#{mount_path}/:name" do
I18n.locale = params[:locale] || I18n.default_locale
combined_routes = target_class.combined_namespace_routes[params[:name]]
error!({ error: 'named resource not exist' }, 400) if combined_routes.nil?
output_path_definitions.call({ params[:name] => combined_routes }, self)
end
end
def defaults
{
info: {},
models: [],
doc_version: '0.0.1',
target_class: nil,
mount_path: '/swagger_doc',
host: nil,
base_path: nil,
add_base_path: false,
add_version: true,
markdown: false,
hide_documentation_path: true,
format: :json,
authorizations: nil,
security_definitions: nil,
api_documentation: { desc: 'Swagger compatible API description' },
specific_api_documentation: { desc: 'Swagger compatible API description for specific API' },
endpoint_auth_wrapper: nil,
swagger_endpoint_guard: nil,
token_owner: nil
}
end
def class_variables_from(options)
@@mount_path = options[:mount_path]
@@class_name = options[:class_name] || options[:mount_path].delete('/')
@@hide_documentation_path = options[:hide_documentation_path]
end
end
end