onebusaway-sdk 0.1.0.pre.alpha.205 → 0.1.0.pre.alpha.207
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/README.md +32 -20
- data/lib/onebusaway-sdk/base_client.rb +63 -91
- data/lib/onebusaway-sdk/base_model.rb +489 -514
- data/lib/onebusaway-sdk/base_page.rb +35 -15
- data/lib/onebusaway-sdk/client.rb +1 -3
- data/lib/onebusaway-sdk/errors.rb +15 -19
- data/lib/onebusaway-sdk/extern.rb +1 -4
- data/lib/onebusaway-sdk/models/references.rb +0 -21
- data/lib/onebusaway-sdk/models/report_problem_with_stop_retrieve_params.rb +0 -21
- data/lib/onebusaway-sdk/models/report_problem_with_trip_retrieve_params.rb +0 -23
- data/lib/onebusaway-sdk/pooled_net_requester.rb +53 -54
- data/lib/onebusaway-sdk/request_options.rb +4 -11
- data/lib/onebusaway-sdk/resources/agencies_with_coverage.rb +0 -2
- data/lib/onebusaway-sdk/resources/agency.rb +0 -2
- data/lib/onebusaway-sdk/resources/arrival_and_departure.rb +0 -3
- data/lib/onebusaway-sdk/resources/block.rb +0 -2
- data/lib/onebusaway-sdk/resources/config.rb +0 -2
- data/lib/onebusaway-sdk/resources/current_time.rb +0 -2
- data/lib/onebusaway-sdk/resources/report_problem_with_stop.rb +0 -2
- data/lib/onebusaway-sdk/resources/report_problem_with_trip.rb +0 -2
- data/lib/onebusaway-sdk/resources/route.rb +0 -2
- data/lib/onebusaway-sdk/resources/route_ids_for_agency.rb +0 -2
- data/lib/onebusaway-sdk/resources/routes_for_agency.rb +0 -2
- data/lib/onebusaway-sdk/resources/routes_for_location.rb +0 -2
- data/lib/onebusaway-sdk/resources/schedule_for_route.rb +0 -2
- data/lib/onebusaway-sdk/resources/schedule_for_stop.rb +0 -2
- data/lib/onebusaway-sdk/resources/search_for_route.rb +0 -2
- data/lib/onebusaway-sdk/resources/search_for_stop.rb +0 -2
- data/lib/onebusaway-sdk/resources/shape.rb +0 -2
- data/lib/onebusaway-sdk/resources/stop.rb +0 -2
- data/lib/onebusaway-sdk/resources/stop_ids_for_agency.rb +0 -2
- data/lib/onebusaway-sdk/resources/stops_for_agency.rb +0 -2
- data/lib/onebusaway-sdk/resources/stops_for_location.rb +0 -2
- data/lib/onebusaway-sdk/resources/stops_for_route.rb +0 -2
- data/lib/onebusaway-sdk/resources/trip.rb +0 -2
- data/lib/onebusaway-sdk/resources/trip_details.rb +0 -2
- data/lib/onebusaway-sdk/resources/trip_for_vehicle.rb +0 -2
- data/lib/onebusaway-sdk/resources/trips_for_location.rb +0 -2
- data/lib/onebusaway-sdk/resources/trips_for_route.rb +0 -2
- data/lib/onebusaway-sdk/resources/vehicles_for_agency.rb +0 -2
- data/lib/onebusaway-sdk/util.rb +297 -96
- data/lib/onebusaway-sdk/version.rb +1 -1
- data/lib/onebusaway-sdk.rb +1 -0
- data/manifest.yaml +1 -0
- data/rbi/lib/onebusaway-sdk/base_client.rbi +52 -35
- data/rbi/lib/onebusaway-sdk/base_model.rbi +400 -256
- data/rbi/lib/onebusaway-sdk/base_page.rbi +3 -4
- data/rbi/lib/onebusaway-sdk/client.rbi +7 -2
- data/rbi/lib/onebusaway-sdk/errors.rbi +44 -10
- data/rbi/lib/onebusaway-sdk/extern.rbi +1 -1
- data/rbi/lib/onebusaway-sdk/models/agencies_with_coverage_list_params.rbi +5 -2
- data/rbi/lib/onebusaway-sdk/models/agencies_with_coverage_list_response.rbi +9 -6
- data/rbi/lib/onebusaway-sdk/models/agency_retrieve_params.rbi +5 -2
- data/rbi/lib/onebusaway-sdk/models/agency_retrieve_response.rbi +6 -6
- data/rbi/lib/onebusaway-sdk/models/arrival_and_departure_list_params.rbi +5 -2
- data/rbi/lib/onebusaway-sdk/models/arrival_and_departure_list_response.rbi +95 -14
- data/rbi/lib/onebusaway-sdk/models/arrival_and_departure_retrieve_params.rbi +2 -9
- data/rbi/lib/onebusaway-sdk/models/arrival_and_departure_retrieve_response.rbi +93 -12
- data/rbi/lib/onebusaway-sdk/models/block_retrieve_params.rbi +5 -2
- data/rbi/lib/onebusaway-sdk/models/block_retrieve_response.rbi +14 -20
- data/rbi/lib/onebusaway-sdk/models/config_retrieve_params.rbi +5 -2
- data/rbi/lib/onebusaway-sdk/models/config_retrieve_response.rbi +8 -14
- data/rbi/lib/onebusaway-sdk/models/current_time_retrieve_params.rbi +5 -2
- data/rbi/lib/onebusaway-sdk/models/current_time_retrieve_response.rbi +6 -6
- data/rbi/lib/onebusaway-sdk/models/references.rbi +60 -43
- data/rbi/lib/onebusaway-sdk/models/report_problem_with_stop_retrieve_params.rbi +10 -6
- data/rbi/lib/onebusaway-sdk/models/report_problem_with_trip_retrieve_params.rbi +15 -6
- data/rbi/lib/onebusaway-sdk/models/response_wrapper.rbi +4 -2
- data/rbi/lib/onebusaway-sdk/models/route_ids_for_agency_list_params.rbi +5 -2
- data/rbi/lib/onebusaway-sdk/models/route_ids_for_agency_list_response.rbi +4 -4
- data/rbi/lib/onebusaway-sdk/models/route_retrieve_params.rbi +5 -2
- data/rbi/lib/onebusaway-sdk/models/route_retrieve_response.rbi +6 -6
- data/rbi/lib/onebusaway-sdk/models/routes_for_agency_list_params.rbi +5 -2
- data/rbi/lib/onebusaway-sdk/models/routes_for_agency_list_response.rbi +6 -6
- data/rbi/lib/onebusaway-sdk/models/routes_for_location_list_params.rbi +2 -2
- data/rbi/lib/onebusaway-sdk/models/routes_for_location_list_response.rbi +6 -6
- data/rbi/lib/onebusaway-sdk/models/schedule_for_route_retrieve_params.rbi +5 -8
- data/rbi/lib/onebusaway-sdk/models/schedule_for_route_retrieve_response.rbi +19 -16
- data/rbi/lib/onebusaway-sdk/models/schedule_for_stop_retrieve_params.rbi +5 -8
- data/rbi/lib/onebusaway-sdk/models/schedule_for_stop_retrieve_response.rbi +14 -14
- data/rbi/lib/onebusaway-sdk/models/search_for_route_list_params.rbi +4 -2
- data/rbi/lib/onebusaway-sdk/models/search_for_route_list_response.rbi +6 -6
- data/rbi/lib/onebusaway-sdk/models/search_for_stop_list_params.rbi +4 -2
- data/rbi/lib/onebusaway-sdk/models/search_for_stop_list_response.rbi +6 -6
- data/rbi/lib/onebusaway-sdk/models/shape_retrieve_params.rbi +5 -2
- data/rbi/lib/onebusaway-sdk/models/shape_retrieve_response.rbi +7 -6
- data/rbi/lib/onebusaway-sdk/models/stop_ids_for_agency_list_params.rbi +5 -2
- data/rbi/lib/onebusaway-sdk/models/stop_ids_for_agency_list_response.rbi +4 -4
- data/rbi/lib/onebusaway-sdk/models/stop_retrieve_params.rbi +5 -2
- data/rbi/lib/onebusaway-sdk/models/stop_retrieve_response.rbi +6 -6
- data/rbi/lib/onebusaway-sdk/models/stops_for_agency_list_params.rbi +5 -2
- data/rbi/lib/onebusaway-sdk/models/stops_for_agency_list_response.rbi +4 -4
- data/rbi/lib/onebusaway-sdk/models/stops_for_location_list_params.rbi +6 -2
- data/rbi/lib/onebusaway-sdk/models/stops_for_location_list_response.rbi +6 -6
- data/rbi/lib/onebusaway-sdk/models/stops_for_route_list_params.rbi +4 -2
- data/rbi/lib/onebusaway-sdk/models/stops_for_route_list_response.rbi +14 -14
- data/rbi/lib/onebusaway-sdk/models/trip_detail_retrieve_params.rbi +10 -2
- data/rbi/lib/onebusaway-sdk/models/trip_detail_retrieve_response.rbi +54 -23
- data/rbi/lib/onebusaway-sdk/models/trip_for_vehicle_retrieve_params.rbi +9 -8
- data/rbi/lib/onebusaway-sdk/models/trip_for_vehicle_retrieve_response.rbi +54 -23
- data/rbi/lib/onebusaway-sdk/models/trip_retrieve_params.rbi +5 -2
- data/rbi/lib/onebusaway-sdk/models/trip_retrieve_response.rbi +6 -6
- data/rbi/lib/onebusaway-sdk/models/trips_for_location_list_params.rbi +12 -12
- data/rbi/lib/onebusaway-sdk/models/trips_for_location_list_response.rbi +56 -16
- data/rbi/lib/onebusaway-sdk/models/trips_for_route_list_params.rbi +6 -2
- data/rbi/lib/onebusaway-sdk/models/trips_for_route_list_response.rbi +54 -16
- data/rbi/lib/onebusaway-sdk/models/vehicles_for_agency_list_params.rbi +3 -2
- data/rbi/lib/onebusaway-sdk/models/vehicles_for_agency_list_response.rbi +52 -14
- data/rbi/lib/onebusaway-sdk/pooled_net_requester.rbi +28 -13
- data/rbi/lib/onebusaway-sdk/request_options.rbi +25 -2
- data/rbi/lib/onebusaway-sdk/resources/agencies_with_coverage.rbi +4 -2
- data/rbi/lib/onebusaway-sdk/resources/agency.rbi +8 -3
- data/rbi/lib/onebusaway-sdk/resources/arrival_and_departure.rbi +14 -3
- data/rbi/lib/onebusaway-sdk/resources/block.rbi +8 -3
- data/rbi/lib/onebusaway-sdk/resources/config.rbi +3 -2
- data/rbi/lib/onebusaway-sdk/resources/current_time.rbi +3 -2
- data/rbi/lib/onebusaway-sdk/resources/report_problem_with_stop.rbi +9 -2
- data/rbi/lib/onebusaway-sdk/resources/report_problem_with_trip.rbi +14 -2
- data/rbi/lib/onebusaway-sdk/resources/route.rbi +8 -3
- data/rbi/lib/onebusaway-sdk/resources/route_ids_for_agency.rbi +8 -3
- data/rbi/lib/onebusaway-sdk/resources/routes_for_agency.rbi +8 -3
- data/rbi/lib/onebusaway-sdk/resources/routes_for_location.rbi +3 -2
- data/rbi/lib/onebusaway-sdk/resources/schedule_for_route.rbi +11 -3
- data/rbi/lib/onebusaway-sdk/resources/schedule_for_stop.rbi +11 -3
- data/rbi/lib/onebusaway-sdk/resources/search_for_route.rbi +10 -3
- data/rbi/lib/onebusaway-sdk/resources/search_for_stop.rbi +10 -3
- data/rbi/lib/onebusaway-sdk/resources/shape.rbi +8 -3
- data/rbi/lib/onebusaway-sdk/resources/stop.rbi +8 -3
- data/rbi/lib/onebusaway-sdk/resources/stop_ids_for_agency.rbi +8 -3
- data/rbi/lib/onebusaway-sdk/resources/stops_for_agency.rbi +8 -3
- data/rbi/lib/onebusaway-sdk/resources/stops_for_location.rbi +16 -3
- data/rbi/lib/onebusaway-sdk/resources/stops_for_route.rbi +12 -3
- data/rbi/lib/onebusaway-sdk/resources/trip.rbi +8 -3
- data/rbi/lib/onebusaway-sdk/resources/trip_details.rbi +12 -2
- data/rbi/lib/onebusaway-sdk/resources/trip_for_vehicle.rbi +11 -2
- data/rbi/lib/onebusaway-sdk/resources/trips_for_location.rbi +12 -2
- data/rbi/lib/onebusaway-sdk/resources/trips_for_route.rbi +15 -3
- data/rbi/lib/onebusaway-sdk/resources/vehicles_for_agency.rbi +10 -3
- data/rbi/lib/onebusaway-sdk/util.rbi +214 -83
- data/rbi/lib/onebusaway-sdk/version.rbi +1 -1
- data/sig/onebusaway-sdk/base_client.rbs +9 -8
- data/sig/onebusaway-sdk/base_model.rbs +8 -6
- data/sig/onebusaway-sdk/base_page.rbs +1 -1
- data/sig/onebusaway-sdk/errors.rbs +6 -5
- data/sig/onebusaway-sdk/pooled_net_requester.rbs +11 -4
- data/sig/onebusaway-sdk/request_options.rbs +4 -0
- data/sig/onebusaway-sdk/util.rbs +46 -2
- data/sig/onebusaway-sdk/version.rbs +1 -1
- metadata +4 -4
@@ -1,41 +1,35 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module OnebusawaySDK
|
4
|
-
# @private
|
5
|
-
#
|
6
|
-
# @abstract
|
7
|
-
#
|
4
|
+
# @api private
|
8
5
|
module Converter
|
9
6
|
# rubocop:disable Lint/UnusedMethodArgument
|
10
7
|
|
11
|
-
# @private
|
8
|
+
# @api private
|
12
9
|
#
|
13
10
|
# @param value [Object]
|
14
11
|
#
|
15
12
|
# @return [Object]
|
16
|
-
#
|
17
13
|
def coerce(value) = value
|
18
14
|
|
19
|
-
# @private
|
15
|
+
# @api private
|
20
16
|
#
|
21
17
|
# @param value [Object]
|
22
18
|
#
|
23
19
|
# @return [Object]
|
24
|
-
#
|
25
20
|
def dump(value) = value
|
26
21
|
|
27
|
-
# @private
|
22
|
+
# @api private
|
28
23
|
#
|
29
24
|
# @param value [Object]
|
30
25
|
#
|
31
26
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
32
|
-
#
|
33
27
|
def try_strict_coerce(value) = (raise NotImplementedError)
|
34
28
|
|
35
29
|
# rubocop:enable Lint/UnusedMethodArgument
|
36
30
|
|
37
31
|
class << self
|
38
|
-
# @private
|
32
|
+
# @api private
|
39
33
|
#
|
40
34
|
# @param spec [Hash{Symbol=>Object}, Proc, OnebusawaySDK::Converter, Class] .
|
41
35
|
#
|
@@ -48,23 +42,22 @@ module OnebusawaySDK
|
|
48
42
|
# @option spec [Boolean] :"nil?"
|
49
43
|
#
|
50
44
|
# @return [Proc]
|
51
|
-
#
|
52
45
|
def type_info(spec)
|
53
46
|
case spec
|
54
47
|
in Hash
|
55
48
|
type_info(spec.slice(:const, :enum, :union).first&.last)
|
56
49
|
in Proc
|
57
50
|
spec
|
58
|
-
in OnebusawaySDK::Converter | Class
|
51
|
+
in OnebusawaySDK::Converter | Class | Symbol
|
59
52
|
-> { spec }
|
60
53
|
in true | false
|
61
54
|
-> { OnebusawaySDK::BooleanModel }
|
62
|
-
in NilClass |
|
55
|
+
in NilClass | Integer | Float
|
63
56
|
-> { spec.class }
|
64
57
|
end
|
65
58
|
end
|
66
59
|
|
67
|
-
# @private
|
60
|
+
# @api private
|
68
61
|
#
|
69
62
|
# Based on `target`, transform `value` into `target`, to the extent possible:
|
70
63
|
#
|
@@ -77,11 +70,17 @@ module OnebusawaySDK
|
|
77
70
|
# @param value [Object]
|
78
71
|
#
|
79
72
|
# @return [Object]
|
80
|
-
#
|
81
73
|
def coerce(target, value)
|
82
74
|
case target
|
83
75
|
in OnebusawaySDK::Converter
|
84
76
|
target.coerce(value)
|
77
|
+
in Symbol
|
78
|
+
case value
|
79
|
+
in Symbol | String if (val = value.to_sym) == target
|
80
|
+
val
|
81
|
+
else
|
82
|
+
value
|
83
|
+
end
|
85
84
|
in Class
|
86
85
|
case target
|
87
86
|
in -> { _1 <= NilClass }
|
@@ -104,13 +103,12 @@ module OnebusawaySDK
|
|
104
103
|
end
|
105
104
|
end
|
106
105
|
|
107
|
-
# @private
|
106
|
+
# @api private
|
108
107
|
#
|
109
108
|
# @param target [OnebusawaySDK::Converter, Class]
|
110
109
|
# @param value [Object]
|
111
110
|
#
|
112
111
|
# @return [Object]
|
113
|
-
#
|
114
112
|
def dump(target, value)
|
115
113
|
case target
|
116
114
|
in OnebusawaySDK::Converter
|
@@ -120,7 +118,7 @@ module OnebusawaySDK
|
|
120
118
|
end
|
121
119
|
end
|
122
120
|
|
123
|
-
# @private
|
121
|
+
# @api private
|
124
122
|
#
|
125
123
|
# The underlying algorithm for computing maximal compatibility is subject to
|
126
124
|
# future improvements.
|
@@ -135,11 +133,17 @@ module OnebusawaySDK
|
|
135
133
|
# @param value [Object]
|
136
134
|
#
|
137
135
|
# @return [Object]
|
138
|
-
#
|
139
136
|
def try_strict_coerce(target, value)
|
140
137
|
case target
|
141
138
|
in OnebusawaySDK::Converter
|
142
139
|
target.try_strict_coerce(value)
|
140
|
+
in Symbol
|
141
|
+
case value
|
142
|
+
in Symbol | String if (val = value.to_sym) == target
|
143
|
+
[true, val, 1]
|
144
|
+
else
|
145
|
+
[false, false, 0]
|
146
|
+
end
|
143
147
|
in Class
|
144
148
|
case [target, value]
|
145
149
|
in [-> { _1 <= NilClass }, _]
|
@@ -155,7 +159,7 @@ module OnebusawaySDK
|
|
155
159
|
in [-> { _1 <= Date || _1 <= Time }, String]
|
156
160
|
Kernel.then do
|
157
161
|
[true, target.parse(value), 1]
|
158
|
-
rescue ArgumentError
|
162
|
+
rescue ArgumentError
|
159
163
|
[false, false, 0]
|
160
164
|
end
|
161
165
|
in [_, ^target]
|
@@ -168,7 +172,7 @@ module OnebusawaySDK
|
|
168
172
|
end
|
169
173
|
end
|
170
174
|
|
171
|
-
# @private
|
175
|
+
# @api private
|
172
176
|
#
|
173
177
|
# @abstract
|
174
178
|
#
|
@@ -183,48 +187,45 @@ module OnebusawaySDK
|
|
183
187
|
# @param other [Object]
|
184
188
|
#
|
185
189
|
# @return [Boolean]
|
186
|
-
#
|
187
190
|
def self.===(other) = true
|
188
191
|
|
189
192
|
# @param other [Object]
|
190
193
|
#
|
191
194
|
# @return [Boolean]
|
192
|
-
#
|
193
195
|
def self.==(other) = other.is_a?(Class) && other <= OnebusawaySDK::Unknown
|
194
196
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
[false, true, 0]
|
197
|
+
class << self
|
198
|
+
# @!parse
|
199
|
+
# # @api private
|
200
|
+
# #
|
201
|
+
# # @param value [Object]
|
202
|
+
# #
|
203
|
+
# # @return [Object]
|
204
|
+
# def coerce(value) = super
|
205
|
+
|
206
|
+
# @!parse
|
207
|
+
# # @api private
|
208
|
+
# #
|
209
|
+
# # @param value [Object]
|
210
|
+
# #
|
211
|
+
# # @return [Object]
|
212
|
+
# def dump(value) = super
|
213
|
+
|
214
|
+
# @api private
|
215
|
+
#
|
216
|
+
# @param value [Object]
|
217
|
+
#
|
218
|
+
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
219
|
+
def try_strict_coerce(value)
|
220
|
+
# prevent unknown variant from being chosen during the first coercion pass
|
221
|
+
[false, true, 0]
|
222
|
+
end
|
222
223
|
end
|
223
224
|
|
224
225
|
# rubocop:enable Lint/UnusedMethodArgument
|
225
226
|
end
|
226
227
|
|
227
|
-
# @private
|
228
|
+
# @api private
|
228
229
|
#
|
229
230
|
# @abstract
|
230
231
|
#
|
@@ -237,50 +238,47 @@ module OnebusawaySDK
|
|
237
238
|
# @param other [Object]
|
238
239
|
#
|
239
240
|
# @return [Boolean]
|
240
|
-
#
|
241
241
|
def self.===(other) = other == true || other == false
|
242
242
|
|
243
243
|
# @param other [Object]
|
244
244
|
#
|
245
245
|
# @return [Boolean]
|
246
|
-
#
|
247
246
|
def self.==(other) = other.is_a?(Class) && other <= OnebusawaySDK::BooleanModel
|
248
247
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
[false, false, 0]
|
248
|
+
class << self
|
249
|
+
# @!parse
|
250
|
+
# # @api private
|
251
|
+
# #
|
252
|
+
# # @param value [Boolean, Object]
|
253
|
+
# #
|
254
|
+
# # @return [Boolean, Object]
|
255
|
+
# def coerce(value) = super
|
256
|
+
|
257
|
+
# @!parse
|
258
|
+
# # @api private
|
259
|
+
# #
|
260
|
+
# # @param value [Boolean, Object]
|
261
|
+
# #
|
262
|
+
# # @return [Boolean, Object]
|
263
|
+
# def dump(value) = super
|
264
|
+
|
265
|
+
# @api private
|
266
|
+
#
|
267
|
+
# @param value [Object]
|
268
|
+
#
|
269
|
+
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
270
|
+
def try_strict_coerce(value)
|
271
|
+
case value
|
272
|
+
in true | false
|
273
|
+
[true, value, 1]
|
274
|
+
else
|
275
|
+
[false, false, 0]
|
276
|
+
end
|
279
277
|
end
|
280
278
|
end
|
281
279
|
end
|
282
280
|
|
283
|
-
# @private
|
281
|
+
# @api private
|
284
282
|
#
|
285
283
|
# @abstract
|
286
284
|
#
|
@@ -297,161 +295,164 @@ module OnebusawaySDK
|
|
297
295
|
class Enum
|
298
296
|
extend OnebusawaySDK::Converter
|
299
297
|
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
298
|
+
class << self
|
299
|
+
# All of the valid Symbol values for this enum.
|
300
|
+
#
|
301
|
+
# @return [Array<NilClass, Boolean, Integer, Float, Symbol>]
|
302
|
+
def values = (@values ||= constants.map { const_get(_1) })
|
305
303
|
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
304
|
+
# @api private
|
305
|
+
#
|
306
|
+
# Guard against thread safety issues by instantiating `@values`.
|
307
|
+
private def finalize! = values
|
308
|
+
end
|
311
309
|
|
312
310
|
private_class_method :new
|
313
311
|
|
314
312
|
# @param other [Object]
|
315
313
|
#
|
316
314
|
# @return [Boolean]
|
317
|
-
#
|
318
315
|
def self.===(other) = values.include?(other)
|
319
316
|
|
320
317
|
# @param other [Object]
|
321
318
|
#
|
322
319
|
# @return [Boolean]
|
323
|
-
#
|
324
320
|
def self.==(other)
|
325
321
|
other.is_a?(Class) && other <= OnebusawaySDK::Enum && other.values.to_set == values.to_set
|
326
322
|
end
|
327
323
|
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
# #
|
343
|
-
# def self.dump(value) = super
|
344
|
-
|
345
|
-
# @private
|
346
|
-
#
|
347
|
-
# @param value [Object]
|
348
|
-
#
|
349
|
-
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
350
|
-
#
|
351
|
-
def self.try_strict_coerce(value)
|
352
|
-
return [true, value, 1] if values.include?(value)
|
324
|
+
class << self
|
325
|
+
# @api private
|
326
|
+
#
|
327
|
+
# @param value [String, Symbol, Object]
|
328
|
+
#
|
329
|
+
# @return [Symbol, Object]
|
330
|
+
def coerce(value)
|
331
|
+
case value
|
332
|
+
in Symbol | String if values.include?(val = value.to_sym)
|
333
|
+
val
|
334
|
+
else
|
335
|
+
value
|
336
|
+
end
|
337
|
+
end
|
353
338
|
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
339
|
+
# @!parse
|
340
|
+
# # @api private
|
341
|
+
# #
|
342
|
+
# # @param value [Symbol, Object]
|
343
|
+
# #
|
344
|
+
# # @return [Symbol, Object]
|
345
|
+
# def dump(value) = super
|
346
|
+
|
347
|
+
# @api private
|
348
|
+
#
|
349
|
+
# @param value [Object]
|
350
|
+
#
|
351
|
+
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
352
|
+
def try_strict_coerce(value)
|
353
|
+
return [true, value, 1] if values.include?(value)
|
354
|
+
|
355
|
+
case value
|
356
|
+
in Symbol | String if values.include?(val = value.to_sym)
|
357
|
+
[true, val, 1]
|
361
358
|
else
|
362
|
-
[
|
359
|
+
case [value, values.first]
|
360
|
+
in [true | false, true | false] | [Integer, Integer] | [Symbol | String, Symbol]
|
361
|
+
[false, true, 0]
|
362
|
+
else
|
363
|
+
[false, false, 0]
|
364
|
+
end
|
363
365
|
end
|
364
366
|
end
|
365
367
|
end
|
366
368
|
end
|
367
369
|
|
368
|
-
# @private
|
370
|
+
# @api private
|
369
371
|
#
|
370
372
|
# @abstract
|
371
|
-
#
|
372
373
|
class Union
|
373
374
|
extend OnebusawaySDK::Converter
|
374
375
|
|
375
|
-
# @private
|
376
|
-
#
|
377
|
-
# All of the specified variant info for this union.
|
378
|
-
#
|
379
|
-
# @return [Array<Array(Symbol, Proc)>]
|
380
|
-
#
|
381
|
-
private_class_method def self.known_variants = (@known_variants ||= [])
|
382
|
-
|
383
376
|
class << self
|
384
|
-
# @private
|
377
|
+
# @api private
|
385
378
|
#
|
386
|
-
# All of the specified
|
379
|
+
# All of the specified variant info for this union.
|
387
380
|
#
|
388
|
-
# @return [Array<Array(Symbol,
|
381
|
+
# @return [Array<Array(Symbol, Proc)>]
|
382
|
+
private def known_variants = (@known_variants ||= [])
|
383
|
+
|
384
|
+
# @api private
|
389
385
|
#
|
390
|
-
|
386
|
+
# @return [Array<Array(Symbol, Object)>]
|
387
|
+
protected def derefed_variants
|
391
388
|
@known_variants.map { |key, variant_fn| [key, variant_fn.call] }
|
392
389
|
end
|
393
|
-
end
|
394
390
|
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
case property
|
401
|
-
in Symbol
|
402
|
-
@discriminator = property
|
391
|
+
# All of the specified variants for this union.
|
392
|
+
#
|
393
|
+
# @return [Array<Object>]
|
394
|
+
def variants
|
395
|
+
derefed_variants.map(&:last)
|
403
396
|
end
|
404
|
-
end
|
405
397
|
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
#
|
412
|
-
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
413
|
-
#
|
414
|
-
# @option spec [Proc] :enum
|
415
|
-
#
|
416
|
-
# @option spec [Proc] :union
|
417
|
-
#
|
418
|
-
# @option spec [Boolean] :"nil?"
|
419
|
-
#
|
420
|
-
private_class_method def self.variant(key, spec = nil)
|
421
|
-
variant_info =
|
422
|
-
case key
|
398
|
+
# @api private
|
399
|
+
#
|
400
|
+
# @param property [Symbol]
|
401
|
+
private def discriminator(property)
|
402
|
+
case property
|
423
403
|
in Symbol
|
424
|
-
|
425
|
-
in Proc | OnebusawaySDK::Converter | Class | Hash
|
426
|
-
[nil, OnebusawaySDK::Converter.type_info(key)]
|
404
|
+
@discriminator = property
|
427
405
|
end
|
406
|
+
end
|
428
407
|
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
408
|
+
# @api private
|
409
|
+
#
|
410
|
+
# @param key [Symbol, Hash{Symbol=>Object}, Proc, OnebusawaySDK::Converter, Class]
|
411
|
+
#
|
412
|
+
# @param spec [Hash{Symbol=>Object}, Proc, OnebusawaySDK::Converter, Class] .
|
413
|
+
#
|
414
|
+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
415
|
+
#
|
416
|
+
# @option spec [Proc] :enum
|
417
|
+
#
|
418
|
+
# @option spec [Proc] :union
|
419
|
+
#
|
420
|
+
# @option spec [Boolean] :"nil?"
|
421
|
+
private def variant(key, spec = nil)
|
422
|
+
variant_info =
|
423
|
+
case key
|
424
|
+
in Symbol
|
425
|
+
[key, OnebusawaySDK::Converter.type_info(spec)]
|
426
|
+
in Proc | OnebusawaySDK::Converter | Class | Hash
|
427
|
+
[nil, OnebusawaySDK::Converter.type_info(key)]
|
448
428
|
end
|
449
429
|
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
430
|
+
known_variants << variant_info
|
431
|
+
end
|
432
|
+
|
433
|
+
# @api private
|
434
|
+
#
|
435
|
+
# @param value [Object]
|
436
|
+
#
|
437
|
+
# @return [OnebusawaySDK::Converter, Class, nil]
|
438
|
+
private def resolve_variant(value)
|
439
|
+
case [@discriminator, value]
|
440
|
+
in [_, OnebusawaySDK::BaseModel]
|
441
|
+
value.class
|
442
|
+
in [Symbol, Hash]
|
443
|
+
key =
|
444
|
+
if value.key?(@discriminator)
|
445
|
+
value.fetch(@discriminator)
|
446
|
+
elsif value.key?((discriminator = @discriminator.to_s))
|
447
|
+
value.fetch(discriminator)
|
448
|
+
end
|
449
|
+
|
450
|
+
key = key.to_sym if key.is_a?(String)
|
451
|
+
_, resolved = known_variants.find { |k,| k == key }
|
452
|
+
resolved.nil? ? OnebusawaySDK::Unknown : resolved.call
|
453
|
+
else
|
454
|
+
nil
|
455
|
+
end
|
455
456
|
end
|
456
457
|
end
|
457
458
|
|
@@ -463,7 +464,6 @@ module OnebusawaySDK
|
|
463
464
|
# @param other [Object]
|
464
465
|
#
|
465
466
|
# @return [Boolean]
|
466
|
-
#
|
467
467
|
def self.===(other)
|
468
468
|
known_variants.any? do |_, variant_fn|
|
469
469
|
variant_fn.call === other
|
@@ -473,99 +473,97 @@ module OnebusawaySDK
|
|
473
473
|
# @param other [Object]
|
474
474
|
#
|
475
475
|
# @return [Boolean]
|
476
|
-
#
|
477
476
|
def self.==(other)
|
478
|
-
other.is_a?(Class) && other <= OnebusawaySDK::Union && other.
|
477
|
+
other.is_a?(Class) && other <= OnebusawaySDK::Union && other.derefed_variants == derefed_variants
|
479
478
|
end
|
480
479
|
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
480
|
+
class << self
|
481
|
+
# @api private
|
482
|
+
#
|
483
|
+
# @param value [Object]
|
484
|
+
#
|
485
|
+
# @return [Object]
|
486
|
+
def coerce(value)
|
487
|
+
if (variant = resolve_variant(value))
|
488
|
+
return OnebusawaySDK::Converter.coerce(variant, value)
|
489
|
+
end
|
491
490
|
|
492
|
-
|
491
|
+
matches = []
|
493
492
|
|
494
|
-
|
495
|
-
|
493
|
+
known_variants.each do |_, variant_fn|
|
494
|
+
variant = variant_fn.call
|
496
495
|
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
496
|
+
case OnebusawaySDK::Converter.try_strict_coerce(variant, value)
|
497
|
+
in [true, coerced, _]
|
498
|
+
return coerced
|
499
|
+
in [false, true, score]
|
500
|
+
matches << [score, variant]
|
501
|
+
in [false, false, _]
|
502
|
+
nil
|
503
|
+
end
|
504
504
|
end
|
505
|
-
end
|
506
505
|
|
507
|
-
|
508
|
-
|
509
|
-
end
|
510
|
-
|
511
|
-
# @private
|
512
|
-
#
|
513
|
-
# @param value [Object]
|
514
|
-
#
|
515
|
-
# @return [Object]
|
516
|
-
#
|
517
|
-
def self.dump(value)
|
518
|
-
if (variant = resolve_variant(value))
|
519
|
-
return OnebusawaySDK::Converter.dump(variant, value)
|
506
|
+
_, variant = matches.sort! { _2.first <=> _1.first }.find { |score,| !score.zero? }
|
507
|
+
variant.nil? ? value : OnebusawaySDK::Converter.coerce(variant, value)
|
520
508
|
end
|
521
509
|
|
522
|
-
|
523
|
-
|
524
|
-
|
510
|
+
# @api private
|
511
|
+
#
|
512
|
+
# @param value [Object]
|
513
|
+
#
|
514
|
+
# @return [Object]
|
515
|
+
def dump(value)
|
516
|
+
if (variant = resolve_variant(value))
|
525
517
|
return OnebusawaySDK::Converter.dump(variant, value)
|
526
518
|
end
|
527
|
-
end
|
528
|
-
value
|
529
|
-
end
|
530
519
|
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
# TODO(ruby) this will result in super linear decoding behaviour for nested unions
|
539
|
-
# follow up with a decoding context that captures current strictness levels
|
540
|
-
if (variant = resolve_variant(value))
|
541
|
-
return Converter.try_strict_coerce(variant, value)
|
520
|
+
known_variants.each do |_, variant_fn|
|
521
|
+
variant = variant_fn.call
|
522
|
+
if variant === value
|
523
|
+
return OnebusawaySDK::Converter.dump(variant, value)
|
524
|
+
end
|
525
|
+
end
|
526
|
+
value
|
542
527
|
end
|
543
528
|
|
544
|
-
|
545
|
-
|
529
|
+
# @api private
|
530
|
+
#
|
531
|
+
# @param value [Object]
|
532
|
+
#
|
533
|
+
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
534
|
+
def try_strict_coerce(value)
|
535
|
+
# TODO(ruby) this will result in super linear decoding behaviour for nested unions
|
536
|
+
# follow up with a decoding context that captures current strictness levels
|
537
|
+
if (variant = resolve_variant(value))
|
538
|
+
return Converter.try_strict_coerce(variant, value)
|
539
|
+
end
|
540
|
+
|
541
|
+
coercible = false
|
542
|
+
max_score = 0
|
546
543
|
|
547
|
-
|
548
|
-
|
544
|
+
known_variants.each do |_, variant_fn|
|
545
|
+
variant = variant_fn.call
|
549
546
|
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
547
|
+
case OnebusawaySDK::Converter.try_strict_coerce(variant, value)
|
548
|
+
in [true, coerced, score]
|
549
|
+
return [true, coerced, score]
|
550
|
+
in [false, true, score]
|
551
|
+
coercible = true
|
552
|
+
max_score = [max_score, score].max
|
553
|
+
in [false, false, _]
|
554
|
+
nil
|
555
|
+
end
|
558
556
|
end
|
559
|
-
end
|
560
557
|
|
561
|
-
|
558
|
+
[false, coercible, max_score]
|
559
|
+
end
|
562
560
|
end
|
563
561
|
|
564
562
|
# rubocop:enable Style/CaseEquality
|
565
563
|
# rubocop:enable Style/HashEachMethods
|
566
564
|
end
|
567
565
|
|
568
|
-
# @private
|
566
|
+
# @api private
|
569
567
|
#
|
570
568
|
# @abstract
|
571
569
|
#
|
@@ -580,7 +578,6 @@ module OnebusawaySDK
|
|
580
578
|
# @param other [Object]
|
581
579
|
#
|
582
580
|
# @return [Boolean]
|
583
|
-
#
|
584
581
|
def ===(other)
|
585
582
|
type = item_type
|
586
583
|
case other
|
@@ -596,15 +593,13 @@ module OnebusawaySDK
|
|
596
593
|
# @param other [Object]
|
597
594
|
#
|
598
595
|
# @return [Boolean]
|
599
|
-
#
|
600
596
|
def ==(other) = other.is_a?(OnebusawaySDK::ArrayOf) && other.item_type == item_type
|
601
597
|
|
602
|
-
# @private
|
598
|
+
# @api private
|
603
599
|
#
|
604
600
|
# @param value [Enumerable, Object]
|
605
601
|
#
|
606
602
|
# @return [Array<Object>, Object]
|
607
|
-
#
|
608
603
|
def coerce(value)
|
609
604
|
type = item_type
|
610
605
|
case value
|
@@ -615,12 +610,11 @@ module OnebusawaySDK
|
|
615
610
|
end
|
616
611
|
end
|
617
612
|
|
618
|
-
# @private
|
613
|
+
# @api private
|
619
614
|
#
|
620
615
|
# @param value [Enumerable, Object]
|
621
616
|
#
|
622
617
|
# @return [Array<Object>, Object]
|
623
|
-
#
|
624
618
|
def dump(value)
|
625
619
|
type = item_type
|
626
620
|
case value
|
@@ -631,12 +625,11 @@ module OnebusawaySDK
|
|
631
625
|
end
|
632
626
|
end
|
633
627
|
|
634
|
-
# @private
|
628
|
+
# @api private
|
635
629
|
#
|
636
630
|
# @param value [Object]
|
637
631
|
#
|
638
632
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
639
|
-
#
|
640
633
|
def try_strict_coerce(value)
|
641
634
|
case value
|
642
635
|
in Array
|
@@ -670,13 +663,12 @@ module OnebusawaySDK
|
|
670
663
|
end
|
671
664
|
end
|
672
665
|
|
673
|
-
# @private
|
666
|
+
# @api private
|
674
667
|
#
|
675
668
|
# @return [OnebusawaySDK::Converter, Class]
|
676
|
-
#
|
677
669
|
protected def item_type = @item_type_fn.call
|
678
670
|
|
679
|
-
# @private
|
671
|
+
# @api private
|
680
672
|
#
|
681
673
|
# @param type_info [Hash{Symbol=>Object}, Proc, OnebusawaySDK::Converter, Class]
|
682
674
|
#
|
@@ -689,13 +681,12 @@ module OnebusawaySDK
|
|
689
681
|
# @option spec [Proc] :union
|
690
682
|
#
|
691
683
|
# @option spec [Boolean] :"nil?"
|
692
|
-
#
|
693
684
|
def initialize(type_info, spec = {})
|
694
685
|
@item_type_fn = OnebusawaySDK::Converter.type_info(type_info || spec)
|
695
686
|
end
|
696
687
|
end
|
697
688
|
|
698
|
-
# @private
|
689
|
+
# @api private
|
699
690
|
#
|
700
691
|
# @abstract
|
701
692
|
#
|
@@ -710,7 +701,6 @@ module OnebusawaySDK
|
|
710
701
|
# @param other [Object]
|
711
702
|
#
|
712
703
|
# @return [Boolean]
|
713
|
-
#
|
714
704
|
def ===(other)
|
715
705
|
type = item_type
|
716
706
|
case other
|
@@ -731,15 +721,13 @@ module OnebusawaySDK
|
|
731
721
|
# @param other [Object]
|
732
722
|
#
|
733
723
|
# @return [Boolean]
|
734
|
-
#
|
735
724
|
def ==(other) = other.is_a?(OnebusawaySDK::HashOf) && other.item_type == item_type
|
736
725
|
|
737
|
-
# @private
|
726
|
+
# @api private
|
738
727
|
#
|
739
728
|
# @param value [Hash{Object=>Object}, Object]
|
740
729
|
#
|
741
730
|
# @return [Hash{Symbol=>Object}, Object]
|
742
|
-
#
|
743
731
|
def coerce(value)
|
744
732
|
type = item_type
|
745
733
|
case value
|
@@ -753,12 +741,11 @@ module OnebusawaySDK
|
|
753
741
|
end
|
754
742
|
end
|
755
743
|
|
756
|
-
# @private
|
744
|
+
# @api private
|
757
745
|
#
|
758
746
|
# @param value [Hash{Object=>Object}, Object]
|
759
747
|
#
|
760
748
|
# @return [Hash{Symbol=>Object}, Object]
|
761
|
-
#
|
762
749
|
def dump(value)
|
763
750
|
type = item_type
|
764
751
|
case value
|
@@ -771,12 +758,11 @@ module OnebusawaySDK
|
|
771
758
|
end
|
772
759
|
end
|
773
760
|
|
774
|
-
# @private
|
761
|
+
# @api private
|
775
762
|
#
|
776
763
|
# @param value [Object]
|
777
764
|
#
|
778
765
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
779
|
-
#
|
780
766
|
def try_strict_coerce(value)
|
781
767
|
case value
|
782
768
|
in Hash
|
@@ -810,13 +796,12 @@ module OnebusawaySDK
|
|
810
796
|
end
|
811
797
|
end
|
812
798
|
|
813
|
-
# @private
|
799
|
+
# @api private
|
814
800
|
#
|
815
801
|
# @return [OnebusawaySDK::Converter, Class]
|
816
|
-
#
|
817
802
|
protected def item_type = @item_type_fn.call
|
818
803
|
|
819
|
-
# @private
|
804
|
+
# @api private
|
820
805
|
#
|
821
806
|
# @param type_info [Hash{Symbol=>Object}, Proc, OnebusawaySDK::Converter, Class]
|
822
807
|
#
|
@@ -829,175 +814,172 @@ module OnebusawaySDK
|
|
829
814
|
# @option spec [Proc] :union
|
830
815
|
#
|
831
816
|
# @option spec [Boolean] :"nil?"
|
832
|
-
#
|
833
817
|
def initialize(type_info, spec = {})
|
834
818
|
@item_type_fn = OnebusawaySDK::Converter.type_info(type_info || spec)
|
835
819
|
end
|
836
820
|
end
|
837
821
|
|
838
|
-
# @private
|
839
|
-
#
|
840
822
|
# @abstract
|
841
823
|
#
|
824
|
+
# @example
|
825
|
+
# ```ruby
|
826
|
+
# # `references` is a `OnebusawaySDK::Models::References`
|
827
|
+
# references => {
|
828
|
+
# agencies: agencies,
|
829
|
+
# routes: routes,
|
830
|
+
# situations: situations
|
831
|
+
# }
|
832
|
+
# ```
|
842
833
|
class BaseModel
|
843
834
|
extend OnebusawaySDK::Converter
|
844
835
|
|
845
|
-
# @private
|
846
|
-
#
|
847
|
-
# Assumes superclass fields are totally defined before fields are accessed /
|
848
|
-
# defined on subclasses.
|
849
|
-
#
|
850
|
-
# @return [Hash{Symbol=>Hash{Symbol=>Object}}]
|
851
|
-
#
|
852
|
-
def self.known_fields
|
853
|
-
@known_fields ||= (self < OnebusawaySDK::BaseModel ? superclass.known_fields.dup : {})
|
854
|
-
end
|
855
|
-
|
856
836
|
class << self
|
857
|
-
# @private
|
837
|
+
# @api private
|
838
|
+
#
|
839
|
+
# Assumes superclass fields are totally defined before fields are accessed /
|
840
|
+
# defined on subclasses.
|
858
841
|
#
|
859
842
|
# @return [Hash{Symbol=>Hash{Symbol=>Object}}]
|
843
|
+
def known_fields
|
844
|
+
@known_fields ||= (self < OnebusawaySDK::BaseModel ? superclass.known_fields.dup : {})
|
845
|
+
end
|
846
|
+
|
847
|
+
# @api private
|
860
848
|
#
|
849
|
+
# @return [Hash{Symbol=>Hash{Symbol=>Object}}]
|
861
850
|
def fields
|
862
851
|
known_fields.transform_values do |field|
|
863
852
|
{**field.except(:type_fn), type: field.fetch(:type_fn).call}
|
864
853
|
end
|
865
854
|
end
|
866
|
-
end
|
867
855
|
|
868
|
-
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
def self.defaults = (@defaults ||= {})
|
856
|
+
# @api private
|
857
|
+
#
|
858
|
+
# @return [Hash{Symbol=>Proc}]
|
859
|
+
def defaults = (@defaults ||= {})
|
873
860
|
|
874
|
-
|
875
|
-
|
876
|
-
|
877
|
-
|
878
|
-
|
879
|
-
|
880
|
-
|
881
|
-
|
882
|
-
|
883
|
-
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
end
|
861
|
+
# @api private
|
862
|
+
#
|
863
|
+
# @param name_sym [Symbol]
|
864
|
+
#
|
865
|
+
# @param required [Boolean]
|
866
|
+
#
|
867
|
+
# @param type_info [Hash{Symbol=>Object}, Proc, OnebusawaySDK::Converter, Class]
|
868
|
+
#
|
869
|
+
# @param spec [Hash{Symbol=>Object}] .
|
870
|
+
#
|
871
|
+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
872
|
+
#
|
873
|
+
# @option spec [Proc] :enum
|
874
|
+
#
|
875
|
+
# @option spec [Proc] :union
|
876
|
+
#
|
877
|
+
# @option spec [Boolean] :"nil?"
|
878
|
+
private def add_field(name_sym, required:, type_info:, spec:)
|
879
|
+
type_fn, info =
|
880
|
+
case type_info
|
881
|
+
in Proc | Class | OnebusawaySDK::Converter
|
882
|
+
[OnebusawaySDK::Converter.type_info({**spec, union: type_info}), spec]
|
883
|
+
in Hash
|
884
|
+
[OnebusawaySDK::Converter.type_info(type_info), type_info]
|
885
|
+
end
|
900
886
|
|
901
|
-
|
902
|
-
|
887
|
+
fallback = info[:const]
|
888
|
+
defaults[name_sym] = fallback if required && !info[:nil?] && info.key?(:const)
|
903
889
|
|
904
|
-
|
905
|
-
|
890
|
+
key = info.fetch(:api_name, name_sym)
|
891
|
+
setter = "#{name_sym}="
|
906
892
|
|
907
|
-
|
908
|
-
|
909
|
-
|
893
|
+
if known_fields.key?(name_sym)
|
894
|
+
[name_sym, setter].each { undef_method(_1) }
|
895
|
+
end
|
910
896
|
|
911
|
-
|
897
|
+
known_fields[name_sym] = {mode: @mode, key: key, required: required, type_fn: type_fn}
|
912
898
|
|
913
|
-
|
914
|
-
|
915
|
-
|
899
|
+
define_method(setter) do |val|
|
900
|
+
@data[key] = val
|
901
|
+
end
|
916
902
|
|
917
|
-
|
918
|
-
|
919
|
-
|
920
|
-
|
921
|
-
|
922
|
-
|
923
|
-
|
924
|
-
|
925
|
-
|
926
|
-
|
903
|
+
define_method(name_sym) do
|
904
|
+
field_type = type_fn.call
|
905
|
+
value = @data.fetch(key) { self.class.defaults[key] }
|
906
|
+
OnebusawaySDK::Converter.coerce(field_type, value)
|
907
|
+
rescue StandardError
|
908
|
+
name = self.class.name.split("::").last
|
909
|
+
raise OnebusawaySDK::ConversionError.new(
|
910
|
+
"Failed to parse #{name}.#{name_sym} as #{field_type.inspect}. " \
|
911
|
+
"To get the unparsed API response, use #{name}[:#{key}]."
|
912
|
+
)
|
913
|
+
end
|
927
914
|
end
|
928
|
-
end
|
929
915
|
|
930
|
-
|
931
|
-
|
932
|
-
|
933
|
-
|
934
|
-
|
935
|
-
|
936
|
-
|
937
|
-
|
938
|
-
|
939
|
-
|
940
|
-
|
941
|
-
|
942
|
-
|
943
|
-
|
944
|
-
|
945
|
-
|
946
|
-
|
947
|
-
|
948
|
-
end
|
916
|
+
# @api private
|
917
|
+
#
|
918
|
+
# @param name_sym [Symbol]
|
919
|
+
#
|
920
|
+
# @param type_info [Hash{Symbol=>Object}, Proc, OnebusawaySDK::Converter, Class]
|
921
|
+
#
|
922
|
+
# @param spec [Hash{Symbol=>Object}] .
|
923
|
+
#
|
924
|
+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
925
|
+
#
|
926
|
+
# @option spec [Proc] :enum
|
927
|
+
#
|
928
|
+
# @option spec [Proc] :union
|
929
|
+
#
|
930
|
+
# @option spec [Boolean] :"nil?"
|
931
|
+
def required(name_sym, type_info, spec = {})
|
932
|
+
add_field(name_sym, required: true, type_info: type_info, spec: spec)
|
933
|
+
end
|
949
934
|
|
950
|
-
|
951
|
-
|
952
|
-
|
953
|
-
|
954
|
-
|
955
|
-
|
956
|
-
|
957
|
-
|
958
|
-
|
959
|
-
|
960
|
-
|
961
|
-
|
962
|
-
|
963
|
-
|
964
|
-
|
965
|
-
|
966
|
-
|
967
|
-
|
968
|
-
end
|
935
|
+
# @api private
|
936
|
+
#
|
937
|
+
# @param name_sym [Symbol]
|
938
|
+
#
|
939
|
+
# @param type_info [Hash{Symbol=>Object}, Proc, OnebusawaySDK::Converter, Class]
|
940
|
+
#
|
941
|
+
# @param spec [Hash{Symbol=>Object}] .
|
942
|
+
#
|
943
|
+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
944
|
+
#
|
945
|
+
# @option spec [Proc] :enum
|
946
|
+
#
|
947
|
+
# @option spec [Proc] :union
|
948
|
+
#
|
949
|
+
# @option spec [Boolean] :"nil?"
|
950
|
+
def optional(name_sym, type_info, spec = {})
|
951
|
+
add_field(name_sym, required: false, type_info: type_info, spec: spec)
|
952
|
+
end
|
969
953
|
|
970
|
-
|
971
|
-
|
972
|
-
|
973
|
-
|
974
|
-
|
975
|
-
|
976
|
-
|
977
|
-
|
978
|
-
|
979
|
-
|
980
|
-
|
981
|
-
|
982
|
-
end
|
954
|
+
# @api private
|
955
|
+
#
|
956
|
+
# `request_only` attributes not excluded from `.#coerce` when receiving responses
|
957
|
+
# even if well behaved servers should not send them
|
958
|
+
#
|
959
|
+
# @param blk [Proc]
|
960
|
+
private def request_only(&blk)
|
961
|
+
@mode = :dump
|
962
|
+
blk.call
|
963
|
+
ensure
|
964
|
+
@mode = nil
|
965
|
+
end
|
983
966
|
|
984
|
-
|
985
|
-
|
986
|
-
|
987
|
-
|
988
|
-
|
989
|
-
|
990
|
-
|
991
|
-
|
992
|
-
|
993
|
-
|
994
|
-
|
967
|
+
# @api private
|
968
|
+
#
|
969
|
+
# `response_only` attributes are omitted from `.#dump` when making requests
|
970
|
+
#
|
971
|
+
# @param blk [Proc]
|
972
|
+
private def response_only(&blk)
|
973
|
+
@mode = :coerce
|
974
|
+
blk.call
|
975
|
+
ensure
|
976
|
+
@mode = nil
|
977
|
+
end
|
995
978
|
end
|
996
979
|
|
997
980
|
# @param other [Object]
|
998
981
|
#
|
999
982
|
# @return [Boolean]
|
1000
|
-
#
|
1001
983
|
def ==(other)
|
1002
984
|
case other
|
1003
985
|
in OnebusawaySDK::BaseModel
|
@@ -1007,108 +989,107 @@ module OnebusawaySDK
|
|
1007
989
|
end
|
1008
990
|
end
|
1009
991
|
|
1010
|
-
|
1011
|
-
|
1012
|
-
|
1013
|
-
|
1014
|
-
|
1015
|
-
|
1016
|
-
|
1017
|
-
|
1018
|
-
|
1019
|
-
|
1020
|
-
|
1021
|
-
|
992
|
+
class << self
|
993
|
+
# @api private
|
994
|
+
#
|
995
|
+
# @param value [OnebusawaySDK::BaseModel, Hash{Object=>Object}, Object]
|
996
|
+
#
|
997
|
+
# @return [OnebusawaySDK::BaseModel, Object]
|
998
|
+
def coerce(value)
|
999
|
+
case OnebusawaySDK::Util.coerce_hash(value)
|
1000
|
+
in Hash => coerced
|
1001
|
+
new(coerced)
|
1002
|
+
else
|
1003
|
+
value
|
1004
|
+
end
|
1022
1005
|
end
|
1023
|
-
end
|
1024
1006
|
|
1025
|
-
|
1026
|
-
|
1027
|
-
|
1028
|
-
|
1029
|
-
|
1030
|
-
|
1031
|
-
|
1032
|
-
|
1033
|
-
|
1034
|
-
end
|
1007
|
+
# @api private
|
1008
|
+
#
|
1009
|
+
# @param value [OnebusawaySDK::BaseModel, Object]
|
1010
|
+
#
|
1011
|
+
# @return [Hash{Object=>Object}, Object]
|
1012
|
+
def dump(value)
|
1013
|
+
unless (coerced = OnebusawaySDK::Util.coerce_hash(value)).is_a?(Hash)
|
1014
|
+
return value
|
1015
|
+
end
|
1035
1016
|
|
1036
|
-
|
1037
|
-
|
1038
|
-
|
1039
|
-
|
1040
|
-
|
1041
|
-
else
|
1042
|
-
mode, type_fn, api_name = field.fetch_values(:mode, :type_fn, :key)
|
1043
|
-
case mode
|
1044
|
-
in :coerce
|
1045
|
-
next
|
1017
|
+
values = coerced.filter_map do |key, val|
|
1018
|
+
name = key.to_sym
|
1019
|
+
case (field = known_fields[name])
|
1020
|
+
in nil
|
1021
|
+
[name, val]
|
1046
1022
|
else
|
1047
|
-
|
1048
|
-
|
1023
|
+
mode, type_fn, api_name = field.fetch_values(:mode, :type_fn, :key)
|
1024
|
+
case mode
|
1025
|
+
in :coerce
|
1026
|
+
next
|
1027
|
+
else
|
1028
|
+
target = type_fn.call
|
1029
|
+
[api_name, OnebusawaySDK::Converter.dump(target, val)]
|
1030
|
+
end
|
1049
1031
|
end
|
1050
|
-
end
|
1051
|
-
end.to_h
|
1032
|
+
end.to_h
|
1052
1033
|
|
1053
|
-
|
1054
|
-
|
1034
|
+
defaults.each do |key, val|
|
1035
|
+
next if values.key?(key)
|
1055
1036
|
|
1056
|
-
|
1057
|
-
|
1058
|
-
|
1059
|
-
values
|
1060
|
-
end
|
1037
|
+
values[key] = val
|
1038
|
+
end
|
1061
1039
|
|
1062
|
-
|
1063
|
-
#
|
1064
|
-
# @param value [Object]
|
1065
|
-
#
|
1066
|
-
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
1067
|
-
#
|
1068
|
-
def self.try_strict_coerce(value)
|
1069
|
-
case value
|
1070
|
-
in Hash | OnebusawaySDK::BaseModel
|
1071
|
-
value = value.to_h
|
1072
|
-
else
|
1073
|
-
return [false, false, 0]
|
1040
|
+
values
|
1074
1041
|
end
|
1075
1042
|
|
1076
|
-
|
1077
|
-
|
1078
|
-
|
1079
|
-
|
1043
|
+
# @api private
|
1044
|
+
#
|
1045
|
+
# @param value [Object]
|
1046
|
+
#
|
1047
|
+
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
1048
|
+
def try_strict_coerce(value)
|
1049
|
+
case value
|
1050
|
+
in Hash | OnebusawaySDK::BaseModel
|
1051
|
+
value = value.to_h
|
1052
|
+
else
|
1053
|
+
return [false, false, 0]
|
1054
|
+
end
|
1080
1055
|
|
1081
|
-
|
1082
|
-
|
1083
|
-
|
1056
|
+
keys = value.keys.to_set
|
1057
|
+
great_success = true
|
1058
|
+
tally = 0
|
1059
|
+
acc = {}
|
1084
1060
|
|
1085
|
-
|
1086
|
-
|
1087
|
-
|
1088
|
-
|
1089
|
-
case
|
1090
|
-
in [
|
1091
|
-
|
1092
|
-
|
1093
|
-
|
1061
|
+
known_fields.each_value do |field|
|
1062
|
+
mode, required, type_fn, api_name = field.fetch_values(:mode, :required, :type_fn, :key)
|
1063
|
+
keys.delete(api_name)
|
1064
|
+
|
1065
|
+
case [required && mode != :dump, value.key?(api_name)]
|
1066
|
+
in [_, true]
|
1067
|
+
target = type_fn.call
|
1068
|
+
item = value.fetch(api_name)
|
1069
|
+
case OnebusawaySDK::Converter.try_strict_coerce(target, item)
|
1070
|
+
in [true, coerced, score]
|
1071
|
+
tally += score
|
1072
|
+
acc[api_name] = coerced
|
1073
|
+
in [false, true, score]
|
1074
|
+
great_success = false
|
1075
|
+
tally += score
|
1076
|
+
acc[api_name] = item
|
1077
|
+
in [false, false, _]
|
1078
|
+
great_success &&= item.nil?
|
1079
|
+
end
|
1080
|
+
in [true, false]
|
1094
1081
|
great_success = false
|
1095
|
-
|
1096
|
-
|
1097
|
-
in [false, false, _]
|
1098
|
-
great_success &&= item.nil?
|
1082
|
+
in [false, false]
|
1083
|
+
nil
|
1099
1084
|
end
|
1100
|
-
in [true, false]
|
1101
|
-
great_success = false
|
1102
|
-
in [false, false]
|
1103
|
-
nil
|
1104
1085
|
end
|
1105
|
-
end
|
1106
1086
|
|
1107
|
-
|
1108
|
-
|
1109
|
-
|
1087
|
+
keys.each do |key|
|
1088
|
+
acc[key] = value.fetch(key)
|
1089
|
+
end
|
1110
1090
|
|
1111
|
-
|
1091
|
+
great_success ? [true, new(acc), tally] : [false, true, tally]
|
1092
|
+
end
|
1112
1093
|
end
|
1113
1094
|
|
1114
1095
|
# Returns the raw value associated with the given key, if found. Otherwise, nil is
|
@@ -1121,7 +1102,6 @@ module OnebusawaySDK
|
|
1121
1102
|
# @param key [Symbol]
|
1122
1103
|
#
|
1123
1104
|
# @return [Object, nil]
|
1124
|
-
#
|
1125
1105
|
def [](key)
|
1126
1106
|
unless key.instance_of?(Symbol)
|
1127
1107
|
raise ArgumentError.new("Expected symbol key for lookup, got #{key.inspect}")
|
@@ -1140,7 +1120,6 @@ module OnebusawaySDK
|
|
1140
1120
|
# should not be mutated.
|
1141
1121
|
#
|
1142
1122
|
# @return [Hash{Symbol=>Object}]
|
1143
|
-
#
|
1144
1123
|
def to_h = @data
|
1145
1124
|
|
1146
1125
|
alias_method :to_hash, :to_h
|
@@ -1148,7 +1127,6 @@ module OnebusawaySDK
|
|
1148
1127
|
# @param keys [Array<Symbol>, nil]
|
1149
1128
|
#
|
1150
1129
|
# @return [Hash{Symbol=>Object}]
|
1151
|
-
#
|
1152
1130
|
def deconstruct_keys(keys)
|
1153
1131
|
(keys || self.class.known_fields.keys).filter_map do |k|
|
1154
1132
|
unless self.class.known_fields.key?(k)
|
@@ -1163,7 +1141,6 @@ module OnebusawaySDK
|
|
1163
1141
|
# Create a new instance of a model.
|
1164
1142
|
#
|
1165
1143
|
# @param data [Hash{Symbol=>Object}, OnebusawaySDK::BaseModel]
|
1166
|
-
#
|
1167
1144
|
def initialize(data = {})
|
1168
1145
|
case OnebusawaySDK::Util.coerce_hash(data)
|
1169
1146
|
in Hash => coerced
|
@@ -1174,11 +1151,9 @@ module OnebusawaySDK
|
|
1174
1151
|
end
|
1175
1152
|
|
1176
1153
|
# @return [String]
|
1177
|
-
#
|
1178
1154
|
def to_s = @data.to_s
|
1179
1155
|
|
1180
1156
|
# @return [String]
|
1181
|
-
#
|
1182
1157
|
def inspect
|
1183
1158
|
"#<#{self.class.name}:0x#{object_id.to_s(16)} #{deconstruct_keys(nil).map do |k, v|
|
1184
1159
|
"#{k}=#{v.inspect}"
|