


S)                 @   sf  d  Z  d Z d d d g Z d d l Z d d l Z d d l Z e j d k rm d d l m Z d	 d
   Z n" Gd d   d e	  Z d d
   Z e j
 d  Z Gd d   d e	  Z d d d  Z d d   Z y2 d d l m Z e d e f e d e   Z WnR e k
 rUd d l m Z d d   Z e d e f e d e d e   Z Yn Xe e  Z d S)zT
Decorator module, see http://pypi.python.org/pypi/decorator
for the documentation.
z3.4.0	decoratorFunctionMakercontextmanager    N3)getfullargspecc             C   s   |  j  S)N)__init__)cls r	   +/usr/lib/python3/dist-packages/decorator.pyget_init*   s    r   c               @   s.   e  Z d  Z d Z d d   Z d d   Z d S)r   z?A quick and dirty replacement for getfullargspec for Python 2.Xc             C   s=   t  j |  \ |  _ |  _ |  _ |  _ g  |  _ d  |  _ d  S)N)inspectZ
getargspecargsvarargsvarkwdefaults
kwonlyargskwonlydefaults)selffr	   r	   r
   r   /   s    '	zgetfullargspec.__init__c             c   s$   |  j  V|  j V|  j V|  j Vd  S)N)r   r   r   r   )r   r	   r	   r
   __iter__4   s    zgetfullargspec.__iter__N)__name__
__module____qualname____doc__r   r   r	   r	   r	   r
   r   -   s   r   c             C   s
   |  j  j S)N)r   __func__)r   r	   r	   r
   r   9   s    z\s*def\s*([_\w][_\w\d]*)\s*\(c            	   @   ss   e  Z d  Z d Z d d d d d d d d d  Z d d   Z d d d d	  Z e d d d d
 d d   Z d S)r   z
    An object with the ability to create functions with a given signature.
    It has attributes name, doc, module, signature, defaults, dict and
    methods update and make.
    Nc             C   s  | |  _  | r4| j |  _ |  j d k r6 d |  _ n  | j |  _ | j |  _ t j |  r4t	 |  } t
 | d i   |  _ x' d D] }	 t |  |	 t
 | |	   q Wx1 t |  j  D]  \ }
 } t |  d
 |
 |  q Wt j d k  rt j d d d   |  d d  |  _  |  _ n t |  j  } t |  j  } |  j ro| j d |  j  | j d |  j  n |  j r| j d  n  x9 |  j D]. }	 | j d |	  | j d |	 |	 f  qW|  j r| j d |  j  | j d |  j  n  d j |  |  _ d j |  |  _  | j j   |  _ q4n  | rF| |  _ n  | d  k	 r^| |  _ n  | rp| |  _ n  | r| |  _ n  | r| |  _ n  | r| |  _ n  t |  d  st  t |  d  st d |   n  d  S)Nz<lambda>_lambda___annotations__r   r   r   r   r   r   zarg%dr   Zformatvaluec             S   s   d S)N r	   )valr	   r	   r
   <lambda>Z   s    z(FunctionMaker.__init__.<locals>.<lambda>   *z%s=Nonez%s=%sz**z, name	signaturez%You are decorating a non function: %s)zargszvarargszvarkwzdefaultsz
