
    \jR(                        d dl Z d dlZd dlZd dlmZmZ d dlmZmZm	Z	 d dl
mZmZmZmZmZmZ  e j"                  d      Zdedef   ded	dfd
Z G d de      Z G d dej.                        Z e       Z G d de      Z e       Z[ G d de      Zd#dZ ed d      Z ed d      Z  ed d      Z! ed d      Z"d	e#fdZ$ed	e#fd       Z%ed	e#fd       Z&ed	e#fd        Z'ed	e#fd!       Z(d	edef   fd"Z)y)$    N)partialupdate_wrapper)getfullargspec
isfunctionismethod)AnyCallableListOptionalTupleUnionrulesfn.msgreturnc                     t        |       }t        |d      r^|j                  sy |j                  r9t	        |j                        t	        |j                  j                               kD  rt        |      y y )N
kwonlyargs)r   hasattrr   kwonlydefaultslenkeys	TypeError)r   r   argspecs      :/root/env/lib/python3.12/site-packages/rules/predicates.pyassert_has_kwonlydefaultsr      sm    R Gw%!!%%W-?-?)@3""'')D
 *
 C. *
 &    c                   2     e Zd Zdeedf   ddf fdZ xZS )Contextargs.r   Nc                 8    t         t        |           || _        y N)superr   __init__r   )selfr   	__class__s     r   r#   zContext.__init__   s    gt%'	r   )__name__
__module____qualname__r   r   r#   __classcell__)r%   s   @r   r   r      s#    U38_   r   r   c                       e Zd ZddZy)localcontextNc                     g | _         y r!   )stackr$   s    r   r#   zlocalcontext.__init__   s	    $&
r   )r   N)r&   r'   r(   r#    r   r   r+   r+      s    'r   r+   c                       e Zd ZdefdZeZy)NoValueSentinelr   c                      yNFr/   r.   s    r   __bool__zNoValueSentinel.__bool__%   s    r   N)r&   r'   r(   boolr4   __nonzero__r/   r   r   r1   r1   $   s    $  Kr   r1   c            	       
   e Zd ZU edef   ed<   eed<   eed<   eed<   	 	 dde	d edef   f   de
e   deddfd	Zdefd
ZdefdZdefdZede
e   fd       ZeefdededefdZddZddZddZddZd Zde
e   fdZy)	Predicate.r   num_argsvar_argsnameNbindr   c                 B   t        |      sJ d       |}t        |t              r;|j                  |j                  |j
                  |xs |j                  f\  }}}}|}npt        |t              rw|j                  }t        |      }|j                  d u}t        |j                        t        |j                        z
  }t        |      r|dz  }|j                  j                  }nt        |      r2t        |      }|j                  d u}t        |j                        dz
  }nt        |      r/t        |      }|j                  d u}t        |j                        }nrt        |t               rWt#        |d      }t        |      }|j                  d u}t        |j                        dz
  }|xs t%        |      j                  }nt'        d      |r|dz  }t)        |d       |dk  sJ d       || _        || _        || _        |xs |j                  | _        || _        y )Nz$The given predicate is not callable.   __call__zIncompatible predicate.zBThe given predicate is missing defaults for keyword-only arguments   )callable
