flet-easy 0.3.0.dev8__tar.gz → 0.3.0.dev10__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 (162) hide show
  1. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/PKG-INFO +1 -1
  2. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/mkdocs.yml +1 -21
  3. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/pyproject.toml +74 -74
  4. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/src/flet_easy/__init__.py +3 -1
  5. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/src/flet_easy/auto_route.py +5 -1
  6. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/src/flet_easy/datasy.py +11 -8
  7. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/src/flet_easy/extra.py +2 -2
  8. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/src/flet_easy/extrasJwt.py +2 -2
  9. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/src/flet_easy/fletEasy.py +28 -33
  10. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/src/flet_easy/inheritance.py +3 -3
  11. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/src/flet_easy/jwt.py +2 -2
  12. flet_easy-0.3.0.dev10/src/flet_easy/logger.py +74 -0
  13. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/src/flet_easy/middleware.py +2 -2
  14. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/src/flet_easy/pagesy.py +9 -3
  15. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/src/flet_easy/route.py +46 -36
  16. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/cache-pages/pyproject.toml +2 -2
  17. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/cache-pages/witch-main.py +22 -10
  18. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/cache-pages/without-main.py +20 -8
  19. flet_easy-0.3.0.dev10/tests/flet-app/pyproject.toml +27 -0
  20. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/assets/database.db +0 -0
  21. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/components/custom.py +0 -1
  22. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/components/login.py +1 -1
  23. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/controllers/login.py +3 -3
  24. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/controllers/register.py +1 -1
  25. flet_easy-0.3.0.dev10/tests/flet-app/src/core/config.py +39 -0
  26. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/main.py +7 -13
  27. flet_easy-0.3.0.dev10/tests/flet-app/src/models/connection.py +19 -0
  28. flet_easy-0.3.0.dev10/tests/flet-app/src/models/methods.py +37 -0
  29. flet_easy-0.3.0.dev10/tests/flet-app/src/models/models.py +11 -0
  30. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/views/counter.py +2 -2
  31. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/views/dashboard.py +0 -4
  32. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/views/index.py +22 -6
  33. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/uv.lock +1382 -1381
  34. flet_easy-0.3.0.dev8/tests/b.py +0 -34
  35. flet_easy-0.3.0.dev8/tests/b2.py +0 -41
  36. flet_easy-0.3.0.dev8/tests/c1.py +0 -41
  37. flet_easy-0.3.0.dev8/tests/flet-app/pyproject.toml +0 -58
  38. flet_easy-0.3.0.dev8/tests/flet-app/src/core/config.py +0 -76
  39. flet_easy-0.3.0.dev8/tests/flet-app/src/models/connection.py +0 -11
  40. flet_easy-0.3.0.dev8/tests/flet-app/src/models/methods.py +0 -41
  41. flet_easy-0.3.0.dev8/tests/flet-app/src/models/models.py +0 -7
  42. flet_easy-0.3.0.dev8/tests/v1.py +0 -51
  43. flet_easy-0.3.0.dev8/tests/v2.py +0 -17
  44. flet_easy-0.3.0.dev8/tests/v3.py +0 -95
  45. flet_easy-0.3.0.dev8/tests/v4.py +0 -51
  46. flet_easy-0.3.0.dev8/tests/x.py +0 -22
  47. flet_easy-0.3.0.dev8/tests/x1.py +0 -34
  48. flet_easy-0.3.0.dev8/tests/x2.py +0 -63
  49. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  50. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  51. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/.github/workflows/docs-update.yml +0 -0
  52. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/.github/workflows/linters.yml +0 -0
  53. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/.github/workflows/publish-pypi.yml +0 -0
  54. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/.github/workflows/tests.yml +0 -0
  55. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/.gitignore +0 -0
  56. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/.markdownlint.yaml +0 -0
  57. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/.python-version +0 -0
  58. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/CHANGELOG.md +0 -0
  59. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/CONTRIBUTING.md +0 -0
  60. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/LICENSE +0 -0
  61. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/README.md +0 -0
  62. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/add-pages/by-means-of-functions.md +0 -0
  63. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/add-pages/in-automatic.md +0 -0
  64. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/add-pages/through-classes.md +0 -0
  65. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/add-pages/through-decorators.md +0 -0
  66. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/gifs/ControlResponse.gif +0 -0
  67. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/gifs/Use-class-new-page.gif +0 -0
  68. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/gifs/app-example.gif +0 -0
  69. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/gifs/fs-init.gif +0 -0
  70. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/gifs/jwt-app.gif +0 -0
  71. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/gifs/jwt-web.gif +0 -0
  72. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/gifs/on_keyboard.gif +0 -0
  73. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/gifs/protected-route.gif +0 -0
  74. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/gifs/route-advanced.gif +0 -0
  75. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/gifs/route-custom.gif +0 -0
  76. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/gifs/route-simple.gif +0 -0
  77. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/gifs/share-data.gif +0 -0
  78. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/gifs/use-example.gif +0 -0
  79. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/gifs/view-config.gif +0 -0
  80. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/images/app-api.png +0 -0
  81. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/images/favicon.png +0 -0
  82. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/images/funtion_add_page.png +0 -0
  83. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/images/logo.png +0 -0
  84. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/images/on-resize.png +0 -0
  85. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/images/run_view.png +0 -0
  86. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/images/struct-views.png +0 -0
  87. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/images/v0.2.0/FletEasy.png +0 -0
  88. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/images/v0.2.0/export_asgi.png +0 -0
  89. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/images/v0.2.0/fastapi_run.png +0 -0
  90. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/images/v0.2.0/method_run.png +0 -0
  91. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/images/v0.2.0/struct-app.png +0 -0
  92. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/images/v0.2.0/template_dxs.png +0 -0
  93. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/assets/js/dynamic-year.js +0 -0
  94. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/basic-jwt.md +0 -0
  95. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/begin.md +0 -0
  96. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/cli-to-create-app.md +0 -0
  97. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/customized-app/control-view-configuration.md +0 -0
  98. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/customized-app/events.md +0 -0
  99. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/customized-app/general-settings.md +0 -0
  100. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/customized-app/page-404.md +0 -0
  101. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/customized-app/route-protection.md +0 -0
  102. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/data-sharing-between-pages.md +0 -0
  103. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/dynamic-routes.md +0 -0
  104. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/events/keyboard-event.md +0 -0
  105. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/events/on-resize.md +0 -0
  106. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/how-to-use.md +0 -0
  107. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/index.md +0 -0
  108. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/installation.md +0 -0
  109. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/middleware.md +0 -0
  110. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/overrides/main.html +0 -0
  111. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/ref.md +0 -0
  112. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/responsiveControlsy.md +0 -0
  113. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/run-the-app.md +0 -0
  114. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/stylesheets/extra.css +0 -0
  115. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/docs/working-with-other-apps.md +0 -0
  116. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/media/app-example.gif +0 -0
  117. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/media/logo.png +0 -0
  118. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/ruff.toml +0 -0
  119. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/src/flet_easy/cli/main.py +0 -0
  120. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/src/flet_easy/exceptions.py +0 -0
  121. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/src/flet_easy/job.py +0 -0
  122. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/src/flet_easy/view_404.py +0 -0
  123. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/README.md +0 -0
  124. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/assets/icon.png +0 -0
  125. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/components/__init__.py +0 -0
  126. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/components/counter.py +0 -0
  127. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/components/drawer.py +0 -0
  128. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/components/register.py +0 -0
  129. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/controllers/__init__.py +0 -0
  130. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/controllers/counter.py +0 -0
  131. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/core/__init__.py +0 -0
  132. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/core/sensitive.py +0 -0
  133. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/models/__init__.py +0 -0
  134. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/views/login.py +0 -0
  135. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-app/src/views/share.py +0 -0
  136. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/assets/favicon.png +0 -0
  137. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/assets/icon.png +0 -0
  138. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/assets/icons/icon-192 - copia.png +0 -0
  139. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/assets/icons/icon-192.png +0 -0
  140. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/assets/icons/icon-512.png +0 -0
  141. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/assets/icons/icon-maskable-512.png +0 -0
  142. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/assets/icons/loading-animation.png +0 -0
  143. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/assets/index.html +0 -0
  144. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/assets/manifest.json +0 -0
  145. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/controllers/__init__.py +0 -0
  146. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/controllers/contador.py +0 -0
  147. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/core/__init__.py +0 -0
  148. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/core/config.py +0 -0
  149. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/main.py +0 -0
  150. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/model/__init__.py +0 -0
  151. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/model/contador.py +0 -0
  152. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/views/counter.py +0 -0
  153. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/views/index.py +0 -0
  154. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/views/login.py +0 -0
  155. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/views/on_keyboard.py +0 -0
  156. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/views/pubsub.py +0 -0
  157. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/views/resize.py +0 -0
  158. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/views/response.py +0 -0
  159. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/views/share_data.py +0 -0
  160. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/views/task.py +0 -0
  161. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/flet-fastapi/views/test.py +0 -0
  162. {flet_easy-0.3.0.dev8 → flet_easy-0.3.0.dev10}/tests/routing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flet-easy
