endoflife_date 0.10.0 → 1.0.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 +4 -4
- data/Gemfile.lock +21 -21
- data/README.md +13 -7
- data/docs/Cycle.md +8 -8
- data/docs/CycleCycle.md +15 -0
- data/docs/CycleDiscontinued.md +15 -0
- data/docs/CycleEol.md +15 -0
- data/docs/CycleLts.md +15 -0
- data/docs/CycleSupport.md +15 -0
- data/docs/DefaultApi.md +14 -14
- data/endoflife_date.gemspec +6 -5
- data/git_push.sh +1 -1
- data/lib/endoflife_date/api/default_api.rb +14 -14
- data/lib/endoflife_date/api_client.rb +24 -22
- data/lib/endoflife_date/api_error.rb +2 -2
- data/lib/endoflife_date/configuration.rb +5 -4
- data/lib/endoflife_date/models/cycle.rb +22 -89
- data/lib/endoflife_date/models/cycle_cycle.rb +105 -0
- data/lib/endoflife_date/models/cycle_discontinued.rb +105 -0
- data/lib/endoflife_date/models/cycle_eol.rb +105 -0
- data/lib/endoflife_date/models/cycle_lts.rb +105 -0
- data/lib/endoflife_date/models/cycle_support.rb +105 -0
- data/lib/endoflife_date/version.rb +3 -3
- data/lib/endoflife_date.rb +7 -2
- data/spec/api/default_api_spec.rb +4 -4
- data/spec/models/cycle_cycle_spec.rb +21 -0
- data/spec/models/cycle_discontinued_spec.rb +21 -0
- data/spec/models/cycle_eol_spec.rb +21 -0
- data/spec/models/cycle_lts_spec.rb +21 -0
- data/spec/models/cycle_spec.rb +5 -3
- data/spec/models/cycle_support_spec.rb +21 -0
- data/spec/spec_helper.rb +2 -2
- metadata +25 -9
- data/spec/api_client_spec.rb +0 -228
- data/spec/configuration_spec.rb +0 -42
@@ -4,9 +4,9 @@
|
|
4
4
|
#Documentation for the endoflife.date API. The API is currently in Alpha. Additional information about the API can be found on the [endoflife.date wiki](https://github.com/endoflife-date/endoflife.date/wiki)
|
5
5
|
|
6
6
|
The version of the OpenAPI document: 0.0.1
|
7
|
-
Contact: blah@cliffano.com
|
7
|
+
Contact: blah+oapicf@cliffano.com
|
8
8
|
Generated by: https://openapi-generator.tech
|
9
|
-
|
9
|
+
Generator version: 7.4.0
|
10
10
|
|
11
11
|
=end
|
12
12
|
|
@@ -16,13 +16,11 @@ require 'time'
|
|
16
16
|
module EndOfLifeDateApiClient
|
17
17
|
# Details of a single release cycle of a given product. There might be some slight variations to this depending on the product.
|
18
18
|
class Cycle
|
19
|
-
# Release Cycle
|
20
19
|
attr_accessor :cycle
|
21
20
|
|
22
21
|
# Release Date for the first release in this cycle
|
23
22
|
attr_accessor :release_date
|
24
23
|
|
25
|
-
# End of Life Date for this release cycle
|
26
24
|
attr_accessor :eol
|
27
25
|
|
28
26
|
# Latest release in this cycle
|
@@ -31,13 +29,10 @@ module EndOfLifeDateApiClient
|
|
31
29
|
# Link to changelog for the latest release, if available
|
32
30
|
attr_accessor :link
|
33
31
|
|
34
|
-
# Whether this release cycle has long-term-support (LTS). Can be a date instead in YYYY-MM-DD format as well if the release enters LTS status on a given date.
|
35
32
|
attr_accessor :lts
|
36
33
|
|
37
|
-
# Whether this release cycle has active support
|
38
34
|
attr_accessor :support
|
39
35
|
|
40
|
-
# Whether this cycle is now discontinued.
|
41
36
|
attr_accessor :discontinued
|
42
37
|
|
43
38
|
# Attribute mapping from ruby-style variable name to JSON key.
|
@@ -62,28 +57,21 @@ module EndOfLifeDateApiClient
|
|
62
57
|
# Attribute type mapping.
|
63
58
|
def self.openapi_types
|
64
59
|
{
|
65
|
-
:'cycle' => :'
|
66
|
-
:'release_date' => :'
|
67
|
-
:'eol' => :'
|
68
|
-
:'latest' => :'
|
69
|
-
:'link' => :'
|
70
|
-
:'lts' => :'
|
71
|
-
:'support' => :'
|
72
|
-
:'discontinued' => :'
|
60
|
+
:'cycle' => :'CycleCycle',
|
61
|
+
:'release_date' => :'Date',
|
62
|
+
:'eol' => :'CycleEol',
|
63
|
+
:'latest' => :'String',
|
64
|
+
:'link' => :'String',
|
65
|
+
:'lts' => :'CycleLts',
|
66
|
+
:'support' => :'CycleSupport',
|
67
|
+
:'discontinued' => :'CycleDiscontinued'
|
73
68
|
}
|
74
69
|
end
|
75
70
|
|
76
71
|
# List of attributes with nullable: true
|
77
72
|
def self.openapi_nullable
|
78
73
|
Set.new([
|
79
|
-
:'cycle',
|
80
|
-
:'release_date',
|
81
|
-
:'eol',
|
82
|
-
:'latest',
|
83
74
|
:'link',
|
84
|
-
:'lts',
|
85
|
-
:'support',
|
86
|
-
:'discontinued'
|
87
75
|
])
|
88
76
|
end
|
89
77
|
|
@@ -148,10 +136,6 @@ module EndOfLifeDateApiClient
|
|
148
136
|
invalid_properties.push('invalid value for "release_date", the character length must be great than or equal to 10.')
|
149
137
|
end
|
150
138
|
|
151
|
-
if !@eol.nil? && @eol.to_s.length < 1
|
152
|
-
invalid_properties.push('invalid value for "eol", the character length must be great than or equal to 1.')
|
153
|
-
end
|
154
|
-
|
155
139
|
if !@latest.nil? && @latest.to_s.length < 1
|
156
140
|
invalid_properties.push('invalid value for "latest", the character length must be great than or equal to 1.')
|
157
141
|
end
|
@@ -160,22 +144,6 @@ module EndOfLifeDateApiClient
|
|
160
144
|
invalid_properties.push('invalid value for "link", the character length must be great than or equal to 1.')
|
161
145
|
end
|
162
146
|
|
163
|
-
if !@support.nil? && @support.to_s.length > 10
|
164
|
-
invalid_properties.push('invalid value for "support", the character length must be smaller than or equal to 10.')
|
165
|
-
end
|
166
|
-
|
167
|
-
if !@support.nil? && @support.to_s.length < 10
|
168
|
-
invalid_properties.push('invalid value for "support", the character length must be great than or equal to 10.')
|
169
|
-
end
|
170
|
-
|
171
|
-
if !@discontinued.nil? && @discontinued.to_s.length > 10
|
172
|
-
invalid_properties.push('invalid value for "discontinued", the character length must be smaller than or equal to 10.')
|
173
|
-
end
|
174
|
-
|
175
|
-
if !@discontinued.nil? && @discontinued.to_s.length < 10
|
176
|
-
invalid_properties.push('invalid value for "discontinued", the character length must be great than or equal to 10.')
|
177
|
-
end
|
178
|
-
|
179
147
|
invalid_properties
|
180
148
|
end
|
181
149
|
|
@@ -185,44 +153,37 @@ module EndOfLifeDateApiClient
|
|
185
153
|
warn '[DEPRECATED] the `valid?` method is obsolete'
|
186
154
|
return false if !@release_date.nil? && @release_date.to_s.length > 10
|
187
155
|
return false if !@release_date.nil? && @release_date.to_s.length < 10
|
188
|
-
return false if !@eol.nil? && @eol.to_s.length < 1
|
189
156
|
return false if !@latest.nil? && @latest.to_s.length < 1
|
190
157
|
return false if !@link.nil? && @link.to_s.length < 1
|
191
|
-
return false if !@support.nil? && @support.to_s.length > 10
|
192
|
-
return false if !@support.nil? && @support.to_s.length < 10
|
193
|
-
return false if !@discontinued.nil? && @discontinued.to_s.length > 10
|
194
|
-
return false if !@discontinued.nil? && @discontinued.to_s.length < 10
|
195
158
|
true
|
196
159
|
end
|
197
160
|
|
198
161
|
# Custom attribute writer method with validation
|
199
162
|
# @param [Object] release_date Value to be assigned
|
200
163
|
def release_date=(release_date)
|
201
|
-
if
|
164
|
+
if release_date.nil?
|
165
|
+
fail ArgumentError, 'release_date cannot be nil'
|
166
|
+
end
|
167
|
+
|
168
|
+
if release_date.to_s.length > 10
|
202
169
|
fail ArgumentError, 'invalid value for "release_date", the character length must be smaller than or equal to 10.'
|
203
170
|
end
|
204
171
|
|
205
|
-
if
|
172
|
+
if release_date.to_s.length < 10
|
206
173
|
fail ArgumentError, 'invalid value for "release_date", the character length must be great than or equal to 10.'
|
207
174
|
end
|
208
175
|
|
209
176
|
@release_date = release_date
|
210
177
|
end
|
211
178
|
|
212
|
-
# Custom attribute writer method with validation
|
213
|
-
# @param [Object] eol Value to be assigned
|
214
|
-
def eol=(eol)
|
215
|
-
if !eol.nil? && eol.to_s.length < 1
|
216
|
-
fail ArgumentError, 'invalid value for "eol", the character length must be great than or equal to 1.'
|
217
|
-
end
|
218
|
-
|
219
|
-
@eol = eol
|
220
|
-
end
|
221
|
-
|
222
179
|
# Custom attribute writer method with validation
|
223
180
|
# @param [Object] latest Value to be assigned
|
224
181
|
def latest=(latest)
|
225
|
-
if
|
182
|
+
if latest.nil?
|
183
|
+
fail ArgumentError, 'latest cannot be nil'
|
184
|
+
end
|
185
|
+
|
186
|
+
if latest.to_s.length < 1
|
226
187
|
fail ArgumentError, 'invalid value for "latest", the character length must be great than or equal to 1.'
|
227
188
|
end
|
228
189
|
|
@@ -239,34 +200,6 @@ module EndOfLifeDateApiClient
|
|
239
200
|
@link = link
|
240
201
|
end
|
241
202
|
|
242
|
-
# Custom attribute writer method with validation
|
243
|
-
# @param [Object] support Value to be assigned
|
244
|
-
def support=(support)
|
245
|
-
if !support.nil? && support.to_s.length > 10
|
246
|
-
fail ArgumentError, 'invalid value for "support", the character length must be smaller than or equal to 10.'
|
247
|
-
end
|
248
|
-
|
249
|
-
if !support.nil? && support.to_s.length < 10
|
250
|
-
fail ArgumentError, 'invalid value for "support", the character length must be great than or equal to 10.'
|
251
|
-
end
|
252
|
-
|
253
|
-
@support = support
|
254
|
-
end
|
255
|
-
|
256
|
-
# Custom attribute writer method with validation
|
257
|
-
# @param [Object] discontinued Value to be assigned
|
258
|
-
def discontinued=(discontinued)
|
259
|
-
if !discontinued.nil? && discontinued.to_s.length > 10
|
260
|
-
fail ArgumentError, 'invalid value for "discontinued", the character length must be smaller than or equal to 10.'
|
261
|
-
end
|
262
|
-
|
263
|
-
if !discontinued.nil? && discontinued.to_s.length < 10
|
264
|
-
fail ArgumentError, 'invalid value for "discontinued", the character length must be great than or equal to 10.'
|
265
|
-
end
|
266
|
-
|
267
|
-
@discontinued = discontinued
|
268
|
-
end
|
269
|
-
|
270
203
|
# Checks equality by comparing each attribute.
|
271
204
|
# @param [Object] Object to be compared
|
272
205
|
def ==(o)
|
@@ -356,7 +289,7 @@ module EndOfLifeDateApiClient
|
|
356
289
|
else # model
|
357
290
|
# models (e.g. Pet) or oneOf
|
358
291
|
klass = EndOfLifeDateApiClient.const_get(type)
|
359
|
-
klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value)
|
292
|
+
klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value)
|
360
293
|
end
|
361
294
|
end
|
362
295
|
|
@@ -0,0 +1,105 @@
|
|
1
|
+
=begin
|
2
|
+
#endoflife.date
|
3
|
+
|
4
|
+
#Documentation for the endoflife.date API. The API is currently in Alpha. Additional information about the API can be found on the [endoflife.date wiki](https://github.com/endoflife-date/endoflife.date/wiki)
|
5
|
+
|
6
|
+
The version of the OpenAPI document: 0.0.1
|
7
|
+
Contact: blah+oapicf@cliffano.com
|
8
|
+
Generated by: https://openapi-generator.tech
|
9
|
+
Generator version: 7.4.0
|
10
|
+
|
11
|
+
=end
|
12
|
+
|
13
|
+
require 'date'
|
14
|
+
require 'time'
|
15
|
+
|
16
|
+
module EndOfLifeDateApiClient
|
17
|
+
# Release Cycle
|
18
|
+
module CycleCycle
|
19
|
+
class << self
|
20
|
+
# List of class defined in anyOf (OpenAPI v3)
|
21
|
+
def openapi_any_of
|
22
|
+
[
|
23
|
+
:'Float',
|
24
|
+
:'String'
|
25
|
+
]
|
26
|
+
end
|
27
|
+
|
28
|
+
# Builds the object
|
29
|
+
# @param [Mixed] Data to be matched against the list of anyOf items
|
30
|
+
# @return [Object] Returns the model or the data itself
|
31
|
+
def build(data)
|
32
|
+
# Go through the list of anyOf items and attempt to identify the appropriate one.
|
33
|
+
# Note:
|
34
|
+
# - No advanced validation of types in some cases (e.g. "x: { type: string }" will happily match { x: 123 })
|
35
|
+
# due to the way the deserialization is made in the base_object template (it just casts without verifying).
|
36
|
+
# - TODO: scalar values are de facto behaving as if they were nullable.
|
37
|
+
# - TODO: logging when debugging is set.
|
38
|
+
openapi_any_of.each do |klass|
|
39
|
+
begin
|
40
|
+
next if klass == :AnyType # "nullable: true"
|
41
|
+
typed_data = find_and_cast_into_type(klass, data)
|
42
|
+
return typed_data if typed_data
|
43
|
+
rescue # rescue all errors so we keep iterating even if the current item lookup raises
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
openapi_any_of.include?(:AnyType) ? data : nil
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
SchemaMismatchError = Class.new(StandardError)
|
53
|
+
|
54
|
+
# Note: 'File' is missing here because in the regular case we get the data _after_ a call to JSON.parse.
|
55
|
+
def find_and_cast_into_type(klass, data)
|
56
|
+
return if data.nil?
|
57
|
+
|
58
|
+
case klass.to_s
|
59
|
+
when 'Boolean'
|
60
|
+
return data if data.instance_of?(TrueClass) || data.instance_of?(FalseClass)
|
61
|
+
when 'Float'
|
62
|
+
return data if data.instance_of?(Float)
|
63
|
+
when 'Integer'
|
64
|
+
return data if data.instance_of?(Integer)
|
65
|
+
when 'Time'
|
66
|
+
return Time.parse(data)
|
67
|
+
when 'Date'
|
68
|
+
return Date.parse(data)
|
69
|
+
when 'String'
|
70
|
+
return data if data.instance_of?(String)
|
71
|
+
when 'Object' # "type: object"
|
72
|
+
return data if data.instance_of?(Hash)
|
73
|
+
when /\AArray<(?<sub_type>.+)>\z/ # "type: array"
|
74
|
+
if data.instance_of?(Array)
|
75
|
+
sub_type = Regexp.last_match[:sub_type]
|
76
|
+
return data.map { |item| find_and_cast_into_type(sub_type, item) }
|
77
|
+
end
|
78
|
+
when /\AHash<String, (?<sub_type>.+)>\z/ # "type: object" with "additionalProperties: { ... }"
|
79
|
+
if data.instance_of?(Hash) && data.keys.all? { |k| k.instance_of?(Symbol) || k.instance_of?(String) }
|
80
|
+
sub_type = Regexp.last_match[:sub_type]
|
81
|
+
return data.each_with_object({}) { |(k, v), hsh| hsh[k] = find_and_cast_into_type(sub_type, v) }
|
82
|
+
end
|
83
|
+
else # model
|
84
|
+
const = EndOfLifeDateApiClient.const_get(klass)
|
85
|
+
if const
|
86
|
+
if const.respond_to?(:openapi_any_of) # nested anyOf model
|
87
|
+
model = const.build(data)
|
88
|
+
return model if model
|
89
|
+
else
|
90
|
+
# raise if data contains keys that are not known to the model
|
91
|
+
raise if const.respond_to?(:acceptable_attributes) && !(data.keys - const.acceptable_attributes).empty?
|
92
|
+
model = const.build_from_hash(data)
|
93
|
+
return model if model
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
raise # if no match by now, raise
|
99
|
+
rescue
|
100
|
+
raise SchemaMismatchError, "#{data} doesn't match the #{klass} type"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
=begin
|
2
|
+
#endoflife.date
|
3
|
+
|
4
|
+
#Documentation for the endoflife.date API. The API is currently in Alpha. Additional information about the API can be found on the [endoflife.date wiki](https://github.com/endoflife-date/endoflife.date/wiki)
|
5
|
+
|
6
|
+
The version of the OpenAPI document: 0.0.1
|
7
|
+
Contact: blah+oapicf@cliffano.com
|
8
|
+
Generated by: https://openapi-generator.tech
|
9
|
+
Generator version: 7.4.0
|
10
|
+
|
11
|
+
=end
|
12
|
+
|
13
|
+
require 'date'
|
14
|
+
require 'time'
|
15
|
+
|
16
|
+
module EndOfLifeDateApiClient
|
17
|
+
# Whether this cycle is now discontinued.
|
18
|
+
module CycleDiscontinued
|
19
|
+
class << self
|
20
|
+
# List of class defined in anyOf (OpenAPI v3)
|
21
|
+
def openapi_any_of
|
22
|
+
[
|
23
|
+
:'Boolean',
|
24
|
+
:'String'
|
25
|
+
]
|
26
|
+
end
|
27
|
+
|
28
|
+
# Builds the object
|
29
|
+
# @param [Mixed] Data to be matched against the list of anyOf items
|
30
|
+
# @return [Object] Returns the model or the data itself
|
31
|
+
def build(data)
|
32
|
+
# Go through the list of anyOf items and attempt to identify the appropriate one.
|
33
|
+
# Note:
|
34
|
+
# - No advanced validation of types in some cases (e.g. "x: { type: string }" will happily match { x: 123 })
|
35
|
+
# due to the way the deserialization is made in the base_object template (it just casts without verifying).
|
36
|
+
# - TODO: scalar values are de facto behaving as if they were nullable.
|
37
|
+
# - TODO: logging when debugging is set.
|
38
|
+
openapi_any_of.each do |klass|
|
39
|
+
begin
|
40
|
+
next if klass == :AnyType # "nullable: true"
|
41
|
+
typed_data = find_and_cast_into_type(klass, data)
|
42
|
+
return typed_data if typed_data
|
43
|
+
rescue # rescue all errors so we keep iterating even if the current item lookup raises
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
openapi_any_of.include?(:AnyType) ? data : nil
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
SchemaMismatchError = Class.new(StandardError)
|
53
|
+
|
54
|
+
# Note: 'File' is missing here because in the regular case we get the data _after_ a call to JSON.parse.
|
55
|
+
def find_and_cast_into_type(klass, data)
|
56
|
+
return if data.nil?
|
57
|
+
|
58
|
+
case klass.to_s
|
59
|
+
when 'Boolean'
|
60
|
+
return data if data.instance_of?(TrueClass) || data.instance_of?(FalseClass)
|
61
|
+
when 'Float'
|
62
|
+
return data if data.instance_of?(Float)
|
63
|
+
when 'Integer'
|
64
|
+
return data if data.instance_of?(Integer)
|
65
|
+
when 'Time'
|
66
|
+
return Time.parse(data)
|
67
|
+
when 'Date'
|
68
|
+
return Date.parse(data)
|
69
|
+
when 'String'
|
70
|
+
return data if data.instance_of?(String)
|
71
|
+
when 'Object' # "type: object"
|
72
|
+
return data if data.instance_of?(Hash)
|
73
|
+
when /\AArray<(?<sub_type>.+)>\z/ # "type: array"
|
74
|
+
if data.instance_of?(Array)
|
75
|
+
sub_type = Regexp.last_match[:sub_type]
|
76
|
+
return data.map { |item| find_and_cast_into_type(sub_type, item) }
|
77
|
+
end
|
78
|
+
when /\AHash<String, (?<sub_type>.+)>\z/ # "type: object" with "additionalProperties: { ... }"
|
79
|
+
if data.instance_of?(Hash) && data.keys.all? { |k| k.instance_of?(Symbol) || k.instance_of?(String) }
|
80
|
+
sub_type = Regexp.last_match[:sub_type]
|
81
|
+
return data.each_with_object({}) { |(k, v), hsh| hsh[k] = find_and_cast_into_type(sub_type, v) }
|
82
|
+
end
|
83
|
+
else # model
|
84
|
+
const = EndOfLifeDateApiClient.const_get(klass)
|
85
|
+
if const
|
86
|
+
if const.respond_to?(:openapi_any_of) # nested anyOf model
|
87
|
+
model = const.build(data)
|
88
|
+
return model if model
|
89
|
+
else
|
90
|
+
# raise if data contains keys that are not known to the model
|
91
|
+
raise if const.respond_to?(:acceptable_attributes) && !(data.keys - const.acceptable_attributes).empty?
|
92
|
+
model = const.build_from_hash(data)
|
93
|
+
return model if model
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
raise # if no match by now, raise
|
99
|
+
rescue
|
100
|
+
raise SchemaMismatchError, "#{data} doesn't match the #{klass} type"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
=begin
|
2
|
+
#endoflife.date
|
3
|
+
|
4
|
+
#Documentation for the endoflife.date API. The API is currently in Alpha. Additional information about the API can be found on the [endoflife.date wiki](https://github.com/endoflife-date/endoflife.date/wiki)
|
5
|
+
|
6
|
+
The version of the OpenAPI document: 0.0.1
|
7
|
+
Contact: blah+oapicf@cliffano.com
|
8
|
+
Generated by: https://openapi-generator.tech
|
9
|
+
Generator version: 7.4.0
|
10
|
+
|
11
|
+
=end
|
12
|
+
|
13
|
+
require 'date'
|
14
|
+
require 'time'
|
15
|
+
|
16
|
+
module EndOfLifeDateApiClient
|
17
|
+
# End of Life Date for this release cycle
|
18
|
+
module CycleEol
|
19
|
+
class << self
|
20
|
+
# List of class defined in anyOf (OpenAPI v3)
|
21
|
+
def openapi_any_of
|
22
|
+
[
|
23
|
+
:'Boolean',
|
24
|
+
:'String'
|
25
|
+
]
|
26
|
+
end
|
27
|
+
|
28
|
+
# Builds the object
|
29
|
+
# @param [Mixed] Data to be matched against the list of anyOf items
|
30
|
+
# @return [Object] Returns the model or the data itself
|
31
|
+
def build(data)
|
32
|
+
# Go through the list of anyOf items and attempt to identify the appropriate one.
|
33
|
+
# Note:
|
34
|
+
# - No advanced validation of types in some cases (e.g. "x: { type: string }" will happily match { x: 123 })
|
35
|
+
# due to the way the deserialization is made in the base_object template (it just casts without verifying).
|
36
|
+
# - TODO: scalar values are de facto behaving as if they were nullable.
|
37
|
+
# - TODO: logging when debugging is set.
|
38
|
+
openapi_any_of.each do |klass|
|
39
|
+
begin
|
40
|
+
next if klass == :AnyType # "nullable: true"
|
41
|
+
typed_data = find_and_cast_into_type(klass, data)
|
42
|
+
return typed_data if typed_data
|
43
|
+
rescue # rescue all errors so we keep iterating even if the current item lookup raises
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
openapi_any_of.include?(:AnyType) ? data : nil
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
SchemaMismatchError = Class.new(StandardError)
|
53
|
+
|
54
|
+
# Note: 'File' is missing here because in the regular case we get the data _after_ a call to JSON.parse.
|
55
|
+
def find_and_cast_into_type(klass, data)
|
56
|
+
return if data.nil?
|
57
|
+
|
58
|
+
case klass.to_s
|
59
|
+
when 'Boolean'
|
60
|
+
return data if data.instance_of?(TrueClass) || data.instance_of?(FalseClass)
|
61
|
+
when 'Float'
|
62
|
+
return data if data.instance_of?(Float)
|
63
|
+
when 'Integer'
|
64
|
+
return data if data.instance_of?(Integer)
|
65
|
+
when 'Time'
|
66
|
+
return Time.parse(data)
|
67
|
+
when 'Date'
|
68
|
+
return Date.parse(data)
|
69
|
+
when 'String'
|
70
|
+
return data if data.instance_of?(String)
|
71
|
+
when 'Object' # "type: object"
|
72
|
+
return data if data.instance_of?(Hash)
|
73
|
+
when /\AArray<(?<sub_type>.+)>\z/ # "type: array"
|
74
|
+
if data.instance_of?(Array)
|
75
|
+
sub_type = Regexp.last_match[:sub_type]
|
76
|
+
return data.map { |item| find_and_cast_into_type(sub_type, item) }
|
77
|
+
end
|
78
|
+
when /\AHash<String, (?<sub_type>.+)>\z/ # "type: object" with "additionalProperties: { ... }"
|
79
|
+
if data.instance_of?(Hash) && data.keys.all? { |k| k.instance_of?(Symbol) || k.instance_of?(String) }
|
80
|
+
sub_type = Regexp.last_match[:sub_type]
|
81
|
+
return data.each_with_object({}) { |(k, v), hsh| hsh[k] = find_and_cast_into_type(sub_type, v) }
|
82
|
+
end
|
83
|
+
else # model
|
84
|
+
const = EndOfLifeDateApiClient.const_get(klass)
|
85
|
+
if const
|
86
|
+
if const.respond_to?(:openapi_any_of) # nested anyOf model
|
87
|
+
model = const.build(data)
|
88
|
+
return model if model
|
89
|
+
else
|
90
|
+
# raise if data contains keys that are not known to the model
|
91
|
+
raise if const.respond_to?(:acceptable_attributes) && !(data.keys - const.acceptable_attributes).empty?
|
92
|
+
model = const.build_from_hash(data)
|
93
|
+
return model if model
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
raise # if no match by now, raise
|
99
|
+
rescue
|
100
|
+
raise SchemaMismatchError, "#{data} doesn't match the #{klass} type"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
=begin
|
2
|
+
#endoflife.date
|
3
|
+
|
4
|
+
#Documentation for the endoflife.date API. The API is currently in Alpha. Additional information about the API can be found on the [endoflife.date wiki](https://github.com/endoflife-date/endoflife.date/wiki)
|
5
|
+
|
6
|
+
The version of the OpenAPI document: 0.0.1
|
7
|
+
Contact: blah+oapicf@cliffano.com
|
8
|
+
Generated by: https://openapi-generator.tech
|
9
|
+
Generator version: 7.4.0
|
10
|
+
|
11
|
+
=end
|
12
|
+
|
13
|
+
require 'date'
|
14
|
+
require 'time'
|
15
|
+
|
16
|
+
module EndOfLifeDateApiClient
|
17
|
+
# Whether this release cycle has long-term-support (LTS). Can be a date instead in YYYY-MM-DD format as well if the release enters LTS status on a given date.
|
18
|
+
module CycleLts
|
19
|
+
class << self
|
20
|
+
# List of class defined in anyOf (OpenAPI v3)
|
21
|
+
def openapi_any_of
|
22
|
+
[
|
23
|
+
:'Boolean',
|
24
|
+
:'String'
|
25
|
+
]
|
26
|
+
end
|
27
|
+
|
28
|
+
# Builds the object
|
29
|
+
# @param [Mixed] Data to be matched against the list of anyOf items
|
30
|
+
# @return [Object] Returns the model or the data itself
|
31
|
+
def build(data)
|
32
|
+
# Go through the list of anyOf items and attempt to identify the appropriate one.
|
33
|
+
# Note:
|
34
|
+
# - No advanced validation of types in some cases (e.g. "x: { type: string }" will happily match { x: 123 })
|
35
|
+
# due to the way the deserialization is made in the base_object template (it just casts without verifying).
|
36
|
+
# - TODO: scalar values are de facto behaving as if they were nullable.
|
37
|
+
# - TODO: logging when debugging is set.
|
38
|
+
openapi_any_of.each do |klass|
|
39
|
+
begin
|
40
|
+
next if klass == :AnyType # "nullable: true"
|
41
|
+
typed_data = find_and_cast_into_type(klass, data)
|
42
|
+
return typed_data if typed_data
|
43
|
+
rescue # rescue all errors so we keep iterating even if the current item lookup raises
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
openapi_any_of.include?(:AnyType) ? data : nil
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
SchemaMismatchError = Class.new(StandardError)
|
53
|
+
|
54
|
+
# Note: 'File' is missing here because in the regular case we get the data _after_ a call to JSON.parse.
|
55
|
+
def find_and_cast_into_type(klass, data)
|
56
|
+
return if data.nil?
|
57
|
+
|
58
|
+
case klass.to_s
|
59
|
+
when 'Boolean'
|
60
|
+
return data if data.instance_of?(TrueClass) || data.instance_of?(FalseClass)
|
61
|
+
when 'Float'
|
62
|
+
return data if data.instance_of?(Float)
|
63
|
+
when 'Integer'
|
64
|
+
return data if data.instance_of?(Integer)
|
65
|
+
when 'Time'
|
66
|
+
return Time.parse(data)
|
67
|
+
when 'Date'
|
68
|
+
return Date.parse(data)
|
69
|
+
when 'String'
|
70
|
+
return data if data.instance_of?(String)
|
71
|
+
when 'Object' # "type: object"
|
72
|
+
return data if data.instance_of?(Hash)
|
73
|
+
when /\AArray<(?<sub_type>.+)>\z/ # "type: array"
|
74
|
+
if data.instance_of?(Array)
|
75
|
+
sub_type = Regexp.last_match[:sub_type]
|
76
|
+
return data.map { |item| find_and_cast_into_type(sub_type, item) }
|
77
|
+
end
|
78
|
+
when /\AHash<String, (?<sub_type>.+)>\z/ # "type: object" with "additionalProperties: { ... }"
|
79
|
+
if data.instance_of?(Hash) && data.keys.all? { |k| k.instance_of?(Symbol) || k.instance_of?(String) }
|
80
|
+
sub_type = Regexp.last_match[:sub_type]
|
81
|
+
return data.each_with_object({}) { |(k, v), hsh| hsh[k] = find_and_cast_into_type(sub_type, v) }
|
82
|
+
end
|
83
|
+
else # model
|
84
|
+
const = EndOfLifeDateApiClient.const_get(klass)
|
85
|
+
if const
|
86
|
+
if const.respond_to?(:openapi_any_of) # nested anyOf model
|
87
|
+
model = const.build(data)
|
88
|
+
return model if model
|
89
|
+
else
|
90
|
+
# raise if data contains keys that are not known to the model
|
91
|
+
raise if const.respond_to?(:acceptable_attributes) && !(data.keys - const.acceptable_attributes).empty?
|
92
|
+
model = const.build_from_hash(data)
|
93
|
+
return model if model
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
raise # if no match by now, raise
|
99
|
+
rescue
|
100
|
+
raise SchemaMismatchError, "#{data} doesn't match the #{klass} type"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|