a ]d"@sddlmZddlZddlZddlZddlZddlZddlmZm Z ddl m Z ddl m Z ddlmZddlmZed ZGd d d ZGd d d eejZd d gZdS)) annotationsN)ABCabstractmethod)Lock) TracebackType)Any)TimeoutZfilelockc@sBeZdZdZdddddZdddd Zd d d dd ddZdS)AcquireReturnProxyzDA context aware object that will release the lock file when exiting. BaseFileLockNone)lockreturncCs ||_dSNr )selfr r1/usr/lib/python3.9/site-packages/filelock/_api.py__init__szAcquireReturnProxy.__init__rcCs|jSrrrrrr __enter__szAcquireReturnProxy.__enter__type[BaseException] | NoneBaseException | NoneTracebackType | Noneexc_type exc_value tracebackrcCs|jdSr)r releaserrrrrrr__exit__szAcquireReturnProxy.__exit__N)__name__ __module__ __qualname____doc__rrr!rrrrr sr c@seZdZdZd0ddddddZed d d d Zedd d dZejdddddZe dd ddZ e dd ddZ edd ddZ d1dddddddddd d!Z d2ddd#d$d%Zdd d&d'Zd(d)d*dd+d,d-Zdd d.d/ZdS)3r z+Abstract base class for a file lock object.zstr | os.PathLike[Any]floatr ) lock_filetimeoutrcCs*t||_d|_||_t|_d|_dS)a Create a new lock object. :param lock_file: path to the file :param timeout: default timeout when acquiring the lock. 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. Nr)osfspath _lock_file _lock_file_fdr)r _thread_lock _lock_counter)rr(r)rrrr*s zBaseFileLock.__init__strrcCs|jS)z:return: path to the lock file)r,rrrrr(DszBaseFileLock.lock_filecCs|jS)zU :return: the default timeout value .. versionadded:: 2.0.0 )_timeoutrrrrr)IszBaseFileLock.timeoutz float | str)valuercCst||_dS)zX Change the default timeout value. :param value: the new value N)r'r1)rr2rrrr)RscCstdS)zbIf the file lock could be acquired, self._lock_file_fd holds the file descriptor of the lock file.NNotImplementedErrorrrrr_acquire[szBaseFileLock._acquirecCstdS)z6Releases the lock and sets self._lock_file_fd to None.Nr3rrrr_release`szBaseFileLock._releaseboolcCs |jduS)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)r-rrrr is_lockedes zBaseFileLock.is_lockedN皙?T)poll_intervallblockingz float | Noner )r) poll_intervalr:r;rc Cs|dur|j}|dur.d}tj|tdd|}|j|jd7_Wdn1sX0Yt|}|j}t }z|j,|j st d||| Wdn1s0Y|j rt d||qVqz|durt d ||t|jqzd |krt |kr6nnt d ||t|jqzd }t ||||t|qzWnPty|j"td |jd|_Wdn1s0YYn0t|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) stacklevelrz#Attempting to acquire lock %s on %szLock %s acquired on %sFz+Failed to immediately acquire lock %s on %srz"Timeout on acquiring lock %s on %sz2Lock %s not acquired on %s, waiting %s seconds ...r)r)warningswarnDeprecationWarningr.r/idr,time monotonicr8_LOGGERdebugr5r sleep BaseExceptionmaxr ) rr)r<r:r;msglock_id lock_filenameZ start_timerrracquireqsB(,& $ 2zBaseFileLock.acquireF)forcercCs|jl|jrd|jd8_|jdks*|rdt||j}}td|||d|_td||Wdn1sx0YdS)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/ rrz#Attempting to release lock %s on %szLock %s released on %sN)r.r8r/rBr,rErFr6)rrNrKrLrrrrszBaseFileLock.releasecCs ||S)zE Acquire the lock. :return: the lock object )rMrrrrrszBaseFileLock.__enter__rrrrcCs |dS)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 Nrr rrrr!s zBaseFileLock.__exit__cCs|jdddS)z'Called when the lock object is deleted.T)rNNrOrrrr__del__szBaseFileLock.__del__)r&)Nr9)F)r"r#r$r%rpropertyr(r)setterrr5r6r8rMrrr!rPrrrrr 's0 Q r )Z __future__r contextlibZloggingr*rCr?abcrr threadingrtypesrtypingr_errorr Z getLoggerrEr ContextDecoratorr __all__rrrrs"      N