flet-easy 0.3.0.dev2__tar.gz → 0.3.0.dev4__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 (163) hide show
  1. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/PKG-INFO +1 -1
  2. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/pyproject.toml +74 -72
  3. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/src/flet_easy/__init__.py +0 -1
  4. flet_easy-0.3.0.dev4/src/flet_easy/auto_route.py +62 -0
  5. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/src/flet_easy/datasy.py +32 -14
  6. flet_easy-0.3.0.dev4/src/flet_easy/extra.py +23 -0
  7. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/src/flet_easy/fletEasy.py +22 -2
  8. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/src/flet_easy/pagesy.py +5 -0
  9. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/src/flet_easy/route.py +91 -109
  10. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/cache-pages/pyproject.toml +6 -5
  11. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/cache-pages/witch-main.py +22 -30
  12. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/cache-pages/without-main.py +21 -23
  13. flet_easy-0.3.0.dev4/tests/flet-app/pyproject.toml +58 -0
  14. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/assets/database.db +0 -0
  15. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/controllers/login.py +3 -3
  16. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/controllers/register.py +1 -1
  17. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/core/config.py +1 -4
  18. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/main.py +9 -5
  19. flet_easy-0.3.0.dev4/tests/flet-app/src/models/connection.py +11 -0
  20. flet_easy-0.3.0.dev4/tests/flet-app/src/models/methods.py +41 -0
  21. flet_easy-0.3.0.dev4/tests/flet-app/src/models/models.py +7 -0
  22. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/views/counter.py +2 -2
  23. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/views/dashboard.py +3 -3
  24. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/views/index.py +3 -8
  25. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/v1.py +4 -4
  26. flet_easy-0.3.0.dev4/tests/x1.py +34 -0
  27. flet_easy-0.3.0.dev4/tests/x2.py +63 -0
  28. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/uv.lock +602 -184
  29. flet_easy-0.3.0.dev2/src/flet_easy/auto_route.py +0 -34
  30. flet_easy-0.3.0.dev2/src/flet_easy/extra.py +0 -52
  31. flet_easy-0.3.0.dev2/tests/d2.py +0 -67
  32. flet_easy-0.3.0.dev2/tests/flet-app/pyproject.toml +0 -27
  33. flet_easy-0.3.0.dev2/tests/flet-app/src/models/connection.py +0 -19
  34. flet_easy-0.3.0.dev2/tests/flet-app/src/models/methods.py +0 -37
  35. flet_easy-0.3.0.dev2/tests/flet-app/src/models/models.py +0 -11
  36. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  37. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  38. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/.github/workflows/docs-update.yml +0 -0
  39. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/.github/workflows/linters.yml +0 -0
  40. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/.github/workflows/publish-pypi.yml +0 -0
  41. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/.github/workflows/tests.yml +0 -0
  42. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/.gitignore +0 -0
  43. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/.markdownlint.yaml +0 -0
  44. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/.python-version +0 -0
  45. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/CHANGELOG.md +0 -0
  46. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/CONTRIBUTING.md +0 -0
  47. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/LICENSE +0 -0
  48. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/README.md +0 -0
  49. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/add-pages/by-means-of-functions.md +0 -0
  50. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/add-pages/in-automatic.md +0 -0
  51. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/add-pages/through-classes.md +0 -0
  52. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/add-pages/through-decorators.md +0 -0
  53. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/gifs/ControlResponse.gif +0 -0
  54. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/gifs/Use-class-new-page.gif +0 -0
  55. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/gifs/app-example.gif +0 -0
  56. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/gifs/fs-init.gif +0 -0
  57. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/gifs/jwt-app.gif +0 -0
  58. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/gifs/jwt-web.gif +0 -0
  59. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/gifs/on_keyboard.gif +0 -0
  60. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/gifs/protected-route.gif +0 -0
  61. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/gifs/route-advanced.gif +0 -0
  62. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/gifs/route-custom.gif +0 -0
  63. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/gifs/route-simple.gif +0 -0
  64. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/gifs/share-data.gif +0 -0
  65. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/gifs/use-example.gif +0 -0
  66. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/gifs/view-config.gif +0 -0
  67. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/images/app-api.png +0 -0
  68. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/images/favicon.png +0 -0
  69. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/images/funtion_add_page.png +0 -0
  70. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/images/logo.png +0 -0
  71. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/images/on-resize.png +0 -0
  72. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/images/run_view.png +0 -0
  73. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/images/struct-views.png +0 -0
  74. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/images/v0.2.0/FletEasy.png +0 -0
  75. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/images/v0.2.0/export_asgi.png +0 -0
  76. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/images/v0.2.0/fastapi_run.png +0 -0
  77. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/images/v0.2.0/method_run.png +0 -0
  78. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/images/v0.2.0/struct-app.png +0 -0
  79. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/images/v0.2.0/template_dxs.png +0 -0
  80. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/assets/js/dynamic-year.js +0 -0
  81. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/basic-jwt.md +0 -0
  82. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/begin.md +0 -0
  83. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/cli-to-create-app.md +0 -0
  84. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/customized-app/control-view-configuration.md +0 -0
  85. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/customized-app/events.md +0 -0
  86. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/customized-app/general-settings.md +0 -0
  87. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/customized-app/page-404.md +0 -0
  88. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/customized-app/route-protection.md +0 -0
  89. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/data-sharing-between-pages.md +0 -0
  90. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/dynamic-routes.md +0 -0
  91. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/events/keyboard-event.md +0 -0
  92. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/events/on-resize.md +0 -0
  93. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/how-to-use.md +0 -0
  94. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/index.md +0 -0
  95. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/installation.md +0 -0
  96. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/middleware.md +0 -0
  97. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/overrides/main.html +0 -0
  98. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/ref.md +0 -0
  99. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/responsiveControlsy.md +0 -0
  100. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/run-the-app.md +0 -0
  101. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/stylesheets/extra.css +0 -0
  102. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/docs/working-with-other-apps.md +0 -0
  103. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/media/app-example.gif +0 -0
  104. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/media/logo.png +0 -0
  105. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/mkdocs.yml +0 -0
  106. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/ruff.toml +0 -0
  107. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/src/flet_easy/cli/main.py +0 -0
  108. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/src/flet_easy/exceptions.py +0 -0
  109. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/src/flet_easy/extrasJwt.py +0 -0
  110. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/src/flet_easy/inheritance.py +0 -0
  111. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/src/flet_easy/job.py +0 -0
  112. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/src/flet_easy/jwt.py +0 -0
  113. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/src/flet_easy/middleware.py +0 -0
  114. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/src/flet_easy/view_404.py +0 -0
  115. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/b.py +0 -0
  116. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/b2.py +0 -0
  117. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/c1.py +0 -0
  118. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/README.md +0 -0
  119. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/assets/icon.png +0 -0
  120. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/components/__init__.py +0 -0
  121. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/components/counter.py +0 -0
  122. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/components/custom.py +0 -0
  123. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/components/drawer.py +0 -0
  124. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/components/login.py +0 -0
  125. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/components/register.py +0 -0
  126. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/controllers/__init__.py +0 -0
  127. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/controllers/counter.py +0 -0
  128. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/core/__init__.py +0 -0
  129. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/core/sensitive.py +0 -0
  130. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/models/__init__.py +0 -0
  131. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/views/login.py +0 -0
  132. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-app/src/views/share.py +0 -0
  133. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/assets/favicon.png +0 -0
  134. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/assets/icon.png +0 -0
  135. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/assets/icons/icon-192 - copia.png +0 -0
  136. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/assets/icons/icon-192.png +0 -0
  137. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/assets/icons/icon-512.png +0 -0
  138. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/assets/icons/icon-maskable-512.png +0 -0
  139. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/assets/icons/loading-animation.png +0 -0
  140. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/assets/index.html +0 -0
  141. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/assets/manifest.json +0 -0
  142. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/controllers/__init__.py +0 -0
  143. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/controllers/contador.py +0 -0
  144. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/core/__init__.py +0 -0
  145. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/core/config.py +0 -0
  146. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/main.py +0 -0
  147. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/model/__init__.py +0 -0
  148. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/model/contador.py +0 -0
  149. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/views/counter.py +0 -0
  150. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/views/index.py +0 -0
  151. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/views/login.py +0 -0
  152. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/views/on_keyboard.py +0 -0
  153. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/views/pubsub.py +0 -0
  154. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/views/resize.py +0 -0
  155. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/views/response.py +0 -0
  156. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/views/share_data.py +0 -0
  157. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/views/task.py +0 -0
  158. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/flet-fastapi/views/test.py +0 -0
  159. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/routing.py +0 -0
  160. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/v2.py +0 -0
  161. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/v3.py +0 -0
  162. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/v4.py +0 -0
  163. {flet_easy-0.3.0.dev2 → flet_easy-0.3.0.dev4}/tests/x.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flet-easy
