
    ]j*                     ,   d dl Zd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlZ ej                  e      Z	 d dlZej$                  fZ e       Z G d d	e      Z G d
 de      Z G d de      Z G d dee      ZdgZy# e$ r dZdZY Cw xY w)    N)BaseAdapter)requote_uri)
exceptions)_RequestObjectProxy)_MatcherResponse c                   ^    e Zd Zd Zd Zed        Zed        Zed        Zed        Z	d Z
y)	_RequestHistoryTrackerc                     g | _         y Nrequest_historyselfs    ?/root/env/lib/python3.12/site-packages/requests_mock/adapter.py__init__z_RequestHistoryTracker.__init__'   
    !    c                 :    | j                   j                  |       y r   )r   appendr   requests     r   _add_to_historyz&_RequestHistoryTracker._add_to_history*   s    ##G,r   c                 @    	 | j                   d   S # t        $ r Y yw xY w)z Retrieve the latest request sentN)r   
IndexErrorr   s    r   last_requestz#_RequestHistoryTracker.last_request-   s*    	''++ 		s    	c                      | j                   dkD  S )Nr   
call_countr   s    r   calledz_RequestHistoryTracker.called5   s    ""r   c                      | j                   dk(  S )N   r   r   s    r   called_oncez"_RequestHistoryTracker.called_once9   s    !##r   c                 ,    t        | j                        S r   )lenr   r   s    r   r    z!_RequestHistoryTracker.call_count=   s    4''((r   c                     g | _         y r   r   r   s    r   resetz_RequestHistoryTracker.resetA   r   r   N)__name__
__module____qualname__r   r   propertyr   r!   r$   r    r(   r   r   r   r
   r
   %   sa    "-   # # $ $ ) )"r   r
   c                       e Zd ZdZy)_RunRealHTTPa	  A fake exception to jump out of mocking and allow a real request.

    This exception is caught at the mocker level and allows it to execute this
    request through the real requests mechanism rather than the mocker.

    It should never be exposed to a user.
    N)r)   r*   r+   __doc__r   r   r   r.   r.   E   s    r   r.   c                   F     e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
 xZS )	_Matcherz;Contains all the information about a provided URL to match.c	                    t         t        |           || _        || _        || _        || _        || _        || _        || _	        t        |t              rt        j                  j                  |      }	|	j                  j!                         | _        |	j$                  j!                         | _        t)        |	j*                  xs d      | _        |	j.                  | _        |s?| j,                  j!                         | _        | j0                  j!                         | _        yyt        |t2              r|j                         | _        |j%                         | _        |j+                         | _        |j/                         | _        |s?| j,                  j!                         | _        | j0                  j!                         | _        yyd| _        d| _        d| _        d| _        y)a2  
        :param bool complete_qs: Match the entire query string. By default URLs
            match if all the provided matcher query arguments are matched and
            extra query arguments are ignored. Set complete_qs to true to
            require that the entire query string needs to match.
        /N)superr1   r   _method_url
_responses_complete_qs_request_headers
_real_http_additional_matcher
isinstancestrurllibparseurlparseschemelower_schemenetloc_netlocr   path_pathquery_query
purl_types)r   methodurl	responsescomplete_qsrequest_headersadditional_matcher	real_httpcase_sensitive	url_parts	__class__s             r   r   z_Matcher.__init__R   sp    	h&(	#' /##5  c3--c2I$++113DL$++113DL$Y^^%:s;DJ#//DK!!ZZ--/
"kk//1 " Z(::<DL::<DLDJ))+DK!!ZZ--/
"kk//1 "
  DLDLDJDKr   c                     | j                   t        u ry|j                  j                         | j                   j                         k(  ryy)NTF)r5   ANYrK   rB   r   s     r   _match_methodz_Matcher._match_method   s9    <<3>>!T\\%7%7%99r   c                 J   | j                   t        u ryt        | j                   d      r'| j                   j                  |j                        d uS | j
                  r(|j                  j                         | j
                  k7  ry| j                  r(|j                  j                         | j                  k7  ry|j                  xs d| j                  k7  ryt        j                  j                  |j                  d      }t        j                  j                  | j                   d      }|j#                         D ].  \  }}|D ]$  }	 |j%                  |g       j'                  |       & 0 | j*                  r|j-                         D ]  }|s y y# t(        $ r Y   yw xY w)NTsearchFr3   )keep_blank_values)r6   rV   hasattrrY   rL   rC   rA   rB   rE   rD   rF   rG   r>   r?   parse_qsrH   rI   itemsgetremove
