pulp_python_client 3.11.1 → 3.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +30 -10
  3. data/docs/ContentPackagesApi.md +12 -12
  4. data/docs/DistributionsPypiApi.md +232 -0
  5. data/docs/MyPermissionsResponse.md +17 -0
  6. data/docs/NestedRole.md +21 -0
  7. data/docs/NestedRoleResponse.md +21 -0
  8. data/docs/ObjectRolesResponse.md +17 -0
  9. data/docs/PackageMetadataResponse.md +3 -3
  10. data/docs/PublicationsPypiApi.md +232 -0
  11. data/docs/PypiApi.md +7 -1
  12. data/docs/PypiMetadataApi.md +7 -1
  13. data/docs/PythonPythonPackageContent.md +6 -6
  14. data/docs/PythonPythonPackageContentResponse.md +6 -6
  15. data/docs/RemotesPythonApi.md +232 -0
  16. data/docs/RepositoriesPythonApi.md +232 -0
  17. data/lib/pulp_python_client/api/content_packages_api.rb +12 -12
  18. data/lib/pulp_python_client/api/distributions_pypi_api.rb +276 -0
  19. data/lib/pulp_python_client/api/publications_pypi_api.rb +276 -0
  20. data/lib/pulp_python_client/api/pypi_api.rb +1 -1
  21. data/lib/pulp_python_client/api/pypi_metadata_api.rb +1 -1
  22. data/lib/pulp_python_client/api/remotes_python_api.rb +276 -0
  23. data/lib/pulp_python_client/api/repositories_python_api.rb +276 -0
  24. data/lib/pulp_python_client/models/my_permissions_response.rb +213 -0
  25. data/lib/pulp_python_client/models/nested_role.rb +253 -0
  26. data/lib/pulp_python_client/models/nested_role_response.rb +234 -0
  27. data/lib/pulp_python_client/models/object_roles_response.rb +213 -0
  28. data/lib/pulp_python_client/models/package_metadata_response.rb +3 -3
  29. data/lib/pulp_python_client/models/package_upload_task_response.rb +2 -10
  30. data/lib/pulp_python_client/models/python_python_package_content.rb +6 -6
  31. data/lib/pulp_python_client/models/python_python_package_content_response.rb +6 -6
  32. data/lib/pulp_python_client/version.rb +1 -1
  33. data/lib/pulp_python_client.rb +4 -0
  34. data/spec/api/content_packages_api_spec.rb +6 -6
  35. data/spec/api/distributions_pypi_api_spec.rb +54 -0
  36. data/spec/api/publications_pypi_api_spec.rb +54 -0
  37. data/spec/api/remotes_python_api_spec.rb +54 -0
  38. data/spec/api/repositories_python_api_spec.rb +54 -0
  39. data/spec/models/my_permissions_response_spec.rb +41 -0
  40. data/spec/models/nested_role_response_spec.rb +53 -0
  41. data/spec/models/nested_role_spec.rb +53 -0
  42. data/spec/models/object_roles_response_spec.rb +41 -0
  43. metadata +53 -37
@@ -19,6 +19,76 @@ module PulpPythonClient
19
19
  def initialize(api_client = ApiClient.default)
20
20
  @api_client = api_client
21
21
  end
