openapi_parameters 0.3.4 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa336f02dcfc58d656659606710c5fed70335b7a5e101f42228a24913e12325b
4
- data.tar.gz: e81f400174546397953abe62d23c26f07fbf14f594ca2297ad129118847a4709
3
+ metadata.gz: 778cfe7ccd40119158a3c158b5cf1dcf8000436a4c747a1ecfa349782ffa99d1
4
+ data.tar.gz: ebdb7a20b68b881e526e11fd30e05458ed8dd5dea34b16f94115e522dfa1801f
5
5
  SHA512:
6
- metadata.gz: b30a7b111b652c9dbc12e0c19ef5f9dc74a5ba9b6eebc0a7392ba0d5070d7c19578017a64e8948e8dd235b57e8784202e37765c62be015c5520940278def939f
7
- data.tar.gz: 1e91216f5bff01be794c5eec6a469cea42162472568c2d881afa3267aa036257d0afab0e97534edd57f074217122c96abac08e3e6d4a14c139348bb0ae81fd8e
6
+ metadata.gz: 61c5e95989223be85f4965355aede74739ac71a3f07ebeba9b6486ef56acf45a64093ffa23b680d1ccad28f7abbbcc4d94a6135acf4575f87f7e67773ccdd97c
7
+ data.tar.gz: 82fe0b18f8a79e758b5b3a3a496a8de373cc7a47079a3944cd5a6843130c03c1ca6b5173d479a8c2c0a14697e106f2d1aa407d6181e1feac8e5b2cdd074bb4bd
data/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.5.0] - 2025-04-01
4
+
5
+ - Add option to remove "[]" from unpacked query openapi_parameters
6
+ ```ruby
7
+ OpenapiParameters::Query.new(
8
+ [parameter],
9
+ rack_array_compat: true
10
+ ).unpack('ids[]=2')
11
+ # => { 'ids' => ['2'] }
12
+ ```
13
+
14
+ ## [0.4.0] - 2024-12-17
15
+
16
+ - Add Parameter#convert(value)
17
+ - Slight performance optimization
18
+
3
19
  ## [0.3.4] - 2024-06-14
4
20
 
5
21
  - Fix handling invalid object query parameters (String vs Hash)
@@ -2,6 +2,7 @@
2
2
 
3
3
  module OpenapiParameters
4
4
  # Tries to convert a request parameter value (string) to the type specified in the JSON Schema.
5
+ # @visibility private
5
6
  module Converter
6
7
  class << self
7
8
  ##
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenapiParameters
4
+ # Home for all converters
5
+ module Converters
6
+ @converters = {}
7
+
8
+ class << self
9
+ attr_reader :converters
10
+
11
+ def register(type, converter)
12
+ converters[type] = converter
13
+ end
14
+
15
+ def [](schema)
16
+ type = schema && schema['type']
17
+ converters.fetch(type) do
18
+ ->(value) { Converter.convert(value, schema) }
19
+ end
20
+ end
21
+ end
22
+
23
+ register('integer', lambda do |value|
24
+ Integer(value, 10)
25
+ rescue StandardError
26
+ value
27
+ end)
28
+
29
+ register('number', lambda do |value|
30
+ Float(value)
31
+ rescue StandardError
32
+ value
33
+ end)
34
+
35
+ register('boolean', lambda do |value|
36
+ if value == 'true'
37
+ true
38
+ else
39
+ value == 'false' ? false : value
40
+ end
41
+ end)
42
+ end
43
+ end
@@ -18,7 +18,7 @@ module OpenapiParameters
18
18
 
19
19
  result[parameter.name] = catch :skip do
20
20
  value = Unpacker.unpack_value(parameter, cookies[parameter.name])
21
- @convert ? Converter.convert(value, parameter.schema) : value
21
+ @convert ? parameter.convert(value) : value
22
22
  end
23
23
  end
24
24
  end
@@ -3,4 +3,7 @@
3
3
  module OpenapiParameters
4
4
  class Error < StandardError
5
5
  end
6
+
7
+ class NotSupportetError < Error
8
+ end
6
9
  end
@@ -17,7 +17,7 @@ module OpenapiParameters
17
17
 
18
18
  result[parameter.name] = catch :skip do
