From 3393270a32f1adc0a9490b8b110f5a14e030ee2c Mon Sep 17 00:00:00 2001 From: Marcel Blijleven Date: Tue, 3 Dec 2024 21:34:18 +0100 Subject: [PATCH] chore!: migrate to poetry * chore!: migrate to poetry * chore: reformat project using ruff only * chore: set up git blame ignore revs * chore: update actions to use poetry * chore: remove requirements.*.txt files --- .git-blame-ignore-revs | 2 + .github/workflows/tests.yaml | 23 +- .github/workflows/update_readme.yaml | 12 +- poetry.lock | 838 ++++++++++++++++++ pyproject.toml | 195 +--- requirements.txt | 1 - requirements_dev.txt | 12 - src/adventofcode/scripts/add_day.py | 30 +- src/adventofcode/scripts/benchmarks.py | 16 +- src/adventofcode/scripts/generate_readme.py | 17 +- src/adventofcode/util/helpers.py | 4 +- src/adventofcode/util/module_helpers.py | 12 +- src/adventofcode/year_2015/day_02_2015.py | 6 +- src/adventofcode/year_2015/day_05_2015.py | 6 +- src/adventofcode/year_2015/day_09_2015.py | 4 +- src/adventofcode/year_2015/day_11_2015.py | 7 +- src/adventofcode/year_2015/day_13_2015.py | 4 +- src/adventofcode/year_2015/day_14_2015.py | 10 +- src/adventofcode/year_2015/day_15_2015.py | 12 +- src/adventofcode/year_2015/day_17_2015.py | 8 +- src/adventofcode/year_2015/day_21_2015.py | 15 +- src/adventofcode/year_2015/day_22_2015.py | 12 +- src/adventofcode/year_2020/day_02_2020.py | 4 +- src/adventofcode/year_2020/day_04_2020.py | 4 +- src/adventofcode/year_2020/day_05_2020.py | 7 +- src/adventofcode/year_2020/day_10_2020.py | 4 +- src/adventofcode/year_2020/day_11_2020.py | 24 +- src/adventofcode/year_2020/day_12_2020.py | 8 +- src/adventofcode/year_2020/day_13_2020.py | 8 +- src/adventofcode/year_2020/day_14_2020.py | 10 +- src/adventofcode/year_2020/day_16_2020.py | 23 +- src/adventofcode/year_2021/day_02_2021.py | 8 +- src/adventofcode/year_2021/day_05_2021.py | 8 +- src/adventofcode/year_2021/day_06_2021.py | 4 +- src/adventofcode/year_2021/day_07_2021.py | 4 +- src/adventofcode/year_2021/day_08_2021.py | 4 +- src/adventofcode/year_2021/day_09_2021.py | 16 +- src/adventofcode/year_2021/day_11_2021.py | 11 +- src/adventofcode/year_2021/day_12_2021.py | 12 +- src/adventofcode/year_2021/day_16_2021.py | 24 +- src/adventofcode/year_2021/day_18_2021.py | 4 +- src/adventofcode/year_2021/day_20_2021.py | 15 +- src/adventofcode/year_2021/day_21_2021.py | 8 +- src/adventofcode/year_2021/day_22_2021.py | 8 +- src/adventofcode/year_2021/day_25_2021.py | 4 +- src/adventofcode/year_2022/day_03_2022.py | 4 +- src/adventofcode/year_2022/day_05_2022.py | 4 +- src/adventofcode/year_2022/day_07_2022.py | 4 +- src/adventofcode/year_2022/day_08_2022.py | 8 +- src/adventofcode/year_2022/day_09_2022.py | 16 +- src/adventofcode/year_2022/day_11_2022.py | 8 +- src/adventofcode/year_2022/day_15_2022.py | 8 +- src/adventofcode/year_2023/day_01_2023.py | 4 +- src/adventofcode/year_2023/day_03_2023.py | 4 +- src/adventofcode/year_2023/day_07_2023.py | 8 +- src/adventofcode/year_2023/day_08_2023.py | 4 +- src/adventofcode/year_2023/day_09_2023.py | 4 +- tests/adventofcode/util/test_input_helpers.py | 3 +- tests/adventofcode/util/test_math_helpers.py | 4 +- .../year_2015/test_day_01_2015.py | 4 +- .../year_2015/test_day_02_2015.py | 8 +- .../year_2015/test_day_03_2015.py | 8 +- .../year_2015/test_day_09_2015.py | 4 +- .../year_2015/test_day_10_2015.py | 8 +- .../year_2015/test_day_13_2015.py | 4 +- .../year_2015/test_day_19_2015.py | 8 +- .../year_2015/test_day_23_2015.py | 8 +- .../year_2015/test_day_24_2015.py | 8 +- .../year_2015/test_day_25_2015.py | 8 +- .../year_2020/test_day_04_2020.py | 4 +- .../year_2020/test_day_05_2020.py | 3 +- .../year_2021/test_day_02_2021.py | 8 +- .../year_2021/test_day_07_2021.py | 8 +- .../year_2021/test_day_13_2021.py | 4 +- .../year_2021/test_day_15_2021.py | 4 +- .../year_2021/test_day_18_2021.py | 5 +- .../year_2021/test_day_20_2021.py | 8 +- .../year_2022/test_day_09_2022.py | 10 +- .../year_2023/test_day_02_2023.py | 18 +- .../year_2023/test_day_03_2023.py | 9 +- .../year_2023/test_day_07_2023.py | 8 +- .../year_2023/test_day_08_2023.py | 7 +- .../year_2023/test_day_09_2023.py | 32 +- 83 files changed, 1398 insertions(+), 349 deletions(-) create mode 100644 .git-blame-ignore-revs create mode 100644 poetry.lock delete mode 100644 requirements.txt delete mode 100644 requirements_dev.txt diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 0000000..d16e7d8 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,2 @@ +# Migrate to ruff +73c58b02ea964d62b44b3ded3a33828aaa505910 diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 95e4ba7..449fac1 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -16,26 +16,25 @@ jobs: strategy: matrix: os: [ubuntu-latest] - python-version: ['3.11', '3.12'] + python-version: ['3.11', '3.12', '3.13'] fail-fast: false steps: - - uses: actions/checkout@v3 - - name: Setup Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - cache: 'pip' - - name: Install - run: | - python -m pip install --upgrade pip - python -m pip install hatch + - name: Set up poetry + uses: abatilo/actions-poetry@v2 + - name: Install dependencies + run: poetry install --with dev - name: Run linters - run: hatch run lint:all + run: poetry run ruff check src tests - name: Run tests - run: hatch run test-cov + run: poetry run pytest --cov - name: "Upload coverage to Codecov" - if: matrix.python-version == 3.12 # Only upload coverage once per run + if: matrix.python-version == 3.13 # Only upload coverage once per run uses: codecov/codecov-action@v3 with: fail_ci_if_error: false diff --git a/.github/workflows/update_readme.yaml b/.github/workflows/update_readme.yaml index da20634..95d9b5a 100644 --- a/.github/workflows/update_readme.yaml +++ b/.github/workflows/update_readme.yaml @@ -12,15 +12,15 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: "3.12" - - name: Install package - run: | - python -m pip install --upgrade pip - pip install -e . + - name: Set up poetry + uses: abatilo/actions-poetry@v2 + - name: Install dependencies + run: poetry install --with dev - name: Generate new README run: generate-readme - name: Commit new README diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..3d4b3e6 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,838 @@ +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. + +[[package]] +name = "anyio" +version = "4.6.2.post1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.9" +files = [ + {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"}, + {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "argcomplete" +version = "3.5.1" +description = "Bash tab completion for argparse" +optional = false +python-versions = ">=3.8" +files = [ + {file = "argcomplete-3.5.1-py3-none-any.whl", hash = "sha256:1a1d148bdaa3e3b93454900163403df41448a248af01b6e849edc5ac08e6c363"}, + {file = "argcomplete-3.5.1.tar.gz", hash = "sha256:eb1ee355aa2557bd3d0145de7b06b2a45b0ce461e1e7813f5d066039ab4177b4"}, +] + +[package.extras] +test = ["coverage", "mypy", "pexpect", "ruff", "wheel"] + +[[package]] +name = "certifi" +version = "2024.8.30" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "commitizen" +version = "4.0.0" +description = "Python commitizen client tool" +optional = false +python-versions = ">=3.9" +files = [ + {file = "commitizen-4.0.0-py3-none-any.whl", hash = "sha256:52873ee589a64cf77fc55570dbd3f987c6ffcd33132d179eb625c4d06ae935f7"}, + {file = "commitizen-4.0.0.tar.gz", hash = "sha256:16aff27e01b43015eab1c74eabbca3e284b4988dd1b146a0963282db241dc2c0"}, +] + +[package.dependencies] +argcomplete = ">=1.12.1,<3.6" +charset-normalizer = ">=2.1.0,<4" +colorama = ">=0.4.1,<0.5.0" +decli = ">=0.6.0,<0.7.0" +jinja2 = ">=2.10.3" +packaging = ">=19" +pyyaml = ">=3.08" +questionary = ">=2.0,<3.0" +termcolor = ">=1.1,<3" +tomlkit = ">=0.5.3,<1.0.0" + +[[package]] +name = "coverage" +version = "7.6.8" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "coverage-7.6.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b39e6011cd06822eb964d038d5dff5da5d98652b81f5ecd439277b32361a3a50"}, + {file = "coverage-7.6.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:63c19702db10ad79151a059d2d6336fe0c470f2e18d0d4d1a57f7f9713875dcf"}, + {file = "coverage-7.6.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3985b9be361d8fb6b2d1adc9924d01dec575a1d7453a14cccd73225cb79243ee"}, + {file = "coverage-7.6.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:644ec81edec0f4ad17d51c838a7d01e42811054543b76d4ba2c5d6af741ce2a6"}, + {file = "coverage-7.6.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f188a2402f8359cf0c4b1fe89eea40dc13b52e7b4fd4812450da9fcd210181d"}, + {file = "coverage-7.6.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e19122296822deafce89a0c5e8685704c067ae65d45e79718c92df7b3ec3d331"}, + {file = "coverage-7.6.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:13618bed0c38acc418896005732e565b317aa9e98d855a0e9f211a7ffc2d6638"}, + {file = "coverage-7.6.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:193e3bffca48ad74b8c764fb4492dd875038a2f9925530cb094db92bb5e47bed"}, + {file = "coverage-7.6.8-cp310-cp310-win32.whl", hash = "sha256:3988665ee376abce49613701336544041f2117de7b7fbfe91b93d8ff8b151c8e"}, + {file = "coverage-7.6.8-cp310-cp310-win_amd64.whl", hash = "sha256:f56f49b2553d7dd85fd86e029515a221e5c1f8cb3d9c38b470bc38bde7b8445a"}, + {file = "coverage-7.6.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:86cffe9c6dfcfe22e28027069725c7f57f4b868a3f86e81d1c62462764dc46d4"}, + {file = "coverage-7.6.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d82ab6816c3277dc962cfcdc85b1efa0e5f50fb2c449432deaf2398a2928ab94"}, + {file = "coverage-7.6.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13690e923a3932e4fad4c0ebfb9cb5988e03d9dcb4c5150b5fcbf58fd8bddfc4"}, + {file = "coverage-7.6.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4be32da0c3827ac9132bb488d331cb32e8d9638dd41a0557c5569d57cf22c9c1"}, + {file = "coverage-7.6.8-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb"}, + {file = "coverage-7.6.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:768939f7c4353c0fac2f7c37897e10b1414b571fd85dd9fc49e6a87e37a2e0d8"}, + {file = "coverage-7.6.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e44961e36cb13c495806d4cac67640ac2866cb99044e210895b506c26ee63d3a"}, + {file = "coverage-7.6.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ea8bb1ab9558374c0ab591783808511d135a833c3ca64a18ec927f20c4030f0"}, + {file = "coverage-7.6.8-cp311-cp311-win32.whl", hash = "sha256:629a1ba2115dce8bf75a5cce9f2486ae483cb89c0145795603d6554bdc83e801"}, + {file = "coverage-7.6.8-cp311-cp311-win_amd64.whl", hash = "sha256:fb9fc32399dca861584d96eccd6c980b69bbcd7c228d06fb74fe53e007aa8ef9"}, + {file = "coverage-7.6.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee"}, + {file = "coverage-7.6.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a"}, + {file = "coverage-7.6.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d"}, + {file = "coverage-7.6.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb"}, + {file = "coverage-7.6.8-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649"}, + {file = "coverage-7.6.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787"}, + {file = "coverage-7.6.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c"}, + {file = "coverage-7.6.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443"}, + {file = "coverage-7.6.8-cp312-cp312-win32.whl", hash = "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad"}, + {file = "coverage-7.6.8-cp312-cp312-win_amd64.whl", hash = "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4"}, + {file = "coverage-7.6.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb"}, + {file = "coverage-7.6.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63"}, + {file = "coverage-7.6.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365"}, + {file = "coverage-7.6.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002"}, + {file = "coverage-7.6.8-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3"}, + {file = "coverage-7.6.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022"}, + {file = "coverage-7.6.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e"}, + {file = "coverage-7.6.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b"}, + {file = "coverage-7.6.8-cp313-cp313-win32.whl", hash = "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146"}, + {file = "coverage-7.6.8-cp313-cp313-win_amd64.whl", hash = "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28"}, + {file = "coverage-7.6.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d"}, + {file = "coverage-7.6.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451"}, + {file = "coverage-7.6.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764"}, + {file = "coverage-7.6.8-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf"}, + {file = "coverage-7.6.8-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5"}, + {file = "coverage-7.6.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4"}, + {file = "coverage-7.6.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83"}, + {file = "coverage-7.6.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b"}, + {file = "coverage-7.6.8-cp313-cp313t-win32.whl", hash = "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71"}, + {file = "coverage-7.6.8-cp313-cp313t-win_amd64.whl", hash = "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc"}, + {file = "coverage-7.6.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ac47fa29d8d41059ea3df65bd3ade92f97ee4910ed638e87075b8e8ce69599e"}, + {file = "coverage-7.6.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:24eda3a24a38157eee639ca9afe45eefa8d2420d49468819ac5f88b10de84f4c"}, + {file = "coverage-7.6.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4c81ed2820b9023a9a90717020315e63b17b18c274a332e3b6437d7ff70abe0"}, + {file = "coverage-7.6.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd55f8fc8fa494958772a2a7302b0354ab16e0b9272b3c3d83cdb5bec5bd1779"}, + {file = "coverage-7.6.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f39e2f3530ed1626c66e7493be7a8423b023ca852aacdc91fb30162c350d2a92"}, + {file = "coverage-7.6.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:716a78a342679cd1177bc8c2fe957e0ab91405bd43a17094324845200b2fddf4"}, + {file = "coverage-7.6.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:177f01eeaa3aee4a5ffb0d1439c5952b53d5010f86e9d2667963e632e30082cc"}, + {file = "coverage-7.6.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:912e95017ff51dc3d7b6e2be158dedc889d9a5cc3382445589ce554f1a34c0ea"}, + {file = "coverage-7.6.8-cp39-cp39-win32.whl", hash = "sha256:4db3ed6a907b555e57cc2e6f14dc3a4c2458cdad8919e40b5357ab9b6db6c43e"}, + {file = "coverage-7.6.8-cp39-cp39-win_amd64.whl", hash = "sha256:428ac484592f780e8cd7b6b14eb568f7c85460c92e2a37cb0c0e5186e1a0d076"}, + {file = "coverage-7.6.8-pp39.pp310-none-any.whl", hash = "sha256:5c52a036535d12590c32c49209e79cabaad9f9ad8aa4cbd875b68c4d67a9cbce"}, + {file = "coverage-7.6.8.tar.gz", hash = "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc"}, +] + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "decli" +version = "0.6.2" +description = "Minimal, easy-to-use, declarative cli tool" +optional = false +python-versions = ">=3.7" +files = [ + {file = "decli-0.6.2-py3-none-any.whl", hash = "sha256:2fc84106ce9a8f523ed501ca543bdb7e416c064917c12a59ebdc7f311a97b7ed"}, + {file = "decli-0.6.2.tar.gz", hash = "sha256:36f71eb55fd0093895efb4f416ec32b7f6e00147dda448e3365cf73ceab42d6f"}, +] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.7" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, + {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<1.0)"] + +[[package]] +name = "httpx" +version = "0.28.0" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.28.0-py3-none-any.whl", hash = "sha256:dc0b419a0cfeb6e8b34e85167c0da2671206f5095f1baa9663d23bcfd6b535fc"}, + {file = "httpx-0.28.0.tar.gz", hash = "sha256:0858d3bab51ba7e386637f22a61d8ccddaeec5f3fe4209da3a6168dbb91573e0"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "3.0.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "mypy" +version = "1.13.0" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"}, + {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"}, + {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"}, + {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"}, + {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"}, + {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"}, + {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"}, + {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"}, + {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"}, + {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"}, + {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"}, + {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"}, + {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"}, + {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"}, + {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"}, + {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"}, + {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"}, + {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"}, + {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"}, + {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"}, + {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"}, + {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"}, + {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"}, + {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"}, + {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"}, + {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"}, + {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +typing-extensions = ">=4.6.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +faster-cache = ["orjson"] +install-types = ["pip"] +mypyc = ["setuptools (>=50)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "packaging" +version = "24.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.36" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.6.2" +files = [ + {file = "prompt_toolkit-3.0.36-py3-none-any.whl", hash = "sha256:aa64ad242a462c5ff0363a7b9cfe696c20d55d9fc60c11fd8e632d064804d305"}, + {file = "prompt_toolkit-3.0.36.tar.gz", hash = "sha256:3e163f254bef5a03b146397d7c1963bd3e2812f0964bb9a24e6ec761fd28db63"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pytest" +version = "8.3.4" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, + {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2" + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "6.0.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.9" +files = [ + {file = "pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0"}, + {file = "pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35"}, +] + +[package.dependencies] +coverage = {version = ">=7.5", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] + +[[package]] +name = "pytest-mock" +version = "3.14.0" +description = "Thin-wrapper around the mock package for easier use with pytest" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, + {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, +] + +[package.dependencies] +pytest = ">=6.2.5" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "questionary" +version = "2.0.1" +description = "Python library to build pretty command line user prompts ⭐️" +optional = false +python-versions = ">=3.8" +files = [ + {file = "questionary-2.0.1-py3-none-any.whl", hash = "sha256:8ab9a01d0b91b68444dff7f6652c1e754105533f083cbe27597c8110ecc230a2"}, + {file = "questionary-2.0.1.tar.gz", hash = "sha256:bcce898bf3dbb446ff62830c86c5c6fb9a22a54146f0f5597d3da43b10d8fc8b"}, +] + +[package.dependencies] +prompt_toolkit = ">=2.0,<=3.0.36" + +[[package]] +name = "rich" +version = "13.9.4" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"}, + {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "ruff" +version = "0.8.1" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.8.1-py3-none-linux_armv6l.whl", hash = "sha256:fae0805bd514066f20309f6742f6ee7904a773eb9e6c17c45d6b1600ca65c9b5"}, + {file = "ruff-0.8.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b8a4f7385c2285c30f34b200ca5511fcc865f17578383db154e098150ce0a087"}, + {file = "ruff-0.8.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cd054486da0c53e41e0086e1730eb77d1f698154f910e0cd9e0d64274979a209"}, + {file = "ruff-0.8.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2029b8c22da147c50ae577e621a5bfbc5d1fed75d86af53643d7a7aee1d23871"}, + {file = "ruff-0.8.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2666520828dee7dfc7e47ee4ea0d928f40de72056d929a7c5292d95071d881d1"}, + {file = "ruff-0.8.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:333c57013ef8c97a53892aa56042831c372e0bb1785ab7026187b7abd0135ad5"}, + {file = "ruff-0.8.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:288326162804f34088ac007139488dcb43de590a5ccfec3166396530b58fb89d"}, + {file = "ruff-0.8.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b12c39b9448632284561cbf4191aa1b005882acbc81900ffa9f9f471c8ff7e26"}, + {file = "ruff-0.8.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:364e6674450cbac8e998f7b30639040c99d81dfb5bbc6dfad69bc7a8f916b3d1"}, + {file = "ruff-0.8.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b22346f845fec132aa39cd29acb94451d030c10874408dbf776af3aaeb53284c"}, + {file = "ruff-0.8.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b2f2f7a7e7648a2bfe6ead4e0a16745db956da0e3a231ad443d2a66a105c04fa"}, + {file = "ruff-0.8.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:adf314fc458374c25c5c4a4a9270c3e8a6a807b1bec018cfa2813d6546215540"}, + {file = "ruff-0.8.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a885d68342a231b5ba4d30b8c6e1b1ee3a65cf37e3d29b3c74069cdf1ee1e3c9"}, + {file = "ruff-0.8.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d2c16e3508c8cc73e96aa5127d0df8913d2290098f776416a4b157657bee44c5"}, + {file = "ruff-0.8.1-py3-none-win32.whl", hash = "sha256:93335cd7c0eaedb44882d75a7acb7df4b77cd7cd0d2255c93b28791716e81790"}, + {file = "ruff-0.8.1-py3-none-win_amd64.whl", hash = "sha256:2954cdbe8dfd8ab359d4a30cd971b589d335a44d444b6ca2cb3d1da21b75e4b6"}, + {file = "ruff-0.8.1-py3-none-win_arm64.whl", hash = "sha256:55873cc1a473e5ac129d15eccb3c008c096b94809d693fc7053f588b67822737"}, + {file = "ruff-0.8.1.tar.gz", hash = "sha256:3583db9a6450364ed5ca3f3b4225958b24f78178908d5c4bc0f46251ccca898f"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "termcolor" +version = "2.5.0" +description = "ANSI color formatting for output in terminal" +optional = false +python-versions = ">=3.9" +files = [ + {file = "termcolor-2.5.0-py3-none-any.whl", hash = "sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8"}, + {file = "termcolor-2.5.0.tar.gz", hash = "sha256:998d8d27da6d48442e8e1f016119076b690d962507531df4890fcd2db2ef8a6f"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] + +[[package]] +name = "tomlkit" +version = "0.13.2" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, + {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.11" +content-hash = "2b8695de61adccab0e17d252ad769631894dd2a6455ea26e93d7b7f236d6ab83" diff --git a/pyproject.toml b/pyproject.toml index 415c1b7..974e20f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,195 +1,50 @@ -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[project] +[tool.poetry] name = "adventofcode" -dynamic = ["version"] +version = "1.10.0" description = "A collection of Advent of Code solutions" -readme = "README.md" -requires-python = ">=3.11" +authors = ["Marcel Blijleven "] license = "MIT" -keywords = [] -authors = [ - { name = "Marcel Blijleven", email = "marcelblijleven@gmail.com" }, -] -classifiers = [ - "Development Status :: 4 - Beta", - "Programming Language :: Python", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy", -] -dependencies = [ - "rich>=10", - -] - -[project.urls] -Documentation = "https://github.com/unknown/adventofcode#readme" -Issues = "https://github.com/unknown/adventofcode/issues" -Source = "https://github.com/unknown/adventofcode" - -[project.scripts] -add-day = "adventofcode.scripts.add_day:add_day" -clean-repo = "adventofcode.scripts.clean_repo:clean_repo" -generate-benchmarks = "adventofcode.scripts.benchmarks:generate_benchmarks" -generate-readme = "adventofcode.scripts.generate_readme:generate_readme" -run-all = "adventofcode.scripts.runner:run_all" - - -[tool.hatch.version] -path = "src/adventofcode/__about__.py" - -[tool.hatch.envs.default] -dependencies = [ - "httpx", - "coverage[toml]>=6.5", - "pytest", - "pytest-cov", - "pytest-mock>=3.10", -] -[tool.hatch.envs.default.scripts] -test = "pytest {args:tests}" -test-cov = "coverage run -m pytest --cov {args:tests} " -cov-report = [ - "- coverage combine", - "coverage report", -] -cov = [ - "test-cov", - "cov-report", -] - -[[tool.hatch.envs.all.matrix]] -python = ["3.11", "3.12"] - -[tool.hatch.envs.lint] -detached = true -dependencies = [ - "black>=23.1.0", - "mypy>=1.0.0", - "ruff>=0.0.243", -] -[tool.hatch.envs.lint.scripts] -typing = "mypy --install-types --non-interactive {args:src/adventofcode}" -style = [ - "ruff {args:.}", - "black --check --diff {args:.}", -] -fmt = [ - "black {args:.}", - "ruff --fix {args:.}", - "style", -] -all = [ - "style", - "typing", -] +readme = "README.md" -[tool.black] -target-version = ["py311"] -line-length = 120 -skip-string-normalization = true +[tool.poetry.dependencies] +python = ">=3.11" +rich = "^13.9.4" -[tool.ruff] -target-version = "py311" -line-length = 120 -select = [ - "A", - "ARG", - "B", - "C", - "DTZ", - "E", - "EM", - "F", - "FBT", - "I", - "ICN", - "ISC", - "N", - "PLC", - "PLE", - "PLR", - "PLW", - "Q", - "RUF", - "S", - "T", - "TID", - "UP", - "W", - "YTT", -] -ignore = [ - # Allow non-abstract empty methods in abstract base classes - "B027", - # Allow boolean positional values in function calls, like `dict.get(... True)` - "FBT003", - # Ignore checks for possible passwords - "S105", "S106", "S107", - # Ignore complexity - "C901", "PLR0911", "PLR0912", "PLR0913", "PLR0915", - # Use of magic values - "PLR2004", - # Use of boolean default values in function definition - "FBT001", "FBT002", - # Exceptions with string literals - "EM101", "EM102", - # Concatenated string literals on one line - "ISC001", -] -unfixable = [ - # Don't touch unused imports - "F401", -] +[tool.poetry.group.dev.dependencies] +httpx = "^0.28.0" +coverage = { extras = ["toml"], version = "^7.6.8" } +pytest = "^8.3.4" +pytest-cov = "^6.0.0" +pytest-mock = "^3.14.0" +ruff = "^0.8.1" +mypy = "^1.13.0" +commitizen = "^4.0.0" -[tool.ruff.isort] +[tool.ruff.lint.isort] known-first-party = ["adventofcode"] -[tool.ruff.flake8-tidy-imports] +[tool.ruff.lint.flake8-tidy-imports] ban-relative-imports = "all" -[tool.ruff.per-file-ignores] -# Tests can use magic values, assertions, and relative imports -"tests/**/*" = ["PLR2004", "S101", "TID252"] - [tool.coverage.run] source_pkgs = ["adventofcode", "tests"] branch = true parallel = true -omit = [ - "src/adventofcode/__about__.py", -] +omit = ["src/adventofcode/__about__.py"] [tool.coverage.paths] -adventofcode = ["src/adventofcode", "*/adventofcode/src/adventofcode"] +adventofcode = ["src/adventofcode", "*/adventofcode/arc/adventofcode"] tests = ["tests", "*/adventofcode/tests"] [tool.coverage.report] -exclude_lines = [ - "no cov", - "if __name__ == .__main__.:", - "if TYPE_CHECKING:", -] +exclude_lines = ["no cov", "if __name__ == __main__:", "if TYPE_CHECKING:"] [tool.commitizen] tag_format = "v$version" version = "1.10.0" -version_files = [ - "src/adventofcode/__about__.py", -] +version_files = ["src/adventofcode/__about__.py"] -[[tool.mypy.overrides]] -module = [ - "rich.console", - "rich.table", - "httpx", - "utils", - "config", -] -disable_error_code = ["name-defined"] -ignore_missing_imports = true \ No newline at end of file +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index f7cfbd4..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -rich==10.14.0 diff --git a/requirements_dev.txt b/requirements_dev.txt deleted file mode 100644 index 3f2cf31..0000000 --- a/requirements_dev.txt +++ /dev/null @@ -1,12 +0,0 @@ --r requirements.txt -pytest==7.2.0 -pytest-cov==4.0.0 -mypy==0.982 -mypy-extensions==0.4.3 -flake8==6.0.0 -pytest-mock==3.10.0 -httpx==0.23.1 -types-requests==2.26.0 -codecov==2.1.12 -isort==5.10.1 -black==22.10.0 \ No newline at end of file diff --git a/src/adventofcode/scripts/add_day.py b/src/adventofcode/scripts/add_day.py index b067b70..3e880b4 100644 --- a/src/adventofcode/scripts/add_day.py +++ b/src/adventofcode/scripts/add_day.py @@ -28,7 +28,9 @@ def add_day(): write_solution_template(solution_file, year, day) # Test file - test_module_path = os.path.abspath(os.path.join(ROOT_DIR, "../../tests/adventofcode", f"year_{year}")) + test_module_path = os.path.abspath( + os.path.join(ROOT_DIR, "../../tests/adventofcode", f"year_{year}") + ) test_file = os.path.join(test_module_path, f"test_day_{day:02}_{year}.py") create_module_dir(test_module_path) write_test_template(test_file, year, day) @@ -42,7 +44,10 @@ def write_solution_template(path: str, year: int, day: int) -> None: write_template(path, read_solution_template(year, day)) console.print(f"[green]Wrote template to {path}") else: - console.print(f"[yellow]Did not write template for year {year} day {day}" ", the file already exists.") + console.print( + f"[yellow]Did not write template for year {year} day {day}" + ", the file already exists." + ) def write_test_template(path: str, year: int, day: int) -> None: @@ -51,7 +56,10 @@ def write_test_template(path: str, year: int, day: int) -> None: write_template(path, read_test_template(year, day)) console.print(f"[green]Wrote test template to {path}") else: - console.print(f"[yellow]Did not write test template for year {year} day {day}" ", the file already exists.") + console.print( + f"[yellow]Did not write test template for year {year} day {day}" + ", the file already exists." + ) def create_module_dir(path: str) -> None: @@ -73,19 +81,27 @@ def verify_input_exists(year: int, day: int) -> None: """Verifies if user input exists, and downloads it if not""" try: _ = get_input_for_day(year, day) - console.print(f"Input data already exists for year {year} day {day}, skipping download") + console.print( + f"Input data already exists for year {year} day {day}, skipping download" + ) return except FileNotFoundError: try: get_input(year, day) - console.print(f"Automatically downloaded input data for year {year} day {day}") + console.print( + f"Automatically downloaded input data for year {year} day {day}" + ) return except HTTPError as e: - console.print("[red]Could not retrieve input data for " f"year {year} day {day} automatically: {e}") + console.print( + "[red]Could not retrieve input data for " + f"year {year} day {day} automatically: {e}" + ) return except FileNotFoundError: console.print( - "[red]Could not retrieve input data for " f"year {year} day {day}: .session not set correctly" + "[red]Could not retrieve input data for " + f"year {year} day {day}: .session not set correctly" ) return diff --git a/src/adventofcode/scripts/benchmarks.py b/src/adventofcode/scripts/benchmarks.py index fe6f2c5..45a3b61 100644 --- a/src/adventofcode/scripts/benchmarks.py +++ b/src/adventofcode/scripts/benchmarks.py @@ -48,7 +48,9 @@ def get_averages(benchmarks: Benchmarks) -> tuple[float, float]: elif solution.startswith("part two"): part_two_solutions.append(benchmark) - return sum(part_one_solutions) / len(part_one_solutions), sum(part_two_solutions) / len(part_two_solutions) + return sum(part_one_solutions) / len(part_one_solutions), sum( + part_two_solutions + ) / len(part_two_solutions) def create_benchmark_text(benchmarks: Benchmarks) -> str: @@ -128,7 +130,9 @@ def write_benchmarks_to_readme(benchmarks: Benchmarks): console.print(table) -def _retrieve_benchmarks_for_day_mp(day_file: str, year: int) -> dict[int, dict[str, float]]: +def _retrieve_benchmarks_for_day_mp( + day_file: str, year: int +) -> dict[int, dict[str, float]]: config.RUNNING_BENCHMARKS = True day = clean_day(day_file) benchmarks: dict[int, dict[str, float]] = {day: {}} @@ -195,7 +199,9 @@ def _retrieve_benchmarks() -> Benchmarks: def _get_extra_solutions_in_module(module: str) -> list[str]: def _eval_functions(f: str) -> bool: - return f not in ["part_one", "part_two"] and (f.startswith("part_one") or f.startswith("part_two")) + return f not in ["part_one", "part_two"] and ( + f.startswith("part_one") or f.startswith("part_two") + ) functions = dir(module) return [f for f in functions if _eval_functions(f)] @@ -232,7 +238,9 @@ def _run_day(module: Any, year: int, day: int, benchmarks: Benchmarks): console.log(f"ran {year} {day:02} {readable_name}") -def _run_day_mp(module: Any, year: int, day: int, benchmarks: dict[int, dict[str, float]]): +def _run_day_mp( + module: Any, year: int, day: int, benchmarks: dict[int, dict[str, float]] +): """ Runs all solutions in the given day """ diff --git a/src/adventofcode/scripts/generate_readme.py b/src/adventofcode/scripts/generate_readme.py index c393be5..dfa2e99 100644 --- a/src/adventofcode/scripts/generate_readme.py +++ b/src/adventofcode/scripts/generate_readme.py @@ -66,7 +66,9 @@ def _update_stars_in_image(): with open(image_dark) as f: svg_content = f.read() - svg_content = _replace_between_tags(svg_content, content, "", "") + svg_content = _replace_between_tags( + svg_content, content, "", "" + ) with open(image_dark, "w") as f: f.write(svg_content) @@ -74,7 +76,9 @@ def _update_stars_in_image(): with open(image_light) as f: svg_content = f.read() - svg_content = _replace_between_tags(svg_content, content, "", "") + svg_content = _replace_between_tags( + svg_content, content, "", "" + ) with open(image_light, "w") as f: f.write(svg_content) @@ -82,7 +86,14 @@ def _update_stars_in_image(): def _count_stars() -> int: found = _find_completed_days() - return sum([val for days in found.values() for parts in days.values() for val in parts.values()]) + return sum( + [ + val + for days in found.values() + for parts in days.values() + for val in parts.values() + ] + ) def _update_year_readme(year: int) -> None: diff --git a/src/adventofcode/util/helpers.py b/src/adventofcode/util/helpers.py index 2679171..1d17ea3 100644 --- a/src/adventofcode/util/helpers.py +++ b/src/adventofcode/util/helpers.py @@ -44,7 +44,9 @@ def _get_prefix(year: int, day: int, part: int, version: str) -> str: return prefix -def solution_timer(solution_input: Any, func: Callable, year: int, day: int, part: int, version: str): # type: ignore +def solution_timer( + solution_input: Any, func: Callable, year: int, day: int, part: int, version: str +): # type: ignore prefix = _get_prefix(year, day, part, version) try: start = time.perf_counter() diff --git a/src/adventofcode/util/module_helpers.py b/src/adventofcode/util/module_helpers.py index 2bd8367..ffff869 100644 --- a/src/adventofcode/util/module_helpers.py +++ b/src/adventofcode/util/module_helpers.py @@ -8,7 +8,11 @@ def get_full_year_paths() -> list[str]: """ Retrieves all directories in the ROOT_DIR that start with 'year_' """ - paths = [os.path.join(ROOT_DIR, val) for val in os.listdir(ROOT_DIR) if val.startswith("year_")] + paths = [ + os.path.join(ROOT_DIR, val) + for val in os.listdir(ROOT_DIR) + if val.startswith("year_") + ] return sorted(paths) @@ -16,7 +20,11 @@ def get_full_day_paths(year_path: str) -> list[str]: """ Retrieves all files in the ROOT_DIR/year_{year} directory that start with 'day_' """ - paths = [os.path.join(year_path, val) for val in os.listdir(year_path) if val.startswith("day_")] + paths = [ + os.path.join(year_path, val) + for val in os.listdir(year_path) + if val.startswith("day_") + ] return sorted(paths) diff --git a/src/adventofcode/year_2015/day_02_2015.py b/src/adventofcode/year_2015/day_02_2015.py index 0e12ab3..46e98a2 100644 --- a/src/adventofcode/year_2015/day_02_2015.py +++ b/src/adventofcode/year_2015/day_02_2015.py @@ -16,7 +16,11 @@ def __init__(self, width: int, height: int, length: int): @property def surface(self) -> int: - surface_area = 2 * self.length * self.width + 2 * self.width * self.height + 2 * self.height * self.length + surface_area = ( + 2 * self.length * self.width + + 2 * self.width * self.height + + 2 * self.height * self.length + ) extra = [ self.length * self.width, diff --git a/src/adventofcode/year_2015/day_05_2015.py b/src/adventofcode/year_2015/day_05_2015.py index 7014cdd..219c668 100644 --- a/src/adventofcode/year_2015/day_05_2015.py +++ b/src/adventofcode/year_2015/day_05_2015.py @@ -35,7 +35,11 @@ def _check_double_characters(line: str) -> bool: def is_nice(line: str) -> bool: - return _check_double_characters(line) and _check_forbidden_characters(line) and _check_vowels(line) + return ( + _check_double_characters(line) + and _check_forbidden_characters(line) + and _check_vowels(line) + ) @register_solution(2015, 5, 1) diff --git a/src/adventofcode/year_2015/day_09_2015.py b/src/adventofcode/year_2015/day_09_2015.py index 3fb6198..de27aa3 100644 --- a/src/adventofcode/year_2015/day_09_2015.py +++ b/src/adventofcode/year_2015/day_09_2015.py @@ -35,7 +35,9 @@ def get_all_routes(cities: list[str]) -> list[tuple[str, ...]]: return routes -def _get_route_distances(routes: list[tuple[str, ...]], dist_dict: DistDictType) -> list[int]: +def _get_route_distances( + routes: list[tuple[str, ...]], dist_dict: DistDictType +) -> list[int]: distances = [] for route in routes: distance = 0 diff --git a/src/adventofcode/year_2015/day_11_2015.py b/src/adventofcode/year_2015/day_11_2015.py index a4f5d1a..3af53f0 100644 --- a/src/adventofcode/year_2015/day_11_2015.py +++ b/src/adventofcode/year_2015/day_11_2015.py @@ -80,7 +80,12 @@ def increment_password(password: str) -> str: seventh = sixth + 1 # e.g. 'c' eighth = seventh # e.g. 'c' - password = "".join([chr(char) for char in int_password[:3] + [fourth, fifth, sixth, seventh, eighth]]) + password = "".join( + [ + chr(char) + for char in int_password[:3] + [fourth, fifth, sixth, seventh, eighth] + ] + ) if not is_valid(password): raise ValueError("password invalid") diff --git a/src/adventofcode/year_2015/day_13_2015.py b/src/adventofcode/year_2015/day_13_2015.py index 6320320..0d7be66 100644 --- a/src/adventofcode/year_2015/day_13_2015.py +++ b/src/adventofcode/year_2015/day_13_2015.py @@ -73,7 +73,9 @@ def get_seating_happiness(persons: list[str], chart: HappinessChartType) -> int: return max_happiness -def update_happiness_chart(chart: HappinessChartType, person: str) -> HappinessChartType: +def update_happiness_chart( + chart: HappinessChartType, person: str +) -> HappinessChartType: persons = get_unique_persons(chart) persons.append(person) diff --git a/src/adventofcode/year_2015/day_14_2015.py b/src/adventofcode/year_2015/day_14_2015.py index 655578e..571984e 100644 --- a/src/adventofcode/year_2015/day_14_2015.py +++ b/src/adventofcode/year_2015/day_14_2015.py @@ -81,14 +81,20 @@ def get_reindeer(input_data: list[str]) -> list[Reindeer]: for line in input_data: if (matched := PATTERN.match(line)) and matched is not None: name, speed, fly_duration, rest_duration = matched.groups() - reindeer.append(Reindeer(name, int(speed), int(fly_duration), int(rest_duration))) + reindeer.append( + Reindeer(name, int(speed), int(fly_duration), int(rest_duration)) + ) return reindeer def check_leaderboard_and_assign_points(reindeer: list[Reindeer]): leader = sorted(reindeer, reverse=True)[0] - tied_racers = [racer for racer in reindeer if racer.distance_travelled == leader.distance_travelled] + tied_racers = [ + racer + for racer in reindeer + if racer.distance_travelled == leader.distance_travelled + ] for racer in tied_racers: racer.assign_point() diff --git a/src/adventofcode/year_2015/day_15_2015.py b/src/adventofcode/year_2015/day_15_2015.py index 133cb86..9929f2b 100644 --- a/src/adventofcode/year_2015/day_15_2015.py +++ b/src/adventofcode/year_2015/day_15_2015.py @@ -68,7 +68,9 @@ def calories(self) -> int: @property def score(self) -> int: capacity = sum([ingredient.get_capacity() for ingredient in self.ingredients]) - durability = sum([ingredient.get_durability() for ingredient in self.ingredients]) + durability = sum( + [ingredient.get_durability() for ingredient in self.ingredients] + ) flavor = sum([ingredient.get_flavor() for ingredient in self.ingredients]) texture = sum([ingredient.get_texture() for ingredient in self.ingredients]) @@ -89,14 +91,18 @@ def parse_ingredients(input_data: list[str]) -> list[Ingredient]: for line in input_data: name, content = line.split(": ") - capacity, durability, flavor, texture, calories = map(int, PATTERN.findall(content)) + capacity, durability, flavor, texture, calories = map( + int, PATTERN.findall(content) + ) ingredient = Ingredient(name, capacity, durability, flavor, texture, calories) ingredients.append(ingredient) return ingredients -def find_highest_scoring_cookie(input_data: list[str], match_calories: bool = False) -> int: +def find_highest_scoring_cookie( + input_data: list[str], match_calories: bool = False +) -> int: highest_score = 0 ingredients = parse_ingredients(input_data) max_ingredients = 100 diff --git a/src/adventofcode/year_2015/day_17_2015.py b/src/adventofcode/year_2015/day_17_2015.py index 666af82..b7312c6 100644 --- a/src/adventofcode/year_2015/day_17_2015.py +++ b/src/adventofcode/year_2015/day_17_2015.py @@ -44,7 +44,13 @@ def find_different_ways(input_data: list[str], liters: int = 150) -> int: ) possible_combinations.append(combination) - return len([container for container in possible_combinations if len(container) == minimum_containers]) + return len( + [ + container + for container in possible_combinations + if len(container) == minimum_containers + ] + ) @register_solution(2015, 17, 1) diff --git a/src/adventofcode/year_2015/day_21_2015.py b/src/adventofcode/year_2015/day_21_2015.py index 0e0cd8c..56ea93e 100644 --- a/src/adventofcode/year_2015/day_21_2015.py +++ b/src/adventofcode/year_2015/day_21_2015.py @@ -85,9 +85,18 @@ def calculate_cost(boss: Character): # only one armor for ring_one, ring_two in itertools.combinations(rings, 2): # two rings - total_cost = weapon.cost + armor_item.cost + ring_one.cost + ring_two.cost - total_damage = weapon.damage + armor_item.damage + ring_one.damage + ring_two.damage - total_armor = weapon.armor + armor_item.armor + ring_one.armor + ring_two.armor + total_cost = ( + weapon.cost + armor_item.cost + ring_one.cost + ring_two.cost + ) + total_damage = ( + weapon.damage + + armor_item.damage + + ring_one.damage + + ring_two.damage + ) + total_armor = ( + weapon.armor + armor_item.armor + ring_one.armor + ring_two.armor + ) player = Character(health=100, damage=total_damage, armor=total_armor) diff --git a/src/adventofcode/year_2015/day_22_2015.py b/src/adventofcode/year_2015/day_22_2015.py index 91b531f..5457086 100644 --- a/src/adventofcode/year_2015/day_22_2015.py +++ b/src/adventofcode/year_2015/day_22_2015.py @@ -144,7 +144,9 @@ def run_simulation( if player_health <= 0: return False - status_result = apply_status_effects(status_effects, boss_health, player_health, player_armor, player_mana) + status_result = apply_status_effects( + status_effects, boss_health, player_health, player_armor, player_mana + ) ( next_effects, boss_health, @@ -171,7 +173,9 @@ def run_simulation( run_simulation, ) else: - player_health += player_armor - boss_damage if player_armor - boss_damage < 0 else -1 + player_health += ( + player_armor - boss_damage if player_armor - boss_damage < 0 else -1 + ) if player_health > 0: run_simulation( boss_health, @@ -182,7 +186,9 @@ def run_simulation( mana_spent, ) - run_simulation(boss_starting_health, player_starting_health, player_starting_mana, (), True, 0) + run_simulation( + boss_starting_health, player_starting_health, player_starting_mana, (), True, 0 + ) return minimum_mana diff --git a/src/adventofcode/year_2020/day_02_2020.py b/src/adventofcode/year_2020/day_02_2020.py index cd40d2f..ebd550a 100644 --- a/src/adventofcode/year_2020/day_02_2020.py +++ b/src/adventofcode/year_2020/day_02_2020.py @@ -37,7 +37,9 @@ def matches(self) -> Sequence[str]: return self._matches def is_valid(self) -> bool: - return self.password.count(self.letter) in range(self.lower_bound, self.upper_bound + 1) + return self.password.count(self.letter) in range( + self.lower_bound, self.upper_bound + 1 + ) def is_valid_part_two(self) -> bool: position_one = self.password[self.lower_bound - 1] == self.letter diff --git a/src/adventofcode/year_2020/day_04_2020.py b/src/adventofcode/year_2020/day_04_2020.py index 7e85fa0..f2ae224 100644 --- a/src/adventofcode/year_2020/day_04_2020.py +++ b/src/adventofcode/year_2020/day_04_2020.py @@ -53,7 +53,9 @@ def expiration_check(value: str) -> bool: def height_check(value: str) -> bool: height = "".join([char for char in value if char.isdigit()]) unit = "".join([char for char in value if char.isalpha()]) - return (unit == "cm" and _range_check(height, 150, 193)) or (unit == "in" and _range_check(height, 59, 76)) + return (unit == "cm" and _range_check(height, 150, 193)) or ( + unit == "in" and _range_check(height, 59, 76) + ) def hair_color_check(value: str) -> bool: diff --git a/src/adventofcode/year_2020/day_05_2020.py b/src/adventofcode/year_2020/day_05_2020.py index 30b31b9..bbd03b7 100644 --- a/src/adventofcode/year_2020/day_05_2020.py +++ b/src/adventofcode/year_2020/day_05_2020.py @@ -48,7 +48,12 @@ def _part_one_binary_version(input_data: list[str]) -> list[int]: for boarding_pass in input_data: # could also use a translation table # boarding_pass.translate(str.maketrans({'B': '1', 'F': '0', 'R': '1', 'L': '0'}) - _boarding_pass = boarding_pass.replace("B", "1").replace("F", "0").replace("R", "1").replace("L", "0") + _boarding_pass = ( + boarding_pass.replace("B", "1") + .replace("F", "0") + .replace("R", "1") + .replace("L", "0") + ) ids.append(int(_boarding_pass, 2)) if not ids: diff --git a/src/adventofcode/year_2020/day_10_2020.py b/src/adventofcode/year_2020/day_10_2020.py index 86b0015..c56dbf1 100644 --- a/src/adventofcode/year_2020/day_10_2020.py +++ b/src/adventofcode/year_2020/day_10_2020.py @@ -7,7 +7,9 @@ def find_differences(input_data: list[int]) -> list[int]: working_list = sorted([0, *input_data, max(input_data) + 3]) - differences = [y - x for x, y in zip(working_list[:-1], working_list[1:], strict=True)] # noqa + differences = [ + y - x for x, y in zip(working_list[:-1], working_list[1:], strict=True) + ] # noqa return differences diff --git a/src/adventofcode/year_2020/day_11_2020.py b/src/adventofcode/year_2020/day_11_2020.py index fb6926c..867e1c8 100644 --- a/src/adventofcode/year_2020/day_11_2020.py +++ b/src/adventofcode/year_2020/day_11_2020.py @@ -30,10 +30,14 @@ def get_x_y_range(layout: LayoutType) -> tuple[int, int]: return max_x, max_y -def get_adjacent_coordinates(layout: LayoutType, current_x: int, current_y: int) -> LayoutType: +def get_adjacent_coordinates( + layout: LayoutType, current_x: int, current_y: int +) -> LayoutType: adjacent_coordinates = {} - for x, y in [(current_x + i, current_y + j) for i in [-1, 0, 1] for j in [-1, 0, 1]]: + for x, y in [ + (current_x + i, current_y + j) for i in [-1, 0, 1] for j in [-1, 0, 1] + ]: if (x, y) in layout: adjacent_coordinates[x, y] = layout[x, y] @@ -52,10 +56,14 @@ def seating_iteration(layout: LayoutType): adjacent_coordinates = get_adjacent_coordinates(layout, x, y) if layout[x, y] == FREE_SEAT: - if [v for k, v in adjacent_coordinates.items() if k != (x, y)].count(TAKEN_SEAT) == 0: + if [v for k, v in adjacent_coordinates.items() if k != (x, y)].count( + TAKEN_SEAT + ) == 0: new_layout[x, y] = TAKEN_SEAT elif layout[x, y] == TAKEN_SEAT: - if [v for k, v in adjacent_coordinates.items() if k != (x, y)].count(TAKEN_SEAT) >= 4: + if [v for k, v in adjacent_coordinates.items() if k != (x, y)].count( + TAKEN_SEAT + ) >= 4: new_layout[x, y] = FREE_SEAT return new_layout @@ -95,7 +103,9 @@ def part_one(_input): return taken_seats -def seats_in_line_of_sight(layout: LayoutType, current_x: int, current_y: int) -> LayoutType: +def seats_in_line_of_sight( + layout: LayoutType, current_x: int, current_y: int +) -> LayoutType: directions = { "left": (-1, 0), "right": (1, 0), @@ -142,7 +152,9 @@ def los_seating_iteration(layout: LayoutType, tolerance=5) -> LayoutType: if [v for k, v in seats.items() if k != (x, y)].count(TAKEN_SEAT) == 0: new_layout[x, y] = TAKEN_SEAT elif layout[x, y] == TAKEN_SEAT: - if [v for k, v in seats.items() if k != (x, y)].count(TAKEN_SEAT) >= tolerance: + if [v for k, v in seats.items() if k != (x, y)].count( + TAKEN_SEAT + ) >= tolerance: new_layout[x, y] = FREE_SEAT return new_layout diff --git a/src/adventofcode/year_2020/day_12_2020.py b/src/adventofcode/year_2020/day_12_2020.py index b18d732..b27b23f 100644 --- a/src/adventofcode/year_2020/day_12_2020.py +++ b/src/adventofcode/year_2020/day_12_2020.py @@ -83,7 +83,9 @@ def _turn_waypoint_right(waypoint: tuple[int, int], degrees: int) -> tuple[int, return x, y -def turn_waypoint(waypoint: tuple[int, int], direction: str, degrees: int) -> tuple[int, int]: +def turn_waypoint( + waypoint: tuple[int, int], direction: str, degrees: int +) -> tuple[int, int]: if direction == LEFT: return _turn_waypoint_left(waypoint, degrees) elif direction == RIGHT: @@ -92,7 +94,9 @@ def turn_waypoint(waypoint: tuple[int, int], direction: str, degrees: int) -> tu raise ValueError(f"cannot process unknown direction: {direction}") -def move_waypoint(waypoint: tuple[int, int], action: str, number: int) -> tuple[int, int]: +def move_waypoint( + waypoint: tuple[int, int], action: str, number: int +) -> tuple[int, int]: x, y = waypoint if action == NORTH: diff --git a/src/adventofcode/year_2020/day_13_2020.py b/src/adventofcode/year_2020/day_13_2020.py index 1f72749..84f89c5 100644 --- a/src/adventofcode/year_2020/day_13_2020.py +++ b/src/adventofcode/year_2020/day_13_2020.py @@ -7,7 +7,9 @@ def parse_input(input_data: list[str]) -> tuple[int, list[int]]: timestamp = int(input_data[0]) - busses = list(map(int, [value for value in input_data[1].split(",") if value.isdigit()])) + busses = list( + map(int, [value for value in input_data[1].split(",") if value.isdigit()]) + ) return timestamp, busses @@ -31,7 +33,9 @@ def get_sequential_departure_times(bus_schedule: str): timestamp = 1 index = 0 - for idx, bus in [(idx, bus) for idx, bus in enumerate(bus_schedule.split(",")) if bus.isdigit()]: + for idx, bus in [ + (idx, bus) for idx, bus in enumerate(bus_schedule.split(",")) if bus.isdigit() + ]: while True: index += timestamp diff --git a/src/adventofcode/year_2020/day_14_2020.py b/src/adventofcode/year_2020/day_14_2020.py index d3c2063..3887b6e 100644 --- a/src/adventofcode/year_2020/day_14_2020.py +++ b/src/adventofcode/year_2020/day_14_2020.py @@ -20,7 +20,10 @@ def value_to_36_bit_string(value: str) -> str: def apply_mask_to_value(value: str, mask: str) -> int: masked = "".join( - [value if mask_value == "X" else mask_value for value, mask_value in zip(value, mask, strict=True)] + [ + value if mask_value == "X" else mask_value + for value, mask_value in zip(value, mask, strict=True) + ] ) return int(masked, 2) @@ -31,7 +34,10 @@ def apply_mask_to_address(address: str, mask: str) -> Generator[int, None, None] bits = ["0", "1"] * floating_bits masked_address = "".join( - [character if mask_value == "0" else mask_value for character, mask_value in zip(address, mask, strict=True)] + [ + character if mask_value == "0" else mask_value + for character, mask_value in zip(address, mask, strict=True) + ] ) for combination in set(combinations(bits, floating_bits)): diff --git a/src/adventofcode/year_2020/day_16_2020.py b/src/adventofcode/year_2020/day_16_2020.py index 49cd13a..35080a3 100644 --- a/src/adventofcode/year_2020/day_16_2020.py +++ b/src/adventofcode/year_2020/day_16_2020.py @@ -29,7 +29,9 @@ def get_rules(input_data: list[str]) -> Rules: matches = match.groups() rule = matches[0] - lower_bound_a, upper_bound_a, lower_bound_b, upper_bound_b = map(int, matches[1:]) + lower_bound_a, upper_bound_a, lower_bound_b, upper_bound_b = map( + int, matches[1:] + ) rules[rule] = [lower_bound_a, upper_bound_a, lower_bound_b, upper_bound_b] return rules @@ -62,7 +64,9 @@ def evaluate_tickets(tickets: list[Ticket], rules: Rules) -> int: return sum(seen_invalid_numbers) -def find_rules_for_columns(columns: list[tuple[int, ...]], rules: Rules) -> dict[int, set[str]]: +def find_rules_for_columns( + columns: list[tuple[int, ...]], rules: Rules +) -> dict[int, set[str]]: rules_for_columns: dict[int, set[str]] = {} for index, column in enumerate(columns): @@ -70,13 +74,20 @@ def find_rules_for_columns(columns: list[tuple[int, ...]], rules: Rules) -> dict for rule, bounds in rules.items(): lower_a, upper_a, lower_b, upper_b = bounds - if all([lower_a <= number <= upper_a or lower_b <= number <= upper_b for number in column]): # noqa + if all( + [ + lower_a <= number <= upper_a or lower_b <= number <= upper_b + for number in column + ] + ): # noqa rules_for_columns[index].add(rule) return rules_for_columns -def reduce_column_rules(column_rules: dict[int, set[str]], available_rules: set[str]) -> dict[str, int]: +def reduce_column_rules( + column_rules: dict[int, set[str]], available_rules: set[str] +) -> dict[str, int]: for column, rules in column_rules.items(): if len(rules) == 1: try: @@ -95,7 +106,9 @@ def reduce_column_rules(column_rules: dict[int, set[str]], available_rules: set[ def find_order(tickets: list[Ticket], rules: Rules) -> dict[str, int]: columns = list(zip(*tickets, strict=True)) available_rules = set(rules.keys()) - column_rules: dict[str, int] = reduce_column_rules(find_rules_for_columns(columns, rules), available_rules) + column_rules: dict[str, int] = reduce_column_rules( + find_rules_for_columns(columns, rules), available_rules + ) return column_rules diff --git a/src/adventofcode/year_2021/day_02_2021.py b/src/adventofcode/year_2021/day_02_2021.py index 85dbd66..8b21115 100644 --- a/src/adventofcode/year_2021/day_02_2021.py +++ b/src/adventofcode/year_2021/day_02_2021.py @@ -40,7 +40,9 @@ def _get_new_position(position: Position, instruction: Instruction) -> Position: return x, y -def _get_new_position_with_aim(position: Position, aim: int, instruction: Instruction) -> tuple[Position, int]: +def _get_new_position_with_aim( + position: Position, aim: int, instruction: Instruction +) -> tuple[Position, int]: x, y = position direction, steps = instruction @@ -57,7 +59,9 @@ def _get_new_position_with_aim(position: Position, aim: int, instruction: Instru return (x, y), aim -def get_new_position(position: Position, aim: int, instruction: Instruction, include_aim: bool) -> tuple[Position, int]: +def get_new_position( + position: Position, aim: int, instruction: Instruction, include_aim: bool +) -> tuple[Position, int]: if not include_aim: return _get_new_position(position, instruction), 0 diff --git a/src/adventofcode/year_2021/day_05_2021.py b/src/adventofcode/year_2021/day_05_2021.py index 14c5d12..0b157d3 100644 --- a/src/adventofcode/year_2021/day_05_2021.py +++ b/src/adventofcode/year_2021/day_05_2021.py @@ -36,7 +36,9 @@ def get_line(positions: LinePositions) -> Line: dx = bool(x2 > x1) - bool(x2 < x1) dy = bool(y2 > y1) - bool(y2 < y1) - return [(x1 + n * dx, y1 + n * dy) for n in range(max(abs(x2 - x1), abs(y2 - y1)) + 1)] + return [ + (x1 + n * dx, y1 + n * dy) for n in range(max(abs(x2 - x1), abs(y2 - y1)) + 1) + ] def get_lines(positions_list: list[LinePositions]) -> Generator[Line, None, None]: @@ -54,7 +56,9 @@ def count_intersections(parsed_input: list[LinePositions]) -> int: return len([value for value in seen.values() if value > 1]) -def parse_input(input_data: list[str], filter_diagonal: bool = True) -> list[LinePositions]: +def parse_input( + input_data: list[str], filter_diagonal: bool = True +) -> list[LinePositions]: lines: list[LinePositions] = [] for line in input_data: diff --git a/src/adventofcode/year_2021/day_06_2021.py b/src/adventofcode/year_2021/day_06_2021.py index 1419cda..bb123c0 100644 --- a/src/adventofcode/year_2021/day_06_2021.py +++ b/src/adventofcode/year_2021/day_06_2021.py @@ -80,7 +80,9 @@ def count_fish_faster(input_data: list[str], stop_after: int) -> int: cyclic_days[f] += 1 for day in range(stop_after): - target_day = day % len(cyclic_days) # This will make it loop back to the start of the days list + target_day = day % len( + cyclic_days + ) # This will make it loop back to the start of the days list fish = cyclic_days[target_day] next_spawn_day_existing_fish = (target_day + 7) % number_of_days diff --git a/src/adventofcode/year_2021/day_07_2021.py b/src/adventofcode/year_2021/day_07_2021.py index adab749..8a01f1b 100644 --- a/src/adventofcode/year_2021/day_07_2021.py +++ b/src/adventofcode/year_2021/day_07_2021.py @@ -41,7 +41,9 @@ def get_least_amount_of_fuel_part_two_slower(crabs: list[int]) -> int: fuel = sum(gaussian_sum(abs(crab - mid)) for crab in crabs) for position in range(min(crabs[mid:]), max(crabs) + 1): - position_fuel = min(fuel, sum(gaussian_sum(abs(crab - position)) for crab in crabs)) + position_fuel = min( + fuel, sum(gaussian_sum(abs(crab - position)) for crab in crabs) + ) fuel = min(fuel, position_fuel) return fuel diff --git a/src/adventofcode/year_2021/day_08_2021.py b/src/adventofcode/year_2021/day_08_2021.py index 315f3e3..11c7df1 100644 --- a/src/adventofcode/year_2021/day_08_2021.py +++ b/src/adventofcode/year_2021/day_08_2021.py @@ -75,7 +75,9 @@ def patterns_as_frozen_sets(patterns: list[str]) -> list[frozenset[str]]: return list(map(frozenset, patterns)) # type: ignore -def _fill_table_with_know_patterns(patterns: list[frozenset[str]], table: TranslationTable): +def _fill_table_with_know_patterns( + patterns: list[frozenset[str]], table: TranslationTable +): for pattern in patterns: if len(pattern) == 2: table[pattern] = 1 diff --git a/src/adventofcode/year_2021/day_09_2021.py b/src/adventofcode/year_2021/day_09_2021.py index 1b8128c..07433c4 100644 --- a/src/adventofcode/year_2021/day_09_2021.py +++ b/src/adventofcode/year_2021/day_09_2021.py @@ -50,7 +50,9 @@ def get_low_points(cave_floor: CaveFloor, width: int, height: int) -> list[Posit return positions -def calculate_basin(cave_floor: CaveFloor, position: Position, basin: set[Position]) -> set[Position]: +def calculate_basin( + cave_floor: CaveFloor, position: Position, basin: set[Position] +) -> set[Position]: x, y = position left, right, top, down = (x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1) @@ -87,13 +89,17 @@ def find_basin_size_product(cave_floor: CaveFloor, width: int, height: int) -> i return math.prod(basin_sizes[-3:]) -async def calculate_basin_async(cave_floor: CaveFloor, position: Position) -> list[tuple[int, int]]: +async def calculate_basin_async( + cave_floor: CaveFloor, position: Position +) -> list[tuple[int, int]]: basin: set[Position] = set() basin = calculate_basin(cave_floor, position, basin) return list(basin) -async def find_basin_size_product_async(cave_floor: CaveFloor, width: int, height: int) -> int: +async def find_basin_size_product_async( + cave_floor: CaveFloor, width: int, height: int +) -> int: low_points = get_low_points(cave_floor, width, height) position_queue: Queue[Position] = asyncio.Queue() tasks = [] @@ -107,7 +113,9 @@ async def find_basin_size_product_async(cave_floor: CaveFloor, width: int, heigh return math.prod(lengths[-3:]) -def calculate_basin_mp(cave_floor: CaveFloor, position: Position) -> list[tuple[int, int]]: +def calculate_basin_mp( + cave_floor: CaveFloor, position: Position +) -> list[tuple[int, int]]: basin: set[Position] = set() basin = calculate_basin(cave_floor, position, basin) return list(basin) diff --git a/src/adventofcode/year_2021/day_11_2021.py b/src/adventofcode/year_2021/day_11_2021.py index 6213a9e..92e4c4e 100644 --- a/src/adventofcode/year_2021/day_11_2021.py +++ b/src/adventofcode/year_2021/day_11_2021.py @@ -44,7 +44,11 @@ def _adjacent_octopuses(self) -> list[Position]: (x + 1, y + 1), ] - return [octopus for octopus in octopuses if 0 <= octopus[0] <= 9 and 0 <= octopus[1] <= 9] + return [ + octopus + for octopus in octopuses + if 0 <= octopus[0] <= 9 and 0 <= octopus[1] <= 9 + ] def flash(self, grid: dict[Position, Octopus]): self.energy = 0 @@ -120,7 +124,10 @@ def tick(self): for coord in octopus.adjacent_octopuses: adjacent_octopus = self.grid[coord] - if adjacent_octopus not in self.can_flash and adjacent_octopus.can_flash: + if ( + adjacent_octopus not in self.can_flash + and adjacent_octopus.can_flash + ): self.can_flash.append(adjacent_octopus) if flashed_during_tick == self.total_octopuses: diff --git a/src/adventofcode/year_2021/day_12_2021.py b/src/adventofcode/year_2021/day_12_2021.py index 73434ac..dc08671 100644 --- a/src/adventofcode/year_2021/day_12_2021.py +++ b/src/adventofcode/year_2021/day_12_2021.py @@ -64,9 +64,13 @@ def traverse_part_two(self, cave: str, visited: set[str], revisit=True) -> int: visited.add(cave) paths = self.paths[cave] - return sum(self.traverse_part_two(path, visited.copy(), revisit) for path in paths) + return sum( + self.traverse_part_two(path, visited.copy(), revisit) for path in paths + ) - def traverse_with_print(self, cave: str, visited: set[str], path_flow: str = "") -> int: + def traverse_with_print( + self, cave: str, visited: set[str], path_flow: str = "" + ) -> int: if path_flow == "": path_flow = f"{cave}" else: @@ -83,7 +87,9 @@ def traverse_with_print(self, cave: str, visited: set[str], path_flow: str = "") visited.add(cave) paths = self.paths[cave] - return sum(self.traverse_with_print(path, visited.copy(), path_flow) for path in paths) + return sum( + self.traverse_with_print(path, visited.copy(), path_flow) for path in paths + ) @register_solution(2021, 12, 1) diff --git a/src/adventofcode/year_2021/day_16_2021.py b/src/adventofcode/year_2021/day_16_2021.py index a548812..aae8d25 100644 --- a/src/adventofcode/year_2021/day_16_2021.py +++ b/src/adventofcode/year_2021/day_16_2021.py @@ -173,18 +173,24 @@ def read_outer_packet(buffer: io.StringIO) -> tuple[list[int], int]: if length_type == 0: total_length = int(buffer.read(15), 2) - packet_versions, packet_value = read_packets_until_length(buffer, total_length, type_id) + packet_versions, packet_value = read_packets_until_length( + buffer, total_length, type_id + ) versions += packet_versions else: number_of_packets = int(buffer.read(11), 2) - packet_versions, packet_value = read_packets_until_all_read(buffer, number_of_packets, type_id) + packet_versions, packet_value = read_packets_until_all_read( + buffer, number_of_packets, type_id + ) versions += packet_versions read_garbage_bits(buffer) return versions, packet_value -def read_packets_until_length(buffer: io.StringIO, total_length: int, parent_type_id: int) -> tuple[list[int], int]: +def read_packets_until_length( + buffer: io.StringIO, total_length: int, parent_type_id: int +) -> tuple[list[int], int]: """ Reads packets from the buffer until the total amount of bits read equals the total length parameter """ @@ -256,7 +262,9 @@ def read_type_four_packet(buffer: io.StringIO) -> int: return int(value, 2) -def read_operator_packet(buffer: io.StringIO, parent_type_id: int) -> tuple[list[int], int]: +def read_operator_packet( + buffer: io.StringIO, parent_type_id: int +) -> tuple[list[int], int]: """ Determines the length type id for the packet and calls the correct operator packet reader. @@ -270,10 +278,14 @@ def read_operator_packet(buffer: io.StringIO, parent_type_id: int) -> tuple[list if length_type_id == 0: total_length = int(buffer.read(15), 2) - packet_versions, packet_value = read_packets_until_length(buffer, total_length, parent_type_id) + packet_versions, packet_value = read_packets_until_length( + buffer, total_length, parent_type_id + ) elif length_type_id == 1: total_packets = int(buffer.read(11), 2) - packet_versions, packet_value = read_packets_until_all_read(buffer, total_packets, parent_type_id) + packet_versions, packet_value = read_packets_until_all_read( + buffer, total_packets, parent_type_id + ) else: raise ValueError(f'unexpected length type "{length_type_id}" received') diff --git a/src/adventofcode/year_2021/day_18_2021.py b/src/adventofcode/year_2021/day_18_2021.py index ecd8fc0..3f4ab40 100644 --- a/src/adventofcode/year_2021/day_18_2021.py +++ b/src/adventofcode/year_2021/day_18_2021.py @@ -123,7 +123,9 @@ def calculate_magnitude(snailfish_number: str) -> int: left, right = get_pair_numbers(pair.group()) pair_value = left * 3 + right * 2 span = pair.span() - snailfish_number = f"{snailfish_number[:span[0]]}{pair_value}{snailfish_number[span[1]:]}" + snailfish_number = ( + f"{snailfish_number[:span[0]]}{pair_value}{snailfish_number[span[1]:]}" + ) return calculate_magnitude(snailfish_number) raise ValueError(f"cannot parse snailfish number: {snailfish_number}") diff --git a/src/adventofcode/year_2021/day_20_2021.py b/src/adventofcode/year_2021/day_20_2021.py index acc4ad2..6a8752c 100644 --- a/src/adventofcode/year_2021/day_20_2021.py +++ b/src/adventofcode/year_2021/day_20_2021.py @@ -11,7 +11,9 @@ STEP = 0 -def get_algorithm_position_for_pixel_simplified(pixel: Pixel, infinity_grid: defaultdict[Pixel, int]) -> int: +def get_algorithm_position_for_pixel_simplified( + pixel: Pixel, infinity_grid: defaultdict[Pixel, int] +) -> int: pixel_grid = [ (-1, -1), (+0, -1), @@ -23,11 +25,18 @@ def get_algorithm_position_for_pixel_simplified(pixel: Pixel, infinity_grid: def (+0, +1), (+1, +1), ] - algo_position = "".join([str(infinity_grid[pixel[0] + offset[0], pixel[1] + offset[1]]) for offset in pixel_grid]) + algo_position = "".join( + [ + str(infinity_grid[pixel[0] + offset[0], pixel[1] + offset[1]]) + for offset in pixel_grid + ] + ) return int(algo_position, 2) -def get_algorithm_position_for_pixel(pixel: Pixel, infinity_grid: defaultdict[Pixel, int]) -> int: +def get_algorithm_position_for_pixel( + pixel: Pixel, infinity_grid: defaultdict[Pixel, int] +) -> int: pixel_grid = [ (-1, -1), (+0, -1), diff --git a/src/adventofcode/year_2021/day_21_2021.py b/src/adventofcode/year_2021/day_21_2021.py index 9ac0b74..d0e133e 100644 --- a/src/adventofcode/year_2021/day_21_2021.py +++ b/src/adventofcode/year_2021/day_21_2021.py @@ -92,7 +92,9 @@ def game(player_one: Player, player_two: Player) -> int: return rolls * losing_score -def apply_wins(wins: tuple[int, int], universe_wins: tuple[int, int]) -> tuple[int, int]: +def apply_wins( + wins: tuple[int, int], universe_wins: tuple[int, int] +) -> tuple[int, int]: return wins[0] + universe_wins[1], wins[1] + universe_wins[0] @@ -110,7 +112,9 @@ def quantum_game(player_one_pos, player_two_pos, player_one_score, player_two_sc for r3 in [1, 2, 3]: next_pos = get_new_position(player_one_pos, r1 + r2 + r3) score = player_one_score + next_pos - universe_wins = quantum_game(player_two_pos, next_pos, player_two_score, score) + universe_wins = quantum_game( + player_two_pos, next_pos, player_two_score, score + ) wins = apply_wins(wins, universe_wins) return wins diff --git a/src/adventofcode/year_2021/day_22_2021.py b/src/adventofcode/year_2021/day_22_2021.py index c8d11ab..8371b9a 100644 --- a/src/adventofcode/year_2021/day_22_2021.py +++ b/src/adventofcode/year_2021/day_22_2021.py @@ -36,7 +36,9 @@ def get_cuboid(line: str, limit: bool = True) -> dict[CubeDimensions, bool]: return cubes -def apply_reboot_line(line: str, cuboids: dict[CubeDimensions, bool], limit: bool = True): +def apply_reboot_line( + line: str, cuboids: dict[CubeDimensions, bool], limit: bool = True +): cuboid = get_cuboid(line, limit) cuboids.update(cuboid) @@ -57,7 +59,9 @@ def __init__(self, numbers: CuboidNumbers, sign: int): @property def volume(self) -> int: - return (self.xb - self.xa + 1) * (self.yb - self.ya + 1) * (self.zb - self.za + 1) + return ( + (self.xb - self.xa + 1) * (self.yb - self.ya + 1) * (self.zb - self.za + 1) + ) def intersects(self, other: Cuboid) -> bool: if ( diff --git a/src/adventofcode/year_2021/day_25_2021.py b/src/adventofcode/year_2021/day_25_2021.py index faf76f9..d0ed69a 100644 --- a/src/adventofcode/year_2021/day_25_2021.py +++ b/src/adventofcode/year_2021/day_25_2021.py @@ -21,7 +21,9 @@ def get_values(input_data: list[str]) -> Grid: return grid -def get_next_position(position: Position, direction: str, grid: Grid, max_x: int, max_y: int) -> bool | Position: +def get_next_position( + position: Position, direction: str, grid: Grid, max_x: int, max_y: int +) -> bool | Position: x, y = position if direction == EASTBOUND: diff --git a/src/adventofcode/year_2022/day_03_2022.py b/src/adventofcode/year_2022/day_03_2022.py index 05161b6..b04ba0c 100644 --- a/src/adventofcode/year_2022/day_03_2022.py +++ b/src/adventofcode/year_2022/day_03_2022.py @@ -25,7 +25,9 @@ def rucksacks_part_one(input_data: list[str]) -> int: score: int = 0 for rucksack in input_data: - if (matched_letter := compare_compartments(*split_rucksack(rucksack))) is not None: + if ( + matched_letter := compare_compartments(*split_rucksack(rucksack)) + ) is not None: score += get_letter_value(matched_letter) return score diff --git a/src/adventofcode/year_2022/day_05_2022.py b/src/adventofcode/year_2022/day_05_2022.py index 4c8a87d..6b90de3 100644 --- a/src/adventofcode/year_2022/day_05_2022.py +++ b/src/adventofcode/year_2022/day_05_2022.py @@ -99,7 +99,9 @@ def execute_instruction(crates: defaultdict[int, list[str]], instructions) -> No try: crates[destination].append(crates[source].pop()) except IndexError as exc: - raise ValueError(f"tried to move a crate from an empty stack with instruction {instructions}") from exc + raise ValueError( + f"tried to move a crate from an empty stack with instruction {instructions}" + ) from exc def execute_instruction_9001(crates: defaultdict[int, list[str]], instructions) -> None: diff --git a/src/adventofcode/year_2022/day_07_2022.py b/src/adventofcode/year_2022/day_07_2022.py index a6d5135..15ae780 100644 --- a/src/adventofcode/year_2022/day_07_2022.py +++ b/src/adventofcode/year_2022/day_07_2022.py @@ -44,7 +44,9 @@ def get_dir_sizes(files: dict[Path, int]) -> dict[Path, int]: return dirs -def get_sum_of_dirs_below_threshold(dirs: dict[Path, int], threshold: int = 100000) -> int: +def get_sum_of_dirs_below_threshold( + dirs: dict[Path, int], threshold: int = 100000 +) -> int: """Sum the size of all dirs with a size below threshold""" total: int = 0 diff --git a/src/adventofcode/year_2022/day_08_2022.py b/src/adventofcode/year_2022/day_08_2022.py index 144dd64..4a9dc77 100644 --- a/src/adventofcode/year_2022/day_08_2022.py +++ b/src/adventofcode/year_2022/day_08_2022.py @@ -19,7 +19,9 @@ def get_grid(input_data: list[str]) -> dict[tuple[int, int], int]: return grid -def is_visible(grid: dict[tuple[int, int], int], tree: tuple[int, int], grid_size: tuple[int, int]) -> bool: +def is_visible( + grid: dict[tuple[int, int], int], tree: tuple[int, int], grid_size: tuple[int, int] +) -> bool: """Check if the tree is visible from the outside""" x, y = tree horizontal, vertical = grid_size @@ -113,7 +115,9 @@ def get_scenic_scores(input_data: list[str]) -> int: for y in range(grid_size[1]): for x in range(grid_size[0]): - max_scenic_score = max(max_scenic_score, get_scenic_score_for_tree(grid, (x, y), grid_size)) + max_scenic_score = max( + max_scenic_score, get_scenic_score_for_tree(grid, (x, y), grid_size) + ) return max_scenic_score diff --git a/src/adventofcode/year_2022/day_09_2022.py b/src/adventofcode/year_2022/day_09_2022.py index 9d17010..807a417 100644 --- a/src/adventofcode/year_2022/day_09_2022.py +++ b/src/adventofcode/year_2022/day_09_2022.py @@ -19,7 +19,9 @@ def get_instructions(input_data: list[str]) -> Generator[tuple[str, int], None, yield parse_instruction(line) -def _move_in_direction(position: tuple[int, int], direction: str, steps: int) -> tuple[int, int]: +def _move_in_direction( + position: tuple[int, int], direction: str, steps: int +) -> tuple[int, int]: if not steps: return position @@ -55,14 +57,18 @@ def move( for _ in range(steps): position_head = _move_in_direction(position_head, direction, 1) - if manhattan_distance(position_head, position_tail) > get_allowed_distance(position_head, position_tail): + if manhattan_distance(position_head, position_tail) > get_allowed_distance( + position_head, position_tail + ): position_tail = determine_move(position_tail, position_head) tail_locations[position_tail] += 1 return position_head, position_tail -def determine_move(position: tuple[int, int], target: tuple[int, int]) -> tuple[int, int]: +def determine_move( + position: tuple[int, int], target: tuple[int, int] +) -> tuple[int, int]: """ Determine the next position based on the target @@ -101,7 +107,9 @@ def move_snake( for key, position in positions.items(): if key == head_pos: # Head positions[key] = _move_in_direction(position, direction, 1) - elif manhattan_distance(position, positions[key - 1]) > get_allowed_distance(positions[key - 1], position): + elif manhattan_distance( + position, positions[key - 1] + ) > get_allowed_distance(positions[key - 1], position): positions[key] = determine_move(position, positions[key - 1]) if key == tail_pos: # Tail diff --git a/src/adventofcode/year_2022/day_11_2022.py b/src/adventofcode/year_2022/day_11_2022.py index 524c71f..330c7c0 100644 --- a/src/adventofcode/year_2022/day_11_2022.py +++ b/src/adventofcode/year_2022/day_11_2022.py @@ -109,7 +109,9 @@ def parse_instructions(input_data: list[str], allow_relief=True) -> dict[int, Mo int(chunk[4].split(" ")[-1]), int(chunk[5].split(" ")[-1]), ) - monkeys[number] = Monkey(number, starting_items, operation, test, monkeys, allow_relief) + monkeys[number] = Monkey( + number, starting_items, operation, test, monkeys, allow_relief + ) idx += 7 common_modulo = math.prod([monkey.test[0] for monkey in monkeys.values()]) @@ -127,7 +129,9 @@ def play_rounds(input_data: list[str], rounds: int = 20, allow_relief=True) -> i for monkey in monkeys.values(): monkey.play_round() - inspections = sorted([monkey.inspected for monkey in monkeys.values()], reverse=True) + inspections = sorted( + [monkey.inspected for monkey in monkeys.values()], reverse=True + ) return inspections[0] * inspections[1] diff --git a/src/adventofcode/year_2022/day_15_2022.py b/src/adventofcode/year_2022/day_15_2022.py index ada846c..391984f 100644 --- a/src/adventofcode/year_2022/day_15_2022.py +++ b/src/adventofcode/year_2022/day_15_2022.py @@ -46,7 +46,9 @@ def find_locations_at_y(input_data: list[str], y_value: int) -> int: distance_y = abs(sensor_y - y_value) distance_remainder = distance - distance_y - for x in range(sensor_x - distance_remainder, sensor_x + distance_remainder + 1): + for x in range( + sensor_x - distance_remainder, sensor_x + distance_remainder + 1 + ): if (position := (x, y_value)) not in grid: grid[position] = "#" @@ -65,7 +67,9 @@ def undo_rotate_positions(position: Position) -> Position: return (u + v) // 2, (u - v) // 2 -def find_positions_at_y(pairs: list[tuple[Position, Position]], y_value: int) -> Position | None: +def find_positions_at_y( + pairs: list[tuple[Position, Position]], y_value: int +) -> Position | None: ranges: list[Position] = [] for sensor, beacon in pairs: diff --git a/src/adventofcode/year_2023/day_01_2023.py b/src/adventofcode/year_2023/day_01_2023.py index 0217eb2..5e0ab13 100644 --- a/src/adventofcode/year_2023/day_01_2023.py +++ b/src/adventofcode/year_2023/day_01_2023.py @@ -49,7 +49,9 @@ def get_calibration_value_with_words(line: str) -> int: if (lfind := line.find(word)) != -1 and (left_idx is None or lfind < left_idx): left = value left_idx = lfind - if (rfind := line.rfind(word)) != -1 and (right_idx is None or rfind > right_idx): + if (rfind := line.rfind(word)) != -1 and ( + right_idx is None or rfind > right_idx + ): right = value right_idx = rfind diff --git a/src/adventofcode/year_2023/day_03_2023.py b/src/adventofcode/year_2023/day_03_2023.py index ec4a2ce..7e25744 100644 --- a/src/adventofcode/year_2023/day_03_2023.py +++ b/src/adventofcode/year_2023/day_03_2023.py @@ -34,7 +34,9 @@ def find_gear_coords(lines: list[str]) -> dict[tuple[int, int], list[int]]: return coords -def neighbour_has_adjacent_symbol(current_position: tuple[int, int], symbols: set[tuple[int, int]]) -> bool: +def neighbour_has_adjacent_symbol( + current_position: tuple[int, int], symbols: set[tuple[int, int]] +) -> bool: x, y = current_position for y_mod in [-1, 0, 1]: for x_mod in [-1, 0, 1]: diff --git a/src/adventofcode/year_2023/day_07_2023.py b/src/adventofcode/year_2023/day_07_2023.py index 1c2ef29..616de35 100644 --- a/src/adventofcode/year_2023/day_07_2023.py +++ b/src/adventofcode/year_2023/day_07_2023.py @@ -90,7 +90,9 @@ def parse_hand_with_jokers(hand: str) -> int: return max(values) -def sort_hands(hand_a: tuple[str, int], hand_b: tuple[str, int], with_jokers: bool) -> int: +def sort_hands( + hand_a: tuple[str, int], hand_b: tuple[str, int], with_jokers: bool +) -> int: parsed_a = parse_hand(hand_a[0], with_jokers=with_jokers) parsed_b = parse_hand(hand_b[0], with_jokers=with_jokers) @@ -121,7 +123,9 @@ def sort_hands(hand_a: tuple[str, int], hand_b: tuple[str, int], with_jokers: bo def calculate_winnings(data: list[str], with_jokers: bool) -> int: sort_func = partial(sort_hands, with_jokers=with_jokers) sorted_hands = sorted(parse_input(data), key=cmp_to_key(sort_func)) # type: ignore - return sum(starmap(lambda idx, hand: hand[1] * idx, enumerate(sorted_hands, start=1))) + return sum( + starmap(lambda idx, hand: hand[1] * idx, enumerate(sorted_hands, start=1)) + ) @register_solution(2023, 7, 1) diff --git a/src/adventofcode/year_2023/day_08_2023.py b/src/adventofcode/year_2023/day_08_2023.py index 66f7ac5..9fd25ab 100644 --- a/src/adventofcode/year_2023/day_08_2023.py +++ b/src/adventofcode/year_2023/day_08_2023.py @@ -42,7 +42,9 @@ def highest_common_multiple(num_a: int, num_b: int) -> int: return num_a * num_b // math.gcd(num_a, num_b) -def find_end_as_ghost(starting_position: str, instructions: deque[str], paths: dict[str, tuple[str, str]]) -> int: +def find_end_as_ghost( + starting_position: str, instructions: deque[str], paths: dict[str, tuple[str, str]] +) -> int: """ Count how many staps it will take to arrive at a location that ends with Z """ diff --git a/src/adventofcode/year_2023/day_09_2023.py b/src/adventofcode/year_2023/day_09_2023.py index 1d213db..b8cd1b2 100644 --- a/src/adventofcode/year_2023/day_09_2023.py +++ b/src/adventofcode/year_2023/day_09_2023.py @@ -27,7 +27,9 @@ def parse_input_reversed(data: list[str]) -> Iterable[Iterable[int]]: return map(parse_sequence_backwards, data) -def find_next_in_sequence(sequence: Iterable[int], lines: list[list[int]] | None) -> int: +def find_next_in_sequence( + sequence: Iterable[int], lines: list[list[int]] | None +) -> int: numbers = list(sequence) lines = [numbers] if lines is None or len(lines) == 0 else lines differences = [y - x for (x, y) in pairwise(numbers)] diff --git a/tests/adventofcode/util/test_input_helpers.py b/tests/adventofcode/util/test_input_helpers.py index beb79dc..6fab674 100644 --- a/tests/adventofcode/util/test_input_helpers.py +++ b/tests/adventofcode/util/test_input_helpers.py @@ -39,8 +39,7 @@ def test_get_input_for_day_as_str(mocker: pytest_mock.MockerFixture): @pytest.mark.skip() -def test__read_lines(): - ... +def test__read_lines(): ... def test__get_input(mocker: pytest_mock.MockerFixture): diff --git a/tests/adventofcode/util/test_math_helpers.py b/tests/adventofcode/util/test_math_helpers.py index 33bb57e..80cf6b9 100644 --- a/tests/adventofcode/util/test_math_helpers.py +++ b/tests/adventofcode/util/test_math_helpers.py @@ -8,7 +8,9 @@ def test_gaussian_sum(number): assert gaussian_sum(number) == sum(range(1, number + 1)) -@pytest.mark.parametrize(["target_list", "expected"], [([1, 2, 3, 4, 5], 3), ([13, 34, 45, 68, 5], 33)]) +@pytest.mark.parametrize( + ["target_list", "expected"], [([1, 2, 3, 4, 5], 3), ([13, 34, 45, 68, 5], 33)] +) def test_mean_floor(target_list, expected): assert mean_floor(target_list) == expected diff --git a/tests/adventofcode/year_2015/test_day_01_2015.py b/tests/adventofcode/year_2015/test_day_01_2015.py index c12241b..3e6039e 100644 --- a/tests/adventofcode/year_2015/test_day_01_2015.py +++ b/tests/adventofcode/year_2015/test_day_01_2015.py @@ -3,7 +3,9 @@ from adventofcode.year_2015.day_01_2015 import part_one, part_two -@pytest.mark.parametrize(["sequence", "expected"], [("(())", 0), ("()()", 0), ("))(((((", 3)]) +@pytest.mark.parametrize( + ["sequence", "expected"], [("(())", 0), ("()()", 0), ("))(((((", 3)] +) def test_part_one(sequence, expected): assert part_one([sequence]) == expected diff --git a/tests/adventofcode/year_2015/test_day_02_2015.py b/tests/adventofcode/year_2015/test_day_02_2015.py index 683fb57..8254f35 100644 --- a/tests/adventofcode/year_2015/test_day_02_2015.py +++ b/tests/adventofcode/year_2015/test_day_02_2015.py @@ -29,11 +29,15 @@ def test_parse_line(): assert str(wrapped_e.value) == "could not parse line" -@pytest.mark.skipif(os.environ.get("CI", "false") == "true", reason="inputs not available in CI") +@pytest.mark.skipif( + os.environ.get("CI", "false") == "true", reason="inputs not available in CI" +) def test_part_one(): assert part_one(get_input_for_day(2015, 2)) == 1606483 -@pytest.mark.skipif(os.environ.get("CI", "false") == "true", reason="inputs not available in CI") +@pytest.mark.skipif( + os.environ.get("CI", "false") == "true", reason="inputs not available in CI" +) def test_part_two(): assert part_two(get_input_for_day(2015, 2)) == 3842356 diff --git a/tests/adventofcode/year_2015/test_day_03_2015.py b/tests/adventofcode/year_2015/test_day_03_2015.py index 8e05078..0115bed 100644 --- a/tests/adventofcode/year_2015/test_day_03_2015.py +++ b/tests/adventofcode/year_2015/test_day_03_2015.py @@ -3,11 +3,15 @@ from adventofcode.year_2015.day_03_2015 import part_one, part_two -@pytest.mark.parametrize(["instructions", "expected"], [("^v", 2), ("^>v<", 4), ("^v^v^v^v^v", 2)]) +@pytest.mark.parametrize( + ["instructions", "expected"], [("^v", 2), ("^>v<", 4), ("^v^v^v^v^v", 2)] +) def test_part_one(instructions, expected): assert expected == part_one([instructions]) -@pytest.mark.parametrize(["instructions", "expected"], [("^v", 3), ("^>v<", 3), ("^v^v^v^v^v", 11)]) +@pytest.mark.parametrize( + ["instructions", "expected"], [("^v", 3), ("^>v<", 3), ("^v^v^v^v^v", 11)] +) def test_part_two(instructions, expected): assert expected == part_two([instructions]) diff --git a/tests/adventofcode/year_2015/test_day_09_2015.py b/tests/adventofcode/year_2015/test_day_09_2015.py index a8176c3..ab9276c 100644 --- a/tests/adventofcode/year_2015/test_day_09_2015.py +++ b/tests/adventofcode/year_2015/test_day_09_2015.py @@ -20,7 +20,9 @@ def test_get_all_cities(): ("Dublin", "Belfast"): 141, } - assert sorted(["London", "Dublin", "Belfast"]) == sorted(get_all_cities(test_input, dist_dict)) + assert sorted(["London", "Dublin", "Belfast"]) == sorted( + get_all_cities(test_input, dist_dict) + ) assert expected_dist_dict == dist_dict diff --git a/tests/adventofcode/year_2015/test_day_10_2015.py b/tests/adventofcode/year_2015/test_day_10_2015.py index b95e1f7..2f48e92 100644 --- a/tests/adventofcode/year_2015/test_day_10_2015.py +++ b/tests/adventofcode/year_2015/test_day_10_2015.py @@ -27,7 +27,9 @@ def test_iterate(value, expected): assert expected == iterate(value) -@pytest.mark.skipif(os.environ.get("CI", "false") == "true", reason="inputs not available in CI") +@pytest.mark.skipif( + os.environ.get("CI", "false") == "true", reason="inputs not available in CI" +) def test_part_one(): assert part_one(get_input_for_day(2015, 10)) == 329356 @@ -37,6 +39,8 @@ def test_part_two(): assert part_two(get_input_for_day(2015, 10)) == 4666278 -@pytest.mark.skipif(os.environ.get("CI", "false") == "true", reason="inputs not available in CI") +@pytest.mark.skipif( + os.environ.get("CI", "false") == "true", reason="inputs not available in CI" +) def test_part_two_method_2(): assert part_two_method_2(get_input_for_day(2015, 10)) == 4666278 diff --git a/tests/adventofcode/year_2015/test_day_13_2015.py b/tests/adventofcode/year_2015/test_day_13_2015.py index 9e20954..8057648 100644 --- a/tests/adventofcode/year_2015/test_day_13_2015.py +++ b/tests/adventofcode/year_2015/test_day_13_2015.py @@ -77,4 +77,6 @@ def test_get_all_combinations(value, expected): def test_get_unique_persons(): chart = get_happiness_chart(test_input) - assert sorted(["Carol", "Alice", "Bob", "David"]) == sorted(get_unique_persons(chart)) + assert sorted(["Carol", "Alice", "Bob", "David"]) == sorted( + get_unique_persons(chart) + ) diff --git a/tests/adventofcode/year_2015/test_day_19_2015.py b/tests/adventofcode/year_2015/test_day_19_2015.py index 5945f3d..7b4db2f 100644 --- a/tests/adventofcode/year_2015/test_day_19_2015.py +++ b/tests/adventofcode/year_2015/test_day_19_2015.py @@ -5,11 +5,15 @@ from adventofcode.year_2015.day_19_2015 import get_input_for_day, part_one, part_two -@pytest.mark.skipif(os.environ.get("CI", "false") == "true", reason="inputs not available in CI") +@pytest.mark.skipif( + os.environ.get("CI", "false") == "true", reason="inputs not available in CI" +) def test_part_one(): assert part_one(get_input_for_day(2015, 19)) == 518 -@pytest.mark.skipif(os.environ.get("CI", "false") == "true", reason="inputs not available in CI") +@pytest.mark.skipif( + os.environ.get("CI", "false") == "true", reason="inputs not available in CI" +) def test_part_two(): assert part_two(get_input_for_day(2015, 19)) == 200 diff --git a/tests/adventofcode/year_2015/test_day_23_2015.py b/tests/adventofcode/year_2015/test_day_23_2015.py index 960936f..d4b1135 100644 --- a/tests/adventofcode/year_2015/test_day_23_2015.py +++ b/tests/adventofcode/year_2015/test_day_23_2015.py @@ -9,12 +9,16 @@ ) -@pytest.mark.skipif(os.environ.get("CI", "false") == "true", reason="inputs not available in CI") +@pytest.mark.skipif( + os.environ.get("CI", "false") == "true", reason="inputs not available in CI" +) def test_part_one(): assert run_program(get_input_for_day(2015, 23), {"a": 0, "b": 0}) == 255 -@pytest.mark.skipif(os.environ.get("CI", "false") == "true", reason="inputs not available in CI") +@pytest.mark.skipif( + os.environ.get("CI", "false") == "true", reason="inputs not available in CI" +) def test_part_two(): assert run_program(get_input_for_day(2015, 23), {"a": 1, "b": 0}) == 334 diff --git a/tests/adventofcode/year_2015/test_day_24_2015.py b/tests/adventofcode/year_2015/test_day_24_2015.py index 58976ac..161bb80 100644 --- a/tests/adventofcode/year_2015/test_day_24_2015.py +++ b/tests/adventofcode/year_2015/test_day_24_2015.py @@ -36,11 +36,15 @@ def test_move_packages_into_groups(): assert move_packages_into_groups(test_input, 4) == 44 -@pytest.mark.skipif(os.environ.get("CI", "false") == "true", reason="inputs not available in CI") +@pytest.mark.skipif( + os.environ.get("CI", "false") == "true", reason="inputs not available in CI" +) def test_part_one(): assert part_one(get_input_for_day(2015, 24)) == 10723906903 -@pytest.mark.skipif(os.environ.get("CI", "false") == "true", reason="inputs not available in CI") +@pytest.mark.skipif( + os.environ.get("CI", "false") == "true", reason="inputs not available in CI" +) def test_part_two(): assert part_two(get_input_for_day(2015, 24)) == 74850409 diff --git a/tests/adventofcode/year_2015/test_day_25_2015.py b/tests/adventofcode/year_2015/test_day_25_2015.py index 3b697af..338a552 100644 --- a/tests/adventofcode/year_2015/test_day_25_2015.py +++ b/tests/adventofcode/year_2015/test_day_25_2015.py @@ -6,11 +6,15 @@ from adventofcode.year_2015.day_25_2015 import part_one, part_two -@pytest.mark.skipif(os.environ.get("CI", "false") == "true", reason="inputs not available in CI") +@pytest.mark.skipif( + os.environ.get("CI", "false") == "true", reason="inputs not available in CI" +) def test_part_one(): assert part_one(get_input_for_day(2015, 25)) == 2650453 -@pytest.mark.skipif(os.environ.get("CI", "false") == "true", reason="inputs not available in CI") +@pytest.mark.skipif( + os.environ.get("CI", "false") == "true", reason="inputs not available in CI" +) def test_part_two(): assert part_two(get_input_for_day(2015, 25)) == "hooray" diff --git a/tests/adventofcode/year_2020/test_day_04_2020.py b/tests/adventofcode/year_2020/test_day_04_2020.py index 4d0c5c8..50052fa 100644 --- a/tests/adventofcode/year_2020/test_day_04_2020.py +++ b/tests/adventofcode/year_2020/test_day_04_2020.py @@ -24,9 +24,7 @@ hgt:179cm hcl:#cfa07d eyr:2025 pid:166559648 -iyr:2011 ecl:brn hgt:59in""".split( - "\n" -) +iyr:2011 ecl:brn hgt:59in""".split("\n") @pytest.mark.parametrize( diff --git a/tests/adventofcode/year_2020/test_day_05_2020.py b/tests/adventofcode/year_2020/test_day_05_2020.py index 23aab6d..ee0a034 100644 --- a/tests/adventofcode/year_2020/test_day_05_2020.py +++ b/tests/adventofcode/year_2020/test_day_05_2020.py @@ -10,5 +10,4 @@ def test_part_one(): @pytest.mark.skip() -def test_part_two(): - ... +def test_part_two(): ... diff --git a/tests/adventofcode/year_2021/test_day_02_2021.py b/tests/adventofcode/year_2021/test_day_02_2021.py index f53810d..23a7e7c 100644 --- a/tests/adventofcode/year_2021/test_day_02_2021.py +++ b/tests/adventofcode/year_2021/test_day_02_2021.py @@ -37,13 +37,17 @@ def test_get_new_position(): assert str(wrapped_e.value) == "unknown direction received: coffee" -@pytest.mark.skipif(os.environ.get("CI", "false") == "true", reason="inputs not available in CI") +@pytest.mark.skipif( + os.environ.get("CI", "false") == "true", reason="inputs not available in CI" +) def test_part_one(): answer = part_one(get_input_for_day(2021, 2)) assert answer == 2036120 -@pytest.mark.skipif(os.environ.get("CI", "false") == "true", reason="inputs not available in CI") +@pytest.mark.skipif( + os.environ.get("CI", "false") == "true", reason="inputs not available in CI" +) def test_part_two(): answer = part_two(get_input_for_day(2021, 2)) assert answer == 2015547716 diff --git a/tests/adventofcode/year_2021/test_day_07_2021.py b/tests/adventofcode/year_2021/test_day_07_2021.py index 7cd4654..b7a4f96 100644 --- a/tests/adventofcode/year_2021/test_day_07_2021.py +++ b/tests/adventofcode/year_2021/test_day_07_2021.py @@ -20,7 +20,9 @@ def test_get_crabs(): assert get_crabs(test_input) == [16, 1, 2, 0, 4, 2, 7, 1, 2, 14] -@pytest.mark.parametrize(["position", "expected"], [(1, 41), (2, 37), (3, 39), (10, 71)]) +@pytest.mark.parametrize( + ["position", "expected"], [(1, 41), (2, 37), (3, 39), (10, 71)] +) def test_move_to_position(position, expected): crabs = get_crabs(test_input) assert move_to_position(crabs, position=position) == expected @@ -48,7 +50,9 @@ def test_get_least_amount_of_fuel_part_two_slower(): def test_compare_part_two_solutions(): crabs = get_crabs(test_input) - assert get_least_amount_of_fuel_part_two_slower(crabs) == get_least_amount_of_fuel_part_two(crabs) + assert get_least_amount_of_fuel_part_two_slower( + crabs + ) == get_least_amount_of_fuel_part_two(crabs) def test_part_one(): diff --git a/tests/adventofcode/year_2021/test_day_13_2021.py b/tests/adventofcode/year_2021/test_day_13_2021.py index ca0f042..e24cbe0 100644 --- a/tests/adventofcode/year_2021/test_day_13_2021.py +++ b/tests/adventofcode/year_2021/test_day_13_2021.py @@ -109,7 +109,9 @@ def test_part_one(): # flake8: noqa -@pytest.mark.skipif(os.environ.get("CI", "false") == "true", reason="inputs not available in CI") +@pytest.mark.skipif( + os.environ.get("CI", "false") == "true", reason="inputs not available in CI" +) def test_part_two(): assert ( part_two(get_input_for_day(2021, 13)) diff --git a/tests/adventofcode/year_2021/test_day_15_2021.py b/tests/adventofcode/year_2021/test_day_15_2021.py index b31ae84..a3a3c68 100644 --- a/tests/adventofcode/year_2021/test_day_15_2021.py +++ b/tests/adventofcode/year_2021/test_day_15_2021.py @@ -195,7 +195,9 @@ def test_parse_input(): ], ) def test_get_possible_routes_for_position(position, expected): - assert sorted(get_possible_routes_for_position(position, test_grid)) == sorted(expected) + assert sorted(get_possible_routes_for_position(position, test_grid)) == sorted( + expected + ) def test_find_route(): diff --git a/tests/adventofcode/year_2021/test_day_18_2021.py b/tests/adventofcode/year_2021/test_day_18_2021.py index 7436d3a..2a80332 100644 --- a/tests/adventofcode/year_2021/test_day_18_2021.py +++ b/tests/adventofcode/year_2021/test_day_18_2021.py @@ -67,7 +67,10 @@ def test_reduce_snailfish_number(number, expected): def test_parse_snailfish_number(): snailfish_number = "[[[[4,3],4],4],[7,[[8,4],9]]]" - assert parse_snailfish_number(snailfish_number, "[1,1]") == "[[[[0,7],4],[[7,8],[6,0]]],[8,1]]" + assert ( + parse_snailfish_number(snailfish_number, "[1,1]") + == "[[[[0,7],4],[[7,8],[6,0]]],[8,1]]" + ) @pytest.mark.parametrize( diff --git a/tests/adventofcode/year_2021/test_day_20_2021.py b/tests/adventofcode/year_2021/test_day_20_2021.py index 4a94b3c..02e899e 100644 --- a/tests/adventofcode/year_2021/test_day_20_2021.py +++ b/tests/adventofcode/year_2021/test_day_20_2021.py @@ -74,13 +74,17 @@ def test_enhance(): def test_get_algorithm_position_for_pixel(): image = parse_input(test_input) infinity_grid_test: defaultdict[tuple[int, int], int] = defaultdict(int, image.grid) - assert get_algorithm_position_for_pixel((2, 2), infinity_grid_test) == int("000100010", 2) + assert get_algorithm_position_for_pixel((2, 2), infinity_grid_test) == int( + "000100010", 2 + ) def test_get_algorithm_position_for_pixel_simplified(): image = parse_input(test_input) infinity_grid_test: defaultdict[tuple[int, int], int] = defaultdict(int, image.grid) - assert get_algorithm_position_for_pixel_simplified((2, 2), infinity_grid_test) == int("000100010", 2) + assert get_algorithm_position_for_pixel_simplified( + (2, 2), infinity_grid_test + ) == int("000100010", 2) @pytest.mark.parametrize( diff --git a/tests/adventofcode/year_2022/test_day_09_2022.py b/tests/adventofcode/year_2022/test_day_09_2022.py index 8f9e268..0c13806 100644 --- a/tests/adventofcode/year_2022/test_day_09_2022.py +++ b/tests/adventofcode/year_2022/test_day_09_2022.py @@ -99,7 +99,15 @@ def test_move_snake(): assert positions[1] == (3, 0) assert positions[2] == (2, 0) assert positions[3] == (1, 0) - assert positions[4] == positions[5] == positions[6] == positions[7] == positions[8] == positions[9] == (0, 0) + assert ( + positions[4] + == positions[5] + == positions[6] + == positions[7] + == positions[8] + == positions[9] + == (0, 0) + ) move_snake(("U", 4), positions, tail_locations) assert positions[0] == (4, -4) diff --git a/tests/adventofcode/year_2023/test_day_02_2023.py b/tests/adventofcode/year_2023/test_day_02_2023.py index 7cc8bb0..93a4d01 100644 --- a/tests/adventofcode/year_2023/test_day_02_2023.py +++ b/tests/adventofcode/year_2023/test_day_02_2023.py @@ -20,15 +20,27 @@ ), ( "Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue", - [{"blue": 1, "green": 2}, {"blue": 4, "green": 3, "red": 1}, {"blue": 1, "green": 1}], + [ + {"blue": 1, "green": 2}, + {"blue": 4, "green": 3, "red": 1}, + {"blue": 1, "green": 1}, + ], ), ( "Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red", - [{"blue": 6, "green": 8, "red": 20}, {"blue": 5, "green": 13, "red": 4}, {"green": 5, "red": 1}], + [ + {"blue": 6, "green": 8, "red": 20}, + {"blue": 5, "green": 13, "red": 4}, + {"green": 5, "red": 1}, + ], ), ( "Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red", - [{"blue": 6, "green": 1, "red": 3}, {"green": 3, "red": 6}, {"blue": 15, "green": 3, "red": 14}], + [ + {"blue": 6, "green": 1, "red": 3}, + {"green": 3, "red": 6}, + {"blue": 15, "green": 3, "red": 14}, + ], ), ( "Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green", diff --git a/tests/adventofcode/year_2023/test_day_03_2023.py b/tests/adventofcode/year_2023/test_day_03_2023.py index d5b62c4..9fffd82 100644 --- a/tests/adventofcode/year_2023/test_day_03_2023.py +++ b/tests/adventofcode/year_2023/test_day_03_2023.py @@ -24,7 +24,14 @@ def test_find_symbol_coords(): - assert find_symbol_coords(test_input) == {(3, 8), (5, 5), (3, 4), (5, 8), (3, 1), (6, 3)} + assert find_symbol_coords(test_input) == { + (3, 8), + (5, 5), + (3, 4), + (5, 8), + (3, 1), + (6, 3), + } def test_find_gear_coords(): diff --git a/tests/adventofcode/year_2023/test_day_07_2023.py b/tests/adventofcode/year_2023/test_day_07_2023.py index a57d9de..8bd7891 100644 --- a/tests/adventofcode/year_2023/test_day_07_2023.py +++ b/tests/adventofcode/year_2023/test_day_07_2023.py @@ -1,6 +1,12 @@ import pytest -from adventofcode.year_2023.day_07_2023 import hands, parse_hand, parse_input, part_one, part_two +from adventofcode.year_2023.day_07_2023 import ( + hands, + parse_hand, + parse_input, + part_one, + part_two, +) test_input = [ "32T3K 765", diff --git a/tests/adventofcode/year_2023/test_day_08_2023.py b/tests/adventofcode/year_2023/test_day_08_2023.py index c74468a..e9cccd3 100644 --- a/tests/adventofcode/year_2023/test_day_08_2023.py +++ b/tests/adventofcode/year_2023/test_day_08_2023.py @@ -1,6 +1,11 @@ from collections import deque -from adventofcode.year_2023.day_08_2023 import follow_instructions, parse_input, part_one, part_two +from adventofcode.year_2023.day_08_2023 import ( + follow_instructions, + parse_input, + part_one, + part_two, +) test_input = [ "RL", diff --git a/tests/adventofcode/year_2023/test_day_09_2023.py b/tests/adventofcode/year_2023/test_day_09_2023.py index 3606bca..3f407f1 100644 --- a/tests/adventofcode/year_2023/test_day_09_2023.py +++ b/tests/adventofcode/year_2023/test_day_09_2023.py @@ -1,6 +1,12 @@ import pytest -from adventofcode.year_2023.day_09_2023 import find_next_in_sequence, parse_input, parse_sequence, part_one, part_two +from adventofcode.year_2023.day_09_2023 import ( + find_next_in_sequence, + parse_input, + parse_sequence, + part_one, + part_two, +) test_input = [ "0 3 6 9 12 15", @@ -18,7 +24,29 @@ ("-1 -20 -300 400", [-1, -20, -300, 400]), ( "5 1 -3 -7 -11 -15 -19 -23 -27 -31 -35 -39 -43 -47 -51 -55 -59 -63 -67 -71 -75", - [5, 1, -3, -7, -11, -15, -19, -23, -27, -31, -35, -39, -43, -47, -51, -55, -59, -63, -67, -71, -75], + [ + 5, + 1, + -3, + -7, + -11, + -15, + -19, + -23, + -27, + -31, + -35, + -39, + -43, + -47, + -51, + -55, + -59, + -63, + -67, + -71, + -75, + ], ), ], )