kwonlyargszkwonlydefaults) shortsignaturer   r"   r   docr   moduler   
isfunctionr   getattrannotationssetattr	enumerater   sysversionZformatargspecr#   listr   appendr   r   join__dict__copydictr   hasattrAssertionError	TypeError)r   funcr"   r#   r   r&   r'   ZfuncdictZargspecaiargZallargsZallshortargsr	   r	   r
   r   E   s`    	
2			zFunctionMaker.__init__c             K   s   |  j  | _ t |  d d  | _ t |  d i   | _ t |  d f   | _ t |  d d  | _ t |  d d  | _ t j	 d  j
 j d d	  } t |  d
 |  | _ | j j |  d S)z2Update the signature of func with the data in selfr&   Nr4   r   r   r*      r   ?r'   )r"   r   r)   r   r2   __defaults____kwdefaults__r   r-   	_getframe	f_globalsgetr   update)r   r8   kwZcallermoduler	   r	   r
   rC   ~   s    zFunctionMaker.updateFc          
   K   s_  | t  |   } | p i  } t j |  } | d k rJ t d |   n  | j d  } t | g d d   |  j j d  D  } x3 | D]+ }	 |	 d k r t d	 |	 | f   q q W| j	 d
  s | d
 7} n  y# t
 | d d  }
 t |
 |  Wn1 t d d t j t | d t j   Yn X| | } | rK| | d <n  |  j | |  | S)zBMake a new function from a given template and update the signatureNz not a valid function template
%sr    c             S   s   g  |  ] } | j  d    q S)z *)strip).0r;   r	   r	   r
   
<listcomp>   s   	 z&FunctionMaker.make.<locals>.<listcomp>,_func__call_z%s is overridden in
%s
z<string>ZsinglezError in generated code:fileZ
__source__)z_func_rJ   )varsDEFmatchSyntaxErrorgroupsetr%   split	NameErrorendswithcompileexecprintr-   stderrrC   )r   Z	src_templevaldict	addsourceattrssrcZmor"   namesncoder8   r	   r	   r
   make   s2    
zFunctionMaker.makeTc             K   s   t  | t  rF | j   j d d  \ }	 }
 |
 d d  } d } n d }	 d } | } |  | |	 | | | |  } d j d d   | j   D  } | j d | | | |  S)	z
        Create a function from the strings name, signature and body.
        evaldict is the evaluation dictionary. If addsource is true an attribute
        __source__ is added to the result. The attributes attrs are added,
        if any.
        (r    NrK   c             s   s   |  ] } d  | Vq d S)z    Nr	   )rF   liner	   r	   r
   	<genexpr>   s    z'FunctionMaker.create.<locals>.<genexpr>zdef %(name)s(%(signature)s):
r$   )
isinstancestrrE   rS   r1   
splitlinesra   )r   objZbodyrZ   r   r&   r'   r[   r\   r"   restr#   r8   r   Zibodyr	   r	   r
   create   s    		"zFunctionMaker.create)	r   r   r   r   r   rC   ra   classmethodrj   r	   r	   r	   r
   r   ?   s   	8c             C   s  | d k	 rN | j  j   } |  | d <| | d <t j | d | d | d | St j |   r |  j j   } t |   } d |  j |  j f } t	 |  j
 d } n t j |   r |  j d	 k r d
 n |  j } |  } |  j } t	 |  j
 d } n= |  j j j   } |  j j } |  j j } t	 |  j
 d } | j  j   } |  | d <t | d <t j d | | f d | | d |  d |  d | d |  j Sd S)z
    decorator(caller) converts a caller function into a decorator;
    decorator(caller, func) decorates a function using a caller.
    NrJ   rI   z)return _call_(_func_, %(shortsignature)s)Zundecorated__wrapped__zHdecorator(%s) converts functions/generators into factories of %s objectsr    z<lambda>r   r   r   z%s(%s)zreturn decorator(_call_, %s)r&   r'   )__globals__r3   r   rj   r   Zisclassr   lowerr   r   r   r(   r   	__class____call__r   r   r   )Zcallerr8   rZ   r"   Z
callerfuncr&   Zfunr	   r	   r
   r      s>    

		

c             C   s(   t  j | d t d |  d |  d | S)zContext manager decoratorz.with _self_: return _func_(%(shortsignature)s)Z_self_rI   rl   )r   rj   r4   )r   r8   r	   r	   r
   rp      s    rp   )_GeneratorContextManagerContextManager)GeneratorContextManagerc             O   s   t  j |  | | |    S)N)rs   r   )r   r   r9   kr	   r	   r
   r      s    r   )r   __version____all__r-   rer   r.   r   r   objectrV   rN   r   r   rp   
contextlibrq   typer4   rr   ImportErrorrs   r   r   r	   r	   r	   r
   <module>!   s.   $~)	