carbon_ruby_sdk 0.2.38 → 0.2.40

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.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +310 -2
  4. data/lib/carbon_ruby_sdk/api/github_api.rb +825 -0
  5. data/lib/carbon_ruby_sdk/models/comments_input.rb +330 -0
  6. data/lib/carbon_ruby_sdk/models/comments_order_by.rb +36 -0
  7. data/lib/carbon_ruby_sdk/models/comments_response.rb +232 -0
  8. data/lib/carbon_ruby_sdk/models/commit.rb +282 -0
  9. data/lib/carbon_ruby_sdk/models/commit_user.rb +234 -0
  10. data/lib/carbon_ruby_sdk/models/commit_user_nullable.rb +234 -0
  11. data/lib/carbon_ruby_sdk/models/commits_input.rb +307 -0
  12. data/lib/carbon_ruby_sdk/models/commits_response.rb +232 -0
  13. data/lib/carbon_ruby_sdk/models/file_status.rb +41 -0
  14. data/lib/carbon_ruby_sdk/models/files_input.rb +307 -0
  15. data/lib/carbon_ruby_sdk/models/files_response.rb +232 -0
  16. data/lib/carbon_ruby_sdk/models/head_or_base.rb +248 -0
  17. data/lib/carbon_ruby_sdk/models/issue.rb +434 -0
  18. data/lib/carbon_ruby_sdk/models/issue_pr.rb +230 -0
  19. data/lib/carbon_ruby_sdk/models/issue_pr_nullable.rb +230 -0
  20. data/lib/carbon_ruby_sdk/models/issues_filter.rb +217 -0
  21. data/lib/carbon_ruby_sdk/models/issues_input.rb +325 -0
  22. data/lib/carbon_ruby_sdk/models/issues_order_by.rb +37 -0
  23. data/lib/carbon_ruby_sdk/models/issues_response.rb +232 -0
  24. data/lib/carbon_ruby_sdk/models/label.rb +234 -0
  25. data/lib/carbon_ruby_sdk/models/organization_user_files_to_sync_filters.rb +29 -1
  26. data/lib/carbon_ruby_sdk/models/pr_comment.rb +358 -0
  27. data/lib/carbon_ruby_sdk/models/pr_commit.rb +264 -0
  28. data/lib/carbon_ruby_sdk/models/pr_file.rb +342 -0
  29. data/lib/carbon_ruby_sdk/models/pr_order_by.rb +37 -0
  30. data/lib/carbon_ruby_sdk/models/pr_state.rb +36 -0
  31. data/lib/carbon_ruby_sdk/models/pr_state_input.rb +37 -0
  32. data/lib/carbon_ruby_sdk/models/pull_request.rb +438 -0
  33. data/lib/carbon_ruby_sdk/models/pull_request_extended.rb +536 -0
  34. data/lib/carbon_ruby_sdk/models/pull_request_filters.rb +239 -0
  35. data/lib/carbon_ruby_sdk/models/pull_request_response.rb +232 -0
  36. data/lib/carbon_ruby_sdk/models/pull_requests_input.rb +325 -0
  37. data/lib/carbon_ruby_sdk/models/sent_webhook_payload.rb +2 -2
  38. data/lib/carbon_ruby_sdk/models/team.rb +234 -0
  39. data/lib/carbon_ruby_sdk/models/tree.rb +234 -0
  40. data/lib/carbon_ruby_sdk/models/user.rb +234 -0
  41. data/lib/carbon_ruby_sdk/models/user_file.rb +11 -1
  42. data/lib/carbon_ruby_sdk/models/user_nullable.rb +234 -0
  43. data/lib/carbon_ruby_sdk/version.rb +1 -1
  44. data/lib/carbon_ruby_sdk.rb +38 -0
  45. data/spec/api/github_api_spec.rb +112 -0
  46. data/spec/models/comments_input_spec.rb +76 -0
  47. data/spec/models/comments_order_by_spec.rb +22 -0
  48. data/spec/models/comments_response_spec.rb +34 -0
  49. data/spec/models/commit_spec.rb +58 -0
  50. data/spec/models/commit_user_nullable_spec.rb +34 -0
  51. data/spec/models/commit_user_spec.rb +34 -0
  52. data/spec/models/commits_input_spec.rb +64 -0
  53. data/spec/models/commits_response_spec.rb +34 -0
  54. data/spec/models/file_status_spec.rb +22 -0
  55. data/spec/models/files_input_spec.rb +64 -0
  56. data/spec/models/files_response_spec.rb +34 -0
  57. data/spec/models/head_or_base_spec.rb +40 -0
  58. data/spec/models/issue_pr_nullable_spec.rb +34 -0
  59. data/spec/models/issue_pr_spec.rb +34 -0
  60. data/spec/models/issue_spec.rb +124 -0
  61. data/spec/models/issues_filter_spec.rb +28 -0
  62. data/spec/models/issues_input_spec.rb +76 -0
  63. data/spec/models/issues_order_by_spec.rb +22 -0
  64. data/spec/models/issues_response_spec.rb +34 -0
  65. data/spec/models/label_spec.rb +34 -0
  66. data/spec/models/organization_user_files_to_sync_filters_spec.rb +6 -0
  67. data/spec/models/pr_comment_spec.rb +94 -0
  68. data/spec/models/pr_commit_spec.rb +52 -0
  69. data/spec/models/pr_file_spec.rb +82 -0
  70. data/spec/models/pr_order_by_spec.rb +22 -0
  71. data/spec/models/pr_state_input_spec.rb +22 -0
  72. data/spec/models/pr_state_spec.rb +22 -0
  73. data/spec/models/pull_request_extended_spec.rb +166 -0
  74. data/spec/models/pull_request_filters_spec.rb +40 -0
  75. data/spec/models/pull_request_response_spec.rb +34 -0
  76. data/spec/models/pull_request_spec.rb +124 -0
  77. data/spec/models/pull_requests_input_spec.rb +76 -0
  78. data/spec/models/sent_webhook_payload_spec.rb +1 -1
  79. data/spec/models/team_spec.rb +34 -0
  80. data/spec/models/tree_spec.rb +34 -0
  81. data/spec/models/user_file_spec.rb +6 -0
  82. data/spec/models/user_nullable_spec.rb +34 -0
  83. data/spec/models/user_spec.rb +34 -0
  84. metadata +301 -193
