
    Je&                     
   d Z 	 ddlmZmZmZmZ ddlmZ ddl	m	Z	 ddl
mZ d%d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mZmZ d
ZdZ ed d d d d       ZdZ dZ!d Z"d Z#d Z$ G d de%      Z& G d de%      Z' G d de%      Z( G d de      Z) G d de*      Z+ G d  d!e+      Z, G d" d#e+      Z-e.d$k(  rddl/Z/ e/j`                          yy#  ddlmZmZmZmZ ddlmZ ddlm	Z	 ddlmZ Y xY w)&a  
GitHub API Python SDK. (Python >= 2.6)

Apache License

Michael Liao (askxuefeng@gmail.com) https://github.com/michaelliao/githubpy

Usage:

>>> gh = GitHub(username='githubpy', password='test-githubpy-1234')
>>> L = gh.users('githubpy').followers.get()
>>> L[0].id
470058
>>> L[0].login == u'michaelliao'
True
>>> x_ratelimit_remaining = gh.x_ratelimit_remaining
>>> x_ratelimit_limit = gh.x_ratelimit_limit
>>> x_ratelimit_reset = gh.x_ratelimit_reset
>>> L = gh.users('githubpy').following.get()
>>> L[0].url == u'https://api.github.com/users/michaelliao'
True
>>> L = gh.repos('githubpy')('testgithubpy').issues.get(state='closed', sort='created')
>>> L[0].title == u'sample issue for test'
True
>>> L[0].number
1
>>> I = gh.repos('githubpy')('testgithubpy').issues(1).get()
>>> I.url == u'https://api.github.com/repos/githubpy/testgithubpy/issues/1'
True
>>> gh = GitHub(username='githubpy', password='test-githubpy-1234')
>>> r = gh.repos('githubpy')('testgithubpy').issues.post(title='test create issue', body='just a test')
>>> r.title == u'test create issue'
True
>>> r.state == u'open'
True
>>> gh.repos.thisisabadurl.get()
Traceback (most recent call last):
    ...
ApiNotFoundError: https://api.github.com/repos/thisisabadurl
>>> gh.users('github-not-exist-user').followers.get()
Traceback (most recent call last):
    ...
ApiNotFoundError: https://api.github.com/users/github-not-exist-user/followers
    )build_openerHTTPSHandlerRequest	HTTPError)quote)StringIO)IterableNc                     t        |       S N)str)stringencodings     >/usr/lib/python3/dist-packages/spyder/utils/external/github.pybytesr   6   s    6{    )r   r   r   r   )datetime	timedeltatzinfo<   zhttps://api.github.comc                       y)NGET r   r   r   <lambda>r   F       r   c                       y)NPUTr   r   r   r   r   r   G   r   r   c                       y)NPOSTr   r   r   r   r   r   H   r   r   c                       y)NPATCHr   r   r   r   r   r   I   r   r   c                       y)NDELETEr   r   r   r   r   r   J   r   r   )r   r   r   r    r"   z&user,public_repo,repo,repo:status,gistc                    g }| j                         D ]Q  \  }}	 t        |t              r|j                  d      n
t	        |      }|j                  |dt        |             S dj                  |      S #  |}Y 8xY w)z
    Encode parameters.
    utf-8=&)items
isinstanceunicodeencoder   appendurlquotejoin)kwargskvqvs        r   _encode_paramsr3   O   sw     D
 11	&0G&<'"#a&B 	q(2,/01 88D>	Bs   ,A88A>c                 6    d }t        j                  | |      S )z$
    Encode object as json str.
    c                     t        | t              r| S t               }t        |       D ]#  }|j                  d      rt	        | |      ||<   % |S )N_)r(   dictdir
startswithgetattr)objdr0   s      r   	_dump_objz_encode_json.<locals>._dump_obja   sM    c4 JFS 	'A<<$sA!	' r   )default)jsondumps)r;   r=   s     r   _encode_jsonrA   ]   s     ::c9--r   c                 6    d }t        j                  | |      S )Nc                 f    t               }| j                         D ]  \  }}||t        |      <    |S r   )
JsonObjectr'   r   )pairsor0   r1   s       r   	_obj_hookz_parse_json.<locals>._obj_hookl   s4    LKKM 	DAqAc!fI	r   )object_hook)r?   loads)jsonstrrG   s     r   _parse_jsonrK   k   s    
 ::g955r   c                   "    e Zd Zd Zd Zd ZeZy)_Executablec                 .    || _         || _        || _        y r   )_gh_method_path)selfrO   rP   rQ   s       r   __init__z_Executable.__init__u   s    
