a 97ao@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@s eZdZdS)NoShapeFoundErrorN__name__ __module__ __qualname__rri/private/var/folders/s6/9n5zrl012gv99k63s4q6ccsd4s6mqz/T/pip-target-f5cq3f2q/lib/python/botocore/model.pyr sr c@s eZdZdS)InvalidShapeErrorNr rrrrrsrc@s eZdZdS)OperationNotFoundErrorNr rrrrr!src@s eZdZdS)InvalidShapeReferenceErrorNr rrrrr%src@seZdZddZdS) ServiceIdcCst|SN)rselfrrr hyphenize*szServiceId.hyphenizeN)r r r rrrrrr)src@sneZdZdZgdZgdZeZdddZe ddZ e d d Z e d d Z d dZ ddZeddZdS)Shapez3Object representing a shape from the service model.) locationNameZ queryNameZ flattenedlocationpayloadZ streamingtimestampFormatZ xmlNamespaceZ resultWrapperZ xmlAttribute eventstreameventZ eventheaderZ eventpayloadZ jsonvaluerZ hostLabel) requiredminmaxZ sensitiveenumidempotencyTokenerror exceptionZendpointdiscoveryidZ retryabledocumentNcCsB||_|d|_|dd|_||_|dur2t}||_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_namegetr( _shape_modelUnresolvableShapeMap_shape_resolver_cache)r shape_name shape_modelshape_resolverrrr__init__>s zShape.__init__cCsF|j}i}|jD]}||jvr||||<qd|vrB|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 serializationattrrrrr8`s  zShape.serializationcCs0|j}i}|jD]}||jvr||||<q|S)aIMetadata about the shape. This requires optional information about the shape, including: * min * max * enum * sensitive * required * idempotencyToken * document :rtype: dict :return: Metadata about the shape. )r-METADATA_ATTRS)rr7metadatar9rrrr;s   zShape.metadatacCs|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. rr;r,rrrrrequired_memberss zShape.required_memberscCs |j|Srr/resolve_shape_refr shape_refrrr_resolve_shape_refszShape._resolve_shape_refcCsd|jj|jfS)Nz<%s(%s)> __class__r r*rrrr__repr__szShape.__repr__cCsdSrrrrrrevent_stream_nameszShape.event_stream_name)N)r r r __doc__r5r:rMAP_TYPEr4rr8r;r=rBrEpropertyrFrrrrr.s "   rc@s<eZdZeddZeddZeddZeddZd S) StructureShapecCs>|jd|}|}|D]\}}||||<q"|S)Nmembers)r-r,rHitemsrB)rrKZ shape_membersr*rArrrrKs zStructureShape.memberscCs,|jD]\}}|jdr |Sq dS)Nr)rKrLr8r,)r member_namememberrrrrFs  z StructureShape.event_stream_namecCs8|jddsdS|jdi}|d}|r2|S|jS)Nr%Fr$code)r;r,r*)rZerror_metadatarOrrr error_codes zStructureShape.error_codecCs|jddS)Nr&Fr<rrrris_document_typeszStructureShape.is_document_typeN)r r r rrKrFrPrQrrrrrJs   rJc@seZdZeddZdS) ListShapecCs||jdS)NrNrBr-rrrrrNszListShape.memberN)r r r rrNrrrrrRsrRc@s$eZdZeddZeddZdS)MapShapecCs||jdS)NkeyrSrrrrrUsz MapShape.keycCs||jdS)NvaluerSrrrrrVszMapShape.valueN)r r r rrUrVrrrrrTs rTc@seZdZeddZdS) StringShapecCs|jdgS)Nr"r<rrrrr"szStringShape.enumN)r r r rr"rrrrrWsrWc@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)0 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. r;shapesN) _service_descriptionr,r; ShapeResolverr/NOT_SET_signature_version _service_nameZ_instance_cache)rZservice_description service_namerrrr4s zServiceModel.__init__cCs|j||Sr)r/get_shape_by_namerr1 member_traitsrrr shape_forszServiceModel.shape_forcCs|j|dSr)_error_code_cacher,)rrPrrrshape_for_error_codesz!ServiceModel.shape_for_error_codecCs"i}|jD]}|j}|||<q |Sr) error_shapesrP)rZerror_code_cache error_shaperOrrrrds   zServiceModel._error_code_cachecCs |j|Srr>r@rrrr?!szServiceModel.resolve_shape_refcCst|jdiS)NrYlistrZr,rrrr shape_names$szServiceModel.shape_namescCs6g}|jD]&}||}|jddr ||q |S)Nr%F)rjrcr;r,append)rrfr1rgrrrrf(s    zServiceModel.error_shapescCs:z|jd|}Wnty,t|Yn0t|||SN operations)rZKeyErrorrOperationModel)rZoperation_namer7rrroperation_model1s  zServiceModel.operation_modelcCs|jddSNr(r))rZr,rrrrr(9szServiceModel.documentationcCst|jdgSrlrhrrrroperation_names=szServiceModel.operation_namescCs|jdur|jS|jSdS)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_prefixrrrrr_As zServiceModel.service_namecCs4zt|dWSty.t|jdYn0dS)NZ serviceId)r_)r_get_metadata_propertyrrr^rrrr service_idRs  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. Z signingNameN)r;r,rs)r signing_namerrrrv[s zServiceModel.signing_namecCs |dS)NZ apiVersionrtrrrr api_versiongszServiceModel.api_versioncCs |dS)NprotocolrwrrrrrykszServiceModel.protocolcCs |dS)NZendpointPrefixrwrrrrrsoszServiceModel.endpoint_prefixcCs(|jD]}||}|jr|SqdSr)rrrpis_endpoint_discovery_operationrZ operationr7rrrendpoint_discovery_operationss  z)ServiceModel.endpoint_discovery_operationcCs6|jD]*}||}|jdur|jdrdSqdS)NrTF)rrrpendpoint_discoveryr,r{rrrendpoint_discovery_requiredzs    z(ServiceModel.endpoint_discovery_requiredcCs4z |j|WSty.td||fYn0dS)Nz1"%s" not defined in the metadata of the model: %s)r;rnrrr*rrrrts  z#ServiceModel._get_metadata_propertycCs"|jtur|jd}||_|jS)NZsignatureVersion)r]r\r;r,)rsignature_versionrrrrs  zServiceModel.signature_versioncCs ||_dSr)r])rrVrrrrscCsd|jj|jfS)Nz%s(%s))rDr r_rrrrrEszServiceModel.__repr__)N)N)r r r rGr4rcrerrdr?rjrfrrpr(rrr_rurvrxryrsr|r~rtrIrsetterrErrrrrXsN                   rXc@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)7roNcCs8||_||_||_|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,Z _wire_namer;r)rrp service_modelr*rrrr4s  zOperationModel.__init__cCs|jdur|jS|jSdSr)r wire_namerrrrr*s zOperationModel.namecCs |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_modelcCs|jddSrqrrrrrr(szOperationModel.documentationcCs|jddS)N deprecatedFrrrrrrszOperationModel.deprecatedcCs|jddS)NZendpointdiscoveryrrrrrr}sz!OperationModel.endpoint_discoverycCs|jddS)NZendpointoperationFrrrrrrzsz.OperationModel.is_endpoint_discovery_operationcCs d|jvrdS|j|jdS)Ninputrrr?rrrr input_shapes  zOperationModel.input_shapecCs d|jvrdS|j|jdS)Noutputrrrrr output_shapes  zOperationModel.output_shapecCs"|j}|sgSdd|jDS)NcSs(g|] \}}d|jvr|jdr|qS)r#)r;).0r*shaperrr s   z5OperationModel.idempotent_members..)rrKrL)rrrrridempotent_memberssz!OperationModel.idempotent_memberscCs |jdS)NZauthtyperrrrr auth_type szOperationModel.auth_typecs$jdg}tfdd|DS)Nerrorsc3s|]}j|VqdSr)rr?)rsrrr z.OperationModel.error_shapes..)rr,ri)rrYrrrrfszOperationModel.error_shapescCs |jdS)NendpointrrrrrrszOperationModel.endpointcCs|jddS)NZhttpChecksumRequiredFrrrrrhttp_checksum_requiredsz%OperationModel.http_checksum_requiredcCs |duSr)get_event_stream_inputrrrrhas_event_stream_inputsz%OperationModel.has_event_stream_inputcCs |duSr)get_event_stream_outputrrrrhas_event_stream_output!sz&OperationModel.has_event_stream_outputcCs ||jSr)_get_event_streamrrrrrr%sz%OperationModel.get_event_stream_inputcCs ||jSr)rrrrrrr(sz&OperationModel.get_event_stream_outputcCs$|dur dS|j}|r |j|SdS)zAReturns the event stream member's shape if any or None otherwise.N)rFrK)rrZ event_namerrrr+s  z OperationModel._get_event_streamcCs |duSr)get_streaming_inputrrrrhas_streaming_input4sz"OperationModel.has_streaming_inputcCs |duSr)get_streaming_outputrrrrhas_streaming_output8sz#OperationModel.has_streaming_outputcCs ||jSr)_get_streaming_bodyrrrrrr<sz"OperationModel.get_streaming_inputcCs ||jSr)rrrrrrr?sz#OperationModel.get_streaming_outputcCs<|dur dS|jd}|dur8|j|}|jdkr8|SdS)z?Returns the streaming member's shape if any; or None otherwise.Nrblob)r8r,rKr+)rrrZ payload_shaperrrrBs   z"OperationModel._get_streaming_bodycCsd|jj|jfS)Nz %s(name=%s)rCrrrrrEMszOperationModel.__repr__)N)r r r r4rr*rIrrr(rr}rzrrrrrfrrrrrrrrrrrrrErrrrrosX %                    roc@s8eZdZdZeeeedZddZ d ddZ dd Z dS) r[zResolves shape references.) structurerimapstringcCs||_i|_dSr) _shape_mapZ _shape_cache)r shape_maprrrr4\szShapeResolver.__init__NcCsz|j|}Wnty(t|Yn0z|j|dt}Wnty^td|Yn0|rv|}||||||}|S)Nr'z(Shape is missing required key 'type': %s) rrnr SHAPE_CLASSESr,rrcopyupdate)rr1rbr2Z shape_clsresultrrrr``s     zShapeResolver.get_shape_by_namecCsht|dkr"d|vr"||dS|}z|d}WntyVtd|Yn0|||SdS)Nrz*Invalid model, missing shape reference: %s)lenr`rr6rnr)rrArbr1rrrr?ps  zShapeResolver.resolve_shape_ref)N) r r r rGrJrRrTrWrr4r`r?rrrrr[Qs r[c@s"eZdZdZdddZddZdS)r.zJA ShapeResolver that will throw ValueErrors when shapes are resolved. NcCs tddS)Nz>Attempted to lookup shape '%s', but no shape map was provided. ValueErrorrarrrr`sz&UnresolvableShapeMap.get_shape_by_namecCs tddS)Nz?Attempted to resolve shape '%s', but no shape map was provided.rr@rrrr?sz&UnresolvableShapeMap.resolve_shape_ref)N)r r r rGr`r?rrrrr.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|_dS)Nr)rrKShapeNameGenerator_name_generatornew_shape_namer*rrrrr4sz%DenormalizedStructureBuilder.__init__cCs ||_|S)zp :type members: dict :param members: The denormalized members. :return: self )_members)rrKrrr 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)r'rK)r)r1r2r3)rr _build_modelr*r[rJ)rrYZ denormalizedresolverrrr build_models z(DenormalizedStructureBuilder.build_modelcCs|ddkr|||||<nh|ddkr<|||||<nJ|ddkrZ|||||<n,|ddvrv||||<ntd|ddS)Nr'rrir) rintegerbooleanrfloat timestamplongdoublecharzUnknown shape type: %s)_build_structure _build_list _build_map _build_scalarr)rr7rYr1rrrrs    z)DenormalizedStructureBuilder._build_modelcCs\t}||}||d<|dtD],\}}||}d|i||<||||q*|S)NrKr)r_build_initial_shaper,rL_get_shape_namer)rr7rYrKrr*Z member_modelmember_shape_namerrrrs   z-DenormalizedStructureBuilder._build_structurecCs6||}||}d|i|d<||d|||S)NrrNrrr)rr7rYrrrrrrs    z(DenormalizedStructureBuilder._build_listcCsf||d}||d}||}d|i|d<d|i|d<||d||||d|||S)NrUrVrr)rr7rYZkey_shape_nameZvalue_shape_namerrrrrs   z'DenormalizedStructureBuilder._build_mapcCsDd|di}d|vr |d|d<tjD]}||vr&||||<q&|S)Nr'r()rr:)rr7rr9rrrrs  z1DenormalizedStructureBuilder._build_initial_shapecCs ||Sr)rrr7rrrr sz*DenormalizedStructureBuilder._build_scalarcCs$d|vr|dS|j|dSdS)Nr1r')rrrrrrrsz,DenormalizedStructureBuilder._get_shape_name)N)r r r rGr4rrrrrrrrrrrrrrs#      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_cacherrrrr4szShapeNameGenerator.__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+Z current_indexrrrr!s  z!ShapeNameGenerator.new_shape_nameN)r r r rGr4rrrrrrsrN) rG collectionsrZbotocore.utilsrrrZbotocore.compatrZbotocore.exceptionsrrobjectr\ Exceptionr rrrstrrrrJrRrTrWrXror[r.rrrrrr s4    & 244