22
+ # Add a role
23
+ # Add a role for this object to users/groups.
24
+ # @param python_python_repository_href [String]
25
+ # @param nested_role [NestedRole]
26
+ # @param [Hash] opts the optional parameters
27
+ # @return [NestedRoleResponse]
28
+ def add_role(python_python_repository_href, nested_role, opts = {})
29
+ data, _status_code, _headers = add_role_with_http_info(python_python_repository_href, nested_role, opts)
30
+ data
31
+ end
32
+
33
+ # Add a role
34
+ # Add a role for this object to users/groups.
35
+ # @param python_python_repository_href [String]
36
+ # @param nested_role [NestedRole]
37
+ # @param [Hash] opts the optional parameters
38
+ # @return [Array<(NestedRoleResponse, Integer, Hash)>] NestedRoleResponse data, response status code and response headers
39
+ def add_role_with_http_info(python_python_repository_href, nested_role, opts = {})
40
+ if @api_client.config.debugging
41
+ @api_client.config.logger.debug 'Calling API: RepositoriesPythonApi.add_role ...'
42
+ end
43
+ # verify the required parameter 'python_python_repository_href' is set
44
+ if @api_client.config.client_side_validation && python_python_repository_href.nil?
45
+ fail ArgumentError, "Missing the required parameter 'python_python_repository_href' when calling RepositoriesPythonApi.add_role"
46
+ end
47
+ # verify the required parameter 'nested_role' is set
48
+ if @api_client.config.client_side_validation && nested_role.nil?
49
+ fail ArgumentError, "Missing the required parameter 'nested_role' when calling RepositoriesPythonApi.add_role"
50
+ end
51
+ # resource path
52
+ local_var_path = '{python_python_repository_href}add_role/'.sub('{' + 'python_python_repository_href' + '}', CGI.escape(python_python_repository_href.to_s).gsub('%2F', '/'))
53
+
54
+ # query parameters
55
+ query_params = opts[:query_params] || {}
56
+
57
+ # header parameters
58
+ header_params = opts[:header_params] || {}
59
+ # HTTP header 'Accept' (if needed)
60
+ header_params['Accept'] = @api_client.select_header_accept(['application/json'])
61
+ # HTTP header 'Content-Type'
62
+ header_params['Content-Type'] = @api_client.select_header_content_type(['application/json', 'application/x-www-form-urlencoded', 'multipart/form-data'])
63
+
64
+ # form parameters
65
+ form_params = opts[:form_params] || {}
66
+
67
+ # http body (model)
68
+ post_body = opts[:body] || @api_client.object_to_http_body(nested_role)
69
+
70
+ # return_type
71
+ return_type = opts[:return_type] || 'NestedRoleResponse'
72
+
73
+ # auth_names
74
+ auth_names = opts[:auth_names] || ['basicAuth']
75
+
76
+ new_options = opts.merge(
77
+ :header_params => header_params,
78
+ :query_params => query_params,
79
+ :form_params => form_params,
80
+ :body => post_body,
81
+ :auth_names => auth_names,
82
+ :return_type => return_type
83
+ )
84
+
85
+ data, status_code, headers = @api_client.call_api(:POST, local_var_path, new_options)
86
+ if @api_client.config.debugging
87
+ @api_client.config.logger.debug "API called: RepositoriesPythonApi#add_role\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
88
+ end
89
+ return data, status_code, headers
90
+ end
91
+
22
92
  # Create a python repository
23
93
  # PythonRepository represents a single Python repository, to which content can be synced, added, or removed.
24
94
  # @param python_python_repository [PythonPythonRepository]
@@ -292,6 +362,74 @@ module PulpPythonClient
292
362
  return data, status_code, headers
293
363
  end
294
364
 
