
    Ij=                     D   d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dl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  ej        e          Zd
 Z G d d          Z G d d          Zdeeef         fdZdeeef         fdZdeeef         fdZdS )    )contextmanagerN)Path)Callable)Optional)Union)_utils)_interprocess_mechanism)%_interprocess_reader_writer_mechanismc                    	 t          j        |            dS # t          $ r\}|j        t          j        k    r&t           j                            |           s Y d}~dS |j        t          j        k    rY d}~dS  d}~ww xY w)zfCreate a directory (and any ancestor directories required).

    :param path: Directory to create
    TNF)osmakedirsOSErrorerrnoEEXISTpathisdirEISDIR)r   es     `/workspace/show-city-briefing-agent/.venv/lib/python3.11/site-packages/fasteners/process_lock.py_ensure_treer   %   s    

D t  	 	 	7el""7==&& uuuuuW$$55555	s     
A>5A9A98A99A>c                       e Zd ZdZdZdZej        dfdee	e
f         deegdf         deej                 fdZd	 Zd
 Z	 	 	 	 ddedededee         def
dZd Zd Zd Zd Zd Zd Zd ZdS )InterProcessLockzAn interprocess lock.皙?{Gz?Nr   
sleep_funcloggerc                     d| _         t          j        |          | _        d| _        || _        t          j        |t                    | _        dS )a   
        args:
            path:
                Path to the file that will be used for locking.
            sleep_func:
                Optional function to use for sleeping.
            logger:
                Optional logger to use for logging.
        NF)	lockfiler   canonicalize_pathr   acquiredr   pick_first_not_noneLOGr   selfr   r   r   s       r   __init__zInterProcessLock.__init__@   sC     ,T22	$0==    c                 <   	 |                                   dS # t          t          f$ rr}|j        t          j        t          j        fv r/|r|                                rY d }~dS t          j                    t          j
        d| j        |dz            d }~ww xY w)NTFz9Unable to acquire lock on `%(path)s` due to %(exception)s)r   	exception)trylockIOErrorr   r   EACCESEAGAINexpiredr   
RetryAgain	threadingThreadErrorr   )r$   blockingwatchr   s       r   _try_acquirezInterProcessLock._try_acquireS   s    	LLNNN  4 ! 	/ 	/ 	/w5<666 .5==?? . 55555 +---+ -= 9=	=>-. -.-. / / /	/s    B5B$2BBc                    t           j                            | j                  }|r7t          |          }|r&| j                            t          j        d|           | j        | j        j	        rt          | j        d          | _        d S d S )NCreated lock base path `%s`a)r   r   dirnamer   r   logr   BLATHERr   closedopenr$   basedirmade_basedirs      r   _do_openzInterProcessLock._do_openg   s    '//$),, 	H'00L H =wH H H
 = DM$8  C00DMMM ! r&   Tr1   delay	max_delaytimeoutreturnc                    |dk     rt          d          ||dk     rt          d          ||k    r|}|                                  t          j        |          }t          j        ||| j        |          }|5   || j        ||          }ddd           n# 1 swxY w Y   |sdS d| _        | j        	                    t          j
        d	| j        |                                |j                   dS )
a,  Attempt to acquire the lock.

        Args:
            blocking:
                Whether to wait to try to acquire the lock.
            delay:
                When `blocking`, starting delay as well as the delay increment
                (in seconds).
            max_delay:
                When `blocking` the maximum delay in between attempts to
                acquire (in seconds).
            timeout:
                When `blocking`, maximal waiting time (in seconds).

        Returns:
            whether or not the acquisition succeeded
        r   +Delay must be greater than or equal to zeroN-Timeout must be greater than or equal to zerodurationr   r2   FTHAcquired file lock `%s` after waiting %0.3fs [%s attempts were required])
ValueErrorr?   r   	StopWatchRetryr   r3   r    r   r8   r9   r   elapsedattempts)r$   r1   r@   rA   rB   r2   rgottens           r   acquirezInterProcessLock.acquiret   sN   , 199JKKK7Q;;LMMMII '222L	$(O5B B B 	; 	;Qt((E::F	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	5 DMKOOFN78<	!MMOOQZ9 9 9 4s   =BB #B c                 X    | j         "| j                                          d | _         d S d S N)r   closer$   s    r   	_do_closezInterProcessLock._do_close   s1    =$M!!! DMMM %$r&   c                 j    |                                  }|st          j        d| j        z            | S )NFUnable to acquire a file lock on `%s` (when used as a context manager))rR   r/   r0   r   )r$   rQ   s     r   	__enter__zInterProcessLock.__enter__   sG     	I' )<>Bi)H I I I r&   c                    | j         st          j        d          	 |                                  d| _         	 |                                  | j                            t          j        d| j	                   dS # t          $ r$ | j                            d| j	                   Y dS w xY w# t          $ r=}d| j	        f}| j                            |           t          j        |          |d}~ww xY w)z%Release the previously acquired lock.z#Unable to release an unaquired lockF*Unlocked and closed file lock open on `%s`.Could not close the file handle opened on `%s`1Could not unlock the acquired lock opened on `%s`N)r    r/   r0   unlockrW   r   r8   r   r9   r   r*   r(   	Exception)r$   r   msgs      r   releasezInterProcessLock.release   s1   } 	O'(MNNN	4KKMMM "DM4   
 !()-4 4 4 4 4	  D D D%% '89=D D D D D DD  	4 	4 	4EtyPCK!!#&&&',,!3	4s(   B+ A: :*B('B(+
C258C--C2c                 .    |                                   d S rT   )rb   )r$   exc_typeexc_valexc_tbs       r   __exit__zInterProcessLock.__exit__   s    r&   c                 J    t           j                            | j                  S rT   )r   r   existsrV   s    r   ri   zInterProcessLock.exists   s    w~~di(((r&   c                 8    t          j        | j                   d S rT   )r	   r)   r   rV   s    r   r)   zInterProcessLock.trylock   s    '66666r&   c                 8    t          j        | j                   d S rT   )r	   r_   r   rV   s    r   r_   zInterProcessLock.unlock   s    &t}55555r&   Tr   r   N)__name__
__module____qualname____doc__	MAX_DELAYDELAY_INCREMENTtimesleepr   r   strr   floatr   loggingLoggerr%   r3   r?   boolrR   rW   rZ   rb   rg   ri   r)   r_    r&   r   r   r   :   s]       IO 8<z48> >T3Y'>%ugtm4> "'.1> > > >&  (1 1 1 "&##&+/	* *** !* "%	* 59	* * * *X! ! !
  4 4 4,  ) ) )7 7 76 6 6 6 6r&   r   c                      e Zd ZdZdZdZej        dfdee	e
f         deegdf         deej                 fdZedd	            Zedd
            Zd Zd Z	 	 	 	 ddededededef
dZ	 	 	 	 ddededededef
dZ	 	 	 ddZd Zd Zd ZdS )InterProcessReaderWriterLockz$An interprocess readers writer lock.r   r   Nr   r   r   c                     d| _         t          j        |          | _        || _        t          j        |t                    | _        dS )a   
        Args:
            path:
                Path to the file that will be used for locking.
            sleep_func:
                Optional function to use for sleeping.
            logger:
                Optional logger to use for logging.
        N)r   r   r   r   r   r!   r"   r   r#   s       r   r%   z%InterProcessReaderWriterLock.__init__   s<     ,T22	$0==r&   c              #      K   |                      d||d           	 dV  |                                  dS # |                                  w xY w)z&Context manager that grans a read lockTNr1   r@   rA   rB   )acquire_read_lockrelease_read_lock)r$   r@   rA   s      r   	read_lockz&InterProcessReaderWriterLock.read_lock   so       	E)2D 	 	B 	B 	B	%EEE""$$$$$D""$$$$s	   7 Ac              #      K   |                      d||d          }|st          j        d| j        z            	 dV  |                                  dS # |                                  w xY w)z'Context manager that grans a write lockTNr   rY   )acquire_write_lockr/   r0   r   release_write_lock)r$   r@   rA   rQ   s       r   
write_lockz'InterProcessReaderWriterLock.write_lock   s       (($e3<d ) L L  	I' )<>Bi)H I I I	&EEE##%%%%%D##%%%%s   A A+c                    	 t          j        | j        |          }n?# t          $ r2}t	          j        d                    | j        |                    d }~ww xY w|rdS |r|                                rdS t          j
                    )Nz'Unable to acquire lock on {} due to {}!TF)r
   r)   r   r`   r/   r0   formatr   r-   r   r.   )r$   r1   r2   	exclusiverQ   r   s         r   r3   z)InterProcessReaderWriterLock._try_acquire  s    	P:B4=R[\\FF 	P 	P 	P'9@@ANNP P P	P  	4 	5==?? 	5!!!s    
A-AAc                    t           j                            | j                  }|r7t          |          }|r&| j                            t          j        d|           | j         t          j
        | j                  | _        d S d S )Nr5   )r   r   r7   r   r   r8   r   r9   r   r
   
