apimatic_core 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d29b21091f739c5f0023b01fd70b174a41b6b25637248a02f5be3283874a25eb
4
- data.tar.gz: f21de623d02c62af2818602f81657983883d0885187836e609b16ddf890d0d3c
3
+ metadata.gz: c05d9bcfc3de9b4a1b64bef3e97ddc26be097d03a46c921526a7a0a0ab4ad083
4
+ data.tar.gz: aa0f7ae505663bc00d919cf4c8a9a661ce0ba2703cfa0aa1a82697aea5913472
5
5
  SHA512:
6
- metadata.gz: abd28994bd548acfd533bcdd1879d2d8c5ebf67198b97d3172f559d537a1ea9e688c0b5ff076849c4d818d32389814f0b5e42090d11aaf3866de73e626ff1ea6
7
- data.tar.gz: 011162e182da68a14d8e820ddf3ca2932f2658afc0e2a15836f042a02d104476888d90c4ce0932f6d47ee8e3df5c5bc23b489bd16bf9f628551ff9183492dcf9
6
+ metadata.gz: fcfbdbab3adcf1d8c5463a2402e2cfa3253554a72ff4ddfe5625ababf23ff980ac4efb175d6959176bec6bf181f8554ae539181b7c8060c088ceff94c17ec1c7
7
+ data.tar.gz: 3a22ad6f9424b9a227020fc03f00a0b3d6537a7d3d11d2823d025fc0a4de8eb1b056c9e68af9b312f5809ff4ef6b7997d9921763befada28135962422e2a53f1
data/README.md CHANGED
@@ -12,7 +12,7 @@ Core library ruby does the job of congregating common and core functionality fro
12
12
 
13
13
 
14
14
  ## Installation
15
- You will need `2.6 <= Ruby version < 3.1` to support this package.
15
+ You will need `2.6 <= Ruby version <= 3.2` to support this package.
16
16
 
17
17
  Installation is quite simple, just execute the following command:
18
18
  ```
@@ -48,6 +48,14 @@ gem 'apimatic_core'
48
48
  |------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------|
49
49
  | [`GlobalConfiguration`](lib/apimatic-core/configurations/global_configuration.rb ) | Class holding the global configuration properties to make a successful API Call |
50
50
 
51
+
52
+ ## Exceptions
53
+ | Name | Description |
54
+ |-------------------------------------------------------------------------------------------|-----------------------------------------------------|
55
+ | [`OneOfValidationException`](lib/apimatic-core/exceptions/one_of_validation_exception.rb) | Exception thrown in case of OneOf validation errors |
56
+ | [`AnyOfValidationException`](lib/apimatic-core/exceptions/any_of_validation_exception.rb) | Exception thrown in case of AnyOf validation errors |
57
+
58
+
51
59
  ## Factories
52
60
  | Name | Description |
53
61
  |-------------------------------------------------------------------------------|------------------------------------------|
@@ -67,23 +75,28 @@ gem 'apimatic_core'
67
75
  | [`EndpointLogger`](lib/apimatic-core/logger/endpoint_logger.rb) | A class to provide logging for an API call |
68
76
 
69
77
  ## Types
70
- | Name | Description |
71
- |------------------------------------------------------------------------------|-------------------------------------------------------------------------------|
72
- | [`ApiException`](lib/apimatic-core/types/sdk/api_exception.rb) | Basic exception type for the SDK |
73
- | [`ValidationException`](lib/apimatic-core/types/sdk/validation_exception.rb) | Exception thrown in case of validation error or failure |
74
- | [`ErrorCase`](lib/apimatic-core/types/error_case.rb) | A class to represent Exception types |
75
- | [`FileWrapper`](lib/apimatic-core/types/sdk/file_wrapper.rb) | A wrapper to allow passing in content type for file uploads |
76
- | [`Parameter`](lib/apimatic-core/types/parameter.rb) | A class to represent information about a Parameter passed in an endpoint |
77
- | [`XmlAttributes`](lib/apimatic-core/types/xml_attributes.rb) | A class to represent information about an XML Parameter passed in an endpoint |
78
+ | Name | Description |
79
+ |---------------------------------------------------------------------------------|-------------------------------------------------------------------------------|
80
+ | [`ApiException`](lib/apimatic-core/types/sdk/api_exception.rb) | Basic exception type for the SDK |
81
+ | [`AnyOf`](lib/apimatic-core/types/union_types/any_of.rb) | Represents the AnyOf union type |
82
+ | [`OneOf`](lib/apimatic-core/types/union_types/one_of.rb) | Represents the OneOf union type |
83
+ | [`LeafType`](lib/apimatic-core/types/union_types/leaf_type.rb) | Represents the LeafOf union type |
84
+ | [`UnionTypeContext`](lib/apimatic-core/types/union_types/union_type_context.rb) | Represents the context for a UnionType |
85
+ | [`ValidationException`](lib/apimatic-core/types/sdk/validation_exception.rb) | Exception thrown in case of validation error or failure |
86
+ | [`ErrorCase`](lib/apimatic-core/types/error_case.rb) | A class to represent Exception types |
87
+ | [`FileWrapper`](lib/apimatic-core/types/sdk/file_wrapper.rb) | A wrapper to allow passing in content type for file uploads |
88
+ | [`Parameter`](lib/apimatic-core/types/parameter.rb) | A class to represent information about a Parameter passed in an endpoint |
89
+ | [`XmlAttributes`](lib/apimatic-core/types/xml_attributes.rb) | A class to represent information about an XML Parameter passed in an endpoint |
78
90
 
79
91
  ## Utilities
80
- | Name | Description |
81
- |------------------------------------------------------------------------|--------------------------------------------------------------------------------------|
82
- | [`ApiHelper`](lib/apimatic-core/utilities/api_helper.rb) | A Helper Class with various functions associated with making an API Call |
83
- | [`AuthHelper`](lib/apimatic-core/utilities/auth_helper.rb) | A Helper Class with various functions associated with authentication in API Calls |
84
- | [`ComparisonHelper`](lib/apimatic-core/utilities/comparison_helper.rb) | A Helper Class used for the comparison of expected and actual API response |
85
- | [`FileHelper`](lib/apimatic-core/utilities/file_helper.rb) | A Helper Class for files |
86
- | [`XmlHelper`](lib/apimatic-core/utilities/xml_helper.rb ) | A Helper class that holds utility methods for xml serialization and deserialization. |
92
+ | Name | Description |
93
+ |------------------------------------------------------------------------|---------------------------------------------------------------------------------------|
94
+ | [`ApiHelper`](lib/apimatic-core/utilities/api_helper.rb) | A Helper Class with various functions associated with making an API Call |
95
+ | [`AuthHelper`](lib/apimatic-core/utilities/auth_helper.rb) | A Helper Class with various functions associated with authentication in API Calls |
96
+ | [`UnionTypeHelper`](lib/apimatic-core/utilities/union_type_helper.rb) | A Helper Class with various functions associated with Union type in API Calls |
97
+ | [`ComparisonHelper`](lib/apimatic-core/utilities/comparison_helper.rb) | A Helper Class used for the comparison of expected and actual API response |
98
+ | [`FileHelper`](lib/apimatic-core/utilities/file_helper.rb) | A Helper Class for files |
99
+ | [`XmlHelper`](lib/apimatic-core/utilities/xml_helper.rb ) | A Helper class that holds utility methods for xml serialization and deserialization. |
87
100
 
88
101
  ## Links
89
102
  * [apimatic_core_interfaces](https://rubygems.org/gems/apimatic_core_interfaces)
@@ -86,7 +86,6 @@ module CoreLibrary
86
86
  _deserialized_response = @response_handler.endpoint_logger(@endpoint_logger)
87
87
  .endpoint_name_for_logging(@endpoint_name_for_logging)
88
88
  .handle(_http_response, @global_configuration.get_global_errors,
89
- @global_configuration.get_sdk_module,
90
89
  @global_configuration.should_symbolize_hash)
91
90
  _deserialized_response
92
91
  rescue StandardError => e
@@ -12,7 +12,6 @@ module CoreLibrary
12
12
  @additional_headers = {}
13
13
  @auth_managers = {}
14
14
  @base_uri_executor = nil
15
- @sdk_module = nil
16
15
  @symbolize_hash = false
17
16
  end
18
17
 
@@ -30,19 +29,6 @@ module CoreLibrary
30
29
  @global_errors
31
30
  end
32
31
 
33
- # Sets the current SDK module core library is being used for.
34
- # @return [GlobalConfiguration] Current Instance.
35
- def sdk_module(sdk_module)
36
- @sdk_module = sdk_module
37
- self
38
- end
39
-
40
- # Getter for the current SDK module the core library is being used for.
41
- # @return [Module] Current SDK module.
42
- def get_sdk_module
43
- @sdk_module
44
- end
45
-
46
32
  # The setter for the global headers to be attached with all requests.
47
33
  # @param [Hash] global_headers The hash of global headers.
48
34
  # @return [GlobalConfiguration] An updated instance of GlobalConfiguration.
@@ -0,0 +1,13 @@
1
+ module CoreLibrary
2
+ # Custom exception class for AnyOfValidation
3
+ class AnyOfValidationException < StandardError
4
+ attr_reader :message
5
+
6
+ # Initializes a new instance of AnyOfValidationException with the specified message.
7
+ # @param [String] message The error message.
8
+ def initialize(message)
9
+ @message = message
10
+ super(message)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module CoreLibrary
2
+ # Custom exception class for OneOfValidation
3
+ class OneOfValidationException < StandardError
4
+ attr_reader :message
5
+
6
+ # Initializes a new instance of OneOfValidationException with the specified message.
7
+ # @param [String] message The error message.
8
+ def initialize(message)
9
+ @message = message
10
+ super(message)
11
+ end
12
+ end
13
+ end
@@ -14,14 +14,12 @@ module CoreLibrary
14
14
  @additional_query_params = {}
15
15
  @multipart_params = {}
16
16
  @body_param = nil
17
- @should_wrap_body_param = nil
18
17
  @body_serializer = nil
19
18
  @auth = nil
20
19
  @array_serialization_format = ArraySerializationFormat::INDEXED
21
20
  @xml_attributes = nil
22
21
  @endpoint_name_for_logging = nil
23
22
  @endpoint_logger = nil
24
- @template_validation_array = []
25
23
  end
26
24
 
27
25
  # The setter for the server.
@@ -53,7 +51,6 @@ module CoreLibrary
53
51
  # @return [RequestBuilder] An updated instance of RequestBuilder.
54
52
  def template_param(template_param)
55
53
  template_param.validate
56
- conditional_add_to_template_validation_array(template_param)
57
54
  @template_params[template_param.get_key] = { 'value' => template_param.get_value,
58
55
  'encode' => template_param.need_to_encode }
59
56
  self
@@ -64,7 +61,6 @@ module CoreLibrary
64
61
  # @return [RequestBuilder] An updated instance of RequestBuilder.
65
62
  def header_param(header_param)
66
63
  header_param.validate
67
- conditional_add_to_template_validation_array(header_param)
68
64
  @header_params[header_param.get_key] = header_param.get_value
69
65
  self
70
66
  end
@@ -74,7 +70,6 @@ module CoreLibrary
74
70
  # @return [RequestBuilder] An updated instance of RequestBuilder.
75
71
  def query_param(query_param)
76
72
  query_param.validate
77
- conditional_add_to_template_validation_array(query_param)
78
73
  @query_params[query_param.get_key] = query_param.get_value
79
74
  self
80
75
  end
@@ -84,7 +79,6 @@ module CoreLibrary
84
79
  # @return [RequestBuilder] An updated instance of RequestBuilder.
85
80
  def form_param(form_param)
86
81
  form_param.validate
87
- conditional_add_to_template_validation_array(form_param)
88
82
  @form_params[form_param.get_key] = form_param.get_value
89
83
  self
90
84
  end
@@ -110,7 +104,6 @@ module CoreLibrary
110
104
  # @return [RequestBuilder] An updated instance of RequestBuilder.
111
105
  def multipart_param(multipart_param)
112
106
  multipart_param.validate
113
- conditional_add_to_template_validation_array(multipart_param)
114
107
  @multipart_params[multipart_param.get_key] = get_part(multipart_param)
115
108
  self
116
109
  end
@@ -120,7 +113,6 @@ module CoreLibrary
120
113
  # @return [RequestBuilder] An updated instance of RequestBuilder.
121
114
  def body_param(body_param)
122
115
  body_param.validate
123
- conditional_add_to_template_validation_array(body_param)
124
116
  if !body_param.get_key.nil?
125
117
  @body_param = {} if @body_param.nil?
126
118
  @body_param[body_param.get_key] = body_param.get_value
@@ -184,28 +176,10 @@ module CoreLibrary
184
176
  self
185
177
  end
186
178
 
187
- # Add param to the template validation array, in case a template is provided.
188
- def conditional_add_to_template_validation_array(parameter)
189
- return if parameter.get_template.nil?
190
-
191
- @template_validation_array.push(parameter)
192
- end
193
-
194
- # Validates the template for the params provided with a template.
195
- def validate_templates
196
- return if @template_validation_array.nil? || @template_validation_array.empty?
197
-
198
- @template_validation_array.each do |parameter|
199
- parameter.validate_template(@global_configuration.get_sdk_module,
200
- @global_configuration.should_symbolize_hash)
201
- end
202
- end
203
-
204
179
  # Builds the Http Request.
205
180
  # @param [Hash] endpoint_context The endpoint configuration to be used while executing the request.
206
181
  # @return [HttpRequest] An instance of HttpRequest.
207
182
  def build(endpoint_context)
208
- validate_templates
209
183
  _url = process_url
210
184
  _request_body = process_body
211
185
  _request_headers = process_headers(@global_configuration)
@@ -18,7 +18,6 @@ module CoreLibrary
18
18
  @is_date_response = false
19
19
  @is_response_array = false
20
20
  @is_response_void = false
21
- @type_group = nil
22
21
  end
23
22
 
24
23
  # Sets deserializer for the response.
@@ -159,22 +158,12 @@ module CoreLibrary
159
158
  end
160
159
  # rubocop:enable Naming/PredicateName
161
160
 
162
- # Sets type group for the response.
163
- # @param [String] type_group The oneOf/anyOf type group template.
164
- # @return [ResponseHandler] An updated instance of ResponseHandler.
165
- def type_group(type_group)
166
- @type_group = type_group
167
- self
168
- end
169
-
170
161
  # Main method to handle the response with all the set properties.
171
162
  # @param [HttpResponse] response The response received.
172
163
  # @param [Hash] global_errors The global errors object.
173
- # @param [Module] sdk_module The module of the SDK core library is being used for.
174
164
  # @param [Boolean] should_symbolize_hash Flag to symbolize the hash during response deserialization.
175
165
  # @return [Object] The deserialized response of the API Call.
176
- # rubocop:disable Style/OptionalBooleanParameter
177
- def handle(response, global_errors, sdk_module, should_symbolize_hash = false)
166
+ def handle(response, global_errors, should_symbolize_hash = false)
178
167
  @endpoint_logger.info("Validating response for #{@endpoint_name_for_logging}.")
179
168
 
180
169
  # checking Nullify 404
@@ -189,7 +178,7 @@ module CoreLibrary
189
178
  return if @is_response_void
190
179
 
191
180
  # applying deserializer if configured
192
- deserialized_value = apply_deserializer(response, sdk_module, should_symbolize_hash)
181
+ deserialized_value = apply_deserializer(response, should_symbolize_hash)
193
182
 
194
183
  # applying api_response if configured
195
184
  deserialized_value = apply_api_response(response, deserialized_value)
@@ -199,7 +188,6 @@ module CoreLibrary
199
188
 
200
189
  deserialized_value
201
190
  end
202
- # rubocop:enable Style/OptionalBooleanParameter
203
191
 
204
192
  # Validates the response provided and throws an error against the configured status code.
205
193
  # @param [HttpResponse] response The received response.
@@ -224,15 +212,12 @@ module CoreLibrary
224
212
  end
225
213
 
226
214
  # Applies deserializer to the response.
227
- # @param sdk_module Module of the SDK using the core library.
228
215
  # @param [Boolean] should_symbolize_hash Flag to symbolize the hash during response deserialization.
229
- def apply_deserializer(response, sdk_module, should_symbolize_hash)
216
+ def apply_deserializer(response, should_symbolize_hash)
230
217
  return apply_xml_deserializer(response) if @is_xml_response
231
218
  return response.raw_body if @deserializer.nil?
232
219
 
233
- if !@type_group.nil?
234
- @deserializer.call(@type_group, response.raw_body, sdk_module, should_symbolize_hash)
235
- elsif @datetime_format
220
+ if @datetime_format
236
221
  @deserializer.call(response.raw_body, @datetime_format, @is_response_array, should_symbolize_hash)
237
222
  elsif @is_date_response
238
223
  @deserializer.call(response.raw_body, @is_response_array, should_symbolize_hash)
@@ -9,7 +9,7 @@ module CoreLibrary
9
9
  @should_encode = false
10
10
  @default_content_type = nil
11
11
  @value_convertor = nil
12
- @template = nil
12
+ @validator = nil
13
13
  end
14
14
 
15
15
  # The setter for the parameter key.
@@ -88,34 +88,23 @@ module CoreLibrary
88
88
  @default_content_type
89
89
  end
90
90
 
91
- # Template setter in case of oneOf or anyOf.
92
- # @param [String] template Template for the parameter.
93
- # @return [Parameter] An updated instance of Parameter.
94
- def template(template)
95
- @template = template
91
+ # Setter for the validator.
92
+ # @param validator [callable] The validator function to be set.
93
+ # @return [Parameter] An updated instance of the Parameter class.
94
+ def validator(validator)
95
+ @validator = validator
96
96
  self
97
97
  end
98
98
 
99
- # Template getter in case a template is set.
100
- # @return [Parameter] Returns template for the parameter.
101
- def get_template
102
- @template
103
- end
104
-
105
99
  # Validates the parameter value to be sent in the request.
106
- # @raise [ValueError] The value error if the parameter is required but the value is nil.
100
+ # @raise [ArgumentError] If the parameter is required but the value is nil.
107
101
  def validate
108
102
  raise ArgumentError, "Required parameter #{@key} cannot be nil." if @is_required && @value.nil?
109
- end
110
103
 
111
- # Validates the oneOf/anyOf parameter value to be sent in the request.
112
- # @param [Module] sdk_module The module configured by the SDK.
113
- # @param [Boolean] should_symbolize_hash Whether to symbolize the hash during the deserialization of the value.
114
- # @raise [ValidationException] The validation error if value violates the oneOf/anyOf constraints.
115
- # rubocop:disable Style/OptionalBooleanParameter
116
- def validate_template(sdk_module, should_symbolize_hash = false)
117
- ApiHelper.validate_types(@value, @template, sdk_module, should_symbolize_hash) unless @value.nil?
104
+ return if @validator.nil?
105
+
106
+ validated_type = @validator.call(@value)
107
+ @value_convertor = proc { |value| validated_type.serialize(value) } if validated_type.is_valid
118
108
  end
119
- # rubocop:enable Style/OptionalBooleanParameter
120
109
  end
121
110
  end
@@ -0,0 +1,90 @@
1
+ module CoreLibrary
2
+ # Represents the AnyOf union type in the core library
3
+ class AnyOf < UnionType
4
+ # Initializes a new instance of AnyOf
5
+ # @param union_types [Array] The array of nested union types
6
+ # @param union_type_context [UnionTypeContext] The context for the union type
7
+ def initialize(union_types, union_type_context = UnionTypeContext.new)
8
+ super(union_types, union_type_context)
9
+ @collection_cases = nil
10
+ end
11
+
12
+ # Validates a value against the AnyOf union type
13
+ # @param value [Object] The value to validate
14
+ # @return [AnyOf] The validated AnyOf object
15
+ def validate(value)
16
+ context = @union_type_context
17
+ UnionTypeHelper.update_nested_flag_for_union_types(union_types)
18
+ is_optional_or_nullable = UnionTypeHelper.optional_or_nullable_case?(
19
+ context,
20
+ @union_types.map(&:union_type_context)
21
+ )
22
+
23
+ if value.nil? && is_optional_or_nullable
24
+ @is_valid = true
25
+ return self
26
+ end
27
+
28
+ if value.nil?
29
+ @is_valid = false
30
+ @error_messages = UnionTypeHelper.process_errors(value, @union_types, @error_messages,
31
+ union_type_context.is_nested, false)
32
+ end
33
+
34
+ validate_value_against_case(value, context)
35
+
36
+ unless @is_valid
37
+ @error_messages = UnionTypeHelper.process_errors(value, @union_types, @error_messages,
38
+ union_type_context.is_nested, false)
39
+ end
40
+
41
+ self
42
+ end
43
+
44
+ # Serializes a given value.
45
+ # @param value [Object] The value to be serialized.
46
+ # @return [Object, nil] The serialized representation of the value, or nil if the value is nil.
47
+ def serialize(value)
48
+ return nil if value.nil?
49
+
50
+ UnionTypeHelper.serialize_value(
51
+ value,
52
+ @union_type_context,
53
+ @collection_cases,
54
+ @union_types
55
+ )
56
+ end
57
+
58
+ # Deserializes a value based on the AnyOf union type
59
+ # @param value [Object] The value to deserialize
60
+ # @param should_symbolize [Boolean] Indicates whether the deserialized value should be symbolized.
61
+ # @return [Object, nil] The deserialized value, or nil if the input value is nil
62
+ def deserialize(value, should_symbolize: false)
63
+ return nil if value.nil?
64
+
65
+ UnionTypeHelper.deserialize_value(value, @union_type_context, @collection_cases,
66
+ @union_types, should_symbolize: should_symbolize)
67
+ end
68
+
69
+ private
70
+
71
+ # Validates a value against the appropriate case of the AnyOf union type
72
+ # @param value [Object] The value to validate
73
+ # @param context [UnionTypeContext] The context for the union type
74
+ def validate_value_against_case(value, context)
75
+ if context.is_array && context.is_dict && context.is_array_of_dict
76
+ @is_valid, @collection_cases = UnionTypeHelper.validate_array_of_dict_case(@union_types, value,
77
+ false)
78
+ elsif context.is_array && context.is_dict
79
+ @is_valid, @collection_cases = UnionTypeHelper.validate_dict_of_array_case(@union_types, value,
80
+ false)
81
+ elsif context.is_array
82
+ @is_valid, @collection_cases = UnionTypeHelper.validate_array_case(@union_types, value, false)
83
+ elsif context.is_dict
84
+ @is_valid, @collection_cases = UnionTypeHelper.validate_dict_case(@union_types, value, false)
85
+ else
86
+ @is_valid = UnionTypeHelper.get_matched_count(value, @union_types, false) >= 1
87
+ end
88
+ end
89
+ end
90
+ end