reactpy 2.0.0b2__py3-none-any.whl → 2.0.0b3__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.
Files changed (118) hide show
  1. reactpy/__init__.py +3 -2
  2. reactpy/_console/rewrite_keys.py +2 -4
  3. reactpy/core/component.py +1 -1
  4. reactpy/core/events.py +58 -15
  5. reactpy/core/hooks.py +2 -2
  6. reactpy/core/layout.py +3 -1
  7. reactpy/core/vdom.py +0 -1
  8. reactpy/executors/asgi/__init__.py +2 -2
  9. reactpy/executors/asgi/pyscript.py +2 -2
  10. reactpy/executors/utils.py +1 -3
  11. reactpy/pyscript/component_template.py +3 -6
  12. reactpy/pyscript/layout_handler.py +1 -1
  13. reactpy/static/index.js +2 -2
  14. reactpy/static/index.js.map +11 -10
  15. reactpy/static/morphdom/morphdom-esm.js +5 -0
  16. reactpy/static/morphdom/morphdom-factory.js +5 -0
  17. reactpy/static/morphdom/morphdom-umd.js +5 -0
  18. reactpy/static/morphdom/morphdom-umd.min.js +1 -1
  19. reactpy/static/morphdom/morphdom.js +5 -0
  20. reactpy/static/pyscript/codemirror-BYspKCDy.js +2 -0
  21. reactpy/static/pyscript/codemirror-BYspKCDy.js.map +1 -0
  22. reactpy/static/pyscript/codemirror_commands-BLDaEdQ6.js +2 -0
  23. reactpy/static/pyscript/codemirror_commands-BLDaEdQ6.js.map +1 -0
  24. reactpy/static/pyscript/codemirror_lang-python-CkOVBHci.js +2 -0
  25. reactpy/static/pyscript/codemirror_lang-python-CkOVBHci.js.map +1 -0
  26. reactpy/static/pyscript/codemirror_language-DOkvasqm.js +2 -0
  27. reactpy/static/pyscript/codemirror_language-DOkvasqm.js.map +1 -0
  28. reactpy/static/pyscript/codemirror_state-BIAL8JKm.js +2 -0
  29. reactpy/static/pyscript/{codemirror_state-1UkzIAPK.js.map → codemirror_state-BIAL8JKm.js.map} +1 -1
  30. reactpy/static/pyscript/codemirror_view-Bt4sLgyA.js +2 -0
  31. reactpy/static/pyscript/codemirror_view-Bt4sLgyA.js.map +1 -0
  32. reactpy/static/pyscript/core-PTfg6inS.js +4 -0
  33. reactpy/static/pyscript/core-PTfg6inS.js.map +1 -0
  34. reactpy/static/pyscript/core.css +1 -1
  35. reactpy/static/pyscript/core.js +1 -1
  36. reactpy/static/pyscript/{deprecations-manager-B8Tz2RBD.js → deprecations-manager-DIDxhyRq.js} +2 -2
  37. reactpy/static/pyscript/{deprecations-manager-B8Tz2RBD.js.map → deprecations-manager-DIDxhyRq.js.map} +1 -1
  38. reactpy/static/pyscript/{donkey-83vCPSep.js → donkey-CLhmQOjG.js} +2 -2
  39. reactpy/static/pyscript/{donkey-83vCPSep.js.map → donkey-CLhmQOjG.js.map} +1 -1
  40. reactpy/static/pyscript/error-uzvvriog.js +2 -0
  41. reactpy/static/pyscript/{error-Bd5T9j4s.js.map → error-uzvvriog.js.map} +1 -1
  42. reactpy/static/pyscript/index-jZ1aOVVJ.js +2 -0
  43. reactpy/static/pyscript/index-jZ1aOVVJ.js.map +1 -0
  44. reactpy/static/pyscript/mpy-CnF17tqI.js +2 -0
  45. reactpy/static/pyscript/mpy-CnF17tqI.js.map +1 -0
  46. reactpy/static/pyscript/py-BZSSqcx3.js +2 -0
  47. reactpy/static/pyscript/{py-CdW1_TfR.js.map → py-BZSSqcx3.js.map} +1 -1
  48. reactpy/static/pyscript/py-editor-DZ0Dxzzk.js +2 -0
  49. reactpy/static/pyscript/py-editor-DZ0Dxzzk.js.map +1 -0
  50. reactpy/static/pyscript/py-game-bqieV522.js +2 -0
  51. reactpy/static/pyscript/py-game-bqieV522.js.map +1 -0
  52. reactpy/static/pyscript/py-terminal-DYY4WN57.js +2 -0
  53. reactpy/static/pyscript/{py-terminal-C3QERaDG.js.map → py-terminal-DYY4WN57.js.map} +1 -1
  54. reactpy/static/pyscript/service-worker.js +1 -0
  55. reactpy/static/pyscript/storage.js +1 -1
  56. reactpy/static/pyscript/storage.js.map +1 -1
  57. reactpy/static/pyscript/toml-BK2RWy-G.js +3 -0
  58. reactpy/static/pyscript/{toml-DiUM0_qs.js.map → toml-BK2RWy-G.js.map} +1 -1
  59. reactpy/static/pyscript/toml-Blg7Izee.js +3 -0
  60. reactpy/static/pyscript/toml-Blg7Izee.js.map +1 -0
  61. reactpy/static/pyscript/xterm-DrSYbXEP.js +2 -0
  62. reactpy/static/pyscript/xterm-DrSYbXEP.js.map +1 -0
  63. reactpy/static/pyscript/xterm-readline-CK_45Ygx.js +2 -0
  64. reactpy/static/pyscript/xterm-readline-CK_45Ygx.js.map +1 -0
  65. reactpy/static/pyscript/xterm.css +1 -1
  66. reactpy/static/pyscript/xterm_addon-fit--gyF3PcZ.js.map +1 -1
  67. reactpy/static/pyscript/xterm_addon-web-links-D95xh2la.js +2 -0
  68. reactpy/static/pyscript/xterm_addon-web-links-D95xh2la.js.map +1 -0
  69. reactpy/static/pyscript/zip-pccs084i.js +2 -0
  70. reactpy/static/pyscript/zip-pccs084i.js.map +1 -0
  71. reactpy/templatetags/__init__.py +2 -2
  72. reactpy/templatetags/jinja.py +1 -1
  73. reactpy/testing/backend.py +1 -1
  74. reactpy/utils.py +5 -5
  75. reactpy/web/__init__.py +6 -0
  76. reactpy/web/module.py +242 -62
  77. reactpy/web/utils.py +1 -1
  78. {reactpy-2.0.0b2.dist-info → reactpy-2.0.0b3.dist-info}/METADATA +2 -3
  79. reactpy-2.0.0b3.dist-info/RECORD +116 -0
  80. {reactpy-2.0.0b2.dist-info → reactpy-2.0.0b3.dist-info}/WHEEL +1 -1
  81. reactpy/static/pyscript/codemirror-DNtCVICy.js +0 -2
  82. reactpy/static/pyscript/codemirror-DNtCVICy.js.map +0 -1
  83. reactpy/static/pyscript/codemirror_commands-DvCG1qNv.js +0 -2
  84. reactpy/static/pyscript/codemirror_commands-DvCG1qNv.js.map +0 -1
  85. reactpy/static/pyscript/codemirror_lang-python-BgZ6XoEX.js +0 -2
  86. reactpy/static/pyscript/codemirror_lang-python-BgZ6XoEX.js.map +0 -1
  87. reactpy/static/pyscript/codemirror_language-ddx8nifT.js +0 -2
  88. reactpy/static/pyscript/codemirror_language-ddx8nifT.js.map +0 -1
  89. reactpy/static/pyscript/codemirror_state-1UkzIAPK.js +0 -2
  90. reactpy/static/pyscript/codemirror_view-C2ObO--u.js +0 -2
  91. reactpy/static/pyscript/codemirror_view-C2ObO--u.js.map +0 -1
  92. reactpy/static/pyscript/core-BsIVS0z4.js +0 -4
  93. reactpy/static/pyscript/core-BsIVS0z4.js.map +0 -1
  94. reactpy/static/pyscript/error-Bd5T9j4s.js +0 -2
  95. reactpy/static/pyscript/index-978lpDXp.js +0 -2
  96. reactpy/static/pyscript/index-978lpDXp.js.map +0 -1
  97. reactpy/static/pyscript/mpy-De_qSCIU.js +0 -2
  98. reactpy/static/pyscript/mpy-De_qSCIU.js.map +0 -1
  99. reactpy/static/pyscript/py-CdW1_TfR.js +0 -2
  100. reactpy/static/pyscript/py-editor-MNjBwLfD.js +0 -2
  101. reactpy/static/pyscript/py-editor-MNjBwLfD.js.map +0 -1
  102. reactpy/static/pyscript/py-game-Did5BuBI.js +0 -2
  103. reactpy/static/pyscript/py-game-Did5BuBI.js.map +0 -1
  104. reactpy/static/pyscript/py-terminal-C3QERaDG.js +0 -2
  105. reactpy/static/pyscript/toml-BLBSZ43A.js +0 -3
  106. reactpy/static/pyscript/toml-BLBSZ43A.js.map +0 -1
  107. reactpy/static/pyscript/toml-DiUM0_qs.js +0 -3
  108. reactpy/static/pyscript/xterm-7LwxAMsn.js +0 -2
  109. reactpy/static/pyscript/xterm-7LwxAMsn.js.map +0 -1
  110. reactpy/static/pyscript/xterm-readline-e8QPhSrm.js +0 -2
  111. reactpy/static/pyscript/xterm-readline-e8QPhSrm.js.map +0 -1
  112. reactpy/static/pyscript/xterm_addon-web-links-Cnej-nJ6.js +0 -2
  113. reactpy/static/pyscript/xterm_addon-web-links-Cnej-nJ6.js.map +0 -1
  114. reactpy/static/pyscript/zip-CFEEYRfx.js +0 -2
  115. reactpy/static/pyscript/zip-CFEEYRfx.js.map +0 -1
  116. reactpy-2.0.0b2.dist-info/RECORD +0 -115
  117. {reactpy-2.0.0b2.dist-info → reactpy-2.0.0b3.dist-info}/entry_points.txt +0 -0
  118. {reactpy-2.0.0b2.dist-info → reactpy-2.0.0b3.dist-info}/licenses/LICENSE +0 -0
