
    ,Of                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Zd dl
mZ d dlmZmZ d dl mZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlZd dlZd dl m!Z! d dl"m#Z# d dl$m%Z% erddl&m&Z& dd	l'm'Z' dd
l(m(Z( ddl)m)Z)  ed      Z*dZ+ G d d      Z, G d d      Z- G d d      Z. G d d      Z/ G d dee*         Z0y)    N)deque)datetimetimezone)IOBase)TYPE_CHECKINGAnyBinaryIOCallableDequeDictGeneric	ItemsViewListOptionalTupleTypeTypeVarUnion)Retry   )AppAuthentication)Auth)GithubObject)InstallationAuthorizationT   c                   N    e Zd Zdej                  fdZdeeef   fdZdefdZ	y)RequestsResponserc                 j    |j                   | _        |j                  | _        |j                  | _        y N)status_codestatusheaderstext)selfr   s     0lib/python3.12/site-packages/github/Requester.py__init__zRequestsResponse.__init__   s#    mmyyFF	    returnc                 6    | j                   j                         S r!   )r$   itemsr&   s    r'   
getheaderszRequestsResponse.getheaders   s    ||!!##r)   c                     | j                   S r!   )r%   r-   s    r'   readzRequestsResponse.read   s    yyr)   N)
__name__
__module____qualname__requestsResponser(   r   strr.   r0    r)   r'   r   r      s5    (++ 
$Ic3h/ $c r)   r   c                       e Zd ZU eeef   ed<   	 	 	 	 	 ddedee   de	dee   deeeef      dee   de
d	dfd
Zdededeeeej                  f      deeef   d	df
dZd	efdZddZy)HTTPSRequestsConnectionClassretryNhostportstricttimeout	pool_sizekwargsr*   c                 \   |r|nd| _         || _        d| _        || _        |j	                  dd      | _        t        j                         | _        t        j                  | j                  _        | t        j                  j                  | _        n|| _        | t        j                  j                  | _        n|| _        t        j                  j#                  | j                  | j                   | j                         | _        | j                  j'                  d| j$                         y )Ni  httpsverifyTmax_retriespool_connectionspool_maxsizezhttps://r<   r;   protocolr>   getrC   r4   Sessionsession	RequesternoopAuthauthadaptersDEFAULT_RETRIESr:   DEFAULT_POOLSIZEr?   HTTPAdapteradaptermountr&   r;   r<   r=   r>   r:   r?   r@   s           r'   r(   z%HTTPSRequestsConnectionClass.__init__   s     !Dc		jj40'') &..=!**::DJDJ%..??DN&DN((44

!^^ 5 

 	:t||4r)   verburlinputr$   c                 <    || _         || _        || _        || _        y r!   rW   rX   rY   r$   r&   rW   rX   rY   r$   s        r'   requestz$HTTPSRequestsConnectionClass.request   s      	
r)   c                 H   t        | j                  | j                  j                               }| j                   d| j
                   d| j                   | j                   } ||| j                  | j                  | j                  | j                  d      }t        |      S N://:F)r$   datar>   rC   allow_redirectsgetattrrL   rW   lowerrI   r;   r<   rX   r$   rY   r>   rC   r   r&   rW   rX   r   s       r'   getresponsez(HTTPSRequestsConnectionClass.getresponse       t||TYY__%67s499+Qtyyk$((DLLLL;;!
  ""r)   c                 8    | j                   j                          y r!   rL   closer-   s    r'   rl   z"HTTPSRequestsConnectionClass.close       r)   NFNNNr*   N)r1   r2   r3   r   intr   __annotations__r6   r   boolr   r(   ioBufferedReaderr   r]   r   rh   rl   r7   r)   r'   r9   r9      s    e #!%-1#'$5$5 sm$5 	$5
 #$5 c5j)*$5 C=$5 $5 
$5L

 
 c2#4#4456	

 c3h
 

#- #r)   r9   c                       e Zd Z	 	 	 	 	 ddedee   dedee   deeeef      dee   de	fd	Z
d
ededddeeef   ddf
dZdefdZddZy)HTTPRequestsConnectionClassNr;   r<   r=   r>   r:   r?   r@   c                 \   |r|nd| _         || _        d| _        || _        |j	                  dd      | _        t        j                         | _        t        j                  | j                  _        | t        j                  j                  | _        n|| _        | t        j                  j                  | _        n|| _        t        j                  j#                  | j                  | j                   | j                         | _        | j                  j'                  d| j$                         y )NP   httprC   TrD   zhttp://rH   rV   s           r'   r(   z$HTTPRequestsConnectionClass.__init__   s     !Db		jj40'') &..=!**::DJDJ%..??DN&DN((44

