tina4-python 3.13.138__tar.gz → 3.13.140__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 (192) hide show
  1. {tina4_python-3.13.138 → tina4_python-3.13.140}/PKG-INFO +18 -5
  2. {tina4_python-3.13.138 → tina4_python-3.13.140}/README.md +17 -4
  3. {tina4_python-3.13.138 → tina4_python-3.13.140}/pyproject.toml +1 -1
  4. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/.tina4-metrics.json +2366 -90
  5. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/CLAUDE.md +28 -14
  6. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/__init__.py +1 -1
  7. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/api/__init__.py +35 -4
  8. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/auth/__init__.py +87 -4
  9. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/cli/__init__.py +21 -7
  10. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/core/middleware.py +4 -1
  11. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/core/request.py +10 -4
  12. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/core/router.py +4 -4
  13. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/core/server.py +49 -18
  14. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/database/__init__.py +7 -2
  15. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/database/adapter.py +25 -0
  16. tina4_python-3.13.140/tina4_python/database/async_api.py +217 -0
  17. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/database/connection.py +451 -357
  18. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/database/firebird.py +17 -22
  19. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/database/mongodb.py +16 -9
  20. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/database/mssql.py +26 -30
  21. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/database/mysql.py +20 -20
  22. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/database/odbc.py +34 -27
  23. tina4_python-3.13.140/tina4_python/database/pool.py +365 -0
  24. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/database/postgres.py +44 -35
  25. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/database/sqlite.py +31 -25
  26. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/frond/engine.py +5 -1
  27. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/graphql/__init__.py +79 -0
  28. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/mcp/__init__.py +5 -5
  29. tina4_python-3.13.140/tina4_python/orm/async_api.py +103 -0
  30. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/orm/model.py +34 -2
  31. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/push/__init__.py +15 -2
  32. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/query_builder/__init__.py +18 -0
  33. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/queue/job.py +11 -2
  34. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/queue/kafka_backend.py +14 -0
  35. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/queue/lite_backend.py +16 -0
  36. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/queue/mongo_backend.py +39 -3
  37. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/queue/rabbitmq_backend.py +25 -0
  38. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/queue_backends/rabbitmq_backend.py +12 -0
  39. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/session/__init__.py +48 -5
  40. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/sso.py +34 -3
  41. tina4_python-3.13.140/tina4_python/ssrf.py +163 -0
  42. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/websocket/__init__.py +5 -1
  43. {tina4_python-3.13.138 → tina4_python-3.13.140}/.gitignore +0 -0
  44. {tina4_python-3.13.138 → tina4_python-3.13.140}/COMMERCIAL-LICENSE.md +0 -0
  45. {tina4_python-3.13.138 → tina4_python-3.13.140}/LICENSE +0 -0
  46. {tina4_python-3.13.138 → tina4_python-3.13.140}/NOTICE +0 -0
  47. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/HtmlElement.py +0 -0
  48. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/Testing.py +0 -0
  49. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/_import_helper.py +0 -0
  50. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/ai/__init__.py +0 -0
  51. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/ai/client.py +0 -0
  52. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/cache/__init__.py +0 -0
  53. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/container/__init__.py +0 -0
  54. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/context/__init__.py +0 -0
  55. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/context/chunker.py +0 -0
  56. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/core/__init__.py +0 -0
  57. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/core/cache.py +0 -0
  58. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/core/constants.py +0 -0
  59. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/core/events.py +0 -0
  60. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/core/port_takeover.py +0 -0
  61. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/core/rate_limiter.py +0 -0
  62. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/core/response.py +0 -0
  63. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/crud/__init__.py +0 -0
  64. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/database/database_url.py +0 -0
  65. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/database/sql_translator.py +0 -0
  66. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/debug/__init__.py +0 -0
  67. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/debug/error_overlay.py +0 -0
  68. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/dev_admin/__init__.py +0 -0
  69. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/dev_admin/metrics.py +0 -0
  70. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/dev_admin/plan.py +0 -0
  71. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/dev_admin/project_index.py +0 -0
  72. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/docs.py +0 -0
  73. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/docstore/__init__.py +0 -0
  74. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/dotenv/__init__.py +0 -0
  75. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/env.py +0 -0
  76. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/frond/FROND.md +0 -0
  77. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/frond/__init__.py +0 -0
  78. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/frond/compiler.py +0 -0
  79. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/frond/parser.py +0 -0
  80. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/gallery/auth/meta.json +0 -0
  81. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/gallery/auth/src/routes/api/gallery_auth.py +0 -0
  82. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/gallery/database/meta.json +0 -0
  83. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/gallery/database/src/routes/api/gallery_db.py +0 -0
  84. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/gallery/error-overlay/meta.json +0 -0
  85. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/gallery/error-overlay/src/routes/api/gallery_crash.py +0 -0
  86. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/gallery/orm/meta.json +0 -0
  87. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/gallery/orm/src/orm/Product.py +0 -0
  88. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/gallery/orm/src/routes/api/gallery_products.py +0 -0
  89. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/gallery/queue/meta.json +0 -0
  90. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/gallery/queue/src/routes/api/gallery_queue.py +0 -0
  91. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/gallery/rest-api/meta.json +0 -0
  92. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/gallery/rest-api/src/routes/api/gallery_hello.py +0 -0
  93. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/gallery/templates/meta.json +0 -0
  94. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/gallery/templates/src/routes/gallery_page.py +0 -0
  95. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/gallery/templates/src/templates/gallery_page.twig +0 -0
  96. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/graph/__init__.py +0 -0
  97. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/graph/adapter.py +0 -0
  98. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/graph/adapters/__init__.py +0 -0
  99. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/graph/adapters/arango.py +0 -0
  100. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/graph/adapters/bolt.py +0 -0
  101. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/graph/adapters/ultipa.py +0 -0
  102. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/graph/graph_url.py +0 -0
  103. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/i18n/__init__.py +0 -0
  104. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/mcp/protocol.py +0 -0
  105. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/mcp/tools.py +0 -0
  106. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/messenger/__init__.py +0 -0
  107. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/migration/__init__.py +0 -0
  108. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/migration/runner.py +0 -0
  109. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/mqtt/__init__.py +0 -0
  110. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/mqtt/message.py +0 -0
  111. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/orm/__init__.py +0 -0
  112. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/orm/collection.py +0 -0
  113. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/orm/fields.py +0 -0
  114. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/orm/point.py +0 -0
  115. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/THIRD-PARTY-NOTICES.md +0 -0
  116. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/__feedback/widget.js +0 -0
  117. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/bundled-component-provenance.json +0 -0
  118. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/css/tina4.css +0 -0
  119. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/css/tina4.min.css +0 -0
  120. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/favicon.ico +0 -0
  121. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/images/logo.svg +0 -0
  122. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/images/tina4-logo-icon.webp +0 -0
  123. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/js/frond.js +0 -0
  124. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/js/frond.min.js +0 -0
  125. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/js/tina4-dev-admin.min.js +0 -0
  126. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/js/tina4.min.js +0 -0
  127. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/js/tina4js.min.js +0 -0
  128. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/licenses/swagger-ui-3.10.0-original-notice.txt +0 -0
  129. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/licenses/swagger-ui-5.17.14-NOTICE.txt +0 -0
  130. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/licenses/swagger-ui-Apache-2.0.txt +0 -0
  131. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/licenses/tina4-css-MIT.txt +0 -0
  132. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/licenses/tina4-dev-admin-components.json +0 -0
  133. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/licenses/tina4-dev-admin-third-party.txt +0 -0
  134. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/licenses/tina4-js-MIT.txt +0 -0
  135. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/swagger/index.html +0 -0
  136. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/public/swagger/oauth2-redirect.html +0 -0
  137. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/push/_base.py +0 -0
  138. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/push/_cryptography.py +0 -0
  139. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/push/_libcrypto.py +0 -0
  140. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/queue/__init__.py +0 -0
  141. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/queue/amqp_url.py +0 -0
  142. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/queue_backends/__init__.py +0 -0
  143. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/queue_backends/kafka_backend.py +0 -0
  144. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/queue_backends/mongo_backend.py +0 -0
  145. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/realtime/__init__.py +0 -0
  146. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/realtime/models/Attachment.py +0 -0
  147. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/realtime/models/Channel.py +0 -0
  148. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/realtime/models/ChannelMember.py +0 -0
  149. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/realtime/models/Message.py +0 -0
  150. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/realtime/models/Workspace.py +0 -0
  151. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/realtime/models/__init__.py +0 -0
  152. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/realtime/storage.py +0 -0
  153. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/seeder/__init__.py +0 -0
  154. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/service/__init__.py +0 -0
  155. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/session_handlers/__init__.py +0 -0
  156. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/session_handlers/memcached_handler.py +0 -0
  157. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/session_handlers/mongodb_handler.py +0 -0
  158. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/session_handlers/redis_handler.py +0 -0
  159. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/session_handlers/valkey_handler.py +0 -0
  160. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/swagger/__init__.py +0 -0
  161. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/templates/components/crud.twig +0 -0
  162. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/templates/docker/distroless/Dockerfile +0 -0
  163. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/templates/docker/poetry/Dockerfile +0 -0
  164. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/templates/docker/python/Dockerfile +0 -0
  165. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/templates/docker/uv/Dockerfile +0 -0
  166. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/templates/errors/302.twig +0 -0
  167. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/templates/errors/401.twig +0 -0
  168. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/templates/errors/403.twig +0 -0
  169. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/templates/errors/404.twig +0 -0
  170. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/templates/errors/500.twig +0 -0
  171. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/templates/errors/502.twig +0 -0
  172. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/templates/errors/503.twig +0 -0
  173. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/templates/errors/base.twig +0 -0
  174. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/templates/frontend/README.md +0 -0
  175. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/templates/readme.md +0 -0
  176. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/test/__init__.py +0 -0
  177. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/test_client/__init__.py +0 -0
  178. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/translations/af/LC_MESSAGES/messages.mo +0 -0
  179. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/translations/af/LC_MESSAGES/messages.po +0 -0
  180. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/translations/en/LC_MESSAGES/messages.mo +0 -0
  181. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/translations/en/LC_MESSAGES/messages.po +0 -0
  182. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/translations/es/LC_MESSAGES/messages.mo +0 -0
  183. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/translations/es/LC_MESSAGES/messages.po +0 -0
  184. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/translations/fr/LC_MESSAGES/messages.mo +0 -0
  185. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/translations/fr/LC_MESSAGES/messages.po +0 -0
  186. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/translations/ja/LC_MESSAGES/messages.mo +0 -0
  187. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/translations/ja/LC_MESSAGES/messages.po +0 -0
  188. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/translations/zh/LC_MESSAGES/messages.mo +0 -0
  189. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/translations/zh/LC_MESSAGES/messages.po +0 -0
  190. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/validator/__init__.py +0 -0
  191. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/websocket/backplane.py +0 -0
  192. {tina4_python-3.13.138 → tina4_python-3.13.140}/tina4_python/wsdl/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: tina4-python
