ó
‹²,]c           @   sh  d  Z  yR d d l m Z m Z m Z m Z d d l m Z d d l	 m	 Z	 d d „ Z WnI d d l m Z m Z m Z m Z d d l m Z d d l m	 Z	 n Xd 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 „  ƒ Z d Z  d Z! d „  Z" d „  Z# d „  Z$ d e% f d „  ƒ  YZ& d e% f d „  ƒ  YZ' d e% f d „  ƒ  YZ( d  e f d! „  ƒ  YZ) d" e* f d# „  ƒ  YZ+ d$ e+ f d% „  ƒ  YZ, d& e+ f d' „  ƒ  YZ- e. d( k rdd d l/ Z/ e/ j0 ƒ  n  d S()   s‡  
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
iÿÿÿÿ(   t   build_openert   HTTPSHandlert   Requestt	   HTTPError(   t   quote(   t   StringIOc         C   s
   t  |  ƒ S(   N(   t   str(   t   stringt   encoding(    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyt   bytes6   s    (   R    R   R   R   N(   t   Iterable(   t   datetimet	   timedeltat   tzinfoi<   s   https://api.github.comt   GETc           C   s   d S(   NR   (    (    (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyt   <lambda>F   t    t   PUTc           C   s   d S(   NR   (    (    (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyR   G   R   t   POSTc           C   s   d S(   NR   (    (    (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyR   H   R   t   PATCHc           C   s   d S(   NR   (    (    (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyR   I   R   t   DELETEc           C   s   d S(   NR   (    (    (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyR   J   R   s&   user,public_repo,repo,repo:status,gistc         C   s‹   g  } xu |  j  ƒ  D]g \ } } y. t | t ƒ r@ | j d ƒ n	 t | ƒ } Wn | } n X| j d | t | ƒ f ƒ q Wd j | ƒ S(   s   
    Encode parameters.
    s   utf-8s   %s=%st   &(   t   itemst
   isinstancet   unicodet   encodeR   t   appendt   urlquotet   join(   t   kwt   argst   kt   vt   qv(    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyt   _encode_paramsO   s    .
!c         C   s   d „  } t  j |  d | ƒS(   s$   
    Encode object as json str.
    c         S   s\   t  |  t ƒ r |  St ƒ  } x9 t |  ƒ D]+ } | j d ƒ s) t |  | ƒ | | <q) q) W| S(   Nt   _(   R   t   dictt   dirt
   startswitht   getattr(   t   objt   dR   (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyt	   _dump_obja   s    	t   default(   t   jsont   dumps(   R(   R*   (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyt   _encode_json]   s    	c         C   s   d „  } t  j |  d | ƒS(   Nc         S   s:   t  ƒ  } x* |  j ƒ  D] \ } } | | t | ƒ <q W| S(   N(   t
   JsonObjectR   R   (   t   pairst   oR   R    (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyt	   _obj_hookl   s    	t   object_hook(   R,   t   loads(   t   jsonstrR2   (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyt   _parse_jsonk   s    	t   _Executablec           B   s)   e  Z d  „  Z d „  Z d „  Z e Z RS(   c         C   s   | |  _  | |  _ | |  _ d  S(   N(   t   _ght   _methodt   _path(   t   selfR8   R9   R:   (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyt   __init__u   s    		c         K   s   |  j  j |  j |  j |  S(   N(   R8   t   _httpR9   R:   (   R;   R   (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyt   __call__z   s    c         C   s   d |  j  |  j f S(   Ns   _Executable (%s %s)(   R9   R:   (   R;   (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyt   __str__}   s    (   t   __name__t
   __module__R<   R>   R?   t   __repr__(    (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyR7   s   s   			t	   _Callablec           B   s2   e  Z d  „  Z d „  Z d „  Z d „  Z e Z RS(   c         C   s   | |  _  | |  _ d  S(   N(   R8   t   _name(   R;   R8   RD   (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyR<   „   s    	c         G   s[   t  | ƒ d k r |  Sd |  j d j g  | D] } t | ƒ ^ q, ƒ f } t |  j | ƒ S(   Ni    s   %s/%st   /(   t   lenRD   R   R   RC   R8   (   R;   R   t   argt   name(    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyR>   ˆ   s    5c         C   sÍ   | d k r" t  |  j d |  j ƒ S| d k rD t  |  j d |  j ƒ S| d k rf t  |  j d |  j ƒ S| d k rˆ t  |  j d |  j ƒ S| d	 k rª t  |  j d
 |  j ƒ Sd |  j | f } t |  j | ƒ S(   Nt   getR   t   putR   t   postR   t   patchR   t   deleteR   s   %s/%s(   R7   R8   RD   RC   (   R;   t   attrRH   (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyt   __getattr__Ž   s    c         C   s   d |  j  S(   Ns   _Callable (%s)(   RD   (   R;   (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyR?   œ   s    (   R@   RA   R<   R>   RO   R?   RB   (    (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyRC   ‚   s
   				t   GitHubc           B   s_   e  Z d  Z d d d d d d d d „ Z d d „ Z d d „ Z d „  Z d „  Z d „  Z	 RS(   s   
    GitHub client.
    c   	      C   s¯   d |  _  d |  _ d |  _ d  |  _ | rq | rq t j t d | | f d ƒ ƒ } | j d ƒ } d | |  _ n | r‡ d | |  _ n  | |  _	 | |  _
 | |  _ | |  _ d  S(   Niÿÿÿÿs   %s:%ss   utf-8t   asciis   Basic %ss   token %s(   t   x_ratelimit_remainingt   x_ratelimit_limitt   x_ratelimit_resett   Nonet   _authorizationt   base64t	   b64encodeR	   t   decodet
   _client_idt   _client_secrett   _redirect_urit   _scope(	   R;   t   usernamet   passwordt   access_tokent	   client_idt   client_secrett   redirect_urit   scopet   userandpass(    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyR<   §   s    				"			c         C   s}   |  j  s t d ƒ ‚ n  t d |  j  ƒ } |  j rC |  j | d <n  |  j r\ |  j | d <n  | ro | | d <n  d t | ƒ S(   sÁ   
        Generate authorize_url.

        >>> GitHub(client_id='3ebf94c5776d565bcf75').authorize_url()
        'https://github.com/login/oauth/authorize?client_id=3ebf94c5776d565bcf75'
        s   No client id.Ra   Rc   Rd   t   states+   https://github.com/login/oauth/authorize?%s(   RZ   t   ApiAuthErrorR$   R\   R]   R"   (   R;   Rf   R   (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyt   authorize_url¸   s    			c   	      C   s  t  d |  j d |  j d | ƒ } |  j r: |  j | d <n  | rM | | d <n  t t ƒ } t d d t | ƒ ƒ} t d | _	 | j
 d	 d
 ƒ y\ | j | d t ƒ} t | j ƒ  ƒ } d | k rÜ t t | j ƒ ƒ ‚ n  t | j ƒ SWn t k
 r} t d ƒ ‚ n Xd S(   s~   
        In callback url: http://host/callback?code=123&state=xyz

        use code and state to get an access token.
        Ra   Rb   t   codeRc   Rf   s+   https://github.com/login/oauth/access_tokent   dataR   t   Accepts   application/jsont   timeoutt   errors   HTTPError when get access tokenN(   R$   RZ   R[   R\   R    R   R   R"   t   _METHOD_MAPt
   get_methodt
   add_headert   opent   TIMEOUTR6   t   readRg   R   Rm   R`   R   (	   R;   Ri   Rf   R   t   openert   requestt   responset   rt   e(    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyt   get_access_tokenÊ   s"    !	c         C   s   t  |  d | ƒ S(   Ns   /%s(   RC   (   R;   RN   (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyRO   â   s    c         K   sæ  d  } d  } | d k r7 | r7 d | t | ƒ f } n  | d k r[ t t | ƒ d ƒ } n  d t | f } t t ƒ } t | d | ƒ} t | | _	 |  j
 rµ | j d	 |  j
 ƒ n  | d k rÔ | j d
 d ƒ n  yJ | j | d t ƒ}	 |  j |	 j ƒ }
 |
 rt |	 j ƒ  j d ƒ ƒ SWnÁ t k
 rá} |  j | j ƒ }
 |
 rft | j ƒ  j d ƒ ƒ } n | j ƒ  j d ƒ } t d | d | ƒ } t d | j d | ƒ } | j d k rÌt | | | ƒ ‚ n  t | | | ƒ ‚ n Xd  S(   NR   s   %s?%sR   R   R   s   utf-8s   %s%sRj   t   Authorizations   Content-Types!   application/x-www-form-urlencodedRl   t   methodt   urlRi   R,   i”  (   R   R   R   (   R   R   R   (   RU   R"   R	   R.   t   _URLR    R   R   Rn   Ro   RV   Rp   Rq   Rr   t   _process_respt   headersR6   Rs   RY   R   R/   Ri   t   ApiNotFoundErrort   ApiError(   R;   R9   R:   R   Rj   t   paramsR|   Rt   Ru   Rv   t   is_jsonRx   R,   t   reqt   resp(    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyR=   å   s:    	c         C   s¸   t  } | r´ x¥ | D]š } | j ƒ  } | d k rG t | | ƒ |  _ q | d k ri t | | ƒ |  _ q | d k r‹ t | | ƒ |  _ q | d k r | | j d ƒ } q q Wn  | S(   Ns   x-ratelimit-remainings   x-ratelimit-limits   x-ratelimit-resets   content-types   application/json(   t   Falset   lowert   intRR   RS   RT   R&   (   R;   R   Rƒ   R   t   h(    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyR~     s    N(
   R@   RA   t   __doc__RU   R<   Rh   Ry   RO   R=   R~   (    (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyRP   ¡   s   		 R/   c           B   s    e  Z d  Z d „  Z d „  Z RS(   sN   
    general json object that can bind any fields but also act as a dict.
    c         C   s4   y |  | SWn! t  k
 r/ t d | ƒ ‚ n Xd  S(   Ns#   'Dict' object has no attribute '%s'(   t   KeyErrort   AttributeError(   R;   t   key(    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyRO     s    c         C   s   | |  | <d  S(   N(    (   R;   RN   t   value(    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyt   __setattr__  s    (   R@   RA   RŠ   RO   R   (    (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyR/     s   	R   c           B   s   e  Z d  „  Z RS(   c         C   s,   t  t |  ƒ j | ƒ | |  _ | |  _ d  S(   N(   t   superR   R<   Ru   Rv   (   R;   R|   Ru   Rv   (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyR<   #  s    	(   R@   RA   R<   (    (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyR   !  s   Rg   c           B   s   e  Z d  „  Z RS(   c         C   s    t  t |  ƒ j | d  d  ƒ d  S(   N(   R   Rg   R<   RU   (   R;   t   msg(    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyR<   *  s    (   R@   RA   R<   (    (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyRg   (  s   R€   c           B   s   e  Z RS(    (   R@   RA   (    (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyR€   -  s   t   __main__(1   RŠ   t   urllib2R    R   R   R   t   urllibR   R   R   RU   R	   t   urllib.requestt   urllib.parset   iot   ret   ost   timet   hmacRW   t   hashlibt	   mimetypesR,   t   collectionsR
   R   R   R   Rr   R}   R$   Rn   t   DEFAULT_SCOPEt   RW_SCOPER"   R.   R6   t   objectR7   RC   RP   R/   t	   ExceptionR   Rg   R€   R@   t   doctestt   testmod(    (    (    s;   lib/python2.7/site-packages/spyder/utils/external/github.pyt   <module>/   sF   ""l							s