!^^ 5 

 	9dll3r)   rW   rX   rY   r$   r*   c                 <    || _         || _        || _        || _        y r!   r[   r\   s        r'   r]   z#HTTPRequestsConnectionClass.request   s    	
r)   c                 H   t        | j                  | j                  j                               }| j                   d| j
                   d| j                   | j                   } ||| j                  | j                  | j                  | j                  d      }t        |      S r_   rd   rg   s       r'   rh   z'HTTPRequestsConnectionClass.getresponse  ri   r)   c                 8    | j                   j                          y r!   rk   r-   s    r'   rl   z!HTTPRequestsConnectionClass.close  rm   r)   rn   ro   )r1   r2   r3   r6   r   rp   rr   r   r   r   r(   r   r]   r   rh   rl   r7   r)   r'   rv   rv      s    
 #!%-1#'$4$4 sm$4 	$4
 #$4 c5j)*$4 C=$4 $4LC c $ c3h TX #- #r)   rv   c                   r
   e Zd ZU ed   ed<   ed   ed<   eZeZdZ	dZ
eej                     ed<   ee   ed<   ed	ej"                  j$                  d
ej"                  j$                  fd       Zedee   dee   d
dfd       Zedod       Zedej                  d
dfd       Zedod       Zeded
dfd       Zeded
dfd       ZdZdZdZ dZ!ee   ed<   de"e#e#f   d
dfdZ$de%de"e#e&e#e%f   f   de#d
dfd Z'dpd!Z(dod"Z)e%ed#<   e&ee   ee   f   ed$<   e#ed%<   ee#   ed&<   ee*   ed'<   ee*   ed(<   	 	 dqd)ed*   d+e#d,e%d-e#d.e%d/e&ee#f   d0ee&e%e+f      d1ee%   d2ee*   d3ee*   fd4Z,d
e"e#ef   fd5Z-d6e"e#ef   d
dfd7Z.ed8e#d9e#d
e#fd:       Z/ed;ee#   d
e#fd<       Z0dod=Z1e2d
e"e#ef   fd>       Z3e2d
e#fd?       Z4e2d
e#fd@       Z5e2d
e#fdA       Z6e2d
e#fdB       Z7e2d
e#fdC       Z8e2d
ed*   fdD       Z9d)ed*   d
d fdEZ:	 	 	 drdFe#dGe#dHee"e#ef      dIee"e#e#f      dJee   d
e;e"e#ef   ef   fdKZ<	 	 	 drdFe#dGe#dHee"e#ef      dIee"e#ef      dJee"e#e#f      d
e;e"e#ef   ee"e#ef      f   fdLZ=	 	 	 	 dsdFe#dGe#dHee"e#e#f      dIee"e#e#f      dJee#   dMee&eef      d
e;e"e#ef   e"e#ef   f   fdNZ>dOe#dPe"e#ef   d
e;e"e#ef   e"e#ef   f   fdQZ?	 dtdRe#dPe"e#ef   dSee#   d
e;e"e#ef   e"e#ef   f   fdTZ@dUe%dVe"e#ef   dSe#d
e;e"e#ef   ef   fdWZAdGe#d
ee&eef      fdXZBedUe%dIe"e#ef   dSe"e#ef   d
eCj                  fdY       ZDedZe#d
efd[       ZEedZe#d
efd\       ZFedZe#d
efd]       ZGde#d
efd^ZH	 	 	 	 dsdFe#dGe#dHee"e#ef      dIee"e#ef      dJee   dMee&eef      d
e;e%e"e#ef   e#f   fd_ZI	 	 	 	 dsdFe#dGe#dHee"e#ef      dIee"e#ef      dJee"e#e#f      dMee&eef      d
e;e%e"e#ef   e#f   fd`ZJ	 	 	 	 dsdFe#dGe#dHee"e#e#f      dIee"e#e#f      dJee#   dMee&eef      d
e;e%e"e#ef   e#f   fdaZK	 dtdFe#dGe#dHedIe"e#ef   dbeLdMee&eef      d
e;e"e#ef   ef   fdcZMdMee&eef      dFe#dGe#dHee"e#e#f      ddee"e#e#f      dJeeN   deeeNge;e#ef   f   d
e;e%e"e#ef   e#f   fdfZOdMee&eef      dFe#dGe#dde"e#e#f   dJee   d
e;e%e"e#ef   e#f   fdgZPdFe#d
dfdhZQdFe#d
dfdiZRdGe#d
e#fdjZSdGe#dHe"e#ef   d
e#fdkZTd
e&eef   fdlZUe2d
ej                  fdm       ZVdFe#dGe#dde"e#e#f   dJee   dUee%   dVe"e#ef   dSee#   d
dfdnZWy)urM   r   &_Requester__installation_authorizationr   _Requester__app_authTN_Requester__logger_frameBufferr]   r*   c                     | S r!   r7   )r]   s    r'   rN   zRequester.noopAuth  s    r)   httpConnectionClasshttpsConnectionClassc                 .    d| _         || _        || _        y )NF)_Requester__persist_Requester__httpConnectionClass _Requester__httpsConnectionClass)clsr   r   s      r'   injectConnectionClassesz!Requester.injectConnectionClasses"  s     $7!%9"r)   c                 >    d| _         t        | _        t        | _        y )NT)r   rv   r   r9   r   r   s    r'   resetConnectionClassesz Requester.resetConnectionClasses,  s    $?!%A"r)   loggerc                     || _         y r!   r   )r   r   s     r'   injectLoggerzRequester.injectLogger2  s	    r)   c                     d | _         y r!   r   r   s    r'   resetLoggerzRequester.resetLogger6  s	    r)   flagc                     || _         y r!   )
DEBUG_FLAG)r   r   s     r'   setDebugFlagzRequester.setDebugFlag<  s	    r)   	onCheckMec                     || _         y r!   )ON_CHECK_ME)r   r   s     r'   setOnCheckMezRequester.setOnCheckMe@  s	    #r)   Fi   DEBUG_FRAMEr   requestHeaderc                     | j                   rk|dddg}| j                  | j                  dz
  k  r| j                  j	                  |       n|| j                  d<   t        | j                        dz
  | _        yy)z
        Initialize a debug frame with requestHeader
        Frame count is updated and will be attached to respond header
        The structure of a frame: [requestHeader, statusCode, responseHeader, raw_data]
        Some of them may be None
        Nr   r   )r   _frameCountDEBUG_FRAME_BUFFER_SIZEr   appendlen)r&   r   	new_frames      r'   NEW_DEBUG_FRAMEzRequester.NEW_DEBUG_FRAMEL  ss     ??&dD9I$">">"BB!!((3'0!!!$"4#4#459D r)   
