scaffold-ca-python 0.1.1__py3-none-any.whl
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/__init__.py +1 -0
- scaffold_ca_python/cli.py +39 -0
- scaffold_ca_python/commands/__init__.py +0 -0
- scaffold_ca_python/commands/delete_module.py +216 -0
- scaffold_ca_python/commands/generate_driven_adapter.py +182 -0
- scaffold_ca_python/commands/generate_entry_point.py +304 -0
- scaffold_ca_python/commands/generate_helper.py +135 -0
- scaffold_ca_python/commands/generate_model.py +134 -0
- scaffold_ca_python/commands/generate_pipeline.py +158 -0
- scaffold_ca_python/commands/generate_project.py +189 -0
- scaffold_ca_python/commands/generate_use_case.py +136 -0
- scaffold_ca_python/commands/update_project.py +84 -0
- scaffold_ca_python/commands/validate_structure.py +90 -0
- scaffold_ca_python/core/__init__.py +0 -0
- scaffold_ca_python/core/file_writer.py +128 -0
- scaffold_ca_python/core/module_builder.py +127 -0
- scaffold_ca_python/core/name_utils.py +59 -0
- scaffold_ca_python/core/project_detector.py +93 -0
- scaffold_ca_python/core/pyproject_writer.py +169 -0
- scaffold_ca_python/core/structure_validator.py +142 -0
- scaffold_ca_python/core/template_renderer.py +100 -0
- scaffold_ca_python/factory/__init__.py +16 -0
- scaffold_ca_python/factory/driven_adapters/__init__.py +0 -0
- scaffold_ca_python/factory/driven_adapters/da_generic.py +65 -0
- scaffold_ca_python/factory/driven_adapters/da_rest_consumer.py +64 -0
- scaffold_ca_python/factory/driven_adapters/da_secrets.py +64 -0
- scaffold_ca_python/factory/entry_points/__init__.py +0 -0
- scaffold_ca_python/factory/entry_points/ep_agent.py +91 -0
- scaffold_ca_python/factory/entry_points/ep_generic.py +75 -0
- scaffold_ca_python/factory/entry_points/ep_mcp.py +138 -0
- scaffold_ca_python/factory/entry_points/ep_restapi.py +133 -0
- scaffold_ca_python/factory/simple/__init__.py +0 -0
- scaffold_ca_python/factory/simple/delete_module_factory.py +85 -0
- scaffold_ca_python/factory/simple/helper_factory.py +67 -0
- scaffold_ca_python/factory/simple/model_factory.py +57 -0
- scaffold_ca_python/factory/simple/use_case_factory.py +59 -0
- scaffold_ca_python/models/__init__.py +0 -0
- scaffold_ca_python/models/context.py +60 -0
- scaffold_ca_python/models/file_operation.py +47 -0
- scaffold_ca_python/models/layer.py +41 -0
- scaffold_ca_python/models/violation.py +26 -0
- scaffold_ca_python/templates/__init__.py +0 -0
- scaffold_ca_python/templates/driven_adapter/generic/__init__.py.jinja2 +1 -0
- scaffold_ca_python/templates/driven_adapter/generic/adapter.py.jinja2 +18 -0
- scaffold_ca_python/templates/driven_adapter/generic/test_adapter.py.jinja2 +22 -0
- scaffold_ca_python/templates/driven_adapter/rest_consumer/__init__.py.jinja2 +1 -0
- scaffold_ca_python/templates/driven_adapter/rest_consumer/rest_consumer.py.jinja2 +27 -0
- scaffold_ca_python/templates/driven_adapter/rest_consumer/test_rest_consumer.py.jinja2 +24 -0
- scaffold_ca_python/templates/driven_adapter/secrets/__init__.py.jinja2 +1 -0
- scaffold_ca_python/templates/driven_adapter/secrets/secrets_adapter.py.jinja2 +37 -0
- scaffold_ca_python/templates/driven_adapter/secrets/test_secrets_adapter.py.jinja2 +26 -0
- scaffold_ca_python/templates/entry_point/agent/__init__.py.jinja2 +1 -0
- scaffold_ca_python/templates/entry_point/agent/agent.py.jinja2 +49 -0
- scaffold_ca_python/templates/entry_point/agent/card.py.jinja2 +15 -0
- scaffold_ca_python/templates/entry_point/agent/entrypoint_main.py.jinja2 +13 -0
- scaffold_ca_python/templates/entry_point/agent/test_agent.py.jinja2 +20 -0
- scaffold_ca_python/templates/entry_point/generic/__init__.py.jinja2 +1 -0
- scaffold_ca_python/templates/entry_point/generic/entrypoint_main.py.jinja2 +13 -0
- scaffold_ca_python/templates/entry_point/generic/handler.py.jinja2 +13 -0
- scaffold_ca_python/templates/entry_point/generic/test_handler.py.jinja2 +35 -0
- scaffold_ca_python/templates/entry_point/mcp/__init__.py.jinja2 +1 -0
- scaffold_ca_python/templates/entry_point/mcp/app.py.jinja2 +51 -0
- scaffold_ca_python/templates/entry_point/mcp/prompts.py.jinja2 +22 -0
- scaffold_ca_python/templates/entry_point/mcp/resources.py.jinja2 +22 -0
- scaffold_ca_python/templates/entry_point/mcp/server.py.jinja2 +27 -0
- scaffold_ca_python/templates/entry_point/mcp/test_app.py.jinja2 +32 -0
- scaffold_ca_python/templates/entry_point/mcp/test_prompts.py.jinja2 +40 -0
- scaffold_ca_python/templates/entry_point/mcp/test_resources.py.jinja2 +47 -0
- scaffold_ca_python/templates/entry_point/mcp/test_tools.py.jinja2 +40 -0
- scaffold_ca_python/templates/entry_point/mcp/tools.py.jinja2 +22 -0
- scaffold_ca_python/templates/entry_point/restapi/__init__.py.jinja2 +1 -0
- scaffold_ca_python/templates/entry_point/restapi/app.py.jinja2 +78 -0
- scaffold_ca_python/templates/entry_point/restapi/exception_handler.py.jinja2 +35 -0
- scaffold_ca_python/templates/entry_point/restapi/health.py.jinja2 +13 -0
- scaffold_ca_python/templates/entry_point/restapi/rest_controller.py.jinja2 +26 -0
- scaffold_ca_python/templates/entry_point/restapi/server.py.jinja2 +5 -0
- scaffold_ca_python/templates/entry_point/restapi/test_app.py.jinja2 +22 -0
- scaffold_ca_python/templates/entry_point/restapi/test_exception_handler.py.jinja2 +44 -0
- scaffold_ca_python/templates/entry_point/restapi/test_rest_controller.py.jinja2 +35 -0
- scaffold_ca_python/templates/entry_point/restapi/test_server.py.jinja2 +15 -0
- scaffold_ca_python/templates/helper/__init__.py.jinja2 +1 -0
- scaffold_ca_python/templates/helper/helper.py.jinja2 +7 -0
- scaffold_ca_python/templates/helper/test_helper.py.jinja2 +8 -0
- scaffold_ca_python/templates/model/model.py.jinja2 +9 -0
- scaffold_ca_python/templates/model/test_model.py.jinja2 +8 -0
- scaffold_ca_python/templates/pipeline/azure/azure_pipelines.yml.jinja2 +28 -0
- scaffold_ca_python/templates/pipeline/github/ci.yml.jinja2 +34 -0
- scaffold_ca_python/templates/project/README.jinja2 +30 -0
- scaffold_ca_python/templates/project/application/config/__init__.py.jinja2 +1 -0
- scaffold_ca_python/templates/project/application/config/config.py.jinja2 +12 -0
- scaffold_ca_python/templates/project/application/config/container.py.jinja2 +17 -0
- scaffold_ca_python/templates/project/application/config/driven_adapters_container.py.jinja2 +14 -0
- scaffold_ca_python/templates/project/application/config/resource_container.py.jinja2 +17 -0
- scaffold_ca_python/templates/project/application/config/usecases_container.py.jinja2 +16 -0
- scaffold_ca_python/templates/project/dockerfile.jinja2 +22 -0
- scaffold_ca_python/templates/project/dockerignore.jinja2 +19 -0
- scaffold_ca_python/templates/project/gitignore.jinja2 +64 -0
- scaffold_ca_python/templates/project/layer_init.jinja2 +1 -0
- scaffold_ca_python/templates/project/main.py.jinja2 +10 -0
- scaffold_ca_python/templates/project/mypy_ini.jinja2 +5 -0
- scaffold_ca_python/templates/project/pyproject_toml.jinja2 +66 -0
- scaffold_ca_python/templates/project/python_version.jinja2 +1 -0
- scaffold_ca_python/templates/use_case/test_use_case.py.jinja2 +12 -0
- scaffold_ca_python/templates/use_case/use_case.py.jinja2 +9 -0
- scaffold_ca_python-0.1.1.dist-info/METADATA +285 -0
- scaffold_ca_python-0.1.1.dist-info/RECORD +109 -0
- scaffold_ca_python-0.1.1.dist-info/WHEEL +4 -0
- scaffold_ca_python-0.1.1.dist-info/entry_points.txt +3 -0
- scaffold_ca_python-0.1.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
*.egg
|
|
7
|
+
*.egg-info/
|
|
8
|
+
dist/
|
|
9
|
+
build/
|
|
10
|
+
eggs/
|
|
11
|
+
parts/
|
|
12
|
+
var/
|
|
13
|
+
sdist/
|
|
14
|
+
develop-eggs/
|
|
15
|
+
.installed.cfg
|
|
16
|
+
lib/
|
|
17
|
+
lib64/
|
|
18
|
+
|
|
19
|
+
# Virtual environments
|
|
20
|
+
.venv/
|
|
21
|
+
venv/
|
|
22
|
+
ENV/
|
|
23
|
+
env/
|
|
24
|
+
|
|
25
|
+
# uv
|
|
26
|
+
.uv/
|
|
27
|
+
uv.lock
|
|
28
|
+
|
|
29
|
+
# Distribution / packaging
|
|
30
|
+
.Python
|
|
31
|
+
pip-log.txt
|
|
32
|
+
pip-delete-this-directory.txt
|
|
33
|
+
htmlcov/
|
|
34
|
+
.tox/
|
|
35
|
+
.cache
|
|
36
|
+
nosetests.xml
|
|
37
|
+
coverage.xml
|
|
38
|
+
*.cover
|
|
39
|
+
.hypothesis/
|
|
40
|
+
.pytest_cache/
|
|
41
|
+
|
|
42
|
+
# mypy
|
|
43
|
+
.mypy_cache/
|
|
44
|
+
.dmypy.json
|
|
45
|
+
dmypy.json
|
|
46
|
+
|
|
47
|
+
# ruff
|
|
48
|
+
.ruff_cache/
|
|
49
|
+
|
|
50
|
+
# Editors / IDEs
|
|
51
|
+
.vscode/
|
|
52
|
+
.idea/
|
|
53
|
+
*.swp
|
|
54
|
+
*.swo
|
|
55
|
+
*~
|
|
56
|
+
|
|
57
|
+
# OS
|
|
58
|
+
.DS_Store
|
|
59
|
+
Thumbs.db
|
|
60
|
+
|
|
61
|
+
# Env files
|
|
62
|
+
.env
|
|
63
|
+
.env.*
|
|
64
|
+
!.env.example
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""{{ layer }} layer."""
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "{{ python_package }}"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Clean Architecture Python project"
|
|
5
|
+
requires-python = ">=3.13"
|
|
6
|
+
dependencies = [
|
|
7
|
+
"dependency-injector==4.49.0",
|
|
8
|
+
"pydantic-settings==2.13.1",
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
[dependency-groups]
|
|
12
|
+
dev = [
|
|
13
|
+
"pytest==9.0.3",
|
|
14
|
+
"pytest-cov==7.1.0",
|
|
15
|
+
"pytest-asyncio==1.3.0",
|
|
16
|
+
"ruff==0.15.10",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
[project.scripts]
|
|
20
|
+
{{ python_package_script }} = "{{ python_package }}.main:main"
|
|
21
|
+
|
|
22
|
+
[build-system]
|
|
23
|
+
requires = ["hatchling"]
|
|
24
|
+
build-backend = "hatchling.build"
|
|
25
|
+
|
|
26
|
+
[tool.scaffold-ca-python]
|
|
27
|
+
name = "{{ name }}"
|
|
28
|
+
python_package = "{{ python_package }}"
|
|
29
|
+
created_at = "{{ created_at }}"
|
|
30
|
+
|
|
31
|
+
[tool.ruff]
|
|
32
|
+
line-length = 120
|
|
33
|
+
target-version = "py313"
|
|
34
|
+
|
|
35
|
+
[tool.ruff.lint]
|
|
36
|
+
select = ["E", "F", "I", "UP", "ANN"]
|
|
37
|
+
ignore = ["ANN101", "ANN102"]
|
|
38
|
+
|
|
39
|
+
[tool.ruff.lint.per-file-ignores]
|
|
40
|
+
"src/tests/**/*.py" = ["ANN"]
|
|
41
|
+
|
|
42
|
+
[tool.mypy]
|
|
43
|
+
python_version = "3.13"
|
|
44
|
+
strict = true
|
|
45
|
+
|
|
46
|
+
[tool.coverage.run]
|
|
47
|
+
source = ["{{ python_package }}"]
|
|
48
|
+
omit = ["*/tests/*"]
|
|
49
|
+
|
|
50
|
+
[tool.coverage.report]
|
|
51
|
+
exclude_also = [
|
|
52
|
+
'def __repr__',
|
|
53
|
+
'if self.debug:',
|
|
54
|
+
'if settings.DEBUG',
|
|
55
|
+
'raise AssertionError',
|
|
56
|
+
'raise NotImplementedError',
|
|
57
|
+
'if 0:',
|
|
58
|
+
'if __name__ == .__main__.:',
|
|
59
|
+
'if TYPE_CHECKING:',
|
|
60
|
+
'class .*\bProtocol\):',
|
|
61
|
+
'@(abc\.)?abstractmethod',
|
|
62
|
+
]
|
|
63
|
+
|
|
64
|
+
[tool.pytest.ini_options]
|
|
65
|
+
addopts = "--cov={{ python_package }} --cov-fail-under=80"
|
|
66
|
+
testpaths = ["src/tests"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.13
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Tests for {{ class_name }}UseCase."""
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from {{ project.python_package }}.domain.usecase.{{ module_name }} import {{ class_name }}UseCase
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@pytest.mark.asyncio
|
|
9
|
+
async def test_{{ module_name }}_raises_not_implemented() -> None:
|
|
10
|
+
use_case = {{ class_name }}UseCase()
|
|
11
|
+
with pytest.raises(NotImplementedError):
|
|
12
|
+
await use_case.execute()
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: scaffold-ca-python
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Scaffolder to generate Clean Architecture apps
|
|
5
|
+
Project-URL: Homepage, https://github.com/bancolombia/scaffold-clean-architecture-py
|
|
6
|
+
Project-URL: Repository, https://github.com/bancolombia/scaffold-clean-architecture-py
|
|
7
|
+
Project-URL: Issues, https://github.com/bancolombia/scaffold-clean-architecture-py/issues
|
|
8
|
+
Author-email: Santiago Calle <santiagocalleg@gmail.com>
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: clean architecture,cli,code generation,fastapi,mcp,python,scaffold
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Software Development
|
|
20
|
+
Classifier: Topic :: Software Development :: Code Generators
|
|
21
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
22
|
+
Classifier: Typing :: Typed
|
|
23
|
+
Requires-Python: >=3.13
|
|
24
|
+
Requires-Dist: jinja2~=3.1.6
|
|
25
|
+
Requires-Dist: pydantic~=2.13.3
|
|
26
|
+
Requires-Dist: pyyaml~=6.0.3
|
|
27
|
+
Requires-Dist: rich~=15.0.0
|
|
28
|
+
Requires-Dist: tomli-w~=1.2.0
|
|
29
|
+
Requires-Dist: typer~=0.25.1
|
|
30
|
+
Description-Content-Type: text/markdown
|
|
31
|
+
|
|
32
|
+
# scaffold-ca-python
|
|
33
|
+
|
|
34
|
+
[](https://pypi.org/project/scaffold-ca-python/)
|
|
35
|
+
[](https://pypi.org/project/scaffold-ca-python/)
|
|
36
|
+
[](https://opensource.org/licenses/MIT)
|
|
37
|
+
|
|
38
|
+
## What is this?
|
|
39
|
+
|
|
40
|
+
`scaffold-ca-python` is a CLI tool that scaffolds production-ready Python projects that follow Clean Architecture. It helps teams start faster by generating the project structure, modules, adapters, entry points, helpers, and pipeline files needed to keep architectural boundaries explicit. It is designed for developers who want repeatable code generation instead of hand-creating the same project pieces over and over.
|
|
41
|
+
|
|
42
|
+
## Installation
|
|
43
|
+
|
|
44
|
+
Python 3.13 or newer is required.
|
|
45
|
+
|
|
46
|
+
Install with `pip`:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
pip install scaffold-ca-python
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Install with `uv`:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
uv add scaffold-ca-python
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Quick Start
|
|
59
|
+
|
|
60
|
+
1. Create a new Clean Architecture project.
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
scaffold ca --name my-app
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
2. Move into the generated project directory.
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
cd my-app
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
3. Generate a domain model.
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
scaffold gm --name Order
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
4. Validate the project structure.
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
scaffold vs
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Commands & Examples
|
|
85
|
+
|
|
86
|
+
### scaffold ca
|
|
87
|
+
|
|
88
|
+
Scaffold a new Clean Architecture project.
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
scaffold ca --name my-project
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
scaffold ca --name my-project --dry-run
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### scaffold gm
|
|
99
|
+
|
|
100
|
+
Scaffold a Pydantic v2 domain model and its test stub.
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
scaffold gm --name Order
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
scaffold gm --name Order --dry-run
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### scaffold guc
|
|
111
|
+
|
|
112
|
+
Scaffold a use case in `domain/usecase/`.
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
scaffold guc --name CreateOrder
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
scaffold guc --name CreateOrder --dry-run
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### scaffold gda
|
|
123
|
+
|
|
124
|
+
Scaffold a driven adapter such as an HTTP client, secrets adapter, or generic outbound adapter.
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
scaffold gda --type rest-consumer
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
scaffold gda --type generic --name MyAdapter --dry-run
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### scaffold gep
|
|
135
|
+
|
|
136
|
+
Scaffold an entry-point adapter for REST APIs, A2A agents, MCP servers, or generic entry points.
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
scaffold gep --type restapi
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
scaffold gep --type mcp --with-resources --with-prompts --dry-run
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### scaffold gh
|
|
147
|
+
|
|
148
|
+
Scaffold a helper utility module and its test stub.
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
scaffold gh --name JsonParser
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
scaffold gh --name JsonParser --dry-run
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### scaffold gpipe
|
|
159
|
+
|
|
160
|
+
Scaffold a CI/CD pipeline configuration for GitHub Actions or Azure Pipelines.
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
scaffold gpipe --provider github
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
scaffold gpipe --provider azure --dry-run
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### scaffold vs
|
|
171
|
+
|
|
172
|
+
Scan the project for Clean Architecture import violations.
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
scaffold vs
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
scaffold vs --dry-run
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### scaffold dm
|
|
183
|
+
|
|
184
|
+
Delete a previously generated module and its mirrored test file.
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
scaffold dm --name Order
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
scaffold dm --name Order --dry-run
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### scaffold up
|
|
195
|
+
|
|
196
|
+
Update project dependencies using `uv lock --upgrade` and `uv sync`.
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
scaffold up --dry-run
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
scaffold update-project --dry-run
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## Technologies
|
|
207
|
+
|
|
208
|
+
| Tool / Library | Version | Role |
|
|
209
|
+
|----------------|---------|------|
|
|
210
|
+
| Python | >=3.13 | Runtime |
|
|
211
|
+
| uv | latest | Dependency management, build, and publish |
|
|
212
|
+
| Typer | >=0.16.0 | CLI framework |
|
|
213
|
+
| Rich | >=14.1.0 | Terminal output formatting |
|
|
214
|
+
| Jinja2 | >=3.1 | Template engine for code generation |
|
|
215
|
+
| Pydantic v2 | >=2.0 | Runtime validation of template context |
|
|
216
|
+
| hatchling | latest | Build backend |
|
|
217
|
+
| uv-dynamic-versioning | latest | PEP 440 versioning from git tags |
|
|
218
|
+
| ruff | latest | Linting and formatting |
|
|
219
|
+
| mypy | latest (strict) | Static type checking |
|
|
220
|
+
| pytest + pytest-cov | latest | Test execution and coverage gating |
|
|
221
|
+
|
|
222
|
+
## Current Features
|
|
223
|
+
|
|
224
|
+
- Generates full Clean Architecture project skeletons with `scaffold ca`.
|
|
225
|
+
- Generates domain models with `scaffold gm`.
|
|
226
|
+
- Generates domain use cases with `scaffold guc`.
|
|
227
|
+
- Generates driven adapters with `scaffold gda`.
|
|
228
|
+
- Generates entry points for REST API, agent, MCP, and generic modes with `scaffold gep`.
|
|
229
|
+
- Generates helper utilities with `scaffold gh`.
|
|
230
|
+
- Generates CI/CD pipeline files with `scaffold gpipe`.
|
|
231
|
+
- Validates import boundaries with `scaffold vs`.
|
|
232
|
+
- Deletes generated modules safely with `scaffold dm`.
|
|
233
|
+
- Updates project dependencies with `scaffold up`.
|
|
234
|
+
- Supports `--dry-run` previews across commands.
|
|
235
|
+
- Uses Jinja2 templates for all generated code.
|
|
236
|
+
- Validates template context with Pydantic v2.
|
|
237
|
+
- Formats terminal output with Rich.
|
|
238
|
+
- Enforces static checks with mypy strict and ruff.
|
|
239
|
+
- Maintains an 80%+ coverage gate with pytest-cov.
|
|
240
|
+
|
|
241
|
+
## Contributing
|
|
242
|
+
|
|
243
|
+
1. Fork the upstream repository on GitHub: https://github.com/santicalleg/scaffold-ca-python
|
|
244
|
+
2. Clone your fork.
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
git clone https://github.com/YOUR-USER/scaffold-ca-python.git
|
|
248
|
+
cd scaffold-ca-python
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
3. Set up the development environment.
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
uv sync
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
4. Create a feature branch.
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
git checkout -b your-branch-feature-name
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
5. Run the test suite.
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
uv run pytest
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
6. Check linting.
|
|
270
|
+
|
|
271
|
+
```bash
|
|
272
|
+
uv run ruff check src tests
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
7. Check types.
|
|
276
|
+
|
|
277
|
+
```bash
|
|
278
|
+
uv run mypy src
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
8. Commit your changes and open a pull request.
|
|
282
|
+
|
|
283
|
+
## License
|
|
284
|
+
|
|
285
|
+
This project is licensed under the **MIT License**. See [LICENSE](LICENSE) for the full text.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
scaffold_ca_python/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
2
|
+
scaffold_ca_python/cli.py,sha256=A0h0pkoNPy3EE55lApnjRuevhWb_Aa-IB7jekaaiAcM,971
|
|
3
|
+
scaffold_ca_python/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
4
|
+
scaffold_ca_python/commands/delete_module.py,sha256=yPG3tkjI-L2TIDnnN-elCnKRGyRBozLZUE_mMrjs7b0,7547
|
|
5
|
+
scaffold_ca_python/commands/generate_driven_adapter.py,sha256=godgMYPvSKmZ4avfRRiOnf3Iw1uJmP7JMHc50Ivq8l4,6598
|
|
6
|
+
scaffold_ca_python/commands/generate_entry_point.py,sha256=_IgzgE5nt1_zZ2P9ozmoJusNDFTBvnwqxQLzEeTVhA4,11862
|
|
7
|
+
scaffold_ca_python/commands/generate_helper.py,sha256=-cca-l6JghmKptK4OKMPo2J99FYWvu7LT1i3PZRfnzs,4454
|
|
8
|
+
scaffold_ca_python/commands/generate_model.py,sha256=WxFeOqOQR5cER1YJrndJSpZvRCy2VV4va3HvMPTiy-M,4532
|
|
9
|
+
scaffold_ca_python/commands/generate_pipeline.py,sha256=EYPM9csDnrYB3bpnC4YSycqI3bAE8bYy1283OEEC5Ts,5537
|
|
10
|
+
scaffold_ca_python/commands/generate_project.py,sha256=axgvckaFSwX2NqOT-1vn4AXG5wnPMy-JcMpv3MwZ_Nw,6867
|
|
11
|
+
scaffold_ca_python/commands/generate_use_case.py,sha256=dZnIqZqRo4-r1411neqIa5Mw-U879fITdaHawpddOCU,4512
|
|
12
|
+
scaffold_ca_python/commands/update_project.py,sha256=cW9IuAF1yIFkAkzOJdioFv97wr7mRiid08KkqOlFmrM,2845
|
|
13
|
+
scaffold_ca_python/commands/validate_structure.py,sha256=JF6Cb3IQ9d6VcjaReSHHzoXGSmqyoyMWNFplqSCFCOQ,2846
|
|
14
|
+
scaffold_ca_python/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
+
scaffold_ca_python/core/file_writer.py,sha256=DdgD6h4lx6FhKtc0AJvOIBryHgfTE4d4ZCMOfrEAuAI,5030
|
|
16
|
+
scaffold_ca_python/core/module_builder.py,sha256=VyJQ2MmOkGivmNT7GuRC4LryhY64OGdLMGzxPVDBC3I,4607
|
|
17
|
+
scaffold_ca_python/core/name_utils.py,sha256=74sxYhPpYrMPTarD0tjUbvUPO1PHw49DW9O5OtiTmj8,2204
|
|
18
|
+
scaffold_ca_python/core/project_detector.py,sha256=G-n9domRQp65uzUbb7CXJk1nFMCTb347RMvfiVoYAxI,3321
|
|
19
|
+
scaffold_ca_python/core/pyproject_writer.py,sha256=R4JNS-b5cx4B-BH90gR8rPoVm1OMQFgFk_rRa1OlgJ8,5267
|
|
20
|
+
scaffold_ca_python/core/structure_validator.py,sha256=Cco8Ghpjyit5t2AKxuFpCmfwsG4D9yqz3adycrz7YR8,5841
|
|
21
|
+
scaffold_ca_python/core/template_renderer.py,sha256=sMu6iwlObtIYOuRRsyNZu1J-M_jkzx5yHzBwlGZkHOI,3421
|
|
22
|
+
scaffold_ca_python/factory/__init__.py,sha256=6MZYzBgYxvvJwjGrYSaW1E_fNFaFAQ0EHJKSKMo_DHQ,492
|
|
23
|
+
scaffold_ca_python/factory/driven_adapters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
24
|
+
scaffold_ca_python/factory/driven_adapters/da_generic.py,sha256=iKsskAkBHEmutXb5QybF_3521PnMLYlv3cpEMHClptk,2412
|
|
25
|
+
scaffold_ca_python/factory/driven_adapters/da_rest_consumer.py,sha256=2I5NiYPSvxkbsYOwDMRI1a81vS-kS_Vt6njjjdmRMrg,2282
|
|
26
|
+
scaffold_ca_python/factory/driven_adapters/da_secrets.py,sha256=jeNpjkvLV34aW2uzXkPHk0bmQLLwHydPJfgcG7jSbpg,2234
|
|
27
|
+
scaffold_ca_python/factory/entry_points/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
|
+
scaffold_ca_python/factory/entry_points/ep_agent.py,sha256=25I2YB3IFWSE7n-svj0V39U0s3mC_7EqBh61brFeWEM,3029
|
|
29
|
+
scaffold_ca_python/factory/entry_points/ep_generic.py,sha256=4CYtmv1svJ6zJgLTqF6awXUlhSSf7Mj2IMGyv8KjhbU,2494
|
|
30
|
+
scaffold_ca_python/factory/entry_points/ep_mcp.py,sha256=52dHrjJnr9AkZXYRyAcjWLblCzgt8cT5Ulzs9KVTEck,5396
|
|
31
|
+
scaffold_ca_python/factory/entry_points/ep_restapi.py,sha256=7EfmtF60Mn7_C9OUledFupSnhSuhaZVUBj8OWiyYpY8,4792
|
|
32
|
+
scaffold_ca_python/factory/simple/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
33
|
+
scaffold_ca_python/factory/simple/delete_module_factory.py,sha256=omsMgjmHbWXwV1ASZU_OAtvy0qG5BPYQCg2BDg_bw9o,3237
|
|
34
|
+
scaffold_ca_python/factory/simple/helper_factory.py,sha256=vN8z7-4IxeSvqRSEWWOreFnp7jQxFB10kztuHN0CCJs,2302
|
|
35
|
+
scaffold_ca_python/factory/simple/model_factory.py,sha256=HFIPO_B8UZco972rnoLYMwdOZfZO8uZXjouHa7H2xWo,1814
|
|
36
|
+
scaffold_ca_python/factory/simple/use_case_factory.py,sha256=-m1oFPbwfEGwiFJTf1RHIvw1WG7tG0IBuVfdpUYCbgQ,1961
|
|
37
|
+
scaffold_ca_python/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
38
|
+
scaffold_ca_python/models/context.py,sha256=H-PuANo8Z8nSCcbnM9L6ATC6Ikuqt_SfYvI5Gsqo3F4,1916
|
|
39
|
+
scaffold_ca_python/models/file_operation.py,sha256=Wy1rDdllw4j7RwFMgRE-xFlCwnJkmI6dQj3r-x4CSOk,1145
|
|
40
|
+
scaffold_ca_python/models/layer.py,sha256=5e11596xVV22HZnRv4r4TvEv-U6UKD08wATAh_UXXQU,1082
|
|
41
|
+
scaffold_ca_python/models/violation.py,sha256=1FCNkfezEhmQ_ANn4KdAVAzLxYj8v4gwNuXH0FQPHmw,546
|
|
42
|
+
scaffold_ca_python/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
43
|
+
scaffold_ca_python/templates/driven_adapter/generic/__init__.py.jinja2,sha256=3AOtAyY7WGciqPwHFpw17x9bNigKpYO4uGXUxIeDAa0,40
|
|
44
|
+
scaffold_ca_python/templates/driven_adapter/generic/adapter.py.jinja2,sha256=54K4OhTeL3a7RqcQx4yf6_HxMJ7Lh3mrxGLCyuukWjg,475
|
|
45
|
+
scaffold_ca_python/templates/driven_adapter/generic/test_adapter.py.jinja2,sha256=Q_eyB5KW6Q9m391TKEcdLgMpg_Rs_JeUG51HebX1Lrk,563
|
|
46
|
+
scaffold_ca_python/templates/driven_adapter/rest_consumer/__init__.py.jinja2,sha256=bq5MGxcHGw7lPknR-uuq00xo_lodxJ4c-mHro88cYnE,44
|
|
47
|
+
scaffold_ca_python/templates/driven_adapter/rest_consumer/rest_consumer.py.jinja2,sha256=cgXzrREAY-517wSnpYz-p8-0sK57yhR15dsCyIAw_lI,988
|
|
48
|
+
scaffold_ca_python/templates/driven_adapter/rest_consumer/test_rest_consumer.py.jinja2,sha256=J2GHgt7r1RdQ5T06_PdWf2-pxNRDVFe9M48xkJLpJsc,637
|
|
49
|
+
scaffold_ca_python/templates/driven_adapter/secrets/__init__.py.jinja2,sha256=n_-tUwoq5VGFv_KxlbzO1TECmPnME1LaF3nVSBwlPl4,31
|
|
50
|
+
scaffold_ca_python/templates/driven_adapter/secrets/secrets_adapter.py.jinja2,sha256=uy3bl5_vM_ZnAL4WSYbL9vhoXSSAJ0KdtkCQHRiKORE,1217
|
|
51
|
+
scaffold_ca_python/templates/driven_adapter/secrets/test_secrets_adapter.py.jinja2,sha256=Tuy0-gVdN7aRVnTXGrdN-at5d2cLmelwJVcw_ypdxTI,688
|
|
52
|
+
scaffold_ca_python/templates/entry_point/agent/__init__.py.jinja2,sha256=pbboGjTM3_gkQ9QXzM3QFHYsfMETHzkLAseIJa41GVM,33
|
|
53
|
+
scaffold_ca_python/templates/entry_point/agent/agent.py.jinja2,sha256=QCskQeX70dZ-3puV0LsfeGZF95EmgXRU_ZMWGPYg7ck,1583
|
|
54
|
+
scaffold_ca_python/templates/entry_point/agent/card.py.jinja2,sha256=M8RbWj0c8B9bjBBmCgUdAdRPcUhEETc6BEFrB5ZeKCA,415
|
|
55
|
+
scaffold_ca_python/templates/entry_point/agent/entrypoint_main.py.jinja2,sha256=igDSxs4vUXV3oGW10fawgM9dhwPgO5SjAeBmmK01ZuI,247
|
|
56
|
+
scaffold_ca_python/templates/entry_point/agent/test_agent.py.jinja2,sha256=DDl55Pg-m3gI_nD8mbDHbtnFqaDExBNf9z1xOLGDS8Q,591
|
|
57
|
+
scaffold_ca_python/templates/entry_point/generic/__init__.py.jinja2,sha256=pkEP5D5XuGvyzXQ7IXyTHW-TDB9hPRHKdj6sES9S-HM,35
|
|
58
|
+
scaffold_ca_python/templates/entry_point/generic/entrypoint_main.py.jinja2,sha256=hQyRCIeftuYDc7wpKGs2OR4TikUo-XI9oIMbx_DPCe8,266
|
|
59
|
+
scaffold_ca_python/templates/entry_point/generic/handler.py.jinja2,sha256=glCst1soTiKG_gDdq5C-OogzljOJ_QooaW_boYt7gsg,417
|
|
60
|
+
scaffold_ca_python/templates/entry_point/generic/test_handler.py.jinja2,sha256=gRhvVabkylQ8z06JZ9L2CHdTa83oxL1X4ldR3_DZQWg,1195
|
|
61
|
+
scaffold_ca_python/templates/entry_point/mcp/__init__.py.jinja2,sha256=8J_YmIXHUh26PkaxeM8z5lf-dtK0da1T4haOM8U6Y9A,38
|
|
62
|
+
scaffold_ca_python/templates/entry_point/mcp/app.py.jinja2,sha256=f-8p3QqsuN4ywktwrlurDDQi_HfeNzfzMAJizhJ_dwc,1909
|
|
63
|
+
scaffold_ca_python/templates/entry_point/mcp/prompts.py.jinja2,sha256=ianMpl8Tc1lzuR1vm8tG04OI9qL2uP-dqpAfYSpYer4,737
|
|
64
|
+
scaffold_ca_python/templates/entry_point/mcp/resources.py.jinja2,sha256=_8-z7D-N8Cihvj6HB_i3_IfUqWP9laL1FheA1C7NMs8,812
|
|
65
|
+
scaffold_ca_python/templates/entry_point/mcp/server.py.jinja2,sha256=Hmtx-jYIkXBSw8verVr6EOultnDXrCCG14hFQYYKg90,656
|
|
66
|
+
scaffold_ca_python/templates/entry_point/mcp/test_app.py.jinja2,sha256=Q5wAzpSCnvQsOyWsLsM3s7fEAcq0kIEdyP1SFc75hQY,983
|
|
67
|
+
scaffold_ca_python/templates/entry_point/mcp/test_prompts.py.jinja2,sha256=Y9C7z7jpjoTKANlFB6hNJUUw2abt5qF2C4Nm7MkvDvA,1566
|
|
68
|
+
scaffold_ca_python/templates/entry_point/mcp/test_resources.py.jinja2,sha256=2jHfPqyJ4TJZJupxe8T7gVz2ysaqZHcAog6186ie2CI,1763
|
|
69
|
+
scaffold_ca_python/templates/entry_point/mcp/test_tools.py.jinja2,sha256=bd_8nvLuqPApKIYQoBhEokMYZrPYFUn1pnDEIOVxwCo,1550
|
|
70
|
+
scaffold_ca_python/templates/entry_point/mcp/tools.py.jinja2,sha256=xstzbPwYjiLG6InhWjD7Xtteyf_jLbrgislelwC-wUM,725
|
|
71
|
+
scaffold_ca_python/templates/entry_point/restapi/__init__.py.jinja2,sha256=BrpLExG7nc6cEOYWpJKymUXEvGVc1lU9sb_kBw_HPYg,36
|
|
72
|
+
scaffold_ca_python/templates/entry_point/restapi/app.py.jinja2,sha256=u5ltDQ_WQ-5JESV8nsV3_Nueb4ZZQJ5tn59ShGncYGo,2626
|
|
73
|
+
scaffold_ca_python/templates/entry_point/restapi/exception_handler.py.jinja2,sha256=_wON4AvW6liZutgHx-TGWrBpJOC8q0ZY3mPhIS8Aveg,1343
|
|
74
|
+
scaffold_ca_python/templates/entry_point/restapi/health.py.jinja2,sha256=nKEtxuoAQ4Le9SGhM3Wz9K77XcCu7wnvBgjhquGqr3E,244
|
|
75
|
+
scaffold_ca_python/templates/entry_point/restapi/rest_controller.py.jinja2,sha256=rKsSdx0arV_K87HL-VRyI7HFpSD3k-jfK9zIG4A03xc,728
|
|
76
|
+
scaffold_ca_python/templates/entry_point/restapi/server.py.jinja2,sha256=F6AYRMP3q02WMm09RWbX3tAEYG_6PkoDYI3c5A8AIdc,207
|
|
77
|
+
scaffold_ca_python/templates/entry_point/restapi/test_app.py.jinja2,sha256=QSmEIIwVhyVi4uCNz3PDsEUu2aFNpbqm0-EP50JzH08,669
|
|
78
|
+
scaffold_ca_python/templates/entry_point/restapi/test_exception_handler.py.jinja2,sha256=O7Sqf1d9mPTeB0DDXtnyCrbKE4o2zNsgYzf-PdD3rU4,1361
|
|
79
|
+
scaffold_ca_python/templates/entry_point/restapi/test_rest_controller.py.jinja2,sha256=Un01qIR8L5bgLRKbChWptrbTCL4t45PAmrXwKMvKShQ,1142
|
|
80
|
+
scaffold_ca_python/templates/entry_point/restapi/test_server.py.jinja2,sha256=7_mDfqP14onocc1RjJ732ODpoUAVPiB1Zsf5WEqAlaI,426
|
|
81
|
+
scaffold_ca_python/templates/helper/__init__.py.jinja2,sha256=LA4hikmh30a_8LgZ8h18zdC3NEfDPNJeZOSBJ4RZBwU,39
|
|
82
|
+
scaffold_ca_python/templates/helper/helper.py.jinja2,sha256=rPaSM5Y4U25Ht8nshnw9m_fc3FXkx-CHA_egJM7QDmc,110
|
|
83
|
+
scaffold_ca_python/templates/helper/test_helper.py.jinja2,sha256=5nmkjej1FQngXh5JAoftdRvE8kdad0Knjxf25Lb--RI,268
|
|
84
|
+
scaffold_ca_python/templates/model/model.py.jinja2,sha256=pvzy78xH5-qWJ6IQb-9bY-dnqPj4FPBsQ-Kalh_mFr0,151
|
|
85
|
+
scaffold_ca_python/templates/model/test_model.py.jinja2,sha256=55F0CUHb2A3D5ikSNgPveNZ1Jt11gwfzKqGKHYjuzLo,263
|
|
86
|
+
scaffold_ca_python/templates/pipeline/azure/azure_pipelines.yml.jinja2,sha256=ecbvubtMhoyqxiM69PunOYwOOBBLUFqSBsoqJsIqyDI,555
|
|
87
|
+
scaffold_ca_python/templates/pipeline/github/ci.yml.jinja2,sha256=y20dpIoOHlZNCIXzyJdjsTgq2HiyCjHpcg2UPKZuQRg,672
|
|
88
|
+
scaffold_ca_python/templates/project/README.jinja2,sha256=HazR7Ls3utOfMFjxDsVS1-WMCPG1OR4XR2ftn02Fnuo,696
|
|
89
|
+
scaffold_ca_python/templates/project/dockerfile.jinja2,sha256=1SJslK8xJ13Ulb50IyYRcFYTKeyZwK_kHAYm9BY0MyA,424
|
|
90
|
+
scaffold_ca_python/templates/project/dockerignore.jinja2,sha256=4nQkBc8KYhWUVJbmq0bfLtUbYDYFJ5BljKw_ZMJ6mYg,166
|
|
91
|
+
scaffold_ca_python/templates/project/gitignore.jinja2,sha256=ZRf2cRtqbe2d48RfWJWSzAUB2fPlda9kOtYffiz-UdM,553
|
|
92
|
+
scaffold_ca_python/templates/project/layer_init.jinja2,sha256=oIlTSrce4ozqEKUU_1TB4473ufiE0SiGG_PJmEkT4FA,25
|
|
93
|
+
scaffold_ca_python/templates/project/main.py.jinja2,sha256=di_ujhkFafXqJUymSdVjEF0tihQ_0xKbKSIyV91rPpk,161
|
|
94
|
+
scaffold_ca_python/templates/project/mypy_ini.jinja2,sha256=SJ_UiLRZ8wBJ7hqSo3QDeMSsempBfaGvqiR_ASyIxR0,93
|
|
95
|
+
scaffold_ca_python/templates/project/pyproject_toml.jinja2,sha256=dSKZYxUIhUBxvIrtX1y7dJPaYLzGfpR8Tvg3xYZnRz8,1374
|
|
96
|
+
scaffold_ca_python/templates/project/python_version.jinja2,sha256=Auc1s9_hwygz61ULf_j_oX9fK8P6HnuuYaj1o4g845g,5
|
|
97
|
+
scaffold_ca_python/templates/project/application/config/__init__.py.jinja2,sha256=L9xWIW2Gd3VhRdx1RfUf7efBrIuFf3ft54eLQT1tG9g,32
|
|
98
|
+
scaffold_ca_python/templates/project/application/config/config.py.jinja2,sha256=218sZQ1115odJcoI7W6-1kiFjkWjO56d80fqQXk4dyM,323
|
|
99
|
+
scaffold_ca_python/templates/project/application/config/container.py.jinja2,sha256=zQmDuu9f8Z0hCbC6iu9hbzusam8pvDOhUprbF0Vhkxk,697
|
|
100
|
+
scaffold_ca_python/templates/project/application/config/driven_adapters_container.py.jinja2,sha256=D4-i4Ym_y7RIc5QIdibBS9WiFSrGLFyD9tX7k_A8AAg,450
|
|
101
|
+
scaffold_ca_python/templates/project/application/config/resource_container.py.jinja2,sha256=cfp6ZshJkgOkMRLkPGvDy0ACyEEqWbdxw7sOKwT54-E,615
|
|
102
|
+
scaffold_ca_python/templates/project/application/config/usecases_container.py.jinja2,sha256=3fEHe6mkXkDHlfO5nhLqzLB7ccTpqwtjHZfLyfysbro,527
|
|
103
|
+
scaffold_ca_python/templates/use_case/test_use_case.py.jinja2,sha256=3K1bNKDBQc29rcv8UHUZnROCUmcFSCwJhbm0xP9Uako,364
|
|
104
|
+
scaffold_ca_python/templates/use_case/use_case.py.jinja2,sha256=KPtaK1wvZ-7qHdDZyuVfqXTPYwJdNUMPXQZGuKZFA7Y,217
|
|
105
|
+
scaffold_ca_python-0.1.1.dist-info/METADATA,sha256=ysk8cQgUNrts8p-fm65mEhh_dXswbapYl_eDE_hdv2M,6644
|
|
106
|
+
scaffold_ca_python-0.1.1.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
107
|
+
scaffold_ca_python-0.1.1.dist-info/entry_points.txt,sha256=4PyYg6mNCvAlt2yF_o1-QR2CBXiowYGpNyqcP88tu6I,104
|
|
108
|
+
scaffold_ca_python-0.1.1.dist-info/licenses/LICENSE,sha256=3ZZEP7DK_h3lEjS8r-DvQCec2q7zAqqq7HmSq6cuL0E,1068
|
|
109
|
+
scaffold_ca_python-0.1.1.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Bancolombia
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|