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)paramsshape validatorrrR/Users/kashii/Desktop/Projects/Workshops/worker-safety/lambda/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)rr r)rr type_check4s r!cCsRd}td}td}d|jkr4|jd}||kr4d}|rN|j|||||gddS)NFz-infinfminT)r valid_range)floatmetadatar)rvaluer error_typerZfailed min_allowed max_allowedrrr range_checkFs   r+c@s<eZdZddZddZddZddZd d Zd d Zd S)ValidationErrorscCs g|_dS)N)_errors)rrrr__init__TszValidationErrors.__init__cCs|jr dSdS)NTF)r-)rrrrr WszValidationErrors.has_errorscCs.g}x|jD]}|||q Wd|S)N )r-append _format_errorjoin)rZerror_messageserrorrrrr \s 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$rz=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_namer2strtype)rr3r(r additionalr)r*rrrr1bs:         zValidationErrors._format_errorcCs&|sdS|dr|ddS|SdS)Ninput.r7) startswith)rrrrrr9s   zValidationErrors._get_namecKs|j|||fdS)N)r-r0)rrreasonkwargsrrrrszValidationErrors.reportN) __name__ __module__ __qualname__r.r r r1r9rrrrrr,Ss r,c@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)r, _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)rHgetattr type_name)rr r rrZspecial_validatorrrrrFs  zParamValidator._validatec CsJyt|Wn6ttfk rD}z|j|d|dWdd}~XYnXdS)Nzunable to encode to json)r8)jsondumps ValueError TypeErrorr)rr r rrerrrrGsz)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)r4Z user_paramsz unknown field)r5r6z%s.%s)r&getrmemberslistr0rF) rr r rrZrequired_memberrRZ 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+rU enumeraterF)rrr rr member_shapeiitemrrr_validate_listszParamValidator._validate_listc CsV|j}|j}xD|D]8\}}||||d||f||||d||fqWdS)Nz %s (key: %s)z%s.%s)keyr'itemsrF) rrr rr key_shape 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 bytearrayrrhasattrrr:)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_timestamps   z"ParamValidator._validate_timestampc Cs,y t|dStttfk r&dSXdS)NTF)rrNrMAttributeError)rr'rrrrks z#ParamValidator._type_check_datetimeN)rBrCrD__doc__r rHrFrGr!dictrTr string_typesrVrStupler\ra integer_typesrbrgboolrhr%decimalDecimalriZ_validate_floatrjrlrkrrrrrs"    rc@seZdZddZddZdS)ParamValidationDecoratorcCs||_||_dS)N)_param_validator _serializer)rZparam_validator serializerrrrr.sz!ParamValidationDecorator.__init__cCsB|j}|dk r4|j||j}|r4t|d|j||S)N)r) input_shaperwr r rr rxserialize_to_request)r parametersoperation_modelrzrrrrr{sz-ParamValidationDecorator.serialize_to_requestN)rBrCrDr.r{rrrrrvsrv)rnbotocore.compatrrtrKrbotocore.utilsrrbotocore.exceptionsrrr!r+objectr,rrvrrrrs      :