statusCoderesponseHeaderrb   c                     | j                   r9|||g| j                  | j                     dd | j                  || j                  <   yy)zl
        Update current frame with response Current frame index will be attached to responseHeader.
        r      N)r   r   r   DEBUG_HEADER_KEY)r&   r   r   rb   s       r'   DEBUG_ON_RESPONSEzRequester.DEBUG_ON_RESPONSE\  sP     ??8Dd../!4
 594D4DN4001 r)   c                     | j                   rb| j                  Ud }| j                  |j                  v r(|j                  | j                     }| j                  |   }| j                  ||       y y y r!   )r   r   r   _headersr   )r&   objframeframe_indexs       r'   check_mezRequester.check_meh  sf    ??t//;E$$4!ll4+@+@A))+6S%(  <?r)   c                      d| _         g | _        y )Nr   )r   r   r-   s    r'   _initializeDebugFeaturez!Requester._initializeDebugFeaturep  s    r)   r   _Requester__connectionClass_Requester__hostname_Requester__authorizationHeader$_Requester__seconds_between_requests"_Requester__seconds_between_writesrO   r   base_urlr>   
user_agentper_pagerC   r:   r?   seconds_between_requestsseconds_between_writesc                    | j                          || _        || _        t        j                  j                  |      }| j                  |j                        | _        t        j                  j                  |j                  | j                              | _        |j                  | _        |j                  | _        |j                  | _        || _        || _        || _        |	| _        |
| _        t-               | _        |j0                  | _        |j0                  dk(  r| j4                  | _        n(|j0                  dk(  r| j8                  | _        nJ d       d | _        t=        j>                         | _         tC               | _"        d| _#        d| _$        d| _%        || _&        d | _'        |J d       || _(        || _)        d | _*        tW        | j                  tX              r| j                  j[                  |        y y )	NpathrB   ry   zUnknown URL scheme)r   r   Tz|github now requires a user-agent. See https://docs.github.com/en/rest/overview/resources-in-the-rest-api#user-agent-required).r   _Requester__auth_Requester__base_urlurllibparseurlparseget_graphql_prefixr   _Requester__graphql_prefix
urlunparse_replace_Requester__graphql_urlhostnamer   r<   _Requester__port_Requester__prefix_Requester__timeout_Requester__retry_Requester__pool_sizer   r   dict_Requester__last_requestsscheme_Requester__schemer   r   r   _Requester__connection	threadingLock_Requester__connection_lockr   _Requester__custom_connectionsrate_limitingrate_limiting_resettimeFIX_REPO_GET_GIT_REFr   oauth_scopes_Requester__userAgent_Requester__verifyr~   
isinstanceWithRequesterwithRequester)r&   rO   r   r>   r   r   rC   r:   r?   r   r   os               r'   r(   zRequester.__init__~  s    	$$&"LL!!(+ $ 7 7 ?#\\44QZZTEZEZZ5[\**ff $*B'(>%1588w%)%@%@D"XX%)%?%?D"...5hl!*!1mrmt!%'($$(!  % 	
i	
% &,0) dkk=1KK%%d+ 2r)   c                 L    | j                   j                         }|d= |d= |d= |S )Nr   r   r   )__dict__copyr&   states     r'   __getstate__zRequester.__getstate__  s4    ""$/0*+23r)   r   c                     | j                   j                  |       t        j                         | _        d | _        t               | _        y r!   )r   updater   r   r   r   r   r   r   s     r'   __setstate__zRequester.__setstate__  s5    U#!*!1 $)G!r)   stringsuffixc                 F    | j                  |      r| d t        |        S | S r!   )endswithr   )r   r   s     r'   remove_suffixzRequester.remove_suffix  s(     ??6".S[L))r)   r   c                     | | dv rd} | j                  d      r,t        j                  | d      } t        j                  | d      } | dz   S )N) /r   )/v3z/v3/r   r   z/graphql)r   rM   r   r   s    r'   r   zRequester.get_graphql_prefix  sN    <49,D==)**45D**47Dj  r)   c                 $   | j                   5  | j                  !| j                  j                          d| _        ddd       | j                  r6| j                  j	                         j                          | j                  r5yy# 1 sw Y   LxY w)z5
        Close the connection to the server.
        N)r   r   rl   r   popleftr-   s    r'   rl   zRequester.close  sy     ## 	)  ,!!'')$(!	) ''%%--/557 ''		) 	)s   .BBc                     t        | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  
      S )z
        Returns arguments required to recreate this Requester with Requester.__init__, as well as with
        MainClass.__init__ and GithubIntegration.__init__.
        )