@@ -0,0 +1,536 @@
1
+ =begin
2
+ #Carbon
3
+
4
+ #Connect external data to LLMs, no matter the source.
5
+
6
+ The version of the OpenAPI document: 1.0.0
7
+ =end
8
+
9
+ require 'date'
10
+ require 'time'
11
+
12
+ module Carbon
13
+ class PullRequestExtended
14
+ attr_accessor :title
15
+
16
+ attr_accessor :id
17
+
18
+ attr_accessor :url
19
+
20
+ attr_accessor :number
21
+
22
+ attr_accessor :state
23
+
24
+ attr_accessor :user
25
+
26
+ attr_accessor :created_at
27
+
28
+ attr_accessor :updated_at
29
+
30
+ attr_accessor :closed_at
31
+
32
+ attr_accessor :merged_at
33
+
34
+ attr_accessor :requested_reviewers
35
+
36
+ attr_accessor :requested_teams
37
+
38
+ attr_accessor :labels
39
+
40
+ attr_accessor :draft
41
+
42
+ attr_accessor :head
43
+
44
+ attr_accessor :base
45
+
46
+ attr_accessor :remote_data
47
+
48
+ attr_accessor :merged
49
+
50
+ attr_accessor :num_comments
51
+
52
+ attr_accessor :num_review_comments
53
+
54
+ attr_accessor :num_commits
55
+
56
+ attr_accessor :num_additions
57
+
58
+ attr_accessor :num_deletions
59
+
60
+ attr_accessor :num_changed_files
61
+
62
+ # Attribute mapping from ruby-style variable name to JSON key.
63
+ def self.attribute_map
64
+ {
65
+ :'title' => :'title',
66
+ :'id' => :'id',
67
+ :'url' => :'url',
68
+ :'number' => :'number',
69
+ :'state' => :'state',
70
+ :'user' => :'user',
71
+ :'created_at' => :'created_at',
72
+ :'updated_at' => :'updated_at',
73
+ :'closed_at' => :'closed_at',
74
+ :'merged_at' => :'merged_at',
75
+ :'requested_reviewers' => :'requested_reviewers',
76
+ :'requested_teams' => :'requested_teams',
77
+ :'labels' => :'labels',
78
+ :'draft' => :'draft',
79
+ :'head' => :'head',
80
+ :'base' => :'base',
81
+ :'remote_data' => :'remote_data',
82
+ :'merged' => :'merged',
83
+ :'num_comments' => :'num_comments',
84
+ :'num_review_comments' => :'num_review_comments',
85
+ :'num_commits' => :'num_commits',
86
+ :'num_additions' => :'num_additions',
87
+ :'num_deletions' => :'num_deletions',
88
+ :'num_changed_files' => :'num_changed_files'
89
+ }
90
+ end
91
+
92
+ # Returns all the JSON keys this model knows about
93
+ def self.acceptable_attributes
94
+ attribute_map.values
95
+ end
96
+
97
+ # Attribute type mapping.
98
+ def self.openapi_types
99
+ {
100
+ :'title' => :'String',
101
+ :'id' => :'Integer',
102
+ :'url' => :'String',
103
+ :'number' => :'Integer',
104
+ :'state' => :'PRState',
105
+ :'user' => :'User',
106
+ :'created_at' => :'String',
107
+ :'updated_at' => :'String',
108
+ :'closed_at' => :'String',
109
+ :'merged_at' => :'String',
110
+ :'requested_reviewers' => :'Array<User>',
111
+ :'requested_teams' => :'Array<Team>',
112
+ :'labels' => :'Array<Label>',
113
+ :'draft' => :'Boolean',
114
+ :'head' => :'HeadOrBase',
115
+ :'base' => :'HeadOrBase',
116
+ :'remote_data' => :'Object',
117
+ :'merged' => :'Boolean',
118
+ :'num_comments' => :'Integer',
119
+ :'num_review_comments' => :'Integer',
120
+ :'num_commits' => :'Integer',
121
+ :'num_additions' => :'Integer',
122
+ :'num_deletions' => :'Integer',
123
+ :'num_changed_files' => :'Integer'
124
+ }
125
+ end
126
+
127
+ # List of attributes with nullable: true
128
+ def self.openapi_nullable
129
+ Set.new([
130
+ :'closed_at',
131
+ :'merged_at',
132
+ :'remote_data',
133
+ ])
134
+ end
135
+
136
+ # Initializes the object
137
+ # @param [Hash] attributes Model attributes in the form of hash
138
+ def initialize(attributes = {})
139
+ if (!attributes.is_a?(Hash))
140
+ fail ArgumentError, "The input argument (attributes) must be a hash in `Carbon::PullRequestExtended` initialize method"
141
+ end
142
+
143
+ # check to see if the attribute exists and convert string to symbol for hash key
144
+ attributes = attributes.each_with_object({}) { |(k, v), h|
145
+ if (!self.class.attribute_map.key?(k.to_sym))
146
+ fail ArgumentError, "`#{k}` is not a valid attribute in `Carbon::PullRequestExtended`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect
147
+ end
148
+ h[k.to_sym] = v
149
+ }
150
+
151
+ if attributes.key?(:'title')
152
+ self.title = attributes[:'title']
153
+ end
154
+
155
+ if attributes.key?(:'id')
156
+ self.id = attributes[:'id']
157
+ end
158
+
159
+ if attributes.key?(:'url')
160
+ self.url = attributes[:'url']
161
+ end
162
+
163
+ if attributes.key?(:'number')
164
+ self.number = attributes[:'number']
165
+ end
166
+
167
+ if attributes.key?(:'state')
168
+ self.state = attributes[:'state']
169
+ end
170
+
171
+ if attributes.key?(:'user')
172
+ self.user = attributes[:'user']
173
+ end
174
+
175
+ if attributes.key?(:'created_at')
176
+ self.created_at = attributes[:'created_at']
177
+ end
178
+
179
+ if attributes.key?(:'updated_at')
180
+ self.updated_at = attributes[:'updated_at']
181
+ end
182
+
183
+ if attributes.key?(:'closed_at')
184
+ self.closed_at = attributes[:'closed_at']
185
+ end
186
+
187
+ if attributes.key?(:'merged_at')
188
+ self.merged_at = attributes[:'merged_at']
189
+ end
190
+
191
+ if attributes.key?(:'requested_reviewers')
192
+ if (value = attributes[:'requested_reviewers']).is_a?(Array)
193
+ self.requested_reviewers = value
194
+ end
195
+ end
196
+
197
+ if attributes.key?(:'requested_teams')
198
+ if (value = attributes[:'requested_teams']).is_a?(Array)
199
+ self.requested_teams = value
200
+ end
201
+ end
202
+
203
+ if attributes.key?(:'labels')
204
+ if (value = attributes[:'labels']).is_a?(Array)
205
+ self.labels = value
206
+ end
207
+ end
208
+
209
+ if attributes.key?(:'draft')
210
+ self.draft = attributes[:'draft']
211
+ end
212
+
213
+ if attributes.key?(:'head')
214
+ self.head = attributes[:'head']
215
+ end
216
+
217
+ if attributes.key?(:'base')
218
+ self.base = attributes[:'base']
219
+ end
220
+
221
+ if attributes.key?(:'remote_data')
222
+ self.remote_data = attributes[:'remote_data']
223
+ end
224
+
225
+ if attributes.key?(:'merged')
226
+ self.merged = attributes[:'merged']
227
+ end
228
+
229
+ if attributes.key?(:'num_comments')
230
+ self.num_comments = attributes[:'num_comments']
231
+ end
232
+
233
+ if attributes.key?(:'num_review_comments')
234
+ self.num_review_comments = attributes[:'num_review_comments']
235
+ end
236
+
237
+ if attributes.key?(:'num_commits')
238
+ self.num_commits = attributes[:'num_commits']
239
+ end
240
+
241
+ if attributes.key?(:'num_additions')
242
+ self.num_additions = attributes[:'num_additions']
243
+ end
244
+
245
+ if attributes.key?(:'num_deletions')
246
+ self.num_deletions = attributes[:'num_deletions']
247
+ end
248
+
249
+ if attributes.key?(:'num_changed_files')
250
+ self.num_changed_files = attributes[:'num_changed_files']
251
+ end
252
+ end
253
+
254
+ # Show invalid properties with the reasons. Usually used together with valid?
255
+ # @return Array for valid properties with the reasons
256
+ def list_invalid_properties
257
+ invalid_properties = Array.new
258
+ if @title.nil?
259
+ invalid_properties.push('invalid value for "title", title cannot be nil.')
260
+ end
261
+
262
+ if @id.nil?
263
+ invalid_properties.push('invalid value for "id", id cannot be nil.')
264
+ end
265
+
266
+ if @url.nil?
267
+ invalid_properties.push('invalid value for "url", url cannot be nil.')
268
+ end
269
+
270
+ if @number.nil?
271
+ invalid_properties.push('invalid value for "number", number cannot be nil.')
272
+ end
273
+
274
+ if @state.nil?
275
+ invalid_properties.push('invalid value for "state", state cannot be nil.')
276
+ end
277
+
278
+ if @user.nil?
279
+ invalid_properties.push('invalid value for "user", user cannot be nil.')
280
+ end
281
+
282
+ if @created_at.nil?
283
+ invalid_properties.push('invalid value for "created_at", created_at cannot be nil.')
284
+ end
285
+
286
+ if @updated_at.nil?
287
+ invalid_properties.push('invalid value for "updated_at", updated_at cannot be nil.')
288
+ end
289
+
290
+ if @requested_reviewers.nil?
291
+ invalid_properties.push('invalid value for "requested_reviewers", requested_reviewers cannot be nil.')
292
+ end
293
+
294
+ if @requested_teams.nil?
295
+ invalid_properties.push('invalid value for "requested_teams", requested_teams cannot be nil.')
296
+ end
297
+
298
+ if @labels.nil?
299
+ invalid_properties.push('invalid value for "labels", labels cannot be nil.')
300
+ end
301
+
302
+ if @draft.nil?
303
+ invalid_properties.push('invalid value for "draft", draft cannot be nil.')
304
+ end
305
+
306
+ if @head.nil?
307
+ invalid_properties.push('invalid value for "head", head cannot be nil.')
308
+ end
309
+
310
+ if @base.nil?
311
+ invalid_properties.push('invalid value for "base", base cannot be nil.')
312
+ end
313
+
314
+ if @merged.nil?
315
+ invalid_properties.push('invalid value for "merged", merged cannot be nil.')
316
+ end
317
+
318
+ if @num_comments.nil?
319
+ invalid_properties.push('invalid value for "num_comments", num_comments cannot be nil.')
320
+ end
321
+
322
+ if @num_review_comments.nil?
323
+ invalid_properties.push('invalid value for "num_review_comments", num_review_comments cannot be nil.')
324
+ end
325
+
326
+ if @num_commits.nil?
327
+ invalid_properties.push('invalid value for "num_commits", num_commits cannot be nil.')
328
+ end
329
+
330
+ if @num_additions.nil?
331
+ invalid_properties.push('invalid value for "num_additions", num_additions cannot be nil.')
332
+ end
333
+
334
+ if @num_deletions.nil?
335
+ invalid_properties.push('invalid value for "num_deletions", num_deletions cannot be nil.')
336
+ end
337
+
338
+ if @num_changed_files.nil?
339
+ invalid_properties.push('invalid value for "num_changed_files", num_changed_files cannot be nil.')
340
+ end
341
+
342
+ invalid_properties
343
+ end
344
+
345
+ # Check to see if the all the properties in the model are valid
346
+ # @return true if the model is valid
347
+ def valid?
348
+ return false if @title.nil?
349
+ return false if @id.nil?
350
+ return false if @url.nil?
351
+ return false if @number.nil?
352
+ return false if @state.nil?
353
+ return false if @user.nil?
354
+ return false if @created_at.nil?
355
+ return false if @updated_at.nil?
356
+ return false if @requested_reviewers.nil?
357
+ return false if @requested_teams.nil?
358
+ return false if @labels.nil?
359
+ return false if @draft.nil?
360
+ return false if @head.nil?
361
+ return false if @base.nil?
362
+ return false if @merged.nil?
363
+ return false if @num_comments.nil?
364
+ return false if @num_review_comments.nil?
365
+ return false if @num_commits.nil?
366
+ return false if @num_additions.nil?
367
+ return false if @num_deletions.nil?
368
+ return false if @num_changed_files.nil?
369
+ true
370
+ end
371
+
372
+ # Checks equality by comparing each attribute.
373
+ # @param [Object] Object to be compared
374
+ def ==(o)
375
+ return true if self.equal?(o)
376
+ self.class == o.class &&
377
+ title == o.title &&
378
+ id == o.id &&
379
+ url == o.url &&
380
+ number == o.number &&
381
+ state == o.state &&
382
+ user == o.user &&
383
+ created_at == o.created_at &&
384
+ updated_at == o.updated_at &&
385
+ closed_at == o.closed_at &&
386
+ merged_at == o.merged_at &&
387
+ requested_reviewers == o.requested_reviewers &&
388
+ requested_teams == o.requested_teams &&
389
+ labels == o.labels &&
390
+ draft == o.draft &&
391
+ head == o.head &&
392
+ base == o.base &&
393
+ remote_data == o.remote_data &&
394
+ merged == o.merged &&
395
+ num_comments == o.num_comments &&
396
+ num_review_comments == o.num_review_comments &&
397
+ num_commits == o.num_commits &&
398
+ num_additions == o.num_additions &&
399
+ num_deletions == o.num_deletions &&
400
+ num_changed_files == o.num_changed_files
401
+ end
402
+
403
+ # @see the `==` method
404
+ # @param [Object] Object to be compared
405
+ def eql?(o)
406
+ self == o
407
+ end
408
+
409
+ # Calculates hash code according to all attributes.
410
+ # @return [Integer] Hash code
411
+ def hash
412
+ [title, id, url, number, state, user, created_at, updated_at, closed_at, merged_at, requested_reviewers, requested_teams, labels, draft, head, base, remote_data, merged, num_comments, num_review_comments, num_commits, num_additions, num_deletions, num_changed_files].hash
413
+ end
414
+
415
+ # Builds the object from hash
416
+ # @param [Hash] attributes Model attributes in the form of hash
417
+ # @return [Object] Returns the model itself
418
+ def self.build_from_hash(attributes)
419
+ new.build_from_hash(attributes)
420
+ end
421
+
422
+ # Builds the object from hash
423
+ # @param [Hash] attributes Model attributes in the form of hash
424
+ # @return [Object] Returns the model itself
425
+ def build_from_hash(attributes)
426
+ return nil unless attributes.is_a?(Hash)
427
+ attributes = attributes.transform_keys(&:to_sym)
428
+ self.class.openapi_types.each_pair do |key, type|
429
+ if attributes[self.class.attribute_map[key]].nil? && self.class.openapi_nullable.include?(key)
430
+ self.send("#{key}=", nil)
431
+ elsif type =~ /\AArray<(.*)>/i
432
+ # check to ensure the input is an array given that the attribute
433
+ # is documented as an array but the input is not
434
+ if attributes[self.class.attribute_map[key]].is_a?(Array)
435
+ self.send("#{key}=", attributes[self.class.attribute_map[key]].map { |v| _deserialize($1, v) })
436
+ end
437
+ elsif !attributes[self.class.attribute_map[key]].nil?
438
+ self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
439
+ end
440
+ end
441
+
442
+ self
443
+ end
444
+
445
+ # Deserializes the data based on type
446
+ # @param string type Data type
447
+ # @param string value Value to be deserialized
448
+ # @return [Object] Deserialized data
449
+ def _deserialize(type, value)
450
+ case type.to_sym
451
+ when :Time
452
+ Time.parse(value)
453
+ when :Date
454
+ Date.parse(value)
455
+ when :String
456
+ value.to_s
457
+ when :Integer
458
+ value.to_i
459
+ when :Float
460
+ value.to_f
461
+ when :Boolean
462
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
463
+ true
464
+ else
465
+ false
466
+ end
467
+ when :Object
468
+ # generic object (usually a Hash), return directly
469
+ value
470
+ when /\AArray<(?<inner_type>.+)>\z/
471
+ inner_type = Regexp.last_match[:inner_type]
472
+ value.map { |v| _deserialize(inner_type, v) }
473
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
474
+ k_type = Regexp.last_match[:k_type]
475
+ v_type = Regexp.last_match[:v_type]
476
+ {}.tap do |hash|
477
+ value.each do |k, v|
478
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
479
+ end
480
+ end
481
+ else # model
482
+ # models (e.g. Pet) or oneOf
483
+ klass = Carbon.const_get(type)
484
+ klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value)
485
+ end
486
+ end
487
+
488
+ # Returns the string representation of the object
489
+ # @return [String] String presentation of the object
490
+ def to_s
491
+ to_hash.to_s
492
+ end
493
+
494
+ # to_body is an alias to to_hash (backward compatibility)
495
+ # @return [Hash] Returns the object in the form of hash
496
+ def to_body
497
+ to_hash
498
+ end
499
+
500
+ # Returns the object in the form of hash
501
+ # @return [Hash] Returns the object in the form of hash
502
+ def to_hash
503
+ hash = {}
504
+ self.class.attribute_map.each_pair do |attr, param|
505
+ value = self.send(attr)
506
+ if value.nil?
507
+ is_nullable = self.class.openapi_nullable.include?(attr)
508
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
509
+ end
510
+
511
+ hash[param] = _to_hash(value)
512
+ end
513
+ hash
514
+ end
515
+
516
+ # Outputs non-array value in the form of hash
517
+ # For object, use to_hash. Otherwise, just return the value
518
+ # @param [Object] value Any valid value
519
+ # @return [Hash] Returns the value in the form of hash
520
+ def _to_hash(value)
521
+ if value.is_a?(Array)
522
+ value.compact.map { |v| _to_hash(v) }
523
+ elsif value.is_a?(Hash)
524
+ {}.tap do |hash|
525
+ value.each { |k, v| hash[k] = _to_hash(v) }
526
+ end
527
+ elsif value.respond_to? :to_hash
528
+ value.to_hash
529
+ else
530
+ value
531
+ end
532
+ end
533
+
534
+ end
535
+
536
+ end