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.
Files changed (126) hide show
  1. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/PKG-INFO +5 -3
  2. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/pyproject.toml +5 -3
  3. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/react_component.py +12 -2
  4. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/imports.py +10 -1
  5. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/README.md +0 -0
  6. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/__init__.py +0 -0
  7. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/_examples.py +0 -0
  8. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/app.py +0 -0
  9. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/channel.py +0 -0
  10. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/__init__.py +0 -0
  11. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/cmd.py +0 -0
  12. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/dependencies.py +0 -0
  13. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/folder_lock.py +0 -0
  14. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/helpers.py +0 -0
  15. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/logging.py +0 -0
  16. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/models.py +0 -0
  17. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/packages.py +0 -0
  18. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/processes.py +0 -0
  19. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/secrets.py +0 -0
  20. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cli/uvicorn_log_config.py +0 -0
  21. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/code_analysis.py +0 -0
  22. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/codegen/__init__.py +0 -0
  23. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/codegen/codegen.py +0 -0
  24. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/codegen/js.py +0 -0
  25. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/codegen/templates/__init__.py +0 -0
  26. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/codegen/templates/layout.py +0 -0
  27. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/codegen/templates/route.py +0 -0
  28. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/codegen/templates/routes_ts.py +0 -0
  29. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/codegen/utils.py +0 -0
  30. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/component.py +0 -0
  31. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/components/__init__.py +0 -0
  32. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/components/for_.py +0 -0
  33. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/components/if_.py +0 -0
  34. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/components/react_router.py +0 -0
  35. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/context.py +0 -0
  36. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/cookies.py +0 -0
  37. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/decorators.py +0 -0
  38. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/dom/__init__.py +0 -0
  39. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/dom/elements.py +0 -0
  40. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/dom/events.py +0 -0
  41. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/dom/props.py +0 -0
  42. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/dom/svg.py +0 -0
  43. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/dom/tags.py +0 -0
  44. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/dom/tags.pyi +0 -0
  45. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/env.py +0 -0
  46. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/form.py +0 -0
  47. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/helpers.py +0 -0
  48. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/hooks/__init__.py +0 -0
  49. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/hooks/core.py +0 -0
  50. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/hooks/effects.py +0 -0
  51. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/hooks/init.py +0 -0
  52. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/hooks/runtime.py +0 -0
  53. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/hooks/setup.py +0 -0
  54. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/hooks/stable.py +0 -0
  55. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/hooks/state.py +0 -0
  56. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/__init__.py +0 -0
  57. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/__init__.pyi +0 -0
  58. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/_types.py +0 -0
  59. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/array.py +0 -0
  60. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/console.py +0 -0
  61. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/date.py +0 -0
  62. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/document.py +0 -0
  63. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/error.py +0 -0
  64. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/json.py +0 -0
  65. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/map.py +0 -0
  66. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/math.py +0 -0
  67. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/navigator.py +0 -0
  68. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/number.py +0 -0
  69. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/obj.py +0 -0
  70. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/object.py +0 -0
  71. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/promise.py +0 -0
  72. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/pulse.py +0 -0
  73. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/react.py +0 -0
  74. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/regexp.py +0 -0
  75. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/set.py +0 -0
  76. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/string.py +0 -0
  77. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/weakmap.py +0 -0
  78. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/weakset.py +0 -0
  79. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/js/window.py +0 -0
  80. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/messages.py +0 -0
  81. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/middleware.py +0 -0
  82. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/plugin.py +0 -0
  83. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/proxy.py +0 -0
  84. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/py.typed +0 -0
  85. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/__init__.py +0 -0
  86. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/client.py +0 -0
  87. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/common.py +0 -0
  88. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/effect.py +0 -0
  89. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/infinite_query.py +0 -0
  90. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/mutation.py +0 -0
  91. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/protocol.py +0 -0
  92. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/query.py +0 -0
  93. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/queries/store.py +0 -0
  94. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/reactive.py +0 -0
  95. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/reactive_extensions.py +0 -0
  96. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/render_session.py +0 -0
  97. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/renderer.py +0 -0
  98. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/request.py +0 -0
  99. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/routing.py +0 -0
  100. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/serializer.py +0 -0
  101. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/state.py +0 -0
  102. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/test_helpers.py +0 -0
  103. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/__init__.py +0 -0
  104. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/assets.py +0 -0
  105. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/builtins.py +0 -0
  106. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/dynamic_import.py +0 -0
  107. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/emit_context.py +0 -0
  108. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/errors.py +0 -0
  109. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/function.py +0 -0
  110. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/id.py +0 -0
  111. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/js_module.py +0 -0
  112. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/modules/__init__.py +0 -0
  113. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/modules/asyncio.py +0 -0
  114. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/modules/json.py +0 -0
  115. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/modules/math.py +0 -0
  116. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/modules/pulse/__init__.py +0 -0
  117. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/modules/pulse/tags.py +0 -0
  118. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/modules/typing.py +0 -0
  119. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/nodes.py +0 -0
  120. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/py_module.py +0 -0
  121. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/transpiler.py +0 -0
  122. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/transpiler/vdom.py +0 -0
  123. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/types/__init__.py +0 -0
  124. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/types/event_handler.py +0 -0
  125. {pulse_framework-0.1.56 → pulse_framework-0.1.58}/src/pulse/user_session.py +0 -0
  126. {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.56
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.104.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.13.0
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.56"
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.104.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.0",
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, src: str, *, lazy: bool = False
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
- component = ReactComponent(Import(expr_or_name, src, lazy=lazy))
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")