get_handler<   s      r   r?   z%InterProcessReaderWriterLock._do_open  s    '//$),, 	H'00L H =wH H H= ALTYWWDMMM ! r&   Tr1   r@   rA   rB   rC   c                 6    |                      ||||d          S )a3  Attempt to acquire a reader's lock.

        Args:
            blocking:
                Whether to wait to try to acquire the lock.
            delay:
                When `blocking`, starting delay as well as the delay increment
                (in seconds).
            max_delay:
                When `blocking` the maximum delay in between attempts to
                acquire (in seconds).
            timeout:
                When `blocking`, maximal waiting time (in seconds).

        Returns:
            whether or not the acquisition succeeded
        Fr   _acquirer$   r1   r@   rA   rB   s        r   r   z.InterProcessReaderWriterLock.acquire_read_lock  s     , }}XuiE}RRRr&   c                 6    |                      ||||d          S )a3  Attempt to acquire a writer's lock.

        Args:
            blocking:
                Whether to wait to try to acquire the lock.
            delay:
                When `blocking`, starting delay as well as the delay increment
                (in seconds).
            max_delay:
                When `blocking` the maximum delay in between attempts to
                acquire (in seconds).
            timeout:
                When `blocking`, maximal waiting time (in seconds).

        Returns:
            whether or not the acquisition succeeded
        Tr   r   r   s        r   r   z/InterProcessReaderWriterLock.acquire_write_lock6  s     , }}XuiD}QQQr&   c                    |dk     rt          d          ||dk     rt          d          ||k    r|}|                                  t          j        |          }t          j        ||| j        |          }|5   || j        |||          }d d d            n# 1 swxY w Y   |sdS | j                            t          j	        d| j
        |                                |j                   dS )	Nr   rE   rF   rG   rI   FrJ   T)rK   r?   r   rL   rM   r   r3   r   r8   r9   r   rN   rO   )	r$   r1   r@   rA   rB   r   r2   rP   rQ   s	            r   r   z%InterProcessReaderWriterLock._acquireN  sZ    199JKKK7Q;;LMMMII '222L	$(O5B B B 	F 	FQt((E9EEF	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	5KOOFN78<	!MMOOQZ9 9 9 4s   =BB!$B!c                 X    | j         "t          j        | j                    d | _         d S d S rT   )r   r
   close_handlerV   s    r   rW   z&InterProcessReaderWriterLock._do_closeg  s0    =$1>t}MMM DMMM %$r&   c                 ~   	 t          j        | j                   	 |                                  | j                            t          j        d| j                   dS # t          $ r$ | j        
                    d| j                   Y dS w xY w# t          $ r$ | j        
                    d| j                   Y dS w xY w)zRelease the writer's lock.r\   r]   r^   Nr
   r_   r   rW   r   r8   r   r9   r   r*   r(   rV   s    r   r   z/InterProcessReaderWriterLock.release_write_lockl     	418GGG
4   
 !()-4 4 4 4 4	  D D D%% '89=D D D D D DD  	9 	9 	9K!! #-.2i9 9 9 9 9 9	9"   B A *B
B*B<;B<c                 ~   	 t          j        | j                   	 |                                  | j                            t          j        d| j                   dS # t          $ r$ | j        
                    d| j                   Y dS w xY w# t          $ r$ | j        
                    d| j                   Y dS w xY w)zRelease the reader's lock.r\   r]   r^   Nr   rV   s    r   r   z.InterProcessReaderWriterLock.release_read_lock~  r   r   )r   r   rl   )Tr   r   NT)rm   rn   ro   rp   rq   rr   rs   rt   r   r   ru   r   rv   r   rw   rx   r%   r   r   r   r3   r?   ry   r   r   r   rW   r   r   rz   r&   r   r|   r|      s       ..IO 8<z48> >T3Y'>%ugtm4> "'.1> > > >$ % % % ^% & & & ^& " " "X X X ,0)--0+/	S S$(S!&S &+S $)	S 59	S S S S2 -1*..1,0	R R%)R"'R ',R %*	R 6:	R R R R0 !%'*)-   2! ! !
4 4 4$4 4 4 4 4r&   r|   r   c                 0    t          |           fd}|S )zAcquires & releases an interprocess  **write** lock around the call into
    the decorated function

    Args:
        path: Path to the file used for locking.
    c                 J     t          j                    fd            }|S )Nc                  p                                     5   | i |cd d d            S # 1 swxY w Y   d S rT   )r   argskwargsflocks     r   wrapperz=interprocess_write_locked.<locals>.decorator.<locals>.wrapper  s    "" * *q$)&))* * * * * * * * * * * * * * * * * *   +//	functoolswrapsr   r   r   s   ` r   	decoratorz,interprocess_write_locked.<locals>.decorator  >    				* 	* 	* 	* 	* 
		* r&   r|   r   r   r   s     @r   interprocess_write_lockedr     3     (--D     r&   c                 0    t          |           fd}|S )zAcquires & releases an interprocess **read** lock around the call into
    the decorated function

    Args:
        path: Path to the file used for locking.
    c                 J     t          j                    fd            }|S )Nc                  p                                     5   | i |cd d d            S # 1 swxY w Y   d S rT   )r   r   s     r   r   z<interprocess_read_locked.<locals>.decorator.<locals>.wrapper  s    !! * *q$)&))* * * * * * * * * * * * * * * * * *r   r   r   s   ` r   r   z+interprocess_read_locked.<locals>.decorator  r   r&   r   r   s     @r   interprocess_read_lockedr     r   r&   c                 0    t          |           fd}|S )zAcquires & releases an interprocess lock around the call to the
    decorated function.

    Args:
        path: Path to the file used for locking.
   c                 J     t          j                    fd            }|S )Nc                  L    5   | i |cd d d            S # 1 swxY w Y   d S rT   rz   r   s     r   r   z7interprocess_locked.<locals>.decorator.<locals>.wrapper  s     * *q$)&))* * * * * * * * * * * * * * * * * *s   r   r   s   ` r   r   z&interprocess_locked.<locals>.decorator  r   r&   )r   r   s     @r   interprocess_lockedr     s3     D!!D     r&   )
contextlibr   r   r   rw   r   pathlibr   r/   rs   typingr   r   r   	fastenersr   fasteners.process_mechanismr	   r
   	getLoggerrm   r"   r   r   r|   ru   r   r   r   rz   r&   r   <module>r      s  $ & % % % % %       				                                    ? ? ? ? ? ? M M M M M Mg!!  *T6 T6 T6 T6 T6 T6 T6 T6n}4 }4 }4 }4 }4 }4 }4 }4@E$)$4    (5s#3    (eD#I.      r&   