365
+ # List roles
366
+ # List roles assigned to this object.
367
+ # @param python_python_repository_href [String]
368
+ # @param [Hash] opts the optional parameters
369
+ # @option opts [Array<String>] :fields A list of fields to include in the response.
370
+ # @option opts [Array<String>] :exclude_fields A list of fields to exclude from the response.
371
+ # @return [ObjectRolesResponse]
372
+ def list_roles(python_python_repository_href, opts = {})
373
+ data, _status_code, _headers = list_roles_with_http_info(python_python_repository_href, opts)
374
+ data
375
+ end
376
+
377
+ # List roles
378
+ # List roles assigned to this object.
379
+ # @param python_python_repository_href [String]
380
+ # @param [Hash] opts the optional parameters
381
+ # @option opts [Array<String>] :fields A list of fields to include in the response.
382
+ # @option opts [Array<String>] :exclude_fields A list of fields to exclude from the response.
383
+ # @return [Array<(ObjectRolesResponse, Integer, Hash)>] ObjectRolesResponse data, response status code and response headers
384
+ def list_roles_with_http_info(python_python_repository_href, opts = {})
385
+ if @api_client.config.debugging
386
+ @api_client.config.logger.debug 'Calling API: RepositoriesPythonApi.list_roles ...'
387
+ end
388
+ # verify the required parameter 'python_python_repository_href' is set
389
+ if @api_client.config.client_side_validation && python_python_repository_href.nil?
390
+ fail ArgumentError, "Missing the required parameter 'python_python_repository_href' when calling RepositoriesPythonApi.list_roles"
391
+ end
392
+ # resource path
393
+ local_var_path = '{python_python_repository_href}list_roles/'.sub('{' + 'python_python_repository_href' + '}', CGI.escape(python_python_repository_href.to_s).gsub('%2F', '/'))
394
+
395
+ # query parameters
396
+ query_params = opts[:query_params] || {}
397
+ query_params[:'fields'] = @api_client.build_collection_param(opts[:'fields'], :multi) if !opts[:'fields'].nil?
398
+ query_params[:'exclude_fields'] = @api_client.build_collection_param(opts[:'exclude_fields'], :multi) if !opts[:'exclude_fields'].nil?
399
+
400
+ # header parameters
401
+ header_params = opts[:header_params] || {}
402
+ # HTTP header 'Accept' (if needed)
403
+ header_params['Accept'] = @api_client.select_header_accept(['application/json'])
404
+
405
+ # form parameters
406
+ form_params = opts[:form_params] || {}
407
+
408
+ # http body (model)
409
+ post_body = opts[:body]
410
+
411
+ # return_type
412
+ return_type = opts[:return_type] || 'ObjectRolesResponse'
413
+
414
+ # auth_names
415
+ auth_names = opts[:auth_names] || ['basicAuth']
416
+
417
+ new_options = opts.merge(
418
+ :header_params => header_params,
419
+ :query_params => query_params,
420
+ :form_params => form_params,
421
+ :body => post_body,
422
+ :auth_names => auth_names,
423
+ :return_type => return_type
424
+ )
425
+
426
+ data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
427
+ if @api_client.config.debugging
428
+ @api_client.config.logger.debug "API called: RepositoriesPythonApi#list_roles\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
429
+ end
430
+ return data, status_code, headers
431
+ end
432
+
295
433
  # Modify Repository Content
296
434
  # Trigger an asynchronous task to create a new repository version.
297
435
  # @param python_python_repository_href [String]
@@ -362,6 +500,74 @@ module PulpPythonClient
362
500
  return data, status_code, headers
363
501
  end
364
502
 
503
+ # List user permissions
504
+ # List permissions available to the current user on this object.
505
+ # @param python_python_repository_href [String]
506
+ # @param [Hash] opts the optional parameters
507
+ # @option opts [Array<String>] :fields A list of fields to include in the response.
508
+ # @option opts [Array<String>] :exclude_fields A list of fields to exclude from the response.
509
+ # @return [MyPermissionsResponse]
510
+ def my_permissions(python_python_repository_href, opts = {})
511
+ data, _status_code, _headers = my_permissions_with_http_info(python_python_repository_href, opts)
512
+ data
513
+ end
514
+
515
+ # List user permissions
516
+ # List permissions available to the current user on this object.
517
+ # @param python_python_repository_href [String]
518
+ # @param [Hash] opts the optional parameters
519
+ # @option opts [Array<String>] :fields A list of fields to include in the response.
520
+ # @option opts [Array<String>] :exclude_fields A list of fields to exclude from the response.
521
+ # @return [Array<(MyPermissionsResponse, Integer, Hash)>] MyPermissionsResponse data, response status code and response headers
522
+ def my_permissions_with_http_info(python_python_repository_href, opts = {})
523
+ if @api_client.config.debugging
524
+ @api_client.config.logger.debug 'Calling API: RepositoriesPythonApi.my_permissions ...'
525
+ end
526
+ # verify the required parameter 'python_python_repository_href' is set
527
+ if @api_client.config.client_side_validation && python_python_repository_href.nil?
528
+ fail ArgumentError, "Missing the required parameter 'python_python_repository_href' when calling RepositoriesPythonApi.my_permissions"
529
+ end
530
+ # resource path
531
+ local_var_path = '{python_python_repository_href}my_permissions/'.sub('{' + 'python_python_repository_href' + '}', CGI.escape(python_python_repository_href.to_s).gsub('%2F', '/'))
532
+
533
+ # query parameters
534
+ query_params = opts[:query_params] || {}
535
+ query_params[:'fields'] = @api_client.build_collection_param(opts[:'fields'], :multi) if !opts[:'fields'].nil?
536
+ query_params[:'exclude_fields'] = @api_client.build_collection_param(opts[:'exclude_fields'], :multi) if !opts[:'exclude_fields'].nil?
537
+
538
+ # header parameters
539
+ header_params = opts[:header_params] || {}
540
+ # HTTP header 'Accept' (if needed)
541
+ header_params['Accept'] = @api_client.select_header_accept(['application/json'])
542
+
543
+ # form parameters
544
+ form_params = opts[:form_params] || {}
545
+
546
+ # http body (model)
547
+ post_body = opts[:body]
548
+
549
+ # return_type
550
+ return_type = opts[:return_type] || 'MyPermissionsResponse'
551
+
552
+ # auth_names
553
+ auth_names = opts[:auth_names] || ['basicAuth']
554
+
555
+ new_options = opts.merge(
556
+ :header_params => header_params,
557
+ :query_params => query_params,
558
+ :form_params => form_params,
559
+ :body => post_body,
560
+ :auth_names => auth_names,
561
+ :return_type => return_type
562
+ )
563
+
564
+ data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
565
+ if @api_client.config.debugging
566
+ @api_client.config.logger.debug "API called: RepositoriesPythonApi#my_permissions\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
567
+ end
568
+ return data, status_code, headers
569
+ end
570
+
365
571
  # Update a python repository
