o .&a5@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}|||}|rt|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)paramsshape validatorrr3/usr/lib/python3/dist-packages/botocore/validate.pyvalidate_parameterss  rcsfdd}|S)Ncsfdd}fdd|S)Ncs |||r|||||SdSNrselfparamrerrorsname _type_checkfuncrr_on_passes_type_check6s zKtype_check.._create_type_check_guard.._on_passes_type_checkcs2t|sddD}|j|d||ddSdS)NcSg|]}t|qSrr text_type.0trrr <zUtype_check.._create_type_check_guard.._type_check.. invalid typer valid_typesFT) isinstancer)rrrvalid_type_namesr'rrr:s  zAtype_check.._create_type_check_guard.._type_checkr)rrr*rr_create_type_check_guard5s z,type_check.._create_type_check_guardr)r'r+rr*r type_check4s r,cCsrd}td}d|jvr|jd}||krd}nt|dr*|jdr*d}||kr*d}|r7|j||||ddSdS) NFz-infminT serialization hostLabel)r min_allowed)floatmetadatahasattrr.getr)rvaluer error_typerfailedr1rrr range_checkFs    r9c@s<eZdZddZddZddZddZd d Zd d Zd S)ValidationErrorscCs g|_dSr_errorsrrrr__init__Xs zValidationErrors.__init__cCs|jrdSdSNTFr;r=rrrr [szValidationErrors.has_errorscCs*g}|jD] }|||qd|S)N )r<append _format_errorjoin)rerror_messageserrorrrrr `s  z ValidationErrors.generate_reportcCsP|\}}}||}|dkrd||dfS|dkr(d||dd|dfS|d krAd ||d tt|d d|d fS|d krR|d}d||d |fS|dkrc|d}d||d |fS|dkrod||dfS|dkrd||d tt|d d|d fS|dkrd|d|dfS|dkrd|d|dfSdS)Nmissing required fieldz&Missing required parameter in %s: "%s" required_name unknown fieldz1Unknown parameter in %s: "%s", must be one of: %s unknown_paramz, valid_namesr%zCInvalid type for parameter %s, value: %s, type: %s, valid types: %srr' invalid ranger1z>Invalid value for parameter %s, value: %s, valid min value: %sinvalid lengthz@Invalid length for parameter %s, value: %s, valid min length: %sunable to encode to jsonz2Invalid parameter %s must be json serializable: %s type_errorinvalid type for documentzLInvalid type for document parameter %s, value: %s, type: %s, valid types: %smore than one inputzkInvalid number of parameters set for tagged union structure %s. Can only set one of the following keys: %s.z. members empty inputzDMust set one of the following keys for tagged unionstructure %s: %s.) _get_namerCstrtype)rrEr7r additionalr1rrrrBfsv        zValidationErrors._format_errorcCs"|sdS|dr|ddS|S)Ninput.r0) startswith)rrrrrrSs   zValidationErrors._get_namecKs|j|||fdSr)r<rA)rrreasonkwargsrrrrszValidationErrors.reportN) __name__ __module__ __qualname__r>r r rBrSrrrrrr:WsC r:c@seZdZdZddZddZddZdd Zd d Ze e fd d dZ e e j d ddZe eefd ddZe e fd ddZe e jd ddZddZe efd ddZe eejfe jd ddZeZe e jd ddZdd Zd!d"Zd#S)$r z+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)r: _validate)rr rrrrrr szParamValidator.validatecCs,t|r|jS|jdkr|jr|jSdSdS)N structure)r_validate_jsonvalue_string type_nameis_document_type_validate_document)rrrrr_check_special_validation_casess z.ParamValidator._check_special_validation_casescCs>||}|r|||||dSt|d|j||||dS)Nz _validate_%s)rfgetattrrc)rr rrrspecial_validatorrrrr`s zParamValidator._validatec CsLzt|WdSttfy%}z|j|d|dWYd}~dSd}~ww)NrM)rN)jsondumps ValueError TypeErrorr)rr rrrerrrrbs z)ParamValidator._validate_jsonvalue_stringc Cs|durdSt|tr|D] }||||||q dSt|tr8t|D]\}}||||d||fq%dSt|tjttt fs_t ttt ttf}dd|D} |j |d|t || ddSdS)Nz%s[%d]cSrrrr rrrr#r$z5ParamValidator._validate_document..rO)r param_typer') r(dictrelist enumerater string_typesintboolr2rTrrU) rr rrrkeyindexentityr'r)rrrres*     z!ParamValidator._validate_documentr*c Cs|jr"t|dkr|j|d|jdnt|dkr"|j|d|jd|jdgD]}||vr8|j|d||dq)|j}g}|D]}||vrR|j|d |t|d q@||q@|D]}||||j||d ||fqZdS) NrrR)rQr0rPrequiredrF)rG user_paramsrH)rIrJ%s.%s) is_tagged_unionlenrrQr3r5rprAr`) rr rrrrequired_memberrQ known_paramsrrrr_validate_structures4     z"ParamValidator._validate_structurecCst|t||d|dS)NrL)r9r|rrrr_validate_strings zParamValidator._validate_stringc CsH|j}t|t||d|t|D]\}}||||d||fqdS)NrLz%s[%s])memberr9r|rqr`)rrrrr member_shapeiitemrrr_validate_lists zParamValidator._validate_listc CsR|j}|j}|D]\}}||||d||f||||d||fq dS)Nz %s (key: %s)rz)rur6itemsr`) rrrrr key_shape value_shaperur6rrr _validate_map#s zParamValidator._validate_mapcCt|||d|dSNrKr9rrrr_validate_integer,z ParamValidator._validate_integercCsHt|tttjfr dSt|drdS|j|d|ttttdgddS)Nreadr%zfile-like objectr&)r(bytes bytearrayrrr4rrTrrrr_validate_blob0s    zParamValidator._validate_blobcCsdSrrrrrr_validate_boolean;sz ParamValidator._validate_booleancCrrrrrrr_validate_double?rzParamValidator._validate_doublecCrrrrrrr_validate_longErzParamValidator._validate_longcCs6||}|sttdg}|j|d||ddSdS)Nztimestamp-stringr%r&)_type_check_datetimerrrr)rrrrr is_valid_typer)rrr_validate_timestampIs   z"ParamValidator._validate_timestampc Cs*zt|WdStttfyYdSwr?)rrlrkAttributeError)rr6rrrrSs z#ParamValidator._type_check_datetimeN) r\r]r^__doc__r rfr`rbrer,rorrrrrrptuplerr integer_typesrrrtrr2decimalDecimalr_validate_floatrrrrrrrr s6              r c@seZdZddZddZdS)ParamValidationDecoratorcCs||_||_dSr)_param_validator _serializer)rparam_validator serializerrrrr>^s z!ParamValidationDecorator.__init__cCsB|j}|dur|j||j}|rt|d|j||S)Nr) input_shaperr r rr rserialize_to_request)r parametersoperation_modelrrrrrrbsz-ParamValidationDecorator.serialize_to_requestN)r\r]r^r>rrrrrr]s r)rbotocore.compatrrrirbotocore.utilsrrbotocore.exceptionsrrr,r9objectr:r rrrrrs     ^)