3
- Version: 0.3.0.dev2
3
+ Version: 0.3.0.dev4
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
@@ -1,72 +1,74 @@
1
- [project]
2
- name = "flet-easy"
3
- version = "0.3.0.dev2"
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
- ]
72
- docs = ["mkdocs-material>=9.5.17", "mike>=2.0.0"]
1
+ [project]
2
+ name = "flet-easy"
3
+ version = "0.3.0.dev4"
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"]
@@ -11,4 +11,3 @@ 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
- from flet_easy.extra import cache_control
@@ -0,0 +1,62 @@
1
+ from importlib.util import module_from_spec, spec_from_file_location
2
+ from inspect import getmembers
3
+ from os import listdir, path
4
+ from sys import modules
5
+ from typing import List, Optional
6
+
7
+ from flet_easy.pagesy import AddPagesy
8
+
9
+
10
+ def automatic_routing(dir: str) -> Optional[List[AddPagesy]]:
11
+ """
12
+ A function that automatically routes through a directory to find Python files,
13
+ extract AddPagesy objects, and return a list of them.
14
+
15
+ Parameters:
16
+ - dir (str): The directory path to search for Python files.
17
+
18
+ Returns:
19
+ - List[AddPagesy]: A list of AddPagesy objects found in the specified directory.
20
+ """
21
+ if not dir:
22
+ return None
23
+
24
+ pages = []
25
+
26
+ python_files = [
27
+ file
28
+ for file in listdir(dir)
29
+ if (file.endswith(".py") or file.endswith(".pyc")) and file != "__init__.py"
30
+ ]
31
+
32
+ for file in python_files:
33
+ file_path = path.join(dir, file)
34
+ module_name = path.splitext(file)[0]
35
+
36
+ try:
37
+ if not isinstance(file_path, str):
38
+ file_path = str(file_path)
39
+
40
+ spec = spec_from_file_location(module_name, file_path)
41
+ if spec is None or spec.loader is None:
42
+ continue
43
+
44
+ module = module_from_spec(spec)
45
+
46
+ if hasattr(module, "__dict__"):
47
+ modules[module_name] = module
48
+ spec.loader.exec_module(module)
49
+
50
+ for _, obj in getmembers(module):
51
+ if isinstance(obj, AddPagesy):
52
+ pages.append(obj)
53
+ except Exception as e:
54
+ print(f"Error processing file {file}: {e}")
55
+ continue
56
+
57
+ if not pages:
58
+ raise ValueError(
59
+ "No instances of AddPagesy found. Check the assigned path of the 'path_views' parameter of the class (FletEasy)."
60
+ )
61
+
62
+ return pages
@@ -1,8 +1,8 @@
1
1
  from collections import deque
