supython 0.1.0__tar.gz → 0.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. {supython-0.1.0 → supython-0.1.2}/CHANGELOG.md +2 -2
  2. {supython-0.1.0 → supython-0.1.2}/PKG-INFO +20 -21
  3. {supython-0.1.0 → supython-0.1.2}/README.md +19 -20
  4. {supython-0.1.0 → supython-0.1.2}/pyproject.toml +1 -1
  5. {supython-0.1.0 → supython-0.1.2}/src/supython/cli.py +4 -2
  6. {supython-0.1.0 → supython-0.1.2}/src/supython/gen/types_py.py +5 -4
  7. {supython-0.1.0 → supython-0.1.2}/.gitignore +0 -0
  8. {supython-0.1.0 → supython-0.1.2}/LICENSE +0 -0
  9. {supython-0.1.0 → supython-0.1.2}/SECURITY.md +0 -0
  10. {supython-0.1.0 → supython-0.1.2}/src/supython/__init__.py +0 -0
  11. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/__init__.py +0 -0
  12. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/__init__.py +0 -0
  13. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/auth.py +0 -0
  14. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/auth_templates.py +0 -0
  15. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/auth_users.py +0 -0
  16. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/db.py +0 -0
  17. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/functions.py +0 -0
  18. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/jobs.py +0 -0
  19. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/ops.py +0 -0
  20. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/realtime.py +0 -0
  21. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/service_auth.py +0 -0
  22. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/service_auth_templates.py +0 -0
  23. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/service_auth_users.py +0 -0
  24. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/service_db.py +0 -0
  25. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/service_functions.py +0 -0
  26. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/service_jobs.py +0 -0
  27. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/service_ops.py +0 -0
  28. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/service_realtime.py +0 -0
  29. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/service_storage.py +0 -0
  30. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/storage.py +0 -0
  31. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/api/system.py +0 -0
  32. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/audit.py +0 -0
  33. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/deps.py +0 -0
  34. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/errors.py +0 -0
  35. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/schemas.py +0 -0
  36. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/session.py +0 -0
  37. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/spa.py +0 -0
  38. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Alert-dluGVkos.js +0 -0
  39. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Alert-dluGVkos.js.map +0 -0
  40. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Audit-Njung3HI.js +0 -0
  41. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Audit-Njung3HI.js.map +0 -0
  42. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Backups-DzPlFgrm.js +0 -0
  43. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Backups-DzPlFgrm.js.map +0 -0
  44. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Buckets-ByacGkU1.js +0 -0
  45. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Buckets-ByacGkU1.js.map +0 -0
  46. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Channels-BoIuTtam.js +0 -0
  47. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Channels-BoIuTtam.js.map +0 -0
  48. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/ChevronRight-CtQH1EQ1.js +0 -0
  49. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/ChevronRight-CtQH1EQ1.js.map +0 -0
  50. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/CodeViewer-Bqy7-wvH.js +0 -0
  51. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/CodeViewer-Bqy7-wvH.js.map +0 -0
  52. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Crons-B67vc39F.js +0 -0
  53. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Crons-B67vc39F.js.map +0 -0
  54. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js +0 -0
  55. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/DashboardView-CUTFVL6k.js.map +0 -0
  56. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/DataTable-COAAWEft.js +0 -0
  57. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/DataTable-COAAWEft.js.map +0 -0
  58. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js +0 -0
  59. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/DescriptionsItem-P8JUDaBs.js.map +0 -0
  60. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/DrawerContent-TpYTFgF1.js +0 -0
  61. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/DrawerContent-TpYTFgF1.js.map +0 -0
  62. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Empty-cr2r7e2u.js +0 -0
  63. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Empty-cr2r7e2u.js.map +0 -0
  64. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/EmptyState-DeDck-OL.js +0 -0
  65. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/EmptyState-DeDck-OL.js.map +0 -0
  66. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Grid-hFkp9F4P.js +0 -0
  67. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Grid-hFkp9F4P.js.map +0 -0
  68. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Input-DppYTq9C.js +0 -0
  69. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Input-DppYTq9C.js.map +0 -0
  70. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Invoke-DW3Nveeh.js +0 -0
  71. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Invoke-DW3Nveeh.js.map +0 -0
  72. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/JsonField-DibyJgun.js +0 -0
  73. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/JsonField-DibyJgun.js.map +0 -0
  74. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/LoginView-BjLyE3Ds.css +0 -0
  75. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/LoginView-CoOjECT_.js +0 -0
  76. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/LoginView-CoOjECT_.js.map +0 -0
  77. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Logs-D9WYrnIT.js +0 -0
  78. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Logs-D9WYrnIT.js.map +0 -0
  79. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Logs-DS1XPa0h.css +0 -0
  80. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Migrations-DOSC2ddQ.js +0 -0
  81. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Migrations-DOSC2ddQ.js.map +0 -0
  82. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js +0 -0
  83. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/ObjectBrowser-_5w8vOX8.js.map +0 -0
  84. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Queue-CywZs6vI.js +0 -0
  85. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Queue-CywZs6vI.js.map +0 -0
  86. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js +0 -0
  87. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/RefreshTokens-Ccjr53jg.js.map +0 -0
  88. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/RlsEditor-BSlH9vSc.js +0 -0
  89. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/RlsEditor-BSlH9vSc.js.map +0 -0
  90. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Routes-BiLXE49D.js +0 -0
  91. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Routes-BiLXE49D.js.map +0 -0
  92. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Routes-C-ianIGD.css +0 -0
  93. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/SchemaBrowser-DKy2_KQi.css +0 -0
  94. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/SchemaBrowser-XFvFbtDB.js +0 -0
  95. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/SchemaBrowser-XFvFbtDB.js.map +0 -0
  96. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Select-DIzZyRZb.js +0 -0
  97. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Select-DIzZyRZb.js.map +0 -0
  98. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Space-n5-XcguU.js +0 -0
  99. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Space-n5-XcguU.js.map +0 -0
  100. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/SqlEditor-b8pTsILY.js +0 -0
  101. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/SqlEditor-b8pTsILY.js.map +0 -0
  102. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/SqlWorkspace-BUS7IntH.js +0 -0
  103. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/SqlWorkspace-BUS7IntH.js.map +0 -0
  104. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/TableData-CQIagLKn.js +0 -0
  105. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/TableData-CQIagLKn.js.map +0 -0
  106. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Tag-D1fOKpTH.js +0 -0
  107. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Tag-D1fOKpTH.js.map +0 -0
  108. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Templates-BS-ugkdq.js +0 -0
  109. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Templates-BS-ugkdq.js.map +0 -0
  110. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Thing-CEAniuMg.js +0 -0
  111. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Thing-CEAniuMg.js.map +0 -0
  112. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Users-wzwajhlh.js +0 -0
  113. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/Users-wzwajhlh.js.map +0 -0
  114. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/_plugin-vue_export-helper-DGA9ry_j.js +0 -0
  115. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/dist-VXIJLCYq.js +0 -0
  116. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/dist-VXIJLCYq.js.map +0 -0
  117. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/format-length-CGCY1rMh.js +0 -0
  118. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/format-length-CGCY1rMh.js.map +0 -0
  119. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/get-Ca6unauB.js +0 -0
  120. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/get-Ca6unauB.js.map +0 -0
  121. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/index-CeE6v959.js +0 -0
  122. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/index-CeE6v959.js.map +0 -0
  123. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/pinia-COXwfrOX.js +0 -0
  124. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/pinia-COXwfrOX.js.map +0 -0
  125. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/resources-Bt6thQCD.js +0 -0
  126. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/resources-Bt6thQCD.js.map +0 -0
  127. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/use-locale-mtgM0a3a.js +0 -0
  128. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/use-locale-mtgM0a3a.js.map +0 -0
  129. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js +0 -0
  130. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/use-merged-state-BvhkaHNX.js.map +0 -0
  131. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/useConfirm-tMjvBFXR.js +0 -0
  132. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/useConfirm-tMjvBFXR.js.map +0 -0
  133. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/useResource-C_rJCY8C.js +0 -0
  134. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/useResource-C_rJCY8C.js.map +0 -0
  135. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/useTable-CnZc5zhi.js +0 -0
  136. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/useTable-CnZc5zhi.js.map +0 -0
  137. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/useTable-Dg0XlRlq.css +0 -0
  138. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/useToast-DsZKx0IX.js +0 -0
  139. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/useToast-DsZKx0IX.js.map +0 -0
  140. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/utils-sbXoq7Ir.js +0 -0
  141. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/assets/utils-sbXoq7Ir.js.map +0 -0
  142. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/favicon.svg +0 -0
  143. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/icons.svg +0 -0
  144. {supython-0.1.0 → supython-0.1.2}/src/supython/admin/static/index.html +0 -0
  145. {supython-0.1.0 → supython-0.1.2}/src/supython/app.py +0 -0
  146. {supython-0.1.0 → supython-0.1.2}/src/supython/auth/__init__.py +0 -0
  147. {supython-0.1.0 → supython-0.1.2}/src/supython/auth/_email_job.py +0 -0
  148. {supython-0.1.0 → supython-0.1.2}/src/supython/auth/providers/__init__.py +0 -0
  149. {supython-0.1.0 → supython-0.1.2}/src/supython/auth/providers/github.py +0 -0
  150. {supython-0.1.0 → supython-0.1.2}/src/supython/auth/providers/google.py +0 -0
  151. {supython-0.1.0 → supython-0.1.2}/src/supython/auth/providers/oauth.py +0 -0
  152. {supython-0.1.0 → supython-0.1.2}/src/supython/auth/providers/registry.py +0 -0
  153. {supython-0.1.0 → supython-0.1.2}/src/supython/auth/ratelimit.py +0 -0
  154. {supython-0.1.0 → supython-0.1.2}/src/supython/auth/router.py +0 -0
  155. {supython-0.1.0 → supython-0.1.2}/src/supython/auth/schemas.py +0 -0
  156. {supython-0.1.0 → supython-0.1.2}/src/supython/auth/service.py +0 -0
  157. {supython-0.1.0 → supython-0.1.2}/src/supython/backups/__init__.py +0 -0
  158. {supython-0.1.0 → supython-0.1.2}/src/supython/backups/_backup_job.py +0 -0
  159. {supython-0.1.0 → supython-0.1.2}/src/supython/backups/schemas.py +0 -0
  160. {supython-0.1.0 → supython-0.1.2}/src/supython/backups/service.py +0 -0
  161. {supython-0.1.0 → supython-0.1.2}/src/supython/body_size.py +0 -0
  162. {supython-0.1.0 → supython-0.1.2}/src/supython/client/__init__.py +0 -0
  163. {supython-0.1.0 → supython-0.1.2}/src/supython/client/_auth.py +0 -0
  164. {supython-0.1.0 → supython-0.1.2}/src/supython/client/_client.py +0 -0
  165. {supython-0.1.0 → supython-0.1.2}/src/supython/client/_config.py +0 -0
  166. {supython-0.1.0 → supython-0.1.2}/src/supython/client/_functions.py +0 -0
  167. {supython-0.1.0 → supython-0.1.2}/src/supython/client/_storage.py +0 -0
  168. {supython-0.1.0 → supython-0.1.2}/src/supython/client/py.typed +0 -0
  169. {supython-0.1.0 → supython-0.1.2}/src/supython/db.py +0 -0
  170. {supython-0.1.0 → supython-0.1.2}/src/supython/db_admin.py +0 -0
  171. {supython-0.1.0 → supython-0.1.2}/src/supython/extensions.py +0 -0
  172. {supython-0.1.0 → supython-0.1.2}/src/supython/functions/__init__.py +0 -0
  173. {supython-0.1.0 → supython-0.1.2}/src/supython/functions/context.py +0 -0
  174. {supython-0.1.0 → supython-0.1.2}/src/supython/functions/loader.py +0 -0
  175. {supython-0.1.0 → supython-0.1.2}/src/supython/functions/router.py +0 -0
  176. {supython-0.1.0 → supython-0.1.2}/src/supython/functions/schemas.py +0 -0
  177. {supython-0.1.0 → supython-0.1.2}/src/supython/gen/__init__.py +0 -0
  178. {supython-0.1.0 → supython-0.1.2}/src/supython/gen/_introspect.py +0 -0
  179. {supython-0.1.0 → supython-0.1.2}/src/supython/gen/types_ts.py +0 -0
  180. {supython-0.1.0 → supython-0.1.2}/src/supython/health.py +0 -0
  181. {supython-0.1.0 → supython-0.1.2}/src/supython/hooks.py +0 -0
  182. {supython-0.1.0 → supython-0.1.2}/src/supython/jobs/__init__.py +0 -0
  183. {supython-0.1.0 → supython-0.1.2}/src/supython/jobs/backends.py +0 -0
  184. {supython-0.1.0 → supython-0.1.2}/src/supython/jobs/context.py +0 -0
  185. {supython-0.1.0 → supython-0.1.2}/src/supython/jobs/cron.py +0 -0
  186. {supython-0.1.0 → supython-0.1.2}/src/supython/jobs/cron_inproc.py +0 -0
  187. {supython-0.1.0 → supython-0.1.2}/src/supython/jobs/decorators.py +0 -0
  188. {supython-0.1.0 → supython-0.1.2}/src/supython/jobs/registry.py +0 -0
  189. {supython-0.1.0 → supython-0.1.2}/src/supython/jobs/router.py +0 -0
  190. {supython-0.1.0 → supython-0.1.2}/src/supython/jobs/schemas.py +0 -0
  191. {supython-0.1.0 → supython-0.1.2}/src/supython/jobs/service.py +0 -0
  192. {supython-0.1.0 → supython-0.1.2}/src/supython/jobs/worker.py +0 -0
  193. {supython-0.1.0 → supython-0.1.2}/src/supython/jwks.py +0 -0
  194. {supython-0.1.0 → supython-0.1.2}/src/supython/keyset.py +0 -0
  195. {supython-0.1.0 → supython-0.1.2}/src/supython/logging_config.py +0 -0
  196. {supython-0.1.0 → supython-0.1.2}/src/supython/mail.py +0 -0
  197. {supython-0.1.0 → supython-0.1.2}/src/supython/mailer.py +0 -0
  198. {supython-0.1.0 → supython-0.1.2}/src/supython/migrate.py +0 -0
  199. {supython-0.1.0 → supython-0.1.2}/src/supython/migrations/0001_extensions_and_roles.sql +0 -0
  200. {supython-0.1.0 → supython-0.1.2}/src/supython/migrations/0002_auth_schema.sql +0 -0
  201. {supython-0.1.0 → supython-0.1.2}/src/supython/migrations/0003_demo_todos.sql +0 -0
  202. {supython-0.1.0 → supython-0.1.2}/src/supython/migrations/0004_auth_v0_2.sql +0 -0
  203. {supython-0.1.0 → supython-0.1.2}/src/supython/migrations/0005_storage_schema.sql +0 -0
  204. {supython-0.1.0 → supython-0.1.2}/src/supython/migrations/0006_realtime_schema.sql +0 -0
  205. {supython-0.1.0 → supython-0.1.2}/src/supython/migrations/0007_jobs_schema.sql +0 -0
  206. {supython-0.1.0 → supython-0.1.2}/src/supython/migrations/0008_jobs_last_error.sql +0 -0
  207. {supython-0.1.0 → supython-0.1.2}/src/supython/migrations/0009_auth_rate_limits.sql +0 -0
  208. {supython-0.1.0 → supython-0.1.2}/src/supython/migrations/0010_worker_heartbeat.sql +0 -0
  209. {supython-0.1.0 → supython-0.1.2}/src/supython/migrations/0011_admin_schema.sql +0 -0
  210. {supython-0.1.0 → supython-0.1.2}/src/supython/migrations/0012_auth_banned_until.sql +0 -0
  211. {supython-0.1.0 → supython-0.1.2}/src/supython/migrations/0013_email_templates.sql +0 -0
  212. {supython-0.1.0 → supython-0.1.2}/src/supython/migrations/0014_realtime_payload_warning.sql +0 -0
  213. {supython-0.1.0 → supython-0.1.2}/src/supython/migrations/0015_backups_schema.sql +0 -0
  214. {supython-0.1.0 → supython-0.1.2}/src/supython/passwords.py +0 -0
  215. {supython-0.1.0 → supython-0.1.2}/src/supython/realtime/__init__.py +0 -0
  216. {supython-0.1.0 → supython-0.1.2}/src/supython/realtime/broker.py +0 -0
  217. {supython-0.1.0 → supython-0.1.2}/src/supython/realtime/protocol.py +0 -0
  218. {supython-0.1.0 → supython-0.1.2}/src/supython/realtime/router.py +0 -0
  219. {supython-0.1.0 → supython-0.1.2}/src/supython/realtime/schemas.py +0 -0
  220. {supython-0.1.0 → supython-0.1.2}/src/supython/realtime/service.py +0 -0
  221. {supython-0.1.0 → supython-0.1.2}/src/supython/realtime/topics.py +0 -0
  222. {supython-0.1.0 → supython-0.1.2}/src/supython/realtime/websocket.py +0 -0
  223. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/__init__.py +0 -0
  224. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/init_project.py +0 -0
  225. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/templates/Caddyfile.tmpl +0 -0
  226. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/templates/README.md.tmpl +0 -0
  227. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/templates/apps_hooks.py.tmpl +0 -0
  228. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/templates/apps_jobs.py.tmpl +0 -0
  229. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/templates/asgi.py.tmpl +0 -0
  230. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/templates/docker-compose.prod.yml.tmpl +0 -0
  231. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/templates/docker-compose.yml.tmpl +0 -0
  232. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/templates/docker_postgres_Dockerfile.tmpl +0 -0
  233. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/templates/docker_postgres_postgresql.conf.tmpl +0 -0
  234. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/templates/env.example.tmpl +0 -0
  235. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/templates/functions_README.md.tmpl +0 -0
  236. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/templates/gitignore.tmpl +0 -0
  237. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/templates/manage.py.tmpl +0 -0
  238. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/templates/migrations/.gitkeep +0 -0
  239. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/templates/package_init.py.tmpl +0 -0
  240. {supython-0.1.0 → supython-0.1.2}/src/supython/scaffold/templates/settings.py.tmpl +0 -0
  241. {supython-0.1.0 → supython-0.1.2}/src/supython/secretset.py +0 -0
  242. {supython-0.1.0 → supython-0.1.2}/src/supython/security_headers.py +0 -0
  243. {supython-0.1.0 → supython-0.1.2}/src/supython/settings.py +0 -0
  244. {supython-0.1.0 → supython-0.1.2}/src/supython/settings_module.py +0 -0
  245. {supython-0.1.0 → supython-0.1.2}/src/supython/storage/__init__.py +0 -0
  246. {supython-0.1.0 → supython-0.1.2}/src/supython/storage/backends.py +0 -0
  247. {supython-0.1.0 → supython-0.1.2}/src/supython/storage/router.py +0 -0
  248. {supython-0.1.0 → supython-0.1.2}/src/supython/storage/schemas.py +0 -0
  249. {supython-0.1.0 → supython-0.1.2}/src/supython/storage/service.py +0 -0
  250. {supython-0.1.0 → supython-0.1.2}/src/supython/storage/signing.py +0 -0
  251. {supython-0.1.0 → supython-0.1.2}/src/supython/tokens.py +0 -0
