From 995b23ae43b1c6e85a58e3a4e2a17de61f7554e0 Mon Sep 17 00:00:00 2001 From: SigureMo Date: Wed, 31 Aug 2022 05:10:49 +0800 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20add=20pyright?= =?UTF-8?q?=20check?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/black-fmt.yml | 15 ------ .github/workflows/e2e-test.yml | 10 ++-- .github/workflows/lint-and-fmt.yml | 51 ++++++++++++++++++ .github/workflows/unit-test.yml | 17 ++++-- justfile | 21 ++++++++ poetry.lock | 53 ++++++++++++++++++- pyproject.toml | 13 ++++- tests/conftest.py | 2 + tests/test_api/test_bangumi.py | 4 +- tests/test_api/test_collection.py | 4 +- tests/test_api/test_danmaku.py | 4 +- tests/test_api/test_space.py | 4 +- tests/test_api/test_ugc_video.py | 4 +- tests/test_api/test_user_info.py | 4 +- tests/test_e2e.py | 2 + tests/test_processor/test_downloader.py | 5 +- tests/test_processor/test_selector.py | 2 + yutto/__init__.py | 2 + yutto/__main__.py | 4 +- yutto/__version__.py | 2 + yutto/_typing.py | 6 ++- yutto/api/bangumi.py | 2 + yutto/api/collection.py | 2 + yutto/api/danmaku.py | 2 + yutto/api/space.py | 2 + yutto/api/ugc_video.py | 2 + yutto/api/user_info.py | 2 + yutto/bilibili_typing/codec.py | 2 + yutto/bilibili_typing/quality.py | 2 + yutto/exceptions.py | 2 + yutto/extractor/__init__.py | 2 + yutto/extractor/_abc.py | 2 + yutto/extractor/bangumi.py | 2 + yutto/extractor/bangumi_batch.py | 2 + yutto/extractor/collection.py | 2 + yutto/extractor/common.py | 2 + yutto/extractor/favourites.py | 2 + yutto/extractor/series.py | 2 + yutto/extractor/ugc_video.py | 2 + yutto/extractor/ugc_video_batch.py | 2 + yutto/extractor/user_all_favourites.py | 2 + yutto/extractor/user_all_ugc_videos.py | 2 + yutto/processor/downloader.py | 4 +- yutto/processor/parser.py | 2 + yutto/processor/path_resolver.py | 2 + yutto/processor/progressbar.py | 2 + yutto/processor/selector.py | 2 + yutto/utils/asynclib.py | 2 + yutto/utils/console/attributes.py | 2 + yutto/utils/console/colorful.py | 2 + yutto/utils/console/formatter.py | 2 + yutto/utils/console/logger.py | 2 + yutto/utils/console/status_bar.py | 2 + yutto/utils/danmaku.py | 2 + yutto/utils/fetcher.py | 2 + yutto/utils/ffmpeg.py | 4 +- yutto/utils/file_buffer.py | 4 +- .../{functools => funcutils}/__init__.py | 2 + .../utils/{functools => funcutils}/aobject.py | 2 + .../utils/{functools => funcutils}/as_sync.py | 2 + .../filter_none_value.py | 2 + .../{functools => funcutils}/singleton.py | 3 ++ .../utils/{functools => funcutils}/xmerge.py | 2 + yutto/utils/metadata.py | 4 +- yutto/utils/priority.py | 3 ++ yutto/utils/subtitle.py | 2 + yutto/utils/time.py | 2 + yutto/validator.py | 2 + 68 files changed, 294 insertions(+), 39 deletions(-) delete mode 100644 .github/workflows/black-fmt.yml create mode 100644 .github/workflows/lint-and-fmt.yml rename yutto/utils/{functools => funcutils}/__init__.py (88%) rename yutto/utils/{functools => funcutils}/aobject.py (94%) rename yutto/utils/{functools => funcutils}/as_sync.py (95%) rename yutto/utils/{functools => funcutils}/filter_none_value.py (92%) rename yutto/utils/{functools => funcutils}/singleton.py (93%) rename yutto/utils/{functools => funcutils}/xmerge.py (93%) diff --git a/.github/workflows/black-fmt.yml b/.github/workflows/black-fmt.yml deleted file mode 100644 index 3fab389e7..000000000 --- a/.github/workflows/black-fmt.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: black-action - -on: [push, pull_request, workflow_dispatch] - -jobs: - linter_name: - name: black formatter - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Check files using the black formatter - uses: rickstaa/action-black@v1 - id: action_black - with: - black_args: ". --line-length 120 --check --diff" diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml index 86d67731b..729b0b765 100644 --- a/.github/workflows/e2e-test.yml +++ b/.github/workflows/e2e-test.yml @@ -30,13 +30,17 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - uses: Gr1N/setup-poetry@v7 + - name: Install poetry + uses: snok/install-poetry@v1 + with: + version: 1.2.0rc2 + - uses: actions/cache@v3 id: poetry-cache with: path: | **/.venv - key: ${{ runner.os }}-poetry-${{ hashFiles('poetry.lock') }} + key: ${{ runner.os }}-${{ matrix.python-version }}-${{ matrix.architecture }}-poetry-${{ hashFiles('poetry.lock') }} - name: Install dependencies if: steps.poetry-cache.outputs.cache-hit != 'true' @@ -52,4 +56,4 @@ jobs: - name: e2e test run: | - poetry run pytest -m "e2e and not (ci_skip or ignore)" --workers auto + just ci-e2e-test diff --git a/.github/workflows/lint-and-fmt.yml b/.github/workflows/lint-and-fmt.yml new file mode 100644 index 000000000..5e84cf0dc --- /dev/null +++ b/.github/workflows/lint-and-fmt.yml @@ -0,0 +1,51 @@ +name: Lint and Format + +on: [push, pull_request, workflow_dispatch] + +jobs: + lint-and-fmt: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.9", "3.10"] + architecture: ["x64"] + name: Python ${{ matrix.python-version }} on ${{ matrix.architecture }} test + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Install python + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + architecture: ${{ matrix.architecture }} + + - name: Install poetry + uses: snok/install-poetry@v1 + with: + version: 1.2.0rc2 + + - name: Install just + uses: extractions/setup-just@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/cache@v3 + id: poetry-cache + with: + path: | + **/.venv + key: ${{ runner.os }}-${{ matrix.python-version }}-${{ matrix.architecture }}-poetry-${{ hashFiles('poetry.lock') }} + + - name: Install dependencies + if: steps.poetry-cache.outputs.cache-hit != 'true' + run: | + just install + + - name: lint + run: | + just ci-lint + + - name: format check + run: | + just ci-fmt-check diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 16d78d553..f56c415ee 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -20,19 +20,28 @@ jobs: python-version: ${{ matrix.python-version }} architecture: ${{ matrix.architecture }} - - uses: Gr1N/setup-poetry@v7 + - name: Install poetry + uses: snok/install-poetry@v1 + with: + version: 1.2.0rc2 + + - name: Install just + uses: extractions/setup-just@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - uses: actions/cache@v3 id: poetry-cache with: path: | **/.venv - key: ${{ runner.os }}-poetry-${{ hashFiles('poetry.lock') }} + key: ${{ runner.os }}-${{ matrix.python-version }}-${{ matrix.architecture }}-poetry-${{ hashFiles('poetry.lock') }} - name: Install dependencies if: steps.poetry-cache.outputs.cache-hit != 'true' run: | - poetry install + just install - name: unit test run: | - poetry run pytest -m "(api or processor) and not (ci_skip or ignore)" --workers auto + just ci-test diff --git a/justfile b/justfile index 66da3e950..e9cf5d70d 100644 --- a/justfile +++ b/justfile @@ -6,6 +6,9 @@ DOCKER_NAME := "siguremo/yutto" run *ARGS: poetry run python -m yutto {{ARGS}} +install: + poetry install + test: poetry run pytest -m '(api or e2e or processor) and not (ci_only or ignore)' --workers auto just clean @@ -14,6 +17,9 @@ fmt: poetry run isort . poetry run black . +lint: + poetry run pyright yutto tests + build: poetry build @@ -50,6 +56,21 @@ clean-builds: rm -rf dist/ rm -rf yutto.egg-info/ +ci-fmt-check: + poetry run isort --check-only . + poetry run black --check --diff . + +ci-lint: + just lint + +ci-test: + poetry run pytest -m "(api or processor) and not (ci_skip or ignore)" --workers auto + just clean + +ci-e2e-test: + poetry run pytest -m "e2e and not (ci_skip or ignore)" --workers auto + just clean + docker-run *ARGS: docker run --rm -it -v `pwd`:/app {{DOCKER_NAME}} {{ARGS}} diff --git a/poetry.lock b/poetry.lock index d023a082e..3dbcd6b8e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -192,6 +192,17 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "nodeenv" +version = "1.7.0" +description = "Node.js virtual environment builder" +category = "dev" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" + +[package.dependencies] +setuptools = "*" + [[package]] name = "packaging" version = "21.3" @@ -262,6 +273,21 @@ python-versions = ">=3.6.8" [package.extras] diagrams = ["jinja2", "railroad-diagrams"] +[[package]] +name = "pyright" +version = "1.1.268" +description = "Command line wrapper for pyright" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +nodeenv = ">=1.6.0" + +[package.extras] +all = ["twine (>=3.4.1)"] +dev = ["twine (>=3.4.1)"] + [[package]] name = "pytest" version = "7.1.2" @@ -295,6 +321,19 @@ python-versions = "*" pytest = ">=3.0.0" tblib = "*" +[[package]] +name = "setuptools" +version = "65.3.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mock", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + [[package]] name = "tblib" version = "1.7.0" @@ -350,7 +389,7 @@ uvloop = ["uvloop"] [metadata] lock-version = "1.1" python-versions = "^3.9.0" -content-hash = "38e26e467545d90bffbe5962c4557352e65c696433a663d17915aefea81a78a2" +content-hash = "3d334fb918f5dd2f9ac1c80e4b33a193fd8d8b7b1da21162b3bc87227803749f" [metadata.files] aiofiles = [ @@ -628,6 +667,10 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] +nodeenv = [ + {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, + {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, +] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, @@ -668,6 +711,10 @@ pyparsing = [ {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, ] +pyright = [ + {file = "pyright-1.1.268-py3-none-any.whl", hash = "sha256:56b30b00f94ba20e2bdb701e01be23af371d3d51bad10945d8e5a660be28b888"}, + {file = "pyright-1.1.268.tar.gz", hash = "sha256:f5ff622d94bb591fc334e845896577926afc4cb99f428922716c6d6f14e674d7"}, +] pytest = [ {file = "pytest-7.1.2-py3-none-any.whl", hash = "sha256:13d0e3ccfc2b6e26be000cb6568c832ba67ba32e719443bfe725814d3c42433c"}, {file = "pytest-7.1.2.tar.gz", hash = "sha256:a06a0425453864a270bc45e71f783330a7428defb4230fb5e6a731fde06ecd45"}, @@ -676,6 +723,10 @@ pytest-parallel = [ {file = "pytest-parallel-0.1.1.tar.gz", hash = "sha256:9aac3fc199a168c0a8559b60249d9eb254de7af58c12cee0310b54d4affdbfab"}, {file = "pytest_parallel-0.1.1-py3-none-any.whl", hash = "sha256:9e3703015b0eda52be9e07d2ba3498f09340a56d5c79a39b50f22fc5c38212fe"}, ] +setuptools = [ + {file = "setuptools-65.3.0-py3-none-any.whl", hash = "sha256:2e24e0bec025f035a2e72cdd1961119f557d78ad331bb00ff82efb2ab8da8e82"}, + {file = "setuptools-65.3.0.tar.gz", hash = "sha256:7732871f4f7fa58fb6bdcaeadb0161b2bd046c85905dbaa066bdcbcc81953b57"}, +] tblib = [ {file = "tblib-1.7.0-py2.py3-none-any.whl", hash = "sha256:289fa7359e580950e7d9743eab36b0691f0310fce64dee7d9c31065b8f723e23"}, {file = "tblib-1.7.0.tar.gz", hash = "sha256:059bd77306ea7b419d4f76016aef6d7027cc8a0785579b5aad198803435f882c"}, diff --git a/pyproject.toml b/pyproject.toml index 09cab7164..b84dfe128 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,6 +12,7 @@ classifiers = [ "Environment :: Console", "Operating System :: OS Independent", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", + "Typing :: Typed", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.9", @@ -28,11 +29,12 @@ uvloop = { version = "0.16.0", optional = true } dicttoxml = "^1.7.4" colorama = { version = "^0.4.5", markers = "sys_platform == 'win32'" } -[tool.poetry.dev-dependencies] +[tool.poetry.group.dev.dependencies] pytest = "^7.0" black = "^22.1" pytest-parallel = "^0.1.1" isort = "^5.10.1" +pyright = "^1.1.268" [tool.poetry.extras] uvloop = ["uvloop"] @@ -51,7 +53,14 @@ line-length = 120 [tool.isort] profile = "black" +add_imports = ["from __future__ import annotations"] +skip = ["setup.py", ".venv"] + +[tool.pyright] +include = ["yutto", "tests"] +pythonVersion = "3.9" +typeCheckingMode = "strict" [build-system] -requires = ["poetry_core>=1.0.0"] +requires = ["poetry_core>=1.1.0rc2"] build-backend = "poetry.core.masonry.api" diff --git a/tests/conftest.py b/tests/conftest.py index dce7d2398..dca0a5f8e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import shutil from pathlib import Path diff --git a/tests/test_api/test_bangumi.py b/tests/test_api/test_bangumi.py index c7c0c45ac..93c3b14d8 100644 --- a/tests/test_api/test_bangumi.py +++ b/tests/test_api/test_bangumi.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import aiohttp import pytest @@ -10,7 +12,7 @@ get_season_id_by_media_id, ) from yutto.utils.fetcher import Fetcher -from yutto.utils.functools import as_sync +from yutto.utils.funcutils import as_sync @pytest.mark.api diff --git a/tests/test_api/test_collection.py b/tests/test_api/test_collection.py index 86d2abcec..dfc8f029d 100644 --- a/tests/test_api/test_collection.py +++ b/tests/test_api/test_collection.py @@ -1,10 +1,12 @@ +from __future__ import annotations + import aiohttp import pytest from yutto._typing import BvId, MId, SeriesId from yutto.api.collection import get_collection_details from yutto.utils.fetcher import Fetcher -from yutto.utils.functools import as_sync +from yutto.utils.funcutils import as_sync @pytest.mark.api diff --git a/tests/test_api/test_danmaku.py b/tests/test_api/test_danmaku.py index 8bb4b7d74..91d6ed295 100644 --- a/tests/test_api/test_danmaku.py +++ b/tests/test_api/test_danmaku.py @@ -1,10 +1,12 @@ +from __future__ import annotations + import aiohttp import pytest from yutto._typing import CId from yutto.api.danmaku import get_danmaku, get_protobuf_danmaku, get_xml_danmaku from yutto.utils.fetcher import Fetcher -from yutto.utils.functools import as_sync +from yutto.utils.funcutils import as_sync @pytest.mark.api diff --git a/tests/test_api/test_space.py b/tests/test_api/test_space.py index 955b14532..f93ec8526 100644 --- a/tests/test_api/test_space.py +++ b/tests/test_api/test_space.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import aiohttp import pytest @@ -12,7 +14,7 @@ get_user_space_all_videos_avids, ) from yutto.utils.fetcher import Fetcher -from yutto.utils.functools import as_sync +from yutto.utils.funcutils import as_sync @pytest.mark.api diff --git a/tests/test_api/test_ugc_video.py b/tests/test_api/test_ugc_video.py index 8c04d06c6..c0163a01e 100644 --- a/tests/test_api/test_ugc_video.py +++ b/tests/test_api/test_ugc_video.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import aiohttp import pytest @@ -9,7 +11,7 @@ get_ugc_video_subtitles, ) from yutto.utils.fetcher import Fetcher -from yutto.utils.functools import as_sync +from yutto.utils.funcutils import as_sync @pytest.mark.api diff --git a/tests/test_api/test_user_info.py b/tests/test_api/test_user_info.py index 30915a16a..e77c68393 100644 --- a/tests/test_api/test_user_info.py +++ b/tests/test_api/test_user_info.py @@ -1,9 +1,11 @@ +from __future__ import annotations + import aiohttp import pytest from yutto.api.user_info import is_vip from yutto.utils.fetcher import Fetcher -from yutto.utils.functools import as_sync +from yutto.utils.funcutils import as_sync @pytest.mark.api diff --git a/tests/test_e2e.py b/tests/test_e2e.py index cdaf1dc1a..6ed184a68 100644 --- a/tests/test_e2e.py +++ b/tests/test_e2e.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import subprocess import sys diff --git a/tests/test_processor/test_downloader.py b/tests/test_processor/test_downloader.py index 02e1a38b7..43660edbb 100644 --- a/tests/test_processor/test_downloader.py +++ b/tests/test_processor/test_downloader.py @@ -1,5 +1,6 @@ +from __future__ import annotations + import asyncio -import os import aiohttp import pytest @@ -7,7 +8,7 @@ from yutto.processor.downloader import slice_blocks from yutto.utils.fetcher import Fetcher from yutto.utils.file_buffer import AsyncFileBuffer -from yutto.utils.functools import as_sync +from yutto.utils.funcutils import as_sync from ..conftest import TEST_DIR diff --git a/tests/test_processor/test_selector.py b/tests/test_processor/test_selector.py index b0367ca3c..b3b506e25 100644 --- a/tests/test_processor/test_selector.py +++ b/tests/test_processor/test_selector.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import pytest from yutto.processor.selector import ( diff --git a/yutto/__init__.py b/yutto/__init__.py index 8d6cb0914..01514ba8a 100644 --- a/yutto/__init__.py +++ b/yutto/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import sys from yutto.exceptions import ErrorCode diff --git a/yutto/__main__.py b/yutto/__main__.py index 79a45674b..cbfe1ec53 100644 --- a/yutto/__main__.py +++ b/yutto/__main__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import argparse import copy import re @@ -27,7 +29,7 @@ from yutto.processor.parser import alias_parser, file_scheme_parser from yutto.utils.console.logger import Badge, Logger from yutto.utils.fetcher import Fetcher -from yutto.utils.functools import as_sync +from yutto.utils.funcutils import as_sync from yutto.validator import ( initial_validate, validate_basic_arguments, diff --git a/yutto/__version__.py b/yutto/__version__.py index d654683ce..e9f0b7d81 100644 --- a/yutto/__version__.py +++ b/yutto/__version__.py @@ -1,2 +1,4 @@ # 发版需要同时改这里和 pyproject.toml +from __future__ import annotations + VERSION = "2.0.0-beta.14" diff --git a/yutto/_typing.py b/yutto/_typing.py index 6d56afcd9..2fb1c77c4 100644 --- a/yutto/_typing.py +++ b/yutto/_typing.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from abc import ABCMeta, abstractmethod from typing import NamedTuple, Optional, TypedDict @@ -19,7 +21,9 @@ def __str__(self) -> str: def __repr__(self) -> str: return self.__str__() - def __eq__(self, other: "BilibiliId") -> bool: + def __eq__(self, other: object) -> bool: + if not isinstance(other, BilibiliId): + return False return self.value == other.value diff --git a/yutto/api/bangumi.py b/yutto/api/bangumi.py index f0ea96cd5..c8e959656 100644 --- a/yutto/api/bangumi.py +++ b/yutto/api/bangumi.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import re from typing import Any, TypedDict diff --git a/yutto/api/collection.py b/yutto/api/collection.py index 1d6529d34..a5fb9340a 100644 --- a/yutto/api/collection.py +++ b/yutto/api/collection.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import asyncio import math from typing import TypedDict diff --git a/yutto/api/danmaku.py b/yutto/api/danmaku.py index ea04c5405..e59df4437 100644 --- a/yutto/api/danmaku.py +++ b/yutto/api/danmaku.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import aiohttp from yutto._typing import CId diff --git a/yutto/api/space.py b/yutto/api/space.py index bf4c3f196..e422a6474 100644 --- a/yutto/api/space.py +++ b/yutto/api/space.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import math from aiohttp import ClientSession diff --git a/yutto/api/ugc_video.py b/yutto/api/ugc_video.py index 16cf3117a..fae18b4e9 100644 --- a/yutto/api/ugc_video.py +++ b/yutto/api/ugc_video.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json import re from typing import Optional, TypedDict diff --git a/yutto/api/user_info.py b/yutto/api/user_info.py index 1d82b8b3d..10e33e730 100644 --- a/yutto/api/user_info.py +++ b/yutto/api/user_info.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from aiohttp import ClientSession from yutto.utils.fetcher import Fetcher diff --git a/yutto/bilibili_typing/codec.py b/yutto/bilibili_typing/codec.py index 3b5ee22c4..8f1807424 100644 --- a/yutto/bilibili_typing/codec.py +++ b/yutto/bilibili_typing/codec.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Literal from yutto.utils.priority import gen_priority_sequence diff --git a/yutto/bilibili_typing/quality.py b/yutto/bilibili_typing/quality.py index f9226aa8f..35ad9325b 100644 --- a/yutto/bilibili_typing/quality.py +++ b/yutto/bilibili_typing/quality.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from enum import Enum from typing import Literal diff --git a/yutto/exceptions.py b/yutto/exceptions.py index d6373125f..ab8bc69fc 100644 --- a/yutto/exceptions.py +++ b/yutto/exceptions.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import sys from enum import Enum from types import TracebackType diff --git a/yutto/extractor/__init__.py b/yutto/extractor/__init__.py index 298f430c7..a933da74b 100644 --- a/yutto/extractor/__init__.py +++ b/yutto/extractor/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from .bangumi import BangumiExtractor from .bangumi_batch import BangumiBatchExtractor from .collection import CollectionExtractor diff --git a/yutto/extractor/_abc.py b/yutto/extractor/_abc.py index 11a962b72..4d16c0f0c 100644 --- a/yutto/extractor/_abc.py +++ b/yutto/extractor/_abc.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import argparse from abc import ABCMeta, abstractmethod from typing import Any, Coroutine, Optional, TypeVar diff --git a/yutto/extractor/bangumi.py b/yutto/extractor/bangumi.py index 0b2d4fef3..420be9922 100644 --- a/yutto/extractor/bangumi.py +++ b/yutto/extractor/bangumi.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import argparse import re import sys diff --git a/yutto/extractor/bangumi_batch.py b/yutto/extractor/bangumi_batch.py index f5db847eb..69b7afe22 100644 --- a/yutto/extractor/bangumi_batch.py +++ b/yutto/extractor/bangumi_batch.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import argparse import re from typing import Any, Coroutine, Optional diff --git a/yutto/extractor/collection.py b/yutto/extractor/collection.py index d697ddd55..ddfa4363f 100644 --- a/yutto/extractor/collection.py +++ b/yutto/extractor/collection.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import argparse import asyncio import re diff --git a/yutto/extractor/common.py b/yutto/extractor/common.py index 0bcbba386..def0897a2 100644 --- a/yutto/extractor/common.py +++ b/yutto/extractor/common.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import argparse from pathlib import Path from typing import Optional diff --git a/yutto/extractor/favourites.py b/yutto/extractor/favourites.py index 98f31ea5c..75e95e751 100644 --- a/yutto/extractor/favourites.py +++ b/yutto/extractor/favourites.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import argparse import asyncio import re diff --git a/yutto/extractor/series.py b/yutto/extractor/series.py index e20d4032a..758c25a9a 100644 --- a/yutto/extractor/series.py +++ b/yutto/extractor/series.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import argparse import asyncio import re diff --git a/yutto/extractor/ugc_video.py b/yutto/extractor/ugc_video.py index 43f849787..7a19fd7a6 100644 --- a/yutto/extractor/ugc_video.py +++ b/yutto/extractor/ugc_video.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import argparse import re from typing import Any, Coroutine, Optional diff --git a/yutto/extractor/ugc_video_batch.py b/yutto/extractor/ugc_video_batch.py index 256513079..64a8f532d 100644 --- a/yutto/extractor/ugc_video_batch.py +++ b/yutto/extractor/ugc_video_batch.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import argparse import re from typing import Any, Coroutine, Optional diff --git a/yutto/extractor/user_all_favourites.py b/yutto/extractor/user_all_favourites.py index 6d9ed43d0..7ebed2e30 100644 --- a/yutto/extractor/user_all_favourites.py +++ b/yutto/extractor/user_all_favourites.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import argparse import re from typing import Any, Coroutine, Optional diff --git a/yutto/extractor/user_all_ugc_videos.py b/yutto/extractor/user_all_ugc_videos.py index 705cfa376..3ac55bddb 100644 --- a/yutto/extractor/user_all_ugc_videos.py +++ b/yutto/extractor/user_all_ugc_videos.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import argparse import re from typing import Any, Coroutine, Optional diff --git a/yutto/processor/downloader.py b/yutto/processor/downloader.py index f740fb213..753234e06 100644 --- a/yutto/processor/downloader.py +++ b/yutto/processor/downloader.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import asyncio import functools import os @@ -16,7 +18,7 @@ from yutto.utils.fetcher import Fetcher from yutto.utils.ffmpeg import FFmpeg from yutto.utils.file_buffer import AsyncFileBuffer -from yutto.utils.functools import filter_none_value, xmerge +from yutto.utils.funcutils import filter_none_value, xmerge from yutto.utils.metadata import write_metadata from yutto.utils.subtitle import write_subtitle diff --git a/yutto/processor/parser.py b/yutto/processor/parser.py index 6c4ac279e..d3e03883a 100644 --- a/yutto/processor/parser.py +++ b/yutto/processor/parser.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import re import urllib import urllib.request diff --git a/yutto/processor/path_resolver.py b/yutto/processor/path_resolver.py index 56bbc7de9..182ae802f 100644 --- a/yutto/processor/path_resolver.py +++ b/yutto/processor/path_resolver.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import re from html import unescape from typing import Literal, Union diff --git a/yutto/processor/progressbar.py b/yutto/processor/progressbar.py index 70cf91bc7..eea374119 100644 --- a/yutto/processor/progressbar.py +++ b/yutto/processor/progressbar.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import asyncio import math import time diff --git a/yutto/processor/selector.py b/yutto/processor/selector.py index 3f9df187b..c0448ccc4 100644 --- a/yutto/processor/selector.py +++ b/yutto/processor/selector.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import re import sys from typing import Optional diff --git a/yutto/utils/asynclib.py b/yutto/utils/asynclib.py index 204e3948b..4942fa90c 100644 --- a/yutto/utils/asynclib.py +++ b/yutto/utils/asynclib.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import asyncio import platform diff --git a/yutto/utils/console/attributes.py b/yutto/utils/console/attributes.py index e3baf9e2b..5efc090ee 100644 --- a/yutto/utils/console/attributes.py +++ b/yutto/utils/console/attributes.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import os import platform import shutil diff --git a/yutto/utils/console/colorful.py b/yutto/utils/console/colorful.py index 9a4f24450..054c0cabc 100644 --- a/yutto/utils/console/colorful.py +++ b/yutto/utils/console/colorful.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import re import sys from typing import Final, Literal, NamedTuple, Optional, TypedDict, Union diff --git a/yutto/utils/console/formatter.py b/yutto/utils/console/formatter.py index 4330ac62f..6bcdf64b9 100644 --- a/yutto/utils/console/formatter.py +++ b/yutto/utils/console/formatter.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Literal from yutto.utils.console.colorful import no_colored_string diff --git a/yutto/utils/console/logger.py b/yutto/utils/console/logger.py index 443a4be18..56c3cc6cb 100644 --- a/yutto/utils/console/logger.py +++ b/yutto/utils/console/logger.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import json from typing import Any, Optional, Union diff --git a/yutto/utils/console/status_bar.py b/yutto/utils/console/status_bar.py index 73f4ea697..5b30586c2 100644 --- a/yutto/utils/console/status_bar.py +++ b/yutto/utils/console/status_bar.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from yutto.utils.console.formatter import get_string_width diff --git a/yutto/utils/danmaku.py b/yutto/utils/danmaku.py index 72f103fc2..a5153e6e7 100644 --- a/yutto/utils/danmaku.py +++ b/yutto/utils/danmaku.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from pathlib import Path from typing import Literal, Optional, TypedDict, Union diff --git a/yutto/utils/fetcher.py b/yutto/utils/fetcher.py index 83af6831f..45e3deac2 100644 --- a/yutto/utils/fetcher.py +++ b/yutto/utils/fetcher.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import asyncio import random from typing import Any, Callable, Coroutine, Literal, Optional, TypeVar, Union diff --git a/yutto/utils/ffmpeg.py b/yutto/utils/ffmpeg.py index eb3321e70..2218a1abc 100644 --- a/yutto/utils/ffmpeg.py +++ b/yutto/utils/ffmpeg.py @@ -1,10 +1,12 @@ +from __future__ import annotations + import os import re import subprocess from functools import cached_property from yutto.utils.console.logger import Logger -from yutto.utils.functools import Singleton +from yutto.utils.funcutils import Singleton class FFmpegNotFoundError(Exception): diff --git a/yutto/utils/file_buffer.py b/yutto/utils/file_buffer.py index ed9ab3292..f2bc8066d 100644 --- a/yutto/utils/file_buffer.py +++ b/yutto/utils/file_buffer.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import heapq from dataclasses import dataclass, field from pathlib import Path @@ -7,7 +9,7 @@ import aiofiles from yutto.utils.console.logger import Logger -from yutto.utils.functools import aobject +from yutto.utils.funcutils import aobject @dataclass(order=True) diff --git a/yutto/utils/functools/__init__.py b/yutto/utils/funcutils/__init__.py similarity index 88% rename from yutto/utils/functools/__init__.py rename to yutto/utils/funcutils/__init__.py index 66b588c1a..671139256 100644 --- a/yutto/utils/functools/__init__.py +++ b/yutto/utils/funcutils/__init__.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from .aobject import aobject from .as_sync import as_sync from .filter_none_value import filter_none_value diff --git a/yutto/utils/functools/aobject.py b/yutto/utils/funcutils/aobject.py similarity index 94% rename from yutto/utils/functools/aobject.py rename to yutto/utils/funcutils/aobject.py index c0f2bea7f..ac7b757a9 100644 --- a/yutto/utils/functools/aobject.py +++ b/yutto/utils/funcutils/aobject.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Any diff --git a/yutto/utils/functools/as_sync.py b/yutto/utils/funcutils/as_sync.py similarity index 95% rename from yutto/utils/functools/as_sync.py rename to yutto/utils/funcutils/as_sync.py index 95f1eaff2..75e29d3f7 100644 --- a/yutto/utils/functools/as_sync.py +++ b/yutto/utils/funcutils/as_sync.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import asyncio from functools import wraps from typing import Any, Callable, Coroutine, TypeVar diff --git a/yutto/utils/functools/filter_none_value.py b/yutto/utils/funcutils/filter_none_value.py similarity index 92% rename from yutto/utils/functools/filter_none_value.py rename to yutto/utils/funcutils/filter_none_value.py index 8d22ca599..a38d1ebfc 100644 --- a/yutto/utils/functools/filter_none_value.py +++ b/yutto/utils/funcutils/filter_none_value.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from typing import Iterable, Optional, TypeVar T = TypeVar("T") diff --git a/yutto/utils/functools/singleton.py b/yutto/utils/funcutils/singleton.py similarity index 93% rename from yutto/utils/functools/singleton.py rename to yutto/utils/funcutils/singleton.py index c1de4ea75..69851673c 100644 --- a/yutto/utils/functools/singleton.py +++ b/yutto/utils/funcutils/singleton.py @@ -1,4 +1,7 @@ # type: ignore +from __future__ import annotations + + class Singleton(type): """单例模式元类 diff --git a/yutto/utils/functools/xmerge.py b/yutto/utils/funcutils/xmerge.py similarity index 93% rename from yutto/utils/functools/xmerge.py rename to yutto/utils/funcutils/xmerge.py index 7299d28ac..5e5ce07da 100644 --- a/yutto/utils/functools/xmerge.py +++ b/yutto/utils/funcutils/xmerge.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from itertools import chain, zip_longest from typing import Iterable, TypeVar diff --git a/yutto/utils/metadata.py b/yutto/utils/metadata.py index 17ee84b41..e43c080ed 100644 --- a/yutto/utils/metadata.py +++ b/yutto/utils/metadata.py @@ -1,6 +1,8 @@ +from __future__ import annotations + from pathlib import Path from typing import TypedDict, Union -from xml.dom.minidom import parseString +from xml.dom.minidom import parseString # type: ignore import dicttoxml # type: ignore diff --git a/yutto/utils/priority.py b/yutto/utils/priority.py index c3b321a2a..2e3df878d 100644 --- a/yutto/utils/priority.py +++ b/yutto/utils/priority.py @@ -1,3 +1,6 @@ +from __future__ import annotations + + def gen_priority_sequence(choice: int, num_choices: int) -> list[int]: """根据默认先降后升的机制生成序列 diff --git a/yutto/utils/subtitle.py b/yutto/utils/subtitle.py index e501c7b11..e48f90a06 100644 --- a/yutto/utils/subtitle.py +++ b/yutto/utils/subtitle.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from pathlib import Path from typing import TypedDict, Union diff --git a/yutto/utils/time.py b/yutto/utils/time.py index 4ccb0a1d2..8198e6018 100644 --- a/yutto/utils/time.py +++ b/yutto/utils/time.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import time TIME_FMT = "%Y-%m-%d %H:%M:%S" diff --git a/yutto/validator.py b/yutto/validator.py index 9a8966717..b5d24b811 100644 --- a/yutto/validator.py +++ b/yutto/validator.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import argparse import asyncio import os