almasix 0.1.0__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 (649) hide show
  1. almasix-0.1.0/.gitignore +54 -0
  2. almasix-0.1.0/LICENSE +21 -0
  3. almasix-0.1.0/Makefile +38 -0
  4. almasix-0.1.0/PKG-INFO +339 -0
  5. almasix-0.1.0/README.md +265 -0
  6. almasix-0.1.0/docs/PLAN.md +1604 -0
  7. almasix-0.1.0/docs/README.md +16 -0
  8. almasix-0.1.0/docs/SMOKE.md +655 -0
  9. almasix-0.1.0/docs/features/README.md +17 -0
  10. almasix-0.1.0/examples/README.md +21 -0
  11. almasix-0.1.0/examples/progress/.env.example +22 -0
  12. almasix-0.1.0/examples/progress/.gitignore +23 -0
  13. almasix-0.1.0/examples/progress/README.md +225 -0
  14. almasix-0.1.0/examples/progress/app/__init__.py +0 -0
  15. almasix-0.1.0/examples/progress/app/console/__init__.py +0 -0
  16. almasix-0.1.0/examples/progress/app/console/commands/__init__.py +0 -0
  17. almasix-0.1.0/examples/progress/app/console/commands/progress_authorization.py +65 -0
  18. almasix-0.1.0/examples/progress/app/console/commands/progress_cache.py +22 -0
  19. almasix-0.1.0/examples/progress/app/console/commands/progress_collections.py +54 -0
  20. almasix-0.1.0/examples/progress/app/console/commands/progress_console.py +75 -0
  21. almasix-0.1.0/examples/progress/app/console/commands/progress_demo.py +85 -0
  22. almasix-0.1.0/examples/progress/app/console/commands/progress_encryption.py +30 -0
  23. almasix-0.1.0/examples/progress/app/console/commands/progress_events.py +39 -0
  24. almasix-0.1.0/examples/progress/app/console/commands/progress_hello.py +15 -0
  25. almasix-0.1.0/examples/progress/app/console/commands/progress_helpers.py +48 -0
  26. almasix-0.1.0/examples/progress/app/console/commands/progress_http.py +63 -0
  27. almasix-0.1.0/examples/progress/app/console/commands/progress_prompts.py +48 -0
  28. almasix-0.1.0/examples/progress/app/console/commands/progress_redis.py +34 -0
  29. almasix-0.1.0/examples/progress/app/console/commands/progress_schedule.py +59 -0
  30. almasix-0.1.0/examples/progress/app/exceptions/__init__.py +0 -0
  31. almasix-0.1.0/examples/progress/app/exceptions/handler.py +11 -0
  32. almasix-0.1.0/examples/progress/app/http/__init__.py +0 -0
  33. almasix-0.1.0/examples/progress/app/http/controllers/__init__.py +0 -0
  34. almasix-0.1.0/examples/progress/app/http/controllers/auth_controller.py +77 -0
  35. almasix-0.1.0/examples/progress/app/http/controllers/demo_controller.py +97 -0
  36. almasix-0.1.0/examples/progress/app/http/controllers/health_controller.py +29 -0
  37. almasix-0.1.0/examples/progress/app/http/controllers/locale_controller.py +22 -0
  38. almasix-0.1.0/examples/progress/app/http/controllers/orm_tour_controller.py +125 -0
  39. almasix-0.1.0/examples/progress/app/http/controllers/post_controller.py +64 -0
  40. almasix-0.1.0/examples/progress/app/http/controllers/progress_controller.py +483 -0
  41. almasix-0.1.0/examples/progress/app/http/controllers/showcase_controller.py +29 -0
  42. almasix-0.1.0/examples/progress/app/http/controllers/user_controller.py +90 -0
  43. almasix-0.1.0/examples/progress/app/http/controllers/verification_controller.py +57 -0
  44. almasix-0.1.0/examples/progress/app/http/controllers/welcome_controller.py +85 -0
  45. almasix-0.1.0/examples/progress/app/http/middleware/__init__.py +0 -0
  46. almasix-0.1.0/examples/progress/app/http/middleware/demo_tag_middleware.py +20 -0
  47. almasix-0.1.0/examples/progress/app/http/requests/__init__.py +0 -0
  48. almasix-0.1.0/examples/progress/app/http/requests/store_item_request.py +23 -0
  49. almasix-0.1.0/examples/progress/app/models/__init__.py +0 -0
  50. almasix-0.1.0/examples/progress/app/models/comment.py +17 -0
  51. almasix-0.1.0/examples/progress/app/models/post.py +41 -0
  52. almasix-0.1.0/examples/progress/app/models/role.py +16 -0
  53. almasix-0.1.0/examples/progress/app/models/user.py +42 -0
  54. almasix-0.1.0/examples/progress/app/policies/__init__.py +1 -0
  55. almasix-0.1.0/examples/progress/app/policies/post_policy.py +43 -0
  56. almasix-0.1.0/examples/progress/app/providers/__init__.py +0 -0
  57. almasix-0.1.0/examples/progress/app/providers/app_service_provider.py +21 -0
  58. almasix-0.1.0/examples/progress/app/support/__init__.py +0 -0
  59. almasix-0.1.0/examples/progress/app/support/demo_db.py +25 -0
  60. almasix-0.1.0/examples/progress/app/support/page.py +32 -0
  61. almasix-0.1.0/examples/progress/app/view/__init__.py +0 -0
  62. almasix-0.1.0/examples/progress/app/view/components/__init__.py +0 -0
  63. almasix-0.1.0/examples/progress/app/view/components/status_badge.py +15 -0
  64. almasix-0.1.0/examples/progress/bootstrap/__init__.py +0 -0
  65. almasix-0.1.0/examples/progress/bootstrap/app.py +58 -0
  66. almasix-0.1.0/examples/progress/config/__init__.py +0 -0
  67. almasix-0.1.0/examples/progress/config/app.py +18 -0
  68. almasix-0.1.0/examples/progress/config/auth.py +37 -0
  69. almasix-0.1.0/examples/progress/config/cache.py +26 -0
  70. almasix-0.1.0/examples/progress/config/database.py +55 -0
  71. almasix-0.1.0/examples/progress/config/filesystems.py +35 -0
  72. almasix-0.1.0/examples/progress/config/hashing.py +16 -0
  73. almasix-0.1.0/examples/progress/config/http.py +12 -0
  74. almasix-0.1.0/examples/progress/config/logging.py +32 -0
  75. almasix-0.1.0/examples/progress/config/loupe.py +16 -0
  76. almasix-0.1.0/examples/progress/config/mail.py +23 -0
  77. almasix-0.1.0/examples/progress/config/notifications.py +11 -0
  78. almasix-0.1.0/examples/progress/config/queue.py +25 -0
  79. almasix-0.1.0/examples/progress/config/redis.py +17 -0
  80. almasix-0.1.0/examples/progress/config/session.py +13 -0
  81. almasix-0.1.0/examples/progress/database/__init__.py +0 -0
  82. almasix-0.1.0/examples/progress/database/migrations/.gitkeep +0 -0
  83. almasix-0.1.0/examples/progress/database/migrations/2026_09_04_060301_create_demo_tables.py +60 -0
  84. almasix-0.1.0/examples/progress/database/migrations/2026_09_04_065323_add_slug_to_posts_table.py +25 -0
  85. almasix-0.1.0/examples/progress/database/migrations/2026_09_04_163000_add_auth_columns_to_users_table.py +27 -0
  86. almasix-0.1.0/examples/progress/database/migrations/2026_09_08_090000_create_queue_tables.py +37 -0
  87. almasix-0.1.0/examples/progress/database/seeders/__init__.py +0 -0
  88. almasix-0.1.0/examples/progress/database/seeders/database_seeder.py +14 -0
  89. almasix-0.1.0/examples/progress/database/seeders/demo_seeder.py +57 -0
  90. almasix-0.1.0/examples/progress/lang/en/messages.py +7 -0
  91. almasix-0.1.0/examples/progress/lang/en/validation.py +6 -0
  92. almasix-0.1.0/examples/progress/lang/en.json +3 -0
  93. almasix-0.1.0/examples/progress/lang/sw/messages.py +7 -0
  94. almasix-0.1.0/examples/progress/lang/sw.json +3 -0
  95. almasix-0.1.0/examples/progress/package.json +14 -0
  96. almasix-0.1.0/examples/progress/public/.gitkeep +0 -0
  97. almasix-0.1.0/examples/progress/public/css/app.css +448 -0
  98. almasix-0.1.0/examples/progress/public/images/almasix-banner.svg +30 -0
  99. almasix-0.1.0/examples/progress/public/images/favicon.svg +35 -0
  100. almasix-0.1.0/examples/progress/public/js/app.js +40 -0
  101. almasix-0.1.0/examples/progress/pyproject.toml +20 -0
  102. almasix-0.1.0/examples/progress/resources/css/app.css +1 -0
  103. almasix-0.1.0/examples/progress/resources/js/app.js +3 -0
  104. almasix-0.1.0/examples/progress/resources/views/.gitkeep +0 -0
  105. almasix-0.1.0/examples/progress/resources/views/auth/confirm_password.prism.html +21 -0
  106. almasix-0.1.0/examples/progress/resources/views/auth/login.prism.html +33 -0
  107. almasix-0.1.0/examples/progress/resources/views/auth/settings.prism.html +11 -0
  108. almasix-0.1.0/examples/progress/resources/views/auth/verify_email.prism.html +17 -0
  109. almasix-0.1.0/examples/progress/resources/views/components/api_link.prism.html +5 -0
  110. almasix-0.1.0/examples/progress/resources/views/components/button.prism.html +2 -0
  111. almasix-0.1.0/examples/progress/resources/views/components/card.prism.html +8 -0
  112. almasix-0.1.0/examples/progress/resources/views/components/demo_form.prism.html +4 -0
  113. almasix-0.1.0/examples/progress/resources/views/components/demo_input.prism.html +6 -0
  114. almasix-0.1.0/examples/progress/resources/views/components/feature.prism.html +5 -0
  115. almasix-0.1.0/examples/progress/resources/views/components/mail/button.prism.html +2 -0
  116. almasix-0.1.0/examples/progress/resources/views/components/mail/panel.prism.html +4 -0
  117. almasix-0.1.0/examples/progress/resources/views/components/mail/subcopy.prism.html +2 -0
  118. almasix-0.1.0/examples/progress/resources/views/components/milestone_row.prism.html +7 -0
  119. almasix-0.1.0/examples/progress/resources/views/components/status_badge.prism.html +2 -0
  120. almasix-0.1.0/examples/progress/resources/views/errors/404.prism.html +22 -0
  121. almasix-0.1.0/examples/progress/resources/views/errors/419.prism.html +22 -0
  122. almasix-0.1.0/examples/progress/resources/views/errors/429.prism.html +22 -0
  123. almasix-0.1.0/examples/progress/resources/views/errors/500.prism.html +22 -0
  124. almasix-0.1.0/examples/progress/resources/views/errors/503.prism.html +22 -0
  125. almasix-0.1.0/examples/progress/resources/views/layouts/app.prism.html +38 -0
  126. almasix-0.1.0/examples/progress/resources/views/mail/.gitkeep +0 -0
  127. almasix-0.1.0/examples/progress/resources/views/mail/themes/default.prism.html +21 -0
  128. almasix-0.1.0/examples/progress/resources/views/mail/welcome.prism.html +7 -0
  129. almasix-0.1.0/examples/progress/resources/views/partials/nav.prism.html +25 -0
  130. almasix-0.1.0/examples/progress/resources/views/progress.prism.html +33 -0
  131. almasix-0.1.0/examples/progress/resources/views/showcase.prism.html +71 -0
  132. almasix-0.1.0/examples/progress/resources/views/welcome.prism.html +65 -0
  133. almasix-0.1.0/examples/progress/routes/__init__.py +0 -0
  134. almasix-0.1.0/examples/progress/routes/api.py +58 -0
  135. almasix-0.1.0/examples/progress/routes/console.py +29 -0
  136. almasix-0.1.0/examples/progress/routes/web.py +34 -0
  137. almasix-0.1.0/examples/progress/smith +13 -0
  138. almasix-0.1.0/examples/progress/storage/app/.gitkeep +0 -0
  139. almasix-0.1.0/examples/progress/storage/app/public/.gitkeep +0 -0
  140. almasix-0.1.0/examples/progress/storage/framework/.gitkeep +0 -0
  141. almasix-0.1.0/examples/progress/storage/logs/.gitkeep +0 -0
  142. almasix-0.1.0/examples/progress/vite.config.js +21 -0
  143. almasix-0.1.0/pyproject.toml +150 -0
  144. almasix-0.1.0/smith +23 -0
  145. almasix-0.1.0/src/almasix/__init__.py +16 -0
  146. almasix-0.1.0/src/almasix/auth/__init__.py +99 -0
  147. almasix-0.1.0/src/almasix/auth/access/__init__.py +34 -0
  148. almasix-0.1.0/src/almasix/auth/access/authorizable.py +27 -0
  149. almasix-0.1.0/src/almasix/auth/access/exceptions.py +36 -0
  150. almasix-0.1.0/src/almasix/auth/access/facade.py +118 -0
  151. almasix-0.1.0/src/almasix/auth/access/gate.py +531 -0
  152. almasix-0.1.0/src/almasix/auth/access/handles.py +38 -0
  153. almasix-0.1.0/src/almasix/auth/access/helpers.py +56 -0
  154. almasix-0.1.0/src/almasix/auth/access/middleware.py +63 -0
  155. almasix-0.1.0/src/almasix/auth/access/policies.py +12 -0
  156. almasix-0.1.0/src/almasix/auth/access/requests.py +53 -0
  157. almasix-0.1.0/src/almasix/auth/access/response.py +84 -0
  158. almasix-0.1.0/src/almasix/auth/authenticatable.py +47 -0
  159. almasix-0.1.0/src/almasix/auth/contracts.py +64 -0
  160. almasix-0.1.0/src/almasix/auth/cookies.py +83 -0
  161. almasix-0.1.0/src/almasix/auth/events.py +81 -0
  162. almasix-0.1.0/src/almasix/auth/guard.py +544 -0
  163. almasix-0.1.0/src/almasix/auth/middleware.py +260 -0
  164. almasix-0.1.0/src/almasix/auth/passwords.py +329 -0
  165. almasix-0.1.0/src/almasix/auth/provider.py +72 -0
  166. almasix-0.1.0/src/almasix/auth/providers.py +158 -0
  167. almasix-0.1.0/src/almasix/cache/__init__.py +28 -0
  168. almasix-0.1.0/src/almasix/cache/drivers/__init__.py +10 -0
  169. almasix-0.1.0/src/almasix/cache/drivers/array.py +93 -0
  170. almasix-0.1.0/src/almasix/cache/drivers/database.py +224 -0
  171. almasix-0.1.0/src/almasix/cache/drivers/file.py +179 -0
  172. almasix-0.1.0/src/almasix/cache/drivers/redis.py +214 -0
  173. almasix-0.1.0/src/almasix/cache/helpers.py +68 -0
  174. almasix-0.1.0/src/almasix/cache/locks.py +369 -0
  175. almasix-0.1.0/src/almasix/cache/manager.py +238 -0
  176. almasix-0.1.0/src/almasix/cache/provider.py +31 -0
  177. almasix-0.1.0/src/almasix/cache/schema.py +40 -0
  178. almasix-0.1.0/src/almasix/cache/store.py +215 -0
  179. almasix-0.1.0/src/almasix/client/__init__.py +53 -0
  180. almasix-0.1.0/src/almasix/client/arity.py +21 -0
  181. almasix-0.1.0/src/almasix/client/batch.py +173 -0
  182. almasix-0.1.0/src/almasix/client/events.py +34 -0
  183. almasix-0.1.0/src/almasix/client/exceptions.py +75 -0
  184. almasix-0.1.0/src/almasix/client/facade.py +387 -0
  185. almasix-0.1.0/src/almasix/client/factory.py +268 -0
  186. almasix-0.1.0/src/almasix/client/helpers.py +42 -0
  187. almasix-0.1.0/src/almasix/client/pending.py +644 -0
  188. almasix-0.1.0/src/almasix/client/pool.py +118 -0
  189. almasix-0.1.0/src/almasix/client/provider.py +23 -0
  190. almasix-0.1.0/src/almasix/client/request.py +76 -0
  191. almasix-0.1.0/src/almasix/client/response.py +254 -0
  192. almasix-0.1.0/src/almasix/client/uri_template.py +156 -0
  193. almasix-0.1.0/src/almasix/config/__init__.py +36 -0
  194. almasix-0.1.0/src/almasix/config/env.py +56 -0
  195. almasix-0.1.0/src/almasix/config/repository.py +77 -0
  196. almasix-0.1.0/src/almasix/console/__init__.py +26 -0
  197. almasix-0.1.0/src/almasix/console/command.py +388 -0
  198. almasix-0.1.0/src/almasix/console/commands/__init__.py +1 -0
  199. almasix-0.1.0/src/almasix/console/commands/database.py +279 -0
  200. almasix-0.1.0/src/almasix/console/commands/db.py +78 -0
  201. almasix-0.1.0/src/almasix/console/commands/db_introspection.py +515 -0
  202. almasix-0.1.0/src/almasix/console/commands/docs.py +62 -0
  203. almasix-0.1.0/src/almasix/console/commands/env.py +140 -0
  204. almasix-0.1.0/src/almasix/console/commands/inspire.py +22 -0
  205. almasix-0.1.0/src/almasix/console/commands/introspection.py +378 -0
  206. almasix-0.1.0/src/almasix/console/commands/key_generate.py +34 -0
  207. almasix-0.1.0/src/almasix/console/commands/listing.py +78 -0
  208. almasix-0.1.0/src/almasix/console/commands/maintenance.py +38 -0
  209. almasix-0.1.0/src/almasix/console/commands/make.py +412 -0
  210. almasix-0.1.0/src/almasix/console/commands/make_event.py +102 -0
  211. almasix-0.1.0/src/almasix/console/commands/make_policy.py +60 -0
  212. almasix-0.1.0/src/almasix/console/commands/model_prune.py +96 -0
  213. almasix-0.1.0/src/almasix/console/commands/model_show.py +368 -0
  214. almasix-0.1.0/src/almasix/console/commands/optimize.py +132 -0
  215. almasix-0.1.0/src/almasix/console/commands/publishing.py +92 -0
  216. almasix-0.1.0/src/almasix/console/commands/queue_failed.py +231 -0
  217. almasix-0.1.0/src/almasix/console/commands/queue_ops.py +217 -0
  218. almasix-0.1.0/src/almasix/console/commands/queue_work.py +54 -0
  219. almasix-0.1.0/src/almasix/console/commands/runtime.py +90 -0
  220. almasix-0.1.0/src/almasix/console/commands/schedule.py +222 -0
  221. almasix-0.1.0/src/almasix/console/commands/storage_link.py +88 -0
  222. almasix-0.1.0/src/almasix/console/commands/stub_publish.py +28 -0
  223. almasix-0.1.0/src/almasix/console/commands/vendor.py +106 -0
  224. almasix-0.1.0/src/almasix/console/commands/version.py +16 -0
  225. almasix-0.1.0/src/almasix/console/confirmable.py +46 -0
  226. almasix-0.1.0/src/almasix/console/display.py +92 -0
  227. almasix-0.1.0/src/almasix/console/events.py +32 -0
  228. almasix-0.1.0/src/almasix/console/exceptions.py +26 -0
  229. almasix-0.1.0/src/almasix/console/facade.py +268 -0
  230. almasix-0.1.0/src/almasix/console/front_door.py +84 -0
  231. almasix-0.1.0/src/almasix/console/help.py +93 -0
  232. almasix-0.1.0/src/almasix/console/isolation.py +42 -0
  233. almasix-0.1.0/src/almasix/console/kernel.py +481 -0
  234. almasix-0.1.0/src/almasix/console/mutex.py +55 -0
  235. almasix-0.1.0/src/almasix/console/output.py +67 -0
  236. almasix-0.1.0/src/almasix/console/prompts/__init__.py +44 -0
  237. almasix-0.1.0/src/almasix/console/prompts/busy.py +132 -0
  238. almasix-0.1.0/src/almasix/console/prompts/choices.py +299 -0
  239. almasix-0.1.0/src/almasix/console/prompts/confirm.py +85 -0
  240. almasix-0.1.0/src/almasix/console/prompts/inputs.py +190 -0
  241. almasix-0.1.0/src/almasix/console/prompts/messages.py +61 -0
  242. almasix-0.1.0/src/almasix/console/prompts/style.py +52 -0
  243. almasix-0.1.0/src/almasix/console/prompts/types.py +36 -0
  244. almasix-0.1.0/src/almasix/console/provider.py +26 -0
  245. almasix-0.1.0/src/almasix/console/queued.py +35 -0
  246. almasix-0.1.0/src/almasix/console/repl.py +407 -0
  247. almasix-0.1.0/src/almasix/console/scheduling/__init__.py +76 -0
  248. almasix-0.1.0/src/almasix/console/scheduling/cron.py +149 -0
  249. almasix-0.1.0/src/almasix/console/scheduling/event.py +594 -0
  250. almasix-0.1.0/src/almasix/console/scheduling/events.py +62 -0
  251. almasix-0.1.0/src/almasix/console/scheduling/mail.py +38 -0
  252. almasix-0.1.0/src/almasix/console/scheduling/runner.py +450 -0
  253. almasix-0.1.0/src/almasix/console/scheduling/schedule.py +258 -0
  254. almasix-0.1.0/src/almasix/console/stub.py +76 -0
  255. almasix-0.1.0/src/almasix/console/stubs/cast.inbound.stub +20 -0
  256. almasix-0.1.0/src/almasix/console/stubs/cast.stub +20 -0
  257. almasix-0.1.0/src/almasix/console/stubs/class.invokable.stub +10 -0
  258. almasix-0.1.0/src/almasix/console/stubs/class.stub +7 -0
  259. almasix-0.1.0/src/almasix/console/stubs/command.stub +14 -0
  260. almasix-0.1.0/src/almasix/console/stubs/component-class.stub +15 -0
  261. almasix-0.1.0/src/almasix/console/stubs/component.stub +5 -0
  262. almasix-0.1.0/src/almasix/console/stubs/controller.stub +13 -0
  263. almasix-0.1.0/src/almasix/console/stubs/enum.backed.stub +11 -0
  264. almasix-0.1.0/src/almasix/console/stubs/enum.stub +11 -0
  265. almasix-0.1.0/src/almasix/console/stubs/event.stub +10 -0
  266. almasix-0.1.0/src/almasix/console/stubs/exception-render-report.stub +18 -0
  267. almasix-0.1.0/src/almasix/console/stubs/exception-render.stub +14 -0
  268. almasix-0.1.0/src/almasix/console/stubs/exception-report.stub +11 -0
  269. almasix-0.1.0/src/almasix/console/stubs/exception.stub +7 -0
  270. almasix-0.1.0/src/almasix/console/stubs/interface.stub +10 -0
  271. almasix-0.1.0/src/almasix/console/stubs/job.queued.stub +14 -0
  272. almasix-0.1.0/src/almasix/console/stubs/job.stub +14 -0
  273. almasix-0.1.0/src/almasix/console/stubs/listener-duck.stub +10 -0
  274. almasix-0.1.0/src/almasix/console/stubs/listener-queued-duck.stub +11 -0
  275. almasix-0.1.0/src/almasix/console/stubs/listener-queued.stub +12 -0
  276. almasix-0.1.0/src/almasix/console/stubs/listener.stub +11 -0
  277. almasix-0.1.0/src/almasix/console/stubs/mail.stub +18 -0
  278. almasix-0.1.0/src/almasix/console/stubs/markdown-mail.stub +18 -0
  279. almasix-0.1.0/src/almasix/console/stubs/markdown-notification.stub +35 -0
  280. almasix-0.1.0/src/almasix/console/stubs/markdown.stub +9 -0
  281. almasix-0.1.0/src/almasix/console/stubs/middleware.stub +19 -0
  282. almasix-0.1.0/src/almasix/console/stubs/migration.create.stub +21 -0
  283. almasix-0.1.0/src/almasix/console/stubs/migration.stub +15 -0
  284. almasix-0.1.0/src/almasix/console/stubs/migration.update.stub +21 -0
  285. almasix-0.1.0/src/almasix/console/stubs/model.stub +11 -0
  286. almasix-0.1.0/src/almasix/console/stubs/notification.stub +26 -0
  287. almasix-0.1.0/src/almasix/console/stubs/observer.plain.stub +29 -0
  288. almasix-0.1.0/src/almasix/console/stubs/observer.stub +32 -0
  289. almasix-0.1.0/src/almasix/console/stubs/policy-resource.stub +30 -0
  290. almasix-0.1.0/src/almasix/console/stubs/policy.plain.stub +11 -0
  291. almasix-0.1.0/src/almasix/console/stubs/policy.stub +31 -0
  292. almasix-0.1.0/src/almasix/console/stubs/provider.stub +15 -0
  293. almasix-0.1.0/src/almasix/console/stubs/request.stub +17 -0
  294. almasix-0.1.0/src/almasix/console/stubs/rule.implicit.stub +37 -0
  295. almasix-0.1.0/src/almasix/console/stubs/rule.stub +33 -0
  296. almasix-0.1.0/src/almasix/console/stubs/seeder.stub +12 -0
  297. almasix-0.1.0/src/almasix/console/stubs/view.stub +4 -0
  298. almasix-0.1.0/src/almasix/debug.py +466 -0
  299. almasix-0.1.0/src/almasix/encryption/__init__.py +23 -0
  300. almasix-0.1.0/src/almasix/encryption/cipher.py +57 -0
  301. almasix-0.1.0/src/almasix/encryption/encrypter.py +78 -0
  302. almasix-0.1.0/src/almasix/encryption/exceptions.py +11 -0
  303. almasix-0.1.0/src/almasix/encryption/facade.py +41 -0
  304. almasix-0.1.0/src/almasix/encryption/helpers.py +41 -0
  305. almasix-0.1.0/src/almasix/encryption/provider.py +30 -0
  306. almasix-0.1.0/src/almasix/events/__init__.py +25 -0
  307. almasix-0.1.0/src/almasix/events/broadcast.py +17 -0
  308. almasix-0.1.0/src/almasix/events/dispatcher.py +220 -0
  309. almasix-0.1.0/src/almasix/events/facade.py +74 -0
  310. almasix-0.1.0/src/almasix/events/helpers.py +39 -0
  311. almasix-0.1.0/src/almasix/events/provider.py +36 -0
  312. almasix-0.1.0/src/almasix/events/queued.py +94 -0
  313. almasix-0.1.0/src/almasix/exceptions/__init__.py +25 -0
  314. almasix-0.1.0/src/almasix/exceptions/debug.py +115 -0
  315. almasix-0.1.0/src/almasix/exceptions/handler.py +241 -0
  316. almasix-0.1.0/src/almasix/exceptions/mapping.py +98 -0
  317. almasix-0.1.0/src/almasix/exceptions/provider.py +55 -0
  318. almasix-0.1.0/src/almasix/exceptions/publish.py +55 -0
  319. almasix-0.1.0/src/almasix/exceptions/views/bootstrap/errors/404.prism.html +17 -0
  320. almasix-0.1.0/src/almasix/exceptions/views/bootstrap/errors/419.prism.html +17 -0
  321. almasix-0.1.0/src/almasix/exceptions/views/bootstrap/errors/429.prism.html +17 -0
  322. almasix-0.1.0/src/almasix/exceptions/views/bootstrap/errors/500.prism.html +17 -0
  323. almasix-0.1.0/src/almasix/exceptions/views/bootstrap/errors/503.prism.html +17 -0
  324. almasix-0.1.0/src/almasix/exceptions/views/default/errors/404.prism.html +22 -0
  325. almasix-0.1.0/src/almasix/exceptions/views/default/errors/419.prism.html +22 -0
  326. almasix-0.1.0/src/almasix/exceptions/views/default/errors/429.prism.html +22 -0
  327. almasix-0.1.0/src/almasix/exceptions/views/default/errors/500.prism.html +22 -0
  328. almasix-0.1.0/src/almasix/exceptions/views/default/errors/503.prism.html +22 -0
  329. almasix-0.1.0/src/almasix/exceptions/views/tailwind/errors/404.prism.html +15 -0
  330. almasix-0.1.0/src/almasix/exceptions/views/tailwind/errors/419.prism.html +15 -0
  331. almasix-0.1.0/src/almasix/exceptions/views/tailwind/errors/429.prism.html +15 -0
  332. almasix-0.1.0/src/almasix/exceptions/views/tailwind/errors/500.prism.html +15 -0
  333. almasix-0.1.0/src/almasix/exceptions/views/tailwind/errors/503.prism.html +15 -0
  334. almasix-0.1.0/src/almasix/filesystem/__init__.py +9 -0
  335. almasix-0.1.0/src/almasix/filesystem/adapter.py +76 -0
  336. almasix-0.1.0/src/almasix/filesystem/drivers/__init__.py +8 -0
  337. almasix-0.1.0/src/almasix/filesystem/drivers/local.py +184 -0
  338. almasix-0.1.0/src/almasix/filesystem/drivers/memory.py +147 -0
  339. almasix-0.1.0/src/almasix/filesystem/drivers/s3.py +186 -0
  340. almasix-0.1.0/src/almasix/filesystem/helpers.py +54 -0
  341. almasix-0.1.0/src/almasix/filesystem/manager.py +156 -0
  342. almasix-0.1.0/src/almasix/filesystem/provider.py +40 -0
  343. almasix-0.1.0/src/almasix/filesystem/storage.py +147 -0
  344. almasix-0.1.0/src/almasix/framework/__init__.py +25 -0
  345. almasix-0.1.0/src/almasix/framework/application.py +205 -0
  346. almasix-0.1.0/src/almasix/framework/bootstrap.py +174 -0
  347. almasix-0.1.0/src/almasix/framework/container.py +125 -0
  348. almasix-0.1.0/src/almasix/framework/helpers.py +39 -0
  349. almasix-0.1.0/src/almasix/hashing/__init__.py +137 -0
  350. almasix-0.1.0/src/almasix/hashing/argon.py +79 -0
  351. almasix-0.1.0/src/almasix/hashing/hasher.py +64 -0
  352. almasix-0.1.0/src/almasix/http/__init__.py +76 -0
  353. almasix-0.1.0/src/almasix/http/controller.py +9 -0
  354. almasix-0.1.0/src/almasix/http/exceptions.py +65 -0
  355. almasix-0.1.0/src/almasix/http/helpers.py +50 -0
  356. almasix-0.1.0/src/almasix/http/kernel.py +418 -0
  357. almasix-0.1.0/src/almasix/http/middleware.py +20 -0
  358. almasix-0.1.0/src/almasix/http/request.py +447 -0
  359. almasix-0.1.0/src/almasix/http/response.py +269 -0
  360. almasix-0.1.0/src/almasix/http/subpath.py +37 -0
  361. almasix-0.1.0/src/almasix/http/trust.py +183 -0
  362. almasix-0.1.0/src/almasix/installer/__init__.py +6 -0
  363. almasix-0.1.0/src/almasix/installer/cli.py +63 -0
  364. almasix-0.1.0/src/almasix/installer/scaffold.py +933 -0
  365. almasix-0.1.0/src/almasix/log/__init__.py +8 -0
  366. almasix-0.1.0/src/almasix/log/helpers.py +84 -0
  367. almasix-0.1.0/src/almasix/log/manager.py +135 -0
  368. almasix-0.1.0/src/almasix/log/provider.py +18 -0
  369. almasix-0.1.0/src/almasix/mail/__init__.py +32 -0
  370. almasix-0.1.0/src/almasix/mail/helpers.py +55 -0
  371. almasix-0.1.0/src/almasix/mail/jobs.py +126 -0
  372. almasix-0.1.0/src/almasix/mail/mailable.py +129 -0
  373. almasix-0.1.0/src/almasix/mail/mailer.py +278 -0
  374. almasix-0.1.0/src/almasix/mail/markdown.py +187 -0
  375. almasix-0.1.0/src/almasix/mail/message.py +40 -0
  376. almasix-0.1.0/src/almasix/mail/provider.py +29 -0
  377. almasix-0.1.0/src/almasix/mail/testing.py +97 -0
  378. almasix-0.1.0/src/almasix/mail/transport.py +14 -0
  379. almasix-0.1.0/src/almasix/mail/transports/__init__.py +9 -0
  380. almasix-0.1.0/src/almasix/mail/transports/array.py +26 -0
  381. almasix-0.1.0/src/almasix/mail/transports/log.py +29 -0
  382. almasix-0.1.0/src/almasix/mail/transports/smtp.py +105 -0
  383. almasix-0.1.0/src/almasix/notifications/__init__.py +41 -0
  384. almasix-0.1.0/src/almasix/notifications/channels.py +95 -0
  385. almasix-0.1.0/src/almasix/notifications/database.py +86 -0
  386. almasix-0.1.0/src/almasix/notifications/helpers.py +33 -0
  387. almasix-0.1.0/src/almasix/notifications/jobs.py +84 -0
  388. almasix-0.1.0/src/almasix/notifications/messages.py +95 -0
  389. almasix-0.1.0/src/almasix/notifications/notifiable.py +51 -0
  390. almasix-0.1.0/src/almasix/notifications/notification.py +48 -0
  391. almasix-0.1.0/src/almasix/notifications/provider.py +45 -0
  392. almasix-0.1.0/src/almasix/notifications/schema.py +23 -0
  393. almasix-0.1.0/src/almasix/notifications/sender.py +83 -0
  394. almasix-0.1.0/src/almasix/notifications/verification.py +142 -0
  395. almasix-0.1.0/src/almasix/orm/__init__.py +129 -0
  396. almasix-0.1.0/src/almasix/orm/attributes.py +170 -0
  397. almasix-0.1.0/src/almasix/orm/builder.py +1432 -0
  398. almasix-0.1.0/src/almasix/orm/casts.py +290 -0
  399. almasix-0.1.0/src/almasix/orm/collection.py +231 -0
  400. almasix-0.1.0/src/almasix/orm/connection.py +202 -0
  401. almasix-0.1.0/src/almasix/orm/dialects.py +113 -0
  402. almasix-0.1.0/src/almasix/orm/eager.py +238 -0
  403. almasix-0.1.0/src/almasix/orm/facade.py +87 -0
  404. almasix-0.1.0/src/almasix/orm/ids.py +83 -0
  405. almasix-0.1.0/src/almasix/orm/inflector.py +113 -0
  406. almasix-0.1.0/src/almasix/orm/migration.py +253 -0
  407. almasix-0.1.0/src/almasix/orm/model.py +1351 -0
  408. almasix-0.1.0/src/almasix/orm/morph.py +61 -0
  409. almasix-0.1.0/src/almasix/orm/pagination.py +90 -0
  410. almasix-0.1.0/src/almasix/orm/pivot.py +69 -0
  411. almasix-0.1.0/src/almasix/orm/provider.py +52 -0
  412. almasix-0.1.0/src/almasix/orm/pruning.py +76 -0
  413. almasix-0.1.0/src/almasix/orm/relations.py +1119 -0
  414. almasix-0.1.0/src/almasix/orm/schema.py +531 -0
  415. almasix-0.1.0/src/almasix/orm/seeder.py +308 -0
  416. almasix-0.1.0/src/almasix/orm/soft_deletes.py +84 -0
  417. almasix-0.1.0/src/almasix/prism/__init__.py +39 -0
  418. almasix-0.1.0/src/almasix/prism/attributes.py +46 -0
  419. almasix-0.1.0/src/almasix/prism/compiler.py +1215 -0
  420. almasix-0.1.0/src/almasix/prism/component.py +47 -0
  421. almasix-0.1.0/src/almasix/prism/engine.py +325 -0
  422. almasix-0.1.0/src/almasix/prism/escape.py +61 -0
  423. almasix-0.1.0/src/almasix/prism/helpers.py +95 -0
  424. almasix-0.1.0/src/almasix/prism/loop.py +65 -0
  425. almasix-0.1.0/src/almasix/prism/provider.py +28 -0
  426. almasix-0.1.0/src/almasix/prism/stacks.py +29 -0
  427. almasix-0.1.0/src/almasix/prism/xtags.py +173 -0
  428. almasix-0.1.0/src/almasix/providers/__init__.py +6 -0
  429. almasix-0.1.0/src/almasix/providers/foundation.py +102 -0
  430. almasix-0.1.0/src/almasix/providers/provider.py +78 -0
  431. almasix-0.1.0/src/almasix/py.typed +0 -0
  432. almasix-0.1.0/src/almasix/queue/__init__.py +19 -0
  433. almasix-0.1.0/src/almasix/queue/connections/__init__.py +7 -0
  434. almasix-0.1.0/src/almasix/queue/connections/database.py +203 -0
  435. almasix-0.1.0/src/almasix/queue/connections/redis.py +134 -0
  436. almasix-0.1.0/src/almasix/queue/connections/sync.py +43 -0
  437. almasix-0.1.0/src/almasix/queue/dispatcher.py +36 -0
  438. almasix-0.1.0/src/almasix/queue/events.py +18 -0
  439. almasix-0.1.0/src/almasix/queue/failed.py +135 -0
  440. almasix-0.1.0/src/almasix/queue/helpers.py +77 -0
  441. almasix-0.1.0/src/almasix/queue/job.py +123 -0
  442. almasix-0.1.0/src/almasix/queue/manager.py +53 -0
  443. almasix-0.1.0/src/almasix/queue/provider.py +38 -0
  444. almasix-0.1.0/src/almasix/queue/restart.py +49 -0
  445. almasix-0.1.0/src/almasix/queue/schema.py +36 -0
  446. almasix-0.1.0/src/almasix/queue/worker.py +178 -0
  447. almasix-0.1.0/src/almasix/redis/__init__.py +19 -0
  448. almasix-0.1.0/src/almasix/redis/facade.py +110 -0
  449. almasix-0.1.0/src/almasix/redis/helpers.py +46 -0
  450. almasix-0.1.0/src/almasix/redis/manager.py +76 -0
  451. almasix-0.1.0/src/almasix/redis/provider.py +32 -0
  452. almasix-0.1.0/src/almasix/routing/__init__.py +15 -0
  453. almasix-0.1.0/src/almasix/routing/router.py +195 -0
  454. almasix-0.1.0/src/almasix/routing/url.py +67 -0
  455. almasix-0.1.0/src/almasix/session/__init__.py +34 -0
  456. almasix-0.1.0/src/almasix/session/csrf.py +67 -0
  457. almasix-0.1.0/src/almasix/session/encrypt.py +19 -0
  458. almasix-0.1.0/src/almasix/session/encrypt_middleware.py +75 -0
  459. almasix-0.1.0/src/almasix/session/handlers.py +184 -0
  460. almasix-0.1.0/src/almasix/session/helpers.py +157 -0
  461. almasix-0.1.0/src/almasix/session/middleware.py +60 -0
  462. almasix-0.1.0/src/almasix/session/signing.py +59 -0
  463. almasix-0.1.0/src/almasix/session/store.py +83 -0
  464. almasix-0.1.0/src/almasix/smith/__init__.py +22 -0
  465. almasix-0.1.0/src/almasix/smith/cli.py +45 -0
  466. almasix-0.1.0/src/almasix/smith/lang_cmd.py +114 -0
  467. almasix-0.1.0/src/almasix/smith/make.py +230 -0
  468. almasix-0.1.0/src/almasix/smith/ports.py +43 -0
  469. almasix-0.1.0/src/almasix/support/__init__.py +123 -0
  470. almasix-0.1.0/src/almasix/support/arr.py +612 -0
  471. almasix-0.1.0/src/almasix/support/collection.py +1299 -0
  472. almasix-0.1.0/src/almasix/support/helpers.py +430 -0
  473. almasix-0.1.0/src/almasix/support/lazy.py +529 -0
  474. almasix-0.1.0/src/almasix/support/number.py +244 -0
  475. almasix-0.1.0/src/almasix/support/str.py +1102 -0
  476. almasix-0.1.0/src/almasix/translation/__init__.py +43 -0
  477. almasix-0.1.0/src/almasix/translation/dates.py +43 -0
  478. almasix-0.1.0/src/almasix/translation/helpers.py +127 -0
  479. almasix-0.1.0/src/almasix/translation/lang/en/auth.py +7 -0
  480. almasix-0.1.0/src/almasix/translation/lang/en/errors.py +9 -0
  481. almasix-0.1.0/src/almasix/translation/lang/en/pagination.py +6 -0
  482. almasix-0.1.0/src/almasix/translation/lang/en/passwords.py +9 -0
  483. almasix-0.1.0/src/almasix/translation/lang/en/validation.py +31 -0
  484. almasix-0.1.0/src/almasix/translation/loader.py +144 -0
  485. almasix-0.1.0/src/almasix/translation/locale.py +52 -0
  486. almasix-0.1.0/src/almasix/translation/middleware.py +82 -0
  487. almasix-0.1.0/src/almasix/translation/number.py +103 -0
  488. almasix-0.1.0/src/almasix/translation/plural.py +104 -0
  489. almasix-0.1.0/src/almasix/translation/provider.py +44 -0
  490. almasix-0.1.0/src/almasix/translation/translator.py +237 -0
  491. almasix-0.1.0/src/almasix/validation/__init__.py +13 -0
  492. almasix-0.1.0/src/almasix/validation/form_request.py +164 -0
  493. almasix-0.1.0/src/almasix/validation/helpers.py +93 -0
  494. almasix-0.1.0/src/almasix/validation/messages.py +153 -0
  495. almasix-0.1.0/tests/__init__.py +1 -0
  496. almasix-0.1.0/tests/bench/__init__.py +0 -0
  497. almasix-0.1.0/tests/bench/test_prism_bench.py +56 -0
  498. almasix-0.1.0/tests/conftest.py +42 -0
  499. almasix-0.1.0/tests/orm_support.py +34 -0
  500. almasix-0.1.0/tests/regression/__init__.py +1 -0
  501. almasix-0.1.0/tests/regression/test_m1_contracts.py +117 -0
  502. almasix-0.1.0/tests/regression/test_m2_contracts.py +98 -0
  503. almasix-0.1.0/tests/regression/test_m3_contracts.py +73 -0
  504. almasix-0.1.0/tests/regression/test_m4_contracts.py +40 -0
  505. almasix-0.1.0/tests/regression/test_m5_contracts.py +34 -0
  506. almasix-0.1.0/tests/smoke/__init__.py +1 -0
  507. almasix-0.1.0/tests/smoke/test_m0_smoke.py +89 -0
  508. almasix-0.1.0/tests/smoke/test_m10_smoke.py +44 -0
  509. almasix-0.1.0/tests/smoke/test_m11_smoke.py +49 -0
  510. almasix-0.1.0/tests/smoke/test_m12_smoke.py +50 -0
  511. almasix-0.1.0/tests/smoke/test_m13_smoke.py +52 -0
  512. almasix-0.1.0/tests/smoke/test_m14_smoke.py +15 -0
  513. almasix-0.1.0/tests/smoke/test_m15_smoke.py +64 -0
  514. almasix-0.1.0/tests/smoke/test_m16_smoke.py +45 -0
  515. almasix-0.1.0/tests/smoke/test_m17_smoke.py +65 -0
  516. almasix-0.1.0/tests/smoke/test_m18_smoke.py +51 -0
  517. almasix-0.1.0/tests/smoke/test_m19_smoke.py +60 -0
  518. almasix-0.1.0/tests/smoke/test_m1_smoke.py +61 -0
  519. almasix-0.1.0/tests/smoke/test_m20_smoke.py +52 -0
  520. almasix-0.1.0/tests/smoke/test_m2_smoke.py +179 -0
  521. almasix-0.1.0/tests/smoke/test_m30_smoke.py +140 -0
  522. almasix-0.1.0/tests/smoke/test_m31_smoke.py +247 -0
  523. almasix-0.1.0/tests/smoke/test_m3_smoke.py +186 -0
  524. almasix-0.1.0/tests/smoke/test_m40_smoke.py +112 -0
  525. almasix-0.1.0/tests/smoke/test_m41_smoke.py +113 -0
  526. almasix-0.1.0/tests/smoke/test_m49_smoke.py +110 -0
  527. almasix-0.1.0/tests/smoke/test_m4_smoke.py +100 -0
  528. almasix-0.1.0/tests/smoke/test_m50_smoke.py +307 -0
  529. almasix-0.1.0/tests/smoke/test_m5_smoke.py +123 -0
  530. almasix-0.1.0/tests/smoke/test_m6_smoke.py +106 -0
  531. almasix-0.1.0/tests/smoke/test_m7_smoke.py +94 -0
  532. almasix-0.1.0/tests/smoke/test_m8_smoke.py +92 -0
  533. almasix-0.1.0/tests/smoke/test_m9_smoke.py +120 -0
  534. almasix-0.1.0/tests/support.py +21 -0
  535. almasix-0.1.0/tests/support_redis.py +208 -0
  536. almasix-0.1.0/tests/test_bootstrap_middleware.py +181 -0
  537. almasix-0.1.0/tests/test_ci_coverage_fill.py +482 -0
  538. almasix-0.1.0/tests/test_cli.py +58 -0
  539. almasix-0.1.0/tests/test_coverage_100.py +563 -0
  540. almasix-0.1.0/tests/test_coverage_100_branches.py +373 -0
  541. almasix-0.1.0/tests/test_coverage_100_final.py +323 -0
  542. almasix-0.1.0/tests/test_coverage_100_orm.py +203 -0
  543. almasix-0.1.0/tests/test_coverage_edges.py +46 -0
  544. almasix-0.1.0/tests/test_coverage_repl_debug_fs.py +528 -0
  545. almasix-0.1.0/tests/test_coverage_to_98.py +671 -0
  546. almasix-0.1.0/tests/test_coverage_toward_100.py +142 -0
  547. almasix-0.1.0/tests/test_dd.py +135 -0
  548. almasix-0.1.0/tests/test_m10_filesystem.py +226 -0
  549. almasix-0.1.0/tests/test_m10_m13_coverage_fill.py +1079 -0
  550. almasix-0.1.0/tests/test_m10_m13_gap_fill.py +120 -0
  551. almasix-0.1.0/tests/test_m11_queue.py +366 -0
  552. almasix-0.1.0/tests/test_m12_coverage_fill.py +357 -0
  553. almasix-0.1.0/tests/test_m12_mail.py +256 -0
  554. almasix-0.1.0/tests/test_m13_notifications.py +200 -0
  555. almasix-0.1.0/tests/test_m14_coverage_fill.py +416 -0
  556. almasix-0.1.0/tests/test_m14_helpers_strings.py +258 -0
  557. almasix-0.1.0/tests/test_m15_cache.py +250 -0
  558. almasix-0.1.0/tests/test_m15_coverage_fill.py +566 -0
  559. almasix-0.1.0/tests/test_m16_redis.py +683 -0
  560. almasix-0.1.0/tests/test_m17_encryption.py +250 -0
  561. almasix-0.1.0/tests/test_m18_events.py +450 -0
  562. almasix-0.1.0/tests/test_m19_authorization.py +863 -0
  563. almasix-0.1.0/tests/test_m1_kernel.py +219 -0
  564. almasix-0.1.0/tests/test_m20_client.py +1142 -0
  565. almasix-0.1.0/tests/test_m20_parity.py +612 -0
  566. almasix-0.1.0/tests/test_m2_http.py +190 -0
  567. almasix-0.1.0/tests/test_m2_kernel_edges.py +174 -0
  568. almasix-0.1.0/tests/test_m2_polarity.py +113 -0
  569. almasix-0.1.0/tests/test_m2_request.py +175 -0
  570. almasix-0.1.0/tests/test_m2_request_edges.py +192 -0
  571. almasix-0.1.0/tests/test_m30_commands.py +69 -0
  572. almasix-0.1.0/tests/test_m30_console.py +732 -0
  573. almasix-0.1.0/tests/test_m30_db.py +191 -0
  574. almasix-0.1.0/tests/test_m30_db_introspection.py +537 -0
  575. almasix-0.1.0/tests/test_m30_env.py +194 -0
  576. almasix-0.1.0/tests/test_m30_generators.py +588 -0
  577. almasix-0.1.0/tests/test_m30_introspection.py +576 -0
  578. almasix-0.1.0/tests/test_m30_loupe.py +109 -0
  579. almasix-0.1.0/tests/test_m30_migration_commands.py +384 -0
  580. almasix-0.1.0/tests/test_m30_model_show.py +638 -0
  581. almasix-0.1.0/tests/test_m30_one_surface.py +431 -0
  582. almasix-0.1.0/tests/test_m30_optimize.py +163 -0
  583. almasix-0.1.0/tests/test_m30_queue_maintenance.py +588 -0
  584. almasix-0.1.0/tests/test_m30_queue_ops.py +542 -0
  585. almasix-0.1.0/tests/test_m30_stubs.py +272 -0
  586. almasix-0.1.0/tests/test_m30_vendor_publish.py +279 -0
  587. almasix-0.1.0/tests/test_m31_schedule_commands.py +271 -0
  588. almasix-0.1.0/tests/test_m31_scheduling.py +1228 -0
  589. almasix-0.1.0/tests/test_m3_make.py +118 -0
  590. almasix-0.1.0/tests/test_m3_urls.py +60 -0
  591. almasix-0.1.0/tests/test_m3_validation.py +225 -0
  592. almasix-0.1.0/tests/test_m40_casts.py +626 -0
  593. almasix-0.1.0/tests/test_m40_model_surface.py +589 -0
  594. almasix-0.1.0/tests/test_m40_prune_command.py +238 -0
  595. almasix-0.1.0/tests/test_m40_serialization.py +301 -0
  596. almasix-0.1.0/tests/test_m41_aggregates.py +272 -0
  597. almasix-0.1.0/tests/test_m41_existence.py +427 -0
  598. almasix-0.1.0/tests/test_m41_of_many.py +436 -0
  599. almasix-0.1.0/tests/test_m41_page_remainder.py +378 -0
  600. almasix-0.1.0/tests/test_m41_pivots.py +630 -0
  601. almasix-0.1.0/tests/test_m49_higher_order.py +215 -0
  602. almasix-0.1.0/tests/test_m49_lazy.py +441 -0
  603. almasix-0.1.0/tests/test_m4_coverage_edges.py +230 -0
  604. almasix-0.1.0/tests/test_m4_lang_cli.py +53 -0
  605. almasix-0.1.0/tests/test_m4_number.py +39 -0
  606. almasix-0.1.0/tests/test_m4_translation.py +134 -0
  607. almasix-0.1.0/tests/test_m50_arr_number.py +265 -0
  608. almasix-0.1.0/tests/test_m50_helpers.py +558 -0
  609. almasix-0.1.0/tests/test_m50_strings.py +293 -0
  610. almasix-0.1.0/tests/test_m5_coverage_edges.py +285 -0
  611. almasix-0.1.0/tests/test_m5_drivers.py +118 -0
  612. almasix-0.1.0/tests/test_m5_lazy_relations.py +93 -0
  613. almasix-0.1.0/tests/test_m5_migration_guess.py +102 -0
  614. almasix-0.1.0/tests/test_m5_migrations.py +87 -0
  615. almasix-0.1.0/tests/test_m5_orm.py +343 -0
  616. almasix-0.1.0/tests/test_m5_parity.py +680 -0
  617. almasix-0.1.0/tests/test_m5_remaining.py +265 -0
  618. almasix-0.1.0/tests/test_m5_schema_alter.py +136 -0
  619. almasix-0.1.0/tests/test_m5_seeders.py +374 -0
  620. almasix-0.1.0/tests/test_m5_upsert.py +102 -0
  621. almasix-0.1.0/tests/test_m5_visibility.py +83 -0
  622. almasix-0.1.0/tests/test_m5_where.py +83 -0
  623. almasix-0.1.0/tests/test_m6_caliburn.py +101 -0
  624. almasix-0.1.0/tests/test_m6_components.py +296 -0
  625. almasix-0.1.0/tests/test_m6_control.py +42 -0
  626. almasix-0.1.0/tests/test_m6_coverage_fill.py +383 -0
  627. almasix-0.1.0/tests/test_m6_full_coverage.py +282 -0
  628. almasix-0.1.0/tests/test_m6_parity_exhaust.py +193 -0
  629. almasix-0.1.0/tests/test_m6_stacks.py +126 -0
  630. almasix-0.1.0/tests/test_m6_view_helper.py +52 -0
  631. almasix-0.1.0/tests/test_m7_auth_parity.py +361 -0
  632. almasix-0.1.0/tests/test_m7_coverage_98.py +874 -0
  633. almasix-0.1.0/tests/test_m7_coverage_fill.py +347 -0
  634. almasix-0.1.0/tests/test_m7_exhaust.py +279 -0
  635. almasix-0.1.0/tests/test_m7_session_auth.py +118 -0
  636. almasix-0.1.0/tests/test_m8_coverage.py +259 -0
  637. almasix-0.1.0/tests/test_m8_errors.py +464 -0
  638. almasix-0.1.0/tests/test_m8_final_coverage.py +155 -0
  639. almasix-0.1.0/tests/test_m9_console.py +112 -0
  640. almasix-0.1.0/tests/test_m9_coverage_fill.py +590 -0
  641. almasix-0.1.0/tests/test_m9_display.py +103 -0
  642. almasix-0.1.0/tests/test_m9_prompts.py +155 -0
  643. almasix-0.1.0/tests/test_m9_prompts_coverage.py +347 -0
  644. almasix-0.1.0/tests/test_m9_prompts_driven.py +239 -0
  645. almasix-0.1.0/tests/test_ports.py +89 -0
  646. almasix-0.1.0/tests/test_smoke.py +32 -0
  647. almasix-0.1.0/tests/test_subpath_mount.py +57 -0
  648. almasix-0.1.0/tests/test_support_collection.py +475 -0
  649. almasix-0.1.0/tests/test_trust.py +130 -0
