quadkit-cli 0.0.3__tar.gz → 0.0.41__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.
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/PKG-INFO +66 -32
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/README.md +44 -10
- quadkit_cli-0.0.41/example.yaml +8 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/pyproject.toml +22 -23
- quadkit_cli-0.0.41/src/quadkit/cli/commands/__init__.py +48 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/config.py +37 -10
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/db_bootstrap.py +5 -5
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/events.py +7 -6
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/init.py +3 -1
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/inspect.py +2 -1
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/meta.py +58 -38
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/new.py +6 -3
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/project.py +3 -4
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/system.py +38 -33
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/config.py +0 -3
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/contributors/core.py +4 -1
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/lib/__init__.py +0 -2
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/lib/config_loader.py +10 -2
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/output/manager.py +8 -9
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/package_names.py +42 -8
- quadkit_cli-0.0.41/src/quadkit/cli/registry/__init__.py +363 -0
- quadkit_cli-0.0.41/src/quadkit/cli/registry/_lazy_exports.py +167 -0
- quadkit_cli-0.0.41/src/quadkit/cli/registry/database.py +216 -0
- quadkit_cli-0.0.3/src/quadkit/cli/registry/database.py → quadkit_cli-0.0.41/src/quadkit/cli/registry/database_backends.py +6 -192
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/environment.py +52 -2
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health_checks/providers.py +3 -14
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/migration.py +7 -1
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/presets.py +7 -5
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/secrets.py +6 -1
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/template.py +4 -5
- quadkit_cli-0.0.41/src/quadkit/cli/runtime/__init__.py +37 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/runtime/context.py +8 -1
- quadkit_cli-0.0.41/src/quadkit/cli/runtime/main.py +330 -0
- quadkit_cli-0.0.41/src/quadkit/cli/scaffold/__init__.py +59 -0
- quadkit_cli-0.0.41/src/quadkit/cli/scaffold/app_files.py +377 -0
- quadkit_cli-0.0.41/src/quadkit/cli/scaffold/module_files.py +328 -0
- quadkit_cli-0.0.41/src/quadkit/cli/scaffold/render.py +193 -0
- quadkit_cli-0.0.41/src/quadkit/cli/scaffold/specs.py +201 -0
- quadkit_cli-0.0.41/src/quadkit/cli/scaffold/support_files.py +143 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/conftest.py +2 -4
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/test_system.py +15 -5
- quadkit_cli-0.0.41/tests/unit/registry/test_completion.py +80 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_database.py +5 -5
- quadkit_cli-0.0.41/tests/unit/registry/test_presets.py +120 -0
- quadkit_cli-0.0.41/tests/unit/test_cli_import_isolation.py +229 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_new.py +1 -1
- quadkit_cli-0.0.3/example.yaml +0 -13
- quadkit_cli-0.0.3/src/quadkit/cli/commands/__init__.py +0 -36
- quadkit_cli-0.0.3/src/quadkit/cli/lib/config_gen.py +0 -310
- quadkit_cli-0.0.3/src/quadkit/cli/lib/console.py +0 -18
- quadkit_cli-0.0.3/src/quadkit/cli/registry/__init__.py +0 -338
- quadkit_cli-0.0.3/src/quadkit/cli/runtime/__init__.py +0 -8
- quadkit_cli-0.0.3/src/quadkit/cli/runtime/main.py +0 -154
- quadkit_cli-0.0.3/src/quadkit/cli/scaffold.py +0 -1176
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/.gitignore +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/LICENSE +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/NOTICE +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/__init__.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/assembly/__init__.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/assembly/assembler.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/add.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/config_utils.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/contrib.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/db.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/db_commands_data.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/db_commands_migrations.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/db_commands_ops.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/dev.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/gen.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/py.typed +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/run.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/shell.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/constants.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/contributors/__init__.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/contributors/base.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/contributors/discovery.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/contributors/registry.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/contributors/runtime.py +1 -1
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/decorators.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/di/__init__.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/di/provider.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/di/sub_providers/__init__.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/di/sub_providers/contributor.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/events.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/exceptions.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/generators/__init__.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/generators/base.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/generators/field_parser.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/generators/provider.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/generators/test.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/hooks.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/layout.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/lib/entry_point.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/lib/naming.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/lib/templates.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/module.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/output/__init__.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/protocols.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/py.typed +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/backend_base.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/command.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/completion.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/config.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/formatter.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/generator.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health_checks/__init__.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health_checks/base.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health_checks/deps.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health_checks/project.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health_checks/python_env.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health_checks/tools.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health_checks/vcs_docker.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/hook.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/inspect.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/provider.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/provider_catalog.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/provider_registry.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/serializer.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/server.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/task.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/telemetry.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/version.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/watcher.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/runtime/error_handler.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/scaffold_package.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/templates/provider.py.jinja2 +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/templates/py.typed +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/templates/test_unit.py.jinja2 +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/types.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/py.typed +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/integration/__init__.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/integration/test_cli_lifecycle.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/test_package_structure_p1.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/__init__.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/_test_cli_contribution_system_support.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/__init__.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/test_config.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/test_config_happy_paths.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/test_contrib.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/test_inspect.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/test_meta.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/test_run.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/test_shell.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/di/test_config_alignment.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/lib/test_templates.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/__init__.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_environment.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_formatter.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_health.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_hook.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_inspect_registry.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_migration.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_secrets.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_serializer.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_task.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_telemetry.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_version.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_watcher.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_base_contributor.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_cli_constants.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_cli_context.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_cli_contribution_system.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_cli_errors.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_cli_exceptions.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_cli_module.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_cli_types.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_config_async.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_config_loader.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_config_save.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_config_validate.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_contributor_registry.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_contributor_runtime.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_core_contributor.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_db.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_decorators.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_dev_command.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_error_handler.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_events.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_exception_handling.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_field_parser.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_gen.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_gen_controller.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_gen_provider.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_generator_base.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_generator_registry.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_generators_contract.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_hooks.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_init_command.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_layout.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_main.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_output.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_output_json.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_project.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_project_layout.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_provider_registry.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_round40_hardening.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_run_detection.py +0 -0
- {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_server_registry.py +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: quadkit-cli
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.41
|
|
4
4
|
Summary: Command-line interface for Quadkit Framework - Project scaffolding, code generation, and development tools
|
|
5
|
-
Project-URL: Homepage, https://quadkit
|
|
5
|
+
Project-URL: Homepage, https://dbtinoy-.github.io/quadkit/
|
|
6
6
|
Project-URL: Repository, https://github.com/dbtinoy-/quadkit
|
|
7
|
-
Project-URL: Documentation, https://quadkit
|
|
7
|
+
Project-URL: Documentation, https://dbtinoy-.github.io/quadkit/
|
|
8
8
|
Project-URL: Issues, https://github.com/dbtinoy-/quadkit/issues
|
|
9
9
|
Project-URL: Changelog, https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md
|
|
10
10
|
Author-email: Quadkit Framework Team <team@quadkit.dev>
|
|
@@ -26,36 +26,42 @@ Classifier: Topic :: Software Development :: Code Generators
|
|
|
26
26
|
Classifier: Topic :: Utilities
|
|
27
27
|
Classifier: Typing :: Typed
|
|
28
28
|
Requires-Python: >=3.11
|
|
29
|
-
Requires-Dist: aiofiles
|
|
30
|
-
Requires-Dist:
|
|
31
|
-
Requires-Dist:
|
|
32
|
-
Requires-Dist:
|
|
33
|
-
Requires-Dist: pyyaml
|
|
29
|
+
Requires-Dist: aiofiles<26,>=23.0.0
|
|
30
|
+
Requires-Dist: click<9,>=8.1.0
|
|
31
|
+
Requires-Dist: httpx<1,>=0.25.0
|
|
32
|
+
Requires-Dist: jinja2<4,>=3.1.0
|
|
33
|
+
Requires-Dist: pyyaml<7,>=6.0
|
|
34
34
|
Requires-Dist: quadkit-contracts>=0.0.2
|
|
35
35
|
Requires-Dist: quadkit>=0.0.2
|
|
36
|
-
Requires-Dist: rich
|
|
37
|
-
Requires-Dist: shellingham
|
|
38
|
-
Requires-Dist: tomli
|
|
39
|
-
Requires-Dist: typer[all]
|
|
40
|
-
Requires-Dist: watchfiles
|
|
36
|
+
Requires-Dist: rich<14,>=13.0.0
|
|
37
|
+
Requires-Dist: shellingham<2,>=1.5.0
|
|
38
|
+
Requires-Dist: tomli<3,>=2.0.0
|
|
39
|
+
Requires-Dist: typer[all]<1,>=0.9.0
|
|
40
|
+
Requires-Dist: watchfiles<2,>=0.21.0
|
|
41
41
|
Provides-Extra: all
|
|
42
|
-
Requires-Dist: pytest-asyncio
|
|
43
|
-
Requires-Dist: pytest-cov
|
|
44
|
-
Requires-Dist: pytest
|
|
42
|
+
Requires-Dist: pytest-asyncio<2,>=0.21.0; extra == 'all'
|
|
43
|
+
Requires-Dist: pytest-cov<8,>=4.0.0; extra == 'all'
|
|
44
|
+
Requires-Dist: pytest<10,>=8.0.0; extra == 'all'
|
|
45
45
|
Requires-Dist: quadkit-testing>=0.0.2; extra == 'all'
|
|
46
46
|
Provides-Extra: dev
|
|
47
|
-
Requires-Dist: black
|
|
48
|
-
Requires-Dist: mypy
|
|
49
|
-
Requires-Dist: ruff
|
|
47
|
+
Requires-Dist: black<27,>=23.0.0; extra == 'dev'
|
|
48
|
+
Requires-Dist: mypy<3,>=1.0.0; extra == 'dev'
|
|
49
|
+
Requires-Dist: ruff<1,>=0.1.0; extra == 'dev'
|
|
50
50
|
Provides-Extra: test
|
|
51
|
-
Requires-Dist: pytest-asyncio
|
|
52
|
-
Requires-Dist: pytest-cov
|
|
53
|
-
Requires-Dist: pytest
|
|
51
|
+
Requires-Dist: pytest-asyncio<2,>=0.21.0; extra == 'test'
|
|
52
|
+
Requires-Dist: pytest-cov<8,>=4.0.0; extra == 'test'
|
|
53
|
+
Requires-Dist: pytest<10,>=8.0.0; extra == 'test'
|
|
54
54
|
Requires-Dist: quadkit-testing>=0.0.2; extra == 'test'
|
|
55
55
|
Description-Content-Type: text/markdown
|
|
56
56
|
|
|
57
57
|
# quadkit-cli
|
|
58
58
|
|
|
59
|
+

|
|
60
|
+
|
|
61
|
+
[](https://pypi.org/project/quadkit-cli/)
|
|
62
|
+
[](https://pypi.org/project/quadkit-cli/)
|
|
63
|
+
[](https://github.com/dbtinoy-/quadkit/blob/main/LICENSE)
|
|
64
|
+
|
|
59
65
|
The `quadkit` command line: project scaffolding, generators, a smart
|
|
60
66
|
runner, and administrative commands for every stage of the application
|
|
61
67
|
lifecycle. Contributor-based — other packages can register their own
|
|
@@ -63,6 +69,16 @@ commands.
|
|
|
63
69
|
|
|
64
70
|
For day-to-day Quadkit developers: scaffold, generate, run, inspect.
|
|
65
71
|
|
|
72
|
+
## The quadkit family
|
|
73
|
+
|
|
74
|
+
| Package | Role |
|
|
75
|
+
| --- | --- |
|
|
76
|
+
| [`quadkit-contracts`](https://pypi.org/project/quadkit-contracts/) | zero-dependency protocols, types, exception hierarchy |
|
|
77
|
+
| [`quadkit`](https://pypi.org/project/quadkit/) | the framework core — DI container, modules, config, logging, `Result` |
|
|
78
|
+
| [`quadkit-web`](https://pypi.org/project/quadkit-web/) | ASGI layer — controllers, routing, middleware, OpenAPI docs |
|
|
79
|
+
| [`quadkit-cli`](https://pypi.org/project/quadkit-cli/) | project scaffolding and code generators |
|
|
80
|
+
| [`quadkit-testing`](https://pypi.org/project/quadkit-testing/) | in-process test beds, fakes, fixtures |
|
|
81
|
+
|
|
66
82
|
## Installation
|
|
67
83
|
|
|
68
84
|
```bash
|
|
@@ -78,15 +94,24 @@ Requires **Python >= 3.11**.
|
|
|
78
94
|
There is no code to write — the product is the command line:
|
|
79
95
|
|
|
80
96
|
```bash
|
|
81
|
-
# Create a new project (template defaults to web-api)
|
|
97
|
+
# Create a new project (template defaults to web-api); the package
|
|
98
|
+
# inside is my_api/ with app.py exposing create_app()
|
|
82
99
|
quadkit new project my-api
|
|
100
|
+
cd my-api
|
|
83
101
|
|
|
84
102
|
# Generate application code (list all generators: quadkit gen list)
|
|
85
103
|
quadkit gen provider MyProvider
|
|
86
104
|
quadkit gen controller Orders
|
|
87
105
|
|
|
88
106
|
# Serve the application; reload is on by default, pass --no-reload in prod
|
|
89
|
-
quadkit run
|
|
107
|
+
quadkit run my_api.app:create_app --host 0.0.0.0 --port 8000 --workers 4
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Eleven generators ship today (`quadkit gen list`):
|
|
111
|
+
|
|
112
|
+
```text
|
|
113
|
+
controller middleware graphql webhook websocket exception_filter
|
|
114
|
+
interceptor error resource provider test
|
|
90
115
|
```
|
|
91
116
|
|
|
92
117
|
Global options: `--json` for machine-readable output, `--quiet`,
|
|
@@ -110,18 +135,16 @@ Global options: `--json` for machine-readable output, `--quiet`,
|
|
|
110
135
|
| `quadkit version` | framework and package versions |
|
|
111
136
|
|
|
112
137
|
Per-distribution guide:
|
|
113
|
-
[quadkit-cli reference](
|
|
138
|
+
[quadkit-cli reference](https://dbtinoy-.github.io/quadkit/reference/quadkit-cli/).
|
|
114
139
|
|
|
115
140
|
## Optional extras
|
|
116
141
|
|
|
117
|
-
|
|
118
|
-
`[all]`.
|
|
142
|
+
`[dev]` and `[test]` bundle tooling; `[all]` pulls everything.
|
|
119
143
|
|
|
120
144
|
## Configuration
|
|
121
145
|
|
|
122
146
|
The CLI reads `application.yaml` like any Quadkit application; its own
|
|
123
|
-
section is `cli` (
|
|
124
|
-
`color`, `verbose`), overridable via `QK_CLI__*`, e.g.
|
|
147
|
+
section is `cli` (`color`), overridable via `QK_CLI__*`, e.g.
|
|
125
148
|
`QK_CLI__COLOR=false`.
|
|
126
149
|
|
|
127
150
|
## Error handling
|
|
@@ -140,7 +163,7 @@ exported tree.
|
|
|
140
163
|
The CLI reads configuration and scaffolds code — it does not serve
|
|
141
164
|
traffic. As with every distribution, keep the `0.x` line pinned and
|
|
142
165
|
review release notes on upgrade. Report vulnerabilities privately per
|
|
143
|
-
[SECURITY.md](
|
|
166
|
+
[SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md).
|
|
144
167
|
|
|
145
168
|
## Stability
|
|
146
169
|
|
|
@@ -148,6 +171,17 @@ Version `0.0.3` in the `0.x` series, released in lockstep with the
|
|
|
148
171
|
other four distributions; APIs may change between minor versions until
|
|
149
172
|
1.0 — pin an exact version (`quadkit-cli==0.0.3`) or a tight range
|
|
150
173
|
(`>=0.0.3,<0.1.0`). Full policy:
|
|
151
|
-
[stability and compatibility](
|
|
174
|
+
[stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
|
|
175
|
+
|
|
176
|
+
## Links
|
|
177
|
+
|
|
178
|
+
- **Documentation** — <https://dbtinoy-.github.io/quadkit/>
|
|
179
|
+
- **Getting started** — <https://dbtinoy-.github.io/quadkit/getting-started/installation/>
|
|
180
|
+
- **Changelog** — <https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md>
|
|
181
|
+
- **Issues** — <https://github.com/dbtinoy-/quadkit/issues>
|
|
182
|
+
- **Security** — report privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md)
|
|
183
|
+
- **Contributing** — [CONTRIBUTING.md](https://github.com/dbtinoy-/quadkit/blob/main/CONTRIBUTING.md)
|
|
152
184
|
|
|
153
|
-
|
|
185
|
+
Apache-2.0 — see [LICENSE](https://github.com/dbtinoy-/quadkit/blob/main/LICENSE). "Quadkit" and the
|
|
186
|
+
Quadkit logo are trademarks of the project — see
|
|
187
|
+
[TRADEMARK.md](https://github.com/dbtinoy-/quadkit/blob/main/TRADEMARK.md).
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# quadkit-cli
|
|
2
2
|
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
[](https://pypi.org/project/quadkit-cli/)
|
|
6
|
+
[](https://pypi.org/project/quadkit-cli/)
|
|
7
|
+
[](https://github.com/dbtinoy-/quadkit/blob/main/LICENSE)
|
|
8
|
+
|
|
3
9
|
The `quadkit` command line: project scaffolding, generators, a smart
|
|
4
10
|
runner, and administrative commands for every stage of the application
|
|
5
11
|
lifecycle. Contributor-based — other packages can register their own
|
|
@@ -7,6 +13,16 @@ commands.
|
|
|
7
13
|
|
|
8
14
|
For day-to-day Quadkit developers: scaffold, generate, run, inspect.
|
|
9
15
|
|
|
16
|
+
## The quadkit family
|
|
17
|
+
|
|
18
|
+
| Package | Role |
|
|
19
|
+
| --- | --- |
|
|
20
|
+
| [`quadkit-contracts`](https://pypi.org/project/quadkit-contracts/) | zero-dependency protocols, types, exception hierarchy |
|
|
21
|
+
| [`quadkit`](https://pypi.org/project/quadkit/) | the framework core — DI container, modules, config, logging, `Result` |
|
|
22
|
+
| [`quadkit-web`](https://pypi.org/project/quadkit-web/) | ASGI layer — controllers, routing, middleware, OpenAPI docs |
|
|
23
|
+
| [`quadkit-cli`](https://pypi.org/project/quadkit-cli/) | project scaffolding and code generators |
|
|
24
|
+
| [`quadkit-testing`](https://pypi.org/project/quadkit-testing/) | in-process test beds, fakes, fixtures |
|
|
25
|
+
|
|
10
26
|
## Installation
|
|
11
27
|
|
|
12
28
|
```bash
|
|
@@ -22,15 +38,24 @@ Requires **Python >= 3.11**.
|
|
|
22
38
|
There is no code to write — the product is the command line:
|
|
23
39
|
|
|
24
40
|
```bash
|
|
25
|
-
# Create a new project (template defaults to web-api)
|
|
41
|
+
# Create a new project (template defaults to web-api); the package
|
|
42
|
+
# inside is my_api/ with app.py exposing create_app()
|
|
26
43
|
quadkit new project my-api
|
|
44
|
+
cd my-api
|
|
27
45
|
|
|
28
46
|
# Generate application code (list all generators: quadkit gen list)
|
|
29
47
|
quadkit gen provider MyProvider
|
|
30
48
|
quadkit gen controller Orders
|
|
31
49
|
|
|
32
50
|
# Serve the application; reload is on by default, pass --no-reload in prod
|
|
33
|
-
quadkit run
|
|
51
|
+
quadkit run my_api.app:create_app --host 0.0.0.0 --port 8000 --workers 4
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Eleven generators ship today (`quadkit gen list`):
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
controller middleware graphql webhook websocket exception_filter
|
|
58
|
+
interceptor error resource provider test
|
|
34
59
|
```
|
|
35
60
|
|
|
36
61
|
Global options: `--json` for machine-readable output, `--quiet`,
|
|
@@ -54,18 +79,16 @@ Global options: `--json` for machine-readable output, `--quiet`,
|
|
|
54
79
|
| `quadkit version` | framework and package versions |
|
|
55
80
|
|
|
56
81
|
Per-distribution guide:
|
|
57
|
-
[quadkit-cli reference](
|
|
82
|
+
[quadkit-cli reference](https://dbtinoy-.github.io/quadkit/reference/quadkit-cli/).
|
|
58
83
|
|
|
59
84
|
## Optional extras
|
|
60
85
|
|
|
61
|
-
|
|
62
|
-
`[all]`.
|
|
86
|
+
`[dev]` and `[test]` bundle tooling; `[all]` pulls everything.
|
|
63
87
|
|
|
64
88
|
## Configuration
|
|
65
89
|
|
|
66
90
|
The CLI reads `application.yaml` like any Quadkit application; its own
|
|
67
|
-
section is `cli` (
|
|
68
|
-
`color`, `verbose`), overridable via `QK_CLI__*`, e.g.
|
|
91
|
+
section is `cli` (`color`), overridable via `QK_CLI__*`, e.g.
|
|
69
92
|
`QK_CLI__COLOR=false`.
|
|
70
93
|
|
|
71
94
|
## Error handling
|
|
@@ -84,7 +107,7 @@ exported tree.
|
|
|
84
107
|
The CLI reads configuration and scaffolds code — it does not serve
|
|
85
108
|
traffic. As with every distribution, keep the `0.x` line pinned and
|
|
86
109
|
review release notes on upgrade. Report vulnerabilities privately per
|
|
87
|
-
[SECURITY.md](
|
|
110
|
+
[SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md).
|
|
88
111
|
|
|
89
112
|
## Stability
|
|
90
113
|
|
|
@@ -92,6 +115,17 @@ Version `0.0.3` in the `0.x` series, released in lockstep with the
|
|
|
92
115
|
other four distributions; APIs may change between minor versions until
|
|
93
116
|
1.0 — pin an exact version (`quadkit-cli==0.0.3`) or a tight range
|
|
94
117
|
(`>=0.0.3,<0.1.0`). Full policy:
|
|
95
|
-
[stability and compatibility](
|
|
118
|
+
[stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
|
|
119
|
+
|
|
120
|
+
## Links
|
|
121
|
+
|
|
122
|
+
- **Documentation** — <https://dbtinoy-.github.io/quadkit/>
|
|
123
|
+
- **Getting started** — <https://dbtinoy-.github.io/quadkit/getting-started/installation/>
|
|
124
|
+
- **Changelog** — <https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md>
|
|
125
|
+
- **Issues** — <https://github.com/dbtinoy-/quadkit/issues>
|
|
126
|
+
- **Security** — report privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md)
|
|
127
|
+
- **Contributing** — [CONTRIBUTING.md](https://github.com/dbtinoy-/quadkit/blob/main/CONTRIBUTING.md)
|
|
96
128
|
|
|
97
|
-
|
|
129
|
+
Apache-2.0 — see [LICENSE](https://github.com/dbtinoy-/quadkit/blob/main/LICENSE). "Quadkit" and the
|
|
130
|
+
Quadkit logo are trademarks of the project — see
|
|
131
|
+
[TRADEMARK.md](https://github.com/dbtinoy-/quadkit/blob/main/TRADEMARK.md).
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Copy to application.yaml and adjust to your environment. Remove sections you don't use.
|
|
2
|
+
# Full field reference: see the README Configuration section.
|
|
3
|
+
# YAML key: cli:
|
|
4
|
+
# Environment variable prefix: QK_CLI__
|
|
5
|
+
|
|
6
|
+
cli:
|
|
7
|
+
# Output
|
|
8
|
+
color: true # Enable coloured terminal output (QK_CLI__COLOR)
|
|
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
|
|
|
6
6
|
|
|
7
7
|
[project]
|
|
8
8
|
name = "quadkit-cli"
|
|
9
|
-
version = "0.0.
|
|
9
|
+
version = "0.0.41"
|
|
10
10
|
description = "Command-line interface for Quadkit Framework - Project scaffolding, code generation, and development tools"
|
|
11
11
|
readme = "README.md"
|
|
12
12
|
requires-python = ">=3.11"
|
|
@@ -33,18 +33,18 @@ classifiers = [
|
|
|
33
33
|
"Typing :: Typed",
|
|
34
34
|
]
|
|
35
35
|
dependencies = [
|
|
36
|
-
"typer[all]>=0.9.0",
|
|
37
|
-
"
|
|
38
|
-
"
|
|
36
|
+
"typer[all]>=0.9.0,<1",
|
|
37
|
+
"click>=8.1.0,<9",
|
|
38
|
+
"rich>=13.0.0,<14",
|
|
39
|
+
"jinja2>=3.1.0,<4",
|
|
39
40
|
"quadkit>=0.0.2",
|
|
40
41
|
"quadkit-contracts>=0.0.2",
|
|
41
|
-
"pyyaml>=6.0",
|
|
42
|
-
"httpx>=0.25.0",
|
|
43
|
-
"watchfiles>=0.21.0",
|
|
44
|
-
"shellingham>=1.5.0",
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"tomli>=2.0.0",
|
|
42
|
+
"pyyaml>=6.0,<7",
|
|
43
|
+
"httpx>=0.25.0,<1",
|
|
44
|
+
"watchfiles>=0.21.0,<2",
|
|
45
|
+
"shellingham>=1.5.0,<2",
|
|
46
|
+
"aiofiles>=23.0.0,<26",
|
|
47
|
+
"tomli>=2.0.0,<3",
|
|
48
48
|
]
|
|
49
49
|
authors = [
|
|
50
50
|
{ name = "Quadkit Framework Team", email = "team@quadkit.dev" },
|
|
@@ -64,27 +64,27 @@ core = "quadkit.cli.contributors.core:CoreCliContributor"
|
|
|
64
64
|
|
|
65
65
|
[project.optional-dependencies]
|
|
66
66
|
dev = [
|
|
67
|
-
"black>=23.0.0",
|
|
68
|
-
"ruff>=0.1.0",
|
|
69
|
-
"mypy>=1.0.0",
|
|
67
|
+
"black>=23.0.0,<27",
|
|
68
|
+
"ruff>=0.1.0,<1",
|
|
69
|
+
"mypy>=1.0.0,<3",
|
|
70
70
|
]
|
|
71
71
|
test = [
|
|
72
72
|
"quadkit-testing>=0.0.2",
|
|
73
|
-
"pytest>=8.0.0",
|
|
74
|
-
"pytest-asyncio>=0.21.0",
|
|
75
|
-
"pytest-cov>=4.0.0",
|
|
73
|
+
"pytest>=8.0.0,<10",
|
|
74
|
+
"pytest-asyncio>=0.21.0,<2",
|
|
75
|
+
"pytest-cov>=4.0.0,<8",
|
|
76
76
|
]
|
|
77
77
|
all = [
|
|
78
78
|
"quadkit-testing>=0.0.2",
|
|
79
|
-
"pytest>=8.0.0",
|
|
80
|
-
"pytest-asyncio>=0.21.0",
|
|
81
|
-
"pytest-cov>=4.0.0",
|
|
79
|
+
"pytest>=8.0.0,<10",
|
|
80
|
+
"pytest-asyncio>=0.21.0,<2",
|
|
81
|
+
"pytest-cov>=4.0.0,<8",
|
|
82
82
|
]
|
|
83
83
|
|
|
84
84
|
[project.urls]
|
|
85
|
-
Homepage = "https://quadkit
|
|
85
|
+
Homepage = "https://dbtinoy-.github.io/quadkit/"
|
|
86
86
|
Repository = "https://github.com/dbtinoy-/quadkit"
|
|
87
|
-
Documentation = "https://quadkit
|
|
87
|
+
Documentation = "https://dbtinoy-.github.io/quadkit/"
|
|
88
88
|
Issues = "https://github.com/dbtinoy-/quadkit/issues"
|
|
89
89
|
Changelog = "https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md"
|
|
90
90
|
|
|
@@ -169,4 +169,3 @@ addopts = ["--cov=quadkit.cli", "--cov-report=term", "--cov-fail-under=84"]
|
|
|
169
169
|
packages = [
|
|
170
170
|
"src/quadkit",
|
|
171
171
|
]
|
|
172
|
-
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""Quadkit CLI command modules.
|
|
2
|
+
|
|
3
|
+
Command modules resolve lazily (PEP 562; plans/09172026 C-01): importing a
|
|
4
|
+
single command module — e.g. ``quadkit.cli.commands.meta`` for
|
|
5
|
+
``quadkit version`` — must not import the other fourteen. The names remain
|
|
6
|
+
importable exactly as before: ``from quadkit.cli.commands import new``.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"add",
|
|
15
|
+
"config",
|
|
16
|
+
"contrib",
|
|
17
|
+
"db",
|
|
18
|
+
"dev",
|
|
19
|
+
"events",
|
|
20
|
+
"gen",
|
|
21
|
+
"init",
|
|
22
|
+
"inspect",
|
|
23
|
+
"new",
|
|
24
|
+
"project",
|
|
25
|
+
"run",
|
|
26
|
+
"shell",
|
|
27
|
+
"system",
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
_LAZY_MODULES: dict[str, str] = {
|
|
31
|
+
name: f"quadkit.cli.commands.{name}" for name in __all__
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def __getattr__(name: str) -> Any:
|
|
36
|
+
"""Import a command module on first access."""
|
|
37
|
+
module_path = _LAZY_MODULES.get(name)
|
|
38
|
+
if module_path is None:
|
|
39
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
40
|
+
from importlib import import_module
|
|
41
|
+
|
|
42
|
+
value = import_module(module_path)
|
|
43
|
+
globals()[name] = value
|
|
44
|
+
return value
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def __dir__() -> list[str]:
|
|
48
|
+
return sorted(set(globals()) | set(_LAZY_MODULES))
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import asyncio
|
|
6
|
+
from collections.abc import Callable
|
|
6
7
|
import os
|
|
7
8
|
from pathlib import Path
|
|
8
9
|
import re
|
|
9
|
-
from typing import Annotated
|
|
10
|
+
from typing import Annotated, Any
|
|
10
11
|
|
|
11
12
|
import aiofiles
|
|
12
13
|
import typer
|
|
@@ -26,11 +27,37 @@ from quadkit.cli.registry.config import (
|
|
|
26
27
|
validate_config,
|
|
27
28
|
)
|
|
28
29
|
from quadkit.cli.runtime import handle_errors
|
|
30
|
+
from quadkit.contracts.constants import DOCS_BASE_URL
|
|
29
31
|
from quadkit.contracts.exceptions.domain import ValidationError
|
|
30
32
|
|
|
31
33
|
app = typer.Typer()
|
|
32
34
|
|
|
33
35
|
|
|
36
|
+
def _write_config_yaml(out: OutputManager, data: dict[str, Any]) -> None:
|
|
37
|
+
"""Print the config as YAML."""
|
|
38
|
+
out.print(yaml.dump(data, sort_keys=False))
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _write_config_json(out: OutputManager, data: dict[str, Any]) -> None:
|
|
42
|
+
"""Print the config as JSON."""
|
|
43
|
+
from quadkit import serialization as json
|
|
44
|
+
|
|
45
|
+
out.print(json.dumps(data, indent=2))
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _write_config_table(out: OutputManager, data: dict[str, Any]) -> None:
|
|
49
|
+
"""Print the config as a two-column table."""
|
|
50
|
+
out.table(["Key", "Value"], [[k, str(v)] for k, v in data.items()])
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
#: `--format` value → writer (registry dispatch, no branch chain).
|
|
54
|
+
_CONFIG_WRITERS: dict[str, Callable[[OutputManager, dict[str, Any]], None]] = {
|
|
55
|
+
"yaml": _write_config_yaml,
|
|
56
|
+
"json": _write_config_json,
|
|
57
|
+
"table": _write_config_table,
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
|
|
34
61
|
@app.command()
|
|
35
62
|
@handle_errors
|
|
36
63
|
def show(
|
|
@@ -59,15 +86,15 @@ def show(
|
|
|
59
86
|
|
|
60
87
|
masked_config = _mask_secrets(config_data, reveal=reveal_secrets)
|
|
61
88
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
89
|
+
writer = _CONFIG_WRITERS.get(file_format)
|
|
90
|
+
if writer is None:
|
|
91
|
+
out.error(
|
|
92
|
+
f"Unsupported format: {file_format}",
|
|
93
|
+
hint=f"Use one of: {', '.join(sorted(_CONFIG_WRITERS))}",
|
|
94
|
+
)
|
|
95
|
+
raise typer.Exit(1)
|
|
66
96
|
|
|
67
|
-
|
|
68
|
-
elif file_format == "table":
|
|
69
|
-
rows = [[k, str(v)] for k, v in masked_config.items()]
|
|
70
|
-
out.table(["Key", "Value"], rows)
|
|
97
|
+
writer(out, masked_config)
|
|
71
98
|
|
|
72
99
|
asyncio.run(_run())
|
|
73
100
|
|
|
@@ -121,7 +148,7 @@ def init(
|
|
|
121
148
|
default_config,
|
|
122
149
|
header=(
|
|
123
150
|
"# Quadkit Framework Configuration\n"
|
|
124
|
-
"# Documented at
|
|
151
|
+
f"# Documented at {DOCS_BASE_URL}/config\n\n"
|
|
125
152
|
),
|
|
126
153
|
)
|
|
127
154
|
|
|
@@ -31,7 +31,7 @@ async def _bootstrap_migration_runner() -> tuple[Any, Any, Any]:
|
|
|
31
31
|
from quadkit.di.container import Container
|
|
32
32
|
from quadkit.di.orchestrator import ProviderOrchestrator
|
|
33
33
|
|
|
34
|
-
sql_provider_mod = importlib.import_module(module_for(
|
|
34
|
+
sql_provider_mod = importlib.import_module(module_for("sql", "di.provider"))
|
|
35
35
|
DBDIProvider = sql_provider_mod.DatabaseProvider
|
|
36
36
|
|
|
37
37
|
container = Container()
|
|
@@ -48,7 +48,7 @@ async def _bootstrap_migration_runner() -> tuple[Any, Any, Any]:
|
|
|
48
48
|
except ImportError:
|
|
49
49
|
# Database provider not installed — fall back to legacy direct factory.
|
|
50
50
|
try:
|
|
51
|
-
db_cli = importlib.import_module(module_for(
|
|
51
|
+
db_cli = importlib.import_module(module_for("sql", "cli"))
|
|
52
52
|
manager = db_cli.create_cli_migration_manager(db_url)
|
|
53
53
|
return manager, None, None
|
|
54
54
|
except ImportError as e:
|
|
@@ -78,9 +78,9 @@ async def _bootstrap_db_provider() -> tuple[Any, Any]:
|
|
|
78
78
|
from quadkit.di.container import Container
|
|
79
79
|
from quadkit.di.orchestrator import ProviderOrchestrator
|
|
80
80
|
|
|
81
|
-
sql_provider_mod = importlib.import_module(module_for(
|
|
81
|
+
sql_provider_mod = importlib.import_module(module_for("sql", "di.provider"))
|
|
82
82
|
DatabaseProvider = sql_provider_mod.DatabaseProvider
|
|
83
|
-
sql_config_mod = importlib.import_module(module_for(
|
|
83
|
+
sql_config_mod = importlib.import_module(module_for("sql", "config"))
|
|
84
84
|
DatabaseConfig = sql_config_mod.DatabaseConfig
|
|
85
85
|
|
|
86
86
|
container = Container()
|
|
@@ -115,7 +115,7 @@ async def get_migration_manager() -> Any:
|
|
|
115
115
|
try:
|
|
116
116
|
import os
|
|
117
117
|
|
|
118
|
-
db_cli = importlib.import_module(module_for(
|
|
118
|
+
db_cli = importlib.import_module(module_for("sql", "cli"))
|
|
119
119
|
db_url = os.environ.get("DATABASE_URL", "sqlite:///./dev.db")
|
|
120
120
|
return db_cli.create_cli_migration_manager(db_url)
|
|
121
121
|
except ImportError as e:
|
|
@@ -15,6 +15,7 @@ import typer
|
|
|
15
15
|
from quadkit.cli.output import OutputManager
|
|
16
16
|
from quadkit.cli.package_names import module_for
|
|
17
17
|
from quadkit.cli.runtime import handle_errors
|
|
18
|
+
from quadkit.contracts.constants import DOCS_BASE_URL
|
|
18
19
|
|
|
19
20
|
app = typer.Typer(name="events")
|
|
20
21
|
|
|
@@ -30,9 +31,9 @@ def _make_evolution() -> Any:
|
|
|
30
31
|
try:
|
|
31
32
|
import importlib as _importlib
|
|
32
33
|
|
|
33
|
-
_evo_mod = _importlib.import_module(module_for(
|
|
34
|
-
_reg_mod = _importlib.import_module(module_for(
|
|
35
|
-
_store_mod = _importlib.import_module(module_for(
|
|
34
|
+
_evo_mod = _importlib.import_module(module_for("events", "schema.evolution"))
|
|
35
|
+
_reg_mod = _importlib.import_module(module_for("events", "schema.registry"))
|
|
36
|
+
_store_mod = _importlib.import_module(module_for("events", "schema.store"))
|
|
36
37
|
SchemaEvolution = _evo_mod.SchemaEvolution
|
|
37
38
|
SchemaRegistry = _reg_mod.SchemaRegistry
|
|
38
39
|
InMemorySchemaStore = _store_mod.InMemorySchemaStore
|
|
@@ -90,8 +91,8 @@ def migrate(
|
|
|
90
91
|
# hard cross-extension import at module level.
|
|
91
92
|
import importlib as _importlib
|
|
92
93
|
|
|
93
|
-
_reg_mod = _importlib.import_module(module_for(
|
|
94
|
-
_store_mod = _importlib.import_module(module_for(
|
|
94
|
+
_reg_mod = _importlib.import_module(module_for("events", "schema.registry"))
|
|
95
|
+
_store_mod = _importlib.import_module(module_for("events", "schema.store"))
|
|
95
96
|
registry = _reg_mod.SchemaRegistry(store=_store_mod.InMemorySchemaStore())
|
|
96
97
|
latest = await registry.get_latest_version(event_type)
|
|
97
98
|
target = latest if latest is not None else from_version
|
|
@@ -200,4 +201,4 @@ def replay(
|
|
|
200
201
|
" [cyan]await bus.replay(event_type='UserCreated', since=start_time)[/cyan]"
|
|
201
202
|
)
|
|
202
203
|
out.print()
|
|
203
|
-
out.print("See:
|
|
204
|
+
out.print(f"See: {DOCS_BASE_URL}/events/replay")
|
|
@@ -5,6 +5,7 @@ This module provides commands for inspecting the runtime state of a Quadkit appl
|
|
|
5
5
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
|
+
from collections.abc import Callable, Mapping
|
|
8
9
|
from typing import Annotated
|
|
9
10
|
|
|
10
11
|
import typer
|
|
@@ -206,7 +207,7 @@ def main(
|
|
|
206
207
|
"""Inspect runtime state (alias for subcommands)."""
|
|
207
208
|
out = OutputManager()
|
|
208
209
|
|
|
209
|
-
commands = {
|
|
210
|
+
commands: Mapping[str, Callable[[], None]] = {
|
|
210
211
|
"providers": inspect_providers,
|
|
211
212
|
"routes": inspect_routes,
|
|
212
213
|
"middleware": inspect_middleware,
|