@@ -1,3 +1,3 @@
1
- from reactpy.templatetags.jinja import Jinja
1
+ from reactpy.templatetags.jinja import ReactPyJinja
2
2
 
3
- __all__ = ["Jinja"]
3
+ __all__ = ["ReactPyJinja"]
@@ -7,7 +7,7 @@ from reactpy.executors.utils import server_side_component_html
7
7
  from reactpy.pyscript.utils import pyscript_component_html, pyscript_setup_html
8
8
 
9
9
 
10
- class Jinja(StandaloneTag): # type: ignore
10
+ class ReactPyJinja(StandaloneTag): # type: ignore
11
11
  safe_output = True
12
12
  tags: ClassVar[set[str]] = {"component", "pyscript_component", "pyscript_setup"}
13
13
 
@@ -119,7 +119,7 @@ class BackendFixture:
119
119
  self.log_records = self._exit_stack.enter_context(capture_reactpy_logs())
120
120
 
121
121
  # Wait for the server to start
122
- self.webserver.config.setup_event_loop()
122
+ self.webserver.config.get_loop_factory()
123
123
  self.webserver_task = asyncio.create_task(self.webserver.serve())
124
124
  await asyncio.sleep(1)
125
125
 
reactpy/utils.py CHANGED
@@ -45,6 +45,8 @@ class Ref(Generic[_RefValue]):
45
45
  self.current = new
46
46
  return old
47
47
 
48
+ __hash__ = None # type: ignore
49
+
48
50
  def __eq__(self, other: object) -> bool:
49
51
  try:
50
52
  return isinstance(other, Ref) and (other.current == self.current)