2
2
  from datetime import datetime, timedelta, timezone
3
- from typing import Any, Callable, Dict
3
+ from typing import Any, Callable, Dict, Tuple
4
4
 
5
- from flet import Page
5
+ from flet import Control, ControlEvent, Page
6
6
 
7
7
  from flet_easy.exceptions import LoginError
8
8
  from flet_easy.extra import Msg, Redirect
@@ -42,6 +42,7 @@ class Datasy:
42
42
  * `login` : method to create sessions of all sections in the browser (client storage), requires as parameters the key and the value, the same used in the `page.client_storage.set` method.
43
43
  * `go` : `go`: Method to change the application path, supports url redirections.
44
44
  * `go_back` : Method to go back to the previous route.
45
+ * `go_navigation_bar` : Handles navigation bar changes. Use this method in the on_change event of 'ft.NavigationBar' or 'ft.CupertinoNavigationBar' controls.
45
46
  * `history_routes` : Get the history of the routes.
46
47
  * `route` : route provided by the route event, it is useful when using middlewares to check if the route is assecible.
47
48
  * `redirect` : To redirect to a path before the page loads, it is used in middleware.
@@ -55,7 +56,7 @@ class Datasy:
55
56
  secret_key: str,
56
57
  auto_logout: bool,
57
58
  page_on_keyboard: Keyboardsy,
