openapi_parameters 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8483c9c6b0071290af337487bdec6ae34c94904497c7dce5abb120c497eef94e
4
- data.tar.gz: 78a862041af3c393e242185021eb52314f8d47e81c03160c41b46a2437379db7
3
+ metadata.gz: aa586602013f736682059c6e4615dbd4eb7e57daaa4633e6fb35982261a39e11
4
+ data.tar.gz: 772345d845efdf6d191c362176deac63036cf064fbd4145c8b375f9bf500faaf
5
5
  SHA512:
6
- metadata.gz: 8234ded58769039d9366d94d0482be0ea0ba1ed22385ebb8d9f42ec9c1d93e3b3d5b295bc09cc049ba75613886dc7a1e8b7b6d83af953061591bb21d4c4ae80f
7
- data.tar.gz: 1f0cac157a4601b405199bbddce07cb6bb41f701cb69570ef8e8ecd92ad610a504c066a834f9aad9da157ede3987bd27356e59dd5ecdd29ce3ac2074d6f7ffbc
6
+ metadata.gz: 8d21a6c44fc2a1d6d72a3b4cd2bab4804ee4ddfd62d5cf73d3407bf913583b0733b61e9b567da45dca13f9bf2007d58ac6b45fb71299ffa509385aaa1f05b18a
7
+ data.tar.gz: d7cc40c0551910ba432955e7008762950d8c65df0b06e45d094dca0f8b601c6bacc68e6ef8d223471d9f59c112f7a872fd2a5903a7f78de2d70f0580ccfc9115
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.3.0] - 2023-10-27
4
+
5
+ - Query parameters: Don't attempt to convert arras within deepObject objects. Behaviour is not defined in OpenApi 3.1.
6
+
7
+ ## [0.2.2] - 2023-06-01
8
+
9
+ - Remove superflous validation of "in" property
10
+ - Remove superfluous check for unsupported $ref inside parameter schema
11
+
3
12
  ## [0.2.1] - 2023-03-31
4
13
 
5
14
  - Fix links in gemspec
data/Gemfile CHANGED
@@ -5,8 +5,8 @@ source 'https://rubygems.org'
5
5
  # Specify your gem's dependencies in OpenapiParameters.gemspec
6
6
  gemspec
7
7
 
8
+ gem 'rack-test'
8
9
  gem 'rake', '~> 13.0'
9
-
10
10
  gem 'rspec', '~> 3.0'
11
11
  gem 'rspec-benchmark'
12
12
  gem 'rubocop'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- openapi_parameters (0.2.1)
4
+ openapi_parameters (0.3.0)
5
5
  rack (>= 2.2)
6
6
  zeitwerk (~> 2.6)
7
7
 
@@ -14,14 +14,19 @@ GEM
14
14
  benchmark-trend (0.4.0)
15
15
  diff-lcs (1.5.0)
16
16
  json (2.6.3)
17
- parallel (1.22.1)
18
- parser (3.2.1.1)
17
+ language_server-protocol (3.17.0.3)
18
+ parallel (1.23.0)
19
+ parser (3.2.2.4)
19
20
  ast (~> 2.4.1)
20
- rack (3.0.7)
21
+ racc
22
+ racc (1.7.1)
23
+ rack (3.0.8)
24
+ rack-test (2.1.0)
25
+ rack (>= 1.3)
21
26
  rainbow (3.1.1)
22
27
  rake (13.0.6)
23
- regexp_parser (2.7.0)
24
- rexml (3.2.5)
28
+ regexp_parser (2.8.2)
29
+ rexml (3.2.6)
25
30
  rspec (3.12.0)
26
31
  rspec-core (~> 3.12.0)
27
32
  rspec-expectations (~> 3.12.0)
@@ -31,35 +36,39 @@ GEM
31
36
  benchmark-perf (~> 0.6)
32
37
  benchmark-trend (~> 0.4)
33
38
  rspec (>= 3.0)
34
- rspec-core (3.12.1)
39
+ rspec-core (3.12.2)
35
40
  rspec-support (~> 3.12.0)
36
- rspec-expectations (3.12.2)
41
+ rspec-expectations (3.12.3)
37
42
  diff-lcs (>= 1.2.0, < 2.0)
38
43
  rspec-support (~> 3.12.0)
39
- rspec-mocks (3.12.5)
44
+ rspec-mocks (3.12.6)
40
45
  diff-lcs (>= 1.2.0, < 2.0)
41
46
  rspec-support (~> 3.12.0)