rO   r   r>   r   r   rC   r:   r?   r   r   )r   r   r   r   r   r   r   r   r   r   r   r-   s    r'   r@   zRequester.kwargs  s_     __NN'']]==,,&&%)%D%D#'#@#@
 	
r)   c                     | j                   S r!   )r   r-   s    r'   r   zRequester.base_url      r)   c                     | j                   S r!   )r   r-   s    r'   graphql_urlzRequester.graphql_url  s    !!!r)   c                     | j                   S r!   )r   r-   s    r'   r   zRequester.scheme   s    }}r)   c                     | j                   S r!   )r   r-   s    r'   r   zRequester.hostname  r   r)   c                 h    | j                   | j                  S | j                   d| j                    S )Nra   )r   r   r-   s    r'   hostname_and_portzRequester.hostname_and_port  s/    ;;== --$++//r)   c                     | j                   S r!   )r   r-   s    r'   rO   zRequester.auth  s    {{r)   c                 T    | j                   }|j                  |       t        di |S )z
        Create a new requester instance with identical configuration but the given authentication method.

        :param auth: authentication method
        :return: new Requester implementation

        )rO   r7   )r@   r   rM   )r&   rO   r@   s      r'   withAuthzRequester.withAuth  s)     4 "6""r)   rW   rX   
parametersr$   rY   c                 f     | j                   | j                  |||||| j                  |             S r!   )_Requester__checkrequestJson_Requester__customConnectionr&   rW   rX   r  r$   rY   s         r'   requestJsonAndCheckzRequester.requestJsonAndCheck  s7     t||T--dCWeUYUlUlmpUqrssr)   c                 f     | j                   | j                  |||||| j                  |             S r!   )r  requestMultipartr  r	  s         r'   requestMultipartAndCheckz"Requester.requestMultipartAndCheck(  s8     t||T224j'SXZ^ZqZqruZvwxxr)   cnxc                 f     | j                   | j                  |||||| j                  |             S r!   )r  requestBlobr  )r&   rW   rX   r  r$   rY   r  s          r'   requestBlobAndCheckzRequester.requestBlobAndCheck2  s7     t||T--dCWeUYUlUlmpUqrssr)   query	variablesc                     ||d}| j                  d| j                  |      \  }}d|v r| j                  d||      ||fS )zO
        :calls: `POST /graphql <https://docs.github.com/en/graphql>`_
        )r  r  POSTrY   errors  )r
  r   createException)r&   r  r  input_response_headersrb   s         r'   graphql_queryzRequester.graphql_query=  s[     !y9!%!9!9&$BRBRZ`!9!a$t&&s,<dCC%%r)   mutation_nameoutputc           	         dj                  |j                  d      D cg c]  }|j                          c}      }|dd j                         |dd z   }|xs d}d| d| d| d| d		}| j	                  ||      S c c}w )
