diff --git a/.github/workflows/run_template_checks.yml b/.github/workflows/run_template_checks.yml index 24bf1b0..da4e9e6 100644 --- a/.github/workflows/run_template_checks.yml +++ b/.github/workflows/run_template_checks.yml @@ -6,8 +6,9 @@ jobs: build-lint-test: runs-on: ubuntu-latest strategy: + fail-fast: false matrix: - python-version: [3.8, 3.10, 3.11] + python-version: ['3.9', '3.10', '3.11'] name: Test cookiecutter template steps: @@ -22,16 +23,18 @@ jobs: - name: Run cookiecutter run: | pip install cookiecutter - cookiecutter $GITHUB_SERVER_URL/$GITHUB_REPOSITORY -c $GITHUB_SHA - cd design_toolkit_application + sed -i 's/"python_version": "3\.[0-9]*"/"python_version": "${{ matrix.python-version }}"/gi' cookiecutter.json + cookiecutter --no-input ./ + cd design-toolkit-application - - name: flake8 Lint - uses: TrueBrain/actions-flake8@v2 - with: - plugins: Flake8-pyproject==1.2.3 flake8-docstrings==1.7.0 flake8-quotes==3.3.2 flake8-bugbear==23.9.16 flake8-mock==0.4 flake8-tuple==0.4.1 + - name: Run lint + run: | + cd design-toolkit-application + ./ci/linux/lint.sh - name: Run unit tests run: | + cd design-toolkit-application ./ci/linux/test_unit.sh - name: Surface failing tests @@ -41,7 +44,7 @@ jobs: # A list of JUnit XML files, directories containing the former, and wildcard # patterns to process. # See @actions/glob for supported patterns. - path: test-results.xml + path: ./design-toolkit-application/test-results.xml # Add a summary of the results at the top of the report # Default: true @@ -59,6 +62,7 @@ jobs: - name: Add mypy annotator uses: pr-annotators/mypy-pr-annotator@v1.0.0 - - name: run typechecker + - name: Run typechecker run: | + cd design-toolkit-application ./ci/linux/typecheck.sh diff --git a/cookiecutter.json b/cookiecutter.json index 72d13ee..371d68d 100644 --- a/cookiecutter.json +++ b/cookiecutter.json @@ -6,7 +6,7 @@ "python_import_name": "{{ cookiecutter.repo_name|replace('-', '') }}", "project_short_description": "A description on what this application within the Design Toolkit entails.", "publish_container": true, - "docker_username": "audrey", + "github_username": "project-omotes", "container_name": "design-toolkit-application", "python_version": "3.11", "_copy_without_render": [ diff --git a/hooks/post_gen_project.bat b/post_gen_project.bat similarity index 100% rename from hooks/post_gen_project.bat rename to post_gen_project.bat diff --git a/{{cookiecutter.repo_name}}/.github/workflows/ci.yml b/{{cookiecutter.repo_name}}/.github/workflows/ci.yml index c5c16aa..afa63cf 100644 --- a/{{cookiecutter.repo_name}}/.github/workflows/ci.yml +++ b/{{cookiecutter.repo_name}}/.github/workflows/ci.yml @@ -3,110 +3,141 @@ name: Build-Test-Lint-etc (linux) on: [push] jobs: - - flake8-lint: + setup: runs-on: ubuntu-latest - name: Lint + strategy: + fail-fast: false + matrix: + python-version: ["{{cookiecutter.python_version}}"] + name: Setup steps: - - name: Check out source repository - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - name: Set up Python environment + # {% raw %} + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: - python-version: {{cookiecutter.python_version}} - - name: flake8 Lint - uses: TrueBrain/actions-flake8@v2 + python-version: ${{ matrix.python-version }} + cache: 'pip' + - run: | + ./ci/linux/create_venv.sh + ./ci/linux/install_dependencies.sh + - name: 'Tar venv' + run: tar -cvf venv.tar ./.venv/ + - name: Save venv + uses: actions/upload-artifact@v4 with: - plugins: Flake8-pyproject==1.2.3 flake8-docstrings==1.7.0 flake8-quotes==3.3.2 flake8-bugbear==23.9.16 flake8-mock==0.4 flake8-tuple==0.4.1 - # only_warn: 1 #causes action to always be succesful, but still provide annotations + path: ./venv.tar + name: ${{ runner.os }}-python-${{ matrix.python-version }}-venv-${{github.run_id}} + # {% endraw %} - test: + lint: + name: Lint runs-on: ubuntu-latest + needs: [ setup ] strategy: + fail-fast: false matrix: python-version: ["{{cookiecutter.python_version}}"] -# python-version: [3.8, 3.9, 3.10, 3.11] steps: - - uses: actions/checkout@v3 - - name: Set up Python {% raw %}${{ matrix.python-version }}{% endraw %} - uses: actions/setup-python@v4 - with: - python-version: {% raw %}${{ matrix.python-version }}{% endraw %} - cache: 'pip' - - run: | - ./ci/linux/create_venv.sh - ./ci/linux/install_dependencies.sh - - - name: run unit tests - run: | - ./ci/linux/test_unit.sh + # {% raw %} + - uses: actions/checkout@v3 + - name: Restore venv + uses: actions/download-artifact@v4 + with: + name: ${{ runner.os }}-python-${{ matrix.python-version }}-venv-${{github.run_id}} + - name: Untar venv + run: tar -xvf venv.tar + - name: Run lint + run: | + ./ci/linux/lint.sh + # {% endraw %} - - name: Surface failing tests - if: always() - uses: pmeier/pytest-results-action@main - with: - # A list of JUnit XML files, directories containing the former, and wildcard - # patterns to process. - # See @actions/glob for supported patterns. - path: test-results.xml + test: + name: Test + runs-on: ubuntu-latest + needs: [ setup ] + strategy: + fail-fast: false + matrix: + python-version: ["{{cookiecutter.python_version}}"] + steps: + # {% raw %} + - uses: actions/checkout@v3 + - name: Restore venv + uses: actions/download-artifact@v4 + with: + name: ${{ runner.os }}-python-${{ matrix.python-version }}-venv-${{github.run_id}} + - name: Untar venv + run: tar -xvf venv.tar + - name: Run unit tests + run: | + ./ci/linux/test_unit.sh + - name: Surface failing tests + if: always() + uses: pmeier/pytest-results-action@main + with: + # A list of JUnit XML files, directories containing the former, and wildcard + # patterns to process. + # See @actions/glob for supported patterns. + path: test-results.xml - # Add a summary of the results at the top of the report - # Default: true - summary: true + # Add a summary of the results at the top of the report + # Default: true + summary: true - # Select which results should be included in the report. - # Follows the same syntax as - # `pytest -r` - # Default: fEX - display-options: fEX + # Select which results should be included in the report. + # Follows the same syntax as + # `pytest -r` + # Default: fEX + display-options: fEX - # Fail the workflow if no JUnit XML was found. - # Default: true - fail-on-empty: true + # Fail the workflow if no JUnit XML was found. + # Default: true + fail-on-empty: true + # {% endraw %} typecheck: + name: Typecheck runs-on: ubuntu-latest + needs: [ setup ] strategy: + fail-fast: false matrix: python-version: ["{{cookiecutter.python_version}}"] -# python-version: [3.8, 3.9, 3.10, 3.11] steps: - - uses: actions/checkout@v3 - - name: Set up Python {% raw %}${{ matrix.python-version }}{% endraw %} - uses: actions/setup-python@v4 - with: - python-version: {% raw %}${{ matrix.python-version }}{% endraw %} - cache: 'pip' - - run: | - ./ci/linux/create_venv.sh - ./ci/linux/install_dependencies.sh - - - name: Add mypy annotator - uses: pr-annotators/mypy-pr-annotator@v1.0.0 - - - name: run typechecker - run: | - ./ci/linux/typecheck.sh + # {% raw %} + - uses: actions/checkout@v3 + - name: Restore venv + uses: actions/download-artifact@v4 + with: + name: ${{ runner.os }}-python-${{ matrix.python-version }}-venv-${{github.run_id}} + - name: Untar venv + run: tar -xvf venv.tar + - name: Add mypy annotator + uses: pr-annotators/mypy-pr-annotator@v1.0.0 + - name: Run typechecker + run: | + ./ci/linux/typecheck.sh + # {% endraw %} build: name: Build the python package runs-on: ubuntu-latest + needs: [ setup ] strategy: + fail-fast: false matrix: python-version: [ "{{cookiecutter.python_version}}" ] steps: + # {% raw %} - uses: actions/checkout@v3 - - name: Set up Python {% raw %}${{ matrix.python-version }}{% endraw %} - uses: actions/setup-python@v4 + - name: Restore venv + uses: actions/download-artifact@v4 with: - python-version: {% raw %}${{ matrix.python-version }}{% endraw %} - cache: 'pip' - - run: | - ./ci/linux/create_venv.sh - ./ci/linux/install_dependencies.sh - - - name: build + name: ${{ runner.os }}-python-${{ matrix.python-version }}-venv-${{github.run_id}} + - name: Untar venv + run: tar -xvf venv.tar + - name: Build run: | ./ci/linux/build_python_package.sh + # {% endraw %} diff --git a/{{cookiecutter.repo_name}}/.github/workflows/publish_container_image.yml b/{{cookiecutter.repo_name}}/.github/workflows/publish_container_image.yml index 9191860..ef75b52 100644 --- a/{{cookiecutter.repo_name}}/.github/workflows/publish_container_image.yml +++ b/{{cookiecutter.repo_name}}/.github/workflows/publish_container_image.yml @@ -13,19 +13,19 @@ jobs: uses: actions/checkout@v3 with: fetch-depth: 0 - +{% raw %} - name: Login to GitHub Container Registry uses: docker/login-action@v1 with: registry: ghcr.io - username: {% raw %}${{ github.actor }}{% endraw %} - password: {% raw %}${{ secrets.GITHUB_TOKEN }}{% endraw %} - + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} +{% endraw %} - name: Build the container image run: | - docker build . --tag ghcr.io/{{ cookiecutter.docker_username }}/{{ cookiecutter.container_name }}:latest --tag ghcr.io/{{ cookiecutter.docker_username }}/{{ cookiecutter.container_name }}:${{github.ref_name}} - docker push ghcr.io/{{ cookiecutter.docker_username }}/{{ cookiecutter.container_name }}:latest - docker push ghcr.io/{{ cookiecutter.docker_username }}/{{ cookiecutter.container_name }}:${{github.ref_name}} + docker build . --tag ghcr.io/{{ cookiecutter.github_username }}/{{ cookiecutter.container_name }}:latest --tag ghcr.io/{{ cookiecutter.github_username }}/{{ cookiecutter.container_name }}:{% raw %}${{github.ref_name}}{% endraw %} + docker push ghcr.io/{{ cookiecutter.github_username }}/{{ cookiecutter.container_name }}:latest + docker push ghcr.io/{{ cookiecutter.github_username }}/{{ cookiecutter.container_name }}:{% raw %}${{github.ref_name}}{% endraw %} {%- else -%} {% endif %} diff --git a/{{cookiecutter.repo_name}}/ci/linux/_load_dot_env.sh b/{{cookiecutter.repo_name}}/ci/linux/_load_dot_env.sh new file mode 100644 index 0000000..434c067 --- /dev/null +++ b/{{cookiecutter.repo_name}}/ci/linux/_load_dot_env.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +set -a +source $1 +set +a diff --git a/{{cookiecutter.repo_name}}/ci/linux/build_python_package.sh b/{{cookiecutter.repo_name}}/ci/linux/build_python_package.sh index 5f4244f..0d2d2af 100755 --- a/{{cookiecutter.repo_name}}/ci/linux/build_python_package.sh +++ b/{{cookiecutter.repo_name}}/ci/linux/build_python_package.sh @@ -1,4 +1,8 @@ -#!/usr/bin/env sh +#!/usr/bin/env bash + +if [[ "$OSTYPE" != "win32" && "$OSTYPE" != "msys" ]]; then + echo "Activating .venv first." + . .venv/bin/activate +fi -. .venv/bin/activate python -m build diff --git a/{{cookiecutter.repo_name}}/ci/linux/create_venv.sh b/{{cookiecutter.repo_name}}/ci/linux/create_venv.sh index 4ab293e..ca7dda1 100755 --- a/{{cookiecutter.repo_name}}/ci/linux/create_venv.sh +++ b/{{cookiecutter.repo_name}}/ci/linux/create_venv.sh @@ -1,5 +1,8 @@ -#!/usr/bin/env sh +#!/usr/bin/env bash python{{cookiecutter.python_version}} -m venv ./.venv -. .venv/bin/activate +if [[ "$OSTYPE" != "win32" && "$OSTYPE" != "msys" ]]; then + echo "Activating .venv first." + . .venv/bin/activate +fi pip3 install pip-tools diff --git a/{{cookiecutter.repo_name}}/ci/linux/install_dependencies.sh b/{{cookiecutter.repo_name}}/ci/linux/install_dependencies.sh index 0447bed..e00b897 100755 --- a/{{cookiecutter.repo_name}}/ci/linux/install_dependencies.sh +++ b/{{cookiecutter.repo_name}}/ci/linux/install_dependencies.sh @@ -1,4 +1,8 @@ -#!/usr/bin/env sh +#!/usr/bin/env bash + +if [[ "$OSTYPE" != "win32" && "$OSTYPE" != "msys" ]]; then + echo "Activating .venv first." + . .venv/bin/activate +fi -. .venv/bin/activate pip-sync ./dev-requirements.txt ./requirements.txt diff --git a/{{cookiecutter.repo_name}}/ci/linux/lint.sh b/{{cookiecutter.repo_name}}/ci/linux/lint.sh index e5cd8ee..776e064 100755 --- a/{{cookiecutter.repo_name}}/ci/linux/lint.sh +++ b/{{cookiecutter.repo_name}}/ci/linux/lint.sh @@ -1,4 +1,8 @@ -#!/usr/bin/env sh +#!/usr/bin/env bash -. .venv/bin/activate -flake8 ./src/{{cookiecutter.python_import_name}} +if [[ "$OSTYPE" != "win32" && "$OSTYPE" != "msys" ]]; then + echo "Activating .venv first." + . .venv/bin/activate +fi + +flake8 ./src/{{cookiecutter.python_import_name}} ./unit_test/ diff --git a/{{cookiecutter.repo_name}}/ci/linux/test_unit.sh b/{{cookiecutter.repo_name}}/ci/linux/test_unit.sh index b810a25..bff0c15 100755 --- a/{{cookiecutter.repo_name}}/ci/linux/test_unit.sh +++ b/{{cookiecutter.repo_name}}/ci/linux/test_unit.sh @@ -1,4 +1,8 @@ -#!/usr/bin/env sh +#!/usr/bin/env bash + +if [[ "$OSTYPE" != "win32" && "$OSTYPE" != "msys" ]]; then + echo "Activating .venv first." + . .venv/bin/activate +fi -. .venv/bin/activate PYTHONPATH='$PYTHONPATH:src/' pytest --junit-xml=test-results.xml unit_test/ diff --git a/{{cookiecutter.repo_name}}/ci/linux/typecheck.sh b/{{cookiecutter.repo_name}}/ci/linux/typecheck.sh index 5dfedef..62d476f 100755 --- a/{{cookiecutter.repo_name}}/ci/linux/typecheck.sh +++ b/{{cookiecutter.repo_name}}/ci/linux/typecheck.sh @@ -1,4 +1,8 @@ -#!/usr/bin/env sh +#!/usr/bin/env bash + +if [[ "$OSTYPE" != "win32" && "$OSTYPE" != "msys" ]]; then + echo "Activating .venv first." + . .venv/bin/activate +fi -. .venv/bin/activate python -m mypy ./src/{{cookiecutter.python_import_name}} ./unit_test/ diff --git a/{{cookiecutter.repo_name}}/ci/linux/update_dependencies.sh b/{{cookiecutter.repo_name}}/ci/linux/update_dependencies.sh index cfb00aa..fea6566 100755 --- a/{{cookiecutter.repo_name}}/ci/linux/update_dependencies.sh +++ b/{{cookiecutter.repo_name}}/ci/linux/update_dependencies.sh @@ -1,5 +1,9 @@ -#!/usr/bin/env sh +#!/usr/bin/env bash -. .venv/bin/activate -pip-compile --output-file=requirements.txt pyproject.toml -pip-compile --extra=dev --output-file=dev-requirements.txt -c requirements.txt pyproject.toml +if [[ "$OSTYPE" != "win32" && "$OSTYPE" != "msys" ]]; then + echo "Activating .venv first." + . .venv/bin/activate +fi + +pip-compile --upgrade --output-file=requirements.txt pyproject.toml +pip-compile --upgrade --extra=dev -c requirements.txt --output-file=dev-requirements.txt pyproject.toml diff --git a/{{cookiecutter.repo_name}}/ci/win32/update_dependencies.cmd b/{{cookiecutter.repo_name}}/ci/win32/update_dependencies.cmd index 061ee6d..f0f55a2 100644 --- a/{{cookiecutter.repo_name}}/ci/win32/update_dependencies.cmd +++ b/{{cookiecutter.repo_name}}/ci/win32/update_dependencies.cmd @@ -1,6 +1,6 @@ pushd . cd /D "%~dp0" -pip-compile --output-file=..\..\requirements.txt ..\..\pyproject.toml -pip-compile --extra=dev --output-file=..\..\dev-requirements.txt -c ..\..\requirements.txt ..\..\pyproject.toml +pip-compile --upgrade --output-file=..\..\requirements.txt ..\..\pyproject.toml +pip-compile --upgrade --extra=dev --output-file=..\..\dev-requirements.txt -c ..\..\requirements.txt ..\..\pyproject.toml popd \ No newline at end of file diff --git a/{{cookiecutter.repo_name}}/pyproject.toml b/{{cookiecutter.repo_name}}/pyproject.toml index 264977d..b08852c 100644 --- a/{{cookiecutter.repo_name}}/pyproject.toml +++ b/{{cookiecutter.repo_name}}/pyproject.toml @@ -23,18 +23,22 @@ dependencies = ["coloredlogs~=15.0.1"] [project.optional-dependencies] dev = [ - "setuptools ~= 69.0.3", - "wheel ~= 0.40.0", - "setuptools-git-versioning < 2", - "black~=22.1.0", - "flake8==6.0.0", - "Flake8-pyproject==1.2.3", - "pytest ~=7.3.1", - "pytest-cov ~=4.0.0", - "bump2version==1.0.1", - "mypy ~= 1.5.1", - "isort==5.13.2", - "build ~= 1.0.3", + "setuptools ~= 75.6.0", + "wheel ~= 0.45.1", + "setuptools-git-versioning >= 2.0, < 3", + "black ~= 24.10.0", + "flake8 == 7.1.1", + "flake8-pyproject ~= 1.2.3", + "flake8-docstrings ~= 1.7.0", + "flake8-quotes ~= 3.4.0", + "flake8-bugbear ~= 24.10.31", + "flake8-mock ~= 0.4", + "flake8-tuple ~= 0.4.1", + "pytest ~= 8.3.4", + "pytest-cov ~= 6.0.0", + "mypy ~= 1.13.0", + "isort == 5.13.2", + "build ~= 1.2.2", ] [project.urls] @@ -49,17 +53,17 @@ changelog = "https://github.com/Nieuwe-Warmte-Nu/{{cookiecutter.repo_name}}/blob [build-system] build-backend = "setuptools.build_meta" requires = [ - "setuptools ~= 69.0.3", - "wheel ~= 0.40.0", - "setuptools-git-versioning<2", + "setuptools ~= 75.6.0", + "wheel ~= 0.45.1", + "setuptools-git-versioning >= 2.0, < 3", ] +[tool.setuptools.package-data] +"{{cookiecutter.python_import_name}}" = ["py.typed"] + [tool.setuptools-git-versioning] enabled = true -version_file = "VERSION" -count_commits_from_version_file = true -dev_template = "{tag}.dev{ccount}" -dirty_template = "{tag}.dev{ccount}" +starting_version = "0.0.1" [tool.pytest.ini_options] addopts = "--cov={{cookiecutter.python_import_name}} --cov-report html --cov-report term-missing --cov-fail-under 80" @@ -76,8 +80,10 @@ ignore = [ 'E203', # Space before colon (not PEP-8 compliant, and conflicts with black) 'C408', # Suggestion to use dict() over {} 'W503', # Starting lines with operators. + 'D104', # Missing docstring in public package + 'D100' # Missing docstring in public module ] -per-file-ignores = ['__init__.py:F401', 'test_main.py:D100,D101,D102,D103'] +per-file-ignores = ['__init__.py:F401', 'test_*.py:D100,D101,D102,D103'] max-line-length = 100 count = true diff --git a/{{cookiecutter.repo_name}}/src/{{cookiecutter.python_import_name}}/__init__.py b/{{cookiecutter.repo_name}}/src/{{cookiecutter.python_import_name}}/__init__.py index ad3c9ef..c608357 100644 --- a/{{cookiecutter.repo_name}}/src/{{cookiecutter.python_import_name}}/__init__.py +++ b/{{cookiecutter.repo_name}}/src/{{cookiecutter.python_import_name}}/__init__.py @@ -14,4 +14,4 @@ # along with this program. If not, see . """__init__.py file containing the defaults.""" -from {{cookiecutter.python_import_name}}.{{cookiecutter.python_import_name}} import start_app \ No newline at end of file +from {{cookiecutter.python_import_name}}.{{cookiecutter.python_import_name}} import start_app diff --git a/{{cookiecutter.repo_name}}/src/{{cookiecutter.python_import_name}}/__main__.py b/{{cookiecutter.repo_name}}/src/{{cookiecutter.python_import_name}}/__main__.py index 78c723b..7a5af6f 100644 --- a/{{cookiecutter.repo_name}}/src/{{cookiecutter.python_import_name}}/__main__.py +++ b/{{cookiecutter.repo_name}}/src/{{cookiecutter.python_import_name}}/__main__.py @@ -16,4 +16,4 @@ """__main__.py file for testing/running application.""" from {{cookiecutter.python_import_name}} import start_app -start_app(loglevel="DEBUG", colors=True) \ No newline at end of file +start_app(loglevel="DEBUG", colors=True) diff --git a/{{cookiecutter.repo_name}}/src/{{cookiecutter.python_import_name}}/app_logging.py b/{{cookiecutter.repo_name}}/src/{{cookiecutter.python_import_name}}/app_logging.py index 828a276..e4d9df9 100644 --- a/{{cookiecutter.repo_name}}/src/{{cookiecutter.python_import_name}}/app_logging.py +++ b/{{cookiecutter.repo_name}}/src/{{cookiecutter.python_import_name}}/app_logging.py @@ -15,9 +15,10 @@ """Setup logging for this python application.""" +from enum import Enum import logging +from typing import Optional import sys -from enum import Enum import coloredlogs @@ -61,7 +62,7 @@ def parse(value: str) -> "LogLevel": return result -LOG_LEVEL: LogLevel | None = None +LOG_LEVEL: Optional[LogLevel] = None def setup_logging(log_level: LogLevel, colors: bool = True) -> None: diff --git a/{{cookiecutter.repo_name}}/unit_test/test_main.py b/{{cookiecutter.repo_name}}/unit_test/test_main.py index ad3a16a..5ccf867 100644 --- a/{{cookiecutter.repo_name}}/unit_test/test_main.py +++ b/{{cookiecutter.repo_name}}/unit_test/test_main.py @@ -33,7 +33,7 @@ def test__testable_function__is_correct(self) -> None: current_time = datetime(1970, 1, 1, 13, 00) # Act - result = simulator_worker.testable_function(current_time) + result = {{cookiecutter.python_import_name}}.testable_function(current_time) # Assert expected_result = datetime(1970, 1, 1, 14, 00) @@ -41,16 +41,16 @@ def test__testable_function__is_correct(self) -> None: def test_start_app_info(self) -> None: try: - simulator_worker.start_app(loglevel="INFO", colors=True) + {{cookiecutter.python_import_name}}.start_app(loglevel="INFO", colors=True) except Exception as e: - self.fail(f"simulator_worker.start_app() raised an exception: {e}") + self.fail(f"{{cookiecutter.python_import_name}}.start_app() raised an exception: {e}") def test_start_app_debug(self) -> None: try: - simulator_worker.start_app(loglevel="DEBUG", colors=False) + {{cookiecutter.python_import_name}}.start_app(loglevel="DEBUG", colors=False) except Exception as e: - self.fail(f"simulator_worker.start_app() raised an exception: {e}") + self.fail(f"{{cookiecutter.python_import_name}}.start_app() raised an exception: {e}") def test_start_app_wrong_logtype(self) -> None: with self.assertRaises(ValueError): - simulator_worker.start_app(loglevel="WRONG_LOG_TYPE", colors=False) + {{cookiecutter.python_import_name}}.start_app(loglevel="WRONG_LOG_TYPE", colors=False)