Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-flufl.lock for
openSUSE:Factory checked in at 2026-05-10 16:48:23
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-flufl.lock (Old)
and /work/SRC/openSUSE:Factory/.python-flufl.lock.new.1966 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-flufl.lock"
Sun May 10 16:48:23 2026 rev:13 rq:1352264 version:9.1.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-flufl.lock/python-flufl.lock.changes
2026-03-16 14:19:49.715510998 +0100
+++
/work/SRC/openSUSE:Factory/.python-flufl.lock.new.1966/python-flufl.lock.changes
2026-05-10 16:49:17.023135064 +0200
@@ -1,0 +2,147 @@
+Sun May 10 10:17:16 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 9.1.0:
+ * Small refactoring to provide a hook for custom
+ synchronization of clocks in subclasses. (:GL:`40`)
+ * Switch to pyrefly for type checking.
+ * Remove support for Python 3.9.
+ * Documentation improvements.
+ * Add support for Python 3.13 and 3.14; remove support for
+ Python 3.8.
+ * Modernize type hints.
+ * Add support for Python 3.12. (:GL:`35`)
+ * Switch to hatch, replacing pdm and tox. (:GL:`36`)
+ * Switch to ruff from blue and isort. (:GL:`37`)
+ * Update dependencies.
+ * Other minor improvements and cleanups.
+ * Minor documentation fix.
+ * Drop Python 3.7 support (:GL:`34`)
+ * Added a claimfile property to Lock objects (:GL:`30`)
+ * Switch to pdm-backend (:GL:`33`)
+ * Use ruff for linting, since its much faster. (:GL:`17`)
+ * Bump dependencies.
+ * More GitLab CI integration improvements.
+ * Make tox.ini consistent with flufl defaults.
+ * Improvements to the GitLab CI integration.
+ * Add support for Python 3.11.
+ * Update to pdm 1.3.
+ * Update all dependencies eagerly.
+ * Fix spurious log messages when not breaking the lock.
+ (:GL:`29`)
+ * Use modern package management by adopting pdm and
+ pyproject.toml, and dropping setup.py and setup.cfg.
+ * Build the docs with Python 3.8.
+ * Update to version 3.0 of Sybil.
+ * Adopt the Furo documentation theme.
+ * Add a favicon and logos to the published documentation.
+ * Use importlib.metadata.version() as a better way to get the
+ package version number for the documentation.
+ * Drop Python 3.6 support.
+ * Update Windows GitLab runner to include Python 3.10.
+ * Update copyright years.
+ * Added a default_timeout argument to the Lock constructor,
+ which can be used in the context manager syntax as well.
+ (:GL:`24`)
+ * When a Lock uses a lock file that already exists and does not
+ appear to be a lock file (i.e. because its contents are ill-
+ formatted), do a better job of not clobbering that file.
+ (:GL:`25`)
+ * Improve some QA by re-adding diff-cover, Gitlab SAST during
+ CI, and testing on Python 3.10 beta (except for Windows)
+ * The master branch is renamed to main. (:GL:`28`)
+ * Added a py.typed file to satisfy type checkers. (:GL:`27`)
+ * I blue it!
+ * Update copyright years.
+ * Include test/__init__.py and docs/__init__.py.
+ * Rename top-level tests/ directory to test/ (:GL:`26`)
+ * Minor housekeeping and cleanups.
+ * Add some missing licensing text.
+ * Don't install the tests and docs directories at the top of
+ site-packages (:GL:`22`)
+ * Fix the Windows CI tests.
+ * Add an index to the documentation.
+ * Reorganized docs and tests out of the code directory.
+ * Fix Read The Docs presentation.
+ * Breaking change - The following methods have been removed:
+ Lock.transfer_to(), Lock.take_possession(), Lock.disown().
+ These were crufty, undocumented APIs used in older versions
+ of Mailman and were not sustainable. (:GL:`21`)
+ * Added official support for Python 3.9.
+ * Improvements to the documentation, including a better API
+ reference and a "theory of operation" page that gives more
+ implementation technical details. (:GL:`20`) (:GL:`17`)
+ * Boosted test coverage to 100%. (:GL:`18`)
+ * Breaking change - In Lock.refresh() and Lock.unlock() the
+ unconditionally flag is now a keyword-only argument.
+ (:GL:`13`)
+ * Breaking change - Removed Lock.__del__() and Lock.finalize().
+ It's impossible to make __del__() work properly, and this is
+ obsoleted by context manager protocol support anyway. Since
+ finalize() only existed to help with __del__() and its
+ functionality is identical to .unlock(unconditionally=True),
+ this method is also removed. (:GL:`7`)
+ * Added a Lock.expiration property. (:GL:`15`)
+ * Added a Lock.lockfile property. (:GL:`16`)
+ * Added a Lock.state property and the LockState enum.
+ (:GL:`12`)
+ * In all APIs, the lifetime parameter can now also be an
+ integer number of seconds, in addition to the previously
+ allowed datetime.timedelta. The lifetime property always
+ gives you a datetime.timedelta.
+ * The API is now properly type annotated.
+ * Some library-defined exceptions support exception chaining.
+ * Getting the repr() of a lock no longer refreshes it
+ (:GL:`11`)
+ * Add support for Python 3.7 and 3.8; drop support for Python
+ 3.4 and 3.5.
+ * We now run the test suite on both Linux and Windows.
+ * The LICENSE file is now included in the sdist tarball.
+ * API documentation is now built automatically.
+ * Numerous quality improvements and modernizations.
+ * Expose the host name used in the .details property, as a
+ property. (Closes #4).
+ * Expose the SEP as a public attribute. (Closes #3)
+ * Drop Python 2.7, add Python 3.6. (Closes #2)
+ * Added Windows support.
+ * Switch to the Apache License Version 2.0.
+ * Use flufl.testing for nose2 and flake8 plugins.
+ * Allow the claim file separator to be configurable, to support
+ file systems where the vertical bar is problematic. Defaults
+ to ^ on Windows and | everywhere else (unchanged). (Closes
+ #1)
+ * Fix the MANIFEST.in so that tox.ini is included in the sdist.
+ * Drop Python 2.6 compatibility.
+ * Add Python 3.5 compatibility.
+ * Include MANIFEST.in in the sdist tarball, otherwise the
+ Debian package won't built correctly.
+ * Fix documentation bug. (LP: #1026403)
+ * Catch ESTALE along with ENOENT, as NFS servers are supposed
+ to (but don't always) throw ESTALE instead of ENOENT. (LP:
+ #977999)
+ * Purge all references to distribute. (LP: #1263794)
+ * Add classifiers to setup.py and make the long description
+ more compatible with the Cheeseshop.
+ * Other changes to make the Cheeseshop page look nicer. (LP:
+ #680136)
+ * setup_helper.py version 2.1.
+ * Support Python 3 without the use of 2to3.
+ * Make the documentation clear that the flufl.test.subproc
+ functions are not part of the public API. (LP: #838338)
+ * Fix claim file format in take_possession(). (LP: #872096)
+ * Provide a new API for dealing with possible additional
+ unexpected errnos while trying to read the lock file. These
+ can happen in some NFS environments. If you want to retry
+ the read, set the lock file's retry_errnos property to a
+ sequence of errnos. If one of those errnos occurs, the read
+ is unconditionally (and infinitely) retried. retry_errnos is
+ a property which must be set to a sequence; it has a getter
+ and a deleter too. (LP: #882261)
+ * Fixed TypeError in .lock() method due to race condition in
+ _releasetime property. Found by Stephen A. Goss. (LP:
+ #827052)
+ * Added lock.details.
+ * Small adjustment to doctest.
+ * Add missing exception to __all__.
+ * Package renamed to flufl.lock.
+
+-------------------------------------------------------------------
Old:
----
flufl_lock-9.0.0.tar.gz
New:
----
flufl_lock-9.1.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-flufl.lock.spec ++++++
--- /var/tmp/diff_new_pack.ulV3pg/_old 2026-05-10 16:49:17.587158147 +0200
+++ /var/tmp/diff_new_pack.ulV3pg/_new 2026-05-10 16:49:17.587158147 +0200
@@ -18,7 +18,7 @@
%{?sle15_python_module_pythons}
Name: python-flufl.lock
-Version: 9.0.0
+Version: 9.1.0
Release: 0
Summary: NFS-safe file locking with timeouts for POSIX and Windows
License: Apache-2.0
++++++ flufl_lock-9.0.0.tar.gz -> flufl_lock-9.1.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flufl_lock-9.0.0/LICENSE new/flufl_lock-9.1.0/LICENSE
--- old/flufl_lock-9.0.0/LICENSE 2020-02-02 01:00:00.000000000 +0100
+++ new/flufl_lock-9.1.0/LICENSE 2020-02-02 01:00:00.000000000 +0100
@@ -1,4 +1,4 @@
-Copyright 2004-2025 Barry Warsaw
+Copyright 2004-2026 Barry Warsaw
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flufl_lock-9.0.0/PKG-INFO
new/flufl_lock-9.1.0/PKG-INFO
--- old/flufl_lock-9.0.0/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
+++ new/flufl_lock-9.1.0/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: flufl.lock
-Version: 9.0.0
+Version: 9.1.0
Summary: NFS-safe file locking with timeouts for POSIX and Windows
Project-URL: Home Page, https://flufllock.readthedocs.io
Project-URL: Documentation, https://flufllock.readthedocs.io
@@ -65,7 +65,7 @@
Author
======
-``flufl.lock`` is Copyright (C) 2007-2025 Barry Warsaw <[email protected]>
+``flufl.lock`` is Copyright (C) 2007-2026 Barry Warsaw <[email protected]>
Licensed under the terms of the Apache License Version 2.0. See the LICENSE
file for details.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flufl_lock-9.0.0/README.rst
new/flufl_lock-9.1.0/README.rst
--- old/flufl_lock-9.0.0/README.rst 2020-02-02 01:00:00.000000000 +0100
+++ new/flufl_lock-9.1.0/README.rst 2020-02-02 01:00:00.000000000 +0100
@@ -37,7 +37,7 @@
Author
======
-``flufl.lock`` is Copyright (C) 2007-2025 Barry Warsaw <[email protected]>
+``flufl.lock`` is Copyright (C) 2007-2026 Barry Warsaw <[email protected]>
Licensed under the terms of the Apache License Version 2.0. See the LICENSE
file for details.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flufl_lock-9.0.0/docs/NEWS.rst
new/flufl_lock-9.1.0/docs/NEWS.rst
--- old/flufl_lock-9.0.0/docs/NEWS.rst 2020-02-02 01:00:00.000000000 +0100
+++ new/flufl_lock-9.1.0/docs/NEWS.rst 2020-02-02 01:00:00.000000000 +0100
@@ -2,6 +2,11 @@
flufl.lock change log
=====================
+9.1.0 (2026-04-24)
+==================
+* Small refactoring to provide a hook for custom synchronization of clocks in
subclasses. (:GL:`40`)
+* Switch to `pyrefly <https://pyrefly.org/>`_ for type checking.
+
9.0 (2025-11-28)
================
* Remove support for Python 3.9.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flufl_lock-9.0.0/docs/index.rst
new/flufl_lock-9.1.0/docs/index.rst
--- old/flufl_lock-9.0.0/docs/index.rst 2020-02-02 01:00:00.000000000 +0100
+++ new/flufl_lock-9.1.0/docs/index.rst 2020-02-02 01:00:00.000000000 +0100
@@ -43,7 +43,7 @@
Copyright
=========
-Copyright (C) 2004-2025 Barry A. Warsaw
+Copyright (C) 2004-2026 Barry A. Warsaw
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flufl_lock-9.0.0/pyproject.toml
new/flufl_lock-9.1.0/pyproject.toml
--- old/flufl_lock-9.0.0/pyproject.toml 2020-02-02 01:00:00.000000000 +0100
+++ new/flufl_lock-9.1.0/pyproject.toml 2020-02-02 01:00:00.000000000 +0100
@@ -60,9 +60,6 @@
'tests/',
'conftest.py',
]
-excludes = [
- '**/.mypy_cache',
-]
[tool.hatch.envs.default]
installer = 'uv'
@@ -99,7 +96,7 @@
[tool.hatch.envs.qa]
dependencies = [
'ruff',
- 'mypy',
+ 'pyrefly',
]
[tool.hatch.envs.qa.env-vars]
@@ -109,7 +106,7 @@
[tool.hatch.envs.qa.scripts]
qa = [
'hatch fmt --check src',
- 'mypy -p {env:MODULE_NAME}',
+ 'pyrefly check',
]
fix = [
'hatch fmt src',
@@ -198,52 +195,8 @@
order-by-type = true
section-order = ['standard-library', 'third-party', 'local-folder',
'first-party']
-[tool.mypy]
-mypy_path = 'src'
-
-# Disallow dynamic typing
-disallow_any_generics = true
-disallow_subclassing_any = true
-
-# Untyped definitions and calls
-disallow_untyped_calls = false
-disallow_untyped_defs = true
-disallow_incomplete_defs = true
-check_untyped_defs = true
-disallow_untyped_decorators = false
-
-# None and Optional handling
-no_implicit_optional = true
-
-# Configuring warnings
-warn_redundant_casts = true
-warn_unused_ignores = true
-warn_no_return = true
-warn_return_any = true
-warn_unreachable = true
-
-# Miscellaneous strictness flags
-implicit_reexport = false
-strict_equality = true
-
-# Configuring error messages
-show_error_context = true
-show_column_numbers = true
-show_error_codes = true
-pretty = true
-show_absolute_path = true
-
-# Miscellaneous
-warn_unused_configs = true
-verbosity = 0
-
-[[tool.mypy.overrides]]
-module = [
- 'psutil',
- 'pytest',
- 'sybil.*',
-]
-ignore_missing_imports = true
+[tool.pyrefly]
+project-includes = ['src']
[build-system]
requires = ['hatchling']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flufl_lock-9.0.0/src/flufl/lock/__init__.py
new/flufl_lock-9.1.0/src/flufl/lock/__init__.py
--- old/flufl_lock-9.0.0/src/flufl/lock/__init__.py 2020-02-02
01:00:00.000000000 +0100
+++ new/flufl_lock-9.1.0/src/flufl/lock/__init__.py 2020-02-02
01:00:00.000000000 +0100
@@ -11,7 +11,7 @@
)
-__version__ = '9.0.0'
+__version__ = '9.1.0'
_public(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/flufl_lock-9.0.0/src/flufl/lock/_lockfile.py
new/flufl_lock-9.1.0/src/flufl/lock/_lockfile.py
--- old/flufl_lock-9.0.0/src/flufl/lock/_lockfile.py 2020-02-02
01:00:00.000000000 +0100
+++ new/flufl_lock-9.1.0/src/flufl/lock/_lockfile.py 2020-02-02
01:00:00.000000000 +0100
@@ -97,16 +97,6 @@
unknown = 6
-def _interval_to_datetime(
- timeout: Interval | None = None,
-) -> datetime | None:
- if timeout is None:
- return None
- if isinstance(timeout, int):
- timeout = timedelta(seconds=timeout)
- return datetime.now() + timeout
-
-
@public
class Lock:
"""Portable, NFS-safe file locking with timeouts for POSIX systems.
@@ -250,10 +240,10 @@
if hostname != self._hostname:
return LockState.unknown
if pid == os.getpid():
- expired = self.expiration < datetime.now()
+ expired = self.expiration < self._now()
return LockState.ours_expired if expired else LockState.ours
if pid_exists(pid):
- expired = self.expiration < datetime.now()
+ expired = self.expiration < self._now()
return LockState.theirs_expired if expired else LockState.unknown
return LockState.stale
@@ -311,7 +301,9 @@
:raises TimeOutError: if ``timeout`` is not None and the indicated
time interval expires without a lock acquisition.
"""
- timeout_time = _interval_to_datetime(self._default_timeout if timeout
is None else timeout)
+ timeout_time = self._interval_to_datetime(
+ self._default_timeout if timeout is None else timeout
+ )
# Make sure the claim file exists, and that its contents are current.
self._write()
# 2025-05-08(warsaw): Is the following comment still relevant?
@@ -368,7 +360,7 @@
pass # noqa PIE790 Unnecessary `pass` statement
# We did not acquire the lock, because someone else already has
# it. Have we timed out in our quest for the lock?
- if timeout_time is not None and timeout_time < datetime.now():
+ if timeout_time is not None and timeout_time < self._now():
os.unlink(self._claimfile)
log.error('timed out')
raise TimeOutError('Could not acquire the lock')
@@ -377,7 +369,7 @@
# time to avoid race conditions. (LP: #827052)
release_time = self._releasetime
if release_time != -1:
- now = datetime.now()
+ now = self._now()
future = cast(datetime, release_time) + CLOCK_SLOP
if now > future:
# Yes, so break the lock.
@@ -536,7 +528,7 @@
:param filename: If given, the file to touch, otherwise our claim file
is touched.
"""
- expiration_date = datetime.now() + self._lifetime
+ expiration_date = self._now() + self._lifetime
t = time.mktime(expiration_date.timetuple())
try:
# We probably don't need to modify atime, but this is easier.
@@ -623,3 +615,22 @@
"""Snooze for a random amount of time."""
interval = random.random() * 2.0 + 0.01
time.sleep(interval)
+
+ def _now(self) -> datetime:
+ """Hook for subclasses to influence the clock lookup.
+
+ This is useful if you're synchronizing locks across NFS servers that
+ cannot properly synchronize their clocks. Override to add any custom
+ necessary custom logic.
+ """
+ return datetime.now()
+
+ def _interval_to_datetime(
+ self,
+ timeout: Interval | None = None,
+ ) -> datetime | None:
+ if timeout is None:
+ return None
+ if isinstance(timeout, int):
+ timeout = timedelta(seconds=timeout)
+ return self._now() + timeout