instant-python 0.12.1__tar.gz → 0.14.0__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.
Files changed (404) hide show
  1. {instant_python-0.12.1 → instant_python-0.14.0}/.github/workflows/ci.yml +0 -26
  2. {instant_python-0.12.1 → instant_python-0.14.0}/CHANGELOG.md +186 -0
  3. {instant_python-0.12.1 → instant_python-0.14.0}/PKG-INFO +1 -1
  4. instant_python-0.14.0/instant_python/config/application/config_generator.py +25 -0
  5. instant_python-0.14.0/instant_python/config/domain/config_parser.py +10 -0
  6. instant_python-0.12.1/instant_python/config/domain/configuration_schema.py → instant_python-0.14.0/instant_python/config/domain/config_schema.py +20 -26
  7. instant_python-0.14.0/instant_python/config/domain/config_writer.py +9 -0
  8. instant_python-0.12.1/instant_python/config/domain/dependency_configuration.py → instant_python-0.14.0/instant_python/config/domain/dependency_config.py +1 -1
  9. instant_python-0.12.1/instant_python/config/domain/general_configuration.py → instant_python-0.14.0/instant_python/config/domain/general_config.py +1 -1
  10. instant_python-0.12.1/instant_python/config/domain/git_configuration.py → instant_python-0.14.0/instant_python/config/domain/git_config.py +8 -2
  11. instant_python-0.12.1/instant_python/config/domain/template_configuration.py → instant_python-0.14.0/instant_python/config/domain/template_config.py +7 -7
  12. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/infra/parser/errors.py +2 -2
  13. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/infra/parser/parser.py +31 -21
  14. instant_python-0.14.0/instant_python/config/infra/writer/yaml_config_writer.py +13 -0
  15. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/configuration/parser/parser.py +20 -20
  16. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/dependency_manager/dependency_manager.py +2 -2
  17. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/dependency_manager/pdm_dependency_manager.py +14 -5
  18. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/dependency_manager/uv_dependency_manager.py +14 -5
  19. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/git/git_configurer.py +2 -2
  20. instant_python-0.14.0/instant_python/initialize/application/config_reader.py +14 -0
  21. instant_python-0.14.0/instant_python/initialize/application/project_initializer.py +13 -0
  22. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/initialize/delivery/cli.py +18 -12
  23. instant_python-0.14.0/instant_python/initialize/domain/config_repository.py +7 -0
  24. instant_python-0.14.0/instant_python/initialize/domain/nodes.py +8 -0
  25. instant_python-0.14.0/instant_python/initialize/domain/project_renderer.py +9 -0
  26. instant_python-0.14.0/instant_python/initialize/infra/persistence/config_repository.py +15 -0
  27. instant_python-0.14.0/instant_python/initialize/infra/renderer/jinja_environment.py +61 -0
  28. instant_python-0.14.0/instant_python/initialize/infra/renderer/jinja_project_renderer.py +48 -0
  29. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/project_creator/file.py +2 -2
  30. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/project_creator/file_system.py +2 -2
  31. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/render/jinja_environment.py +8 -3
  32. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/render/jinja_project_renderer.py +3 -3
  33. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/shared/application_error.py +1 -4
  34. instant_python-0.14.0/instant_python/templates/boilerplate/exceptions/base_error.py +13 -0
  35. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/exceptions/domain_error.py +1 -1
  36. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/exceptions/domain_event_type_not_found_error.py +1 -1
  37. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/exceptions/incorrect_value_type_error.py +1 -1
  38. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/exceptions/invalid_id_format_error.py +1 -1
  39. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/exceptions/invalid_negative_value_error.py +1 -1
  40. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/exceptions/rabbit_mq_connection_not_established_error.py +1 -1
  41. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/exceptions/required_value_error.py +1 -1
  42. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/fastapi/error_handlers.py +2 -3
  43. instant_python-0.14.0/instant_python/templates/boilerplate/persistence/async/async_session.py +25 -0
  44. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/persistence/async/sqlalchemy_repository.py +1 -1
  45. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/async_sqlalchemy.yml.j2 +1 -1
  46. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/clean_architecture/source.yml.j2 +1 -4
  47. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/domain_driven_design/source.yml.j2 +2 -5
  48. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/event_bus_domain.yml.j2 +1 -1
  49. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/standard_project/source.yml.j2 +1 -4
  50. {instant_python-0.12.1 → instant_python-0.14.0}/pyproject.toml +7 -2
  51. instant_python-0.14.0/test/config/application/test_config_generator.py +32 -0
  52. instant_python-0.14.0/test/config/domain/mothers/config_schema_mother.py +25 -0
  53. instant_python-0.12.1/test/config/domain/mothers/dependency_configuration_mother.py → instant_python-0.14.0/test/config/domain/mothers/dependency_config_mother.py +7 -7
  54. instant_python-0.14.0/test/config/domain/mothers/general_config_mother.py +31 -0
  55. instant_python-0.14.0/test/config/domain/mothers/git_config_mother.py +22 -0
  56. instant_python-0.12.1/test/config/domain/mothers/template_configuration_mother.py → instant_python-0.14.0/test/config/domain/mothers/template_config_mother.py +12 -12
  57. instant_python-0.14.0/test/config/domain/test_dependency_config.py +35 -0
  58. instant_python-0.12.1/test/config/domain/test_general_configuration.py → instant_python-0.14.0/test/config/domain/test_general_config.py +8 -8
  59. instant_python-0.14.0/test/config/domain/test_git_config.py +43 -0
  60. {instant_python-0.12.1 → instant_python-0.14.0}/test/config/domain/test_template_configuration.py +10 -10
  61. instant_python-0.14.0/test/config/infra/writer/test_yaml_config_writer.py +16 -0
  62. {instant_python-0.12.1 → instant_python-0.14.0}/test/dependency_manager/test_pdm_dependency_manager.py +3 -3
  63. {instant_python-0.12.1 → instant_python-0.14.0}/test/dependency_manager/test_uv_dependency_manager.py +4 -4
  64. instant_python-0.14.0/test/git/__init__.py +0 -0
  65. {instant_python-0.12.1 → instant_python-0.14.0}/test/git/test_git_configurer.py +3 -3
  66. instant_python-0.14.0/test/initialize/__init__.py +0 -0
  67. instant_python-0.14.0/test/initialize/application/__init__.py +0 -0
  68. instant_python-0.14.0/test/initialize/application/test_config_reader.py +29 -0
  69. instant_python-0.14.0/test/initialize/application/test_project_initializer.py +22 -0
  70. instant_python-0.14.0/test/initialize/delivery/__init__.py +0 -0
  71. instant_python-0.14.0/test/initialize/delivery/approved_files/TestInitCli.test_initializes_project_with_general_section_combinations.approved.txt +24 -0
  72. instant_python-0.14.0/test/initialize/delivery/approved_files/TestInitCli.test_initializes_project_with_git_section_combinations.approved.txt +2 -0
  73. instant_python-0.14.0/test/initialize/delivery/approved_files/TestInitCli.test_initializes_project_with_template_section_combinations.approved.txt +48 -0
  74. instant_python-0.14.0/test/initialize/delivery/approved_files/TestInitCli.test_should_initializes_project_with_predefined_dependencies_and_different_managers.approved.txt +4 -0
  75. instant_python-0.14.0/test/initialize/delivery/test_init_cli.py +178 -0
  76. instant_python-0.14.0/test/initialize/domain/__init__.py +0 -0
  77. instant_python-0.14.0/test/initialize/domain/test_nodes.py +12 -0
  78. instant_python-0.14.0/test/initialize/infra/__init__.py +0 -0
  79. instant_python-0.14.0/test/initialize/infra/persistence/__init__.py +0 -0
  80. instant_python-0.14.0/test/initialize/infra/persistence/approved_files/TestConfigurationRepository.test_should_read_existing_config_file.approved.txt +26 -0
  81. instant_python-0.14.0/test/initialize/infra/persistence/test_configuration_repository.py +25 -0
  82. instant_python-0.14.0/test/initialize/infra/renderer/__init__.py +0 -0
  83. instant_python-0.14.0/test/initialize/infra/renderer/test_jinja_environment.py +33 -0
  84. instant_python-0.14.0/test/initialize/infra/renderer/test_jinja_project_renderer.py +37 -0
  85. instant_python-0.14.0/test/initialize/utils.py +5 -0
  86. instant_python-0.14.0/test/project_creator/__init__.py +0 -0
  87. instant_python-0.14.0/test/project_creator/approvaltests_config.json +3 -0
  88. instant_python-0.14.0/test/project_creator/resources/boilerplate/fastapi/__init__.py +0 -0
  89. instant_python-0.14.0/test/project_creator/resources/boilerplate/logger/__init__.py +0 -0
  90. instant_python-0.14.0/test/render/__init__.py +0 -0
  91. instant_python-0.14.0/test/render/approvaltests_config.json +3 -0
  92. instant_python-0.14.0/test/resources/base_ipy_config.yml +21 -0
  93. instant_python-0.14.0/test/resources/domain_error_template.py +8 -0
  94. instant_python-0.14.0/test/resources/hello_world.j2 +2 -0
  95. instant_python-0.14.0/test/resources/standard_project/main_structure.yml.j2 +19 -0
  96. {instant_python-0.12.1 → instant_python-0.14.0}/uv.lock +1 -1
  97. instant_python-0.12.1/instant_python/config/application/config_generator.py +0 -15
  98. instant_python-0.12.1/instant_python/config/domain/config_parser.py +0 -9
  99. instant_python-0.12.1/instant_python/config/domain/config_writer.py +0 -9
  100. instant_python-0.12.1/instant_python/config/infra/writer/yaml_config_writer.py +0 -13
  101. instant_python-0.12.1/instant_python/templates/boilerplate/exceptions/base_error.py +0 -24
  102. instant_python-0.12.1/test/config/application/test_config_generator.py +0 -32
  103. instant_python-0.12.1/test/config/domain/mothers/configuration_schema_mother.py +0 -16
  104. instant_python-0.12.1/test/config/domain/mothers/general_configuration_mother.py +0 -31
  105. instant_python-0.12.1/test/config/domain/mothers/git_configuration_mother.py +0 -22
  106. instant_python-0.12.1/test/config/domain/test_dependency_configuration.py +0 -35
  107. instant_python-0.12.1/test/config/domain/test_git_configuration.py +0 -26
  108. instant_python-0.12.1/test/config/infra/writer/test_yaml_config_writer.py +0 -16
  109. {instant_python-0.12.1 → instant_python-0.14.0}/.github/FUNDING.yml +0 -0
  110. {instant_python-0.12.1 → instant_python-0.14.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  111. {instant_python-0.12.1 → instant_python-0.14.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  112. {instant_python-0.12.1 → instant_python-0.14.0}/.github/actions/python_setup/action.yml +0 -0
  113. {instant_python-0.12.1 → instant_python-0.14.0}/.github/pull_request_template.md +0 -0
  114. {instant_python-0.12.1 → instant_python-0.14.0}/.github/workflows/pages.yml +0 -0
  115. {instant_python-0.12.1 → instant_python-0.14.0}/.github/workflows/release.yml +0 -0
  116. {instant_python-0.12.1 → instant_python-0.14.0}/.gitignore +0 -0
  117. {instant_python-0.12.1 → instant_python-0.14.0}/.pre-commit-config.yaml +0 -0
  118. {instant_python-0.12.1 → instant_python-0.14.0}/.python-version +0 -0
  119. {instant_python-0.12.1 → instant_python-0.14.0}/CITATION.cff +0 -0
  120. {instant_python-0.12.1 → instant_python-0.14.0}/LICENSE +0 -0
  121. {instant_python-0.12.1 → instant_python-0.14.0}/README.md +0 -0
  122. {instant_python-0.12.1 → instant_python-0.14.0}/SECURITY.md +0 -0
  123. {instant_python-0.12.1 → instant_python-0.14.0}/codeql-config.yml +0 -0
  124. {instant_python-0.12.1 → instant_python-0.14.0}/docs/assets/favicon.svg +0 -0
  125. {instant_python-0.12.1 → instant_python-0.14.0}/docs/assets/logo.svg +0 -0
  126. {instant_python-0.12.1 → instant_python-0.14.0}/docs/changelog/.components/changelog_header.md.j2 +0 -0
  127. {instant_python-0.12.1 → instant_python-0.14.0}/docs/changelog/.components/changelog_init.md.j2 +0 -0
  128. {instant_python-0.12.1 → instant_python-0.14.0}/docs/changelog/.components/changelog_update.md.j2 +0 -0
  129. {instant_python-0.12.1 → instant_python-0.14.0}/docs/changelog/.components/changes.md.j2 +0 -0
  130. {instant_python-0.12.1 → instant_python-0.14.0}/docs/changelog/.components/first_release.md.j2 +0 -0
  131. {instant_python-0.12.1 → instant_python-0.14.0}/docs/changelog/.components/macros.md.j2 +0 -0
  132. {instant_python-0.12.1 → instant_python-0.14.0}/docs/changelog/.components/versioned_changes.md.j2 +0 -0
  133. {instant_python-0.12.1 → instant_python-0.14.0}/docs/changelog/.release_notes.md.j2 +0 -0
  134. {instant_python-0.12.1 → instant_python-0.14.0}/docs/changelog/CHANGELOG.md.j2 +0 -0
  135. {instant_python-0.12.1 → instant_python-0.14.0}/docs/downloads_macro.py +0 -0
  136. {instant_python-0.12.1 → instant_python-0.14.0}/docs/examples/configuration.md +0 -0
  137. {instant_python-0.12.1 → instant_python-0.14.0}/docs/examples/custom_template.md +0 -0
  138. {instant_python-0.12.1 → instant_python-0.14.0}/docs/guide/command_config.md +0 -0
  139. {instant_python-0.12.1 → instant_python-0.14.0}/docs/guide/command_init.md +0 -0
  140. {instant_python-0.12.1 → instant_python-0.14.0}/docs/home/contributing.md +0 -0
  141. {instant_python-0.12.1 → instant_python-0.14.0}/docs/home/getting_started.md +0 -0
  142. {instant_python-0.12.1 → instant_python-0.14.0}/docs/home/index.md +0 -0
  143. {instant_python-0.12.1 → instant_python-0.14.0}/docs/home/releases.md +0 -0
  144. {instant_python-0.12.1 → instant_python-0.14.0}/docs/home/security.md +0 -0
  145. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/__init__.py +0 -0
  146. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/cli/__init__.py +0 -0
  147. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/cli/cli.py +0 -0
  148. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/cli/instant_python_typer.py +0 -0
  149. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/__init__.py +0 -0
  150. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/application/__init__.py +0 -0
  151. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/delivery/__init__.py +0 -0
  152. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/delivery/cli.py +0 -0
  153. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/domain/__init__.py +0 -0
  154. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/domain/question_wizard.py +0 -0
  155. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/infra/__init__.py +0 -0
  156. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/infra/parser/__init__.py +0 -0
  157. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/infra/question_wizard/__init__.py +0 -0
  158. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/infra/question_wizard/questionary_console_wizard.py +0 -0
  159. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/infra/question_wizard/step/__init__.py +0 -0
  160. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/infra/question_wizard/step/dependencies_step.py +0 -0
  161. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/infra/question_wizard/step/general_step.py +0 -0
  162. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/infra/question_wizard/step/git_step.py +0 -0
  163. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/infra/question_wizard/step/questionary.py +0 -0
  164. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/infra/question_wizard/step/steps.py +0 -0
  165. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/infra/question_wizard/step/template_step.py +0 -0
  166. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/config/infra/writer/__init__.py +0 -0
  167. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/configuration/__init__.py +0 -0
  168. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/configuration/parser/__init__.py +0 -0
  169. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/configuration/parser/configuration_file_not_found.py +0 -0
  170. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/dependency_manager/__init__.py +0 -0
  171. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/dependency_manager/command_execution_error.py +0 -0
  172. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/dependency_manager/dependency_manager_factory.py +0 -0
  173. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/dependency_manager/unknown_dependency_manager_error.py +0 -0
  174. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/formatter/__init__.py +0 -0
  175. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/formatter/project_formatter.py +0 -0
  176. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/git/__init__.py +0 -0
  177. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/initialize/__init__.py +0 -0
  178. {instant_python-0.12.1/instant_python/initialize/delivery → instant_python-0.14.0/instant_python/initialize/application}/__init__.py +0 -0
  179. {instant_python-0.12.1/instant_python/project_creator → instant_python-0.14.0/instant_python/initialize/delivery}/__init__.py +0 -0
  180. {instant_python-0.12.1/instant_python/render → instant_python-0.14.0/instant_python/initialize/domain}/__init__.py +0 -0
  181. {instant_python-0.12.1/instant_python/shared → instant_python-0.14.0/instant_python/initialize/infra}/__init__.py +0 -0
  182. {instant_python-0.12.1/instant_python/templates/boilerplate/event_bus → instant_python-0.14.0/instant_python/initialize/infra/persistence}/__init__.py +0 -0
  183. {instant_python-0.12.1/instant_python/templates/boilerplate/exceptions → instant_python-0.14.0/instant_python/initialize/infra/renderer}/__init__.py +0 -0
  184. {instant_python-0.12.1/instant_python/templates/boilerplate/fastapi → instant_python-0.14.0/instant_python/project_creator}/__init__.py +0 -0
  185. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/project_creator/directory.py +0 -0
  186. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/project_creator/file_has_not_been_created.py +0 -0
  187. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/project_creator/node.py +0 -0
  188. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/project_creator/unknown_node_typer_error.py +0 -0
  189. {instant_python-0.12.1/instant_python/templates/boilerplate/logger → instant_python-0.14.0/instant_python/render}/__init__.py +0 -0
  190. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/render/custom_project_renderer.py +0 -0
  191. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/render/jinja_custom_filters.py +0 -0
  192. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/render/template_file_not_found_error.py +0 -0
  193. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/render/unknown_template_error.py +0 -0
  194. {instant_python-0.12.1/instant_python/templates/boilerplate/persistence → instant_python-0.14.0/instant_python/shared}/__init__.py +0 -0
  195. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/shared/error_types.py +0 -0
  196. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/shared/supported_built_in_features.py +0 -0
  197. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/shared/supported_licenses.py +0 -0
  198. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/shared/supported_managers.py +0 -0
  199. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/shared/supported_python_versions.py +0 -0
  200. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/shared/supported_templates.py +0 -0
  201. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/.gitignore +0 -0
  202. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/.pre-commit-config.yml +0 -0
  203. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/.python-version +0 -0
  204. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/CITATION.cff +0 -0
  205. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/LICENSE +0 -0
  206. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/README.md +0 -0
  207. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/SECURITY.md +0 -0
  208. {instant_python-0.12.1/instant_python/templates/boilerplate/persistence/async → instant_python-0.14.0/instant_python/templates/boilerplate/event_bus}/__init__.py +0 -0
  209. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/event_bus/domain_event.py +0 -0
  210. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/event_bus/domain_event_json_deserializer.py +0 -0
  211. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/event_bus/domain_event_json_serializer.py +0 -0
  212. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/event_bus/domain_event_subscriber.py +0 -0
  213. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/event_bus/event_aggregate.py +0 -0
  214. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/event_bus/event_bus.py +0 -0
  215. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/event_bus/exchange_type.py +0 -0
  216. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/event_bus/mock_event_bus.py +0 -0
  217. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_configurer.py +0 -0
  218. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_connection.py +0 -0
  219. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_consumer.py +0 -0
  220. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_event_bus.py +0 -0
  221. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_queue_formatter.py +0 -0
  222. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_settings.py +0 -0
  223. {instant_python-0.12.1/instant_python/templates/boilerplate/persistence/synchronous → instant_python-0.14.0/instant_python/templates/boilerplate/exceptions}/__init__.py +0 -0
  224. {instant_python-0.12.1/instant_python/templates/boilerplate/value_object → instant_python-0.14.0/instant_python/templates/boilerplate/fastapi}/__init__.py +0 -0
  225. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/fastapi/application.py +0 -0
  226. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/fastapi/error_response.py +0 -0
  227. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/fastapi/fastapi_log_middleware.py +0 -0
  228. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/fastapi/lifespan.py +0 -0
  229. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/fastapi/success_response.py +0 -0
  230. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/github/action.yml +0 -0
  231. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/github/bug_report.yml +0 -0
  232. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/github/ci.yml +0 -0
  233. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/github/feature_request.yml +0 -0
  234. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/github/release.yml +0 -0
  235. {instant_python-0.12.1/test → instant_python-0.14.0/instant_python/templates/boilerplate/logger}/__init__.py +0 -0
  236. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/logger/file_logger.py +0 -0
  237. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/logger/file_rotating_handler.py +0 -0
  238. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/logger/json_formatter.py +0 -0
  239. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/mypy.ini +0 -0
  240. {instant_python-0.12.1/test/config → instant_python-0.14.0/instant_python/templates/boilerplate/persistence}/__init__.py +0 -0
  241. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/persistence/alembic_migrator.py +0 -0
  242. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/persistence/async/README.md +0 -0
  243. {instant_python-0.12.1/test/config/application → instant_python-0.14.0/instant_python/templates/boilerplate/persistence/async}/__init__.py +0 -0
  244. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/persistence/async/alembic.ini +0 -0
  245. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/persistence/async/async_engine_fixture.py +0 -0
  246. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/persistence/async/env.py +0 -0
  247. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/persistence/async/models_metadata.py +0 -0
  248. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/persistence/async/postgres_settings.py +0 -0
  249. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/persistence/async/script.py.mako +0 -0
  250. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/persistence/base.py +0 -0
  251. {instant_python-0.12.1/test/config/domain → instant_python-0.14.0/instant_python/templates/boilerplate/persistence/synchronous}/__init__.py +0 -0
  252. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/persistence/synchronous/session_maker.py +0 -0
  253. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/persistence/synchronous/sqlalchemy_repository.py +0 -0
  254. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/pyproject.toml +0 -0
  255. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/pytest.ini +0 -0
  256. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/random_generator.py +0 -0
  257. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/scripts/add_dependency.py +0 -0
  258. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/scripts/create_aggregate.py +0 -0
  259. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/scripts/insert_template.py +0 -0
  260. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/scripts/integration.sh +0 -0
  261. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/scripts/local_setup.py +0 -0
  262. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/scripts/makefile +0 -0
  263. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/scripts/post-merge.py +0 -0
  264. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/scripts/pre-commit.py +0 -0
  265. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/scripts/pre-push.py +0 -0
  266. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/scripts/remove_dependency.py +0 -0
  267. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/scripts/unit.sh +0 -0
  268. {instant_python-0.12.1/test/config/domain/mothers → instant_python-0.14.0/instant_python/templates/boilerplate/value_object}/__init__.py +0 -0
  269. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/value_object/aggregate.py +0 -0
  270. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/value_object/int_primitives_mother.py +0 -0
  271. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/value_object/int_value_object.py +0 -0
  272. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/value_object/string_primitives_mother.py +0 -0
  273. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/value_object/string_value_object.py +0 -0
  274. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/value_object/test_int_value_object.py +0 -0
  275. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/value_object/test_string_value_object.py +0 -0
  276. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/value_object/test_uuid_value_object.py +0 -0
  277. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/value_object/uuid.py +0 -0
  278. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/value_object/uuid_primitives_mother.py +0 -0
  279. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/value_object/validation.py +0 -0
  280. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/boilerplate/value_object/value_object.py +0 -0
  281. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/alembic_migrator.yml.j2 +0 -0
  282. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/async_alembic.yml.j2 +0 -0
  283. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/citation.yml.j2 +0 -0
  284. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/clean_architecture/main_structure.yml.j2 +0 -0
  285. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/clean_architecture/test.yml.j2 +0 -0
  286. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/domain_driven_design/bounded_context.yml.j2 +0 -0
  287. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/domain_driven_design/main_structure.yml.j2 +0 -0
  288. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/domain_driven_design/test.yml.j2 +0 -0
  289. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/event_bus_infra.yml.j2 +0 -0
  290. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/fastapi_app.yml.j2 +0 -0
  291. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/fastapi_domain.yml.j2 +0 -0
  292. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/fastapi_infra.yml.j2 +0 -0
  293. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/github_action.yml.j2 +0 -0
  294. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/github_issues_template.yml.j2 +0 -0
  295. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/gitignore.yml.j2 +0 -0
  296. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/license.yml.j2 +0 -0
  297. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/logger.yml.j2 +0 -0
  298. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/macros.j2 +0 -0
  299. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/makefile.yml.j2 +0 -0
  300. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/mypy.yml.j2 +0 -0
  301. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/precommit_hook.yml.j2 +0 -0
  302. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/pyproject.yml.j2 +0 -0
  303. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/pytest.yml.j2 +0 -0
  304. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/python_version.yml.j2 +0 -0
  305. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/readme.yml.j2 +0 -0
  306. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/security.yml.j2 +0 -0
  307. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/standard_project/main_structure.yml.j2 +0 -0
  308. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/standard_project/test.yml.j2 +0 -0
  309. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/synchronous_sqlalchemy.yml.j2 +0 -0
  310. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/test_value_objects.yml.j2 +0 -0
  311. {instant_python-0.12.1 → instant_python-0.14.0}/instant_python/templates/project_structure/value_objects.yml.j2 +0 -0
  312. {instant_python-0.12.1 → instant_python-0.14.0}/makefile +0 -0
  313. {instant_python-0.12.1 → instant_python-0.14.0}/mkdocs.yml +0 -0
  314. {instant_python-0.12.1 → instant_python-0.14.0}/mypy.ini +0 -0
  315. {instant_python-0.12.1 → instant_python-0.14.0}/scripts/add_dependency.py +0 -0
  316. {instant_python-0.12.1 → instant_python-0.14.0}/scripts/remove_dependency.py +0 -0
  317. {instant_python-0.12.1/test/config/infra → instant_python-0.14.0/test}/__init__.py +0 -0
  318. {instant_python-0.12.1/test/config/infra/parser → instant_python-0.14.0/test/config}/__init__.py +0 -0
  319. {instant_python-0.12.1/test/config/infra/parser/resources → instant_python-0.14.0/test/config/application}/__init__.py +0 -0
  320. {instant_python-0.12.1/test/config/infra/writer → instant_python-0.14.0/test/config/domain}/__init__.py +0 -0
  321. {instant_python-0.12.1/test/configuration → instant_python-0.14.0/test/config/domain/mothers}/__init__.py +0 -0
  322. {instant_python-0.12.1/test/configuration/parser → instant_python-0.14.0/test/config/infra}/__init__.py +0 -0
  323. {instant_python-0.12.1/test/configuration/parser/resources → instant_python-0.14.0/test/config/infra/parser}/__init__.py +0 -0
  324. {instant_python-0.12.1 → instant_python-0.14.0}/test/config/infra/parser/approvaltests_config.json +0 -0
  325. {instant_python-0.12.1 → instant_python-0.14.0}/test/config/infra/parser/approved_files/TestParser.test_should_parse_valid_answers.approved.txt +0 -0
  326. {instant_python-0.12.1/test/dependency_manager → instant_python-0.14.0/test/config/infra/parser/resources}/__init__.py +0 -0
  327. {instant_python-0.12.1 → instant_python-0.14.0}/test/config/infra/parser/resources/missing_dependencies_fields.yml +0 -0
  328. {instant_python-0.12.1 → instant_python-0.14.0}/test/config/infra/parser/resources/missing_general_fields.yml +0 -0
  329. {instant_python-0.12.1 → instant_python-0.14.0}/test/config/infra/parser/resources/missing_git_fields.yml +0 -0
  330. {instant_python-0.12.1 → instant_python-0.14.0}/test/config/infra/parser/resources/missing_keys_answers.yml +0 -0
  331. {instant_python-0.12.1 → instant_python-0.14.0}/test/config/infra/parser/resources/missing_template_fields.yml +0 -0
  332. {instant_python-0.12.1 → instant_python-0.14.0}/test/config/infra/parser/resources/valid_answers.yml +0 -0
  333. {instant_python-0.12.1 → instant_python-0.14.0}/test/config/infra/parser/test_parser.py +0 -0
  334. {instant_python-0.12.1/test/formatter → instant_python-0.14.0/test/config/infra/writer}/__init__.py +0 -0
  335. {instant_python-0.12.1/test/git → instant_python-0.14.0/test/configuration}/__init__.py +0 -0
  336. {instant_python-0.12.1/test/project_creator → instant_python-0.14.0/test/configuration/parser}/__init__.py +0 -0
  337. {instant_python-0.12.1 → instant_python-0.14.0}/test/configuration/parser/approvaltests_config.json +0 -0
  338. {instant_python-0.12.1 → instant_python-0.14.0}/test/configuration/parser/approved_files/TestParser.test_should_parse_configuration.approved.txt +0 -0
  339. {instant_python-0.12.1/test/project_creator/resources/boilerplate/fastapi → instant_python-0.14.0/test/configuration/parser/resources}/__init__.py +0 -0
  340. {instant_python-0.12.1 → instant_python-0.14.0}/test/configuration/parser/resources/config.yml +0 -0
  341. {instant_python-0.12.1 → instant_python-0.14.0}/test/configuration/parser/resources/empty_config.yml +0 -0
  342. {instant_python-0.12.1 → instant_python-0.14.0}/test/configuration/parser/resources/missing_dependencies_fields_config.yml +0 -0
  343. {instant_python-0.12.1 → instant_python-0.14.0}/test/configuration/parser/resources/missing_general_fields_config.yml +0 -0
  344. {instant_python-0.12.1 → instant_python-0.14.0}/test/configuration/parser/resources/missing_git_fields_config.yml +0 -0
  345. {instant_python-0.12.1 → instant_python-0.14.0}/test/configuration/parser/resources/missing_keys_config.yml +0 -0
  346. {instant_python-0.12.1 → instant_python-0.14.0}/test/configuration/parser/resources/missing_template_fields_config.yml +0 -0
  347. {instant_python-0.12.1 → instant_python-0.14.0}/test/configuration/parser/test_parser.py +0 -0
  348. {instant_python-0.12.1/test/project_creator/resources/boilerplate/logger → instant_python-0.14.0/test/dependency_manager}/__init__.py +0 -0
  349. {instant_python-0.12.1 → instant_python-0.14.0}/test/dependency_manager/mock_pdm_dependency_manager.py +0 -0
  350. {instant_python-0.12.1 → instant_python-0.14.0}/test/dependency_manager/mock_uv_dependency_manager.py +0 -0
  351. {instant_python-0.12.1/test/render → instant_python-0.14.0/test/formatter}/__init__.py +0 -0
  352. {instant_python-0.12.1 → instant_python-0.14.0}/test/formatter/mock_project_formatter.py +0 -0
  353. {instant_python-0.12.1 → instant_python-0.14.0}/test/formatter/test_project_formatter.py +0 -0
  354. {instant_python-0.12.1 → instant_python-0.14.0}/test/git/mock_git_configurer.py +0 -0
  355. {instant_python-0.12.1/test/project_creator → instant_python-0.14.0/test/initialize/delivery}/approvaltests_config.json +0 -0
  356. {instant_python-0.12.1/test/render → instant_python-0.14.0/test/initialize/infra/persistence}/approvaltests_config.json +0 -0
  357. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/approved_files/TestFileSystem.test_should_create_file_system_in_disk.rendered_custom_project_structure.json.approved.txt +0 -0
  358. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/approved_files/TestFileSystem.test_should_create_file_system_in_disk.rendered_project_structure.json.approved.txt +0 -0
  359. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/approved_files/TestFileSystem.test_should_create_file_system_in_disk.rendered_project_structure_fastapi_with_logger.json.approved.txt +0 -0
  360. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/approved_files/TestFileSystem.test_should_create_file_system_in_disk.rendered_project_structure_fastapi_with_migrator.json.approved.txt +0 -0
  361. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/approved_files/TestFileSystem.test_should_create_file_system_in_disk.rendered_project_structure_only_with_fastapi.json.approved.txt +0 -0
  362. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/approved_files/TestFileSystem.test_should_create_folders_and_files.approved.txt +0 -0
  363. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/approved_files/TestFileSystem.test_should_generate_file_system_tree.approved.txt +0 -0
  364. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/directory_mother.py +0 -0
  365. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/resources/boilerplate/exceptions/domain_error.py +0 -0
  366. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/resources/boilerplate/exceptions/domain_error_simple.py +0 -0
  367. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/resources/boilerplate/fastapi/application.py +0 -0
  368. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/resources/boilerplate/fastapi/http_response.py +0 -0
  369. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/resources/boilerplate/fastapi/lifespan.py +0 -0
  370. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/resources/boilerplate/logger/logger.py +0 -0
  371. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/resources/boilerplate/persistence/alembic_migrator.py +0 -0
  372. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/resources/clean_architecture/main_structure.yml.j2 +0 -0
  373. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/resources/config.yml +0 -0
  374. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/resources/config_fastapi_with_logger.yml +0 -0
  375. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/resources/config_fastapi_with_migrator.yml +0 -0
  376. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/resources/config_with_only_fastapi.yml +0 -0
  377. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/resources/rendered_custom_project_structure.json +0 -0
  378. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/resources/rendered_project_structure.json +0 -0
  379. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/resources/rendered_project_structure_fastapi_with_logger.json +0 -0
  380. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/resources/rendered_project_structure_fastapi_with_migrator.json +0 -0
  381. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/resources/rendered_project_structure_only_with_fastapi.json +0 -0
  382. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/test_directory.py +0 -0
  383. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/test_file.py +0 -0
  384. {instant_python-0.12.1 → instant_python-0.14.0}/test/project_creator/test_file_system.py +0 -0
  385. {instant_python-0.12.1 → instant_python-0.14.0}/test/random_generator.py +0 -0
  386. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/approved_files/TestCustomProjectRenderer.test_should_render_custom_template.approved.txt +0 -0
  387. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/approved_files/TestJinjaProjectRenderer.test_should_render_template_for.clean_architecture_config.yml.approved.txt +0 -0
  388. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/approved_files/TestJinjaProjectRenderer.test_should_render_template_for.domain_driven_design_config.yml.approved.txt +0 -0
  389. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/approved_files/TestJinjaProjectRenderer.test_should_render_template_for.received.txt +0 -0
  390. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/approved_files/TestJinjaProjectRenderer.test_should_render_template_for.standard_project_with_dependency_config.yml.approved.txt +0 -0
  391. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/approved_files/TestJinjaProjectRenderer.test_should_render_template_for.standard_project_with_git_config.yml.approved.txt +0 -0
  392. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/resources/clean_architecture/main_structure.yml.j2 +0 -0
  393. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/resources/clean_architecture_config.yml +0 -0
  394. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/resources/custom_template.yml +0 -0
  395. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/resources/domain_driven_design/main_structure.yml.j2 +0 -0
  396. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/resources/domain_driven_design_config.yml +0 -0
  397. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/resources/standard_project/main_structure.yml.j2 +0 -0
  398. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/resources/standard_project_with_dependency_config.yml +0 -0
  399. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/resources/standard_project_with_git_config.yml +0 -0
  400. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/resources/test_template.j2 +0 -0
  401. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/test_custom_project_renderer.py +0 -0
  402. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/test_jinja_environment.py +0 -0
  403. {instant_python-0.12.1 → instant_python-0.14.0}/test/render/test_jinja_project_renderer.py +0 -0
  404. {instant_python-0.12.1 → instant_python-0.14.0}/tox.ini +0 -0
@@ -172,32 +172,6 @@ jobs:
172
172
  token: ${{ secrets.CODECOV_TOKEN }}
173
173
  slug: dimanu-py/instant-python
174
174
 
175
- rollback:
176
- name: rollback
177
- runs-on: ubuntu-latest
178
- needs: [ test ]
179
- if: ${{ always() && needs.test.result == 'failure' }}
180
- steps:
181
- - name: 🛡️ Harden runner
182
- uses: step-security/harden-runner@6c439dc8bdf85cadbbce9ed30d1c7b959517bc49 # v2.12.2
183
- with:
184
- egress-policy: audit
185
-
186
- - name: 📥 Checkout the repository
187
- uses: actions/checkout@v4
188
- with:
189
- fetch-depth: 0
190
- persist-credentials: false
191
-
192
- - name: ⏪️ Reset to previous commit
193
- run: |
194
- git config user.name ${{ vars.GIT_COMMITTER_NAME }}
195
- git config user.email ${{ vars.GIT_COMMITTER_EMAIL }}
196
- git reset --hard ${{ github.event.before }}
197
- git push --force-with-lease origin main
198
- env:
199
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
200
-
201
175
  tox-test:
202
176
  name: tox
203
177
  runs-on: ubuntu-latest
@@ -2,6 +2,192 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v0.14.0 (2025-11-03)
6
+
7
+ ### ✨ Features
8
+
9
+ - **templates**: Add new template that implements a general way of getting async sessions
10
+ ([`0f6d37e`](https://github.com/dimanu-py/instant-python/commit/0f6d37e1ae9cf676c41719bd7c39e7056b15d15c))
11
+
12
+ - **initialize**: Implement build_path_for method to construct file paths
13
+ ([`f1f253f`](https://github.com/dimanu-py/instant-python/commit/f1f253f1cd255b416bb7f337e7dcd85db8c4cf09))
14
+
15
+ - **initialize**: Enhance project structure rendering by adding template content to files
16
+ ([`8b6c98c`](https://github.com/dimanu-py/instant-python/commit/8b6c98c35a4572f905bfae9a52e744cf02af7817))
17
+
18
+ - **initialize**: Implement rendering of project structure using YAML template
19
+ ([`6d93e9a`](https://github.com/dimanu-py/instant-python/commit/6d93e9a61d2822068163cfe983be8c9ea189b3a4))
20
+
21
+ - **initialize**: Enhance JinjaEnvironment to support multiple template loaders
22
+ ([`5b69e4f`](https://github.com/dimanu-py/instant-python/commit/5b69e4f7c35b526b8de41b663108918c2d2ffba3))
23
+
24
+ - **initialize**: Implement render_template method in JinjaEnvironment
25
+ ([`860bc0b`](https://github.com/dimanu-py/instant-python/commit/860bc0b6285c0bf4ec36d9c20d3c6febf71d0a37))
26
+
27
+ - **initialize**: Add render_template method to JinjaEnvironment with placeholder implementation
28
+ ([`4c67ad3`](https://github.com/dimanu-py/instant-python/commit/4c67ad300473719fbac6f8dab3470407dc1c5559))
29
+
30
+ - **initialize**: Set FileSystemLoader with user_template_path in JinjaEnvironment
31
+ ([`d6ef776`](https://github.com/dimanu-py/instant-python/commit/d6ef7766adcc89ef03f8ad2905931fc8541b949e))
32
+
33
+ - **initialize**: Add user_template_path parameter to JinjaEnvironment constructor
34
+ ([`42d34ac`](https://github.com/dimanu-py/instant-python/commit/42d34ac4a46c097a7dca0f75175e7ad64b3ca98c))
35
+
36
+ - **initialize**: Add custom filters for jinja and load them by default in jinja env
37
+ ([`4194509`](https://github.com/dimanu-py/instant-python/commit/419450927edd6b3e81199b7301ebdad25fbfb8b2))
38
+
39
+ - **initialize**: Add method to register custom filters in jinja environment
40
+ ([`ec1d01a`](https://github.com/dimanu-py/instant-python/commit/ec1d01a84faa2c65618938ccbd47d46f3026dddc))
41
+
42
+ - **initialize**: Add test to verify jinja environment loads custom filters
43
+ ([`31ff4a5`](https://github.com/dimanu-py/instant-python/commit/31ff4a50d1a6b8dff97813ccc4fe99db4376301b))
44
+
45
+ - **initialize**: Instantiate jinja 2 environment inside wrapper class
46
+ ([`c0f7ec0`](https://github.com/dimanu-py/instant-python/commit/c0f7ec0d39f721d999cd4a9330c3fab7c32192c9))
47
+
48
+ - **initializer**: Implement project structure rendering in execute method
49
+ ([`a91b8ae`](https://github.com/dimanu-py/instant-python/commit/a91b8ae66e81291b56963b8e9ea39eb47618daba))
50
+
51
+ ### 🪲 Bug Fixes
52
+
53
+ - **templates**: Correct spelling error in sqlalchemy repository template
54
+ ([`97f6003`](https://github.com/dimanu-py/instant-python/commit/97f6003a4b89d9553e969bce9794ce3f0e59ac17))
55
+
56
+ - **initialize**: Search for default template that is at first level of boilerplate folder
57
+ ([`841badc`](https://github.com/dimanu-py/instant-python/commit/841badc6af64490729fd448f3797393d9ed47cd4))
58
+
59
+ ### ⚙️ Build System
60
+
61
+ - Update testpaths to point to the correct directory
62
+ ([`61bc700`](https://github.com/dimanu-py/instant-python/commit/61bc700f99533bf119c03590fabd44738f88f7a7))
63
+
64
+ ### ♻️ Refactoring
65
+
66
+ - **templates**: Modify all errors template to not include 'error_type' attribute and leave just
67
+ typical message field
68
+ ([`1fc2a39`](https://github.com/dimanu-py/instant-python/commit/1fc2a39e0662a50c5a701c1f2cacb625482175c1))
69
+
70
+ - **templates**: Modify source structure of all project templates so exclude sync sqlalchemy and
71
+ include async sqlalchemy when present
72
+ ([`244b597`](https://github.com/dimanu-py/instant-python/commit/244b5975c6fb2d64d503a9a64b1961ee0837e082))
73
+
74
+ - **templates**: Modify async sqlalchemy structure template to exclude sqlalchemy repository
75
+ template and include async session template
76
+ ([`447caa4`](https://github.com/dimanu-py/instant-python/commit/447caa4472a7e080f15bc45a5da37c3694b686ae))
77
+
78
+ - **initialize**: Extract semantic method to populate file keys with content from template
79
+ ([`5ceb8ec`](https://github.com/dimanu-py/instant-python/commit/5ceb8ec574d366902d671b816cc893df8d4d919f))
80
+
81
+ - **initialize**: Extract semantic method to express operation of rendering the project structure
82
+ using jinja
83
+ ([`f610639`](https://github.com/dimanu-py/instant-python/commit/f61063922d0e64c3fbb19832d6e663c5b15adbad))
84
+
85
+ - **initialize**: Extract semantic method to generate main structure template path
86
+ ([`ff69c87`](https://github.com/dimanu-py/instant-python/commit/ff69c87829d71e52d4f66fa36dbc879fd276dc56))
87
+
88
+ - **config**: Extract semantic methods in ConfigGenerator use case to keep high level expressions in
89
+ main 'execute' method
90
+ ([`766a2bc`](https://github.com/dimanu-py/instant-python/commit/766a2bcd1ed614a093dfe6bd99a1f45ba997df8b))
91
+
92
+ - **initialize**: Update render_template method to accept Any type for context
93
+ ([`e6501bc`](https://github.com/dimanu-py/instant-python/commit/e6501bcb777f5ba2be8903f04629affd6ba66521))
94
+
95
+ - **initialize**: Rename render_project_structure method to render
96
+ ([`49fd942`](https://github.com/dimanu-py/instant-python/commit/49fd942a0bdcfdbababee08d0f0c304e5f9d78a5))
97
+
98
+ - **initialize**: Rename configuration repository classes for consistency
99
+ ([`4b4fa94`](https://github.com/dimanu-py/instant-python/commit/4b4fa94e95f77e9f08d64dc96462551b218324f8))
100
+
101
+ - **initialize**: Move config repository to a persistence module to keep modules organized
102
+ ([`3d9a7e0`](https://github.com/dimanu-py/instant-python/commit/3d9a7e02481c5fe5401f28c035ca21bc20374ba0))
103
+
104
+ - **initialize**: Modify signature of renderer interface to only accept context config parameter
105
+ ([`835060f`](https://github.com/dimanu-py/instant-python/commit/835060feb47d2446a06977b2deb3116beed67adf))
106
+
107
+ - **initialize**: Clean up jinja environment tests extracting common object instantiation
108
+ ([`c73e2e3`](https://github.com/dimanu-py/instant-python/commit/c73e2e38e75d839a1c1ae8a63798db9630d05fd9))
109
+
110
+ - **config**: Rename all references from 'configuration' to 'config' for naming consistency
111
+ ([`7691173`](https://github.com/dimanu-py/instant-python/commit/769117371e59d5642b5cc8fbffe9a55099e5386d))
112
+
113
+ - **config**: Remove unused method 'save_on_current_directory' method
114
+ ([`e760771`](https://github.com/dimanu-py/instant-python/commit/e760771438653b669cbdac0a9c8049dc298d7c0c))
115
+
116
+
117
+ ## v0.13.0 (2025-10-26)
118
+
119
+ ### ✨ Features
120
+
121
+ - **config**: Raise error when git repo is set to be initialized but username or email is either not
122
+ passed or an empty string
123
+ ([`2e9f852`](https://github.com/dimanu-py/instant-python/commit/2e9f85287b3beab29bfd2745a830d6972939938f))
124
+
125
+ - **dependency-manager**: Inform the user that the selected dependency manager is already installed
126
+ ([`71ac1f7`](https://github.com/dimanu-py/instant-python/commit/71ac1f7c7da63ce55d27aacb9c1db03c34963de4))
127
+
128
+ - **config**: Allow custom configuration path for loading configurations
129
+ ([`b7bfc97`](https://github.com/dimanu-py/instant-python/commit/b7bfc97fa8d7ada19d39c2c04a491e625ab83366))
130
+
131
+ - **config**: Add 'custom_config_path' parameter to Parser port to be able to generate
132
+ configurations with custom paths to the config file
133
+ ([`350dbeb`](https://github.com/dimanu-py/instant-python/commit/350dbebab016dda71f42bef4d389e48e0ca2b197))
134
+
135
+ - **initialize**: Handle FileNotFoundError in read_from_file method
136
+ ([`00fb79f`](https://github.com/dimanu-py/instant-python/commit/00fb79f5ec282525433b5d0e6abb4880cac23b33))
137
+
138
+ - **initialize**: Implement read_from_file method to load YAML configuration
139
+ ([`5630929`](https://github.com/dimanu-py/instant-python/commit/5630929f3a5615e0f93d6d688e01d07cc31bafbd))
140
+
141
+ - **initialize**: Convert ConfigurationRepository into an interface and define the signature of
142
+ 'read_from_file' method
143
+ ([`b8c768f`](https://github.com/dimanu-py/instant-python/commit/b8c768fb958b96f9fa2749cf9668c02951d0426c))
144
+
145
+ - **initialize**: Implement execute method to return parsed configuration schema from config file
146
+ ([`a009371`](https://github.com/dimanu-py/instant-python/commit/a00937100e8cef46036dce1dc16db18f20602a03))
147
+
148
+ ### 🪲 Bug Fixes
149
+
150
+ - **dependency-manager**: Use dynamic command for version check in dependency managers
151
+ ([`46c9726`](https://github.com/dimanu-py/instant-python/commit/46c972601cf1ad217d6a0aca845fe0410d8cc176))
152
+
153
+ - **config**: Configure parser mock in config reader unit test to be called with the config file
154
+ path
155
+ ([`71655ea`](https://github.com/dimanu-py/instant-python/commit/71655ea654392978c339314482a5e94a51fbf888))
156
+
157
+ - **templates**: Correct error exception boilerplate file to base_error
158
+ ([`8dda0d7`](https://github.com/dimanu-py/instant-python/commit/8dda0d7ae296c42d9eed496920785e6f5b608779))
159
+
160
+ - **dependency-manager**: Install uv manager only if is not installed
161
+ ([`e2a9ad5`](https://github.com/dimanu-py/instant-python/commit/e2a9ad5fdede2da1bb94e2bf7c75c74f04be9a23))
162
+
163
+ - **dependency-manager**: Install pdm manager only if is not installed
164
+ ([`f4eb3ff`](https://github.com/dimanu-py/instant-python/commit/f4eb3fffbfe5c067f1997ddb7eb70dcddde43de4))
165
+
166
+ - **initialize**: Pass config file path to parser for accurate parsing
167
+ ([`de58185`](https://github.com/dimanu-py/instant-python/commit/de58185ab722863a92627adf6b065c796e1860d5))
168
+
169
+ ### ⚙️ Build System
170
+
171
+ - Add pytest marks to be able to discriminate which tests are run
172
+ ([`33e8e3d`](https://github.com/dimanu-py/instant-python/commit/33e8e3df683483a3745583cc03cd9a877c33f937))
173
+
174
+ ### ♻️ Refactoring
175
+
176
+ - **render**: Encapsulate filter addition in _add_filter method
177
+ ([`caf805b`](https://github.com/dimanu-py/instant-python/commit/caf805b1f9c38782e011d237cc131798c6c9b565))
178
+
179
+ - **initialize**: Use config reader in init cli application
180
+ ([`20f8178`](https://github.com/dimanu-py/instant-python/commit/20f8178f398b5db6b8cb7f48f12fc1a4143fe1b8))
181
+
182
+ - **initialize**: Rename read_from_file method to read to not expose implementation details on the
183
+ interface
184
+ ([`2aa94f4`](https://github.com/dimanu-py/instant-python/commit/2aa94f44835122421eaa8af3303c76addf30b1b0))
185
+
186
+ - **shared**: Modify ApplicationError to not be abstract class so it can be instantiated as a
187
+ general app error
188
+ ([`da086de`](https://github.com/dimanu-py/instant-python/commit/da086def1d643fed11b3ee7005435b6d45bea40c))
189
+
190
+
5
191
  ## v0.12.1 (2025-10-23)
6
192
 
7
193
  ### 🪲 Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: instant-python
3
- Version: 0.12.1
3
+ Version: 0.14.0
4
4
  Summary: Instant boilerplate generation for Python projects
5
5
  Project-URL: documentation, https://dimanu-py.github.io/instant-python/
6
6
  Project-URL: repository, https://github.com/dimanu-py/instant-python/
@@ -0,0 +1,25 @@
1
+ from instant_python.config.domain.config_parser import ConfigParser
2
+ from instant_python.config.domain.config_schema import ConfigSchema
3
+ from instant_python.config.domain.config_writer import ConfigWriter
4
+ from instant_python.config.domain.question_wizard import QuestionWizard
5
+
6
+
7
+ class ConfigGenerator:
8
+ def __init__(self, question_wizard: QuestionWizard, writer: ConfigWriter, parser: ConfigParser) -> None:
9
+ self._question_wizard = question_wizard
10
+ self._writer = writer
11
+ self._parser = parser
12
+
13
+ def execute(self) -> None:
14
+ answers = self._ask_project_configuration_to_user()
15
+ config = self._validate_project_configuration(answers)
16
+ self._save_configuration(config)
17
+
18
+ def _save_configuration(self, config: ConfigSchema) -> None:
19
+ self._writer.write(config)
20
+
21
+ def _validate_project_configuration(self, answers: dict) -> ConfigSchema:
22
+ return self._parser.parse(answers)
23
+
24
+ def _ask_project_configuration_to_user(self) -> dict:
25
+ return self._question_wizard.run()
@@ -0,0 +1,10 @@
1
+ from abc import ABC, abstractmethod
2
+ from typing import Union
3
+
4
+ from instant_python.config.domain.config_schema import ConfigSchema
5
+
6
+
7
+ class ConfigParser(ABC):
8
+ @abstractmethod
9
+ def parse(self, content: dict[str, dict], custom_config_path: Union[str, None] = None) -> ConfigSchema:
10
+ raise NotImplementedError
@@ -3,37 +3,36 @@ from dataclasses import dataclass, field
3
3
  from pathlib import Path
4
4
  from typing import TypedDict, Union
5
5
 
6
- import yaml
7
6
 
8
- from instant_python.config.domain.dependency_configuration import (
9
- DependencyConfiguration,
7
+ from instant_python.config.domain.dependency_config import (
8
+ DependencyConfig,
10
9
  )
11
- from instant_python.config.domain.general_configuration import (
12
- GeneralConfiguration,
10
+ from instant_python.config.domain.general_config import (
11
+ GeneralConfig,
13
12
  )
14
- from instant_python.config.domain.git_configuration import GitConfiguration
15
- from instant_python.config.domain.template_configuration import (
16
- TemplateConfiguration,
13
+ from instant_python.config.domain.git_config import GitConfig
14
+ from instant_python.config.domain.template_config import (
15
+ TemplateConfig,
17
16
  )
18
17
 
19
18
 
20
19
  @dataclass
21
- class ConfigurationSchema:
22
- general: GeneralConfiguration
23
- dependencies: list[DependencyConfiguration]
24
- template: TemplateConfiguration
25
- git: GitConfiguration
20
+ class ConfigSchema:
21
+ general: GeneralConfig
22
+ dependencies: list[DependencyConfig]
23
+ template: TemplateConfig
24
+ git: GitConfig
26
25
  config_file_path: Path = field(default_factory=lambda: Path("ipy.yml"))
27
26
 
28
27
  @classmethod
29
28
  def from_file(
30
29
  cls,
31
30
  config_file_path: str,
32
- general: GeneralConfiguration,
33
- dependencies: list[DependencyConfiguration],
34
- template: TemplateConfiguration,
35
- git: GitConfiguration,
36
- ) -> "ConfigurationSchema":
31
+ general: GeneralConfig,
32
+ dependencies: list[DependencyConfig],
33
+ template: TemplateConfig,
34
+ git: GitConfig,
35
+ ) -> "ConfigSchema":
37
36
  return cls(
38
37
  general=general,
39
38
  dependencies=dependencies,
@@ -48,13 +47,8 @@ class ConfigurationSchema:
48
47
 
49
48
  shutil.move(self.config_file_path, destination_path)
50
49
 
51
- def save_on_current_directory(self) -> None:
52
- destination_folder = Path.cwd() / self.config_file_path
53
- with open(destination_folder, "w") as file:
54
- yaml.dump(self.to_primitives(), file)
55
-
56
- def to_primitives(self) -> "ConfigurationSchemaPrimitives":
57
- return ConfigurationSchemaPrimitives(
50
+ def to_primitives(self) -> "ConfigSchemaPrimitives":
51
+ return ConfigSchemaPrimitives(
58
52
  general=self.general.to_primitives(),
59
53
  dependencies=[dependency.to_primitives() for dependency in self.dependencies],
60
54
  template=self.template.to_primitives(),
@@ -78,7 +72,7 @@ class ConfigurationSchema:
78
72
  return self.general.python_version
79
73
 
80
74
 
81
- class ConfigurationSchemaPrimitives(TypedDict):
75
+ class ConfigSchemaPrimitives(TypedDict):
82
76
  general: dict[str, str]
83
77
  dependencies: list[dict[str, Union[str, bool]]]
84
78
  template: dict[str, Union[str, list[str]]]
@@ -0,0 +1,9 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+ from instant_python.config.domain.config_schema import ConfigSchema
4
+
5
+
6
+ class ConfigWriter(ABC):
7
+ @abstractmethod
8
+ def write(self, config: ConfigSchema) -> None:
9
+ raise NotImplementedError
@@ -5,7 +5,7 @@ from instant_python.shared.error_types import ErrorTypes
5
5
 
6
6
 
7
7
  @dataclass
8
- class DependencyConfiguration:
8
+ class DependencyConfig:
9
9
  name: str
10
10
  version: str
11
11
  is_dev: bool = field(default=False)
@@ -10,7 +10,7 @@ from instant_python.shared.supported_python_versions import SupportedPythonVersi
10
10
 
11
11
 
12
12
  @dataclass
13
- class GeneralConfiguration:
13
+ class GeneralConfig:
14
14
  slug: str
15
15
  source_name: str
16
16
  description: str
@@ -6,7 +6,7 @@ from instant_python.shared.error_types import ErrorTypes
6
6
 
7
7
 
8
8
  @dataclass
9
- class GitConfiguration:
9
+ class GitConfig:
10
10
  initialize: bool
11
11
  username: Optional[str] = field(default=None)
12
12
  email: Optional[str] = field(default=None)
@@ -15,9 +15,15 @@ class GitConfiguration:
15
15
  self._ensure_username_and_email_are_set_if_initializing()
16
16
 
17
17
  def _ensure_username_and_email_are_set_if_initializing(self) -> None:
18
- if self.initialize and (self.username is None or self.email is None):
18
+ if self.initialize and (self._username_is_not_specified() or self._email_is_not_specified()):
19
19
  raise GitUserOrEmailNotPresent()
20
20
 
21
+ def _email_is_not_specified(self) -> bool:
22
+ return self.email is None or self.email == ""
23
+
24
+ def _username_is_not_specified(self) -> bool:
25
+ return self.username is None or self.username == ""
26
+
21
27
  def to_primitives(self) -> dict[str, str | bool]:
22
28
  return asdict(self)
23
29
 
@@ -8,15 +8,15 @@ from instant_python.shared.supported_templates import SupportedTemplates
8
8
 
9
9
 
10
10
  @dataclass
11
- class TemplateConfiguration:
11
+ class TemplateConfig:
12
12
  name: str
13
13
  built_in_features: list[str] = field(default_factory=list)
14
14
  specify_bounded_context: bool = field(default=False)
15
15
  bounded_context: Optional[str] = field(default=None)
16
16
  aggregate_name: Optional[str] = field(default=None)
17
17
 
18
- SUPPORTED_TEMPLATES: ClassVar[list[str]] = SupportedTemplates.get_supported_templates()
19
- SUPPORTED_BUILT_IN_FEATURES: ClassVar[list[str]] = SupportedBuiltInFeatures.get_supported_built_in_features()
18
+ _SUPPORTED_TEMPLATES: ClassVar[list[str]] = SupportedTemplates.get_supported_templates()
19
+ _SUPPORTED_BUILT_IN_FEATURES: ClassVar[list[str]] = SupportedBuiltInFeatures.get_supported_built_in_features()
20
20
 
21
21
  def __post_init__(self) -> None:
22
22
  self._ensure_template_is_supported()
@@ -25,15 +25,15 @@ class TemplateConfiguration:
25
25
  self._ensure_bounded_context_is_set_if_specified()
26
26
 
27
27
  def _ensure_template_is_supported(self) -> None:
28
- if self.name not in self.SUPPORTED_TEMPLATES:
29
- raise InvalidTemplateValue(self.name, self.SUPPORTED_TEMPLATES)
28
+ if self.name not in self._SUPPORTED_TEMPLATES:
29
+ raise InvalidTemplateValue(self.name, self._SUPPORTED_TEMPLATES)
30
30
 
31
31
  def _ensure_built_in_features_are_supported(self) -> None:
32
32
  unsupported_features = [
33
- feature for feature in self.built_in_features if feature not in self.SUPPORTED_BUILT_IN_FEATURES
33
+ feature for feature in self.built_in_features if feature not in self._SUPPORTED_BUILT_IN_FEATURES
34
34
  ]
35
35
  if unsupported_features:
36
- raise InvalidBuiltInFeaturesValues(unsupported_features, self.SUPPORTED_BUILT_IN_FEATURES)
36
+ raise InvalidBuiltInFeaturesValues(unsupported_features, self._SUPPORTED_BUILT_IN_FEATURES)
37
37
 
38
38
  def _ensure_bounded_context_is_only_applicable_for_ddd_template(self) -> None:
39
39
  if (
@@ -5,7 +5,7 @@ from instant_python.shared.error_types import ErrorTypes
5
5
  class ConfigKeyNotPresent(ApplicationError):
6
6
  def __init__(self, missing_keys: list[str], required_keys: list[str]) -> None:
7
7
  super().__init__(
8
- message=f"The following required keys are missing from the configuration file: {', '.join(missing_keys)}. Required keys are: {', '.join(required_keys)}.",
8
+ message=f"The following required keys are missing from the config file: {', '.join(missing_keys)}. Required keys are: {', '.join(required_keys)}.",
9
9
  error_type=ErrorTypes.CONFIGURATION.value,
10
10
  )
11
11
 
@@ -19,7 +19,7 @@ class MissingMandatoryFields(ApplicationError):
19
19
  def __init__(self, missing_field: str, config_section: str) -> None:
20
20
  super().__init__(
21
21
  message=(
22
- f"Mandatory field '{missing_field}' is missing in the '{config_section}' section of the configuration file."
22
+ f"Mandatory field '{missing_field}' is missing in the '{config_section}' section of the config file."
23
23
  ),
24
24
  error_type=ErrorTypes.CONFIGURATION.value,
25
25
  )
@@ -1,11 +1,11 @@
1
1
  from typing import Union
2
2
 
3
3
  from instant_python.config.domain.config_parser import ConfigParser
4
- from instant_python.config.domain.configuration_schema import ConfigurationSchema
5
- from instant_python.config.domain.dependency_configuration import DependencyConfiguration
6
- from instant_python.config.domain.general_configuration import GeneralConfiguration
7
- from instant_python.config.domain.git_configuration import GitConfiguration
8
- from instant_python.config.domain.template_configuration import TemplateConfiguration
4
+ from instant_python.config.domain.config_schema import ConfigSchema
5
+ from instant_python.config.domain.dependency_config import DependencyConfig
6
+ from instant_python.config.domain.general_config import GeneralConfig
7
+ from instant_python.config.domain.git_config import GitConfig
8
+ from instant_python.config.domain.template_config import TemplateConfig
9
9
  from instant_python.config.infra.parser.errors import (
10
10
  ConfigKeyNotPresent,
11
11
  EmptyConfigurationNotAllowed,
@@ -20,23 +20,33 @@ class Parser(ConfigParser):
20
20
  _GIT = "git"
21
21
  _REQUIRED_CONFIG_KEYS = [_GENERAL, _DEPENDENCIES, _TEMPLATE, _GIT]
22
22
 
23
- def parse(self, content: dict[str, dict]) -> ConfigurationSchema:
24
- self._ensure_configuration_is_not_empty(content)
23
+ def parse(self, content: dict[str, dict], custom_config_path: Union[str, None] = None) -> ConfigSchema:
24
+ self._ensure_config_is_not_empty(content)
25
25
  self._ensure_all_required_sections_are_present(content)
26
26
  general_section = self._parse_general_section(content[self._GENERAL])
27
27
  dependencies_section = self._parse_dependencies_section(content[self._DEPENDENCIES])
28
28
  template_section = self._parse_template_section(content[self._TEMPLATE])
29
29
  git_section = self._parse_git_section(content[self._GIT])
30
- return ConfigurationSchema(
31
- general=general_section,
32
- dependencies=dependencies_section,
33
- template=template_section,
34
- git=git_section,
30
+ return (
31
+ ConfigSchema(
32
+ general=general_section,
33
+ dependencies=dependencies_section,
34
+ template=template_section,
35
+ git=git_section,
36
+ )
37
+ if not custom_config_path
38
+ else ConfigSchema.from_file(
39
+ config_file_path=custom_config_path,
40
+ general=general_section,
41
+ dependencies=dependencies_section,
42
+ template=template_section,
43
+ git=git_section,
44
+ )
35
45
  )
36
46
 
37
- def _parse_general_section(self, fields: dict[str, str]) -> GeneralConfiguration:
47
+ def _parse_general_section(self, fields: dict[str, str]) -> GeneralConfig:
38
48
  try:
39
- return GeneralConfiguration(**fields)
49
+ return GeneralConfig(**fields)
40
50
  except TypeError as error:
41
51
  self._ensure_error_is_for_missing_fields(error)
42
52
  raise MissingMandatoryFields(error.args[0], self._GENERAL) from error
@@ -44,7 +54,7 @@ class Parser(ConfigParser):
44
54
  def _parse_dependencies_section(
45
55
  self,
46
56
  fields: list[dict[str, Union[str, bool]]],
47
- ) -> list[DependencyConfiguration]:
57
+ ) -> list[DependencyConfig]:
48
58
  dependencies = []
49
59
 
50
60
  if not fields:
@@ -52,7 +62,7 @@ class Parser(ConfigParser):
52
62
 
53
63
  for dependency_fields in fields:
54
64
  try:
55
- dependency = DependencyConfiguration(**dependency_fields)
65
+ dependency = DependencyConfig(**dependency_fields)
56
66
  except TypeError as error:
57
67
  self._ensure_error_is_for_missing_fields(error)
58
68
  raise MissingMandatoryFields(error.args[0], self._DEPENDENCIES) from error
@@ -61,16 +71,16 @@ class Parser(ConfigParser):
61
71
 
62
72
  return dependencies
63
73
 
64
- def _parse_template_section(self, fields: dict[str, Union[str, bool, list[str]]]) -> TemplateConfiguration:
74
+ def _parse_template_section(self, fields: dict[str, Union[str, bool, list[str]]]) -> TemplateConfig:
65
75
  try:
66
- return TemplateConfiguration(**fields)
76
+ return TemplateConfig(**fields)
67
77
  except TypeError as error:
68
78
  self._ensure_error_is_for_missing_fields(error)
69
79
  raise MissingMandatoryFields(error.args[0], self._TEMPLATE) from error
70
80
 
71
- def _parse_git_section(self, fields: dict[str, Union[str, bool]]) -> GitConfiguration:
81
+ def _parse_git_section(self, fields: dict[str, Union[str, bool]]) -> GitConfig:
72
82
  try:
73
- return GitConfiguration(**fields)
83
+ return GitConfig(**fields)
74
84
  except TypeError as error:
75
85
  self._ensure_error_is_for_missing_fields(error)
76
86
  raise MissingMandatoryFields(error.args[0], self._GIT) from error
@@ -81,7 +91,7 @@ class Parser(ConfigParser):
81
91
  raise ConfigKeyNotPresent(missing_keys, self._REQUIRED_CONFIG_KEYS)
82
92
 
83
93
  @staticmethod
84
- def _ensure_configuration_is_not_empty(content: dict[str, dict]):
94
+ def _ensure_config_is_not_empty(content: dict[str, dict]):
85
95
  if not content:
86
96
  raise EmptyConfigurationNotAllowed
87
97
 
@@ -0,0 +1,13 @@
1
+ from pathlib import Path
2
+
3
+ import yaml
4
+
5
+ from instant_python.config.domain.config_writer import ConfigWriter
6
+ from instant_python.config.domain.config_schema import ConfigSchema
7
+
8
+
9
+ class YamlConfigWriter(ConfigWriter):
10
+ def write(self, config: ConfigSchema) -> None:
11
+ destination_folder = Path.cwd() / config.config_file_path
12
+ with destination_folder.open("w") as file:
13
+ yaml.dump(config.to_primitives(), file)