a  
        Create a mutation in the format:
            mutation MutationName($input: MutationNameInput!) {
                mutationName(input: $input) {
                    <output>
                }
            }
        and call the self.graphql_query method
        r   _Nr   z	mutation z	($input: z
Input!) { z(input: $input) { z } })joinsplit
capitalizerf   r  )r&   r  r  r  xtitler  s          r'   graphql_named_mutationz Requester.graphql_named_mutationH  s     1D1DS1IJAJKbq	)E!"I52E7)E7+m_L_`f_ggmn!!%33 Ks   A=r#   responseHeadersc                 \    | j                  |      }|dk\  r| j                  |||      ||fS )Nr  )_Requester__structuredFromJsonr  )r&   r#   r'  r  rb   s        r'   __checkzRequester.__check[  s;     ((0S=&&vEE$$r)   c                    d }|j                  d      sdt        j                  j                  |      }|j                  | j
                  k7  s\|j                  r|j                  | j                  k7  s7|j                  | j                  k7  r|j                  dk(  r| j                  dk(  s|j                  dk(  rZ| j                  |j                  |j                  | j                  | j                        }| j                  j                  |       |S |j                  dk(  rX| j                  |j                  |j                  | j                  | j                        }| j                  j                  |       |S )Nr   rB   ry   )r:   r?   )
startswithr   r   r   r   r   r<   r   r   r   r   r   r   r   r   r   )r&   rX   r  r   s       r'   __customConnectionzRequester.__customConnectionf  s0    [_~~c"%%c*A

doo-FFqvv4HH-qxx77Jt}}`fOf88v%44

"ll"&"2"2	 5 C --44S9 
 XX(55

"ll"&"2"2	 6 C --44S9
r)   c                 "   | |j                  dd      j                         nd}t        j                  }|dk(  r|dk(  rt        j                  }n|dk(  rJt        j
                  |v r8t        j                  d|t        j
                           rt        j                  }nh|dk(  r"|j                  d      rt        j                  }nA|dk(  r"| j                  |      rt        j                  }n|dk(  r|d	k(  rt        j                  } ||||      S )
Nmessager   i  zbad credentialsz.*required.*i  z$missing or invalid user agent stringi  z	not found)rJ   rf   GithubExceptionBadCredentialsExceptionConsts	headerOTPrematchTwoFactorExceptionr,  BadUserAgentExceptionisRateLimitErrorRateLimitExceededExceptionUnknownObjectException)r   r#   r$   r  r/  excs         r'   r  zRequester.createException  s     8>7I&**Y+113r--S=W(99!99Cs]v//7:rxxY`agaqaqYr?s!44Cs]w112XY!77Cs]s33G<!<<Cs]w+5!88C667++r)   r/  c                 J    | j                  |      xs | j                  |      S r!   )isPrimaryRateLimitErrorisSecondaryRateLimitErrorr   r/  s     r'   r8  zRequester.isRateLimitError  s$    **73]s7T7TU\7]]r)   c                 J    |sy|j                         }|j                  d      S )NFzapi rate limit exceeded)rf   r,  r?  s     r'   r=  z!Requester.isPrimaryRateLimitError  s%    --/!!";<<r)   c                     |sy|j                         }|j                  d      xs$ |j                  d      xs |j                  d      S )NFz(you have exceeded a secondary rate limitz&please retry your request again later.z/please wait a few minutes before you try again.)rf   r,  r   r?  s     r'   r>  z#Requester.isSecondaryRateLimitError  sQ    --/IJ S HIS QR	
r)   c                     t        |      dk(  ry t        |t              r|j                  d      }	 t	        j
                  |      S # t        $ r* |j                  d      s|j                  d      r d|icY S w xY w)Nr   zutf-8{[rb   )r   r   bytesdecodejsonloads
