scaffold-ca-python 0.1.3__tar.gz → 0.1.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scaffold_ca_python-0.1.4/.release-please-manifest.json +3 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/CHANGELOG.md +7 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/PKG-INFO +14 -14
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/README.md +11 -11
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/pyproject.toml +8 -8
- scaffold_ca_python-0.1.4/specs/017-pep8-naming-validation/contracts/name-validation.md +103 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/data-model.md +4 -4
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/tasks.md +1 -1
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/delete_module.py +6 -21
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_driven_adapter.py +11 -6
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_entry_point.py +7 -5
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_helper.py +4 -4
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_model.py +4 -4
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_project.py +1 -1
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_use_case.py +6 -4
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/module_builder.py +36 -3
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/name_utils.py +14 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/pyproject_writer.py +84 -1
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/driven_adapters/da_rest_consumer.py +5 -3
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/driven_adapters/da_secrets.py +2 -2
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/ep_agent.py +2 -2
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/ep_mcp.py +7 -7
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/ep_restapi.py +8 -8
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/agent/agent.py.jinja2 +5 -4
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/app.py.jinja2 +6 -3
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/prompts.py.jinja2 +2 -2
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/resources.py.jinja2 +2 -2
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/test_app.py.jinja2 +0 -2
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/tools.py.jinja2 +2 -2
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/test_app.py.jinja2 +3 -3
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/driven_adapters_container.py.jinja2 +1 -1
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/resource_container.py.jinja2 +2 -2
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/pyproject_toml.jinja2 +15 -8
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_delete_module.py +10 -4
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_dry_run_checksum.py +2 -2
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_driven_adapter.py +29 -8
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_helper.py +21 -15
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_model.py +9 -3
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_use_case.py +17 -11
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_workflow.py +3 -3
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/core/test_name_utils.py +29 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/core/test_pyproject_writer.py +118 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/driven_adapters/test_da_rest_consumer.py +30 -5
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/driven_adapters/test_da_secrets.py +1 -1
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/test_ep_agent.py +1 -1
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/test_ep_mcp.py +5 -5
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/test_ep_restapi.py +4 -4
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/test_module_builder.py +101 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_project_templates.py +19 -0
- scaffold_ca_python-0.1.4/uv.lock +789 -0
- scaffold_ca_python-0.1.3/.release-please-manifest.json +0 -3
- scaffold_ca_python-0.1.3/specs/017-pep8-naming-validation/contracts/name-validation.md +0 -65
- scaffold_ca_python-0.1.3/uv.lock +0 -666
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/copilot-instructions.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.analyze.agent.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.checklist.agent.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.clarify.agent.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.constitution.agent.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.implement.agent.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.plan.agent.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.specify.agent.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.tasks.agent.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/agents/speckit.taskstoissues.agent.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/issue_template.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.analyze.prompt.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.checklist.prompt.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.clarify.prompt.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.constitution.prompt.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.implement.prompt.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.plan.prompt.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.specify.prompt.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.tasks.prompt.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/prompts/speckit.taskstoissues.prompt.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/pull_request_template.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/workflows/build.yml +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/workflows/dependency-review.yml +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/workflows/publish.yml +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/workflows/release-please.yml +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/workflows/scorecards-analysis.yml +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.github/workflows/secret-scanner.yml +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.gitignore +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.pre-commit-config.yaml +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.python-version +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/init-options.json +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/memory/constitution.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/check-prerequisites.sh +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/common.sh +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/create-new-feature.sh +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/setup-plan.sh +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/scripts/bash/update-agent-context.sh +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/templates/agent-file-template.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/templates/checklist-template.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/templates/constitution-template.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/templates/plan-template.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/templates/spec-template.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/.specify/templates/tasks-template.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/LICENSE +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/SECURITY.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/release-please-config.json +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/ca.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/dm.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gda.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gep.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gh.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gm.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/gpipe.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/guc.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/up.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/contracts/vs.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/data-model.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/plan.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/quickstart.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/research.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/spec.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/004-scaffold-ca-python-cli/tasks.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/006-ca-scaffold-enhancements/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/006-ca-scaffold-enhancements/plan.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/006-ca-scaffold-enhancements/spec.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/006-ca-scaffold-enhancements/tasks.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/contracts/clean-architecture.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/contracts/gda.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/contracts/gep.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/contracts/gpipe.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/data-model.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/plan.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/quickstart.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/research.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/spec.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/007-cli-usability-enhancements/tasks.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/contracts/gep.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/data-model.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/plan.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/quickstart.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/research.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/spec.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/008-fastapi-entrypoint-baseline/tasks.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/contracts/gep-restapi.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/data-model.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/plan.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/quickstart.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/research.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/spec.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/009-app-factory-split/tasks.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/data-model.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/plan.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/quickstart.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/research.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/spec.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/011-fix-restapi-cleanup/tasks.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/data-model.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/plan.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/quickstart.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/research.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/spec.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/012-fix-restapi-test-templates/tasks.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/data-model.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/plan.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/quickstart.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/research.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/spec.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/014-tests-in-src/tasks.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/data-model.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/plan.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/quickstart.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/research.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/spec.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/015-factory-builder-refactor/tasks.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/data-model.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/plan.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/research.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/spec.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/016-dedup-command-aliases/tasks.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/data-model.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/plan.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/research.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/spec.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/017-pep8-naming-validation/tasks.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/contracts/gep-mcp.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/data-model.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/plan.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/research.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/spec.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/019-mcp-entry-point-restructure/tasks.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/checklists/requirements.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/contracts/readme-outline.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/plan.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/quickstart.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/research.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/spec.md +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/cli.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/generate_pipeline.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/update_project.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/commands/validate_structure.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/file_writer.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/project_detector.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/structure_validator.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/core/template_renderer.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/driven_adapters/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/driven_adapters/da_generic.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/entry_points/ep_generic.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/delete_module_factory.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/helper_factory.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/model_factory.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/factory/simple/use_case_factory.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/context.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/file_operation.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/layer.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/models/violation.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/generic/__init__.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/generic/adapter.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/generic/test_adapter.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/rest_consumer/__init__.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/rest_consumer/rest_consumer.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/rest_consumer/test_rest_consumer.py.jinja2 +1 -1
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/secrets/__init__.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/secrets/secrets_adapter.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/driven_adapter/secrets/test_secrets_adapter.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/agent/__init__.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/agent/card.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/agent/entrypoint_main.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/agent/test_agent.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/generic/__init__.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/generic/entrypoint_main.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/generic/handler.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/generic/test_handler.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/__init__.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/server.py.jinja2 +1 -1
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/test_prompts.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/test_resources.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/mcp/test_tools.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/__init__.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/app.py.jinja2 +1 -1
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/exception_handler.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/health.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/rest_controller.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/server.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/test_exception_handler.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/test_rest_controller.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/entry_point/restapi/test_server.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/helper/__init__.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/helper/helper.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/helper/test_helper.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/model/model.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/model/test_model.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/pipeline/azure/azure_pipelines.yml.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/pipeline/github/ci.yml.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/README.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/__init__.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/config.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/container.py.jinja2 +1 -1
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/application/config/usecases_container.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/dockerfile.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/dockerignore.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/gitignore.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/layer_init.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/main.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/mypy_ini.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/project/python_version.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/use_case/test_use_case.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/src/scaffold_ca_python/templates/use_case/use_case.py.jinja2 +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_cli.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_entry_point.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_pipeline.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_generate_project.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_performance.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_update_project.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/commands/test_validate_structure.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/conftest.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/core/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/core/test_file_writer.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/core/test_project_detector.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/core/test_structure_validator.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/core/test_template_renderer.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/driven_adapters/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/driven_adapters/test_da_generic.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/entry_points/test_ep_generic.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/fixtures/dry_run_baseline.json +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/simple/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/simple/test_delete_module_factory.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/simple/test_helper_factory.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/simple/test_model_factory.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/simple/test_use_case_factory.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/test_dry_run_parity.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/test_extensibility.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/factory/test_registry.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/models/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/models/test_context.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/models/test_file_operation.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/models/test_layer.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/models/test_violation.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/__init__.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_di_config_templates.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_docker_templates.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_driven_adapter_templates.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_entry_point_templates.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_entrypoint_main_templates.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_helper_templates.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_model_templates.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_pipeline_templates.py +0 -0
- {scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/tests/templates/test_use_case_templates.py +0 -0
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.1.4](https://github.com/bancolombia/scaffold-clean-architecture-py/compare/v0.1.3...v0.1.4) (2026-09-21)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **scaffold:** resolve template generation bugs ([8cd012a](https://github.com/bancolombia/scaffold-clean-architecture-py/commit/8cd012a18eeb2b472875e545dbdbd42b087b13b1))
|
|
9
|
+
|
|
3
10
|
## [0.1.3](https://github.com/bancolombia/scaffold-clean-architecture-py/compare/v0.1.2...v0.1.3) (2026-09-17)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: scaffold-ca-python
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.4
|
|
4
4
|
Summary: Scaffolder to generate Clean Architecture apps
|
|
5
5
|
Project-URL: Homepage, https://github.com/bancolombia/scaffold-clean-architecture-py
|
|
6
6
|
Project-URL: Repository, https://github.com/bancolombia/scaffold-clean-architecture-py
|
|
@@ -22,11 +22,11 @@ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
|
22
22
|
Classifier: Typing :: Typed
|
|
23
23
|
Requires-Python: >=3.13
|
|
24
24
|
Requires-Dist: jinja2~=3.1.6
|
|
25
|
-
Requires-Dist: pydantic~=2.13.
|
|
25
|
+
Requires-Dist: pydantic~=2.13.5
|
|
26
26
|
Requires-Dist: pyyaml~=6.0.3
|
|
27
27
|
Requires-Dist: rich~=15.0.0
|
|
28
28
|
Requires-Dist: tomli-w~=1.2.0
|
|
29
|
-
Requires-Dist: typer~=0.
|
|
29
|
+
Requires-Dist: typer~=0.27.2
|
|
30
30
|
Description-Content-Type: text/markdown
|
|
31
31
|
|
|
32
32
|
# scaffold-ca-python
|
|
@@ -80,7 +80,7 @@ cd my-app
|
|
|
80
80
|
3. Generate a domain model.
|
|
81
81
|
|
|
82
82
|
```bash
|
|
83
|
-
scaffold gm --name
|
|
83
|
+
scaffold gm --name order
|
|
84
84
|
```
|
|
85
85
|
|
|
86
86
|
4. Validate the project structure.
|
|
@@ -108,11 +108,11 @@ scaffold ca --name my-project --dry-run
|
|
|
108
108
|
Scaffold a Pydantic v2 domain model and its test stub.
|
|
109
109
|
|
|
110
110
|
```bash
|
|
111
|
-
scaffold gm --name
|
|
111
|
+
scaffold gm --name order
|
|
112
112
|
```
|
|
113
113
|
|
|
114
114
|
```bash
|
|
115
|
-
scaffold gm --name
|
|
115
|
+
scaffold gm --name order --dry-run
|
|
116
116
|
```
|
|
117
117
|
|
|
118
118
|
### scaffold guc
|
|
@@ -120,11 +120,11 @@ scaffold gm --name Order --dry-run
|
|
|
120
120
|
Scaffold a use case in `domain/usecase/`.
|
|
121
121
|
|
|
122
122
|
```bash
|
|
123
|
-
scaffold guc --name
|
|
123
|
+
scaffold guc --name create_order
|
|
124
124
|
```
|
|
125
125
|
|
|
126
126
|
```bash
|
|
127
|
-
scaffold guc --name
|
|
127
|
+
scaffold guc --name create_order --dry-run
|
|
128
128
|
```
|
|
129
129
|
|
|
130
130
|
### scaffold gda
|
|
@@ -136,7 +136,7 @@ scaffold gda --type rest-consumer
|
|
|
136
136
|
```
|
|
137
137
|
|
|
138
138
|
```bash
|
|
139
|
-
scaffold gda --type generic --name
|
|
139
|
+
scaffold gda --type generic --name my_adapter --dry-run
|
|
140
140
|
```
|
|
141
141
|
|
|
142
142
|
### scaffold gep
|
|
@@ -156,11 +156,11 @@ scaffold gep --type mcp --with-resources --with-prompts --dry-run
|
|
|
156
156
|
Scaffold a helper utility module and its test stub.
|
|
157
157
|
|
|
158
158
|
```bash
|
|
159
|
-
scaffold gh --name
|
|
159
|
+
scaffold gh --name json_parser
|
|
160
160
|
```
|
|
161
161
|
|
|
162
162
|
```bash
|
|
163
|
-
scaffold gh --name
|
|
163
|
+
scaffold gh --name json_parser --dry-run
|
|
164
164
|
```
|
|
165
165
|
|
|
166
166
|
### scaffold gpipe
|
|
@@ -192,11 +192,11 @@ scaffold vs --dry-run
|
|
|
192
192
|
Delete a previously generated module and its mirrored test file.
|
|
193
193
|
|
|
194
194
|
```bash
|
|
195
|
-
scaffold dm --name
|
|
195
|
+
scaffold dm --name order
|
|
196
196
|
```
|
|
197
197
|
|
|
198
198
|
```bash
|
|
199
|
-
scaffold dm --name
|
|
199
|
+
scaffold dm --name order --dry-run
|
|
200
200
|
```
|
|
201
201
|
|
|
202
202
|
### scaffold up
|
|
@@ -217,7 +217,7 @@ scaffold update-project --dry-run
|
|
|
217
217
|
|----------------|---------|------|
|
|
218
218
|
| Python | >=3.13 | Runtime |
|
|
219
219
|
| uv | latest | Dependency management, build, and publish |
|
|
220
|
-
| Typer | >=0.
|
|
220
|
+
| Typer | >=0.27.2 | CLI framework |
|
|
221
221
|
| Rich | >=15.0.0 | Terminal output formatting |
|
|
222
222
|
| Jinja2 | >=3.1 | Template engine for code generation |
|
|
223
223
|
| Pydantic v2 | >=2.0 | Runtime validation of template context |
|
|
@@ -49,7 +49,7 @@ cd my-app
|
|
|
49
49
|
3. Generate a domain model.
|
|
50
50
|
|
|
51
51
|
```bash
|
|
52
|
-
scaffold gm --name
|
|
52
|
+
scaffold gm --name order
|
|
53
53
|
```
|
|
54
54
|
|
|
55
55
|
4. Validate the project structure.
|
|
@@ -77,11 +77,11 @@ scaffold ca --name my-project --dry-run
|
|
|
77
77
|
Scaffold a Pydantic v2 domain model and its test stub.
|
|
78
78
|
|
|
79
79
|
```bash
|
|
80
|
-
scaffold gm --name
|
|
80
|
+
scaffold gm --name order
|
|
81
81
|
```
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
|
-
scaffold gm --name
|
|
84
|
+
scaffold gm --name order --dry-run
|
|
85
85
|
```
|
|
86
86
|
|
|
87
87
|
### scaffold guc
|
|
@@ -89,11 +89,11 @@ scaffold gm --name Order --dry-run
|
|
|
89
89
|
Scaffold a use case in `domain/usecase/`.
|
|
90
90
|
|
|
91
91
|
```bash
|
|
92
|
-
scaffold guc --name
|
|
92
|
+
scaffold guc --name create_order
|
|
93
93
|
```
|
|
94
94
|
|
|
95
95
|
```bash
|
|
96
|
-
scaffold guc --name
|
|
96
|
+
scaffold guc --name create_order --dry-run
|
|
97
97
|
```
|
|
98
98
|
|
|
99
99
|
### scaffold gda
|
|
@@ -105,7 +105,7 @@ scaffold gda --type rest-consumer
|
|
|
105
105
|
```
|
|
106
106
|
|
|
107
107
|
```bash
|
|
108
|
-
scaffold gda --type generic --name
|
|
108
|
+
scaffold gda --type generic --name my_adapter --dry-run
|
|
109
109
|
```
|
|
110
110
|
|
|
111
111
|
### scaffold gep
|
|
@@ -125,11 +125,11 @@ scaffold gep --type mcp --with-resources --with-prompts --dry-run
|
|
|
125
125
|
Scaffold a helper utility module and its test stub.
|
|
126
126
|
|
|
127
127
|
```bash
|
|
128
|
-
scaffold gh --name
|
|
128
|
+
scaffold gh --name json_parser
|
|
129
129
|
```
|
|
130
130
|
|
|
131
131
|
```bash
|
|
132
|
-
scaffold gh --name
|
|
132
|
+
scaffold gh --name json_parser --dry-run
|
|
133
133
|
```
|
|
134
134
|
|
|
135
135
|
### scaffold gpipe
|
|
@@ -161,11 +161,11 @@ scaffold vs --dry-run
|
|
|
161
161
|
Delete a previously generated module and its mirrored test file.
|
|
162
162
|
|
|
163
163
|
```bash
|
|
164
|
-
scaffold dm --name
|
|
164
|
+
scaffold dm --name order
|
|
165
165
|
```
|
|
166
166
|
|
|
167
167
|
```bash
|
|
168
|
-
scaffold dm --name
|
|
168
|
+
scaffold dm --name order --dry-run
|
|
169
169
|
```
|
|
170
170
|
|
|
171
171
|
### scaffold up
|
|
@@ -186,7 +186,7 @@ scaffold update-project --dry-run
|
|
|
186
186
|
|----------------|---------|------|
|
|
187
187
|
| Python | >=3.13 | Runtime |
|
|
188
188
|
| uv | latest | Dependency management, build, and publish |
|
|
189
|
-
| Typer | >=0.
|
|
189
|
+
| Typer | >=0.27.2 | CLI framework |
|
|
190
190
|
| Rich | >=15.0.0 | Terminal output formatting |
|
|
191
191
|
| Jinja2 | >=3.1 | Template engine for code generation |
|
|
192
192
|
| Pydantic v2 | >=2.0 | Runtime validation of template context |
|
|
@@ -24,25 +24,25 @@ classifiers = [
|
|
|
24
24
|
]
|
|
25
25
|
dependencies = [
|
|
26
26
|
"jinja2~=3.1.6",
|
|
27
|
-
"pydantic~=2.13.
|
|
27
|
+
"pydantic~=2.13.5",
|
|
28
28
|
"pyyaml~=6.0.3",
|
|
29
29
|
"tomli-w~=1.2.0",
|
|
30
|
-
"typer~=0.
|
|
30
|
+
"typer~=0.27.2",
|
|
31
31
|
"rich~=15.0.0",
|
|
32
32
|
]
|
|
33
33
|
|
|
34
34
|
[dependency-groups]
|
|
35
35
|
dev = [
|
|
36
36
|
{ include-group = "tests" },
|
|
37
|
-
"prek>=0.3
|
|
38
|
-
"types-pyyaml>=6.0.12.
|
|
37
|
+
"prek>=0.5.3",
|
|
38
|
+
"types-pyyaml>=6.0.12.20260906",
|
|
39
39
|
]
|
|
40
40
|
|
|
41
41
|
tests = [
|
|
42
|
-
"ruff>=0.
|
|
43
|
-
"mypy>=
|
|
44
|
-
"pytest>=9.
|
|
45
|
-
"pytest-benchmark>=5.
|
|
42
|
+
"ruff>=0.16.8",
|
|
43
|
+
"mypy>=2.3.1",
|
|
44
|
+
"pytest>=9.1.1",
|
|
45
|
+
"pytest-benchmark>=5.3.0",
|
|
46
46
|
"pytest-cov>=7.1.0",
|
|
47
47
|
]
|
|
48
48
|
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Contract: `--name` Argument Validation
|
|
2
|
+
|
|
3
|
+
**Type**: CLI input validation contract
|
|
4
|
+
**Applies to**: Scaffold commands accepting `--name`
|
|
5
|
+
|
|
6
|
+
The naming policy is split by command family (`gep` takes `--type`, not `--name`):
|
|
7
|
+
|
|
8
|
+
| Command family | Commands | Accepted input |
|
|
9
|
+
|----------------|----------|----------------|
|
|
10
|
+
| Project | `ca` | `kebab-case` **or** `snake_case` |
|
|
11
|
+
| Module/class | `gm`, `guc`, `gh`, `gda --type generic`, `dm` | `snake_case` only |
|
|
12
|
+
|
|
13
|
+
Rationale: `ca` names a project directory and PyPI distribution, where `kebab-case` is
|
|
14
|
+
idiomatic. `gm`/`guc`/`gh`/`gda`/`dm` generate a Python module (`snake_case` file) plus a
|
|
15
|
+
`PascalCase` class; accepting `kebab-case` there is ambiguous noise, so only `snake_case`
|
|
16
|
+
(the PEP8 module form) is allowed.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Accepted Values — `ca` (kebab-case or snake_case)
|
|
21
|
+
|
|
22
|
+
A valid `ca --name` value MUST match:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
^[a-z][a-z0-9]*([_-][a-z0-9]+)*$
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
| Format | Example | Accepted |
|
|
29
|
+
|--------|---------|----------|
|
|
30
|
+
| Single lowercase word | `order` | ✅ |
|
|
31
|
+
| `snake_case` | `my_project` | ✅ |
|
|
32
|
+
| `kebab-case` | `my-project` | ✅ |
|
|
33
|
+
| Alphanumeric (no separator) | `project2025` | ✅ |
|
|
34
|
+
| `PascalCase` | `MyProject` | ❌ |
|
|
35
|
+
| `camelCase` | `myProject` | ❌ |
|
|
36
|
+
| Consecutive separators | `my--project` | ❌ |
|
|
37
|
+
| Leading/trailing separator | `-my`, `my_` | ❌ |
|
|
38
|
+
| Starts with digit | `1project` | ❌ |
|
|
39
|
+
| Special characters | `my@project` | ❌ |
|
|
40
|
+
| Empty string | `` | ❌ |
|
|
41
|
+
|
|
42
|
+
## Accepted Values — module/class commands (snake_case only)
|
|
43
|
+
|
|
44
|
+
A valid `--name` value for `gm`/`guc`/`gh`/`gda --type generic`/`dm` MUST match:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
^[a-z][a-z0-9]*(_[a-z0-9]+)*$
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
| Format | Example | Accepted |
|
|
51
|
+
|--------|---------|----------|
|
|
52
|
+
| Single lowercase word | `order` | ✅ |
|
|
53
|
+
| `snake_case` | `create_order` | ✅ |
|
|
54
|
+
| `kebab-case` | `create-order` | ❌ |
|
|
55
|
+
| `PascalCase` | `CreateOrder` | ❌ |
|
|
56
|
+
| `camelCase` | `createOrder` | ❌ |
|
|
57
|
+
|
|
58
|
+
The error message for these commands MUST mention `snake_case` (e.g.,
|
|
59
|
+
`Invalid name 'create-order'. Use snake_case (e.g., 'create_order').`).
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Error Response (invalid name)
|
|
64
|
+
|
|
65
|
+
When validation fails, the tool MUST exit with code **1** and print to stdout:
|
|
66
|
+
|
|
67
|
+
- For `ca`: a message containing both `kebab-case` and `snake_case`.
|
|
68
|
+
```
|
|
69
|
+
Error: Invalid name 'MyProject'. Use kebab-case (e.g., 'my-project') or snake_case (e.g., 'my_project').
|
|
70
|
+
```
|
|
71
|
+
- For module/class commands: a message containing `snake_case`.
|
|
72
|
+
```
|
|
73
|
+
Error: Invalid name 'create-order'. Use snake_case (e.g., 'create_order').
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Internal Normalisation
|
|
79
|
+
|
|
80
|
+
For `ca`, `kebab-case` input is silently normalised to `snake_case` for the Python package
|
|
81
|
+
(`to_snake_case`) and kept as `kebab-case` for the distribution script (`to_kebab_case`); no
|
|
82
|
+
warning is printed. Module/class commands only accept `snake_case`, so their input needs no
|
|
83
|
+
kebab normalisation; the `PascalCase` class name is still derived via `to_pascal_case`.
|
|
84
|
+
|
|
85
|
+
The normalisation helpers themselves remain kebab-tolerant (they are also fed `ProjectContext`/
|
|
86
|
+
`ModuleContext` values built directly in tests):
|
|
87
|
+
|
|
88
|
+
| Input | Module name | Class name |
|
|
89
|
+
|-------|-------------|------------|
|
|
90
|
+
| `create_order` | `create_order` | `CreateOrder` |
|
|
91
|
+
| `order` | `order` | `Order` |
|
|
92
|
+
| `my_order_service` | `my_order_service` | `MyOrderService` |
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Invariants
|
|
97
|
+
|
|
98
|
+
1. **Generated `.py` file names**: always `snake_case` — `[a-z][a-z0-9_]*\.py`
|
|
99
|
+
2. **Generated `class` names**: always `PascalCase` — `[A-Z][a-zA-Z0-9]*`
|
|
100
|
+
3. **Validation applies regardless of `--dry-run`**
|
|
101
|
+
4. **Validation policy is split by command family** — `ca` accepts `kebab-case`/`snake_case`;
|
|
102
|
+
`gm`/`guc`/`gh`/`gda --type generic`/`dm` accept `snake_case` only; `gep` takes `--type`,
|
|
103
|
+
not `--name`. No command bypasses its family's rule.
|
{scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/data-model.md
RENAMED
|
@@ -107,14 +107,14 @@ Commands covered (10 total):
|
|
|
107
107
|
| Command | Alias | Example invocation |
|
|
108
108
|
|---------|-------|--------------------|
|
|
109
109
|
| `clean-architecture` | `ca` | `scaffold ca --name my-project` |
|
|
110
|
-
| `generate-model` | `gm` | `scaffold gm --name
|
|
111
|
-
| `generate-use-case` | `guc` | `scaffold guc --name
|
|
110
|
+
| `generate-model` | `gm` | `scaffold gm --name order` |
|
|
111
|
+
| `generate-use-case` | `guc` | `scaffold guc --name create_order` |
|
|
112
112
|
| `generate-driven-adapter` | `gda` | `scaffold gda --type rest-consumer` |
|
|
113
113
|
| `generate-entry-point` | `gep` | `scaffold gep --type restapi` / `--type mcp` |
|
|
114
|
-
| `generate-helper` | `gh` | `scaffold gh --name
|
|
114
|
+
| `generate-helper` | `gh` | `scaffold gh --name logging_helper` |
|
|
115
115
|
| `generate-pipeline` | `gpipe` | `scaffold gpipe --provider github` |
|
|
116
116
|
| `validate-structure` | `vs` | `scaffold vs` |
|
|
117
|
-
| `delete-module` | `dm` | `scaffold dm --name
|
|
117
|
+
| `delete-module` | `dm` | `scaffold dm --name order` |
|
|
118
118
|
| `update-project` | `up` | `scaffold up` |
|
|
119
119
|
|
|
120
120
|
### Technologies table schema
|
{scaffold_ca_python-0.1.3 → scaffold_ca_python-0.1.4}/specs/020-pypi-publish-readme/tasks.md
RENAMED
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
- [X] T009 [US2] Write Section 1 (title + badges) in `README.md` — H1 heading + PyPI version badge + Python badge + MIT license badge (absolute Shields.io URLs)
|
|
56
56
|
- [X] T010 [US2] Write Section 2 ("What is this?") in `README.md` — 2–4 sentences covering Clean Architecture, Python, CLI code scaffolding (no framework names)
|
|
57
57
|
- [X] T011 [US2] Write Section 3 ("Installation") in `README.md` — `pip install scaffold-ca-python` and `uv add scaffold-ca-python` fenced blocks + Python ≥3.13 note
|
|
58
|
-
- [X] T012 [US2] Write Section 4 ("Quick Start") in `README.md` — numbered 4-step walkthrough: install → `scaffold ca --name my-app` → `scaffold gm --name
|
|
58
|
+
- [X] T012 [US2] Write Section 4 ("Quick Start") in `README.md` — numbered 4-step walkthrough: install → `scaffold ca --name my-app` → `scaffold gm --name order` → `scaffold vs`
|
|
59
59
|
- [X] T013 [US2] Write Section 5 ("Commands & Examples") in `README.md` — 10 `###` sub-sections (ca, gm, guc, gda, gep, gh, gpipe, vs, dm, up) each with description + fenced `bash` example per contracts/readme-outline.md
|
|
60
60
|
- [X] T014 [P] [US2] Write Section 6 ("Technologies") in `README.md` — Markdown table (Tool/Library | Version | Role) with all 11 entries from data-model.md §3
|
|
61
61
|
- [X] T015 [P] [US2] Write Section 7 ("Current Features") in `README.md` — bullet list covering all 10 commands, `--dry-run`, Jinja2 templates, Pydantic v2, Rich output, mypy strict, ruff, 80%+ coverage gate
|
|
@@ -10,7 +10,7 @@ import typer
|
|
|
10
10
|
from rich.console import Console
|
|
11
11
|
|
|
12
12
|
from scaffold_ca_python.core.module_builder import ModuleBuilder
|
|
13
|
-
from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case,
|
|
13
|
+
from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case, validate_module_name
|
|
14
14
|
from scaffold_ca_python.core.project_detector import find_project_root, resolve_tests_root
|
|
15
15
|
from scaffold_ca_python.factory import ModuleFactory
|
|
16
16
|
from scaffold_ca_python.factory.simple.delete_module_factory import DeleteModuleFactory
|
|
@@ -24,7 +24,7 @@ _REGISTRY: dict[str, type[ModuleFactory]] = {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
_DM_HELP = "Delete a previously generated module and its test mirror. Alias 'dm'."
|
|
27
|
-
_DM_EPILOG = "Examples:\n\n * scaffold dm --name
|
|
27
|
+
_DM_EPILOG = "Examples:\n\n * scaffold dm --name order\n\n * scaffold delete-module --name my_adapter\n\n"
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
# ---------------------------------------------------------------------------
|
|
@@ -32,7 +32,7 @@ _DM_EPILOG = "Examples:\n\n * scaffold dm --name Order\n\n * scaffold delete-m
|
|
|
32
32
|
# ---------------------------------------------------------------------------
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
def _find_module_targets(project_root: Path, snake: str) -> list[tuple[Path, Path | None]]:
|
|
35
|
+
def _find_module_targets(pkg: str, project_root: Path, snake: str) -> list[tuple[Path, Path | None]]:
|
|
36
36
|
"""Return a list of (target_path, test_path_or_None) for all matches of *snake*.
|
|
37
37
|
|
|
38
38
|
Searches across:
|
|
@@ -42,7 +42,6 @@ def _find_module_targets(project_root: Path, snake: str) -> list[tuple[Path, Pat
|
|
|
42
42
|
4. infrastructure/entry_points/<snake>/
|
|
43
43
|
5. infrastructure/helpers/<snake>/
|
|
44
44
|
"""
|
|
45
|
-
pkg = _get_python_package(project_root)
|
|
46
45
|
src_root = project_root / "src" / pkg
|
|
47
46
|
tests_root = resolve_tests_root(project_root)
|
|
48
47
|
|
|
@@ -77,20 +76,6 @@ def _find_module_targets(project_root: Path, snake: str) -> list[tuple[Path, Pat
|
|
|
77
76
|
return candidates
|
|
78
77
|
|
|
79
78
|
|
|
80
|
-
def _get_python_package(root: Path) -> str:
|
|
81
|
-
pyproject = root / "pyproject.toml"
|
|
82
|
-
with pyproject.open("rb") as fh:
|
|
83
|
-
data = tomllib.load(fh)
|
|
84
|
-
section = data.get("tool", {}).get("scaffold-ca-python", {})
|
|
85
|
-
name = section.get("name", root.name)
|
|
86
|
-
import re
|
|
87
|
-
|
|
88
|
-
s = name.replace("-", "_")
|
|
89
|
-
s = re.sub(r"([A-Z]+)([A-Z][a-z])", r"\1_\2", s)
|
|
90
|
-
s = re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", s)
|
|
91
|
-
return s.lower()
|
|
92
|
-
|
|
93
|
-
|
|
94
79
|
# ---------------------------------------------------------------------------
|
|
95
80
|
# Implementation
|
|
96
81
|
# ---------------------------------------------------------------------------
|
|
@@ -99,7 +84,7 @@ def _get_python_package(root: Path) -> str:
|
|
|
99
84
|
def _delete_module_impl(name: str, confirm: bool, dry_run: bool) -> None:
|
|
100
85
|
# Validate name
|
|
101
86
|
try:
|
|
102
|
-
|
|
87
|
+
validate_module_name(name)
|
|
103
88
|
except ScaffoldError as exc:
|
|
104
89
|
console.print(f"[red]Error:[/red] {exc}")
|
|
105
90
|
raise typer.Exit(code=1) from None
|
|
@@ -118,7 +103,7 @@ def _delete_module_impl(name: str, confirm: bool, dry_run: bool) -> None:
|
|
|
118
103
|
|
|
119
104
|
# Find targets
|
|
120
105
|
snake = to_snake_case(name)
|
|
121
|
-
targets = _find_module_targets(project_root, snake)
|
|
106
|
+
targets = _find_module_targets(project_ctx.python_package, project_root, snake)
|
|
122
107
|
|
|
123
108
|
if not targets:
|
|
124
109
|
console.print(
|
|
@@ -174,7 +159,7 @@ def register(app: typer.Typer) -> None:
|
|
|
174
159
|
def delete_module(
|
|
175
160
|
ctx: typer.Context,
|
|
176
161
|
name: Annotated[
|
|
177
|
-
str | None, typer.Option("--name", help="Module name (
|
|
162
|
+
str | None, typer.Option("--name", help="Module name (snake_case).", rich_help_panel="Required")
|
|
178
163
|
] = None,
|
|
179
164
|
confirm: Annotated[
|
|
180
165
|
bool,
|
|
@@ -8,10 +8,11 @@ from typing import Annotated
|
|
|
8
8
|
|
|
9
9
|
import typer
|
|
10
10
|
from rich.console import Console
|
|
11
|
+
from rich.markup import escape
|
|
11
12
|
from rich.tree import Tree
|
|
12
13
|
|
|
13
14
|
from scaffold_ca_python.core.module_builder import ModuleBuilder
|
|
14
|
-
from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case,
|
|
15
|
+
from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case, validate_module_name
|
|
15
16
|
from scaffold_ca_python.core.project_detector import find_project_root
|
|
16
17
|
from scaffold_ca_python.factory import ModuleFactory
|
|
17
18
|
from scaffold_ca_python.factory.driven_adapters.da_generic import DrivenAdapterGeneric
|
|
@@ -37,7 +38,7 @@ _GDA_EPILOG = (
|
|
|
37
38
|
" ==================================================\n\n"
|
|
38
39
|
"Examples:\n\n"
|
|
39
40
|
" * scaffold gda --type rest-consumer\n\n"
|
|
40
|
-
" * scaffold generate-driven-adapter --type generic --name
|
|
41
|
+
" * scaffold generate-driven-adapter --type generic --name my_adapter\n\n"
|
|
41
42
|
)
|
|
42
43
|
|
|
43
44
|
|
|
@@ -55,7 +56,7 @@ def _generate_driven_adapter_impl(type_: str, name: str | None, dry_run: bool) -
|
|
|
55
56
|
# --- Validate name if provided ---
|
|
56
57
|
if name:
|
|
57
58
|
try:
|
|
58
|
-
|
|
59
|
+
validate_module_name(name)
|
|
59
60
|
except ScaffoldError as exc:
|
|
60
61
|
console.print(f"[red]Error:[/red] {exc}")
|
|
61
62
|
raise typer.Exit(code=1) from None
|
|
@@ -116,8 +117,12 @@ def _generate_driven_adapter_impl(type_: str, name: str | None, dry_run: bool) -
|
|
|
116
117
|
for p in sorted(created):
|
|
117
118
|
tree.add(str(p.relative_to(project_root)))
|
|
118
119
|
console.print(tree)
|
|
119
|
-
if builder.
|
|
120
|
-
|
|
120
|
+
if builder.pending_dependencies:
|
|
121
|
+
target = escape("[project.dependencies]")
|
|
122
|
+
console.print(f"[dim]Would add to {target}: {', '.join(builder.pending_dependencies)}[/dim]")
|
|
123
|
+
for grp, pkgs in builder.pending_group_dependencies.items():
|
|
124
|
+
target = escape(f"[dependency-groups.{grp}]")
|
|
125
|
+
console.print(f"[dim]Would add to {target}: {', '.join(pkgs)}[/dim]")
|
|
121
126
|
return
|
|
122
127
|
|
|
123
128
|
console.print(f"[green]✓[/green] Driven adapter [bold]{subdir}[/bold] created. Created {len(created)} file(s).")
|
|
@@ -146,7 +151,7 @@ def register(app: typer.Typer) -> None:
|
|
|
146
151
|
str | None,
|
|
147
152
|
typer.Option(
|
|
148
153
|
"--name",
|
|
149
|
-
help="Adapter name (required for --type generic).",
|
|
154
|
+
help="Adapter name in snake_case, e.g. my_adapter (required for --type generic).",
|
|
150
155
|
rich_help_panel="Options",
|
|
151
156
|
),
|
|
152
157
|
] = None,
|
|
@@ -10,10 +10,11 @@ from typing import Annotated
|
|
|
10
10
|
import typer
|
|
11
11
|
import yaml
|
|
12
12
|
from rich.console import Console
|
|
13
|
+
from rich.markup import escape
|
|
13
14
|
from rich.tree import Tree
|
|
14
15
|
|
|
15
16
|
from scaffold_ca_python.core.module_builder import ModuleBuilder
|
|
16
|
-
from scaffold_ca_python.core.name_utils import ScaffoldError
|
|
17
|
+
from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case
|
|
17
18
|
from scaffold_ca_python.core.project_detector import find_project_root
|
|
18
19
|
from scaffold_ca_python.factory import ModuleFactory
|
|
19
20
|
from scaffold_ca_python.factory.entry_points.ep_agent import EntryPointAgent
|
|
@@ -59,7 +60,7 @@ def _load_project_context(project_root: Path) -> ProjectContext:
|
|
|
59
60
|
pyproject_path = project_root / "pyproject.toml"
|
|
60
61
|
with open(pyproject_path, "rb") as f:
|
|
61
62
|
data = tomllib.load(f)
|
|
62
|
-
project_name = data.get("project", {}).get("name", "project")
|
|
63
|
+
project_name = to_snake_case(data.get("project", {}).get("name", "project"))
|
|
63
64
|
return ProjectContext(name=project_name)
|
|
64
65
|
|
|
65
66
|
|
|
@@ -190,9 +191,10 @@ def _generate_entry_point_impl(
|
|
|
190
191
|
tree.add(str(p.relative_to(project_root)))
|
|
191
192
|
console.print(tree)
|
|
192
193
|
|
|
193
|
-
#
|
|
194
|
-
if builder.
|
|
195
|
-
|
|
194
|
+
# Report any runtime dependencies queued for injection
|
|
195
|
+
if builder.pending_dependencies:
|
|
196
|
+
target = escape("[project.dependencies]")
|
|
197
|
+
console.print(f"[dim]Would add to {target}: {', '.join(builder.pending_dependencies)}[/dim]")
|
|
196
198
|
|
|
197
199
|
if type_ == "restapi":
|
|
198
200
|
main_py = project_root / "src" / pkg / "main.py"
|
|
@@ -11,7 +11,7 @@ from rich.console import Console
|
|
|
11
11
|
from rich.tree import Tree
|
|
12
12
|
|
|
13
13
|
from scaffold_ca_python.core.module_builder import ModuleBuilder
|
|
14
|
-
from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case,
|
|
14
|
+
from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case, validate_module_name
|
|
15
15
|
from scaffold_ca_python.core.project_detector import find_project_root
|
|
16
16
|
from scaffold_ca_python.factory import ModuleFactory
|
|
17
17
|
from scaffold_ca_python.factory.simple.helper_factory import HelperFactory
|
|
@@ -25,13 +25,13 @@ _REGISTRY: dict[str, type[ModuleFactory]] = {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
_GH_HELP = "Scaffold a helper utility module and test stub. Alias 'gh'."
|
|
28
|
-
_GH_EPILOG = "Example:\n\n * scaffold gh --name
|
|
28
|
+
_GH_EPILOG = "Example:\n\n * scaffold gh --name json_parser\n\n * scaffold generate-helper --name json_parser\n\n"
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
def _generate_helper_impl(name: str, dry_run: bool) -> None:
|
|
32
32
|
# --- Validate name ---
|
|
33
33
|
try:
|
|
34
|
-
|
|
34
|
+
validate_module_name(name)
|
|
35
35
|
except ScaffoldError as exc:
|
|
36
36
|
console.print(f"[red]Error:[/red] {exc}")
|
|
37
37
|
raise typer.Exit(code=1) from None
|
|
@@ -100,7 +100,7 @@ def register(app: typer.Typer) -> None:
|
|
|
100
100
|
def generate_helper(
|
|
101
101
|
ctx: typer.Context,
|
|
102
102
|
name: Annotated[
|
|
103
|
-
str | None, typer.Option("--name", help="Helper name (
|
|
103
|
+
str | None, typer.Option("--name", help="Helper name (snake_case).", rich_help_panel="Required")
|
|
104
104
|
] = None,
|
|
105
105
|
dry_run: Annotated[
|
|
106
106
|
bool,
|
|
@@ -11,7 +11,7 @@ from rich.console import Console
|
|
|
11
11
|
from rich.tree import Tree
|
|
12
12
|
|
|
13
13
|
from scaffold_ca_python.core.module_builder import ModuleBuilder
|
|
14
|
-
from scaffold_ca_python.core.name_utils import ScaffoldError,
|
|
14
|
+
from scaffold_ca_python.core.name_utils import ScaffoldError, validate_module_name
|
|
15
15
|
from scaffold_ca_python.core.project_detector import find_project_root
|
|
16
16
|
from scaffold_ca_python.factory import ModuleFactory
|
|
17
17
|
from scaffold_ca_python.factory.simple.model_factory import ModelFactory
|
|
@@ -24,13 +24,13 @@ _REGISTRY: dict[str, type[ModuleFactory]] = {
|
|
|
24
24
|
"model": ModelFactory,
|
|
25
25
|
}
|
|
26
26
|
_GM_HELP = "Scaffold a Pydantic v2 domain model and test stub. Alias 'gm'."
|
|
27
|
-
_GM_EPILOG = "Example:\n\n * scaffold gm --name
|
|
27
|
+
_GM_EPILOG = "Example:\n\n * scaffold gm --name order\n\n * scaffold generate-model --name order\n\n"
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
def _generate_model_impl(name: str, dry_run: bool) -> None:
|
|
31
31
|
# --- Validate name ---
|
|
32
32
|
try:
|
|
33
|
-
|
|
33
|
+
validate_module_name(name)
|
|
34
34
|
except ScaffoldError as exc:
|
|
35
35
|
console.print(f"[red]Error:[/red] {exc}")
|
|
36
36
|
raise typer.Exit(code=1) from None
|
|
@@ -100,7 +100,7 @@ def register(app: typer.Typer) -> None:
|
|
|
100
100
|
def generate_model(
|
|
101
101
|
ctx: typer.Context,
|
|
102
102
|
name: Annotated[
|
|
103
|
-
str | None, typer.Option("--name", help="Model name (
|
|
103
|
+
str | None, typer.Option("--name", help="Model name (snake_case).", rich_help_panel="Required")
|
|
104
104
|
] = None,
|
|
105
105
|
dry_run: Annotated[
|
|
106
106
|
bool,
|
|
@@ -151,7 +151,7 @@ def register(app: typer.Typer) -> None:
|
|
|
151
151
|
str,
|
|
152
152
|
typer.Option(
|
|
153
153
|
"--name",
|
|
154
|
-
help="Project name (
|
|
154
|
+
help="Project name (kebab-case or snake_case).",
|
|
155
155
|
rich_help_panel="Required",
|
|
156
156
|
),
|
|
157
157
|
] = None, # type: ignore[assignment]
|
|
@@ -11,7 +11,7 @@ from rich.console import Console
|
|
|
11
11
|
from rich.tree import Tree
|
|
12
12
|
|
|
13
13
|
from scaffold_ca_python.core.module_builder import ModuleBuilder
|
|
14
|
-
from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case,
|
|
14
|
+
from scaffold_ca_python.core.name_utils import ScaffoldError, to_snake_case, validate_module_name
|
|
15
15
|
from scaffold_ca_python.core.project_detector import find_project_root
|
|
16
16
|
from scaffold_ca_python.factory import ModuleFactory
|
|
17
17
|
from scaffold_ca_python.factory.simple.use_case_factory import UseCaseFactory
|
|
@@ -24,13 +24,15 @@ _REGISTRY: dict[str, type[ModuleFactory]] = {
|
|
|
24
24
|
"use_case": UseCaseFactory,
|
|
25
25
|
}
|
|
26
26
|
_GUC_HELP = "Scaffold a use case in domain/usecase/. Alias 'guc'."
|
|
27
|
-
_GUC_EPILOG =
|
|
27
|
+
_GUC_EPILOG = (
|
|
28
|
+
"Example:\n\n * scaffold guc --name create_order\n\n * scaffold generate-use-case --name create_order\n\n"
|
|
29
|
+
)
|
|
28
30
|
|
|
29
31
|
|
|
30
32
|
def _generate_use_case_impl(name: str, dry_run: bool) -> None:
|
|
31
33
|
# --- Validate name ---
|
|
32
34
|
try:
|
|
33
|
-
|
|
35
|
+
validate_module_name(name)
|
|
34
36
|
except ScaffoldError as exc:
|
|
35
37
|
console.print(f"[red]Error:[/red] {exc}")
|
|
36
38
|
raise typer.Exit(code=1) from None
|
|
@@ -102,7 +104,7 @@ def register(app: typer.Typer) -> None:
|
|
|
102
104
|
def generate_use_case(
|
|
103
105
|
ctx: typer.Context,
|
|
104
106
|
name: Annotated[
|
|
105
|
-
str | None, typer.Option("--name", help="Use case name (
|
|
107
|
+
str | None, typer.Option("--name", help="Use case name (snake_case).", rich_help_panel="Required")
|
|
106
108
|
] = None,
|
|
107
109
|
dry_run: Annotated[
|
|
108
110
|
bool,
|