a
    xd'                     @  s   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mZ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
ZG dd dZeG dd dZG dd deeZG dd deejZddgZdS )    )annotationsN)ABCabstractmethod)	dataclass)local)TracebackType)Any   )TimeoutZfilelockc                   @  sB   e Zd ZdZdddddZdddd	Zd
ddddddZdS )AcquireReturnProxyzDA context aware object that will release the lock file when exiting.BaseFileLockNone)lockreturnc                 C  s
   || _ d S Nr   )selfr    r   E/var/www/html/Ranjet/env/lib/python3.9/site-packages/filelock/_api.py__init__   s    zAcquireReturnProxy.__init__r   c                 C  s   | j S r   r   r   r   r   r   	__enter__   s    zAcquireReturnProxy.__enter__type[BaseException] | NoneBaseException | NoneTracebackType | Noneexc_type	exc_value	tracebackr   c                 C  s   | j   d S r   )r   releaser   r   r   r   r   r   r   __exit__   s    zAcquireReturnProxy.__exit__N)__name__
__module____qualname____doc__r   r   r"   r   r   r   r   r      s   r   c                   @  sB   e Zd ZU dZded< ded< ded< dZd	ed
< dZded< dS )FileLockContextzL
    A dataclass which holds the context for a ``BaseFileLock`` object.
    str	lock_filefloattimeoutintmodeNz
int | Nonelock_file_fdr   lock_counter)r#   r$   r%   r&   __annotations__r.   r/   r   r   r   r   r'   (   s   
r'   c                   @  s   e Zd ZdZdS )ThreadLocalFileContextzB
    A thread local version of the ``FileLockContext`` class.
    N)r#   r$   r%   r&   r   r   r   r   r1   A   s   r1   c                   @  s  e Zd ZdZd6ddddd	d
ddZddddZeddddZeddddZej	dd	dddZe
d	dddZe
d	dddZeddddZeddddZd7d dd"d#dd#dd$d%d&d'Zd8dd	d)d*d+Zd dd,d-Zd.d/d0d	d1d2d3Zd	dd4d5Zd S )9r   z+Abstract base class for a file lock object.  Tzstr | os.PathLike[Any]r*   r,   boolr   )r)   r+   r-   thread_localr   c                 C  s4   || _ t|||d}|r tntf i || _dS )a  
        Create a new lock object.

        :param lock_file: path to the file
        :param timeout: default timeout when acquiring the lock, in seconds. It will be used as fallback value in
        the acquire method, if no timeout value (``None``) is given. If you want to disable the timeout, set it
        to a negative value. A timeout of 0 means, that there is exactly one attempt to acquire the file lock.
        :param mode: file permissions for the lockfile.
        :param thread_local: Whether this object's internal context should be thread local or not.
        If this is set to ``False`` then the lock will be reentrant across threads.
        )r)   r+   r-   N)_is_thread_localosfspathr1   r'   _context)r   r)   r+   r-   r5   kwargsr   r   r   r   J   s    zBaseFileLock.__init__r   c                 C  s   | j S )z>:return: a flag indicating if this lock is thread local or not)r6   r   r   r   r   is_thread_localg   s    zBaseFileLock.is_thread_localr(   c                 C  s   | j jS )z:return: path to the lock file)r9   r)   r   r   r   r   r)   k   s    zBaseFileLock.lock_filec                 C  s   | j jS )za
        :return: the default timeout value, in seconds

        .. versionadded:: 2.0.0
        )r9   r+   r   r   r   r   r+   p   s    zBaseFileLock.timeoutzfloat | str)valuer   c                 C  s   t || j_dS )zd
        Change the default timeout value.

        :param value: the new value, in seconds
        N)r*   r9   r+   )r   r<   r   r   r   r+   y   s    c                 C  s   t dS )zjIf the file lock could be acquired, self._context.lock_file_fd holds the file descriptor of the lock file.NNotImplementedErrorr   r   r   r   _acquire   s    zBaseFileLock._acquirec                 C  s   t dS )z>Releases the lock and sets self._context.lock_file_fd to None.Nr=   r   r   r   r   _release   s    zBaseFileLock._releasec                 C  s   | j jduS )z

        :return: A boolean indicating if the lock file is holding the lock currently.

        .. versionchanged:: 2.0.0

            This was previously a method and is now a property.
        N)r9   r.   r   r   r   r   	is_locked   s    
