o .&a;p@sRdZddlmZddlmZmZmZddlmZddl m Z ddl m Z e Z GdddeZGd d d eZGd d d eZGd ddeZGdddeZGddde ZGdddeZGdddeZGdddeZGdddeZGddde ZGddde ZGdd d e ZGd!d"d"e ZGd#d$d$e ZGd%d&d&e Zd'S)(z-Abstractions to interact with service models.) defaultdict)CachedPropertyinstance_cachehyphenize_service_id) OrderedDict)MissingServiceIdError)UndefinedModelAttributeErrorc@ eZdZdS)NoShapeFoundErrorN__name__ __module__ __qualname__rr0/usr/lib/python3/dist-packages/botocore/model.pyr r c@r )InvalidShapeErrorNr rrrrrrrc@r )OperationNotFoundErrorNr rrrrr!rrc@r )InvalidShapeReferenceErrorNr rrrrr%rrc@seZdZddZdS) ServiceIdcCst|SN)rselfrrr hyphenize*zServiceId.hyphenizeN)r r rrrrrrr)s rc@sneZdZdZgdZgdZeZdddZe ddZ e d d Z e d d Z d dZ ddZeddZdS)Shapez3Object representing a shape from the service model.) locationName queryName flattenedlocationpayload streamingtimestampFormat xmlNamespace resultWrapper xmlAttribute eventstreamevent eventheader eventpayload jsonvaluer" hostLabel) requiredminmax sensitiveenumidempotencyTokenerror exceptionendpointdiscoveryid retryabledocumentunionNcCsB||_|d|_|dd|_||_|durt}||_i|_dS)a  :type shape_name: string :param shape_name: The name of the shape. :type shape_model: dict :param shape_model: The shape model. This would be the value associated with the key in the "shapes" dict of the service model (i.e ``model['shapes'][shape_name]``) :type shape_resolver: botocore.model.ShapeResolver :param shape_resolver: A shape resolver object. This is used to resolve references to other shapes. For scalar shape types (string, integer, boolean, etc.), this argument is not required. If a shape_resolver is not provided for a complex type, then a ``ValueError`` will be raised when an attempt to resolve a shape is made. type documentationN)name type_namegetr9 _shape_modelUnresolvableShapeMap_shape_resolver_cache)r shape_name shape_modelshape_resolverrrr__init__>s  zShape.__init__cCsF|j}i}|jD] }||jvr||||<qd|vr!|d|d<|S)aSerialization information about the shape. This contains information that may be needed for input serialization or response parsing. This can include: * name * queryName * flattened * location * payload * streaming * xmlNamespace * resultWrapper * xmlAttribute * jsonvalue * timestampFormat :rtype: dict :return: Serialization information about the shape. rr;)r>SERIALIZED_ATTRSpop)rmodel serializationattrrrrrI`s   zShape.serializationcCs0|j}i}|jD] }||jvr||||<q|S)a]Metadata about the shape. This requires optional information about the shape, including: * min * max * enum * sensitive * required * idempotencyToken * document * union :rtype: dict :return: Metadata about the shape. )r>METADATA_ATTRS)rrHmetadatarJrrrrLs   zShape.metadatacC|jdgS)zA list of members that are required. A structure shape can define members that are required. This value will return a list of required members. If there are no required members an empty list is returned. r,rLr=rrrrrequired_memberss zShape.required_memberscC |j|Srr@resolve_shape_refr shape_refrrr_resolve_shape_ref zShape._resolve_shape_refcCd|jj|jfS)Nz<%s(%s)> __class__r r;rrrr__repr__szShape.__repr__cCsdSrrrrrrevent_stream_nameszShape.event_stream_namer)r r r__doc__rFrKrMAP_TYPErErrIrLrOrUrZpropertyr[rrrrr.s  "    rc@sHeZdZeddZeddZeddZeddZed d Zd S) StructureShapecCs>|jd|}|}|D] \}}||||<q|S)Nmembers)r>r=r]itemsrU)rr` shape_membersr;rTrrrr`s zStructureShape.memberscCs,|jD]\}}|jdr|SqdS)Nr&)r`rarIr=)r member_namememberrrrr[s  z StructureShape.event_stream_namecCs8|jdds dS|jdi}|d}|r|S|jS)Nr3Fr2code)rLr=r;)rerror_metadatarerrr error_codes zStructureShape.error_codecC|jddS)Nr6FrNrrrris_document_typezStructureShape.is_document_typecCrh)Nr7FrNrrrris_tagged_unionrjzStructureShape.is_tagged_unionN) r r rrr`r[rgrirkrrrrr_s    r_c@eZdZeddZdS) ListShapecC||jdS)NrdrUr>rrrrrdzListShape.memberN)r r rrrdrrrrrmrmc@s$eZdZeddZeddZdS)MapShapecCrn)Nkeyrorrrrrsrpz MapShape.keycCrn)NvaluerorrrrrtrpzMapShape.valueN)r r rrrsrtrrrrrrs  rrc@rl) StringShapecCrM)Nr0rNrrrrr0rjzStringShape.enumN)r r rrr0rrrrrurqruc@seZdZdZd.ddZd.ddZddZed d Zd d Z ed dZ eddZ e ddZ eddZeddZeddZeddZeddZeddZedd Zed!d"Zed#d$Zed%d&Zd'd(Zed)d*Zejd+d*Zd,d-ZdS)/ ServiceModelzQ :ivar service_description: The parsed service description dictionary. NcCs<||_|di|_t|di|_t|_||_i|_dS)a :type service_description: dict :param service_description: The service description model. This value is obtained from a botocore.loader.Loader, or from directly loading the file yourself:: service_description = json.load( open('/path/to/service-description-model.json')) model = ServiceModel(service_description) :type service_name: str :param service_name: The name of the service. Normally this is the endpoint prefix defined in the service_description. However, you can override this value to provide a more convenient name. This is done in a few places in botocore (ses instead of email, emr instead of elasticmapreduce). If this value is not provided, it will default to the endpointPrefix defined in the model. rLshapesN) _service_descriptionr=rL ShapeResolverr@NOT_SET_signature_version _service_name_instance_cache)rservice_description service_namerrrrEs  zServiceModel.__init__cCs|j||Sr)r@get_shape_by_namerrB member_traitsrrr shape_forszServiceModel.shape_forcCs|j|dSr)_error_code_cacher=)rrgrrrshape_for_error_codez!ServiceModel.shape_for_error_codecCs"i}|jD] }|j}|||<q|Sr) error_shapesrg)rerror_code_cache error_shapererrrrs   zServiceModel._error_code_cachecCrPrrQrSrrrrR&rVzServiceModel.resolve_shape_refcCst|jdiS)Nrwlistrxr=rrrr shape_names)zServiceModel.shape_namescCs6g}|jD]}||}|jddr||q|S)Nr3F)rrrLr=append)rrrBrrrrr-s   zServiceModel.error_shapescCs6z |jd|}Wn tyt|wt|||SN operations)rxKeyErrorrOperationModel)roperation_namerHrrroperation_model6s   zServiceModel.operation_modelcCrhNr9r:)rxr=rrrrr9>rjzServiceModel.documentationcCst|jdgSrrrrrroperation_namesBrzServiceModel.operation_namescCs|jdur|jS|jS)aThe name of the service. This defaults to the endpointPrefix defined in the service model. However, this value can be overriden when a ``ServiceModel`` is created. If a service_name was not provided when the ``ServiceModel`` was created and if there is no endpointPrefix defined in the service model, then an ``UndefinedModelAttributeError`` exception will be raised. N)r|endpoint_prefixrrrrrFs zServiceModel.service_namecCs,zt|dWStyt|jdw)N serviceId)r)r_get_metadata_propertyrrr|rrrr service_idWs zServiceModel.service_idcCs|jd}|dur |j}|S)zThe name to use when computing signatures. If the model does not define a signing name, this value will be the endpoint prefix defined in the model. signingNameN)rLr=r)r signing_namerrrr`s zServiceModel.signing_namecC |dS)N apiVersionrrrrr api_versionl zServiceModel.api_versioncCr)NprotocolrrrrrrprzServiceModel.protocolcCr)NendpointPrefixrrrrrrtrzServiceModel.endpoint_prefixcCs(|jD]}||}|jr|SqdSr)rris_endpoint_discovery_operationr operationrHrrrendpoint_discovery_operationxs  z)ServiceModel.endpoint_discovery_operationcCs6|jD]}||}|jdur|jdrdSqdS)Nr,TF)rrendpoint_discoveryr=rrrrendpoint_discovery_requireds    z(ServiceModel.endpoint_discovery_requiredcCs,z|j|WStytd||fw)Nz1"%s" not defined in the metadata of the model: %s)rLrrrr;rrrrs  z#ServiceModel._get_metadata_propertycCs"|jtur|jd}||_|jS)NsignatureVersion)r{rzrLr=)rsignature_versionrrrrs  zServiceModel.signature_versioncCs ||_dSr)r{)rrtrrrrrcCrW)Nz%s(%s))rYr rrrrrrZzServiceModel.__repr__r)r r rr\rErrrrrRrrrrr9rrrrrrrrrrr^rsetterrZrrrrrvsP                    rvc@s&eZdZd6ddZeddZeddZedd Zed d Z ed d Z eddZ eddZ eddZ eddZeddZeddZeddZeddZeddZed d!Zed"d#Zd$d%Zd&d'Zd(d)Zed*d+Zed,d-Zd.d/Zd0d1Zd2d3Zd4d5ZdS)7rNcCs8||_||_||_|d|_|j|_|di|_dS)a :type operation_model: dict :param operation_model: The operation model. This comes from the service model, and is the value associated with the operation name in the service model (i.e ``model['operations'][op_name]``). :type service_model: botocore.model.ServiceModel :param service_model: The service model associated with the operation. :type name: string :param name: The operation name. This is the operation name exposed to the users of this model. This can potentially be different from the "wire_name", which is the operation name that *must* by provided over the wire. For example, given:: "CreateCloudFrontOriginAccessIdentity":{ "name":"CreateCloudFrontOriginAccessIdentity2014_11_06", ... } The ``name`` would be ``CreateCloudFrontOriginAccessIdentity``, but the ``self.wire_name`` would be ``CreateCloudFrontOriginAccessIdentity2014_11_06``, which is the value we must send in the corresponding HTTP request. r;httpN)_operation_model_service_model _api_namer= _wire_namerLr)rr service_modelr;rrrrEs  zOperationModel.__init__cCs|jdur|jS|jSr)r wire_namerrrrr;s zOperationModel.namecC |jdS)aRThe wire name of the operation. In many situations this is the same value as the ``name``, value, but in some services, the operation name exposed to the user is different from the operaiton name we send across the wire (e.g cloudfront). Any serialization code should use ``wire_name``. r;rr=rrrrrs zOperationModel.wire_namecCs|jSr)rrrrrrszOperationModel.service_modelcCrhrrrrrrr9rjzOperationModel.documentationcCrh)N deprecatedFrrrrrrrjzOperationModel.deprecatedcCs|jddS)Nendpointdiscoveryrrrrrrsz!OperationModel.endpoint_discoverycCrh)NendpointoperationFrrrrrrrjz.OperationModel.is_endpoint_discovery_operationcC d|jvrdS|j|jdS)NinputrrrRrrrr input_shapes zOperationModel.input_shapecCr)Noutputrrrrr output_shapes zOperationModel.output_shapecCs"|j}|sgSdd|jDS)NcSs(g|]\}}d|jvr|jdr|qS)r1)rL).0r;shaperrr s z5OperationModel.idempotent_members..)rr`ra)rrrrridempotent_memberss z!OperationModel.idempotent_memberscCr)Nauthtyperrrrr auth_type zOperationModel.auth_typecs$jdg}tfdd|DS)Nerrorsc3s|] }j|VqdSr)rrR)rsrrr sz.OperationModel.error_shapes..)rr=r)rrwrrrrszOperationModel.error_shapescCr)NendpointrrrrrrrzOperationModel.endpointcCrh)NhttpChecksumRequiredFrrrrrhttp_checksum_required!rjz%OperationModel.http_checksum_requiredcC |duSr)get_event_stream_inputrrrrhas_event_stream_input%rz%OperationModel.has_event_stream_inputcCrr)get_event_stream_outputrrrrhas_event_stream_output)rz&OperationModel.has_event_stream_outputcC ||jSr)_get_event_streamrrrrrr-rVz%OperationModel.get_event_stream_inputcCrr)rrrrrrr0rVz&OperationModel.get_event_stream_outputcCs$|durdS|j}|r|j|SdS)zAReturns the event stream member's shape if any or None otherwise.N)r[r`)rr event_namerrrr3s  z OperationModel._get_event_streamcCrr)get_streaming_inputrrrrhas_streaming_input<rz"OperationModel.has_streaming_inputcCrr)get_streaming_outputrrrrhas_streaming_output@rz#OperationModel.has_streaming_outputcCrr)_get_streaming_bodyrrrrrrDrVz"OperationModel.get_streaming_inputcCrr)rrrrrrrGrVz#OperationModel.get_streaming_outputcCs<|durdS|jd}|dur|j|}|jdkr|SdS)z?Returns the streaming member's shape if any; or None otherwise.Nr blob)rIr=r`r<)rrr payload_shaperrrrJs   z"OperationModel._get_streaming_bodycCrW)Nz %s(name=%s)rXrrrrrZUrzOperationModel.__repr__r)r r rrErr;r^rrr9rrrrrrrrrrrrrrrrrrrrrZrrrrrsZ %                   rc@s8eZdZdZeeeedZddZ d ddZ dd Z dS) ryzResolves shape references.) structurermapstringcCs||_i|_dSr) _shape_map _shape_cache)r shape_maprrrrEds zShapeResolver.__init__NcCs~z|j|}Wn tyt|wz |j|dt}Wn ty+td|w|r7|}||||||}|S)Nr8z(Shape is missing required key 'type': %s) rrr SHAPE_CLASSESr=rrcopyupdate)rrBrrC shape_clsresultrrrrhs"    zShapeResolver.get_shape_by_namecCs`t|dkrd|vr||dS|}z|d}Wn ty)td|w|||S)Nrz*Invalid model, missing shape reference: %s)lenrrrGrr)rrTrrBrrrrRxs  zShapeResolver.resolve_shape_refr) r r rr\r_rmrrrurrErrRrrrrryYs  ryc@s"eZdZdZdddZddZdS)r?zJA ShapeResolver that will throw ValueErrors when shapes are resolved. NcCtd)Nz>Attempted to lookup shape '%s', but no shape map was provided. ValueErrorrrrrrrz&UnresolvableShapeMap.get_shape_by_namecCr)Nz?Attempted to resolve shape '%s', but no shape map was provided.rrSrrrrRrz&UnresolvableShapeMap.resolve_shape_refr)r r rr\rrRrrrrr?s  r?c@sbeZdZdZdddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ dS)DenormalizedStructureBuilderaBuild a StructureShape from a denormalized model. This is a convenience builder class that makes it easy to construct ``StructureShape``s based on a denormalized model. It will handle the details of creating unique shape names and creating the appropriate shape map needed by the ``StructureShape`` class. Example usage:: builder = DenormalizedStructureBuilder() shape = builder.with_members({ 'A': { 'type': 'structure', 'members': { 'B': { 'type': 'structure', 'members': { 'C': { 'type': 'string', } } } } } }).build_model() # ``shape`` is now an instance of botocore.model.StructureShape :type dict_type: class :param dict_type: The dictionary type to use, allowing you to opt-in to using OrderedDict or another dict type. This can be particularly useful for testing when order matters, such as for documentation. NcCs.t|_t|_|dur|jd|_dSdS)Nr)rr`ShapeNameGenerator_name_generatornew_shape_namer;rrrrrEs z%DenormalizedStructureBuilder.__init__cCs ||_|S)zp :type members: dict :param members: The denormalized members. :return: self )_members)rr`rrr with_memberss z)DenormalizedStructureBuilder.with_memberscCsBt}d|jd}||||jt|d}t|j||j|dS)zBuild the model based on the provided members. :rtype: botocore.model.StructureShape :return: The built StructureShape object. r)r8r`)r)rBrCrD)rr _build_modelr;ryr_)rrw denormalizedresolverrrr build_models z(DenormalizedStructureBuilder.build_modelcCs|ddkr|||||<dS|ddkr |||||<dS|ddkr0|||||<dS|ddvr?||||<dStd|d)Nr8rrr) rintegerbooleanrfloat timestamplongdoublecharzUnknown shape type: %s)_build_structure _build_list _build_map _build_scalarr)rrHrwrBrrrrs    z)DenormalizedStructureBuilder._build_modelcCs\t}||}||d<|dtD]\}}||}d|i||<||||q|S)Nr`r)r_build_initial_shaper=ra_get_shape_namer)rrHrwr`rr; member_modelmember_shape_namerrrrs   z-DenormalizedStructureBuilder._build_structurecCs6||}||}d|i|d<||d|||S)Nrrdrrr)rrHrwrrrrrrs   z(DenormalizedStructureBuilder._build_listcCsf||d}||d}||}d|i|d<d|i|d<||d||||d|||S)Nrsrtrr)rrHrwkey_shape_namevalue_shape_namerrrrrs   z'DenormalizedStructureBuilder._build_mapcCsDd|di}d|vr|d|d<tjD] }||vr||||<q|S)Nr8r9)rrK)rrHrrJrrrr s   z1DenormalizedStructureBuilder._build_initial_shapecCs ||Sr)rrrHrrrrs z*DenormalizedStructureBuilder._build_scalarcCs d|vr|dS|j|dS)NrBr8)rrr rrrrsz,DenormalizedStructureBuilder._get_shape_namer)r r rr\rErrrrrrrrrrrrrrs #     rc@s eZdZdZddZddZdS)rzGenerate unique shape names for a type. This class can be used in conjunction with the DenormalizedStructureBuilder to generate unique shape names for a given type. cCstt|_dSr)rint _name_cacherrrrrE&rzShapeNameGenerator.__init__cCs,|j|d7<|j|}d||fS)aGenerate a unique shape name. This method will guarantee a unique shape name each time it is called with the same type. :: >>> s = ShapeNameGenerator() >>> s.new_shape_name('structure') 'StructureType1' >>> s.new_shape_name('structure') 'StructureType2' >>> s.new_shape_name('list') 'ListType1' >>> s.new_shape_name('list') 'ListType2' :type type_name: string :param type_name: The type name (structure, list, map, string, etc.) :rtype: string :return: A unique shape name for the given type rz%sType%s)r  capitalize)rr< current_indexrrrr)s  z!ShapeNameGenerator.new_shape_nameN)r r rr\rErrrrrrs rN) r\ collectionsrbotocore.utilsrrrbotocore.compatrbotocore.exceptionsrrobjectrz Exceptionr rrrstrrrr_rmrrrurvrryr?rrrrrrs6    * 364