pyweber 1.6.0.dev3__tar.gz → 1.6.2__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 (123) hide show
  1. {pyweber-1.6.0.dev3/pyweber.egg-info → pyweber-1.6.2}/PKG-INFO +11 -7
  2. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/README.md +7 -3
  3. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyproject.toml +4 -4
  4. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/create_app.py +39 -11
  5. {pyweber-1.6.0.dev3 → pyweber-1.6.2/pyweber.egg-info}/PKG-INFO +11 -7
  6. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber.egg-info/requires.txt +2 -2
  7. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/LICENSE +0 -0
  8. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/MANIFEST.in +0 -0
  9. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/NOTICE +0 -0
  10. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/__init__.py +0 -0
  11. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/admin/index.html +0 -0
  12. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/admin/src/script.js +0 -0
  13. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/admin/src/style.css +0 -0
  14. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/auth/__init__.py +0 -0
  15. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/auth/decorators.py +0 -0
  16. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/auth/passwords.py +0 -0
  17. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/auth/rbac.py +0 -0
  18. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/auth/session.py +0 -0
  19. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/cli/__init__.py +0 -0
  20. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/cli/commands.py +0 -0
  21. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/components/__init__.py +0 -0
  22. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/components/form.py +0 -0
  23. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/components/general.py +0 -0
  24. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/components/input.py +0 -0
  25. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/config/__init__.py +0 -0
  26. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/config/config.py +0 -0
  27. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/connection/__init__.py +0 -0
  28. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/connection/http.py +0 -0
  29. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/connection/reload.py +0 -0
  30. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/connection/selector.py +0 -0
  31. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/connection/session.py +0 -0
  32. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/connection/websocket.py +0 -0
  33. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/core/__init__.py +0 -0
  34. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/core/element.py +0 -0
  35. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/core/events.py +0 -0
  36. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/core/html_parser.py +0 -0
  37. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/core/template.py +0 -0
  38. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/core/window.py +0 -0
  39. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/db/__init__.py +0 -0
  40. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/db/cli.py +0 -0
  41. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/db/config.py +0 -0
  42. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/db/engine.py +0 -0
  43. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/db/model.py +0 -0
  44. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/db/query.py +0 -0
  45. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/db/session.py +0 -0
  46. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/__init__.py +0 -0
  47. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/context.py +0 -0
  48. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/cookies.py +0 -0
  49. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/dom_merge.py +0 -0
  50. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/element.py +0 -0
  51. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/error_pages.py +0 -0
  52. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/field.py +0 -0
  53. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/field_storage.py +0 -0
  54. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/file.py +0 -0
  55. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/file_stream.py +0 -0
  56. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/handoff.py +0 -0
  57. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/headers.py +0 -0
  58. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/middleware.py +0 -0
  59. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/openapi.py +0 -0
  60. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/rate_limit.py +0 -0
  61. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/request.py +0 -0
  62. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/response.py +0 -0
  63. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/routes.py +0 -0
  64. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/run.py +0 -0
  65. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/security.py +0 -0
  66. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/stream_stats.py +0 -0
  67. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/strem_stats.py +0 -0
  68. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/task_manager.py +0 -0
  69. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/template_diff.py +0 -0
  70. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/models/ws_message.py +0 -0
  71. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/pyweber/__init__.py +0 -0
  72. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/pyweber/pyweber.py +0 -0
  73. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/services/__init__.py +0 -0
  74. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/services/openapi_setup.py +0 -0
  75. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/services/response_pipeline.py +0 -0
  76. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/services/static_files.py +0 -0
  77. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/services/template_service.py +0 -0
  78. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/session_store/__init__.py +0 -0
  79. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/.gitignore +0 -0
  80. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/config.toml +0 -0
  81. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/css.css +0 -0
  82. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/docs.html +0 -0
  83. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/favicon/android-chrome-192x192.png +0 -0
  84. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/favicon/android-chrome-512x512.png +0 -0
  85. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/favicon/apple-touch-icon.png +0 -0
  86. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/favicon/favicon-16x16.png +0 -0
  87. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/favicon/favicon-32x32.png +0 -0
  88. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/favicon/favicon.ico +0 -0
  89. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/favicon/pyweber.png +0 -0
  90. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/favicon/site.webmanifest +0 -0
  91. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/handlers.js +0 -0
  92. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/html.html +0 -0
  93. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/html401.html +0 -0
  94. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/html404.html +0 -0
  95. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/html500.html +0 -0
  96. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/js.js +0 -0
  97. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/loading.html +0 -0
  98. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/main.py +0 -0
  99. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/pyweber.css +0 -0
  100. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/static/update.py +0 -0
  101. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/testing/__init__.py +0 -0
  102. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/testing/client.py +0 -0
  103. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/utils/__init__.py +0 -0
  104. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/utils/async_utils.py +0 -0
  105. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/utils/deprecation.py +0 -0
  106. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/utils/exceptions.py +0 -0
  107. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/utils/icons.py +0 -0
  108. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/utils/loads.py +0 -0
  109. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/utils/mime.py +0 -0
  110. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/utils/security.py +0 -0
  111. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/utils/types.py +0 -0
  112. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber/utils/utils.py +0 -0
  113. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber.egg-info/SOURCES.txt +0 -0
  114. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber.egg-info/dependency_links.txt +0 -0
  115. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber.egg-info/entry_points.txt +0 -0
  116. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/pyweber.egg-info/top_level.txt +0 -0
  117. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/setup.cfg +0 -0
  118. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/tests/test_config.py +0 -0
  119. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/tests/test_context.py +0 -0
  120. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/tests/test_cookies.py +0 -0
  121. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/tests/test_public_api.py +0 -0
  122. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/tests/test_response.py +0 -0
  123. {pyweber-1.6.0.dev3 → pyweber-1.6.2}/tests/test_template_diff.py +0 -0
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyweber
3
- Version: 1.6.0.dev3
3
+ Version: 1.6.2
4
4
  Summary: A lightweight Python framework for building and managing web applications.
