instant-python 0.11.0__tar.gz → 0.12.1__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 (380) hide show
  1. {instant_python-0.11.0 → instant_python-0.12.1}/CHANGELOG.md +140 -0
  2. {instant_python-0.11.0 → instant_python-0.12.1}/PKG-INFO +1 -1
  3. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/cli/cli.py +2 -1
  4. instant_python-0.12.1/instant_python/config/application/config_generator.py +15 -0
  5. instant_python-0.12.1/instant_python/config/delivery/cli.py +19 -0
  6. instant_python-0.12.1/instant_python/config/domain/config_parser.py +9 -0
  7. instant_python-0.12.1/instant_python/config/domain/config_writer.py +9 -0
  8. {instant_python-0.11.0/instant_python/configuration → instant_python-0.12.1/instant_python/config/domain}/configuration_schema.py +9 -9
  9. {instant_python-0.11.0/instant_python/configuration/dependency → instant_python-0.12.1/instant_python/config/domain}/dependency_configuration.py +8 -3
  10. {instant_python-0.11.0/instant_python/configuration/general → instant_python-0.12.1/instant_python/config/domain}/general_configuration.py +20 -9
  11. {instant_python-0.11.0/instant_python/configuration/git → instant_python-0.12.1/instant_python/config/domain}/git_configuration.py +8 -3
  12. instant_python-0.12.1/instant_python/config/domain/question_wizard.py +7 -0
  13. {instant_python-0.11.0/instant_python/configuration/template → instant_python-0.12.1/instant_python/config/domain}/template_configuration.py +28 -12
  14. instant_python-0.12.1/instant_python/config/infra/parser/errors.py +25 -0
  15. instant_python-0.12.1/instant_python/config/infra/parser/parser.py +91 -0
  16. instant_python-0.12.1/instant_python/config/infra/question_wizard/questionary_console_wizard.py +25 -0
  17. instant_python-0.12.1/instant_python/config/infra/question_wizard/step/dependencies_step.py +64 -0
  18. instant_python-0.12.1/instant_python/config/infra/question_wizard/step/general_step.py +81 -0
  19. instant_python-0.12.1/instant_python/config/infra/question_wizard/step/git_step.py +41 -0
  20. {instant_python-0.11.0/instant_python/configuration → instant_python-0.12.1/instant_python/config/infra/question_wizard}/step/steps.py +1 -1
  21. instant_python-0.12.1/instant_python/config/infra/question_wizard/step/template_step.py +63 -0
  22. instant_python-0.12.1/instant_python/config/infra/writer/yaml_config_writer.py +13 -0
  23. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/configuration/parser/parser.py +10 -12
  24. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/dependency_manager/dependency_manager.py +1 -1
  25. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/dependency_manager/pdm_dependency_manager.py +1 -1
  26. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/dependency_manager/uv_dependency_manager.py +1 -1
  27. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/git/git_configurer.py +1 -1
  28. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/project_creator/file.py +1 -1
  29. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/project_creator/file_system.py +1 -1
  30. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/render/jinja_project_renderer.py +1 -1
  31. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/fastapi_domain.yml.j2 +1 -1
  32. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/github_issues_template.yml.j2 +1 -1
  33. {instant_python-0.11.0 → instant_python-0.12.1}/makefile +1 -1
  34. {instant_python-0.11.0 → instant_python-0.12.1}/mypy.ini +1 -1
  35. {instant_python-0.11.0 → instant_python-0.12.1}/pyproject.toml +1 -1
  36. instant_python-0.12.1/test/config/application/test_config_generator.py +32 -0
  37. instant_python-0.12.1/test/config/domain/mothers/configuration_schema_mother.py +16 -0
  38. {instant_python-0.11.0/test/configuration/dependency → instant_python-0.12.1/test/config/domain/mothers}/dependency_configuration_mother.py +1 -1
  39. {instant_python-0.11.0/test/configuration/general → instant_python-0.12.1/test/config/domain/mothers}/general_configuration_mother.py +1 -1
  40. {instant_python-0.11.0/test/configuration/git → instant_python-0.12.1/test/config/domain/mothers}/git_configuration_mother.py +1 -1
  41. {instant_python-0.11.0/test/configuration/template → instant_python-0.12.1/test/config/domain/mothers}/template_configuration_mother.py +1 -1
  42. {instant_python-0.11.0/test/configuration/dependency → instant_python-0.12.1/test/config/domain}/test_dependency_configuration.py +2 -4
  43. {instant_python-0.11.0/test/configuration/general → instant_python-0.12.1/test/config/domain}/test_general_configuration.py +2 -6
  44. {instant_python-0.11.0/test/configuration/git → instant_python-0.12.1/test/config/domain}/test_git_configuration.py +2 -4
  45. {instant_python-0.11.0/test/configuration/template → instant_python-0.12.1/test/config/domain}/test_template_configuration.py +2 -8
  46. instant_python-0.12.1/test/config/infra/parser/approved_files/TestParser.test_should_parse_valid_answers.approved.txt +39 -0
  47. instant_python-0.12.1/test/config/infra/parser/test_parser.py +56 -0
  48. instant_python-0.12.1/test/config/infra/writer/test_yaml_config_writer.py +16 -0
  49. instant_python-0.12.1/test/configuration/parser/resources/config.yml +23 -0
  50. instant_python-0.12.1/test/configuration/parser/resources/missing_dependencies_fields_config.yml +21 -0
  51. instant_python-0.12.1/test/configuration/parser/resources/missing_general_fields_config.yml +23 -0
  52. instant_python-0.12.1/test/configuration/parser/resources/missing_git_fields_config.yml +25 -0
  53. instant_python-0.12.1/test/configuration/parser/resources/missing_keys_config.yml +13 -0
  54. instant_python-0.12.1/test/configuration/parser/resources/missing_template_fields_config.yml +23 -0
  55. {instant_python-0.11.0 → instant_python-0.12.1}/test/configuration/parser/test_parser.py +5 -5
  56. instant_python-0.12.1/test/dependency_manager/__init__.py +0 -0
  57. {instant_python-0.11.0 → instant_python-0.12.1}/test/dependency_manager/test_pdm_dependency_manager.py +1 -1
  58. {instant_python-0.11.0 → instant_python-0.12.1}/test/dependency_manager/test_uv_dependency_manager.py +1 -1
  59. instant_python-0.12.1/test/formatter/__init__.py +0 -0
  60. instant_python-0.12.1/test/git/__init__.py +0 -0
  61. {instant_python-0.11.0 → instant_python-0.12.1}/test/git/test_git_configurer.py +1 -1
  62. instant_python-0.12.1/test/project_creator/__init__.py +0 -0
  63. instant_python-0.12.1/test/project_creator/resources/boilerplate/fastapi/__init__.py +0 -0
  64. instant_python-0.12.1/test/project_creator/resources/boilerplate/logger/__init__.py +0 -0
  65. instant_python-0.12.1/test/render/__init__.py +0 -0
  66. instant_python-0.12.1/test/render/approvaltests_config.json +3 -0
  67. {instant_python-0.11.0 → instant_python-0.12.1}/uv.lock +1 -1
  68. instant_python-0.11.0/instant_python/commands/config.py +0 -28
  69. instant_python-0.11.0/instant_python/configuration/dependency/not_dev_dependency_included_in_group.py +0 -8
  70. instant_python-0.11.0/instant_python/configuration/general/invalid_dependency_manager_value.py +0 -8
  71. instant_python-0.11.0/instant_python/configuration/general/invalid_license_value.py +0 -8
  72. instant_python-0.11.0/instant_python/configuration/general/invalid_python_version_value.py +0 -8
  73. instant_python-0.11.0/instant_python/configuration/git/git_user_or_email_not_present.py +0 -8
  74. instant_python-0.11.0/instant_python/configuration/parser/config_key_not_present.py +0 -8
  75. instant_python-0.11.0/instant_python/configuration/parser/empty_configuration_not_allowed.py +0 -8
  76. instant_python-0.11.0/instant_python/configuration/parser/missing_mandatory_fields.py +0 -10
  77. instant_python-0.11.0/instant_python/configuration/question/boolean_question.py +0 -12
  78. instant_python-0.11.0/instant_python/configuration/question/choice_question.py +0 -19
  79. instant_python-0.11.0/instant_python/configuration/question/conditional_question.py +0 -34
  80. instant_python-0.11.0/instant_python/configuration/question/free_text_question.py +0 -14
  81. instant_python-0.11.0/instant_python/configuration/question/multiple_choice_question.py +0 -12
  82. instant_python-0.11.0/instant_python/configuration/question/question.py +0 -22
  83. instant_python-0.11.0/instant_python/configuration/question_wizard.py +0 -14
  84. instant_python-0.11.0/instant_python/configuration/step/dependencies_step.py +0 -70
  85. instant_python-0.11.0/instant_python/configuration/step/general_step.py +0 -67
  86. instant_python-0.11.0/instant_python/configuration/step/git_step.py +0 -41
  87. instant_python-0.11.0/instant_python/configuration/step/template_step.py +0 -62
  88. instant_python-0.11.0/instant_python/configuration/template/bounded_context_not_applicable.py +0 -8
  89. instant_python-0.11.0/instant_python/configuration/template/bounded_context_not_especified.py +0 -8
  90. instant_python-0.11.0/instant_python/configuration/template/invalid_built_in_features_values.py +0 -10
  91. instant_python-0.11.0/instant_python/configuration/template/invalid_template_value.py +0 -8
  92. instant_python-0.11.0/test/configuration/question/test_boolean_question.py +0 -28
  93. instant_python-0.11.0/test/configuration/question/test_choice_question.py +0 -30
  94. instant_python-0.11.0/test/configuration/question/test_free_text_question.py +0 -30
  95. instant_python-0.11.0/test/configuration/question/test_multiple_choice_question.py +0 -31
  96. {instant_python-0.11.0 → instant_python-0.12.1}/.github/FUNDING.yml +0 -0
  97. {instant_python-0.11.0 → instant_python-0.12.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  98. {instant_python-0.11.0 → instant_python-0.12.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  99. {instant_python-0.11.0 → instant_python-0.12.1}/.github/actions/python_setup/action.yml +0 -0
  100. {instant_python-0.11.0 → instant_python-0.12.1}/.github/pull_request_template.md +0 -0
  101. {instant_python-0.11.0 → instant_python-0.12.1}/.github/workflows/ci.yml +0 -0
  102. {instant_python-0.11.0 → instant_python-0.12.1}/.github/workflows/pages.yml +0 -0
  103. {instant_python-0.11.0 → instant_python-0.12.1}/.github/workflows/release.yml +0 -0
  104. {instant_python-0.11.0 → instant_python-0.12.1}/.gitignore +0 -0
  105. {instant_python-0.11.0 → instant_python-0.12.1}/.pre-commit-config.yaml +0 -0
  106. {instant_python-0.11.0 → instant_python-0.12.1}/.python-version +0 -0
  107. {instant_python-0.11.0 → instant_python-0.12.1}/CITATION.cff +0 -0
  108. {instant_python-0.11.0 → instant_python-0.12.1}/LICENSE +0 -0
  109. {instant_python-0.11.0 → instant_python-0.12.1}/README.md +0 -0
  110. {instant_python-0.11.0 → instant_python-0.12.1}/SECURITY.md +0 -0
  111. {instant_python-0.11.0 → instant_python-0.12.1}/codeql-config.yml +0 -0
  112. {instant_python-0.11.0 → instant_python-0.12.1}/docs/assets/favicon.svg +0 -0
  113. {instant_python-0.11.0 → instant_python-0.12.1}/docs/assets/logo.svg +0 -0
  114. {instant_python-0.11.0 → instant_python-0.12.1}/docs/changelog/.components/changelog_header.md.j2 +0 -0
  115. {instant_python-0.11.0 → instant_python-0.12.1}/docs/changelog/.components/changelog_init.md.j2 +0 -0
  116. {instant_python-0.11.0 → instant_python-0.12.1}/docs/changelog/.components/changelog_update.md.j2 +0 -0
  117. {instant_python-0.11.0 → instant_python-0.12.1}/docs/changelog/.components/changes.md.j2 +0 -0
  118. {instant_python-0.11.0 → instant_python-0.12.1}/docs/changelog/.components/first_release.md.j2 +0 -0
  119. {instant_python-0.11.0 → instant_python-0.12.1}/docs/changelog/.components/macros.md.j2 +0 -0
  120. {instant_python-0.11.0 → instant_python-0.12.1}/docs/changelog/.components/versioned_changes.md.j2 +0 -0
  121. {instant_python-0.11.0 → instant_python-0.12.1}/docs/changelog/.release_notes.md.j2 +0 -0
  122. {instant_python-0.11.0 → instant_python-0.12.1}/docs/changelog/CHANGELOG.md.j2 +0 -0
  123. {instant_python-0.11.0 → instant_python-0.12.1}/docs/downloads_macro.py +0 -0
  124. {instant_python-0.11.0 → instant_python-0.12.1}/docs/examples/configuration.md +0 -0
  125. {instant_python-0.11.0 → instant_python-0.12.1}/docs/examples/custom_template.md +0 -0
  126. {instant_python-0.11.0 → instant_python-0.12.1}/docs/guide/command_config.md +0 -0
  127. {instant_python-0.11.0 → instant_python-0.12.1}/docs/guide/command_init.md +0 -0
  128. {instant_python-0.11.0 → instant_python-0.12.1}/docs/home/contributing.md +0 -0
  129. {instant_python-0.11.0 → instant_python-0.12.1}/docs/home/getting_started.md +0 -0
  130. {instant_python-0.11.0 → instant_python-0.12.1}/docs/home/index.md +0 -0
  131. {instant_python-0.11.0 → instant_python-0.12.1}/docs/home/releases.md +0 -0
  132. {instant_python-0.11.0 → instant_python-0.12.1}/docs/home/security.md +0 -0
  133. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/__init__.py +0 -0
  134. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/cli/__init__.py +0 -0
  135. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/cli/instant_python_typer.py +0 -0
  136. {instant_python-0.11.0/instant_python/commands → instant_python-0.12.1/instant_python/config}/__init__.py +0 -0
  137. {instant_python-0.11.0/instant_python/configuration → instant_python-0.12.1/instant_python/config/application}/__init__.py +0 -0
  138. {instant_python-0.11.0/instant_python/configuration/dependency → instant_python-0.12.1/instant_python/config/delivery}/__init__.py +0 -0
  139. {instant_python-0.11.0/instant_python/configuration/general → instant_python-0.12.1/instant_python/config/domain}/__init__.py +0 -0
  140. {instant_python-0.11.0/instant_python/configuration/git → instant_python-0.12.1/instant_python/config/infra}/__init__.py +0 -0
  141. {instant_python-0.11.0/instant_python/configuration → instant_python-0.12.1/instant_python/config/infra}/parser/__init__.py +0 -0
  142. {instant_python-0.11.0/instant_python/configuration/question → instant_python-0.12.1/instant_python/config/infra/question_wizard}/__init__.py +0 -0
  143. {instant_python-0.11.0/instant_python/configuration → instant_python-0.12.1/instant_python/config/infra/question_wizard}/step/__init__.py +0 -0
  144. {instant_python-0.11.0/instant_python/configuration/question → instant_python-0.12.1/instant_python/config/infra/question_wizard/step}/questionary.py +0 -0
  145. {instant_python-0.11.0/instant_python/configuration/template → instant_python-0.12.1/instant_python/config/infra/writer}/__init__.py +0 -0
  146. {instant_python-0.11.0/instant_python/dependency_manager → instant_python-0.12.1/instant_python/configuration}/__init__.py +0 -0
  147. {instant_python-0.11.0/instant_python/formatter → instant_python-0.12.1/instant_python/configuration/parser}/__init__.py +0 -0
  148. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/configuration/parser/configuration_file_not_found.py +0 -0
  149. {instant_python-0.11.0/instant_python/git → instant_python-0.12.1/instant_python/dependency_manager}/__init__.py +0 -0
  150. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/dependency_manager/command_execution_error.py +0 -0
  151. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/dependency_manager/dependency_manager_factory.py +0 -0
  152. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/dependency_manager/unknown_dependency_manager_error.py +0 -0
  153. {instant_python-0.11.0/instant_python/project_creator → instant_python-0.12.1/instant_python/formatter}/__init__.py +0 -0
  154. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/formatter/project_formatter.py +0 -0
  155. {instant_python-0.11.0/instant_python/render → instant_python-0.12.1/instant_python/git}/__init__.py +0 -0
  156. {instant_python-0.11.0/instant_python/shared → instant_python-0.12.1/instant_python/initialize}/__init__.py +0 -0
  157. {instant_python-0.11.0/instant_python/templates/boilerplate/event_bus → instant_python-0.12.1/instant_python/initialize/delivery}/__init__.py +0 -0
  158. /instant_python-0.11.0/instant_python/commands/init.py → /instant_python-0.12.1/instant_python/initialize/delivery/cli.py +0 -0
  159. {instant_python-0.11.0/instant_python/templates/boilerplate/exceptions → instant_python-0.12.1/instant_python/project_creator}/__init__.py +0 -0
  160. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/project_creator/directory.py +0 -0
  161. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/project_creator/file_has_not_been_created.py +0 -0
  162. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/project_creator/node.py +0 -0
  163. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/project_creator/unknown_node_typer_error.py +0 -0
  164. {instant_python-0.11.0/instant_python/templates/boilerplate/fastapi → instant_python-0.12.1/instant_python/render}/__init__.py +0 -0
  165. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/render/custom_project_renderer.py +0 -0
  166. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/render/jinja_custom_filters.py +0 -0
  167. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/render/jinja_environment.py +0 -0
  168. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/render/template_file_not_found_error.py +0 -0
  169. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/render/unknown_template_error.py +0 -0
  170. {instant_python-0.11.0/instant_python/templates/boilerplate/logger → instant_python-0.12.1/instant_python/shared}/__init__.py +0 -0
  171. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/shared/application_error.py +0 -0
  172. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/shared/error_types.py +0 -0
  173. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/shared/supported_built_in_features.py +0 -0
  174. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/shared/supported_licenses.py +0 -0
  175. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/shared/supported_managers.py +0 -0
  176. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/shared/supported_python_versions.py +0 -0
  177. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/shared/supported_templates.py +0 -0
  178. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/.gitignore +0 -0
  179. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/.pre-commit-config.yml +0 -0
  180. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/.python-version +0 -0
  181. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/CITATION.cff +0 -0
  182. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/LICENSE +0 -0
  183. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/README.md +0 -0
  184. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/SECURITY.md +0 -0
  185. {instant_python-0.11.0/instant_python/templates/boilerplate/persistence → instant_python-0.12.1/instant_python/templates/boilerplate/event_bus}/__init__.py +0 -0
  186. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/event_bus/domain_event.py +0 -0
  187. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/event_bus/domain_event_json_deserializer.py +0 -0
  188. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/event_bus/domain_event_json_serializer.py +0 -0
  189. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/event_bus/domain_event_subscriber.py +0 -0
  190. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/event_bus/event_aggregate.py +0 -0
  191. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/event_bus/event_bus.py +0 -0
  192. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/event_bus/exchange_type.py +0 -0
  193. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/event_bus/mock_event_bus.py +0 -0
  194. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/event_bus/rabbit_mq_configurer.py +0 -0
  195. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/event_bus/rabbit_mq_connection.py +0 -0
  196. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/event_bus/rabbit_mq_consumer.py +0 -0
  197. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/event_bus/rabbit_mq_event_bus.py +0 -0
  198. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/event_bus/rabbit_mq_queue_formatter.py +0 -0
  199. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/event_bus/rabbit_mq_settings.py +0 -0
  200. {instant_python-0.11.0/instant_python/templates/boilerplate/persistence/async → instant_python-0.12.1/instant_python/templates/boilerplate/exceptions}/__init__.py +0 -0
  201. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/exceptions/base_error.py +0 -0
  202. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/exceptions/domain_error.py +0 -0
  203. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/exceptions/domain_event_type_not_found_error.py +0 -0
  204. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/exceptions/incorrect_value_type_error.py +0 -0
  205. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/exceptions/invalid_id_format_error.py +0 -0
  206. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/exceptions/invalid_negative_value_error.py +0 -0
  207. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/exceptions/rabbit_mq_connection_not_established_error.py +0 -0
  208. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/exceptions/required_value_error.py +0 -0
  209. {instant_python-0.11.0/instant_python/templates/boilerplate/persistence/synchronous → instant_python-0.12.1/instant_python/templates/boilerplate/fastapi}/__init__.py +0 -0
  210. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/fastapi/application.py +0 -0
  211. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/fastapi/error_handlers.py +0 -0
  212. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/fastapi/error_response.py +0 -0
  213. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/fastapi/fastapi_log_middleware.py +0 -0
  214. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/fastapi/lifespan.py +0 -0
  215. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/fastapi/success_response.py +0 -0
  216. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/github/action.yml +0 -0
  217. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/github/bug_report.yml +0 -0
  218. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/github/ci.yml +0 -0
  219. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/github/feature_request.yml +0 -0
  220. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/github/release.yml +0 -0
  221. {instant_python-0.11.0/instant_python/templates/boilerplate/value_object → instant_python-0.12.1/instant_python/templates/boilerplate/logger}/__init__.py +0 -0
  222. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/logger/file_logger.py +0 -0
  223. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/logger/file_rotating_handler.py +0 -0
  224. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/logger/json_formatter.py +0 -0
  225. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/mypy.ini +0 -0
  226. {instant_python-0.11.0/test → instant_python-0.12.1/instant_python/templates/boilerplate/persistence}/__init__.py +0 -0
  227. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/persistence/alembic_migrator.py +0 -0
  228. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/persistence/async/README.md +0 -0
  229. {instant_python-0.11.0/test/configuration → instant_python-0.12.1/instant_python/templates/boilerplate/persistence/async}/__init__.py +0 -0
  230. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/persistence/async/alembic.ini +0 -0
  231. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/persistence/async/async_engine_fixture.py +0 -0
  232. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/persistence/async/env.py +0 -0
  233. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/persistence/async/models_metadata.py +0 -0
  234. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/persistence/async/postgres_settings.py +0 -0
  235. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/persistence/async/script.py.mako +0 -0
  236. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/persistence/async/sqlalchemy_repository.py +0 -0
  237. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/persistence/base.py +0 -0
  238. {instant_python-0.11.0/test/configuration/dependency → instant_python-0.12.1/instant_python/templates/boilerplate/persistence/synchronous}/__init__.py +0 -0
  239. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/persistence/synchronous/session_maker.py +0 -0
  240. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/persistence/synchronous/sqlalchemy_repository.py +0 -0
  241. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/pyproject.toml +0 -0
  242. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/pytest.ini +0 -0
  243. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/random_generator.py +0 -0
  244. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/scripts/add_dependency.py +0 -0
  245. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/scripts/create_aggregate.py +0 -0
  246. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/scripts/insert_template.py +0 -0
  247. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/scripts/integration.sh +0 -0
  248. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/scripts/local_setup.py +0 -0
  249. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/scripts/makefile +0 -0
  250. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/scripts/post-merge.py +0 -0
  251. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/scripts/pre-commit.py +0 -0
  252. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/scripts/pre-push.py +0 -0
  253. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/scripts/remove_dependency.py +0 -0
  254. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/scripts/unit.sh +0 -0
  255. {instant_python-0.11.0/test/configuration/general → instant_python-0.12.1/instant_python/templates/boilerplate/value_object}/__init__.py +0 -0
  256. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/value_object/aggregate.py +0 -0
  257. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/value_object/int_primitives_mother.py +0 -0
  258. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/value_object/int_value_object.py +0 -0
  259. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/value_object/string_primitives_mother.py +0 -0
  260. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/value_object/string_value_object.py +0 -0
  261. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/value_object/test_int_value_object.py +0 -0
  262. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/value_object/test_string_value_object.py +0 -0
  263. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/value_object/test_uuid_value_object.py +0 -0
  264. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/value_object/uuid.py +0 -0
  265. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/value_object/uuid_primitives_mother.py +0 -0
  266. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/value_object/validation.py +0 -0
  267. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/boilerplate/value_object/value_object.py +0 -0
  268. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/alembic_migrator.yml.j2 +0 -0
  269. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/async_alembic.yml.j2 +0 -0
  270. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/async_sqlalchemy.yml.j2 +0 -0
  271. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/citation.yml.j2 +0 -0
  272. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/clean_architecture/main_structure.yml.j2 +0 -0
  273. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/clean_architecture/source.yml.j2 +0 -0
  274. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/clean_architecture/test.yml.j2 +0 -0
  275. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/domain_driven_design/bounded_context.yml.j2 +0 -0
  276. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/domain_driven_design/main_structure.yml.j2 +0 -0
  277. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/domain_driven_design/source.yml.j2 +0 -0
  278. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/domain_driven_design/test.yml.j2 +0 -0
  279. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/event_bus_domain.yml.j2 +0 -0
  280. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/event_bus_infra.yml.j2 +0 -0
  281. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/fastapi_app.yml.j2 +0 -0
  282. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/fastapi_infra.yml.j2 +0 -0
  283. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/github_action.yml.j2 +0 -0
  284. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/gitignore.yml.j2 +0 -0
  285. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/license.yml.j2 +0 -0
  286. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/logger.yml.j2 +0 -0
  287. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/macros.j2 +0 -0
  288. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/makefile.yml.j2 +0 -0
  289. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/mypy.yml.j2 +0 -0
  290. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/precommit_hook.yml.j2 +0 -0
  291. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/pyproject.yml.j2 +0 -0
  292. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/pytest.yml.j2 +0 -0
  293. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/python_version.yml.j2 +0 -0
  294. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/readme.yml.j2 +0 -0
  295. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/security.yml.j2 +0 -0
  296. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/standard_project/main_structure.yml.j2 +0 -0
  297. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/standard_project/source.yml.j2 +0 -0
  298. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/standard_project/test.yml.j2 +0 -0
  299. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/synchronous_sqlalchemy.yml.j2 +0 -0
  300. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/test_value_objects.yml.j2 +0 -0
  301. {instant_python-0.11.0 → instant_python-0.12.1}/instant_python/templates/project_structure/value_objects.yml.j2 +0 -0
  302. {instant_python-0.11.0 → instant_python-0.12.1}/mkdocs.yml +0 -0
  303. {instant_python-0.11.0 → instant_python-0.12.1}/scripts/add_dependency.py +0 -0
  304. {instant_python-0.11.0 → instant_python-0.12.1}/scripts/remove_dependency.py +0 -0
  305. {instant_python-0.11.0/test/configuration/git → instant_python-0.12.1/test}/__init__.py +0 -0
  306. {instant_python-0.11.0/test/configuration/parser → instant_python-0.12.1/test/config}/__init__.py +0 -0
  307. {instant_python-0.11.0/test/configuration/parser/resources → instant_python-0.12.1/test/config/application}/__init__.py +0 -0
  308. {instant_python-0.11.0/test/configuration/question → instant_python-0.12.1/test/config/domain}/__init__.py +0 -0
  309. {instant_python-0.11.0/test/configuration/template → instant_python-0.12.1/test/config/domain/mothers}/__init__.py +0 -0
  310. {instant_python-0.11.0/test/dependency_manager → instant_python-0.12.1/test/config/infra}/__init__.py +0 -0
  311. {instant_python-0.11.0/test/formatter → instant_python-0.12.1/test/config/infra/parser}/__init__.py +0 -0
  312. {instant_python-0.11.0/test/configuration → instant_python-0.12.1/test/config/infra}/parser/approvaltests_config.json +0 -0
  313. {instant_python-0.11.0/test/git → instant_python-0.12.1/test/config/infra/parser/resources}/__init__.py +0 -0
  314. /instant_python-0.11.0/test/configuration/parser/resources/missing_dependencies_fields_config.yml → /instant_python-0.12.1/test/config/infra/parser/resources/missing_dependencies_fields.yml +0 -0
  315. /instant_python-0.11.0/test/configuration/parser/resources/missing_general_fields_config.yml → /instant_python-0.12.1/test/config/infra/parser/resources/missing_general_fields.yml +0 -0
  316. /instant_python-0.11.0/test/configuration/parser/resources/missing_git_fields_config.yml → /instant_python-0.12.1/test/config/infra/parser/resources/missing_git_fields.yml +0 -0
  317. /instant_python-0.11.0/test/configuration/parser/resources/missing_keys_config.yml → /instant_python-0.12.1/test/config/infra/parser/resources/missing_keys_answers.yml +0 -0
  318. /instant_python-0.11.0/test/configuration/parser/resources/missing_template_fields_config.yml → /instant_python-0.12.1/test/config/infra/parser/resources/missing_template_fields.yml +0 -0
  319. /instant_python-0.11.0/test/configuration/parser/resources/config.yml → /instant_python-0.12.1/test/config/infra/parser/resources/valid_answers.yml +0 -0
  320. {instant_python-0.11.0/test/project_creator → instant_python-0.12.1/test/config/infra/writer}/__init__.py +0 -0
  321. {instant_python-0.11.0/test/project_creator/resources/boilerplate/fastapi → instant_python-0.12.1/test/configuration}/__init__.py +0 -0
  322. {instant_python-0.11.0/test/project_creator/resources/boilerplate/logger → instant_python-0.12.1/test/configuration/parser}/__init__.py +0 -0
  323. {instant_python-0.11.0/test/project_creator → instant_python-0.12.1/test/configuration/parser}/approvaltests_config.json +0 -0
  324. {instant_python-0.11.0 → instant_python-0.12.1}/test/configuration/parser/approved_files/TestParser.test_should_parse_configuration.approved.txt +0 -0
  325. {instant_python-0.11.0/test/render → instant_python-0.12.1/test/configuration/parser/resources}/__init__.py +0 -0
  326. {instant_python-0.11.0 → instant_python-0.12.1}/test/configuration/parser/resources/empty_config.yml +0 -0
  327. {instant_python-0.11.0 → instant_python-0.12.1}/test/dependency_manager/mock_pdm_dependency_manager.py +0 -0
  328. {instant_python-0.11.0 → instant_python-0.12.1}/test/dependency_manager/mock_uv_dependency_manager.py +0 -0
  329. {instant_python-0.11.0 → instant_python-0.12.1}/test/formatter/mock_project_formatter.py +0 -0
  330. {instant_python-0.11.0 → instant_python-0.12.1}/test/formatter/test_project_formatter.py +0 -0
  331. {instant_python-0.11.0 → instant_python-0.12.1}/test/git/mock_git_configurer.py +0 -0
  332. {instant_python-0.11.0/test/render → instant_python-0.12.1/test/project_creator}/approvaltests_config.json +0 -0
  333. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/approved_files/TestFileSystem.test_should_create_file_system_in_disk.rendered_custom_project_structure.json.approved.txt +0 -0
  334. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/approved_files/TestFileSystem.test_should_create_file_system_in_disk.rendered_project_structure.json.approved.txt +0 -0
  335. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/approved_files/TestFileSystem.test_should_create_file_system_in_disk.rendered_project_structure_fastapi_with_logger.json.approved.txt +0 -0
  336. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/approved_files/TestFileSystem.test_should_create_file_system_in_disk.rendered_project_structure_fastapi_with_migrator.json.approved.txt +0 -0
  337. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/approved_files/TestFileSystem.test_should_create_file_system_in_disk.rendered_project_structure_only_with_fastapi.json.approved.txt +0 -0
  338. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/approved_files/TestFileSystem.test_should_create_folders_and_files.approved.txt +0 -0
  339. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/approved_files/TestFileSystem.test_should_generate_file_system_tree.approved.txt +0 -0
  340. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/directory_mother.py +0 -0
  341. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/resources/boilerplate/exceptions/domain_error.py +0 -0
  342. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/resources/boilerplate/exceptions/domain_error_simple.py +0 -0
  343. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/resources/boilerplate/fastapi/application.py +0 -0
  344. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/resources/boilerplate/fastapi/http_response.py +0 -0
  345. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/resources/boilerplate/fastapi/lifespan.py +0 -0
  346. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/resources/boilerplate/logger/logger.py +0 -0
  347. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/resources/boilerplate/persistence/alembic_migrator.py +0 -0
  348. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/resources/clean_architecture/main_structure.yml.j2 +0 -0
  349. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/resources/config.yml +0 -0
  350. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/resources/config_fastapi_with_logger.yml +0 -0
  351. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/resources/config_fastapi_with_migrator.yml +0 -0
  352. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/resources/config_with_only_fastapi.yml +0 -0
  353. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/resources/rendered_custom_project_structure.json +0 -0
  354. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/resources/rendered_project_structure.json +0 -0
  355. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/resources/rendered_project_structure_fastapi_with_logger.json +0 -0
  356. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/resources/rendered_project_structure_fastapi_with_migrator.json +0 -0
  357. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/resources/rendered_project_structure_only_with_fastapi.json +0 -0
  358. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/test_directory.py +0 -0
  359. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/test_file.py +0 -0
  360. {instant_python-0.11.0 → instant_python-0.12.1}/test/project_creator/test_file_system.py +0 -0
  361. {instant_python-0.11.0 → instant_python-0.12.1}/test/random_generator.py +0 -0
  362. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/approved_files/TestCustomProjectRenderer.test_should_render_custom_template.approved.txt +0 -0
  363. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/approved_files/TestJinjaProjectRenderer.test_should_render_template_for.clean_architecture_config.yml.approved.txt +0 -0
  364. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/approved_files/TestJinjaProjectRenderer.test_should_render_template_for.domain_driven_design_config.yml.approved.txt +0 -0
  365. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/approved_files/TestJinjaProjectRenderer.test_should_render_template_for.received.txt +0 -0
  366. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/approved_files/TestJinjaProjectRenderer.test_should_render_template_for.standard_project_with_dependency_config.yml.approved.txt +0 -0
  367. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/approved_files/TestJinjaProjectRenderer.test_should_render_template_for.standard_project_with_git_config.yml.approved.txt +0 -0
  368. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/resources/clean_architecture/main_structure.yml.j2 +0 -0
  369. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/resources/clean_architecture_config.yml +0 -0
  370. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/resources/custom_template.yml +0 -0
  371. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/resources/domain_driven_design/main_structure.yml.j2 +0 -0
  372. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/resources/domain_driven_design_config.yml +0 -0
  373. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/resources/standard_project/main_structure.yml.j2 +0 -0
  374. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/resources/standard_project_with_dependency_config.yml +0 -0
  375. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/resources/standard_project_with_git_config.yml +0 -0
  376. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/resources/test_template.j2 +0 -0
  377. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/test_custom_project_renderer.py +0 -0
  378. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/test_jinja_environment.py +0 -0
  379. {instant_python-0.11.0 → instant_python-0.12.1}/test/render/test_jinja_project_renderer.py +0 -0
  380. {instant_python-0.11.0 → instant_python-0.12.1}/tox.ini +0 -0
@@ -2,6 +2,146 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v0.12.1 (2025-10-23)
6
+
7
+ ### 🪲 Bug Fixes
8
+
9
+ - **templates**: Create github issues templates folder with correct name
10
+ ([`751e58f`](https://github.com/dimanu-py/instant-python/commit/751e58fa2ffd637e7984e4c2040616deb300f2f8))
11
+
12
+
13
+ ## v0.12.0 (2025-10-23)
14
+
15
+ ### ✨ Features
16
+
17
+ - **initialize**: Move init command cli to its own folder for hexagonal architecture
18
+ ([`3101896`](https://github.com/dimanu-py/instant-python/commit/310189634553c297095d8f3bd40fcd32cc87228f))
19
+
20
+ - **config**: Implement YAML config writer to save configuration to file
21
+ ([`99b2e5e`](https://github.com/dimanu-py/instant-python/commit/99b2e5ed5ac0aea6859dc852a5bf5ed15e34f659))
22
+
23
+ - **config**: Return parsed configuration
24
+ ([`330dc00`](https://github.com/dimanu-py/instant-python/commit/330dc0056fdef9ae9fc983ab9cbe080c8fc27fca))
25
+
26
+ - **config**: Add parsing logic for template section in configuration
27
+ ([`9f9e83a`](https://github.com/dimanu-py/instant-python/commit/9f9e83a5c684c634cb00826fe57db98dcdaee45b))
28
+
29
+ - **config**: Add parsing logic for git section in configuration
30
+ ([`818febc`](https://github.com/dimanu-py/instant-python/commit/818febc61febbc509caf1a9ec2946f3d71ff6eb3))
31
+
32
+ - **config**: Add parsing logic for dependencies section in configuration
33
+ ([`b6fec2a`](https://github.com/dimanu-py/instant-python/commit/b6fec2a4c2d7b9773b7bca1707acf6193e0dd986))
34
+
35
+ - **config**: Implement logic to parse general section of config
36
+ ([`e6ef56c`](https://github.com/dimanu-py/instant-python/commit/e6ef56c2988e8af8d0a9ffadcc882c643a2e580e))
37
+
38
+ - **config**: Validate required configuration keys and raise appropriate exceptions
39
+ ([`697b115`](https://github.com/dimanu-py/instant-python/commit/697b1153472189ae7dd8b58825830644282ef9bc))
40
+
41
+ - **config**: Raise EmptyConfigurationNotAllowed for empty content in parse method
42
+ ([`b3f51e4`](https://github.com/dimanu-py/instant-python/commit/b3f51e4a5dd483d4a2f3fa58c2e4b3b035dec1ca))
43
+
44
+ - **config**: Inject ConfigParser port into ConfigGenerator use case
45
+ ([`4f0a8f6`](https://github.com/dimanu-py/instant-python/commit/4f0a8f6be698c54b1ae75755a4807c6c8184c9d4))
46
+
47
+ - **config**: Define ConfigParser interface as driver port
48
+ ([`59ec2b9`](https://github.com/dimanu-py/instant-python/commit/59ec2b9c5c3ffb145547b98c06721c8121cab907))
49
+
50
+ - **config**: Extend QuestionaryQuestionWizard to inherit from QuestionWizard
51
+ ([`ed3674c`](https://github.com/dimanu-py/instant-python/commit/ed3674c41547504a95817498c759324a7607700d))
52
+
53
+ - **config**: Add abstract QuestionWizard class for question handling
54
+ ([`abb9a22`](https://github.com/dimanu-py/instant-python/commit/abb9a226be6f257ed5924fe935ccbfae338e9c10))
55
+
56
+ - **config**: Implement execute method for configuration generation
57
+ ([`936b2c6`](https://github.com/dimanu-py/instant-python/commit/936b2c61fc69c013e618093bfa62e8599876f2d7))
58
+
59
+ - **config**: Create ConfigGenerator class for configuration generation
60
+ ([`377564e`](https://github.com/dimanu-py/instant-python/commit/377564e5e9057c79f2f07b0889bae55f749e8981))
61
+
62
+ - **config**: Create yaml writer interface
63
+ ([`4e6f3b5`](https://github.com/dimanu-py/instant-python/commit/4e6f3b5a29a7970f67836bb18c07349cc0a93897))
64
+
65
+ ### 🪲 Bug Fixes
66
+
67
+ - **templates**: Point to correct base error template file when including fastapi built in feature
68
+ ([`c2ce3f3`](https://github.com/dimanu-py/instant-python/commit/c2ce3f35a1eb9cb268906e78990abd7c25604955))
69
+
70
+ - **cli**: Correct import for new place of config command
71
+ ([`f23b0fc`](https://github.com/dimanu-py/instant-python/commit/f23b0fc3204483bbac44c87fd70611e742c50c61))
72
+
73
+ ### ⚙️ Build System
74
+
75
+ - Update audit make command to ignore pip vulnerability
76
+ ([`963d5f6`](https://github.com/dimanu-py/instant-python/commit/963d5f6c0fdbc9528cd90489429db692a36fb8c5))
77
+
78
+ - Exclude resources folders from mypy analysis
79
+ ([`7f2b3b8`](https://github.com/dimanu-py/instant-python/commit/7f2b3b818d4b608aa466e50d9dfdedd42e6af4f7))
80
+
81
+ ### ♻️ Refactoring
82
+
83
+ - **config**: Instantiate question wizard steps inside directly coupling them
84
+ ([`8785304`](https://github.com/dimanu-py/instant-python/commit/8785304b744f9dba777e2518014e4a40146753c0))
85
+
86
+ - **config**: Remove complex class hierarchy for different types of questions and streamline
87
+ questions using questionary wrapper
88
+ ([`35e266b`](https://github.com/dimanu-py/instant-python/commit/35e266bfb3afc97b88f6432e08463a80553ff32b))
89
+
90
+ - **config**: Streamline dependency installation questions in CLI
91
+ ([`33f0bd6`](https://github.com/dimanu-py/instant-python/commit/33f0bd6d95d7aa0d9c87a74c2a5e0a638b1541a1))
92
+
93
+ - **config**: Modify cli application to use new config generator use case
94
+ ([`530fe7e`](https://github.com/dimanu-py/instant-python/commit/530fe7e47ed7f9fb81077c4efdbe31c0967e339c))
95
+
96
+ - **config**: Move question wizard concrete implementation to new infra folder in config command
97
+ ([`0f8b481`](https://github.com/dimanu-py/instant-python/commit/0f8b48128eb97fb1c8ed54852307cb995c183739))
98
+
99
+ - **config**: Turn config file path attribute to public
100
+ ([`8fa7f3e`](https://github.com/dimanu-py/instant-python/commit/8fa7f3e6aa31e287b050601732db1ecd7260e325))
101
+
102
+ - **config**: Clean up parser tests adding setup_method
103
+ ([`eb3c095`](https://github.com/dimanu-py/instant-python/commit/eb3c0958b36bb161ff7874458761b1c1871e1db4))
104
+
105
+ - **config**: Move config parsing errors to new architecture and to errors file
106
+ ([`c18a969`](https://github.com/dimanu-py/instant-python/commit/c18a96965d35faa1a8e735974e3e1e9c8ae64810))
107
+
108
+ - **config**: Extract string values to constants
109
+ ([`49ac047`](https://github.com/dimanu-py/instant-python/commit/49ac04775ca140464eb8f79a246bed63fe6cd9b4))
110
+
111
+ - **config**: Extract semantic methods for better readability in parser
112
+ ([`42cc355`](https://github.com/dimanu-py/instant-python/commit/42cc35588acb3ef256d22bbf9062b9d367e28f0a))
113
+
114
+ - **config**: Decouple configuration generation from specific schema classes validating answers with
115
+ parser
116
+ ([`2a3bea5`](https://github.com/dimanu-py/instant-python/commit/2a3bea55ae87317580012ab6eb940675c6089c4a))
117
+
118
+ - **config**: Rename QuestionaryQuestionWizard to QuestionaryConsoleWizard
119
+ ([`66a6671`](https://github.com/dimanu-py/instant-python/commit/66a6671f9765ca91836229d3c32c4c21ba6ecc4d))
120
+
121
+ - **config**: Apply dependency inversion to ConfigGenerator constructor
122
+ ([`8ae285f`](https://github.com/dimanu-py/instant-python/commit/8ae285f2d0c26e03513ac874435dbc100360cea0))
123
+
124
+ - **config**: Rename YamlWriter interface to ConfigWriter
125
+ ([`4921828`](https://github.com/dimanu-py/instant-python/commit/4921828e171c8e999c643da1df583b1c4bfa3d43))
126
+
127
+ - **config**: Update test to use QuestionWizard instead of QuestionaryQuestionWizard for mock
128
+ ([`00fb764`](https://github.com/dimanu-py/instant-python/commit/00fb764239ed6fffa94ec211bc32b544d407cf4a))
129
+
130
+ - **config**: Rename QuestionWizard to QuestionaryQuestionWizard to express its implementation uses
131
+ questionary
132
+ ([`74d124d`](https://github.com/dimanu-py/instant-python/commit/74d124d68318fa333cb48f98aa43c6f59667a6c1))
133
+
134
+ - **config**: Structure tests for config domain following same structure as source
135
+ ([`eafda5e`](https://github.com/dimanu-py/instant-python/commit/eafda5e240b84483962daeed5d5c85b3354b2a15))
136
+
137
+ - **config**: Move domain classes for config command to domain module
138
+ ([`c6aa3ad`](https://github.com/dimanu-py/instant-python/commit/c6aa3ad5f5649fc4f3dd61d9d02fc9d0de70a7ca))
139
+
140
+ - **commands**: Move cli application for 'config' command to specific module config that will follow
141
+ hexagonal architecture to reduce coupling
142
+ ([`a1fa9ab`](https://github.com/dimanu-py/instant-python/commit/a1fa9ab605a0fe622e529f086352d5eefc3b8ece))
143
+
144
+
5
145
  ## v0.11.0 (2025-09-30)
6
146
 
7
147
  ### ✨ Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: instant-python
3
- Version: 0.11.0
3
+ Version: 0.12.1
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/
@@ -1,7 +1,8 @@
1
1
  from rich.console import Console
2
2
  from rich.panel import Panel
3
3
 
4
- from instant_python.commands import init, config
4
+ from instant_python.config.delivery import cli as config
5
+ from instant_python.initialize.delivery import cli as init
5
6
  from instant_python.shared.application_error import ApplicationError
6
7
  from instant_python.cli.instant_python_typer import InstantPythonTyper
7
8
 
@@ -0,0 +1,15 @@
1
+ from instant_python.config.domain.config_parser import ConfigParser
2
+ from instant_python.config.domain.config_writer import ConfigWriter
3
+ from instant_python.config.domain.question_wizard import QuestionWizard
4
+
5
+
6
+ class ConfigGenerator:
7
+ def __init__(self, question_wizard: QuestionWizard, writer: ConfigWriter, parser: ConfigParser) -> None:
8
+ self._question_wizard = question_wizard
9
+ self._writer = writer
10
+ self._parser = parser
11
+
12
+ def execute(self) -> None:
13
+ answers = self._question_wizard.run()
14
+ configuration = self._parser.parse(answers)
15
+ self._writer.write(configuration)
@@ -0,0 +1,19 @@
1
+ import typer
2
+
3
+ from instant_python.config.application.config_generator import ConfigGenerator
4
+ from instant_python.config.infra.parser.parser import Parser
5
+ from instant_python.config.infra.question_wizard.step.questionary import Questionary
6
+ from instant_python.config.infra.question_wizard.questionary_console_wizard import QuestionaryConsoleWizard
7
+ from instant_python.config.infra.writer.yaml_config_writer import YamlConfigWriter
8
+
9
+ app = typer.Typer()
10
+
11
+
12
+ @app.command("config", help="Generate the configuration file for a new project")
13
+ def generate_ipy_configuration_file() -> None:
14
+ config_generator = ConfigGenerator(
15
+ question_wizard=QuestionaryConsoleWizard(questionary=(Questionary())),
16
+ writer=YamlConfigWriter(),
17
+ parser=Parser(),
18
+ )
19
+ config_generator.execute()
@@ -0,0 +1,9 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+ from instant_python.config.domain.configuration_schema import ConfigurationSchema
4
+
5
+
6
+ class ConfigParser(ABC):
7
+ @abstractmethod
8
+ def parse(self, content: dict[str, dict]) -> ConfigurationSchema:
9
+ raise NotImplementedError
@@ -0,0 +1,9 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+ from instant_python.config.domain.configuration_schema import ConfigurationSchema
4
+
5
+
6
+ class ConfigWriter(ABC):
7
+ @abstractmethod
8
+ def write(self, configuration: ConfigurationSchema) -> None:
9
+ raise NotImplementedError
@@ -5,14 +5,14 @@ from typing import TypedDict, Union
5
5
 
6
6
  import yaml
7
7
 
8
- from instant_python.configuration.dependency.dependency_configuration import (
8
+ from instant_python.config.domain.dependency_configuration import (
9
9
  DependencyConfiguration,
10
10
  )
11
- from instant_python.configuration.general.general_configuration import (
11
+ from instant_python.config.domain.general_configuration import (
12
12
  GeneralConfiguration,
13
13
  )
14
- from instant_python.configuration.git.git_configuration import GitConfiguration
15
- from instant_python.configuration.template.template_configuration import (
14
+ from instant_python.config.domain.git_configuration import GitConfiguration
15
+ from instant_python.config.domain.template_configuration import (
16
16
  TemplateConfiguration,
17
17
  )
18
18
 
@@ -23,7 +23,7 @@ class ConfigurationSchema:
23
23
  dependencies: list[DependencyConfiguration]
24
24
  template: TemplateConfiguration
25
25
  git: GitConfiguration
26
- _config_file_path: Path = field(default_factory=lambda: Path("ipy.yml"))
26
+ config_file_path: Path = field(default_factory=lambda: Path("ipy.yml"))
27
27
 
28
28
  @classmethod
29
29
  def from_file(
@@ -39,17 +39,17 @@ class ConfigurationSchema:
39
39
  dependencies=dependencies,
40
40
  template=template,
41
41
  git=git,
42
- _config_file_path=Path(config_file_path),
42
+ config_file_path=Path(config_file_path),
43
43
  )
44
44
 
45
45
  def save_on_project_folder(self) -> None:
46
46
  destination_folder = Path.cwd() / self.project_folder_name
47
- destination_path = destination_folder / self._config_file_path.name
47
+ destination_path = destination_folder / self.config_file_path.name
48
48
 
49
- shutil.move(self._config_file_path, destination_path)
49
+ shutil.move(self.config_file_path, destination_path)
50
50
 
51
51
  def save_on_current_directory(self) -> None:
52
- destination_folder = Path.cwd() / self._config_file_path
52
+ destination_folder = Path.cwd() / self.config_file_path
53
53
  with open(destination_folder, "w") as file:
54
54
  yaml.dump(self.to_primitives(), file)
55
55
 
@@ -1,8 +1,7 @@
1
1
  from dataclasses import dataclass, field, asdict
2
2
 
3
- from instant_python.configuration.dependency.not_dev_dependency_included_in_group import (
4
- NotDevDependencyIncludedInGroup,
5
- )
3
+ from instant_python.shared.application_error import ApplicationError
4
+ from instant_python.shared.error_types import ErrorTypes
6
5
 
7
6
 
8
7
  @dataclass
@@ -34,3 +33,9 @@ class DependencyConfiguration:
34
33
  def _ensure_dependency_is_dev_if_group_is_set(self) -> None:
35
34
  if self.group and not self.is_dev:
36
35
  raise NotDevDependencyIncludedInGroup(self.name, self.group)
36
+
37
+
38
+ class NotDevDependencyIncludedInGroup(ApplicationError):
39
+ def __init__(self, dependency_name: str, dependency_group: str) -> None:
40
+ message = f"Dependency '{dependency_name}' has been included in group '{dependency_group}' but it is not a development dependency. Please ensure that only development dependencies are included in groups."
41
+ super().__init__(message=message, error_type=ErrorTypes.CONFIGURATION.value)
@@ -2,15 +2,8 @@ from datetime import datetime
2
2
  from dataclasses import dataclass, asdict, field
3
3
  from typing import ClassVar
4
4
 
5
- from instant_python.configuration.general.invalid_dependency_manager_value import (
6
- InvalidDependencyManagerValue,
7
- )
8
- from instant_python.configuration.general.invalid_license_value import (
9
- InvalidLicenseValue,
10
- )
11
- from instant_python.configuration.general.invalid_python_version_value import (
12
- InvalidPythonVersionValue,
13
- )
5
+ from instant_python.shared.application_error import ApplicationError
6
+ from instant_python.shared.error_types import ErrorTypes
14
7
  from instant_python.shared.supported_licenses import SupportedLicenses
15
8
  from instant_python.shared.supported_managers import SupportedManagers
16
9
  from instant_python.shared.supported_python_versions import SupportedPythonVersions
@@ -58,3 +51,21 @@ class GeneralConfiguration:
58
51
 
59
52
  def to_primitives(self) -> dict[str, str]:
60
53
  return asdict(self)
54
+
55
+
56
+ class InvalidDependencyManagerValue(ApplicationError):
57
+ def __init__(self, value: str, supported_values: list[str]) -> None:
58
+ message = f"Invalid dependency manager: {value}. Allowed values are {', '.join(supported_values)}."
59
+ super().__init__(message=message, error_type=ErrorTypes.CONFIGURATION.value)
60
+
61
+
62
+ class InvalidLicenseValue(ApplicationError):
63
+ def __init__(self, value: str, supported_values: list[str]) -> None:
64
+ message = f"Invalid license: {value}. Allowed values are {', '.join(supported_values)}."
65
+ super().__init__(message=message, error_type=ErrorTypes.CONFIGURATION.value)
66
+
67
+
68
+ class InvalidPythonVersionValue(ApplicationError):
69
+ def __init__(self, value: str, supported_values: list[str]) -> None:
70
+ message = f"Invalid Python version: {value}. Allowed versions are {', '.join(supported_values)}."
71
+ super().__init__(message=message, error_type=ErrorTypes.CONFIGURATION.value)
@@ -1,9 +1,8 @@
1
1
  from dataclasses import dataclass, field, asdict
2
2
  from typing import Optional
3
3
 
4
- from instant_python.configuration.git.git_user_or_email_not_present import (
5
- GitUserOrEmailNotPresent,
6
- )
4
+ from instant_python.shared.application_error import ApplicationError
5
+ from instant_python.shared.error_types import ErrorTypes
7
6
 
8
7
 
9
8
  @dataclass
@@ -21,3 +20,9 @@ class GitConfiguration:
21
20
 
22
21
  def to_primitives(self) -> dict[str, str | bool]:
23
22
  return asdict(self)
23
+
24
+
25
+ class GitUserOrEmailNotPresent(ApplicationError):
26
+ def __init__(self) -> None:
27
+ message = "When initializing a git repository, both username and email must be provided."
28
+ super().__init__(message=message, error_type=ErrorTypes.CONFIGURATION.value)
@@ -0,0 +1,7 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+
4
+ class QuestionWizard(ABC):
5
+ @abstractmethod
6
+ def run(self) -> dict:
7
+ raise NotImplementedError
@@ -1,18 +1,8 @@
1
1
  from dataclasses import dataclass, field, asdict
2
2
  from typing import ClassVar, Optional, Union
3
3
 
4
- from instant_python.configuration.template.bounded_context_not_applicable import (
5
- BoundedContextNotApplicable,
6
- )
7
- from instant_python.configuration.template.bounded_context_not_especified import (
8
- BoundedContextNotSpecified,
9
- )
10
- from instant_python.configuration.template.invalid_built_in_features_values import (
11
- InvalidBuiltInFeaturesValues,
12
- )
13
- from instant_python.configuration.template.invalid_template_value import (
14
- InvalidTemplateValue,
15
- )
4
+ from instant_python.shared.application_error import ApplicationError
5
+ from instant_python.shared.error_types import ErrorTypes
16
6
  from instant_python.shared.supported_built_in_features import SupportedBuiltInFeatures
17
7
  from instant_python.shared.supported_templates import SupportedTemplates
18
8
 
@@ -57,3 +47,29 @@ class TemplateConfiguration:
57
47
 
58
48
  def to_primitives(self) -> dict[str, Union[str, list[str]]]:
59
49
  return asdict(self)
50
+
51
+
52
+ class BoundedContextNotApplicable(ApplicationError):
53
+ def __init__(self, value: str) -> None:
54
+ message = f"Bounded context feature is not applicable for template '{value}'. Is only applicable for 'domain_driven_design' template."
55
+ super().__init__(message=message, error_type=ErrorTypes.CONFIGURATION.value)
56
+
57
+
58
+ class BoundedContextNotSpecified(ApplicationError):
59
+ def __init__(self) -> None:
60
+ message = "Option to specify bounded context is set as True, but either bounded context or aggregate name is not specified."
61
+ super().__init__(message=message, error_type=ErrorTypes.CONFIGURATION.value)
62
+
63
+
64
+ class InvalidBuiltInFeaturesValues(ApplicationError):
65
+ def __init__(self, values: list[str], supported_values: list[str]) -> None:
66
+ message = (
67
+ f"Features {', '.join(values)} are not supported. Supported features are: {', '.join(supported_values)}."
68
+ )
69
+ super().__init__(message=message, error_type=ErrorTypes.CONFIGURATION.value)
70
+
71
+
72
+ class InvalidTemplateValue(ApplicationError):
73
+ def __init__(self, value: str, supported_values: list[str]) -> None:
74
+ message = f"Invalid template: '{value}'. Supported templates are: {', '.join(supported_values)}."
75
+ super().__init__(message=message, error_type=ErrorTypes.CONFIGURATION.value)
@@ -0,0 +1,25 @@
1
+ from instant_python.shared.application_error import ApplicationError
2
+ from instant_python.shared.error_types import ErrorTypes
3
+
4
+
5
+ class ConfigKeyNotPresent(ApplicationError):
6
+ def __init__(self, missing_keys: list[str], required_keys: list[str]) -> None:
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)}.",
9
+ error_type=ErrorTypes.CONFIGURATION.value,
10
+ )
11
+
12
+
13
+ class EmptyConfigurationNotAllowed(ApplicationError):
14
+ def __init__(self) -> None:
15
+ super().__init__(message="Configuration file cannot be empty.", error_type=ErrorTypes.CONFIGURATION.value)
16
+
17
+
18
+ class MissingMandatoryFields(ApplicationError):
19
+ def __init__(self, missing_field: str, config_section: str) -> None:
20
+ super().__init__(
21
+ message=(
22
+ f"Mandatory field '{missing_field}' is missing in the '{config_section}' section of the configuration file."
23
+ ),
24
+ error_type=ErrorTypes.CONFIGURATION.value,
25
+ )
@@ -0,0 +1,91 @@
1
+ from typing import Union
2
+
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
9
+ from instant_python.config.infra.parser.errors import (
10
+ ConfigKeyNotPresent,
11
+ EmptyConfigurationNotAllowed,
12
+ MissingMandatoryFields,
13
+ )
14
+
15
+
16
+ class Parser(ConfigParser):
17
+ _GENERAL = "general"
18
+ _DEPENDENCIES = "dependencies"
19
+ _TEMPLATE = "template"
20
+ _GIT = "git"
21
+ _REQUIRED_CONFIG_KEYS = [_GENERAL, _DEPENDENCIES, _TEMPLATE, _GIT]
22
+
23
+ def parse(self, content: dict[str, dict]) -> ConfigurationSchema:
24
+ self._ensure_configuration_is_not_empty(content)
25
+ self._ensure_all_required_sections_are_present(content)
26
+ general_section = self._parse_general_section(content[self._GENERAL])
27
+ dependencies_section = self._parse_dependencies_section(content[self._DEPENDENCIES])
28
+ template_section = self._parse_template_section(content[self._TEMPLATE])
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,
35
+ )
36
+
37
+ def _parse_general_section(self, fields: dict[str, str]) -> GeneralConfiguration:
38
+ try:
39
+ return GeneralConfiguration(**fields)
40
+ except TypeError as error:
41
+ self._ensure_error_is_for_missing_fields(error)
42
+ raise MissingMandatoryFields(error.args[0], self._GENERAL) from error
43
+
44
+ def _parse_dependencies_section(
45
+ self,
46
+ fields: list[dict[str, Union[str, bool]]],
47
+ ) -> list[DependencyConfiguration]:
48
+ dependencies = []
49
+
50
+ if not fields:
51
+ return dependencies
52
+
53
+ for dependency_fields in fields:
54
+ try:
55
+ dependency = DependencyConfiguration(**dependency_fields)
56
+ except TypeError as error:
57
+ self._ensure_error_is_for_missing_fields(error)
58
+ raise MissingMandatoryFields(error.args[0], self._DEPENDENCIES) from error
59
+
60
+ dependencies.append(dependency)
61
+
62
+ return dependencies
63
+
64
+ def _parse_template_section(self, fields: dict[str, Union[str, bool, list[str]]]) -> TemplateConfiguration:
65
+ try:
66
+ return TemplateConfiguration(**fields)
67
+ except TypeError as error:
68
+ self._ensure_error_is_for_missing_fields(error)
69
+ raise MissingMandatoryFields(error.args[0], self._TEMPLATE) from error
70
+
71
+ def _parse_git_section(self, fields: dict[str, Union[str, bool]]) -> GitConfiguration:
72
+ try:
73
+ return GitConfiguration(**fields)
74
+ except TypeError as error:
75
+ self._ensure_error_is_for_missing_fields(error)
76
+ raise MissingMandatoryFields(error.args[0], self._GIT) from error
77
+
78
+ def _ensure_all_required_sections_are_present(self, content: dict[str, dict]):
79
+ missing_keys = [key for key in self._REQUIRED_CONFIG_KEYS if key not in content]
80
+ if missing_keys:
81
+ raise ConfigKeyNotPresent(missing_keys, self._REQUIRED_CONFIG_KEYS)
82
+
83
+ @staticmethod
84
+ def _ensure_configuration_is_not_empty(content: dict[str, dict]):
85
+ if not content:
86
+ raise EmptyConfigurationNotAllowed
87
+
88
+ @staticmethod
89
+ def _ensure_error_is_for_missing_fields(error: TypeError) -> None:
90
+ if ".__init__() missing" not in str(error):
91
+ raise error
@@ -0,0 +1,25 @@
1
+ from instant_python.config.domain.question_wizard import QuestionWizard
2
+ from instant_python.config.infra.question_wizard.step.dependencies_step import DependenciesStep
3
+ from instant_python.config.infra.question_wizard.step.general_step import GeneralStep
4
+ from instant_python.config.infra.question_wizard.step.git_step import GitStep
5
+ from instant_python.config.infra.question_wizard.step.questionary import Questionary
6
+ from instant_python.config.infra.question_wizard.step.steps import Steps
7
+ from instant_python.config.infra.question_wizard.step.template_step import TemplateStep
8
+
9
+
10
+ class QuestionaryConsoleWizard(QuestionWizard):
11
+ def __init__(self, questionary: Questionary) -> None:
12
+ self._steps = Steps(
13
+ GeneralStep(questionary=questionary),
14
+ TemplateStep(questionary=questionary),
15
+ GitStep(questionary=questionary),
16
+ DependenciesStep(questionary=questionary),
17
+ )
18
+ self._answers = {}
19
+
20
+ def run(self) -> dict:
21
+ for step in self._steps:
22
+ answer = step.run()
23
+ self._answers.update(answer)
24
+
25
+ return self._answers
@@ -0,0 +1,64 @@
1
+ from typing import Union
2
+
3
+ from instant_python.config.infra.question_wizard.step.questionary import Questionary
4
+ from instant_python.config.infra.question_wizard.step.steps import Step
5
+
6
+
7
+ class DependenciesStep(Step):
8
+ _KEY = "dependencies"
9
+
10
+ def __init__(self, questionary: Questionary) -> None:
11
+ super().__init__(questionary)
12
+ self._dependencies = []
13
+
14
+ def run(self) -> dict[str, list[dict[str, Union[str, bool]]]]:
15
+ while True:
16
+ if not self._user_wants_to_install_dependencies():
17
+ break
18
+
19
+ name = self._ask_dependency_name()
20
+ if not name:
21
+ print("Dependency name cannot be empty. Let's try again.")
22
+ continue
23
+ version = self._ask_dependency_version()
24
+ is_for_development = self._ask_if_dependency_is_for_development_purpose(name)
25
+ group_name = self._ask_dev_dependency_group_name() if is_for_development else ""
26
+
27
+ self._dependencies.append(
28
+ {
29
+ "name": name,
30
+ "version": version,
31
+ "is_dev": is_for_development,
32
+ "group": group_name,
33
+ }
34
+ )
35
+
36
+ return {self._KEY: self._dependencies}
37
+
38
+ def _ask_dev_dependency_group_name(self) -> str:
39
+ return self._questionary.free_text_question(
40
+ message="Specify the name of the group where to install the dependency (leave empty if not applicable)",
41
+ default="",
42
+ )
43
+
44
+ def _ask_if_dependency_is_for_development_purpose(self, name: str) -> bool:
45
+ return self._questionary.boolean_question(
46
+ message=f"Do you want to install {name} as a dev dependency?",
47
+ default=False,
48
+ )
49
+
50
+ def _ask_dependency_version(self) -> str:
51
+ return self._questionary.free_text_question(
52
+ message="Enter the version of the dependency you want to install",
53
+ default="latest",
54
+ )
55
+
56
+ def _ask_dependency_name(self) -> str:
57
+ return self._questionary.free_text_question(
58
+ message="Enter the name of the dependency you want to install",
59
+ )
60
+
61
+ def _user_wants_to_install_dependencies(self) -> bool:
62
+ return self._questionary.boolean_question(
63
+ message="Do you want to install dependencies?",
64
+ )