Releases: reactive-python/reactpy
reactpy v2.0.0b6
All changes from v2.0.0b5 with a few additions:
- Fix
HOOK_STACKerrors - Remove
keyattribute from VDOM spec (Fix #1284) - Add
reactpy.html(...)shorthand notation for HTML fragments. - Add
reactpy.hshorthand alias forreactpy.html. - Add
reactpy.reactjs.component_from_npm - Deprecate
reactpy.web.* - Move
component_from_*functions intoreactpy.reactjs.* - Allow for all ReactPy and ReactJS components to be arbitrarily inserted into each other (Fix #1262)
reactpy v2.0.0b5
All changes from v2.0.0b4 with a few additions:
- Bump minimum Python version to 3.11
- Support Python 3.14
- Better error message if ASGI dependencies are missing
- Removed
reactpy.types.ContextProviderTypetop-level export. Usereactpy.types.ContextProviderinstead. - Removed
reactpy.types.LayoutTypetop-level export. Usereactpy.types.BaseLayoutinstead. - No longer require a package
namewithinreactjs_component_from_* - Remove
pipdependency - Convert
orjsoninto an ASGI only dependency - Fix
@reactpy/client's dependency path forevent-to-object - Fix #1001 (Create a better custom JS interface)
- Fix #624 (Refactor layout rendering)
- Fix #1198 (use_effect's unmount method is not always called with dynamically rendered children)
- Fix #1201 (de-duplicate async renders)
event-to-object v1.0.1
Add warning if user provided input was not a JSON serializable root object. These non-serializable values are now passed through as-is.
@reactpy/client v1.0.1
- Fix error when a user provided JavaScript component transmits event data that isn't JSON structured.
- Re-export
preactwithin top-level module to assist with version synchronization.
reactpy v2.0.0b4
All changes from v2.0.0b3 with a few additions:
- Improve type hints on
reactjs_component_from_* - Remove
jsonpointerdependency use_effectwill now generate an exception if attempting to use an async function. Useuse_async_effectinstead- Remove deprecated
Stopexception type - Remove deprecated
hotswapfunction - Remove top-level export of
reactpy.Layout. Usereactpy.core.layout.Layoutinstead.
event-to-object v1.0.0
Complete re-write to add more robust translation of events to plain JSON objects.
@reactpy/client v1.0.0
Complete re-write to support ReactPy v2.
reactpy v2.0.0b3
Summary
Welcome to the beta release of ReactPy v2, which brings ReactPy Standalone Mode, and ReactPy ASGI Middleware!
You can give this version a try by typing pip install reactpy[asgi]==2.0.0b3.
Here is a quick demo of the new ReactPy Standalone mode:
# FILENAME: example.py
from reactpy import component, html
from reactpy.executors.asgi import ReactPy
@component
def ExampleComponent():
return html.div("Hello World")
app = ReactPy(ExampleComponent)
# Now you can run `uvicorn example:app --reload` to start ReactPy!Here is a quick demo of the new ReactPy Middleware mode (using Starlette for demonstration purposes):
# FILENAME: example.py
from starlette.applications import Starlette
from starlette.routing import Route
from starlette.templating import Jinja2Templates
from reactpy.executors.asgi import ReactPyMiddleware
# You will need to follow your framework's guidelines on installing Jinja extensions
# When our new Jinja extension is installed, the `{% component "example.path" %}` tag will be available in any Jinja template.
# The template tag currently accepts a single argument, which is the dotted path to the component.
# For example {% component "my_package.ExampleComponent" %}
templates = Jinja2Templates(
directory="templates",
extensions=["reactpy.templatetags.Jinja"],
)
async def homepage(request):
return templates.TemplateResponse(request, "index.html")
app = ReactPyMiddleware(
Starlette(routes=[Route("/", homepage)]),
# Register components with ReactPy to allow them to be used as a root component in your templates
root_components=["my_package.ExampleComponent"],
)
# Now you can run `uvicorn example:app --reload` to start ReactPy!Changelog
Added
- Added
reactpy.executors.asgi.ReactPythat can be used to run ReactPy in standalone mode via ASGI. - Added
reactpy.executors.asgi.ReactPyCsrthat can be used to run ReactPy in standalone mode via ASGI, but rendered entirely client-sided. - Added
reactpy.executors.asgi.ReactPyMiddlewarethat can be used to utilize ReactPy within any ASGI compatible framework. - Added
reactpy.templatetags.ReactPyJinjathat can be used alongsideReactPyMiddlewareto embed several ReactPy components into your existing application. This includes the following template tags:{% component %},{% pyscript_component %}, and{% pyscript_setup %}. - Added
reactpy.pyscript_componentthat can be used to embed ReactPy components into your existing application. - Added
asgiandjinjainstallation extras (for examplepip install reactpy[asgi, jinja]). - Added support for Python 3.12 and 3.13.
- Added
reactpy.use_async_effecthook. - Added
shutdown_timeoutparameter to thereactpy.use_async_effecthook. reactpy.htmlwill now automatically flatten lists recursively (ex.reactpy.html(["child1", ["child2"]]))- Added
reactpy.Vdomprimitive interface for creating VDOM dictionaries. - Added type hints to
reactpy.htmlattributes. - Added support for nested components in web modules
- Added support for inline JavaScript as event handlers or other attributes that expect a callable via
reactpy.types.InlineJavaScript - Added
reactpy.web.reactjs_component_from_fileto import ReactJS components from a file. - Added
reactpy.web.reactjs_component_from_urlto import ReactJS components from a URL. - Added
reactpy.web.reactjs_component_from_stringto import ReactJS components from a string. - Event functions can now call
event.preventDefault()andevent.stopPropagation()methods directly on the event data object, rather than using the@eventdecorator. - Event data now supports accessing properties via dot notation (ex.
event.target.value).
Changed
- Substitute client-side usage of
reactwithpreact. - Script elements no longer support behaving like effects. They now strictly behave like plain HTML script elements.
- The
reactpy.htmlmodule has been modified to allow for auto-creation of any HTML nodes. For example, you can create a<data-table>element by callinghtml.data_table(). - Change
set_statecomparison method to check equality with==more consistently. - Add support for rendering
@componentchildren withinvdom_to_html. - Renamed the
use_locationhook'ssearchattribute toquery_string. - Renamed the
use_locationhook'spathnameattribute topath. - Renamed
reactpy.config.REACTPY_DEBUG_MODEtoreactpy.config.REACTPY_DEBUG. @reactpy/clientnow exportsReactandReactDOM.- ReactPy no longer auto-converts
snake_caseprops tocamelCase. It is now the responsibility of the user to ensure that props are in the correct format. reactpy.utils.reactpy_to_stringwill now retain the user's original casing fordata-*andaria-*attributes.reactpy.utils.string_to_reactpyhas been upgraded to handle more complex scenarios without causing ReactJS rendering errors.reactpy.core.vdom._CustomVdomDictConstructorhas been moved toreactpy.types.CustomVdomConstructor.reactpy.core.vdom._EllipsisReprhas been moved toreactpy.types.EllipsisRepr.reactpy.types.VdomDictConstructorhas been renamed toreactpy.types.VdomConstructor.- Rewrite the
event-to-objectpackage to be more robust at handling properties on events.
Deprecated
reactpy.web.exportis deprecated. Usereactpy.web.reactjs_component_from_*instead.reactpy.web.module_from_fileis deprecated. Usereactpy.web.reactjs_component_from_fileinstead.reactpy.web.module_from_urlis deprecated. Usereactpy.web.reactjs_component_from_urlinstead.reactpy.web.module_from_stringis deprecated. Usereactpy.web.reactjs_component_from_stringinstead.
Removed
- Removed the ability to import
reactpy.html.*elements directly. You must now callhtml.*to access the elements. - Removed
reactpy.samplemodule. - Removed
reactpy.svgmodule. Contents previously withinreactpy.svg.*can now be accessed viahtml.svg.*. - Removed
reactpy.html._function. Usehtml.fragmentinstead. - Removed
reactpy.run. See the documentation for the new method to run ReactPy applications. - Removed
reactpy.backend.*. See the documentation for the new method to run ReactPy applications. - Removed
reactpy.core.typesmodule. Usereactpy.typesinstead. - Removed
reactpy.utils.html_to_vdom. Usereactpy.utils.string_to_reactpyinstead. - Removed
reactpy.utils.vdom_to_html. Usereactpy.utils.reactpy_to_stringinstead. - Removed backend specific installation extras (such as
pip install reactpy[starlette]). - Removed deprecated function
module_from_template. - Removed support for Python 3.9.
- Removed support for async functions within
reactpy.use_effecthook. Usereactpy.use_async_effectinstead. - Removed
reactpy.vdom. Usereactpy.Vdominstead. - Removed
reactpy.core.make_vdom_constructor. Usereactpy.Vdominstead. - Removed
reactpy.core.custom_vdom_constructor. Usereactpy.Vdominstead.
Fixed
- Fixed a bug where script elements would not render to the DOM as plain text.
- Fixed a bug where the
keyproperty provided within server-side ReactPy code was failing to propagate to the front-end JavaScript components. - Fixed a bug where
RuntimeError("Hook stack is in an invalid state")errors could be generated when using a webserver that reuses threads.
reactpy v2.0.0b2
Summary
Welcome to the first public beta release of ReactPy v2, which brings ReactPy Standalone Mode, and ReactPy ASGI Middleware! That's right, ReactPy is now fully compatible with all ASGI frameworks!
You can give this version a try by typing pip install reactpy[asgi]==2.0.0b2.
Here is a quick demo of the new ReactPy Standalone mode:
# FILENAME: example.py
from reactpy import component, html
from reactpy import ReactPy
@component
def ExampleComponent():
return html.div("Hello World")
app = ReactPy(ExampleComponent)
# Now you can run `uvicorn example:app --reload` to start ReactPy!Here is a quick demo of the new ReactPy Middleware mode (using Starlette for demonstration purposes):
# FILENAME: example.py
from starlette.applications import Starlette
from starlette.routing import Route
from starlette.templating import Jinja2Templates
from reactpy import ReactPyMiddleware
# You will need to follow your framework's guidelines on installing Jinja extensions
# When our new Jinja extension is installed, the `{% component "example.path" %}` tag will be available in any Jinja template.
# The template tag currently accepts a single argument, which is the dotted path to the component.
# For example {% component "my_package.ExampleComponent" %}
templates = Jinja2Templates(
directory="templates",
extensions=["reactpy.jinja.ReactPyTemplateTag"],
)
async def homepage(request):
return templates.TemplateResponse(request, "index.html")
app = ReactPyMiddleware(
Starlette(routes=[Route("/", homepage)]),
# Register components with ReactPy to allow them to be used as a root component in your templates
root_components=["my_package.ExampleComponent"],
)
# Now you can run `uvicorn example:app --reload` to start ReactPy!Changelog
Added
- Added
reactpy.executors.asgi.ReactPythat can be used to run ReactPy in standalone mode via ASGI. - Added
reactpy.executors.asgi.ReactPyPyodidethat can be used to run ReactPy in standalone mode via ASGI, but rendered entirely client-sided. - Added
reactpy.executors.asgi.ReactPyMiddlewarethat can be used to utilize ReactPy within any ASGI compatible framework. - Added
reactpy.templatetags.Jinjathat can be used alongsideReactPyMiddlewareto embed several ReactPy components into your existing application. This includes the following template tags:{% component %},{% pyscript_component %}, and{% pyscript_setup %}. - Added
reactpy.pyscript_componentthat can be used to embed ReactPy components into your existing application. - Added
uvicornandjinjainstallation extras (for examplepip install reactpy[jinja]). - Added support for Python 3.12 and 3.13.
- Added
reactpy.use_async_effecthook. - Added
shutdown_timeoutparameter to thereactpy.use_async_effecthook. reactpy.htmlwill now automatically flatten lists recursively (ex.reactpy.html(["child1", ["child2"]]))- Added
reactpy.Vdomprimitive interface for creating VDOM dictionaries. - Added type hints to
reactpy.htmlattributes. - Added support for nested components in web modules
- Added support for inline JavaScript as event handlers or other attributes that expect a callable via
reactpy.types.InlineJavaScript
Changed
- Substitute client-side usage of
reactwithpreact. - Script elements no longer support behaving like effects. They now strictly behave like plain HTML script elements.
- The
reactpy.htmlmodule has been modified to allow for auto-creation of any HTML nodes. For example, you can create a<data-table>element by callinghtml.data_table(). - Change
set_statecomparison method to check equality with==more consistently. - Add support for rendering
@componentchildren withinvdom_to_html. - Renamed the
use_locationhook'ssearchattribute toquery_string. - Renamed the
use_locationhook'spathnameattribute topath. - Renamed
reactpy.config.REACTPY_DEBUG_MODEtoreactpy.config.REACTPY_DEBUG. @reactpy/clientnow exportsReactandReactDOM.- ReactPy no longer auto-converts
snake_caseprops tocamelCase. It is now the responsibility of the user to ensure that props are in the correct format. reactpy.utils.reactpy_to_stringwill now retain the user's original casing fordata-*andaria-*attributes.reactpy.utils.string_to_reactpyhas been upgraded to handle more complex scenarios without causing ReactJS rendering errors.reactpy.core.vdom._CustomVdomDictConstructorhas been moved toreactpy.types.CustomVdomConstructor.reactpy.core.vdom._EllipsisReprhas been moved toreactpy.types.EllipsisRepr.reactpy.types.VdomDictConstructorhas been renamed toreactpy.types.VdomConstructor.
Removed
- Removed the ability to import
reactpy.html.*elements directly. You must now callhtml.*to access the elements. - Removed
reactpy.samplemodule. - Removed
reactpy.svgmodule. Contents previously withinreactpy.svg.*can now be accessed viahtml.svg.*. - Removed
reactpy.html._function. Usehtml.fragmentinstead. - Removed
reactpy.run. See the documentation for the new method to run ReactPy applications. - Removed
reactpy.backend.*. See the documentation for the new method to run ReactPy applications. - Removed
reactpy.core.typesmodule. Usereactpy.typesinstead. - Removed
reactpy.utils.html_to_vdom. Usereactpy.utils.string_to_reactpyinstead. - Removed
reactpy.utils.vdom_to_html. Usereactpy.utils.reactpy_to_stringinstead. - All backend related installation extras (such as
pip install reactpy[starlette]) have been removed. - Removed deprecated function
module_from_template. - Removed support for Python 3.9.
- Removed support for async functions within
reactpy.use_effecthook. Usereactpy.use_async_effectinstead. - Removed
reactpy.vdom. Usereactpy.Vdominstead. - Removed
reactpy.core.make_vdom_constructor. Usereactpy.Vdominstead. - Removed
reactpy.core.custom_vdom_constructor. Usereactpy.Vdominstead.
Fixed
- Fixed a bug where script elements would not render to the DOM as plain text.
- Fixed a bug where the
keyproperty provided via server-side ReactPy code was failing to propagate to the front-end JavaScript component. - Fixed a bug where
RuntimeError("Hook stack is in an invalid state")errors would be provided when using a webserver that reuses threads.
reactpy v1.1.0
What's Changed
reactpy.runandconfigure(...)refactoring by @Archmonger in #1051- Fix flask backend mimetype for modules by @elro444 in #1131
- Concurrent Renders by @rmorshea in #1165
- Skip rendering None in all situations by @rmorshea in #1171
- Use
utf-8for reading files by @Archmonger in #1200 - Move
reactpy.backend.hooksmodule intoreactpy.core.hooksby @joshbmair in #1210 - Fixes needless custom component recreation (#1195) by @shawncrawley in #1224
- Added checked: element.checked to INPUT in elementConverters by @DennisHC in #1126
New Contributors
- @elro444 made their first contribution in #1131
- @joshbmair made their first contribution in #1210
- @shawncrawley made their first contribution in #1224
- @DennisHC made their first contribution in #1126
Full Changelog: reactpy-v1.0.2...reactpy-v1.1.0