ValueErrorr,  )r&   rb   s     r'   __structuredFromJsonzRequester.__structuredFromJson  so    t9>$&{{7+&zz$'' &??3'4??3+?~%&s   A 0A:9A:c           	      j    dt         dt        t        t        f   fd}| j                  |||||||      S )NrY   r*   c                 0    dt        j                  |       fS )Nzapplication/json)rG  dumpsr  s    r'   encodez%Requester.requestJson.<locals>.encode  s    %tzz%'888r)   )r   r   r6   _Requester__requestEncoder&   rW   rX   r  r$   rY   r  rN  s           r'   r  zRequester.requestJson  s=    	9# 	9%S/ 	9 ##CsJPVWWr)   c           	          dt         t        t        f   dt        t        t        f   fd}| j	                  |||||||      S )NrY   r*   c                     d}d}d}| j                         D ]'  \  }}|d| | z  }|d| d| z  }||z  }|||z   z  }) |d| d| z  }d| |fS )Nz(----------------------------3c3ba8b523b2z
r   z--z&Content-Disposition: form-data; name=""zmultipart/form-data; boundary=)r,   )rY   boundaryeolencoded_inputnamevalues         r'   rN  z*Requester.requestMultipart.<locals>.encode  s    AHCM${{} -e2hZu!55#I$qQTPU!VV$,	-
 r(2cU33M3H:>MMr)   )r   r6   r   r   rO  rP  s           r'   r  zRequester.requestMultipart  sH    	N$sCx. 	NU38_ 	N ##CsJPVWWr)   c           	          i dt         dt        t         t        f   ffd}|r+t        t        j                  j                  |            d<   | j                  ||||||      S )N
local_pathr*   c                     dv rd   }n/t        j                  |       }|d   |d   nt        j                  }t	        | d      }||fS )NContent-Typer   rb)	mimetypes
guess_typer2  defaultMediaTypeopen)rZ  	mime_typeguessed_typefr$   s       r'   rN  z%Requester.requestBlob.<locals>.encode  sV    (#N3	(33J?/;A/JLOPVPgPg	Z&Aa<r)   zContent-Length)r6   r   r   osr   getsizerO  rP  s       `   r'   r  zRequester.requestBlob  sj     ?G	 s 	 uS#X 	  (+BGGOOE,B(CG$%##CsJPVWWr)   	file_likec                     dt         dt        t        t         f   ffd}|s| j                  |      } | j                  | j                  |||||       S )Nr   r*   c                     d   fS )Nr\  r7   )r   rg  r$   s    r'   rN  z3Requester.requestMemoryBlobAndCheck.<locals>.encode  s    >*I55r)   )r   r   r6   r  r  rO  )r&   rW   rX   r  r$   rg  r  rN  s       ``  r'   requestMemoryBlobAndCheckz#Requester.requestMemoryBlobAndCheck  s]    	6c 	6eCHo 	6 ))#.Ct||T11#tS*gW`bhijjr)   requestHeadersrN  c                 H   |dv sJ |i }|i }| j                   | j                   j                  |       | j                  |d<   | j                  |      }| j	                  ||      }d }| ||      \  |d<   }| j                  |       | j                  |||||      \  }	}
}t        j                  |
v rat        j                  |
v rOt        t        |
t        j                                 t        t        |
t        j                                 f| _        t        j                  |
v r*t        t        |
t        j                                 | _        t        j                  |
v r'|
t        j                     j!                  d      | _        | j%                  |	|
|       |	|
|fS )N)HEADGETr  PATCHPUTDELETEz
User-Agentr\  z, )r   authenticationr   _Requester__makeAbsoluteUrl_Requester__addParametersToUrlr   _Requester__requestRawr2  headerRateRemainingheaderRateLimitrp   floatr   headerRateResetr   headerOAuthScopesr"  r   r   )r&   r  rW   rX   r  rk  rY   rN  rV  r#   r'  r  s               r'   __requestEncodezRequester.__requestEncode  s    HHHHJ!N;;"KK&&~6'+'7'7|$$$S)''Z8<B5M9N>*M^,*.*;*;CsN\i*j'%%8V=S=SWf=f E/&*D*DEFGE/&*@*@ABC"D
 !!_4+.u_VE[E[5\/]+^D(##6 /0H0H I O OPT UDv?..r)   c           	         | j                  |       	 |}|| j                         }|j                  ||||       |j                         }|j                  }|j                         D 	
ci c]  \  }	}
|	j                         |
 }}	}
