hunt-framework 0.2.2__tar.gz → 0.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/CHANGELOG.md +23 -1
  2. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/PKG-INFO +12 -8
  3. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/README.md +11 -7
  4. hunt_framework-0.2.4/docs/logo.png +0 -0
  5. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/pyproject.toml +7 -1
  6. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/database/query_builder.py +3 -0
  7. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/database/schema/blueprint.py +43 -8
  8. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/database/schema/builder.py +5 -4
  9. hunt_framework-0.2.4/tests/integration/test_schema_dialects.py +531 -0
  10. hunt_framework-0.2.4/tests/unit/__init__.py +0 -0
  11. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/uv.lock +450 -0
  12. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  13. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  14. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  15. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  16. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/.github/workflows/lint.yml +0 -0
  17. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/.github/workflows/publish.yml +0 -0
  18. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/.github/workflows/tests.yml +0 -0
  19. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/.gitignore +0 -0
  20. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/CODEOWNERS +0 -0
  21. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/CODE_OF_CONDUCT.md +0 -0
  22. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/CONTRIBUTING.md +0 -0
  23. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/CONTRIBUTORS.md +0 -0
  24. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/LICENSE +0 -0
  25. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/SECURITY.md +0 -0
  26. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/__init__.py +0 -0
  27. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/__init__.py +0 -0
  28. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/action.py +0 -0
  29. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/application.py +0 -0
  30. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/console/__init__.py +0 -0
  31. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/console/make_admin_resource.py +0 -0
  32. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/controllers/__init__.py +0 -0
  33. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/controllers/action.py +0 -0
  34. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/controllers/dashboard.py +0 -0
  35. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/controllers/resource.py +0 -0
  36. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/controllers/search.py +0 -0
  37. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/field.py +0 -0
  38. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/fields/__init__.py +0 -0
  39. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/fields/badge.py +0 -0
  40. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/fields/belongs_to.py +0 -0
  41. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/fields/boolean.py +0 -0
  42. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/fields/datetime_.py +0 -0
  43. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/fields/has_many.py +0 -0
  44. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/fields/image.py +0 -0
  45. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/fields/number.py +0 -0
  46. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/fields/richtext.py +0 -0
  47. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/fields/select.py +0 -0
  48. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/fields/text.py +0 -0
  49. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/fields/textarea.py +0 -0
  50. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/filter.py +0 -0
  51. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/metrics/__init__.py +0 -0
  52. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/metrics/partition.py +0 -0
  53. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/metrics/trend.py +0 -0
  54. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/metrics/value.py +0 -0
  55. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/middleware/__init__.py +0 -0
  56. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/middleware/gate.py +0 -0
  57. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/navigation.py +0 -0
  58. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/resource.py +0 -0
  59. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/templates/admin/dashboard.html +0 -0
  60. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/templates/admin/layout.html +0 -0
  61. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/templates/admin/resource/_form.html +0 -0
  62. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/templates/admin/resource/create.html +0 -0
  63. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/templates/admin/resource/edit.html +0 -0
  64. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/templates/admin/resource/index.html +0 -0
  65. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/admin/templates/admin/resource/show.html +0 -0
  66. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/application.py +0 -0
  67. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/auth/__init__.py +0 -0
  68. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/auth/gate.py +0 -0
  69. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/auth/manager.py +0 -0
  70. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/auth/passwords.py +0 -0
  71. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/auth/verification.py +0 -0
  72. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/cache/__init__.py +0 -0
  73. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/cache/manager.py +0 -0
  74. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/config/__init__.py +0 -0
  75. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/config/loader.py +0 -0
  76. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/config/repository.py +0 -0
  77. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/__init__.py +0 -0
  78. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/command.py +0 -0
  79. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/__init__.py +0 -0
  80. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/cache.py +0 -0
  81. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/config_cache.py +0 -0
  82. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/db/__init__.py +0 -0
  83. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/db/seed.py +0 -0
  84. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/key_generate.py +0 -0
  85. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/__init__.py +0 -0
  86. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/command.py +0 -0
  87. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/controller.py +0 -0
  88. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/event.py +0 -0
  89. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/factory.py +0 -0
  90. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/job.py +0 -0
  91. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/listener.py +0 -0
  92. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/mail.py +0 -0
  93. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/middleware.py +0 -0
  94. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/migration.py +0 -0
  95. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/model.py +0 -0
  96. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/notification.py +0 -0
  97. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/observer.py +0 -0
  98. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/policy.py +0 -0
  99. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/request.py +0 -0
  100. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/resource.py +0 -0
  101. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/rule.py +0 -0
  102. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/make/seeder.py +0 -0
  103. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/migrate.py +0 -0
  104. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/new.py +0 -0
  105. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/queue_failed.py +0 -0
  106. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/queue_table.py +0 -0
  107. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/queue_work.py +0 -0
  108. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/route_list.py +0 -0
  109. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/schedule_list.py +0 -0
  110. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/schedule_run.py +0 -0
  111. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/serve.py +0 -0
  112. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/storage_link.py +0 -0
  113. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/tinker.py +0 -0
  114. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/upgrade.py +0 -0
  115. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/commands/view_cache.py +0 -0
  116. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/console/kernel.py +0 -0
  117. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/container/__init__.py +0 -0
  118. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/container/container.py +0 -0
  119. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/container/facade.py +0 -0
  120. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/container/provider.py +0 -0
  121. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/database/__init__.py +0 -0
  122. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/database/connection.py +0 -0
  123. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/database/factory.py +0 -0
  124. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/database/model.py +0 -0
  125. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/database/relations/__init__.py +0 -0
  126. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/database/relations/belongs_to.py +0 -0
  127. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/database/relations/belongs_to_many.py +0 -0
  128. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/database/relations/has_many.py +0 -0
  129. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/database/relations/has_one.py +0 -0
  130. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/database/schema/__init__.py +0 -0
  131. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/database/schema/migration.py +0 -0
  132. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/database/seeder.py +0 -0
  133. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/events/__init__.py +0 -0
  134. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/events/dispatcher.py +0 -0
  135. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/events/provider.py +0 -0
  136. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/events/queued.py +0 -0
  137. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/exceptions/__init__.py +0 -0
  138. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/exceptions/handler.py +0 -0
  139. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/http/__init__.py +0 -0
  140. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/http/client.py +0 -0
  141. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/http/controller.py +0 -0
  142. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/http/kernel.py +0 -0
  143. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/http/middleware/__init__.py +0 -0
  144. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/http/middleware/authenticate.py +0 -0
  145. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/http/middleware/cors.py +0 -0
  146. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/http/middleware/csrf.py +0 -0
  147. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/http/middleware/session.py +0 -0
  148. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/http/middleware/throttle.py +0 -0
  149. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/http/middleware/verified.py +0 -0
  150. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/http/request.py +0 -0
  151. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/http/response.py +0 -0
  152. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/http/route.py +0 -0
  153. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/http/router.py +0 -0
  154. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/log/__init__.py +0 -0
  155. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/log/manager.py +0 -0
  156. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/mail/__init__.py +0 -0
  157. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/mail/mailable.py +0 -0
  158. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/mail/manager.py +0 -0
  159. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/mail/message.py +0 -0
  160. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/notifications/__init__.py +0 -0
  161. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/notifications/channels/__init__.py +0 -0
  162. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/notifications/channels/database.py +0 -0
  163. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/notifications/channels/mail.py +0 -0
  164. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/notifications/fake.py +0 -0
  165. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/notifications/notifiable.py +0 -0
  166. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/notifications/notification.py +0 -0
  167. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/queue/__init__.py +0 -0
  168. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/queue/drivers/__init__.py +0 -0
  169. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/queue/drivers/database.py +0 -0
  170. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/queue/drivers/redis.py +0 -0
  171. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/queue/drivers/sync.py +0 -0
  172. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/queue/job.py +0 -0
  173. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/queue/manager.py +0 -0
  174. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/scheduling/__init__.py +0 -0
  175. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/scheduling/cron.py +0 -0
  176. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/scheduling/scheduler.py +0 -0
  177. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/security/__init__.py +0 -0
  178. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/security/signing.py +0 -0
  179. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/session/__init__.py +0 -0
  180. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/session/store.py +0 -0
  181. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/storage/__init__.py +0 -0
  182. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/storage/local.py +0 -0
  183. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/storage/manager.py +0 -0
  184. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/storage/s3.py +0 -0
  185. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/support/__init__.py +0 -0
  186. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/support/collection.py +0 -0
  187. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/support/helpers.py +0 -0
  188. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/support/str.py +0 -0
  189. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/testing/__init__.py +0 -0
  190. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/testing/fakes.py +0 -0
  191. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/testing/test_case.py +0 -0
  192. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/translation/__init__.py +0 -0
  193. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/translation/provider.py +0 -0
  194. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/translation/translator.py +0 -0
  195. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/validation/__init__.py +0 -0
  196. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/validation/form_request.py +0 -0
  197. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/validation/rules.py +0 -0
  198. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/validation/validator.py +0 -0
  199. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/view/__init__.py +0 -0
  200. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/view/directives.py +0 -0
  201. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/view/factory.py +0 -0
  202. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/views/auth/forgot_password.html +0 -0
  203. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/views/auth/layout.html +0 -0
  204. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/views/auth/login.html +0 -0
  205. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/views/auth/register.html +0 -0
  206. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/src/hunt/views/auth/reset_password.html +0 -0
  207. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/stubs/controller.stub +0 -0
  208. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/stubs/middleware.stub +0 -0
  209. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/stubs/migration.stub +0 -0
  210. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/stubs/model.stub +0 -0
  211. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/__init__.py +0 -0
  212. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/feature/__init__.py +0 -0
  213. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/feature/test_http.py +0 -0
  214. {hunt_framework-0.2.2/tests/unit → hunt_framework-0.2.4/tests/integration}/__init__.py +0 -0
  215. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_cache_commands.py +0 -0
  216. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_container.py +0 -0
  217. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_directives.py +0 -0
  218. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_event_service_provider.py +0 -0
  219. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_key_generate.py +0 -0
  220. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_make_admin_resource.py +0 -0
  221. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_make_commands.py +0 -0
  222. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_model.py +0 -0
  223. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_phase_a.py +0 -0
  224. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_phase_b.py +0 -0
  225. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_phase_c.py +0 -0
  226. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_phase_d.py +0 -0
  227. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_phase_e.py +0 -0
  228. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_phase_f.py +0 -0
  229. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_phase_g.py +0 -0
  230. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_phase_h.py +0 -0
  231. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_phase_i.py +0 -0
  232. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_phase_j.py +0 -0
  233. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_phase_k.py +0 -0
  234. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_phase_l.py +0 -0
  235. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_phase_m.py +0 -0
  236. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_route_list.py +0 -0
  237. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_router.py +0 -0
  238. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_scheduler.py +0 -0
  239. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_upgrade.py +0 -0
  240. {hunt_framework-0.2.2 → hunt_framework-0.2.4}/tests/unit/test_validation.py +0 -0
