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.
Files changed (109) hide show
  1. scaffold_ca_python/__init__.py +1 -0
  2. scaffold_ca_python/cli.py +39 -0
  3. scaffold_ca_python/commands/__init__.py +0 -0
  4. scaffold_ca_python/commands/delete_module.py +216 -0
  5. scaffold_ca_python/commands/generate_driven_adapter.py +182 -0
  6. scaffold_ca_python/commands/generate_entry_point.py +304 -0
  7. scaffold_ca_python/commands/generate_helper.py +135 -0
  8. scaffold_ca_python/commands/generate_model.py +134 -0
  9. scaffold_ca_python/commands/generate_pipeline.py +158 -0
  10. scaffold_ca_python/commands/generate_project.py +189 -0
  11. scaffold_ca_python/commands/generate_use_case.py +136 -0
  12. scaffold_ca_python/commands/update_project.py +84 -0
  13. scaffold_ca_python/commands/validate_structure.py +90 -0
  14. scaffold_ca_python/core/__init__.py +0 -0
  15. scaffold_ca_python/core/file_writer.py +128 -0
  16. scaffold_ca_python/core/module_builder.py +127 -0
  17. scaffold_ca_python/core/name_utils.py +59 -0
  18. scaffold_ca_python/core/project_detector.py +93 -0
  19. scaffold_ca_python/core/pyproject_writer.py +169 -0
  20. scaffold_ca_python/core/structure_validator.py +142 -0
  21. scaffold_ca_python/core/template_renderer.py +100 -0
  22. scaffold_ca_python/factory/__init__.py +16 -0
  23. scaffold_ca_python/factory/driven_adapters/__init__.py +0 -0
  24. scaffold_ca_python/factory/driven_adapters/da_generic.py +65 -0
  25. scaffold_ca_python/factory/driven_adapters/da_rest_consumer.py +64 -0
  26. scaffold_ca_python/factory/driven_adapters/da_secrets.py +64 -0
  27. scaffold_ca_python/factory/entry_points/__init__.py +0 -0
  28. scaffold_ca_python/factory/entry_points/ep_agent.py +91 -0
  29. scaffold_ca_python/factory/entry_points/ep_generic.py +75 -0
  30. scaffold_ca_python/factory/entry_points/ep_mcp.py +138 -0
  31. scaffold_ca_python/factory/entry_points/ep_restapi.py +133 -0
  32. scaffold_ca_python/factory/simple/__init__.py +0 -0
  33. scaffold_ca_python/factory/simple/delete_module_factory.py +85 -0
  34. scaffold_ca_python/factory/simple/helper_factory.py +67 -0
  35. scaffold_ca_python/factory/simple/model_factory.py +57 -0
  36. scaffold_ca_python/factory/simple/use_case_factory.py +59 -0
  37. scaffold_ca_python/models/__init__.py +0 -0
  38. scaffold_ca_python/models/context.py +60 -0
  39. scaffold_ca_python/models/file_operation.py +47 -0
  40. scaffold_ca_python/models/layer.py +41 -0
  41. scaffold_ca_python/models/violation.py +26 -0
  42. scaffold_ca_python/templates/__init__.py +0 -0
  43. scaffold_ca_python/templates/driven_adapter/generic/__init__.py.jinja2 +1 -0
  44. scaffold_ca_python/templates/driven_adapter/generic/adapter.py.jinja2 +18 -0
  45. scaffold_ca_python/templates/driven_adapter/generic/test_adapter.py.jinja2 +22 -0
  46. scaffold_ca_python/templates/driven_adapter/rest_consumer/__init__.py.jinja2 +1 -0
  47. scaffold_ca_python/templates/driven_adapter/rest_consumer/rest_consumer.py.jinja2 +27 -0
  48. scaffold_ca_python/templates/driven_adapter/rest_consumer/test_rest_consumer.py.jinja2 +24 -0
  49. scaffold_ca_python/templates/driven_adapter/secrets/__init__.py.jinja2 +1 -0
  50. scaffold_ca_python/templates/driven_adapter/secrets/secrets_adapter.py.jinja2 +37 -0
  51. scaffold_ca_python/templates/driven_adapter/secrets/test_secrets_adapter.py.jinja2 +26 -0
  52. scaffold_ca_python/templates/entry_point/agent/__init__.py.jinja2 +1 -0
  53. scaffold_ca_python/templates/entry_point/agent/agent.py.jinja2 +49 -0
  54. scaffold_ca_python/templates/entry_point/agent/card.py.jinja2 +15 -0
  55. scaffold_ca_python/templates/entry_point/agent/entrypoint_main.py.jinja2 +13 -0
  56. scaffold_ca_python/templates/entry_point/agent/test_agent.py.jinja2 +20 -0
  57. scaffold_ca_python/templates/entry_point/generic/__init__.py.jinja2 +1 -0
  58. scaffold_ca_python/templates/entry_point/generic/entrypoint_main.py.jinja2 +13 -0
  59. scaffold_ca_python/templates/entry_point/generic/handler.py.jinja2 +13 -0
  60. scaffold_ca_python/templates/entry_point/generic/test_handler.py.jinja2 +35 -0
  61. scaffold_ca_python/templates/entry_point/mcp/__init__.py.jinja2 +1 -0
  62. scaffold_ca_python/templates/entry_point/mcp/app.py.jinja2 +51 -0
  63. scaffold_ca_python/templates/entry_point/mcp/prompts.py.jinja2 +22 -0
  64. scaffold_ca_python/templates/entry_point/mcp/resources.py.jinja2 +22 -0
  65. scaffold_ca_python/templates/entry_point/mcp/server.py.jinja2 +27 -0
  66. scaffold_ca_python/templates/entry_point/mcp/test_app.py.jinja2 +32 -0
  67. scaffold_ca_python/templates/entry_point/mcp/test_prompts.py.jinja2 +40 -0
  68. scaffold_ca_python/templates/entry_point/mcp/test_resources.py.jinja2 +47 -0
  69. scaffold_ca_python/templates/entry_point/mcp/test_tools.py.jinja2 +40 -0
  70. scaffold_ca_python/templates/entry_point/mcp/tools.py.jinja2 +22 -0
  71. scaffold_ca_python/templates/entry_point/restapi/__init__.py.jinja2 +1 -0
  72. scaffold_ca_python/templates/entry_point/restapi/app.py.jinja2 +78 -0
  73. scaffold_ca_python/templates/entry_point/restapi/exception_handler.py.jinja2 +35 -0
  74. scaffold_ca_python/templates/entry_point/restapi/health.py.jinja2 +13 -0
  75. scaffold_ca_python/templates/entry_point/restapi/rest_controller.py.jinja2 +26 -0
  76. scaffold_ca_python/templates/entry_point/restapi/server.py.jinja2 +5 -0
  77. scaffold_ca_python/templates/entry_point/restapi/test_app.py.jinja2 +22 -0
  78. scaffold_ca_python/templates/entry_point/restapi/test_exception_handler.py.jinja2 +44 -0
  79. scaffold_ca_python/templates/entry_point/restapi/test_rest_controller.py.jinja2 +35 -0
  80. scaffold_ca_python/templates/entry_point/restapi/test_server.py.jinja2 +15 -0
  81. scaffold_ca_python/templates/helper/__init__.py.jinja2 +1 -0
  82. scaffold_ca_python/templates/helper/helper.py.jinja2 +7 -0
  83. scaffold_ca_python/templates/helper/test_helper.py.jinja2 +8 -0
  84. scaffold_ca_python/templates/model/model.py.jinja2 +9 -0
  85. scaffold_ca_python/templates/model/test_model.py.jinja2 +8 -0
  86. scaffold_ca_python/templates/pipeline/azure/azure_pipelines.yml.jinja2 +28 -0
  87. scaffold_ca_python/templates/pipeline/github/ci.yml.jinja2 +34 -0
  88. scaffold_ca_python/templates/project/README.jinja2 +30 -0
  89. scaffold_ca_python/templates/project/application/config/__init__.py.jinja2 +1 -0
  90. scaffold_ca_python/templates/project/application/config/config.py.jinja2 +12 -0
  91. scaffold_ca_python/templates/project/application/config/container.py.jinja2 +17 -0
  92. scaffold_ca_python/templates/project/application/config/driven_adapters_container.py.jinja2 +14 -0
  93. scaffold_ca_python/templates/project/application/config/resource_container.py.jinja2 +17 -0
  94. scaffold_ca_python/templates/project/application/config/usecases_container.py.jinja2 +16 -0
  95. scaffold_ca_python/templates/project/dockerfile.jinja2 +22 -0
  96. scaffold_ca_python/templates/project/dockerignore.jinja2 +19 -0
  97. scaffold_ca_python/templates/project/gitignore.jinja2 +64 -0
  98. scaffold_ca_python/templates/project/layer_init.jinja2 +1 -0
  99. scaffold_ca_python/templates/project/main.py.jinja2 +10 -0
  100. scaffold_ca_python/templates/project/mypy_ini.jinja2 +5 -0
  101. scaffold_ca_python/templates/project/pyproject_toml.jinja2 +66 -0
  102. scaffold_ca_python/templates/project/python_version.jinja2 +1 -0
  103. scaffold_ca_python/templates/use_case/test_use_case.py.jinja2 +12 -0
  104. scaffold_ca_python/templates/use_case/use_case.py.jinja2 +9 -0
  105. scaffold_ca_python-0.1.1.dist-info/METADATA +285 -0
  106. scaffold_ca_python-0.1.1.dist-info/RECORD +109 -0
  107. scaffold_ca_python-0.1.1.dist-info/WHEEL +4 -0
  108. scaffold_ca_python-0.1.1.dist-info/entry_points.txt +3 -0
  109. 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,10 @@
1
+ """{{ name }} application entrypoint."""
2
+
3
+
4
+ def main() -> None:
5
+ """Run the application."""
6
+ print("Hello, World!")
7
+
8
+
9
+ if __name__ == "__main__":
10
+ main()
@@ -0,0 +1,5 @@
1
+ [mypy]
2
+ python_version = 3.13
3
+ strict = True
4
+ warn_return_any = True
5
+ warn_unused_configs = True
@@ -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,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,9 @@
1
+ """{{ class_name }} use case."""
2
+
3
+
4
+ class {{ class_name }}UseCase:
5
+ """{{ class_name }} async use case."""
6
+
7
+ async def execute(self) -> None:
8
+ """Execute the use case."""
9
+ raise NotImplementedError
@@ -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
+ [![PyPI version](https://img.shields.io/pypi/v/scaffold-ca-python.svg)](https://pypi.org/project/scaffold-ca-python/)
35
+ [![Python](https://img.shields.io/pypi/pyversions/scaffold-ca-python.svg)](https://pypi.org/project/scaffold-ca-python/)
36
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.29.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ scaffold = scaffold_ca_python.cli:app
3
+ scaffold-ca-python = scaffold_ca_python.cli:app
@@ -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.