366
572
  # Trigger an asynchronous partial update task
367
573
  # @param python_python_repository_href [String]
@@ -500,6 +706,76 @@ module PulpPythonClient
500
706
  return data, status_code, headers
501
707
  end
502
708
 
709
+ # Remove a role
710
+ # Remove a role for this object from users/groups.
711
+ # @param python_python_repository_href [String]
712
+ # @param nested_role [NestedRole]
713
+ # @param [Hash] opts the optional parameters
714
+ # @return [NestedRoleResponse]
715
+ def remove_role(python_python_repository_href, nested_role, opts = {})
716
+ data, _status_code, _headers = remove_role_with_http_info(python_python_repository_href, nested_role, opts)
717
+ data
718
+ end
719
+
720
+ # Remove a role
721
+ # Remove a role for this object from users/groups.
722
+ # @param python_python_repository_href [String]
723
+ # @param nested_role [NestedRole]
724
+ # @param [Hash] opts the optional parameters
725
+ # @return [Array<(NestedRoleResponse, Integer, Hash)>] NestedRoleResponse data, response status code and response headers
726
+ def remove_role_with_http_info(python_python_repository_href, nested_role, opts = {})
727
+ if @api_client.config.debugging
728
+ @api_client.config.logger.debug 'Calling API: RepositoriesPythonApi.remove_role ...'
729
+ end
730
+ # verify the required parameter 'python_python_repository_href' is set
731
+ if @api_client.config.client_side_validation && python_python_repository_href.nil?
732
+ fail ArgumentError, "Missing the required parameter 'python_python_repository_href' when calling RepositoriesPythonApi.remove_role"
733
+ end
734
+ # verify the required parameter 'nested_role' is set
735
+ if @api_client.config.client_side_validation && nested_role.nil?
736
+ fail ArgumentError, "Missing the required parameter 'nested_role' when calling RepositoriesPythonApi.remove_role"
737
+ end
738
+ # resource path
739
+ local_var_path = '{python_python_repository_href}remove_role/'.sub('{' + 'python_python_repository_href' + '}', CGI.escape(python_python_repository_href.to_s).gsub('%2F', '/'))
740
+
741
+ # query parameters
742
+ query_params = opts[:query_params] || {}
743
+
744
+ # header parameters
745
+ header_params = opts[:header_params] || {}
746
+ # HTTP header 'Accept' (if needed)
747
+ header_params['Accept'] = @api_client.select_header_accept(['application/json'])
748
+ # HTTP header 'Content-Type'
749
+ header_params['Content-Type'] = @api_client.select_header_content_type(['application/json', 'application/x-www-form-urlencoded', 'multipart/form-data'])
750
+
751
+ # form parameters
752
+ form_params = opts[:form_params] || {}
753
+
754
+ # http body (model)
755
+ post_body = opts[:body] || @api_client.object_to_http_body(nested_role)
756
+
757
+ # return_type
758
+ return_type = opts[:return_type] || 'NestedRoleResponse'
759
+
760
+ # auth_names
761
+ auth_names = opts[:auth_names] || ['basicAuth']
762
+
763
+ new_options = opts.merge(
764
+ :header_params => header_params,
765
+ :query_params => query_params,
766
+ :form_params => form_params,
767
+ :body => post_body,
768
+ :auth_names => auth_names,
769
+ :return_type => return_type
770
+ )
771
+
772
+ data, status_code, headers = @api_client.call_api(:POST, local_var_path, new_options)
773
+ if @api_client.config.debugging
774
+ @api_client.config.logger.debug "API called: RepositoriesPythonApi#remove_role\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
775
+ end
776
+ return data, status_code, headers
777
+ end
778
+
503
779
  # Set a label
