pulse-framework 0.1.56__tar.gz → 0.1.58__tar.gz
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.
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/PKG-INFO +5 -3
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/pyproject.toml +5 -3
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/react_component.py +12 -2
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/imports.py +10 -1
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/README.md +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/__init__.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/_examples.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/app.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/channel.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/__init__.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/cmd.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/dependencies.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/folder_lock.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/helpers.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/logging.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/models.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/packages.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/processes.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/secrets.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/uvicorn_log_config.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/code_analysis.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/codegen/__init__.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/codegen/codegen.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/codegen/js.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/codegen/templates/__init__.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/codegen/templates/layout.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/codegen/templates/route.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/codegen/templates/routes_ts.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/codegen/utils.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/component.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/components/__init__.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/components/for_.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/components/if_.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/components/react_router.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/context.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cookies.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/decorators.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/dom/__init__.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/dom/elements.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/dom/events.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/dom/props.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/dom/svg.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/dom/tags.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/dom/tags.pyi +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/env.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/form.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/helpers.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/hooks/__init__.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/hooks/core.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/hooks/effects.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/hooks/init.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/hooks/runtime.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/hooks/setup.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/hooks/stable.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/hooks/state.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/__init__.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/__init__.pyi +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/_types.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/array.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/console.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/date.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/document.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/error.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/json.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/map.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/math.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/navigator.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/number.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/obj.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/object.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/promise.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/pulse.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/react.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/regexp.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/set.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/string.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/weakmap.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/weakset.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/window.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/messages.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/middleware.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/plugin.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/proxy.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/py.typed +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/__init__.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/client.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/common.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/effect.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/infinite_query.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/mutation.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/protocol.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/query.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/store.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/reactive.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/reactive_extensions.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/render_session.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/renderer.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/request.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/routing.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/serializer.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/state.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/test_helpers.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/__init__.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/assets.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/builtins.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/dynamic_import.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/emit_context.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/errors.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/function.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/id.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/js_module.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/modules/__init__.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/modules/asyncio.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/modules/json.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/modules/math.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/modules/pulse/__init__.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/modules/pulse/tags.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/modules/typing.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/nodes.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/py_module.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/transpiler.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/vdom.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/types/__init__.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/types/event_handler.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/user_session.py +0 -0
- {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/version.py +0 -0
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: pulse-framework
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.58
|
|
4
4
|
Summary: Pulse - Full-stack framework for building real-time React applications in Python
|
|
5
5
|
Requires-Dist: websockets>=12.0
|
|
6
|
-
Requires-Dist: fastapi>=0.
|
|
6
|
+
Requires-Dist: fastapi>=0.128.0
|
|
7
7
|
Requires-Dist: uvicorn>=0.24.0
|
|
8
8
|
Requires-Dist: mako>=1.3.10
|
|
9
9
|
Requires-Dist: typer>=0.16.0
|
|
10
|
-
Requires-Dist: python-socketio>=5.
|
|
10
|
+
Requires-Dist: python-socketio>=5.16.0
|
|
11
11
|
Requires-Dist: rich>=13.7.1
|
|
12
12
|
Requires-Dist: python-multipart>=0.0.20
|
|
13
13
|
Requires-Dist: python-dateutil>=2.9.0.post0
|
|
14
|
+
Requires-Dist: starlette>=0.50.0,<0.51.0
|
|
15
|
+
Requires-Dist: urllib3>=2.6.3
|
|
14
16
|
Requires-Dist: watchfiles>=1.1.0
|
|
15
17
|
Requires-Dist: httpx>=0.28.1
|
|
16
18
|
Requires-Python: >=3.11
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "pulse-framework"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.58"
|
|
4
4
|
description = "Pulse - Full-stack framework for building real-time React applications in Python"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
7
7
|
dependencies = [
|
|
8
8
|
"websockets>=12.0",
|
|
9
|
-
"fastapi>=0.
|
|
9
|
+
"fastapi>=0.128.0",
|
|
10
10
|
"uvicorn>=0.24.0",
|
|
11
11
|
"mako>=1.3.10",
|
|
12
12
|
"typer>=0.16.0",
|
|
13
|
-
"python-socketio>=5.
|
|
13
|
+
"python-socketio>=5.16.0",
|
|
14
14
|
"rich>=13.7.1",
|
|
15
15
|
"python-multipart>=0.0.20",
|
|
16
16
|
"python-dateutil>=2.9.0.post0",
|
|
17
|
+
"starlette>=0.50.0,<0.51.0",
|
|
18
|
+
"urllib3>=2.6.3",
|
|
17
19
|
"watchfiles>=1.1.0",
|
|
18
20
|
"httpx>=0.28.1",
|
|
19
21
|
]
|
|
@@ -35,7 +35,11 @@ def react_component(
|
|
|
35
35
|
|
|
36
36
|
@overload
|
|
37
37
|
def react_component(
|
|
38
|
-
expr_or_name: str,
|
|
38
|
+
expr_or_name: str,
|
|
39
|
+
src: str,
|
|
40
|
+
*,
|
|
41
|
+
lazy: bool = False,
|
|
42
|
+
is_default: bool = False,
|
|
39
43
|
) -> Callable[[Callable[P, Any]], Callable[P, Element]]: ...
|
|
40
44
|
|
|
41
45
|
|
|
@@ -44,6 +48,7 @@ def react_component(
|
|
|
44
48
|
src: str | None = None,
|
|
45
49
|
*,
|
|
46
50
|
lazy: bool = False,
|
|
51
|
+
is_default: bool = False,
|
|
47
52
|
) -> Callable[[Callable[P, Any]], Callable[P, Element]]:
|
|
48
53
|
"""Decorator for typed React component bindings."""
|
|
49
54
|
if isinstance(expr_or_name, Expr):
|
|
@@ -51,11 +56,16 @@ def react_component(
|
|
|
51
56
|
raise TypeError("react_component expects (expr) or (name, src)")
|
|
52
57
|
if lazy:
|
|
53
58
|
raise TypeError("react_component lazy only supported with (name, src)")
|
|
59
|
+
if is_default:
|
|
60
|
+
raise TypeError(
|
|
61
|
+
"react_component is_default only supported with (name, src)"
|
|
62
|
+
)
|
|
54
63
|
component = ReactComponent(expr_or_name)
|
|
55
64
|
elif isinstance(expr_or_name, str):
|
|
56
65
|
if src is None:
|
|
57
66
|
raise TypeError("react_component expects (name, src)")
|
|
58
|
-
|
|
67
|
+
kind = "default" if is_default else None
|
|
68
|
+
component = ReactComponent(Import(expr_or_name, src, kind=kind, lazy=lazy))
|
|
59
69
|
else:
|
|
60
70
|
raise TypeError("react_component expects an Expr or (name, src)")
|
|
61
71
|
|
|
@@ -161,6 +161,7 @@ class Import(Expr):
|
|
|
161
161
|
|
|
162
162
|
# Side-effect import: import "./styles.css"
|
|
163
163
|
Import("", "./styles.css", kind="side_effect")
|
|
164
|
+
Import("./styles.css")
|
|
164
165
|
|
|
165
166
|
# Type-only import: import type { Props } from "./types"
|
|
166
167
|
Props = Import("Props", "./types", is_type=True)
|
|
@@ -194,7 +195,7 @@ class Import(Expr):
|
|
|
194
195
|
def __init__(
|
|
195
196
|
self,
|
|
196
197
|
name: str,
|
|
197
|
-
src: str,
|
|
198
|
+
src: str | None = None,
|
|
198
199
|
*,
|
|
199
200
|
kind: ImportKind | None = None,
|
|
200
201
|
is_type: bool = False,
|
|
@@ -203,6 +204,14 @@ class Import(Expr):
|
|
|
203
204
|
before: tuple[str, ...] | list[str] = (),
|
|
204
205
|
_caller_depth: int = 2,
|
|
205
206
|
) -> None:
|
|
207
|
+
if src is None:
|
|
208
|
+
if kind not in (None, "side_effect"):
|
|
209
|
+
raise TypeError(
|
|
210
|
+
"Import single-argument form is reserved for side effect imports"
|
|
211
|
+
)
|
|
212
|
+
src = name
|
|
213
|
+
name = ""
|
|
214
|
+
kind = "side_effect"
|
|
206
215
|
# Validate: lazy imports cannot be type-only
|
|
207
216
|
if lazy and is_type:
|
|
208
217
|
raise TranspileError("Import cannot be both lazy and type-only")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/modules/pulse/__init__.py
RENAMED
|
File without changes
|
{pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/modules/pulse/tags.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|