reactpy 2.0.0b4__py3-none-any.whl → 2.0.0b5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- reactpy/__init__.py +1 -1
- reactpy/_console/rewrite_props.py +2 -2
- reactpy/_option.py +2 -1
- reactpy/config.py +2 -2
- reactpy/core/_life_cycle_hook.py +8 -9
- reactpy/core/_thread_local.py +2 -1
- reactpy/core/component.py +4 -38
- reactpy/core/events.py +61 -36
- reactpy/core/hooks.py +25 -35
- reactpy/core/layout.py +174 -187
- reactpy/core/serve.py +6 -6
- reactpy/core/vdom.py +6 -7
- reactpy/executors/asgi/__init__.py +9 -4
- reactpy/executors/asgi/middleware.py +1 -2
- reactpy/executors/asgi/pyscript.py +3 -7
- reactpy/executors/asgi/standalone.py +4 -6
- reactpy/executors/asgi/types.py +2 -2
- reactpy/pyscript/components.py +3 -3
- reactpy/pyscript/utils.py +49 -46
- reactpy/static/index.js +2 -2
- reactpy/static/index.js.map +4 -4
- reactpy/testing/backend.py +2 -1
- reactpy/testing/common.py +3 -5
- reactpy/types.py +100 -47
- reactpy/utils.py +7 -7
- reactpy/web/module.py +13 -10
- reactpy/widgets.py +2 -2
- {reactpy-2.0.0b4.dist-info → reactpy-2.0.0b5.dist-info}/METADATA +4 -7
- {reactpy-2.0.0b4.dist-info → reactpy-2.0.0b5.dist-info}/RECORD +32 -32
- {reactpy-2.0.0b4.dist-info → reactpy-2.0.0b5.dist-info}/WHEEL +0 -0
- {reactpy-2.0.0b4.dist-info → reactpy-2.0.0b5.dist-info}/entry_points.txt +0 -0
- {reactpy-2.0.0b4.dist-info → reactpy-2.0.0b5.dist-info}/licenses/LICENSE +0 -0
reactpy/types.py
CHANGED
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
import inspect
|
|
4
|
+
from collections.abc import Awaitable, Callable, Mapping, Sequence
|
|
4
5
|
from dataclasses import dataclass
|
|
5
6
|
from pathlib import Path
|
|
6
7
|
from types import TracebackType
|
|
7
8
|
from typing import (
|
|
8
9
|
Any,
|
|
9
|
-
Callable,
|
|
10
10
|
Generic,
|
|
11
11
|
Literal,
|
|
12
|
+
NamedTuple,
|
|
13
|
+
NotRequired,
|
|
12
14
|
Protocol,
|
|
15
|
+
TypeAlias,
|
|
16
|
+
TypedDict,
|
|
13
17
|
TypeVar,
|
|
18
|
+
Unpack,
|
|
14
19
|
overload,
|
|
15
|
-
runtime_checkable,
|
|
16
20
|
)
|
|
17
21
|
|
|
18
|
-
from typing_extensions import NamedTuple, NotRequired, TypeAlias, TypedDict, Unpack
|
|
19
|
-
|
|
20
22
|
CarrierType = TypeVar("CarrierType")
|
|
21
23
|
_Type = TypeVar("_Type")
|
|
22
24
|
|
|
@@ -26,54 +28,84 @@ class State(NamedTuple, Generic[_Type]):
|
|
|
26
28
|
set_value: Callable[[_Type | Callable[[_Type], _Type]], None]
|
|
27
29
|
|
|
28
30
|
|
|
29
|
-
ComponentConstructor = Callable[..., "
|
|
31
|
+
ComponentConstructor = Callable[..., "Component"]
|
|
30
32
|
"""Simple function returning a new component"""
|
|
31
33
|
|
|
32
|
-
RootComponentConstructor = Callable[[], "
|
|
34
|
+
RootComponentConstructor = Callable[[], "Component"]
|
|
33
35
|
"""The root component should be constructed by a function accepting no arguments."""
|
|
34
36
|
|
|
35
37
|
|
|
36
38
|
Key: TypeAlias = str | int
|
|
37
39
|
|
|
38
40
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
"""The expected interface for all component-like objects"""
|
|
42
|
-
|
|
43
|
-
key: Key | None
|
|
44
|
-
"""An identifier which is unique amongst a component's immediate siblings"""
|
|
41
|
+
class Component:
|
|
42
|
+
"""An object for rending component models."""
|
|
45
43
|
|
|
46
|
-
type
|
|
47
|
-
"""The function or class defining the behavior of this component
|
|
44
|
+
__slots__ = "__weakref__", "_args", "_func", "_kwargs", "_sig", "key", "type"
|
|
48
45
|
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
def __init__(
|
|
47
|
+
self,
|
|
48
|
+
function: Callable[..., Component | VdomDict | str | None],
|
|
49
|
+
key: Any | None,
|
|
50
|
+
args: tuple[Any, ...],
|
|
51
|
+
kwargs: dict[str, Any],
|
|
52
|
+
sig: inspect.Signature,
|
|
53
|
+
) -> None:
|
|
54
|
+
self.key = key
|
|
55
|
+
self.type = function
|
|
56
|
+
self._args = args
|
|
57
|
+
self._kwargs = kwargs
|
|
58
|
+
self._sig = sig
|
|
59
|
+
|
|
60
|
+
def render(self) -> Component | VdomDict | str | None:
|
|
61
|
+
return self.type(*self._args, **self._kwargs)
|
|
51
62
|
|
|
52
|
-
def
|
|
53
|
-
|
|
63
|
+
def __repr__(self) -> str:
|
|
64
|
+
try:
|
|
65
|
+
args = self._sig.bind(*self._args, **self._kwargs).arguments
|
|
66
|
+
except TypeError:
|
|
67
|
+
return f"{self.type.__name__}(...)"
|
|
68
|
+
else:
|
|
69
|
+
items = ", ".join(f"{k}={v!r}" for k, v in args.items())
|
|
70
|
+
if items:
|
|
71
|
+
return f"{self.type.__name__}({id(self):02x}, {items})"
|
|
72
|
+
else:
|
|
73
|
+
return f"{self.type.__name__}({id(self):02x})"
|
|
54
74
|
|
|
55
75
|
|
|
56
76
|
_Render_co = TypeVar("_Render_co", covariant=True)
|
|
57
77
|
_Event_contra = TypeVar("_Event_contra", contravariant=True)
|
|
58
78
|
|
|
59
79
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
80
|
+
class BaseLayout(Protocol[_Render_co, _Event_contra]):
|
|
81
|
+
"""Renders and delivers views, and submits events to handlers."""
|
|
82
|
+
|
|
83
|
+
__slots__: tuple[str, ...] = (
|
|
84
|
+
"__weakref__",
|
|
85
|
+
"_event_handlers",
|
|
86
|
+
"_model_states_by_life_cycle_state_id",
|
|
87
|
+
"_render_tasks",
|
|
88
|
+
"_render_tasks_ready",
|
|
89
|
+
"_rendering_queue",
|
|
90
|
+
"_root_life_cycle_state_id",
|
|
91
|
+
"root",
|
|
92
|
+
)
|
|
63
93
|
|
|
64
94
|
async def render(
|
|
65
95
|
self,
|
|
66
|
-
) -> _Render_co:
|
|
96
|
+
) -> _Render_co:
|
|
97
|
+
"""Render an update to a view"""
|
|
98
|
+
...
|
|
67
99
|
|
|
68
|
-
async def deliver(
|
|
69
|
-
|
|
70
|
-
|
|
100
|
+
async def deliver(self, event: _Event_contra) -> None:
|
|
101
|
+
"""Relay an event to its respective handler"""
|
|
102
|
+
...
|
|
71
103
|
|
|
72
104
|
async def __aenter__(
|
|
73
105
|
self,
|
|
74
|
-
) ->
|
|
75
|
-
|
|
76
|
-
|
|
106
|
+
) -> BaseLayout[_Render_co, _Event_contra]:
|
|
107
|
+
"""Prepare the layout for its first render"""
|
|
108
|
+
...
|
|
77
109
|
|
|
78
110
|
async def __aexit__(
|
|
79
111
|
self,
|
|
@@ -82,6 +114,7 @@ class LayoutType(Protocol[_Render_co, _Event_contra]):
|
|
|
82
114
|
traceback: TracebackType,
|
|
83
115
|
) -> bool | None:
|
|
84
116
|
"""Clean up the view after its final render"""
|
|
117
|
+
...
|
|
85
118
|
|
|
86
119
|
|
|
87
120
|
class CssStyleTypeDict(TypedDict, total=False):
|
|
@@ -787,7 +820,7 @@ class VdomTypeDict(TypedDict):
|
|
|
787
820
|
|
|
788
821
|
tagName: str
|
|
789
822
|
key: NotRequired[Key | None]
|
|
790
|
-
children: NotRequired[Sequence[
|
|
823
|
+
children: NotRequired[Sequence[Component | VdomChild]]
|
|
791
824
|
attributes: NotRequired[VdomAttributes]
|
|
792
825
|
eventHandlers: NotRequired[EventHandlerDict]
|
|
793
826
|
inlineJavaScript: NotRequired[InlineJavaScriptDict]
|
|
@@ -815,7 +848,7 @@ class VdomDict(dict):
|
|
|
815
848
|
@overload
|
|
816
849
|
def __getitem__(
|
|
817
850
|
self, key: Literal["children"]
|
|
818
|
-
) -> Sequence[
|
|
851
|
+
) -> Sequence[Component | VdomChild]: ...
|
|
819
852
|
@overload
|
|
820
853
|
def __getitem__(self, key: Literal["attributes"]) -> VdomAttributes: ...
|
|
821
854
|
@overload
|
|
@@ -833,7 +866,7 @@ class VdomDict(dict):
|
|
|
833
866
|
def __setitem__(self, key: Literal["key"], value: Key | None) -> None: ...
|
|
834
867
|
@overload
|
|
835
868
|
def __setitem__(
|
|
836
|
-
self, key: Literal["children"], value: Sequence[
|
|
869
|
+
self, key: Literal["children"], value: Sequence[Component | VdomChild]
|
|
837
870
|
) -> None: ...
|
|
838
871
|
@overload
|
|
839
872
|
def __setitem__(
|
|
@@ -857,7 +890,7 @@ class VdomDict(dict):
|
|
|
857
890
|
super().__setitem__(key, value)
|
|
858
891
|
|
|
859
892
|
|
|
860
|
-
VdomChild: TypeAlias =
|
|
893
|
+
VdomChild: TypeAlias = Component | VdomDict | str | None | Any
|
|
861
894
|
"""A single child element of a :class:`VdomDict`"""
|
|
862
895
|
|
|
863
896
|
VdomChildren: TypeAlias = Sequence[VdomChild] | VdomChild
|
|
@@ -907,19 +940,26 @@ class EventHandlerFunc(Protocol):
|
|
|
907
940
|
async def __call__(self, data: Sequence[Any]) -> None: ...
|
|
908
941
|
|
|
909
942
|
|
|
910
|
-
|
|
911
|
-
class EventHandlerType(Protocol):
|
|
943
|
+
class BaseEventHandler:
|
|
912
944
|
"""Defines a handler for some event"""
|
|
913
945
|
|
|
946
|
+
__slots__ = (
|
|
947
|
+
"__weakref__",
|
|
948
|
+
"function",
|
|
949
|
+
"prevent_default",
|
|
950
|
+
"stop_propagation",
|
|
951
|
+
"target",
|
|
952
|
+
)
|
|
953
|
+
|
|
954
|
+
function: EventHandlerFunc
|
|
955
|
+
"""A coroutine which can respond to an event and its data"""
|
|
956
|
+
|
|
914
957
|
prevent_default: bool
|
|
915
958
|
"""Whether to block the event from propagating further up the DOM"""
|
|
916
959
|
|
|
917
960
|
stop_propagation: bool
|
|
918
961
|
"""Stops the default action associate with the event from taking place."""
|
|
919
962
|
|
|
920
|
-
function: EventHandlerFunc
|
|
921
|
-
"""A coroutine which can respond to an event and its data"""
|
|
922
|
-
|
|
923
963
|
target: str | None
|
|
924
964
|
"""Typically left as ``None`` except when a static target is useful.
|
|
925
965
|
|
|
@@ -932,10 +972,10 @@ class EventHandlerType(Protocol):
|
|
|
932
972
|
"""
|
|
933
973
|
|
|
934
974
|
|
|
935
|
-
EventHandlerMapping = Mapping[str,
|
|
975
|
+
EventHandlerMapping = Mapping[str, BaseEventHandler]
|
|
936
976
|
"""A generic mapping between event names to their handlers"""
|
|
937
977
|
|
|
938
|
-
EventHandlerDict: TypeAlias = dict[str,
|
|
978
|
+
EventHandlerDict: TypeAlias = dict[str, BaseEventHandler]
|
|
939
979
|
"""A dict mapping between event names to their handlers"""
|
|
940
980
|
|
|
941
981
|
InlineJavaScriptMapping = Mapping[str, InlineJavaScript]
|
|
@@ -991,17 +1031,30 @@ class Context(Protocol[_Type]):
|
|
|
991
1031
|
*children: Any,
|
|
992
1032
|
value: _Type = ...,
|
|
993
1033
|
key: Key | None = ...,
|
|
994
|
-
) ->
|
|
1034
|
+
) -> ContextProvider[_Type]: ...
|
|
995
1035
|
|
|
996
1036
|
|
|
997
|
-
class
|
|
998
|
-
|
|
1037
|
+
class ContextProvider(Component, Generic[_Type]):
|
|
1038
|
+
def __init__(
|
|
1039
|
+
self,
|
|
1040
|
+
*children: Any,
|
|
1041
|
+
value: _Type,
|
|
1042
|
+
key: Key | None,
|
|
1043
|
+
type: Context[_Type],
|
|
1044
|
+
) -> None:
|
|
1045
|
+
self.children = children
|
|
1046
|
+
self.key = key
|
|
1047
|
+
self.type = type
|
|
1048
|
+
self.value = value
|
|
999
1049
|
|
|
1000
|
-
|
|
1001
|
-
|
|
1050
|
+
def render(self) -> VdomDict:
|
|
1051
|
+
from reactpy.core.hooks import HOOK_STACK
|
|
1002
1052
|
|
|
1003
|
-
|
|
1004
|
-
|
|
1053
|
+
HOOK_STACK.current_hook().set_context_provider(self)
|
|
1054
|
+
return VdomDict(tagName="", children=self.children)
|
|
1055
|
+
|
|
1056
|
+
def __repr__(self) -> str:
|
|
1057
|
+
return f"ContextProvider({self.type})"
|
|
1005
1058
|
|
|
1006
1059
|
|
|
1007
1060
|
@dataclass
|
reactpy/utils.py
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import re
|
|
4
|
-
from collections.abc import Iterable
|
|
4
|
+
from collections.abc import Callable, Iterable
|
|
5
5
|
from importlib import import_module
|
|
6
6
|
from itertools import chain
|
|
7
|
-
from typing import Any,
|
|
7
|
+
from typing import Any, Generic, TypeVar, cast
|
|
8
8
|
|
|
9
9
|
from lxml import etree
|
|
10
10
|
from lxml.html import fromstring
|
|
11
11
|
|
|
12
12
|
from reactpy import html
|
|
13
13
|
from reactpy.transforms import RequiredTransforms, attributes_to_reactjs
|
|
14
|
-
from reactpy.types import
|
|
14
|
+
from reactpy.types import Component, VdomDict
|
|
15
15
|
|
|
16
16
|
_RefValue = TypeVar("_RefValue")
|
|
17
17
|
_ModelTransform = Callable[[VdomDict], Any]
|
|
@@ -63,7 +63,7 @@ class Ref(Generic[_RefValue]):
|
|
|
63
63
|
return f"{type(self).__name__}({current})"
|
|
64
64
|
|
|
65
65
|
|
|
66
|
-
def reactpy_to_string(root: VdomDict |
|
|
66
|
+
def reactpy_to_string(root: VdomDict | Component) -> str:
|
|
67
67
|
"""Convert a ReactPy component or `reactpy.html` element into an HTML string.
|
|
68
68
|
|
|
69
69
|
Parameters:
|
|
@@ -186,7 +186,7 @@ def _add_vdom_to_etree(parent: etree._Element, vdom: VdomDict | dict[str, Any])
|
|
|
186
186
|
|
|
187
187
|
for c in vdom.get("children", []):
|
|
188
188
|
if hasattr(c, "render"):
|
|
189
|
-
c = component_to_vdom(cast(
|
|
189
|
+
c = component_to_vdom(cast(Component, c))
|
|
190
190
|
if isinstance(c, dict):
|
|
191
191
|
_add_vdom_to_etree(element, c)
|
|
192
192
|
|
|
@@ -232,14 +232,14 @@ def _generate_vdom_children(
|
|
|
232
232
|
)
|
|
233
233
|
|
|
234
234
|
|
|
235
|
-
def component_to_vdom(component:
|
|
235
|
+
def component_to_vdom(component: Component) -> VdomDict:
|
|
236
236
|
"""Convert the first render of a component into a VDOM dictionary"""
|
|
237
237
|
result = component.render()
|
|
238
238
|
|
|
239
239
|
if isinstance(result, dict):
|
|
240
240
|
return result
|
|
241
241
|
if hasattr(result, "render"):
|
|
242
|
-
return component_to_vdom(cast(
|
|
242
|
+
return component_to_vdom(cast(Component, result))
|
|
243
243
|
elif isinstance(result, str):
|
|
244
244
|
return html.div(result)
|
|
245
245
|
return html.fragment()
|
reactpy/web/module.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import filecmp
|
|
4
|
+
import hashlib
|
|
4
5
|
import logging
|
|
5
6
|
import shutil
|
|
6
7
|
from dataclasses import dataclass
|
|
@@ -106,9 +107,9 @@ def reactjs_component_from_url(
|
|
|
106
107
|
|
|
107
108
|
@overload
|
|
108
109
|
def reactjs_component_from_file(
|
|
109
|
-
name: str,
|
|
110
110
|
file: str | Path,
|
|
111
111
|
import_names: str,
|
|
112
|
+
name: str = "",
|
|
112
113
|
fallback: Any | None = ...,
|
|
113
114
|
resolve_imports: bool | None = ...,
|
|
114
115
|
resolve_imports_depth: int = ...,
|
|
@@ -120,9 +121,9 @@ def reactjs_component_from_file(
|
|
|
120
121
|
|
|
121
122
|
@overload
|
|
122
123
|
def reactjs_component_from_file(
|
|
123
|
-
name: str,
|
|
124
124
|
file: str | Path,
|
|
125
125
|
import_names: list[str] | tuple[str, ...],
|
|
126
|
+
name: str = "",
|
|
126
127
|
fallback: Any | None = ...,
|
|
127
128
|
resolve_imports: bool | None = ...,
|
|
128
129
|
resolve_imports_depth: int = ...,
|
|
@@ -133,9 +134,9 @@ def reactjs_component_from_file(
|
|
|
133
134
|
|
|
134
135
|
|
|
135
136
|
def reactjs_component_from_file(
|
|
136
|
-
name: str,
|
|
137
137
|
file: str | Path,
|
|
138
138
|
import_names: str | list[str] | tuple[str, ...],
|
|
139
|
+
name: str = "",
|
|
139
140
|
fallback: Any | None = None,
|
|
140
141
|
resolve_imports: bool | None = None,
|
|
141
142
|
resolve_imports_depth: int = 5,
|
|
@@ -146,14 +147,14 @@ def reactjs_component_from_file(
|
|
|
146
147
|
"""Import a component from a file.
|
|
147
148
|
|
|
148
149
|
Parameters:
|
|
149
|
-
name:
|
|
150
|
-
The name of the package
|
|
151
150
|
file:
|
|
152
151
|
The file from which the content of the web module will be created.
|
|
153
152
|
import_names:
|
|
154
153
|
One or more component names to import. If given as a string, a single component
|
|
155
154
|
will be returned. If a list is given, then a list of components will be
|
|
156
155
|
returned.
|
|
156
|
+
name:
|
|
157
|
+
The human-readable name of the ReactJS package
|
|
157
158
|
fallback:
|
|
158
159
|
What to temporarily display while the module is being loaded.
|
|
159
160
|
resolve_imports:
|
|
@@ -170,6 +171,7 @@ def reactjs_component_from_file(
|
|
|
170
171
|
allow_children:
|
|
171
172
|
Whether or not these components can have children.
|
|
172
173
|
"""
|
|
174
|
+
name = name or hashlib.sha256(str(file).encode()).hexdigest()[:10]
|
|
173
175
|
key = f"{name}{resolve_imports}{resolve_imports_depth}{unmount_before_update}"
|
|
174
176
|
if key in _FILE_WEB_MODULE_CACHE:
|
|
175
177
|
module = _FILE_WEB_MODULE_CACHE[key]
|
|
@@ -189,9 +191,9 @@ def reactjs_component_from_file(
|
|
|
189
191
|
|
|
190
192
|
@overload
|
|
191
193
|
def reactjs_component_from_string(
|
|
192
|
-
name: str,
|
|
193
194
|
content: str,
|
|
194
195
|
import_names: str,
|
|
196
|
+
name: str = "",
|
|
195
197
|
fallback: Any | None = ...,
|
|
196
198
|
resolve_imports: bool | None = ...,
|
|
197
199
|
resolve_imports_depth: int = ...,
|
|
@@ -202,9 +204,9 @@ def reactjs_component_from_string(
|
|
|
202
204
|
|
|
203
205
|
@overload
|
|
204
206
|
def reactjs_component_from_string(
|
|
205
|
-
name: str,
|
|
206
207
|
content: str,
|
|
207
208
|
import_names: list[str] | tuple[str, ...],
|
|
209
|
+
name: str = "",
|
|
208
210
|
fallback: Any | None = ...,
|
|
209
211
|
resolve_imports: bool | None = ...,
|
|
210
212
|
resolve_imports_depth: int = ...,
|
|
@@ -214,9 +216,9 @@ def reactjs_component_from_string(
|
|
|
214
216
|
|
|
215
217
|
|
|
216
218
|
def reactjs_component_from_string(
|
|
217
|
-
name: str,
|
|
218
219
|
content: str,
|
|
219
220
|
import_names: str | list[str] | tuple[str, ...],
|
|
221
|
+
name: str = "",
|
|
220
222
|
fallback: Any | None = None,
|
|
221
223
|
resolve_imports: bool | None = None,
|
|
222
224
|
resolve_imports_depth: int = 5,
|
|
@@ -226,14 +228,14 @@ def reactjs_component_from_string(
|
|
|
226
228
|
"""Import a component from a string.
|
|
227
229
|
|
|
228
230
|
Parameters:
|
|
229
|
-
name:
|
|
230
|
-
The name of the package
|
|
231
231
|
content:
|
|
232
232
|
The contents of the web module
|
|
233
233
|
import_names:
|
|
234
234
|
One or more component names to import. If given as a string, a single component
|
|
235
235
|
will be returned. If a list is given, then a list of components will be
|
|
236
236
|
returned.
|
|
237
|
+
name:
|
|
238
|
+
The human-readable name of the ReactJS package
|
|
237
239
|
fallback:
|
|
238
240
|
What to temporarily display while the module is being loaded.
|
|
239
241
|
resolve_imports:
|
|
@@ -248,6 +250,7 @@ def reactjs_component_from_string(
|
|
|
248
250
|
allow_children:
|
|
249
251
|
Whether or not these components can have children.
|
|
250
252
|
"""
|
|
253
|
+
name = name or hashlib.sha256(content.encode()).hexdigest()[:10]
|
|
251
254
|
key = f"{name}{resolve_imports}{resolve_imports_depth}{unmount_before_update}"
|
|
252
255
|
if key in _STRING_WEB_MODULE_CACHE:
|
|
253
256
|
module = _STRING_WEB_MODULE_CACHE[key]
|
reactpy/widgets.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from base64 import b64encode
|
|
4
|
-
from collections.abc import Sequence
|
|
5
|
-
from typing import Any,
|
|
4
|
+
from collections.abc import Callable, Sequence
|
|
5
|
+
from typing import Any, Protocol, TypeVar
|
|
6
6
|
|
|
7
7
|
import reactpy
|
|
8
8
|
from reactpy._html import html
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: reactpy
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.0b5
|
|
4
4
|
Summary: It's React, but in Python.
|
|
5
5
|
Project-URL: Changelog, https://reactpy.dev/docs/about/changelog.html
|
|
6
6
|
Project-URL: Documentation, https://reactpy.dev/
|
|
@@ -8,28 +8,26 @@ Project-URL: Source, https://github.com/reactive-python/reactpy
|
|
|
8
8
|
Author-email: Mark Bakhit <archiethemonger@gmail.com>, Ryan Morshead <ryan.morshead@gmail.com>
|
|
9
9
|
License-Expression: MIT
|
|
10
10
|
License-File: LICENSE
|
|
11
|
-
Keywords:
|
|
11
|
+
Keywords: asgi,components,interactive,javascript,react,reactive,reactjs,reactpy,server,website,wsgi
|
|
12
12
|
Classifier: Development Status :: 5 - Production/Stable
|
|
13
13
|
Classifier: Programming Language :: Python
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
15
14
|
Classifier: Programming Language :: Python :: 3.11
|
|
16
15
|
Classifier: Programming Language :: Python :: 3.12
|
|
17
16
|
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
18
18
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
19
19
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
20
|
-
Requires-Python: >=3.
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
21
|
Requires-Dist: anyio>=3
|
|
22
22
|
Requires-Dist: fastjsonschema>=2.14.5
|
|
23
23
|
Requires-Dist: lxml>=4
|
|
24
24
|
Requires-Dist: requests>=2
|
|
25
|
-
Requires-Dist: typing-extensions>=3.10
|
|
26
25
|
Provides-Extra: all
|
|
27
26
|
Requires-Dist: asgi-tools; extra == 'all'
|
|
28
27
|
Requires-Dist: asgiref; extra == 'all'
|
|
29
28
|
Requires-Dist: jinja2-simple-tags; extra == 'all'
|
|
30
29
|
Requires-Dist: jinja2>=3; extra == 'all'
|
|
31
30
|
Requires-Dist: orjson; extra == 'all'
|
|
32
|
-
Requires-Dist: pip; extra == 'all'
|
|
33
31
|
Requires-Dist: playwright; extra == 'all'
|
|
34
32
|
Requires-Dist: servestatic; extra == 'all'
|
|
35
33
|
Requires-Dist: uvicorn[standard]; extra == 'all'
|
|
@@ -37,7 +35,6 @@ Provides-Extra: asgi
|
|
|
37
35
|
Requires-Dist: asgi-tools; extra == 'asgi'
|
|
38
36
|
Requires-Dist: asgiref; extra == 'asgi'
|
|
39
37
|
Requires-Dist: orjson; extra == 'asgi'
|
|
40
|
-
Requires-Dist: pip; extra == 'asgi'
|
|
41
38
|
Requires-Dist: servestatic; extra == 'asgi'
|
|
42
39
|
Provides-Extra: jinja
|
|
43
40
|
Requires-Dist: jinja2-simple-tags; extra == 'jinja'
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
reactpy/__init__.py,sha256
|
|
1
|
+
reactpy/__init__.py,sha256=-JzXcLiay8bWxSlRerOIjXe9XLdFM5SZudRUerLTaAM,1179
|
|
2
2
|
reactpy/_html.py,sha256=SNDqr_ovXYFruC7ZWYFGCCCN9S4UTYGTsLnM-8VCz0o,11368
|
|
3
|
-
reactpy/_option.py,sha256=
|
|
3
|
+
reactpy/_option.py,sha256=T4rQa_YIGLEVlYmqLDD-a2hQBfM5OHVGjFycTQUP4sI,5115
|
|
4
4
|
reactpy/_warnings.py,sha256=DR1YGzTS8ijaH0Wqh2V3TWDeDlkBwEb9dSsEYYuW-RI,933
|
|
5
|
-
reactpy/config.py,sha256=
|
|
5
|
+
reactpy/config.py,sha256=qLEOO2QQ_wq8qVaiPRujuc1nVVfwmJkHAAUTxvvQsTk,3791
|
|
6
6
|
reactpy/logging.py,sha256=VEQWQIjgAfAKj1qdvcT9PoMiRZ5iCfd0GPkhI5vmjxA,857
|
|
7
7
|
reactpy/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
|
|
8
8
|
reactpy/transforms.py,sha256=hgIiMriflwPsMZhtZkqUm5Qj_eR5hrLrp0yTJ7NnC_c,11837
|
|
9
|
-
reactpy/types.py,sha256=
|
|
10
|
-
reactpy/utils.py,sha256=
|
|
11
|
-
reactpy/widgets.py,sha256=
|
|
9
|
+
reactpy/types.py,sha256=xF8QvkNgzJZXgKOnRAL_NA82UIDQk594qzkdUXjY1Go,33739
|
|
10
|
+
reactpy/utils.py,sha256=pCPLpqnS8PhTsWnUROVOOLuQC_dzGo6fTiDd-ATVOEc,10871
|
|
11
|
+
reactpy/widgets.py,sha256=xLfjTqvDg96jQa-mApex7QGcikt216DeTcDFc_9pwAU,2623
|
|
12
12
|
reactpy/_console/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
13
|
reactpy/_console/ast_utils.py,sha256=bBQ0hNP5-p5CbQFRK0-f-z1c1cVReNBFR0BAcN30vTg,6340
|
|
14
14
|
reactpy/_console/cli.py,sha256=r-6tOyK8nJw7RF0JLJrjdKkQIM-36ZZsuUmR5Opxo6M,346
|
|
15
15
|
reactpy/_console/rewrite_keys.py,sha256=Ydnbfxp8Sv6OnCwLCLQp6aTurAOLW9w1fOFVPWSudbc,3505
|
|
16
|
-
reactpy/_console/rewrite_props.py,sha256=
|
|
16
|
+
reactpy/_console/rewrite_props.py,sha256=bnGjLBOLQJNgIWBbilQ6Df_nJBuPDODk93bAQUwgC4s,4791
|
|
17
17
|
reactpy/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
18
|
reactpy/core/_f_back.py,sha256=hVVbAjfaGO7oTh3VGdDziThuspYftfQICtWSv_0i1yc,605
|
|
19
|
-
reactpy/core/_life_cycle_hook.py,sha256=
|
|
20
|
-
reactpy/core/_thread_local.py,sha256=
|
|
21
|
-
reactpy/core/component.py,sha256=
|
|
22
|
-
reactpy/core/events.py,sha256=
|
|
23
|
-
reactpy/core/hooks.py,sha256=
|
|
24
|
-
reactpy/core/layout.py,sha256=
|
|
25
|
-
reactpy/core/serve.py,sha256=
|
|
26
|
-
reactpy/core/vdom.py,sha256=
|
|
19
|
+
reactpy/core/_life_cycle_hook.py,sha256=T8R3BMi7QaEsi1la1nywwfG_h4ts1JEe4MdsBTskGdU,9568
|
|
20
|
+
reactpy/core/_thread_local.py,sha256=nqvmSQhTrFgh34RUhzSTPEy1AaW3_j82Ji96BTz7hu0,827
|
|
21
|
+
reactpy/core/component.py,sha256=zASYlRhBrT6JZ-_uTU7N_UOhVSIsnnky4S8xoz5OY98,969
|
|
22
|
+
reactpy/core/events.py,sha256=HK8SHvl6uQS4H1AqfoK4Mj_YCaMaX3JvSFJ6Bqc4eMI,8594
|
|
23
|
+
reactpy/core/hooks.py,sha256=GtEG1bFubMUR1BLW_k5cBz1-mCy6XxKUkoR1x_tv2mk,19034
|
|
24
|
+
reactpy/core/layout.py,sha256=nNO4y6vxhEpmcw3JHDGxPENDr_y_KegBYO_UyUmdswY,25842
|
|
25
|
+
reactpy/core/serve.py,sha256=KU71UlAITA_b3ahz93rZTlqX0uHOXCYpR09GDsAWrmk,2544
|
|
26
|
+
reactpy/core/vdom.py,sha256=porm5xYGiKJSYM5rFd4jkzC-csAx5S4n1ZgWMo60pxI,9910
|
|
27
27
|
reactpy/executors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
28
|
reactpy/executors/utils.py,sha256=ikhv0MvsOKq45Gm7auLh6PbxvUH2ZgC5HLFXI9vBcLc,2779
|
|
29
|
-
reactpy/executors/asgi/__init__.py,sha256=
|
|
30
|
-
reactpy/executors/asgi/middleware.py,sha256=
|
|
31
|
-
reactpy/executors/asgi/pyscript.py,sha256=
|
|
32
|
-
reactpy/executors/asgi/standalone.py,sha256=
|
|
33
|
-
reactpy/executors/asgi/types.py,sha256=
|
|
29
|
+
reactpy/executors/asgi/__init__.py,sha256=eneHZqUxGxTUkTrrpXhq_YBqfA_mig-9YBTNNVFzXC0,405
|
|
30
|
+
reactpy/executors/asgi/middleware.py,sha256=AgXs7VxBjS01v1Fq4WkU6ORmNr7-pd7eEzaybRYig3o,11428
|
|
31
|
+
reactpy/executors/asgi/pyscript.py,sha256=W-5E5RNVsE5zNKF9iU0zs0M37DKbuGWTKUZiOwoVbWs,5263
|
|
32
|
+
reactpy/executors/asgi/standalone.py,sha256=dh1BqFwDOcsXeAjgWH2cw2Wn3vp4KK7x8uwhX_cb3BM,8698
|
|
33
|
+
reactpy/executors/asgi/types.py,sha256=jCIU8mJx1CMvYtmV3Lq7iIET8uiSwAeMJOwTsosHBKs,3362
|
|
34
34
|
reactpy/pyscript/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
35
35
|
reactpy/pyscript/component_template.py,sha256=jYzQ7YwfJ6RA3A1BcKs_1udUTt7dT3Qct7Bm73BsZdU,778
|
|
36
|
-
reactpy/pyscript/components.py,sha256=
|
|
36
|
+
reactpy/pyscript/components.py,sha256=1ZUM3o11cbb4QC1eSCSo1euJeV6uaKAleB3Ie7ntyoU,1915
|
|
37
37
|
reactpy/pyscript/layout_handler.py,sha256=aBrnBeiEMudUvRqbhW7KoJW-RkwS_wQ2KZl6m47vcNA,6289
|
|
38
|
-
reactpy/pyscript/utils.py,sha256=
|
|
39
|
-
reactpy/static/index.js,sha256=
|
|
40
|
-
reactpy/static/index.js.map,sha256=
|
|
38
|
+
reactpy/pyscript/utils.py,sha256=VX13umrX-d9qvSdxBfS6_RiXPjD5DGYJQA25PpEpn5Q,8854
|
|
39
|
+
reactpy/static/index.js,sha256=wgV9C8lXoR0DjQRLplUlSqC7Xz0piLJWCcVjdQQOvq4,32495
|
|
40
|
+
reactpy/static/index.js.map,sha256=oYBPFgYcxsgDIAaKEADBkrRVSm9v4lzrpp8PvdhS5bo,105332
|
|
41
41
|
reactpy/static/pyscript-hide-debug.css,sha256=TSVmdOQVWwN-L9C0g0JmvvHoOfN4NlXvom0SXrIEmXg,33
|
|
42
42
|
reactpy/static/morphdom/morphdom-esm.js,sha256=SOgEV5tSt-D2pjMeZDbV0cLiHCT4FVKNipG8NQmE7Do,28610
|
|
43
43
|
reactpy/static/morphdom/morphdom-factory.js,sha256=iDCdYf_nbCiXC-_NKcp6nihq980NzgMZE6NX4HDgy74,26492
|
|
@@ -100,17 +100,17 @@ reactpy/static/pyscript/zip-pccs084i.js.map,sha256=HiY9HOwFsPc-R9viM6qN0QVf1PQBE
|
|
|
100
100
|
reactpy/templatetags/__init__.py,sha256=slwD8UiXJ8WQAGxDsGy1_fpX-9mbwNAU17cTL0bktMo,80
|
|
101
101
|
reactpy/templatetags/jinja.py,sha256=YHKZhf6i6tsd0IwsS4SBb7kR9MbUjSKwuEH3xdtF6-Y,1541
|
|
102
102
|
reactpy/testing/__init__.py,sha256=f8JhesjRwOConigrCKd-XHRDAmpIA7xRU5oVIxLG4Fw,643
|
|
103
|
-
reactpy/testing/backend.py,sha256=
|
|
104
|
-
reactpy/testing/common.py,sha256=
|
|
103
|
+
reactpy/testing/backend.py,sha256=cH9LD0KeiM3eWFs-0MkAkrsNgUrZweL9Ts8PAZs8G3M,7128
|
|
104
|
+
reactpy/testing/common.py,sha256=gkcEJDAel-6nsOtuL628WoB1eSmzhLKp6RFwtN84TR8,7042
|
|
105
105
|
reactpy/testing/display.py,sha256=9XbQ6qVrsbDXWIJ-LXemspGFqxmtzzIy5Ojed6J71-c,2170
|
|
106
106
|
reactpy/testing/logs.py,sha256=40MGuZIlwT6c_ziziwLCsH1Y032ROAFcLvd8g9lRvAc,5672
|
|
107
107
|
reactpy/testing/utils.py,sha256=b4s1hpLqdl_Z8G_hHAx3ELlr4x1oI9iuazOdS43wkZI,1071
|
|
108
108
|
reactpy/web/__init__.py,sha256=gJuI9-GMoMSV6KrA3idYRIWmFu6wtnwnIWU2IA8PJS0,422
|
|
109
|
-
reactpy/web/module.py,sha256=
|
|
109
|
+
reactpy/web/module.py,sha256=hpm60GbUMimIPY7_7-AJ7CCZesVxEE1Ur9Vrra6bzQg,18097
|
|
110
110
|
reactpy/web/utils.py,sha256=gAlR_rIIB0ezPZCb8bYKd8hSPb95RTAjcQmozkUqMhY,5172
|
|
111
111
|
reactpy/web/templates/react.js,sha256=VIwJfl8S3b53PazgFdaWpgHLhTYpcmNdSQfpl9LPQdM,1950
|
|
112
|
-
reactpy-2.0.
|
|
113
|
-
reactpy-2.0.
|
|
114
|
-
reactpy-2.0.
|
|
115
|
-
reactpy-2.0.
|
|
116
|
-
reactpy-2.0.
|
|
112
|
+
reactpy-2.0.0b5.dist-info/METADATA,sha256=XFAsLQjc7T6iaZ7G9u7e-o3uIBLz8F9OCh0o43U39bI,4998
|
|
113
|
+
reactpy-2.0.0b5.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
114
|
+
reactpy-2.0.0b5.dist-info/entry_points.txt,sha256=WRit3ZrLVh7iDEhUMAPE3A9bcaa7TsolCdAdkxGmv0U,61
|
|
115
|
+
reactpy-2.0.0b5.dist-info/licenses/LICENSE,sha256=-8yQb3G5cW-IBhxyIe-uoQzI9lPEu7-6Yi5wJSO1ous,1093
|
|
116
|
+
reactpy-2.0.0b5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|