5
- Author-email: DevPythonMZ <pypi.dev@gmail.com>
5
+ Author-email: Pyweber Limitada <pypi.dev@gmail.com>
6
6
  License-Expression: Apache-2.0
7
7
  Project-URL: Documentation, https://pyweber.dev/
8
8
  Project-URL: Source, https://github.com/pyweber/pyweber
@@ -26,8 +26,8 @@ Requires-Dist: pytest-asyncio; extra == "dev"
26
26
  Provides-Extra: fast-html
27
27
  Requires-Dist: lxml; extra == "fast-html"
28
28
  Provides-Extra: db
29
- Requires-Dist: sqlalchemy[asyncio]>=2.0; extra == "db"
30
- Requires-Dist: alembic>=1.13; extra == "db"
29
+ Requires-Dist: sqlalchemy>=2.0.51; extra == "db"
30
+ Requires-Dist: alembic>=1.19.0; extra == "db"
31
31
  Provides-Extra: db-sqlite
32
32
  Requires-Dist: aiosqlite>=0.20; extra == "db-sqlite"
33
33
  Provides-Extra: db-pg
@@ -44,7 +44,11 @@ Dynamic: license-file
44
44
 
45
45
  <img src="https://pyweber.readthedocs.io/images/pyweber.png" alt="Pyweber Logo">
46
46
 