@@ -11,6 +11,26 @@ hunt uses [semantic versioning](https://semver.org/spec/v2.0.0.html).
11
11
 
12
12
  ---
13
13
 
14
+ ## [0.2.4] — 2026-05-19
15
+
16
+ ### Fixed
17
+
18
+ - `QueryBuilder.count()` no longer forwards `ORDER BY`, `LIMIT`, or `OFFSET` into the count query — PostgreSQL (correctly) rejects `ORDER BY` on an aggregate without a `GROUP BY`, causing paginated admin index pages to crash on non-SQLite backends
19
+
20
+ ---
21
+
22
+ ## [0.2.3] — 2026-05-18
23
+
24
+ ### Fixed
25
+
26
+ - Schema builder now generates correct DDL for MySQL and PostgreSQL — previously all DDL was SQLite-specific
27
+ - `AUTOINCREMENT` keyword replaced with `AUTO_INCREMENT` (MySQL) and `GENERATED ALWAYS AS IDENTITY` (PostgreSQL) for auto-increment primary keys
28
+ - MySQL-specific column types (`LONGTEXT`, `MEDIUMTEXT`, `TINYINT`, `DATETIME`, `DOUBLE`, `BLOB`, `FLOAT(p,s)`) are now mapped to their PostgreSQL equivalents (`TEXT`, `TEXT`, `SMALLINT`, `TIMESTAMP`, `DOUBLE PRECISION`, `BYTEA`, `REAL`/`DOUBLE PRECISION`) instead of being sent verbatim and rejected
29
+ - `UNSIGNED` modifier on integer columns now emitted for MySQL; silently omitted on PostgreSQL and SQLite where it is unsupported
30
+ - `CREATE INDEX IF NOT EXISTS` replaced with `CREATE INDEX` on MySQL, which does not support the `IF NOT EXISTS` clause for index creation
31
+
32
+ ---
33
+
14
34
  ## [0.2.0] — 2026-05-14
15
35
 
16
36
  ### Added
@@ -78,5 +98,7 @@ hunt uses [semantic versioning](https://semver.org/spec/v2.0.0.html).
78
98
 
79
99
  ---
80
100
 
81
- [Unreleased]: https://github.com/hunt-core/hunt/compare/v0.2.0...HEAD
101
+ [Unreleased]: https://github.com/hunt-core/hunt/compare/v0.2.4...HEAD
102
+ [0.2.4]: https://github.com/hunt-core/hunt/compare/v0.2.3...v0.2.4
103
+ [0.2.3]: https://github.com/hunt-core/hunt/compare/v0.2.0...v0.2.3
82
104
  [0.2.0]: https://github.com/hunt-core/hunt/releases/tag/v0.2.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.4
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.4"
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
+ ]
@@ -310,6 +310,9 @@ class QueryBuilder:
310
310
 
311
311
  def count(self) -> int:
312
312
  qb = self.select_raw("COUNT(*) as _count")
313
+ qb._order_bys = []
314
+ qb._limit_val = None
315
+ qb._offset_val = None
313
316
  sql, bindings = qb._build_select()
314
317
  rows = self._execute(sql, bindings)
315
318
  if rows:
@@ -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"