Ë
    }D™jÉ&  ã                  óœ  — d Z ddlmZ ddlmZ ddlmZmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZmZmZmZmZ dd	lZdd
lmZ ddlmZ ddlmZmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z#m$Z$ ddl%m&Z&  ejN                  e#eedœ¬«       	 dd	l(Z G d„ de&«      Z*	 	 	 d	 	 	 	 	 	 	 d d„Z+d!d„Z,d"d„Z-d#d„Z.d„ Z/d$d„Z0d%d„Z1y	# e)$ r dd	lZY Œ=w xY w)&a�  
Utilities to break down :py:class:`.CachedResponse` objects into a dict of python builtin types
using `cattrs <https://cattrs.readthedocs.io>`_. This does the majority of the work needed for all
serialization formats.

.. automodsumm:: requests_cache.serializers.cattrs
   :classes-only:
   :nosignatures:

.. automodsumm:: requests_cache.serializers.cattrs
   :functions-only:
   :nosignatures:
é    )Úannotations)ÚMutableMapping)ÚdatetimeÚ	timedelta)ÚDecimal)Úsingledispatchmethod)ÚJSONDecodeError)ÚCallableÚDictÚ
ForwardRefÚListÚOptionalÚUnionN)Ú	Converter)ÚHTTPAdapter)ÚRequestsCookieJarÚcookiejar_from_dict)ÚRequestException©ÚCaseInsensitiveDicté   )Úis_json_content_type)ÚCachedResponseÚDecodedContenté   )ÚStage)r   r   )Úlocalnsc                  ó˜   — e Zd ZdZ	 	 d		 	 	 d
d„Zdd„Zed„ «       Zej                  dd„«       Z	ed„ «       Z
e
j                  dd„«       Z	y)Ú
CattrStageaÔ  Base serializer class that does pre/post-processing with  ``cattrs``. This can be used either
    on its own, or as a stage within a :py:class:`.SerializerPipeline`.

    Args:
        factory: A callable that returns a ``cattrs`` converter to start from instead of a new
            ``Converter``. Mainly useful for preconf converters.
        decode_content: Save response body in human-readable format, if possible

    Notes on ``decode_content`` option:

    * Response body will be decoded into a human-readable format (if possible) during serialization,
      and re-encoded during deserialization to recreate the original response body.
    * Supported Content-Types are ``application/*json*`` and ``text/*``. All other types will be saved
      as-is.
    * Decoded responses are saved in a separate ``_decoded_content`` attribute, to ensure that
      ``_content`` is always binary.
    * This is the default behavior for Filesystem, DynamoDB, and MongoDB backends.
    Nc                ó4   — t        |fi |¤Ž| _        || _        y ©N)Úinit_converterÚ	converterÚdecode_content)ÚselfÚfactoryr$   Úkwargss       úm/var/www/html/Astrologybackend/backend/venv/lib/python3.12/site-packages/requests_cache/serializers/cattrs.pyÚ__init__zCattrStage.__init__F   s   € ô (¨Ñ:°6Ñ:ˆŒØ,ˆÕó    c                óT   — t        | j                  ¬«      }| j                  |_        |S )N)r$   )r   r$   r#   )r%   Ústages     r(   ÚcopyzCattrStage.copyO   s"   € Ü¨$×*=Ñ*=Ô>ˆØŸ.™.ˆŒØˆr*   c                ó   — |S r!   © ©r%   Úvalues     r(   ÚdumpszCattrStage.dumpsT   ó   € àˆr*   c                ól   — | j                   j                  |«      }| j                  rt        ||«      S |S r!   )r#   Úunstructurer$   Ú_decode_content)r%   r1   Úresponse_dicts      r(   Ú_zCattrStage._X   s1   € àŸ™×2Ñ2°5Ó9ˆØ8<×8KÒ8KŒ˜u mÓ4Ð^ÐQ^Ð^r*   c                ó   — |S r!   r/   r0   s     r(   ÚloadszCattrStage.loads]   r3   r*   c                óV   — t        | j                  j                  |t        ¬«      «      S )N)Úcl)Ú_encode_contentr#   Ú	structurer   r0   s     r(   r8   zCattrStage._a   s!   € ä˜tŸ~™~×7Ñ7¸Ä.Ð7ÓQÓRÐRr*   )NF)r&   ú"Optional[Callable[..., Converter]]r$   Úbool)Úreturnz'CattrStage')r1   r   rA   Údict)r1   r   rA   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r)   r-   r   r2   Úregisterr8   r:   r/   r*   r(   r   r   2   s‡   „ ñð* 7;Ø$ð-à3ð-ð ó-óð
 ñó ðð ‡^�^ò_ó ð_ð ñó ðð ‡^�^òSó ñSr*   r   c                ó¼  ‡— | xs t         } 	  | d¬«      Š|r1‰j                  t        d„ «       ‰j	                  t        t
        «       |r1‰j                  t        d„ «       ‰j	                  t        t        «       ‰j                  t        d„ «       ‰j	                  t        d„ «       ‰j                  t        t        «       ‰j	                  t        d„ «       ‰j	                  t        d„ «       ‰j	                  t        t        t        f   d	„ «       ˆfd
„}‰j                  d„ dˆfd„	«       ‰j!                  d„ |«       ‰S # t        $ r  | «       ŠY �ŒDw xY w)aF  Make a converter to structure and unstructure nested objects within a
    :py:class:`.CachedResponse`

    Args:
        factory: An optional factory function that returns a ``cattrs`` converter
        convert_datetime: May be set to ``False`` for pre-configured converters that already have
            datetime support
    T)Úomit_if_defaultc                ó*   — | r| j                  «       S d S r!   )Ú	isoformat©Úobjs    r(   ú<lambda>z init_converter.<locals>.<lambda>|   s   € ÑUXÀ#Ç-Á-Ã/€ Ð^b€ r*   c                ó*   — | r| j                  «       S d S r!   )Útotal_secondsrL   s    r(   rN   z init_converter.<locals>.<lambda>‚   s   € ¹# 3×#4Ñ#4Ó#6€ À4€ r*   c                ó4   — t        | j                  «       «      S r!   )rB   ÚitemsrL   s    r(   rN   z init_converter.<locals>.<lambda>‡   s   € ÄtÈCÏIÉIËKÓGX€ r*   c                ó   — t        | «      S r!   )r   ©rM   Úclss     r(   rN   z init_converter.<locals>.<lambda>ˆ   s   € ÔJ]Ð^aÓJb€ r*   c                ó   — t        | «      S r!   r   rT   s     r(   rN   z init_converter.<locals>.<lambda>‹   s   € Ô.AÀ#Ó.F€ r*   c                ó   — | S r!   r/   rT   s     r(   rN   z init_converter.<locals>.<lambda>�   s   € Às€ r*   c                ó   — | S r!   r/   rT   s     r(   rN   z init_converter.<locals>.<lambda>“   s   € È#€ r*   c                ó˜   •— |j                   s"|j                  t        «       t        «       «       ‰j	                  | |j
                  «      S r!   )Ú__forward_evaluated__Ú	_evaluateÚglobalsÚlocalsr>   Ú__forward_value__©rM   rU   r#   s     €r(   Ústructure_fwd_refz)init_converter.<locals>.structure_fwd_ref•   s7   ø€ à×(Ò(Ø�M‰Mœ'›)¤V£XÔ.Ø×"Ñ" 3¨×(=Ñ(=Ó>Ð>r*   c                ó&   — | j                   t        u S r!   ©Ú	__class__r   ©rU   s    r(   rN   z init_converter.<locals>.<lambda>�   ó   € �C—M‘M¤ZÐ/€ r*   c                óL   •— ‰j                  | |r|j                  «      S d «      S r!   )r5   r^   r_   s     €r(   rN   z init_converter.<locals>.<lambda>ž   s%   ø€ ˜i×3Ñ3°CÑRU¸×9NÑ9NÓ`€ Ð[_Ó`€ r*   c                ó&   — | j                   t        u S r!   rb   rd   s    r(   rN   z init_converter.<locals>.<lambda>¡   re   r*   r!   )r   Ú	TypeErrorÚregister_unstructure_hookr   Úregister_structure_hookÚ_to_datetimer   Ú_to_timedeltar   r   rB   r   r   r   r   Úregister_unstructure_hook_funcÚregister_structure_hook_func)r&   Úconvert_datetimeÚconvert_timedeltar`   r#   s       @r(   r"   r"   f   s;  ø€ ð Ò"œ€GðÙ¨DÔ1ˆ	ñ Ø×+Ñ+¬HÑ6bÔcØ×)Ñ)¬(´LÔAñ Ø×+Ñ+ÜÑGô	
ð 	×)Ñ)¬)´]ÔCð ×'Ñ'Ô(9Ñ;XÔYØ×%Ñ%Ô&7Ñ9bÔcØ×'Ñ'Ô(;¼TÔBØ×%Ñ%ÜÑFôð
 ×%Ñ%¤nÑ6JÔKð ×%Ñ%¤e¬D´$¨JÑ&7Ñ9MÔNô?ð ×,Ñ,Ù/Ü`ôð ×*Ñ*Ù/Øôð
 Ðøô] ò Ù“I‹	ðús   �	E ÅEÅEc                 ó~   — t        di | ¤Ž}|j                  t        d„ «       |j                  t        t        «       |S )zTMake a converter that uses Decimals instead of floats to represent timedelta objectsc                óN   — | r"t        t        | j                  «       «      «      S d S r!   )r   ÚstrrP   rL   s    r(   rN   z2make_decimal_timedelta_converter.<locals>.<lambda>¬   s   € ÁCœw¤s¨3×+<Ñ+<Ó+>Ó'?Ó@€ ÈT€ r*   r/   )r   ri   r   rj   rl   )r'   r#   s     r(   Ú make_decimal_timedelta_converterrt   ¨   s=   € äÑ#˜FÑ#€IØ×'Ñ'ÜÑQôð ×%Ñ%¤i´Ô?ð Ðr*   c                ó.  — | j                   j                  dd«      }t        |«      r&	 | j                  «       |d<   |j	                  dd«       |j                  d«      r!| j                  |d<   |j	                  dd«       |S # t
        t        f$ r Y ŒEw xY w)z>Decode response body into a human-readable format, if possibleúContent-TypeÚ Ú_decoded_contentÚ_contentNztext/)	ÚheadersÚgetr   ÚjsonÚpopr	   r   Ú
startswithÚtext)Úresponser7   Ú	ct_headers      r(   r6   r6   ´   s›   € à× Ñ ×$Ñ$ ^°RÓ8€Iô ˜IÔ&ð	Ø08·±³ˆMÐ,Ñ-Ø×Ñ˜j¨$Ô/ð
 ×Ñ˜GÔ$Ø,4¯M©MˆÐ(Ñ)Ø×Ñ˜* dÔ+ð Ðøô  Ô!1Ð2ò 	Ùð	ús   ©%B ÂBÂBc                ó´  — | j                   €| S t        | j                  j                  d«      «      r$t	        j
                  | j                   «      | _         t        | j                   t        «      rg| j                   j                  d«      | _	        d| _         d| _
        d| j                  v r+t        t        | j                  «      «      | j                  d<   | S )z‡Re-encode response body if saved as JSON or text (via ``decode_content=True``).
    This has no effect for a binary response body.
    Nrv   zutf-8zContent-Length)rx   r   rz   r{   r|   r2   Ú
isinstancers   Úencodery   ÚencodingÚlen)r€   s    r(   r=   r=   É   s¶   € ð
 × Ñ Ð(Øˆô ˜H×,Ñ,×0Ñ0°Ó@ÔAÜ$(§J¡J¨x×/HÑ/HÓ$IˆÔ!ô �(×+Ñ+¬SÔ1Ø$×5Ñ5×<Ñ<¸WÓEˆÔØ$(ˆÔ!à#ˆÔà˜x×/Ñ/Ñ/Ü14´S¸×9JÑ9JÓ5KÓ1LˆH×ÑÐ-Ñ.à€Or*   c                óX   ‡— dˆfd„Št        | t        «      rd| v r ‰| d   «      | d<   | S )z¾Workaround for DynamoDB-specific issue with decode_content=True. There doesn't seem to be
    an obvious way to do this with the current converter setup, so need to do it manually here.
    c                ó&  •— t        | t        «      r| D �cg c]
  } ‰|«      ‘Œ c}S t        | t        «      r*| j                  «       D ��ci c]  \  }}| ‰|«      “Œ c}}S t        | t        «      rt        t        | «      «      S | S c c}w c c}}w r!   )rƒ   ÚlistrB   rR   Úfloatr   rs   )r1   ÚvÚkÚ_float_to_decimals      €r(   r�   z*_convert_floats.<locals>._float_to_decimalç   sz   ø€ Ü�eœTÔ"Ø27Ö8¨QÑ% aÕ(Ò8Ð8Ü˜œtÔ$Ø8=¿¹»×F±°°1�AÑ(¨Ó+Ñ+ÓFÐFÜ˜œuÔ%Üœ3˜u›:Ó&Ð&àˆLùò 9ùãFs   –BÁBrx   )r1   r   )rƒ   rB   )r1   r�   s    @r(   Ú_convert_floatsrŽ   â   s7   ø€ õ
ô �%œÔÐ#5¸Ñ#>Ù$5°eÐ<NÑ6OÓ$PˆÐ Ñ!Ø€Lr*   c                óP   — t        | t        «      rt        j                  | «      } | S r!   )rƒ   rs   r   ÚfromisoformatrT   s     r(   rk   rk   ö   s!   € Ü�#”sÔÜ×$Ñ$ SÓ)ˆØ€Jr*   c                ó˜   — t        | t        t        f«      rt        | ¬«      } | S t        | t        «      rt        t        | «      ¬«      } | S )N)Úseconds)rƒ   ÚintrŠ   r   r   rT   s     r(   rl   rl   ü   s@   € Ü�#œœU�|Ô$Ü Ô$ˆð €Jô 
�CœÔ	!Ü¤ c£
Ô+ˆØ€Jr*   )NTT)r&   r?   ro   r@   rp   r@   rA   r   )rA   r   )r€   r   r7   r   rA   r   )r€   r   rA   r   )rA   r   )rA   r   )2rF   Ú
__future__r   Úcollections.abcr   r   r   Údecimalr   Ú	functoolsr   r|   r	   Útypingr
   r   r   r   r   r   ÚattrsÚcattrsr   Úrequests.adaptersr   Úrequests.cookiesr   r   Úrequests.exceptionsr   Úrequests.structuresr   Ú_utilsr   Úmodelsr   r   Úpipeliner   Úresolve_typesÚujsonÚImportErrorr   r"   rt   r6   r=   rŽ   rk   rl   r/   r*   r(   ú<module>r¥      sÛ   ðñõ #å *ß (Ý Ý *Ý  ß D× Dã Ý Ý )ß CÝ 0Ý 3å )ß 3Ý ð €× Ñ ØØ"3ÀKÑPõð
Ûô
1S�ô 1Sðj 37Ø!Ø"ð?Ø/ð?àð?ð ð?ð ó	?óD	óó*ò2ó(ôøð] ò Ýðús   Â	B? Â?	CÃ
C