19
19
  value = Unpacker.unpack_value(parameter, headers[parameter.name])
20
- @convert ? Converter.convert(value, parameter.schema) : value
20
+ @convert ? parameter.convert(value) : value
21
21
  end
22
22
  end
23
23
  end
@@ -9,11 +9,16 @@ module OpenapiParameters
9
9
  @definition = definition
10
10
  @name = definition['name']
11
11
  @is_deep_object = style == 'deepObject'
12
+ @converter = Converters[schema]
12
13
  check_supported!
13
14
  end
14
15
 
15
16
  attr_reader :definition, :name
16
17
 
18
+ def convert(value)
19
+ @converter.call(value)
20
+ end
21
+
17
22
  def deep_object?
18
23
  @is_deep_object
19
24
  end
@@ -47,6 +52,13 @@ module OpenapiParameters
47
52
  type == 'array'
48
53
  end
49
54
 
55
+ EMPTY_BRACKETS = '[]'
56
+ private_constant :EMPTY_BRACKETS
57
+
58
+ def bracket_array?
59
+ @bracket_array ||= array? && name.end_with?(EMPTY_BRACKETS)
60
+ end
61
+
50
62
  def object?
51
63
  type == 'object' || style == 'deepObject' || schema&.key?('properties')
52
64
  end
@@ -21,7 +21,7 @@ module OpenapiParameters
21
21
 
22
22
  result[parameter.name] = catch :skip do
23
23
  value = Unpacker.unpack_value(parameter, path_params[parameter.name])
24
- @convert ? Converter.convert(value, parameter.schema) : value
24
+ @convert ? parameter.convert(value) : value
25
25
  end
26
26
  end
27
27
  end
@@ -7,9 +7,10 @@ module OpenapiParameters
7
7
  class Query
8
8
  # @param parameters [Array<Hash>] The OpenAPI query parameter definitions.
9
9
  # @param convert [Boolean] Whether to convert the values to the correct type.
10
- def initialize(parameters, convert: true)
10
+ def initialize(parameters, convert: true, rack_array_compat: false)
11
11
  @parameters = parameters.map { Parameter.new(_1) }
12
12
  @convert = convert
13
+ @remove_array_brackets = rack_array_compat
13
14
  end
14
15
 
15
16
  def unpack(query_string) # rubocop:disable Metrics/AbcSize
@@ -19,17 +20,23 @@ module OpenapiParameters
19
20
  parsed_nested_query = Rack::Utils.parse_nested_query(query_string)
20
21
  next unless parsed_nested_query.key?(parameter.name)
21
22
 
22
- result[parameter.name] = convert(parsed_nested_query[parameter.name], parameter)
23
+ value = parsed_nested_query[parameter.name]
23
24
  else
24
25
  next unless parsed_query.key?(parameter.name)
25
26
 
26
27
  value = Unpacker.unpack_value(parameter, parsed_query[parameter.name])
27
- result[parameter.name] = convert(value, parameter)
28
28
  end
29
+ key = if remove_array_brackets && parameter.bracket_array?
30
+ parameter.name.delete_suffix('[]')
31
+ else
32
+ parameter.name
33
+ end
34
+ result[key] = @convert ? parameter.convert(value) : value
29
35
  end
30
36
  end
31
37
 
32
38
  attr_reader :parameters
39
+ private attr_reader :remove_array_brackets
33
40
 
34
41
  private
35
42
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OpenapiParameters
4
- VERSION = '0.3.4'
4
+ VERSION = '0.5.0'
5
5
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rack'
4
+ require_relative 'openapi_parameters/converters'
4
5
  require_relative 'openapi_parameters/converter'
5
6
  require_relative 'openapi_parameters/cookie'
6
7
  require_relative 'openapi_parameters/error'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openapi_parameters
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andreas Haller
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-06-14 00:00:00.000000000 Z
11
+ date: 2025-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -36,6 +36,7 @@ files:
36
36
  - README.md
37
37
  - lib/openapi_parameters.rb
38
38
  - lib/openapi_parameters/converter.rb
39
+ - lib/openapi_parameters/converters.rb
39
40
  - lib/openapi_parameters/cookie.rb
40
41
  - lib/openapi_parameters/error.rb
41
42
  - lib/openapi_parameters/header.rb