@@ -111,19 +113,17 @@ def string_to_reactpy(
111
113
  try:
112
114
  root_node: etree._Element = fromstring(
113
115
  html.strip(),
114
- parser=etree.HTMLParser(
116
+ parser=etree.HTMLParser( # type: ignore
115
117
  remove_comments=True,
116
118
  remove_pis=True,
117
119
  remove_blank_text=True,
118
120
  recover=not strict,
119
121
  ),
120
122
  )
121
- except etree.XMLSyntaxError as e:
122
- if not strict:
123
- raise e # nocov
123
+ except Exception as e:
124
124
  msg = (
125
125
  "An error has occurred while parsing the HTML.\n\n"
126
- "This HTML may be malformatted, or may not perfectly adhere to HTML5.\n"
126
+ "This HTML may be malformatted, or may not adhere to the HTML5 spec.\n"
127
127
  "If you believe the exception above was due to something intentional, you "
128
128
  "can disable the strict parameter on string_to_reactpy().\n"
129
129
  "Otherwise, repair your broken HTML and try again."
reactpy/web/__init__.py CHANGED
@@ -3,6 +3,9 @@ from reactpy.web.module import (
3
3
  module_from_file,
4
4
  module_from_string,
5
5
  module_from_url,
6
+ reactjs_component_from_file,
7
+ reactjs_component_from_string,
8
+ reactjs_component_from_url,
6
9
  )
7
10
 
8
11
  __all__ = [
@@ -10,4 +13,7 @@ __all__ = [
10
13
  "module_from_file",
11
14
  "module_from_string",
12
15
  "module_from_url",
16
+ "reactjs_component_from_file",
17
+ "reactjs_component_from_string",
18
+ "reactjs_component_from_url",
13
19
  ]
reactpy/web/module.py CHANGED
@@ -7,6 +7,7 @@ from dataclasses import dataclass
7
7
  from pathlib import Path
8
8
  from typing import Any, NewType, overload
9
9
 
10
+ from reactpy._warnings import warn
10
11
  from reactpy.config import REACTPY_DEBUG, REACTPY_WEB_MODULES_DIR
11
12
  from reactpy.core.vdom import Vdom
12
13
  from reactpy.types import ImportSourceDict, VdomConstructor
@@ -27,71 +28,86 @@ URL_SOURCE = SourceType("URL")
27
28
  """A source loaded from a URL, usually a CDN"""
28
29
 
29
30
 
30
- def module_from_url(
31
+ _URL_WEB_MODULE_CACHE: dict[str, WebModule] = {}
32
+ _FILE_WEB_MODULE_CACHE: dict[str, WebModule] = {}
33
+ _STRING_WEB_MODULE_CACHE: dict[str, WebModule] = {}
34
+
35
+
36
+ def reactjs_component_from_url(
31
37
  url: str,
38
+ import_names: str | list[str] | tuple[str, ...],
32
39
  fallback: Any | None = None,
33
- resolve_exports: bool | None = None,
34
- resolve_exports_depth: int = 5,
40
+ resolve_imports: bool | None = None,
41
+ resolve_imports_depth: int = 5,
35
42
  unmount_before_update: bool = False,
36
- ) -> WebModule:
37
- """Load a :class:`WebModule` from a :data:`URL_SOURCE`
43
+ allow_children: bool = True,
44
+ ) -> VdomConstructor | list[VdomConstructor]:
45
+ """Import a component from a URL.
38
46
 
39
47
  Parameters:
40
48
  url:
41
- Where the javascript module will be loaded from which conforms to the
42
- interface for :ref:`Custom Javascript Components`
49
+ The URL to import the component from.
50
+ import_names:
51
+ One or more component names to import. If given as a string, a single component
52
+ will be returned. If a list is given, then a list of components will be
53
+ returned.
43
54
  fallback:
44
55
  What to temporarily display while the module is being loaded.
45
56
  resolve_imports:
46
- Whether to try and find all the named exports of this module.
47
- resolve_exports_depth:
48
- How deeply to search for those exports.
57
+ Whether to try and find all the named imports of this module.
58
+ resolve_imports_depth:
59
+ How deeply to search for those imports.
49
60
  unmount_before_update:
50
61
  Cause the component to be unmounted before each update. This option should
51
62
  only be used if the imported package fails to re-render when props change.
52
63
  Using this option has negative performance consequences since all DOM
53
64
  elements must be changed on each render. See :issue:`461` for more info.
65
+ allow_children:
66
+ Whether or not these components can have children.
54
67
  """
55
- return WebModule(
56
- source=url,
57
- source_type=URL_SOURCE,
58
- default_fallback=fallback,
59
- file=None,
60
- export_names=(
61
- resolve_module_exports_from_url(url, resolve_exports_depth)
62
- if (
63
- resolve_exports
64
- if resolve_exports is not None
65
- else REACTPY_DEBUG.current
66
- )
67
- else None
68
- ),
69
- unmount_before_update=unmount_before_update,
70
- )
68
+ key = f"{url}{resolve_imports}{resolve_imports_depth}{unmount_before_update}"
69
+ if key in _URL_WEB_MODULE_CACHE:
70
+ module = _URL_WEB_MODULE_CACHE[key]
71
+ else:
72
+ module = _module_from_url(
73
+ url,
74
+ fallback=fallback,
75
+ resolve_imports=resolve_imports,
76
+ resolve_imports_depth=resolve_imports_depth,
77
+ unmount_before_update=unmount_before_update,
78
+ )
79
+ _URL_WEB_MODULE_CACHE[key] = module
80
+ return _vdom_from_web_module(module, import_names, fallback, allow_children)
71
81
 
72
82
 
73
- def module_from_file(
83
+ def reactjs_component_from_file(
74
84
  name: str,
75
85
  file: str | Path,
86
+ import_names: str | list[str] | tuple[str, ...],
76
87
  fallback: Any | None = None,
77
- resolve_exports: bool | None = None,
78
- resolve_exports_depth: int = 5,
88
+ resolve_imports: bool | None = None,
89
+ resolve_imports_depth: int = 5,
79
90
  unmount_before_update: bool = False,
80
91
  symlink: bool = False,
81
- ) -> WebModule:
82
- """Load a :class:`WebModule` from a given ``file``
92
+ allow_children: bool = True,
93
+ ) -> VdomConstructor | list[VdomConstructor]:
94
+ """Import a component from a file.
83
95
 
84
96
  Parameters:
85
97
  name:
86
98
  The name of the package
87
99
  file:
88
100
  The file from which the content of the web module will be created.
101
+ import_names:
102
+ One or more component names to import. If given as a string, a single component
103
+ will be returned. If a list is given, then a list of components will be
104
+ returned.
89
105
  fallback:
90
106
  What to temporarily display while the module is being loaded.
91
107
  resolve_imports:
92
- Whether to try and find all the named exports of this module.
93
- resolve_exports_depth:
94
- How deeply to search for those exports.
108
+ Whether to try and find all the named imports of this module.
109
+ resolve_imports_depth:
110
+ How deeply to search for those imports.
95
111
  unmount_before_update:
96
112
  Cause the component to be unmounted before each update. This option should
97
113
  only be used if the imported package fails to re-render when props change.
@@ -99,7 +115,177 @@ def module_from_file(
99
115
  elements must be changed on each render. See :issue:`461` for more info.
100
116
  symlink:
101
117
  Whether the web module should be saved as a symlink to the given ``file``.
118
+ allow_children:
119
+ Whether or not these components can have children.
102
120
  """
121
+ key = f"{name}{resolve_imports}{resolve_imports_depth}{unmount_before_update}"
122
+ if key in _FILE_WEB_MODULE_CACHE:
123
+ module = _FILE_WEB_MODULE_CACHE[key]
124
+ else:
125
+ module = _module_from_file(
126
+ name,
127
+ file,
128
+ fallback=fallback,
129
+ resolve_imports=resolve_imports,
130
+ resolve_imports_depth=resolve_imports_depth,
131
+ unmount_before_update=unmount_before_update,
132
+ symlink=symlink,
133
+ )
134
+ _FILE_WEB_MODULE_CACHE[key] = module
135
+ return _vdom_from_web_module(module, import_names, fallback, allow_children)
136
+
137
+
138
+ def reactjs_component_from_string(
139
+ name: str,
140
+ content: str,
141
+ import_names: str | list[str] | tuple[str, ...],
142
+ fallback: Any | None = None,
143
+ resolve_imports: bool | None = None,
144
+ resolve_imports_depth: int = 5,
145
+ unmount_before_update: bool = False,
146
+ allow_children: bool = True,
147
+ ) -> VdomConstructor | list[VdomConstructor]:
148
+ """Import a component from a string.
149
+
150
+ Parameters:
151
+ name:
152
+ The name of the package
153
+ content:
154
+ The contents of the web module
155
+ import_names:
156
+ One or more component names to import. If given as a string, a single component
157
+ will be returned. If a list is given, then a list of components will be
158
+ returned.
159
+ fallback:
160
+ What to temporarily display while the module is being loaded.
161
+ resolve_imports:
162
+ Whether to try and find all the named imports of this module.
163
+ resolve_imports_depth:
164
+ How deeply to search for those imports.
165
+ unmount_before_update:
166
+ Cause the component to be unmounted before each update. This option should
167
+ only be used if the imported package fails to re-render when props change.
168
+ Using this option has negative performance consequences since all DOM
169
+ elements must be changed on each render. See :issue:`461` for more info.
170
+ allow_children:
171
+ Whether or not these components can have children.
172
+ """
173
+ key = f"{name}{resolve_imports}{resolve_imports_depth}{unmount_before_update}"
174
+ if key in _STRING_WEB_MODULE_CACHE:
175
+ module = _STRING_WEB_MODULE_CACHE[key]
176
+ else:
177
+ module = _module_from_string(
178
+ name,
179
+ content,
180
+ fallback=fallback,
181
+ resolve_imports=resolve_imports,
182
+ resolve_imports_depth=resolve_imports_depth,
183
+ unmount_before_update=unmount_before_update,
184
+ )
185
+ _STRING_WEB_MODULE_CACHE[key] = module
186
+ return _vdom_from_web_module(module, import_names, fallback, allow_children)
187
+
188
+
189
+ def module_from_url(
190
+ url: str,
191
+ fallback: Any | None = None,
192
+ resolve_exports: bool | None = None,
193
+ resolve_exports_depth: int = 5,
194
+ unmount_before_update: bool = False,
195
+ ) -> WebModule: # pragma: no cover
196
+ warn(
197
+ "module_from_url is deprecated, use reactjs_component_from_url instead",
198
+ DeprecationWarning,
199
+ )
200
+ return _module_from_url(
201
+ url,
202
+ fallback=fallback,
203
+ resolve_imports=resolve_exports,
204
+ resolve_imports_depth=resolve_exports_depth,
205
+ unmount_before_update=unmount_before_update,
206
+ )
207
+
208
+
209
+ def module_from_file(
210
+ name: str,
211
+ file: str | Path,
212
+ fallback: Any | None = None,
213
+ resolve_exports: bool | None = None,
214
+ resolve_exports_depth: int = 5,
215
+ unmount_before_update: bool = False,
216
+ symlink: bool = False,
217
+ ) -> WebModule: # pragma: no cover
218
+ warn(
219
+ "module_from_file is deprecated, use reactjs_component_from_file instead",
220
+ DeprecationWarning,
221
+ )
222
+ return _module_from_file(
223
+ name,
224
+ file,
225
+ fallback=fallback,
226
+ resolve_imports=resolve_exports,
227
+ resolve_imports_depth=resolve_exports_depth,
228
+ unmount_before_update=unmount_before_update,
229
+ symlink=symlink,
230
+ )
231
+
232
+
233
+ def module_from_string(
234
+ name: str,
235
+ content: str,
236
+ fallback: Any | None = None,
237
+ resolve_exports: bool | None = None,
238
+ resolve_exports_depth: int = 5,
239
+ unmount_before_update: bool = False,
240
+ ) -> WebModule: # pragma: no cover
241
+ warn(
242
+ "module_from_string is deprecated, use reactjs_component_from_string instead",
243
+ DeprecationWarning,
244
+ )
245
+ return _module_from_string(
246
+ name,
247
+ content,
248
+ fallback=fallback,
249
+ resolve_imports=resolve_exports,
250
+ resolve_imports_depth=resolve_exports_depth,
251
+ unmount_before_update=unmount_before_update,
252
+ )
253
+
254
+
255
+ def _module_from_url(
256
+ url: str,
257
+ fallback: Any | None = None,
258
+ resolve_imports: bool | None = None,
259
+ resolve_imports_depth: int = 5,
260
+ unmount_before_update: bool = False,
261
+ ) -> WebModule:
262
+ return WebModule(
263
+ source=url,
264
+ source_type=URL_SOURCE,
265
+ default_fallback=fallback,
266
+ file=None,
267
+ export_names=(
268
+ resolve_module_exports_from_url(url, resolve_imports_depth)
269
+ if (
270
+ resolve_imports
271
+ if resolve_imports is not None
272
+ else REACTPY_DEBUG.current
273
+ )
274
+ else None
275
+ ),
276
+ unmount_before_update=unmount_before_update,
277
+ )
278
+
279
+
280
+ def _module_from_file(
281
+ name: str,
282
+ file: str | Path,
283
+ fallback: Any | None = None,
284
+ resolve_imports: bool | None = None,
285
+ resolve_imports_depth: int = 5,
286
+ unmount_before_update: bool = False,
287
+ symlink: bool = False,
288
+ ) -> WebModule:
103
289
  name += module_name_suffix(name)
104
290
 
105
291
  source_file = Path(file).resolve()
@@ -124,10 +310,10 @@ def module_from_file(
124
310
  default_fallback=fallback,
125
311
  file=target_file,
126
312
  export_names=(
127
- resolve_module_exports_from_file(source_file, resolve_exports_depth)
313
+ resolve_module_exports_from_file(source_file, resolve_imports_depth)
128
314
  if (
129
- resolve_exports
130
- if resolve_exports is not None
315
+ resolve_imports
316
+ if resolve_imports is not None
131
317
  else REACTPY_DEBUG.current
132
318
  )
133
319
  else None
@@ -152,33 +338,14 @@ def _copy_file(target: Path, source: Path, symlink: bool) -> None:
152
338
  shutil.copy(source, target)
153
339
 
154
340
 
155
- def module_from_string(
341
+ def _module_from_string(
156
342
  name: str,
157
343
  content: str,
158
344
  fallback: Any | None = None,
159
- resolve_exports: bool | None = None,
160
- resolve_exports_depth: int = 5,
345
+ resolve_imports: bool | None = None,
346
+ resolve_imports_depth: int = 5,
161
347
  unmount_before_update: bool = False,
162
348
  ) -> WebModule:
163
- """Load a :class:`WebModule` whose ``content`` comes from a string.
164
-
165
- Parameters:
166
- name:
167
- The name of the package
168
- content:
169
- The contents of the web module
170
- fallback:
171
- What to temporarily display while the module is being loaded.
172
- resolve_imports:
173
- Whether to try and find all the named exports of this module.
174
- resolve_exports_depth:
175
- How deeply to search for those exports.
176
- unmount_before_update:
177
- Cause the component to be unmounted before each update. This option should
178
- only be used if the imported package fails to re-render when props change.
179
- Using this option has negative performance consequences since all DOM
180
- elements must be changed on each render. See :issue:`461` for more info.
181
- """
182
349
  name += module_name_suffix(name)
183
350
 
184
351
  target_file = _web_module_path(name)
@@ -199,10 +366,10 @@ def module_from_string(
199
366
  default_fallback=fallback,
200
367
  file=target_file,
201
368
  export_names=(
202
- resolve_module_exports_from_file(target_file, resolve_exports_depth)
369
+ resolve_module_exports_from_file(target_file, resolve_imports_depth)
203
370
  if (
204
- resolve_exports
205
- if resolve_exports is not None
371
+ resolve_imports
372
+ if resolve_imports is not None
206
373
  else REACTPY_DEBUG.current
207
374
  )
208
375
  else None
@@ -244,6 +411,19 @@ def export(
244
411
  export_names: str | list[str] | tuple[str, ...],
245
412
  fallback: Any | None = None,
246
413
  allow_children: bool = True,
414
+ ) -> VdomConstructor | list[VdomConstructor]: # pragma: no cover
415
+ warn(
416
+ "export is deprecated, use reactjs_component_from_* functions instead",
417
+ DeprecationWarning,
418
+ )
419
+ return _vdom_from_web_module(web_module, export_names, fallback, allow_children)
420
+
421
+
422
+ def _vdom_from_web_module(
423
+ web_module: WebModule,
424
+ export_names: str | list[str] | tuple[str, ...],
425
+ fallback: Any | None = None,
426
+ allow_children: bool = True,
247
427
  ) -> VdomConstructor | list[VdomConstructor]:
248
428
  """Return one or more VDOM constructors from a :class:`WebModule`
249
429
 
reactpy/web/utils.py CHANGED
@@ -12,7 +12,7 @@ def module_name_suffix(name: str) -> str:
12
12
  if name.startswith("@"):
13
13
  name = name[1:]
14
14
  head, _, tail = name.partition("@") # handle version identifier
15
- version, _, tail = tail.partition("/") # get section after version
15
+ _, _, tail = tail.partition("/") # get section after version
16
16
  return PurePosixPath(tail or head).suffix or ".js"
17
17
 
18
18
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reactpy
3
- Version: 2.0.0b2
3
+ Version: 2.0.0b3
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/
@@ -44,8 +44,7 @@ Requires-Dist: jinja2-simple-tags; extra == 'jinja'
44
44
  Requires-Dist: jinja2>=3; extra == 'jinja'
45
45
  Provides-Extra: testing
46
46
  Requires-Dist: playwright; extra == 'testing'
47
- Provides-Extra: uvicorn
48
- Requires-Dist: uvicorn[standard]; extra == 'uvicorn'
47
+ Requires-Dist: uvicorn[standard]; extra == 'testing'
49
48
  Description-Content-Type: text/markdown
50
49
 
51
50
  # <img src="https://raw.githubusercontent.com/reactive-python/reactpy/main/branding/svg/reactpy-logo-square.svg" align="left" height="45"/> ReactPy
@@ -0,0 +1,116 @@
1
+ reactpy/__init__.py,sha256=93qIqWNkP1e7sXDZ_j0wPJSTOO_o4swmO6x81iMFjpE,1252
2
+ reactpy/_html.py,sha256=SNDqr_ovXYFruC7ZWYFGCCCN9S4UTYGTsLnM-8VCz0o,11368
3
+ reactpy/_option.py,sha256=GK3Msnaqhcgkbx-RStbiMSeC9Qocf8Y6JbdxcO6f6ZI,5088
4
+ reactpy/_warnings.py,sha256=DR1YGzTS8ijaH0Wqh2V3TWDeDlkBwEb9dSsEYYuW-RI,933
5
+ reactpy/config.py,sha256=s3iWAQu9BAxidd5enacJm0b86cBaoVs-iTtWQrYpDy4,3835
6
+ reactpy/logging.py,sha256=VEQWQIjgAfAKj1qdvcT9PoMiRZ5iCfd0GPkhI5vmjxA,857
7
+ reactpy/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
8
+ reactpy/transforms.py,sha256=hgIiMriflwPsMZhtZkqUm5Qj_eR5hrLrp0yTJ7NnC_c,11837
9
+ reactpy/types.py,sha256=yVTkhWmI5_HdqdWZ3rPkf4eAEPTK5zdG4ReG_EY3OVA,32037
10
+ reactpy/utils.py,sha256=JSrSrA3JWJwGAK5vRx5jcgJ7kigTOJ41NjmUlNVi1ds,10891
11
+ reactpy/widgets.py,sha256=8gC3vlE_xDDfpgAlKVfnPXx9N8F-wdfRCismzNk2clk,3151
12
+ reactpy/_console/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ reactpy/_console/ast_utils.py,sha256=bBQ0hNP5-p5CbQFRK0-f-z1c1cVReNBFR0BAcN30vTg,6340
14
+ reactpy/_console/cli.py,sha256=r-6tOyK8nJw7RF0JLJrjdKkQIM-36ZZsuUmR5Opxo6M,346
15
+ reactpy/_console/rewrite_keys.py,sha256=Ydnbfxp8Sv6OnCwLCLQp6aTurAOLW9w1fOFVPWSudbc,3505
16
+ reactpy/_console/rewrite_props.py,sha256=JMPJQWdq837saZjccKMB4iogngoRCehwogIKmkPrr_M,4768
17
+ reactpy/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ reactpy/core/_f_back.py,sha256=hVVbAjfaGO7oTh3VGdDziThuspYftfQICtWSv_0i1yc,605
19
+ reactpy/core/_life_cycle_hook.py,sha256=z-kV9l6Nc8lZZyaG4t-_FXGgCxdaB6TfQo_h1ESqFL0,9583
20
+ reactpy/core/_thread_local.py,sha256=AW1T7z4M4DH92EyYCmfAH_gxxW51ZCqZBFfZdEO6u54,800
21
+ reactpy/core/component.py,sha256=1lRXyIKgpGz-Nl-Nz9dq0i972ZiYd-AuZPgoQjIOqVQ,2042
22
+ reactpy/core/events.py,sha256=CgN0ixRLpMsq5WmF0Ft82PbCb6yCSKLLaqeMLZdUkYY,8070
23
+ reactpy/core/hooks.py,sha256=y_gKX85o_0_UbWYj-P43DTKz9YBzZ49fuSwVAMmV2nw,19097
24
+ reactpy/core/layout.py,sha256=i-klWvbkQEan0ebgq-x8Y_T2L-ib1yiD4rxR1pV9Djw,26864
25
+ reactpy/core/serve.py,sha256=MYIWubmi9l8ACt-jPMpErFLO9TZTZbn8niw8WZ8wJwg,3110
26
+ reactpy/core/vdom.py,sha256=J7uHx35SHQakspnZkeD2Z1OvIu2yKt3yJHVBSIr1vdo,9918
27
+ reactpy/executors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ reactpy/executors/utils.py,sha256=ikhv0MvsOKq45Gm7auLh6PbxvUH2ZgC5HLFXI9vBcLc,2779
29
+ reactpy/executors/asgi/__init__.py,sha256=3a2x9izF5MmZrI70wdy3Z8CsSZhhM2_CFxoSI6B4eiI,231
30
+ reactpy/executors/asgi/middleware.py,sha256=ysxMMHGSpnELNvx4HLCe81H2NvvfNS99x76ph4VrTFQ,11457
31
+ reactpy/executors/asgi/pyscript.py,sha256=w2BwHB1eV_EguWPsriYMkPevte6vOcrgdsU8pe1Veeo,5329
32
+ reactpy/executors/asgi/standalone.py,sha256=gH-gYhicMxlwvPcpklKx8ZpFpp8LWYoQALNTUi-4czo,8736
33
+ reactpy/executors/asgi/types.py,sha256=IzWrukH7U7QCnVdpVXUcxIDh9FZzJwo9YthBrh8Rcjk,3362
34
+ reactpy/pyscript/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ reactpy/pyscript/component_template.py,sha256=jYzQ7YwfJ6RA3A1BcKs_1udUTt7dT3Qct7Bm73BsZdU,778
36
+ reactpy/pyscript/components.py,sha256=BJ8qx8qEUYO4Hus_QSBsMakMxkJ9BstTES2HztgVwmU,1927
37
+ reactpy/pyscript/layout_handler.py,sha256=aBrnBeiEMudUvRqbhW7KoJW-RkwS_wQ2KZl6m47vcNA,6289
38
+ reactpy/pyscript/utils.py,sha256=1gfofjejKpL5r2HCb9cHervtpjZe_aeP2feBykyJk_8,8808
39
+ reactpy/static/index.js,sha256=xzmpyApvtH0TYqFiRWK_jsTpFO6hbG7nQT4ns0bCnMk,32225
40
+ reactpy/static/index.js.map,sha256=jIrGsph86u76ILGDwH7cXVkalenV3d8QLcea5pJO7CY,104021
41
+ reactpy/static/pyscript-hide-debug.css,sha256=TSVmdOQVWwN-L9C0g0JmvvHoOfN4NlXvom0SXrIEmXg,33
42
+ reactpy/static/morphdom/morphdom-esm.js,sha256=SOgEV5tSt-D2pjMeZDbV0cLiHCT4FVKNipG8NQmE7Do,28610
43
+ reactpy/static/morphdom/morphdom-factory.js,sha256=iDCdYf_nbCiXC-_NKcp6nihq980NzgMZE6NX4HDgy74,26492
44
+ reactpy/static/morphdom/morphdom-umd.js,sha256=guJOFWL0884p3kouGnEBOxxjqpyT7joM8fRXaQihL9s,31590
45
+ reactpy/static/morphdom/morphdom-umd.min.js,sha256=rRqvVEHrJ5i5ndA6Qb6iZWLNY038mEXTuMX7zlYKa6w,12224
46
+ reactpy/static/morphdom/morphdom.js,sha256=q_fnruPPHb7gkgsN1AuHMcRm6z8dP2KXqLeNDqQabsY,28627
47
+ reactpy/static/pyscript/codemirror-BYspKCDy.js,sha256=0ZxmBG8rzI6o2Ges-EuvnaaosaEpuaEdKTHhxqeSofY,32085
48
+ reactpy/static/pyscript/codemirror-BYspKCDy.js.map,sha256=r40fSe6hMs1yGH6Fg2wlQbLK7CIM3sina2inageYNMY,139019
49
+ reactpy/static/pyscript/codemirror_commands-BLDaEdQ6.js,sha256=a87vV8ZV9xgTxRh1g-LzI0BWOJ0r4i92MfDEijpKebI,28770
50
+ reactpy/static/pyscript/codemirror_commands-BLDaEdQ6.js.map,sha256=fAwPJVfX5ZyxyoUTOApNTpep0rvh2zJQYV02_jSENkI,131480
51
+ reactpy/static/pyscript/codemirror_lang-python-CkOVBHci.js,sha256=vdwZ6IvuzYj7j9jFjL8-fhetlqGCNXtfWQjXbTbL3EE,70687
52
+ reactpy/static/pyscript/codemirror_lang-python-CkOVBHci.js.map,sha256=9Ox5qmpMOv_udOoHur5nAlLZAs5f2gbsIjAtit2ssus,188372
53
+ reactpy/static/pyscript/codemirror_language-DOkvasqm.js,sha256=02-Bd5bCds4PExp0Lud4FBspsBT7uF92sGci51F4cYg,65565
54
+ reactpy/static/pyscript/codemirror_language-DOkvasqm.js.map,sha256=1rm0Ahd6F2JVNxaIutEL0HMmhNuyz9Xtcl_BCnTjMAA,327054
55
+ reactpy/static/pyscript/codemirror_state-BIAL8JKm.js,sha256=lGkzLJ4LTv2VB6paBTNYSgK2A1TO4YPqG6aBa4f3MDc,48737
56
+ reactpy/static/pyscript/codemirror_state-BIAL8JKm.js.map,sha256=OVcm_Pe0oRYf8NvZ9D1jjgAjRfBq6EbYNcTKNuhFchs,231957
57
+ reactpy/static/pyscript/codemirror_view-Bt4sLgyA.js,sha256=f-uamvf8353cllO6_-vqFEuF5TB1ErYMGX1aGRCL6R4,197024
58
+ reactpy/static/pyscript/codemirror_view-Bt4sLgyA.js.map,sha256=a0Fvye4z0C4uyyCfJVgEvgwlj2UldF1sKfxjqgfE7Tw,792952
59
+ reactpy/static/pyscript/core-PTfg6inS.js,sha256=vYzwhaeMN-cPvtlJbdNCG0h7-Fk2Y6LTjaZrqWGrigY,168718
60
+ reactpy/static/pyscript/core-PTfg6inS.js.map,sha256=8PoWfw0MTBC5s8TM5gGGF9aA0EY2gyXicq57RyTJkl0,442263
61
+ reactpy/static/pyscript/core.css,sha256=_B-oSsUgzopqBRIPJhOqIMKtWjGJtWYSsNFdgtWvddw,874
62
+ reactpy/static/pyscript/core.js,sha256=O9_Ux5OiF5seezxL3Uc_CQ74f5-DoCF231xwSVQPrGY,260
63
+ reactpy/static/pyscript/core.js.map,sha256=bPWlTnjYM5VUPL0xxsF06yze-nqUhYcPJVB27Jrul64,88
64
+ reactpy/static/pyscript/deprecations-manager-DIDxhyRq.js,sha256=OsIMHXl_VPCa2VHgFrCi-3BKVLCKhsFVGAmqXpYRIHw,432
65
+ reactpy/static/pyscript/deprecations-manager-DIDxhyRq.js.map,sha256=JEO37YHWM6RKAsP4UpWzPsAUldoCRYyGBZpt50NvO4Q,1412
66
+ reactpy/static/pyscript/donkey-CLhmQOjG.js,sha256=kLNhL7zCpVGN1zB04ASeC8cv7KXJcfcHtj1Zpbmn_2k,2399
67
+ reactpy/static/pyscript/donkey-CLhmQOjG.js.map,sha256=Vg_SJfZRPlusZhOYAT10BjYbr_tfuiYUQVycwK5gzbA,8914
68
+ reactpy/static/pyscript/error-uzvvriog.js,sha256=uWRAZ1QoFdqwyn6YaSrm1IcoGgT6eNLc5eFJeszmdHU,734
69
+ reactpy/static/pyscript/error-uzvvriog.js.map,sha256=8W6vLCyRIvTUHbPVGSSo2OlnwQfpm_-o7y4mRKHi51E,2501
70
+ reactpy/static/pyscript/index-jZ1aOVVJ.js,sha256=U8ADmGwE04g-pePMxRGSvhiP2uJ2MxOmw-tCYsD9zJI,34792
71
+ reactpy/static/pyscript/index-jZ1aOVVJ.js.map,sha256=YI-P5FajSgjZA4ry7wS3Zo1rtucJoOr9NrCd3Hxr-7o,144987
72
+ reactpy/static/pyscript/mpy-CnF17tqI.js,sha256=zE2cj2aFd97cqRIs0HY3r58QMswso4GLnzAxaRHFEMA,2826
73
+ reactpy/static/pyscript/mpy-CnF17tqI.js.map,sha256=ySIB-qiLVpR8-ugbZfMtQL9wg_umvFYKOQtBLsGWo4w,13861
74
+ reactpy/static/pyscript/py-BZSSqcx3.js,sha256=0AEuFC6ln2HCLWX3FpjuU5Po3ThlragL3_tUktvM6Fc,2493
75
+ reactpy/static/pyscript/py-BZSSqcx3.js.map,sha256=2pUYVuQ2kNlkPrurIzKnZ5pYB1b3oF-kH4Zz9YcndWI,10424
76
+ reactpy/static/pyscript/py-editor-DZ0Dxzzk.js,sha256=Wme2c6wKcdoKMMLtLaMs5gz-ZMjwI490sByMTALlZyw,6666
77
+ reactpy/static/pyscript/py-editor-DZ0Dxzzk.js.map,sha256=ARwPEgIB7CKQ6p9aOrnGW_JrIf4FXUAZrCuLvQ8_WyQ,27173
78
+ reactpy/static/pyscript/py-game-bqieV522.js,sha256=Dofy6e4pb8_tuz8j9bVwk3Qq5owN3pv-IuOiTMqzeCg,1627
79
+ reactpy/static/pyscript/py-game-bqieV522.js.map,sha256=VQsOjfPlcSawpTziZ5Hpc8vX0M34s0S3IIWspSzT9tQ,6497
80
+ reactpy/static/pyscript/py-terminal-DYY4WN57.js,sha256=LNXc3yAzDbnbvrYGTzzr1yl1lXz0-XExFT6l7Xy53Og,755
81
+ reactpy/static/pyscript/py-terminal-DYY4WN57.js.map,sha256=Xm8cJyiCesId9kMRCbDHxj5HoMlpwLx46nX14BnG44w,3231
82
+ reactpy/static/pyscript/service-worker.js,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
83
+ reactpy/static/pyscript/storage.js,sha256=OHWnh-BmfSaHyhsUsOFQQkHExrWhRAoJiU-wQ3XSNLU,3995
84
+ reactpy/static/pyscript/storage.js.map,sha256=_voU4hlHT-yYQTQ7lWE3W932wvzZLbDBjuvzwxhe7cY,18387
85
+ reactpy/static/pyscript/toml-BK2RWy-G.js,sha256=hZBOEMbDag2mp1Fv-82gYZe2MV6AUjuFVGYH_it-hjs,987
86
+ reactpy/static/pyscript/toml-BK2RWy-G.js.map,sha256=_YXkRkepW3kbAasa2cT3IMITp_dA6jYGLm6H_YL_XAw,4984
87
+ reactpy/static/pyscript/toml-Blg7Izee.js,sha256=a49uDz4ULILqoyLCqQ_sG27k4gAqtDVPTjDRMSimuVA,21493
88
+ reactpy/static/pyscript/toml-Blg7Izee.js.map,sha256=j9AMk-MP6Nkoz-BJvdGtL8UmTNMRSx4GD8izPiVhnp8,59236
89
+ reactpy/static/pyscript/xterm-DrSYbXEP.js,sha256=czyQ3n4aKtiDJr-iB7Pl94D7HIzHm3A9njzKca2O-KM,290593
90
+ reactpy/static/pyscript/xterm-DrSYbXEP.js.map,sha256=axJBN_kd5S_fxXuu_vRHucOMrUor2T086HIRjC9OWRQ,641549
91
+ reactpy/static/pyscript/xterm-readline-CK_45Ygx.js,sha256=emxZyloWxSlGxglI8wDLFJ1f_3cVunUPWsNk-dXZ72Y,20962
92
+ reactpy/static/pyscript/xterm-readline-CK_45Ygx.js.map,sha256=_fRq7rq4hp9x0o70uQb6B_K8MQ6wZFfu7WUwMJTWadE,58306
93
+ reactpy/static/pyscript/xterm.css,sha256=zLRPPQkSKCR7-k6CVH62DNjiGG6vha5adwMfToJsi6I,2781
94
+ reactpy/static/pyscript/xterm_addon-fit--gyF3PcZ.js,sha256=kDBreljehlFf1wQoGADw4dcqyXGviO_pB7Cj0vgzivo,1387
95
+ reactpy/static/pyscript/xterm_addon-fit--gyF3PcZ.js.map,sha256=qEDJqBdqnLDiKMMypohuAFcXHWp7qQf1DE5s4gKptHw,3486
96
+ reactpy/static/pyscript/xterm_addon-web-links-D95xh2la.js,sha256=1QSOecgJTKJeB82G5Kt-lySFXP-HX-qGLBvGvaYjZw4,3008
97
+ reactpy/static/pyscript/xterm_addon-web-links-D95xh2la.js.map,sha256=da7uXeo4q_IsWDKr4m7Dfdq-aIBPO9ys_LUd-R-KapU,7940
98
+ reactpy/static/pyscript/zip-pccs084i.js,sha256=Xi7AoScnuKZgx803pBsSyfVLX6fi5-_XBU_2W-4UOrs,158922
99
+ reactpy/static/pyscript/zip-pccs084i.js.map,sha256=HiY9HOwFsPc-R9viM6qN0QVf1PQBEhA5Lg2-bDy2tu8,293552
100
+ reactpy/templatetags/__init__.py,sha256=slwD8UiXJ8WQAGxDsGy1_fpX-9mbwNAU17cTL0bktMo,80
101
+ reactpy/templatetags/jinja.py,sha256=YHKZhf6i6tsd0IwsS4SBb7kR9MbUjSKwuEH3xdtF6-Y,1541
102
+ reactpy/testing/__init__.py,sha256=f8JhesjRwOConigrCKd-XHRDAmpIA7xRU5oVIxLG4Fw,643
103
+ reactpy/testing/backend.py,sha256=21D8QfJYI70ezsEO4knBb8wzugUg7BvPN9fLqCoLtxw,7101
104
+ reactpy/testing/common.py,sha256=rPURV28pQSoMUFx46WtStTzF1e3APytOJTrov408qic,7080
105
+ reactpy/testing/display.py,sha256=9XbQ6qVrsbDXWIJ-LXemspGFqxmtzzIy5Ojed6J71-c,2170
106
+ reactpy/testing/logs.py,sha256=40MGuZIlwT6c_ziziwLCsH1Y032ROAFcLvd8g9lRvAc,5672
107
+ reactpy/testing/utils.py,sha256=b4s1hpLqdl_Z8G_hHAx3ELlr4x1oI9iuazOdS43wkZI,1071
108
+ reactpy/web/__init__.py,sha256=gJuI9-GMoMSV6KrA3idYRIWmFu6wtnwnIWU2IA8PJS0,422
109
+ reactpy/web/module.py,sha256=NYIeG83OBkX5SMBExA20pEN24uv9lgN356N9M_hA4F8,15906
110
+ reactpy/web/utils.py,sha256=gAlR_rIIB0ezPZCb8bYKd8hSPb95RTAjcQmozkUqMhY,5172
111
+ reactpy/web/templates/react.js,sha256=VIwJfl8S3b53PazgFdaWpgHLhTYpcmNdSQfpl9LPQdM,1950
112
+ reactpy-2.0.0b3.dist-info/METADATA,sha256=xEhZVXlZpt4wQWkLlLVv5iIabZZdXKoZZzL20aCX4s4,5052
113
+ reactpy-2.0.0b3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
114
+ reactpy-2.0.0b3.dist-info/entry_points.txt,sha256=WRit3ZrLVh7iDEhUMAPE3A9bcaa7TsolCdAdkxGmv0U,61
115
+ reactpy-2.0.0b3.dist-info/licenses/LICENSE,sha256=-8yQb3G5cW-IBhxyIe-uoQzI9lPEu7-6Yi5wJSO1ous,1093
116
+ reactpy-2.0.0b3.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.27.0
2
+ Generator: hatchling 1.28.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any