class OpenApi::Endpoints

Constants

METADATA_MERGE

Public Class Methods

build_parameter_metadata(endpoint_metadata) click to toggle source
# File lib/open-api/endpoints.rb, line 90
def build_parameter_metadata(endpoint_metadata)
  parameters = {}
  parameters = (parameters.is_a?(Array) ? parameters : []) +
      param_array(endpoint_metadata.delete(:headers), :header) +
      param_array(endpoint_metadata.delete(:path_params), :path) +
      param_array(endpoint_metadata.delete(:query_string), :query) +
      param_array(endpoint_metadata.delete(:form_data), :form_data)
  if (body_param = endpoint_metadata.delete(:body)).is_a?(Hash)
    parameters += param_array({ body: body_param }, :body)
  end
  return unless parameters.present?
  endpoint_metadata[:parameters] = OpenApi::Utils.camelize_metadata(parameters, end_depth: 3)
end
check_path_filter(route, rel_path, path_filter, opts = {}) click to toggle source
# File lib/open-api/endpoints.rb, line 76
def check_path_filter(route, rel_path, path_filter, opts = {})
  return true unless path_filter.present?
  return rel_path == path_filter if path_filter.is_a?(String)
  return rel_path =~ path_filter if path_filter.is_a?(Regexp)
  return path_filter.include?(rel_path) if path_filter.is_a?(Array)
  if path_filter.respond_to?(:call) && path_filter.respond_to?(:parameters)
    route_opts = opts.merge(route: route, controller: route.defaults[:controller],
        action: route.defaults[:action])
    rslt = path_filter.send(*([:call, rel_path, route_opts][0..path_filter.parameters.size]))
    return rslt ? true : false
  end
  false
end
find_matching_routes(base_path, opts = {}) click to toggle source
# File lib/open-api/endpoints.rb, line 59
def find_matching_routes(base_path, opts = {})
  path_filter = opts[:path_filter]
  if path_filter.is_a?(String) && !path_filter.starts_with?('/')
    path_filter = "/#{path_filter}"
  end
  matching_routes = []
  Rails.application.routes.routes.each do |route|
    route_wrapper = ActionDispatch::Routing::RouteWrapper.new(route)
    if (path = route_wrapper.path.to_s).starts_with?(base_path)
      next unless check_path_filter(route, relative_path(path, base_path), path_filter, opts)
      matching_routes << route_wrapper
      next
    end
  end
  matching_routes
end
merge_metadata(metadata, merge_metadata, opts = {}) click to toggle source
# File lib/open-api/endpoints.rb, line 38
def merge_metadata(metadata, merge_metadata, opts = {})
  if (body_value = merge_metadata[:body]).respond_to?(:to_sym)
    merge_metadata = merge_metadata.merge(body: { schema: { :'$ref' => body_value.to_sym } })
  end
  if merge_metadata.include?(:children)
    merge_metadata = merge_metadata.reject { |k, _v| k == :children }
  end
  OpenApi::Utils.merge_hash(metadata, merge_metadata, opts.merge(merge_by: METADATA_MERGE))
end
relative_path(path, base_path) click to toggle source
# File lib/open-api/endpoints.rb, line 48
def relative_path(path, base_path)
  return path if path.blank? || base_path.blank?
  relative_path = path[base_path.length..-1]
  relative_path = "/#{relative_path}" unless relative_path.starts_with?('/')
  relative_path
end
verb_key(route_wrapper) click to toggle source
# File lib/open-api/endpoints.rb, line 55
def verb_key(route_wrapper)
  route_wrapper.verb.to_s.downcase
end

Private Class Methods

param_array(hash, param_in) click to toggle source
# File lib/open-api/endpoints.rb, line 106
def param_array(hash, param_in)
  return [] if hash.nil?
  fail "Expected Hash for parameter type '#{param_in}'!" unless hash.is_a?(Hash)
  hash.map do |key, value|
    { name: key, in: OpenApi::Utils.camelize_key(param_in) }.merge(
        value.reject { |k, _v| [:name, :in].include?(k) })
  end
end