U C^,@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)paramsshape validatorrr7/tmp/pip-install-6_kvzl1k/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      r7c@s<eZdZddZddZddZddZd d Zd d Zd S)ValidationErrorscCs g|_dSr_errorsrrrr__init__ZszValidationErrors.__init__cCs|jr dSdSNTFr9r;rrrr ]szValidationErrors.has_errorscCs*g}|jD]}|||q d|S)N )r:append _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_namerAstrtype)rrBr3r additionalr5r6rrrr@hsT          zValidationErrors._format_errorcCs&|sdS|dr|ddS|SdS)Ninput.r,) startswith)rrrrrrLs   zValidationErrors._get_namecKs|j|||fdSr)r:r?)rrreasonkwargsrrrrszValidationErrors.reportN) __name__ __module__ __qualname__r<r r r@rLrrrrrr8Ys r8c@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)r8 _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)r[getattr type_name)rr rrrZspecial_validatorrrrrYs zParamValidator._validatec CsJzt|Wn6ttfk rD}z|j|d|dW5d}~XYnXdS)NrJ)rK)jsondumps ValueError TypeErrorr)rr rrrerrrrZsz)ParamValidator._validate_jsonvalue_stringr&c Cs|jdgD]}||kr|j|d||dq|j}g}|D].}||kr`|j|d|t|dq<||q<|D]&}||||j||d||fqpdS)NrequiredrC)rDZ user_paramsrE)rFrG%s.%s)r/r1rmemberslistr?rY) rr rrrZrequired_memberreZ known_paramsrrrr_validate_structures&   z"ParamValidator._validate_structurecCst|t||d|dS)NrI)r7lenrrrr_validate_strings zParamValidator._validate_stringc CsH|j}t|t||d|t|D] \}}||||d||fq"dS)NrIz%s[%s])memberr7rh enumeraterY)rrrrrZ member_shapeiitemrrr_validate_listszParamValidator._validate_listc CsR|j}|j}|D]8\}}||||d||f||||d||fqdS)Nz %s (key: %s)rd)keyr2itemsrY) rrrrrZ key_shapeZ value_shaperor2rrr _validate_maps zParamValidator._validate_mapcCst|||d|dSNrHr7rrrr_validate_integersz ParamValidator._validate_integercCsHt|tttjfrdSt|dr$dS|j|d|ttttdgddS)Nreadr!zfile-like objectr")r$bytes bytearrayrrr0rrMrrrr_validate_blobs   zParamValidator._validate_blobcCsdSrrrrrr_validate_booleansz ParamValidator._validate_booleancCst|||d|dSrrrsrrrr_validate_doubleszParamValidator._validate_doublecCst|||d|dSrrrsrrrr_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=)rrar`AttributeError)rr2rrrr|s z#ParamValidator._type_check_datetimeN)rUrVrW__doc__r r[rYrZr(dictrgr string_typesrirftuplernrq integer_typesrtrxboolryr.decimalDecimalrzZ_validate_floatr{r}r|rrrrr 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)rUrVrWr<rrrrrrsr)rZbotocore.compatrrr^rZbotocore.utilsrrZbotocore.exceptionsrrr(r7objectr8r rrrrrs     :