3
- Version: 0.3.0.dev8
3
+ Version: 0.3.0.dev10
4
4
  Summary: ⚡Flet-Easy is a user-friendly add-on package for Flet, offering a cleaner code structure with numerous customizable features like JWT, routers, decorators, middleware and more.
5
5
  Project-URL: Homepage, https://github.com/Daxexs
6
6
  Project-URL: Repository, https://github.com/Daxexs/flet-easy
@@ -2,7 +2,7 @@ site_name: Flet-Easy
2
2
  site_url: https://daxexs.github.io/flet-easy/
3
3
  site_author: Daxexs
4
4
  site_description: >-
5
- Flet-Easy is a user-friendly add-on package for Flet, offering a cleaner code structure with numerous customizable features like JWT, routers, decorators, middleware, and more.
5
+ Flet-Easy is a user-friendly add-on package for Flet, offering a cleaner code structure with numerous customizable features like JWT, routers, decorators, middleware and more.
6
6
  edit_uri: edit/main/docs/
7
7
  copyright: Copyright &copy; <span id="dynamic-year"></span> Daxexs
8
8
  repo_name: Daxexs/flet-easy
@@ -107,26 +107,6 @@ extra:
107
107
  content: "Flet-Easy is a user-friendly add-on package for Flet with customizable features like JWT, routers, and more."
