pulse-framework 0.1.38a8__tar.gz → 0.1.39__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 (70) hide show
  1. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/PKG-INFO +1 -1
  2. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/pyproject.toml +1 -1
  3. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/app.py +1 -1
  4. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/cli/cmd.py +4 -1
  5. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/cli/processes.py +6 -2
  6. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/middleware.py +8 -6
  7. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/README.md +0 -0
  8. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/__init__.py +0 -0
  9. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/channel.py +0 -0
  10. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/cli/__init__.py +0 -0
  11. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/cli/dependencies.py +0 -0
  12. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/cli/folder_lock.py +0 -0
  13. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/cli/helpers.py +0 -0
  14. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/cli/models.py +0 -0
  15. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/cli/packages.py +0 -0
  16. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/cli/secrets.py +0 -0
  17. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/cli/uvicorn_log_config.py +0 -0
  18. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/codegen/__init__.py +0 -0
  19. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/codegen/codegen.py +0 -0
  20. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/codegen/imports.py +0 -0
  21. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/codegen/js.py +0 -0
  22. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/codegen/templates/__init__.py +0 -0
  23. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/codegen/templates/layout.py +0 -0
  24. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/codegen/templates/route.py +0 -0
  25. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/codegen/templates/routes_ts.py +0 -0
  26. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/codegen/utils.py +0 -0
  27. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/components/__init__.py +0 -0
  28. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/components/for_.py +0 -0
  29. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/components/if_.py +0 -0
  30. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/components/react_router.py +0 -0
  31. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/context.py +0 -0
  32. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/cookies.py +0 -0
  33. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/css.py +0 -0
  34. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/decorators.py +0 -0
  35. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/env.py +0 -0
  36. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/form.py +0 -0
  37. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/helpers.py +0 -0
  38. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/hooks/__init__.py +0 -0
  39. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/hooks/core.py +0 -0
  40. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/hooks/effects.py +0 -0
  41. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/hooks/runtime.py +0 -0
  42. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/hooks/setup.py +0 -0
  43. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/hooks/stable.py +0 -0
  44. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/hooks/states.py +0 -0
  45. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/html/__init__.py +0 -0
  46. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/html/elements.py +0 -0
  47. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/html/events.py +0 -0
  48. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/html/props.py +0 -0
  49. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/html/svg.py +0 -0
  50. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/html/tags.py +0 -0
  51. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/html/tags.pyi +0 -0
  52. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/messages.py +0 -0
  53. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/plugin.py +0 -0
  54. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/proxy.py +0 -0
  55. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/py.typed +0 -0
  56. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/query.py +0 -0
  57. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/react_component.py +0 -0
  58. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/reactive.py +0 -0
  59. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/reactive_extensions.py +0 -0
  60. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/render_session.py +0 -0
  61. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/renderer.py +0 -0
  62. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/request.py +0 -0
  63. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/routing.py +0 -0
  64. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/serializer.py +0 -0
  65. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/state.py +0 -0
  66. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/types/__init__.py +0 -0
  67. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/types/event_handler.py +0 -0
  68. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/user_session.py +0 -0
  69. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/vdom.py +0 -0
  70. {pulse_framework-0.1.38a8 → pulse_framework-0.1.39}/src/pulse/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pulse-framework
3
- Version: 0.1.38a8
3
+ Version: 0.1.39
4
4
  Summary: Pulse - Full-stack framework for building real-time React applications in Python
5
5
  Requires-Dist: websockets>=12.0
6
6
  Requires-Dist: fastapi>=0.104.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pulse-framework"
3
- version = "0.1.38a8"
3
+ version = "0.1.39"
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"
@@ -939,7 +939,7 @@ class App:
939
939
  return # no active render for this user session
940
940
 
941
941
  # We don't want to wait for this to resolve
942
- create_task(render.call_api(f"/{self.api_prefix}/set-cookies", method="GET"))
942
+ create_task(render.call_api(f"{self.api_prefix}/set-cookies", method="GET"))
943
943
  sess.scheduled_cookie_refresh = True
944
944
 
945
945
 
@@ -204,7 +204,10 @@ def run(
204
204
  )
205
205
  )
206
206
 
207
- tag_colors = {"server": "cyan", "web": "orange1"}
207
+ # Only add tags in dev mode to avoid breaking structured output (e.g., CloudWatch EMF metrics)
208
+ tag_colors = (
209
+ {"server": "cyan", "web": "orange1"} if env.pulse_env == "dev" else None
210
+ )
208
211
 
209
212
  with FolderLock(web_root):
210
213
  try:
@@ -215,8 +215,12 @@ def _run_without_pty(
215
215
 
216
216
 
217
217
  def _write_tagged_line(name: str, message: str, colors: Mapping[str, str]) -> None:
218
- color = ANSI_CODES.get(colors.get(name, ""), ANSI_CODES["default"])
219
- sys.stdout.write(f"{color}[{name}]\033[0m {message}\n")
218
+ # Only add tags if colors dict is not empty (i.e., tagging is enabled)
219
+ if colors:
220
+ color = ANSI_CODES.get(colors.get(name, ""), ANSI_CODES["default"])
221
+ sys.stdout.write(f"{color}[{name}]\033[0m {message}\n")
222
+ else:
223
+ sys.stdout.write(f"{message}\n")
220
224
  sys.stdout.flush()
221
225
 
222
226
 
@@ -1,15 +1,17 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from collections.abc import Callable, Sequence
4
- from typing import TYPE_CHECKING, Any, Generic, TypeVar, overload, override
5
-
6
- from pulse.messages import ClientMessage, ServerInitMessage
4
+ from typing import Any, Generic, TypeVar, overload, override
5
+
6
+ from pulse.messages import (
7
+ ClientMessage,
8
+ PrerenderPayload,
9
+ PrerenderResult,
10
+ ServerInitMessage,
11
+ )
7
12
  from pulse.request import PulseRequest
8
13
  from pulse.routing import RouteInfo
9
14
 
10
- if TYPE_CHECKING:
11
- from pulse.app import PrerenderPayload, PrerenderResult
12
-
13
15
  T = TypeVar("T")
14
16
 
15
17