zBaseFileLock.is_lockedc                 C  s   | j jS )zb
        :return: The number of times this lock has been acquired (but not yet released).
        )r9   r/   r   r   r   r   r/      s    zBaseFileLock.lock_counterN皙?)poll_intervallblockingzfloat | Noner   )r+   poll_intervalrC   rD   r   c          	      C  s@  |du r| j j}|dur0d}tj|tdd |}| j  jd7  _t| }| j}t	 }z| j
sttd|| |   | j
rtd|| qqX|du rtd	|| t|qXd
|  krt	 | k rn ntd|| t|qXd}t|||| t| qXW n, ty4   td
| j jd | j _ Y n0 t| dS )a_  
        Try to acquire the file lock.

        :param timeout: maximum wait time for acquiring the lock, ``None`` means use the default :attr:`~timeout` is and
         if ``timeout < 0``, there is no timeout and this method will block until the lock could be acquired
        :param poll_interval: interval of trying to acquire the lock file
        :param poll_intervall: deprecated, kept for backwards compatibility, use ``poll_interval`` instead
        :param blocking: defaults to True. If False, function will return immediately if it cannot obtain a lock on the
         first attempt. Otherwise, this method will block until the timeout expires or the lock is acquired.
        :raises Timeout: if fails to acquire lock within the timeout period
        :return: a context object that will unlock the file when the context is exited

        .. code-block:: python

            # You can use this method in the context manager (recommended)
            with lock.acquire():
                pass

            # Or use an equivalent try-finally construct:
            lock.acquire()
            try:
                pass
            finally:
                lock.release()

        .. versionchanged:: 2.0.0

            This method returns now a *proxy* object instead of *self*,
            so that it can be used in a with statement without side effects.

        Nz+use poll_interval instead of poll_intervall   )
stacklevelr	   z#Attempting to acquire lock %s on %szLock %s acquired on %sFz+Failed to immediately acquire lock %s on %sr   z"Timeout on acquiring lock %s on %sz2Lock %s not acquired on %s, waiting %s seconds ...r   )r9   r+   warningswarnDeprecationWarningr/   idr)   timeperf_counterrA   _LOGGERdebugr?   r
   sleepBaseExceptionmaxr   )	r   r+   rE   rC   rD   msglock_idlock_filename
start_timer   r   r   acquire   s<    (
 
zBaseFileLock.acquireF)forcer   c                 C  sf   | j rb| j jd8  _| jjdks&|rbt| | j }}td|| |   d| j_td|| dS )a*  
        Releases the file lock. Please note, that the lock is only completely released, if the lock counter is 0. Also
        note, that the lock file itself is not automatically deleted.

        :param force: If true, the lock counter is ignored and the lock is released in every case/
        r	   r   z#Attempting to release lock %s on %szLock %s released on %sN)rA   r9   r/   rK   r)   rN   rO   r@   )r   rX   rT   rU   r   r   r   r       s    zBaseFileLock.releasec                 C  s   |    | S )zE
        Acquire the lock.

        :return: the lock object
        )rW   r   r   r   r   r      s    zBaseFileLock.__enter__r   r   r   r   c                 C  s   |    dS )z
        Release the lock.

        :param exc_type: the exception type if raised
        :param exc_value: the exception value if raised
        :param traceback: the exception traceback if raised
        Nr    r!   r   r   r   r"     s    zBaseFileLock.__exit__c                 C  s   | j dd dS )z'Called when the lock object is deleted.T)rX   NrY   r   r   r   r   __del__  s    zBaseFileLock.__del__)r2   r3   T)NrB   )F)r#   r$   r%   r&   r   r;   propertyr)   r+   setterr   r?   r@   rA   r/   rW   r    r   r"   rZ   r   r   r   r   r   G   s<        M	r   )
__future__r   
contextlibloggingr7   rL   rH   abcr   r   Zdataclassesr   	threadingr   typesr   typingr   _errorr
   	getLoggerrN   r   r'   r1   ContextDecoratorr   __all__r   r   r   r   <module>   s*   
 V