B
    nb\&                 @   s  d Z y>ddlmZmZmZmZ ddlmZ ddl	m	Z	 d*ddZ
W n<   ddlmZmZmZmZ ddlmZ ddlm	Z	 Y nX 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mZ dZdZedd dd dd dd dd dZdZdZ dd Z!dd Z"dd Z#G dd de$Z%G dd de$Z&G dd  d e$Z'G d!d" d"eZ(G d#d$ d$e)Z*G d%d& d&e*Z+G d'd( d(e*Z,e-d)krddl.Z.e./  dS )+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)StringIONc             C   s   t | S )N)str)stringencoding r   ;lib/python3.7/site-packages/spyder/utils/external/github.pybytes6   s    r   )r   r   r   r   )Iterable)datetime	timedeltatzinfo<   zhttps://api.github.comc               C   s   dS )NGETr   r   r   r   r   <lambda>F   s    r   c               C   s   dS )NPUTr   r   r   r   r   r   G   s    c               C   s   dS )NPOSTr   r   r   r   r   r   H   s    c               C   s   dS )NPATCHr   r   r   r   r   r   I   s    c               C   s   dS )NDELETEr   r   r   r   r   r   J   s    )r   r   r   r   r   z&user,public_repo,repo,repo:status,gistc             C   sl   g }x\|   D ]P\}}y t|tr,|dnt|}W n   |}Y nX |d|t|f  qW d|S )z
    Encode parameters.
    zutf-8z%s=%s&)items
isinstanceZunicodeencoder   appendurlquotejoin)kwargskvZqvr   r   r   _encode_paramsO   s     
r$   c             C   s   dd }t j| |dS )z$
    Encode object as json str.
    c             S   sB   t | tr| S t }x(t| D ]}|dst| |||< qW |S )N_)r   dictdir
startswithgetattr)objdr"   r   r   r   	_dump_obja   s    

z_encode_json.<locals>._dump_obj)default)jsondumps)r*   r,   r   r   r   _encode_json]   s    r0   c             C   s   dd }t j| |dS )Nc             S   s,   t  }x |  D ]\}}||t|< qW |S )N)
JsonObjectr   r   )Zpairsor"   r#   r   r   r   	_obj_hookl   s    z_parse_json.<locals>._obj_hook)Zobject_hook)r.   loads)Zjsonstrr3   r   r   r   _parse_jsonk   s    r5   c               @   s(   e Zd Zdd Zdd Zdd ZeZdS )_Executablec             C   s   || _ || _|| _d S )N)_gh_method_path)selfr7   r8   r9   r   r   r   __init__u   s    z_Executable.__init__c             K   s   | j j| j| jf|S )N)r7   _httpr8   r9   )r:   r    r   r   r   __call__z   s    z_Executable.__call__c             C   s   d| j | jf S )Nz_Executable (%s %s))r8   r9   )r:   r   r   r   __str__}   s    z_Executable.__str__N)__name__
__module____qualname__r;   r=   r>   __repr__r   r   r   r   r6   s   s   r6   c               @   s0   e Zd Zdd Zdd Zdd Zdd ZeZd	S )
	_Callablec             C   s   || _ || _d S )N)r7   _name)r:   r7   rD   r   r   r   r;      s    z_Callable.__init__c             G   s:   t |dkr| S d| jddd |D f }t| j|S )Nr   z%s/%s/c             S   s   g | ]}t |qS r   )r   ).0argr   r   r   
