sphinx-autobuild icon indicating copy to clipboard operation
sphinx-autobuild copied to clipboard

Fix hot reloading for Python 3.9

Open MtkN1 opened this issue 1 year ago • 4 comments

Fixes #178

1. Move asyncio.Event creation to lifespan

This PR moves the creation of the asyncio.Event from RebuildServer.__init__ to RebuildServer.lifespan. This ensures asyncio.Event is created within the event loop context, resolving the relevant error.

[!NOTE] The error does not occur in Python>=3.10 because the implementation was changed by python/cpython#86558.

2. Add rebuild test

Since there was no rebuild test, I added one.

  • Added a rebuild test.
    • Added a test to check refresh messages from /websocket-reload after modifying the index.rst file.
  • Changed the target test function to an asynchronous function.
    • Starlette's TestClient uses threads, while RebuildServer uses multiprocessing. In my view, this affected the rebuild test execution and cause it to fail. (0662fc9)
    • Changed Starlette's TestClient to http.AsyncClient. (ref)
    • Added test dependencies asgi-lifespan and httpx-ws required for testing lifespan and WebSocket.

MtkN1 avatar Oct 29 '24 07:10 MtkN1

@AA-Turner @hugovk requesting a review.

z-aki avatar Mar 20 '25 05:03 z-aki

I'm not a maintainer here, but Python 3.9 is only receiving security updates and is EOL in October:

https://devguide.python.org/versions/

And Sphinx itself supports 3.11+:

https://www.sphinx-doc.org/en/master/internals/release-process.html#python-version-support-policy

Can you upgrade to a newer Python?

hugovk avatar Mar 20 '25 06:03 hugovk

Thank you for your comment.

sphinx-autobuild itself requires Python >= 3.9, and many library projects have this requirement. Therefore, it still has value for at least half a year. I am not particularly attached to Python 3.9, but I believe the changes in the implementation are reasonable. Additionally, I have added tests for hot reload, which may also be valuable for this project.

I would appreciate it if a maintainer could review the changes.

MtkN1 avatar Mar 20 '25 07:03 MtkN1

Thank you for your comment.

sphinx-autobuild itself requires Python >= 3.9, and many library projects have this requirement. Therefore, it still has value for at least half a year. I am not particularly attached to Python 3.9, but I believe the changes in the implementation are reasonable.

Because Sphinx is an application for generating docs, and not a library dependency, projects can build docs with a single (recent) Python version, even if they support the full 3.9-3.13 range.

I've opened https://github.com/sphinx-doc/sphinx-autobuild/pull/189 as an alternative to match the same versions as Sphinx itself, in case the maintainers wish to keep parity.

Additionally, I have added tests for hot reload, which may also be valuable for this project.

Yes, these sound useful.

hugovk avatar Mar 20 '25 09:03 hugovk