108
108
  - name: keywords
109
109
  content: "Flet, flet-easy, flet easy, decorators, CLI, middleware, routing, responsive design, jwt"
110
- - name: author
111
- content: "Daxexs"
112
- - property: og:title
113
- content: "Flet-Easy - User-friendly add-on package for Flet"
114
- - property: og:description
115
- content: "Flet-Easy is a user-friendly add-on package for Flet, offering a cleaner code structure with numerous customizable features like JWT, routers, decorators, middleware, and more."
116
- - property: og:type
117
- content: "website"
118
- - property: og:url
119
- content: "https://daxexs.github.io/flet-easy/"
120
- - property: og:image
121
- content: "https://daxexs.github.io/flet-easy/assets/images/logo.png"
122
- - name: twitter:card
123
- content: "summary_large_image"
124
- - name: twitter:title
125
- content: "Flet-Easy - User-friendly add-on package for Flet"
126
- - name: twitter:description
127
- content: "Flet-Easy is a user-friendly add-on package for Flet, offering a cleaner code structure with numerous customizable features like JWT, routers, decorators, middleware, and more."
128
- - name: twitter:image
129
- content: "https://daxexs.github.io/flet-easy/assets/images/logo.png"
130
110
 
131
111
  markdown_extensions:
132
112
  - admonition
@@ -1,74 +1,74 @@
1
- [project]
2
- name = "flet-easy"
3
- version = "0.3.0.dev8"
4
- description = "⚡Flet-Easy is a user-friendly add-on package for Flet, offering a cleaner code structure with numerous customizable features like JWT, routers, decorators, middleware and more."
5
- authors = [{ name = "Daxexs", email = "Daxexsdev@gmail.com" }]
6
-
7
- dependencies = []
8
- requires-python = ">=3.8"
9
- readme = "README.md"
10
- license = { text = "apache-2.0" }
11
- keywords = [
12
- "flet easy",
13
- "flet",
14
- "python",
15
- "flet route",
16
- "flet easy route",
17
- "python web template",
18
- "app python",
19
- "flet mvc",
20
- "flet easy mvc",
21
- "flet easy fastapi",
22
- "flutter python",
23
- "web application",
24
- "flet middleware",
25
- "flet jwt",
26
- "fast flet",
27
- ]
28
- classifiers = [
29
- "Topic :: Software Development :: Build Tools",
30
- "Programming Language :: Python :: 3",
31
- "Programming Language :: Python :: 3.8",
32
- "Programming Language :: Python :: 3.9",
33
- "Programming Language :: Python :: 3.10",
34
- "Programming Language :: Python :: 3.11",
35
- "Programming Language :: Python :: 3.12",
36
- ]
37
-
38
- [project.optional-dependencies]
39
- all = [
40
- "pyJWT>=2.0.0",
41
- "rsa>=4.9",
42
- "cookiecutter>=2.6.0",
43
- "rich-argparse>=1.4.0",
44
- "flet[all]>=0.25.1",
45
- ]
46
- JWT = ["pyJWT>=2.0.0", "rsa>=4.9"]
47
- cli = ["cookiecutter>=2.6.0", "rich-argparse>=1.4.0", "flet[all]>=0.25.1"]
48
-
49
- [project.urls]
50
- Homepage = "https://github.com/Daxexs"
51
- Repository = "https://github.com/Daxexs/flet-easy"
52
- Documentation = "https://daxexs.github.io/flet-easy"
53
- Changelog = "https://github.com/Daxexs/flet-easy/blob/main/CHANGELOG.md"
54
-
55
- [build-system]
56
- requires = ["hatchling"]
57
- build-backend = "hatchling.build"
58
-
59
-
60
- [project.scripts]
61
- fs = "flet_easy.cli.main:run"
62
-
63
- [dependency-groups]
64
- test = [
65
- "ruff>=0.3.4",
66
- "flet[all]>=0.25.1",
67
- "tortoise-orm>=0.22.2",
68
- "pytest>=8.3.4",
69
- "pyjwt>=2.0.0",
70
- "rsa>=4.9",
71
- "sqlmodel>=0.0.24",
72
- "pyinstrument>=5.0.1",
73
- ]
74
- docs = ["mkdocs-material>=9.5.17", "mike>=2.0.0"]
1
+ [project]
2
+ name = "flet-easy"
3
+ version = "0.3.0.dev10"
4
+ description = "⚡Flet-Easy is a user-friendly add-on package for Flet, offering a cleaner code structure with numerous customizable features like JWT, routers, decorators, middleware and more."
5
+ authors = [{ name = "Daxexs", email = "Daxexsdev@gmail.com" }]
6
+
7
+ dependencies = []
8
+ requires-python = ">=3.8"
9
+ readme = "README.md"
10
+ license = { text = "apache-2.0" }
11
+ keywords = [
12
+ "flet easy",
13
+ "flet",
14
+ "python",
15
+ "flet route",
16
+ "flet easy route",
17
+ "python web template",
18
+ "app python",
19
+ "flet mvc",
20
+ "flet easy mvc",
21
+ "flet easy fastapi",
22
+ "flutter python",
23
+ "web application",
24
+ "flet middleware",
25
+ "flet jwt",
26
+ "fast flet",
27
+ ]
28
+ classifiers = [
29
+ "Topic :: Software Development :: Build Tools",
30
+ "Programming Language :: Python :: 3",
31
+ "Programming Language :: Python :: 3.8",
32
+ "Programming Language :: Python :: 3.9",
33
+ "Programming Language :: Python :: 3.10",
34
+ "Programming Language :: Python :: 3.11",
35
+ "Programming Language :: Python :: 3.12",
36
+ ]
37
+
38
+ [project.optional-dependencies]
39
+ all = [
40
+ "pyJWT>=2.0.0",
41
+ "rsa>=4.9",
42
+ "cookiecutter>=2.6.0",
43
+ "rich-argparse>=1.4.0",
44
+ "flet[all]>=0.25.1",
45
+ ]
46
+ JWT = ["pyJWT>=2.0.0", "rsa>=4.9"]
47
+ cli = ["cookiecutter>=2.6.0", "rich-argparse>=1.4.0", "flet[all]>=0.25.1"]
48
+
49
+ [project.urls]
50
+ Homepage = "https://github.com/Daxexs"
51
+ Repository = "https://github.com/Daxexs/flet-easy"
52
+ Documentation = "https://daxexs.github.io/flet-easy"
53
+ Changelog = "https://github.com/Daxexs/flet-easy/blob/main/CHANGELOG.md"
54
+
55
+ [build-system]
56
+ requires = ["hatchling"]
57
+ build-backend = "hatchling.build"
58
+
59
+
60
+ [project.scripts]
61
+ fs = "flet_easy.cli.main:run"
62
+
63
+ [dependency-groups]
64
+ test = [
65
+ "ruff>=0.3.4",
66
+ "flet[all]>=0.25.1",
67
+ "tortoise-orm>=0.22.2",
68
+ "pytest>=8.3.4",
69
+ "pyjwt>=2.0.0",
70
+ "rsa>=4.9",
71
+ "sqlmodel>=0.0.24",
72
+ "pyinstrument>=5.0.1",
73
+ ]
74
+ docs = ["mkdocs-material>=9.5.17", "mike>=2.0.0"]
@@ -1,7 +1,7 @@
1
1
  from flet_easy.datasy import Datasy
2
2
  from flet_easy.extra import Redirect
3
3
  from flet_easy.extrasJwt import Algorithm, PemKey, SecretKey, encode_HS256, encode_RS256
