instant-python 0.10.0__tar.gz → 0.12.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 (388) hide show
  1. {instant_python-0.10.0 → instant_python-0.12.0}/CHANGELOG.md +156 -0
  2. {instant_python-0.10.0 → instant_python-0.12.0}/PKG-INFO +1 -1
  3. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/cli/cli.py +2 -1
  4. instant_python-0.12.0/instant_python/config/application/config_generator.py +15 -0
  5. instant_python-0.12.0/instant_python/config/delivery/cli.py +19 -0
  6. instant_python-0.12.0/instant_python/config/domain/config_parser.py +9 -0
  7. instant_python-0.12.0/instant_python/config/domain/config_writer.py +9 -0
  8. {instant_python-0.10.0/instant_python/configuration → instant_python-0.12.0/instant_python/config/domain}/configuration_schema.py +9 -9
  9. {instant_python-0.10.0/instant_python/configuration/dependency → instant_python-0.12.0/instant_python/config/domain}/dependency_configuration.py +8 -3
  10. {instant_python-0.10.0/instant_python/configuration/general → instant_python-0.12.0/instant_python/config/domain}/general_configuration.py +20 -9
  11. {instant_python-0.10.0/instant_python/configuration/git → instant_python-0.12.0/instant_python/config/domain}/git_configuration.py +8 -3
  12. instant_python-0.12.0/instant_python/config/domain/question_wizard.py +7 -0
  13. {instant_python-0.10.0/instant_python/configuration/template → instant_python-0.12.0/instant_python/config/domain}/template_configuration.py +28 -12
  14. instant_python-0.12.0/instant_python/config/infra/parser/errors.py +25 -0
  15. instant_python-0.12.0/instant_python/config/infra/parser/parser.py +91 -0
  16. instant_python-0.12.0/instant_python/config/infra/question_wizard/questionary_console_wizard.py +25 -0
  17. instant_python-0.12.0/instant_python/config/infra/question_wizard/step/dependencies_step.py +64 -0
  18. instant_python-0.12.0/instant_python/config/infra/question_wizard/step/general_step.py +81 -0
  19. instant_python-0.12.0/instant_python/config/infra/question_wizard/step/git_step.py +41 -0
  20. {instant_python-0.10.0/instant_python/configuration → instant_python-0.12.0/instant_python/config/infra/question_wizard}/step/steps.py +1 -1
  21. instant_python-0.12.0/instant_python/config/infra/question_wizard/step/template_step.py +63 -0
  22. instant_python-0.12.0/instant_python/config/infra/writer/yaml_config_writer.py +13 -0
  23. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/configuration/parser/parser.py +10 -12
  24. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/dependency_manager/dependency_manager.py +1 -1
  25. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/dependency_manager/pdm_dependency_manager.py +1 -1
  26. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/dependency_manager/uv_dependency_manager.py +1 -1
  27. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/git/git_configurer.py +1 -1
  28. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/project_creator/file.py +1 -1
  29. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/project_creator/file_system.py +1 -1
  30. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/render/jinja_project_renderer.py +1 -1
  31. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/domain_event_json_deserializer.py +11 -1
  32. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/domain_event_json_serializer.py +4 -0
  33. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/domain_event_subscriber.py +9 -1
  34. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/event_bus.py +4 -0
  35. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/mock_event_bus.py +5 -0
  36. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_configurer.py +16 -0
  37. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_connection.py +14 -1
  38. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_consumer.py +19 -0
  39. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_event_bus.py +14 -0
  40. instant_python-0.12.0/instant_python/templates/boilerplate/exceptions/domain_error.py +11 -0
  41. instant_python-0.12.0/instant_python/templates/boilerplate/exceptions/domain_event_type_not_found_error.py +10 -0
  42. instant_python-0.12.0/instant_python/templates/boilerplate/exceptions/incorrect_value_type_error.py +15 -0
  43. instant_python-0.12.0/instant_python/templates/boilerplate/exceptions/invalid_id_format_error.py +11 -0
  44. instant_python-0.12.0/instant_python/templates/boilerplate/exceptions/invalid_negative_value_error.py +11 -0
  45. instant_python-0.12.0/instant_python/templates/boilerplate/exceptions/rabbit_mq_connection_not_established_error.py +12 -0
  46. instant_python-0.12.0/instant_python/templates/boilerplate/exceptions/required_value_error.py +11 -0
  47. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/fastapi/application.py +9 -2
  48. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/fastapi/error_handlers.py +14 -2
  49. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/fastapi/fastapi_log_middleware.py +4 -0
  50. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/fastapi/lifespan.py +4 -0
  51. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/logger/file_logger.py +4 -0
  52. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/logger/file_rotating_handler.py +4 -0
  53. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/alembic_migrator.py +4 -0
  54. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/async/async_engine_fixture.py +4 -0
  55. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/async/env.py +4 -0
  56. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/async/models_metadata.py +4 -0
  57. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/async/sqlalchemy_repository.py +10 -2
  58. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/synchronous/session_maker.py +6 -0
  59. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/synchronous/sqlalchemy_repository.py +11 -0
  60. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/pyproject.toml +16 -0
  61. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/insert_template.py +3 -3
  62. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/makefile +4 -4
  63. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/aggregate.py +4 -0
  64. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/int_primitives_mother.py +4 -0
  65. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/int_value_object.py +8 -0
  66. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/string_primitives_mother.py +4 -0
  67. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/string_value_object.py +7 -0
  68. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/test_int_value_object.py +16 -0
  69. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/test_string_value_object.py +13 -0
  70. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/test_uuid_value_object.py +16 -0
  71. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/uuid.py +8 -0
  72. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/uuid_primitives_mother.py +4 -0
  73. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/fastapi_domain.yml.j2 +1 -1
  74. instant_python-0.12.0/instant_python/templates/project_structure/makefile.yml.j2 +3 -0
  75. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/value_objects.yml.j2 +1 -1
  76. {instant_python-0.10.0 → instant_python-0.12.0}/makefile +1 -1
  77. {instant_python-0.10.0 → instant_python-0.12.0}/mypy.ini +1 -1
  78. {instant_python-0.10.0 → instant_python-0.12.0}/pyproject.toml +1 -1
  79. instant_python-0.12.0/test/config/application/test_config_generator.py +32 -0
  80. instant_python-0.12.0/test/config/domain/mothers/configuration_schema_mother.py +16 -0
  81. {instant_python-0.10.0/test/configuration/dependency → instant_python-0.12.0/test/config/domain/mothers}/dependency_configuration_mother.py +1 -1
  82. {instant_python-0.10.0/test/configuration/general → instant_python-0.12.0/test/config/domain/mothers}/general_configuration_mother.py +1 -1
  83. {instant_python-0.10.0/test/configuration/git → instant_python-0.12.0/test/config/domain/mothers}/git_configuration_mother.py +1 -1
  84. {instant_python-0.10.0/test/configuration/template → instant_python-0.12.0/test/config/domain/mothers}/template_configuration_mother.py +1 -1
  85. {instant_python-0.10.0/test/configuration/dependency → instant_python-0.12.0/test/config/domain}/test_dependency_configuration.py +2 -4
  86. {instant_python-0.10.0/test/configuration/general → instant_python-0.12.0/test/config/domain}/test_general_configuration.py +2 -6
  87. {instant_python-0.10.0/test/configuration/git → instant_python-0.12.0/test/config/domain}/test_git_configuration.py +2 -4
  88. {instant_python-0.10.0/test/configuration/template → instant_python-0.12.0/test/config/domain}/test_template_configuration.py +2 -8
  89. instant_python-0.12.0/test/config/infra/parser/approved_files/TestParser.test_should_parse_valid_answers.approved.txt +39 -0
  90. instant_python-0.12.0/test/config/infra/parser/test_parser.py +56 -0
  91. instant_python-0.12.0/test/config/infra/writer/test_yaml_config_writer.py +16 -0
  92. instant_python-0.12.0/test/configuration/parser/resources/config.yml +23 -0
  93. instant_python-0.12.0/test/configuration/parser/resources/missing_dependencies_fields_config.yml +21 -0
  94. instant_python-0.12.0/test/configuration/parser/resources/missing_general_fields_config.yml +23 -0
  95. instant_python-0.12.0/test/configuration/parser/resources/missing_git_fields_config.yml +25 -0
  96. instant_python-0.12.0/test/configuration/parser/resources/missing_keys_config.yml +13 -0
  97. instant_python-0.12.0/test/configuration/parser/resources/missing_template_fields_config.yml +23 -0
  98. {instant_python-0.10.0 → instant_python-0.12.0}/test/configuration/parser/test_parser.py +5 -5
  99. instant_python-0.12.0/test/dependency_manager/__init__.py +0 -0
  100. {instant_python-0.10.0 → instant_python-0.12.0}/test/dependency_manager/test_pdm_dependency_manager.py +1 -1
  101. {instant_python-0.10.0 → instant_python-0.12.0}/test/dependency_manager/test_uv_dependency_manager.py +1 -1
  102. instant_python-0.12.0/test/formatter/__init__.py +0 -0
  103. instant_python-0.12.0/test/git/__init__.py +0 -0
  104. {instant_python-0.10.0 → instant_python-0.12.0}/test/git/test_git_configurer.py +1 -1
  105. instant_python-0.12.0/test/project_creator/__init__.py +0 -0
  106. instant_python-0.12.0/test/project_creator/resources/boilerplate/fastapi/__init__.py +0 -0
  107. instant_python-0.12.0/test/project_creator/resources/boilerplate/logger/__init__.py +0 -0
  108. instant_python-0.12.0/test/render/__init__.py +0 -0
  109. instant_python-0.12.0/test/render/approvaltests_config.json +3 -0
  110. {instant_python-0.10.0 → instant_python-0.12.0}/uv.lock +1 -1
  111. instant_python-0.10.0/instant_python/commands/config.py +0 -28
  112. instant_python-0.10.0/instant_python/configuration/dependency/not_dev_dependency_included_in_group.py +0 -8
  113. instant_python-0.10.0/instant_python/configuration/general/invalid_dependency_manager_value.py +0 -8
  114. instant_python-0.10.0/instant_python/configuration/general/invalid_license_value.py +0 -8
  115. instant_python-0.10.0/instant_python/configuration/general/invalid_python_version_value.py +0 -8
  116. instant_python-0.10.0/instant_python/configuration/git/git_user_or_email_not_present.py +0 -8
  117. instant_python-0.10.0/instant_python/configuration/parser/config_key_not_present.py +0 -8
  118. instant_python-0.10.0/instant_python/configuration/parser/empty_configuration_not_allowed.py +0 -8
  119. instant_python-0.10.0/instant_python/configuration/parser/missing_mandatory_fields.py +0 -10
  120. instant_python-0.10.0/instant_python/configuration/question/boolean_question.py +0 -12
  121. instant_python-0.10.0/instant_python/configuration/question/choice_question.py +0 -19
  122. instant_python-0.10.0/instant_python/configuration/question/conditional_question.py +0 -34
  123. instant_python-0.10.0/instant_python/configuration/question/free_text_question.py +0 -14
  124. instant_python-0.10.0/instant_python/configuration/question/multiple_choice_question.py +0 -12
  125. instant_python-0.10.0/instant_python/configuration/question/question.py +0 -22
  126. instant_python-0.10.0/instant_python/configuration/question_wizard.py +0 -14
  127. instant_python-0.10.0/instant_python/configuration/step/dependencies_step.py +0 -70
  128. instant_python-0.10.0/instant_python/configuration/step/general_step.py +0 -67
  129. instant_python-0.10.0/instant_python/configuration/step/git_step.py +0 -41
  130. instant_python-0.10.0/instant_python/configuration/step/template_step.py +0 -62
  131. instant_python-0.10.0/instant_python/configuration/template/bounded_context_not_applicable.py +0 -8
  132. instant_python-0.10.0/instant_python/configuration/template/bounded_context_not_especified.py +0 -8
  133. instant_python-0.10.0/instant_python/configuration/template/invalid_built_in_features_values.py +0 -10
  134. instant_python-0.10.0/instant_python/configuration/template/invalid_template_value.py +0 -8
  135. instant_python-0.10.0/instant_python/templates/boilerplate/exceptions/domain_error.py +0 -6
  136. instant_python-0.10.0/instant_python/templates/boilerplate/exceptions/domain_event_type_not_found_error.py +0 -9
  137. instant_python-0.10.0/instant_python/templates/boilerplate/exceptions/incorrect_value_type_error.py +0 -13
  138. instant_python-0.10.0/instant_python/templates/boilerplate/exceptions/invalid_id_format_error.py +0 -9
  139. instant_python-0.10.0/instant_python/templates/boilerplate/exceptions/invalid_negative_value_error.py +0 -9
  140. instant_python-0.10.0/instant_python/templates/boilerplate/exceptions/rabbit_mq_connection_not_established_error.py +0 -9
  141. instant_python-0.10.0/instant_python/templates/boilerplate/exceptions/required_value_error.py +0 -9
  142. instant_python-0.10.0/instant_python/templates/project_structure/makefile.yml.j2 +0 -29
  143. instant_python-0.10.0/test/configuration/question/test_boolean_question.py +0 -28
  144. instant_python-0.10.0/test/configuration/question/test_choice_question.py +0 -30
  145. instant_python-0.10.0/test/configuration/question/test_free_text_question.py +0 -30
  146. instant_python-0.10.0/test/configuration/question/test_multiple_choice_question.py +0 -31
  147. {instant_python-0.10.0 → instant_python-0.12.0}/.github/FUNDING.yml +0 -0
  148. {instant_python-0.10.0 → instant_python-0.12.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  149. {instant_python-0.10.0 → instant_python-0.12.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  150. {instant_python-0.10.0 → instant_python-0.12.0}/.github/actions/python_setup/action.yml +0 -0
  151. {instant_python-0.10.0 → instant_python-0.12.0}/.github/pull_request_template.md +0 -0
  152. {instant_python-0.10.0 → instant_python-0.12.0}/.github/workflows/ci.yml +0 -0
  153. {instant_python-0.10.0 → instant_python-0.12.0}/.github/workflows/pages.yml +0 -0
  154. {instant_python-0.10.0 → instant_python-0.12.0}/.github/workflows/release.yml +0 -0
  155. {instant_python-0.10.0 → instant_python-0.12.0}/.gitignore +0 -0
  156. {instant_python-0.10.0 → instant_python-0.12.0}/.pre-commit-config.yaml +0 -0
  157. {instant_python-0.10.0 → instant_python-0.12.0}/.python-version +0 -0
  158. {instant_python-0.10.0 → instant_python-0.12.0}/CITATION.cff +0 -0
  159. {instant_python-0.10.0 → instant_python-0.12.0}/LICENSE +0 -0
  160. {instant_python-0.10.0 → instant_python-0.12.0}/README.md +0 -0
  161. {instant_python-0.10.0 → instant_python-0.12.0}/SECURITY.md +0 -0
  162. {instant_python-0.10.0 → instant_python-0.12.0}/codeql-config.yml +0 -0
  163. {instant_python-0.10.0 → instant_python-0.12.0}/docs/assets/favicon.svg +0 -0
  164. {instant_python-0.10.0 → instant_python-0.12.0}/docs/assets/logo.svg +0 -0
  165. {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/.components/changelog_header.md.j2 +0 -0
  166. {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/.components/changelog_init.md.j2 +0 -0
  167. {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/.components/changelog_update.md.j2 +0 -0
  168. {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/.components/changes.md.j2 +0 -0
  169. {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/.components/first_release.md.j2 +0 -0
  170. {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/.components/macros.md.j2 +0 -0
  171. {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/.components/versioned_changes.md.j2 +0 -0
  172. {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/.release_notes.md.j2 +0 -0
  173. {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/CHANGELOG.md.j2 +0 -0
  174. {instant_python-0.10.0 → instant_python-0.12.0}/docs/downloads_macro.py +0 -0
  175. {instant_python-0.10.0 → instant_python-0.12.0}/docs/examples/configuration.md +0 -0
  176. {instant_python-0.10.0 → instant_python-0.12.0}/docs/examples/custom_template.md +0 -0
  177. {instant_python-0.10.0 → instant_python-0.12.0}/docs/guide/command_config.md +0 -0
  178. {instant_python-0.10.0 → instant_python-0.12.0}/docs/guide/command_init.md +0 -0
  179. {instant_python-0.10.0 → instant_python-0.12.0}/docs/home/contributing.md +0 -0
  180. {instant_python-0.10.0 → instant_python-0.12.0}/docs/home/getting_started.md +0 -0
  181. {instant_python-0.10.0 → instant_python-0.12.0}/docs/home/index.md +0 -0
  182. {instant_python-0.10.0 → instant_python-0.12.0}/docs/home/releases.md +0 -0
  183. {instant_python-0.10.0 → instant_python-0.12.0}/docs/home/security.md +0 -0
  184. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/__init__.py +0 -0
  185. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/cli/__init__.py +0 -0
  186. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/cli/instant_python_typer.py +0 -0
  187. {instant_python-0.10.0/instant_python/commands → instant_python-0.12.0/instant_python/config}/__init__.py +0 -0
  188. {instant_python-0.10.0/instant_python/configuration → instant_python-0.12.0/instant_python/config/application}/__init__.py +0 -0
  189. {instant_python-0.10.0/instant_python/configuration/dependency → instant_python-0.12.0/instant_python/config/delivery}/__init__.py +0 -0
  190. {instant_python-0.10.0/instant_python/configuration/general → instant_python-0.12.0/instant_python/config/domain}/__init__.py +0 -0
  191. {instant_python-0.10.0/instant_python/configuration/git → instant_python-0.12.0/instant_python/config/infra}/__init__.py +0 -0
  192. {instant_python-0.10.0/instant_python/configuration → instant_python-0.12.0/instant_python/config/infra}/parser/__init__.py +0 -0
  193. {instant_python-0.10.0/instant_python/configuration/question → instant_python-0.12.0/instant_python/config/infra/question_wizard}/__init__.py +0 -0
  194. {instant_python-0.10.0/instant_python/configuration → instant_python-0.12.0/instant_python/config/infra/question_wizard}/step/__init__.py +0 -0
  195. {instant_python-0.10.0/instant_python/configuration/question → instant_python-0.12.0/instant_python/config/infra/question_wizard/step}/questionary.py +0 -0
  196. {instant_python-0.10.0/instant_python/configuration/template → instant_python-0.12.0/instant_python/config/infra/writer}/__init__.py +0 -0
  197. {instant_python-0.10.0/instant_python/dependency_manager → instant_python-0.12.0/instant_python/configuration}/__init__.py +0 -0
  198. {instant_python-0.10.0/instant_python/formatter → instant_python-0.12.0/instant_python/configuration/parser}/__init__.py +0 -0
  199. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/configuration/parser/configuration_file_not_found.py +0 -0
  200. {instant_python-0.10.0/instant_python/git → instant_python-0.12.0/instant_python/dependency_manager}/__init__.py +0 -0
  201. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/dependency_manager/command_execution_error.py +0 -0
  202. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/dependency_manager/dependency_manager_factory.py +0 -0
  203. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/dependency_manager/unknown_dependency_manager_error.py +0 -0
  204. {instant_python-0.10.0/instant_python/project_creator → instant_python-0.12.0/instant_python/formatter}/__init__.py +0 -0
  205. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/formatter/project_formatter.py +0 -0
  206. {instant_python-0.10.0/instant_python/render → instant_python-0.12.0/instant_python/git}/__init__.py +0 -0
  207. {instant_python-0.10.0/instant_python/shared → instant_python-0.12.0/instant_python/initialize}/__init__.py +0 -0
  208. {instant_python-0.10.0/instant_python/templates/boilerplate/event_bus → instant_python-0.12.0/instant_python/initialize/delivery}/__init__.py +0 -0
  209. instant_python-0.10.0/instant_python/commands/init.py → instant_python-0.12.0/instant_python/initialize/delivery/cli.py +1 -1
  210. {instant_python-0.10.0/instant_python/templates/boilerplate/exceptions → instant_python-0.12.0/instant_python/project_creator}/__init__.py +0 -0
  211. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/project_creator/directory.py +0 -0
  212. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/project_creator/file_has_not_been_created.py +0 -0
  213. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/project_creator/node.py +0 -0
  214. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/project_creator/unknown_node_typer_error.py +0 -0
  215. {instant_python-0.10.0/instant_python/templates/boilerplate/fastapi → instant_python-0.12.0/instant_python/render}/__init__.py +0 -0
  216. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/render/custom_project_renderer.py +0 -0
  217. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/render/jinja_custom_filters.py +0 -0
  218. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/render/jinja_environment.py +0 -0
  219. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/render/template_file_not_found_error.py +0 -0
  220. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/render/unknown_template_error.py +0 -0
  221. {instant_python-0.10.0/instant_python/templates/boilerplate/logger → instant_python-0.12.0/instant_python/shared}/__init__.py +0 -0
  222. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/shared/application_error.py +0 -0
  223. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/shared/error_types.py +0 -0
  224. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/shared/supported_built_in_features.py +0 -0
  225. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/shared/supported_licenses.py +0 -0
  226. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/shared/supported_managers.py +0 -0
  227. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/shared/supported_python_versions.py +0 -0
  228. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/shared/supported_templates.py +0 -0
  229. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/.gitignore +0 -0
  230. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/.pre-commit-config.yml +0 -0
  231. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/.python-version +0 -0
  232. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/CITATION.cff +0 -0
  233. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/LICENSE +0 -0
  234. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/README.md +0 -0
  235. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/SECURITY.md +0 -0
  236. {instant_python-0.10.0/instant_python/templates/boilerplate/persistence → instant_python-0.12.0/instant_python/templates/boilerplate/event_bus}/__init__.py +0 -0
  237. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/domain_event.py +0 -0
  238. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/event_aggregate.py +0 -0
  239. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/exchange_type.py +0 -0
  240. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_queue_formatter.py +0 -0
  241. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_settings.py +0 -0
  242. {instant_python-0.10.0/instant_python/templates/boilerplate/persistence/async → instant_python-0.12.0/instant_python/templates/boilerplate/exceptions}/__init__.py +0 -0
  243. /instant_python-0.10.0/instant_python/templates/boilerplate/exceptions/error.py → /instant_python-0.12.0/instant_python/templates/boilerplate/exceptions/base_error.py +0 -0
  244. {instant_python-0.10.0/instant_python/templates/boilerplate/persistence/synchronous → instant_python-0.12.0/instant_python/templates/boilerplate/fastapi}/__init__.py +0 -0
  245. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/fastapi/error_response.py +0 -0
  246. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/fastapi/success_response.py +0 -0
  247. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/github/action.yml +0 -0
  248. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/github/bug_report.yml +0 -0
  249. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/github/ci.yml +0 -0
  250. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/github/feature_request.yml +0 -0
  251. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/github/release.yml +0 -0
  252. {instant_python-0.10.0/instant_python/templates/boilerplate/value_object → instant_python-0.12.0/instant_python/templates/boilerplate/logger}/__init__.py +0 -0
  253. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/logger/json_formatter.py +0 -0
  254. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/mypy.ini +0 -0
  255. {instant_python-0.10.0/test → instant_python-0.12.0/instant_python/templates/boilerplate/persistence}/__init__.py +0 -0
  256. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/async/README.md +0 -0
  257. {instant_python-0.10.0/test/configuration → instant_python-0.12.0/instant_python/templates/boilerplate/persistence/async}/__init__.py +0 -0
  258. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/async/alembic.ini +0 -0
  259. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/async/postgres_settings.py +0 -0
  260. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/async/script.py.mako +0 -0
  261. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/base.py +0 -0
  262. {instant_python-0.10.0/test/configuration/dependency → instant_python-0.12.0/instant_python/templates/boilerplate/persistence/synchronous}/__init__.py +0 -0
  263. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/pytest.ini +0 -0
  264. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/random_generator.py +0 -0
  265. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/add_dependency.py +0 -0
  266. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/create_aggregate.py +0 -0
  267. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/integration.sh +0 -0
  268. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/local_setup.py +0 -0
  269. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/post-merge.py +0 -0
  270. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/pre-commit.py +0 -0
  271. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/pre-push.py +0 -0
  272. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/remove_dependency.py +0 -0
  273. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/unit.sh +0 -0
  274. {instant_python-0.10.0/test/configuration/general → instant_python-0.12.0/instant_python/templates/boilerplate/value_object}/__init__.py +0 -0
  275. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/validation.py +0 -0
  276. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/value_object.py +0 -0
  277. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/alembic_migrator.yml.j2 +0 -0
  278. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/async_alembic.yml.j2 +0 -0
  279. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/async_sqlalchemy.yml.j2 +0 -0
  280. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/citation.yml.j2 +0 -0
  281. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/clean_architecture/main_structure.yml.j2 +0 -0
  282. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/clean_architecture/source.yml.j2 +0 -0
  283. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/clean_architecture/test.yml.j2 +0 -0
  284. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/domain_driven_design/bounded_context.yml.j2 +0 -0
  285. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/domain_driven_design/main_structure.yml.j2 +0 -0
  286. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/domain_driven_design/source.yml.j2 +0 -0
  287. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/domain_driven_design/test.yml.j2 +0 -0
  288. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/event_bus_domain.yml.j2 +0 -0
  289. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/event_bus_infra.yml.j2 +0 -0
  290. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/fastapi_app.yml.j2 +0 -0
  291. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/fastapi_infra.yml.j2 +0 -0
  292. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/github_action.yml.j2 +0 -0
  293. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/github_issues_template.yml.j2 +0 -0
  294. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/gitignore.yml.j2 +0 -0
  295. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/license.yml.j2 +0 -0
  296. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/logger.yml.j2 +0 -0
  297. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/macros.j2 +0 -0
  298. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/mypy.yml.j2 +0 -0
  299. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/precommit_hook.yml.j2 +0 -0
  300. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/pyproject.yml.j2 +0 -0
  301. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/pytest.yml.j2 +0 -0
  302. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/python_version.yml.j2 +0 -0
  303. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/readme.yml.j2 +0 -0
  304. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/security.yml.j2 +0 -0
  305. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/standard_project/main_structure.yml.j2 +0 -0
  306. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/standard_project/source.yml.j2 +0 -0
  307. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/standard_project/test.yml.j2 +0 -0
  308. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/synchronous_sqlalchemy.yml.j2 +0 -0
  309. {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/test_value_objects.yml.j2 +0 -0
  310. {instant_python-0.10.0 → instant_python-0.12.0}/mkdocs.yml +0 -0
  311. {instant_python-0.10.0 → instant_python-0.12.0}/scripts/add_dependency.py +0 -0
  312. {instant_python-0.10.0 → instant_python-0.12.0}/scripts/remove_dependency.py +0 -0
  313. {instant_python-0.10.0/test/configuration/git → instant_python-0.12.0/test}/__init__.py +0 -0
  314. {instant_python-0.10.0/test/configuration/parser → instant_python-0.12.0/test/config}/__init__.py +0 -0
  315. {instant_python-0.10.0/test/configuration/parser/resources → instant_python-0.12.0/test/config/application}/__init__.py +0 -0
  316. {instant_python-0.10.0/test/configuration/question → instant_python-0.12.0/test/config/domain}/__init__.py +0 -0
  317. {instant_python-0.10.0/test/configuration/template → instant_python-0.12.0/test/config/domain/mothers}/__init__.py +0 -0
  318. {instant_python-0.10.0/test/dependency_manager → instant_python-0.12.0/test/config/infra}/__init__.py +0 -0
  319. {instant_python-0.10.0/test/formatter → instant_python-0.12.0/test/config/infra/parser}/__init__.py +0 -0
  320. {instant_python-0.10.0/test/configuration → instant_python-0.12.0/test/config/infra}/parser/approvaltests_config.json +0 -0
  321. {instant_python-0.10.0/test/git → instant_python-0.12.0/test/config/infra/parser/resources}/__init__.py +0 -0
  322. /instant_python-0.10.0/test/configuration/parser/resources/missing_dependencies_fields_config.yml → /instant_python-0.12.0/test/config/infra/parser/resources/missing_dependencies_fields.yml +0 -0
  323. /instant_python-0.10.0/test/configuration/parser/resources/missing_general_fields_config.yml → /instant_python-0.12.0/test/config/infra/parser/resources/missing_general_fields.yml +0 -0
  324. /instant_python-0.10.0/test/configuration/parser/resources/missing_git_fields_config.yml → /instant_python-0.12.0/test/config/infra/parser/resources/missing_git_fields.yml +0 -0
  325. /instant_python-0.10.0/test/configuration/parser/resources/missing_keys_config.yml → /instant_python-0.12.0/test/config/infra/parser/resources/missing_keys_answers.yml +0 -0
  326. /instant_python-0.10.0/test/configuration/parser/resources/missing_template_fields_config.yml → /instant_python-0.12.0/test/config/infra/parser/resources/missing_template_fields.yml +0 -0
  327. /instant_python-0.10.0/test/configuration/parser/resources/config.yml → /instant_python-0.12.0/test/config/infra/parser/resources/valid_answers.yml +0 -0
  328. {instant_python-0.10.0/test/project_creator → instant_python-0.12.0/test/config/infra/writer}/__init__.py +0 -0
  329. {instant_python-0.10.0/test/project_creator/resources/boilerplate/fastapi → instant_python-0.12.0/test/configuration}/__init__.py +0 -0
  330. {instant_python-0.10.0/test/project_creator/resources/boilerplate/logger → instant_python-0.12.0/test/configuration/parser}/__init__.py +0 -0
  331. {instant_python-0.10.0/test/project_creator → instant_python-0.12.0/test/configuration/parser}/approvaltests_config.json +0 -0
  332. {instant_python-0.10.0 → instant_python-0.12.0}/test/configuration/parser/approved_files/TestParser.test_should_parse_configuration.approved.txt +0 -0
  333. {instant_python-0.10.0/test/render → instant_python-0.12.0/test/configuration/parser/resources}/__init__.py +0 -0
  334. {instant_python-0.10.0 → instant_python-0.12.0}/test/configuration/parser/resources/empty_config.yml +0 -0
  335. {instant_python-0.10.0 → instant_python-0.12.0}/test/dependency_manager/mock_pdm_dependency_manager.py +0 -0
  336. {instant_python-0.10.0 → instant_python-0.12.0}/test/dependency_manager/mock_uv_dependency_manager.py +0 -0
  337. {instant_python-0.10.0 → instant_python-0.12.0}/test/formatter/mock_project_formatter.py +0 -0
  338. {instant_python-0.10.0 → instant_python-0.12.0}/test/formatter/test_project_formatter.py +0 -0
  339. {instant_python-0.10.0 → instant_python-0.12.0}/test/git/mock_git_configurer.py +0 -0
  340. {instant_python-0.10.0/test/render → instant_python-0.12.0/test/project_creator}/approvaltests_config.json +0 -0
  341. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/approved_files/TestFileSystem.test_should_create_file_system_in_disk.rendered_custom_project_structure.json.approved.txt +0 -0
  342. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/approved_files/TestFileSystem.test_should_create_file_system_in_disk.rendered_project_structure.json.approved.txt +0 -0
  343. {instant_python-0.10.0 → instant_python-0.12.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
  344. {instant_python-0.10.0 → instant_python-0.12.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
  345. {instant_python-0.10.0 → instant_python-0.12.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
  346. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/approved_files/TestFileSystem.test_should_create_folders_and_files.approved.txt +0 -0
  347. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/approved_files/TestFileSystem.test_should_generate_file_system_tree.approved.txt +0 -0
  348. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/directory_mother.py +0 -0
  349. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/boilerplate/exceptions/domain_error.py +0 -0
  350. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/boilerplate/exceptions/domain_error_simple.py +0 -0
  351. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/boilerplate/fastapi/application.py +0 -0
  352. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/boilerplate/fastapi/http_response.py +0 -0
  353. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/boilerplate/fastapi/lifespan.py +0 -0
  354. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/boilerplate/logger/logger.py +0 -0
  355. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/boilerplate/persistence/alembic_migrator.py +0 -0
  356. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/clean_architecture/main_structure.yml.j2 +0 -0
  357. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/config.yml +0 -0
  358. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/config_fastapi_with_logger.yml +0 -0
  359. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/config_fastapi_with_migrator.yml +0 -0
  360. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/config_with_only_fastapi.yml +0 -0
  361. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/rendered_custom_project_structure.json +0 -0
  362. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/rendered_project_structure.json +0 -0
  363. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/rendered_project_structure_fastapi_with_logger.json +0 -0
  364. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/rendered_project_structure_fastapi_with_migrator.json +0 -0
  365. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/rendered_project_structure_only_with_fastapi.json +0 -0
  366. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/test_directory.py +0 -0
  367. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/test_file.py +0 -0
  368. {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/test_file_system.py +0 -0
  369. {instant_python-0.10.0 → instant_python-0.12.0}/test/random_generator.py +0 -0
  370. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/approved_files/TestCustomProjectRenderer.test_should_render_custom_template.approved.txt +0 -0
  371. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/approved_files/TestJinjaProjectRenderer.test_should_render_template_for.clean_architecture_config.yml.approved.txt +0 -0
  372. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/approved_files/TestJinjaProjectRenderer.test_should_render_template_for.domain_driven_design_config.yml.approved.txt +0 -0
  373. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/approved_files/TestJinjaProjectRenderer.test_should_render_template_for.received.txt +0 -0
  374. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/approved_files/TestJinjaProjectRenderer.test_should_render_template_for.standard_project_with_dependency_config.yml.approved.txt +0 -0
  375. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/approved_files/TestJinjaProjectRenderer.test_should_render_template_for.standard_project_with_git_config.yml.approved.txt +0 -0
  376. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/clean_architecture/main_structure.yml.j2 +0 -0
  377. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/clean_architecture_config.yml +0 -0
  378. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/custom_template.yml +0 -0
  379. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/domain_driven_design/main_structure.yml.j2 +0 -0
  380. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/domain_driven_design_config.yml +0 -0
  381. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/standard_project/main_structure.yml.j2 +0 -0
  382. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/standard_project_with_dependency_config.yml +0 -0
  383. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/standard_project_with_git_config.yml +0 -0
  384. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/test_template.j2 +0 -0
  385. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/test_custom_project_renderer.py +0 -0
  386. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/test_jinja_environment.py +0 -0
  387. {instant_python-0.10.0 → instant_python-0.12.0}/test/render/test_jinja_project_renderer.py +0 -0
  388. {instant_python-0.10.0 → instant_python-0.12.0}/tox.ini +0 -0
@@ -2,6 +2,162 @@
2
2
 
3
3
  <!-- version list -->
4
4
 
5
+ ## v0.12.0 (2025-10-23)
6
+
7
+ ### ✨ Features
8
+
9
+ - **initialize**: Move init command cli to its own folder for hexagonal architecture
10
+ ([`3101896`](https://github.com/dimanu-py/instant-python/commit/310189634553c297095d8f3bd40fcd32cc87228f))
11
+
12
+ - **config**: Implement YAML config writer to save configuration to file
13
+ ([`99b2e5e`](https://github.com/dimanu-py/instant-python/commit/99b2e5ed5ac0aea6859dc852a5bf5ed15e34f659))
14
+
15
+ - **config**: Return parsed configuration
16
+ ([`330dc00`](https://github.com/dimanu-py/instant-python/commit/330dc0056fdef9ae9fc983ab9cbe080c8fc27fca))
17
+
18
+ - **config**: Add parsing logic for template section in configuration
19
+ ([`9f9e83a`](https://github.com/dimanu-py/instant-python/commit/9f9e83a5c684c634cb00826fe57db98dcdaee45b))
20
+
21
+ - **config**: Add parsing logic for git section in configuration
22
+ ([`818febc`](https://github.com/dimanu-py/instant-python/commit/818febc61febbc509caf1a9ec2946f3d71ff6eb3))
23
+
24
+ - **config**: Add parsing logic for dependencies section in configuration
25
+ ([`b6fec2a`](https://github.com/dimanu-py/instant-python/commit/b6fec2a4c2d7b9773b7bca1707acf6193e0dd986))
26
+
27
+ - **config**: Implement logic to parse general section of config
28
+ ([`e6ef56c`](https://github.com/dimanu-py/instant-python/commit/e6ef56c2988e8af8d0a9ffadcc882c643a2e580e))
29
+
30
+ - **config**: Validate required configuration keys and raise appropriate exceptions
31
+ ([`697b115`](https://github.com/dimanu-py/instant-python/commit/697b1153472189ae7dd8b58825830644282ef9bc))
32
+
33
+ - **config**: Raise EmptyConfigurationNotAllowed for empty content in parse method
34
+ ([`b3f51e4`](https://github.com/dimanu-py/instant-python/commit/b3f51e4a5dd483d4a2f3fa58c2e4b3b035dec1ca))
35
+
36
+ - **config**: Inject ConfigParser port into ConfigGenerator use case
37
+ ([`4f0a8f6`](https://github.com/dimanu-py/instant-python/commit/4f0a8f6be698c54b1ae75755a4807c6c8184c9d4))
38
+
39
+ - **config**: Define ConfigParser interface as driver port
40
+ ([`59ec2b9`](https://github.com/dimanu-py/instant-python/commit/59ec2b9c5c3ffb145547b98c06721c8121cab907))
41
+
42
+ - **config**: Extend QuestionaryQuestionWizard to inherit from QuestionWizard
43
+ ([`ed3674c`](https://github.com/dimanu-py/instant-python/commit/ed3674c41547504a95817498c759324a7607700d))
44
+
45
+ - **config**: Add abstract QuestionWizard class for question handling
46
+ ([`abb9a22`](https://github.com/dimanu-py/instant-python/commit/abb9a226be6f257ed5924fe935ccbfae338e9c10))
47
+
48
+ - **config**: Implement execute method for configuration generation
49
+ ([`936b2c6`](https://github.com/dimanu-py/instant-python/commit/936b2c61fc69c013e618093bfa62e8599876f2d7))
50
+
51
+ - **config**: Create ConfigGenerator class for configuration generation
52
+ ([`377564e`](https://github.com/dimanu-py/instant-python/commit/377564e5e9057c79f2f07b0889bae55f749e8981))
53
+
54
+ - **config**: Create yaml writer interface
55
+ ([`4e6f3b5`](https://github.com/dimanu-py/instant-python/commit/4e6f3b5a29a7970f67836bb18c07349cc0a93897))
56
+
57
+ ### 🪲 Bug Fixes
58
+
59
+ - **templates**: Point to correct base error template file when including fastapi built in feature
60
+ ([`c2ce3f3`](https://github.com/dimanu-py/instant-python/commit/c2ce3f35a1eb9cb268906e78990abd7c25604955))
61
+
62
+ - **cli**: Correct import for new place of config command
63
+ ([`f23b0fc`](https://github.com/dimanu-py/instant-python/commit/f23b0fc3204483bbac44c87fd70611e742c50c61))
64
+
65
+ ### ⚙️ Build System
66
+
67
+ - Update audit make command to ignore pip vulnerability
68
+ ([`963d5f6`](https://github.com/dimanu-py/instant-python/commit/963d5f6c0fdbc9528cd90489429db692a36fb8c5))
69
+
70
+ - Exclude resources folders from mypy analysis
71
+ ([`7f2b3b8`](https://github.com/dimanu-py/instant-python/commit/7f2b3b818d4b608aa466e50d9dfdedd42e6af4f7))
72
+
73
+ ### ♻️ Refactoring
74
+
75
+ - **config**: Instantiate question wizard steps inside directly coupling them
76
+ ([`8785304`](https://github.com/dimanu-py/instant-python/commit/8785304b744f9dba777e2518014e4a40146753c0))
77
+
78
+ - **config**: Remove complex class hierarchy for different types of questions and streamline
79
+ questions using questionary wrapper
80
+ ([`35e266b`](https://github.com/dimanu-py/instant-python/commit/35e266bfb3afc97b88f6432e08463a80553ff32b))
81
+
82
+ - **config**: Streamline dependency installation questions in CLI
83
+ ([`33f0bd6`](https://github.com/dimanu-py/instant-python/commit/33f0bd6d95d7aa0d9c87a74c2a5e0a638b1541a1))
84
+
85
+ - **config**: Modify cli application to use new config generator use case
86
+ ([`530fe7e`](https://github.com/dimanu-py/instant-python/commit/530fe7e47ed7f9fb81077c4efdbe31c0967e339c))
87
+
88
+ - **config**: Move question wizard concrete implementation to new infra folder in config command
89
+ ([`0f8b481`](https://github.com/dimanu-py/instant-python/commit/0f8b48128eb97fb1c8ed54852307cb995c183739))
90
+
91
+ - **config**: Turn config file path attribute to public
92
+ ([`8fa7f3e`](https://github.com/dimanu-py/instant-python/commit/8fa7f3e6aa31e287b050601732db1ecd7260e325))
93
+
94
+ - **config**: Clean up parser tests adding setup_method
95
+ ([`eb3c095`](https://github.com/dimanu-py/instant-python/commit/eb3c0958b36bb161ff7874458761b1c1871e1db4))
96
+
97
+ - **config**: Move config parsing errors to new architecture and to errors file
98
+ ([`c18a969`](https://github.com/dimanu-py/instant-python/commit/c18a96965d35faa1a8e735974e3e1e9c8ae64810))
99
+
100
+ - **config**: Extract string values to constants
101
+ ([`49ac047`](https://github.com/dimanu-py/instant-python/commit/49ac04775ca140464eb8f79a246bed63fe6cd9b4))
102
+
103
+ - **config**: Extract semantic methods for better readability in parser
104
+ ([`42cc355`](https://github.com/dimanu-py/instant-python/commit/42cc35588acb3ef256d22bbf9062b9d367e28f0a))
105
+
106
+ - **config**: Decouple configuration generation from specific schema classes validating answers with
107
+ parser
108
+ ([`2a3bea5`](https://github.com/dimanu-py/instant-python/commit/2a3bea55ae87317580012ab6eb940675c6089c4a))
109
+
110
+ - **config**: Rename QuestionaryQuestionWizard to QuestionaryConsoleWizard
111
+ ([`66a6671`](https://github.com/dimanu-py/instant-python/commit/66a6671f9765ca91836229d3c32c4c21ba6ecc4d))
112
+
113
+ - **config**: Apply dependency inversion to ConfigGenerator constructor
114
+ ([`8ae285f`](https://github.com/dimanu-py/instant-python/commit/8ae285f2d0c26e03513ac874435dbc100360cea0))
115
+
116
+ - **config**: Rename YamlWriter interface to ConfigWriter
117
+ ([`4921828`](https://github.com/dimanu-py/instant-python/commit/4921828e171c8e999c643da1df583b1c4bfa3d43))
118
+
119
+ - **config**: Update test to use QuestionWizard instead of QuestionaryQuestionWizard for mock
120
+ ([`00fb764`](https://github.com/dimanu-py/instant-python/commit/00fb764239ed6fffa94ec211bc32b544d407cf4a))
121
+
122
+ - **config**: Rename QuestionWizard to QuestionaryQuestionWizard to express its implementation uses
123
+ questionary
124
+ ([`74d124d`](https://github.com/dimanu-py/instant-python/commit/74d124d68318fa333cb48f98aa43c6f59667a6c1))
125
+
126
+ - **config**: Structure tests for config domain following same structure as source
127
+ ([`eafda5e`](https://github.com/dimanu-py/instant-python/commit/eafda5e240b84483962daeed5d5c85b3354b2a15))
128
+
129
+ - **config**: Move domain classes for config command to domain module
130
+ ([`c6aa3ad`](https://github.com/dimanu-py/instant-python/commit/c6aa3ad5f5649fc4f3dd61d9d02fc9d0de70a7ca))
131
+
132
+ - **commands**: Move cli application for 'config' command to specific module config that will follow
133
+ hexagonal architecture to reduce coupling
134
+ ([`a1fa9ab`](https://github.com/dimanu-py/instant-python/commit/a1fa9ab605a0fe622e529f086352d5eefc3b8ece))
135
+
136
+
137
+ ## v0.11.0 (2025-09-30)
138
+
139
+ ### ✨ Features
140
+
141
+ - **templates**: Add ruff linter and formatter rules in pyproject.toml template file
142
+ ([`b600f62`](https://github.com/dimanu-py/instant-python/commit/b600f62ab807d0ed5309ee199fd6b772dad55317))
143
+
144
+ ### 🪲 Bug Fixes
145
+
146
+ - **templates**: Correct imports when selected template was standard project
147
+ ([`4d8bda4`](https://github.com/dimanu-py/instant-python/commit/4d8bda4fb246a59e5556c78b5317845614e3f8b5))
148
+
149
+ ### ♻️ Refactoring
150
+
151
+ - **templates**: Modify makefile template file simplifying add-dep and remove-dep commands
152
+ ([`eb883f3`](https://github.com/dimanu-py/instant-python/commit/eb883f31aba41faf8b38908317ea02b53e700874))
153
+
154
+ - **templates**: Rename template file for base error
155
+ ([`3a30d3d`](https://github.com/dimanu-py/instant-python/commit/3a30d3d3533bc88fe70f0822f204d34e3ad4280a))
156
+
157
+ - **commands**: Move ipy configuration file to project folder before creating first commit
158
+ ([`8997e98`](https://github.com/dimanu-py/instant-python/commit/8997e984b2384e70ca2418e4cf7eb21aa3d7bdad))
159
+
160
+
5
161
  ## v0.10.0 (2025-09-30)
6
162
 
7
163
  ### ✨ Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: instant-python
3
- Version: 0.10.0
3
+ Version: 0.12.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/
@@ -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
+ )