|j                         }|r t        |t              r|j                          | j                  |||||||       |dk(  rS|dk(  s|dk(  rIt        j                  t        j                         | j!                  |||||      | j#                  |       S |dk(  rd|v r|d   }t$        j&                  j)                  |      }|j*                  | j,                  k7  r&t/        d| j,                   d|j*                   d      |j0                  | j2                  k7  r&t/        d	| j2                   d
|j0                   d      |j4                  |k(  rW| j6                  dt9        | j6                        z   nd}| j,                   d| j2                   | | }t/        d| d| d      | j:                  j=                  t>        j@                        r+| j:                  jC                  d| d
|j4                          | j!                  |||j4                  ||      | j#                  |       S |||f| j#                  |       S c c}
}	w # | j#                  |       w xY w)N   rn  rm  i-  locationzGithub server redirected from z protocol to zJ, please correct your Github server URL via base_url: Github(base_url=...)z#Github server redirected from host z to ra   r   r`   z
Requested z but server redirected to zS, you may need to correct your Github server URL via base_url: Github(base_url=...)z)Following Github server redirection from )"_Requester__deferRequest_Requester__createConnectionr]   rh   r#   r.   rf   r0   r   r   rl   _Requester__logtimesleepr2  PROCESSING_202_WAIT_TIMEru  _Requester__recordRequestTimer   r   r   r   r   RuntimeErrorr   r   r   r   r6   _loggerisEnabledForloggingINFOinfo)r&   r  rW   rX   rk  rY   original_cnxresponser#   kvr'  r  r~  r   r<   requested_locations                    r'   __requestRawzRequester.__requestRaw?  s    	D!4	+L{--/KKc5.9(H__F8@8K8K8MN1qwwy!|NON]]_FeV,KKMJJtS.%RXY}

6::;((tS.RWX> $$T*; }!>*:6LL))(388t}},&8}UVU]U]T^ _c d  ::0&=doo=NdSTS]S]R^ _c d  66S=59[[5L3T[[!11RTD,0MM?#doo=NtfUXTY)Z&&$%7$88RS[R\ ]= > 
 <<,,W\\:LL%%(QRUQVVZ[\[a[aZb&cd((tQVV^UZ[ $$T*	 ?F2 $$T*Y OX $$T*s,   AK *KBK )FK  K K K/c                    | j                   j                         }| j                   j                         D cg c]  \  }}|dk7  s| }}}|rt        |      nd}|rt        |      nd}| j                  r|| j                  z   nd}| j
                  r|| j
                  z   nd}	|dk(  r|nt        ||	      }
t        |
t        j                  t        j                        j                         z
  d      }|dkD  r_| j                  t        j                  t              | _        | j                  j                  d| d       t!        j"                  |       y y c c}}w )Nrn  r   z	sleeping zs before next GitHub request)r   valuesr,   maxr   r   r   nowr   utc	timestampr   r  	getLoggerr1   debugr  r  )r&   rW   r4   r  lwriteslast_request
last_writenext_request
next_writenextdefers               r'   __deferRequestzRequester.__deferRequest  s%    ''..0 $ 4 4 : : <K1U
!KK(0s8}a$*S[
KOKjKjt'F'FFpqEIEbEbj4#@#@@hi
#u}|#lJ2OD8<<5??AA1E19}}$ ' 1 1( ;MM)E72N OPJJu	  Ls   EEc                     t        j                  t        j                        j	                         | j
                  |<   y r!   )r   r  r   r  r  r   )r&   rW   s     r'   __recordRequestTimezRequester.__recordRequestTime  s(    %-\\(,,%?%I%I%KT"r)   c                    |j                  d      r| j                   | }|S t        j                  j	                  |      }|j
                  | j                  dddfv sJ |j
                         |j                  j                  | j                  | j                  ddf      sJ |j                         |j                  | j                  k(  sJ |j                         |j                  }|j                  dk7  r|d|j                   z  }|S )	Nr   zuploads.github.comzstatus.github.comz
github.comz/api/z/login/oauthr   ?)r,  r   r   r   r   r   r   r   r   r<   r   r  )r&   rX   r   s      r'   __makeAbsoluteUrlzRequester.__makeAbsoluteUrl  s     >>#]]OC5)C 
 %%c*A::$#	"  
 zz  66$$dmmT5J5JGUc%demghgmgmme66T[[(0!&&0(&&Cww"}177)}$
r)   c                 j    t        |      dk(  r|S | dt        j                  j                  |       S )Nr   r  )r   r   r   	urlencode)r&   rX   r  s      r'   __addParametersToUrlzRequester.__addParametersToUrl  s6    
 z?aJU!FLL22:>?@@r)   c           	         | j                   r| j                  | j                  S | j                  5  | j                  ;| j                   r| j                  cd d d        S | j                  j                          | j	                  | j
                  | j                  | j                  | j                  | j                  | j                        | _        d d d        | j                  S # 1 sw Y   | j                  S xY w)N)r:   r?   r>   rC   )r   r   r   rl   r   r   r   r   r   r   r   r-   s    r'   __createConnectionzRequester.__createConnection  s     >>d//;$$$## 	  ,>>,,	 	 !!'') $ 6 6ll**}} !7 !D	    	    s   $C%A2C%%C9c                 n    | j                   t        j                  t              | _         | j                   S r!   )r   r  r  r1   r-   s    r'   r  zRequester._logger  s(    == #--h7DM}}r)   c                 6   | j                   j                  t        j                        rp|j	                         }| j
                  r| j
                  j                  |       | j                   j                  d|| j                  | j                  ||||||
       y y )Nz%s %s://%s%s %s %s ==> %i %s %s)