504
780
  # Set a single pulp_label on the object to a specific value or null.
505
781
  # @param python_python_repository_href [String]
@@ -0,0 +1,213 @@
1
+ =begin
2
+ #Pulp 3 API
3
+
4
+ #Fetch, Upload, Organize, and Distribute Software Packages
5
+
6
+ The version of the OpenAPI document: v3
7
+ Contact: pulp-list@redhat.com
8
+ Generated by: https://openapi-generator.tech
9
+ OpenAPI Generator version: 4.3.1
10
+
11
+ =end
12
+
13
+ require 'date'
14
+
15
+ module PulpPythonClient
16
+ class MyPermissionsResponse
17
+ attr_accessor :permissions
18
+
19
+ # Attribute mapping from ruby-style variable name to JSON key.
20
+ def self.attribute_map
21
+ {
22
+ :'permissions' => :'permissions'
23
+ }
24
+ end
25
+
26
+ # Attribute type mapping.
27
+ def self.openapi_types
28
+ {
29
+ :'permissions' => :'Array<String>'
30
+ }
31
+ end
32
+
33
+ # List of attributes with nullable: true
34
+ def self.openapi_nullable
35
+ Set.new([
36
+ ])
37
+ end
38
+
39
+ # Initializes the object
40
+ # @param [Hash] attributes Model attributes in the form of hash
41
+ def initialize(attributes = {})
42
+ if (!attributes.is_a?(Hash))
43
+ fail ArgumentError, "The input argument (attributes) must be a hash in `PulpPythonClient::MyPermissionsResponse` initialize method"
44
+ end
45
+
46
+ # check to see if the attribute exists and convert string to symbol for hash key
47
+ attributes = attributes.each_with_object({}) { |(k, v), h|
48
+ if (!self.class.attribute_map.key?(k.to_sym))
49
+ fail ArgumentError, "`#{k}` is not a valid attribute in `PulpPythonClient::MyPermissionsResponse`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect
50
+ end
51
+ h[k.to_sym] = v
52
+ }
53
+
54
+ if attributes.key?(:'permissions')
55
+ if (value = attributes[:'permissions']).is_a?(Array)
56
+ self.permissions = value
57
+ end
58
+ end
59
+ end
60
+
61
+ # Show invalid properties with the reasons. Usually used together with valid?
62
+ # @return Array for valid properties with the reasons
63
+ def list_invalid_properties
64
+ invalid_properties = Array.new
65
+ if @permissions.nil?
66
+ invalid_properties.push('invalid value for "permissions", permissions cannot be nil.')
67
+ end
68
+
69
+ invalid_properties
70
+ end
71
+
72
+ # Check to see if the all the properties in the model are valid
73
+ # @return true if the model is valid
74
+ def valid?
75
+ return false if @permissions.nil?
76
+ true
77
+ end
78
+
79
+ # Checks equality by comparing each attribute.
80
+ # @param [Object] Object to be compared
81
+ def ==(o)
82
+ return true if self.equal?(o)
83
+ self.class == o.class &&
84
+ permissions == o.permissions
85
+ end
86
+
87
+ # @see the `==` method
88
+ # @param [Object] Object to be compared
89
+ def eql?(o)
90
+ self == o
91
+ end
92
+
93
+ # Calculates hash code according to all attributes.
94
+ # @return [Integer] Hash code
95
+ def hash
96
+ [permissions].hash
97
+ end
98
+
99
+ # Builds the object from hash
100
+ # @param [Hash] attributes Model attributes in the form of hash
101
+ # @return [Object] Returns the model itself
102
+ def self.build_from_hash(attributes)
103
+ new.build_from_hash(attributes)
104
+ end
105
+
106
+ # Builds the object from hash
107
+ # @param [Hash] attributes Model attributes in the form of hash
108
+ # @return [Object] Returns the model itself
109
+ def build_from_hash(attributes)
110
+ return nil unless attributes.is_a?(Hash)
111
+ self.class.openapi_types.each_pair do |key, type|
112
+ if type =~ /\AArray<(.*)>/i
113
+ # check to ensure the input is an array given that the attribute
114
+ # is documented as an array but the input is not
115
+ if attributes[self.class.attribute_map[key]].is_a?(Array)
116
+ self.send("#{key}=", attributes[self.class.attribute_map[key]].map { |v| _deserialize($1, v) })
117
+ end
118
+ elsif !attributes[self.class.attribute_map[key]].nil?
119
+ self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
120
+ end # or else data not found in attributes(hash), not an issue as the data can be optional
121
+ end
122
+
123
+ self
124
+ end
125
+
126
+ # Deserializes the data based on type
127
+ # @param string type Data type
128
+ # @param string value Value to be deserialized
129
+ # @return [Object] Deserialized data
130
+ def _deserialize(type, value)
131
+ case type.to_sym
132
+ when :DateTime
133
+ DateTime.parse(value)
134
+ when :Date
135
+ Date.parse(value)
136
+ when :String
137
+ value.to_s
138
+ when :Integer
139
+ value.to_i
140
+ when :Float
141
+ value.to_f
142
+ when :Boolean
143
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
144
+ true
145
+ else
146
+ false
147
+ end
148
+ when :Object
149
+ # generic object (usually a Hash), return directly
150
+ value
151
+ when /\AArray<(?<inner_type>.+)>\z/
152
+ inner_type = Regexp.last_match[:inner_type]
153
+ value.map { |v| _deserialize(inner_type, v) }
154
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
155
+ k_type = Regexp.last_match[:k_type]
156
+ v_type = Regexp.last_match[:v_type]
157
+ {}.tap do |hash|
158
+ value.each do |k, v|
159
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
160
+ end
161
+ end
162
+ else # model
163
+ PulpPythonClient.const_get(type).build_from_hash(value)
164
+ end
165
+ end
166
+
167
+ # Returns the string representation of the object
168
+ # @return [String] String presentation of the object
169
+ def to_s
170
+ to_hash.to_s
171
+ end
172
+
173
+ # to_body is an alias to to_hash (backward compatibility)
174
+ # @return [Hash] Returns the object in the form of hash
175
+ def to_body
176
+ to_hash
177
+ end
178
+
179
+ # Returns the object in the form of hash
180
+ # @return [Hash] Returns the object in the form of hash
181
+ def to_hash
182
+ hash = {}
183
+ self.class.attribute_map.each_pair do |attr, param|
184
+ value = self.send(attr)
185
+ if value.nil?
186
+ is_nullable = self.class.openapi_nullable.include?(attr)
187
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
188
+ end
189
+
190
+ hash[param] = _to_hash(value)
191
+ end
192
+ hash
193
+ end
194
+
195
+ # Outputs non-array value in the form of hash
196
+ # For object, use to_hash. Otherwise, just return the value
197
+ # @param [Object] value Any valid value
198
+ # @return [Hash] Returns the value in the form of hash
199
+ def _to_hash(value)
200
+ if value.is_a?(Array)
201
+ value.compact.map { |v| _to_hash(v) }
202
+ elsif value.is_a?(Hash)
203
+ {}.tap do |hash|
204
+ value.each { |k, v| hash[k] = _to_hash(v) }
205
+ end
206
+ elsif value.respond_to? :to_hash
207
+ value.to_hash
208
+ else
209
+ value
210
+ end
211
+ end
212
+ end
213
+ end