tina4-python 3.13.133__tar.gz → 3.13.134__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 (173) hide show
  1. {tina4_python-3.13.133 → tina4_python-3.13.134}/PKG-INFO +6 -3
  2. {tina4_python-3.13.133 → tina4_python-3.13.134}/README.md +2 -2
  3. {tina4_python-3.13.133 → tina4_python-3.13.134}/pyproject.toml +8 -1
  4. tina4_python-3.13.134/tina4_python/.tina4-metrics.json +21664 -0
  5. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/CLAUDE.md +1 -1
  6. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/__init__.py +7 -2
  7. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/ai/__init__.py +7 -7
  8. tina4_python-3.13.134/tina4_python/push/__init__.py +236 -0
  9. {tina4_python-3.13.133 → tina4_python-3.13.134}/.gitignore +0 -0
  10. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/HtmlElement.py +0 -0
  11. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/Testing.py +0 -0
  12. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/_import_helper.py +0 -0
  13. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/ai/client.py +0 -0
  14. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/api/__init__.py +0 -0
  15. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/auth/__init__.py +0 -0
  16. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/cache/__init__.py +0 -0
  17. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/cli/__init__.py +0 -0
  18. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/container/__init__.py +0 -0
  19. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/context/__init__.py +0 -0
  20. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/context/chunker.py +0 -0
  21. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/core/__init__.py +0 -0
  22. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/core/cache.py +0 -0
  23. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/core/constants.py +0 -0
  24. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/core/events.py +0 -0
  25. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/core/middleware.py +0 -0
  26. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/core/port_takeover.py +0 -0
  27. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/core/rate_limiter.py +0 -0
  28. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/core/request.py +0 -0
  29. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/core/response.py +0 -0
  30. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/core/router.py +0 -0
  31. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/core/server.py +0 -0
  32. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/crud/__init__.py +0 -0
  33. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/database/__init__.py +0 -0
  34. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/database/adapter.py +0 -0
  35. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/database/connection.py +0 -0
  36. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/database/database_url.py +0 -0
  37. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/database/firebird.py +0 -0
  38. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/database/mongodb.py +0 -0
  39. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/database/mssql.py +0 -0
  40. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/database/mysql.py +0 -0
  41. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/database/odbc.py +0 -0
  42. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/database/postgres.py +0 -0
  43. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/database/sql_translator.py +0 -0
  44. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/database/sqlite.py +0 -0
  45. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/debug/__init__.py +0 -0
  46. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/debug/error_overlay.py +0 -0
  47. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/dev_admin/__init__.py +0 -0
  48. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/dev_admin/metrics.py +0 -0
  49. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/dev_admin/plan.py +0 -0
  50. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/dev_admin/project_index.py +0 -0
  51. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/docs.py +0 -0
  52. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/docstore/__init__.py +0 -0
  53. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/dotenv/__init__.py +0 -0
  54. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/env.py +0 -0
  55. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/frond/FROND.md +0 -0
  56. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/frond/__init__.py +0 -0
  57. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/frond/compiler.py +0 -0
  58. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/frond/engine.py +0 -0
  59. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/frond/parser.py +0 -0
  60. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/gallery/auth/meta.json +0 -0
  61. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/gallery/auth/src/routes/api/gallery_auth.py +0 -0
  62. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/gallery/database/meta.json +0 -0
  63. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/gallery/database/src/routes/api/gallery_db.py +0 -0
  64. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/gallery/error-overlay/meta.json +0 -0
  65. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/gallery/error-overlay/src/routes/api/gallery_crash.py +0 -0
  66. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/gallery/orm/meta.json +0 -0
  67. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/gallery/orm/src/orm/Product.py +0 -0
  68. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/gallery/orm/src/routes/api/gallery_products.py +0 -0
  69. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/gallery/queue/meta.json +0 -0
  70. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/gallery/queue/src/routes/api/gallery_queue.py +0 -0
  71. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/gallery/rest-api/meta.json +0 -0
  72. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/gallery/rest-api/src/routes/api/gallery_hello.py +0 -0
  73. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/gallery/templates/meta.json +0 -0
  74. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/gallery/templates/src/routes/gallery_page.py +0 -0
  75. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/gallery/templates/src/templates/gallery_page.twig +0 -0
  76. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/graph/__init__.py +0 -0
  77. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/graph/adapter.py +0 -0
  78. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/graph/adapters/__init__.py +0 -0
  79. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/graph/adapters/arango.py +0 -0
  80. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/graph/adapters/bolt.py +0 -0
  81. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/graph/adapters/ultipa.py +0 -0
  82. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/graph/graph_url.py +0 -0
  83. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/graphql/__init__.py +0 -0
  84. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/i18n/__init__.py +0 -0
  85. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/mcp/__init__.py +0 -0
  86. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/mcp/protocol.py +0 -0
  87. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/mcp/tools.py +0 -0
  88. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/messenger/__init__.py +0 -0
  89. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/migration/__init__.py +0 -0
  90. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/migration/runner.py +0 -0
  91. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/mqtt/__init__.py +0 -0
  92. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/mqtt/message.py +0 -0
  93. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/orm/__init__.py +0 -0
  94. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/orm/collection.py +0 -0
  95. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/orm/fields.py +0 -0
  96. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/orm/model.py +0 -0
  97. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/orm/point.py +0 -0
  98. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/public/__feedback/widget.js +0 -0
  99. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/public/css/tina4.css +0 -0
  100. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/public/css/tina4.min.css +0 -0
  101. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/public/favicon.ico +0 -0
  102. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/public/images/logo.svg +0 -0
  103. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/public/images/tina4-logo-icon.webp +0 -0
  104. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/public/js/frond.js +0 -0
  105. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/public/js/frond.min.js +0 -0
  106. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/public/js/tina4-dev-admin.min.js +0 -0
  107. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/public/js/tina4.min.js +0 -0
  108. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/public/js/tina4js.min.js +0 -0
  109. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/public/swagger/index.html +0 -0
  110. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/public/swagger/oauth2-redirect.html +0 -0
  111. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/query_builder/__init__.py +0 -0
  112. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/queue/__init__.py +0 -0
  113. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/queue/amqp_url.py +0 -0
  114. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/queue/job.py +0 -0
  115. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/queue/kafka_backend.py +0 -0
  116. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/queue/lite_backend.py +0 -0
  117. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/queue/mongo_backend.py +0 -0
  118. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/queue/rabbitmq_backend.py +0 -0
  119. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/queue_backends/__init__.py +0 -0
  120. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/queue_backends/kafka_backend.py +0 -0
  121. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/queue_backends/mongo_backend.py +0 -0
  122. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/queue_backends/rabbitmq_backend.py +0 -0
  123. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/realtime/__init__.py +0 -0
  124. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/realtime/models/Attachment.py +0 -0
  125. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/realtime/models/Channel.py +0 -0
  126. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/realtime/models/ChannelMember.py +0 -0
  127. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/realtime/models/Message.py +0 -0
  128. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/realtime/models/Workspace.py +0 -0
  129. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/realtime/models/__init__.py +0 -0
  130. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/realtime/storage.py +0 -0
  131. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/seeder/__init__.py +0 -0
  132. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/service/__init__.py +0 -0
  133. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/session/__init__.py +0 -0
  134. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/session_handlers/__init__.py +0 -0
  135. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/session_handlers/memcached_handler.py +0 -0
  136. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/session_handlers/mongodb_handler.py +0 -0
  137. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/session_handlers/redis_handler.py +0 -0
  138. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/session_handlers/valkey_handler.py +0 -0
  139. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/sso.py +0 -0
  140. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/swagger/__init__.py +0 -0
  141. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/templates/components/crud.twig +0 -0
  142. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/templates/docker/distroless/Dockerfile +0 -0
  143. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/templates/docker/poetry/Dockerfile +0 -0
  144. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/templates/docker/python/Dockerfile +0 -0
  145. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/templates/docker/uv/Dockerfile +0 -0
  146. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/templates/errors/302.twig +0 -0
  147. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/templates/errors/401.twig +0 -0
  148. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/templates/errors/403.twig +0 -0
  149. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/templates/errors/404.twig +0 -0
  150. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/templates/errors/500.twig +0 -0
  151. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/templates/errors/502.twig +0 -0
  152. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/templates/errors/503.twig +0 -0
  153. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/templates/errors/base.twig +0 -0
  154. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/templates/frontend/README.md +0 -0
  155. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/templates/readme.md +0 -0
  156. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/test/__init__.py +0 -0
  157. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/test_client/__init__.py +0 -0
  158. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/translations/af/LC_MESSAGES/messages.mo +0 -0
  159. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/translations/af/LC_MESSAGES/messages.po +0 -0
  160. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/translations/en/LC_MESSAGES/messages.mo +0 -0
  161. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/translations/en/LC_MESSAGES/messages.po +0 -0
  162. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/translations/es/LC_MESSAGES/messages.mo +0 -0
  163. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/translations/es/LC_MESSAGES/messages.po +0 -0
  164. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/translations/fr/LC_MESSAGES/messages.mo +0 -0
  165. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/translations/fr/LC_MESSAGES/messages.po +0 -0
  166. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/translations/ja/LC_MESSAGES/messages.mo +0 -0
  167. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/translations/ja/LC_MESSAGES/messages.po +0 -0
  168. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/translations/zh/LC_MESSAGES/messages.mo +0 -0
  169. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/translations/zh/LC_MESSAGES/messages.po +0 -0
  170. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/validator/__init__.py +0 -0
  171. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/websocket/__init__.py +0 -0
  172. {tina4_python-3.13.133 → tina4_python-3.13.134}/tina4_python/websocket/backplane.py +0 -0
  173. {tina4_python-3.13.133 → tina4_python-3.13.134}/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.133
