U m^,@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 validatorrrk/private/var/folders/sd/whlwsn6x1_qgglc0mjv25_695qk2gl/T/pip-install-4zq3fp6i/botocore/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|s.ddD}|j|d||ddSdS)NcSsg|]}t|qSr)r text_type).0trrr <szUtype_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'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      r6c@s<eZdZddZddZddZddZd d Zd d Zd S)ValidationErrorscCs g|_dSr_errorsrrrr__init__ZszValidationErrors.__init__cCs|jr dSdSNTFr8r:rrrr ]szValidationErrors.has_errorscCs*g}|jD]}|||q d|S)N )r9append _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)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 ranger,rr+z=Invalid range for parameter %s, value: %s, valid range: %s-%sinvalid lengthz>Invalid length for parameter %s, value: %s, valid range: %s-%sunable to encode to jsonz2Invalid parameter %s must be json serializable: %s type_error) _get_namer@strtype)rrAr2r additionalr4r5rrrr?hsT          zValidationErrors._format_errorcCs&|sdS|dr|ddS|SdS)Ninput.r+) startswith)rrrrrrKs   zValidationErrors._get_namecKs|j|||fdSr)r9r>)rrreasonkwargsrrrrszValidationErrors.reportN) __name__ __module__ __qualname__r;r r r?rKrrrrrr7Ys r7c@seZdZdZddZddZddZdd Zee fd d d Z ee j d d dZ eeefd ddZee fd ddZee jd ddZddZeefd ddZeeejfe jd ddZeZee jd ddZddZdd 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)r7 _validate)rr rrrrrr szParamValidator.validatecCst|r|jSdSr)r_validate_jsonvalue_string)rrrrr_check_special_validation_casessz.ParamValidator._check_special_validation_casescCs<||}|r|||||nt|d|j||||dS)Nz _validate_%s)rZgetattrZ type_name)rr rrrZspecial_validatorrrrrXs zParamValidator._validatec CsJzt|Wn6ttfk rD}z|j|d|dW5d}~XYnXdS)NrI)rJ)jsondumps ValueError TypeErrorr)rr rrrerrrrYsz)ParamValidator._validate_jsonvalue_stringr%c Cs|jdgD]}||kr|j|d||dq|j}g}|D].}||kr`|j|d|t|dq<||q<|D]&}||||j||d||fqpdS)NrequiredrB)rCZ user_paramsrD)rErF%s.%s)r.r0rmemberslistr>rX) rr rrrZrequired_memberrcZ known_paramsrrrr_validate_structures&   z"ParamValidator._validate_structurecCst|t||d|dS)NrH)r6lenrrrr_validate_strings zParamValidator._validate_stringc CsH|j}t|t||d|t|D] \}}||||d||fq"dS)NrHz%s[%s])memberr6rf enumeraterX)rrrrrZ member_shapeiitemrrr_validate_listszParamValidator._validate_listc CsR|j}|j}|D]8\}}||||d||f||||d||fqdS)Nz %s (key: %s)rb)keyr1itemsrX) rrrrrZ key_shapeZ value_shapermr1rrr _validate_maps zParamValidator._validate_mapcCst|||d|dSNrGr6rrrr_validate_integersz ParamValidator._validate_integercCsHt|tttjfrdSt|dr$dS|j|d|ttttdgddS)Nreadr zfile-like objectr!)r#bytes bytearrayrrr/rrLrrrr_validate_blobs   zParamValidator._validate_blobcCsdSrrrrrr_validate_booleansz ParamValidator._validate_booleancCst|||d|dSrprqrrrr_validate_doubleszParamValidator._validate_doublecCst|||d|dSrprqrrrr_validate_longszParamValidator._validate_longcCs2||}|s.ttdg}|j|d||ddS)Nztimestamp-stringr r!)_type_check_datetimerrrr)rrrrrZ is_valid_typer$rrr_validate_timestamp s   z"ParamValidator._validate_timestampc Cs0zt|WdStttfk r*YdSXdSr<)rr_r^AttributeError)rr1rrrrzs z#ParamValidator._type_check_datetimeN)rTrUrV__doc__r rZrXrYr'dictrer string_typesrgrdtuplerlro integer_typesrrrvboolrwr-decimalDecimalrxZ_validate_floatryr{rzrrrrr s2               r c@seZdZddZddZdS)ParamValidationDecoratorcCs||_||_dSr)_param_validator _serializer)rZparam_validator serializerrrrr;sz!ParamValidationDecorator.__init__cCsB|j}|dk r4|j||j}|r4t|d|j||S)Nr) input_shaperr r rr rserialize_to_request)r parametersZoperation_modelrrrrrr#sz-ParamValidationDecorator.serialize_to_requestN)rTrUrVr;rrrrrrsr)r}Zbotocore.compatrrr\rZbotocore.utilsrrZbotocore.exceptionsrrr'r6objectr7r rrrrrs     :