Current File : //proc/self/root/lib/python3/dist-packages/botocore/__pycache__/model.cpython-312.pyc
�

P��e�w���dZddlmZddlmZmZddlmZddlm	Z	m
Z
ddlmZm
Z
mZe�ZGd�de�ZGd	�d
e�ZGd�de�ZGd
�de�ZGd�de�ZGd�d�ZGd�de�ZGd�de�ZGd�de�ZGd�de�ZGd�de�ZGd�de�ZGd�d e�ZGd!�d"�Z Gd#�d$�Z!Gd%�d&�Z"Gd'�d(�Z#Gd)�d*�Z$Gd+�d,�Z%y-).z-Abstractions to interact with service models.�)�defaultdict)�
NamedTuple�Union)�OrderedDict)�MissingServiceIdError�UndefinedModelAttributeError)�CachedProperty�hyphenize_service_id�instance_cachec��eZdZy)�NoShapeFoundErrorN��__name__�
__module__�__qualname__���0/usr/lib/python3/dist-packages/botocore/model.pyr
r
���rr
c��eZdZy)�InvalidShapeErrorNrrrrrrrrrc��eZdZy)�OperationNotFoundErrorNrrrrrr#rrrc��eZdZy)�InvalidShapeReferenceErrorNrrrrrr'rrrc��eZdZd�Zy)�	ServiceIdc��t|�S�N)r
��selfs r�	hyphenizezServiceId.hyphenize,s
��#�D�)�)rN)rrrr"rrrrr+s��*rrc�x�eZdZdZgd�Zgd�ZeZdd�Ze	d��Z
e	d��Ze	d��Zd	�Z
d
�Zed��Zy)
�Shapez3Object representing a shape from the service model.)�locationName�	queryName�	flattened�location�payload�	streaming�timestampFormat�xmlNamespace�
resultWrapper�xmlAttribute�eventstream�event�eventheader�eventpayload�	jsonvaluer+�	hostLabel)�required�min�max�pattern�	sensitive�enum�idempotencyToken�error�	exception�endpointdiscoveryid�	retryable�document�union�contextParam�clientContextParams�requiresLengthNc��||_|d|_|jdd�|_||_|�
t�}||_i|_y)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�
documentation�N)�name�	type_name�getrG�_shape_model�UnresolvableShapeMap�_shape_resolver�_cache)r!�
shape_name�shape_model�shape_resolvers    r�__init__zShape.__init__^sQ��(��	�$�V�,���(�_�_�_�b�A���'����!�2�3�N�-�����rc��|j}i}|jD]}||jvs�||||<�d|vr|jd�|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.

        r%rI)rL�SERIALIZED_ATTRS�pop)r!�model�
serialization�attrs    rrXzShape.serialization�sj��.�!�!���
��)�)�	2�D��t�(�(�(�&+�D�k�
�d�#�	2��]�*�$1�$5�$5�n�$E�M�&�!��rc�r�|j}i}|jD]}||jvs�||||<�|S)a�Metadata about the shape.

        This requires optional information about the shape, including:

            * min
            * max
            * pattern
            * enum
            * sensitive
            * required
            * idempotencyToken
            * document
            * union
            * contextParam
            * clientContextParams
            * requiresLength

        :rtype: dict
        :return: Metadata about the shape.

        )rL�METADATA_ATTRS)r!rW�metadatarYs    rr\zShape.metadata�sK��.�!�!�����'�'�	-�D��t�(�(�(�!&�t�����	-��rc�:�|jjdg�S)z�A 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.

        r5�r\rKr s r�required_memberszShape.required_members�s���}�}� � ��R�0�0rc�8�|jj|�Sr�rN�resolve_shape_ref�r!�	shape_refs  r�_resolve_shape_refzShape._resolve_shape_ref�����#�#�5�5�i�@�@rc�P�d|jj�d|j�d�S)N�<�(z)>��	__class__rrIr s r�__repr__zShape.__repr__�s&���4�>�>�*�*�+�1�T�Y�Y�K�r�:�:rc��yrrr s r�event_stream_namezShape.event_stream_name�s��rr)rrr�__doc__rUr[r�MAP_TYPErSr	rXr\r_rerl�propertyrnrrrr$r$0s}��=���&�N�$�H� �D����@����:�1��1�A�;����rr$c�\�eZdZed��Zed��Zed��Zed��Zed��Zy)�StructureShapec���|jjd|j��}|j�}|j�D]\}}|j	|�||<�|S)N�members)rLrKrp�itemsre)r!ru�
shape_membersrIrds     rruzStructureShape.members�sc���#�#�'�'�	�4�=�=�?�C���
�
��
�&�}�}��	E�O�D�)�"&�"9�"9�)�"D�M�$��	E��rc��|jj�D]$\}}|jjd�s�"|cSy)Nr/)rurvrXrK)r!�member_name�members   rrnz StructureShape.event_stream_name�sB��#'�<�<�#5�#5�#7�	#��K���#�#�'�'�
�6�"�"�	#�rc��|jjdd�sy|jjdi�}|jd�}|r|S|jS)Nr=Fr<�code)r\rKrI)r!�error_metadatar|s   r�
error_codezStructureShape.error_code�sQ���}�}� � ��e�4�����*�*�7�B�7���!�!�&�)����K��y�y�rc�:�|jjdd�S)Nr@Fr^r s r�is_document_typezStructureShape.is_document_type�s���}�}� � ��U�3�3rc�:�|jjdd�S)NrAFr^r s r�is_tagged_unionzStructureShape.is_tagged_union�s���}�}� � ��%�0�0rN)	rrrr	rurnr~r�r�rrrrsrs�sd���������������4��4��1��1rrsc��eZdZed��Zy)�	ListShapec�>�|j|jd�S)Nrz�rerLr s rrzzListShape.members���&�&�t�'8�'8��'B�C�CrN)rrrr	rzrrrr�r��s���D��Drr�c�,�eZdZed��Zed��Zy)�MapShapec�>�|j|jd�S)N�keyr�r s rr�zMapShape.keys���&�&�t�'8�'8��'?�@�@rc�>�|j|jd�S)N�valuer�r s rr�zMapShape.value
s���&�&�t�'8�'8��'A�B�BrN)rrrr	r�r�rrrr�r�s,���A��A��C��Crr�c��eZdZed��Zy)�StringShapec�:�|jjdg�S)Nr:r^r s rr:zStringShape.enums���}�}� � ���,�,rN)rrrr	r:rrrr�r�s���-��-rr�c�,�eZdZUeed<eeefed<y)�StaticContextParameterrIr�N)rrr�str�__annotations__r�boolrrrr�r�s��

�I���s���rr�c�"�eZdZUeed<eed<y)�ContextParameterrIryN�rrrr�r�rrrr�r�s
��

�I��rr�c�,�eZdZUeed<eed<eed<y)�ClientContextParameterrIrFrGNr�rrrr�r�s��

�I�

�I��rr�c�\�eZdZdZdd�Zdd�Zd�Zed��Zd�Z	ed��Z
ed	��Zed
��Z
ed��Zed��Zed
��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zd�Zed��Zej8d��Zd�Zy)�ServiceModelzQ

    :ivar service_description: The parsed service description dictionary.

    Nc��||_|jdi�|_t|jdi��|_t