3
+ Version: 3.13.134
4
4
  Summary: Tina4 Python v3 — Zero-dependency, lightweight web framework
5
5
  Author-email: Andre van Zuydam <andrevanzuydam@gmail.com>
6
6
  License: MIT
@@ -37,6 +37,8 @@ Provides-Extra: odbc
37
37
  Requires-Dist: pyodbc>=5.0; extra == 'odbc'
38
38
  Provides-Extra: postgres
39
39
  Requires-Dist: psycopg2-binary>=2.9; extra == 'postgres'
40
+ Provides-Extra: push
41
+ Requires-Dist: cryptography>=42.0; extra == 'push'
40
42
  Provides-Extra: rabbitmq
41
43
  Requires-Dist: pika>=1.3; extra == 'rabbitmq'
42
44
  Provides-Extra: redis
@@ -46,6 +48,7 @@ Requires-Dist: boto3>=1.34; extra == 's3'
46
48
  Provides-Extra: test
47
49
  Requires-Dist: boto3>=1.34; extra == 'test'
48
50
  Requires-Dist: confluent-kafka>=2.0; extra == 'test'
51
+ Requires-Dist: cryptography>=42.0; extra == 'test'
49
52
  Requires-Dist: firebird-driver>=1.10; extra == 'test'
50
53
  Requires-Dist: mysql-connector-python>=9.0; extra == 'test'