isinstancer8   r   r9   r:   r;   r   funcr   varargsr   r   r   r&   r   objectgetattrtyper   r   r<   )r$   r   r;   r<   innerfnr9   r:   r   s           r   r#   zPredicate.__init__6   s    |CCC|b)$	1-GXx BG$ggG$W-Gd2H7<<(3rww<7H A77##Db\$R(Gd2H7<<(1,H^$R(Gd2H7<<(HF#b*-G$W-Gd2H7<<(1,H,48,,D 566MH!P	
 1}777}  'BKK		r   c           
      v    dt        |       j                  dt        |       dt        t	        |             dS )N<:z object at >)rG   r&   strhexidr.   s    r   __repr__zPredicate.__repr__p   s&    )-d)<)<c$iRPTXWWr   c                     | j                   S r!   r;   r.   s    r   __str__zPredicate.__str__s   s    yyr   c                 j    | j                   r | j                  | g|i |S  | j                  |i |S r!   )r<   r   )r$   r   kwargss      r   r?   zPredicate.__call__v   s<    
 9947741$1&11tww'''r   c                 H    	 t         j                  d   S # t        $ r Y yw xY w)a  
        The currently active invocation context. A new context is created as a
        result of invoking ``test()`` and is only valid for the duration of
        the invocation.

        Can be used by predicates to store arbitrary data, eg. for caching
        computed values, setting flags, etc., that can be used by predicates
        later on in the chain.

        Inside a predicate function it can be used like so::

            >>> @predicate
            ... def mypred(a, b):
            ...     value = compute_expensive_value(a)
            ...     mypred.context['value'] = value
            ...     return True
            ...

        Other predicates can later use stored values::

            >>> @predicate
            ... def myotherpred(a, b):
            ...     value = myotherpred.context.get('value')
            ...     if value is not None:
            ...         return do_something_with_value(value)
            ...     else:
            ...         return do_something_without_value()
            ...

        N)_contextr-   
IndexErrorr.   s    r   contextzPredicate.context   s)    @	>>"%% 		s    	!!objtargetc                 Z   t        d ||fD              }t        j                  j                  t	        |             t
        j                  d|        	 t         | j                  |       t        j                  j                          S # t        j                  j                          w xY w)z<
        The canonical method to invoke predicates.
        c              3   2   K   | ]  }|t         us|  y wr!   )NO_VALUE).0args     r   	<genexpr>z!Predicate.test.<locals>.<genexpr>   s     ISS5HSIs   z
Testing %s)
tuplerX   r-   appendr   loggerdebugr5   _applypop)r$   r[   r\   r   s       r   testzPredicate.test   su     IS&MIIgdm,\4(	!T*+NN HNN s   B
 
 B*c                 l      fd} t               |d j                  dj                  d      S )Nc                  F    j                  t        j                  |       S r!   )_combineoperatorand_r   otherr$   s    r   ANDzPredicate.__and__.<locals>.AND   s    ==t<<r   (z & )rG   r;   )r$   rp   rq   s   `` r   __and__zPredicate.__and__   s*    	= tDz#diiDEEr   c                 l      fd} t               |d j                  dj                  d      S )Nc                  F    j                  t        j                  |       S r!   )rl   rm   or_ro   s    r   ORzPredicate.__or__.<locals>.OR       ==d;;r   rr   z | rs   rt   )r$   rp   ry   s   `` r   __or__zPredicate.__or__   s*    	< tDz"TYY

CDDr   c                 l      fd} t               |d j                  dj                  d      S )Nc                  F    j                  t        j                  |       S r!   )rl   rm   xorro   s    r   XORzPredicate.__xor__.<locals>.XOR   rz   r   rr   z ^ rs   rt   )r$   rp   r   s   `` r   __xor__zPredicate.__xor__   s*    	< tDz#diiDEEr   c                       fd} j                   j                  d      r j                   dd  }nd j                   z   } t               ||      S )Nc                  0     j                   |  }|d S | S r!   )rg   )r   resultr$   s     r   INVERTz$Predicate.__invert__.<locals>.INVERT   s$     T[[$'F!>496z9r   ~r>   )r;   
startswithrG   )r$   r   r;   s   `  r   
__invert__zPredicate.__invert__   sK    	: 99$99QR=D?DtDz&$''r   c                      | j                   | }| |j                   | S |t        j                  u r|sy|t        j                  u r|ry |j                   | }||S  |||      S )NFT)rg   rm   rn   rx   )r$   rp   opr   self_resultother_results         r   rl   zPredicate._combine   sv    !dkk4(5<<&& {8<<K#u||T*+|,,r   c                 R   | j                   r|}nF| j                  t        |      kD  r|d| j                  t        |      z
  z  z   }n|d | j                   }| j                  r| f|z   } | j                  | }|d n
t        |      }t        j                  d| |d       |S |       |S )Nr!   z	  %s = %sskipped)r:   r9   r   r<   r   r5   re   rf   )r$   r   callargsr   s       r   rg   zPredicate._apply   s     ==H]]SY&gT)BCCHOdmm,H99w)H(#T&\[$V^	P JPPr   r3   )r   r8   )r&   r'   r(   r	   r   __annotations__intr5   rM   r   r   r#   rP   rS   r?   propertyr   rZ   r_   ri   ru   r{   r   r   rl   rg   r/   r   r   r8   r8   0   s    cMN
I
 #	8+xS1128 sm8 	8
 
8tX# X (3 ( "'* " "H 'h 
! 
! 
!4 
!FEF	(-"x~ r   r8   c                 L    st        |       s| d} fd}| r ||       S |S )au  
    Decorator that constructs a ``Predicate`` instance from any function::

        >>> @predicate
        ... def is_book_author(user, book):
        ...     return user == book.author
        ...

        >>> @predicate(bind=True)
        ... def is_book_author(self, user, book):
        ...     if self.context.args:
        ...         return user == book.author
    Nc                 ^    t        | t              r| S t        | fi }t        ||        |S r!   )rB   r8   r   )r   pr;   optionss     r   innerzpredicate.<locals>.inner  s2    b)$Ib$*'*q"r   )rA   )r   r;   r   r   s    `` r   	predicater      s1      
Ryr   c                       yNTr/   r/   r   r   <lambda>r         r   always_truerR   c                       yr3   r/   r/   r   r   r   r     r   r   always_falsec                       yr   r/   r/   r   r   r   r     r   r   always_allowc                       yr3   r/   r/   r   r   r   r     r   r   always_denyc                 6    t        | d      xs t        | d      S )Nr4   r6   )r   )r[   s    r   is_bool_liker     s    3
#BwsM'BBr   c                 ~    t        | d      syt        | j                        s| j                         S | j                  S )Nis_authenticatedF)r   r   r   users    r   r   r     s9    4+,--.$$&&   r   c                 4    t        | d      sy| j                  S )Nis_superuserF)r   r   r   s    r   r   r   (  s    4(r   c                 4    t        | d      sy| j                  S )Nis_staffF)r   r   r   s    r   r   r   /  s    4$==r   c                 4    t        | d      sy| j                  S )N	is_activeF)r   r   r   s    r   r   r   6  s    4%>>r   c                       t               dkD  sJ d       t               dkD  r	 d d dz   }n }ddj                  |      z  }t        |      dt        f fd       }|S )	Nr   z(You must provide at least one group name   )z...zis_group_member:%s,r   c                     t        | d      syt        | d      s+t        | j                  j                  dd            | _        t              j                  | j                        S )NgroupsF_group_names_cacher;   T)flat)r   setr   values_listr   issubset)r   r   s    r   r   zis_group_member.<locals>.fnG  sW    tX&t12&)$++*A*A&t*A*T&UD#6{##D$;$;<<r   )r   joinr   r5   )r   gr;   r   s   `   r   is_group_memberr   =  so    v;?FFF?
6{Q2AJ!#((1+-Dt_=D = = Ir   )NN)*loggingrm   	threading	functoolsr   r   inspectr   r   r   typingr   r	   r
   r   r   r   	getLoggerre   rM   r   dictr   localr+   rX   rE   r1   r_   r8   r   r   r   r   r   r5   r   r   r   r   r   r   r/   r   r   <module>r      sf      - 8 8 > >			7	#!(38"4 !3 !4 !d '9?? '
 >f   DB =9^<N;M:C C !d ! ! $   d   t  c 2 r   