<listcomp>   s    z&_Callable.__call__.<locals>.<listcomp>)lenrD   r   rC   r7   )r:   r!   namer   r   r   r=      s    z_Callable.__call__c             C   s   |dkrt | jd| jS |dkr0t | jd| jS |dkrHt | jd| jS |dkr`t | jd| jS |d	krxt | jd
| jS d| j|f }t| j|S )Ngetr   Zputr   Zpostr   Zpatchr   deleter   z%s/%s)r6   r7   rD   rC   )r:   attrrJ   r   r   r   __getattr__   s    z_Callable.__getattr__c             C   s
   d| j  S )Nz_Callable (%s))rD   )r:   r   r   r   r>      s    z_Callable.__str__N)r?   r@   rA   r;   r=   rN   r>   rB   r   r   r   r   rC      s
   rC   c               @   sF   e Zd ZdZdddZdddZdddZd	d
 Zdd Zdd Z	dS )GitHubz
    GitHub client.
    Nc       	      C   sx   d| _ d| _d| _d | _|rN|rNttd||f d}|d}d| | _n|r\d| | _|| _|| _	|| _
|| _d S )Nz%s:%szutf-8asciizBasic %sztoken %s)x_ratelimit_remainingx_ratelimit_limitx_ratelimit_reset_authorizationbase64Z	b64encoder   decode
_client_id_client_secret_redirect_uri_scope)	r:   ZusernameZpasswordaccess_token	client_idclient_secretredirect_uriscopeZuserandpassr   r   r   r;      s    

zGitHub.__init__c             C   sR   | j stdt| j d}| jr*| j|d< | jr:| j|d< |rF||d< dt| 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)rX   ApiAuthErrorr&   rZ   r[   r$   )r:   ra   r    r   r   r   authorize_url   s    

zGitHub.authorize_urlc       	   
   C   s   t | j| j|d}| jr"| j|d< |r.||d< tt}tdt|d}td |_	|
dd y:|j|td	}t| }d
|krtt|jt|jS  tk
r } ztdW dd}~X Y nX dS )z~
        In callback url: http://host/callback?code=123&state=xyz

        use code and state to get an access token.
        )r]   r^   coder_   ra   z+https://github.com/login/oauth/access_token)datar   ZAcceptzapplication/json)timeouterrorzHTTPError when get access tokenN)r&   rX   rY   rZ   r   r   r   r$   _METHOD_MAP
get_method
add_headeropenTIMEOUTr5   readrb   r   rg   r\   r   )	r:   rd   ra   r    openerrequestresponserer   r   r   get_access_token   s"    


zGitHub.get_access_tokenc             C   s   t | d| S )Nz/%s)rC   )r:   rM   r   r   r   rN      s    zGitHub.__getattr__c          
   K   sZ  d }d }|dkr$|r$d|t |f }|dkr:tt|d}dt|f }tt}t||d}t| |_| j	rx|
d| j	 |dkr|
dd	 y4|j|td
}	| |	j}
|
rt|	 dS W n tk
rT } zt| |j}
|
rt| d}n| d}t||d}t|j|d}|jdkr8t|||t|||W d d }~X Y nX d S )Nr   z%s?%s)r   r   r   zutf-8z%s%s)re   ZAuthorizationzContent-Typez!application/x-www-form-urlencoded)rf   )methodurl)rd   r.   i  )r$   r   r0   _URLr   r   r   rh   ri   rU   rj   rk   rl   _process_respheadersr5   rm   rW   r   r1   rd   ApiNotFoundErrorApiError)r:   r8   r9   r    re   Zparamsru   rn   ro   rp   is_jsonrr   r.   ZreqZrespr   r   r   r<      s:    
zGitHub._httpc             C   s   d}|r|xr|D ]j}|  }|dkr2t|| | _q|dkrJt|| | _q|dkrbt|| | _q|dkr|| d}qW |S )NFzx-ratelimit-remainingzx-ratelimit-limitzx-ratelimit-resetzcontent-typezapplication/json)lowerintrR   rS   rT   r(   )r:   rx   r{   r"   hr   r   r   rw     s    
zGitHub._process_resp)NNNNNNN)N)N)
r?   r@   rA   __doc__r;   rc   rs   rN   r<   rw   r   r   r   r   rO      s   


 rO   c               @   s    e Zd ZdZdd Zdd ZdS )r1   zN
    general json object that can bind any fields but also act as a dict.
    c             C   s.   y| | S  t k
r(   td| Y nX d S )Nz#'Dict' object has no attribute '%s')KeyErrorAttributeError)r:   keyr   r   r   rN     s    zJsonObject.__getattr__c             C   s   || |< d S )Nr   )r:   rM   valuer   r   r   __setattr__  s    zJsonObject.__setattr__N)r?   r@   rA   r   rN   r   r   r   r   r   r1     s   r1   c                   s   e Zd Z fddZ  ZS )rz   c                s    t t| | || _|| _d S )N)superrz   r;   ro   rp   )r:   ru   ro   rp   )	__class__r   r   r;   #  s    zApiError.__init__)r?   r@   rA   r;   __classcell__r   r   )r   r   rz   !  s   rz   c                   s   e Zd Z fddZ  ZS )rb   c                s   t t| |d d  d S )N)r   rb   r;   )r:   msg)r   r   r   r;   *  s    zApiAuthError.__init__)r?   r@   rA   r;   r   r   r   )r   r   rb   (  s   rb   c               @   s   e Zd ZdS )ry   N)r?   r@   rA   r   r   r   r   ry   -  s   ry   __main__)N)0r   Zurllib2r   r   r   r   Zurllibr   r   r   r   Zurllib.requestZurllib.parseioreosZtimeZhmacrV   ZhashlibZ	mimetypesr.   collectionsr   r   r   r   rl   rv   r&   rh   ZDEFAULT_SCOPEZRW_SCOPEr$   r0   r5   objectr6   rC   rO   r1   	Exceptionrz   rb   ry   r?   ZdoctestZtestmodr   r   r   r   <module>/   sF   Hs
