-
Notifications
You must be signed in to change notification settings - Fork 24
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix on_recv called when None after close #83
fix on_recv called when None after close #83
Conversation
@mmerickel can you approve my workflow build please? |
thanks looks like there's an fd use after close bug:
|
@mmerickel can I get another run approved please? |
looks like Connection.close() hangs on windows, this happens on main too if Connection is tested in isolation |
this always hangs forever on windows: import os
import sys
import threading
def consume(ident, fd):
while chunk := os.read(fd, 1):
print(ident, chunk)
def main():
cr, cw = os.pipe()
crt = threading.Thread(target=consume, args=("cr", cr))
crt.start()
print("close cr", flush=True)
os.close(cr)
print("close cw", flush=True)
os.close(cw)
if __name__ == "__main__":
sys.exit(main()) |
cea22a8
to
be19728
Compare
windows serializes all access to pipes so a close will block until a read returns https://groups.google.com/g/microsoft.public.win32.programmer.kernel/c/VzaZ41mDcVs/m/zSshHYVXyvQJ
be19728
to
e13d393
Compare
@mmerickel ok I tested this on linux and windows now it should pass in CI! |
This is a constant annoyance I have using hupper, would love to see it fixed! |
@graingert I finally got a chance to sit down and think about this and I'm wondering if we can simplify this to a one-line fix? What do you think? diff --git a/src/hupper/ipc.py b/src/hupper/ipc.py
index cec1a85..11fdba3 100644
--- a/src/hupper/ipc.py
+++ b/src/hupper/ipc.py
@@ -135,9 +135,9 @@ class Connection(object):
self.reader_thread.start()
def close(self):
+ self.on_recv = lambda _: None
close_fd(self.r_fd)
close_fd(self.w_fd)
- self.on_recv = None
def _recv_packet(self):
buf = io.BytesIO() |
Doesn't fix the use after close |
@mmerickel I've pushed that change |
How does it not fix the use-after-close? The exception you posted in the original ticket is showing that things were properly caught (by the EOFError?) but the on_recv was None at the time instead of something that could be invoked. |
ok I see - it's not in your original stacktrace but I agree that invoking read on a closed fd will return EBADF which is not currently handled so your fix improves that. |
Please modify the PR to set self.on_recv before closing the fds to avoid a race there. I think there is no real point in setting the fds to -1 either but if you want to keep that it's ok. Thanks! The following to me is a proper fix: diff --git a/src/hupper/ipc.py b/src/hupper/ipc.py
index cec1a85..bbc567a 100644
--- a/src/hupper/ipc.py
+++ b/src/hupper/ipc.py
@@ -1,3 +1,4 @@
+import errno
import io
import os
import pickle
@@ -135,9 +136,9 @@ class Connection(object):
self.reader_thread.start()
def close(self):
+ self.on_recv = lambda _: None
close_fd(self.r_fd)
close_fd(self.w_fd)
- self.on_recv = None
def _recv_packet(self):
buf = io.BytesIO()
@@ -166,6 +167,9 @@ class Connection(object):
self.on_recv(packet)
except EOFError:
pass
+ except OSError as e:
+ if e.errno != errno.EBADF:
+ raise
self.on_recv(None)
def _write_packet(self, data): |
@graingert I haven't had time to debug this but something is clearly wrong with the new test you added on windows. Obviously one run passes, but all the others fail. I tried to re-run the failed jobs and they failed again in the same way with a deadlock in those tests. |
You cannot invoke close(r_fd) on windows while a blocking os.read(r_fd) is active. However, if you close the write_fd first, then things seem to work.
Whelp, 4 hours later after installing a windows VM and banging my head for a while I found the issue. Basically you cannot invoke |
1.12.1 (2024-01-26) - Add support for Python 3.12. - Fix a blocking issue when shutting down on Windows. - Fix a race condition closing pipes when restarting the worker process. See Pylons/hupper#83 - Fix issues with watchman when the server shuts down unexpectedly and when subscriptions are canceled. - Add ``hupper.get_reloader().graceful_shutdown()`` which can be used within your own app to trigger a full shutdown of the worker as well as the monitoring. See Pylons/hupper#88
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [MarkupSafe](https://palletsprojects.com/p/markupsafe/) ([changelog](https://markupsafe.palletsprojects.com/changes/)) | `==2.1.3` -> `==2.1.5` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/MarkupSafe/2.1.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/MarkupSafe/2.1.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/MarkupSafe/2.1.3/2.1.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/MarkupSafe/2.1.3/2.1.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [alabaster](https://github.com/sphinx-doc/alabaster) ([changelog](https://alabaster.readthedocs.io/en/latest/changelog.html)) | `==0.7.13` -> `==0.7.16` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/alabaster/0.7.16?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/alabaster/0.7.16?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/alabaster/0.7.13/0.7.16?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/alabaster/0.7.13/0.7.16?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [cachetools](https://github.com/tkem/cachetools) | `==5.3.2` -> `==5.3.3` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/cachetools/5.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/cachetools/5.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/cachetools/5.3.2/5.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/cachetools/5.3.2/5.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [coverage](https://github.com/nedbat/coveragepy) | `==7.4.0` -> `==7.4.4` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/coverage/7.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/coverage/7.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/coverage/7.4.0/7.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/coverage/7.4.0/7.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [cryptography](https://github.com/pyca/cryptography) ([changelog](https://cryptography.io/en/latest/changelog/)) | `==42.0.4` -> `==42.0.5` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/cryptography/42.0.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/cryptography/42.0.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/cryptography/42.0.4/42.0.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/cryptography/42.0.4/42.0.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [dill](https://github.com/uqfoundation/dill) | `==0.3.7` -> `==0.3.8` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/dill/0.3.8?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/dill/0.3.8?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/dill/0.3.7/0.3.8?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/dill/0.3.7/0.3.8?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [filelock](https://github.com/tox-dev/py-filelock) | `==3.13.1` -> `==3.13.3` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/filelock/3.13.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/filelock/3.13.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/filelock/3.13.1/3.13.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/filelock/3.13.1/3.13.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [hupper](https://github.com/Pylons/hupper) ([changelog](https://docs.pylonsproject.org/projects/hupper/en/latest/changes.html)) | `==1.12` -> `==1.12.1` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/hupper/1.12.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/hupper/1.12.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/hupper/1.12/1.12.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/hupper/1.12/1.12.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [jaraco.classes](https://github.com/jaraco/jaraco.classes) | `==3.3.0` -> `==3.3.1` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/jaraco.classes/3.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/jaraco.classes/3.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/jaraco.classes/3.3.0/3.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/jaraco.classes/3.3.0/3.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [keyring](https://github.com/jaraco/keyring) | `==24.3.0` -> `==24.3.1` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/keyring/24.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/keyring/24.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/keyring/24.3.0/24.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/keyring/24.3.0/24.3.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [lazr.restfulclient](https://launchpad.net/lazr.restfulclient) ([source](https://code.launchpad.net/lazr.restfulclient)) | `==0.14.5` -> `==0.14.6` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/lazr.restfulclient/0.14.6?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/lazr.restfulclient/0.14.6?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/lazr.restfulclient/0.14.5/0.14.6?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/lazr.restfulclient/0.14.5/0.14.6?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [psutil](https://github.com/giampaolo/psutil) | `==5.9.7` -> `==5.9.8` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/psutil/5.9.8?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/psutil/5.9.8?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/psutil/5.9.7/5.9.8?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/psutil/5.9.7/5.9.8?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [psutil](https://github.com/giampaolo/psutil) | `==5.9.6` -> `==5.9.8` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/psutil/5.9.8?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/psutil/5.9.8?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/psutil/5.9.6/5.9.8?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/psutil/5.9.6/5.9.8?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [pydantic](https://github.com/pydantic/pydantic) ([changelog](https://docs.pydantic.dev/latest/changelog/)) | `==1.10.13` -> `==1.10.14` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/pydantic/1.10.14?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pydantic/1.10.14?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pydantic/1.10.13/1.10.14?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pydantic/1.10.13/1.10.14?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [pyinstaller](https://www.pyinstaller.org/) ([source](https://github.com/pyinstaller/pyinstaller)) | `==5.13.1` -> `==5.13.2` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/pyinstaller/5.13.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pyinstaller/5.13.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pyinstaller/5.13.1/5.13.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pyinstaller/5.13.1/5.13.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [pylxd](https://ubuntu.com/lxd) | `==2.3.1` -> `==2.3.2` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/pylxd/2.3.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pylxd/2.3.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pylxd/2.3.1/2.3.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pylxd/2.3.1/2.3.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | pyparsing | `==3.1.1` -> `==3.1.2` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/pyparsing/3.1.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pyparsing/3.1.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pyparsing/3.1.1/3.1.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pyparsing/3.1.1/3.1.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [pyright](https://github.com/RobertCraigie/pyright-python) | `==1.1.350` -> `==1.1.355` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/pyright/1.1.355?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pyright/1.1.355?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pyright/1.1.350/1.1.355?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pyright/1.1.350/1.1.355?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [tomlkit](https://github.com/sdispater/tomlkit) | `==0.12.3` -> `==0.12.4` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/tomlkit/0.12.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/tomlkit/0.12.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/tomlkit/0.12.3/0.12.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/tomlkit/0.12.3/0.12.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [virtualenv](https://github.com/pypa/virtualenv) | `==20.25.0` -> `==20.25.1` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/virtualenv/20.25.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/virtualenv/20.25.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/virtualenv/20.25.0/20.25.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/virtualenv/20.25.0/20.25.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>sphinx-doc/alabaster (alabaster)</summary> ### [`v0.7.16`](https://github.com/sphinx-doc/alabaster/releases/tag/0.7.16): Alabaster 0.7.16 [Compare Source](https://github.com/sphinx-doc/alabaster/compare/0.7.15...0.7.16) Changelog: https://alabaster.readthedocs.io/en/latest/changelog.html ### [`v0.7.15`](https://github.com/sphinx-doc/alabaster/releases/tag/0.7.15): Alabaster 0.7.15 [Compare Source](https://github.com/sphinx-doc/alabaster/compare/0.7.14...0.7.15) Changelog: https://alabaster.readthedocs.io/en/latest/changelog.html ### [`v0.7.14`](https://github.com/sphinx-doc/alabaster/releases/tag/0.7.14): Alabaster 0.7.14 [Compare Source](https://github.com/sphinx-doc/alabaster/compare/0.7.13...0.7.14) Changelog: https://alabaster.readthedocs.io/en/latest/changelog.html </details> <details> <summary>tkem/cachetools (cachetools)</summary> ### [`v5.3.3`](https://github.com/tkem/cachetools/blob/HEAD/CHANGELOG.rst#v533-2024-02-26) [Compare Source](https://github.com/tkem/cachetools/compare/v5.3.2...v5.3.3) \=================== - Documentation improvements. - Update CI environment. </details> <details> <summary>nedbat/coveragepy (coverage)</summary> ### [`v7.4.4`](https://github.com/nedbat/coveragepy/blob/HEAD/CHANGES.rst#Version-744--2024-03-14) [Compare Source](https://github.com/nedbat/coveragepy/compare/7.4.3...7.4.4) - Fix: in some cases, even with `[run] relative_files=True`, a data file could be created with absolute path names. When combined with other relative data files, it was random whether the absolute file names would be made relative or not. If they weren't, then a file would be listed twice in reports, as detailed in `issue 1752`\_. This is now fixed: absolute file names are always made relative when combining. Thanks to Bruno Rodrigues dos Santos for support. - Fix: the last case of a match/case statement had an incorrect message if the branch was missed. It said the pattern never matched, when actually the branch is missed if the last case always matched. - Fix: clicking a line number in the HTML report now positions more accurately. - Fix: the `report:format` setting was defined as a boolean, but should be a string. Thanks, `Tanaydin Sirin <pull 1754_>`\_. It is also now documented on the :ref:`configuration page <config_report_format>`. .. \_issue 1752:[https://github.com/nedbat/coveragepy/issues/1752](https://github.com/nedbat/coveragepy/issues/1752)2 .. \_pull 1754[https://github.com/nedbat/coveragepy/pull/1754](https://github.com/nedbat/coveragepy/pull/1754)54 .. \_changes\_7-4-3: ### [`v7.4.3`](https://github.com/nedbat/coveragepy/blob/HEAD/CHANGES.rst#Version-743--2024-02-23) [Compare Source](https://github.com/nedbat/coveragepy/compare/7.4.2...7.4.3) - Fix: in some cases, coverage could fail with a RuntimeError: "Set changed size during iteration." This is now fixed, closing `issue 1733`\_. .. \_issue 1733:[https://github.com/nedbat/coveragepy/issues/1733](https://github.com/nedbat/coveragepy/issues/1733)3 .. \_changes\_7-4-2: ### [`v7.4.2`](https://github.com/nedbat/coveragepy/blob/HEAD/CHANGES.rst#Version-742--2024-02-20) [Compare Source](https://github.com/nedbat/coveragepy/compare/7.4.1...7.4.2) - Fix: setting `COVERAGE_CORE=sysmon` no longer errors on 3.11 and lower, thanks `Hugo van Kemenade <pull 1747_>`\_. It now issues a warning that sys.monitoring is not available and falls back to the default core instead. .. \_pull 1747:[https://github.com/nedbat/coveragepy/pull/1747](https://github.com/nedbat/coveragepy/pull/1747)7 .. \_changes\_7-4-1: ### [`v7.4.1`](https://github.com/nedbat/coveragepy/blob/HEAD/CHANGES.rst#Version-741--2024-01-26) [Compare Source](https://github.com/nedbat/coveragepy/compare/7.4.0...7.4.1) - Python 3.13.0a3 is supported. - Fix: the JSON report now includes an explicit format version number, closing `issue 1732`\_. .. \_issue 1732:[https://github.com/nedbat/coveragepy/issues/1732](https://github.com/nedbat/coveragepy/issues/1732)2 .. \_changes\_7-4-0: </details> <details> <summary>pyca/cryptography (cryptography)</summary> ### [`v42.0.5`](https://github.com/pyca/cryptography/compare/42.0.4...42.0.5) [Compare Source](https://github.com/pyca/cryptography/compare/42.0.4...42.0.5) </details> <details> <summary>uqfoundation/dill (dill)</summary> ### [`v0.3.8`](https://github.com/uqfoundation/dill/releases/tag/0.3.8) [Compare Source](https://github.com/uqfoundation/dill/compare/dill-0.3.7...0.3.8) ### 0.3.8 Release Notes With `dill`, you can serialize almost anything in python, even an entire interpreter session. If you encounter any pickling failures, `dill` also has some good tools to help you discover why your object fails to pickle. `dill` installs with `pip`: `$ pip install dill` `dill` requires: `- python or pypy, >=3.8` Optional requirements: `- pyreadline, >=1.7.1` (install with `$ pip install dill[readline]`) `- objgraph, >=1.7.2` (install with `$ pip install dill[graph]`) `dill` is licensed under 3-clause BSD: >>> import dill >>> print (dill.license()) To cite `dill`: >>> import dill >>> print (dill.citation()) #### What's Changed - test for qualname in get_typedef_type by [@​mmckerns](https://github.com/mmckerns) in [https://github.com/uqfoundation/dill/pull/613](https://github.com/uqfoundation/dill/pull/613) - drop formal support for python 3.7 by [@​mmckerns](https://github.com/mmckerns) in [https://github.com/uqfoundation/dill/pull/614](https://github.com/uqfoundation/dill/pull/614) - define html_theme as rtd workaround by [@​mmckerns](https://github.com/mmckerns) in [https://github.com/uqfoundation/dill/pull/615](https://github.com/uqfoundation/dill/pull/615) - update install doc in tests by [@​mmckerns](https://github.com/mmckerns) in [https://github.com/uqfoundation/dill/pull/621](https://github.com/uqfoundation/dill/pull/621) - formal support for 3.12, initial support for 3.13 by [@​mmckerns](https://github.com/mmckerns) in [https://github.com/uqfoundation/dill/pull/630](https://github.com/uqfoundation/dill/pull/630) - add build to rtfd config by [@​mmckerns](https://github.com/mmckerns) in [https://github.com/uqfoundation/dill/pull/632](https://github.com/uqfoundation/dill/pull/632) - add guard for math.log in Logger record size calculation by [@​mmckerns](https://github.com/mmckerns) in [https://github.com/uqfoundation/dill/pull/637](https://github.com/uqfoundation/dill/pull/637) - updated copyright for 2024 by [@​mmckerns](https://github.com/mmckerns) in [https://github.com/uqfoundation/dill/pull/638](https://github.com/uqfoundation/dill/pull/638) - Bump jinja2 from 3.1.1 to 3.1.3 in /docs by [@​dependabot](https://github.com/dependabot) in [https://github.com/uqfoundation/dill/pull/640](https://github.com/uqfoundation/dill/pull/640) - Import submodule properly when there is an attribute of the module with the same name by [@​kelvinburke](https://github.com/kelvinburke) in [https://github.com/uqfoundation/dill/pull/629](https://github.com/uqfoundation/dill/pull/629) - update sphinx to 6.2.1 by [@​mmckerns](https://github.com/mmckerns) in [https://github.com/uqfoundation/dill/pull/641](https://github.com/uqfoundation/dill/pull/641) - Bump readthedocs-sphinx-search from 0.3.1 to 0.3.2 in /docs by [@​dependabot](https://github.com/dependabot) in [https://github.com/uqfoundation/dill/pull/642](https://github.com/uqfoundation/dill/pull/642) - skip BufferedRandomType on pyodide by [@​mmckerns](https://github.com/mmckerns) in [https://github.com/uqfoundation/dill/pull/644](https://github.com/uqfoundation/dill/pull/644) #### New Contributors - [@​kelvinburke](https://github.com/kelvinburke) made their first contribution in [https://github.com/uqfoundation/dill/pull/629](https://github.com/uqfoundation/dill/pull/629) **Full Changelog**: uqfoundation/dill@dill-0.3.7...0.3.8 </details> <details> <summary>tox-dev/py-filelock (filelock)</summary> ### [`v3.13.3`](https://github.com/tox-dev/filelock/releases/tag/3.13.3) [Compare Source](https://github.com/tox-dev/py-filelock/compare/3.13.2...3.13.3) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed - Make singleton class instance dict unique per subclass by [@​nefrob](https://github.com/nefrob) in [https://github.com/tox-dev/filelock/pull/318](https://github.com/tox-dev/filelock/pull/318) **Full Changelog**: tox-dev/filelock@3.13.2...3.13.3 ### [`v3.13.2`](https://github.com/tox-dev/filelock/releases/tag/3.13.2) [Compare Source](https://github.com/tox-dev/py-filelock/compare/3.13.1...3.13.2) <!-- Release notes generated using configuration in .github/release.yml at main --> #### What's Changed - Fixed small typo in \_unix.py by [@​snemes](https://github.com/snemes) in [https://github.com/tox-dev/filelock/pull/302](https://github.com/tox-dev/filelock/pull/302) - Update SECURITY.md to reflect Python 3.7 support dropoff by [@​kemzeb](https://github.com/kemzeb) in [https://github.com/tox-dev/filelock/pull/304](https://github.com/tox-dev/filelock/pull/304) - Update index.rst to improve the demo usage by [@​youkaichao](https://github.com/youkaichao) in [https://github.com/tox-dev/filelock/pull/314](https://github.com/tox-dev/filelock/pull/314) - \[BugFix] fix permission denied error when lock file is placed in `/tmp` by [@​kota-iizuka](https://github.com/kota-iizuka) in [https://github.com/tox-dev/filelock/pull/317](https://github.com/tox-dev/filelock/pull/317) #### New Contributors - [@​snemes](https://github.com/snemes) made their first contribution in [https://github.com/tox-dev/filelock/pull/302](https://github.com/tox-dev/filelock/pull/302) - [@​kemzeb](https://github.com/kemzeb) made their first contribution in [https://github.com/tox-dev/filelock/pull/304](https://github.com/tox-dev/filelock/pull/304) - [@​youkaichao](https://github.com/youkaichao) made their first contribution in [https://github.com/tox-dev/filelock/pull/314](https://github.com/tox-dev/filelock/pull/314) - [@​kota-iizuka](https://github.com/kota-iizuka) made their first contribution in [https://github.com/tox-dev/filelock/pull/317](https://github.com/tox-dev/filelock/pull/317) **Full Changelog**: tox-dev/filelock@3.13.1...3.13.2 </details> <details> <summary>Pylons/hupper (hupper)</summary> ### [`v1.12.1`](https://github.com/Pylons/hupper/blob/HEAD/CHANGES.rst#1121-2024-01-26) [Compare Source](https://github.com/Pylons/hupper/compare/1.12...1.12.1) \=================== - Add support for Python 3.12. - Fix a blocking issue when shutting down on Windows. - Fix a race condition closing pipes when restarting the worker process. [https://github.com/Pylons/hupper/pull/83](https://github.com/Pylons/hupper/pull/83)l/83 - Fix issues with watchman when the server shuts down unexpectedly and when subscriptions are canceled. - Add `hupper.get_reloader().graceful_shutdown()` which can be used within your own app to trigger a full shutdown of the worker as well as the monitori[https://github.com/Pylons/hupper/pull/88](https://github.com/Pylons/hupper/pull/88)pper/pull/88 </details> <details> <summary>jaraco/jaraco.classes (jaraco.classes)</summary> ### [`v3.3.1`](https://github.com/jaraco/jaraco.classes/compare/v3.3.0...v3.3.1) [Compare Source](https://github.com/jaraco/jaraco.classes/compare/v3.3.0...v3.3.1) </details> <details> <summary>jaraco/keyring (keyring)</summary> ### [`v24.3.1`](https://github.com/jaraco/keyring/compare/v24.3.0...v24.3.1) [Compare Source](https://github.com/jaraco/keyring/compare/v24.3.0...v24.3.1) </details> <details> <summary>giampaolo/psutil (psutil)</summary> ### [`v5.9.8`](https://github.com/giampaolo/psutil/blob/HEAD/HISTORY.rst#598) [Compare Source](https://github.com/giampaolo/psutil/compare/release-5.9.7...release-5.9.8) \===== 2024-01-19 **Enhancements** - 2343\_, \[FreeBSD]: filter `net_connections()`\_ returned list in C instead of Python, and avoid to retrieve unnecessary connection types unless explicitly asked. E.g., on an IDLE system with few IPv6 connections this will run around 4 times faster. Before all connection types (TCP, UDP, UNIX) were retrieved internally, even if only a portion was returned. - 2342\_, \[NetBSD]: same as above ([#​2343](https://github.com/giampaolo/psutil/issues/2343)) but for NetBSD. - 2349\_: adopted black formatting style. **Bug fixes** - 930\_, \[NetBSD], \[critical]: `net_connections()`\_ implementation was broken. It could either leak memory or core dump. - 2340\_, \[NetBSD]: if process is terminated, `Process.cwd()`\_ will return an empty string instead of raising `NoSuchProcess`\_. - 2345\_, \[Linux]: fix compilation on older compiler missing DUPLEX_UNKNOWN. - 2222\_, \[macOS]: `cpu_freq()` now returns fixed values for `min` and `max` frequencies in all Apple Silicon chips. </details> <details> <summary>pydantic/pydantic (pydantic)</summary> ### [`v1.10.14`](https://github.com/pydantic/pydantic/releases/tag/v1.10.14): 2024-01-19 [Compare Source](https://github.com/pydantic/pydantic/compare/v1.10.13...v1.10.14) #### What's Changed - Update install.md by [@​dmontagu](https://github.com/dmontagu) in [https://github.com/pydantic/pydantic/pull/7690](https://github.com/pydantic/pydantic/pull/7690) - Fix ci to only deploy docs on release by [@​sydney-runkle](https://github.com/sydney-runkle) in [https://github.com/pydantic/pydantic/pull/7740](https://github.com/pydantic/pydantic/pull/7740) - Ubuntu fixes for V1 by [@​sydney-runkle](https://github.com/sydney-runkle) in [https://github.com/pydantic/pydantic/pull/8540](https://github.com/pydantic/pydantic/pull/8540) and [https://github.com/pydantic/pydantic/pull/8587](https://github.com/pydantic/pydantic/pull/8587) - Fix `cached_property` handling in dataclasses when copied by [@​rdbisme](https://github.com/rdbisme) in [https://github.com/pydantic/pydantic/pull/8407](https://github.com/pydantic/pydantic/pull/8407) #### New Contributors - [@​rdbisme](https://github.com/rdbisme) made their first contribution in [https://github.com/pydantic/pydantic/pull/8407](https://github.com/pydantic/pydantic/pull/8407) **Full Changelog**: pydantic/pydantic@v1.10.13...v1.10.14 </details> <details> <summary>pyinstaller/pyinstaller (pyinstaller)</summary> ### [`v5.13.2`](https://github.com/pyinstaller/pyinstaller/releases/tag/v5.13.2) [Compare Source](https://github.com/pyinstaller/pyinstaller/compare/v5.13.1...v5.13.2) Please see the [v5.13.2 section of the changelog](https://pyinstaller.org/en/v5.13.2/CHANGES.html#id1) for a list of the changes since v5.13.1. </details> <details> <summary>RobertCraigie/pyright-python (pyright)</summary> ### [`v1.1.355`](https://github.com/RobertCraigie/pyright-python/compare/v1.1.354...v1.1.355) [Compare Source](https://github.com/RobertCraigie/pyright-python/compare/v1.1.354...v1.1.355) ### [`v1.1.354`](https://github.com/RobertCraigie/pyright-python/compare/v1.1.353...v1.1.354) [Compare Source](https://github.com/RobertCraigie/pyright-python/compare/v1.1.353...v1.1.354) ### [`v1.1.353`](https://github.com/RobertCraigie/pyright-python/compare/v1.1.352...v1.1.353) [Compare Source](https://github.com/RobertCraigie/pyright-python/compare/v1.1.352...v1.1.353) ### [`v1.1.352`](https://github.com/RobertCraigie/pyright-python/compare/v1.1.351...v1.1.352) [Compare Source](https://github.com/RobertCraigie/pyright-python/compare/v1.1.351...v1.1.352) ### [`v1.1.351`](https://github.com/RobertCraigie/pyright-python/compare/v1.1.350...v1.1.351) [Compare Source](https://github.com/RobertCraigie/pyright-python/compare/v1.1.350...v1.1.351) </details> <details> <summary>sdispater/tomlkit (tomlkit)</summary> ### [`v0.12.4`](https://github.com/sdispater/tomlkit/blob/HEAD/CHANGELOG.md#0124---2024-02-27) [Compare Source](https://github.com/sdispater/tomlkit/compare/0.12.3...0.12.4) ##### Fixed - Support `|` and `|=` operator for tables, and support `+` and `+=` operator for arrays. ([#​331](https://github.com/sdispater/tomlkit/issues/331)) - Fix an index error when setting dotted keys in a table. ([#​332](https://github.com/sdispater/tomlkit/issues/332)) </details> <details> <summary>pypa/virtualenv (virtualenv)</summary> ### [`v20.25.1`](https://github.com/pypa/virtualenv/compare/20.25.0...20.25.1) [Compare Source](https://github.com/pypa/virtualenv/compare/20.25.0...20.25.1) </details> --- ### Configuration 📅 **Schedule**: Branch creation - "every weekend" in timezone Etc/UTC, Automerge - "every weekend" in timezone Etc/UTC. 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/canonical/snapcraft). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4yNjkuMiIsInVwZGF0ZWRJblZlciI6IjM3LjI2OS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9--> --------- Signed-off-by: Callahan Kovacs <callahan.kovacs@canonical.com> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Callahan Kovacs <callahan.kovacs@canonical.com>
https://build.opensuse.org/request/show/1177531 by user dgarcia + anag+factory - Update to 1.2.1: - Add support for Python 3.12. - Fix a blocking issue when shutting down on Windows. - Fix a race condition closing pipes when restarting the worker process. See Pylons/hupper#83 - Fix issues with watchman when the server shuts down unexpectedly and when subscriptions are canceled. - Add hupper.get_reloader().graceful_shutdown() which can be used within your own app to trigger a full shutdown of the worker as well as the monitoring. See Pylons/hupper#88 1.12: - When the reloader is stopped, exit with the same code received from the subprocess. See Pylons/hupper#81 1.11: - Drop support for Python 2.7, 3.4, 3.5, and 3.6. - Add support/testing for Python 3.10, and
Fixes #82