From 2065cea093dc3e7796134ca467dd3d0303cb3068 Mon Sep 17 00:00:00 2001
From: Archmonger <16909269+Archmonger@users.noreply.github.com>
Date: Thu, 24 Oct 2024 02:01:31 -0700
Subject: [PATCH 01/11] rename docs release workflow
---
.../{publish-release-docs.yml => publish-latest-docs.yml} | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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:
From d3950b7cbbb9946048b36bcc6ce3b9f6c3897ab8 Mon Sep 17 00:00:00 2001
From: Archmonger <16909269+Archmonger@users.noreply.github.com>
Date: Thu, 24 Oct 2024 02:01:39 -0700
Subject: [PATCH 02/11] fix docs typo
---
docs/src/reference/router.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
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.
From 5e80ff7e02cb39d7d075e41e3843eb0c1ecc31a2 Mon Sep 17 00:00:00 2001
From: Archmonger <16909269+Archmonger@users.noreply.github.com>
Date: Thu, 24 Oct 2024 02:01:48 -0700
Subject: [PATCH 03/11] Remove unneeded module from pkg.json
---
src/js/package.json | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/js/package.json b/src/js/package.json
index 7f6cc019..401118ac 100644
--- a/src/js/package.json
+++ b/src/js/package.json
@@ -1,5 +1,4 @@
{
- "type": "module",
"scripts": {
"format": "prettier --write . && eslint --fix",
"check": "prettier --check . && eslint"
From 46e5ff7fc5c479d3e74a205cd55ab3a6786436eb Mon Sep 17 00:00:00 2001
From: Archmonger <16909269+Archmonger@users.noreply.github.com>
Date: Fri, 25 Oct 2024 00:19:39 -0700
Subject: [PATCH 04/11] add todo
---
src/reactpy_django/http/views.py | 2 ++
1 file changed, 2 insertions(+)
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")
From edd8496540a2a392f947ecd6139edb4ff8295f66 Mon Sep 17 00:00:00 2001
From: Archmonger <16909269+Archmonger@users.noreply.github.com>
Date: Thu, 31 Oct 2024 11:05:11 -0700
Subject: [PATCH 05/11] Move setup.py stuff around
---
setup.py | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
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",
],
}
From 75edbb96344f3d9163382c1c6b898752569bfeca Mon Sep 17 00:00:00 2001
From: Archmonger <16909269+Archmonger@users.noreply.github.com>
Date: Sun, 24 Nov 2024 02:56:32 -0800
Subject: [PATCH 06/11] docs and comment cleanup
---
README.md | 2 +-
docs/src/reference/components.md | 2 +-
docs/src/reference/settings.md | 2 +-
src/reactpy_django/pyscript/layout_handler.py | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
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/settings.md b/docs/src/reference/settings.md
index 3f35ee4d..3b74f56f 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"
diff --git a/src/reactpy_django/pyscript/layout_handler.py b/src/reactpy_django/pyscript/layout_handler.py
index 479cb613..136806bf 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 the workspace if it doesn't exist at this moment
for uuid in python_uuids - dom_uuids:
task_name = f"task_{uuid}"
if task_name in globals():
From be30c9bb353ee23ce77c3fd4897da07506bd6fa7 Mon Sep 17 00:00:00 2001
From: Archmonger <16909269+Archmonger@users.noreply.github.com>
Date: Sun, 24 Nov 2024 02:57:21 -0800
Subject: [PATCH 07/11] bump pyscript version
---
src/js/bun.lockb | Bin 101426 -> 102513 bytes
src/js/package.json | 2 +-
2 files changed, 1 insertion(+), 1 deletion(-)
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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
Date: Sun, 24 Nov 2024 03:22:09 -0800
Subject: [PATCH 08/11] Reactpy 1.1 allows usage of NoneType
---
requirements/pkg-deps.txt | 2 +-
src/reactpy_django/decorators.py | 8 ++------
2 files changed, 3 insertions(+), 7 deletions(-)
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/src/reactpy_django/decorators.py b/src/reactpy_django/decorators.py
index 39a028a4..d5278f7d 100644
--- a/src/reactpy_django/decorators.py
+++ b/src/reactpy_django/decorators.py
@@ -13,8 +13,6 @@
from django.contrib.auth.models import AbstractUser
-
-
def user_passes_test(
test_func: Callable[[AbstractUser], bool],
/,
@@ -59,7 +57,5 @@ def _user_passes_test(component_constructor, fallback, test_func, *args, **kwarg
# Render the component.
return user_component
- # Render the fallback component.
- # Returns an empty string if fallback is None, since ReactPy currently renders None as a string.
- # TODO: Remove this fallback when ReactPy can render None properly.
- return fallback(*args, **kwargs) if callable(fallback) else (fallback or "")
+ # Render the fallback content.
+ return fallback(*args, **kwargs) if callable(fallback) else (fallback or None)
From 188198a54bee9abb5170ba01764362ee8a8502f2 Mon Sep 17 00:00:00 2001
From: Archmonger <16909269+Archmonger@users.noreply.github.com>
Date: Sun, 24 Nov 2024 17:16:13 -0800
Subject: [PATCH 09/11] REACTPY_ASYNC_RENDERING
---
CHANGELOG.md | 4 +++-
docs/src/reference/settings.md | 12 ++++++++++++
src/reactpy_django/config.py | 6 +++++-
src/reactpy_django/utils.py | 2 +-
4 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5342e003..6fb71638 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -36,7 +36,9 @@ 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.
## [5.0.0] - 2024-10-22
diff --git a/docs/src/reference/settings.md b/docs/src/reference/settings.md
index 3b74f56f..e65dd203 100644
--- a/docs/src/reference/settings.md
+++ b/docs/src/reference/settings.md
@@ -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/src/reactpy_django/config.py b/src/reactpy_django/config.py
index a891cb5d..e74299e3 100644
--- a/src/reactpy_django/config.py
+++ b/src/reactpy_django/config.py
@@ -7,6 +7,7 @@
from django.core.cache import DEFAULT_CACHE_ALIAS
from django.db import DEFAULT_DB_ALIAS
from django.views import View
+from reactpy.config import REACTPY_ASYNC_RENDERING as _REACTPY_ASYNC_RENDERING
from reactpy.config import REACTPY_DEBUG_MODE as _REACTPY_DEBUG_MODE
from reactpy.core.types import ComponentConstructor
@@ -17,13 +18,16 @@
from reactpy_django.utils import import_dotted_path
# Non-configurable values
-_REACTPY_DEBUG_MODE.set_current(getattr(settings, "DEBUG"))
REACTPY_DEBUG_MODE = _REACTPY_DEBUG_MODE.current
REACTPY_REGISTERED_COMPONENTS: dict[str, ComponentConstructor] = {}
REACTPY_FAILED_COMPONENTS: set[str] = set()
REACTPY_REGISTERED_IFRAME_VIEWS: dict[str, Callable | View] = {}
# Configurable through Django settings.py
+_REACTPY_DEBUG_MODE.set_current(getattr(settings, "DEBUG"))
+_REACTPY_ASYNC_RENDERING.set_current(
+ getattr(settings, "REACTPY_ASYNC_RENDERING", _REACTPY_ASYNC_RENDERING.current)
+)
REACTPY_URL_PREFIX: str = getattr(
settings,
"REACTPY_URL_PREFIX",
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 603db4a05bbe19fa0aa8a3429f2d80674f92db26 Mon Sep 17 00:00:00 2001
From: Archmonger <16909269+Archmonger@users.noreply.github.com>
Date: Sun, 24 Nov 2024 17:25:37 -0800
Subject: [PATCH 10/11] Fix errors
---
src/js/package.json | 1 +
src/reactpy_django/hooks.py | 6 +++---
src/reactpy_django/pyscript/layout_handler.py | 2 +-
3 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/js/package.json b/src/js/package.json
index c372d193..cca215e6 100644
--- a/src/js/package.json
+++ b/src/js/package.json
@@ -1,4 +1,5 @@
{
+ "type": "module",
"scripts": {
"format": "prettier --write . && eslint --fix",
"check": "prettier --check . && eslint"
diff --git a/src/reactpy_django/hooks.py b/src/reactpy_django/hooks.py
index e13655c2..c226e1ca 100644
--- a/src/reactpy_django/hooks.py
+++ b/src/reactpy_django/hooks.py
@@ -150,7 +150,7 @@ async def execute_query() -> 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/pyscript/layout_handler.py b/src/reactpy_django/pyscript/layout_handler.py
index 136806bf..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 doesn't exist at this moment
+ # 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():
From b088f1be650543bc6c19aee34cc8ccdc7b7c7aed Mon Sep 17 00:00:00 2001
From: Archmonger <16909269+Archmonger@users.noreply.github.com>
Date: Sun, 24 Nov 2024 20:29:28 -0800
Subject: [PATCH 11/11] Add changelog note about bump rpy ver
---
CHANGELOG.md | 23 +++++------------------
1 file changed, 5 insertions(+), 18 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6fb71638..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/),
@@ -40,6 +23,10 @@ Don't forget to remove deprecated code on each major release!
- `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
### Changed