3
- Version: 3.13.138
3
+ Version: 3.13.140
4
4
  Summary: Tina4 Python v3 — Zero-dependency, lightweight web framework
5
5
  Author-email: Andre van Zuydam <andrevanzuydam@gmail.com>
6
6
  License-Expression: MPL-2.0
@@ -295,13 +295,13 @@ from tina4_python.core.router import get, post, noauth
295
295
  @get("/api/users")
296
296
  async def list_users(request, response):
297
297
  from src.orm.User import User
298
- return response(User.select(limit=100))
298
+ return response(await User.select_async(limit=100))
299
299
 
300
300
  @get("/api/users/{id:int}")
301
301
  async def get_user(id, request, response):
302
302
  from src.orm.User import User
303
303
  user = User()
304
- if user.load("id = ?", [id]):
304
+ if await user.load_async("id = ?", [id]):
305
305
  return response(user.to_dict())
306
306
  return response({"error": "Not found"}, 404)
307
307
 
@@ -310,10 +310,14 @@ async def get_user(id, request, response):
310
310
  async def create_user(request, response):
311
311
  from src.orm.User import User
312
312
  user = User(request.body)
313
- user.save()
313
+ await user.save_async()
314
314
  return response(user.to_dict(), 201)
315
315
  ```
316
316
 
317
+ An `async def` route awaits the `*_async` form of every database and ORM call, so a
318
+ slow query never holds up another request. A plain `def` route can use the sync calls:
319
+ Tina4 runs it in a worker thread.
320
+
317
321
  ### 6. Add a template
318
322
 
319
323
  Create `src/templates/base.twig`:
@@ -453,8 +457,17 @@ result = db.fetch("SELECT * FROM users WHERE age > ?", [18], limit=20, offset=0)
453
457
  row = db.fetch_one("SELECT * FROM users WHERE id = ?", [1])
454
458
  db.insert("users", {"name": "Alice", "email": "alice@test.com"})
455
459
  db.commit()
460
+
461
+ # In an async def route, await the twin of each call
462
+ row = await db.fetch_one_async("SELECT * FROM users WHERE id = ?", [1])
463
+ async with db.transaction_async():
464
+ await db.insert_async("users", {"name": "Bob", "email": "bob@test.com"})
456
465
  ```
