supython 0.1.6__tar.gz → 0.1.7__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.6 → supython-0.1.7}/PKG-INFO +21 -1
- {supython-0.1.6 → supython-0.1.7}/README.md +20 -0
- {supython-0.1.6 → supython-0.1.7}/pyproject.toml +1 -1
- {supython-0.1.6 → supython-0.1.7}/src/supython/functions/context.py +28 -6
- {supython-0.1.6 → supython-0.1.7}/.gitignore +0 -0
- {supython-0.1.6 → supython-0.1.7}/CHANGELOG.md +0 -0
- {supython-0.1.6 → supython-0.1.7}/LICENSE +0 -0
- {supython-0.1.6 → supython-0.1.7}/SECURITY.md +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/__init__.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/__init__.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/__init__.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/auth.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/auth_templates.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/auth_users.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/db.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/functions.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/jobs.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/ops.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/realtime.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/service_auth.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/service_auth_templates.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/service_auth_users.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/service_db.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/service_functions.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/service_jobs.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/service_ops.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/service_realtime.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/service_storage.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/storage.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/api/system.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/audit.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/deps.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/errors.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/schemas.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/session.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/spa.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Alert-dluGVkos.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Alert-dluGVkos.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Audit-Njung3HI.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Audit-Njung3HI.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Backups-DzPlFgrm.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Backups-DzPlFgrm.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Buckets-ByacGkU1.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Buckets-ByacGkU1.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Channels-BoIuTtam.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Channels-BoIuTtam.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/ChevronRight-CtQH1EQ1.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/ChevronRight-CtQH1EQ1.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/CodeViewer-Bqy7-wvH.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/CodeViewer-Bqy7-wvH.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Crons-B67vc39F.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Crons-B67vc39F.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/DataTable-COAAWEft.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/DataTable-COAAWEft.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/DrawerContent-TpYTFgF1.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/DrawerContent-TpYTFgF1.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Empty-cr2r7e2u.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Empty-cr2r7e2u.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/EmptyState-DeDck-OL.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/EmptyState-DeDck-OL.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Grid-hFkp9F4P.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Grid-hFkp9F4P.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Input-DppYTq9C.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Input-DppYTq9C.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Invoke-DW3Nveeh.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Invoke-DW3Nveeh.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/JsonField-DibyJgun.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/JsonField-DibyJgun.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/LoginView-BjLyE3Ds.css +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/LoginView-CoOjECT_.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/LoginView-CoOjECT_.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Logs-D9WYrnIT.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Logs-D9WYrnIT.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Logs-DS1XPa0h.css +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Migrations-DOSC2ddQ.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Migrations-DOSC2ddQ.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Queue-CywZs6vI.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Queue-CywZs6vI.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/RlsEditor-BSlH9vSc.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/RlsEditor-BSlH9vSc.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Routes-BiLXE49D.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Routes-BiLXE49D.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Routes-C-ianIGD.css +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/SchemaBrowser-DKy2_KQi.css +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/SchemaBrowser-XFvFbtDB.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/SchemaBrowser-XFvFbtDB.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Select-DIzZyRZb.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Select-DIzZyRZb.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Space-n5-XcguU.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Space-n5-XcguU.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/SqlEditor-b8pTsILY.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/SqlEditor-b8pTsILY.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/SqlWorkspace-BUS7IntH.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/SqlWorkspace-BUS7IntH.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/TableData-CQIagLKn.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/TableData-CQIagLKn.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Tag-D1fOKpTH.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Tag-D1fOKpTH.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Templates-BS-ugkdq.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Templates-BS-ugkdq.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Thing-CEAniuMg.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Thing-CEAniuMg.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Users-wzwajhlh.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/Users-wzwajhlh.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/_plugin-vue_export-helper-DGA9ry_j.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/dist-VXIJLCYq.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/dist-VXIJLCYq.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/format-length-CGCY1rMh.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/format-length-CGCY1rMh.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/get-Ca6unauB.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/get-Ca6unauB.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/index-CeE6v959.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/index-CeE6v959.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/pinia-COXwfrOX.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/pinia-COXwfrOX.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/resources-Bt6thQCD.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/resources-Bt6thQCD.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/use-locale-mtgM0a3a.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/use-locale-mtgM0a3a.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/useConfirm-tMjvBFXR.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/useConfirm-tMjvBFXR.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/useResource-C_rJCY8C.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/useResource-C_rJCY8C.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/useTable-CnZc5zhi.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/useTable-CnZc5zhi.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/useTable-Dg0XlRlq.css +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/useToast-DsZKx0IX.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/useToast-DsZKx0IX.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/utils-sbXoq7Ir.js +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/utils-sbXoq7Ir.js.map +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/favicon.svg +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/icons.svg +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/index.html +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/app.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/auth/__init__.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/auth/_email_job.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/auth/claims.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/auth/deps.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/auth/providers/__init__.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/auth/providers/github.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/auth/providers/google.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/auth/providers/oauth.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/auth/providers/registry.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/auth/ratelimit.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/auth/router.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/auth/schemas.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/auth/service.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/backups/__init__.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/backups/_backup_job.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/backups/schemas.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/backups/service.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/body_size.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/cli.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/client/__init__.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/client/_auth.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/client/_client.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/client/_config.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/client/_functions.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/client/_storage.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/client/py.typed +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/db.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/db_admin.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/extensions.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/functions/__init__.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/functions/loader.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/functions/router.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/functions/schemas.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/gen/__init__.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/gen/_introspect.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/gen/types_py.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/gen/types_ts.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/health.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/hooks.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/jobs/__init__.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/jobs/backends.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/jobs/context.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/jobs/cron.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/jobs/cron_inproc.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/jobs/decorators.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/jobs/registry.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/jobs/router.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/jobs/schemas.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/jobs/service.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/jobs/worker.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/jwks.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/keyset.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/logging_config.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/mail.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/mailer.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/migrate.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/migrations/0001_extensions_and_roles.sql +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/migrations/0002_auth_schema.sql +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/migrations/0003_demo_todos.sql +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/migrations/0004_auth_v0_2.sql +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/migrations/0005_storage_schema.sql +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/migrations/0006_realtime_schema.sql +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/migrations/0007_jobs_schema.sql +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/migrations/0008_jobs_last_error.sql +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/migrations/0009_auth_rate_limits.sql +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/migrations/0010_worker_heartbeat.sql +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/migrations/0011_admin_schema.sql +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/migrations/0012_auth_banned_until.sql +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/migrations/0013_email_templates.sql +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/migrations/0014_realtime_payload_warning.sql +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/migrations/0015_backups_schema.sql +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/passwords.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/realtime/__init__.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/realtime/broker.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/realtime/protocol.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/realtime/router.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/realtime/schemas.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/realtime/service.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/realtime/topics.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/realtime/websocket.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/__init__.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/init_project.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/templates/Caddyfile.tmpl +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/templates/README.md.tmpl +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/templates/apps_hooks.py.tmpl +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/templates/apps_jobs.py.tmpl +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/templates/asgi.py.tmpl +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/templates/docker-compose.prod.yml.tmpl +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/templates/docker-compose.yml.tmpl +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/templates/docker_postgres_Dockerfile.tmpl +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/templates/docker_postgres_postgresql.conf.tmpl +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/templates/env.example.tmpl +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/templates/functions_README.md.tmpl +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/templates/gitignore.tmpl +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/templates/manage.py.tmpl +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/templates/migrations/.gitkeep +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/templates/package_init.py.tmpl +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/scaffold/templates/settings.py.tmpl +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/secretset.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/security_headers.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/settings.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/settings_module.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/storage/__init__.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/storage/backends.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/storage/router.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/storage/schemas.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/storage/service.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/storage/signing.py +0 -0
- {supython-0.1.6 → supython-0.1.7}/src/supython/tokens.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: supython
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.7
|
|
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
|
|
@@ -418,6 +418,24 @@ SMTP_PASSWORD`.
|
|
|
418
418
|
**OAuth** — add `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` (and/or GitHub
|
|
419
419
|
equivalents) to `.env`. Providers without credentials are silently disabled.
|
|
420
420
|
|
|
421
|
+
**Logout semantics (stateless JWT)** — `/auth/v1/logout` revokes the
|
|
422
|
+
**refresh** token; the access token remains valid until its `exp` claim. This
|
|
423
|
+
is the standard stateless-JWT posture (same as Supabase Auth, Auth0, Cognito):
|
|
424
|
+
both supython and PostgREST verify access tokens from the JWKS with **no
|
|
425
|
+
per-request DB lookup**, so there is no place to consult a server-side
|
|
426
|
+
denylist without breaking that contract. The mitigation is a **short
|
|
427
|
+
`ACCESS_TOKEN_TTL`** plus refresh-token revocation:
|
|
428
|
+
|
|
429
|
+
- Clients must drop *both* tokens locally on logout — the access token must
|
|
430
|
+
not be reused after the user signs out.
|
|
431
|
+
- A stolen access token cannot be invalidated server-side mid-flight; it
|
|
432
|
+
stops being useful at `exp`. Pick a TTL that bounds your exposure.
|
|
433
|
+
- Default `ACCESS_TOKEN_TTL=3600` (1 hour) is fine for development. For
|
|
434
|
+
production, set it to **300–900 seconds** so logout / role changes
|
|
435
|
+
propagate in minutes rather than an hour. Refresh tokens are still
|
|
436
|
+
long-lived (`REFRESH_TOKEN_TTL=30d`) so users don't get prompted to log
|
|
437
|
+
in every few minutes — clients refresh transparently.
|
|
438
|
+
|
|
421
439
|
### Custom JWT claims [shipped v0.1.3]
|
|
422
440
|
|
|
423
441
|
Register a claims provider to inject application-specific claims into every
|
|
@@ -490,6 +508,8 @@ need any claim beyond the user UUID.
|
|
|
490
508
|
|
|
491
509
|
| Variable | Default | Purpose |
|
|
492
510
|
|---|---|---|
|
|
511
|
+
| `ACCESS_TOKEN_TTL` | `3600` | Access-token lifetime in seconds. Lower this (300–900) in production so logout / role changes propagate quickly — the access token is stateless and only stops working at `exp` |
|
|
512
|
+
| `REFRESH_TOKEN_TTL` | `2592000` | Refresh-token lifetime in seconds (30 d). Refresh tokens *are* revocable via `/auth/v1/logout` |
|
|
493
513
|
| `DB_STATEMENT_TIMEOUT_MS` | `30000` | Per-connection query timeout for the asyncpg pool (`0` disables) |
|
|
494
514
|
| `DB_POOL_MIN_SIZE` | `1` | Minimum asyncpg pool size |
|
|
495
515
|
| `DB_POOL_MAX_SIZE` | `10` | Maximum asyncpg pool size |
|
|
@@ -360,6 +360,24 @@ SMTP_PASSWORD`.
|
|
|
360
360
|
**OAuth** — add `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` (and/or GitHub
|
|
361
361
|
equivalents) to `.env`. Providers without credentials are silently disabled.
|
|
362
362
|
|
|
363
|
+
**Logout semantics (stateless JWT)** — `/auth/v1/logout` revokes the
|
|
364
|
+
**refresh** token; the access token remains valid until its `exp` claim. This
|
|
365
|
+
is the standard stateless-JWT posture (same as Supabase Auth, Auth0, Cognito):
|
|
366
|
+
both supython and PostgREST verify access tokens from the JWKS with **no
|
|
367
|
+
per-request DB lookup**, so there is no place to consult a server-side
|
|
368
|
+
denylist without breaking that contract. The mitigation is a **short
|
|
369
|
+
`ACCESS_TOKEN_TTL`** plus refresh-token revocation:
|
|
370
|
+
|
|
371
|
+
- Clients must drop *both* tokens locally on logout — the access token must
|
|
372
|
+
not be reused after the user signs out.
|
|
373
|
+
- A stolen access token cannot be invalidated server-side mid-flight; it
|
|
374
|
+
stops being useful at `exp`. Pick a TTL that bounds your exposure.
|
|
375
|
+
- Default `ACCESS_TOKEN_TTL=3600` (1 hour) is fine for development. For
|
|
376
|
+
production, set it to **300–900 seconds** so logout / role changes
|
|
377
|
+
propagate in minutes rather than an hour. Refresh tokens are still
|
|
378
|
+
long-lived (`REFRESH_TOKEN_TTL=30d`) so users don't get prompted to log
|
|
379
|
+
in every few minutes — clients refresh transparently.
|
|
380
|
+
|
|
363
381
|
### Custom JWT claims [shipped v0.1.3]
|
|
364
382
|
|
|
365
383
|
Register a claims provider to inject application-specific claims into every
|
|
@@ -432,6 +450,8 @@ need any claim beyond the user UUID.
|
|
|
432
450
|
|
|
433
451
|
| Variable | Default | Purpose |
|
|
434
452
|
|---|---|---|
|
|
453
|
+
| `ACCESS_TOKEN_TTL` | `3600` | Access-token lifetime in seconds. Lower this (300–900) in production so logout / role changes propagate quickly — the access token is stateless and only stops working at `exp` |
|
|
454
|
+
| `REFRESH_TOKEN_TTL` | `2592000` | Refresh-token lifetime in seconds (30 d). Refresh tokens *are* revocable via `/auth/v1/logout` |
|
|
435
455
|
| `DB_STATEMENT_TIMEOUT_MS` | `30000` | Per-connection query timeout for the asyncpg pool (`0` disables) |
|
|
436
456
|
| `DB_POOL_MIN_SIZE` | `1` | Minimum asyncpg pool size |
|
|
437
457
|
| `DB_POOL_MAX_SIZE` | `10` | Maximum asyncpg pool size |
|
|
@@ -11,6 +11,7 @@ rule that applies elsewhere.
|
|
|
11
11
|
from __future__ import annotations
|
|
12
12
|
|
|
13
13
|
from collections.abc import AsyncIterator, Awaitable, Callable
|
|
14
|
+
from contextlib import AbstractAsyncContextManager
|
|
14
15
|
from dataclasses import dataclass, field
|
|
15
16
|
from typing import TYPE_CHECKING, Any
|
|
16
17
|
from uuid import UUID
|
|
@@ -18,6 +19,7 @@ from uuid import UUID
|
|
|
18
19
|
import asyncpg
|
|
19
20
|
import httpx
|
|
20
21
|
|
|
22
|
+
from .. import db as _db
|
|
21
23
|
from ..mailer import EmailBackend, EmailMessage, get_mailer
|
|
22
24
|
from ..settings import Settings, get_settings
|
|
23
25
|
from ..storage import service as storage_service
|
|
@@ -73,9 +75,7 @@ class StorageClient:
|
|
|
73
75
|
``backend`` by hand.
|
|
74
76
|
"""
|
|
75
77
|
|
|
76
|
-
def __init__(
|
|
77
|
-
self, conn: asyncpg.Connection, backend: StorageBackend
|
|
78
|
-
) -> None:
|
|
78
|
+
def __init__(self, conn: asyncpg.Connection, backend: StorageBackend) -> None:
|
|
79
79
|
self._conn = conn
|
|
80
80
|
self._backend = backend
|
|
81
81
|
|
|
@@ -120,9 +120,7 @@ class StorageClient:
|
|
|
120
120
|
)
|
|
121
121
|
|
|
122
122
|
async def get_metadata(self, *, bucket: str, path: str) -> ObjectResponse:
|
|
123
|
-
return await storage_service.get_object_metadata(
|
|
124
|
-
self._conn, bucket, path
|
|
125
|
-
)
|
|
123
|
+
return await storage_service.get_object_metadata(self._conn, bucket, path)
|
|
126
124
|
|
|
127
125
|
async def sign(
|
|
128
126
|
self, *, bucket: str, path: str, expires_in: int | None = None
|
|
@@ -234,6 +232,30 @@ class Ctx:
|
|
|
234
232
|
request: Request
|
|
235
233
|
settings: Settings
|
|
236
234
|
|
|
235
|
+
def service_db(
|
|
236
|
+
self,
|
|
237
|
+
*,
|
|
238
|
+
with_user_claims: bool = True,
|
|
239
|
+
) -> AbstractAsyncContextManager[asyncpg.Connection]:
|
|
240
|
+
"""Yield a ``service_role`` connection for housekeeping inside a handler.
|
|
241
|
+
|
|
242
|
+
Convenience wrapper around :func:`supython.db.as_service_role` so user
|
|
243
|
+
code can write::
|
|
244
|
+
|
|
245
|
+
async with ctx.service_db() as conn:
|
|
246
|
+
await conn.execute("insert into audit.events ...")
|
|
247
|
+
|
|
248
|
+
instead of importing ``supython.db``. ``service_role`` bypasses RLS;
|
|
249
|
+
when the caller is authenticated the user's JWT claims are forwarded
|
|
250
|
+
to the session so helpers like ``auth.uid()`` still return the
|
|
251
|
+
caller's id inside the block. Pass ``with_user_claims=False`` to
|
|
252
|
+
suppress that and run truly impersonal admin work.
|
|
253
|
+
"""
|
|
254
|
+
claims = (
|
|
255
|
+
self.user.claims if (with_user_claims and self.user is not None) else None
|
|
256
|
+
)
|
|
257
|
+
return _db.as_service_role(claims=claims)
|
|
258
|
+
|
|
237
259
|
|
|
238
260
|
def build_ctx(
|
|
239
261
|
*,
|
|
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
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/ChevronRight-CtQH1EQ1.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/CodeViewer-Bqy7-wvH.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js
RENAMED
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/DataTable-COAAWEft.js.map
RENAMED
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js
RENAMED
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js.map
RENAMED
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/DrawerContent-TpYTFgF1.js
RENAMED
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/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.6 → supython-0.1.7}/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.6 → supython-0.1.7}/src/supython/admin/static/assets/JsonField-DibyJgun.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/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.6 → supython-0.1.7}/src/supython/admin/static/assets/Migrations-DOSC2ddQ.js.map
RENAMED
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js
RENAMED
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js
RENAMED
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/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.6 → supython-0.1.7}/src/supython/admin/static/assets/SchemaBrowser-DKy2_KQi.css
RENAMED
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/SchemaBrowser-XFvFbtDB.js
RENAMED
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/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.6 → supython-0.1.7}/src/supython/admin/static/assets/SqlEditor-b8pTsILY.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/SqlWorkspace-BUS7IntH.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/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.6 → supython-0.1.7}/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.6 → supython-0.1.7}/src/supython/admin/static/assets/format-length-CGCY1rMh.js
RENAMED
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/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.6 → supython-0.1.7}/src/supython/admin/static/assets/resources-Bt6thQCD.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/use-locale-mtgM0a3a.js.map
RENAMED
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js
RENAMED
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/useConfirm-tMjvBFXR.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.6 → supython-0.1.7}/src/supython/admin/static/assets/useResource-C_rJCY8C.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
|