!22 Make singleton class instance dict unique per subclass
From: @lixiaoyong1 Reviewed-by: @yangzhao_kl Signed-off-by: @yangzhao_kl
This commit is contained in:
commit
5091c904cb
@ -0,0 +1,83 @@
|
|||||||
|
From 3f6df70c77df591473e1d9b5efdd073ca49d9a5e Mon Sep 17 00:00:00 2001
|
||||||
|
From: nefrob <25070989+nefrob@users.noreply.github.com>
|
||||||
|
Date: Mon, 25 Mar 2024 12:54:25 -0400
|
||||||
|
Subject: [PATCH] Make singleton class instance dict unique per subclass (#318)
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Co-authored-by: Bernát Gábor <gaborjbernat@gmail.com>
|
||||||
|
|
||||||
|
Reference: https://github.com/tox-dev/filelock/commit/3f6df70c77df591473e1d9b5efdd073ca49d9a5e#diff-002cb54f397bb2d2e9abfc11353165034eeb49d2fd8aeba0195c241bf5c3daca
|
||||||
|
---
|
||||||
|
src/filelock/_api.py | 9 +++++++--
|
||||||
|
tests/test_filelock.py | 15 +++++++++++++++
|
||||||
|
2 files changed, 22 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/filelock/_api.py b/src/filelock/_api.py
|
||||||
|
index 49eaf1e..7bec3ce 100644
|
||||||
|
--- a/src/filelock/_api.py
|
||||||
|
+++ b/src/filelock/_api.py
|
||||||
|
@@ -8,7 +8,7 @@ import warnings
|
||||||
|
from abc import ABC, abstractmethod
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from threading import local
|
||||||
|
-from typing import TYPE_CHECKING, Any, ClassVar
|
||||||
|
+from typing import TYPE_CHECKING, Any
|
||||||
|
from weakref import WeakValueDictionary
|
||||||
|
|
||||||
|
from ._error import Timeout
|
||||||
|
@@ -77,7 +77,7 @@ class ThreadLocalFileContext(FileLockContext, local):
|
||||||
|
class BaseFileLock(ABC, contextlib.ContextDecorator):
|
||||||
|
"""Abstract base class for a file lock object."""
|
||||||
|
|
||||||
|
- _instances: ClassVar[WeakValueDictionary[str, BaseFileLock]] = WeakValueDictionary()
|
||||||
|
+ _instances: WeakValueDictionary[str, BaseFileLock]
|
||||||
|
|
||||||
|
def __new__( # noqa: PLR0913
|
||||||
|
cls,
|
||||||
|
@@ -100,6 +100,11 @@ class BaseFileLock(ABC, contextlib.ContextDecorator):
|
||||||
|
|
||||||
|
return instance # type: ignore[return-value] # https://github.com/python/mypy/issues/15322
|
||||||
|
|
||||||
|
+ def __init_subclass__(cls, **kwargs: dict[str, Any]) -> None:
|
||||||
|
+ """Setup unique state for lock subclasses."""
|
||||||
|
+ super().__init_subclass__(**kwargs)
|
||||||
|
+ cls._instances = WeakValueDictionary()
|
||||||
|
+
|
||||||
|
def __init__( # noqa: PLR0913
|
||||||
|
self,
|
||||||
|
lock_file: str | os.PathLike[str],
|
||||||
|
diff --git a/tests/test_filelock.py b/tests/test_filelock.py
|
||||||
|
index 674d81a..f9a4e5f 100644
|
||||||
|
--- a/tests/test_filelock.py
|
||||||
|
+++ b/tests/test_filelock.py
|
||||||
|
@@ -14,6 +14,7 @@ from stat import S_IWGRP, S_IWOTH, S_IWUSR, filemode
|
||||||
|
from types import TracebackType
|
||||||
|
from typing import TYPE_CHECKING, Any, Callable, Iterator, Tuple, Type, Union
|
||||||
|
from uuid import uuid4
|
||||||
|
+from weakref import WeakValueDictionary
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
@@ -687,3 +688,17 @@ def test_singleton_locks_are_deleted_when_no_external_references_exist(
|
||||||
|
assert lock_type._instances == {str(lock_path): lock} # noqa: SLF001
|
||||||
|
del lock
|
||||||
|
assert lock_type._instances == {} # noqa: SLF001
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+@pytest.mark.skipif(hasattr(sys, "pypy_version_info"), reason="del() does not trigger GC in PyPy")
|
||||||
|
+@pytest.mark.parametrize("lock_type", [FileLock, SoftFileLock])
|
||||||
|
+def test_singleton_instance_tracking_is_unique_per_subclass(lock_type: type[BaseFileLock]) -> None:
|
||||||
|
+ class Lock1(lock_type): # type: ignore[valid-type, misc]
|
||||||
|
+ pass
|
||||||
|
+
|
||||||
|
+ class Lock2(lock_type): # type: ignore[valid-type, misc]
|
||||||
|
+ pass
|
||||||
|
+
|
||||||
|
+ assert isinstance(Lock1._instances, WeakValueDictionary) # noqa: SLF001
|
||||||
|
+ assert isinstance(Lock2._instances, WeakValueDictionary) # noqa: SLF001
|
||||||
|
+ assert Lock1._instances is not Lock2._instances # noqa: SLF001
|
||||||
|
--
|
||||||
|
2.18.2
|
||||||
|
|
||||||
@ -1,11 +1,12 @@
|
|||||||
Name: python-filelock
|
Name: python-filelock
|
||||||
Version: 3.13.1
|
Version: 3.13.1
|
||||||
Release: 2
|
Release: 3
|
||||||
Summary: A platform independent file lock
|
Summary: A platform independent file lock
|
||||||
License: Unlicense
|
License: Unlicense
|
||||||
URL: https://github.com/benediktschmitt/py-filelock
|
URL: https://github.com/benediktschmitt/py-filelock
|
||||||
Source0: https://files.pythonhosted.org/packages/70/70/41905c80dcfe71b22fb06827b8eae65781783d4a14194bce79d16a013263/filelock-3.13.1.tar.gz
|
Source0: https://files.pythonhosted.org/packages/70/70/41905c80dcfe71b22fb06827b8eae65781783d4a14194bce79d16a013263/filelock-3.13.1.tar.gz
|
||||||
Patch0: 0001-BugFix-fix-permission-denied-error-when-lock-file-is.patch
|
Patch0: 0001-BugFix-fix-permission-denied-error-when-lock-file-is.patch
|
||||||
|
Patch1: 0002-backport-Make-singleton-class-instance-dict-unique-per-subclass.patch
|
||||||
|
|
||||||
BuildArch: noarch
|
BuildArch: noarch
|
||||||
|
|
||||||
@ -63,6 +64,9 @@ pytest
|
|||||||
%doc README.md
|
%doc README.md
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri May 10 2024 lixiaoyong <lixiaoyong@kylinos.cn> - 3.13.1-3
|
||||||
|
- Backport patch:Make singleton class instance dict unique per subclass
|
||||||
|
|
||||||
* Thu May 09 2024 wangxiaomeng <wangxiaomeng@kylinos.cn> - 3.13.1-2
|
* Thu May 09 2024 wangxiaomeng <wangxiaomeng@kylinos.cn> - 3.13.1-2
|
||||||
- Backport patch:fix permission denied error when lock file is placed in /tmp
|
- Backport patch:fix permission denied error when lock file is placed in /tmp
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user