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.
- {supython-0.1.11 → supython-0.1.12}/.gitignore +1 -0
- {supython-0.1.11 → supython-0.1.12}/CHANGELOG.md +21 -0
- {supython-0.1.11 → supython-0.1.12}/PKG-INFO +1 -1
- {supython-0.1.11 → supython-0.1.12}/pyproject.toml +1 -1
- {supython-0.1.11 → supython-0.1.12}/src/supython/logging_config.py +21 -29
- {supython-0.1.11 → supython-0.1.12}/LICENSE +0 -0
- {supython-0.1.11 → supython-0.1.12}/README.md +0 -0
- {supython-0.1.11 → supython-0.1.12}/SECURITY.md +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/__init__.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/__init__.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/__init__.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/auth.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/auth_templates.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/auth_users.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/db.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/functions.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/jobs.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/ops.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/realtime.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_auth.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_auth_templates.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_auth_users.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_db.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_functions.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_jobs.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_ops.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_realtime.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/service_storage.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/storage.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/api/system.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/audit.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/deps.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/errors.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/schemas.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/session.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/spa.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Alert-dluGVkos.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Alert-dluGVkos.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Audit-Njung3HI.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Audit-Njung3HI.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Backups-DzPlFgrm.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Backups-DzPlFgrm.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Buckets-ByacGkU1.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Buckets-ByacGkU1.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Channels-BoIuTtam.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Channels-BoIuTtam.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/ChevronRight-CtQH1EQ1.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/ChevronRight-CtQH1EQ1.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/CodeViewer-Bqy7-wvH.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/CodeViewer-Bqy7-wvH.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Crons-B67vc39F.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Crons-B67vc39F.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DataTable-COAAWEft.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DataTable-COAAWEft.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DrawerContent-TpYTFgF1.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DrawerContent-TpYTFgF1.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Empty-cr2r7e2u.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Empty-cr2r7e2u.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/EmptyState-DeDck-OL.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/EmptyState-DeDck-OL.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Grid-hFkp9F4P.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Grid-hFkp9F4P.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Input-DppYTq9C.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Input-DppYTq9C.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Invoke-DW3Nveeh.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Invoke-DW3Nveeh.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/JsonField-DibyJgun.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/JsonField-DibyJgun.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/LoginView-BjLyE3Ds.css +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/LoginView-CoOjECT_.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/LoginView-CoOjECT_.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Logs-D9WYrnIT.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Logs-D9WYrnIT.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Logs-DS1XPa0h.css +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Migrations-DOSC2ddQ.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Migrations-DOSC2ddQ.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Queue-CywZs6vI.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Queue-CywZs6vI.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/RlsEditor-BSlH9vSc.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/RlsEditor-BSlH9vSc.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Routes-BiLXE49D.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Routes-BiLXE49D.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Routes-C-ianIGD.css +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SchemaBrowser-DKy2_KQi.css +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SchemaBrowser-XFvFbtDB.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SchemaBrowser-XFvFbtDB.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Select-DIzZyRZb.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Select-DIzZyRZb.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Space-n5-XcguU.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Space-n5-XcguU.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SqlEditor-b8pTsILY.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SqlEditor-b8pTsILY.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SqlWorkspace-BUS7IntH.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SqlWorkspace-BUS7IntH.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/TableData-CQIagLKn.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/TableData-CQIagLKn.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Tag-D1fOKpTH.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Tag-D1fOKpTH.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Templates-BS-ugkdq.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Templates-BS-ugkdq.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Thing-CEAniuMg.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Thing-CEAniuMg.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Users-wzwajhlh.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Users-wzwajhlh.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/_plugin-vue_export-helper-DGA9ry_j.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/dist-VXIJLCYq.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/dist-VXIJLCYq.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/format-length-CGCY1rMh.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/format-length-CGCY1rMh.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/get-Ca6unauB.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/get-Ca6unauB.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/index-CeE6v959.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/index-CeE6v959.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/pinia-COXwfrOX.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/pinia-COXwfrOX.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/resources-Bt6thQCD.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/resources-Bt6thQCD.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/use-locale-mtgM0a3a.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/use-locale-mtgM0a3a.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useConfirm-tMjvBFXR.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useConfirm-tMjvBFXR.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useResource-C_rJCY8C.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useResource-C_rJCY8C.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useTable-CnZc5zhi.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useTable-CnZc5zhi.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useTable-Dg0XlRlq.css +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useToast-DsZKx0IX.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useToast-DsZKx0IX.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/utils-sbXoq7Ir.js +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/utils-sbXoq7Ir.js.map +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/favicon.svg +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/icons.svg +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/index.html +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/app.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/auth/__init__.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/auth/_email_job.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/auth/claims.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/auth/deps.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/auth/providers/__init__.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/auth/providers/github.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/auth/providers/google.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/auth/providers/oauth.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/auth/providers/registry.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/auth/ratelimit.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/auth/router.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/auth/schemas.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/auth/service.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/backups/__init__.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/backups/_backup_job.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/backups/schemas.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/backups/service.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/body_size.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/cli.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/client/__init__.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/client/_auth.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/client/_client.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/client/_config.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/client/_functions.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/client/_storage.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/client/py.typed +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/db.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/db_admin.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/extensions.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/functions/__init__.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/functions/context.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/functions/loader.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/functions/router.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/functions/schemas.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/gen/__init__.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/gen/_introspect.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/gen/types_py.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/gen/types_ts.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/health.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/hooks.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/__init__.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/backends.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/context.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/cron.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/cron_inproc.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/decorators.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/registry.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/router.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/schemas.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/service.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/jobs/worker.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/jwks.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/keyset.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/mail.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/mailer.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/migrate.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0001_extensions_and_roles.sql +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0002_auth_schema.sql +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0004_auth_v0_2.sql +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0005_storage_schema.sql +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0006_realtime_schema.sql +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0007_jobs_schema.sql +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0008_jobs_last_error.sql +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0009_auth_rate_limits.sql +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0010_worker_heartbeat.sql +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0011_admin_schema.sql +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0012_auth_banned_until.sql +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0013_email_templates.sql +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0014_realtime_payload_warning.sql +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/migrations/0015_backups_schema.sql +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/passwords.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/realtime/__init__.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/realtime/broker.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/realtime/protocol.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/realtime/router.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/realtime/schemas.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/realtime/service.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/realtime/topics.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/realtime/websocket.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/__init__.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/init_project.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/Caddyfile.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/README.md.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/apps_hooks_welcome.py.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/apps_jobs_example.py.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/asgi.py.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/docker-compose.prod.yml.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/docker-compose.yml.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/docker_postgres_Dockerfile.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/docker_postgres_postgresql.conf.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/env.example.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/functions_README.md.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/gitignore.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/manage.py.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/package_hooks_init.py.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/package_init.py.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/package_jobs_init.py.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/pyproject.toml.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/settings.py.tmpl +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/static/0001_create_todos.sql +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/scaffold/templates/static/functions_hello.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/secretset.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/security_headers.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/settings.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/settings_module.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/storage/__init__.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/storage/backends.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/storage/router.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/storage/schemas.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/storage/service.py +0 -0
- {supython-0.1.11 → supython-0.1.12}/src/supython/storage/signing.py +0 -0
- {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
|
|
@@ -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
|
|
200
|
+
async def _receive() -> dict[str, Any]:
|
|
187
201
|
nonlocal body_size, body_truncated
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Backups-DzPlFgrm.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Buckets-ByacGkU1.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Channels-BoIuTtam.js.map
RENAMED
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/ChevronRight-CtQH1EQ1.js
RENAMED
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/ChevronRight-CtQH1EQ1.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/CodeViewer-Bqy7-wvH.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js
RENAMED
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DataTable-COAAWEft.js.map
RENAMED
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DrawerContent-TpYTFgF1.js
RENAMED
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/DrawerContent-TpYTFgF1.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/EmptyState-DeDck-OL.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/JsonField-DibyJgun.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/LoginView-CoOjECT_.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Migrations-DOSC2ddQ.js.map
RENAMED
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js
RENAMED
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js
RENAMED
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/RlsEditor-BSlH9vSc.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SchemaBrowser-DKy2_KQi.css
RENAMED
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SchemaBrowser-XFvFbtDB.js
RENAMED
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SchemaBrowser-XFvFbtDB.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SqlEditor-b8pTsILY.js.map
RENAMED
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SqlWorkspace-BUS7IntH.js
RENAMED
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/SqlWorkspace-BUS7IntH.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/TableData-CQIagLKn.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/Templates-BS-ugkdq.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/format-length-CGCY1rMh.js
RENAMED
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/format-length-CGCY1rMh.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/resources-Bt6thQCD.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/use-locale-mtgM0a3a.js.map
RENAMED
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useConfirm-tMjvBFXR.js.map
RENAMED
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useResource-C_rJCY8C.js
RENAMED
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useResource-C_rJCY8C.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useTable-CnZc5zhi.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.11 → supython-0.1.12}/src/supython/admin/static/assets/useToast-DsZKx0IX.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|