r  r  r  DEBUGr   r   mask_authenticationr  r   r   )	r&   rW   rX   rk  rY   r#   r'  r  headersForRequests	            r'   __logzRequester.__log  s     <<$$W]]3 . 3 3 5{{//0ABLL1!	 4r)   ro   )r   r   r*   N)NN)NNN)NNNNr!   )Xr1   r2   r3   r   rq   rv   r   r9   r   r   r   r  Loggerr   r   staticmethodr4   modelsPreparedRequestrN   classmethodr   r   r   r   r   rr   r   r
   r   r   r   r   r   r   r6   r   rp   r   r   r   r   rx  r   r(   r   r   r   r   rl   propertyr@   r   r   r   r   r   rO   r  r   r
  r  r  r  r&  r  r  r0  r  r8  r=  r>  r)  r  r  r  r	   rj  r   rO  ru  r  r  rs  rt  r  r  r  r7   r)   r'   rM   rM     sA   "*+F"GG,--79I)-Hhw~~&-s)(//99 hoo>]>]   :!"=>: ##?@: 
	: : B B
 '.. T    
     $X $$ $ $ J"$&*K(#*:T#s(^ : : 
EC 
Ec5QTVYQY?FZA[ 
Ecf 
Eko 
E) T"=>Ea@bbccO#C=( (/&uo- 5926:,v:, :, 	:,
 :, :, dCi :, c5j)*:, C=:, #+5/:, !):,xd38n ,$sCx. ,T , c 3 3  
 !# !3 ! !	8 
S#X 
 
$ #   "S " "    #   03 0 0
 hv&  
#Xf- 
#+ 
#  04,0#tt t T#s(^,	t
 $sCx.)t }t 
tCH~s"	#t 04,0*.yy y T#s(^,	y
 $sCx.)y S#X'y 
tCH~xS#X77	8y 04,0#Z^	t	t 	t T#s(^,		t
 $sCx.)	t }	t e79UUVW	t 
tCH~tCH~-	.	t	&3 	&4S> 	&eDQTVYQYN\`adfiai\jLjFk 	& VZ4 4-1#s(^4EMc]4	tCH~tCH~-	.4&	%	% c3h	% 		%
 
tCH~s"	#	%	%35QQR	S: ,, c3h, S#X	,
 
	(	(, ,, ^s ^t ^ ^ =c =d = = 	
 	
 	
 	
& & &" 04,0#Z^XX X T#s(^,	X
 $sCx.)X }X e79UUVWX 
sDcNC'	(X$ 04,0*.Z^XX X T#s(^,	X
 $sCx.)X S#X'X e79UUVWX 
sDcNC'	(X8 04,0#Z^XX X T#s(^,	X
 $sCx.)X }X e79UUVWX 
sDcNC'	(X@ [_kk k 	k
 c3hk k e79UUVWk 
tCH~s"	#k"./e79UUVW./ ./ 	./
 T#s(^,./ !c3h0./ {./ !eCHo-../ 
sDcNC'	(./`>+e79UUVW>+ >+ 	>+
 S#X>+ }>+ 
sDcNC'	(>+@3 4 *L L LS S (AA cNA 
	A!	*,HH	I!,   
  S#X	
 }  c3h  
r)   rM   c                   J    e Zd ZU dZeed<   d
dZedefd       Zdeddfd	Z	y)r   z5
    Mixin class that allows to set a requester.
    _WithRequester__requesterr*   Nc                     d | _         y r!   r  r-   s    r'   r(   zWithRequester.__init__  s
    04r)   c                     | j                   S r!   r  r-   s    r'   	requesterzWithRequester.requester  s    r)   r  zWithRequester[T]c                 B    t        |t              sJ |       || _        | S r!   )r   rM   r  )r&   r  s     r'   r   zWithRequester.withRequester  s$    )Y/::/$r)   ro   )
r1   r2   r3   __doc__rM   rq   r(   r  r  r   r7   r)   r'   r   r     sC     5  9    y 5G r)   r   )1rs   rG  r  r^  re  r4  r   r  r   urllib.parsecollectionsr   r   r   r   typingr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r4   requests.adaptersurllib3r   github.Constsr2  github.GithubExceptionr0  r   r   r   r   r   &ACCESS_TOKEN_REFRESH_THRESHOLD_SECONDSr   r9   rv   rM   r   r7   r)   r'   <module>r     s   \ 
    	 	      '    "     04*DCL *, & D DN< <~X XvGAJ r)   