42
- rspec-support (3.12.0)
43
- rubocop (1.48.1)
47
+ rspec-support (3.12.1)
48
+ rubocop (1.57.2)
44
49
  json (~> 2.3)
50
+ language_server-protocol (>= 3.17.0)
45
51
  parallel (~> 1.10)
46
- parser (>= 3.2.0.0)
52
+ parser (>= 3.2.2.4)
47
53
  rainbow (>= 2.2.2, < 4.0)
48
54
  regexp_parser (>= 1.8, < 3.0)
49
55
  rexml (>= 3.2.5, < 4.0)
50
- rubocop-ast (>= 1.26.0, < 2.0)
56
+ rubocop-ast (>= 1.28.1, < 2.0)
51
57
  ruby-progressbar (~> 1.7)
52
58
  unicode-display_width (>= 2.4.0, < 3.0)
53
- rubocop-ast (1.28.0)
59
+ rubocop-ast (1.30.0)
54
60
  parser (>= 3.2.1.0)
55
- rubocop-capybara (2.17.1)
61
+ rubocop-capybara (2.19.0)
56
62
  rubocop (~> 1.41)
57
- rubocop-rspec (2.19.0)
63
+ rubocop-factory_bot (2.24.0)
58
64
  rubocop (~> 1.33)
65
+ rubocop-rspec (2.25.0)
66
+ rubocop (~> 1.40)
59
67
  rubocop-capybara (~> 2.17)
68
+ rubocop-factory_bot (~> 2.22)
60
69
  ruby-progressbar (1.13.0)
61
- unicode-display_width (2.4.2)
62
- zeitwerk (2.6.7)
70
+ unicode-display_width (2.5.0)
71
+ zeitwerk (2.6.12)
63
72
 
64
73
  PLATFORMS
65
74
  arm64-darwin-21
@@ -69,6 +78,7 @@ PLATFORMS
69
78
 
70
79
  DEPENDENCIES
71
80
  openapi_parameters!
81
+ rack-test
72
82
  rake (~> 13.0)
73
83
  rspec (~> 3.0)
74
84
  rspec-benchmark
data/README.md CHANGED
@@ -1,8 +1,10 @@
1
- # OpenapiParameters
1
+ # openapi_parameters
2
2
 
