ó
øÐLac           @` s  d  Z  d d l m Z m Z m Z d d l Z e j e ƒ Z d d l	 m
 Z
 m Z d d l Z d d l m Z d d l m Z d d d	 d
 d d g Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d
 e f d „  ƒ  YZ d d d e d e d d „ Z d d d e d d „ Z d S(   s7   
passlib.utils.decor -- helper decorators & properties
i    (   t   absolute_importt   divisiont   print_functionN(   t   wrapst   update_wrapper(   t   warn(   t   PY3t   classpropertyt   hybrid_methodt   memoize_single_valuet   memoized_propertyt   deprecated_functiont   deprecated_methodc           B` s/   e  Z d  Z d „  Z d „  Z e d „  ƒ Z RS(   sj   Function decorator which acts like a combination of classmethod+property (limited to read-only properties)c         C` s   | |  _  d  S(   N(   t   im_func(   t   selft   func(    (    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyt   __init__#   s    c         C` s   |  j  | ƒ S(   N(   R   (   R   t   objt   cls(    (    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyt   __get__&   s    c         C` s   |  j  S(   s   py3 compatible alias(   R   (   R   (    (    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyt   __func__)   s    (   t   __name__t
   __module__t   __doc__R   R   t   propertyR   (    (    (    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyR       s   		c           B` s    e  Z d  Z d „  Z d „  Z RS(   s   
    decorator which invokes function with class if called as class method,
    and with object if called at instance level.
    c         C` s   | |  _  t |  | ƒ d  S(   N(   R   R   (   R   R   (    (    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyR   4   s    	c         C` sH   | d  k r | } n  t r. t j |  j | ƒ St j |  j | | ƒ Sd  S(   N(   t   NoneR   t   typest
   MethodTypeR   (   R   R   R   (    (    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyR   8   s
    	(   R   R   R   R   R   (    (    (    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyR   .   s   	c         ` s@   i  ‰  t  ˆ ƒ ‡  ‡ f d †  ƒ } ‡  f d †  } | | _ | S(   s   
    decorator for function which takes no args,
    and memoizes result.  exposes a ``.clear_cache`` method
    to clear the cached value.
    c          ` s5   y ˆ  t  SWn t k
 r n Xˆ ƒ  }  ˆ  t  <|  S(   N(   t   Truet   KeyError(   t   value(   t   cacheR   (    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyt   wrapperL   s    c           ` s   ˆ  j  t d  ƒ d  S(   N(   t   popR   R   (    (   R   (    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyt   clear_cacheU   s    (   R   R"   (   R   R    R"   (    (   R   R   sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyR	   D   s
    		c           B` sM   e  Z d  Z d „  Z d „  Z e s6 e d „  ƒ Z n  d „  Z d d „ Z
 RS(   sM   
    decorator which invokes method once, then replaces attr with result
    c         C` s%   | |  _  | j |  _ | j |  _ d  S(   N(   R   R   R   (   R   R   (    (    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyR   _   s    	c         C` s6   | d  k r |  S|  j | ƒ } t | |  j | ƒ | S(   N(   R   R   t   setattrR   (   R   R   R   R   (    (    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyR   d   s
    c         C` s   |  j  S(   s	   py2 alias(   R   (   R   (    (    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyR   m   s    c         C` s   | j  j |  j d ƒ d S(   s€   
        class-level helper to clear stored value (if any).

        usage: :samp:`type(self).{attr}.clear_cache(self)`
        N(   t   __dict__R!   R   R   (   R   R   (    (    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyR"   r   s    c         C` s   | j  j |  j | ƒ S(   s€   
        class-level helper to peek at stored value

        usage: :samp:`value = type(self).{attr}.clear_cache(self)`
        (   R$   t   getR   (   R   R   t   default(    (    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyt
   peek_cachez   s    N(   R   R   R   R   R   R   R   R   R"   R   R'   (    (    (    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyR
   [   s   			c         ` s   ˆ d k rk ˆ  r d ‰ n d ‰ ˆ r4 ˆ d 7‰ n  ˆ rG ˆ d 7‰ n  ˆ r^ ˆ d ˆ 7‰ n  ˆ d 7‰ n  ‡  ‡ ‡ ‡ ‡ ‡ ‡ f d †  } | S(	   sb  decorator to deprecate a function.

    :arg msg: optional msg, default chosen if omitted
    :kwd deprecated: version when function was first deprecated
    :kwd removed: version when function will be removed
    :kwd replacement: alternate name / instructions for replacing this function.
    :kwd updoc: add notice to docstring (default ``True``)
    s5   the method %(mod)s.%(klass)s.%(name)s() is deprecateds-   the function %(mod)s.%(name)s() is deprecateds    as of Passlib %(deprecated)ss,   , and will be removed in Passlib %(removed)ss   , use %s insteadt   .c      	   ` s¦  ˆ o t  ˆ  t ƒ ‰ ˆ r3 ˆ  j d  t ƒ j ‰  n  t d ˆ pE ˆ  j d ˆ  j d ˆ d ˆ ƒ ‰ ˆ r ‡  ‡ ‡ ‡ f d †  } n ˆ ˆ ‰ ‡  ‡ f d †  } t	 | ˆ  ƒ ˆ
 rˆ s¼ ˆ r| j
 rd | j
 k rˆ pÝ d } ˆ sì ˆ	 rG| d	 7} ˆ r| d
 ˆ f 7} n  ˆ	 r:ˆ r)| d 7} n  | d ˆ	 7} n  | d 7} n  | j
 j d ƒ j d ƒ st| j
 d 7_
 n  | j
 d | f 7_
 n  ˆ r¢t | ƒ } n  | S(   Nt   modt   namet
   deprecatedt   removedc          ` si   ˆ j  ƒ  } ˆ r |  d n
 |  d j } | j d | j d | j ƒ t ˆ | t d d ƒˆ  |  | Ž  S(   Ni    t   klassR)   t
   stackleveli   (   t   copyt	   __class__t   updateR   R   R   t   DeprecationWarning(   t   argst   kwdst   tmpR-   (   R   t   is_classmethodt   msgt   opts(    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyR    º   s
    c          ` s    t  ˆ t d d ƒˆ  |  | Ž  S(   NR.   i   (   R   R2   (   R3   R4   (   R   t   text(    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyR    Â   s    s   .. deprecated::t    s   
    s!   and will be removed in version %ss   , s   use %s insteadR(   t    s   
s   
.. deprecated:: %s
(   t
   isinstancet   classmethodR   R   t   typeR   t   dictR   R   R   R   t   stript   endswith(   R   R    t   txt(   t
   _is_methodR+   t   func_moduleR7   R,   t   replacementt   updoc(   R   R6   R8   R9   sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyt   build®   s>    		

N(   R   (   R7   R+   R,   RF   RE   RC   RD   RG   (    (   RC   R+   RD   R7   R,   RE   RF   sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyR   —   s    	!*c         C` s   t  |  | | | | d t ƒS(   sZ  decorator to deprecate a method.

    :arg msg: optional msg, default chosen if omitted
    :kwd deprecated: version when method was first deprecated
    :kwd removed: version when method will be removed
    :kwd replacement: alternate name / instructions for replacing this method.
    :kwd updoc: add notice to docstring (default ``True``)
    RC   (   R   R   (   R7   R+   R,   RF   RE   (    (    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyR   Ú   s    
(   R   t
   __future__R    R   R   t   loggingt	   getLoggerR   t   logt	   functoolsR   R   R   t   warningsR   t   passlib.utils.compatR   t   __all__t   objectR   R   R	   R
   R   R   t   FalseR   R   (    (    (    sN   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/utils/decor.pyt   <module>   s,   		<A