B \,@sdZddlmZddlZddlZddlmZddlmZddlmZddl m Z dd Z d d Z d d Z GdddeZGdddeZGdddeZdS)aQUser input parameter validation. This module handles user input parameter validation against a provided input model. Note that the objects in this module do *not* mutate any arguments. No type version happens here. It is up to another layer to properly convert arguments to any required types. Validation Errors ----------------- )sixN)datetime)parse_to_aware_datetime)is_json_value_header)ParamValidationErrorcCs,t}|||}|r(t|ddS)avValidates input parameters against a schema. This is a convenience function that validates parameters against a schema. You can also instantiate and use the ParamValidator class directly if you want more control. If there are any validation errors then a ParamValidationError will be raised. If there are no validation errors than no exception is raised and a value of None is returned. :param params: The user provided input parameters. :type shape: botocore.model.Shape :param shape: The schema which the input parameters should adhere to. :raise: ParamValidationError )reportN)ParamValidatorvalidate has_errorsrgenerate_report)paramsshapeZ validatorrr5/tmp/pip-build-uw_ogi45/botocore/botocore/validate.pyvalidate_parameterss rcsfdd}|S)Ncsfdd}fdd|S)Ncs |||r|||||SdS)Nr)selfparamr errorsname) _type_checkfuncrr_on_passes_type_check6s zKtype_check.._create_type_check_guard.._on_passes_type_checkcs2t|s.ddD}|j|d||ddSdS)NcSsg|]}t|qSr)r text_type).0trrr <szUtype_check.._create_type_check_guard.._type_check..z invalid type)r valid_typesFT) isinstancer)rrrvalid_type_names)rrrr:s   zAtype_check.._create_type_check_guard.._type_checkr)rr)r)rrr_create_type_check_guard5s z,type_check.._create_type_check_guardr)rrr)rr type_check4s r cCszd}td}td}d|jkr6|jd}||kr\d}n&t|dr\|jdr\d}||kr\d}|rv|j|||||gd dS) NFz-infinfminT serializationZ hostLabel)r valid_range)floatmetadatahasattrr#getr)rvaluer error_typerfailed min_allowed max_allowedrrr range_checkFs     r/c@s<eZdZddZddZddZddZd d Zd d Zd S)ValidationErrorscCs g|_dS)N)_errors)rrrr__init__ZszValidationErrors.__init__cCs|jr dSdS)NTF)r1)rrrrr ]szValidationErrors.has_errorscCs.g}x|jD]}|||q Wd|S)N )r1append _format_errorjoin)rZerror_messageserrorrrrr bs z ValidationErrors.generate_reportcCs|\}}}||}|dkr,d||dfS|dkrPd||dd|dfS|d krd ||d tt|d d|d fS|d kr|dd}|dd}d||d ||fS|dkr|dd}|dd}d||d ||fS|dkrd||dfSdS)Nzmissing required fieldz&Missing required parameter in %s: "%s" required_namez unknown fieldz1Unknown parameter in %s: "%s", must be one of: %s unknown_paramz, valid_namesz invalid typezCInvalid type for parameter %s, value: %s, type: %s, valid types: %srrz invalid ranger%rr$z=Invalid range for parameter %s, value: %s, valid range: %s-%szinvalid lengthz>Invalid length for parameter %s, value: %s, valid range: %s-%szunable to encode to jsonz2Invalid parameter %s must be json serializable: %s type_error) _get_namer6strtype)rr7r+r additionalr-r.rrrr5hs:         zValidationErrors._format_errorcCs&|sdS|dr|ddS|SdS)Ninput.r$) startswith)rrrrrr<s   zValidationErrors._get_namecKs|j|||fdS)N)r1r4)rrreasonkwargsrrrrszValidationErrors.reportN) __name__ __module__ __qualname__r2r r r5r<rrrrrr0Ys r0c@seZdZdZddZddZddZdd Zee fd d d Z ee j d d dZ eeefd ddZee fd ddZee jd ddZddZeefd ddZeeejfe jd ddZeZee jd ddZddZdd Zd!S)"rz+Validates parameters against a shape model.cCst}|j|||dd|S)aValidate parameters against a shape model. This method will validate the parameters against a provided shape model. All errors will be collected before returning to the caller. This means that this method will not stop at the first error, it will return all possible errors. :param params: User provided dict of parameters :param shape: A shape model describing the expected input. :return: A list of errors. )r)r0 _validate)rr r rrrrr szParamValidator.validatecCst|r|jSdS)N)r_validate_jsonvalue_string)rr rrr_check_special_validation_casessz.ParamValidator._check_special_validation_casescCs<||}|r|||||nt|d|j||||dS)Nz _validate_%s)rKgetattrZ type_name)rr r rrZspecial_validatorrrrrIs  zParamValidator._validatec CsJyt|Wn6ttfk rD}z|j|d|dWdd}~XYnXdS)Nzunable to encode to json)r;)jsondumps ValueError TypeErrorr)rr r rrerrrrJsz)ParamValidator._validate_jsonvalue_string)rc Csx0|jdgD]}||kr|j|d||dqW|j}g}x6|D].}||krf|j|d|t|dqB||qBWx.|D]&}||||j||d||fqzWdS)Nrequiredzmissing required field)r8Z user_paramsz unknown field)r9r:z%s.%s)r'r)rmemberslistr4rI) rr r rrZrequired_memberrSZ known_paramsrrrr_validate_structures   z"ParamValidator._validate_structurecCst|t||d|dS)Nzinvalid length)r/len)rrr rrrrr_validate_strings zParamValidator._validate_stringc CsL|j}t|t||d|x,t|D] \}}||||d||fq$WdS)Nzinvalid lengthz%s[%s])memberr/rV enumeraterI)rrr rrZ member_shapeiitemrrr_validate_listszParamValidator._validate_listc CsV|j}|j}xD|D]8\}}||||d||f||||d||fqWdS)Nz %s (key: %s)z%s.%s)keyr*itemsrI) rrr rrZ key_shapeZ value_shaper]r*rrr _validate_maps   zParamValidator._validate_mapcCst|||d|dS)Nz invalid range)r/)rrr rrrrr_validate_integersz ParamValidator._validate_integercCsHt|tttjfrdSt|dr$dS|j|d|ttttdgddS)Nreadz invalid typezfile-like object)rr)rbytes bytearrayrrr(rr=)rrr rrrrr_validate_blobs   zParamValidator._validate_blobcCsdS)Nr)rrr rrrrr_validate_booleansz ParamValidator._validate_booleancCst|||d|dS)Nz invalid range)r/)rrr rrrrr_validate_doubleszParamValidator._validate_doublecCst|||d|dS)Nz invalid range)r/)rrr rrrrr_validate_longszParamValidator._validate_longcCs2||}|s.ttdg}|j|d||ddS)Nztimestamp-stringz invalid type)rr)_type_check_datetimerrrr)rrr rrZ is_valid_typerrrr_validate_timestamp s   z"ParamValidator._validate_timestampc Cs,y t|dStttfk r&dSXdS)NTF)rrPrOAttributeError)rr*rrrrhs z#ParamValidator._type_check_datetimeN)rErFrG__doc__r rKrIrJr dictrUr string_typesrWrTtupler\r_ integer_typesr`rdboolrer&decimalDecimalrfZ_validate_floatrgrirhrrrrrs"    rc@seZdZddZddZdS)ParamValidationDecoratorcCs||_||_dS)N)_param_validator _serializer)rZparam_validator serializerrrrr2sz!ParamValidationDecorator.__init__cCsB|j}|dk r4|j||j}|r4t|d|j||S)N)r) input_shapertr r rr ruserialize_to_request)rZ parametersZoperation_modelrwrrrrrx#sz-ParamValidationDecorator.serialize_to_requestN)rErFrGr2rxrrrrrssrs)rkZbotocore.compatrrqrMrZbotocore.utilsrrZbotocore.exceptionsrrr r/objectr0rrsrrrrs     :