@@ -31,7 +31,7 @@ Each entry links the relevant `PROJECT.md` section and decision-log row
31
31
 
32
32
  ---
33
33
 
34
- ## [0.1.0] — 2026-05-08
34
+ ## [0.1.0] — 2026-05-09
35
35
 
36
36
  The first public release. Everything currently on `main` collapses
37
37
  into this single ZeroVer entry — auth, storage, functions, realtime,
@@ -200,5 +200,5 @@ v0.1–v0.7 plus a v1.1.x admin track; see §19 decision log
200
200
 
201
201
  ---
202
202
 
203
- [Unreleased]: https://github.com/Tkeby/supython/compare/v0.1.0...HEAD
203
+
204
204
  [0.1.0]: https://github.com/Tkeby/supython/releases/tag/v0.1.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: supython
3
- Version: 0.1.0
3
+ Version: 0.1.2
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,10 +58,10 @@ Description-Content-Type: text/markdown
58
58
 
59
59
  # supython
60
60
 
61
- > A lightweight, Postgres-first BaaS framework for Python. **v0.1.0 release**
61
+ > A lightweight, Postgres-first BaaS framework for Python. **v0.1.2 release**
62
62
 
63
- supython is the inverse of Django: **the database owns the schema, Python owns
64
- the things SQL is bad at**. It leans on [PostgREST](https://postgrest.org)
63
+ **the database owns the schema, Python owns the things SQL is bad at**.
64
+ It leans on [PostgREST](https://postgrest.org)
65
65
  for auto-generated REST APIs and on Postgres' own RLS for authorization,
66
66
  while a small FastAPI service in Python handles auth, JWT issuance, realtime,
67
67
  storage, functions, workers, and an optional admin control plane.
@@ -69,7 +69,7 @@ storage, functions, workers, and an optional admin control plane.
69
69
  supython is for a specific person with a specific problem:
70
70
  > A developer who wants to build a CRUD-heavy web app (most apps are), who thinks in SQL, who wants Postgres to own authorization, and who wants auth + storage + custom logic without assembling the integration themselves.
71
71
 
72
- Shipped [v0.1.0]:
72
+ Shipped [v0.1.2]:
73
73
 
74
74
  **Core platform**
75
75
  - **Email/password auth** — signup, login, refresh-token rotation with **reuse detection**
@@ -88,7 +88,7 @@ Shipped [v0.1.0]:
88
88
 
89
89
  **Realtime**
90
90
  - **WebSocket Realtime** — `postgres_changes`, `broadcast`, `presence` with per-subscriber RLS filtering
91
- - **Phoenix Channels wire format** — unmodified `supabase-js` / `supabase-py` SDKs connect
91
+ - **Phoenix Channels wire format**
92
92
  - **Generic trigger** — `realtime.enable('public.todos')` opts any table in
93
93
  - **Two-browser chat demo** — `examples/chat.html` (zero build step)
94
94
 
@@ -106,7 +106,7 @@ Shipped [v0.1.0]:
106
106
  - **Secret rotation** — JWT keys, symmetric secrets, Postgres passwords; all with zero-downtime runbooks
107
107
  - **Multi-arch Docker image** — `linux/amd64` + `linux/arm64`, non-root user, `tini` PID 1, ~64 MB
108
108
 
109
- **Admin control plane** (shipped in v0.1.0)
109
+ **Admin control plane** (shipped in v0.1.2)
110
110
  - **Vue 3 + Vite SPA** at `/admin` — no runtime Node deps; pre-built static bundle in the wheel
111
111
  - **Database surface** — schema browser, table data with role switcher, SQL workspace (read-only default + write toggle), RLS policy editor with dry-run, migrations panel
112
112
  - **Auth surface** — user search, ban/unban/force-logout, refresh-token inspector, audit log, email template editing
@@ -159,7 +159,7 @@ cp .env.example .env
159
159
  # the value PostgREST will use (docker-compose.yml injects it via env).
160
160
  #
161
161
  # The scaffold creates:
162
- # manage.py — Django-style CLI entrypoint (sets SUPYTHON_SETTINGS_MODULE)
162
+ # manage.py — Optional CLI entrypoint (sets SUPYTHON_SETTINGS_MODULE)
163
163
  # myapp/settings.py — declare EXTENSIONS, EXTRA_ROUTERS, EXTRA_MIDDLEWARE
164
164
  # myapp/jobs.py — example @job seed (register your background jobs here)
165
165
  # myapp/hooks.py — example @on("signup") seed (lifecycle hooks)
@@ -172,7 +172,7 @@ supython up
172
172
  supython dev
173
173
 
174
174
  # 5. (optional) generate typed Python classes from your Postgres schema
175
- supython gen types --lang py --out types.py
175
+ supython gen types --lang py --out db_schema.py
176
176
 
177
177
  # 6. (optional) bootstrap the admin dashboard
178
178
  supython admin create-user
@@ -219,8 +219,7 @@ including filtering, sorting, refresh, and isolation between users.
219
219
  ## Realtime quickstart
220
220
 
221
221
  supython ships a WebSocket engine that speaks the **Phoenix Channels 5-tuple
222
- protocol** used by every official Supabase SDK. Unmodified `supabase-js` and
223
- `supabase-py` clients connect without any shim.
222
+ protocol**.
224
223
 
225
224
  ### 1. Opt a table into realtime
226
225
 
@@ -444,7 +443,7 @@ need to edit SQL.
444
443
 
445
444
  ```
446
445
  supython/
447
- ├── manage.py # Django-style entrypoint (sets SUPYTHON_SETTINGS_MODULE)
446
+ ├── manage.py # optional cli entrypoint (sets SUPYTHON_SETTINGS_MODULE)
448
447
  ├── docker-compose.yml # Postgres + PostgREST (dev stack)
449
448
  ├── docker-compose.prod.yml # hardened single-host production stack
450
449
  ├── docker-compose.test.yml # dedicated test Postgres on port 54323
@@ -521,7 +520,7 @@ need to edit SQL.
521
520
  ├── app.py # FastAPI factory
522
521
  ├── cli.py # typer: up, dev, keygen, admin, worker, test, …
523
522
  ├── extensions.py # eager-import dotted module paths at boot
524
- ├── settings_module.py # Django-style user settings (EXTENSIONS, EXTRA_ROUTERS, …)
523
+ ├── settings_module.py # user settings (EXTENSIONS, EXTRA_ROUTERS, …)
525
524
  ├── health.py # /livez, /readyz, /health endpoints
526
525
  ├── logging_config.py # structured JSON log setup
527
526
  ├── security_headers.py # HSTS, CSP, etc.
@@ -570,7 +569,7 @@ need to edit SQL.
570
569
 
571
570
  ## Plugins & extensions
572
571
 
573
- supython uses a Django-style settings module to declare your app's extensions:
572
+ supython uses a settings module to declare your app's extensions:
574
573
 
575
574
  ```python
576
575
  # <name>/settings.py — scaffolded by `supython init`
@@ -609,7 +608,7 @@ supython migrate # apply pending SQL migrations
609
608
  supython info # print resolved settings
610
609
  supython doctor # diagnose roles, extensions, JWKS, grants, migration drift
611
610
  supython init <name> # scaffold a new supython project
612
- supython gen types --lang py --out types.py # emit typed dataclasses + TypedDicts
611
+ supython gen types --lang py --out db_schema.py # emit typed dataclasses + TypedDicts
613
612
  supython gen types --lang ts --out types.ts # emit TypeScript Database interface
614
613
 
615
614
  # Auth & key management
@@ -669,7 +668,7 @@ supython test reset # stop test DB + delete volume
669
668
  `auth.uid()` returns the user's id inside RLS policies.
670
669
  4. RLS policies on `public.todos` use `auth.uid()` to scope every query.
671
670
 
672
- This is exactly the model Supabase uses, in ~400 lines of Python.
671
+
673
672
 
674
673
  ## Docker image
675
674
 
@@ -731,7 +730,7 @@ unit tests always run in isolation.
731
730
  **CI:** runners with Docker run `supython test up && supython test run`;
732
731
  runners without Docker run `pytest tests/unit` for a meaningful subset.
733
732
 
734
- ## Roadmap [shipped v0.1.0]
733
+ ## Roadmap [shipped v0.1.2]
735
734
 
736
735
  - ✅ Email/password auth, PostgREST contract, RLS demo
737
736
  - ✅ OAuth, password reset, magic link, OTP, reuse detection, email backend, test suite
@@ -742,12 +741,12 @@ runners without Docker run `pytest tests/unit` for a meaningful subset.
742
741
  - ✅ Production observable: structured JSON logs, `/livez`/`/readyz`/`/health`, security headers, input size guards, audit log completeness, OAuth PKCE, secret rotation runbooks
743
742
  - ✅ (partial) Multi-arch Docker images, admin control plane (Vue 3 SPA — database, auth, storage, functions, realtime, jobs, backups, log tail), CI buildx workflow; benchmarks + security audit pass + dependency budget CI remaining
744
743
  - *(deferred)* — Realtime v2 over logical replication
745
- - v0.1.0 Release — final sweep, tag, publish wheel, production deployment with no patches
746
- - ✅ **TypeScript SDK** — `@supython/sdk` wrapping `@supabase/postgrest-js` + `@supabase/realtime-js`
744
+ - v0.1.2 Release — final sweep, tag, publish wheel, production deployment with no patches
745
+ - ✅ **TypeScript SDK** — `@supython/sdk` wrapping `@supabase/postgrest-js` + `@supabase/realtime-js`
747
746
 
748
- ### Post v0.1.0
747
+ ### Post v0.1.2
749
748
 
750
- - **v1.1+** — Admin control plane polish (backend + frontend shipped in v0.1.0; tests + remaining DoD items deferred)
749
+ - **v1.1+** — Admin control plane polish (backend + frontend shipped in v0.1.2; tests + remaining DoD items deferred)
751
750
  - **Realtime v2** — logical replication (demand-driven; swap when trigger overhead or >8KB payload data warrants it)
752
751
  - **Prometheus `/metrics`** + **OpenTelemetry** — optional extras
753
752
 
@@ -1,9 +1,9 @@
1
1
  # supython
2
2
 
3
- > A lightweight, Postgres-first BaaS framework for Python. **v0.1.0 release**
3
+ > A lightweight, Postgres-first BaaS framework for Python. **v0.1.2 release**
4
4
 
5
- supython is the inverse of Django: **the database owns the schema, Python owns
6
- the things SQL is bad at**. It leans on [PostgREST](https://postgrest.org)
5
+ **the database owns the schema, Python owns the things SQL is bad at**.
6
+ It leans on [PostgREST](https://postgrest.org)
7
7
  for auto-generated REST APIs and on Postgres' own RLS for authorization,
8
8
  while a small FastAPI service in Python handles auth, JWT issuance, realtime,
9
9
  storage, functions, workers, and an optional admin control plane.
@@ -11,7 +11,7 @@ storage, functions, workers, and an optional admin control plane.
11
11
  supython is for a specific person with a specific problem:
12
12
  > A developer who wants to build a CRUD-heavy web app (most apps are), who thinks in SQL, who wants Postgres to own authorization, and who wants auth + storage + custom logic without assembling the integration themselves.
13
13
 
14
- Shipped [v0.1.0]:
14
+ Shipped [v0.1.2]:
15
15
 
16
16
  **Core platform**
17
17
  - **Email/password auth** — signup, login, refresh-token rotation with **reuse detection**
@@ -30,7 +30,7 @@ Shipped [v0.1.0]:
30
30
 
31
31
  **Realtime**
32
32
  - **WebSocket Realtime** — `postgres_changes`, `broadcast`, `presence` with per-subscriber RLS filtering
33
- - **Phoenix Channels wire format** — unmodified `supabase-js` / `supabase-py` SDKs connect
33
+ - **Phoenix Channels wire format**
34
34
  - **Generic trigger** — `realtime.enable('public.todos')` opts any table in
35
35
  - **Two-browser chat demo** — `examples/chat.html` (zero build step)
36
36
 
@@ -48,7 +48,7 @@ Shipped [v0.1.0]:
48
48
  - **Secret rotation** — JWT keys, symmetric secrets, Postgres passwords; all with zero-downtime runbooks
49
49
  - **Multi-arch Docker image** — `linux/amd64` + `linux/arm64`, non-root user, `tini` PID 1, ~64 MB
50
50
 
51
- **Admin control plane** (shipped in v0.1.0)
51
+ **Admin control plane** (shipped in v0.1.2)
52
52
  - **Vue 3 + Vite SPA** at `/admin` — no runtime Node deps; pre-built static bundle in the wheel
53
53
  - **Database surface** — schema browser, table data with role switcher, SQL workspace (read-only default + write toggle), RLS policy editor with dry-run, migrations panel
54
54
  - **Auth surface** — user search, ban/unban/force-logout, refresh-token inspector, audit log, email template editing
@@ -101,7 +101,7 @@ cp .env.example .env
101
101
  # the value PostgREST will use (docker-compose.yml injects it via env).
102
102
  #
103
103
  # The scaffold creates:
104
- # manage.py — Django-style CLI entrypoint (sets SUPYTHON_SETTINGS_MODULE)
104
+ # manage.py — Optional CLI entrypoint (sets SUPYTHON_SETTINGS_MODULE)
105
105
  # myapp/settings.py — declare EXTENSIONS, EXTRA_ROUTERS, EXTRA_MIDDLEWARE
106
106
  # myapp/jobs.py — example @job seed (register your background jobs here)
107
107
  # myapp/hooks.py — example @on("signup") seed (lifecycle hooks)
@@ -114,7 +114,7 @@ supython up
114
114
  supython dev
115
115
 
116
116
  # 5. (optional) generate typed Python classes from your Postgres schema
117
- supython gen types --lang py --out types.py
117
+ supython gen types --lang py --out db_schema.py
118
118
 
119
119
  # 6. (optional) bootstrap the admin dashboard
120
120
  supython admin create-user
@@ -161,8 +161,7 @@ including filtering, sorting, refresh, and isolation between users.
161
161
  ## Realtime quickstart
162
162
 
163
163
  supython ships a WebSocket engine that speaks the **Phoenix Channels 5-tuple
164
- protocol** used by every official Supabase SDK. Unmodified `supabase-js` and
165
- `supabase-py` clients connect without any shim.
164
+ protocol**.
166
165
 
167
166
  ### 1. Opt a table into realtime
168
167
 
@@ -386,7 +385,7 @@ need to edit SQL.
386
385
 
387
386
  ```
388
387
  supython/
389
- ├── manage.py # Django-style entrypoint (sets SUPYTHON_SETTINGS_MODULE)
388
+ ├── manage.py # optional cli entrypoint (sets SUPYTHON_SETTINGS_MODULE)
390
389
  ├── docker-compose.yml # Postgres + PostgREST (dev stack)
391
390
  ├── docker-compose.prod.yml # hardened single-host production stack
392
391
  ├── docker-compose.test.yml # dedicated test Postgres on port 54323
@@ -463,7 +462,7 @@ need to edit SQL.
463
462
  ├── app.py # FastAPI factory
464
463
  ├── cli.py # typer: up, dev, keygen, admin, worker, test, …
465
464
  ├── extensions.py # eager-import dotted module paths at boot
466
- ├── settings_module.py # Django-style user settings (EXTENSIONS, EXTRA_ROUTERS, …)
465
+ ├── settings_module.py # user settings (EXTENSIONS, EXTRA_ROUTERS, …)
467
466
  ├── health.py # /livez, /readyz, /health endpoints
468
467
  ├── logging_config.py # structured JSON log setup
469
468
  ├── security_headers.py # HSTS, CSP, etc.
@@ -512,7 +511,7 @@ need to edit SQL.
512
511
 
513
512
  ## Plugins & extensions
514
513
 
515
- supython uses a Django-style settings module to declare your app's extensions:
514
+ supython uses a settings module to declare your app's extensions:
516
515
 
517
516
  ```python
518
517
  # <name>/settings.py — scaffolded by `supython init`
@@ -551,7 +550,7 @@ supython migrate # apply pending SQL migrations
551
550
  supython info # print resolved settings
552
551
  supython doctor # diagnose roles, extensions, JWKS, grants, migration drift
553
552
  supython init <name> # scaffold a new supython project
554
- supython gen types --lang py --out types.py # emit typed dataclasses + TypedDicts
553
+ supython gen types --lang py --out db_schema.py # emit typed dataclasses + TypedDicts
555
554
  supython gen types --lang ts --out types.ts # emit TypeScript Database interface
556
555
 
557
556
  # Auth & key management
@@ -611,7 +610,7 @@ supython test reset # stop test DB + delete volume
611
610
  `auth.uid()` returns the user's id inside RLS policies.
612
611
  4. RLS policies on `public.todos` use `auth.uid()` to scope every query.
613
612
 
614
- This is exactly the model Supabase uses, in ~400 lines of Python.
613
+
615
614
 
616
615
  ## Docker image
617
616
 
@@ -673,7 +672,7 @@ unit tests always run in isolation.
673
672
  **CI:** runners with Docker run `supython test up && supython test run`;
674
673
  runners without Docker run `pytest tests/unit` for a meaningful subset.
675
674
 
676
- ## Roadmap [shipped v0.1.0]
675
+ ## Roadmap [shipped v0.1.2]
677
676
 
678
677
  - ✅ Email/password auth, PostgREST contract, RLS demo
679
678
  - ✅ OAuth, password reset, magic link, OTP, reuse detection, email backend, test suite
@@ -684,12 +683,12 @@ runners without Docker run `pytest tests/unit` for a meaningful subset.
684
683
  - ✅ Production observable: structured JSON logs, `/livez`/`/readyz`/`/health`, security headers, input size guards, audit log completeness, OAuth PKCE, secret rotation runbooks
685
684
  - ✅ (partial) Multi-arch Docker images, admin control plane (Vue 3 SPA — database, auth, storage, functions, realtime, jobs, backups, log tail), CI buildx workflow; benchmarks + security audit pass + dependency budget CI remaining
686
685
  - *(deferred)* — Realtime v2 over logical replication
687
- - v0.1.0 Release — final sweep, tag, publish wheel, production deployment with no patches
688
- - ✅ **TypeScript SDK** — `@supython/sdk` wrapping `@supabase/postgrest-js` + `@supabase/realtime-js`
686
+ - v0.1.2 Release — final sweep, tag, publish wheel, production deployment with no patches
687
+ - ✅ **TypeScript SDK** — `@supython/sdk` wrapping `@supabase/postgrest-js` + `@supabase/realtime-js`
689
688
 
690
- ### Post v0.1.0
689
+ ### Post v0.1.2
691
690
 
692
- - **v1.1+** — Admin control plane polish (backend + frontend shipped in v0.1.0; tests + remaining DoD items deferred)
691
+ - **v1.1+** — Admin control plane polish (backend + frontend shipped in v0.1.2; tests + remaining DoD items deferred)
693
692
  - **Realtime v2** — logical replication (demand-driven; swap when trigger overhead or >8KB payload data warrants it)
694
693
  - **Prometheus `/metrics`** + **OpenTelemetry** — optional extras
695
694
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "supython"
7
- version = "0.1.0"
7
+ version = "0.1.2"
8
8
  description = "A lightweight Postgres-first BaaS framework for Python"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -124,12 +124,14 @@ def gen_types(
124
124
  help="Schema to introspect. Repeatable: --schema public --schema auth.",
125
125
  ),
126
126
  out: Path | None = typer.Option( # noqa: B008
127
- None, "--out", help="Output file path. Defaults to types.<lang>."
127
+ None,
128
+ "--out",
129
+ help="Output file path. Defaults to db_schema.py (py) or types.ts (ts).",
128
130
  ),
129
131
  ) -> None:
130
132
  """Emit typed code mirroring the live Postgres schema."""
131
133
  if lang == "py":
132
- out_path = out or Path("types.py")
134
+ out_path = out or Path("db_schema.py")
133
135
  renderer = render_types_py
134
136
  elif lang == "ts":
135
137
  out_path = out or Path("types.ts")
@@ -1,4 +1,4 @@
1
- """Render a typed ``types.py`` from Postgres schema introspection.
1
+ """Render a typed ``db_schema.py`` from Postgres schema introspection.
2
2
 
3
3
  Public entry point: :func:`render_types_py`. The returned string is the full
4
4
  contents of a self-contained Python module with one ``StrEnum`` per Postgres
@@ -61,7 +61,7 @@ def _safe_col_name(name: str) -> str:
61
61
 
62
62
 
63
63
  async def render_types_py(schemas: list[str]) -> str:
64
- """Connect to ``DATABASE_URL`` and return a rendered ``types.py`` module."""
64
+ """Connect to ``DATABASE_URL`` and return a rendered ``db_schema.py`` module."""
65
65
  s = get_settings()
66
66
  conn = await asyncpg.connect(s.database_url)
67
67
  try:
@@ -188,7 +188,7 @@ def _render(
188
188
 
189
189
  body.append("")
190
190
  body.append(" @classmethod")
191
- body.append(f' def from_record(cls, record: "object") -> "{cls}":')
191
+ body.append(f' def from_record(cls, record: Mapping[str, Any]) -> "{cls}":')
192
192
  body.append(" fields = cls.__dataclass_fields__")
193
193
  body.append(
194
194
  " return cls(**{f: v for f, v in record.items() if f in fields})"
@@ -212,6 +212,7 @@ def _render(
212
212
 
213
213
  import_lines: list[str] = []
214
214
  if has_table:
215
+ import_lines.append("from collections.abc import Mapping")
215
216
  import_lines.append("from dataclasses import dataclass")
216
217
 
217
218
  datetime_syms = sorted(
@@ -224,7 +225,7 @@ def _render(
224
225
  if enums:
225
226
  import_lines.append("from enum import StrEnum")
226
227
  typing_syms: set[str] = set()
227
- if "Any" in imports:
228
+ if "Any" in imports or has_table:
228
229
  typing_syms.add("Any")
229
230
  if has_table:
230
231
  typing_syms.add("TypedDict")
File without changes
File without changes
File without changes