hunt-framework 0.2.2__tar.gz → 0.2.3__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 (240) hide show
  1. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/PKG-INFO +12 -8
  2. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/README.md +11 -7
  3. hunt_framework-0.2.3/docs/logo.png +0 -0
  4. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/pyproject.toml +7 -1
  5. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/schema/blueprint.py +43 -8
  6. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/schema/builder.py +5 -4
  7. hunt_framework-0.2.3/tests/integration/test_schema_dialects.py +531 -0
  8. hunt_framework-0.2.3/tests/unit/__init__.py +0 -0
  9. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/uv.lock +450 -0
  10. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  11. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  12. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  13. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  14. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/.github/workflows/lint.yml +0 -0
  15. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/.github/workflows/publish.yml +0 -0
  16. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/.github/workflows/tests.yml +0 -0
  17. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/.gitignore +0 -0
  18. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/CHANGELOG.md +0 -0
  19. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/CODEOWNERS +0 -0
  20. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/CODE_OF_CONDUCT.md +0 -0
  21. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/CONTRIBUTING.md +0 -0
  22. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/CONTRIBUTORS.md +0 -0
  23. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/LICENSE +0 -0
  24. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/SECURITY.md +0 -0
  25. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/__init__.py +0 -0
  26. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/__init__.py +0 -0
  27. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/action.py +0 -0
  28. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/application.py +0 -0
  29. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/console/__init__.py +0 -0
  30. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/console/make_admin_resource.py +0 -0
  31. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/controllers/__init__.py +0 -0
  32. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/controllers/action.py +0 -0
  33. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/controllers/dashboard.py +0 -0
  34. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/controllers/resource.py +0 -0
  35. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/controllers/search.py +0 -0
  36. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/field.py +0 -0
  37. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/__init__.py +0 -0
  38. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/badge.py +0 -0
  39. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/belongs_to.py +0 -0
  40. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/boolean.py +0 -0
  41. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/datetime_.py +0 -0
  42. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/has_many.py +0 -0
  43. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/image.py +0 -0
  44. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/number.py +0 -0
  45. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/richtext.py +0 -0
  46. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/select.py +0 -0
  47. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/text.py +0 -0
  48. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/textarea.py +0 -0
  49. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/filter.py +0 -0
  50. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/metrics/__init__.py +0 -0
  51. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/metrics/partition.py +0 -0
  52. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/metrics/trend.py +0 -0
  53. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/metrics/value.py +0 -0
  54. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/middleware/__init__.py +0 -0
  55. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/middleware/gate.py +0 -0
  56. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/navigation.py +0 -0
  57. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/resource.py +0 -0
  58. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/templates/admin/dashboard.html +0 -0
  59. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/templates/admin/layout.html +0 -0
  60. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/templates/admin/resource/_form.html +0 -0
  61. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/templates/admin/resource/create.html +0 -0
  62. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/templates/admin/resource/edit.html +0 -0
  63. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/templates/admin/resource/index.html +0 -0
  64. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/templates/admin/resource/show.html +0 -0
  65. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/application.py +0 -0
  66. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/auth/__init__.py +0 -0
  67. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/auth/gate.py +0 -0
  68. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/auth/manager.py +0 -0
  69. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/auth/passwords.py +0 -0
  70. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/auth/verification.py +0 -0
  71. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/cache/__init__.py +0 -0
  72. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/cache/manager.py +0 -0
  73. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/config/__init__.py +0 -0
  74. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/config/loader.py +0 -0
  75. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/config/repository.py +0 -0
  76. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/__init__.py +0 -0
  77. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/command.py +0 -0
  78. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/__init__.py +0 -0
  79. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/cache.py +0 -0
  80. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/config_cache.py +0 -0
  81. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/db/__init__.py +0 -0
  82. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/db/seed.py +0 -0
  83. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/key_generate.py +0 -0
  84. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/__init__.py +0 -0
  85. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/command.py +0 -0
  86. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/controller.py +0 -0
  87. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/event.py +0 -0
  88. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/factory.py +0 -0
  89. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/job.py +0 -0
  90. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/listener.py +0 -0
  91. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/mail.py +0 -0
  92. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/middleware.py +0 -0
  93. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/migration.py +0 -0
  94. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/model.py +0 -0
  95. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/notification.py +0 -0
  96. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/observer.py +0 -0
  97. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/policy.py +0 -0
  98. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/request.py +0 -0
  99. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/resource.py +0 -0
  100. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/rule.py +0 -0
  101. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/seeder.py +0 -0
  102. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/migrate.py +0 -0
  103. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/new.py +0 -0
  104. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/queue_failed.py +0 -0
  105. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/queue_table.py +0 -0
  106. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/queue_work.py +0 -0
  107. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/route_list.py +0 -0
  108. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/schedule_list.py +0 -0
  109. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/schedule_run.py +0 -0
  110. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/serve.py +0 -0
  111. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/storage_link.py +0 -0
  112. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/tinker.py +0 -0
  113. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/upgrade.py +0 -0
  114. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/view_cache.py +0 -0
  115. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/kernel.py +0 -0
  116. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/container/__init__.py +0 -0
  117. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/container/container.py +0 -0
  118. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/container/facade.py +0 -0
  119. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/container/provider.py +0 -0
  120. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/__init__.py +0 -0
  121. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/connection.py +0 -0
  122. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/factory.py +0 -0
  123. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/model.py +0 -0
  124. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/query_builder.py +0 -0
  125. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/relations/__init__.py +0 -0
  126. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/relations/belongs_to.py +0 -0
  127. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/relations/belongs_to_many.py +0 -0
  128. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/relations/has_many.py +0 -0
  129. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/relations/has_one.py +0 -0
  130. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/schema/__init__.py +0 -0
  131. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/schema/migration.py +0 -0
  132. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/seeder.py +0 -0
  133. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/events/__init__.py +0 -0
  134. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/events/dispatcher.py +0 -0
  135. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/events/provider.py +0 -0
  136. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/events/queued.py +0 -0
  137. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/exceptions/__init__.py +0 -0
  138. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/exceptions/handler.py +0 -0
  139. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/__init__.py +0 -0
  140. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/client.py +0 -0
  141. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/controller.py +0 -0
  142. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/kernel.py +0 -0
  143. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/middleware/__init__.py +0 -0
  144. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/middleware/authenticate.py +0 -0
  145. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/middleware/cors.py +0 -0
  146. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/middleware/csrf.py +0 -0
  147. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/middleware/session.py +0 -0
  148. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/middleware/throttle.py +0 -0
  149. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/middleware/verified.py +0 -0
  150. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/request.py +0 -0
  151. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/response.py +0 -0
  152. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/route.py +0 -0
  153. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/router.py +0 -0
  154. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/log/__init__.py +0 -0
  155. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/log/manager.py +0 -0
  156. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/mail/__init__.py +0 -0
  157. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/mail/mailable.py +0 -0
  158. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/mail/manager.py +0 -0
  159. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/mail/message.py +0 -0
  160. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/notifications/__init__.py +0 -0
  161. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/notifications/channels/__init__.py +0 -0
  162. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/notifications/channels/database.py +0 -0
  163. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/notifications/channels/mail.py +0 -0
  164. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/notifications/fake.py +0 -0
  165. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/notifications/notifiable.py +0 -0
  166. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/notifications/notification.py +0 -0
  167. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/queue/__init__.py +0 -0
  168. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/queue/drivers/__init__.py +0 -0
  169. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/queue/drivers/database.py +0 -0
  170. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/queue/drivers/redis.py +0 -0
  171. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/queue/drivers/sync.py +0 -0
  172. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/queue/job.py +0 -0
  173. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/queue/manager.py +0 -0
  174. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/scheduling/__init__.py +0 -0
  175. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/scheduling/cron.py +0 -0
  176. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/scheduling/scheduler.py +0 -0
  177. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/security/__init__.py +0 -0
  178. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/security/signing.py +0 -0
  179. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/session/__init__.py +0 -0
  180. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/session/store.py +0 -0
  181. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/storage/__init__.py +0 -0
  182. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/storage/local.py +0 -0
  183. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/storage/manager.py +0 -0
  184. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/storage/s3.py +0 -0
  185. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/support/__init__.py +0 -0
  186. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/support/collection.py +0 -0
  187. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/support/helpers.py +0 -0
  188. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/support/str.py +0 -0
  189. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/testing/__init__.py +0 -0
  190. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/testing/fakes.py +0 -0
  191. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/testing/test_case.py +0 -0
  192. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/translation/__init__.py +0 -0
  193. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/translation/provider.py +0 -0
  194. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/translation/translator.py +0 -0
  195. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/validation/__init__.py +0 -0
  196. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/validation/form_request.py +0 -0
  197. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/validation/rules.py +0 -0
  198. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/validation/validator.py +0 -0
  199. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/view/__init__.py +0 -0
  200. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/view/directives.py +0 -0
  201. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/view/factory.py +0 -0
  202. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/views/auth/forgot_password.html +0 -0
  203. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/views/auth/layout.html +0 -0
  204. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/views/auth/login.html +0 -0
  205. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/views/auth/register.html +0 -0
  206. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/views/auth/reset_password.html +0 -0
  207. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/stubs/controller.stub +0 -0
  208. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/stubs/middleware.stub +0 -0
  209. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/stubs/migration.stub +0 -0
  210. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/stubs/model.stub +0 -0
  211. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/__init__.py +0 -0
  212. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/feature/__init__.py +0 -0
  213. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/feature/test_http.py +0 -0
  214. {hunt_framework-0.2.2/tests/unit → hunt_framework-0.2.3/tests/integration}/__init__.py +0 -0
  215. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_cache_commands.py +0 -0
  216. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_container.py +0 -0
  217. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_directives.py +0 -0
  218. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_event_service_provider.py +0 -0
  219. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_key_generate.py +0 -0
  220. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_make_admin_resource.py +0 -0
  221. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_make_commands.py +0 -0
  222. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_model.py +0 -0
  223. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_a.py +0 -0
  224. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_b.py +0 -0
  225. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_c.py +0 -0
  226. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_d.py +0 -0
  227. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_e.py +0 -0
  228. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_f.py +0 -0
  229. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_g.py +0 -0
  230. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_h.py +0 -0
  231. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_i.py +0 -0
  232. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_j.py +0 -0
  233. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_k.py +0 -0
  234. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_l.py +0 -0
  235. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_m.py +0 -0
  236. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_route_list.py +0 -0
  237. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_router.py +0 -0
  238. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_scheduler.py +0 -0
  239. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_upgrade.py +0 -0
  240. {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_validation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hunt-framework
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: A Python web framework
5
5
  Project-URL: Homepage, https://hunt-framework.com
6
6
  Project-URL: Documentation, https://hunt-framework.com/docs/installation
@@ -44,13 +44,17 @@ Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
44
44
  Requires-Dist: pytest>=8.0; extra == 'dev'
45
45
  Description-Content-Type: text/markdown
46
46
 
47
- # hunt
48
-
49
- [![CI](https://github.com/hunt-core/hunt/actions/workflows/tests.yml/badge.svg)](https://github.com/hunt-core/hunt/actions/workflows/tests.yml)
50
- [![Lint](https://github.com/hunt-core/hunt/actions/workflows/lint.yml/badge.svg)](https://github.com/hunt-core/hunt/actions/workflows/lint.yml)
51
- [![PyPI](https://img.shields.io/pypi/v/hunt-framework)](https://pypi.org/project/hunt-framework/)
52
- [![Python](https://img.shields.io/pypi/pyversions/hunt-framework)](https://pypi.org/project/hunt-framework/)
53
- [![License](https://img.shields.io/github/license/hunt-core/hunt)](LICENSE)
47
+ <p align="center">
48
+ <img src="docs/logo.png" alt="hunt framework" width="320" />
49
+ </p>
50
+
51
+ <p align="center">
52
+ <a href="https://github.com/hunt-core/hunt/actions/workflows/tests.yml"><img src="https://github.com/hunt-core/hunt/actions/workflows/tests.yml/badge.svg" alt="CI"></a>
53
+ <a href="https://github.com/hunt-core/hunt/actions/workflows/lint.yml"><img src="https://github.com/hunt-core/hunt/actions/workflows/lint.yml/badge.svg" alt="Lint"></a>
54
+ <a href="https://pypi.org/project/hunt-framework/"><img src="https://img.shields.io/pypi/v/hunt-framework" alt="PyPI"></a>
55
+ <a href="https://pypi.org/project/hunt-framework/"><img src="https://img.shields.io/pypi/pyversions/hunt-framework" alt="Python"></a>
56
+ <a href="LICENSE"><img src="https://img.shields.io/github/license/hunt-core/hunt" alt="License"></a>
57
+ </p>
54
58
 
55
59
  A Python web framework. Routing, ORM, templates, migrations, validation, authentication, admin panel, and a CLI — all in one package.
56
60
 
@@ -1,10 +1,14 @@
1
- # hunt
2
-
3
- [![CI](https://github.com/hunt-core/hunt/actions/workflows/tests.yml/badge.svg)](https://github.com/hunt-core/hunt/actions/workflows/tests.yml)
4
- [![Lint](https://github.com/hunt-core/hunt/actions/workflows/lint.yml/badge.svg)](https://github.com/hunt-core/hunt/actions/workflows/lint.yml)
5
- [![PyPI](https://img.shields.io/pypi/v/hunt-framework)](https://pypi.org/project/hunt-framework/)
6
- [![Python](https://img.shields.io/pypi/pyversions/hunt-framework)](https://pypi.org/project/hunt-framework/)
7
- [![License](https://img.shields.io/github/license/hunt-core/hunt)](LICENSE)
1
+ <p align="center">
2
+ <img src="docs/logo.png" alt="hunt framework" width="320" />
3
+ </p>
4
+
5
+ <p align="center">
6
+ <a href="https://github.com/hunt-core/hunt/actions/workflows/tests.yml"><img src="https://github.com/hunt-core/hunt/actions/workflows/tests.yml/badge.svg" alt="CI"></a>
7
+ <a href="https://github.com/hunt-core/hunt/actions/workflows/lint.yml"><img src="https://github.com/hunt-core/hunt/actions/workflows/lint.yml/badge.svg" alt="Lint"></a>
8
+ <a href="https://pypi.org/project/hunt-framework/"><img src="https://img.shields.io/pypi/v/hunt-framework" alt="PyPI"></a>
9
+ <a href="https://pypi.org/project/hunt-framework/"><img src="https://img.shields.io/pypi/pyversions/hunt-framework" alt="Python"></a>
10
+ <a href="LICENSE"><img src="https://img.shields.io/github/license/hunt-core/hunt" alt="License"></a>
11
+ </p>
8
12
 
9
13
  A Python web framework. Routing, ORM, templates, migrations, validation, authentication, admin panel, and a CLI — all in one package.
10
14
 
Binary file
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "hunt-framework"
7
- version = "0.2.2"
7
+ version = "0.2.3"
8
8
  description = "A Python web framework"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -84,3 +84,9 @@ known-first-party = ["hunt"]
84
84
  [tool.ruff.format]
85
85
  quote-style = "double"
86
86
  indent-style = "space"
87
+
88
+ [dependency-groups]
89
+ dev = [
90
+ "psycopg2-binary>=2.9.12",
91
+ "testcontainers[mysql,postgres]>=4.14.2",
92
+ ]
@@ -6,6 +6,19 @@ from typing import Any
6
6
 
7
7
  _IDENT_RE = re.compile(r"^[a-zA-Z_][a-zA-Z0-9_]*$")
8
8
 
9
+ # Types that need renaming on PostgreSQL (which rejects MySQL-specific names).
10
+ _PG_TYPE_MAP: dict[str, str] = {
11
+ "TINYINT": "SMALLINT",
12
+ "MEDIUMTEXT": "TEXT",
13
+ "LONGTEXT": "TEXT",
14
+ "DATETIME": "TIMESTAMP",
15
+ "DOUBLE": "DOUBLE PRECISION",
16
+ "BLOB": "BYTEA",
17
+ }
18
+
19
+ # Matches FLOAT(precision,scale) as produced by Blueprint.float().
20
+ _FLOAT_ARGS_RE = re.compile(r"^FLOAT\((\d+),\d+\)$")
21
+
9
22
 
10
23
  def _ident(name: str) -> str:
11
24
  if not _IDENT_RE.match(name):
@@ -305,33 +318,55 @@ class Blueprint:
305
318
  # SQL generation
306
319
  # ------------------------------------------------------------------
307
320
 
308
- def to_create_sql(self) -> list[str]:
321
+ def to_create_sql(self, dialect: str = "sqlite") -> list[str]:
309
322
  stmts = []
310
323
  col_defs = []
311
324
  for col in self.columns:
312
- col_defs.append(self._column_sql(col))
325
+ col_defs.append(self._column_sql(col, dialect))
313
326
  t = _ident(self.table)
314
327
  create = f"CREATE TABLE IF NOT EXISTS {t} (\n " + ",\n ".join(col_defs) + "\n)"
315
328
  stmts.append(create)
329
+ # MySQL does not support IF NOT EXISTS for index creation.
330
+ if_not_exists = "" if dialect == "mysql" else "IF NOT EXISTS "
316
331
  for idx in self.indexes:
317
332
  idx_name = _ident(idx.name) if idx.name else f"{t}_idx"
318
333
  safe_cols = ", ".join(_ident(c) for c in idx.columns)
319
334
  if idx.unique:
320
- stmts.append(f"CREATE UNIQUE INDEX IF NOT EXISTS {idx_name} ON {t} ({safe_cols})")
335
+ stmts.append(f"CREATE UNIQUE INDEX {if_not_exists}{idx_name} ON {t} ({safe_cols})")
321
336
  else:
322
- stmts.append(f"CREATE INDEX IF NOT EXISTS {idx_name} ON {t} ({safe_cols})")
337
+ stmts.append(f"CREATE INDEX {if_not_exists}{idx_name} ON {t} ({safe_cols})")
323
338
  return stmts
324
339
 
325
340
  @staticmethod
326
- def _column_sql(col: ColumnDef) -> str:
341
+ def _resolve_type(col_type: str, dialect: str) -> str:
342
+ """Map a column type string to the correct spelling for the target dialect."""
343
+ if dialect == "postgresql":
344
+ mapped = _PG_TYPE_MAP.get(col_type)
345
+ if mapped:
346
+ return mapped
347
+ m = _FLOAT_ARGS_RE.match(col_type)
348
+ if m:
349
+ return "REAL" if int(m.group(1)) <= 24 else "DOUBLE PRECISION"
350
+ return col_type
351
+
352
+ @staticmethod
353
+ def _column_sql(col: ColumnDef, dialect: str = "sqlite") -> str:
354
+ col_type = Blueprint._resolve_type(col.type, dialect)
327
355
  if col.length:
328
- sql = f"{col.name} {col.type}({col.length})"
356
+ sql = f"{col.name} {col_type}({col.length})"
329
357
  else:
330
- sql = f"{col.name} {col.type}"
358
+ sql = f"{col.name} {col_type}"
359
+ if col.unsigned and dialect == "mysql":
360
+ sql += " UNSIGNED"
331
361
  if col.primary:
332
362
  sql += " PRIMARY KEY"
333
363
  if col.auto_increment:
334
- sql += " AUTOINCREMENT"
364
+ if dialect == "mysql":
365
+ sql += " AUTO_INCREMENT"
366
+ elif dialect == "postgresql":
367
+ sql += " GENERATED ALWAYS AS IDENTITY"
368
+ else:
369
+ sql += " AUTOINCREMENT"
335
370
  if not col.is_nullable and not col.primary:
336
371
  sql += " NOT NULL"
337
372
  if col.default_value is not None:
@@ -38,8 +38,9 @@ class Schema:
38
38
  bp = Blueprint(_ident(table))
39
39
  callback(bp)
40
40
  engine = connection(cls._conn_name)
41
+ dialect = engine.dialect.name
41
42
  with engine.connect() as conn:
42
- for sql in bp.to_create_sql():
43
+ for sql in bp.to_create_sql(dialect):
43
44
  conn.execute(text(sql))
44
45
  conn.commit()
45
46
 
@@ -56,7 +57,7 @@ class Schema:
56
57
  # 1. Add new columns
57
58
  new_cols = [c for c in bp.columns if not c.is_change]
58
59
  for col in new_cols:
59
- sql = f"ALTER TABLE {t} ADD COLUMN {Blueprint._column_sql(col)}"
60
+ sql = f"ALTER TABLE {t} ADD COLUMN {Blueprint._column_sql(col, dialect)}"
60
61
  conn.execute(text(sql))
61
62
 
62
63
  # 2. Alter existing columns
@@ -66,7 +67,7 @@ class Schema:
66
67
  _sqlite_rebuild_columns(conn, t, change_cols)
67
68
  elif dialect == "mysql":
68
69
  for col in change_cols:
69
- conn.execute(text(f"ALTER TABLE {t} MODIFY COLUMN {Blueprint._column_sql(col)}"))
70
+ conn.execute(text(f"ALTER TABLE {t} MODIFY COLUMN {Blueprint._column_sql(col, dialect)}"))
70
71
  else: # postgresql and others
71
72
  for col in change_cols:
72
73
  _pg_alter_column(conn, t, col)
@@ -195,7 +196,7 @@ def _sqlite_rebuild_columns(conn, table: str, changes: list[ColumnDef]) -> None:
195
196
  for row in rows:
196
197
  name = row[1]
197
198
  if name in change_map:
198
- new_col_defs.append(Blueprint._column_sql(change_map[name]))
199
+ new_col_defs.append(Blueprint._column_sql(change_map[name], "sqlite"))
199
200
  else:
200
201
  # Reconstruct SQL from PRAGMA info — sanitize PRAGMA-derived values
201
202
  col_type = str(row[2]) if row[2] else "TEXT"