51
54
  Requires-Dist: openapi-spec-validator>=0.7; extra == 'test'
@@ -771,7 +774,7 @@ Benchmarked with `wrk`: 5,000 requests, 50 concurrent, median of 3 runs:
771
774
  | Bottle | 4,355 | 0 | ~5 |
772
775
  | Django | 4,050 | 20+ | ~22 |
773
776
 
774
- Tina4 Python delivers competitive throughput with **zero dependencies and 98 features**. Frameworks with higher req/s have a fraction of the functionality and require dozens of third-party packages.
777
+ Tina4 Python delivers competitive throughput with **zero dependencies and 140 cataloged features**. Frameworks with higher req/s have a fraction of the functionality and require dozens of third-party packages.
775
778
 
776
779
  **Across all 4 Tina4 implementations:**
777
780
 
@@ -787,7 +790,7 @@ Run benchmarks locally: `python benchmarks/benchmark.py --python`
787
790
 
788
791
  ## Cross-Framework Parity
789
792
 
790
- Tina4 ships identical features across four languages: same architecture, same conventions, same 98 features:
793
+ Tina4 ships identical features across four languages: same architecture, same conventions, the same 140 cataloged features:
791
794
 
792
795
  | | Python | PHP | Ruby | Node.js |
793
796
  |---|--------|-----|------|---------|
@@ -708,7 +708,7 @@ Benchmarked with `wrk`: 5,000 requests, 50 concurrent, median of 3 runs:
708
708
  | Bottle | 4,355 | 0 | ~5 |
709
709
  | Django | 4,050 | 20+ | ~22 |
710
710
 
711
- Tina4 Python delivers competitive throughput with **zero dependencies and 98 features**. Frameworks with higher req/s have a fraction of the functionality and require dozens of third-party packages.
711
+ Tina4 Python delivers competitive throughput with **zero dependencies and 140 cataloged features**. Frameworks with higher req/s have a fraction of the functionality and require dozens of third-party packages.
712
712
 
713
713
  **Across all 4 Tina4 implementations:**
714
714
 
@@ -724,7 +724,7 @@ Run benchmarks locally: `python benchmarks/benchmark.py --python`
724
724
 
725
725
  ## Cross-Framework Parity
726
726
 
727
- Tina4 ships identical features across four languages: same architecture, same conventions, same 98 features:
727
+ Tina4 ships identical features across four languages: same architecture, same conventions, the same 140 cataloged features:
728
728
 
729
729
  | | Python | PHP | Ruby | Node.js |
730
730
  |---|--------|-----|------|---------|
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tina4-python"
3
- version = "3.13.133"
3
+ version = "3.13.134"
4
4
  description = "Tina4 Python v3 — Zero-dependency, lightweight web framework"
5
5
  authors = [
6
6
  {name = "Andre van Zuydam", email = "andrevanzuydam@gmail.com"}
@@ -41,6 +41,11 @@ s3 = ["boto3>=1.34"]
41
41
  kafka = ["confluent-kafka>=2.0"]
42
42
  rabbitmq = ["pika>=1.3"]
43
43
 
44
+ # Web Push is zero-dependency until selected. The standard library has no
45
+ # P-256 ECDH or ES256 primitives, so the native cryptography capability is
46
+ # installed explicitly when a project enables Web Push.
47
+ push = ["cryptography>=42.0"]
48
+
44
49
  # All database drivers
45
50
  all-db = [
46
51
  "psycopg2-binary>=2.9",
@@ -92,6 +97,8 @@ test = [
92
97
  # OpenAPI 3.0/3.1 schema (tests/test_swagger_contract.py). NEVER a framework
93
98
  # runtime dependency — the swagger generator itself stays zero-dependency.
94
99
  "openapi-spec-validator>=0.7",
100
+ # TEST-ONLY: exercises Feature 140's optional native crypto capability.
101
+ "cryptography>=42.0",
95
102
  ]
96
103
 
97
104
  [dependency-groups]