ó
|£*^c           @  sõ  d  Z  d d l m 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 Z	 e j
 d k r� d d l m Z d „  Z n d e f d	 „  ƒ  YZ d
 „  Z e j d d ƒ Z d „  Z e j d ƒ Z d e f d „  ƒ  YZ d „  Z d d „ Z y d d l m Z Wn! e k
 r:d d l m Z n Xd e f d „  ƒ  YZ e e j ƒ Z e e j ƒ Z  e  d k rše j! ršd „  Z e e _ n9 e  d k r²e j! r²n! e  d k rÓd „  Z e e _ n  e e ƒ Z" d „  Z# d „  Z$ d S(   sT   
Decorator module, see http://pypi.python.org/pypi/decorator
for the documentation.
iÿÿÿÿ(   t   print_functionNs   4.0.6t   3(   t   getfullargspecc         C  s   |  j  S(   N(   t   __init__(   t   cls(    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyt   get_init0   s    R   c           B  s)   e  Z d  Z d „  Z d „  Z e j Z RS(   s?   A quick and dirty replacement for getfullargspec for Python 2.Xc         C  s=   t  j | ƒ \ |  _ |  _ |  _ |  _ g  |  _ d  |  _ d  S(   N(	   t   inspectt
   getargspect   argst   varargst   varkwt   defaultst
   kwonlyargst   Nonet   kwonlydefaults(   t   selft   f(    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyR   5   s    '	c         c  s$   |  j  V|  j V|  j V|  j Vd  S(   N(   R   R	   R
   R   (   R   (    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyt   __iter__;   s    (   t   __name__t
   __module__t   __doc__R   R   R   R   (    (    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyR   3   s   		c         C  s
   |  j  j S(   N(   R   t   __func__(   R   (    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyR   C   s    t   ArgSpecs   args varargs varkw defaultsc         C  s+   t  |  ƒ } t | j | j | j | j ƒ S(   s$   A replacement for inspect.getargspec(   R   R   R   R	   R
   R   (   R   t   spec(    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyR   K   s    s   \s*def\s*([_\w][_\w\d]*)\s*\(t   FunctionMakerc           B  sk   e  Z d  Z e j ƒ  Z d d d d d d d d „ Z d „  Z d e	 d „ Z
 e d d d e d „ ƒ Z RS(   s´   
    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.
    c         C  sÛ  | |  _  | r.| j |  _ |  j d k r6 d |  _ n  | j |  _ | j |  _ t j | ƒ r.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 !|  _  |  _ nÿ t |  j ƒ } t |  j ƒ } |  j ri| 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 ƒ  |  _ q.n  | r@| |  _ n  | d  k	 rX| |  _ n  | rj| |  _ n  | r|| |  _ n  | rŽ| |  _ n  | r | |  _ n  t |  d ƒ sµt ‚ t |  d ƒ s×t  d | ƒ ‚ n  d  S(   Ns   <lambda>t   _lambda_t   __annotations__R   R	   R
   R   R   R   s   arg%dR   t   formatvaluec         S  s   d S(   Nt    (    (   t   val(    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyt   <lambda>s   s    i   iÿÿÿÿt   *s   %s=Nones   %s=%ss   **s   , t   namet	   signatures%   You are decorating a non function: %s(   R   R	   R
   R   R   R   (!   t   shortsignatureR   R    R   t   docR   t   moduleR   t
   isfunctionR   t   getattrt   annotationst   setattrt	   enumerateR   t   syst   versiont   formatargspecR!   t   listR	   t   appendR   R
   t   joint   __dict__t   copyt   dictR   R   t   hasattrt   AssertionErrort	   TypeError(   R   t   funcR    R!   R   R#   R$   t   funcdictt   argspect   at   it   argt   allargst   allshortargs(    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyR   ^   sb    	
	#			c         K  sà   |  j  | _ t |  d d
 ƒ | _ t |  d i  ƒ | _ t |  d d ƒ | _ t |  d d
 ƒ | _ t |  d d
 ƒ | _ y t	 j
 d ƒ } Wn t k
 r¡ d } n X| j j d d ƒ } t |  d	 | ƒ | _ | j j | ƒ d
 S(   s2   Update the signature of func with the data in selfR#   R2   R   R   R'   i   t   ?R   R$   N(    (   R    R   R&   R   R   R0   t   __defaults__t   __kwdefaults__R   R*   t	   _getframet   AttributeErrort	   f_globalst   getR   t   update(   R   R6   t   kwt   framet   callermodule(    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyRE   —   s    
c         J  sb  | e  |  ƒ } | p i  } e j | ƒ } | d k rJ e d | ƒ ‚ n  | j d ƒ } e | g g  |  j j d ƒ D] } | j	 d ƒ ^ qu ƒ }	 x3 |	 D]+ }
 |
 d k r› e
 d |
 | f ƒ ‚ q› q› Wd e |  j ƒ f } y e | | d	 ƒ } | | UWn0 e d
 d e j ƒe | d e j ƒ‚  n X| | } | rN| | d <n  |  j | | � | S(   sB   Make a new function from a given template and update the signatures    not a valid function template
%si   t   ,s    *t   _func_t   _call_s   %s is overridden in
%ss   <decorator-gen-%d>t   singles   Error in generated code:t   filet
   __source__N(   RJ   RK   (   t   varst   DEFt   matchR   t   SyntaxErrort   groupt   setR"   t   splitt   stript	   NameErrort   nextt   _compile_countt   compilet   printR*   t   stderrRE   (   R   t	   src_templt   evaldictt	   addsourcet   attrst   srct   moR    R;   t   namest   nt   filenamet   codeR6   (    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyt   make¨   s0    /
c         K  s¦   t  | t ƒ r@ | j ƒ  j d d ƒ \ }	 }
 |
 d  } d } n d }	 d } | } |  | |	 | | | | ƒ } d j d „  | j ƒ  Dƒ ƒ } | j d | | | | � S(   sú   
        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.
        t   (i   iÿÿÿÿs   
c         s  s   |  ] } d  | Vq d S(   s       N(    (   t   .0t   line(    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pys	   <genexpr>Ù   s    s   def %(name)s(%(signature)s):
N(   t
   isinstancet   strRV   RU   R   R/   t
   splitlinesRg   (   R   t   objt   bodyR^   R   R#   R$   R_   R`   R    t   restR!   R6   R   t   ibody(    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyt   createÇ   s    	
	N(   R   R   R   t	   itertoolst   countRY   R   R   RE   t   FalseRg   t   classmethodt   TrueRr   (    (    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyR   T   s   	8	c         C  sR   t  d | d |  ƒ } t j |  d | d |  ƒ} t |  d ƒ rN |  j | _ n  | S(   sE   
    decorate(func, caller) decorates a function using a caller.
    RK   RJ   s)   return _call_(_func_, %(shortsignature)s)t   __wrapped__t   __qualname__(   R2   R   Rr   R3   Ry   (   R6   t   callerR^   t   fun(    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyt   decorateÞ   s    c      
   C  së   | d k	 r t | |  ƒ St j |  ƒ rP |  j j ƒ  } d |  j |  j f } nZ t j |  ƒ rŒ |  j d k rw d } n	 |  j } |  j } n |  j j j ƒ  } |  j	 j } t
 d |  d t ƒ } t j d | d | d | d	 |  j d
 |  ƒS(   s=   decorator(caller) converts a caller function into a decoratorsH   decorator(%s) converts functions/generators into factories of %s objectss   <lambda>R   RK   t
   _decorate_s   %s(func)s   return _decorate_(func, _call_)R#   R$   Rx   N(   R   R|   R   t   isclassR   t   lowerR%   R   t	   __class__t   __call__R2   R   Rr   R   (   Rz   t   _funcR    R#   R^   (    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyt	   decoratorë   s$    		
(   t   _GeneratorContextManager(   t   GeneratorContextManagert   ContextManagerc           B  s   e  Z d  „  Z RS(   c         C  s(   t  j | d t d |  d | ƒ d | ƒS(   s   Context manager decorators.   with _self_: return _func_(%(shortsignature)s)t   _self_RJ   Rx   (   R   Rr   R2   (   R   R6   (    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyR�     s    (   R   R   R�   (    (    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyR†     s   i   c         O  s   t  j |  | | | Ž  ƒ S(   N(   R„   R   (   R   t   gR9   t   k(    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyR     s    i   c         O  s   t  j |  | | | ƒ S(   N(   R„   R   (   R   Rˆ   R9   R‰   (    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyR     s    c         C  sx   t  } xU t | ƒ D]G \ } } t | |  ƒ r8 t } Pn  t |  | ƒ r |  | | <t } q q W| rt | j |  ƒ n  d S(   s_   
    Append ``a`` to the list of the virtual ancestors, unless it is already
    included.
    N(   Rw   R)   t
   issubclassRu   R.   (   R9   t
   vancestorst   addt   jt   va(    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyR.   &  s    
c            sc   ˆ s t  d ƒ ‚ d d j ˆ ƒ ‰ t j d ‡ f d † ‰  ‡  ‡ ‡ f d †  } d ˆ | _ | S(   sr   
    Factory of decorators turning a function into a generic function
    dispatching on the given arguments.
    s   No dispatch args passeds   (%s,)s   , R   c           sG   | t  |  ƒ t  ˆ  ƒ ƒ rC t d t  ˆ  ƒ t  |  ƒ | f ƒ ‚ n  d S(   s5   Make sure one passes the expected number of argumentss   Expected %d arguments, got %d%sN(   t   lenR5   (   t	   argumentst   wrongt   msg(   t   dispatch_args(    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyt   check@  s    c           sê   t  t ˆ ƒ j ƒ } t  ˆ ƒ | k s: t d ˆ ƒ ‚ n  i  ‰ ‡ ‡ ‡ f d †  ‰ ‡ ‡ f d †  ‰  ‡ ‡ f d †  } ‡  ‡ f d †  } ‡  ‡ ‡ f d †  } t j ˆ d ˆ t d | ƒ d	 | d
 ˆ d ˆ d ˆ d ˆ  d | d ˆ ƒS(   s4   Decorator turning a function into a generic functions   Unknown dispatch arguments %sc            s±   ˆ  |  ƒ g  t  t ˆ ƒ ƒ D] } g  ^ q } xb ˆ D]Z } xQ t |  | | ƒ D]= \ } } } t | | ƒ rO | | j k rO t | | ƒ qO qO Wq6 Wg  | D] } t | ƒ ^ q› S(   sU   
            Get a list of sets of virtual ancestors for the given types
            (   t   rangeR�   t   zipRŠ   t   __mro__R.   RT   (   t   typest   _t   rast   types_t   tt   type_t   ra(   R”   R“   t   typemap(    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyR‹   P  s    
%"c            s¼   ˆ  |  ƒ g  } x¥ t  |  ˆ |  Œ  ƒ D]Ž \ } } t | ƒ } | d k rc t d | | f ƒ ‚ n@ | d k rš | \ } t d | | f i  ƒ j d } n	 | j } | j | d  ƒ q& W| S(   sG   
            Get a list of virtual MROs, one for each type
            i   s   Ambiguous dispatch for %s: %sRœ   iÿÿÿÿ(   R–   R�   t   RuntimeErrort   typeR—   R.   (   R˜   t   listsRœ   t   vast   n_vasRŽ   t   mro(   R”   R‹   (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyt	   ancestors\  s    
"	"	c            s#   ˆ ˆ  ƒ ‡ ‡ ‡  f d †  } | S(   sU   
            Decorator to register an implementation for the given types
            c           s1   ˆ  t  |  ƒ j t j d |  j ƒ |  ˆ ˆ <|  S(   Ns    in (   R   R   t   operatort   ltR   (   R   (   R”   RŸ   R˜   (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyt   dect  s    #
(    (   R˜   R©   (   R”   RŸ   (   R˜   sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyt   registero  s    
c            sQ   ˆ |  ƒ g  } x: t  j ˆ  |  Œ  Œ  D]# } | j t d „  | Dƒ ƒ ƒ q& W| S(   sI   
            An utility to introspect the dispatch algorithm
            c         s  s   |  ] } | j  Vq d  S(   N(   R   (   Ri   R9   (    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pys	   <genexpr>�  s    (   Rs   t   productR.   t   tuple(   R˜   t   lstt   anc(   R¦   R”   (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyt   dispatch_infoz  s
    
!c           sª   t  d „  |  Dƒ ƒ } y ˆ | } Wn t k
 r7 n X| | | Ž  St j ˆ  | Œ  Œ  } t | ƒ x6 | D]. } ˆ j | ƒ } | d  k	 rk | | | Ž  Sqk Wˆ | | Ž  S(   Nc         s  s   |  ] } t  | ƒ Vq d  S(   N(   R¡   (   Ri   R;   (    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pys	   <genexpr>…  s    (   R¬   t   KeyErrorRs   R«   RX   RD   R   (   R“   R   RF   R˜   R   t   combinationsR›   (   R¦   R6   RŸ   (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyt	   _dispatch„  s    
s#   return _f_(%s, %%(shortsignature)s)t   _f_Rª   t   defaultRŸ   R‹   R¦   R¯   Rx   (   RT   R   R   RW   R   Rr   R2   (   R6   t   argsetRª   R¯   R²   (   R”   R“   t   dispatch_str(   R¦   R6   RŸ   R‹   sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyt   gen_func_decF  s    

t   dispatch_on(   R4   R/   R§   t   neR   (   R“   R·   (    (   R”   R“   R¶   sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyR¸   8  s    V(%   R   t
   __future__R    t   reR*   R   R§   Rs   t   collectionst   __version__R+   R   R   t   objectt
   namedtupleR   R   RZ   RP   R   R|   R   Rƒ   t
   contextlibR„   t   ImportErrorR…   R†   R   t   initR�   R   t   n_argsR	   t   contextmanagerR.   R¸   (    (    (    sf   /home/gitlab-runner/builds/8480fa44/0/bergerc/fluidmanager-web/art-framework/bin/decorator/__init__.pyt   <module>!   sL   		Š				