|_||_i|_y)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_descriptionrKr\�
ShapeResolverrN�NOT_SET�_signature_version�
_service_name�_instance_cache)r!�service_description�service_names   rrSzServiceModel.__init__,sW��*%8��!�+�/�/�
�B�?��
�,��#�#�H�b�1� 
���#*���)���!��rc�:�|jj||�Sr)rN�get_shape_by_name�r!rP�
member_traitss   r�	shape_forzServiceModel.shape_forKs ���#�#�5�5��
�
�	
rc�:�|jj|d�Sr)�_error_code_cacherK)r!r~s  r�shape_for_error_codez!ServiceModel.shape_for_error_codePs���%�%�)�)�*�d�;�;rc�N�i}|jD]}|j}|||<�|Sr)�error_shapesr~)r!�error_code_cache�error_shaper|s    rr�zServiceModel._error_code_cacheSs;�����,�,�	1�K��)�)�D�%0��T�"�	1� �rc�8�|jj|�Srrarcs  rrbzServiceModel.resolve_shape_ref[rfrc�L�t|jjdi��S)Nr���listr�rKr s r�shape_nameszServiceModel.shape_names^s ���D�-�-�1�1�(�B�?�@�@rc��g}|jD]A}|j|�}|jjdd�s�1|j	|��C|S)Nr=F)r�r�r\rK�append)r!r�rPr�s    rr�zServiceModel.error_shapesbsV�����*�*�	1�J��.�.��4�K��#�#�'�'��U�;��#�#�K�0�	1��rc�r�	|jd|}t|||�S#t$rt|��wxYw�N�
operations)r��KeyErrorr�OperationModel)r!�operation_namerWs   r�operation_modelzServiceModel.operation_modelksI��	9��-�-�l�;�N�K�E��e�T�>�:�:���	9�(��8�8�	9�s�!�6c�:�|jjdd�S�NrGrH)r�rKr s rrGzServiceModel.documentationss���(�(�,�,�_�b�A�Arc�L�t|jjdg��Sr�r�r s r�operation_nameszServiceModel.operation_namesws ���D�-�-�1�1�,��C�D�Drc�J�|j�|jS|jS)a�The 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.

        )r��endpoint_prefixr s rr�zServiceModel.service_name{s(�����)��%�%�%��'�'�'rc�~�	t|jd��S#t$rt|j���wxYw)N�	serviceId)r�)r�_get_metadata_propertyrrr�r s r�
service_idzServiceModel.service_id�s@��	I��T�8�8��E�F�F��+�	I�'�T�5G�5G�H�H�	I�s�� <c�X�|jjd�}|�|j}|S)z�The 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.
        �signingName)r\rKr�)r!�signing_names  rr�zServiceModel.signing_name�s/���}�}�(�(��7�����/�/�L��rc�$�|jd�S)N�
apiVersion�r�r s r�api_versionzServiceModel.api_version�s���*�*�<�8�8rc�$�|jd�S)N�protocolr�r s rr�zServiceModel.protocol�s���*�*�:�6�6rc�$�|jd�S)N�endpointPrefixr�r s rr�zServiceModel.endpoint_prefix�s���*�*�+;�<�<rc�h�|jD]#}|j|�}|js�!|cSyr)r�r��is_endpoint_discovery_operation�r!�	operationrWs   r�endpoint_discovery_operationz)ServiceModel.endpoint_discovery_operation�s5���-�-�	�I��(�(��3�E��4�4���	rc��|jD]=}|j|�}|j��!|jjd�s�=yy)Nr5TF)r�r��endpoint_discoveryrKr�s   r�endpoint_discovery_requiredz(ServiceModel.endpoint_discovery_required�sO���-�-�	�I��(�(��3�E��(�(�4��,�,�0�0��<��
	�rc
��|jjdi�}|j�D��cgc]\}}t||d|d����c}}Scc}}w)NrCrFrG)rIrFrG)r�rKrvr�)r!�params�
param_name�	param_vals    r�client_context_parametersz&ServiceModel.client_context_parameters�sa���*�*�.�.�/D�b�I��*0����

�&�
�I�
#���v�&�'��8�
�
�	
��
s�Ac�^�	|j|S#t$rtd|�d|����wxYw)N�"z," not defined in the metadata of the model: )r\r�r�r!rIs  rr�z#ServiceModel._get_metadata_property�sC��	��=�=��&�&���	�.��D�6�E�d�V�L��
�	�s��,c��|jtur"|jjd�}||_|jS)N�signatureVersion)r�r�r\rK)r!�signature_versions  rr�zServiceModel.signature_version�s:���"�"�g�-� $�
�
� 1� 1�2D� E��&7�D�#��&�&�&rc��||_yr)r�)r!r�s  rr�zServiceModel.signature_version�s
��"'��rc�N�|jj�d|j�d�S)Nri�))rkrr�r s rrlzServiceModel.__repr__�s'���.�.�)�)�*�!�D�,=�,=�+>�a�@�@rr)rrrrorSr�r�r	r�rbr�r�rr�rGr�r�r�r�r�r�r�r�r�r�r�rqr��setterrlrrrr�r�%s����"�>
�
<�� �� �A��A��A������;��;��B��B��E��E��(��(� �I��I��	��	��9��9��7��7��=��=����������	
��	
���'��'����(��(�Arr�c��eZdZd d�Zed��Zed��Zed��Zed��Z	ed��Z
ed��Zed	��Zed
��Z
ed��Zed��Zed
��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zed��Zd�Zd�Zd�Zed��Zed��Zd�Zd�Z d�Z!d�Z"y)!r�Nc��||_||_||_|jd�|_|j
|_|jdi�|_y)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.

        rI�httpN)�_operation_model�_service_model�	_api_namerK�
_wire_namer\r�)r!r��
service_modelrIs    rrSzOperationModel.__init__�sP��8!0���+������*�-�-�f�5���%�.�.��
�#�'�'���3��	rc�J�|j�|jS|jSr)r��	wire_namer s rrIzOperationModel.name	s ���>�>�%��>�>�!��>�>�!rc�8�|jjd�S)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 operation name
        we send across the wire (e.g cloudfront).

        Any serialization code should use ``wire_name``.

        rI�r�rKr s rr�zOperationModel.wire_names���$�$�(�(��0�0rc��|jSr)r�r s rr�zOperationModel.service_models���"�"�"rc�:�|jjdd�Sr�r�r s rrGzOperationModel.documentation"s���$�$�(�(��"�=�=rc�:�|jjdd�S)N�
deprecatedFr�r s rr�zOperationModel.deprecated&s���$�$�(�(��u�=�=rc�:�|jjdd�S)N�endpointdiscoveryr�r s rr�z!OperationModel.endpoint_discovery*s���$�$�(�(�)<�d�C�Crc�:�|jjdd�S)N�endpointoperationFr�r s rr�z.OperationModel.is_endpoint_discovery_operation0s���$�$�(�(�)<�e�D�Drc�p�d|jvry|jj|jd�S)N�input�r�r�rbr s r�input_shapezOperationModel.input_shape4s<���$�/�/�/���"�"�4�4��!�!�'�*�
�	
rc�p�d|jvry|jj|jd�S)N�outputrr s r�output_shapezOperationModel.output_shape>s<���4�0�0�0���"�"�4�4��!�!�(�+�
�	
rc���|j}|sgS|jj�D��cgc]$\}}d|jvr|jdr|��&c}}Scc}}w)Nr;)rrurvr\)r!rrI�shapes    r�idempotent_membersz!OperationModel.idempotent_membersIsc���&�&����I�"-�!4�!4�!:�!:�!<�
���u�!�U�^�^�3����1�2�
�
�	
��
s�)Ac
��|jjdi�}|j�D��cgc]!\}}t||jd�����#c}}Scc}}w)N�staticContextParamsr�)rIr�)r�rKrvr�)r!r�rI�propss    r�static_context_parametersz(OperationModel.static_context_parametersVsW���&�&�*�*�+@�"�E�� &�|�|�~�
���e�
#��E�I�I�g�4F�G�
�	
��
s�&Ac��|jsgS|jjj�D��cgc]A\}}d|jvr.d|jdvrt	|jdd|����Cc}}Scc}}w)NrBrI)rIry)rrurvr\r�)r!rIrs   r�context_parametersz!OperationModel.context_parameters^s�������I� $�/�/�7�7�=�=�?�
�
��e�����/��%�.�.��8�8�

��^�^�N�3�F�;� �
�
�	
��
s�ABc�8�|jjd�S)N�requestcompressionr�r s r�request_compressionz"OperationModel.request_compressionms���$�$�(�(�)=�>�>rc�8�|jjd�S)N�authtyper�r s r�	auth_typezOperationModel.auth_typeq����$�$�(�(��4�4rc�d���jjdg�}t�fd�|D��S)N�errorsc3�T�K�|]}�jj|����!y�wr)r�rb)�.0�sr!s  �r�	<genexpr>z.OperationModel.error_shapes.<locals>.<genexpr>xs"�����M��D�'�'�9�9�!�<�M�s�%()r�rKr�)r!r�s` rr�zOperationModel.error_shapesus,����&�&�*�*�8�R�8���M�f�M�M�Mrc�8�|jjd�S)N�endpointr�r s rrzOperationModel.endpointzrrc�:�|jjdd�S)N�httpChecksumRequiredFr�r s r�http_checksum_requiredz%OperationModel.http_checksum_required~s���$�$�(�(�)?��G�Grc�:�|jjdi�S)N�httpChecksumr�r s r�
http_checksumzOperationModel.http_checksum�s���$�$�(�(���<�<rc�&�|j�duSr)�get_event_stream_inputr s r�has_event_stream_inputz%OperationModel.has_event_stream_input�s���*�*�,�D�8�8rc�&�|j�duSr)�get_event_stream_outputr s r�has_event_stream_outputz&OperationModel.has_event_stream_output�s���+�+�-�T�9�9rc�8�|j|j�Sr)�_get_event_streamrr s rr&z%OperationModel.get_event_stream_input�s���%�%�d�&6�&6�7�7rc�8�|j|j�Sr)r,rr s rr)z&OperationModel.get_event_stream_output�s���%�%�d�&7�&7�8�8rc�D�|�y|j}|r|j|Sy)zAReturns the event stream member's shape if any or None otherwise.N)rnru)r!r�
event_names   rr,z OperationModel._get_event_stream�s*���=���,�,�
���=�=��,�,�rc�&�|j�duSr)�get_streaming_inputr s r�has_streaming_inputz"OperationModel.has_streaming_input�s���'�'�)��5�5rc�&�|j�duSr)�get_streaming_outputr s r�has_streaming_outputz#OperationModel.has_streaming_output�s���(�(�*�$�6�6rc�8�|j|j�Sr)�_get_streaming_bodyrr s rr1z"OperationModel.get_streaming_input�s���'�'��(8�(8�9�9rc�8�|j|j�Sr)r7rr s rr4z#OperationModel.get_streaming_output�s���'�'��(9�(9�:�:rc��|�y|jjd�}|� |j|}|jdk(r|Sy)z?Returns the streaming member's shape if any; or None otherwise.Nr)�blob)rXrKrurJ)r!rr)�
payload_shapes    rr7z"OperationModel._get_streaming_body�sK���=���%�%�)�)�)�4����!�M�M�'�2�M��&�&�&�0�$�$�rc�N�|jj�d|j�d�S)Nz(name=r�rjr s rrlzOperationModel.__repr__�s$���.�.�)�)�*�&�����1�=�=rr)#rrrrSr	rIrqr�r�rGr�r�r�rrr	r
rrrr�rr!r$r'r*r&r)r,r2r5r1r4r7rlrrrr�r��s���#4�J�"��"��1��1��#��#��>��>��>��>��D��D�
�E��E��
��
��
��
��

��

��
��
��
��
��?��?��5��5��N��N��5��5��H��H��=��=��9��9��:��:�8�9���6��6��7��7�:�;�	�>rr�c�2�eZdZdZeeeed�Zd�Z	dd�Z
d�Zy)r�zResolves shape references.)�	structurer��map�stringc� �||_i|_yr)�
_shape_map�_shape_cache)r!�	shape_maps  rrSzShapeResolver.__init__�s��#�����rNc�.�	|j|}	|jj	|dt
�}|r!|j�}|j|�||||�}|S#t$rt|��wxYw#t$rt
d|����wxYw)NrFz&Shape is missing required key 'type': )	rBr�r
�
SHAPE_CLASSESrKr$r�copy�update)r!rPr�rQ�	shape_cls�results      rr�zShapeResolver.get_shape_by_name�s���	0��/�/�*�5�K�	��*�*�.�.�{�6�/B�E�J�I�
�%�*�*�,�K����}�-��:�{�D�9���
���	0�#�J�/�/�	0���	�#�8��
�F��
�	�s�A$�#A<�$A9�<Bc���t|�dk(rd|vr|j|d�S|j�}	|jd�}|j||�S#t$rtd|����wxYw)N�rz(Invalid model, missing shape reference: )�lenr�rGrVr�r)r!rdr�rPs    rrbzShapeResolver.resolve_shape_ref�s����y�>�Q��7�i�#7��)�)�)�G�*<�=�=�%�N�N�,�M�
�*�.�.�w�7�
�
�)�)�*�m�D�D��	�
�0�>�y�k�J���
�s�A�A3r)rrrrorsr�r�r�rFrSr�rbrrrr�r��s*��$�$����	�M���"Err�c��eZdZdZdd�Zd�Zy)rMzEA ShapeResolver that will throw ValueErrors when shapes are resolved.Nc� �td|�d���)NzAttempted to lookup shape '�!', but no shape map was provided.��
ValueErrorr�s   rr�z&UnresolvableShapeMap.get_shape_by_name�s���)�*��5V�W�
�	
rc� �td|�d���)NzAttempted to resolve shape 'rPrQrcs  rrbz&UnresolvableShapeMap.resolve_shape_ref�s ���*�9�+�6 �
!�
�	
rr)rrrror�rbrrrrMrM�s��O�
�

rrMc�R�eZdZdZdZdd�Zd�Zd�Zd�Zd�Z	d	�Z
d
�Zd�Zd�Z
d
�Zy)�DenormalizedStructureBuildera�Build 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.

    )	r@�integer�booleanr:�float�	timestamp�long�double�charNc��t�|_t�|_|�!|jj	d�|_yy)Nr>)rru�ShapeNameGenerator�_name_generator�new_shape_namerIr�s  rrSz%DenormalizedStructureBuilder.__init__0s8��"�}���1�3����<��,�,�;�;�K�H�D�I�rc��||_|S)zp

        :type members: dict
        :param members: The denormalized members.

        :return: self

        )�_members)r!rus  r�with_membersz)DenormalizedStructureBuilder.with_members6s�� ��
��rc���t�}d|jd�}|j|||j�t	|��}t|j||j|��S)z�Build the model based on the provided members.

        :rtype: botocore.model.StructureShape
        :return: The built StructureShape object.

        r>)rFru)rD)rPrQrR)rrb�_build_modelrIr�rs)r!r��denormalized�resolvers    r�build_modelz(DenormalizedStructureBuilder.build_modelBsa�������}�}�
��	
���,���	�	�:� �6�2����y�y��t�y�y�)�#�
�	
rc�$�|ddk(r|j||�||<y|ddk(r|j||�||<y|ddk(r|j||�||<y|d|jvr|j	|�||<ytd|d����)NrFr>r�r?zUnknown shape type: )�_build_structure�_build_list�
_build_map�SCALAR_TYPES�
_build_scalarr)r!rWr�rPs    rrez)DenormalizedStructureBuilder._build_modelVs�����=�K�'�!%�!6�!6�u�f�!E�F�:��
�6�]�f�
$�!%�!1�!1�%��!@�F�:��
�6�]�e�
#�!%�����!?�F�:��
�6�]�d�/�/�
/�!%�!3�!3�E�!:�F�:��#�&:�5��=�/�$J�K�Krc��t�}|j|�}||d<|jdt��j�D]0\}}|j	|�}d|i||<|j|||��2|S)Nrur)r�_build_initial_shaperKrv�_get_shape_namere)r!rWr�rurrI�member_model�member_shape_names        rrjz-DenormalizedStructureBuilder._build_structurebs����-���)�)�%�0��"��i��"'�)�)�I�{�}�"E�"K�"K�"M�	G��D�,� $� 4� 4�\� B��$�&7�8�G�D�M����l�F�4E�F�	G��rc��|j|�}|j|�}d|i|d<|j|d||�|S)Nrrz�rqrpre)r!rWr�rsrs     rrkz(DenormalizedStructureBuilder._build_listmsN�� �0�0��7���)�)�%�0��"�$5�6��h�����%��/�6�3D�E��rc���|j|d�}|j|d�}|j|�}d|i|d<d|i|d<|j|d||�|j|d||�|S)Nr�r�rru)r!rWr��key_shape_name�value_shape_namers      rrlz'DenormalizedStructureBuilder._build_mapts����-�-�e�E�l�;���/�/��g��?���)�)�%�0����0��e��!�#3�4��g�����%��,���?����%��.�&�2B�C��rc�p�d|di}d|vr|d|d<tjD]}||vs�||||<�|S)NrFrG)r$r[)r!rWrrYs    rrpz1DenormalizedStructureBuilder._build_initial_shape~s[���E�&�M�
���e�#�%*�?�%;�E�/�"��(�(�	*�D��u�}�#�D�k��d��	*��rc�$�|j|�Sr)rp�r!rWs  rrnz*DenormalizedStructureBuilder._build_scalar�s���(�(��/�/rc�P�d|vr|dS|jj|d�S)NrPrF)r_r`r{s  rrqz,DenormalizedStructureBuilder._get_shape_name�s0���5� ���&�&��'�'�6�6�u�V�}�E�Err)rrrrormrSrcrhrerjrkrlrprnrqrrrrUrU�sD��"�H
�L�I�
�
�(
L�	���	�0�FrrUc��eZdZdZd�Zd�Zy)r^z�Generate 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.

    c�,�tt�|_yr)r�int�_name_cacher s rrSzShapeNameGenerator.__init__�s��&�s�+��rc�x�|j|xxdz