58
- go: Callable[[str], None] = None,
59
+ go: Callable[[str, int], None] = None,
59
60
  ) -> None:
60
61
  self.__page: Page = None
61
62
  self.__url_params: Dict[str, Any] = None
@@ -68,7 +69,8 @@ class Datasy:
68
69
  self.__on_resize: Resizesy = None
69
70
  self.__route: str = None
70
71
  self.__go = go
71
- self.__history_routes: deque[str] = deque()
72
+ self.__history_routes: deque[Tuple[str, int]] = deque()
73
+ self._dynamic_control: Dict[str, Tuple[Control, Callable[[Control], None]]] = {}
72
74
 
73
75
  self.__secret_key: SecretKey = secret_key
74
76
  self.__auto_logout: bool = auto_logout
@@ -89,10 +91,6 @@ class Datasy:
89
91
  def history_routes(self):
90
92
  return self.__history_routes
91
93
 
92
- @history_routes.setter
93
- def history_routes(self, history_routes: deque[str]):
94
- self.__history_routes = history_routes
95
-
96
94
  @property
97
95
  def url_params(self):
98
96
  return self.__url_params
@@ -365,17 +363,37 @@ class Datasy:
365
363
  """To change the application path, it is important for better validation to avoid using `page.go()`."""
366
364
  return lambda _=None: self.__go(route)
367
365
 
366
+ def go_navigation_bar(self, e: ControlEvent) -> None:
367
+ """Handles navigation bar changes. Use this method in the on_change event of
368
+ 'ft.NavigationBar' or 'ft.CupertinoNavigationBar' controls."""
369
+ self.__go(e.control.selected_index)
370
+
368
371
  def redirect(self, route: str):
369
372
  """Useful if you do not want to access a route that has already been sent."""
370
373
  return Redirect(route)
371
374
 
372
- def go_back(self):
375
+ def go_back(self) -> Callable[[ControlEvent], None]:
373
376
  """Go back to the previous route."""
374
- return lambda _=None: (
375
- (self.history_routes.pop(), self.__go(self.history_routes.pop()))
376
- if len(self.history_routes) > 1
377
- else (print("-> I can't go back! There is no route history."), None)
378
- )
377
+
378
+ def go_back_func():
379
+ if len(self.history_routes) > 1:
380
+ self.history_routes.pop()
381
+ route, index = self.history_routes.pop()
382
+ if index is not None:
383
+ self.view.navigation_bar.selected_index = index
384
+
385
+ if len(self.history_routes) == 0:
386
+ self.page.views.clear()
387
+
388
+ self.__go(route)
389
+ else:
390
+ print("-> I can't go back! there is no history. ")
391
+
392
+ return lambda _=None: go_back_func()
393
+
394
+ def dynamic_control(self, control: Control, func_update: Callable[[Control], None]) -> None:
395
+ """Adds dynamic control to the page."""
396
+ self._dynamic_control[self.page.route] = (control, func_update)
379
397
 
380
398
 
381
399
  def evaluate_secret_key(data: Datasy):