457
466
 
467
+ Each `Database` is a pool of connections (`TINA4_DB_POOL`, default 10). Every call borrows
468
+ one for itself and hands it back, and a transaction keeps its connection until it commits or
469
+ rolls back, so two requests never share one.
470
+
458
471
  ### Middleware
459
472
 
460
473
  ```python
@@ -535,7 +548,7 @@ Auto-generated at `/swagger`:
535
548
  @tags(["users"])
536
549
  @get("/api/users")
537
550
  async def users(request, response):
538
- return response(User.select())
551
+ return response(await User.select_async())
539
552
  ```
540
553
 
541
554
  ### Event System
@@ -226,13 +226,13 @@ from tina4_python.core.router import get, post, noauth
226
226
  @get("/api/users")
227
227
  async def list_users(request, response):
228
228
  from src.orm.User import User
229
- return response(User.select(limit=100))
229
+ return response(await User.select_async(limit=100))
230
230
 
231
231
  @get("/api/users/{id:int}")
232
232
  async def get_user(id, request, response):
233
233
  from src.orm.User import User
234
234
  user = User()
235
- if user.load("id = ?", [id]):
235
+ if await user.load_async("id = ?", [id]):
236
236
  return response(user.to_dict())
237
237
  return response({"error": "Not found"}, 404)