3
- OpenapiParameters is an an [OpenAPI](https://www.openapis.org/) aware parameter parser.
3
+ openapi_parameters is an an [OpenAPI](https://www.openapis.org/) aware parameter parser.
4
4
 
5
- OpenapiParameters unpacks HTTP/Rack (query / header / cookie) parameters exactly as described in an [OpenAPI](https://www.openapis.org/) definition. It supports `style`, `explode` and `schema` definitions according to OpenAPI 3.1 (or 3.0). The gem is mainly build to be used inside of other OpenAPI tooling.
5
+ openapi_parameters unpacks HTTP/Rack query / path / header / cookie parameters exactly as described in an [OpenAPI](https://www.openapis.org/) definition. It supports `style`, `explode` and `schema` definitions according to OpenAPI 3.1 (or 3.0). The gem is mainly build to be used inside of other OpenAPI tooling like [openapi_first](https://github.com/ahx/openapi_first).
6
+
7
+ [Learn about parameters in OpenAPI](https://spec.openapis.org/oas/latest.html#parameter-object).
6
8
 
7
9
  ## Synopsis
8
10
 
@@ -72,11 +74,11 @@ parameter.allow_reserved? # => false
72
74
 
73
75
  Install the gem and add to the application's Gemfile by executing:
74
76
 
75
- $ bundle add OpenapiParameters
77
+ $ bundle add openapi_parameters
76
78
 
77
79
  If bundler is not being used to manage dependencies, install the gem by executing:
78
80
 
79
- $ gem install OpenapiParameters
81
+ $ gem install openapi_parameters
80
82
 
81
83
  ## Development
82
84
 
@@ -86,4 +88,4 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
86
88
 
87
89
  ## Contributing
88
90
 
89
- Bug reports and pull requests are welcome on GitHub at https://github.com/ahx/OpenapiParameters.
91
+ Bug reports and pull requests are welcome on GitHub at https://github.com/ahx/openapi_parameters.
@@ -3,97 +3,77 @@
3
3
  module OpenapiParameters
4
4
  ##
5
5
  # Tries to convert a request parameter value (string) to the type specified in the JSON Schema.
6
- class Converter
7
- ##
8
- # @param input [String, Hash, Array] the value to convert
9
- # @param schema [Hash] the schema to use for conversion.
10
- def self.call(input, schema)
11
- new(input, schema).call
12
- end
13
-
14
- def initialize(input, schema)
15
- @input = input
16
- @root_schema = schema
17
- end
18
-
19
- def call
20
- convert(@input, @root_schema)
21
- end
22
-
23
- private
24
-
25
- def convert(value, schema) # rubocop:disable Metrics/*
26
- check_supported!(schema)
27
- return if value.nil?
28
- return value if schema.nil?
6
+ module Converter
7
+ class << self
8
+ ##
9
+ # @param input [String, Hash, Array] the value to convert
10
+ # @param schema [Hash] the schema to use for conversion.
11
+ def convert(value, schema) # rubocop:disable Metrics
12
+ return if value.nil?
13
+ return value if schema.nil?
29
14
 
30
- case type(schema)
31
- when 'integer'
32
- begin
33
- Integer(value, 10)
34
- rescue StandardError
35
- value
36
- end
37
- when 'number'
38
- begin
39
- Float(value)
40
- rescue StandardError
41
- value
42
- end
43
- when 'boolean'
44
- if value == 'true'
45
- true
15
+ case type(schema)
16
+ when 'integer'
17
+ begin
18
+ Integer(value, 10)
19
+ rescue StandardError
20
+ value
21
+ end
22
+ when 'number'
23
+ begin
24
+ Float(value)
25
+ rescue StandardError
26
+ value
27
+ end
28
+ when 'boolean'
29
+ if value == 'true'
30
+ true
31
+ else
32
+ value == 'false' ? false : value
33
+ end
34
+ when 'object'
35
+ convert_object(value, schema)
36
+ when 'array'
37
+ convert_array(value, schema)
46
38
  else
47
- value == 'false' ? false : value
39
+ value
48
40
  end
49
- when 'object'
50
- convert_object(value, schema)
51
- when 'array'
52
- convert_array(value, schema)
53
- else
54
- value
55
41
  end
56
- end
57
42
 
58
- REF = '$ref'
59
- private_constant :REF
43
+ private
60
44
 
61
- def check_supported!(schema)
62
- return unless schema&.key?(REF)
63
-
64
- raise NotSupportedError,
65
- "$ref is not supported: #{@root_schema.inspect}"
66
- end
67
-
68
- def type(schema)
69
- schema && schema['type']
70
- end
45
+ def type(schema)
46
+ schema && schema['type']
47
+ end
71
48
 
72
- def convert_object(object, schema)
73
- object.each_with_object({}) do |(key, value), hsh|
74
- hsh[key] = convert(value, schema['properties']&.fetch(key))
49
+ def convert_object(object, schema)
50
+ object.each_with_object({}) do |(key, value), hsh|
51
+ hsh[key] = convert(value, schema['properties']&.fetch(key))
52
+ end
75
53
  end
76
- end
77
54
 
78
- def convert_array(array, schema)
79
- item_schema = schema['items']
80
- prefix_schemas = schema['prefixItems']
81
- return convert_array_with_prefixes(array, prefix_schemas, item_schema) if prefix_schemas
55
+ def convert_array(array, schema)
56
+ return array unless array.is_a?(Array)
82
57
 
83
- array.map { |item| convert(item, item_schema) }
84
- end
58
+ item_schema = schema['items']
59
+ prefix_schemas = schema['prefixItems']
60
+ return convert_array_with_prefixes(array, prefix_schemas, item_schema) if prefix_schemas
85
61
 
86
- def convert_array_with_prefixes(array, prefix_schemas, item_schema)
87
- prefixes =
88
- array
89
- .slice(0, prefix_schemas.size)
90
- .each_with_index
91
- .map { |item, index| convert(item, prefix_schemas[index]) }
92
- array =
93
- array[prefix_schemas.size..].map! do |item|
94
- convert(item, item_schema)
95
- end
96
- prefixes + array
62
+ array.map { |item| convert(item, item_schema) }
63
+ end
64
+
65
+ def convert_array_with_prefixes(array, prefix_schemas, item_schema)
66
+ prefixes =
67
+ array
68
+ .slice(0, prefix_schemas.size)
69
+ .each_with_index
70
+ .map { |item, index| convert(item, prefix_schemas[index]) }
71
+ array =
72
+ array[prefix_schemas.size..].map! do |item|
73
+ convert(item, item_schema)
74
+ end
75
+ prefixes + array
76
+ end
97
77
  end
98
78
  end
99
79
  end
@@ -20,8 +20,8 @@ module OpenapiParameters
20
20
  next unless cookies.key?(parameter.name)
21
21
 
22
22
  result[parameter.name] = catch :skip do
23
- value = unpack_parameter(parameter, cookies)
24
- @convert ? Converter.call(value, parameter.schema) : value
23
+ value = Unpacker.unpack_value(parameter, cookies[parameter.name])
24
+ @convert ? Converter.convert(value, parameter.schema) : value
25
25
  end
26
26
  end
27
27
  end
@@ -29,33 +29,5 @@ module OpenapiParameters
29
29
  private
30
30
 
31
31
  attr_reader :parameters
32
-
33
- def unpack_parameter(parameter, cookies)
34
- value = cookies[parameter.name]
35
- return if value.nil?
36
- return unpack_object(parameter, value) if parameter.object?
37
- return unpack_array(value) if parameter.array?
38
-
39
- value
40
- end
41
-
42
- def unpack_array(value)
43
- value.split(ARRAY_DELIMER)
44
- end
45
-
46
- ARRAY_DELIMER = ','
47
- OBJECT_EXPLODE_SPLITTER = Regexp.union(',', '=').freeze
48
-
49
- def unpack_object(parameter, value)
50
- entries =
51
- if parameter.explode?
52
- value.split(OBJECT_EXPLODE_SPLITTER)
53
- else
54
- value.split(ARRAY_DELIMER)
55
- end
56
- throw :skip, value if entries.length.odd?
57
-
58
- Hash[*entries]
59
- end
60
32
  end
61
33
  end
@@ -17,8 +17,8 @@ module OpenapiParameters
17
17
  next unless headers.key?(parameter.name)
18
18
 
19
19
  result[parameter.name] = catch :skip do
20
- value = unpack_parameter(parameter, headers)
21
- @convert ? Converter.call(value, parameter.schema) : value
20
+ value = Unpacker.unpack_value(parameter, headers[parameter.name])
21
+ @convert ? Converter.convert(value, parameter.schema) : value
22
22
  end
23
23
  end
24
24
  end
@@ -28,33 +28,5 @@ module OpenapiParameters
28
28
  end
29
29
 
30
30
  attr_reader :parameters
31
-
32
- private
33
-
34
- def unpack_parameter(parameter, headers)
35
- value = headers[parameter.name]
36
- return value if parameter.primitive?
37
- return unpack_object(parameter, value) if parameter.object?
38
- return unpack_array(value) if parameter.array?
39
- end
40
-
41
- def unpack_array(value)
42
- value.split(ARRAY_DELIMER)
43
- end
44
-
45
- ARRAY_DELIMER = ','
46
- OBJECT_EXPLODE_SPLITTER = Regexp.union(',', '=').freeze
47
-
48
- def unpack_object(parameter, value)
49
- entries =
50
- if parameter.explode?
51
- value.split(OBJECT_EXPLODE_SPLITTER)
52
- else
53
- value.split(ARRAY_DELIMER)
54
- end
55
- throw :skip, value if entries.length.odd?
56
-
57
- Hash[*entries]
58
- end
59
31
  end
60
32
  end
@@ -4,6 +4,7 @@ module OpenapiParameters
4
4
  ##
5
5
  # Represents a parameter in an OpenAPI operation.
6
6
  class Parameter
7
+ # @param definition [Hash] The parameter definition. A string keyed Hash.
7
8
  def initialize(definition)
8
9
  check_supported!(definition)
9
10
  @definition = definition
@@ -86,22 +87,14 @@ module OpenapiParameters
86
87
  }.freeze
87
88
  private_constant :DEFAULT_STYLE
88
89
 
89
- VALID_LOCATIONS = Set.new(%w[query header path cookie]).freeze
90
- private_constant :VALID_LOCATIONS
91
-
92
90
  REF = '$ref'
93
91
  private_constant :REF
94
92
 
95
93
  def check_supported!(definition)
96
- if definition.values.any? { |v| v.is_a?(Hash) && v.key?(REF) }
97
- raise NotSupportedError,
98
- "Parameter schema with $ref is not supported: #{definition.inspect}"
99
- end
100
- return if VALID_LOCATIONS.include?(definition['in'])
101
-
102
- raise ArgumentError,
103
- %(Parameter definition must have an 'in' property defined
104
- which should be one of #{VALID_LOCATIONS.join(', ')}).freeze
94
+ return unless definition.values.any? { |v| v.is_a?(Hash) && v.key?(REF) }
95
+
96
+ raise NotSupportedError,
97
+ "Parameter schema with $ref is not supported: #{definition.inspect}"
105
98
  end
106
99
  end
107
100
  end
@@ -3,72 +3,28 @@
3
3
  require 'rack'
4
4
 
5
5
  module OpenapiParameters
6
- # Parses OpenAPI path parameters from path template strings and the request path.
6
+ # Parses OpenAPI path parameters from a route params Hash that is usually provided by your Rack webframework
7
7
  class Path
8
8
  # @param parameters [Array<Hash>] The OpenAPI path parameters.
9
- # @param path [String] The OpenAPI path template string.
10
9
  # @param convert [Boolean] Whether to convert the values to the correct type.
11
10
  def initialize(parameters, convert: true)
12
11
  @parameters = parameters
13
12
  @convert = convert
14
13
  end
15
14
 
16
- attr_reader :parameters, :path
15
+ attr_reader :parameters
17
16
 
17
+ # @param path_params [Hash] The path parameters from the Rack request. The keys are strings.
18
18
  def unpack(path_params)
19
19
  parameters.each_with_object({}) do |param, result|
20
20
  parameter = Parameter.new(param)
21
21
  next unless path_params.key?(parameter.name)
22
22
 
23
23
  result[parameter.name] = catch :skip do
24
- value = unpack_parameter(parameter, path_params)
25
- @convert ? Converter.call(value, parameter.schema) : value
24
+ value = Unpacker.unpack_value(parameter, path_params[parameter.name])
25
+ @convert ? Converter.convert(value, parameter.schema) : value
26
26
  end
27
27
  end
28
28
  end
29
-
30
- private
31
-
32
- def unpack_parameter(parameter, parsed_path)
33
- value = parsed_path[parameter.name]
34
- return value if parameter.primitive? || value.nil?
35
- return unpack_array(parameter, value) if parameter.array?
36
- return unpack_object(parameter, value) if parameter.object?
37
- end
38
-
39
- def unpack_array(parameter, value)
40
- return value if value.empty?
41
- return unpack_matrix(parameter, value) if parameter.style == 'matrix'
42
-
43
- value = value[1..] if PREFIXED.key?(parameter.style)
44
- value.split(ARRAY_DELIMITER[parameter.style])
45
- end
46
-
47
- def unpack_matrix(parameter, value)
48
- result = Rack::Utils.parse_query(value, ';')[parameter.name]
49
- return result if parameter.explode?
50
-
51
- result.split(',')
52
- end
53
-
54
- def unpack_object(parameter, value)
55
- return Rack::Utils.parse_query(value, ',') if parameter.explode?
56
-
57
- array = unpack_array(parameter, value)
58
- throw :skip, value if array.length.odd?
59
-
60
- Hash[*array]
61
- end
62
-
63
- PREFIXED = {
64
- 'label' => '.',
65
- 'matrix' => ';'
66
- }.freeze
67
-
68
- ARRAY_DELIMITER = {
69
- 'label' => '.',
70
- 'simple' => ','
71
- }.freeze
72
- private_constant :ARRAY_DELIMITER
73
29
  end
74
30
  end
@@ -24,8 +24,8 @@ module OpenapiParameters
24
24
  else
25
25
  next unless parsed_query.key?(parameter.name)
26
26
 
27
- unpacked = unpack_parameter(parameter, parsed_query)
28
- result[parameter.name] = convert(unpacked, parameter)
27
+ value = Unpacker.unpack_value(parameter, parsed_query[parameter.name])
28
+ result[parameter.name] = convert(value, parameter)
29
29
  end
30
30
  end
31
31
  end
@@ -34,49 +34,18 @@ module OpenapiParameters
34
34
 
35
35
  private
36
36
 
37
- def convert(value, parameter)
37
+ def convert_primitive(value, parameter)
38
38
  return value unless @convert
39
39
  return value if value == ''
40
40
 
41
- Converter.call(value, parameter.schema)
42
- end
43
-
44
- QUERY_PARAMETER_DELIMETER = '&'
45
- ARRAY_DELIMER = ','
46
-
47
- def unpack_parameter(parameter, parsed_query)
48
- value = parsed_query[parameter.name]
49
- return value if parameter.primitive? || value.nil?
50
- return unpack_array(parameter, parsed_query) if parameter.array?
51
- return unpack_object(parameter, parsed_query) if parameter.object?
52
- end
53
-
54
- def unpack_array(parameter, parsed_query)
55
- value = parsed_query[parameter.name]
56
- return value if value.empty?
57
- return Array(value) if parameter.explode?
58
-
59
- value.split(array_delimiter(parameter.style))
41
+ Converter.convert_primitive(value, parameter.schema)
60
42
  end
61
43
 
62
- def unpack_object(parameter, parsed_query)
63
- return parsed_query[parameter.name] if parameter.explode?
64
-
65
- array = parsed_query[parameter.name]&.split(ARRAY_DELIMER)
66
- return array if array.length.odd?
67
-
68
- Hash[*array]
69
- end
70
-
71
- DELIMERS = {
72
- 'pipeDelimited' => '|',
73
- 'spaceDelimited' => ' ',
74
- 'form' => ',',
75
- 'simple' => ','
76
- }.freeze
44
+ def convert(value, parameter)
45
+ return value unless @convert
46
+ return value if value == ''
77
47
 
78
- def array_delimiter(style)
79
- DELIMERS.fetch(style, ARRAY_DELIMER)
48
+ Converter.convert(value, parameter.schema)
80
49
  end
81
50
  end
82
51
  end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OpenapiParameters
4
+ ## Unpacks a paramexter value from a string as defined in the OpenAPI specification.
5
+ # @visibility private
6
+ module Unpacker
7
+ class << self
8
+ def unpack_value(parameter, value)
9
+ return value if value.nil?
10
+ return unpack_array(parameter, value) if parameter.array?
11
+ return unpack_object(parameter, value) if parameter.object?
12
+
13
+ value
14
+ end
15
+
16
+ def unpack_array(parameter, value)
17
+ return value if value.is_a?(Array)
18
+ return value if value.empty?
19
+ return unpack_matrix(parameter, value) if parameter.style == 'matrix'
20
+
21
+ value = value[1..] if PREFIXED.key?(parameter.style)
22
+ value.split(ARRAY_DELIMITER[parameter.style])
23
+ end
24
+
25
+ def unpack_matrix(parameter, value)
26
+ result = Rack::Utils.parse_query(value, ';')[parameter.name]
27
+ return result if parameter.explode?
28
+
29
+ result.split(',')
30
+ end
31
+
32
+ OBJECT_EXPLODE_SPLITTER = Regexp.union(',', '=').freeze
33
+ private_constant :OBJECT_EXPLODE_SPLITTER
34
+
35
+ def unpack_object(parameter, value)
36
+ return unpack_object_path(parameter, value) if parameter.location == 'path'
37
+
38
+ entries =
39
+ if parameter.explode?
40
+ value.split(OBJECT_EXPLODE_SPLITTER)
41
+ else
42
+ value.split(ARRAY_DELIMITER[parameter.style])
43
+ end
44
+ throw :skip, value if entries.length.odd?
45
+
46
+ Hash[*entries]
47
+ end
48
+
49
+ def unpack_object_path(parameter, value)
50
+ return Rack::Utils.parse_query(value, ',') if parameter.explode?
51
+
52
+ array = unpack_array(parameter, value)
53
+ throw :skip, value if array.length.odd?
54
+
55
+ Hash[*array]
56
+ end
57
+
58
+ PREFIXED = {
59
+ 'label' => '.',
60
+ 'matrix' => ';'
61
+ }.freeze
62
+
63
+ ARRAY_DELIMITER = {
64
+ 'label' => '.',
65
+ 'simple' => ',',
66
+ 'form' => ',',
67
+ 'pipeDelimited' => '|',
68
+ 'spaceDelimited' => ' '
69
+ }.freeze
70
+ private_constant :ARRAY_DELIMITER
71
+ end
72
+ end
73
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OpenapiParameters
4
- VERSION = '0.2.1'
4
+ VERSION = '0.3.0'
5
5
  end
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.2.1
4
+ version: 0.3.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: 2023-03-31 00:00:00.000000000 Z
11
+ date: 2023-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -64,6 +64,7 @@ files:
64
64
  - lib/openapi_parameters/parameter.rb
65
65
  - lib/openapi_parameters/path.rb
66
66
  - lib/openapi_parameters/query.rb
67
+ - lib/openapi_parameters/unpacker.rb
67
68
  - lib/openapi_parameters/version.rb
68
69
  - openapi_parameters.gemspec
69
70
  - sig/openapi_parameters.rbs