Class: OpenapiParameters::Query

Inherits:
Object
  • Object
show all
Defined in:
lib/openapi_parameters/query.rb

Overview

Query parses query parameters from a http query strings.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(parameters, convert: true, rack_array_compat: false) ⇒ Query

Returns a new instance of Query.

Parameters:

  • parameters (Array<Hash>)

    The OpenAPI query parameter definitions.

  • convert (Boolean) (defaults to: true)

    Whether to convert the values to the correct type.



11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/openapi_parameters/query.rb', line 11

def initialize(parameters, convert: true, rack_array_compat: false)
  @parameters = parameters.map { Parameter.new(_1) }
  @convert = convert
  @remove_array_brackets = rack_array_compat
  @deep_object_properties = {}
  @deep_object_regex = {}
  @parameters.each do |param|
    next unless param.deep_object?

    @deep_object_properties[param.name] = ObjectConverter.get_properties(param.schema)
    @deep_object_regex[param.name] = /^#{Regexp.escape(param.name)}#{DEEP_PROP}/
  end
end

Instance Attribute Details

#parametersObject (readonly)

Returns the value of attribute parameters.



68
69
70
# File 'lib/openapi_parameters/query.rb', line 68

def parameters
  @parameters
end

Instance Method Details

#unknown_values(query_string) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/openapi_parameters/query.rb', line 50

def unknown_values(query_string)
  parsed_query = parse_query(query_string)
  known_parameter_names = parameters.to_set(&:name)

  unknown = parsed_query.each_with_object({}) do |(key, value), result|
    # Skip parameters that are defined in the schema
    next if known_parameter_names.include?(key)

    # Skip deep object parameters that might belong to defined parameters
    next if parameters.any? { |param| param.deep_object? && key.start_with?("#{param.name}[") }

    result[key] = value
  end
  return if unknown.empty?

  unknown
end

#unpack(query_string) ⇒ Object

rubocop:disable Metrics/AbcSize, Metrics/MethodLength



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/openapi_parameters/query.rb', line 25

def unpack(query_string) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
  parsed_query = parse_query(query_string)
  parameters.each_with_object({}) do |parameter, result|
    if parameter.deep_object?
      if parsed_query.key?(parameter.name)
        value = parsed_query[parameter.name]
      else
        value = parse_deep_object(parameter, parsed_query)
        next if value.empty?
      end
    else
      next unless parsed_query.key?(parameter.name)

      raw = parsed_query[parameter.name]
      value = catch(:skip) { parameter.unpack(raw) }
    end
    key = if remove_array_brackets && parameter.bracket_array?
            parameter.name.delete_suffix('[]')
          else
            parameter.name
          end
    result[key] = @convert ? parameter.convert(value) : value
  end
end