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.
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/PKG-INFO +12 -8
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/README.md +11 -7
- hunt_framework-0.2.3/docs/logo.png +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/pyproject.toml +7 -1
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/schema/blueprint.py +43 -8
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/schema/builder.py +5 -4
- hunt_framework-0.2.3/tests/integration/test_schema_dialects.py +531 -0
- hunt_framework-0.2.3/tests/unit/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/uv.lock +450 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/.github/workflows/lint.yml +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/.github/workflows/publish.yml +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/.github/workflows/tests.yml +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/.gitignore +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/CHANGELOG.md +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/CODEOWNERS +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/CODE_OF_CONDUCT.md +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/CONTRIBUTING.md +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/CONTRIBUTORS.md +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/LICENSE +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/SECURITY.md +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/action.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/application.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/console/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/console/make_admin_resource.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/controllers/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/controllers/action.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/controllers/dashboard.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/controllers/resource.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/controllers/search.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/field.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/badge.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/belongs_to.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/boolean.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/datetime_.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/has_many.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/image.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/number.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/richtext.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/select.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/text.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/fields/textarea.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/filter.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/metrics/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/metrics/partition.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/metrics/trend.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/metrics/value.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/middleware/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/middleware/gate.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/navigation.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/resource.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/templates/admin/dashboard.html +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/templates/admin/layout.html +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/templates/admin/resource/_form.html +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/templates/admin/resource/create.html +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/templates/admin/resource/edit.html +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/templates/admin/resource/index.html +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/admin/templates/admin/resource/show.html +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/application.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/auth/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/auth/gate.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/auth/manager.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/auth/passwords.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/auth/verification.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/cache/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/cache/manager.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/config/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/config/loader.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/config/repository.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/command.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/cache.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/config_cache.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/db/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/db/seed.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/key_generate.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/command.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/controller.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/event.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/factory.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/job.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/listener.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/mail.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/middleware.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/migration.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/model.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/notification.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/observer.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/policy.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/request.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/resource.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/rule.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/make/seeder.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/migrate.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/new.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/queue_failed.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/queue_table.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/queue_work.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/route_list.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/schedule_list.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/schedule_run.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/serve.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/storage_link.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/tinker.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/upgrade.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/commands/view_cache.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/console/kernel.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/container/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/container/container.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/container/facade.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/container/provider.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/connection.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/factory.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/model.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/query_builder.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/relations/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/relations/belongs_to.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/relations/belongs_to_many.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/relations/has_many.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/relations/has_one.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/schema/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/schema/migration.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/database/seeder.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/events/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/events/dispatcher.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/events/provider.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/events/queued.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/exceptions/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/exceptions/handler.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/client.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/controller.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/kernel.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/middleware/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/middleware/authenticate.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/middleware/cors.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/middleware/csrf.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/middleware/session.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/middleware/throttle.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/middleware/verified.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/request.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/response.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/route.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/http/router.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/log/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/log/manager.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/mail/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/mail/mailable.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/mail/manager.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/mail/message.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/notifications/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/notifications/channels/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/notifications/channels/database.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/notifications/channels/mail.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/notifications/fake.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/notifications/notifiable.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/notifications/notification.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/queue/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/queue/drivers/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/queue/drivers/database.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/queue/drivers/redis.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/queue/drivers/sync.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/queue/job.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/queue/manager.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/scheduling/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/scheduling/cron.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/scheduling/scheduler.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/security/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/security/signing.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/session/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/session/store.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/storage/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/storage/local.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/storage/manager.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/storage/s3.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/support/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/support/collection.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/support/helpers.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/support/str.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/testing/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/testing/fakes.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/testing/test_case.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/translation/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/translation/provider.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/translation/translator.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/validation/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/validation/form_request.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/validation/rules.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/validation/validator.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/view/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/view/directives.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/view/factory.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/views/auth/forgot_password.html +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/views/auth/layout.html +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/views/auth/login.html +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/views/auth/register.html +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/src/hunt/views/auth/reset_password.html +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/stubs/controller.stub +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/stubs/middleware.stub +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/stubs/migration.stub +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/stubs/model.stub +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/feature/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/feature/test_http.py +0 -0
- {hunt_framework-0.2.2/tests/unit → hunt_framework-0.2.3/tests/integration}/__init__.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_cache_commands.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_container.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_directives.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_event_service_provider.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_key_generate.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_make_admin_resource.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_make_commands.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_model.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_a.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_b.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_c.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_d.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_e.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_f.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_g.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_h.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_i.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_j.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_k.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_l.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_phase_m.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_route_list.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_router.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_scheduler.py +0 -0
- {hunt_framework-0.2.2 → hunt_framework-0.2.3}/tests/unit/test_upgrade.py +0 -0
- {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.
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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} {
|
|
356
|
+
sql = f"{col.name} {col_type}({col.length})"
|
|
329
357
|
else:
|
|
330
|
-
sql = f"{col.name} {
|
|
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
|
-
|
|
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"
|