ValueErrorr8   values)r   r   
request_qs
matcher_qskvalsvs          r   
_match_urlz_Matcher._match_url   sl   99 499h'99##GKK0<< <<GNN002dllB <<GNN002dllBLLCDJJ. \\**7===A + C
\\**4;;$*O
!'') 	!GAt !!NN1b)003!	! &&( ! !  " ! !s   	!F	F"!F"c                    | j                   j                         D ]  \  }}	 |j                  |   }||k7  s y y# t        $ rG t	        |t
              sY  y	 |j                  |j                  d         }n# t        $ r Y Y  yw xY wY Yw xY w)NFzutf-8T)r9   r]   headersKeyErrorr<   r=   encode)r   r   rd   re   headers        r   _match_headersz_Matcher._match_headers   s    ,,224 	GAt! + ~%	( !  !
 "!S) !$__QXXg->?F ! ! !s3   ;BA76B7	B BBB
Bc                 ~    t        | j                        r| j                  |      S | j                  t        d      y)Nz(Unexpected format of additional matcher.T)callabler;   	TypeErrorr   s     r   _match_additionalz_Matcher._match_additional   s<    D,,-++G44##/FGGr   c                     | j                  |      xr7 | j                  |      xr$ | j                  |      xr | j                  |      S r   )rW   rg   rm   rq   r   s     r   _matchz_Matcher._match   sN    ""7+ 0(0##G,0 &&w/	1r   c                    | j                  |      sy | j                  r
t               t        | j                        dkD  r| j                  j                  d      }n| j                  d   }| j                  |       |j                  |      S )Nr#   r   )rs   r:   r.   r&   r7   popr   get_response)r   r   response_matchers      r   __call__z_Matcher.__call__   sv    {{7# ??. t!##2215#q1W%,,W55r   )r)   r*   r+   r/   r   rW   rg   rm   rq   rs   rx   __classcell__rT   s   @r   r1   r1   O   s+    E,\$L.16r   r1   c                   H     e Zd ZdZd fd	Zd Zd Zd	dZd Z fdZ	 xZ
S )
Adapterz:A fake adapter than can return predefined responses.

    c                 F    t         t        |           || _        g | _        y r   )r4   r|   r   _case_sensitive	_matchers)r   rR   rT   s     r   r   zAdapter.__init__   s    gt%'-r   c                    t        |fd| j                  i|}| j                  |       t        | j                        D ]  }	  ||      }|t        j                  |      |_        | |_	        t        j                  dj                  |j                  j                  |j                  j                  |j                                |c S  t#        j$                  |      # t
        $ r t        j                  |      |_         w xY w)NrR   z{} {} {})r   r~   r   reversedr   	Exceptionweakrefref_matcher
connectionloggerdebugformat_requestrK   rL   status_coder   NoMockAddress)r   r   kwargsmatcherresps        r   sendzAdapter.send   s    %g 0595I5I0(.0 	W%/ 	Gw'
 #*;;w#7 "&Z..w/?/?/F/F/6/?/?/C/C/3/?/?A B 	 &&w//  #*;;w#7 s   C!!%Dc                      y r   r   r   s    r   closezAdapter.close  s    r   c           
         |j                  dd      }|j                  dd      }|j                  di       }|j                  dd      }|j                  dd      }	|r|rt        d      |r|s|rt        d	      |s|	|	|d<   |rg n|g}|D 
cg c]  }
t        di |
 }}
t        |||| j                  ||||
      }| j                  |       |S c c}
w )zRegister a new URI match and fake response.

        :param str method: The HTTP method to match.
        :param str url: The URL to match.
        rN   FrP   NrO   r:   json_encoderzKYou should specify either a list of responses OR response kwargs. Not both.z?You should specify either response data OR real_http. Not both.)rR   rN   rP   rO   rQ   r   )ru   RuntimeErrorr   r1   r~   add_matcher)r   rK   rL   response_listr   rN   rP   rO   rQ   r   rd   rM   r   s                r   register_urizAdapter.register_uri
  s	    jj6#ZZ(<dC **%6;JJ|U3	zz.$7V  I J JMV  9 : :')5~&"+B&M 5BBq%**B	B6$*.*>*>'2.@+:%.0 	! Cs   Cc                 :    | j                   j                  |       y)zRegister a custom matcher.

        A matcher is a callable that takes a `requests.Request` and returns a
        `requests.Response` if it matches or None if not.

        :param callable matcher: The matcher to execute.
        N)r   r   )r   r   s     r   r   zAdapter.add_matcher3  s     	g&r   c                 l    t         t        |           | j                  D ]  }|j                           y r   )r4   r|   r(   r   )r   r   rT   s     r   r(   zAdapter.reset=  s,    gt"$~~ 	GMMO	r   )Fr   )r)   r*   r+   r/   r   r   r   r   r   r(   ry   rz   s   @r   r|   r|      s,    
0.'R' r   r|   )urllib.parser>   r   requests.adaptersr   requests.utilsr   requests_mockr   requests_mock.requestr   requests_mock.responser   logging	getLoggerr)   r   purlURLrJ   ImportErrorobjectrV   r
   r   r.   r1   r|   __all__r   r   r   <module>r      s      ) & $ 5 3 			8	$((J
 h"V "@9 U6% U6pYk1 Yx +K	  DJs   B 	BB