supython 0.1.3__tar.gz → 0.1.4__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.3 → supython-0.1.4}/PKG-INFO +35 -3
- {supython-0.1.3 → supython-0.1.4}/README.md +34 -2
- {supython-0.1.3 → supython-0.1.4}/pyproject.toml +1 -1
- supython-0.1.4/src/supython/auth/__init__.py +4 -0
- supython-0.1.4/src/supython/auth/deps.py +57 -0
- supython-0.1.3/src/supython/auth/__init__.py +0 -3
- {supython-0.1.3 → supython-0.1.4}/.gitignore +0 -0
- {supython-0.1.3 → supython-0.1.4}/CHANGELOG.md +0 -0
- {supython-0.1.3 → supython-0.1.4}/LICENSE +0 -0
- {supython-0.1.3 → supython-0.1.4}/SECURITY.md +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/__init__.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/__init__.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/__init__.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/auth.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/auth_templates.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/auth_users.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/db.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/functions.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/jobs.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/ops.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/realtime.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/service_auth.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/service_auth_templates.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/service_auth_users.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/service_db.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/service_functions.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/service_jobs.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/service_ops.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/service_realtime.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/service_storage.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/storage.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/api/system.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/audit.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/deps.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/errors.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/schemas.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/session.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/spa.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Alert-dluGVkos.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Alert-dluGVkos.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Audit-Njung3HI.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Audit-Njung3HI.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Backups-DzPlFgrm.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Backups-DzPlFgrm.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Buckets-ByacGkU1.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Buckets-ByacGkU1.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Channels-BoIuTtam.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Channels-BoIuTtam.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/ChevronRight-CtQH1EQ1.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/ChevronRight-CtQH1EQ1.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/CodeViewer-Bqy7-wvH.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/CodeViewer-Bqy7-wvH.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Crons-B67vc39F.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Crons-B67vc39F.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/DataTable-COAAWEft.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/DataTable-COAAWEft.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/DrawerContent-TpYTFgF1.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/DrawerContent-TpYTFgF1.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Empty-cr2r7e2u.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Empty-cr2r7e2u.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/EmptyState-DeDck-OL.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/EmptyState-DeDck-OL.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Grid-hFkp9F4P.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Grid-hFkp9F4P.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Input-DppYTq9C.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Input-DppYTq9C.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Invoke-DW3Nveeh.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Invoke-DW3Nveeh.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/JsonField-DibyJgun.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/JsonField-DibyJgun.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/LoginView-BjLyE3Ds.css +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/LoginView-CoOjECT_.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/LoginView-CoOjECT_.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Logs-D9WYrnIT.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Logs-D9WYrnIT.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Logs-DS1XPa0h.css +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Migrations-DOSC2ddQ.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Migrations-DOSC2ddQ.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Queue-CywZs6vI.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Queue-CywZs6vI.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/RlsEditor-BSlH9vSc.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/RlsEditor-BSlH9vSc.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Routes-BiLXE49D.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Routes-BiLXE49D.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Routes-C-ianIGD.css +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/SchemaBrowser-DKy2_KQi.css +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/SchemaBrowser-XFvFbtDB.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/SchemaBrowser-XFvFbtDB.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Select-DIzZyRZb.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Select-DIzZyRZb.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Space-n5-XcguU.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Space-n5-XcguU.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/SqlEditor-b8pTsILY.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/SqlEditor-b8pTsILY.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/SqlWorkspace-BUS7IntH.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/SqlWorkspace-BUS7IntH.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/TableData-CQIagLKn.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/TableData-CQIagLKn.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Tag-D1fOKpTH.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Tag-D1fOKpTH.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Templates-BS-ugkdq.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Templates-BS-ugkdq.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Thing-CEAniuMg.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Thing-CEAniuMg.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Users-wzwajhlh.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/Users-wzwajhlh.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/_plugin-vue_export-helper-DGA9ry_j.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/dist-VXIJLCYq.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/dist-VXIJLCYq.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/format-length-CGCY1rMh.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/format-length-CGCY1rMh.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/get-Ca6unauB.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/get-Ca6unauB.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/index-CeE6v959.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/index-CeE6v959.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/pinia-COXwfrOX.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/pinia-COXwfrOX.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/resources-Bt6thQCD.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/resources-Bt6thQCD.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/use-locale-mtgM0a3a.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/use-locale-mtgM0a3a.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/useConfirm-tMjvBFXR.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/useConfirm-tMjvBFXR.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/useResource-C_rJCY8C.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/useResource-C_rJCY8C.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/useTable-CnZc5zhi.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/useTable-CnZc5zhi.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/useTable-Dg0XlRlq.css +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/useToast-DsZKx0IX.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/useToast-DsZKx0IX.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/utils-sbXoq7Ir.js +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/utils-sbXoq7Ir.js.map +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/favicon.svg +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/icons.svg +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/index.html +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/app.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/auth/_email_job.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/auth/claims.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/auth/providers/__init__.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/auth/providers/github.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/auth/providers/google.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/auth/providers/oauth.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/auth/providers/registry.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/auth/ratelimit.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/auth/router.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/auth/schemas.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/auth/service.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/backups/__init__.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/backups/_backup_job.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/backups/schemas.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/backups/service.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/body_size.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/cli.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/client/__init__.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/client/_auth.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/client/_client.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/client/_config.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/client/_functions.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/client/_storage.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/client/py.typed +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/db.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/db_admin.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/extensions.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/functions/__init__.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/functions/context.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/functions/loader.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/functions/router.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/functions/schemas.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/gen/__init__.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/gen/_introspect.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/gen/types_py.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/gen/types_ts.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/health.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/hooks.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/jobs/__init__.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/jobs/backends.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/jobs/context.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/jobs/cron.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/jobs/cron_inproc.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/jobs/decorators.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/jobs/registry.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/jobs/router.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/jobs/schemas.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/jobs/service.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/jobs/worker.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/jwks.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/keyset.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/logging_config.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/mail.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/mailer.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/migrate.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/migrations/0001_extensions_and_roles.sql +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/migrations/0002_auth_schema.sql +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/migrations/0003_demo_todos.sql +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/migrations/0004_auth_v0_2.sql +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/migrations/0005_storage_schema.sql +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/migrations/0006_realtime_schema.sql +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/migrations/0007_jobs_schema.sql +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/migrations/0008_jobs_last_error.sql +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/migrations/0009_auth_rate_limits.sql +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/migrations/0010_worker_heartbeat.sql +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/migrations/0011_admin_schema.sql +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/migrations/0012_auth_banned_until.sql +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/migrations/0013_email_templates.sql +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/migrations/0014_realtime_payload_warning.sql +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/migrations/0015_backups_schema.sql +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/passwords.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/realtime/__init__.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/realtime/broker.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/realtime/protocol.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/realtime/router.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/realtime/schemas.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/realtime/service.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/realtime/topics.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/realtime/websocket.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/__init__.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/init_project.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/templates/Caddyfile.tmpl +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/templates/README.md.tmpl +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/templates/apps_hooks.py.tmpl +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/templates/apps_jobs.py.tmpl +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/templates/asgi.py.tmpl +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/templates/docker-compose.prod.yml.tmpl +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/templates/docker-compose.yml.tmpl +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/templates/docker_postgres_Dockerfile.tmpl +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/templates/docker_postgres_postgresql.conf.tmpl +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/templates/env.example.tmpl +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/templates/functions_README.md.tmpl +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/templates/gitignore.tmpl +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/templates/manage.py.tmpl +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/templates/migrations/.gitkeep +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/templates/package_init.py.tmpl +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/scaffold/templates/settings.py.tmpl +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/secretset.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/security_headers.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/settings.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/settings_module.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/storage/__init__.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/storage/backends.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/storage/router.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/storage/schemas.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/storage/service.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/src/supython/storage/signing.py +0 -0
- {supython-0.1.3 → supython-0.1.4}/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.4
|
|
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
|
|
@@ -58,7 +58,7 @@ Description-Content-Type: text/markdown
|
|
|
58
58
|
|
|
59
59
|
# supython
|
|
60
60
|
|
|
61
|
-
> A lightweight, Postgres-first BaaS framework for Python. **v0.1.
|
|
61
|
+
> A lightweight, Postgres-first BaaS framework for Python. **v0.1.4 release**
|
|
62
62
|
|
|
63
63
|
**the database owns the schema, Python owns the things SQL is bad at**.
|
|
64
64
|
It leans on [PostgREST](https://postgrest.org)
|
|
@@ -418,7 +418,7 @@ 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
|
-
### Custom JWT claims
|
|
421
|
+
### Custom JWT claims [shipped v0.1.3]
|
|
422
422
|
|
|
423
423
|
Register a `claims_provider` to inject application-specific claims into every
|
|
424
424
|
access token minted by the auth endpoints. Each provider is an async callable
|
|
@@ -449,6 +449,38 @@ Notes:
|
|
|
449
449
|
- Refresh re-collects claims, so a token rotated via `/auth/v1/refresh`
|
|
450
450
|
reflects current state.
|
|
451
451
|
|
|
452
|
+
### Reading the caller in your routes [shipped v0.1.4]
|
|
453
|
+
|
|
454
|
+
Application code mounts its own routers alongside supython's. To gate an
|
|
455
|
+
endpoint on a valid bearer token — or to read custom claims out of it —
|
|
456
|
+
use the public dependencies re-exported from `supython.auth`:
|
|
457
|
+
|
|
458
|
+
```python
|
|
459
|
+
from typing import Annotated
|
|
460
|
+
from uuid import UUID
|
|
461
|
+
|
|
462
|
+
from fastapi import APIRouter, Depends
|
|
463
|
+
from supython.auth import current_claims, current_user_id
|
|
464
|
+
|
|
465
|
+
router = APIRouter(prefix="/api/v1")
|
|
466
|
+
|
|
467
|
+
|
|
468
|
+
@router.get("/me")
|
|
469
|
+
async def me(user_id: Annotated[UUID, Depends(current_user_id)]) -> dict:
|
|
470
|
+
return {"user_id": str(user_id)}
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
@router.get("/whoami")
|
|
474
|
+
async def whoami(claims: Annotated[dict, Depends(current_claims)]) -> dict:
|
|
475
|
+
# Read whatever your `claims_provider` injected — e.g. org_id.
|
|
476
|
+
return {"user_id": claims["sub"], "org_id": claims.get("org_id")}
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
Both dependencies raise `401 Unauthorized` when the `Authorization` header
|
|
480
|
+
is missing, malformed, or carries an invalid/expired token. `current_user_id`
|
|
481
|
+
is a thin convenience over `current_claims` — pick the dict version when you
|
|
482
|
+
need any claim beyond the user UUID.
|
|
483
|
+
|
|
452
484
|
### Auth hardening settings (`.env`)
|
|
453
485
|
|
|
454
486
|
| Variable | Default | Purpose |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# supython
|
|
2
2
|
|
|
3
|
-
> A lightweight, Postgres-first BaaS framework for Python. **v0.1.
|
|
3
|
+
> A lightweight, Postgres-first BaaS framework for Python. **v0.1.4 release**
|
|
4
4
|
|
|
5
5
|
**the database owns the schema, Python owns the things SQL is bad at**.
|
|
6
6
|
It leans on [PostgREST](https://postgrest.org)
|
|
@@ -360,7 +360,7 @@ 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
|
-
### Custom JWT claims
|
|
363
|
+
### Custom JWT claims [shipped v0.1.3]
|
|
364
364
|
|
|
365
365
|
Register a `claims_provider` to inject application-specific claims into every
|
|
366
366
|
access token minted by the auth endpoints. Each provider is an async callable
|
|
@@ -391,6 +391,38 @@ Notes:
|
|
|
391
391
|
- Refresh re-collects claims, so a token rotated via `/auth/v1/refresh`
|
|
392
392
|
reflects current state.
|
|
393
393
|
|
|
394
|
+
### Reading the caller in your routes [shipped v0.1.4]
|
|
395
|
+
|
|
396
|
+
Application code mounts its own routers alongside supython's. To gate an
|
|
397
|
+
endpoint on a valid bearer token — or to read custom claims out of it —
|
|
398
|
+
use the public dependencies re-exported from `supython.auth`:
|
|
399
|
+
|
|
400
|
+
```python
|
|
401
|
+
from typing import Annotated
|
|
402
|
+
from uuid import UUID
|
|
403
|
+
|
|
404
|
+
from fastapi import APIRouter, Depends
|
|
405
|
+
from supython.auth import current_claims, current_user_id
|
|
406
|
+
|
|
407
|
+
router = APIRouter(prefix="/api/v1")
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
@router.get("/me")
|
|
411
|
+
async def me(user_id: Annotated[UUID, Depends(current_user_id)]) -> dict:
|
|
412
|
+
return {"user_id": str(user_id)}
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
@router.get("/whoami")
|
|
416
|
+
async def whoami(claims: Annotated[dict, Depends(current_claims)]) -> dict:
|
|
417
|
+
# Read whatever your `claims_provider` injected — e.g. org_id.
|
|
418
|
+
return {"user_id": claims["sub"], "org_id": claims.get("org_id")}
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
Both dependencies raise `401 Unauthorized` when the `Authorization` header
|
|
422
|
+
is missing, malformed, or carries an invalid/expired token. `current_user_id`
|
|
423
|
+
is a thin convenience over `current_claims` — pick the dict version when you
|
|
424
|
+
need any claim beyond the user UUID.
|
|
425
|
+
|
|
394
426
|
### Auth hardening settings (`.env`)
|
|
395
427
|
|
|
396
428
|
| Variable | Default | Purpose |
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Public FastAPI dependencies for downstream apps.
|
|
2
|
+
|
|
3
|
+
These are the supported way for application code to read the authenticated
|
|
4
|
+
caller out of an incoming request — equivalent to the auth router's private
|
|
5
|
+
``_current_user_id`` but stable, re-exported, and documented.
|
|
6
|
+
|
|
7
|
+
Usage::
|
|
8
|
+
|
|
9
|
+
from typing import Annotated
|
|
10
|
+
from uuid import UUID
|
|
11
|
+
|
|
12
|
+
from fastapi import Depends
|
|
13
|
+
from supython.auth import current_user_id, current_claims
|
|
14
|
+
|
|
15
|
+
@router.get("/me")
|
|
16
|
+
async def me(user_id: Annotated[UUID, Depends(current_user_id)]):
|
|
17
|
+
...
|
|
18
|
+
|
|
19
|
+
@router.get("/whoami")
|
|
20
|
+
async def whoami(claims: Annotated[dict, Depends(current_claims)]):
|
|
21
|
+
return {"org_id": claims.get("org_id")}
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from typing import Annotated, Any
|
|
25
|
+
from uuid import UUID
|
|
26
|
+
|
|
27
|
+
import jwt
|
|
28
|
+
from fastapi import Depends, Header, HTTPException, status
|
|
29
|
+
|
|
30
|
+
from .. import tokens
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
async def current_claims(
|
|
34
|
+
authorization: Annotated[str | None, Header()] = None,
|
|
35
|
+
) -> dict[str, Any]:
|
|
36
|
+
"""Return the decoded JWT claims of the bearer token, or 401."""
|
|
37
|
+
if not authorization or not authorization.lower().startswith("bearer "):
|
|
38
|
+
raise HTTPException(status.HTTP_401_UNAUTHORIZED, "Missing bearer token")
|
|
39
|
+
token = authorization.split(" ", 1)[1]
|
|
40
|
+
try:
|
|
41
|
+
return tokens.decode_access_token(token)
|
|
42
|
+
except jwt.PyJWTError as exc:
|
|
43
|
+
raise HTTPException(
|
|
44
|
+
status.HTTP_401_UNAUTHORIZED, f"Invalid token: {exc}"
|
|
45
|
+
) from exc
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
async def current_user_id(
|
|
49
|
+
claims: Annotated[dict[str, Any], Depends(current_claims)],
|
|
50
|
+
) -> UUID:
|
|
51
|
+
"""Return the authenticated user's UUID from the bearer token, or 401."""
|
|
52
|
+
try:
|
|
53
|
+
return UUID(claims["sub"])
|
|
54
|
+
except (KeyError, ValueError) as exc:
|
|
55
|
+
raise HTTPException(
|
|
56
|
+
status.HTTP_401_UNAUTHORIZED, "Token missing valid sub claim"
|
|
57
|
+
) from exc
|
|
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.3 → supython-0.1.4}/src/supython/admin/static/assets/ChevronRight-CtQH1EQ1.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/CodeViewer-Bqy7-wvH.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js
RENAMED
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/DataTable-COAAWEft.js.map
RENAMED
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js
RENAMED
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js.map
RENAMED
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/DrawerContent-TpYTFgF1.js
RENAMED
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/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.3 → supython-0.1.4}/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.3 → supython-0.1.4}/src/supython/admin/static/assets/JsonField-DibyJgun.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/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.3 → supython-0.1.4}/src/supython/admin/static/assets/Migrations-DOSC2ddQ.js.map
RENAMED
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js
RENAMED
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js
RENAMED
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/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.3 → supython-0.1.4}/src/supython/admin/static/assets/SchemaBrowser-DKy2_KQi.css
RENAMED
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/SchemaBrowser-XFvFbtDB.js
RENAMED
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/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.3 → supython-0.1.4}/src/supython/admin/static/assets/SqlEditor-b8pTsILY.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/SqlWorkspace-BUS7IntH.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/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.3 → supython-0.1.4}/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.3 → supython-0.1.4}/src/supython/admin/static/assets/format-length-CGCY1rMh.js
RENAMED
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/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.3 → supython-0.1.4}/src/supython/admin/static/assets/resources-Bt6thQCD.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/use-locale-mtgM0a3a.js.map
RENAMED
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js
RENAMED
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/src/supython/admin/static/assets/useConfirm-tMjvBFXR.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.3 → supython-0.1.4}/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
|