apia-open_api 0.1.1 → 0.1.3

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: 34c08e44efe16ad5c8c47e58621d9d416433e8aa16d65c9d250a9b7154ce4d93
4
- data.tar.gz: cf33503d1e4ee2c028c9b62902d718eee5fc7ca4c80e936a1bf8dbed032c1335
3
+ metadata.gz: 3a45fd172c715b417ff39eca615ecf87f12b49d68a3a0b005702be43e1cce2b7
4
+ data.tar.gz: 0bc1c81f27016b6df2085c3968ef1262a8d2630533a6e836bd786940b5c6bb7d
5
5
  SHA512:
6
- metadata.gz: 207a6efc59f1c89c5505e21e75a2fd456e5b1603eb4eafafb4d93052fc61f28dca62e1c9daa6edabe36cc8db75f3728db61213a214dc4dd31d332048c34e3c33
7
- data.tar.gz: 33455542c2d48abd6a0b7c1e3fd9881ba3fe03780f76d68cdc2ea248ef25040035023b43d50378e92ac543e491a6a2c481d3333b722367f0e164e4d4e4b6e658
6
+ metadata.gz: 0b0c1e241009a2cebd05ad12a654fab114634ebd3a9eb2aa29e7134cbf6c87e6b8ffae9bfa1b62e5339308475b9b610adfae3197bd56450d7bd5b1229ca119e7
7
+ data.tar.gz: 2650e1efa99461dd62ae0359baee53aa494d312655ead60df13ba4a4384b08461a99c0e8bef9a7ae6d60f6411a12229ff1c36fdb325a45ac168c269da430a397
@@ -99,15 +99,33 @@ module Apia
99
99
  end
100
100
  end
101
101
 
102
- id = "#{@route.request_method}:#{result_parts.join('_')}"
103
- if @path_ids.include?(id)
104
- id = "#{@route.request_method}:#{@route.path}"
105
- end
102
+ first_part = "#{@route.request_method}:"
103
+ id = "#{first_part}#{result_parts.join('_')}"
104
+
105
+ id = fallback_id(first_part) if @path_ids.include?(id)
106
106
  @path_ids << id
107
107
 
108
108
  id
109
109
  end
110
110
 
111
+ # IDs can clash if two paths are different, but generate the same ID.
112
+ # For example:
113
+ # - /dns_zones/:dns_zone
114
+ # - /dns/zones/:dns_zone
115
+ # When there is a duplicate we fallback to using the path, but as the path
116
+ # ID is used as the prefix for any $ref IDs, we need to make sure it's not
117
+ # too long. This is because there is a 100 character filename limit imposed
118
+ # by the rubygems gem builder.
119
+ def fallback_id(first_part)
120
+ last_part = @route.path
121
+ if last_part.length >= 50
122
+ last_part = last_part.split(/[_:\/]/).map do |word|
123
+ word[0]
124
+ end.join("_")
125
+ end
126
+ "#{first_part}#{last_part}"
127
+ end
128
+
111
129
  end
112
130
  end
113
131
  end
@@ -211,7 +211,7 @@ module Apia
211
211
  end
212
212
 
213
213
  def generate_ref(namespace, http_status_code, definitions)
214
- id = generate_id_for_error_ref(http_status_code, definitions)
214
+ id = generate_id_for_error_ref(namespace, http_status_code, definitions)
215
215
  if namespace == "responses"
216
216
  add_to_responses_components(http_status_code, definitions, id)
217
217
  else
@@ -220,25 +220,39 @@ module Apia
220
220
  { "$ref": "#/components/#{namespace}/#{id}" }
221
221
  end
222
222
 
223
- def generate_id_for_error_ref(http_status_code, definitions)
223
+ def generate_id_for_error_ref(namespace, http_status_code, definitions)
224
+ suffix = namespace == "responses" ? "Response" : "Schema"
224
225
  api_authenticator_error_defs = api_authenticator_potential_errors.map(&:definition).select do |d|
225
226
  d.http_status_code.to_s == http_status_code.to_s
226
227
  end
227
228
  if api_authenticator_error_defs.any? && api_authenticator_error_defs == definitions
228
- "APIAuthenticator#{http_status_code}Response"
229
+ "APIAuthenticator#{http_status_code}#{suffix}"
229
230
  elsif definitions.length == 1
230
- "#{generate_id_from_definition(definitions.first)}Response"
231
+ "#{generate_id_from_definition(definitions.first)}#{suffix}"
231
232
  else
232
- [
233
- (definitions - api_authenticator_error_defs).map do |d|
234
- generate_id_from_definition(d)
235
- end.join,
236
- http_status_code,
237
- "Response"
238
- ].flatten.join("_").camelize
233
+ generate_short_error_ref(suffix, http_status_code, definitions, api_authenticator_error_defs)
239
234
  end
240
235
  end
241
236
 
237
+ # When we have multiple errors for the same http status code, we need to generate a unique ID.
238
+ # By default we join all the error names together, with the http status code and camelize them.
239
+ # If this is too long, we use only the first and last two error names. Error names are sorted
240
+ # alphabetically, which should ensure we do not generate the same ID to represent different sets of errors.
241
+ # The length is important because the rubygems gem builder imposes a 100 character limit on filenames.
242
+ def generate_short_error_ref(suffix, http_status_code, definitions, api_authenticator_error_defs)
243
+ generated_ids = (definitions - api_authenticator_error_defs).map do |d|
244
+ generate_id_from_definition(d)
245
+ end.sort
246
+ if generated_ids.join.length > 80
247
+ sliced_ids = [generated_ids.first] + generated_ids[-2..]
248
+ end
249
+ [
250
+ (sliced_ids || generated_ids).join,
251
+ http_status_code,
252
+ suffix.first(3)
253
+ ].flatten.join("_").camelize
254
+ end
255
+
242
256
  def add_to_responses_components(http_status_code, definitions, id)
243
257
  return unless @spec.dig(:components, :components, id).nil?
244
258
 
@@ -144,9 +144,14 @@ module Apia
144
144
  schema[:properties][child.name.to_s] = generate_schema_ref(child)
145
145
  else
146
146
  child_path = @path.nil? ? nil : @path + [child]
147
+
148
+ # Nested partial fields in the response have the potential to generate
149
+ # very long IDs, so we truncate them to avoid hitting the 100 character
150
+ # filename limit imposed by the rubygems gem builder.
151
+ truncated_id = @id.match(/^(.*?)\d*?(Response|Part).*$/)[1]
147
152
  schema[:properties][child.name.to_s] = generate_schema_ref(
148
153
  child,
149
- id: "#{@id}_#{child.name}".camelize,
154
+ id: "#{truncated_id}Part_#{child.name}".camelize,
150
155
  endpoint: @endpoint,
151
156
  path: child_path
152
157
  )
@@ -3,7 +3,7 @@
3
3
  module Apia
4
4
  module OpenApi
5
5
 
6
- VERSION = "0.1.1"
6
+ VERSION = "0.1.3"
7
7
 
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: apia-open_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Sturgess
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-12-06 00:00:00.000000000 Z
11
+ date: 2023-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport