quadkit-cli 0.0.44__tar.gz → 0.0.46__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.44 → quadkit_cli-0.0.46}/PKG-INFO +14 -14
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/README.md +9 -9
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/pyproject.toml +5 -5
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/config.py +1 -1
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/events.py +1 -1
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/new.py +4 -6
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/__init__.py +2 -11
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/_lazy_exports.py +2 -11
- quadkit_cli-0.0.46/src/quadkit/cli/registry/presets.py +104 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/template.py +9 -86
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/scaffold/__init__.py +12 -4
- quadkit_cli-0.0.46/src/quadkit/cli/scaffold/metadata.py +204 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/scaffold/module_files.py +65 -24
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/scaffold/render.py +85 -3
- quadkit_cli-0.0.46/src/quadkit/cli/scaffold/specs.py +90 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/scaffold/support_files.py +18 -4
- quadkit_cli-0.0.46/tests/unit/registry/test_presets.py +87 -0
- quadkit_cli-0.0.46/tests/unit/registry/test_template.py +134 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_new.py +5 -6
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_project_layout.py +6 -8
- quadkit_cli-0.0.46/tests/unit/test_project_metadata.py +178 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_scaffold_and_validators.py +37 -28
- quadkit_cli-0.0.44/src/quadkit/cli/registry/presets.py +0 -219
- quadkit_cli-0.0.44/src/quadkit/cli/scaffold/specs.py +0 -203
- quadkit_cli-0.0.44/tests/unit/registry/test_presets.py +0 -120
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/.gitignore +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/LICENSE +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/NOTICE +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/example.yaml +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/__init__.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/assembly/__init__.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/assembly/assembler.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/__init__.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/add.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/config_utils.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/contrib.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/db.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/db_bootstrap.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/db_commands_data.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/db_commands_migrations.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/db_commands_ops.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/dev.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/gen.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/init.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/inspect.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/meta.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/project.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/py.typed +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/run.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/shell.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/system.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/config.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/constants.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/contributors/__init__.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/contributors/base.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/contributors/core.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/contributors/discovery.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/contributors/registry.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/contributors/runtime.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/decorators.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/di/__init__.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/di/provider.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/di/sub_providers/__init__.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/di/sub_providers/contributor.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/events.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/exceptions.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/generators/__init__.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/generators/base.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/generators/field_parser.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/generators/provider.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/generators/test.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/hooks.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/layout.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/lib/__init__.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/lib/config_loader.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/lib/entry_point.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/lib/naming.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/lib/templates.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/module.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/output/__init__.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/output/manager.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/package_names.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/protocols.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/py.typed +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/backend_base.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/command.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/completion.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/config.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/database.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/database_backends.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/environment.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/formatter.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/generator.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health_checks/__init__.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health_checks/base.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health_checks/deps.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health_checks/project.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health_checks/providers.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health_checks/python_env.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health_checks/tools.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health_checks/vcs_docker.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/hook.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/inspect.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/migration.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/provider.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/provider_catalog.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/provider_registry.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/secrets.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/serializer.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/server.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/task.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/telemetry.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/version.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/watcher.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/runtime/__init__.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/runtime/context.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/runtime/error_handler.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/runtime/main.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/scaffold/app_files.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/scaffold_package.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/templates/provider.py.jinja2 +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/templates/py.typed +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/templates/test_unit.py.jinja2 +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/types.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/py.typed +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/conftest.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/integration/__init__.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/integration/test_cli_lifecycle.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/test_package_structure_p1.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/__init__.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/_test_cli_contribution_system_support.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/__init__.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_config.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_config_happy_paths.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_contrib.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_events_cmd.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_inspect.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_meta.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_run.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_shell.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_system.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/di/test_config_alignment.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/lib/test_templates.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/__init__.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_completion.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_database.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_environment.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_formatter.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_health.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_hook.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_inspect_registry.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_migration.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_secrets.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_serializer.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_task.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_telemetry.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_version.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_watcher.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_base_contributor.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_constants.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_context.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_contribution_system.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_contribution_system__testclicontributorsubprovider.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_errors.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_exceptions.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_import_isolation.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_module.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_types.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_config_async.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_config_loader.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_config_save.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_config_validate.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_contributor_registry.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_contributor_runtime.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_core_contributor.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_db.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_decorators.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_dev_command.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_error_handler.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_events.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_exception_handling.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_field_parser.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_gen.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_gen_controller.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_gen_provider.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_generator_base.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_generator_option_help.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_generator_registry.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_generators_contract.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_health_checks.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_hooks.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_init_command.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_layout.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_main.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_output.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_output_json.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_project.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_provider_registry.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_round40_hardening.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_run_detection.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_server_registry.py +0 -0
- {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_storage_driver_generator.py +0 -0
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: quadkit-cli
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.46
|
|
4
4
|
Summary: Command-line interface for Quadkit Framework - Project scaffolding, code generation, and development tools
|
|
5
|
-
Project-URL: Homepage, https://
|
|
5
|
+
Project-URL: Homepage, https://oridecon.dev
|
|
6
6
|
Project-URL: Repository, https://github.com/dbtinoy-/quadkit
|
|
7
|
-
Project-URL: Documentation, https://
|
|
7
|
+
Project-URL: Documentation, https://oridecon.dev/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
|
-
Author-email: Quadkit Framework Team <
|
|
11
|
-
Maintainer-email: Quadkit Framework Team <
|
|
10
|
+
Author-email: Quadkit Framework Team <hello@oridecon.dev>
|
|
11
|
+
Maintainer-email: Quadkit Framework Team <hello@oridecon.dev>
|
|
12
12
|
License: Apache-2.0
|
|
13
13
|
License-File: LICENSE
|
|
14
14
|
License-File: NOTICE
|
|
@@ -94,7 +94,7 @@ Requires **Python >= 3.11**.
|
|
|
94
94
|
There is no code to write — the product is the command line:
|
|
95
95
|
|
|
96
96
|
```bash
|
|
97
|
-
# Create a new project (
|
|
97
|
+
# Create a new project (single `api` template); the package
|
|
98
98
|
# inside is my_api/ with app.py exposing create_app()
|
|
99
99
|
quadkit new project my-api
|
|
100
100
|
cd my-api
|
|
@@ -135,7 +135,7 @@ Global options: `--json` for machine-readable output, `--quiet`,
|
|
|
135
135
|
| `quadkit version` | framework and package versions |
|
|
136
136
|
|
|
137
137
|
Per-distribution guide:
|
|
138
|
-
[quadkit-cli reference](https://
|
|
138
|
+
[quadkit-cli reference](https://oridecon.dev/quadkit/reference/cli/).
|
|
139
139
|
|
|
140
140
|
## Optional extras
|
|
141
141
|
|
|
@@ -167,16 +167,16 @@ review release notes on upgrade. Report vulnerabilities privately per
|
|
|
167
167
|
|
|
168
168
|
## Stability
|
|
169
169
|
|
|
170
|
-
Version `0.0.
|
|
171
|
-
other
|
|
172
|
-
1.0 — pin an exact version (`quadkit-cli==0.0.
|
|
173
|
-
(`>=0.0.
|
|
174
|
-
[stability and compatibility](https://
|
|
170
|
+
Version `0.0.46` in the `0.x` series, released in lockstep with the
|
|
171
|
+
other twelve distributions; APIs may change between minor versions until
|
|
172
|
+
1.0 — pin an exact version (`quadkit-cli==0.0.46`) or a tight range
|
|
173
|
+
(`>=0.0.46,<0.1.0`). Full policy:
|
|
174
|
+
[stability and compatibility](https://oridecon.dev/quadkit/ecosystem/compatibility/).
|
|
175
175
|
|
|
176
176
|
## Links
|
|
177
177
|
|
|
178
|
-
- **Documentation** — <https://
|
|
179
|
-
- **Getting started** — <https://
|
|
178
|
+
- **Documentation** — <https://oridecon.dev/quadkit/>
|
|
179
|
+
- **Getting started** — <https://oridecon.dev/quadkit/getting-started/installation/>
|
|
180
180
|
- **Changelog** — <https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md>
|
|
181
181
|
- **Issues** — <https://github.com/dbtinoy-/quadkit/issues>
|
|
182
182
|
- **Security** — report privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md)
|
|
@@ -38,7 +38,7 @@ Requires **Python >= 3.11**.
|
|
|
38
38
|
There is no code to write — the product is the command line:
|
|
39
39
|
|
|
40
40
|
```bash
|
|
41
|
-
# Create a new project (
|
|
41
|
+
# Create a new project (single `api` template); the package
|
|
42
42
|
# inside is my_api/ with app.py exposing create_app()
|
|
43
43
|
quadkit new project my-api
|
|
44
44
|
cd my-api
|
|
@@ -79,7 +79,7 @@ Global options: `--json` for machine-readable output, `--quiet`,
|
|
|
79
79
|
| `quadkit version` | framework and package versions |
|
|
80
80
|
|
|
81
81
|
Per-distribution guide:
|
|
82
|
-
[quadkit-cli reference](https://
|
|
82
|
+
[quadkit-cli reference](https://oridecon.dev/quadkit/reference/cli/).
|
|
83
83
|
|
|
84
84
|
## Optional extras
|
|
85
85
|
|
|
@@ -111,16 +111,16 @@ review release notes on upgrade. Report vulnerabilities privately per
|
|
|
111
111
|
|
|
112
112
|
## Stability
|
|
113
113
|
|
|
114
|
-
Version `0.0.
|
|
115
|
-
other
|
|
116
|
-
1.0 — pin an exact version (`quadkit-cli==0.0.
|
|
117
|
-
(`>=0.0.
|
|
118
|
-
[stability and compatibility](https://
|
|
114
|
+
Version `0.0.46` in the `0.x` series, released in lockstep with the
|
|
115
|
+
other twelve distributions; APIs may change between minor versions until
|
|
116
|
+
1.0 — pin an exact version (`quadkit-cli==0.0.46`) or a tight range
|
|
117
|
+
(`>=0.0.46,<0.1.0`). Full policy:
|
|
118
|
+
[stability and compatibility](https://oridecon.dev/quadkit/ecosystem/compatibility/).
|
|
119
119
|
|
|
120
120
|
## Links
|
|
121
121
|
|
|
122
|
-
- **Documentation** — <https://
|
|
123
|
-
- **Getting started** — <https://
|
|
122
|
+
- **Documentation** — <https://oridecon.dev/quadkit/>
|
|
123
|
+
- **Getting started** — <https://oridecon.dev/quadkit/getting-started/installation/>
|
|
124
124
|
- **Changelog** — <https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md>
|
|
125
125
|
- **Issues** — <https://github.com/dbtinoy-/quadkit/issues>
|
|
126
126
|
- **Security** — report privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md)
|
|
@@ -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.46"
|
|
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"
|
|
@@ -47,10 +47,10 @@ dependencies = [
|
|
|
47
47
|
"tomli>=2.0.0,<3",
|
|
48
48
|
]
|
|
49
49
|
authors = [
|
|
50
|
-
{ name = "Quadkit Framework Team", email = "
|
|
50
|
+
{ name = "Quadkit Framework Team", email = "hello@oridecon.dev" },
|
|
51
51
|
]
|
|
52
52
|
maintainers = [
|
|
53
|
-
{ name = "Quadkit Framework Team", email = "
|
|
53
|
+
{ name = "Quadkit Framework Team", email = "hello@oridecon.dev" },
|
|
54
54
|
]
|
|
55
55
|
|
|
56
56
|
[project.license]
|
|
@@ -82,9 +82,9 @@ all = [
|
|
|
82
82
|
]
|
|
83
83
|
|
|
84
84
|
[project.urls]
|
|
85
|
-
Homepage = "https://
|
|
85
|
+
Homepage = "https://oridecon.dev"
|
|
86
86
|
Repository = "https://github.com/dbtinoy-/quadkit"
|
|
87
|
-
Documentation = "https://
|
|
87
|
+
Documentation = "https://oridecon.dev/quadkit/"
|
|
88
88
|
Issues = "https://github.com/dbtinoy-/quadkit/issues"
|
|
89
89
|
Changelog = "https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md"
|
|
90
90
|
|
|
@@ -35,10 +35,7 @@ def main(
|
|
|
35
35
|
"api",
|
|
36
36
|
"--template",
|
|
37
37
|
"-t",
|
|
38
|
-
help=(
|
|
39
|
-
"Project template "
|
|
40
|
-
f"(available in this install: {', '.join(template_names())})"
|
|
41
|
-
),
|
|
38
|
+
help=f"Project template (the only template: {', '.join(template_names())})",
|
|
42
39
|
),
|
|
43
40
|
directory: str = typer.Option(".", "--directory", "-d", help="Target directory"),
|
|
44
41
|
interactive: bool = typer.Option(
|
|
@@ -53,13 +50,14 @@ def main(
|
|
|
53
50
|
project_name = _valid_name(name, "Project")
|
|
54
51
|
selected_template = template
|
|
55
52
|
|
|
56
|
-
|
|
53
|
+
names = template_names()
|
|
54
|
+
if interactive and len(names) > 1:
|
|
57
55
|
import click
|
|
58
56
|
|
|
59
57
|
selected_template = typer.prompt(
|
|
60
58
|
"Select a template",
|
|
61
59
|
default="api",
|
|
62
|
-
type=click.Choice(
|
|
60
|
+
type=click.Choice(names),
|
|
63
61
|
)
|
|
64
62
|
|
|
65
63
|
try:
|
|
@@ -128,15 +128,10 @@ if TYPE_CHECKING:
|
|
|
128
128
|
TasksInspector,
|
|
129
129
|
)
|
|
130
130
|
from quadkit.cli.registry.presets import (
|
|
131
|
-
|
|
132
|
-
GraphQLPreset,
|
|
133
|
-
MicroservicePreset,
|
|
134
|
-
MinimalPreset,
|
|
131
|
+
ApiPreset,
|
|
135
132
|
Preset,
|
|
136
133
|
PresetDefinition,
|
|
137
134
|
PresetRegistry,
|
|
138
|
-
WebAPIPreset,
|
|
139
|
-
WorkerPreset,
|
|
140
135
|
)
|
|
141
136
|
from quadkit.cli.registry.provider import (
|
|
142
137
|
AdminProvider,
|
|
@@ -200,15 +195,11 @@ if TYPE_CHECKING:
|
|
|
200
195
|
get_telemetry_status,
|
|
201
196
|
)
|
|
202
197
|
from quadkit.cli.registry.template import (
|
|
203
|
-
|
|
204
|
-
GraphQLTemplate,
|
|
205
|
-
MinimalTemplate,
|
|
198
|
+
ApiTemplate,
|
|
206
199
|
ProjectBuilder,
|
|
207
200
|
ProjectTemplate,
|
|
208
201
|
TemplateConfig,
|
|
209
202
|
TemplateRegistry,
|
|
210
|
-
WebAPITemplate,
|
|
211
|
-
WorkerTemplate,
|
|
212
203
|
)
|
|
213
204
|
from quadkit.cli.registry.version import (
|
|
214
205
|
VersionInfo,
|
|
@@ -11,6 +11,8 @@ from __future__ import annotations
|
|
|
11
11
|
LAZY_IMPORTS: dict[str, str] = {
|
|
12
12
|
"AIProvider": "quadkit.cli.registry.provider",
|
|
13
13
|
"AdminProvider": "quadkit.cli.registry.provider",
|
|
14
|
+
"ApiPreset": "quadkit.cli.registry.presets",
|
|
15
|
+
"ApiTemplate": "quadkit.cli.registry.template",
|
|
14
16
|
"AuthConfigValidator": "quadkit.cli.registry.config",
|
|
15
17
|
"AuthProvider": "quadkit.cli.registry.provider",
|
|
16
18
|
"BashCompletionGenerator": "quadkit.cli.registry.completion",
|
|
@@ -46,16 +48,12 @@ LAZY_IMPORTS: dict[str, str] = {
|
|
|
46
48
|
"FishCompletionGenerator": "quadkit.cli.registry.completion",
|
|
47
49
|
"FormatOptions": "quadkit.cli.registry.formatter",
|
|
48
50
|
"FormatterRegistry": "quadkit.cli.registry.formatter",
|
|
49
|
-
"FullStackPreset": "quadkit.cli.registry.presets",
|
|
50
|
-
"FullStackTemplate": "quadkit.cli.registry.template",
|
|
51
51
|
"GeneratorAdapter": "quadkit.cli.registry.generator",
|
|
52
52
|
"GeneratorRegistry": "quadkit.cli.registry.generator",
|
|
53
53
|
"GeneratorResult": "quadkit.cli.registry.generator",
|
|
54
54
|
"GitCheck": "quadkit.cli.registry.health",
|
|
55
55
|
"GranianBackend": "quadkit.cli.registry.server",
|
|
56
|
-
"GraphQLPreset": "quadkit.cli.registry.presets",
|
|
57
56
|
"GraphQLProvider": "quadkit.cli.registry.provider",
|
|
58
|
-
"GraphQLTemplate": "quadkit.cli.registry.template",
|
|
59
57
|
"GunicornBackend": "quadkit.cli.registry.server",
|
|
60
58
|
"HealthCheck": "quadkit.cli.registry.health",
|
|
61
59
|
"HealthCheckRegistry": "quadkit.cli.registry.health",
|
|
@@ -73,10 +71,7 @@ LAZY_IMPORTS: dict[str, str] = {
|
|
|
73
71
|
"JSONFormatter": "quadkit.cli.registry.formatter",
|
|
74
72
|
"LoggingHook": "quadkit.cli.registry.hook",
|
|
75
73
|
"MessagingProvider": "quadkit.cli.registry.provider",
|
|
76
|
-
"MicroservicePreset": "quadkit.cli.registry.presets",
|
|
77
74
|
"MiddlewareInspector": "quadkit.cli.registry.inspect",
|
|
78
|
-
"MinimalPreset": "quadkit.cli.registry.presets",
|
|
79
|
-
"MinimalTemplate": "quadkit.cli.registry.template",
|
|
80
75
|
"MonitorProvider": "quadkit.cli.registry.provider",
|
|
81
76
|
"MonitoringProvider": "quadkit.cli.registry.provider",
|
|
82
77
|
"MySQLBackend": "quadkit.cli.registry.database",
|
|
@@ -141,11 +136,7 @@ LAZY_IMPORTS: dict[str, str] = {
|
|
|
141
136
|
"VersionInfo": "quadkit.cli.registry.version",
|
|
142
137
|
"VersionRegistry": "quadkit.cli.registry.version",
|
|
143
138
|
"VersionSource": "quadkit.cli.registry.version",
|
|
144
|
-
"WebAPIPreset": "quadkit.cli.registry.presets",
|
|
145
|
-
"WebAPITemplate": "quadkit.cli.registry.template",
|
|
146
139
|
"WebProvider": "quadkit.cli.registry.provider",
|
|
147
|
-
"WorkerPreset": "quadkit.cli.registry.presets",
|
|
148
|
-
"WorkerTemplate": "quadkit.cli.registry.template",
|
|
149
140
|
"YAMLFormatter": "quadkit.cli.registry.formatter",
|
|
150
141
|
"ZshCompletionGenerator": "quadkit.cli.registry.completion",
|
|
151
142
|
"create_database_connection": "quadkit.cli.registry.database",
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"""Presets registry for application presets.
|
|
2
|
+
|
|
3
|
+
This module provides a registry pattern for application presets.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import abc
|
|
9
|
+
from dataclasses import dataclass, field
|
|
10
|
+
from typing import Any, ClassVar
|
|
11
|
+
|
|
12
|
+
from quadkit.cli.package_names import packages_for
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass
|
|
16
|
+
class Preset:
|
|
17
|
+
"""A preset configuration of providers."""
|
|
18
|
+
|
|
19
|
+
name: str
|
|
20
|
+
description: str
|
|
21
|
+
packages: list[str] = field(default_factory=list)
|
|
22
|
+
config: dict[str, Any] = field(default_factory=dict)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class PresetDefinition(abc.ABC):
|
|
26
|
+
"""Abstract base class for preset definitions."""
|
|
27
|
+
|
|
28
|
+
name: ClassVar[str]
|
|
29
|
+
description: ClassVar[str]
|
|
30
|
+
packages: ClassVar[list[str]] = []
|
|
31
|
+
config: ClassVar[dict[str, Any]] = {}
|
|
32
|
+
|
|
33
|
+
@abc.abstractmethod
|
|
34
|
+
def get_preset(self) -> Preset:
|
|
35
|
+
"""Get the preset configuration."""
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class ApiPreset(PresetDefinition):
|
|
39
|
+
"""The single application preset: REST API with the web framework."""
|
|
40
|
+
|
|
41
|
+
name = "api"
|
|
42
|
+
description = "REST API with the web framework"
|
|
43
|
+
packages = packages_for("web")
|
|
44
|
+
config = {
|
|
45
|
+
"web": {"host": "0.0.0.0", "port": 8000}, # noqa: S104 — preset template default
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
def get_preset(self) -> Preset:
|
|
49
|
+
return Preset(
|
|
50
|
+
name=self.name,
|
|
51
|
+
description=self.description,
|
|
52
|
+
packages=self.packages.copy(),
|
|
53
|
+
config=self.config.copy(),
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class PresetRegistry:
|
|
58
|
+
"""Registry for application presets.
|
|
59
|
+
|
|
60
|
+
Instances are always empty — use :meth:`with_defaults` for the
|
|
61
|
+
in-package built-ins or :meth:`register` for plugin presets.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
def __init__(self) -> None:
|
|
65
|
+
self._presets: dict[str, Preset] = {}
|
|
66
|
+
|
|
67
|
+
def register(self, preset_class: type[PresetDefinition]) -> None:
|
|
68
|
+
"""Register a preset class."""
|
|
69
|
+
instance = preset_class()
|
|
70
|
+
preset = instance.get_preset()
|
|
71
|
+
self._presets[preset.name] = preset
|
|
72
|
+
|
|
73
|
+
def get(self, name: str) -> Preset | None:
|
|
74
|
+
"""Get a preset by name."""
|
|
75
|
+
return self._presets.get(name)
|
|
76
|
+
|
|
77
|
+
def get_all(self) -> dict[str, Preset]:
|
|
78
|
+
"""Get all registered presets."""
|
|
79
|
+
return self._presets.copy()
|
|
80
|
+
|
|
81
|
+
def get_choices(self) -> list[str]:
|
|
82
|
+
"""Get list of available preset names."""
|
|
83
|
+
return list(self._presets.keys())
|
|
84
|
+
|
|
85
|
+
@classmethod
|
|
86
|
+
def _default_entries(cls) -> tuple[type[PresetDefinition], ...]:
|
|
87
|
+
"""Return the built-in presets (a single one today)."""
|
|
88
|
+
return (ApiPreset,)
|
|
89
|
+
|
|
90
|
+
@classmethod
|
|
91
|
+
def with_defaults(cls) -> PresetRegistry:
|
|
92
|
+
"""Return an instance populated with the built-in presets."""
|
|
93
|
+
registry = cls()
|
|
94
|
+
for entry in cls._default_entries():
|
|
95
|
+
registry.register(entry)
|
|
96
|
+
return registry
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
__all__ = [
|
|
100
|
+
"ApiPreset",
|
|
101
|
+
"Preset",
|
|
102
|
+
"PresetDefinition",
|
|
103
|
+
"PresetRegistry",
|
|
104
|
+
]
|
|
@@ -9,7 +9,7 @@ import abc
|
|
|
9
9
|
from dataclasses import dataclass, field
|
|
10
10
|
from typing import TYPE_CHECKING, Any, ClassVar
|
|
11
11
|
|
|
12
|
-
from quadkit.cli.package_names import packages_for
|
|
12
|
+
from quadkit.cli.package_names import packages_for
|
|
13
13
|
|
|
14
14
|
if TYPE_CHECKING:
|
|
15
15
|
from pathlib import Path
|
|
@@ -43,76 +43,12 @@ class ProjectTemplate(abc.ABC):
|
|
|
43
43
|
return self.packages.copy()
|
|
44
44
|
|
|
45
45
|
|
|
46
|
-
class
|
|
47
|
-
"""
|
|
46
|
+
class ApiTemplate(ProjectTemplate):
|
|
47
|
+
"""The single project template: REST API with the web framework."""
|
|
48
48
|
|
|
49
|
-
name = "
|
|
50
|
-
description = "
|
|
51
|
-
packages =
|
|
52
|
-
"quadkit",
|
|
53
|
-
]
|
|
54
|
-
|
|
55
|
-
def get_config(self) -> TemplateConfig:
|
|
56
|
-
return TemplateConfig(
|
|
57
|
-
name=self.name,
|
|
58
|
-
description=self.description,
|
|
59
|
-
packages=self.packages,
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
class WebAPITemplate(ProjectTemplate):
|
|
64
|
-
"""REST API template."""
|
|
65
|
-
|
|
66
|
-
name = "web-api"
|
|
67
|
-
description = "REST API with web framework"
|
|
68
|
-
packages = packages_for("web", "sql")
|
|
69
|
-
|
|
70
|
-
def get_config(self) -> TemplateConfig:
|
|
71
|
-
return TemplateConfig(
|
|
72
|
-
name=self.name,
|
|
73
|
-
description=self.description,
|
|
74
|
-
packages=self.packages,
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
class GraphQLTemplate(ProjectTemplate):
|
|
79
|
-
"""GraphQL API template."""
|
|
80
|
-
|
|
81
|
-
name = "graphql"
|
|
82
|
-
description = "GraphQL API with web framework"
|
|
83
|
-
packages = packages_for("web", "sql", "graphql")
|
|
84
|
-
|
|
85
|
-
def get_config(self) -> TemplateConfig:
|
|
86
|
-
return TemplateConfig(
|
|
87
|
-
name=self.name,
|
|
88
|
-
description=self.description,
|
|
89
|
-
packages=self.packages,
|
|
90
|
-
)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
class WorkerTemplate(ProjectTemplate):
|
|
94
|
-
"""Background worker template."""
|
|
95
|
-
|
|
96
|
-
name = "worker"
|
|
97
|
-
description = "Background job processor"
|
|
98
|
-
packages = packages_for("sql", "tasks", "queue")
|
|
99
|
-
|
|
100
|
-
def get_config(self) -> TemplateConfig:
|
|
101
|
-
return TemplateConfig(
|
|
102
|
-
name=self.name,
|
|
103
|
-
description=self.description,
|
|
104
|
-
packages=self.packages,
|
|
105
|
-
)
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
class FullStackTemplate(ProjectTemplate):
|
|
109
|
-
"""Full-stack application template."""
|
|
110
|
-
|
|
111
|
-
name = "fullstack"
|
|
112
|
-
description = "Full application: auth, cache, storage, events, tasks, HTTP, monitoring"
|
|
113
|
-
packages = packages_for(
|
|
114
|
-
"web", "sql", "auth", "cache", "storage", "events", "tasks", "http", "monitor"
|
|
115
|
-
)
|
|
49
|
+
name = "api"
|
|
50
|
+
description = "REST API with the web framework"
|
|
51
|
+
packages = packages_for("web")
|
|
116
52
|
|
|
117
53
|
def get_config(self) -> TemplateConfig:
|
|
118
54
|
return TemplateConfig(
|
|
@@ -151,17 +87,8 @@ class TemplateRegistry:
|
|
|
151
87
|
|
|
152
88
|
@classmethod
|
|
153
89
|
def _default_entries(cls) -> tuple[type[ProjectTemplate], ...]:
|
|
154
|
-
"""Return templates
|
|
155
|
-
|
|
156
|
-
optional = (
|
|
157
|
-
(GraphQLTemplate, ("sql", "graphql")),
|
|
158
|
-
(WorkerTemplate, ("sql", "tasks", "queue")),
|
|
159
|
-
(FullStackTemplate, ("web", "sql", "auth", "cache", "storage", "events", "tasks", "http", "monitor")),
|
|
160
|
-
)
|
|
161
|
-
for entry, features in optional:
|
|
162
|
-
if all(provider_available(feature) for feature in features):
|
|
163
|
-
entries.append(entry)
|
|
164
|
-
return tuple(entries)
|
|
90
|
+
"""Return the built-in templates (a single one today)."""
|
|
91
|
+
return (ApiTemplate,)
|
|
165
92
|
|
|
166
93
|
@classmethod
|
|
167
94
|
def with_defaults(cls) -> TemplateRegistry:
|
|
@@ -214,13 +141,9 @@ class ProjectBuilder:
|
|
|
214
141
|
|
|
215
142
|
|
|
216
143
|
__all__ = [
|
|
217
|
-
"
|
|
218
|
-
"GraphQLTemplate",
|
|
219
|
-
"MinimalTemplate",
|
|
144
|
+
"ApiTemplate",
|
|
220
145
|
"ProjectBuilder",
|
|
221
146
|
"ProjectTemplate",
|
|
222
147
|
"TemplateConfig",
|
|
223
148
|
"TemplateRegistry",
|
|
224
|
-
"WebAPITemplate",
|
|
225
|
-
"WorkerTemplate",
|
|
226
149
|
]
|
|
@@ -4,9 +4,12 @@ Single source of truth for project bootstrapping — the catalogue lives in
|
|
|
4
4
|
:mod:`quadkit.cli.scaffold.specs`, the rendered files in
|
|
5
5
|
:mod:`quadkit.cli.scaffold.app_files`, :mod:`quadkit.cli.scaffold.module_files`
|
|
6
6
|
and :mod:`quadkit.cli.scaffold.support_files`, and the writers in
|
|
7
|
-
:mod:`quadkit.cli.scaffold.render
|
|
7
|
+
:mod:`quadkit.cli.scaffold.render`. Project metadata is rendered by
|
|
8
|
+
:func:`render_project_metadata` from an explicit :class:`ProjectMetadataContext`;
|
|
9
|
+
downstream builders can use this side-effect-free API without depending on
|
|
10
|
+
private template functions:
|
|
8
11
|
|
|
9
|
-
- ``quadkit new project
|
|
12
|
+
- ``quadkit new project`` (``commands/new.py``)
|
|
10
13
|
- ``ProjectBuilder.create_project`` (``registry/template.py``)
|
|
11
14
|
- scaffold alignment tests (``tests/unit/test_scaffold_alignment.py``)
|
|
12
15
|
|
|
@@ -15,7 +18,7 @@ Every generated file targets the **real** quadkit APIs (``Application``,
|
|
|
15
18
|
generator map** in :mod:`quadkit.cli.layout`, so a scaffolded project and
|
|
16
19
|
its generators stay aligned:
|
|
17
20
|
|
|
18
|
-
quadkit new project myapp
|
|
21
|
+
quadkit new project myapp
|
|
19
22
|
cd myapp && pip install -e .
|
|
20
23
|
quadkit gen controller users # src/myapp/controllers/users_controller.py
|
|
21
24
|
quadkit dev # WebModule auto-discovers it
|
|
@@ -36,10 +39,13 @@ and directly in pytest fixtures.
|
|
|
36
39
|
|
|
37
40
|
from __future__ import annotations
|
|
38
41
|
|
|
42
|
+
from quadkit.cli.scaffold.metadata import (
|
|
43
|
+
ProjectMetadataContext,
|
|
44
|
+
render_project_metadata,
|
|
45
|
+
)
|
|
39
46
|
from quadkit.cli.scaffold.render import render_module, render_project
|
|
40
47
|
from quadkit.cli.scaffold.specs import (
|
|
41
48
|
_TEMPLATE_SPECS,
|
|
42
|
-
TEMPLATE_ALIASES,
|
|
43
49
|
TEMPLATES,
|
|
44
50
|
ProjectTemplateSpec,
|
|
45
51
|
component_packages,
|
|
@@ -50,9 +56,11 @@ from quadkit.cli.scaffold.specs import (
|
|
|
50
56
|
|
|
51
57
|
__all__ = [
|
|
52
58
|
"TEMPLATES",
|
|
59
|
+
"ProjectMetadataContext",
|
|
53
60
|
"component_packages",
|
|
54
61
|
"render_module",
|
|
55
62
|
"render_project",
|
|
63
|
+
"render_project_metadata",
|
|
56
64
|
"resolve_template",
|
|
57
65
|
"root_output_dirs",
|
|
58
66
|
"template_names",
|