r   c                 f     | j                   j                  | j                  | j                  fi |S r   )rO   _httprP   rQ   )rR   r.   s     r   __call__z_Executable.__call__z   s&    txx~~dllDJJ="==r   c                 <    d| j                   d| j                  dS )Nz_Executable ( ))rP   rQ   rR   s    r   __str__z_Executable.__str__}   s    (,djjAAr   N)__name__
__module____qualname__rS   rV   r[   __repr__r   r   r   rM   rM   s   s    
>B Hr   rM   c                   (    e Zd Zd Zd Zd Zd ZeZy)	_Callablec                      || _         || _        y r   )rO   _name)rR   rO   rc   s      r   rS   z_Callable.__init__   s    
r   c           
          t        |      dk(  r| S | j                  ddj                  |D cg c]  }t        |       c}      }t	        | j
                  |      S c c}w )Nr   /)lenrc   r-   r   ra   rO   )rR   r/   argnames       r   rV   z_Callable.__call__   sO    t9a<K**chhD/ISC/I&JK4(( 0Js   Ac                    |dk(  r!t        | j                  d| j                        S |dk(  r!t        | j                  d| j                        S |dk(  r!t        | j                  d| j                        S |dk(  r!t        | j                  d| j                        S |d	k(  r!t        | j                  d
| j                        S | j                  d|}t        | j                  |      S )Ngetr   putr   postr   patchr    deleter"   re   )rM   rO   rc   ra   )rR   attrrh   s      r   __getattr__z_Callable.__getattr__   s    ;txx

;;;txx

;;<txx<<=txx$**==>txx4::>>**d+4((r   c                      d| j                   z  S )Nz_Callable (%s))rc   rZ   s    r   r[   z_Callable.__str__   s    $**,,r   N)r\   r]   r^   rS   rV   rp   r[   r_   r   r   r   ra   ra      s    ))- Hr   ra   c                   :    e Zd ZdZd	dZd
dZd
dZd Zd Zd Z	y)GitHubz
    GitHub client.
    Nc                    d| _         d| _        d| _        d | _        |rB|r@t	        j
                  t        |d|d            }|j                  d      }d|z  | _        n|r
d|z  | _        || _        || _	        || _
        || _        y )N:r$   asciizBasic %sztoken %s)x_ratelimit_remainingx_ratelimit_limitx_ratelimit_reset_authorizationbase64	b64encoder   decode
_client_id_client_secret_redirect_uri_scope)	rR   usernamepasswordaccess_token	client_idclient_secretredirect_uriscopeuserandpasss	            r   rS   zGitHub.__init__   s    &(""$"$" **5Hh1OQX+YZK%,,W5K",{":D",|";D#+)r   c                     | j                   st        d      t        | j                         }| j                  r| j                  |d<   | j                  r| j                  |d<   |r||d<   dt        |      z  S )z
        Generate authorize_url.

        >>> GitHub(client_id='3ebf94c5776d565bcf75').authorize_url()
        'https://github.com/login/oauth/authorize?client_id=3ebf94c5776d565bcf75'
        zNo client id.)r   r   r   statez+https://github.com/login/oauth/authorize?%s)r   ApiAuthErrorr7   r   r   r3   )rR   r   r.   s      r   authorize_urlzGitHub.authorize_url   sm     //DOO,!%!3!3B~;;++BwKBwK<~b?QQQr   c                    t        | j                  | j                  |      }| j                  r| j                  |d<   |r||d<   t	        t
              }t        dt        |            }t        d   |_	        |j                  dd       	 |j                  |t        	      }t        |j                               }d
|v rt        t!        |j"                              t!        |j$                        S # t&        $ r}t        d      d}~ww xY w)z~
        In callback url: http://host/callback?code=123&state=xyz

        use code and state to get an access token.
        )r   r   coder   r   z+https://github.com/login/oauth/access_tokendatar   Acceptapplication/jsontimeouterrorzHTTPError when get access tokenN)r7   r   r   r   r   r   r   r3   _METHOD_MAP