4
- from flet_easy.fletEasy import FletEasy, page
4
+ from flet_easy.fletEasy import FletEasy
5
5
  from flet_easy.inheritance import (
6
6
  Keyboardsy,
7
7
  Ref,
@@ -11,3 +11,5 @@ from flet_easy.inheritance import (
11
11
  )
12
12
  from flet_easy.jwt import EasyKey, decode, decode_async
13
13
  from flet_easy.pagesy import AddPagesy, Pagesy, MiddlewareRequest
14
+
15
+ page = FletEasy.page
@@ -4,6 +4,7 @@ from os import listdir, path
4
4
  from sys import modules
5
5
  from typing import List, Optional
6
6
 
7
+ from flet_easy.logger import get_logger
7
8
  from flet_easy.pagesy import AddPagesy
8
9
 
9
10
 
@@ -22,6 +23,7 @@ def automatic_routing(dir: str) -> Optional[List[AddPagesy]]:
22
23
  return None
23
24
 
24
25
  pages = []
26
+ logger = get_logger("Automatic routing")
25
27
 
26
28
  python_files = [
27
29
  file
@@ -50,8 +52,9 @@ def automatic_routing(dir: str) -> Optional[List[AddPagesy]]:
50
52
  for _, obj in getmembers(module):
51
53
  if isinstance(obj, AddPagesy):
52
54
  pages.append(obj)
55
+ logger.debug(f"Adding AddPagesy automatic routing: {obj}")
53
56
  except Exception as e:
54
- print(f"Error processing file {file}: {e}")
57
+ logger.error(f"Error processing file {file}: {e}")
55
58
  continue
56
59
 
57
60
  if not pages:
@@ -59,4 +62,5 @@ def automatic_routing(dir: str) -> Optional[List[AddPagesy]]:
59
62
  "No instances of AddPagesy found. Check the assigned path of the 'path_views' parameter of the class (FletEasy)."
60
63
  )
61
64
 
65
+ logger.info(f"Automatic routing completed successfully: {len(pages)} Pagesy objects")
62
66
  return pages
@@ -1,6 +1,6 @@
1
1
  from collections import deque
2
2
  from datetime import datetime, timedelta, timezone
3
- from typing import Any, Callable, Dict, Tuple
3
+ from typing import Any, Callable, Dict, List, Tuple, Union
4
4
 
5
5
  from flet import Control, ControlEvent, Page
6
6
 
@@ -70,7 +70,7 @@ class Datasy:
70
70
  self.__route: str = None
71
71
  self.__go = go
72
72
  self.__history_routes: deque[Tuple[str, int]] = deque()
73
- self._dynamic_control: Dict[str, Tuple[Control, Callable[[Control], None]]] = {}
73
+ self._dynamic_control: Dict[str, List[Tuple[Control, Callable[[Control]], None]]] = {}
74
74
 
75
75
  self.__secret_key: SecretKey = secret_key
76
76
  self.__auto_logout: bool = auto_logout
@@ -273,11 +273,11 @@ class Datasy:
273
273
  def __login(
274
274
  self,
275
275
  key: str,
276
- value: Dict[str, Any] | Any,
276
+ value: Union[Dict[str, Any], Any],
277
277
  next_route: str,
278
278
  time_expiry: timedelta = None,
279
279
  sleep: int = 1,
280
- ) -> str | None:
280
+ ) -> Union[str, None]:
281
281
  if time_expiry:
282
282
  assert isinstance(value, Dict), (
283
283
  "Use a dict in login method values or don't use time_expiry."
@@ -307,7 +307,7 @@ class Datasy:
307
307
  def login(
308
308
  self,
309
309
  key: str,
310
- value: Dict[str, Any] | Any,
310
+ value: Union[Dict[str, Any], Any],
311
311
  next_route: str,
312
312
  time_expiry: timedelta = None,
313
313
  sleep: int = 1,
@@ -336,7 +336,7 @@ class Datasy:
336
336
  async def login_async(
337
337
  self,
338
338
  key: str,
339
- value: Dict[str, Any] | Any,
339
+ value: Union[Dict[str, Any], Any],
340
340
  next_route: str,
341
341
  time_expiry: timedelta = None,
342
342
  sleep: int = 1,
@@ -389,8 +389,11 @@ class Datasy:
389
389
  return lambda _=None: go_back_func()
390
390
 
391
391
  def dynamic_control(self, control: Control, func_update: Callable[[Control], None]) -> None:
392
- """Adds dynamic control to the page."""
393
- self._dynamic_control[self.page.route] = (control, func_update)
392
+ """Adds dynamic control to the page, allowing real-time updates when caching is enabled on the page."""
393
+ if self.page.route not in self._dynamic_control:
394
+ self._dynamic_control[self.page.route] = [(control, func_update)]
395
+ else:
396
+ self._dynamic_control[self.page.route].append((control, func_update))
394
397
 
395
398
 
396
399
  def evaluate_secret_key(data: Datasy):
@@ -1,13 +1,13 @@
1
1
  from dataclasses import dataclass
2
2
  from re import Pattern, compile
3
- from typing import Callable, Dict, Optional, Tuple
3
+ from typing import Callable, Dict, Optional, Tuple, Union
4
4
 
5
5
 
6
6
  @dataclass
7
7
  class Msg:
8
8
  method: str
9
9
  key: str = None
10
- value: str | dict = None
10
+ value: Union[str, Dict] = None
11
11
 
12
12
 
13
13
  @dataclass
@@ -1,7 +1,7 @@
1
1
  import contextlib
2
2
  from dataclasses import dataclass
3
3
  from datetime import datetime, timezone
4
- from typing import Any, Dict
4
+ from typing import Any, Dict, Union
5
5
 
6
6
  from flet_easy.exceptions import AlgorithmJwtError
7
7
 
@@ -55,7 +55,7 @@ def encode_HS256(payload: Dict[str, Any], secret_key: str, time_expiry: timezone
55
55
  )
56
56
 
57
57
 
58
- def encode_verified(secret_key: SecretKey, value: str, time_expiration) -> str | None:
58
+ def encode_verified(secret_key: SecretKey, value: str, time_expiration) -> Union[str, None]:
59
59
  """Verify the possible encryption of the value sent."""
60
60
  assert secret_key.algorithm is not None, (
61
61
  "The secret_key algorithm is not supported, only (RS256, HS256) is accepted."
@@ -1,3 +1,6 @@
1
+ import logging
2
+ from typing import Union
3
+
1
4
  from flet_easy.exceptions import AddPagesError, FletEasyError, MidlewareError
2
5
 
3
6
  try:
@@ -16,28 +19,12 @@ from flet_easy.auto_route import automatic_routing
16
19
  from flet_easy.datasy import Datasy
17
20
  from flet_easy.extrasJwt import SecretKey
18
21
  from flet_easy.inheritance import Viewsy
22
+ from flet_easy.logger import LoggingFletEasy, get_logger
19
23
  from flet_easy.middleware import MiddlewareHandler, MiddlewareRequest
20
24
  from flet_easy.pagesy import AddPagesy, Pagesy
21
25
  from flet_easy.route import FletEasyX
22
26
 
23
27
 
24
- def page(
25
- route: str,
26
- title: str = None,
27
- page_clear: bool = False,
28
- share_data: bool = False,
29
- protected_route: bool = False,
30
- custom_params: Dict[str, Any] = None,
31
- middleware: Optional[
32
- List[MiddlewareHandler | MiddlewareRequest] | MiddlewareHandler | MiddlewareRequest
33
- ] = None,
34
- cache: bool = False,
35
- ):
36
- return FletEasy.page(
37
- route, title, page_clear, share_data, protected_route, custom_params, middleware, cache
38
- )
39
-
40
-
41
28
  class FletEasy(FletEasyX):
42
29
  """
43
30
  we create the app object, in it you can configure:
@@ -50,6 +37,7 @@ class FletEasy(FletEasyX):
50
37
  * `secret_key` : Used with `SecretKey` class of Flet easy, to configure JWT or client storage.
51
38
  * `auto_logout` : If you use JWT, you can configure it.
52
39
  * `path_views` : Configuration of the folder where are the .py files of the pages, you use the `Path` class to configure it.
40
+ * `logger` : Activates the logger, by default it is disabled (False).
53
41
 
54
42
  Example:
55
43
  ```python
@@ -126,20 +114,6 @@ class FletEasy(FletEasyX):
126
114
  """
127
115
 
128
116
  __self = None
129
- __slots__ = (
130
- "__route_prefix",
131
- "__path_views",
132
- "__pagesys",
133
- "_data",
134
- "_pages",
135
- "_page_404",
136
- "_view_data",
137
- "_view_config",
138
- "_config_login",
139
- "_config_event",
140
- "_middlewares",
141
- "_middlewares_after",
142
- )
143
117
 
144
118
  def __init__(
145
119
  self,
@@ -151,7 +125,12 @@ class FletEasy(FletEasyX):
151
125
  secret_key: SecretKey = None,
152
126
  auto_logout: bool = False,
153
127
  path_views: Path = None,
128
+ logger: bool = False,
154
129
  ):
130
+ if logger:
131
+ LoggingFletEasy.enable(logging.DEBUG)
132
+ self.logger = get_logger("FletEasy")
133
+
155
134
  self.__route_prefix = route_prefix
156
135
  self.__path_views = path_views
157
136
  FletEasy.__self = self
@@ -183,6 +162,7 @@ class FletEasy(FletEasyX):
183
162
 
184
163
  def start(self, page: Page):
185
164
  """Start the app in the main function"""
165
+ self.logger.debug("enabling connection with flet app")
186
166
  self.__pre_config(page)
187
167
 
188
168
  def get_app(self):
@@ -191,6 +171,7 @@ class FletEasy(FletEasyX):
191
171
  def main(page: Page):
192
172
  self.__pre_config(page)
193
173
 
174
+ self.logger.debug("getting app from fletEasy to export")
194
175
  return main
195
176
 
196
177
  def run(
@@ -220,6 +201,7 @@ class FletEasy(FletEasyX):
220
201
  )
221
202
  return main
222
203
  try:
204
+ self.logger.debug("running app from fletEasy with flet")
223
205
  return app(
224
206
  target=main,
225
207
  name=name,
@@ -256,6 +238,8 @@ class FletEasy(FletEasyX):
256
238
 
257
239
  if value == "page_404":
258
240
  self._page_404 = Pagesy(route, func, data.get("title"), data.get("page_clear"))
241
+ self.logger.debug(f"Adding page 404: {self._page_404}")
242
+
259
243
  elif value == "page":
260
244
  self._pages.append(
261
245
  Pagesy(
@@ -271,6 +255,8 @@ class FletEasy(FletEasyX):
271
255
  cache=data.get("cache"),
272
256
  )
273
257
  )
258
+ self.logger.debug(f"Adding page: {self._pages[-1]}")
259
+
274
260
  return wrapper
275
261
 
276
262
  return decorator
@@ -290,6 +276,8 @@ class FletEasy(FletEasyX):
290
276
  self._pages.extend(page._add_pages(self.__route_prefix))
291
277
  else:
292
278
  self._pages.extend(page._add_pages())
279
+
280
+ self.logger.debug(f"Adding group of pages: {len(group_pages)}: {page}\n")
293
281
  except Exception as e:
294
282
  raise AddPagesError("Add pages error in route: ", e)
295
283
 
@@ -304,7 +292,7 @@ class FletEasy(FletEasyX):
304
292
  protected_route: bool = False,
305
293
  custom_params: Dict[str, Any] = None,
306
294
  middleware: Optional[
307
- List[MiddlewareHandler | MiddlewareRequest] | MiddlewareHandler | MiddlewareRequest
295
+ Union[List[Union[MiddlewareHandler, MiddlewareRequest]], MiddlewareHandler, MiddlewareRequest]
308
296
  ] = None,
309
297
  cache: bool = False,
310
298
  ) -> Callable:
@@ -457,6 +445,7 @@ class FletEasy(FletEasyX):
457
445
  ```
458
446
  """
459
447
  self._view_data = func
448
+ self.logger.debug(f"Adding view: {self._view_data}")
460
449
 
461
450
  def config(self, func: Callable[[Datasy], None]):
462
451
  """Decorator to add a custom configuration to the app:
@@ -484,6 +473,7 @@ class FletEasy(FletEasyX):
484
473
  ```
485
474
  """
486
475
  self._view_config = func
476
+ self.logger.debug(f"Adding config: {self._view_config}")
487
477
 
488
478
  def login(self, func: Callable[[Datasy], bool]):
489
479
  """Decorator to add a login configuration to the app (protected_route):
@@ -508,6 +498,7 @@ class FletEasy(FletEasyX):
508
498
  ```
509
499
  """
510
500
  self._config_login = func
501
+ self.logger.debug(f"Adding login: {self._config_login}")
511
502
 
512
503
  def config_event_handler(self, func: Callable[[Datasy], None]):
513
504
  """Decorator to add charter event settings -> https://flet.dev/docs/controls/page#events
@@ -524,6 +515,7 @@ class FletEasy(FletEasyX):
524
515
  """
525
516
 
526
517
  self._config_event = func
518
+ self.logger.debug(f"Adding config event: {self._config_event}")
527
519
 
528
520
  def add_routes(self, add_views: List[Pagesy]):
529
521
  """-> Add routes without the use of decorators.
@@ -550,11 +542,12 @@ class FletEasy(FletEasyX):
550
542
  page.route = self.__route_prefix + page.route
551
543
 
552
544
  self._pages.append(page)
545
+ self.logger.debug(f"Add routes: {page}")
553
546
 
554
547
  def add_middleware(
555
548
  self,
556
549
  *middleware: Optional[
557
- Tuple[MiddlewareHandler | MiddlewareRequest] | MiddlewareHandler | MiddlewareRequest
550
+ Union[Tuple[Union[MiddlewareHandler, MiddlewareRequest]], MiddlewareHandler, MiddlewareRequest]
558
551
  ],
559
552
  ):
560
553
  """
@@ -579,6 +572,8 @@ class FletEasy(FletEasyX):
579
572
  )
580
573
  else:
581
574
  self._middlewares.append(m)
575
+
576
+ self.logger.debug(f"Add middlewares in method 'add_middleware': {middleware}")
582
577
  except Exception as e:
583
578
  raise MidlewareError(
584
579
  "You are not adding any midleware but you are using the 'add_middleware' method:",
@@ -1,5 +1,5 @@
1
1
  from inspect import iscoroutinefunction
2
- from typing import Any, Callable, Dict, List, TypeVar
2
+ from typing import Any, Callable, Dict, List, TypeVar, Union
3
3
 
4
4
  from flet import (
5
5
  ControlEvent,
@@ -115,8 +115,8 @@ class Resizesy:
115
115
  self.__page = page
116
116
  self.__height: float = page.height
117
117
  self.__width: float = page.width
118
- self.__margin_y: float | int = 0
119
- self.__margin_x: float | int = 0
118
+ self.__margin_y: Union[float, int] = 0
119
+ self.__margin_x: Union[float, int] = 0
120
120
  self.__e: ControlEvent = None
121
121
 
122
122
  @property
@@ -94,7 +94,7 @@ def _handle_decode_errors(jwt: str, data: Datasy, key_login: str) -> Union[Dict[
94
94
  raise LogoutError("Login error:", e)
95
95
 
96
96
 
97
- def decode(key_login: str, data: Datasy) -> Dict[str, Any] | bool:
97
+ def decode(key_login: str, data: Datasy) -> Union[Dict[str, Any], bool]:
98
98
  """decodes the jwt and updates the browser sessions.
99
99
 
100
100
  ### Parameters to use:
@@ -110,7 +110,7 @@ def decode(key_login: str, data: Datasy) -> Dict[str, Any] | bool:
110
110
  raise LoginError("Use the 'decode_async' method instead of 'decode'. | More details:", e)
111
111
 
112
112
 
113
- async def decode_async(key_login: str, data: Datasy) -> Dict[str, Any] | bool:
113
+ async def decode_async(key_login: str, data: Datasy) -> Union[Dict[str, Any], bool]:
114
114
  """decodes the jwt and updates the browser sessions.
115
115
 
116
116
  ### Parameters to use:
@@ -0,0 +1,74 @@
1
+ import logging
2
+
3
+ try:
4
+ from rich.logging import RichHandler
5
+
6
+ _RICH_AVAILABLE = True
7
+ except ImportError:
8
+ _RICH_AVAILABLE = False
9
+
10
+
11
+ class ColorFormatter(logging.Formatter):
12
+ def format(self, record):
13
+ record.name = f"[bold]{record.name}[/]:"
14
+ return super().format(record)
15
+
16
+
17
+ class OnlyMyLogsFilter(logging.Filter):
18
+ def filter(self, record):
19
+ return record.name.startswith("flet_easy")
20
+
21
+
22
+ class LoggingFletEasy:
23
+ """Logger for Flet Easy"""
24
+
25
+ _logger_activado = False
26
+
27
+ @classmethod
28
+ def enable(cls, level: int = logging.INFO) -> None:
29
+ """
30
+ Enables the logging system only ONCE.
31
+ - With rich: uses its own format.
32
+ - Without rich: forces the exact format of the image.
33
+ """
34
+ if cls._logger_activado:
35
+ return
36
+
37
+ root = logging.getLogger()
38
+ root.setLevel(level)
39
+
40
+ if _RICH_AVAILABLE:
41
+ fmt = ColorFormatter(fmt="%(name)s %(message)s")
42
+ console = RichHandler(
43
+ level=level,
44
+ show_level=True,
45
+ rich_tracebacks=True,
46
+ show_time=True,
47
+ omit_repeated_times=False,
48
+ show_path=True,
49
+ markup=True,
50
+ log_time_format="%Y-%m-%d %H:%M:%S",
51
+ )
52
+ console.setFormatter(fmt)
53
+
54
+ else:
55
+ fmt = logging.Formatter(
56
+ "[%(asctime)s] [%(levelname)s] [%(name)s] %(message)s | %(pathname)s : %(lineno)d",
57
+ datefmt="%Y-%m-%d %H:%M:%S",
58
+ )
59
+ console = logging.StreamHandler()
60
+
61
+ console.setFormatter(fmt)
62
+
63
+ console.addFilter(OnlyMyLogsFilter())
64
+ root.addHandler(console)
65
+ cls._logger_activado = True
66
+
67
+
68
+ def get_logger(name: str) -> logging.Logger:
69
+ """
70
+ Returns a logger with the given name.
71
+ Example: logger = get_logger("Init")
72
+ """
73
+ full_name = name if name.startswith("flet_easy") else f"flet_easy.{name}"
74
+ return logging.getLogger(full_name)
@@ -1,4 +1,4 @@
1
- from typing import Callable, List, Optional
1
+ from typing import Callable, List, Optional, Union
2
2
 
3
3
  from flet import View
4
4
 
@@ -21,6 +21,6 @@ class MiddlewareRequest:
21
21
 
22
22
  MiddlewareHandler = Callable[[Datasy], Optional[Redirect]]
23
23
  Middleware = Optional[
24
- List[MiddlewareHandler | MiddlewareRequest] | MiddlewareHandler | MiddlewareRequest
24
+ Union[List[Union[MiddlewareHandler, MiddlewareRequest]], MiddlewareHandler, MiddlewareRequest]
25
25
  ]
26
26
  ViewHandler = Callable[[Datasy], View]