class GrapeSwagger::DocMethods::MoveParams

Public Class Methods

find_definition_and_params(path) click to toggle source
# File lib/grape-swagger/doc_methods/move_params.rb, line 19
def find_definition_and_params(path)
  path.keys.each do |verb|
    params = path[verb][:parameters]

    next if params.nil?
    next unless should_move?(params)

    unify!(params)

    status_code = GrapeSwagger::DocMethods::StatusCodes.get[verb.to_sym][:code]
    response = path[verb][:responses][status_code]
    referenced_definition = parse_model(response[:schema]['$ref'])

    name = build_definition(referenced_definition, verb)
    move_params_to_new(name, params)

    @definitions[name][:description] = path[verb][:description]
    path[verb][:parameters] << build_body_parameter(response.dup, name)
  end
end
find_post_put(paths) { |found| ... } click to toggle source
# File lib/grape-swagger/doc_methods/move_params.rb, line 12
def find_post_put(paths)
  paths.each do |x|
    found = x.last.select { |y| move_methods.include?(y) }
    yield found unless found.empty?
  end
end
move_params_to_new(name, params) click to toggle source
# File lib/grape-swagger/doc_methods/move_params.rb, line 40
def move_params_to_new(name, params)
  properties = {}
  definition = @definitions[name]

  nested_definitions(name, params, properties)

  params.dup.each do |param|
    next unless movable?(param)

    name = param[:name].to_sym
    properties[name] = {}

    properties[name].tap do |x|
      property_keys.each do |attribute|
        x[attribute] = param[attribute] unless param[attribute].nil?
      end
    end

    properties[name][:readOnly] = true unless deletable?(param)
    params.delete(param) if deletable?(param)

    definition[:required] << name if deletable?(param) && param[:required]
  end

  definition.delete(:required) if definition[:required].empty?
  definition[:properties] = properties
end
nested_definitions(name, params, properties) click to toggle source
# File lib/grape-swagger/doc_methods/move_params.rb, line 68
def nested_definitions(name, params, properties)
  loop do
    nested_name = params.bsearch { |x| x[:name].include?('[') }
    return if nested_name.nil?

    nested_name = nested_name[:name].split('[').first

    nested, = params.partition { |x| x[:name].start_with?("#{nested_name}[") }
    nested.each { |x| params.delete(x) }
    nested_def_name = GrapeSwagger::DocMethods::OperationId.manipulate(nested_name)
    def_name = "#{name}#{nested_def_name}"
    properties[nested_name] = { '$ref' => "#/definitions/#{def_name}" }

    prepare_nested_names(nested)
    build_definition(def_name)
    @definitions[def_name][:description] = "#{name} - #{nested_name}"
    move_params_to_new(def_name, nested)
  end
end
to_definition(paths, definitions) click to toggle source
# File lib/grape-swagger/doc_methods/move_params.rb, line 5
def to_definition(paths, definitions)
  @definitions = definitions
  find_post_put(paths) do |path|
    find_definition_and_params(path)
  end
end

Private Class Methods

build_body_parameter(response, name = false) click to toggle source
# File lib/grape-swagger/doc_methods/move_params.rb, line 90
def build_body_parameter(response, name = false)
  body_param = {}
  body_param.tap do |x|
    x[:name] = parse_model(response[:schema]['$ref'])
    x[:in] = 'body'
    x[:required] = true
    x[:schema] = { '$ref' => response[:schema]['$ref'] } unless name
    x[:schema] = { '$ref' => "#/definitions/#{name}" } if name
  end
end
build_definition(name, verb = nil) click to toggle source
# File lib/grape-swagger/doc_methods/move_params.rb, line 101
def build_definition(name, verb = nil)
  name = "#{verb}Request#{name}" if verb
  @definitions[name] = { type: 'object', properties: {}, required: [] }

  name
end
deletable?(param) click to toggle source
# File lib/grape-swagger/doc_methods/move_params.rb, line 142
def deletable?(param)
  return true if movable?(param) && param[:in] == 'body'
  false
end
movable?(param) click to toggle source
# File lib/grape-swagger/doc_methods/move_params.rb, line 137
def movable?(param)
  return true if param[:in] == 'body' || param[:in] == 'path'
  false
end
move_methods() click to toggle source
# File lib/grape-swagger/doc_methods/move_params.rb, line 129
def move_methods
  [:post, :put, :patch]
end
parse_model(ref) click to toggle source
# File lib/grape-swagger/doc_methods/move_params.rb, line 125
def parse_model(ref)
  ref.split('/').last
end
prepare_nested_names(params) click to toggle source
# File lib/grape-swagger/doc_methods/move_params.rb, line 108
def prepare_nested_names(params)
  params.each do |param|
    param.tap do |x|
      name = x[:name].partition('[').last.sub(']', '')
      name = name.partition('[').last.sub(']', '') if name.start_with?('[')
      x[:name] = name
    end
  end
end
property_keys() click to toggle source
# File lib/grape-swagger/doc_methods/move_params.rb, line 133
def property_keys
  [:type, :format, :description, :minimum, :maximum, :items]
end
should_move?(params) click to toggle source
# File lib/grape-swagger/doc_methods/move_params.rb, line 147
def should_move?(params)
  !params.select { |x| x[:in] == 'body' || x[:param_type] == 'body' }.empty?
end
unify!(params) click to toggle source
# File lib/grape-swagger/doc_methods/move_params.rb, line 118
def unify!(params)
  params.each do |param|
    param[:in] = param.delete(:param_type) if param.key?(:param_type)
    param[:in] = 'body' if param[:in] == 'formData'
  end
end