
    |h                       d Z ddlmZ ddlZddlmZ ddlmZ ddlmZ ddlm	Z	 ddlm
Z
 dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ  ededef         Z G d de      Z G d de      Z G d d      Zy)z9State tracking utilities used by :class:`_orm.Session`.

    )annotationsN)Enum)Any)Callable)cast)Iterator)NoReturn)Optional)Tuple)TypeVar)Union   )exc)util)Literal_F.)boundc                      e Zd Zy)_StateChangeStateN)__name__
__module____qualname__     ]/var/www/html/fluten_python/venv/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.pyr   r   !   s    r   r   c                      e Zd ZdZdZdZy)_StateChangeStates   r      N)r   r   r   ANY	NO_CHANGECHANGE_IN_PROGRESSr   r   r   r   r   %   s    
CIr   r   c                      e Zd ZU dZej
                  Zded<   ej                  Z	ded<   dZ
ded<   	 	 	 	 	 	 ddZe	 	 	 	 	 	 dd	       Zej                  dd
       Zy)_StateChangea!  Supplies state assertion decorators.

    The current use case is for the :class:`_orm.SessionTransaction` class. The
    :class:`_StateChange` class itself is agnostic of the
    :class:`_orm.SessionTransaction` class so could in theory be generalized
    for other systems as well.

    r   _next_state_stateNzOptional[Callable[..., Any]]_current_fnc                <    t        j                  d| d|d      )NzCan't run operation 'z()' when Session is in state iscecode)sa_excIllegalStateChangeError)selfoperation_namestates      r   _raise_for_prerequisite_statez*_StateChange._raise_for_prerequisite_state9   s1     ,,#N#3 4 )%
 	
r   c                    |sJ d       |t         j                  ut        d|      t         j                  ut        j
                  dfd       }|S )a  Method decorator declaring valid states.

        :param prerequisite_states: sequence of acceptable prerequisite
         states.   Can be the single constant _State.ANY to indicate no
         prerequisite state

        :param moves_to: the expected state at the end of the method, assuming
         no exceptions raised.   Can be the constant _State.NO_CHANGE to
         indicate state should not change at the end of the method.

        zno prequisite states sentzTuple[_StateChangeState, ...]c                   |j                   }
r |vr|j                  | j                  |       |j                  }|j                  }	rn|}|t
        j                  ur	r||ur|rV|t
        j                  t
        j                  fv r4t        j                  d| j                   d|j                   dd      t        j                  d| j                   dd|d      | |_        t
        j                  |_        	  | |g|i |}|j                   |u r|||_        ||_        S |j                   |u r(t        j                  d| j                   d	d
d      |r>t        j                  d|j                   d| j                   d|j                   d      t        j                  d| j                   d|j                   d      #   xY w# ||_        ||_        w xY w)NzMethod 'z"()' can't be called here; method 'zN()' is already in progress and this would cause an unexpected state change to r)   r*   zCant run operation 'z()' here; will move to state z where we are expecting z()' failed to change state to z as expectedzWhile method 'z()' was running, method 'z)()' caused an unexpected state change to )r&   r1   r   r%   r'   r   r    r!   r"   r,   r-   )fnr.   argkwcurrent_state
next_stateexisting_fnexpect_state	ret_valueexpect_state_changehas_prerequisite_statesmoves_toprerequisite_state_collections            r   _goz(_StateChange.declare_states.<locals>._go_   sB    KKM (!)FF222;;N))J**K':8L "4"8"88'l2:&00&992 $ !88"2;;- 0##.#7#7"8 9++3,8 $  !88.r{{m <..6\ :%%/N4 $	   "D1DDD!/t0c0R0	 ;;,.$4 $. #. 3 ;;-/ 88"2;;- 0&\7 $	  ! 88()=)=(> ?##%;;- 0++/;;/	;
 $  !88"2;;- 0++/;;/;# /: $. #. s%   G G /B'G GG G,)
r4   r   r.   r   r5   r   r6   r   returnr   )r   r    r   r!   r   	decorator)clsprerequisite_statesr>   r@   r<   r=   r?   s     ` @@@r   declare_statesz_StateChange.declare_statesB   so    & #?$??"'9'='== 	  )-+-@)
% '.@.J.JJ	K	/ 
K	/Z 
r   c              #  :  K   | j                   t        j                  u sJ d       || _         	 d | j                  |ur$t	        j
                  d| j                  d      	 t        j                  | _         y#   xY w# t        j                  | _         w xY ww)zxcalled within a method that changes states.

        method must also use the ``@declare_states()`` decorator.

        zAUnexpected call to _expect_state outside of state-changing methodNzUnexpected state change to r)   r*   )r%   r   r"   r&   r,   r-   )r.   expecteds     r   _expect_statez_StateChange._expect_state   s      #5#H#HH 	
$	
H
 $
	E {{(*441$++A  +
  2DDD	  2DDDs-   +BA; 2B %B;A>>B BB)r/   strr0   r   rA   r	   )rD   zEUnion[Literal[_StateChangeStates.ANY], Tuple[_StateChangeState, ...]]r>   r   rA   zCallable[[_F], _F])rG   r   rA   zIterator[Any])r   r   r   __doc__r   r    r%   __annotations__r!   r&   r'   r1   classmethodrE   
contextlibcontextmanagerrH   r   r   r   r$   r$   +   s     &8%;%;K"; 2 < <F<04K-4
!
*;
	
 j
j
 $j 
j jX E Er   r$   )rJ   
__future__r   rM   enumr   typingr   r   r   r   r	   r
   r   r   r    r   r,   r   util.typingr   r   r   r   r$   r   r   r   <module>rT      su    #              !T#s(+,	 	* [E [Er   