238
238
 
@@ -241,10 +241,14 @@ async def get_user(id, request, response):
241
241
  async def create_user(request, response):
242
242
  from src.orm.User import User
243
243
  user = User(request.body)
244
- user.save()
244
+ await user.save_async()
245
245
  return response(user.to_dict(), 201)
246
246
  ```
247
247
 
248
+ An `async def` route awaits the `*_async` form of every database and ORM call, so a
249
+ slow query never holds up another request. A plain `def` route can use the sync calls:
250
+ Tina4 runs it in a worker thread.
251
+
248
252
  ### 6. Add a template
249
253
 
250
254
  Create `src/templates/base.twig`:
@@ -384,8 +388,17 @@ result = db.fetch("SELECT * FROM users WHERE age > ?", [18], limit=20, offset=0)
384
388
  row = db.fetch_one("SELECT * FROM users WHERE id = ?", [1])
385
389
  db.insert("users", {"name": "Alice", "email": "alice@test.com"})
386
390
  db.commit()
391
+
392
+ # In an async def route, await the twin of each call
393
+ row = await db.fetch_one_async("SELECT * FROM users WHERE id = ?", [1])
394
+ async with db.transaction_async():
395
+ await db.insert_async("users", {"name": "Bob", "email": "bob@test.com"})
387
396
  ```
388
397
 
398
+ Each `Database` is a pool of connections (`TINA4_DB_POOL`, default 10). Every call borrows
399
+ one for itself and hands it back, and a transaction keeps its connection until it commits or
400
+ rolls back, so two requests never share one.
401
+
389
402
  ### Middleware
390
403
 
391
404
  ```python
@@ -466,7 +479,7 @@ Auto-generated at `/swagger`:
466
479
  @tags(["users"])
467
480
  @get("/api/users")
468
481
  async def users(request, response):
469
- return response(User.select())
482
+ return response(await User.select_async())
470
483
  ```
471
484
 
472
485
  ### Event System
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tina4-python"
3
- version = "3.13.138"
3
+ version = "3.13.140"
4
4
  description = "Tina4 Python v3 — Zero-dependency, lightweight web framework"
5
5
  authors = [
6
6
  {name = "Andre van Zuydam", email = "andrevanzuydam@gmail.com"}