supython 0.1.11__tar.gz → 0.1.12__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 (256) hide show
  1. {supython-0.1.11 → supython-0.1.12}/.gitignore +1 -0
  2. {supython-0.1.11 → supython-0.1.12}/CHANGELOG.md +21 -0
  3. {supython-0.1.11 → supython-0.1.12}/PKG-INFO +1 -1
  4. {supython-0.1.11 → supython-0.1.12}/pyproject.toml +1 -1
  5. {supython-0.1.11 → supython-0.1.12}/src/supython/logging_config.py +21 -29
  6. {supython-0.1.11 → supython-0.1.12}/LICENSE +0 -0
  7. {supython-0.1.11 → supython-0.1.12}/README.md +0 -0
  8. {supython-0.1.11 → supython-0.1.12}/SECURITY.md +0 -0
  9. {supython-0.1.11 → supython-0.1.12}/src/supython/__init__.py +0 -0
  10. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/__init__.py +0 -0
  11. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/__init__.py +0 -0
  12. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/auth.py +0 -0
  13. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/auth_templates.py +0 -0
  14. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/auth_users.py +0 -0
  15. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/db.py +0 -0
  16. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/functions.py +0 -0
  17. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/jobs.py +0 -0
  18. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/ops.py +0 -0
  19. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/realtime.py +0 -0
  20. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_auth.py +0 -0
  21. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_auth_templates.py +0 -0
  22. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_auth_users.py +0 -0
  23. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_db.py +0 -0
  24. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_functions.py +0 -0
  25. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_jobs.py +0 -0
  26. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_ops.py +0 -0
  27. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_realtime.py +0 -0
  28. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_storage.py +0 -0
  29. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/storage.py +0 -0
  30. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/system.py +0 -0
  31. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/audit.py +0 -0
  32. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/deps.py +0 -0
  33. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/errors.py +0 -0
  34. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/schemas.py +0 -0
  35. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/session.py +0 -0
  36. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/spa.py +0 -0
  37. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Alert-dluGVkos.js +0 -0
  38. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Alert-dluGVkos.js.map +0 -0
  39. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Audit-Njung3HI.js +0 -0
  40. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Audit-Njung3HI.js.map +0 -0
  41. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Backups-DzPlFgrm.js +0 -0
  42. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Backups-DzPlFgrm.js.map +0 -0
  43. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Buckets-ByacGkU1.js +0 -0
  44. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Buckets-ByacGkU1.js.map +0 -0
  45. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Channels-BoIuTtam.js +0 -0
  46. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Channels-BoIuTtam.js.map +0 -0
  47. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/ChevronRight-CtQH1EQ1.js +0 -0
  48. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/ChevronRight-CtQH1EQ1.js.map +0 -0
  49. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/CodeViewer-Bqy7-wvH.js +0 -0
  50. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/CodeViewer-Bqy7-wvH.js.map +0 -0
  51. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Crons-B67vc39F.js +0 -0
  52. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Crons-B67vc39F.js.map +0 -0
  53. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js +0 -0
  54. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js.map +0 -0
  55. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DataTable-COAAWEft.js +0 -0
  56. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DataTable-COAAWEft.js.map +0 -0
  57. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js +0 -0
  58. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js.map +0 -0
  59. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DrawerContent-TpYTFgF1.js +0 -0
  60. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DrawerContent-TpYTFgF1.js.map +0 -0
  61. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Empty-cr2r7e2u.js +0 -0
  62. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Empty-cr2r7e2u.js.map +0 -0
  63. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/EmptyState-DeDck-OL.js +0 -0
  64. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/EmptyState-DeDck-OL.js.map +0 -0
  65. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Grid-hFkp9F4P.js +0 -0
  66. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Grid-hFkp9F4P.js.map +0 -0
  67. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Input-DppYTq9C.js +0 -0
  68. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Input-DppYTq9C.js.map +0 -0
  69. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Invoke-DW3Nveeh.js +0 -0
  70. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Invoke-DW3Nveeh.js.map +0 -0
  71. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/JsonField-DibyJgun.js +0 -0
  72. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/JsonField-DibyJgun.js.map +0 -0
  73. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/LoginView-BjLyE3Ds.css +0 -0
  74. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/LoginView-CoOjECT_.js +0 -0
  75. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/LoginView-CoOjECT_.js.map +0 -0
  76. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Logs-D9WYrnIT.js +0 -0
  77. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Logs-D9WYrnIT.js.map +0 -0
  78. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Logs-DS1XPa0h.css +0 -0
  79. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Migrations-DOSC2ddQ.js +0 -0
  80. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Migrations-DOSC2ddQ.js.map +0 -0
  81. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js +0 -0
  82. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js.map +0 -0
  83. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Queue-CywZs6vI.js +0 -0
  84. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Queue-CywZs6vI.js.map +0 -0
  85. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js +0 -0
  86. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js.map +0 -0
  87. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/RlsEditor-BSlH9vSc.js +0 -0
  88. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/RlsEditor-BSlH9vSc.js.map +0 -0
  89. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Routes-BiLXE49D.js +0 -0
  90. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Routes-BiLXE49D.js.map +0 -0
  91. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Routes-C-ianIGD.css +0 -0
  92. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SchemaBrowser-DKy2_KQi.css +0 -0
  93. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SchemaBrowser-XFvFbtDB.js +0 -0
  94. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SchemaBrowser-XFvFbtDB.js.map +0 -0
  95. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Select-DIzZyRZb.js +0 -0
  96. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Select-DIzZyRZb.js.map +0 -0
  97. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Space-n5-XcguU.js +0 -0
  98. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Space-n5-XcguU.js.map +0 -0
  99. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SqlEditor-b8pTsILY.js +0 -0
  100. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SqlEditor-b8pTsILY.js.map +0 -0
  101. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SqlWorkspace-BUS7IntH.js +0 -0
  102. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SqlWorkspace-BUS7IntH.js.map +0 -0
  103. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/TableData-CQIagLKn.js +0 -0
  104. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/TableData-CQIagLKn.js.map +0 -0
  105. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Tag-D1fOKpTH.js +0 -0
  106. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Tag-D1fOKpTH.js.map +0 -0
  107. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Templates-BS-ugkdq.js +0 -0
  108. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Templates-BS-ugkdq.js.map +0 -0
  109. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Thing-CEAniuMg.js +0 -0
  110. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Thing-CEAniuMg.js.map +0 -0
  111. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Users-wzwajhlh.js +0 -0
  112. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Users-wzwajhlh.js.map +0 -0
  113. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/_plugin-vue_export-helper-DGA9ry_j.js +0 -0
  114. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/dist-VXIJLCYq.js +0 -0
  115. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/dist-VXIJLCYq.js.map +0 -0
  116. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/format-length-CGCY1rMh.js +0 -0
  117. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/format-length-CGCY1rMh.js.map +0 -0
  118. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/get-Ca6unauB.js +0 -0
  119. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/get-Ca6unauB.js.map +0 -0
  120. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/index-CeE6v959.js +0 -0
  121. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/index-CeE6v959.js.map +0 -0
  122. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/pinia-COXwfrOX.js +0 -0
  123. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/pinia-COXwfrOX.js.map +0 -0
  124. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/resources-Bt6thQCD.js +0 -0
  125. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/resources-Bt6thQCD.js.map +0 -0
  126. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/use-locale-mtgM0a3a.js +0 -0
  127. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/use-locale-mtgM0a3a.js.map +0 -0
  128. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js +0 -0
  129. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js.map +0 -0
  130. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useConfirm-tMjvBFXR.js +0 -0
  131. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useConfirm-tMjvBFXR.js.map +0 -0
  132. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useResource-C_rJCY8C.js +0 -0
  133. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useResource-C_rJCY8C.js.map +0 -0
  134. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useTable-CnZc5zhi.js +0 -0
  135. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useTable-CnZc5zhi.js.map +0 -0
  136. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useTable-Dg0XlRlq.css +0 -0
  137. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useToast-DsZKx0IX.js +0 -0
  138. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useToast-DsZKx0IX.js.map +0 -0
  139. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/utils-sbXoq7Ir.js +0 -0
  140. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/utils-sbXoq7Ir.js.map +0 -0
  141. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/favicon.svg +0 -0
  142. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/icons.svg +0 -0
  143. {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/index.html +0 -0
  144. {supython-0.1.11 → supython-0.1.12}/src/supython/app.py +0 -0
  145. {supython-0.1.11 → supython-0.1.12}/src/supython/auth/__init__.py +0 -0
  146. {supython-0.1.11 → supython-0.1.12}/src/supython/auth/_email_job.py +0 -0
  147. {supython-0.1.11 → supython-0.1.12}/src/supython/auth/claims.py +0 -0
  148. {supython-0.1.11 → supython-0.1.12}/src/supython/auth/deps.py +0 -0
  149. {supython-0.1.11 → supython-0.1.12}/src/supython/auth/providers/__init__.py +0 -0
  150. {supython-0.1.11 → supython-0.1.12}/src/supython/auth/providers/github.py +0 -0
  151. {supython-0.1.11 → supython-0.1.12}/src/supython/auth/providers/google.py +0 -0
  152. {supython-0.1.11 → supython-0.1.12}/src/supython/auth/providers/oauth.py +0 -0
  153. {supython-0.1.11 → supython-0.1.12}/src/supython/auth/providers/registry.py +0 -0
  154. {supython-0.1.11 → supython-0.1.12}/src/supython/auth/ratelimit.py +0 -0
  155. {supython-0.1.11 → supython-0.1.12}/src/supython/auth/router.py +0 -0
  156. {supython-0.1.11 → supython-0.1.12}/src/supython/auth/schemas.py +0 -0
  157. {supython-0.1.11 → supython-0.1.12}/src/supython/auth/service.py +0 -0
  158. {supython-0.1.11 → supython-0.1.12}/src/supython/backups/__init__.py +0 -0
  159. {supython-0.1.11 → supython-0.1.12}/src/supython/backups/_backup_job.py +0 -0
  160. {supython-0.1.11 → supython-0.1.12}/src/supython/backups/schemas.py +0 -0
  161. {supython-0.1.11 → supython-0.1.12}/src/supython/backups/service.py +0 -0
  162. {supython-0.1.11 → supython-0.1.12}/src/supython/body_size.py +0 -0
  163. {supython-0.1.11 → supython-0.1.12}/src/supython/cli.py +0 -0
  164. {supython-0.1.11 → supython-0.1.12}/src/supython/client/__init__.py +0 -0
  165. {supython-0.1.11 → supython-0.1.12}/src/supython/client/_auth.py +0 -0
  166. {supython-0.1.11 → supython-0.1.12}/src/supython/client/_client.py +0 -0
  167. {supython-0.1.11 → supython-0.1.12}/src/supython/client/_config.py +0 -0
  168. {supython-0.1.11 → supython-0.1.12}/src/supython/client/_functions.py +0 -0
  169. {supython-0.1.11 → supython-0.1.12}/src/supython/client/_storage.py +0 -0
  170. {supython-0.1.11 → supython-0.1.12}/src/supython/client/py.typed +0 -0
  171. {supython-0.1.11 → supython-0.1.12}/src/supython/db.py +0 -0
  172. {supython-0.1.11 → supython-0.1.12}/src/supython/db_admin.py +0 -0
  173. {supython-0.1.11 → supython-0.1.12}/src/supython/extensions.py +0 -0
  174. {supython-0.1.11 → supython-0.1.12}/src/supython/functions/__init__.py +0 -0
  175. {supython-0.1.11 → supython-0.1.12}/src/supython/functions/context.py +0 -0
  176. {supython-0.1.11 → supython-0.1.12}/src/supython/functions/loader.py +0 -0
  177. {supython-0.1.11 → supython-0.1.12}/src/supython/functions/router.py +0 -0
  178. {supython-0.1.11 → supython-0.1.12}/src/supython/functions/schemas.py +0 -0
  179. {supython-0.1.11 → supython-0.1.12}/src/supython/gen/__init__.py +0 -0
  180. {supython-0.1.11 → supython-0.1.12}/src/supython/gen/_introspect.py +0 -0
  181. {supython-0.1.11 → supython-0.1.12}/src/supython/gen/types_py.py +0 -0
  182. {supython-0.1.11 → supython-0.1.12}/src/supython/gen/types_ts.py +0 -0
  183. {supython-0.1.11 → supython-0.1.12}/src/supython/health.py +0 -0
  184. {supython-0.1.11 → supython-0.1.12}/src/supython/hooks.py +0 -0
  185. {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/__init__.py +0 -0
  186. {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/backends.py +0 -0
  187. {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/context.py +0 -0
  188. {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/cron.py +0 -0
  189. {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/cron_inproc.py +0 -0
  190. {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/decorators.py +0 -0
  191. {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/registry.py +0 -0
  192. {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/router.py +0 -0
  193. {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/schemas.py +0 -0
  194. {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/service.py +0 -0
  195. {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/worker.py +0 -0
  196. {supython-0.1.11 → supython-0.1.12}/src/supython/jwks.py +0 -0
  197. {supython-0.1.11 → supython-0.1.12}/src/supython/keyset.py +0 -0
  198. {supython-0.1.11 → supython-0.1.12}/src/supython/mail.py +0 -0
  199. {supython-0.1.11 → supython-0.1.12}/src/supython/mailer.py +0 -0
  200. {supython-0.1.11 → supython-0.1.12}/src/supython/migrate.py +0 -0
  201. {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0001_extensions_and_roles.sql +0 -0
  202. {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0002_auth_schema.sql +0 -0
  203. {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0004_auth_v0_2.sql +0 -0
  204. {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0005_storage_schema.sql +0 -0
  205. {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0006_realtime_schema.sql +0 -0
  206. {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0007_jobs_schema.sql +0 -0
  207. {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0008_jobs_last_error.sql +0 -0
  208. {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0009_auth_rate_limits.sql +0 -0
  209. {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0010_worker_heartbeat.sql +0 -0
  210. {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0011_admin_schema.sql +0 -0
  211. {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0012_auth_banned_until.sql +0 -0
  212. {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0013_email_templates.sql +0 -0
  213. {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0014_realtime_payload_warning.sql +0 -0
  214. {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0015_backups_schema.sql +0 -0
  215. {supython-0.1.11 → supython-0.1.12}/src/supython/passwords.py +0 -0
  216. {supython-0.1.11 → supython-0.1.12}/src/supython/realtime/__init__.py +0 -0
  217. {supython-0.1.11 → supython-0.1.12}/src/supython/realtime/broker.py +0 -0
  218. {supython-0.1.11 → supython-0.1.12}/src/supython/realtime/protocol.py +0 -0
  219. {supython-0.1.11 → supython-0.1.12}/src/supython/realtime/router.py +0 -0
  220. {supython-0.1.11 → supython-0.1.12}/src/supython/realtime/schemas.py +0 -0
  221. {supython-0.1.11 → supython-0.1.12}/src/supython/realtime/service.py +0 -0
  222. {supython-0.1.11 → supython-0.1.12}/src/supython/realtime/topics.py +0 -0
  223. {supython-0.1.11 → supython-0.1.12}/src/supython/realtime/websocket.py +0 -0
  224. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/__init__.py +0 -0
  225. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/init_project.py +0 -0
  226. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/Caddyfile.tmpl +0 -0
  227. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/README.md.tmpl +0 -0
  228. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/apps_hooks_welcome.py.tmpl +0 -0
  229. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/apps_jobs_example.py.tmpl +0 -0
  230. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/asgi.py.tmpl +0 -0
  231. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/docker-compose.prod.yml.tmpl +0 -0
  232. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/docker-compose.yml.tmpl +0 -0
  233. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/docker_postgres_Dockerfile.tmpl +0 -0
  234. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/docker_postgres_postgresql.conf.tmpl +0 -0
  235. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/env.example.tmpl +0 -0
  236. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/functions_README.md.tmpl +0 -0
  237. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/gitignore.tmpl +0 -0
  238. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/manage.py.tmpl +0 -0
  239. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/package_hooks_init.py.tmpl +0 -0
  240. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/package_init.py.tmpl +0 -0
  241. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/package_jobs_init.py.tmpl +0 -0
  242. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/pyproject.toml.tmpl +0 -0
  243. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/settings.py.tmpl +0 -0
  244. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/static/0001_create_todos.sql +0 -0
  245. {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/static/functions_hello.py +0 -0
  246. {supython-0.1.11 → supython-0.1.12}/src/supython/secretset.py +0 -0
  247. {supython-0.1.11 → supython-0.1.12}/src/supython/security_headers.py +0 -0
  248. {supython-0.1.11 → supython-0.1.12}/src/supython/settings.py +0 -0
  249. {supython-0.1.11 → supython-0.1.12}/src/supython/settings_module.py +0 -0
  250. {supython-0.1.11 → supython-0.1.12}/src/supython/storage/__init__.py +0 -0
  251. {supython-0.1.11 → supython-0.1.12}/src/supython/storage/backends.py +0 -0
  252. {supython-0.1.11 → supython-0.1.12}/src/supython/storage/router.py +0 -0
  253. {supython-0.1.11 → supython-0.1.12}/src/supython/storage/schemas.py +0 -0
  254. {supython-0.1.11 → supython-0.1.12}/src/supython/storage/service.py +0 -0
  255. {supython-0.1.11 → supython-0.1.12}/src/supython/storage/signing.py +0 -0
  256. {supython-0.1.11 → supython-0.1.12}/src/supython/tokens.py +0 -0
@@ -23,6 +23,7 @@ htmlcov/
23
23
  # dev-app/ is the dogfooded scaffolded project living inside the lib repo.
24
24
  # Its checked-in shape (compose files, functions, storage fixtures) mirrors
25
25
  # what `supython init` would produce; runtime state stays untracked.
26
+ dev-app/
26
27
  dev-app/.env
27
28
  dev-app/.supython/
28
29
  dev-app/backups/
@@ -30,6 +30,26 @@ Each entry links the relevant `PROJECT.md` section and decision-log row
30
30
 
31
31
  ---
32
32
 
33
+ ## [0.1.12] — 2026-07-01
34
+
35
+ ### Fixed
36
+
37
+ - `RequestLoggingMiddleware` no longer truncates request bodies larger than
38
+ `_REQUEST_LOG_MAX_BODY_BYTES` (10 KiB) before they reach the application. It
39
+ had eagerly drained the whole body, kept only the first 10 KiB for the 5xx
40
+ log copy, then replayed *that truncated buffer* to the app — so every request
41
+ with a larger body was silently corrupted before the handler saw it: multipart
42
+ uploads lost their trailing bytes and closing boundary (Starlette then dropped
43
+ the file part, surfacing as a misleading `a multipart 'file' part is required`
44
+ 400), and large JSON payloads were cut mid-document. The middleware now **tees**
45
+ the body — forwarding each ASGI message to the app untouched while copying only
46
+ a bounded prefix aside for logging — so the stream stays intact, true streaming
47
+ (storage/functions) is never buffered whole, and `http.disconnect` still
48
+ propagates for streaming-response hangup detection. The logged `request_body`
49
+ now reflects the bytes the app actually consumed. (#5)
50
+
51
+ ---
52
+
33
53
  ## [0.1.11] — 2026-06-13
34
54
 
35
55
  Project-initialization ergonomics. `supython init` now produces a project that
@@ -298,6 +318,7 @@ v0.1–v0.7 plus a v1.1.x admin track; see §19 decision log
298
318
  ---
299
319
 
300
320
 
321
+ [0.1.12]: https://github.com/Tkeby/supython/releases/tag/v0.1.12
301
322
  [0.1.11]: https://github.com/Tkeby/supython/releases/tag/v0.1.11
302
323
  [0.1.10]: https://github.com/Tkeby/supython/releases/tag/v0.1.10
303
324
  [0.1.9]: https://github.com/Tkeby/supython/releases/tag/v0.1.9
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: supython
3
- Version: 0.1.11
3
+ Version: 0.1.12
4
4
  Summary: A lightweight Postgres-first BaaS framework for Python
5
5
  Project-URL: Homepage, https://github.com/Tkeby/supython
6
6
  Project-URL: Repository, https://github.com/Tkeby/supython
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "supython"
7
- version = "0.1.11"
7
+ version = "0.1.12"
8
8
  description = "A lightweight Postgres-first BaaS framework for Python"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -179,18 +179,29 @@ class RequestLoggingMiddleware:
179
179
 
180
180
  rid = get_request_id()
181
181
 
182
+ # Capture a bounded prefix of the request body for diagnostic logging
183
+ # WITHOUT altering the byte stream the inner app receives. Each ASGI
184
+ # message is forwarded through untouched while up to
185
+ # _REQUEST_LOG_MAX_BODY_BYTES is copied aside for the log record.
186
+ #
187
+ # This must never pre-read or rewrite the body. The previous approach
188
+ # eagerly drained the whole request, kept only the first
189
+ # _REQUEST_LOG_MAX_BODY_BYTES, then replayed *that truncated buffer* to
190
+ # the app — silently corrupting every request whose body exceeded the
191
+ # cap (multipart file uploads, large JSON payloads: the trailing bytes,
192
+ # and with them the multipart closing boundary, never reached the
193
+ # handler). Teeing keeps the stream intact, preserves true streaming
194
+ # (storage/functions are never buffered whole), and still forwards
195
+ # http.disconnect so streaming responses can detect client hangups.
182
196
  body_chunks: list[bytes] = []
183
197
  body_size = 0
184
198
  body_truncated = False
185
199
 
186
- async def _drain_body() -> None:
200
+ async def _receive() -> dict[str, Any]:
187
201
  nonlocal body_size, body_truncated
188
- while True:
189
- msg = await receive()
190
- if msg["type"] != "http.request":
191
- continue
202
+ msg = await receive()
203
+ if msg["type"] == "http.request":
192
204
  chunk = msg.get("body", b"")
193
- more = msg.get("more_body", False)
194
205
  if chunk and body_size < _REQUEST_LOG_MAX_BODY_BYTES:
195
206
  space = _REQUEST_LOG_MAX_BODY_BYTES - body_size
196
207
  if len(chunk) > space:
@@ -200,29 +211,7 @@ class RequestLoggingMiddleware:
200
211
  else:
201
212
  body_chunks.append(chunk)
202
213
  body_size += len(chunk)
203
- if not more:
204
- break
205
-
206
- await _drain_body()
207
-
208
- full_body = b"".join(body_chunks)
209
- body_consumed = False
210
-
211
- async def _receive() -> dict[str, Any]:
212
- nonlocal body_consumed
213
- if not body_consumed:
214
- body_consumed = True
215
- return {
216
- "type": "http.request",
217
- "body": full_body,
218
- "more_body": False,
219
- }
220
- # Body already delivered. Forward subsequent calls to the real
221
- # receive() so callers awaiting http.disconnect (e.g. Starlette's
222
- # StreamingResponse.listen_for_disconnect) actually block on the
223
- # event loop instead of busy-looping on synchronous returns,
224
- # which would starve the streaming task and hang the request.
225
- return await receive()
214
+ return msg
226
215
 
227
216
  status_code: int = 0
228
217
  response_size: int = 0
@@ -270,6 +259,9 @@ class RequestLoggingMiddleware:
270
259
  is_server_error = 500 <= status_code < 600 or exc_info is not None
271
260
 
272
261
  if is_server_error:
262
+ # The bounded prefix the app actually consumed (see the tee in
263
+ # _receive above); empty if the handler errored before reading.
264
+ full_body = b"".join(body_chunks)
273
265
  fields["request_body"] = full_body.decode("utf-8", errors="replace")
274
266
  if body_truncated:
275
267
  fields["body_truncated"] = True
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes