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.
- {instant_python-0.10.0 → instant_python-0.12.0}/CHANGELOG.md +156 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/PKG-INFO +1 -1
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/cli/cli.py +2 -1
- instant_python-0.12.0/instant_python/config/application/config_generator.py +15 -0
- instant_python-0.12.0/instant_python/config/delivery/cli.py +19 -0
- instant_python-0.12.0/instant_python/config/domain/config_parser.py +9 -0
- instant_python-0.12.0/instant_python/config/domain/config_writer.py +9 -0
- {instant_python-0.10.0/instant_python/configuration → instant_python-0.12.0/instant_python/config/domain}/configuration_schema.py +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
- {instant_python-0.10.0/instant_python/configuration/general → instant_python-0.12.0/instant_python/config/domain}/general_configuration.py +20 -9
- {instant_python-0.10.0/instant_python/configuration/git → instant_python-0.12.0/instant_python/config/domain}/git_configuration.py +8 -3
- instant_python-0.12.0/instant_python/config/domain/question_wizard.py +7 -0
- {instant_python-0.10.0/instant_python/configuration/template → instant_python-0.12.0/instant_python/config/domain}/template_configuration.py +28 -12
- instant_python-0.12.0/instant_python/config/infra/parser/errors.py +25 -0
- instant_python-0.12.0/instant_python/config/infra/parser/parser.py +91 -0
- instant_python-0.12.0/instant_python/config/infra/question_wizard/questionary_console_wizard.py +25 -0
- instant_python-0.12.0/instant_python/config/infra/question_wizard/step/dependencies_step.py +64 -0
- instant_python-0.12.0/instant_python/config/infra/question_wizard/step/general_step.py +81 -0
- instant_python-0.12.0/instant_python/config/infra/question_wizard/step/git_step.py +41 -0
- {instant_python-0.10.0/instant_python/configuration → instant_python-0.12.0/instant_python/config/infra/question_wizard}/step/steps.py +1 -1
- instant_python-0.12.0/instant_python/config/infra/question_wizard/step/template_step.py +63 -0
- instant_python-0.12.0/instant_python/config/infra/writer/yaml_config_writer.py +13 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/configuration/parser/parser.py +10 -12
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/dependency_manager/dependency_manager.py +1 -1
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/dependency_manager/pdm_dependency_manager.py +1 -1
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/dependency_manager/uv_dependency_manager.py +1 -1
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/git/git_configurer.py +1 -1
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/project_creator/file.py +1 -1
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/project_creator/file_system.py +1 -1
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/render/jinja_project_renderer.py +1 -1
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/domain_event_json_deserializer.py +11 -1
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/domain_event_json_serializer.py +4 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/domain_event_subscriber.py +9 -1
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/event_bus.py +4 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/mock_event_bus.py +5 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_configurer.py +16 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_connection.py +14 -1
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_consumer.py +19 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_event_bus.py +14 -0
- instant_python-0.12.0/instant_python/templates/boilerplate/exceptions/domain_error.py +11 -0
- instant_python-0.12.0/instant_python/templates/boilerplate/exceptions/domain_event_type_not_found_error.py +10 -0
- instant_python-0.12.0/instant_python/templates/boilerplate/exceptions/incorrect_value_type_error.py +15 -0
- instant_python-0.12.0/instant_python/templates/boilerplate/exceptions/invalid_id_format_error.py +11 -0
- instant_python-0.12.0/instant_python/templates/boilerplate/exceptions/invalid_negative_value_error.py +11 -0
- instant_python-0.12.0/instant_python/templates/boilerplate/exceptions/rabbit_mq_connection_not_established_error.py +12 -0
- instant_python-0.12.0/instant_python/templates/boilerplate/exceptions/required_value_error.py +11 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/fastapi/application.py +9 -2
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/fastapi/error_handlers.py +14 -2
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/fastapi/fastapi_log_middleware.py +4 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/fastapi/lifespan.py +4 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/logger/file_logger.py +4 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/logger/file_rotating_handler.py +4 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/alembic_migrator.py +4 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/async/async_engine_fixture.py +4 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/async/env.py +4 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/async/models_metadata.py +4 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/async/sqlalchemy_repository.py +10 -2
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/synchronous/session_maker.py +6 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/synchronous/sqlalchemy_repository.py +11 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/pyproject.toml +16 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/insert_template.py +3 -3
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/makefile +4 -4
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/aggregate.py +4 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/int_primitives_mother.py +4 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/int_value_object.py +8 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/string_primitives_mother.py +4 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/string_value_object.py +7 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/test_int_value_object.py +16 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/test_string_value_object.py +13 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/test_uuid_value_object.py +16 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/uuid.py +8 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/uuid_primitives_mother.py +4 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/fastapi_domain.yml.j2 +1 -1
- instant_python-0.12.0/instant_python/templates/project_structure/makefile.yml.j2 +3 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/value_objects.yml.j2 +1 -1
- {instant_python-0.10.0 → instant_python-0.12.0}/makefile +1 -1
- {instant_python-0.10.0 → instant_python-0.12.0}/mypy.ini +1 -1
- {instant_python-0.10.0 → instant_python-0.12.0}/pyproject.toml +1 -1
- instant_python-0.12.0/test/config/application/test_config_generator.py +32 -0
- instant_python-0.12.0/test/config/domain/mothers/configuration_schema_mother.py +16 -0
- {instant_python-0.10.0/test/configuration/dependency → instant_python-0.12.0/test/config/domain/mothers}/dependency_configuration_mother.py +1 -1
- {instant_python-0.10.0/test/configuration/general → instant_python-0.12.0/test/config/domain/mothers}/general_configuration_mother.py +1 -1
- {instant_python-0.10.0/test/configuration/git → instant_python-0.12.0/test/config/domain/mothers}/git_configuration_mother.py +1 -1
- {instant_python-0.10.0/test/configuration/template → instant_python-0.12.0/test/config/domain/mothers}/template_configuration_mother.py +1 -1
- {instant_python-0.10.0/test/configuration/dependency → instant_python-0.12.0/test/config/domain}/test_dependency_configuration.py +2 -4
- {instant_python-0.10.0/test/configuration/general → instant_python-0.12.0/test/config/domain}/test_general_configuration.py +2 -6
- {instant_python-0.10.0/test/configuration/git → instant_python-0.12.0/test/config/domain}/test_git_configuration.py +2 -4
- {instant_python-0.10.0/test/configuration/template → instant_python-0.12.0/test/config/domain}/test_template_configuration.py +2 -8
- instant_python-0.12.0/test/config/infra/parser/approved_files/TestParser.test_should_parse_valid_answers.approved.txt +39 -0
- instant_python-0.12.0/test/config/infra/parser/test_parser.py +56 -0
- instant_python-0.12.0/test/config/infra/writer/test_yaml_config_writer.py +16 -0
- instant_python-0.12.0/test/configuration/parser/resources/config.yml +23 -0
- instant_python-0.12.0/test/configuration/parser/resources/missing_dependencies_fields_config.yml +21 -0
- instant_python-0.12.0/test/configuration/parser/resources/missing_general_fields_config.yml +23 -0
- instant_python-0.12.0/test/configuration/parser/resources/missing_git_fields_config.yml +25 -0
- instant_python-0.12.0/test/configuration/parser/resources/missing_keys_config.yml +13 -0
- instant_python-0.12.0/test/configuration/parser/resources/missing_template_fields_config.yml +23 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/configuration/parser/test_parser.py +5 -5
- instant_python-0.12.0/test/dependency_manager/__init__.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/dependency_manager/test_pdm_dependency_manager.py +1 -1
- {instant_python-0.10.0 → instant_python-0.12.0}/test/dependency_manager/test_uv_dependency_manager.py +1 -1
- instant_python-0.12.0/test/formatter/__init__.py +0 -0
- instant_python-0.12.0/test/git/__init__.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/git/test_git_configurer.py +1 -1
- instant_python-0.12.0/test/project_creator/__init__.py +0 -0
- instant_python-0.12.0/test/project_creator/resources/boilerplate/fastapi/__init__.py +0 -0
- instant_python-0.12.0/test/project_creator/resources/boilerplate/logger/__init__.py +0 -0
- instant_python-0.12.0/test/render/__init__.py +0 -0
- instant_python-0.12.0/test/render/approvaltests_config.json +3 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/uv.lock +1 -1
- instant_python-0.10.0/instant_python/commands/config.py +0 -28
- instant_python-0.10.0/instant_python/configuration/dependency/not_dev_dependency_included_in_group.py +0 -8
- instant_python-0.10.0/instant_python/configuration/general/invalid_dependency_manager_value.py +0 -8
- instant_python-0.10.0/instant_python/configuration/general/invalid_license_value.py +0 -8
- instant_python-0.10.0/instant_python/configuration/general/invalid_python_version_value.py +0 -8
- instant_python-0.10.0/instant_python/configuration/git/git_user_or_email_not_present.py +0 -8
- instant_python-0.10.0/instant_python/configuration/parser/config_key_not_present.py +0 -8
- instant_python-0.10.0/instant_python/configuration/parser/empty_configuration_not_allowed.py +0 -8
- instant_python-0.10.0/instant_python/configuration/parser/missing_mandatory_fields.py +0 -10
- instant_python-0.10.0/instant_python/configuration/question/boolean_question.py +0 -12
- instant_python-0.10.0/instant_python/configuration/question/choice_question.py +0 -19
- instant_python-0.10.0/instant_python/configuration/question/conditional_question.py +0 -34
- instant_python-0.10.0/instant_python/configuration/question/free_text_question.py +0 -14
- instant_python-0.10.0/instant_python/configuration/question/multiple_choice_question.py +0 -12
- instant_python-0.10.0/instant_python/configuration/question/question.py +0 -22
- instant_python-0.10.0/instant_python/configuration/question_wizard.py +0 -14
- instant_python-0.10.0/instant_python/configuration/step/dependencies_step.py +0 -70
- instant_python-0.10.0/instant_python/configuration/step/general_step.py +0 -67
- instant_python-0.10.0/instant_python/configuration/step/git_step.py +0 -41
- instant_python-0.10.0/instant_python/configuration/step/template_step.py +0 -62
- instant_python-0.10.0/instant_python/configuration/template/bounded_context_not_applicable.py +0 -8
- instant_python-0.10.0/instant_python/configuration/template/bounded_context_not_especified.py +0 -8
- instant_python-0.10.0/instant_python/configuration/template/invalid_built_in_features_values.py +0 -10
- instant_python-0.10.0/instant_python/configuration/template/invalid_template_value.py +0 -8
- instant_python-0.10.0/instant_python/templates/boilerplate/exceptions/domain_error.py +0 -6
- instant_python-0.10.0/instant_python/templates/boilerplate/exceptions/domain_event_type_not_found_error.py +0 -9
- instant_python-0.10.0/instant_python/templates/boilerplate/exceptions/incorrect_value_type_error.py +0 -13
- instant_python-0.10.0/instant_python/templates/boilerplate/exceptions/invalid_id_format_error.py +0 -9
- instant_python-0.10.0/instant_python/templates/boilerplate/exceptions/invalid_negative_value_error.py +0 -9
- instant_python-0.10.0/instant_python/templates/boilerplate/exceptions/rabbit_mq_connection_not_established_error.py +0 -9
- instant_python-0.10.0/instant_python/templates/boilerplate/exceptions/required_value_error.py +0 -9
- instant_python-0.10.0/instant_python/templates/project_structure/makefile.yml.j2 +0 -29
- instant_python-0.10.0/test/configuration/question/test_boolean_question.py +0 -28
- instant_python-0.10.0/test/configuration/question/test_choice_question.py +0 -30
- instant_python-0.10.0/test/configuration/question/test_free_text_question.py +0 -30
- instant_python-0.10.0/test/configuration/question/test_multiple_choice_question.py +0 -31
- {instant_python-0.10.0 → instant_python-0.12.0}/.github/FUNDING.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/.github/actions/python_setup/action.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/.github/pull_request_template.md +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/.github/workflows/ci.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/.github/workflows/pages.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/.github/workflows/release.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/.gitignore +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/.pre-commit-config.yaml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/.python-version +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/CITATION.cff +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/LICENSE +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/README.md +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/SECURITY.md +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/codeql-config.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/assets/favicon.svg +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/assets/logo.svg +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/.components/changelog_header.md.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/.components/changelog_init.md.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/.components/changelog_update.md.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/.components/changes.md.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/.components/first_release.md.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/.components/macros.md.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/.components/versioned_changes.md.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/.release_notes.md.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/changelog/CHANGELOG.md.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/downloads_macro.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/examples/configuration.md +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/examples/custom_template.md +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/guide/command_config.md +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/guide/command_init.md +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/home/contributing.md +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/home/getting_started.md +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/home/index.md +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/home/releases.md +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/docs/home/security.md +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/__init__.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/cli/__init__.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/cli/instant_python_typer.py +0 -0
- {instant_python-0.10.0/instant_python/commands → instant_python-0.12.0/instant_python/config}/__init__.py +0 -0
- {instant_python-0.10.0/instant_python/configuration → instant_python-0.12.0/instant_python/config/application}/__init__.py +0 -0
- {instant_python-0.10.0/instant_python/configuration/dependency → instant_python-0.12.0/instant_python/config/delivery}/__init__.py +0 -0
- {instant_python-0.10.0/instant_python/configuration/general → instant_python-0.12.0/instant_python/config/domain}/__init__.py +0 -0
- {instant_python-0.10.0/instant_python/configuration/git → instant_python-0.12.0/instant_python/config/infra}/__init__.py +0 -0
- {instant_python-0.10.0/instant_python/configuration → instant_python-0.12.0/instant_python/config/infra}/parser/__init__.py +0 -0
- {instant_python-0.10.0/instant_python/configuration/question → instant_python-0.12.0/instant_python/config/infra/question_wizard}/__init__.py +0 -0
- {instant_python-0.10.0/instant_python/configuration → instant_python-0.12.0/instant_python/config/infra/question_wizard}/step/__init__.py +0 -0
- {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
- {instant_python-0.10.0/instant_python/configuration/template → instant_python-0.12.0/instant_python/config/infra/writer}/__init__.py +0 -0
- {instant_python-0.10.0/instant_python/dependency_manager → instant_python-0.12.0/instant_python/configuration}/__init__.py +0 -0
- {instant_python-0.10.0/instant_python/formatter → instant_python-0.12.0/instant_python/configuration/parser}/__init__.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/configuration/parser/configuration_file_not_found.py +0 -0
- {instant_python-0.10.0/instant_python/git → instant_python-0.12.0/instant_python/dependency_manager}/__init__.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/dependency_manager/command_execution_error.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/dependency_manager/dependency_manager_factory.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/dependency_manager/unknown_dependency_manager_error.py +0 -0
- {instant_python-0.10.0/instant_python/project_creator → instant_python-0.12.0/instant_python/formatter}/__init__.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/formatter/project_formatter.py +0 -0
- {instant_python-0.10.0/instant_python/render → instant_python-0.12.0/instant_python/git}/__init__.py +0 -0
- {instant_python-0.10.0/instant_python/shared → instant_python-0.12.0/instant_python/initialize}/__init__.py +0 -0
- {instant_python-0.10.0/instant_python/templates/boilerplate/event_bus → instant_python-0.12.0/instant_python/initialize/delivery}/__init__.py +0 -0
- instant_python-0.10.0/instant_python/commands/init.py → instant_python-0.12.0/instant_python/initialize/delivery/cli.py +1 -1
- {instant_python-0.10.0/instant_python/templates/boilerplate/exceptions → instant_python-0.12.0/instant_python/project_creator}/__init__.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/project_creator/directory.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/project_creator/file_has_not_been_created.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/project_creator/node.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/project_creator/unknown_node_typer_error.py +0 -0
- {instant_python-0.10.0/instant_python/templates/boilerplate/fastapi → instant_python-0.12.0/instant_python/render}/__init__.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/render/custom_project_renderer.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/render/jinja_custom_filters.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/render/jinja_environment.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/render/template_file_not_found_error.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/render/unknown_template_error.py +0 -0
- {instant_python-0.10.0/instant_python/templates/boilerplate/logger → instant_python-0.12.0/instant_python/shared}/__init__.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/shared/application_error.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/shared/error_types.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/shared/supported_built_in_features.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/shared/supported_licenses.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/shared/supported_managers.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/shared/supported_python_versions.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/shared/supported_templates.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/.gitignore +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/.pre-commit-config.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/.python-version +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/CITATION.cff +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/LICENSE +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/README.md +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/SECURITY.md +0 -0
- {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
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/domain_event.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/event_aggregate.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/exchange_type.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_queue_formatter.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/event_bus/rabbit_mq_settings.py +0 -0
- {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
- /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
- {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
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/fastapi/error_response.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/fastapi/success_response.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/github/action.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/github/bug_report.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/github/ci.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/github/feature_request.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/github/release.yml +0 -0
- {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
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/logger/json_formatter.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/mypy.ini +0 -0
- {instant_python-0.10.0/test → instant_python-0.12.0/instant_python/templates/boilerplate/persistence}/__init__.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/async/README.md +0 -0
- {instant_python-0.10.0/test/configuration → instant_python-0.12.0/instant_python/templates/boilerplate/persistence/async}/__init__.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/async/alembic.ini +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/async/postgres_settings.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/async/script.py.mako +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/persistence/base.py +0 -0
- {instant_python-0.10.0/test/configuration/dependency → instant_python-0.12.0/instant_python/templates/boilerplate/persistence/synchronous}/__init__.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/pytest.ini +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/random_generator.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/add_dependency.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/create_aggregate.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/integration.sh +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/local_setup.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/post-merge.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/pre-commit.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/pre-push.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/remove_dependency.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/scripts/unit.sh +0 -0
- {instant_python-0.10.0/test/configuration/general → instant_python-0.12.0/instant_python/templates/boilerplate/value_object}/__init__.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/validation.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/boilerplate/value_object/value_object.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/alembic_migrator.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/async_alembic.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/async_sqlalchemy.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/citation.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/clean_architecture/main_structure.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/clean_architecture/source.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/clean_architecture/test.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/domain_driven_design/bounded_context.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/domain_driven_design/main_structure.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/domain_driven_design/source.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/domain_driven_design/test.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/event_bus_domain.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/event_bus_infra.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/fastapi_app.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/fastapi_infra.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/github_action.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/github_issues_template.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/gitignore.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/license.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/logger.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/macros.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/mypy.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/precommit_hook.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/pyproject.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/pytest.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/python_version.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/readme.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/security.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/standard_project/main_structure.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/standard_project/source.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/standard_project/test.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/synchronous_sqlalchemy.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/instant_python/templates/project_structure/test_value_objects.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/mkdocs.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/scripts/add_dependency.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/scripts/remove_dependency.py +0 -0
- {instant_python-0.10.0/test/configuration/git → instant_python-0.12.0/test}/__init__.py +0 -0
- {instant_python-0.10.0/test/configuration/parser → instant_python-0.12.0/test/config}/__init__.py +0 -0
- {instant_python-0.10.0/test/configuration/parser/resources → instant_python-0.12.0/test/config/application}/__init__.py +0 -0
- {instant_python-0.10.0/test/configuration/question → instant_python-0.12.0/test/config/domain}/__init__.py +0 -0
- {instant_python-0.10.0/test/configuration/template → instant_python-0.12.0/test/config/domain/mothers}/__init__.py +0 -0
- {instant_python-0.10.0/test/dependency_manager → instant_python-0.12.0/test/config/infra}/__init__.py +0 -0
- {instant_python-0.10.0/test/formatter → instant_python-0.12.0/test/config/infra/parser}/__init__.py +0 -0
- {instant_python-0.10.0/test/configuration → instant_python-0.12.0/test/config/infra}/parser/approvaltests_config.json +0 -0
- {instant_python-0.10.0/test/git → instant_python-0.12.0/test/config/infra/parser/resources}/__init__.py +0 -0
- /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
- /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
- /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
- /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
- /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
- /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
- {instant_python-0.10.0/test/project_creator → instant_python-0.12.0/test/config/infra/writer}/__init__.py +0 -0
- {instant_python-0.10.0/test/project_creator/resources/boilerplate/fastapi → instant_python-0.12.0/test/configuration}/__init__.py +0 -0
- {instant_python-0.10.0/test/project_creator/resources/boilerplate/logger → instant_python-0.12.0/test/configuration/parser}/__init__.py +0 -0
- {instant_python-0.10.0/test/project_creator → instant_python-0.12.0/test/configuration/parser}/approvaltests_config.json +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/configuration/parser/approved_files/TestParser.test_should_parse_configuration.approved.txt +0 -0
- {instant_python-0.10.0/test/render → instant_python-0.12.0/test/configuration/parser/resources}/__init__.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/configuration/parser/resources/empty_config.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/dependency_manager/mock_pdm_dependency_manager.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/dependency_manager/mock_uv_dependency_manager.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/formatter/mock_project_formatter.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/formatter/test_project_formatter.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/git/mock_git_configurer.py +0 -0
- {instant_python-0.10.0/test/render → instant_python-0.12.0/test/project_creator}/approvaltests_config.json +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/directory_mother.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/boilerplate/exceptions/domain_error.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/boilerplate/exceptions/domain_error_simple.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/boilerplate/fastapi/application.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/boilerplate/fastapi/http_response.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/boilerplate/fastapi/lifespan.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/boilerplate/logger/logger.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/boilerplate/persistence/alembic_migrator.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/clean_architecture/main_structure.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/config.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/config_fastapi_with_logger.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/config_fastapi_with_migrator.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/config_with_only_fastapi.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/rendered_custom_project_structure.json +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/rendered_project_structure.json +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/rendered_project_structure_fastapi_with_logger.json +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/rendered_project_structure_fastapi_with_migrator.json +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/resources/rendered_project_structure_only_with_fastapi.json +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/test_directory.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/test_file.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/project_creator/test_file_system.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/random_generator.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/render/approved_files/TestCustomProjectRenderer.test_should_render_custom_template.approved.txt +0 -0
- {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
- {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
- {instant_python-0.10.0 → instant_python-0.12.0}/test/render/approved_files/TestJinjaProjectRenderer.test_should_render_template_for.received.txt +0 -0
- {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
- {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
- {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/clean_architecture/main_structure.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/clean_architecture_config.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/custom_template.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/domain_driven_design/main_structure.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/domain_driven_design_config.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/standard_project/main_structure.yml.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/standard_project_with_dependency_config.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/standard_project_with_git_config.yml +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/render/resources/test_template.j2 +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/render/test_custom_project_renderer.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/render/test_jinja_environment.py +0 -0
- {instant_python-0.10.0 → instant_python-0.12.0}/test/render/test_jinja_project_renderer.py +0 -0
- {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.
|
|
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.
|
|
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
|
|
@@ -5,14 +5,14 @@ from typing import TypedDict, Union
|
|
|
5
5
|
|
|
6
6
|
import yaml
|
|
7
7
|
|
|
8
|
-
from instant_python.
|
|
8
|
+
from instant_python.config.domain.dependency_configuration import (
|
|
9
9
|
DependencyConfiguration,
|
|
10
10
|
)
|
|
11
|
-
from instant_python.
|
|
11
|
+
from instant_python.config.domain.general_configuration import (
|
|
12
12
|
GeneralConfiguration,
|
|
13
13
|
)
|
|
14
|
-
from instant_python.
|
|
15
|
-
from instant_python.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
47
|
+
destination_path = destination_folder / self.config_file_path.name
|
|
48
48
|
|
|
49
|
-
shutil.move(self.
|
|
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.
|
|
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.
|
|
4
|
-
|
|
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.
|
|
6
|
-
|
|
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.
|
|
5
|
-
|
|
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)
|
|
@@ -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.
|
|
5
|
-
|
|
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
|
instant_python-0.12.0/instant_python/config/infra/question_wizard/questionary_console_wizard.py
ADDED
|
@@ -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
|
+
)
|