@@ -0,0 +1,54 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ dist/
9
+ wheels/
10
+ *.egg-info/
11
+ .eggs/
12
+ *.egg
13
+
14
+ # Virtualenvs
15
+ .venv/
16
+ venv/
17
+ ENV/
18
+
19
+ # Tooling
20
+ .pytest_cache/
21
+ .ruff_cache/
22
+ .mypy_cache/
23
+ .coverage
24
+ coverage.xml
25
+ htmlcov/
26
+ .tox/
27
+ .nox/
28
+
29
+ # Docs site (Astro / Starlight)
30
+ node_modules/
31
+ website/dist/
32
+ website/.astro/
33
+
34
+ # Env / local
35
+ .env
36
+ .env.*
37
+ !.env.example
38
+
39
+ # IDE
40
+ .idea/
41
+ .vscode/
42
+ *.swp
43
+ *.swo
44
+
45
+ # OS
46
+ .DS_Store
47
+ Thumbs.db
48
+
49
+ # Prism compiled views (future)
50
+ storage/framework/views/
51
+ .prism_cache/
52
+
53
+ # File cache store written by the examples at runtime
54
+ **/storage/framework/cache/data/
almasix-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Almasix Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
almasix-0.1.0/Makefile ADDED
@@ -0,0 +1,38 @@
1
+ .PHONY: help smoke regression test test-cov test-cov-prism lint docs docs-build
2
+
3
+ PYTHON ?= .venv/bin/python
4
+ PYTEST ?= $(PYTHON) -m pytest
5
+
6
+ help:
7
+ @echo "make smoke - milestone smoke gate (no coverage)"
8
+ @echo "make regression - smoke + contract regression tests (no coverage)"
9
+ @echo "make test - full unit + smoke suite (no coverage)"
10
+ @echo "make test-cov - full suite with coverage fail-under 98% (aim 100%)"
11
+ @echo "make test-cov-prism - M6 Prism package coverage fail-under 100%"
12
+ @echo "make lint - ruff check"
13
+ @echo "make docs - Starlight docs site (dev server)"
14
+ @echo "make docs-build - build Starlight docs site"
15
+
16
+ smoke:
17
+ $(PYTEST) -q tests/smoke -m smoke
18
+
19
+ regression:
20
+ $(PYTEST) -q -m regression
21
+
22
+ test:
23
+ $(PYTEST) -q
24
+
25
+ test-cov:
26
+ $(PYTEST) -q --cov=almasix --cov-report=term-missing --cov-report=xml
27
+
28
+ test-cov-prism:
29
+ $(PYTEST) -q tests/test_m6_*.py tests/smoke/test_m6_smoke.py --cov=almasix.prism --cov-report=term-missing --cov-fail-under=100
30
+
31
+ lint:
32
+ $(PYTHON) -m ruff check src tests
33
+
34
+ docs:
35
+ cd website && (npx astro dev stop >/dev/null 2>&1 || true) && npm run dev
36
+
37
+ docs-build:
38
+ cd website && npm run build
almasix-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,339 @@
1
+ Metadata-Version: 2.5
2
+ Name: almasix
3
+ Version: 0.1.0
4
+ Summary: Laravel-inspired Python web framework with Adonis-class DX on FastAPI/Starlette
5
+ Project-URL: Homepage, https://almasix-dev.github.io/almasix
6
+ Project-URL: Documentation, https://almasix-dev.github.io/almasix
7
+ Project-URL: Repository, https://github.com/almasix-dev/almasix
8
+ Project-URL: Issues, https://github.com/almasix-dev/almasix/issues
9
+ Author: Almasix Contributors
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ Keywords: adonis,almasix,fastapi,framework,laravel,web
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Environment :: Web Environment
15
+ Classifier: Framework :: FastAPI
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Topic :: Internet :: WWW/HTTP
23
+ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
24
+ Classifier: Typing :: Typed
25
+ Requires-Python: >=3.11
26
+ Requires-Dist: aiosqlite>=0.20
27
+ Requires-Dist: babel>=2.14
28
+ Requires-Dist: bcrypt>=4.0
29
+ Requires-Dist: fastapi>=0.115.0
30
+ Requires-Dist: httpx>=0.27.0
31
+ Requires-Dist: prompt-toolkit>=3.0
32
+ Requires-Dist: pydantic-settings>=2.0
33
+ Requires-Dist: pydantic>=2.0
34
+ Requires-Dist: python-dotenv>=1.0
35
+ Requires-Dist: python-multipart>=0.0.9
36
+ Requires-Dist: rich>=13.0
37
+ Requires-Dist: sqlalchemy[asyncio]>=2.0
38
+ Requires-Dist: typer>=0.12.0
39
+ Requires-Dist: uvicorn[standard]>=0.32.0
40
+ Provides-Extra: argon2
41
+ Requires-Dist: argon2-cffi>=23.0; extra == 'argon2'
42
+ Provides-Extra: db
43
+ Requires-Dist: aiomysql>=0.2; extra == 'db'
44
+ Requires-Dist: aioodbc>=0.5.0; extra == 'db'
45
+ Requires-Dist: asyncpg>=0.29; extra == 'db'
46
+ Requires-Dist: oracledb>=2.0; extra == 'db'
47
+ Provides-Extra: dev
48
+ Requires-Dist: argon2-cffi>=23.0; extra == 'dev'
49
+ Requires-Dist: httpx>=0.27.0; extra == 'dev'
50
+ Requires-Dist: ipython>=8.18; extra == 'dev'
51
+ Requires-Dist: pytest-asyncio>=0.24.0; extra == 'dev'
52
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
53
+ Requires-Dist: pytest>=8.0; extra == 'dev'
54
+ Requires-Dist: redis>=5; extra == 'dev'
55
+ Requires-Dist: ruff>=0.8.0; extra == 'dev'
56
+ Provides-Extra: loupe
57
+ Requires-Dist: ipython>=8.18; extra == 'loupe'
58
+ Provides-Extra: mariadb
59
+ Requires-Dist: aiomysql>=0.2; extra == 'mariadb'
60
+ Provides-Extra: mysql
61
+ Requires-Dist: aiomysql>=0.2; extra == 'mysql'
62
+ Provides-Extra: oracle
63
+ Requires-Dist: oracledb>=2.0; extra == 'oracle'
64
+ Provides-Extra: pgsql
65
+ Requires-Dist: asyncpg>=0.29; extra == 'pgsql'
66
+ Provides-Extra: prism
67
+ Provides-Extra: redis
68
+ Requires-Dist: redis>=5; extra == 'redis'
69
+ Provides-Extra: s3
70
+ Requires-Dist: boto3>=1.34; extra == 's3'
71
+ Provides-Extra: sqlsrv
72
+ Requires-Dist: aioodbc>=0.5.0; extra == 'sqlsrv'
73
+ Description-Content-Type: text/markdown
74
+
75
+ <p align="center">
76
+ <img src="https://raw.githubusercontent.com/almasix-dev/almasix/main/website/src/assets/almasix-banner.svg" alt="Almasix" width="300">
77
+ </p>
78
+
79
+ <p align="center"><strong>Laravel's application shape, in async Python.</strong></p>
80
+
81
+ <p align="center">
82
+ A full-stack web framework on FastAPI and Starlette — routing, validation, an ORM, a view engine,
83
+ auth, queues, mail, cache, events, a scheduler, and a first-class CLI — arranged the way Laravel
84
+ arranges them, and asynchronous all the way down.
85
+ </p>
86
+
87
+ <p align="center">
88
+ <a href="https://pypi.org/project/almasix/"><img alt="PyPI" src="https://img.shields.io/pypi/v/almasix?style=flat-square&label=pypi&color=4c1d95"></a>
89
+ <a href="https://pypi.org/project/almasix/"><img alt="downloads" src="https://img.shields.io/pypi/dm/almasix?style=flat-square&color=4c1d95"></a>
90
+ <a href="https://github.com/almasix-dev/almasix/actions/workflows/ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/almasix-dev/almasix/ci.yml?branch=main&style=flat-square&label=CI&logo=githubactions&logoColor=white"></a>
91
+ <a href="https://github.com/almasix-dev/almasix/blob/main/docs/SMOKE.md"><img alt="coverage" src="https://img.shields.io/badge/coverage-99%25-31c48d?style=flat-square&logo=codecov&logoColor=white"></a>
92
+ <a href="https://github.com/almasix-dev/almasix/tree/main/tests"><img alt="tests" src="https://img.shields.io/badge/tests-2%2C301-31c48d?style=flat-square&logo=pytest&logoColor=white"></a>
93
+ <a href="https://pypi.org/project/almasix/"><img alt="python" src="https://img.shields.io/badge/python-3.11%20%7C%203.12%20%7C%203.13-3776ab?style=flat-square&logo=python&logoColor=white"></a>
94
+ <a href="https://almasix-dev.github.io/almasix"><img alt="docs" src="https://img.shields.io/badge/docs-54%20pages-bc52ee?style=flat-square&logo=astro&logoColor=white"></a>
95
+ <a href="https://github.com/almasix-dev/almasix/blob/main/LICENSE"><img alt="license" src="https://img.shields.io/github/license/almasix-dev/almasix?style=flat-square&color=0f766e"></a>
96
+ </p>
97
+
98
+ ## Why Almasix
99
+
100
+ Python has excellent HTTP libraries and very few opinions about what an application looks like.
101
+ Almasix supplies the opinions. It takes the conventions that make a Laravel codebase legible on
102
+ first read — the directory layout, service providers, facades, fluent builders, `Route` groups,
103
+ Eloquent-style models, Blade-style templates, Artisan-style commands — and implements them in
104
+ modern Python. Requests, the ORM, queue workers, and the scheduler all run on `asyncio`, and the
105
+ FastAPI application underneath is never taken away from you.
106
+
107
+ It is a parity project, not an homage. Each area of the framework is built against the
108
+ corresponding page of Laravel's documentation, method by method, and every deliberate divergence
109
+ is named in Almasix's own page for that feature — so `Str`, `Collection`, the query builder, and the
110
+ scheduler behave the way your muscle memory expects, while `async`/`await`, type hints, context
111
+ managers, and dataclasses are used where Python has the better answer.
112
+
113
+ | Piece | What it is |
114
+ | --- | --- |
115
+ | **Almasix** (`almasix`) | the framework |
116
+ | **`almasix new`** | the application installer |
117
+ | **Smith** (`smith …`) | the in-app CLI — `smith serve`, `smith make:model`, `smith queue:work`, `smith loupe` |
118
+ | **Prism** (`almasix.prism`) | the view engine — `.prism.html` templates, directives, components, stacks |
119
+ | **Articulate** (`almasix.orm`) | the ORM — models, relationships, migrations, pagination, on SQLAlchemy Core |
120
+
121
+ ## A tour in five files
122
+
123
+ Routes are declarative and grouped, controllers are plain classes, and route names and middleware
124
+ sit where you'd look for them:
125
+
126
+ ```python
127
+ # routes/web.py
128
+ from app.http.controllers.post_controller import PostController
129
+ from almasix.routing import Route
130
+
131
+ with Route.group(middleware=["web"]):
132
+ Route.get("/posts", [PostController, "index"], name="posts.index")
133
+ Route.get("/posts/{post}", [PostController, "show"], name="posts.show")
134
+ ```
135
+
136
+ Models carry their own casts, scopes, and relationships:
137
+
138
+ ```python
139
+ # app/models/post.py
140
+ from app.models.user import User
141
+ from almasix.orm import Model, SoftDeletes, relation
142
+
143
+
144
+ class Post(SoftDeletes, Model):
145
+ fillable = ("title", "body", "published")
146
+ casts = {"published": "bool", "published_at": "datetime"}
147
+
148
+ def scope_published(query):
149
+ return query.where("published", True)
150
+
151
+ @relation
152
+ def author(self):
153
+ return self.belongs_to(User)
154
+ ```
155
+
156
+ Controllers read like their Laravel counterparts, with `await` at the edges:
157
+
158
+ ```python
159
+ # app/http/controllers/post_controller.py
160
+ from app.models.post import Post
161
+ from almasix.prism import view
162
+ from almasix.http import Controller
163
+
164
+
165
+ class PostController(Controller):
166
+ async def index(self):
167
+ posts = await Post.query().published().with_("author").latest().get()
168
+ return view("posts.index", {"posts": posts})
169
+ ```
170
+
171
+ Templates are Prism — Blade's directives, compiled to Python:
172
+
173
+ ```html
174
+ {{-- resources/views/posts/index.prism.html --}}
175
+ @extends('layouts.app')
176
+
177
+ @section('content')
178
+ @foreach(posts as post)
179
+ <article>
180
+ <h2>{{ post.title }}</h2>
181
+ <p>by {{ post.author.name }} — {{ post.created_at }}</p>
182
+ </article>
183
+ @endforeach
184
+ @endsection
185
+ ```
186
+
187
+ Console commands and scheduled work are declared together, and run under `smith`:
188
+
189
+ ```python
190
+ # routes/console.py
191
+ from almasix.console import Artisan, schedule
192
+
193
+
194
+ def send_digest(command) -> int:
195
+ command.info("digest sent")
196
+ return 0
197
+
198
+
199
+ Artisan.command("digest:send", send_digest).purpose("Mail yesterday's digest")
200
+
201
+ schedule.command("digest:send").daily_at("07:00").timezone("Africa/Nairobi").without_overlapping()
202
+ schedule.command("model:prune").daily().on_one_server()
203
+ ```
204
+
205
+ ## Getting started
206
+
207
+ ### Create an application
208
+
209
+ ```bash
210
+ python -m venv .venv && source .venv/bin/activate
211
+ pip install almasix
212
+
213
+ almasix new blog
214
+ cd blog
215
+ pip install -e . # the framework requirement is already satisfied
216
+ smith serve # or: python smith serve
217
+ ```
218
+
219
+ `almasix new` writes a complete application: `app/`, `bootstrap/`, `config/`, `routes/`,
220
+ `resources/views` with error pages, `database/migrations`, `storage/`, a Vite config, and a root
221
+ `smith` script. Use `smith …` when Almasix is on your `PATH`, or `python smith …` to run the app's
222
+ own script explicitly.
223
+
224
+ ### Work on the framework
225
+
226
+ ```bash
227
+ git clone https://github.com/almasix-dev/almasix.git && cd almasix
228
+ python -m venv .venv && source .venv/bin/activate
229
+ pip install -e ".[dev]"
230
+
231
+ make test # full unit + smoke suite
232
+ make test-cov # the same, with the coverage gate
233
+ make lint # ruff
234
+ make docs # the documentation site, locally
235
+ ```
236
+
237
+ ## What ships today
238
+
239
+ The framework is built in milestones, each closed against a Laravel documentation page. Closed
240
+ today:
241
+
242
+ - **The basics** — routing and route groups, controllers, middleware and aliases, requests and
243
+ responses, session, CSRF, validation with form requests, URL generation, error handling and the
244
+ debug page, logging, asset bundling.
245
+ - **Prism views** — layouts and sections, includes, control directives, components and slots,
246
+ stacks, and a `dd()` dump page.
247
+ - **Articulate ORM** — models with casts and serialization, the whole relationship surface, eager
248
+ loading, soft deletes, pruning, migrations, seeding, pagination, and streaming reads through lazy
249
+ collections.
250
+ - **Digging deeper** — the Smith console with prompts and closure commands, the task scheduler
251
+ (frequencies, constraints, hooks, sub-minute tasks), cache, Redis, queues and workers, mail,
252
+ notifications, events, the filesystem, collections, helpers and `Str`, the HTTP client,
253
+ localization, and encryption.
254
+ - **Security** — authentication guards and providers, hashing, gates and policies, email
255
+ verification, password confirmation and resets.
256
+
257
+ Every closed milestone ships four things: the implementation, tests, a documentation page, and a
258
+ runnable demonstration in the living example app.
259
+
260
+ ## Documentation
261
+
262
+ [`website/`](website/) holds 53 pages of application-developer documentation (Astro Starlight),
263
+ written to follow Laravel's structure page for page — including a section per method for
264
+ [collections](website/src/content/docs/collections.md),
265
+ [strings](website/src/content/docs/strings.md), and
266
+ [helpers](website/src/content/docs/helpers.md). Run `make docs` to read it locally at
267
+ `http://localhost:4321`; the hosted site is not published yet.
268
+
269
+ [`examples/progress`](examples/progress) is the living example — a real Almasix application that
270
+ demonstrates each closed milestone through routes you can visit and `smith progress:*` commands you
271
+ can run. Its `/progress` page is the project's milestone board.
272
+
273
+ ## How the project is built
274
+
275
+ [**`docs/PLAN.md`**](docs/PLAN.md) is the binding architecture and milestone document: 51
276
+ milestones, each mapped to the Laravel documentation it must match, with the parity audit and the
277
+ named deviations recorded in place. [**`docs/SMOKE.md`**](docs/SMOKE.md) records the exit criteria
278
+ that close a milestone.
279
+
280
+ The gates are enforced in CI on Python 3.11, 3.12, and 3.13:
281
+
282
+ | Gate | Command |
283
+ | --- | --- |
284
+ | Milestone smoke tests | `make smoke` |
285
+ | Contract regressions | `make regression` |
286
+ | Full suite, coverage **≥ 98%** (aim 100%) | `make test-cov` |
287
+
288
+ `make lint` runs ruff locally but is not a CI gate yet, and does not pass — choosing a rule set and
289
+ clearing the backlog is [M51](docs/PLAN.md).
290
+
291
+ Currently **1,886 tests** at **99.38%** coverage.
292
+
293
+ ## Status
294
+
295
+ **25 of 51 milestones closed.** M5 (Articulate ORM) and M30 (Smith console exhaust) are
296
+ deliberately partial, with the remainder scheduled. Next up: **M42 — query builder and database
297
+ exhaust**.
298
+
299
+ ## Repository layout
300
+
301
+ ```text
302
+ src/almasix/
303
+ framework/ # Application, container, providers, bootstrap
304
+ config/ # env + config repository
305
+ http/ # kernel, request, response, middleware
306
+ routing/ # Route DSL → FastAPI bridge
307
+ validation/ # form requests, rules, messages
308
+ orm/ # Articulate — models, relations, builder, migrations
309
+ prism/ # Prism views — compiler, directives, components
310
+ auth/ # guards, providers, gates and policies
311
+ console/ # Smith commands, prompts, scheduler, loupe
312
+ queue/ # jobs, dispatcher, workers, failed jobs
313
+ cache/ # cache repository and stores
314
+ mail/ # mailables and transports
315
+ notifications/ # channels and notifiables
316
+ events/ # dispatcher, listeners, subscribers
317
+ filesystem/ # Storage disks
318
+ client/ # HTTP client
319
+ support/ # collections, helpers, Str, Number
320
+ translation/ # __(), trans_choice(), locales
321
+ installer/ # almasix new
322
+ smith/ # the smith CLI
323
+ docs/ # PLAN.md, SMOKE.md — the binding project documents
324
+ website/ # the documentation site (Astro Starlight)
325
+ examples/ # the living example application
326
+ tests/ # unit, smoke, and regression suites
327
+ smith # root script → the same CLI as `smith`
328
+ ```
329
+
330
+ ## Contributing
331
+
332
+ Read [`docs/PLAN.md`](docs/PLAN.md) first — it is the source of truth for what belongs where and
333
+ what parity means for the area you are touching. Work in milestone order, keep the coverage gate
334
+ green, add the documentation page alongside the code, and extend
335
+ [`examples/progress`](examples/progress) so the new surface can be demonstrated, not just claimed.
336
+
337
+ ## License
338
+
339
+ [MIT](LICENSE) © Almasix Contributors