@@ -0,0 +1,23 @@
1
+ from dataclasses import dataclass
2
+ from re import Pattern, compile
3
+ from typing import Callable, Dict, Optional, Tuple
4
+
5
+
6
+ @dataclass
7
+ class Msg:
8
+ method: str
9
+ key: str = None
10
+ value: str | dict = None
11
+
12
+
13
+ @dataclass
14
+ class Redirect:
15
+ route: str = None
16
+
17
+
18
+ TYPE_PATTERNS: Dict[str, Tuple[Pattern[str], Callable[[str], Optional[bool]]]] = {
19
+ "int": (compile(r"-?\d+"), int),
20
+ "float": (compile(r"-?\d+\.\d+"), float),
21
+ "str": (compile(r"[^/]+"), str),
22
+ "bool": (compile(r"(true|True|false|False)"), lambda x: x in ["true", "True"]),
23
+ }
@@ -126,6 +126,20 @@ class FletEasy(FletEasyX):
126
126
  """
127
127
 
128
128
  __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
+ )
129
143
 
130
144
  def __init__(
131
145
  self,
@@ -155,13 +169,15 @@ class FletEasy(FletEasyX):
155
169
  # add data to middleware request
156
170
  MiddlewareRequest._data = self._data
157
171
 
172
+ self.__pagesys = automatic_routing(self.__path_views) if self.__path_views else None
173
+
158
174
  # -------------------------------------------------------------------
159
175
  def __pre_config(self, page: Page):
160
176
  """config before run"""
161
177
  self._add_configuration_start(page)
162
178
 
163
- if self.__path_views is not None:
164
- self.add_pages(automatic_routing(self.__path_views))
179
+ if self.__pagesys:
180
+ self.add_pages(self.__pagesys)
165
181
 
166
182
  self._run()
167
183
 
@@ -246,6 +262,7 @@ class FletEasy(FletEasyX):
246
262
  route=route,
247
263
  view=func,
248
264
  title=data.get("title"),
265
+ index=data.get("index"),
249
266
  clear=data.get("page_clear"),
250
267
  share_data=data.get("share_data"),
251
268
  protected_route=data.get("protected_route"),
@@ -281,6 +298,7 @@ class FletEasy(FletEasyX):
281
298
  cls,
282
299
  route: str,
283
300
  title: str = None,
301
+ index: Optional[int] = None,
284
302
  page_clear: bool = False,
285
303
  share_data: bool = False,
286
304
  protected_route: bool = False,
@@ -293,6 +311,7 @@ class FletEasy(FletEasyX):
293
311
  """Decorator to add a new page to the app, you need the following parameters:
294
312
  * route: text string of the url, for example(`'/FletEasy'`).
295
313
  * `title` : Define the title of the page. (optional).
314
+ * `index` : Define the index of the page, use in controls like `ft.CupertinoNavigationBar` or `ft.NavigationBar`. (optional)
296
315
  * clear: Removes the pages from the `page.views` list of flet. (optional)
297
316
  * `share_data` : It is a boolean value, which is useful if you want to share data between pages, in a more restricted way. (optional)
298
317
  * protected_route: Protects the route of the page, according to the configuration of the `login` decorator of the `FletEasy` class. (optional)
@@ -327,6 +346,7 @@ class FletEasy(FletEasyX):
327
346
  data = {
328
347
  "route": route,
329
348
  "title": title,
349
+ "index": index,
330
350
  "page_clear": page_clear,
331
351
  "share_data": share_data,
332
352
  "protected_route": protected_route,
@@ -15,6 +15,7 @@ class Pagesy:
15
15
  * `route`: text string of the url, for example(`'/task'`).
16
16
  * `view`: Stores the page function.
17
17
  * `title` : Define the title of the page.
18
+ * `index` : Define the index of the page, use in controls like `ft.NavigationBar` and `ft.CupertinoNavigationBar`.
18
19
  * `clear`: Removes the pages from the `page.views` list of flet. (optional)
19
20
  * `share_data` : It is a boolean value, which is useful if you want to share data between pages, in a more restricted way. (optional)
20
21
  * `protected_route`: Protects the route of the page, according to the configuration of the `login` decorator of the `FletEasy` class. (optional)
@@ -33,6 +34,7 @@ class Pagesy:
33
34
  route: str,
34
35
  view: ViewHandler,
35
36
  title: Optional[str] = None,
37
+ index: Optional[int] = None,
36
38
  clear: bool = False,
37
39
  share_data: bool = False,
38
40
  protected_route: bool = False,
@@ -45,6 +47,7 @@ class Pagesy:
45
47
  self.route = route
46
48
  self.view = view
47
49
  self.title = title
50
+ self.index = index
48
51
  self.clear = clear
49
52
  self.share_data = share_data
50
53
  self.protected_route = protected_route
@@ -178,6 +181,7 @@ class AddPagesy:
178
181
  self,
179
182
  route: str,
180
183
  title: Optional[str] = None,
184
+ index: Optional[int] = None,
181
185
  page_clear: bool = False,
182
186
  share_data: bool = False,
183
187
  protected_route: bool = False,
@@ -199,6 +203,7 @@ class AddPagesy:
199
203
  route=self.__build_route(route),
200
204
  view=func,
201
205
  title=title,
206
+ index=index,
202
207
  clear=page_clear,
203
208
  share_data=share_data,
204
209
  protected_route=protected_route,