From 5891b414665680748beb4bce34fe3a27c00449aa Mon Sep 17 00:00:00 2001 From: Mark Bakhit Date: Sun, 24 Nov 2024 20:39:19 -0800 Subject: [PATCH 1/2] Bump ReactPy to v1.1.0 (#258) --- ...lease-docs.yml => publish-latest-docs.yml} | 2 +- CHANGELOG.md | 27 ++++++------------ README.md | 2 +- docs/src/reference/components.md | 2 +- docs/src/reference/router.md | 4 +-- docs/src/reference/settings.md | 14 ++++++++- requirements/pkg-deps.txt | 2 +- setup.py | 6 ++-- src/js/bun.lockb | Bin 101426 -> 102513 bytes src/js/package.json | 2 +- src/reactpy_django/config.py | 6 +++- src/reactpy_django/decorators.py | 8 ++---- src/reactpy_django/hooks.py | 6 ++-- src/reactpy_django/http/views.py | 2 ++ src/reactpy_django/pyscript/layout_handler.py | 2 +- src/reactpy_django/utils.py | 2 +- 16 files changed, 46 insertions(+), 41 deletions(-) rename .github/workflows/{publish-release-docs.yml => publish-latest-docs.yml} (96%) diff --git a/.github/workflows/publish-release-docs.yml b/.github/workflows/publish-latest-docs.yml similarity index 96% rename from .github/workflows/publish-release-docs.yml rename to .github/workflows/publish-latest-docs.yml index 93df3e2a..bc7409f0 100644 --- a/.github/workflows/publish-release-docs.yml +++ b/.github/workflows/publish-latest-docs.yml @@ -1,4 +1,4 @@ -name: Publish Release Docs +name: Publish Latest Docs on: release: diff --git a/CHANGELOG.md b/CHANGELOG.md index 5342e003..4719dd02 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,24 +10,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), @@ -36,7 +19,13 @@ Don't forget to remove deprecated code on each major release! ## [Unreleased] -- Nothing (yet)! +### Added + +- `settings.py:REACTPY_ASYNC_RENDERING` to enable asynchronous rendering of components. + +### Changed + +- Bumped the minimum ReactPy version to `1.1.0`. ## [5.0.0] - 2024-10-22 diff --git a/README.md b/README.md index d3d2a1a9..89d1fb11 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ - [Customizable reconnection behavior](https://reactive-python.github.io/reactpy-django/latest/reference/settings/#stability-settings) - [Customizable disconnection behavior](https://reactive-python.github.io/reactpy-django/latest/reference/template-tag) - [Multiple root components](https://reactive-python.github.io/reactpy-django/latest/reference/template-tag/) -- [Cross-process communication/signaling (Channel Layers)](https://reactive-python.github.io/reactpy-django/latest/reference/hooks/#use-channel-layer) +- [Cross-process communication/signaling](https://reactive-python.github.io/reactpy-django/latest/reference/hooks/#use-channel-layer) - [Django view to ReactPy component conversion](https://reactive-python.github.io/reactpy-django/latest/reference/components/#view-to-component) - [Django static file access](https://reactive-python.github.io/reactpy-django/latest/reference/components/#django-css) - [Django database access](https://reactive-python.github.io/reactpy-django/latest/reference/hooks/#use-query) diff --git a/docs/src/reference/components.md b/docs/src/reference/components.md index 943b76c0..7c60ca68 100644 --- a/docs/src/reference/components.md +++ b/docs/src/reference/components.md @@ -160,7 +160,7 @@ Compatible with sync or async [Function Based Views](https://docs.djangoproject. - Requires manual intervention to change HTTP methods to anything other than `GET`. - ReactPy events cannot conveniently be attached to converted view HTML. - - Has no option to automatically intercept local anchor link (such as `#!html `) click events. + - Has no option to automatically intercept click events from hyperlinks (such as `#!html `). ??? question "How do I use this for Class Based Views?" diff --git a/docs/src/reference/router.md b/docs/src/reference/router.md index 28b84351..be6093c6 100644 --- a/docs/src/reference/router.md +++ b/docs/src/reference/router.md @@ -50,6 +50,6 @@ URL router that enables the ability to conditionally render other components bas | --- | --- | | `#!python VdomDict | None` | The matched component/path after it has been fully rendered. | -??? question "How is this different from `#!python reactpy_router.simple.router`?" +??? question "How is this different from `#!python reactpy_router.browser_router`?" - This component utilizes `reactpy-router` under the hood, but provides a more Django-like URL routing syntax. + The `django_router` component utilizes the same internals as `browser_router`, but provides a more Django-like URL routing syntax. diff --git a/docs/src/reference/settings.md b/docs/src/reference/settings.md index 3f35ee4d..e65dd203 100644 --- a/docs/src/reference/settings.md +++ b/docs/src/reference/settings.md @@ -87,7 +87,7 @@ This is useful to continuously update `#!python last_login` timestamps and refre Multiprocessing-safe database used by ReactPy for database-backed hooks and features. -If configuring this value, it is mandatory to enable our database router like such: +If configuring this value, it is mandatory to configure Django to use the ReactPy database router: === "settings.py" @@ -123,6 +123,18 @@ This setting is incompatible with [`daphne`](https://github.com/django/daphne). --- +### `#!python REACTPY_ASYNC_RENDERING` + +**Default:** `#!python False` + +**Example Value(s):** `#!python True` + +Configures whether to use an async ReactPy rendering queue. When enabled, large renders will no longer block smaller renders from taking place. Additionally, prevents the rendering queue from being blocked on waiting for async effects to startup/shutdown (which is typically a relatively slow operation). + +This setting is currently experimental, and currently no effort is made to de-duplicate renders. For example, if parent and child components are scheduled to render at the same time, both renders will take place even though a single render of the parent component would have been sufficient. + +--- + ### `#!python REACTPY_DEFAULT_HOSTS` **Default:** `#!python None` diff --git a/requirements/pkg-deps.txt b/requirements/pkg-deps.txt index cec6a9e1..61182ef9 100644 --- a/requirements/pkg-deps.txt +++ b/requirements/pkg-deps.txt @@ -1,6 +1,6 @@ channels >=4.0.0 django >=4.2.0 -reactpy >=1.0.2, <1.1.0 +reactpy >=1.1.0, <1.2.0 reactpy-router >=1.0.0, <2.0.0 dill >=0.3.5 orjson >=3.6.0 diff --git a/setup.py b/setup.py index a3388b35..f0c2f22d 100644 --- a/setup.py +++ b/setup.py @@ -11,8 +11,6 @@ from setuptools.command.develop import develop from setuptools.command.sdist import sdist -log = getLogger(__name__) - # ----------------------------------------------------------------------------- # Basic Constants # ----------------------------------------------------------------------------- @@ -22,6 +20,7 @@ js_dir = src_dir / "js" package_dir = src_dir / name static_dir = package_dir / "static" / name +log = getLogger(__name__) # ----------------------------------------------------------------------------- @@ -60,7 +59,10 @@ "Intended Audience :: Developers", "Intended Audience :: Science/Research", "Topic :: Multimedia :: Graphics", + "Topic :: Software Development :: Widget Sets", + "Topic :: Software Development :: User Interfaces", "Environment :: Web Environment", + "Typing :: Typed", ], } diff --git a/src/js/bun.lockb b/src/js/bun.lockb index 3807b5711eaf5836a8f91e41e3a15c31dc0c1370..142d0d8330711681d02299206f06f9d3b3333663 100644 GIT binary patch delta 19389 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 None: try: # Run the query if asyncio.iscoroutinefunction(query): - new_data = await query(**kwargs) + new_data = await query(**kwargs) # type: ignore[call-arg] else: new_data = await database_sync_to_async( query, thread_sensitive=thread_sensitive @@ -219,7 +219,7 @@ def use_mutation( ) -> Mutation[FuncParams]: """This hook is used to modify data in the background, typically to create/update/delete \ data from the Django ORM. - + Mutation functions can `return False` to prevent executing your `refetch` function. All \ other returns are ignored. Mutation functions can be sync or async. @@ -318,7 +318,7 @@ def use_user_data( save_default_data: bool = False, ) -> UserData: """Get or set user data stored within the REACTPY_DATABASE. - + Kwargs: default_data: A dictionary containing `{key: default_value}` pairs. \ For computationally intensive defaults, your `default_value` \ diff --git a/src/reactpy_django/http/views.py b/src/reactpy_django/http/views.py index 522d3dcf..780ccc17 100644 --- a/src/reactpy_django/http/views.py +++ b/src/reactpy_django/http/views.py @@ -37,6 +37,8 @@ async def web_modules_file(request: HttpRequest, file: str) -> HttpResponse: await caches[REACTPY_CACHE].aset( cache_key, file_contents, timeout=604800, version=int(last_modified_time) ) + + # TODO: Convert this to a StreamingHttpResponse return HttpResponse(file_contents, content_type="text/javascript") diff --git a/src/reactpy_django/pyscript/layout_handler.py b/src/reactpy_django/pyscript/layout_handler.py index 479cb613..f5a72fa9 100644 --- a/src/reactpy_django/pyscript/layout_handler.py +++ b/src/reactpy_django/pyscript/layout_handler.py @@ -107,7 +107,7 @@ def delete_old_workspaces(): if value.startswith("user_workspace_") } - # Delete the workspace if it exists at the moment when we check + # Delete any workspaces that are not being used for uuid in python_uuids - dom_uuids: task_name = f"task_{uuid}" if task_name in globals(): diff --git a/src/reactpy_django/utils.py b/src/reactpy_django/utils.py index 401cf724..b86cabdc 100644 --- a/src/reactpy_django/utils.py +++ b/src/reactpy_django/utils.py @@ -263,7 +263,7 @@ def generate_obj_name(obj: Any) -> str: """Makes a best effort to create a name for an object. Useful for JSON serialization of Python objects.""" - # First attempt: Dunder methods + # First attempt: Create a dotted path by inspecting dunder methods if hasattr(obj, "__module__"): if hasattr(obj, "__name__"): return f"{obj.__module__}.{obj.__name__}" From 2abe5ce89e2e77579f1e364ddb148b569b98cb49 Mon Sep 17 00:00:00 2001 From: Mark Bakhit Date: Sun, 24 Nov 2024 23:11:49 -0800 Subject: [PATCH 2/2] v5.1.0 (#259) --- CHANGELOG.md | 7 ++++++- src/reactpy_django/__init__.py | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4719dd02..82209551 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,10 @@ Don't forget to remove deprecated code on each major release! ## [Unreleased] +- Nothing (yet)! + +## [5.1.0] - 2024-11-24 + ### Added - `settings.py:REACTPY_ASYNC_RENDERING` to enable asynchronous rendering of components. @@ -508,7 +512,8 @@ Don't forget to remove deprecated code on each major release! - Support for IDOM within the Django -[Unreleased]: https://github.com/reactive-python/reactpy-django/compare/5.0.0...HEAD +[Unreleased]: https://github.com/reactive-python/reactpy-django/compare/5.1.0...HEAD +[5.1.0]: https://github.com/reactive-python/reactpy-django/compare/5.0.0...5.1.0 [5.0.0]: https://github.com/reactive-python/reactpy-django/compare/4.0.0...5.0.0 [4.0.0]: https://github.com/reactive-python/reactpy-django/compare/3.8.1...4.0.0 [3.8.1]: https://github.com/reactive-python/reactpy-django/compare/3.8.0...3.8.1 diff --git a/src/reactpy_django/__init__.py b/src/reactpy_django/__init__.py index 806428de..f3fb1545 100644 --- a/src/reactpy_django/__init__.py +++ b/src/reactpy_django/__init__.py @@ -13,7 +13,7 @@ ) from reactpy_django.websocket.paths import REACTPY_WEBSOCKET_ROUTE -__version__ = "5.0.0" +__version__ = "5.1.0" __all__ = [ "REACTPY_WEBSOCKET_ROUTE", "html",