get_method
add_headeropenTIMEOUTrK   readr   r   r   r   r   )	rR   r   r   r.   openerrequestresponseres	            r   get_access_tokenzGitHub.get_access_token   s     DOO4;N;NUYZ!%!3!3B~BwKl+Gn]_N`a(08%78	B{{7G{<HHMMO,A!|"3qww<00q~~&& 	B@AA	Bs   A&C2 2	D;DDc                      t        | d|z        S )Nz/%s)ra   )rR   ro   s     r   rp   zGitHub.__getattr__   s    ut|,,r   c                    d }d }|dk(  r|r|dt        |      }|dv rt        t        |      d      }t        |}t	        t
              }t        ||      }t        |   |_        | j                  r|j                  d| j                         |dv r|j                  dd       	 |j                  |t        	      }	| j                  |	j                        }
|
r(t        |	j!                         j#                  d            S y # t$        $ r}| j                  |j                        }
|
r)t        |j!                         j#                  d            }n|j!                         j#                  d      }t'        ||
      }t'        |j(                  |      }|j(                  dk(  rt+        |||      t-        |||      d }~ww xY w)Nr   ?)r   r    r   r$   r   AuthorizationzContent-Typez!application/x-www-form-urlencodedr   )methodurl)r   r?   i  )r3   r   rA   _URLr   r   r   r   r   r{   r   r   r   _process_respheadersrK   r   r~   r   rD   r   ApiNotFoundErrorApiError)rR   rP   rQ   r.   r   paramsr   r   r   r   is_jsonr   r?   reqresps                  r   rU   zGitHub._http   s   E>b$nR&89E..b)73De$l+#D)(10C0CD..~/RS	+{{7G{<H(()9)9:G"8==?#9#9'#BCC  
	+((3G"1668??7#;<vvxw/G5C1665Dyy#~&sC663T**
	+s   (AD 	GB2G  Gc                    d}|r||D ]w  }|j                         }|dk(  rt        ||         | _        ,|dk(  rt        ||         | _        E|dk(  rt        ||         | _        ^|dk(  sd||   j                  d      }y |S )NFzx-ratelimit-remainingzx-ratelimit-limitzx-ratelimit-resetzcontent-typer   )lowerintrx   ry   rz   r9   )rR   r   r   r0   hs        r   r   zGitHub._process_resp  s     	HGGI--14WQZD.++-0_D*++-0_D*&%aj334FGG	H r   )NNNNNNNr   )
r\   r]   r^   __doc__rS   r   r   rp   rU   r   r   r   r   rs   rs      s(    "R$B0-+@r   rs   c                       e Zd ZdZd Zd Zy)rD   zN
    general json object that can bind any fields but also act as a dict.
    c                 D    	 | |   S # t         $ r t        d|z        w xY w)Nz#'Dict' object has no attribute '%s')KeyErrorAttributeError)rR   keys     r   rp   zJsonObject.__getattr__  s4    	O9 	O !G#!MNN	Os    c                     || |<   y r   r   )rR   ro   values      r   __setattr__zJsonObject.__setattr__  s    T
r   N)r\   r]   r^   r   rp   r   r   r   r   rD   rD     s    Or   rD   c                        e Zd Z fdZ xZS )r   c                 H    t         t        |   |       || _        || _        y r   )superr   rS   r   r   )rR   r   r   r   	__class__s       r   rS   zApiError.__init__#  s     h&s+ r   r\   r]   r^   rS   __classcell__r   s   @r   r   r   !  s    ! !r   r   c                        e Zd Z fdZ xZS )r   c                 0    t         t        |   |d d        y r   )r   r   rS   )rR   msgr   s     r   rS   zApiAuthError.__init__*  s    lD*3d;r   r   r   s   @r   r   r   (  s    < <r   r   c                       e Zd Zy)r   N)r\   r]   r^   r   r   r   r   r   -  s    r   r   __main__r   )1r   urllib2r   r   r   r   urllibr   r,   r   collectionsr	   r   urllib.requesturllib.parseiocollections.abcreostimehmacr|   hashlib	mimetypesr?   r   r   r   r   r   r7   r   DEFAULT_SCOPERW_SCOPEr3   rA   rK   objectrM   ra   rs   rD   	Exceptionr   r   r   r\   doctesttestmodr   r   r   <module>r      s  +Z)FF(!$ D C C C C 0 0
! 3.6&  >qV qf !y !<8 <
	x 	 zGOO q)MM.(s   "C    D