47
- [![PyPI version](https://img.shields.io/pypi/v/pyweber.svg)](https://pypi.org/project/pyweber/) [![Coverage Status](https://coveralls.io/repos/github/pyweber/pyweber/badge.svg?branch=master)](https://coveralls.io/github/pyweber/pyweber?branch=master) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
47
+ [![CI](https://github.com/pyweber/pyweber/actions/workflows/tests.yml/badge.svg)](https://github.com/pyweber/pyweber/actions/workflows/tests.yml)
48
+ [![Documentation Status](https://readthedocs.org/projects/pyweber/badge/?version=latest)](https://pyweber.readthedocs.io/en/latest/)
49
+ [![PyPI version](https://img.shields.io/pypi/v/pyweber.svg)](https://pypi.org/project/pyweber/)
50
+ [![Coverage Status](https://coveralls.io/repos/github/pyweber/pyweber/badge.svg?branch=master)](https://coveralls.io/github/pyweber/pyweber?branch=master)
51
+ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
48
52
 
49
53
  Pyweber is a lightweight Python web framework designed to create dynamic, reactive web applications with a simple and intuitive API. It combines the simplicity of Python with the reactivity of modern frontend frameworks.
50
54
 
@@ -70,7 +74,7 @@ Pyweber is a lightweight Python web framework designed to create dynamic, reacti
70
74
  Older lines are **not recommended** for production. Use a current release:
71
75
 
72
76
  ```bash
73
- pip install -U 'pyweber>=1.5'
77
+ pip install -U 'pyweber>=1.6'
74
78
  ```
75
79
 
76
80
  See [Supported versions](https://pyweber.dev/guides/supported-versions/) (docs) for yank / security notes. `pyproject.toml` cannot warn when someone pins an old wheel — that requires [PyPI yanking](https://docs.pypi.org/project-management/yanking/).
@@ -271,7 +275,7 @@ pyweber add-section --section-name database
271
275
  pyweber --update
272
276
  ```
273
277
 
274
- Visit [Pyweber Docs](https://pyweber.dev/) for complete documentation. See [CHANGELOG.md](CHANGELOG.md) for release notes (latest: **1.3.0** — Template Handoff, 405 fixes, recursion tracking).
278
+ Visit [Pyweber Docs](https://pyweber.dev/) for complete documentation. See [CHANGELOG.md](CHANGELOG.md) for release notes (latest: **1.6.0** — optional ORM/Redis, identity-preserving WS sync, reactive event fixes).
275
279
 
276
280
  ## License
277
281
 
@@ -2,7 +2,11 @@
2
2
 
3
3
  <img src="https://pyweber.readthedocs.io/images/pyweber.png" alt="Pyweber Logo">
4
4
 
5
- [![PyPI version](https://img.shields.io/pypi/v/pyweber.svg)](https://pypi.org/project/pyweber/) [![Coverage Status](https://coveralls.io/repos/github/pyweber/pyweber/badge.svg?branch=master)](https://coveralls.io/github/pyweber/pyweber?branch=master) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
5
+ [![CI](https://github.com/pyweber/pyweber/actions/workflows/tests.yml/badge.svg)](https://github.com/pyweber/pyweber/actions/workflows/tests.yml)
6
+ [![Documentation Status](https://readthedocs.org/projects/pyweber/badge/?version=latest)](https://pyweber.readthedocs.io/en/latest/)
7
+ [![PyPI version](https://img.shields.io/pypi/v/pyweber.svg)](https://pypi.org/project/pyweber/)
8
+ [![Coverage Status](https://coveralls.io/repos/github/pyweber/pyweber/badge.svg?branch=master)](https://coveralls.io/github/pyweber/pyweber?branch=master)
9
+ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
6
10
 
7
11
  Pyweber is a lightweight Python web framework designed to create dynamic, reactive web applications with a simple and intuitive API. It combines the simplicity of Python with the reactivity of modern frontend frameworks.
8
12
 
@@ -28,7 +32,7 @@ Pyweber is a lightweight Python web framework designed to create dynamic, reacti
28
32
  Older lines are **not recommended** for production. Use a current release:
29
33
 
30
34
  ```bash
31
- pip install -U 'pyweber>=1.5'
35
+ pip install -U 'pyweber>=1.6'
32
36
  ```
33
37
 
34
38
  See [Supported versions](https://pyweber.dev/guides/supported-versions/) (docs) for yank / security notes. `pyproject.toml` cannot warn when someone pins an old wheel — that requires [PyPI yanking](https://docs.pypi.org/project-management/yanking/).
@@ -229,7 +233,7 @@ pyweber add-section --section-name database
229
233
  pyweber --update
230
234
  ```
231
235
 
232
- Visit [Pyweber Docs](https://pyweber.dev/) for complete documentation. See [CHANGELOG.md](CHANGELOG.md) for release notes (latest: **1.3.0** — Template Handoff, 405 fixes, recursion tracking).
236
+ Visit [Pyweber Docs](https://pyweber.dev/) for complete documentation. See [CHANGELOG.md](CHANGELOG.md) for release notes (latest: **1.6.0** — optional ORM/Redis, identity-preserving WS sync, reactive event fixes).
233
237
 
234
238
  ## License
235
239
 
@@ -4,10 +4,10 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pyweber"
7
- version = "1.6.0.dev3"
7
+ version = "1.6.2"
8
8
  description = "A lightweight Python framework for building and managing web applications."
9
9
  readme = "README.md"
10
- authors = [{ name = "DevPythonMZ", email = "pypi.dev@gmail.com" }]
10
+ authors = [{ name = "Pyweber Limitada", email = "pypi.dev@gmail.com" }]
11
11
  license = "Apache-2.0"
12
12
  requires-python = ">=3.10"
13
13
  dependencies = ["watchdog", "toml", "questionary", "qrcode[pil]"]
@@ -31,7 +31,7 @@ include = ["pyweber*"]
31
31
  [project.optional-dependencies]
32
32
  dev = ["pytest", "pytest-cov", "pytest-asyncio"]
33
33
  fast-html = ["lxml"]
34
- db = ["sqlalchemy[asyncio]>=2.0", "alembic>=1.13"]
34
+ db = ["sqlalchemy>=2.0.51", "alembic>=1.19.0"]
35
35
  db-sqlite = ["aiosqlite>=0.20"]
36
36
  db-pg = ["asyncpg>=0.29"]
37
37
  db-mysql = ["aiomysql>=0.2"]
@@ -45,5 +45,5 @@ pyweber = ["static/**/*", "admin/**/*"]
45
45
  omit = ["pyweber/cli/commands.py"]
46
46
 
47
47
  [tool.coverage.report]
48
- fail_under = 86
48
+ fail_under = 88
49
49
  show_missing = true
@@ -86,13 +86,41 @@ class CreateApp:
86
86
  @property
87
87
  def main_module(cls):
88
88
  return os.path.basename(os.path.abspath(sys.argv[0])).split('.')[0]
89
-
89
+
90
+ def _entry_as_main(self):
91
+ """Return ``__main__`` when it is the process entry script (``sys.argv[0]``).
92
+
93
+ ``python main.py`` / the CLI load the file as ``__main__``. Reusing that
94
+ module avoids a second execution via ``import_module("main")``.
95
+ """
96
+ mod = sys.modules.get('__main__')
97
+ main_file = getattr(mod, '__file__', None)
98
+ if not main_file:
99
+ return None
100
+ try:
101
+ if Path(main_file).resolve() != Path(sys.argv[0]).resolve():
102
+ return None
103
+ except OSError:
104
+ return None
105
+ return mod
106
+
90
107
  def get_main_module(self):
91
- if self.main_module not in sys.modules:
92
- return import_module(self.main_module)
93
- if self.is_reloadable_module(self.main_module):
94
- return reload(sys.modules.get(self.main_module))
95
- return sys.modules.get(self.main_module)
108
+ name = self.main_module
109
+ entry = self._entry_as_main()
110
+ if entry is not None:
111
+ # Alias so hot-reload / lookups by basename ("main") see the same object
112
+ sys.modules.setdefault(name, entry)
113
+ return sys.modules[name]
114
+
115
+ if name not in sys.modules:
116
+ return import_module(name)
117
+
118
+ # Hot-reload already ran in reload_modules(); only reload here when
119
+ # there was no __main__ alias (e.g. tests / non-script entry).
120
+ if self.started and self.is_reloadable_module(name):
121
+ return reload(sys.modules[name])
122
+
123
+ return sys.modules[name]
96
124
 
97
125
  def project_modules(self):
98
126
  modules: dict[str, ModuleType] = {}
@@ -197,9 +225,9 @@ class CreateApp:
197
225
 
198
226
  def update(self, module: str = None):
199
227
  self.started = True
200
- self.reload_modules(changed_file=module)
201
-
202
- from pyweber.utils.deprecation import deprecated_alias
203
-
204
- CreatApp = deprecated_alias('CreatApp', CreateApp, alternative='CreateApp')
228
+ self.reload_modules(changed_file=module)
229
+
230
+ from pyweber.utils.deprecation import deprecated_alias
231
+
232
+ CreatApp = deprecated_alias('CreatApp', CreateApp, alternative='CreateApp')
205
233
 
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyweber
3
- Version: 1.6.0.dev3
3
+ Version: 1.6.2
4
4
  Summary: A lightweight Python framework for building and managing web applications.
5
- Author-email: DevPythonMZ <pypi.dev@gmail.com>
5
+ Author-email: Pyweber Limitada <pypi.dev@gmail.com>
6
6
  License-Expression: Apache-2.0
7
7
  Project-URL: Documentation, https://pyweber.dev/
8
8
  Project-URL: Source, https://github.com/pyweber/pyweber
@@ -26,8 +26,8 @@ Requires-Dist: pytest-asyncio; extra == "dev"
26
26
  Provides-Extra: fast-html
27
27
  Requires-Dist: lxml; extra == "fast-html"
28
28
  Provides-Extra: db
29
- Requires-Dist: sqlalchemy[asyncio]>=2.0; extra == "db"
30
- Requires-Dist: alembic>=1.13; extra == "db"
29
+ Requires-Dist: sqlalchemy>=2.0.51; extra == "db"
30
+ Requires-Dist: alembic>=1.19.0; extra == "db"
31
31
  Provides-Extra: db-sqlite
32
32
  Requires-Dist: aiosqlite>=0.20; extra == "db-sqlite"
33
33
  Provides-Extra: db-pg
@@ -44,7 +44,11 @@ Dynamic: license-file
44
44
 
45
45
  <img src="https://pyweber.readthedocs.io/images/pyweber.png" alt="Pyweber Logo">
46
46
 
47
- [![PyPI version](https://img.shields.io/pypi/v/pyweber.svg)](https://pypi.org/project/pyweber/) [![Coverage Status](https://coveralls.io/repos/github/pyweber/pyweber/badge.svg?branch=master)](https://coveralls.io/github/pyweber/pyweber?branch=master) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
47
+ [![CI](https://github.com/pyweber/pyweber/actions/workflows/tests.yml/badge.svg)](https://github.com/pyweber/pyweber/actions/workflows/tests.yml)
48
+ [![Documentation Status](https://readthedocs.org/projects/pyweber/badge/?version=latest)](https://pyweber.readthedocs.io/en/latest/)
49
+ [![PyPI version](https://img.shields.io/pypi/v/pyweber.svg)](https://pypi.org/project/pyweber/)
50
+ [![Coverage Status](https://coveralls.io/repos/github/pyweber/pyweber/badge.svg?branch=master)](https://coveralls.io/github/pyweber/pyweber?branch=master)
51
+ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
48
52
 
49
53
  Pyweber is a lightweight Python web framework designed to create dynamic, reactive web applications with a simple and intuitive API. It combines the simplicity of Python with the reactivity of modern frontend frameworks.
50
54
 
@@ -70,7 +74,7 @@ Pyweber is a lightweight Python web framework designed to create dynamic, reacti
70
74
  Older lines are **not recommended** for production. Use a current release:
71
75
 
72
76
  ```bash
73
- pip install -U 'pyweber>=1.5'
77
+ pip install -U 'pyweber>=1.6'
74
78
  ```
75
79
 
76
80
  See [Supported versions](https://pyweber.dev/guides/supported-versions/) (docs) for yank / security notes. `pyproject.toml` cannot warn when someone pins an old wheel — that requires [PyPI yanking](https://docs.pypi.org/project-management/yanking/).
@@ -271,7 +275,7 @@ pyweber add-section --section-name database
271
275
  pyweber --update
272
276
  ```
273
277
 
274
- Visit [Pyweber Docs](https://pyweber.dev/) for complete documentation. See [CHANGELOG.md](CHANGELOG.md) for release notes (latest: **1.3.0** — Template Handoff, 405 fixes, recursion tracking).
278
+ Visit [Pyweber Docs](https://pyweber.dev/) for complete documentation. See [CHANGELOG.md](CHANGELOG.md) for release notes (latest: **1.6.0** — optional ORM/Redis, identity-preserving WS sync, reactive event fixes).
275
279
 
276
280
  ## License
277
281
 
@@ -4,8 +4,8 @@ questionary
4
4
  qrcode[pil]
5
5
 
6
6
  [db]
7
- sqlalchemy[asyncio]>=2.0
8
- alembic>=1.13
7
+ sqlalchemy>=2.0.51
8
+ alembic>=1.19.0
9
9
 
10
10
  [db-mssql]
11
11
  aioodbc>=0.5
File without changes
File without changes
File without changes
File without changes
File without changes