cc<|j|}|j��d|��S)a�Generate 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

        rL�Type)r��
capitalize)r!rJ�
current_indexs   rr`z!ShapeNameGenerator.new_shape_name�sE��4	
����#�q�(�#��(�(��3�
��&�&�(�)��m�_�=�=rN)rrrrorSr`rrrr^r^�s���,�>rr^N)&ro�collectionsr�typingrr�botocore.compatr�botocore.exceptionsrr�botocore.utilsr	r
r�objectr��	Exceptionr
rrrr�rr$rsr�r�r�r�r�r�r�r�r�rMrUr^rrr�<module>r�s��4�#�$�'��P�O�
�(��	�	�	�	�	�	�	�Y�	�	��	�*��*�
b�b�J'1�U�'1�TD��D�C�u�C�-�%�-��Z��
�z��
�Z��{A�{A�|T>�T>�n3E�3E�l
�
�QF�QF�h'>�'>r
¿Qué es la limpieza dental de perros? - Clínica veterinaria


Es la eliminación del sarro y la placa adherida a la superficie de los dientes mediante un equipo de ultrasonidos que garantiza la integridad de las piezas dentales a la vez que elimina en profundidad cualquier resto de suciedad.

A continuación se procede al pulido de los dientes mediante una fresa especial que elimina la placa bacteriana y devuelve a los dientes el aspecto sano que deben tener.

Una vez terminado todo el proceso, se mantiene al perro en observación hasta que se despierta de la anestesia, bajo la atenta supervisión de un veterinario.

¿Cada cuánto tiempo tengo que hacerle una limpieza dental a mi perro?

A partir de cierta edad, los perros pueden necesitar una limpieza dental anual o bianual. Depende de cada caso. En líneas generales, puede decirse que los perros de razas pequeñas suelen acumular más sarro y suelen necesitar una atención mayor en cuanto a higiene dental.


Riesgos de una mala higiene


Los riesgos más evidentes de una mala higiene dental en los perros son los siguientes:

  • Cuando la acumulación de sarro no se trata, se puede producir una inflamación y retracción de las encías que puede descalzar el diente y provocar caídas.
  • Mal aliento (halitosis).
  • Sarro perros
  • Puede ir a más
  • Las bacterias de la placa pueden trasladarse a través del torrente circulatorio a órganos vitales como el corazón ocasionando problemas de endocarditis en las válvulas. Las bacterias pueden incluso acantonarse en huesos (La osteomielitis es la infección ósea, tanto cortical como medular) provocando mucho dolor y una artritis séptica).

¿Cómo se forma el sarro?

El sarro es la calcificación de la placa dental. Los restos de alimentos, junto con las bacterias presentes en la boca, van a formar la placa bacteriana o placa dental. Si la placa no se retira, al mezclarse con la saliva y los minerales presentes en ella, reaccionará formando una costra. La placa se calcifica y se forma el sarro.

El sarro, cuando se forma, es de color blanquecino pero a medida que pasa el tiempo se va poniendo amarillo y luego marrón.

Síntomas de una pobre higiene dental
La señal más obvia de una mala salud dental canina es el mal aliento.

Sin embargo, a veces no es tan fácil de detectar
Y hay perros que no se dejan abrir la boca por su dueño. Por ejemplo…

Recientemente nos trajeron a la clínica a un perro que parpadeaba de un ojo y decía su dueño que le picaba un lado de la cara. Tenía molestias y dificultad para comer, lo que había llevado a sus dueños a comprarle comida blanda (que suele ser un poco más cara y llevar más contenido en grasa) durante medio año. Después de una exploración oftalmológica, nos dimos cuenta de que el ojo tenía una úlcera en la córnea probablemente de rascarse . Además, el canto lateral del ojo estaba inflamado. Tenía lo que en humanos llamamos flemón pero como era un perro de pelo largo, no se le notaba a simple vista. Al abrirle la boca nos llamó la atención el ver una muela llena de sarro. Le realizamos una radiografía y encontramos una fístula que llegaba hasta la parte inferior del ojo.

Le tuvimos que extraer la muela. Tras esto, el ojo se curó completamente con unos colirios y una lentilla protectora de úlcera. Afortunadamente, la úlcera no profundizó y no perforó el ojo. Ahora el perro come perfectamente a pesar de haber perdido una muela.

¿Cómo mantener la higiene dental de tu perro?
Hay varias maneras de prevenir problemas derivados de la salud dental de tu perro.

Limpiezas de dientes en casa
Es recomendable limpiar los dientes de tu perro semanal o diariamente si se puede. Existe una gran variedad de productos que se pueden utilizar:

Pastas de dientes.
Cepillos de dientes o dedales para el dedo índice, que hacen más fácil la limpieza.
Colutorios para echar en agua de bebida o directamente sobre el diente en líquido o en spray.

En la Clínica Tus Veterinarios enseñamos a nuestros clientes a tomar el hábito de limpiar los dientes de sus perros desde que son cachorros. Esto responde a nuestro compromiso con la prevención de enfermedades caninas.

Hoy en día tenemos muchos clientes que limpian los dientes todos los días a su mascota, y como resultado, se ahorran el dinero de hacer limpiezas dentales profesionales y consiguen una mejor salud de su perro.


Limpiezas dentales profesionales de perros y gatos

Recomendamos hacer una limpieza dental especializada anualmente. La realizamos con un aparato de ultrasonidos que utiliza agua para quitar el sarro. Después, procedemos a pulir los dientes con un cepillo de alta velocidad y una pasta especial. Hacemos esto para proteger el esmalte.

La frecuencia de limpiezas dentales necesaria varía mucho entre razas. En general, las razas grandes tienen buena calidad de esmalte, por lo que no necesitan hacerlo tan a menudo e incluso pueden pasarse la vida sin requerir una limpieza. Sin embargo, razas pequeñas como el Yorkshire o el Maltés, deben hacérselas todos los años desde cachorros si se quiere conservar sus piezas dentales.

Otro factor fundamental es la calidad del pienso. Algunas marcas han diseñado croquetas que limpian la superficie del diente y de la muela al masticarse.

Ultrasonido para perros

¿Se necesita anestesia para las limpiezas dentales de perros y gatos?

La limpieza dental en perros no es una técnica que pueda practicarse sin anestesia general , aunque hay veces que los propietarios no quieren anestesiar y si tiene poco sarro y el perro es muy bueno se puede intentar…… , pero no se va a poder pulir ni acceder a todas la zona de la boca …. Además los limpiadores dentales van a irrigar agua y hay riesgo de aspiración a vías respiratorias si no se realiza una anestesia correcta con intubación traqueal . En resumen , sin anestesia no se va hacer una correcta limpieza dental.

Tampoco sirve la sedación ya que necesitamos que el animal esté totalmente quieto, y el veterinario tenga un acceso completo a todas sus piezas dentales y encías.

Alimentos para la limpieza dental

Hay que tener cierto cuidado a la hora de comprar determinados alimentos porque no todos son saludables. Algunos tienen demasiado contenido graso, que en exceso puede causar problemas cardiovasculares y obesidad.

Los mejores alimentos para los dientes son aquellos que están elaborados por empresas farmacéuticas y llevan componentes químicos con tratamientos específicos para el diente del perro. Esto implica no solo limpieza a través de la acción mecánica de morder sino también un tratamiento antibacteriano para prevenir el sarro.

Conclusión

Si eres como la mayoría de dueños, por falta de tiempo , es probable que no estés prestando la suficiente atención a la limpieza dental de tu perro. Por eso te animamos a que comiences a limpiar los dientes de tu perro y consideres atender a su higiene bucal con frecuencia.

Estas simples medidas pueden conllevar a que tu perro tenga una vida más larga y mucho más saludable.

Si te resulta imposible introducir un cepillo de dientes a tu perro en la boca, pásate con él por clínica Tus Veterinarios y te explicamos cómo hacerlo.

Necesitas hacer una limpieza dental profesional a tu mascota?
Llámanos al 622575274 o contacta con nosotros

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

¡Hola!