supython 0.1.4__tar.gz → 0.1.6__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.4 → supython-0.1.6}/.gitignore +1 -0
- {supython-0.1.4 → supython-0.1.6}/PKG-INFO +12 -7
- {supython-0.1.4 → supython-0.1.6}/README.md +10 -5
- {supython-0.1.4 → supython-0.1.6}/pyproject.toml +2 -2
- {supython-0.1.4 → supython-0.1.6}/src/supython/app.py +0 -2
- {supython-0.1.4 → supython-0.1.6}/src/supython/auth/claims.py +5 -4
- {supython-0.1.4 → supython-0.1.6}/CHANGELOG.md +0 -0
- {supython-0.1.4 → supython-0.1.6}/LICENSE +0 -0
- {supython-0.1.4 → supython-0.1.6}/SECURITY.md +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/__init__.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/__init__.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/__init__.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/auth.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/auth_templates.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/auth_users.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/db.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/functions.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/jobs.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/ops.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/realtime.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/service_auth.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/service_auth_templates.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/service_auth_users.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/service_db.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/service_functions.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/service_jobs.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/service_ops.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/service_realtime.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/service_storage.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/storage.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/api/system.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/audit.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/deps.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/errors.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/schemas.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/session.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/spa.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Alert-dluGVkos.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Alert-dluGVkos.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Audit-Njung3HI.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Audit-Njung3HI.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Backups-DzPlFgrm.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Backups-DzPlFgrm.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Buckets-ByacGkU1.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Buckets-ByacGkU1.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Channels-BoIuTtam.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Channels-BoIuTtam.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/ChevronRight-CtQH1EQ1.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/ChevronRight-CtQH1EQ1.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/CodeViewer-Bqy7-wvH.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/CodeViewer-Bqy7-wvH.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Crons-B67vc39F.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Crons-B67vc39F.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/DataTable-COAAWEft.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/DataTable-COAAWEft.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/DrawerContent-TpYTFgF1.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/DrawerContent-TpYTFgF1.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Empty-cr2r7e2u.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Empty-cr2r7e2u.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/EmptyState-DeDck-OL.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/EmptyState-DeDck-OL.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Grid-hFkp9F4P.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Grid-hFkp9F4P.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Input-DppYTq9C.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Input-DppYTq9C.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Invoke-DW3Nveeh.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Invoke-DW3Nveeh.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/JsonField-DibyJgun.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/JsonField-DibyJgun.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/LoginView-BjLyE3Ds.css +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/LoginView-CoOjECT_.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/LoginView-CoOjECT_.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Logs-D9WYrnIT.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Logs-D9WYrnIT.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Logs-DS1XPa0h.css +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Migrations-DOSC2ddQ.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Migrations-DOSC2ddQ.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Queue-CywZs6vI.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Queue-CywZs6vI.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/RlsEditor-BSlH9vSc.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/RlsEditor-BSlH9vSc.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Routes-BiLXE49D.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Routes-BiLXE49D.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Routes-C-ianIGD.css +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/SchemaBrowser-DKy2_KQi.css +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/SchemaBrowser-XFvFbtDB.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/SchemaBrowser-XFvFbtDB.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Select-DIzZyRZb.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Select-DIzZyRZb.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Space-n5-XcguU.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Space-n5-XcguU.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/SqlEditor-b8pTsILY.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/SqlEditor-b8pTsILY.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/SqlWorkspace-BUS7IntH.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/SqlWorkspace-BUS7IntH.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/TableData-CQIagLKn.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/TableData-CQIagLKn.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Tag-D1fOKpTH.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Tag-D1fOKpTH.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Templates-BS-ugkdq.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Templates-BS-ugkdq.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Thing-CEAniuMg.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Thing-CEAniuMg.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Users-wzwajhlh.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/Users-wzwajhlh.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/_plugin-vue_export-helper-DGA9ry_j.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/dist-VXIJLCYq.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/dist-VXIJLCYq.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/format-length-CGCY1rMh.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/format-length-CGCY1rMh.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/get-Ca6unauB.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/get-Ca6unauB.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/index-CeE6v959.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/index-CeE6v959.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/pinia-COXwfrOX.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/pinia-COXwfrOX.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/resources-Bt6thQCD.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/resources-Bt6thQCD.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/use-locale-mtgM0a3a.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/use-locale-mtgM0a3a.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/useConfirm-tMjvBFXR.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/useConfirm-tMjvBFXR.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/useResource-C_rJCY8C.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/useResource-C_rJCY8C.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/useTable-CnZc5zhi.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/useTable-CnZc5zhi.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/useTable-Dg0XlRlq.css +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/useToast-DsZKx0IX.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/useToast-DsZKx0IX.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/utils-sbXoq7Ir.js +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/utils-sbXoq7Ir.js.map +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/favicon.svg +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/icons.svg +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/index.html +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/auth/__init__.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/auth/_email_job.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/auth/deps.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/auth/providers/__init__.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/auth/providers/github.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/auth/providers/google.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/auth/providers/oauth.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/auth/providers/registry.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/auth/ratelimit.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/auth/router.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/auth/schemas.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/auth/service.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/backups/__init__.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/backups/_backup_job.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/backups/schemas.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/backups/service.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/body_size.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/cli.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/client/__init__.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/client/_auth.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/client/_client.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/client/_config.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/client/_functions.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/client/_storage.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/client/py.typed +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/db.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/db_admin.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/extensions.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/functions/__init__.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/functions/context.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/functions/loader.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/functions/router.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/functions/schemas.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/gen/__init__.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/gen/_introspect.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/gen/types_py.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/gen/types_ts.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/health.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/hooks.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/jobs/__init__.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/jobs/backends.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/jobs/context.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/jobs/cron.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/jobs/cron_inproc.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/jobs/decorators.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/jobs/registry.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/jobs/router.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/jobs/schemas.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/jobs/service.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/jobs/worker.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/jwks.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/keyset.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/logging_config.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/mail.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/mailer.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/migrate.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/migrations/0001_extensions_and_roles.sql +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/migrations/0002_auth_schema.sql +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/migrations/0003_demo_todos.sql +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/migrations/0004_auth_v0_2.sql +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/migrations/0005_storage_schema.sql +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/migrations/0006_realtime_schema.sql +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/migrations/0007_jobs_schema.sql +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/migrations/0008_jobs_last_error.sql +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/migrations/0009_auth_rate_limits.sql +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/migrations/0010_worker_heartbeat.sql +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/migrations/0011_admin_schema.sql +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/migrations/0012_auth_banned_until.sql +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/migrations/0013_email_templates.sql +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/migrations/0014_realtime_payload_warning.sql +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/migrations/0015_backups_schema.sql +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/passwords.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/realtime/__init__.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/realtime/broker.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/realtime/protocol.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/realtime/router.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/realtime/schemas.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/realtime/service.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/realtime/topics.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/realtime/websocket.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/__init__.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/init_project.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/templates/Caddyfile.tmpl +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/templates/README.md.tmpl +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/templates/apps_hooks.py.tmpl +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/templates/apps_jobs.py.tmpl +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/templates/asgi.py.tmpl +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/templates/docker-compose.prod.yml.tmpl +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/templates/docker-compose.yml.tmpl +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/templates/docker_postgres_Dockerfile.tmpl +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/templates/docker_postgres_postgresql.conf.tmpl +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/templates/env.example.tmpl +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/templates/functions_README.md.tmpl +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/templates/gitignore.tmpl +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/templates/manage.py.tmpl +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/templates/migrations/.gitkeep +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/templates/package_init.py.tmpl +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/scaffold/templates/settings.py.tmpl +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/secretset.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/security_headers.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/settings.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/settings_module.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/storage/__init__.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/storage/backends.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/storage/router.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/storage/schemas.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/storage/service.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/src/supython/storage/signing.py +0 -0
- {supython-0.1.4 → supython-0.1.6}/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.6
|
|
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
|
|
@@ -42,7 +42,7 @@ Provides-Extra: arq
|
|
|
42
42
|
Requires-Dist: arq>=0.26; extra == 'arq'
|
|
43
43
|
Provides-Extra: client
|
|
44
44
|
Requires-Dist: httpx>=0.28; extra == 'client'
|
|
45
|
-
Requires-Dist: postgrest
|
|
45
|
+
Requires-Dist: postgrest>=0.16.0; extra == 'client'
|
|
46
46
|
Requires-Dist: realtime>=2.0.0; extra == 'client'
|
|
47
47
|
Provides-Extra: cron-inproc
|
|
48
48
|
Requires-Dist: croniter>=2.0; extra == 'cron-inproc'
|
|
@@ -95,7 +95,7 @@ Shipped [v0.1.2]:
|
|
|
95
95
|
**Jobs & cron**
|
|
96
96
|
- **Job queue** — Postgres-backed (`SELECT FOR UPDATE SKIP LOCKED`), idempotent enqueue, retry with backoff
|
|
97
97
|
- **Cron scheduling** — `pg_cron` (primary) or in-process `croniter` fallback
|
|
98
|
-
- **Generic hooks** — `@app.on_signup` / `@app.on_login` lifecycle hooks; `@
|
|
98
|
+
- **Generic hooks** — `@app.on_signup` / `@app.on_login` lifecycle hooks; `@claims_provider` (from `supython.auth.claims`) for custom JWT claims
|
|
99
99
|
- **`supython worker run`** — long-running worker with graceful SIGTERM drain
|
|
100
100
|
|
|
101
101
|
**Operations & security**
|
|
@@ -420,15 +420,20 @@ equivalents) to `.env`. Providers without credentials are silently disabled.
|
|
|
420
420
|
|
|
421
421
|
### Custom JWT claims [shipped v0.1.3]
|
|
422
422
|
|
|
423
|
-
Register a
|
|
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
|
|
425
425
|
`(user, conn) -> dict` whose return value is merged into the token payload —
|
|
426
426
|
on signup, password login, refresh, magic-link, OTP, and OAuth callbacks.
|
|
427
427
|
|
|
428
|
+
Import `register` directly from `supython.auth.claims` (typically aliased to
|
|
429
|
+
`claims_provider`). Don't reach for `supython.app.app` — extensions load
|
|
430
|
+
*during* `create_app()`, before `app` is bound, so importing it from a
|
|
431
|
+
user-side `EXTENSIONS` module is a circular import.
|
|
432
|
+
|
|
428
433
|
```python
|
|
429
|
-
from supython.
|
|
434
|
+
from supython.auth.claims import register as claims_provider
|
|
430
435
|
|
|
431
|
-
@
|
|
436
|
+
@claims_provider
|
|
432
437
|
async def add_org(user, conn):
|
|
433
438
|
org_id = await conn.fetchval(
|
|
434
439
|
"select org_id from public.memberships where user_id = $1", user.id
|
|
@@ -472,7 +477,7 @@ async def me(user_id: Annotated[UUID, Depends(current_user_id)]) -> dict:
|
|
|
472
477
|
|
|
473
478
|
@router.get("/whoami")
|
|
474
479
|
async def whoami(claims: Annotated[dict, Depends(current_claims)]) -> dict:
|
|
475
|
-
# Read whatever your
|
|
480
|
+
# Read whatever your claims provider injected — e.g. org_id.
|
|
476
481
|
return {"user_id": claims["sub"], "org_id": claims.get("org_id")}
|
|
477
482
|
```
|
|
478
483
|
|
|
@@ -37,7 +37,7 @@ Shipped [v0.1.2]:
|
|
|
37
37
|
**Jobs & cron**
|
|
38
38
|
- **Job queue** — Postgres-backed (`SELECT FOR UPDATE SKIP LOCKED`), idempotent enqueue, retry with backoff
|
|
39
39
|
- **Cron scheduling** — `pg_cron` (primary) or in-process `croniter` fallback
|
|
40
|
-
- **Generic hooks** — `@app.on_signup` / `@app.on_login` lifecycle hooks; `@
|
|
40
|
+
- **Generic hooks** — `@app.on_signup` / `@app.on_login` lifecycle hooks; `@claims_provider` (from `supython.auth.claims`) for custom JWT claims
|
|
41
41
|
- **`supython worker run`** — long-running worker with graceful SIGTERM drain
|
|
42
42
|
|
|
43
43
|
**Operations & security**
|
|
@@ -362,15 +362,20 @@ equivalents) to `.env`. Providers without credentials are silently disabled.
|
|
|
362
362
|
|
|
363
363
|
### Custom JWT claims [shipped v0.1.3]
|
|
364
364
|
|
|
365
|
-
Register a
|
|
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
|
|
367
367
|
`(user, conn) -> dict` whose return value is merged into the token payload —
|
|
368
368
|
on signup, password login, refresh, magic-link, OTP, and OAuth callbacks.
|
|
369
369
|
|
|
370
|
+
Import `register` directly from `supython.auth.claims` (typically aliased to
|
|
371
|
+
`claims_provider`). Don't reach for `supython.app.app` — extensions load
|
|
372
|
+
*during* `create_app()`, before `app` is bound, so importing it from a
|
|
373
|
+
user-side `EXTENSIONS` module is a circular import.
|
|
374
|
+
|
|
370
375
|
```python
|
|
371
|
-
from supython.
|
|
376
|
+
from supython.auth.claims import register as claims_provider
|
|
372
377
|
|
|
373
|
-
@
|
|
378
|
+
@claims_provider
|
|
374
379
|
async def add_org(user, conn):
|
|
375
380
|
org_id = await conn.fetchval(
|
|
376
381
|
"select org_id from public.memberships where user_id = $1", user.id
|
|
@@ -414,7 +419,7 @@ async def me(user_id: Annotated[UUID, Depends(current_user_id)]) -> dict:
|
|
|
414
419
|
|
|
415
420
|
@router.get("/whoami")
|
|
416
421
|
async def whoami(claims: Annotated[dict, Depends(current_claims)]) -> dict:
|
|
417
|
-
# Read whatever your
|
|
422
|
+
# Read whatever your claims provider injected — e.g. org_id.
|
|
418
423
|
return {"user_id": claims["sub"], "org_id": claims.get("org_id")}
|
|
419
424
|
```
|
|
420
425
|
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "supython"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.6"
|
|
8
8
|
description = "A lightweight Postgres-first BaaS framework for Python"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -62,7 +62,7 @@ cron-inproc = [
|
|
|
62
62
|
"croniter>=2.0",
|
|
63
63
|
]
|
|
64
64
|
client = [
|
|
65
|
-
"postgrest
|
|
65
|
+
"postgrest>=0.16.0",
|
|
66
66
|
"realtime>=2.0.0",
|
|
67
67
|
"httpx>=0.28",
|
|
68
68
|
]
|
|
@@ -11,7 +11,6 @@ from fastapi.middleware.cors import CORSMiddleware
|
|
|
11
11
|
from . import __version__, db, jwks
|
|
12
12
|
from .admin import router as admin_api_router
|
|
13
13
|
from .admin import spa as admin_spa
|
|
14
|
-
from .auth import claims as auth_claims
|
|
15
14
|
from .auth.router import router as auth_router
|
|
16
15
|
from .extensions import load_extensions
|
|
17
16
|
from .settings_module import UserSettings, load_user_settings
|
|
@@ -156,7 +155,6 @@ def create_app() -> FastAPI:
|
|
|
156
155
|
app.on_signup = _make_hook_decorator("signup")
|
|
157
156
|
app.on_login = _make_hook_decorator("login")
|
|
158
157
|
app.on_logout = _make_hook_decorator("logout")
|
|
159
|
-
app.claims_provider = auth_claims.register
|
|
160
158
|
|
|
161
159
|
return app
|
|
162
160
|
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"""Custom-claim providers for access-token issuance.
|
|
2
2
|
|
|
3
|
-
Library users register an async callable via
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
merged into the access
|
|
3
|
+
Library users register an async callable via ``claims.register`` (typically
|
|
4
|
+
imported as ``from supython.auth.claims import register as claims_provider``)
|
|
5
|
+
and the auth service invokes it inside ``_issue_pair`` just before minting
|
|
6
|
+
the JWT. Each provider returns a ``dict`` that is merged into the access
|
|
7
|
+
token's payload.
|
|
7
8
|
|
|
8
9
|
Contract (intentionally narrower than ``hooks.fire``):
|
|
9
10
|
|
|
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.4 → supython-0.1.6}/src/supython/admin/static/assets/ChevronRight-CtQH1EQ1.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/CodeViewer-Bqy7-wvH.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js
RENAMED
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/DataTable-COAAWEft.js.map
RENAMED
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js
RENAMED
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js.map
RENAMED
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/DrawerContent-TpYTFgF1.js
RENAMED
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/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.4 → supython-0.1.6}/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.4 → supython-0.1.6}/src/supython/admin/static/assets/JsonField-DibyJgun.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/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.4 → supython-0.1.6}/src/supython/admin/static/assets/Migrations-DOSC2ddQ.js.map
RENAMED
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js
RENAMED
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js.map
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js
RENAMED
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/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.4 → supython-0.1.6}/src/supython/admin/static/assets/SchemaBrowser-DKy2_KQi.css
RENAMED
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/SchemaBrowser-XFvFbtDB.js
RENAMED
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/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.4 → supython-0.1.6}/src/supython/admin/static/assets/SqlEditor-b8pTsILY.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/SqlWorkspace-BUS7IntH.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/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.4 → supython-0.1.6}/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.4 → supython-0.1.6}/src/supython/admin/static/assets/format-length-CGCY1rMh.js
RENAMED
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/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.4 → supython-0.1.6}/src/supython/admin/static/assets/resources-Bt6thQCD.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/use-locale-mtgM0a3a.js.map
RENAMED
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js
RENAMED
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/src/supython/admin/static/assets/useConfirm-tMjvBFXR.js.map
RENAMED
|
File without changes
|
|
File without changes
|
{supython-0.1.4 → supython-0.1.6}/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
|