forked from loafle/openapi-generator-original
[codegen][python-experimental] Add configuration knob to disable JSON schema validation (#6227)
* Add knob to disable JSON schema structural validation * Add knob to disable JSON schema structural validation * Fix formatting issues * execute sample scripts * execute sample scripts * fix multipleOf validation issue * Add validation log for multipleOf. Add customizable validation checks. add unit tests for JSON schema validation * Add validation log for multipleOf. Add customizable validation checks. add unit tests for JSON schema validation * Add validation log for multipleOf. Add customizable validation checks. add unit tests for JSON schema validation * Add validation log for multipleOf. Add customizable validation checks. add unit tests for JSON schema validation. Fix for python 2 * address review comments
This commit is contained in:
@@ -2956,10 +2956,13 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
if (p.getExclusiveMaximum() != null) {
|
if (p.getExclusiveMaximum() != null) {
|
||||||
property.exclusiveMaximum = p.getExclusiveMaximum();
|
property.exclusiveMaximum = p.getExclusiveMaximum();
|
||||||
}
|
}
|
||||||
|
if (p.getMultipleOf() != null) {
|
||||||
|
property.multipleOf = p.getMultipleOf();
|
||||||
|
}
|
||||||
|
|
||||||
// check if any validation rule defined
|
// check if any validation rule defined
|
||||||
// exclusive* are noop without corresponding min/max
|
// exclusive* are noop without corresponding min/max
|
||||||
if (property.minimum != null || property.maximum != null)
|
if (property.minimum != null || property.maximum != null || p.getMultipleOf() != null)
|
||||||
property.hasValidation = true;
|
property.hasValidation = true;
|
||||||
|
|
||||||
} else if (ModelUtils.isBooleanSchema(p)) { // boolean type
|
} else if (ModelUtils.isBooleanSchema(p)) { // boolean type
|
||||||
@@ -3031,8 +3034,9 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
|
|
||||||
// check if any validation rule defined
|
// check if any validation rule defined
|
||||||
// exclusive* are noop without corresponding min/max
|
// exclusive* are noop without corresponding min/max
|
||||||
if (property.minimum != null || property.maximum != null)
|
if (property.minimum != null || property.maximum != null || p.getMultipleOf() != null) {
|
||||||
property.hasValidation = true;
|
property.hasValidation = true;
|
||||||
|
}
|
||||||
|
|
||||||
} else if (ModelUtils.isFreeFormObject(p)) {
|
} else if (ModelUtils.isFreeFormObject(p)) {
|
||||||
property.isFreeFormObject = true;
|
property.isFreeFormObject = true;
|
||||||
@@ -4151,7 +4155,7 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
if (codegenParameter.maximum != null || codegenParameter.minimum != null ||
|
if (codegenParameter.maximum != null || codegenParameter.minimum != null ||
|
||||||
codegenParameter.maxLength != null || codegenParameter.minLength != null ||
|
codegenParameter.maxLength != null || codegenParameter.minLength != null ||
|
||||||
codegenParameter.maxItems != null || codegenParameter.minItems != null ||
|
codegenParameter.maxItems != null || codegenParameter.minItems != null ||
|
||||||
codegenParameter.pattern != null) {
|
codegenParameter.pattern != null || codegenParameter.multipleOf != null) {
|
||||||
codegenParameter.hasValidation = true;
|
codegenParameter.hasValidation = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5629,7 +5633,7 @@ public class DefaultCodegen implements CodegenConfig {
|
|||||||
if (codegenParameter.maximum != null || codegenParameter.minimum != null ||
|
if (codegenParameter.maximum != null || codegenParameter.minimum != null ||
|
||||||
codegenParameter.maxLength != null || codegenParameter.minLength != null ||
|
codegenParameter.maxLength != null || codegenParameter.minLength != null ||
|
||||||
codegenParameter.maxItems != null || codegenParameter.minItems != null ||
|
codegenParameter.maxItems != null || codegenParameter.minItems != null ||
|
||||||
codegenParameter.pattern != null) {
|
codegenParameter.pattern != null || codegenParameter.multipleOf != null) {
|
||||||
codegenParameter.hasValidation = true;
|
codegenParameter.hasValidation = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,8 +14,15 @@ import urllib3
|
|||||||
|
|
||||||
import six
|
import six
|
||||||
from six.moves import http_client as httplib
|
from six.moves import http_client as httplib
|
||||||
|
from {{packageName}}.exceptions import ApiValueError
|
||||||
|
|
||||||
|
|
||||||
|
JSON_SCHEMA_VALIDATION_KEYWORDS = {
|
||||||
|
'multipleOf', 'maximum', 'exclusiveMaximum',
|
||||||
|
'minimum', 'exclusiveMinimum', 'maxLength',
|
||||||
|
'minLength', 'pattern', 'maxItems', 'minItems'
|
||||||
|
}
|
||||||
|
|
||||||
class Configuration(object):
|
class Configuration(object):
|
||||||
"""NOTE: This class is auto generated by OpenAPI Generator
|
"""NOTE: This class is auto generated by OpenAPI Generator
|
||||||
|
|
||||||
@@ -43,6 +50,19 @@ class Configuration(object):
|
|||||||
then all undeclared properties received by the server are injected into the
|
then all undeclared properties received by the server are injected into the
|
||||||
additional properties map. In that case, there are undeclared properties, and
|
additional properties map. In that case, there are undeclared properties, and
|
||||||
nothing to discard.
|
nothing to discard.
|
||||||
|
:param disabled_client_side_validations (string): Comma-separated list of
|
||||||
|
JSON schema validation keywords to disable JSON schema structural validation
|
||||||
|
rules. The following keywords may be specified: multipleOf, maximum,
|
||||||
|
exclusiveMaximum, minimum, exclusiveMinimum, maxLength, minLength, pattern,
|
||||||
|
maxItems, minItems.
|
||||||
|
By default, the validation is performed for data generated locally by the client
|
||||||
|
and data received from the server, independent of any validation performed by
|
||||||
|
the server side. If the input data does not satisfy the JSON schema validation
|
||||||
|
rules specified in the OpenAPI document, an exception is raised.
|
||||||
|
If disabled_client_side_validations is set, structural validation is
|
||||||
|
disabled. This can be useful to troubleshoot data validation problem, such as
|
||||||
|
when the OpenAPI document validation rules do not match the actual API data
|
||||||
|
received by the server.
|
||||||
{{#hasHttpSignatureMethods}}
|
{{#hasHttpSignatureMethods}}
|
||||||
:param signing_info: Configuration parameters for the HTTP signature security scheme.
|
:param signing_info: Configuration parameters for the HTTP signature security scheme.
|
||||||
Must be an instance of {{{packageName}}}.signing.HttpSigningConfiguration
|
Must be an instance of {{{packageName}}}.signing.HttpSigningConfiguration
|
||||||
@@ -139,6 +159,7 @@ conf = {{{packageName}}}.Configuration(
|
|||||||
api_key=None, api_key_prefix=None,
|
api_key=None, api_key_prefix=None,
|
||||||
username=None, password=None,
|
username=None, password=None,
|
||||||
discard_unknown_keys=False,
|
discard_unknown_keys=False,
|
||||||
|
disabled_client_side_validations="",
|
||||||
{{#hasHttpSignatureMethods}}
|
{{#hasHttpSignatureMethods}}
|
||||||
signing_info=None,
|
signing_info=None,
|
||||||
{{/hasHttpSignatureMethods}}
|
{{/hasHttpSignatureMethods}}
|
||||||
@@ -172,6 +193,7 @@ conf = {{{packageName}}}.Configuration(
|
|||||||
"""Password for HTTP basic authentication
|
"""Password for HTTP basic authentication
|
||||||
"""
|
"""
|
||||||
self.discard_unknown_keys = discard_unknown_keys
|
self.discard_unknown_keys = discard_unknown_keys
|
||||||
|
self.disabled_client_side_validations = disabled_client_side_validations
|
||||||
{{#hasHttpSignatureMethods}}
|
{{#hasHttpSignatureMethods}}
|
||||||
if signing_info is not None:
|
if signing_info is not None:
|
||||||
signing_info.host = host
|
signing_info.host = host
|
||||||
@@ -277,6 +299,13 @@ conf = {{{packageName}}}.Configuration(
|
|||||||
|
|
||||||
def __setattr__(self, name, value):
|
def __setattr__(self, name, value):
|
||||||
object.__setattr__(self, name, value)
|
object.__setattr__(self, name, value)
|
||||||
|
if name == 'disabled_client_side_validations':
|
||||||
|
s = set(filter(None, value.split(',')))
|
||||||
|
for v in s:
|
||||||
|
if v not in JSON_SCHEMA_VALIDATION_KEYWORDS:
|
||||||
|
raise ApiValueError(
|
||||||
|
"Invalid keyword: '{0}''".format(v))
|
||||||
|
self._disabled_client_side_validations = s
|
||||||
{{#hasHttpSignatureMethods}}
|
{{#hasHttpSignatureMethods}}
|
||||||
if name == "signing_info" and value is not None:
|
if name == "signing_info" and value is not None:
|
||||||
# Ensure the host paramater from signing info is the same as
|
# Ensure the host paramater from signing info is the same as
|
||||||
|
|||||||
@@ -376,7 +376,8 @@ class Endpoint(object):
|
|||||||
check_validations(
|
check_validations(
|
||||||
self.validations,
|
self.validations,
|
||||||
(param,),
|
(param,),
|
||||||
kwargs[param]
|
kwargs[param],
|
||||||
|
configuration=self.api_client.configuration
|
||||||
)
|
)
|
||||||
|
|
||||||
if kwargs['_check_input_type'] is False:
|
if kwargs['_check_input_type'] is False:
|
||||||
|
|||||||
@@ -57,6 +57,9 @@
|
|||||||
{{#-first}}'flags': (re.{{.}}{{/-first}}{{^-first}} re.{{.}}{{/-first}}{{^-last}} | {{/-last}}{{#-last}}){{/-last}}{{/vendorExtensions.x-modifiers}}
|
{{#-first}}'flags': (re.{{.}}{{/-first}}{{^-first}} re.{{.}}{{/-first}}{{^-last}} | {{/-last}}{{#-last}}){{/-last}}{{/vendorExtensions.x-modifiers}}
|
||||||
},
|
},
|
||||||
{{/pattern}}
|
{{/pattern}}
|
||||||
|
{{#multipleOf}}
|
||||||
|
'multiple_of': {{multipleOf}},
|
||||||
|
{{/multipleOf}}
|
||||||
},
|
},
|
||||||
{{/hasValidation}}
|
{{/hasValidation}}
|
||||||
{{/requiredVars}}
|
{{/requiredVars}}
|
||||||
@@ -87,6 +90,9 @@
|
|||||||
{{#-first}}'flags': (re.{{.}}{{/-first}}{{^-first}} re.{{.}}{{/-first}}{{^-last}} | {{/-last}}{{#-last}}){{/-last}}{{/vendorExtensions.x-modifiers}}
|
{{#-first}}'flags': (re.{{.}}{{/-first}}{{^-first}} re.{{.}}{{/-first}}{{^-last}} | {{/-last}}{{#-last}}){{/-last}}{{/vendorExtensions.x-modifiers}}
|
||||||
},
|
},
|
||||||
{{/pattern}}
|
{{/pattern}}
|
||||||
|
{{#multipleOf}}
|
||||||
|
'multiple_of': {{multipleOf}},
|
||||||
|
{{/multipleOf}}
|
||||||
},
|
},
|
||||||
{{/hasValidation}}
|
{{/hasValidation}}
|
||||||
{{/optionalVars}}
|
{{/optionalVars}}
|
||||||
|
|||||||
@@ -45,6 +45,7 @@
|
|||||||
check_validations(
|
check_validations(
|
||||||
self.validations,
|
self.validations,
|
||||||
(name,),
|
(name,),
|
||||||
value
|
value,
|
||||||
|
self._configuration
|
||||||
)
|
)
|
||||||
self.__dict__['_data_store'][name] = value
|
self.__dict__['_data_store'][name] = value
|
||||||
@@ -369,17 +369,50 @@ def check_allowed_values(allowed_values, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def check_validations(validations, input_variable_path, input_values):
|
def is_json_validation_enabled(schema_keyword, configuration=None):
|
||||||
|
"""Returns true if JSON schema validation is enabled for the specified
|
||||||
|
validation keyword. This can be used to skip JSON schema structural validation
|
||||||
|
as requested in the configuration.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
schema_keyword (string): the name of a JSON schema validation keyword.
|
||||||
|
configuration (Configuration): the configuration class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
return (configuration is None or
|
||||||
|
not hasattr(configuration, '_disabled_client_side_validations') or
|
||||||
|
schema_keyword not in configuration._disabled_client_side_validations)
|
||||||
|
|
||||||
|
|
||||||
|
def check_validations(
|
||||||
|
validations, input_variable_path, input_values,
|
||||||
|
configuration=None):
|
||||||
"""Raises an exception if the input_values are invalid
|
"""Raises an exception if the input_values are invalid
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
validations (dict): the validation dictionary
|
validations (dict): the validation dictionary.
|
||||||
input_variable_path (tuple): the path to the input variable
|
input_variable_path (tuple): the path to the input variable.
|
||||||
input_values (list/str/int/float/date/datetime): the values that we
|
input_values (list/str/int/float/date/datetime): the values that we
|
||||||
are checking
|
are checking.
|
||||||
|
configuration (Configuration): the configuration class.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
current_validations = validations[input_variable_path]
|
current_validations = validations[input_variable_path]
|
||||||
if ('max_length' in current_validations and
|
if (is_json_validation_enabled('multipleOf', configuration) and
|
||||||
|
'multiple_of' in current_validations and
|
||||||
|
isinstance(input_values, (int, float)) and
|
||||||
|
not (float(input_values) / current_validations['multiple_of']).is_integer()):
|
||||||
|
# Note 'multipleOf' will be as good as the floating point arithmetic.
|
||||||
|
raise ApiValueError(
|
||||||
|
"Invalid value for `%s`, value must be a multiple of "
|
||||||
|
"`%s`" % (
|
||||||
|
input_variable_path[0],
|
||||||
|
current_validations['multiple_of']
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if (is_json_validation_enabled('maxLength', configuration) and
|
||||||
|
'max_length' in current_validations and
|
||||||
len(input_values) > current_validations['max_length']):
|
len(input_values) > current_validations['max_length']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, length must be less than or equal to "
|
"Invalid value for `%s`, length must be less than or equal to "
|
||||||
@@ -389,7 +422,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('min_length' in current_validations and
|
if (is_json_validation_enabled('minLength', configuration) and
|
||||||
|
'min_length' in current_validations and
|
||||||
len(input_values) < current_validations['min_length']):
|
len(input_values) < current_validations['min_length']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, length must be greater than or equal to "
|
"Invalid value for `%s`, length must be greater than or equal to "
|
||||||
@@ -399,7 +433,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('max_items' in current_validations and
|
if (is_json_validation_enabled('maxItems', configuration) and
|
||||||
|
'max_items' in current_validations and
|
||||||
len(input_values) > current_validations['max_items']):
|
len(input_values) > current_validations['max_items']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, number of items must be less than or "
|
"Invalid value for `%s`, number of items must be less than or "
|
||||||
@@ -409,7 +444,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('min_items' in current_validations and
|
if (is_json_validation_enabled('minItems', configuration) and
|
||||||
|
'min_items' in current_validations and
|
||||||
len(input_values) < current_validations['min_items']):
|
len(input_values) < current_validations['min_items']):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"Invalid value for `%s`, number of items must be greater than or "
|
"Invalid value for `%s`, number of items must be greater than or "
|
||||||
@@ -432,7 +468,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
max_val = input_values
|
max_val = input_values
|
||||||
min_val = input_values
|
min_val = input_values
|
||||||
|
|
||||||
if ('exclusive_maximum' in current_validations and
|
if (is_json_validation_enabled('exclusiveMaximum', configuration) and
|
||||||
|
'exclusive_maximum' in current_validations and
|
||||||
max_val >= current_validations['exclusive_maximum']):
|
max_val >= current_validations['exclusive_maximum']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, must be a value less than `%s`" % (
|
"Invalid value for `%s`, must be a value less than `%s`" % (
|
||||||
@@ -441,7 +478,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('inclusive_maximum' in current_validations and
|
if (is_json_validation_enabled('maximum', configuration) and
|
||||||
|
'inclusive_maximum' in current_validations and
|
||||||
max_val > current_validations['inclusive_maximum']):
|
max_val > current_validations['inclusive_maximum']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, must be a value less than or equal to "
|
"Invalid value for `%s`, must be a value less than or equal to "
|
||||||
@@ -451,7 +489,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('exclusive_minimum' in current_validations and
|
if (is_json_validation_enabled('exclusiveMinimum', configuration) and
|
||||||
|
'exclusive_minimum' in current_validations and
|
||||||
min_val <= current_validations['exclusive_minimum']):
|
min_val <= current_validations['exclusive_minimum']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, must be a value greater than `%s`" %
|
"Invalid value for `%s`, must be a value greater than `%s`" %
|
||||||
@@ -461,7 +500,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('inclusive_minimum' in current_validations and
|
if (is_json_validation_enabled('minimum', configuration) and
|
||||||
|
'inclusive_minimum' in current_validations and
|
||||||
min_val < current_validations['inclusive_minimum']):
|
min_val < current_validations['inclusive_minimum']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, must be a value greater than or equal "
|
"Invalid value for `%s`, must be a value greater than or equal "
|
||||||
@@ -471,7 +511,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
flags = current_validations.get('regex', {}).get('flags', 0)
|
flags = current_validations.get('regex', {}).get('flags', 0)
|
||||||
if ('regex' in current_validations and
|
if (is_json_validation_enabled('pattern', configuration) and
|
||||||
|
'regex' in current_validations and
|
||||||
not re.search(current_validations['regex']['pattern'],
|
not re.search(current_validations['regex']['pattern'],
|
||||||
input_values, flags=flags)):
|
input_values, flags=flags)):
|
||||||
err_msg = r"Invalid value for `%s`, must match regular expression `%s`" % (
|
err_msg = r"Invalid value for `%s`, must match regular expression `%s`" % (
|
||||||
|
|||||||
@@ -1426,6 +1426,7 @@ components:
|
|||||||
type: integer
|
type: integer
|
||||||
maximum: 100
|
maximum: 100
|
||||||
minimum: 10
|
minimum: 10
|
||||||
|
multipleOf: 2
|
||||||
int32:
|
int32:
|
||||||
type: integer
|
type: integer
|
||||||
format: int32
|
format: int32
|
||||||
@@ -1438,6 +1439,7 @@ components:
|
|||||||
maximum: 543.2
|
maximum: 543.2
|
||||||
minimum: 32.1
|
minimum: 32.1
|
||||||
type: number
|
type: number
|
||||||
|
multipleOf: 32.5
|
||||||
float:
|
float:
|
||||||
type: number
|
type: number
|
||||||
format: float
|
format: float
|
||||||
|
|||||||
@@ -19,8 +19,15 @@ import urllib3
|
|||||||
|
|
||||||
import six
|
import six
|
||||||
from six.moves import http_client as httplib
|
from six.moves import http_client as httplib
|
||||||
|
from petstore_api.exceptions import ApiValueError
|
||||||
|
|
||||||
|
|
||||||
|
JSON_SCHEMA_VALIDATION_KEYWORDS = {
|
||||||
|
'multipleOf', 'maximum', 'exclusiveMaximum',
|
||||||
|
'minimum', 'exclusiveMinimum', 'maxLength',
|
||||||
|
'minLength', 'pattern', 'maxItems', 'minItems'
|
||||||
|
}
|
||||||
|
|
||||||
class Configuration(object):
|
class Configuration(object):
|
||||||
"""NOTE: This class is auto generated by OpenAPI Generator
|
"""NOTE: This class is auto generated by OpenAPI Generator
|
||||||
|
|
||||||
@@ -48,6 +55,19 @@ class Configuration(object):
|
|||||||
then all undeclared properties received by the server are injected into the
|
then all undeclared properties received by the server are injected into the
|
||||||
additional properties map. In that case, there are undeclared properties, and
|
additional properties map. In that case, there are undeclared properties, and
|
||||||
nothing to discard.
|
nothing to discard.
|
||||||
|
:param disabled_client_side_validations (string): Comma-separated list of
|
||||||
|
JSON schema validation keywords to disable JSON schema structural validation
|
||||||
|
rules. The following keywords may be specified: multipleOf, maximum,
|
||||||
|
exclusiveMaximum, minimum, exclusiveMinimum, maxLength, minLength, pattern,
|
||||||
|
maxItems, minItems.
|
||||||
|
By default, the validation is performed for data generated locally by the client
|
||||||
|
and data received from the server, independent of any validation performed by
|
||||||
|
the server side. If the input data does not satisfy the JSON schema validation
|
||||||
|
rules specified in the OpenAPI document, an exception is raised.
|
||||||
|
If disabled_client_side_validations is set, structural validation is
|
||||||
|
disabled. This can be useful to troubleshoot data validation problem, such as
|
||||||
|
when the OpenAPI document validation rules do not match the actual API data
|
||||||
|
received by the server.
|
||||||
|
|
||||||
:Example:
|
:Example:
|
||||||
|
|
||||||
@@ -93,6 +113,7 @@ conf = petstore_api.Configuration(
|
|||||||
api_key=None, api_key_prefix=None,
|
api_key=None, api_key_prefix=None,
|
||||||
username=None, password=None,
|
username=None, password=None,
|
||||||
discard_unknown_keys=False,
|
discard_unknown_keys=False,
|
||||||
|
disabled_client_side_validations="",
|
||||||
):
|
):
|
||||||
"""Constructor
|
"""Constructor
|
||||||
"""
|
"""
|
||||||
@@ -123,6 +144,7 @@ conf = petstore_api.Configuration(
|
|||||||
"""Password for HTTP basic authentication
|
"""Password for HTTP basic authentication
|
||||||
"""
|
"""
|
||||||
self.discard_unknown_keys = discard_unknown_keys
|
self.discard_unknown_keys = discard_unknown_keys
|
||||||
|
self.disabled_client_side_validations = disabled_client_side_validations
|
||||||
self.access_token = None
|
self.access_token = None
|
||||||
"""access token for OAuth/Bearer
|
"""access token for OAuth/Bearer
|
||||||
"""
|
"""
|
||||||
@@ -201,6 +223,13 @@ conf = petstore_api.Configuration(
|
|||||||
|
|
||||||
def __setattr__(self, name, value):
|
def __setattr__(self, name, value):
|
||||||
object.__setattr__(self, name, value)
|
object.__setattr__(self, name, value)
|
||||||
|
if name == 'disabled_client_side_validations':
|
||||||
|
s = set(filter(None, value.split(',')))
|
||||||
|
for v in s:
|
||||||
|
if v not in JSON_SCHEMA_VALIDATION_KEYWORDS:
|
||||||
|
raise ApiValueError(
|
||||||
|
"Invalid keyword: '{0}''".format(v))
|
||||||
|
self._disabled_client_side_validations = s
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def set_default(cls, default):
|
def set_default(cls, default):
|
||||||
|
|||||||
@@ -249,7 +249,8 @@ class Endpoint(object):
|
|||||||
check_validations(
|
check_validations(
|
||||||
self.validations,
|
self.validations,
|
||||||
(param,),
|
(param,),
|
||||||
kwargs[param]
|
kwargs[param],
|
||||||
|
configuration=self.api_client.configuration
|
||||||
)
|
)
|
||||||
|
|
||||||
if kwargs['_check_input_type'] is False:
|
if kwargs['_check_input_type'] is False:
|
||||||
|
|||||||
@@ -2192,7 +2192,8 @@ class Endpoint(object):
|
|||||||
check_validations(
|
check_validations(
|
||||||
self.validations,
|
self.validations,
|
||||||
(param,),
|
(param,),
|
||||||
kwargs[param]
|
kwargs[param],
|
||||||
|
configuration=self.api_client.configuration
|
||||||
)
|
)
|
||||||
|
|
||||||
if kwargs['_check_input_type'] is False:
|
if kwargs['_check_input_type'] is False:
|
||||||
|
|||||||
@@ -251,7 +251,8 @@ class Endpoint(object):
|
|||||||
check_validations(
|
check_validations(
|
||||||
self.validations,
|
self.validations,
|
||||||
(param,),
|
(param,),
|
||||||
kwargs[param]
|
kwargs[param],
|
||||||
|
configuration=self.api_client.configuration
|
||||||
)
|
)
|
||||||
|
|
||||||
if kwargs['_check_input_type'] is False:
|
if kwargs['_check_input_type'] is False:
|
||||||
|
|||||||
@@ -1256,7 +1256,8 @@ class Endpoint(object):
|
|||||||
check_validations(
|
check_validations(
|
||||||
self.validations,
|
self.validations,
|
||||||
(param,),
|
(param,),
|
||||||
kwargs[param]
|
kwargs[param],
|
||||||
|
configuration=self.api_client.configuration
|
||||||
)
|
)
|
||||||
|
|
||||||
if kwargs['_check_input_type'] is False:
|
if kwargs['_check_input_type'] is False:
|
||||||
|
|||||||
@@ -590,7 +590,8 @@ class Endpoint(object):
|
|||||||
check_validations(
|
check_validations(
|
||||||
self.validations,
|
self.validations,
|
||||||
(param,),
|
(param,),
|
||||||
kwargs[param]
|
kwargs[param],
|
||||||
|
configuration=self.api_client.configuration
|
||||||
)
|
)
|
||||||
|
|
||||||
if kwargs['_check_input_type'] is False:
|
if kwargs['_check_input_type'] is False:
|
||||||
|
|||||||
@@ -1049,7 +1049,8 @@ class Endpoint(object):
|
|||||||
check_validations(
|
check_validations(
|
||||||
self.validations,
|
self.validations,
|
||||||
(param,),
|
(param,),
|
||||||
kwargs[param]
|
kwargs[param],
|
||||||
|
configuration=self.api_client.configuration
|
||||||
)
|
)
|
||||||
|
|
||||||
if kwargs['_check_input_type'] is False:
|
if kwargs['_check_input_type'] is False:
|
||||||
|
|||||||
@@ -20,8 +20,15 @@ import urllib3
|
|||||||
|
|
||||||
import six
|
import six
|
||||||
from six.moves import http_client as httplib
|
from six.moves import http_client as httplib
|
||||||
|
from petstore_api.exceptions import ApiValueError
|
||||||
|
|
||||||
|
|
||||||
|
JSON_SCHEMA_VALIDATION_KEYWORDS = {
|
||||||
|
'multipleOf', 'maximum', 'exclusiveMaximum',
|
||||||
|
'minimum', 'exclusiveMinimum', 'maxLength',
|
||||||
|
'minLength', 'pattern', 'maxItems', 'minItems'
|
||||||
|
}
|
||||||
|
|
||||||
class Configuration(object):
|
class Configuration(object):
|
||||||
"""NOTE: This class is auto generated by OpenAPI Generator
|
"""NOTE: This class is auto generated by OpenAPI Generator
|
||||||
|
|
||||||
@@ -49,6 +56,19 @@ class Configuration(object):
|
|||||||
then all undeclared properties received by the server are injected into the
|
then all undeclared properties received by the server are injected into the
|
||||||
additional properties map. In that case, there are undeclared properties, and
|
additional properties map. In that case, there are undeclared properties, and
|
||||||
nothing to discard.
|
nothing to discard.
|
||||||
|
:param disabled_client_side_validations (string): Comma-separated list of
|
||||||
|
JSON schema validation keywords to disable JSON schema structural validation
|
||||||
|
rules. The following keywords may be specified: multipleOf, maximum,
|
||||||
|
exclusiveMaximum, minimum, exclusiveMinimum, maxLength, minLength, pattern,
|
||||||
|
maxItems, minItems.
|
||||||
|
By default, the validation is performed for data generated locally by the client
|
||||||
|
and data received from the server, independent of any validation performed by
|
||||||
|
the server side. If the input data does not satisfy the JSON schema validation
|
||||||
|
rules specified in the OpenAPI document, an exception is raised.
|
||||||
|
If disabled_client_side_validations is set, structural validation is
|
||||||
|
disabled. This can be useful to troubleshoot data validation problem, such as
|
||||||
|
when the OpenAPI document validation rules do not match the actual API data
|
||||||
|
received by the server.
|
||||||
|
|
||||||
:Example:
|
:Example:
|
||||||
|
|
||||||
@@ -94,6 +114,7 @@ conf = petstore_api.Configuration(
|
|||||||
api_key=None, api_key_prefix=None,
|
api_key=None, api_key_prefix=None,
|
||||||
username=None, password=None,
|
username=None, password=None,
|
||||||
discard_unknown_keys=False,
|
discard_unknown_keys=False,
|
||||||
|
disabled_client_side_validations="",
|
||||||
):
|
):
|
||||||
"""Constructor
|
"""Constructor
|
||||||
"""
|
"""
|
||||||
@@ -124,6 +145,7 @@ conf = petstore_api.Configuration(
|
|||||||
"""Password for HTTP basic authentication
|
"""Password for HTTP basic authentication
|
||||||
"""
|
"""
|
||||||
self.discard_unknown_keys = discard_unknown_keys
|
self.discard_unknown_keys = discard_unknown_keys
|
||||||
|
self.disabled_client_side_validations = disabled_client_side_validations
|
||||||
self.access_token = None
|
self.access_token = None
|
||||||
"""access token for OAuth/Bearer
|
"""access token for OAuth/Bearer
|
||||||
"""
|
"""
|
||||||
@@ -205,6 +227,13 @@ conf = petstore_api.Configuration(
|
|||||||
|
|
||||||
def __setattr__(self, name, value):
|
def __setattr__(self, name, value):
|
||||||
object.__setattr__(self, name, value)
|
object.__setattr__(self, name, value)
|
||||||
|
if name == 'disabled_client_side_validations':
|
||||||
|
s = set(filter(None, value.split(',')))
|
||||||
|
for v in s:
|
||||||
|
if v not in JSON_SCHEMA_VALIDATION_KEYWORDS:
|
||||||
|
raise ApiValueError(
|
||||||
|
"Invalid keyword: '{0}''".format(v))
|
||||||
|
self._disabled_client_side_validations = s
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def set_default(cls, default):
|
def set_default(cls, default):
|
||||||
|
|||||||
@@ -112,7 +112,8 @@ class OpenApiModel(object):
|
|||||||
check_validations(
|
check_validations(
|
||||||
self.validations,
|
self.validations,
|
||||||
(name,),
|
(name,),
|
||||||
value
|
value,
|
||||||
|
self._configuration
|
||||||
)
|
)
|
||||||
self.__dict__['_data_store'][name] = value
|
self.__dict__['_data_store'][name] = value
|
||||||
|
|
||||||
@@ -635,17 +636,50 @@ def check_allowed_values(allowed_values, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def check_validations(validations, input_variable_path, input_values):
|
def is_json_validation_enabled(schema_keyword, configuration=None):
|
||||||
|
"""Returns true if JSON schema validation is enabled for the specified
|
||||||
|
validation keyword. This can be used to skip JSON schema structural validation
|
||||||
|
as requested in the configuration.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
schema_keyword (string): the name of a JSON schema validation keyword.
|
||||||
|
configuration (Configuration): the configuration class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
return (configuration is None or
|
||||||
|
not hasattr(configuration, '_disabled_client_side_validations') or
|
||||||
|
schema_keyword not in configuration._disabled_client_side_validations)
|
||||||
|
|
||||||
|
|
||||||
|
def check_validations(
|
||||||
|
validations, input_variable_path, input_values,
|
||||||
|
configuration=None):
|
||||||
"""Raises an exception if the input_values are invalid
|
"""Raises an exception if the input_values are invalid
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
validations (dict): the validation dictionary
|
validations (dict): the validation dictionary.
|
||||||
input_variable_path (tuple): the path to the input variable
|
input_variable_path (tuple): the path to the input variable.
|
||||||
input_values (list/str/int/float/date/datetime): the values that we
|
input_values (list/str/int/float/date/datetime): the values that we
|
||||||
are checking
|
are checking.
|
||||||
|
configuration (Configuration): the configuration class.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
current_validations = validations[input_variable_path]
|
current_validations = validations[input_variable_path]
|
||||||
if ('max_length' in current_validations and
|
if (is_json_validation_enabled('multipleOf', configuration) and
|
||||||
|
'multiple_of' in current_validations and
|
||||||
|
isinstance(input_values, (int, float)) and
|
||||||
|
not (float(input_values) / current_validations['multiple_of']).is_integer()):
|
||||||
|
# Note 'multipleOf' will be as good as the floating point arithmetic.
|
||||||
|
raise ApiValueError(
|
||||||
|
"Invalid value for `%s`, value must be a multiple of "
|
||||||
|
"`%s`" % (
|
||||||
|
input_variable_path[0],
|
||||||
|
current_validations['multiple_of']
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if (is_json_validation_enabled('maxLength', configuration) and
|
||||||
|
'max_length' in current_validations and
|
||||||
len(input_values) > current_validations['max_length']):
|
len(input_values) > current_validations['max_length']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, length must be less than or equal to "
|
"Invalid value for `%s`, length must be less than or equal to "
|
||||||
@@ -655,7 +689,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('min_length' in current_validations and
|
if (is_json_validation_enabled('minLength', configuration) and
|
||||||
|
'min_length' in current_validations and
|
||||||
len(input_values) < current_validations['min_length']):
|
len(input_values) < current_validations['min_length']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, length must be greater than or equal to "
|
"Invalid value for `%s`, length must be greater than or equal to "
|
||||||
@@ -665,7 +700,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('max_items' in current_validations and
|
if (is_json_validation_enabled('maxItems', configuration) and
|
||||||
|
'max_items' in current_validations and
|
||||||
len(input_values) > current_validations['max_items']):
|
len(input_values) > current_validations['max_items']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, number of items must be less than or "
|
"Invalid value for `%s`, number of items must be less than or "
|
||||||
@@ -675,7 +711,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('min_items' in current_validations and
|
if (is_json_validation_enabled('minItems', configuration) and
|
||||||
|
'min_items' in current_validations and
|
||||||
len(input_values) < current_validations['min_items']):
|
len(input_values) < current_validations['min_items']):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"Invalid value for `%s`, number of items must be greater than or "
|
"Invalid value for `%s`, number of items must be greater than or "
|
||||||
@@ -698,7 +735,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
max_val = input_values
|
max_val = input_values
|
||||||
min_val = input_values
|
min_val = input_values
|
||||||
|
|
||||||
if ('exclusive_maximum' in current_validations and
|
if (is_json_validation_enabled('exclusiveMaximum', configuration) and
|
||||||
|
'exclusive_maximum' in current_validations and
|
||||||
max_val >= current_validations['exclusive_maximum']):
|
max_val >= current_validations['exclusive_maximum']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, must be a value less than `%s`" % (
|
"Invalid value for `%s`, must be a value less than `%s`" % (
|
||||||
@@ -707,7 +745,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('inclusive_maximum' in current_validations and
|
if (is_json_validation_enabled('maximum', configuration) and
|
||||||
|
'inclusive_maximum' in current_validations and
|
||||||
max_val > current_validations['inclusive_maximum']):
|
max_val > current_validations['inclusive_maximum']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, must be a value less than or equal to "
|
"Invalid value for `%s`, must be a value less than or equal to "
|
||||||
@@ -717,7 +756,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('exclusive_minimum' in current_validations and
|
if (is_json_validation_enabled('exclusiveMinimum', configuration) and
|
||||||
|
'exclusive_minimum' in current_validations and
|
||||||
min_val <= current_validations['exclusive_minimum']):
|
min_val <= current_validations['exclusive_minimum']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, must be a value greater than `%s`" %
|
"Invalid value for `%s`, must be a value greater than `%s`" %
|
||||||
@@ -727,7 +767,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('inclusive_minimum' in current_validations and
|
if (is_json_validation_enabled('minimum', configuration) and
|
||||||
|
'inclusive_minimum' in current_validations and
|
||||||
min_val < current_validations['inclusive_minimum']):
|
min_val < current_validations['inclusive_minimum']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, must be a value greater than or equal "
|
"Invalid value for `%s`, must be a value greater than or equal "
|
||||||
@@ -737,7 +778,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
flags = current_validations.get('regex', {}).get('flags', 0)
|
flags = current_validations.get('regex', {}).get('flags', 0)
|
||||||
if ('regex' in current_validations and
|
if (is_json_validation_enabled('pattern', configuration) and
|
||||||
|
'regex' in current_validations and
|
||||||
not re.search(current_validations['regex']['pattern'],
|
not re.search(current_validations['regex']['pattern'],
|
||||||
input_values, flags=flags)):
|
input_values, flags=flags)):
|
||||||
err_msg = r"Invalid value for `%s`, must match regular expression `%s`" % (
|
err_msg = r"Invalid value for `%s`, must match regular expression `%s`" % (
|
||||||
|
|||||||
@@ -20,8 +20,15 @@ import urllib3
|
|||||||
|
|
||||||
import six
|
import six
|
||||||
from six.moves import http_client as httplib
|
from six.moves import http_client as httplib
|
||||||
|
from petstore_api.exceptions import ApiValueError
|
||||||
|
|
||||||
|
|
||||||
|
JSON_SCHEMA_VALIDATION_KEYWORDS = {
|
||||||
|
'multipleOf', 'maximum', 'exclusiveMaximum',
|
||||||
|
'minimum', 'exclusiveMinimum', 'maxLength',
|
||||||
|
'minLength', 'pattern', 'maxItems', 'minItems'
|
||||||
|
}
|
||||||
|
|
||||||
class Configuration(object):
|
class Configuration(object):
|
||||||
"""NOTE: This class is auto generated by OpenAPI Generator
|
"""NOTE: This class is auto generated by OpenAPI Generator
|
||||||
|
|
||||||
@@ -49,6 +56,19 @@ class Configuration(object):
|
|||||||
then all undeclared properties received by the server are injected into the
|
then all undeclared properties received by the server are injected into the
|
||||||
additional properties map. In that case, there are undeclared properties, and
|
additional properties map. In that case, there are undeclared properties, and
|
||||||
nothing to discard.
|
nothing to discard.
|
||||||
|
:param disabled_client_side_validations (string): Comma-separated list of
|
||||||
|
JSON schema validation keywords to disable JSON schema structural validation
|
||||||
|
rules. The following keywords may be specified: multipleOf, maximum,
|
||||||
|
exclusiveMaximum, minimum, exclusiveMinimum, maxLength, minLength, pattern,
|
||||||
|
maxItems, minItems.
|
||||||
|
By default, the validation is performed for data generated locally by the client
|
||||||
|
and data received from the server, independent of any validation performed by
|
||||||
|
the server side. If the input data does not satisfy the JSON schema validation
|
||||||
|
rules specified in the OpenAPI document, an exception is raised.
|
||||||
|
If disabled_client_side_validations is set, structural validation is
|
||||||
|
disabled. This can be useful to troubleshoot data validation problem, such as
|
||||||
|
when the OpenAPI document validation rules do not match the actual API data
|
||||||
|
received by the server.
|
||||||
|
|
||||||
:Example:
|
:Example:
|
||||||
|
|
||||||
@@ -94,6 +114,7 @@ conf = petstore_api.Configuration(
|
|||||||
api_key=None, api_key_prefix=None,
|
api_key=None, api_key_prefix=None,
|
||||||
username=None, password=None,
|
username=None, password=None,
|
||||||
discard_unknown_keys=False,
|
discard_unknown_keys=False,
|
||||||
|
disabled_client_side_validations="",
|
||||||
):
|
):
|
||||||
"""Constructor
|
"""Constructor
|
||||||
"""
|
"""
|
||||||
@@ -124,6 +145,7 @@ conf = petstore_api.Configuration(
|
|||||||
"""Password for HTTP basic authentication
|
"""Password for HTTP basic authentication
|
||||||
"""
|
"""
|
||||||
self.discard_unknown_keys = discard_unknown_keys
|
self.discard_unknown_keys = discard_unknown_keys
|
||||||
|
self.disabled_client_side_validations = disabled_client_side_validations
|
||||||
self.access_token = None
|
self.access_token = None
|
||||||
"""access token for OAuth/Bearer
|
"""access token for OAuth/Bearer
|
||||||
"""
|
"""
|
||||||
@@ -205,6 +227,13 @@ conf = petstore_api.Configuration(
|
|||||||
|
|
||||||
def __setattr__(self, name, value):
|
def __setattr__(self, name, value):
|
||||||
object.__setattr__(self, name, value)
|
object.__setattr__(self, name, value)
|
||||||
|
if name == 'disabled_client_side_validations':
|
||||||
|
s = set(filter(None, value.split(',')))
|
||||||
|
for v in s:
|
||||||
|
if v not in JSON_SCHEMA_VALIDATION_KEYWORDS:
|
||||||
|
raise ApiValueError(
|
||||||
|
"Invalid keyword: '{0}''".format(v))
|
||||||
|
self._disabled_client_side_validations = s
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def set_default(cls, default):
|
def set_default(cls, default):
|
||||||
|
|||||||
@@ -20,8 +20,15 @@ import urllib3
|
|||||||
|
|
||||||
import six
|
import six
|
||||||
from six.moves import http_client as httplib
|
from six.moves import http_client as httplib
|
||||||
|
from petstore_api.exceptions import ApiValueError
|
||||||
|
|
||||||
|
|
||||||
|
JSON_SCHEMA_VALIDATION_KEYWORDS = {
|
||||||
|
'multipleOf', 'maximum', 'exclusiveMaximum',
|
||||||
|
'minimum', 'exclusiveMinimum', 'maxLength',
|
||||||
|
'minLength', 'pattern', 'maxItems', 'minItems'
|
||||||
|
}
|
||||||
|
|
||||||
class Configuration(object):
|
class Configuration(object):
|
||||||
"""NOTE: This class is auto generated by OpenAPI Generator
|
"""NOTE: This class is auto generated by OpenAPI Generator
|
||||||
|
|
||||||
@@ -49,6 +56,19 @@ class Configuration(object):
|
|||||||
then all undeclared properties received by the server are injected into the
|
then all undeclared properties received by the server are injected into the
|
||||||
additional properties map. In that case, there are undeclared properties, and
|
additional properties map. In that case, there are undeclared properties, and
|
||||||
nothing to discard.
|
nothing to discard.
|
||||||
|
:param disabled_client_side_validations (string): Comma-separated list of
|
||||||
|
JSON schema validation keywords to disable JSON schema structural validation
|
||||||
|
rules. The following keywords may be specified: multipleOf, maximum,
|
||||||
|
exclusiveMaximum, minimum, exclusiveMinimum, maxLength, minLength, pattern,
|
||||||
|
maxItems, minItems.
|
||||||
|
By default, the validation is performed for data generated locally by the client
|
||||||
|
and data received from the server, independent of any validation performed by
|
||||||
|
the server side. If the input data does not satisfy the JSON schema validation
|
||||||
|
rules specified in the OpenAPI document, an exception is raised.
|
||||||
|
If disabled_client_side_validations is set, structural validation is
|
||||||
|
disabled. This can be useful to troubleshoot data validation problem, such as
|
||||||
|
when the OpenAPI document validation rules do not match the actual API data
|
||||||
|
received by the server.
|
||||||
|
|
||||||
:Example:
|
:Example:
|
||||||
|
|
||||||
@@ -94,6 +114,7 @@ conf = petstore_api.Configuration(
|
|||||||
api_key=None, api_key_prefix=None,
|
api_key=None, api_key_prefix=None,
|
||||||
username=None, password=None,
|
username=None, password=None,
|
||||||
discard_unknown_keys=False,
|
discard_unknown_keys=False,
|
||||||
|
disabled_client_side_validations="",
|
||||||
):
|
):
|
||||||
"""Constructor
|
"""Constructor
|
||||||
"""
|
"""
|
||||||
@@ -124,6 +145,7 @@ conf = petstore_api.Configuration(
|
|||||||
"""Password for HTTP basic authentication
|
"""Password for HTTP basic authentication
|
||||||
"""
|
"""
|
||||||
self.discard_unknown_keys = discard_unknown_keys
|
self.discard_unknown_keys = discard_unknown_keys
|
||||||
|
self.disabled_client_side_validations = disabled_client_side_validations
|
||||||
self.access_token = None
|
self.access_token = None
|
||||||
"""access token for OAuth/Bearer
|
"""access token for OAuth/Bearer
|
||||||
"""
|
"""
|
||||||
@@ -205,6 +227,13 @@ conf = petstore_api.Configuration(
|
|||||||
|
|
||||||
def __setattr__(self, name, value):
|
def __setattr__(self, name, value):
|
||||||
object.__setattr__(self, name, value)
|
object.__setattr__(self, name, value)
|
||||||
|
if name == 'disabled_client_side_validations':
|
||||||
|
s = set(filter(None, value.split(',')))
|
||||||
|
for v in s:
|
||||||
|
if v not in JSON_SCHEMA_VALIDATION_KEYWORDS:
|
||||||
|
raise ApiValueError(
|
||||||
|
"Invalid keyword: '{0}''".format(v))
|
||||||
|
self._disabled_client_side_validations = s
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def set_default(cls, default):
|
def set_default(cls, default):
|
||||||
|
|||||||
@@ -249,7 +249,8 @@ class Endpoint(object):
|
|||||||
check_validations(
|
check_validations(
|
||||||
self.validations,
|
self.validations,
|
||||||
(param,),
|
(param,),
|
||||||
kwargs[param]
|
kwargs[param],
|
||||||
|
configuration=self.api_client.configuration
|
||||||
)
|
)
|
||||||
|
|
||||||
if kwargs['_check_input_type'] is False:
|
if kwargs['_check_input_type'] is False:
|
||||||
|
|||||||
@@ -235,7 +235,8 @@ class Endpoint(object):
|
|||||||
check_validations(
|
check_validations(
|
||||||
self.validations,
|
self.validations,
|
||||||
(param,),
|
(param,),
|
||||||
kwargs[param]
|
kwargs[param],
|
||||||
|
configuration=self.api_client.configuration
|
||||||
)
|
)
|
||||||
|
|
||||||
if kwargs['_check_input_type'] is False:
|
if kwargs['_check_input_type'] is False:
|
||||||
|
|||||||
@@ -2054,7 +2054,8 @@ class Endpoint(object):
|
|||||||
check_validations(
|
check_validations(
|
||||||
self.validations,
|
self.validations,
|
||||||
(param,),
|
(param,),
|
||||||
kwargs[param]
|
kwargs[param],
|
||||||
|
configuration=self.api_client.configuration
|
||||||
)
|
)
|
||||||
|
|
||||||
if kwargs['_check_input_type'] is False:
|
if kwargs['_check_input_type'] is False:
|
||||||
|
|||||||
@@ -251,7 +251,8 @@ class Endpoint(object):
|
|||||||
check_validations(
|
check_validations(
|
||||||
self.validations,
|
self.validations,
|
||||||
(param,),
|
(param,),
|
||||||
kwargs[param]
|
kwargs[param],
|
||||||
|
configuration=self.api_client.configuration
|
||||||
)
|
)
|
||||||
|
|
||||||
if kwargs['_check_input_type'] is False:
|
if kwargs['_check_input_type'] is False:
|
||||||
|
|||||||
@@ -1259,7 +1259,8 @@ class Endpoint(object):
|
|||||||
check_validations(
|
check_validations(
|
||||||
self.validations,
|
self.validations,
|
||||||
(param,),
|
(param,),
|
||||||
kwargs[param]
|
kwargs[param],
|
||||||
|
configuration=self.api_client.configuration
|
||||||
)
|
)
|
||||||
|
|
||||||
if kwargs['_check_input_type'] is False:
|
if kwargs['_check_input_type'] is False:
|
||||||
|
|||||||
@@ -592,7 +592,8 @@ class Endpoint(object):
|
|||||||
check_validations(
|
check_validations(
|
||||||
self.validations,
|
self.validations,
|
||||||
(param,),
|
(param,),
|
||||||
kwargs[param]
|
kwargs[param],
|
||||||
|
configuration=self.api_client.configuration
|
||||||
)
|
)
|
||||||
|
|
||||||
if kwargs['_check_input_type'] is False:
|
if kwargs['_check_input_type'] is False:
|
||||||
|
|||||||
@@ -1057,7 +1057,8 @@ class Endpoint(object):
|
|||||||
check_validations(
|
check_validations(
|
||||||
self.validations,
|
self.validations,
|
||||||
(param,),
|
(param,),
|
||||||
kwargs[param]
|
kwargs[param],
|
||||||
|
configuration=self.api_client.configuration
|
||||||
)
|
)
|
||||||
|
|
||||||
if kwargs['_check_input_type'] is False:
|
if kwargs['_check_input_type'] is False:
|
||||||
|
|||||||
@@ -20,8 +20,15 @@ import urllib3
|
|||||||
|
|
||||||
import six
|
import six
|
||||||
from six.moves import http_client as httplib
|
from six.moves import http_client as httplib
|
||||||
|
from petstore_api.exceptions import ApiValueError
|
||||||
|
|
||||||
|
|
||||||
|
JSON_SCHEMA_VALIDATION_KEYWORDS = {
|
||||||
|
'multipleOf', 'maximum', 'exclusiveMaximum',
|
||||||
|
'minimum', 'exclusiveMinimum', 'maxLength',
|
||||||
|
'minLength', 'pattern', 'maxItems', 'minItems'
|
||||||
|
}
|
||||||
|
|
||||||
class Configuration(object):
|
class Configuration(object):
|
||||||
"""NOTE: This class is auto generated by OpenAPI Generator
|
"""NOTE: This class is auto generated by OpenAPI Generator
|
||||||
|
|
||||||
@@ -49,6 +56,19 @@ class Configuration(object):
|
|||||||
then all undeclared properties received by the server are injected into the
|
then all undeclared properties received by the server are injected into the
|
||||||
additional properties map. In that case, there are undeclared properties, and
|
additional properties map. In that case, there are undeclared properties, and
|
||||||
nothing to discard.
|
nothing to discard.
|
||||||
|
:param disabled_client_side_validations (string): Comma-separated list of
|
||||||
|
JSON schema validation keywords to disable JSON schema structural validation
|
||||||
|
rules. The following keywords may be specified: multipleOf, maximum,
|
||||||
|
exclusiveMaximum, minimum, exclusiveMinimum, maxLength, minLength, pattern,
|
||||||
|
maxItems, minItems.
|
||||||
|
By default, the validation is performed for data generated locally by the client
|
||||||
|
and data received from the server, independent of any validation performed by
|
||||||
|
the server side. If the input data does not satisfy the JSON schema validation
|
||||||
|
rules specified in the OpenAPI document, an exception is raised.
|
||||||
|
If disabled_client_side_validations is set, structural validation is
|
||||||
|
disabled. This can be useful to troubleshoot data validation problem, such as
|
||||||
|
when the OpenAPI document validation rules do not match the actual API data
|
||||||
|
received by the server.
|
||||||
:param signing_info: Configuration parameters for the HTTP signature security scheme.
|
:param signing_info: Configuration parameters for the HTTP signature security scheme.
|
||||||
Must be an instance of petstore_api.signing.HttpSigningConfiguration
|
Must be an instance of petstore_api.signing.HttpSigningConfiguration
|
||||||
|
|
||||||
@@ -135,6 +155,7 @@ conf = petstore_api.Configuration(
|
|||||||
api_key=None, api_key_prefix=None,
|
api_key=None, api_key_prefix=None,
|
||||||
username=None, password=None,
|
username=None, password=None,
|
||||||
discard_unknown_keys=False,
|
discard_unknown_keys=False,
|
||||||
|
disabled_client_side_validations="",
|
||||||
signing_info=None,
|
signing_info=None,
|
||||||
):
|
):
|
||||||
"""Constructor
|
"""Constructor
|
||||||
@@ -166,6 +187,7 @@ conf = petstore_api.Configuration(
|
|||||||
"""Password for HTTP basic authentication
|
"""Password for HTTP basic authentication
|
||||||
"""
|
"""
|
||||||
self.discard_unknown_keys = discard_unknown_keys
|
self.discard_unknown_keys = discard_unknown_keys
|
||||||
|
self.disabled_client_side_validations = disabled_client_side_validations
|
||||||
if signing_info is not None:
|
if signing_info is not None:
|
||||||
signing_info.host = host
|
signing_info.host = host
|
||||||
self.signing_info = signing_info
|
self.signing_info = signing_info
|
||||||
@@ -252,6 +274,13 @@ conf = petstore_api.Configuration(
|
|||||||
|
|
||||||
def __setattr__(self, name, value):
|
def __setattr__(self, name, value):
|
||||||
object.__setattr__(self, name, value)
|
object.__setattr__(self, name, value)
|
||||||
|
if name == 'disabled_client_side_validations':
|
||||||
|
s = set(filter(None, value.split(',')))
|
||||||
|
for v in s:
|
||||||
|
if v not in JSON_SCHEMA_VALIDATION_KEYWORDS:
|
||||||
|
raise ApiValueError(
|
||||||
|
"Invalid keyword: '{0}''".format(v))
|
||||||
|
self._disabled_client_side_validations = s
|
||||||
if name == "signing_info" and value is not None:
|
if name == "signing_info" and value is not None:
|
||||||
# Ensure the host paramater from signing info is the same as
|
# Ensure the host paramater from signing info is the same as
|
||||||
# Configuration.host.
|
# Configuration.host.
|
||||||
|
|||||||
@@ -112,7 +112,8 @@ class OpenApiModel(object):
|
|||||||
check_validations(
|
check_validations(
|
||||||
self.validations,
|
self.validations,
|
||||||
(name,),
|
(name,),
|
||||||
value
|
value,
|
||||||
|
self._configuration
|
||||||
)
|
)
|
||||||
self.__dict__['_data_store'][name] = value
|
self.__dict__['_data_store'][name] = value
|
||||||
|
|
||||||
@@ -635,17 +636,50 @@ def check_allowed_values(allowed_values, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def check_validations(validations, input_variable_path, input_values):
|
def is_json_validation_enabled(schema_keyword, configuration=None):
|
||||||
|
"""Returns true if JSON schema validation is enabled for the specified
|
||||||
|
validation keyword. This can be used to skip JSON schema structural validation
|
||||||
|
as requested in the configuration.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
schema_keyword (string): the name of a JSON schema validation keyword.
|
||||||
|
configuration (Configuration): the configuration class.
|
||||||
|
"""
|
||||||
|
|
||||||
|
return (configuration is None or
|
||||||
|
not hasattr(configuration, '_disabled_client_side_validations') or
|
||||||
|
schema_keyword not in configuration._disabled_client_side_validations)
|
||||||
|
|
||||||
|
|
||||||
|
def check_validations(
|
||||||
|
validations, input_variable_path, input_values,
|
||||||
|
configuration=None):
|
||||||
"""Raises an exception if the input_values are invalid
|
"""Raises an exception if the input_values are invalid
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
validations (dict): the validation dictionary
|
validations (dict): the validation dictionary.
|
||||||
input_variable_path (tuple): the path to the input variable
|
input_variable_path (tuple): the path to the input variable.
|
||||||
input_values (list/str/int/float/date/datetime): the values that we
|
input_values (list/str/int/float/date/datetime): the values that we
|
||||||
are checking
|
are checking.
|
||||||
|
configuration (Configuration): the configuration class.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
current_validations = validations[input_variable_path]
|
current_validations = validations[input_variable_path]
|
||||||
if ('max_length' in current_validations and
|
if (is_json_validation_enabled('multipleOf', configuration) and
|
||||||
|
'multiple_of' in current_validations and
|
||||||
|
isinstance(input_values, (int, float)) and
|
||||||
|
not (float(input_values) / current_validations['multiple_of']).is_integer()):
|
||||||
|
# Note 'multipleOf' will be as good as the floating point arithmetic.
|
||||||
|
raise ApiValueError(
|
||||||
|
"Invalid value for `%s`, value must be a multiple of "
|
||||||
|
"`%s`" % (
|
||||||
|
input_variable_path[0],
|
||||||
|
current_validations['multiple_of']
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if (is_json_validation_enabled('maxLength', configuration) and
|
||||||
|
'max_length' in current_validations and
|
||||||
len(input_values) > current_validations['max_length']):
|
len(input_values) > current_validations['max_length']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, length must be less than or equal to "
|
"Invalid value for `%s`, length must be less than or equal to "
|
||||||
@@ -655,7 +689,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('min_length' in current_validations and
|
if (is_json_validation_enabled('minLength', configuration) and
|
||||||
|
'min_length' in current_validations and
|
||||||
len(input_values) < current_validations['min_length']):
|
len(input_values) < current_validations['min_length']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, length must be greater than or equal to "
|
"Invalid value for `%s`, length must be greater than or equal to "
|
||||||
@@ -665,7 +700,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('max_items' in current_validations and
|
if (is_json_validation_enabled('maxItems', configuration) and
|
||||||
|
'max_items' in current_validations and
|
||||||
len(input_values) > current_validations['max_items']):
|
len(input_values) > current_validations['max_items']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, number of items must be less than or "
|
"Invalid value for `%s`, number of items must be less than or "
|
||||||
@@ -675,7 +711,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('min_items' in current_validations and
|
if (is_json_validation_enabled('minItems', configuration) and
|
||||||
|
'min_items' in current_validations and
|
||||||
len(input_values) < current_validations['min_items']):
|
len(input_values) < current_validations['min_items']):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"Invalid value for `%s`, number of items must be greater than or "
|
"Invalid value for `%s`, number of items must be greater than or "
|
||||||
@@ -698,7 +735,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
max_val = input_values
|
max_val = input_values
|
||||||
min_val = input_values
|
min_val = input_values
|
||||||
|
|
||||||
if ('exclusive_maximum' in current_validations and
|
if (is_json_validation_enabled('exclusiveMaximum', configuration) and
|
||||||
|
'exclusive_maximum' in current_validations and
|
||||||
max_val >= current_validations['exclusive_maximum']):
|
max_val >= current_validations['exclusive_maximum']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, must be a value less than `%s`" % (
|
"Invalid value for `%s`, must be a value less than `%s`" % (
|
||||||
@@ -707,7 +745,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('inclusive_maximum' in current_validations and
|
if (is_json_validation_enabled('maximum', configuration) and
|
||||||
|
'inclusive_maximum' in current_validations and
|
||||||
max_val > current_validations['inclusive_maximum']):
|
max_val > current_validations['inclusive_maximum']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, must be a value less than or equal to "
|
"Invalid value for `%s`, must be a value less than or equal to "
|
||||||
@@ -717,7 +756,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('exclusive_minimum' in current_validations and
|
if (is_json_validation_enabled('exclusiveMinimum', configuration) and
|
||||||
|
'exclusive_minimum' in current_validations and
|
||||||
min_val <= current_validations['exclusive_minimum']):
|
min_val <= current_validations['exclusive_minimum']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, must be a value greater than `%s`" %
|
"Invalid value for `%s`, must be a value greater than `%s`" %
|
||||||
@@ -727,7 +767,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if ('inclusive_minimum' in current_validations and
|
if (is_json_validation_enabled('minimum', configuration) and
|
||||||
|
'inclusive_minimum' in current_validations and
|
||||||
min_val < current_validations['inclusive_minimum']):
|
min_val < current_validations['inclusive_minimum']):
|
||||||
raise ApiValueError(
|
raise ApiValueError(
|
||||||
"Invalid value for `%s`, must be a value greater than or equal "
|
"Invalid value for `%s`, must be a value greater than or equal "
|
||||||
@@ -737,7 +778,8 @@ def check_validations(validations, input_variable_path, input_values):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
flags = current_validations.get('regex', {}).get('flags', 0)
|
flags = current_validations.get('regex', {}).get('flags', 0)
|
||||||
if ('regex' in current_validations and
|
if (is_json_validation_enabled('pattern', configuration) and
|
||||||
|
'regex' in current_validations and
|
||||||
not re.search(current_validations['regex']['pattern'],
|
not re.search(current_validations['regex']['pattern'],
|
||||||
input_values, flags=flags)):
|
input_values, flags=flags)):
|
||||||
err_msg = r"Invalid value for `%s`, must match regular expression `%s`" % (
|
err_msg = r"Invalid value for `%s`, must match regular expression `%s`" % (
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ class FormatTest(ModelNormal):
|
|||||||
('number',): {
|
('number',): {
|
||||||
'inclusive_maximum': 543.2,
|
'inclusive_maximum': 543.2,
|
||||||
'inclusive_minimum': 32.1,
|
'inclusive_minimum': 32.1,
|
||||||
|
'multiple_of': 32.5,
|
||||||
},
|
},
|
||||||
('password',): {
|
('password',): {
|
||||||
'max_length': 64,
|
'max_length': 64,
|
||||||
@@ -73,6 +74,7 @@ class FormatTest(ModelNormal):
|
|||||||
('integer',): {
|
('integer',): {
|
||||||
'inclusive_maximum': 100,
|
'inclusive_maximum': 100,
|
||||||
'inclusive_minimum': 10,
|
'inclusive_minimum': 10,
|
||||||
|
'multiple_of': 2,
|
||||||
},
|
},
|
||||||
('int32',): {
|
('int32',): {
|
||||||
'inclusive_maximum': 200,
|
'inclusive_maximum': 200,
|
||||||
|
|||||||
@@ -0,0 +1,131 @@
|
|||||||
|
# coding: utf-8
|
||||||
|
|
||||||
|
# flake8: noqa
|
||||||
|
|
||||||
|
"""
|
||||||
|
Run the tests.
|
||||||
|
$ pip install nose (optional)
|
||||||
|
$ cd OpenAPIetstore-python
|
||||||
|
$ nosetests -v
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
import atexit
|
||||||
|
import datetime
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
import weakref
|
||||||
|
import unittest
|
||||||
|
from dateutil.parser import parse
|
||||||
|
from collections import namedtuple
|
||||||
|
|
||||||
|
import petstore_api
|
||||||
|
import petstore_api.configuration
|
||||||
|
|
||||||
|
HOST = 'http://petstore.swagger.io/v2'
|
||||||
|
MockResponse = namedtuple('MockResponse', 'data')
|
||||||
|
|
||||||
|
|
||||||
|
class ApiClientTests(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.api_client = petstore_api.ApiClient()
|
||||||
|
|
||||||
|
def test_configuration(self):
|
||||||
|
config = petstore_api.Configuration()
|
||||||
|
config.host = 'http://localhost/'
|
||||||
|
|
||||||
|
config.disabled_client_side_validations = ("multipleOf,maximum,exclusiveMaximum,minimum,exclusiveMinimum,"
|
||||||
|
"maxLength,minLength,pattern,maxItems,minItems")
|
||||||
|
with self.checkRaiseRegex(ValueError, "Invalid keyword: 'foo'"):
|
||||||
|
config.disabled_client_side_validations = 'foo'
|
||||||
|
config.disabled_client_side_validations = ""
|
||||||
|
|
||||||
|
|
||||||
|
def checkRaiseRegex(self, expected_exception, expected_regex):
|
||||||
|
if sys.version_info < (3, 0):
|
||||||
|
return self.assertRaisesRegexp(expected_exception, expected_regex)
|
||||||
|
|
||||||
|
return self.assertRaisesRegex(expected_exception, expected_regex)
|
||||||
|
|
||||||
|
|
||||||
|
def test_multiple_of(self):
|
||||||
|
inst = petstore_api.FormatTest(
|
||||||
|
byte='3',
|
||||||
|
date=datetime.date(2000, 1, 1),
|
||||||
|
password="abcdefghijkl",
|
||||||
|
integer=30,
|
||||||
|
number=65.0,
|
||||||
|
float=62.4
|
||||||
|
)
|
||||||
|
assert isinstance(inst, petstore_api.FormatTest)
|
||||||
|
|
||||||
|
with self.checkRaiseRegex(petstore_api.exceptions.ApiValueError, "Invalid value for `integer`, value must be a multiple of `2`"):
|
||||||
|
inst = petstore_api.FormatTest(
|
||||||
|
byte='3',
|
||||||
|
date=datetime.date(2000, 1, 1),
|
||||||
|
password="abcdefghijkl",
|
||||||
|
integer=31, # Value is supposed to be multiple of '2'. An error must be raised
|
||||||
|
number=65.0,
|
||||||
|
float=62.4
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_multiple_of_deserialization(self):
|
||||||
|
data = {
|
||||||
|
'byte': '3',
|
||||||
|
'date': '1970-01-01',
|
||||||
|
'password': "abcdefghijkl",
|
||||||
|
'integer': 30,
|
||||||
|
'number': 65.0,
|
||||||
|
'float': 62.4,
|
||||||
|
}
|
||||||
|
response = MockResponse(data=json.dumps(data))
|
||||||
|
deserialized = self.api_client.deserialize(response, (petstore_api.FormatTest,), True)
|
||||||
|
self.assertTrue(isinstance(deserialized, petstore_api.FormatTest))
|
||||||
|
|
||||||
|
with self.checkRaiseRegex(petstore_api.exceptions.ApiValueError, "Invalid value for `integer`, value must be a multiple of `2`"):
|
||||||
|
data = {
|
||||||
|
'byte': '3',
|
||||||
|
'date': '1970-01-01',
|
||||||
|
'password': "abcdefghijkl",
|
||||||
|
'integer': 31, # Value is supposed to be multiple of '2'. An error must be raised
|
||||||
|
'number': 65.0,
|
||||||
|
'float': 62.4,
|
||||||
|
}
|
||||||
|
response = MockResponse(data=json.dumps(data))
|
||||||
|
deserialized = self.api_client.deserialize(response, (petstore_api.FormatTest,), True)
|
||||||
|
|
||||||
|
# Disable JSON schema validation. No error should be raised during deserialization.
|
||||||
|
config = petstore_api.Configuration()
|
||||||
|
config.disabled_client_side_validations = "multipleOf"
|
||||||
|
api_client = petstore_api.ApiClient(configuration=config)
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'byte': '3',
|
||||||
|
'date': '1970-01-01',
|
||||||
|
'password': "abcdefghijkl",
|
||||||
|
'integer': 31, # Value is supposed to be multiple of '2'
|
||||||
|
'number': 65.0,
|
||||||
|
'float': 62.4,
|
||||||
|
}
|
||||||
|
response = MockResponse(data=json.dumps(data))
|
||||||
|
deserialized = api_client.deserialize(response, (petstore_api.FormatTest,), True)
|
||||||
|
self.assertTrue(isinstance(deserialized, petstore_api.FormatTest))
|
||||||
|
|
||||||
|
# Disable JSON schema validation but for a different keyword.
|
||||||
|
# An error should be raised during deserialization.
|
||||||
|
config = petstore_api.Configuration()
|
||||||
|
config.disabled_client_side_validations = "maxItems"
|
||||||
|
api_client = petstore_api.ApiClient(configuration=config)
|
||||||
|
|
||||||
|
with self.checkRaiseRegex(petstore_api.exceptions.ApiValueError, "Invalid value for `integer`, value must be a multiple of `2`"):
|
||||||
|
data = {
|
||||||
|
'byte': '3',
|
||||||
|
'date': '1970-01-01',
|
||||||
|
'password': "abcdefghijkl",
|
||||||
|
'integer': 31, # Value is supposed to be multiple of '2'
|
||||||
|
'number': 65.0,
|
||||||
|
'float': 62.4,
|
||||||
|
}
|
||||||
|
response = MockResponse(data=json.dumps(data))
|
||||||
|
deserialized = api_client.deserialize(response, (petstore_api.FormatTest,), True)
|
||||||
@@ -20,8 +20,15 @@ import urllib3
|
|||||||
|
|
||||||
import six
|
import six
|
||||||
from six.moves import http_client as httplib
|
from six.moves import http_client as httplib
|
||||||
|
from petstore_api.exceptions import ApiValueError
|
||||||
|
|
||||||
|
|
||||||
|
JSON_SCHEMA_VALIDATION_KEYWORDS = {
|
||||||
|
'multipleOf', 'maximum', 'exclusiveMaximum',
|
||||||
|
'minimum', 'exclusiveMinimum', 'maxLength',
|
||||||
|
'minLength', 'pattern', 'maxItems', 'minItems'
|
||||||
|
}
|
||||||
|
|
||||||
class Configuration(object):
|
class Configuration(object):
|
||||||
"""NOTE: This class is auto generated by OpenAPI Generator
|
"""NOTE: This class is auto generated by OpenAPI Generator
|
||||||
|
|
||||||
@@ -49,6 +56,19 @@ class Configuration(object):
|
|||||||
then all undeclared properties received by the server are injected into the
|
then all undeclared properties received by the server are injected into the
|
||||||
additional properties map. In that case, there are undeclared properties, and
|
additional properties map. In that case, there are undeclared properties, and
|
||||||
nothing to discard.
|
nothing to discard.
|
||||||
|
:param disabled_client_side_validations (string): Comma-separated list of
|
||||||
|
JSON schema validation keywords to disable JSON schema structural validation
|
||||||
|
rules. The following keywords may be specified: multipleOf, maximum,
|
||||||
|
exclusiveMaximum, minimum, exclusiveMinimum, maxLength, minLength, pattern,
|
||||||
|
maxItems, minItems.
|
||||||
|
By default, the validation is performed for data generated locally by the client
|
||||||
|
and data received from the server, independent of any validation performed by
|
||||||
|
the server side. If the input data does not satisfy the JSON schema validation
|
||||||
|
rules specified in the OpenAPI document, an exception is raised.
|
||||||
|
If disabled_client_side_validations is set, structural validation is
|
||||||
|
disabled. This can be useful to troubleshoot data validation problem, such as
|
||||||
|
when the OpenAPI document validation rules do not match the actual API data
|
||||||
|
received by the server.
|
||||||
:param signing_info: Configuration parameters for the HTTP signature security scheme.
|
:param signing_info: Configuration parameters for the HTTP signature security scheme.
|
||||||
Must be an instance of petstore_api.signing.HttpSigningConfiguration
|
Must be an instance of petstore_api.signing.HttpSigningConfiguration
|
||||||
|
|
||||||
@@ -135,6 +155,7 @@ conf = petstore_api.Configuration(
|
|||||||
api_key=None, api_key_prefix=None,
|
api_key=None, api_key_prefix=None,
|
||||||
username=None, password=None,
|
username=None, password=None,
|
||||||
discard_unknown_keys=False,
|
discard_unknown_keys=False,
|
||||||
|
disabled_client_side_validations="",
|
||||||
signing_info=None,
|
signing_info=None,
|
||||||
):
|
):
|
||||||
"""Constructor
|
"""Constructor
|
||||||
@@ -166,6 +187,7 @@ conf = petstore_api.Configuration(
|
|||||||
"""Password for HTTP basic authentication
|
"""Password for HTTP basic authentication
|
||||||
"""
|
"""
|
||||||
self.discard_unknown_keys = discard_unknown_keys
|
self.discard_unknown_keys = discard_unknown_keys
|
||||||
|
self.disabled_client_side_validations = disabled_client_side_validations
|
||||||
if signing_info is not None:
|
if signing_info is not None:
|
||||||
signing_info.host = host
|
signing_info.host = host
|
||||||
self.signing_info = signing_info
|
self.signing_info = signing_info
|
||||||
@@ -252,6 +274,13 @@ conf = petstore_api.Configuration(
|
|||||||
|
|
||||||
def __setattr__(self, name, value):
|
def __setattr__(self, name, value):
|
||||||
object.__setattr__(self, name, value)
|
object.__setattr__(self, name, value)
|
||||||
|
if name == 'disabled_client_side_validations':
|
||||||
|
s = set(filter(None, value.split(',')))
|
||||||
|
for v in s:
|
||||||
|
if v not in JSON_SCHEMA_VALIDATION_KEYWORDS:
|
||||||
|
raise ApiValueError(
|
||||||
|
"Invalid keyword: '{0}''".format(v))
|
||||||
|
self._disabled_client_side_validations = s
|
||||||
if name == "signing_info" and value is not None:
|
if name == "signing_info" and value is not None:
|
||||||
# Ensure the host paramater from signing info is the same as
|
# Ensure the host paramater from signing info is the same as
|
||||||
# Configuration.host.
|
# Configuration.host.
|
||||||
|
|||||||
Reference in New Issue
Block a user