diff --git a/Makefile b/Makefile index 0be80e53..9cd35d89 100644 --- a/Makefile +++ b/Makefile @@ -36,12 +36,12 @@ endif all: check_lint docs docker docker_ubuntu docker_gui lint: - python3 -m isort . - python3 -m black . + python3 -m ruff format . + python3 -m ruff check --fix . python3 -m pylint src check_lint: - isort . --check-only --diff \ - && black . --check \ + ruff format --check . \ + && ruff check . \ && pylint src/ wheel: clean $(shell echo "__pypi_version__ = \"$(PYPI_VERSION)\"" > src/ytdl_sub/__init__.py) diff --git a/pyproject.toml b/pyproject.toml index 59afdd59..c9523b28 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,9 +47,8 @@ test = [ "pytest-rerunfailures>=14,<17", ] lint = [ - "black==24.10.0", - "isort==7.0.0", "pylint==4.0.1", + "ruff==0.15.5", ] docs = [ "sphinx>=7,<10", @@ -66,15 +65,6 @@ build = [ [project.scripts] ytdl-sub = "ytdl_sub.main:main" -[tool.isort] -profile = "black" -line_length = 100 -force_single_line = true - -[tool.black] -line_length = 100 -target-version = ["py310"] - [tool.pylint.MASTER] disable = [ "C0115", # Missing class docstring @@ -100,3 +90,27 @@ include = [ exclude_also = [ "raise UNREACHABLE.*", ] + +# ruff +[tool.ruff] +line-length = 100 +indent-width = 4 + +# Assume Python 3.10 +target-version = "py310" + +[tool.ruff.lint] +extend-select = ["I"] + +[tool.ruff.format] +# Like Black, use double quotes for strings. +quote-style = "double" + +# Like Black, indent with spaces, rather than tabs. +indent-style = "space" + +# Like Black, respect magic trailing commas. +skip-magic-trailing-comma = false + +# Like Black, automatically detect the appropriate line ending. +line-ending = "auto" \ No newline at end of file diff --git a/src/ytdl_sub/cli/entrypoint.py b/src/ytdl_sub/cli/entrypoint.py index 29f4f482..ade74a42 100644 --- a/src/ytdl_sub/cli/entrypoint.py +++ b/src/ytdl_sub/cli/entrypoint.py @@ -4,23 +4,21 @@ import random import sys from datetime import datetime from pathlib import Path -from typing import Dict -from typing import List -from typing import Optional +from typing import Dict, List, Optional from yt_dlp.utils import sanitize_filename from ytdl_sub.cli.output_summary import output_summary -from ytdl_sub.cli.output_transaction_log import _maybe_validate_transaction_log_file -from ytdl_sub.cli.output_transaction_log import output_transaction_log +from ytdl_sub.cli.output_transaction_log import ( + _maybe_validate_transaction_log_file, + output_transaction_log, +) from ytdl_sub.cli.parsers.cli_to_sub import print_cli_to_sub from ytdl_sub.cli.parsers.dl import DownloadArgsParser -from ytdl_sub.cli.parsers.main import DEFAULT_CONFIG_FILE_NAME -from ytdl_sub.cli.parsers.main import parser +from ytdl_sub.cli.parsers.main import DEFAULT_CONFIG_FILE_NAME, parser from ytdl_sub.config.config_file import ConfigFile from ytdl_sub.subscriptions.subscription import Subscription -from ytdl_sub.utils.exceptions import ExperimentalFeatureNotEnabled -from ytdl_sub.utils.exceptions import ValidationException +from ytdl_sub.utils.exceptions import ExperimentalFeatureNotEnabled, ValidationException from ytdl_sub.utils.file_handler import FileHandler from ytdl_sub.utils.file_lock import working_directory_lock from ytdl_sub.utils.logger import Logger diff --git a/src/ytdl_sub/cli/output_transaction_log.py b/src/ytdl_sub/cli/output_transaction_log.py index ce46de0c..0457ea35 100644 --- a/src/ytdl_sub/cli/output_transaction_log.py +++ b/src/ytdl_sub/cli/output_transaction_log.py @@ -1,5 +1,4 @@ -from typing import List -from typing import Optional +from typing import List, Optional from ytdl_sub.subscriptions.subscription import Subscription from ytdl_sub.utils.exceptions import ValidationException diff --git a/src/ytdl_sub/cli/parsers/cli_to_sub.py b/src/ytdl_sub/cli/parsers/cli_to_sub.py index d4190042..2827c705 100644 --- a/src/ytdl_sub/cli/parsers/cli_to_sub.py +++ b/src/ytdl_sub/cli/parsers/cli_to_sub.py @@ -18,7 +18,6 @@ create_parser = yt_dlp.options.create_parser def parse_patched_options(opts): - patched_parser = create_parser() patched_parser.defaults.update( { diff --git a/src/ytdl_sub/cli/parsers/dl.py b/src/ytdl_sub/cli/parsers/dl.py index 7fbf7ac4..dd445179 100644 --- a/src/ytdl_sub/cli/parsers/dl.py +++ b/src/ytdl_sub/cli/parsers/dl.py @@ -1,10 +1,7 @@ import hashlib import re import shlex -from typing import Any -from typing import Dict -from typing import List -from typing import Tuple +from typing import Any, Dict, List, Tuple from mergedeep import mergedeep diff --git a/src/ytdl_sub/config/config_file.py b/src/ytdl_sub/config/config_file.py index d0c117ef..42563da4 100644 --- a/src/ytdl_sub/config/config_file.py +++ b/src/ytdl_sub/config/config_file.py @@ -1,6 +1,5 @@ import os -from typing import Any -from typing import Dict +from typing import Any, Dict from ytdl_sub.config.config_validator import ConfigValidator from ytdl_sub.config.preset import Preset diff --git a/src/ytdl_sub/config/config_validator.py b/src/ytdl_sub/config/config_validator.py index 0dc2c1e0..8f3961e6 100644 --- a/src/ytdl_sub/config/config_validator.py +++ b/src/ytdl_sub/config/config_validator.py @@ -1,26 +1,27 @@ import os import posixpath -from typing import Any -from typing import Dict -from typing import Optional +from typing import Any, Dict, Optional from mergedeep import mergedeep from yt_dlp.utils import datetime_from_str -from ytdl_sub.config.defaults import DEFAULT_FFMPEG_PATH -from ytdl_sub.config.defaults import DEFAULT_FFPROBE_PATH -from ytdl_sub.config.defaults import DEFAULT_LOCK_DIRECTORY -from ytdl_sub.config.defaults import MAX_FILE_NAME_BYTES +from ytdl_sub.config.defaults import ( + DEFAULT_FFMPEG_PATH, + DEFAULT_FFPROBE_PATH, + DEFAULT_LOCK_DIRECTORY, + MAX_FILE_NAME_BYTES, +) from ytdl_sub.prebuilt_presets import PREBUILT_PRESETS from ytdl_sub.utils.exceptions import SubscriptionPermissionError from ytdl_sub.utils.file_handler import FileHandler -from ytdl_sub.validators.file_path_validators import FFmpegFileValidator -from ytdl_sub.validators.file_path_validators import FFprobeFileValidator +from ytdl_sub.validators.file_path_validators import FFmpegFileValidator, FFprobeFileValidator from ytdl_sub.validators.strict_dict_validator import StrictDictValidator -from ytdl_sub.validators.validators import BoolValidator -from ytdl_sub.validators.validators import IntValidator -from ytdl_sub.validators.validators import LiteralDictValidator -from ytdl_sub.validators.validators import StringValidator +from ytdl_sub.validators.validators import ( + BoolValidator, + IntValidator, + LiteralDictValidator, + StringValidator, +) class ExperimentalValidator(StrictDictValidator): diff --git a/src/ytdl_sub/config/overrides.py b/src/ytdl_sub/config/overrides.py index f1011fcf..1d34ff35 100644 --- a/src/ytdl_sub/config/overrides.py +++ b/src/ytdl_sub/config/overrides.py @@ -1,29 +1,28 @@ -from typing import Any -from typing import Dict -from typing import Iterable -from typing import Optional -from typing import Set -from typing import Type -from typing import TypeVar +from typing import Any, Dict, Iterable, Optional, Set, Type, TypeVar from ytdl_sub.entries.entry import Entry from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.variables.override_variables import REQUIRED_OVERRIDE_VARIABLE_NAMES -from ytdl_sub.entries.variables.override_variables import OverrideHelpers +from ytdl_sub.entries.variables.override_variables import ( + REQUIRED_OVERRIDE_VARIABLE_NAMES, + OverrideHelpers, +) from ytdl_sub.script.parser import parse from ytdl_sub.script.script import Script from ytdl_sub.script.types.function import BuiltInFunction -from ytdl_sub.script.types.resolvable import Resolvable -from ytdl_sub.script.types.resolvable import String +from ytdl_sub.script.types.resolvable import Resolvable, String from ytdl_sub.script.types.syntax_tree import SyntaxTree from ytdl_sub.script.utils.exceptions import ScriptVariableNotResolved -from ytdl_sub.utils.exceptions import InvalidVariableNameException -from ytdl_sub.utils.exceptions import StringFormattingException -from ytdl_sub.utils.exceptions import ValidationException +from ytdl_sub.utils.exceptions import ( + InvalidVariableNameException, + StringFormattingException, + ValidationException, +) from ytdl_sub.utils.script import ScriptUtils from ytdl_sub.utils.scriptable import Scriptable -from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator -from ytdl_sub.validators.string_formatter_validators import UnstructuredDictFormatterValidator +from ytdl_sub.validators.string_formatter_validators import ( + StringFormatterValidator, + UnstructuredDictFormatterValidator, +) ExpectedT = TypeVar("ExpectedT") diff --git a/src/ytdl_sub/config/plugin/plugin.py b/src/ytdl_sub/config/plugin/plugin.py index 23232c48..73556656 100644 --- a/src/ytdl_sub/config/plugin/plugin.py +++ b/src/ytdl_sub/config/plugin/plugin.py @@ -1,20 +1,15 @@ -from abc import ABC -from abc import abstractmethod +from abc import ABC, abstractmethod from functools import cached_property -from typing import Dict -from typing import Generic -from typing import List -from typing import Optional -from typing import Tuple -from typing import Type +from typing import Dict, Generic, List, Optional, Tuple, Type from ytdl_sub.config.overrides import Overrides -from ytdl_sub.config.validators.options import OptionsValidatorT -from ytdl_sub.config.validators.options import ToggleableOptionsDictValidator +from ytdl_sub.config.validators.options import OptionsValidatorT, ToggleableOptionsDictValidator from ytdl_sub.entries.entry import Entry from ytdl_sub.utils.file_handler import FileMetadata -from ytdl_sub.ytdl_additions.enhanced_download_archive import DownloadArchiver -from ytdl_sub.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive +from ytdl_sub.ytdl_additions.enhanced_download_archive import ( + DownloadArchiver, + EnhancedDownloadArchive, +) # pylint: disable=unused-argument diff --git a/src/ytdl_sub/config/plugin/plugin_mapping.py b/src/ytdl_sub/config/plugin/plugin_mapping.py index bf458d6a..6f40e9fc 100644 --- a/src/ytdl_sub/config/plugin/plugin_mapping.py +++ b/src/ytdl_sub/config/plugin/plugin_mapping.py @@ -1,15 +1,12 @@ -from typing import Dict -from typing import List -from typing import Optional -from typing import Tuple -from typing import Type +from typing import Dict, List, Optional, Tuple, Type -from ytdl_sub.config.plugin.plugin import Plugin -from ytdl_sub.config.plugin.plugin import SplitPlugin +from ytdl_sub.config.plugin.plugin import Plugin, SplitPlugin from ytdl_sub.config.plugin.plugin_operation import PluginOperation from ytdl_sub.config.validators.options import OptionsValidator -from ytdl_sub.downloaders.url.downloader import UrlDownloaderCollectionVariablePlugin -from ytdl_sub.downloaders.url.downloader import UrlDownloaderThumbnailPlugin +from ytdl_sub.downloaders.url.downloader import ( + UrlDownloaderCollectionVariablePlugin, + UrlDownloaderThumbnailPlugin, +) from ytdl_sub.plugins.audio_extract import AudioExtractPlugin from ytdl_sub.plugins.chapters import ChaptersPlugin from ytdl_sub.plugins.date_range import DateRangePlugin diff --git a/src/ytdl_sub/config/plugin/preset_plugins.py b/src/ytdl_sub/config/plugin/preset_plugins.py index 61305a37..bd6ca390 100644 --- a/src/ytdl_sub/config/plugin/preset_plugins.py +++ b/src/ytdl_sub/config/plugin/preset_plugins.py @@ -1,13 +1,7 @@ -from typing import Iterable -from typing import List -from typing import Optional -from typing import Set -from typing import Tuple -from typing import Type +from typing import Iterable, List, Optional, Set, Tuple, Type from ytdl_sub.config.plugin.plugin import Plugin -from ytdl_sub.config.validators.options import OptionsValidator -from ytdl_sub.config.validators.options import OptionsValidatorT +from ytdl_sub.config.validators.options import OptionsValidator, OptionsValidatorT class PresetPlugins: diff --git a/src/ytdl_sub/config/preset.py b/src/ytdl_sub/config/preset.py index 2c8ad348..4734eea4 100644 --- a/src/ytdl_sub/config/preset.py +++ b/src/ytdl_sub/config/preset.py @@ -1,8 +1,5 @@ import copy -from typing import Any -from typing import Dict -from typing import List -from typing import Set +from typing import Any, Dict, List, Set from mergedeep import mergedeep @@ -10,17 +7,14 @@ from ytdl_sub.config.config_validator import ConfigValidator from ytdl_sub.config.overrides import Overrides from ytdl_sub.config.plugin.plugin_mapping import PluginMapping from ytdl_sub.config.plugin.preset_plugins import PresetPlugins -from ytdl_sub.config.preset_options import OutputOptions -from ytdl_sub.config.preset_options import YTDLOptions +from ytdl_sub.config.preset_options import OutputOptions, YTDLOptions from ytdl_sub.downloaders.url.validators import MultiUrlValidator -from ytdl_sub.prebuilt_presets import PREBUILT_PRESET_NAMES -from ytdl_sub.prebuilt_presets import PUBLISHED_PRESET_NAMES +from ytdl_sub.prebuilt_presets import PREBUILT_PRESET_NAMES, PUBLISHED_PRESET_NAMES from ytdl_sub.utils.exceptions import ValidationException from ytdl_sub.utils.logger import Logger from ytdl_sub.utils.yaml import dump_yaml from ytdl_sub.validators.strict_dict_validator import StrictDictValidator -from ytdl_sub.validators.validators import StringListValidator -from ytdl_sub.validators.validators import validation_exception +from ytdl_sub.validators.validators import StringListValidator, validation_exception PRESET_KEYS = { "preset", diff --git a/src/ytdl_sub/config/preset_options.py b/src/ytdl_sub/config/preset_options.py index 27ad8a92..112514cd 100644 --- a/src/ytdl_sub/config/preset_options.py +++ b/src/ytdl_sub/config/preset_options.py @@ -1,24 +1,22 @@ -from typing import Any -from typing import Dict -from typing import Optional -from typing import Set +from typing import Any, Dict, Optional, Set from ytdl_sub.config.defaults import DEFAULT_DOWNLOAD_ARCHIVE_NAME from ytdl_sub.config.overrides import Overrides from ytdl_sub.config.plugin.plugin_operation import PluginOperation from ytdl_sub.config.validators.options import OptionsDictValidator from ytdl_sub.entries.script.variable_definitions import VARIABLES as v -from ytdl_sub.utils.exceptions import SubscriptionPermissionError -from ytdl_sub.utils.exceptions import ValidationException +from ytdl_sub.utils.exceptions import SubscriptionPermissionError, ValidationException from ytdl_sub.utils.file_handler import FileHandler -from ytdl_sub.validators.file_path_validators import OverridesStringFormatterFilePathValidator -from ytdl_sub.validators.file_path_validators import StringFormatterFileNameValidator +from ytdl_sub.validators.file_path_validators import ( + OverridesStringFormatterFilePathValidator, + StringFormatterFileNameValidator, +) from ytdl_sub.validators.string_datetime import StringDatetimeValidator -from ytdl_sub.validators.string_formatter_validators import OverridesIntegerFormatterValidator -from ytdl_sub.validators.string_formatter_validators import OverridesStringFormatterValidator -from ytdl_sub.validators.string_formatter_validators import StandardizedDateValidator -from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator from ytdl_sub.validators.string_formatter_validators import ( + OverridesIntegerFormatterValidator, + OverridesStringFormatterValidator, + StandardizedDateValidator, + StringFormatterValidator, UnstructuredOverridesDictFormatterValidator, ) from ytdl_sub.validators.validators import BoolValidator diff --git a/src/ytdl_sub/config/validators/options.py b/src/ytdl_sub/config/validators/options.py index 5fbdc14d..21477643 100644 --- a/src/ytdl_sub/config/validators/options.py +++ b/src/ytdl_sub/config/validators/options.py @@ -1,7 +1,5 @@ from abc import ABC -from typing import Dict -from typing import Set -from typing import TypeVar +from typing import Dict, Set, TypeVar from ytdl_sub.config.plugin.plugin_operation import PluginOperation from ytdl_sub.utils.exceptions import ValidationException @@ -61,9 +59,9 @@ class ToggleableOptionsDictValidator(OptionsDictValidator): _optional_keys = {"enable"} def __init__(self, name, value): - assert ( - "enable" in self._optional_keys - ), f"{self.__class__.__name__} does not have enable as an optional field" + assert "enable" in self._optional_keys, ( + f"{self.__class__.__name__} does not have enable as an optional field" + ) super().__init__(name, value) self._enable = self._validate_key( diff --git a/src/ytdl_sub/config/validators/variable_validation.py b/src/ytdl_sub/config/validators/variable_validation.py index 941d228e..8fbac314 100644 --- a/src/ytdl_sub/config/validators/variable_validation.py +++ b/src/ytdl_sub/config/validators/variable_validation.py @@ -1,6 +1,4 @@ -from typing import Dict -from typing import List -from typing import Set +from typing import Dict, List, Set from ytdl_sub.config.overrides import Overrides from ytdl_sub.config.plugin.plugin_mapping import PluginMapping @@ -9,8 +7,7 @@ from ytdl_sub.config.plugin.preset_plugins import PresetPlugins from ytdl_sub.config.preset_options import OutputOptions from ytdl_sub.config.validators.options import OptionsValidator from ytdl_sub.downloaders.url.validators import MultiUrlValidator -from ytdl_sub.entries.script.variable_definitions import UNRESOLVED_VARIABLES -from ytdl_sub.entries.script.variable_definitions import VARIABLES +from ytdl_sub.entries.script.variable_definitions import UNRESOLVED_VARIABLES, VARIABLES from ytdl_sub.script.script import Script from ytdl_sub.script.utils.name_validation import is_function from ytdl_sub.utils.script import ScriptUtils @@ -47,7 +44,6 @@ class ResolutionLevel: class VariableValidation: - def _get_resolve_partial_filter(self) -> Set[str]: # Exclude sanitized variables from partial validation. This lessens the work # and prevents double-evaluation, which can lead to bad behavior like double-prints. diff --git a/src/ytdl_sub/downloaders/info_json/info_json_downloader.py b/src/ytdl_sub/downloaders/info_json/info_json_downloader.py index 582962f5..68d2e9e0 100644 --- a/src/ytdl_sub/downloaders/info_json/info_json_downloader.py +++ b/src/ytdl_sub/downloaders/info_json/info_json_downloader.py @@ -1,24 +1,24 @@ import copy import json from pathlib import Path -from typing import Dict -from typing import Iterable -from typing import List -from typing import Optional +from typing import Dict, Iterable, List, Optional from ytdl_sub.config.overrides import Overrides from ytdl_sub.config.validators.options import OptionsDictValidator from ytdl_sub.downloaders.source_plugin import SourcePlugin from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder from ytdl_sub.entries.entry import Entry -from ytdl_sub.entries.script.variable_definitions import VARIABLE_SCRIPTS -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions +from ytdl_sub.entries.script.variable_definitions import ( + VARIABLE_SCRIPTS, + VARIABLES, + VariableDefinitions, +) from ytdl_sub.utils.exceptions import ValidationException -from ytdl_sub.utils.file_handler import FileHandler -from ytdl_sub.utils.file_handler import get_file_extension -from ytdl_sub.ytdl_additions.enhanced_download_archive import DownloadMapping -from ytdl_sub.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive +from ytdl_sub.utils.file_handler import FileHandler, get_file_extension +from ytdl_sub.ytdl_additions.enhanced_download_archive import ( + DownloadMapping, + EnhancedDownloadArchive, +) v: VariableDefinitions = VARIABLES diff --git a/src/ytdl_sub/downloaders/source_plugin.py b/src/ytdl_sub/downloaders/source_plugin.py index 70127c63..030c4458 100644 --- a/src/ytdl_sub/downloaders/source_plugin.py +++ b/src/ytdl_sub/downloaders/source_plugin.py @@ -1,16 +1,9 @@ import abc from abc import ABC -from typing import Dict -from typing import Generic -from typing import Iterable -from typing import List -from typing import Optional -from typing import Type -from typing import final +from typing import Dict, Generic, Iterable, List, Optional, Type, final from ytdl_sub.config.overrides import Overrides -from ytdl_sub.config.plugin.plugin import BasePlugin -from ytdl_sub.config.plugin.plugin import Plugin +from ytdl_sub.config.plugin.plugin import BasePlugin, Plugin from ytdl_sub.config.validators.options import OptionsValidatorT from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder from ytdl_sub.entries.entry import Entry diff --git a/src/ytdl_sub/downloaders/url/downloader.py b/src/ytdl_sub/downloaders/url/downloader.py index c94d6910..66ef2f60 100644 --- a/src/ytdl_sub/downloaders/url/downloader.py +++ b/src/ytdl_sub/downloaders/url/downloader.py @@ -1,33 +1,29 @@ import contextlib import os from pathlib import Path -from typing import Dict -from typing import Iterable -from typing import Iterator -from typing import List -from typing import Optional -from typing import Set -from typing import Tuple +from typing import Dict, Iterable, Iterator, List, Optional, Set, Tuple from yt_dlp.utils import RejectedVideoReached from ytdl_sub.config.overrides import Overrides -from ytdl_sub.downloaders.source_plugin import SourcePlugin -from ytdl_sub.downloaders.source_plugin import SourcePluginExtension -from ytdl_sub.downloaders.url.validators import MultiUrlValidator -from ytdl_sub.downloaders.url.validators import UrlThumbnailListValidator -from ytdl_sub.downloaders.url.validators import UrlValidator +from ytdl_sub.downloaders.source_plugin import SourcePlugin, SourcePluginExtension +from ytdl_sub.downloaders.url.validators import ( + MultiUrlValidator, + UrlThumbnailListValidator, + UrlValidator, +) from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder from ytdl_sub.downloaders.ytdlp import YTDLP from ytdl_sub.entries.entry import Entry from ytdl_sub.entries.entry_parent import EntryParent -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions +from ytdl_sub.entries.script.variable_definitions import VARIABLES, VariableDefinitions from ytdl_sub.utils.file_handler import FileHandler from ytdl_sub.utils.logger import Logger -from ytdl_sub.utils.thumbnail import ThumbnailTypes -from ytdl_sub.utils.thumbnail import download_and_convert_url_thumbnail -from ytdl_sub.utils.thumbnail import try_convert_download_thumbnail +from ytdl_sub.utils.thumbnail import ( + ThumbnailTypes, + download_and_convert_url_thumbnail, + try_convert_download_thumbnail, +) from ytdl_sub.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive v: VariableDefinitions = VARIABLES @@ -97,7 +93,6 @@ class UrlDownloaderThumbnailPlugin(UrlDownloaderBasePluginExtension): # If latest entry, always update the thumbnail on each entry if thumbnail_id == ThumbnailTypes.LATEST_ENTRY: - # always save in dry-run even if it doesn't exist... if self.is_dry_run or entry.is_thumbnail_downloaded(): self.save_file( diff --git a/src/ytdl_sub/downloaders/url/validators.py b/src/ytdl_sub/downloaders/url/validators.py index b2010ebc..13fc321b 100644 --- a/src/ytdl_sub/downloaders/url/validators.py +++ b/src/ytdl_sub/downloaders/url/validators.py @@ -1,18 +1,16 @@ -from typing import Any -from typing import Dict -from typing import List -from typing import Optional -from typing import Set +from typing import Any, Dict, List, Optional, Set from ytdl_sub.config.plugin.plugin_operation import PluginOperation from ytdl_sub.config.preset_options import YTDLOptions from ytdl_sub.config.validators.options import OptionsValidator from ytdl_sub.script.parser import parse from ytdl_sub.validators.strict_dict_validator import StrictDictValidator -from ytdl_sub.validators.string_formatter_validators import DictFormatterValidator -from ytdl_sub.validators.string_formatter_validators import OverridesBooleanFormatterValidator -from ytdl_sub.validators.string_formatter_validators import OverridesStringFormatterValidator -from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator +from ytdl_sub.validators.string_formatter_validators import ( + DictFormatterValidator, + OverridesBooleanFormatterValidator, + OverridesStringFormatterValidator, + StringFormatterValidator, +) from ytdl_sub.validators.validators import ListValidator diff --git a/src/ytdl_sub/downloaders/ytdl_options_builder.py b/src/ytdl_sub/downloaders/ytdl_options_builder.py index 9f389b51..208cd48c 100644 --- a/src/ytdl_sub/downloaders/ytdl_options_builder.py +++ b/src/ytdl_sub/downloaders/ytdl_options_builder.py @@ -1,6 +1,5 @@ import copy -from typing import Dict -from typing import Optional +from typing import Dict, Optional import mergedeep diff --git a/src/ytdl_sub/downloaders/ytdlp.py b/src/ytdl_sub/downloaders/ytdlp.py index c01376e4..8161ca73 100644 --- a/src/ytdl_sub/downloaders/ytdlp.py +++ b/src/ytdl_sub/downloaders/ytdlp.py @@ -5,15 +5,10 @@ import os import time from contextlib import contextmanager from pathlib import Path -from typing import Callable -from typing import Dict -from typing import List -from typing import Optional +from typing import Callable, Dict, List, Optional import yt_dlp as ytdl -from yt_dlp.utils import ExistingVideoReached -from yt_dlp.utils import MaxDownloadsReached -from yt_dlp.utils import RejectedVideoReached +from yt_dlp.utils import ExistingVideoReached, MaxDownloadsReached, RejectedVideoReached from ytdl_sub.thread.log_entries_downloaded_listener import LogEntriesDownloadedListener from ytdl_sub.utils.exceptions import FileNotDownloadedException diff --git a/src/ytdl_sub/entries/base_entry.py b/src/ytdl_sub/entries/base_entry.py index c8321774..13d32ff9 100644 --- a/src/ytdl_sub/entries/base_entry.py +++ b/src/ytdl_sub/entries/base_entry.py @@ -1,18 +1,11 @@ # pylint: disable=protected-access from abc import ABC from pathlib import Path -from typing import Any -from typing import Dict -from typing import Optional -from typing import Type -from typing import TypeVar -from typing import final +from typing import Any, Dict, Optional, Type, TypeVar, final -from yt_dlp.utils import LazyList -from yt_dlp.utils import sanitize_filename +from yt_dlp.utils import LazyList, sanitize_filename -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions +from ytdl_sub.entries.script.variable_definitions import VARIABLES, VariableDefinitions v: VariableDefinitions = VARIABLES diff --git a/src/ytdl_sub/entries/entry.py b/src/ytdl_sub/entries/entry.py index f97e98f5..5135bb1e 100644 --- a/src/ytdl_sub/entries/entry.py +++ b/src/ytdl_sub/entries/entry.py @@ -3,24 +3,15 @@ import copy import json import os from pathlib import Path -from typing import Any -from typing import Dict -from typing import Optional -from typing import Type -from typing import TypeVar -from typing import final +from typing import Any, Dict, Optional, Type, TypeVar, final from ytdl_sub.entries.base_entry import BaseEntry -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions -from ytdl_sub.entries.script.variable_types import ArrayVariable -from ytdl_sub.entries.script.variable_types import StringVariable -from ytdl_sub.entries.script.variable_types import Variable +from ytdl_sub.entries.script.variable_definitions import VARIABLES, VariableDefinitions +from ytdl_sub.entries.script.variable_types import ArrayVariable, StringVariable, Variable from ytdl_sub.script.utils.exceptions import ScriptVariableNotResolved from ytdl_sub.utils.script import ScriptUtils from ytdl_sub.utils.scriptable import Scriptable -from ytdl_sub.validators.audo_codec_validator import AUDIO_CODEC_EXTS -from ytdl_sub.validators.audo_codec_validator import VIDEO_CODEC_EXTS +from ytdl_sub.validators.audo_codec_validator import AUDIO_CODEC_EXTS, VIDEO_CODEC_EXTS v: VariableDefinitions = VARIABLES diff --git a/src/ytdl_sub/entries/entry_parent.py b/src/ytdl_sub/entries/entry_parent.py index ae32bcc4..33bb9f70 100644 --- a/src/ytdl_sub/entries/entry_parent.py +++ b/src/ytdl_sub/entries/entry_parent.py @@ -1,16 +1,10 @@ import math -from typing import Any -from typing import Dict -from typing import List -from typing import Optional -from typing import Set +from typing import Any, Dict, List, Optional, Set from urllib.parse import urlparse -from ytdl_sub.entries.base_entry import BaseEntry -from ytdl_sub.entries.base_entry import BaseEntryT +from ytdl_sub.entries.base_entry import BaseEntry, BaseEntryT from ytdl_sub.entries.entry import Entry -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions +from ytdl_sub.entries.script.variable_definitions import VARIABLES, VariableDefinitions from ytdl_sub.entries.script.variable_types import MetadataVariable v: VariableDefinitions = VARIABLES diff --git a/src/ytdl_sub/entries/script/custom_functions.py b/src/ytdl_sub/entries/script/custom_functions.py index ded8c54f..0bfc90ec 100644 --- a/src/ytdl_sub/entries/script/custom_functions.py +++ b/src/ytdl_sub/entries/script/custom_functions.py @@ -5,10 +5,7 @@ from yt_dlp.utils import sanitize_filename from ytdl_sub.script.functions import Functions from ytdl_sub.script.types.map import Map -from ytdl_sub.script.types.resolvable import AnyArgument -from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.types.resolvable import ReturnableArgument -from ytdl_sub.script.types.resolvable import String +from ytdl_sub.script.types.resolvable import AnyArgument, Integer, ReturnableArgument, String from ytdl_sub.script.utils.exceptions import RuntimeException from ytdl_sub.utils.file_path import FilePathTruncater diff --git a/src/ytdl_sub/entries/script/function_scripts.py b/src/ytdl_sub/entries/script/function_scripts.py index ab4ba121..7feeb0bb 100644 --- a/src/ytdl_sub/entries/script/function_scripts.py +++ b/src/ytdl_sub/entries/script/function_scripts.py @@ -1,7 +1,6 @@ from typing import Dict -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions +from ytdl_sub.entries.script.variable_definitions import VARIABLES, VariableDefinitions v: VariableDefinitions = VARIABLES diff --git a/src/ytdl_sub/entries/script/variable_definitions.py b/src/ytdl_sub/entries/script/variable_definitions.py index 97fb7759..a436060d 100644 --- a/src/ytdl_sub/entries/script/variable_definitions.py +++ b/src/ytdl_sub/entries/script/variable_definitions.py @@ -1,21 +1,21 @@ from abc import ABC -from functools import cache -from functools import cached_property -from typing import Dict -from typing import Set +from functools import cache, cached_property +from typing import Dict, Set from ytdl_sub.entries.script.custom_functions import CustomFunctions -from ytdl_sub.entries.script.variable_types import ArrayMetadataVariable -from ytdl_sub.entries.script.variable_types import IntegerMetadataVariable -from ytdl_sub.entries.script.variable_types import IntegerVariable -from ytdl_sub.entries.script.variable_types import MapMetadataVariable -from ytdl_sub.entries.script.variable_types import MapVariable -from ytdl_sub.entries.script.variable_types import MetadataVariable -from ytdl_sub.entries.script.variable_types import StringDateMetadataVariable -from ytdl_sub.entries.script.variable_types import StringDateVariable -from ytdl_sub.entries.script.variable_types import StringMetadataVariable -from ytdl_sub.entries.script.variable_types import StringVariable -from ytdl_sub.entries.script.variable_types import Variable +from ytdl_sub.entries.script.variable_types import ( + ArrayMetadataVariable, + IntegerMetadataVariable, + IntegerVariable, + MapMetadataVariable, + MapVariable, + MetadataVariable, + StringDateMetadataVariable, + StringDateVariable, + StringMetadataVariable, + StringVariable, + Variable, +) # This file contains mixins to a BaseEntry subclass. Ignore pylint's "no kwargs member" suggestion # pylint: disable=no-member diff --git a/src/ytdl_sub/entries/script/variable_types.py b/src/ytdl_sub/entries/script/variable_types.py index bbf994e9..ea476cca 100644 --- a/src/ytdl_sub/entries/script/variable_types.py +++ b/src/ytdl_sub/entries/script/variable_types.py @@ -1,17 +1,10 @@ -from abc import ABC -from abc import abstractmethod +from abc import ABC, abstractmethod from dataclasses import dataclass -from typing import Dict -from typing import List -from typing import Optional -from typing import Type -from typing import TypeVar +from typing import Dict, List, Optional, Type, TypeVar from ytdl_sub.script.types.array import Array from ytdl_sub.script.types.map import Map -from ytdl_sub.script.types.resolvable import Boolean -from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.types.resolvable import String +from ytdl_sub.script.types.resolvable import Boolean, Integer, String ENTRY_METADATA_VARIABLE_NAME = "entry_metadata" PLAYLIST_METADATA_VARIABLE_NAME = "playlist_metadata" diff --git a/src/ytdl_sub/entries/variables/override_variables.py b/src/ytdl_sub/entries/variables/override_variables.py index 8dd2081c..c33068e7 100644 --- a/src/ytdl_sub/entries/variables/override_variables.py +++ b/src/ytdl_sub/entries/variables/override_variables.py @@ -1,13 +1,14 @@ -from typing import Dict -from typing import Set +from typing import Dict, Set from ytdl_sub.entries.script.function_scripts import CUSTOM_FUNCTION_SCRIPTS from ytdl_sub.entries.script.variable_definitions import VARIABLE_SCRIPTS -from ytdl_sub.entries.script.variable_types import ArrayVariable -from ytdl_sub.entries.script.variable_types import BooleanVariable -from ytdl_sub.entries.script.variable_types import MapVariable -from ytdl_sub.entries.script.variable_types import StringVariable -from ytdl_sub.entries.script.variable_types import Variable +from ytdl_sub.entries.script.variable_types import ( + ArrayVariable, + BooleanVariable, + MapVariable, + StringVariable, + Variable, +) from ytdl_sub.script.functions import Functions from ytdl_sub.script.utils.name_validation import is_valid_name diff --git a/src/ytdl_sub/plugins/audio_extract.py b/src/ytdl_sub/plugins/audio_extract.py index 2fbd1d6b..ee7c39e4 100644 --- a/src/ytdl_sub/plugins/audio_extract.py +++ b/src/ytdl_sub/plugins/audio_extract.py @@ -1,21 +1,19 @@ import os.path -from typing import Any -from typing import Dict -from typing import Optional -from typing import Set +from typing import Any, Dict, Optional, Set from ytdl_sub.config.plugin.plugin import Plugin from ytdl_sub.config.plugin.plugin_operation import PluginOperation from ytdl_sub.config.validators.options import ToggleableOptionsDictValidator from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder from ytdl_sub.entries.entry import Entry -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions +from ytdl_sub.entries.script.variable_definitions import VARIABLES, VariableDefinitions from ytdl_sub.utils.exceptions import FileNotDownloadedException from ytdl_sub.utils.file_handler import FileMetadata -from ytdl_sub.validators.audo_codec_validator import AUDIO_CODEC_EXTS -from ytdl_sub.validators.audo_codec_validator import AUDIO_CODEC_TYPES_EXTENSION_MAPPING -from ytdl_sub.validators.audo_codec_validator import AudioTypeValidator +from ytdl_sub.validators.audo_codec_validator import ( + AUDIO_CODEC_EXTS, + AUDIO_CODEC_TYPES_EXTENSION_MAPPING, + AudioTypeValidator, +) from ytdl_sub.validators.validators import FloatValidator v: VariableDefinitions = VARIABLES diff --git a/src/ytdl_sub/plugins/chapters.py b/src/ytdl_sub/plugins/chapters.py index 0394a0fd..b75fe733 100644 --- a/src/ytdl_sub/plugins/chapters.py +++ b/src/ytdl_sub/plugins/chapters.py @@ -1,26 +1,23 @@ import collections import re -from typing import Dict -from typing import List -from typing import Optional -from typing import Set +from typing import Dict, List, Optional, Set from ytdl_sub.config.plugin.plugin import Plugin from ytdl_sub.config.plugin.plugin_operation import PluginOperation from ytdl_sub.config.validators.options import ToggleableOptionsDictValidator from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder -from ytdl_sub.entries.entry import Entry -from ytdl_sub.entries.entry import ytdl_sub_chapters_from_comments -from ytdl_sub.entries.entry import ytdl_sub_split_by_chapters_parent_uid -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions +from ytdl_sub.entries.entry import ( + Entry, + ytdl_sub_chapters_from_comments, + ytdl_sub_split_by_chapters_parent_uid, +) +from ytdl_sub.entries.script.variable_definitions import VARIABLES, VariableDefinitions from ytdl_sub.utils.chapters import Chapters from ytdl_sub.utils.ffmpeg import set_ffmpeg_metadata_chapters from ytdl_sub.utils.file_handler import FileMetadata from ytdl_sub.validators.regex_validator import RegexListValidator from ytdl_sub.validators.string_select_validator import StringSelectValidator -from ytdl_sub.validators.validators import BoolValidator -from ytdl_sub.validators.validators import ListValidator +from ytdl_sub.validators.validators import BoolValidator, ListValidator v: VariableDefinitions = VARIABLES diff --git a/src/ytdl_sub/plugins/date_range.py b/src/ytdl_sub/plugins/date_range.py index 0cba6f89..8bd6be26 100644 --- a/src/ytdl_sub/plugins/date_range.py +++ b/src/ytdl_sub/plugins/date_range.py @@ -1,7 +1,4 @@ -from typing import List -from typing import Optional -from typing import Set -from typing import Tuple +from typing import List, Optional, Set, Tuple from ytdl_sub.config.plugin.plugin import Plugin from ytdl_sub.config.validators.options import ToggleableOptionsDictValidator diff --git a/src/ytdl_sub/plugins/embed_thumbnail.py b/src/ytdl_sub/plugins/embed_thumbnail.py index 4ce2b144..3984c7e7 100644 --- a/src/ytdl_sub/plugins/embed_thumbnail.py +++ b/src/ytdl_sub/plugins/embed_thumbnail.py @@ -1,5 +1,4 @@ -from typing import List -from typing import Optional +from typing import List, Optional import mediafile @@ -7,8 +6,7 @@ from ytdl_sub.config.plugin.plugin import Plugin from ytdl_sub.config.validators.options import OptionsValidator from ytdl_sub.entries.entry import Entry from ytdl_sub.utils.ffmpeg import FFMPEG -from ytdl_sub.utils.file_handler import FileHandler -from ytdl_sub.utils.file_handler import FileMetadata +from ytdl_sub.utils.file_handler import FileHandler, FileMetadata from ytdl_sub.utils.logger import Logger from ytdl_sub.validators.audo_codec_validator import AUDIO_CODEC_EXTS from ytdl_sub.validators.string_formatter_validators import OverridesBooleanFormatterValidator diff --git a/src/ytdl_sub/plugins/file_convert.py b/src/ytdl_sub/plugins/file_convert.py index 1b9ecf1e..2e3ad8bc 100644 --- a/src/ytdl_sub/plugins/file_convert.py +++ b/src/ytdl_sub/plugins/file_convert.py @@ -1,22 +1,16 @@ import os from subprocess import CalledProcessError -from typing import Any -from typing import Dict -from typing import Optional -from typing import Set +from typing import Any, Dict, Optional, Set from ytdl_sub.config.overrides import Overrides from ytdl_sub.config.plugin.plugin import Plugin from ytdl_sub.config.plugin.plugin_operation import PluginOperation from ytdl_sub.config.validators.options import ToggleableOptionsDictValidator from ytdl_sub.entries.entry import Entry -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions -from ytdl_sub.utils.exceptions import FileNotDownloadedException -from ytdl_sub.utils.exceptions import ValidationException +from ytdl_sub.entries.script.variable_definitions import VARIABLES, VariableDefinitions +from ytdl_sub.utils.exceptions import FileNotDownloadedException, ValidationException from ytdl_sub.utils.ffmpeg import FFMPEG -from ytdl_sub.utils.file_handler import FileHandler -from ytdl_sub.utils.file_handler import FileMetadata +from ytdl_sub.utils.file_handler import FileHandler, FileMetadata from ytdl_sub.validators.audo_codec_validator import FileTypeValidator from ytdl_sub.validators.string_formatter_validators import OverridesStringFormatterValidator from ytdl_sub.validators.string_select_validator import StringSelectValidator diff --git a/src/ytdl_sub/plugins/filter_exclude.py b/src/ytdl_sub/plugins/filter_exclude.py index d4adcc86..b5b4db7d 100644 --- a/src/ytdl_sub/plugins/filter_exclude.py +++ b/src/ytdl_sub/plugins/filter_exclude.py @@ -1,5 +1,4 @@ -from typing import Dict -from typing import Optional +from typing import Dict, Optional from ytdl_sub.config.overrides import Overrides from ytdl_sub.config.plugin.plugin import Plugin diff --git a/src/ytdl_sub/plugins/filter_include.py b/src/ytdl_sub/plugins/filter_include.py index 5002dfdb..bd872300 100644 --- a/src/ytdl_sub/plugins/filter_include.py +++ b/src/ytdl_sub/plugins/filter_include.py @@ -1,5 +1,4 @@ -from typing import Dict -from typing import Optional +from typing import Dict, Optional from ytdl_sub.config.overrides import Overrides from ytdl_sub.config.plugin.plugin import Plugin diff --git a/src/ytdl_sub/plugins/format.py b/src/ytdl_sub/plugins/format.py index 6e2d545d..a4e92065 100644 --- a/src/ytdl_sub/plugins/format.py +++ b/src/ytdl_sub/plugins/format.py @@ -1,5 +1,4 @@ -from typing import Dict -from typing import Optional +from typing import Dict, Optional from ytdl_sub.config.plugin.plugin import Plugin from ytdl_sub.config.validators.options import OptionsValidator diff --git a/src/ytdl_sub/plugins/match_filters.py b/src/ytdl_sub/plugins/match_filters.py index 6a777054..b7483b6a 100644 --- a/src/ytdl_sub/plugins/match_filters.py +++ b/src/ytdl_sub/plugins/match_filters.py @@ -1,7 +1,5 @@ import copy -from typing import Any -from typing import List -from typing import Tuple +from typing import Any, List, Tuple from ytdl_sub.config.plugin.plugin import Plugin from ytdl_sub.config.validators.options import ToggleableOptionsDictValidator diff --git a/src/ytdl_sub/plugins/music_tags.py b/src/ytdl_sub/plugins/music_tags.py index d7804b67..7f050dd6 100644 --- a/src/ytdl_sub/plugins/music_tags.py +++ b/src/ytdl_sub/plugins/music_tags.py @@ -1,22 +1,21 @@ from collections import defaultdict from datetime import datetime -from typing import Any -from typing import Dict -from typing import List +from typing import Any, Dict, List import mediafile from ytdl_sub.config.plugin.plugin import Plugin from ytdl_sub.config.validators.options import OptionsDictValidator from ytdl_sub.entries.entry import Entry -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions +from ytdl_sub.entries.script.variable_definitions import VARIABLES, VariableDefinitions from ytdl_sub.utils.exceptions import ValidationException from ytdl_sub.utils.file_handler import FileMetadata from ytdl_sub.utils.logger import Logger from ytdl_sub.validators.audo_codec_validator import AUDIO_CODEC_EXTS -from ytdl_sub.validators.string_formatter_validators import ListFormatterValidator -from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator +from ytdl_sub.validators.string_formatter_validators import ( + ListFormatterValidator, + StringFormatterValidator, +) v: VariableDefinitions = VARIABLES @@ -147,8 +146,7 @@ class MusicTagsPlugin(Plugin[MusicTagsOptions]): else: if len(tag_value) > 1: logger.warning( - "Music tag '%s' does not support lists. " - "Only setting the first element", + "Music tag '%s' does not support lists. Only setting the first element", tag_name, ) setattr(audio_file, tag_name, tag_value[0]) diff --git a/src/ytdl_sub/plugins/nfo_tags.py b/src/ytdl_sub/plugins/nfo_tags.py index 802dab63..ff698ed7 100644 --- a/src/ytdl_sub/plugins/nfo_tags.py +++ b/src/ytdl_sub/plugins/nfo_tags.py @@ -2,24 +2,25 @@ import os from abc import ABC from collections import defaultdict from pathlib import Path -from typing import Any -from typing import Dict -from typing import List +from typing import Any, Dict, List from ytdl_sub.config.plugin.plugin import Plugin from ytdl_sub.config.validators.options import ToggleableOptionsDictValidator from ytdl_sub.entries.entry import Entry -from ytdl_sub.utils.file_handler import FileHandler -from ytdl_sub.utils.file_handler import FileMetadata -from ytdl_sub.utils.xml import XmlElement -from ytdl_sub.utils.xml import to_max_3_byte_utf8_dict -from ytdl_sub.utils.xml import to_max_3_byte_utf8_string -from ytdl_sub.utils.xml import to_xml +from ytdl_sub.utils.file_handler import FileHandler, FileMetadata +from ytdl_sub.utils.xml import ( + XmlElement, + to_max_3_byte_utf8_dict, + to_max_3_byte_utf8_string, + to_xml, +) from ytdl_sub.validators.file_path_validators import StringFormatterFileNameValidator from ytdl_sub.validators.nfo_validators import NfoTagsValidator -from ytdl_sub.validators.string_formatter_validators import DictFormatterValidator -from ytdl_sub.validators.string_formatter_validators import OverridesBooleanFormatterValidator -from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator +from ytdl_sub.validators.string_formatter_validators import ( + DictFormatterValidator, + OverridesBooleanFormatterValidator, + StringFormatterValidator, +) class SharedNfoTagsOptions(ToggleableOptionsDictValidator): diff --git a/src/ytdl_sub/plugins/output_directory_nfo_tags.py b/src/ytdl_sub/plugins/output_directory_nfo_tags.py index aae44103..40c14322 100644 --- a/src/ytdl_sub/plugins/output_directory_nfo_tags.py +++ b/src/ytdl_sub/plugins/output_directory_nfo_tags.py @@ -1,8 +1,6 @@ from ytdl_sub.config.overrides import Overrides from ytdl_sub.entries.entry import Entry -from ytdl_sub.plugins.nfo_tags import NfoTagsValidator -from ytdl_sub.plugins.nfo_tags import SharedNfoTagsOptions -from ytdl_sub.plugins.nfo_tags import SharedNfoTagsPlugin +from ytdl_sub.plugins.nfo_tags import NfoTagsValidator, SharedNfoTagsOptions, SharedNfoTagsPlugin from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator from ytdl_sub.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive diff --git a/src/ytdl_sub/plugins/split_by_chapters.py b/src/ytdl_sub/plugins/split_by_chapters.py index 20722672..caff76b6 100644 --- a/src/ytdl_sub/plugins/split_by_chapters.py +++ b/src/ytdl_sub/plugins/split_by_chapters.py @@ -1,23 +1,14 @@ -from typing import Any -from typing import Dict -from typing import List -from typing import Optional -from typing import Set -from typing import Tuple +from typing import Any, Dict, List, Optional, Set, Tuple from ytdl_sub.config.plugin.plugin import SplitPlugin from ytdl_sub.config.plugin.plugin_operation import PluginOperation from ytdl_sub.config.validators.options import OptionsDictValidator -from ytdl_sub.entries.entry import Entry -from ytdl_sub.entries.entry import ytdl_sub_split_by_chapters_parent_uid -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions -from ytdl_sub.utils.chapters import Chapters -from ytdl_sub.utils.chapters import Timestamp +from ytdl_sub.entries.entry import Entry, ytdl_sub_split_by_chapters_parent_uid +from ytdl_sub.entries.script.variable_definitions import VARIABLES, VariableDefinitions +from ytdl_sub.utils.chapters import Chapters, Timestamp from ytdl_sub.utils.exceptions import ValidationException from ytdl_sub.utils.ffmpeg import FFMPEG -from ytdl_sub.utils.file_handler import FileHandler -from ytdl_sub.utils.file_handler import FileMetadata +from ytdl_sub.utils.file_handler import FileHandler, FileMetadata from ytdl_sub.validators.string_select_validator import StringSelectValidator v: VariableDefinitions = VARIABLES diff --git a/src/ytdl_sub/plugins/square_thumbnail.py b/src/ytdl_sub/plugins/square_thumbnail.py index dc5db0b7..451d3102 100644 --- a/src/ytdl_sub/plugins/square_thumbnail.py +++ b/src/ytdl_sub/plugins/square_thumbnail.py @@ -1,12 +1,10 @@ -from typing import List -from typing import Optional +from typing import List, Optional from ytdl_sub.config.plugin.plugin import Plugin from ytdl_sub.config.validators.options import OptionsValidator from ytdl_sub.entries.entry import Entry from ytdl_sub.utils.ffmpeg import FFMPEG -from ytdl_sub.utils.file_handler import FileHandler -from ytdl_sub.utils.file_handler import FileMetadata +from ytdl_sub.utils.file_handler import FileHandler, FileMetadata from ytdl_sub.utils.logger import Logger from ytdl_sub.validators.string_formatter_validators import OverridesBooleanFormatterValidator diff --git a/src/ytdl_sub/plugins/static_nfo_tags.py b/src/ytdl_sub/plugins/static_nfo_tags.py index 3476bda5..6dd233df 100644 --- a/src/ytdl_sub/plugins/static_nfo_tags.py +++ b/src/ytdl_sub/plugins/static_nfo_tags.py @@ -1,7 +1,5 @@ from ytdl_sub.entries.entry import Entry -from ytdl_sub.plugins.nfo_tags import NfoTagsValidator -from ytdl_sub.plugins.nfo_tags import SharedNfoTagsOptions -from ytdl_sub.plugins.nfo_tags import SharedNfoTagsPlugin +from ytdl_sub.plugins.nfo_tags import NfoTagsValidator, SharedNfoTagsOptions, SharedNfoTagsPlugin from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator diff --git a/src/ytdl_sub/plugins/subtitles.py b/src/ytdl_sub/plugins/subtitles.py index 54318512..ae7e1014 100644 --- a/src/ytdl_sub/plugins/subtitles.py +++ b/src/ytdl_sub/plugins/subtitles.py @@ -1,28 +1,21 @@ import os from pathlib import Path -from typing import Dict -from typing import List -from typing import Optional -from typing import Set -from typing import Tuple +from typing import Dict, List, Optional, Set, Tuple from ytdl_sub.config.plugin.plugin import Plugin from ytdl_sub.config.plugin.plugin_operation import PluginOperation from ytdl_sub.config.validators.options import ToggleableOptionsDictValidator from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder from ytdl_sub.entries.entry import Entry -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions +from ytdl_sub.entries.script.variable_definitions import VARIABLES, VariableDefinitions from ytdl_sub.script.utils.exceptions import UserThrownRuntimeError -from ytdl_sub.utils.file_handler import FileHandler -from ytdl_sub.utils.file_handler import FileMetadata +from ytdl_sub.utils.file_handler import FileHandler, FileMetadata from ytdl_sub.utils.logger import Logger from ytdl_sub.utils.subtitles import SUBTITLE_EXTENSIONS from ytdl_sub.validators.file_path_validators import StringFormatterFileNameValidator from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator from ytdl_sub.validators.string_select_validator import StringSelectValidator -from ytdl_sub.validators.validators import BoolValidator -from ytdl_sub.validators.validators import StringListValidator +from ytdl_sub.validators.validators import BoolValidator, StringListValidator v: VariableDefinitions = VARIABLES diff --git a/src/ytdl_sub/plugins/throttle_protection.py b/src/ytdl_sub/plugins/throttle_protection.py index 463d1ace..0b5b99c2 100644 --- a/src/ytdl_sub/plugins/throttle_protection.py +++ b/src/ytdl_sub/plugins/throttle_protection.py @@ -1,10 +1,7 @@ import random import time from abc import ABC -from typing import Dict -from typing import Optional -from typing import Type -from typing import TypeVar +from typing import Dict, Optional, Type, TypeVar from ytdl_sub.config.overrides import Overrides from ytdl_sub.config.plugin.plugin import Plugin @@ -13,8 +10,10 @@ from ytdl_sub.entries.entry import Entry from ytdl_sub.utils.file_handler import FileMetadata from ytdl_sub.utils.logger import Logger from ytdl_sub.validators.strict_dict_validator import StrictDictValidator -from ytdl_sub.validators.string_formatter_validators import FloatFormatterValidator -from ytdl_sub.validators.string_formatter_validators import OverridesFloatFormatterValidator +from ytdl_sub.validators.string_formatter_validators import ( + FloatFormatterValidator, + OverridesFloatFormatterValidator, +) from ytdl_sub.validators.validators import ProbabilityValidator from ytdl_sub.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive diff --git a/src/ytdl_sub/prebuilt_presets/__init__.py b/src/ytdl_sub/prebuilt_presets/__init__.py index d1ed554b..bc3701c3 100644 --- a/src/ytdl_sub/prebuilt_presets/__init__.py +++ b/src/ytdl_sub/prebuilt_presets/__init__.py @@ -1,8 +1,6 @@ import os import pathlib -from typing import Any -from typing import Dict -from typing import Set +from typing import Any, Dict, Set import mergedeep diff --git a/src/ytdl_sub/prebuilt_presets/music/__init__.py b/src/ytdl_sub/prebuilt_presets/music/__init__.py index e8c8cb23..c490fdd4 100644 --- a/src/ytdl_sub/prebuilt_presets/music/__init__.py +++ b/src/ytdl_sub/prebuilt_presets/music/__init__.py @@ -1,5 +1,4 @@ -from ytdl_sub.prebuilt_presets import PrebuiltPresets -from ytdl_sub.prebuilt_presets import get_prebuilt_preset_package_name +from ytdl_sub.prebuilt_presets import PrebuiltPresets, get_prebuilt_preset_package_name PREBUILT_PRESET_PACKAGE_NAME = get_prebuilt_preset_package_name(__file__) diff --git a/src/ytdl_sub/prebuilt_presets/music_videos/__init__.py b/src/ytdl_sub/prebuilt_presets/music_videos/__init__.py index 76b18443..79eb90d0 100644 --- a/src/ytdl_sub/prebuilt_presets/music_videos/__init__.py +++ b/src/ytdl_sub/prebuilt_presets/music_videos/__init__.py @@ -1,5 +1,4 @@ -from ytdl_sub.prebuilt_presets import PrebuiltPresets -from ytdl_sub.prebuilt_presets import get_prebuilt_preset_package_name +from ytdl_sub.prebuilt_presets import PrebuiltPresets, get_prebuilt_preset_package_name PREBUILT_PRESET_PACKAGE_NAME = get_prebuilt_preset_package_name(__file__) diff --git a/src/ytdl_sub/prebuilt_presets/tv_show/__init__.py b/src/ytdl_sub/prebuilt_presets/tv_show/__init__.py index 0e10c448..bc05a466 100644 --- a/src/ytdl_sub/prebuilt_presets/tv_show/__init__.py +++ b/src/ytdl_sub/prebuilt_presets/tv_show/__init__.py @@ -1,5 +1,4 @@ -from ytdl_sub.prebuilt_presets import PrebuiltPresets -from ytdl_sub.prebuilt_presets import get_prebuilt_preset_package_name +from ytdl_sub.prebuilt_presets import PrebuiltPresets, get_prebuilt_preset_package_name PREBUILT_PRESET_PACKAGE_NAME = get_prebuilt_preset_package_name(__file__) diff --git a/src/ytdl_sub/script/functions/__init__.py b/src/ytdl_sub/script/functions/__init__.py index e43f7e28..0153e992 100644 --- a/src/ytdl_sub/script/functions/__init__.py +++ b/src/ytdl_sub/script/functions/__init__.py @@ -1,5 +1,4 @@ -from typing import Callable -from typing import Dict +from typing import Callable, Dict from ytdl_sub.script.functions.array_functions import ArrayFunctions from ytdl_sub.script.functions.boolean_functions import BooleanFunctions diff --git a/src/ytdl_sub/script/functions/array_functions.py b/src/ytdl_sub/script/functions/array_functions.py index a07585e7..b2c200f8 100644 --- a/src/ytdl_sub/script/functions/array_functions.py +++ b/src/ytdl_sub/script/functions/array_functions.py @@ -1,18 +1,21 @@ import itertools -from typing import List -from typing import Optional +from typing import List, Optional from ytdl_sub.script.types.array import Array -from ytdl_sub.script.types.resolvable import AnyArgument -from ytdl_sub.script.types.resolvable import Boolean -from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.types.resolvable import Lambda -from ytdl_sub.script.types.resolvable import LambdaReduce -from ytdl_sub.script.types.resolvable import LambdaTwo -from ytdl_sub.script.types.resolvable import Resolvable -from ytdl_sub.script.utils.exceptions import UNREACHABLE -from ytdl_sub.script.utils.exceptions import ArrayValueDoesNotExist -from ytdl_sub.script.utils.exceptions import FunctionRuntimeException +from ytdl_sub.script.types.resolvable import ( + AnyArgument, + Boolean, + Integer, + Lambda, + LambdaReduce, + LambdaTwo, + Resolvable, +) +from ytdl_sub.script.utils.exceptions import ( + UNREACHABLE, + ArrayValueDoesNotExist, + FunctionRuntimeException, +) class ArrayFunctions: diff --git a/src/ytdl_sub/script/functions/boolean_functions.py b/src/ytdl_sub/script/functions/boolean_functions.py index f2c89e28..3a407deb 100644 --- a/src/ytdl_sub/script/functions/boolean_functions.py +++ b/src/ytdl_sub/script/functions/boolean_functions.py @@ -1,10 +1,6 @@ from ytdl_sub.script.types.array import Array from ytdl_sub.script.types.map import Map -from ytdl_sub.script.types.resolvable import AnyArgument -from ytdl_sub.script.types.resolvable import Boolean -from ytdl_sub.script.types.resolvable import Float -from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.types.resolvable import String +from ytdl_sub.script.types.resolvable import AnyArgument, Boolean, Float, Integer, String # pylint: disable=invalid-name diff --git a/src/ytdl_sub/script/functions/conditional_functions.py b/src/ytdl_sub/script/functions/conditional_functions.py index 896ddd59..f04df860 100644 --- a/src/ytdl_sub/script/functions/conditional_functions.py +++ b/src/ytdl_sub/script/functions/conditional_functions.py @@ -1,9 +1,11 @@ from typing import Union -from ytdl_sub.script.types.resolvable import AnyArgument -from ytdl_sub.script.types.resolvable import Boolean -from ytdl_sub.script.types.resolvable import ReturnableArgumentA -from ytdl_sub.script.types.resolvable import ReturnableArgumentB +from ytdl_sub.script.types.resolvable import ( + AnyArgument, + Boolean, + ReturnableArgumentA, + ReturnableArgumentB, +) from ytdl_sub.script.utils.exceptions import FunctionRuntimeException diff --git a/src/ytdl_sub/script/functions/date_functions.py b/src/ytdl_sub/script/functions/date_functions.py index fea1095c..65b8b20b 100644 --- a/src/ytdl_sub/script/functions/date_functions.py +++ b/src/ytdl_sub/script/functions/date_functions.py @@ -1,7 +1,6 @@ from datetime import datetime -from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.types.resolvable import String +from ytdl_sub.script.types.resolvable import Integer, String class DateFunctions: diff --git a/src/ytdl_sub/script/functions/error_functions.py b/src/ytdl_sub/script/functions/error_functions.py index 34b92a74..a5181b82 100644 --- a/src/ytdl_sub/script/functions/error_functions.py +++ b/src/ytdl_sub/script/functions/error_functions.py @@ -1,6 +1,4 @@ -from ytdl_sub.script.types.resolvable import AnyArgument -from ytdl_sub.script.types.resolvable import ReturnableArgument -from ytdl_sub.script.types.resolvable import String +from ytdl_sub.script.types.resolvable import AnyArgument, ReturnableArgument, String from ytdl_sub.script.utils.exceptions import UserThrownRuntimeError diff --git a/src/ytdl_sub/script/functions/json_functions.py b/src/ytdl_sub/script/functions/json_functions.py index c706a86f..b29d9218 100644 --- a/src/ytdl_sub/script/functions/json_functions.py +++ b/src/ytdl_sub/script/functions/json_functions.py @@ -3,12 +3,14 @@ from typing import Any from ytdl_sub.script.types.array import Array from ytdl_sub.script.types.map import Map -from ytdl_sub.script.types.resolvable import AnyArgument -from ytdl_sub.script.types.resolvable import Boolean -from ytdl_sub.script.types.resolvable import Float -from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.types.resolvable import Resolvable -from ytdl_sub.script.types.resolvable import String +from ytdl_sub.script.types.resolvable import ( + AnyArgument, + Boolean, + Float, + Integer, + Resolvable, + String, +) from ytdl_sub.script.utils.exceptions import UNREACHABLE diff --git a/src/ytdl_sub/script/functions/map_functions.py b/src/ytdl_sub/script/functions/map_functions.py index 6d93d31b..7bda27e6 100644 --- a/src/ytdl_sub/script/functions/map_functions.py +++ b/src/ytdl_sub/script/functions/map_functions.py @@ -1,18 +1,21 @@ -from typing import Dict -from typing import Optional +from typing import Dict, Optional from ytdl_sub.script.types.array import Array from ytdl_sub.script.types.map import Map -from ytdl_sub.script.types.resolvable import AnyArgument -from ytdl_sub.script.types.resolvable import Boolean -from ytdl_sub.script.types.resolvable import Hashable -from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.types.resolvable import LambdaThree -from ytdl_sub.script.types.resolvable import LambdaTwo -from ytdl_sub.script.types.resolvable import String -from ytdl_sub.script.utils.exceptions import FunctionRuntimeException -from ytdl_sub.script.utils.exceptions import KeyDoesNotExistRuntimeException -from ytdl_sub.script.utils.exceptions import KeyNotHashableRuntimeException +from ytdl_sub.script.types.resolvable import ( + AnyArgument, + Boolean, + Hashable, + Integer, + LambdaThree, + LambdaTwo, + String, +) +from ytdl_sub.script.utils.exceptions import ( + FunctionRuntimeException, + KeyDoesNotExistRuntimeException, + KeyNotHashableRuntimeException, +) class MapFunctions: diff --git a/src/ytdl_sub/script/functions/numeric_functions.py b/src/ytdl_sub/script/functions/numeric_functions.py index 003c8837..d11728f2 100644 --- a/src/ytdl_sub/script/functions/numeric_functions.py +++ b/src/ytdl_sub/script/functions/numeric_functions.py @@ -2,10 +2,7 @@ import math from typing import Optional from ytdl_sub.script.types.array import Array -from ytdl_sub.script.types.resolvable import AnyArgument -from ytdl_sub.script.types.resolvable import Float -from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.types.resolvable import Numeric +from ytdl_sub.script.types.resolvable import AnyArgument, Float, Integer, Numeric def _to_numeric(value: int | float) -> Numeric: diff --git a/src/ytdl_sub/script/functions/print_functions.py b/src/ytdl_sub/script/functions/print_functions.py index 47084085..9ef6573d 100644 --- a/src/ytdl_sub/script/functions/print_functions.py +++ b/src/ytdl_sub/script/functions/print_functions.py @@ -1,8 +1,6 @@ from typing import Optional -from ytdl_sub.script.types.resolvable import AnyArgument -from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.types.resolvable import ReturnableArgument +from ytdl_sub.script.types.resolvable import AnyArgument, Integer, ReturnableArgument from ytdl_sub.utils.logger import Logger logger = Logger.get(name="preset") diff --git a/src/ytdl_sub/script/functions/regex_functions.py b/src/ytdl_sub/script/functions/regex_functions.py index b41ead02..bf38a061 100644 --- a/src/ytdl_sub/script/functions/regex_functions.py +++ b/src/ytdl_sub/script/functions/regex_functions.py @@ -1,15 +1,9 @@ import re -from typing import AnyStr -from typing import List -from typing import Match -from typing import Optional +from typing import AnyStr, List, Match, Optional from ytdl_sub.script.functions.array_functions import ArrayFunctions from ytdl_sub.script.types.array import Array -from ytdl_sub.script.types.resolvable import Boolean -from ytdl_sub.script.types.resolvable import Float -from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.types.resolvable import String +from ytdl_sub.script.types.resolvable import Boolean, Float, Integer, String from ytdl_sub.script.utils.exceptions import FunctionRuntimeException diff --git a/src/ytdl_sub/script/functions/string_functions.py b/src/ytdl_sub/script/functions/string_functions.py index a1f4567e..7f3be4f6 100644 --- a/src/ytdl_sub/script/functions/string_functions.py +++ b/src/ytdl_sub/script/functions/string_functions.py @@ -1,12 +1,7 @@ from typing import Optional from ytdl_sub.script.types.array import Array -from ytdl_sub.script.types.resolvable import AnyArgument -from ytdl_sub.script.types.resolvable import Boolean -from ytdl_sub.script.types.resolvable import Float -from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.types.resolvable import Numeric -from ytdl_sub.script.types.resolvable import String +from ytdl_sub.script.types.resolvable import AnyArgument, Boolean, Float, Integer, Numeric, String class StringFunctions: diff --git a/src/ytdl_sub/script/parser.py b/src/ytdl_sub/script/parser.py index 73dbb3f4..b87f79b2 100644 --- a/src/ytdl_sub/script/parser.py +++ b/src/ytdl_sub/script/parser.py @@ -1,39 +1,31 @@ import json from enum import Enum -from typing import Dict -from typing import List -from typing import Optional -from typing import Set +from typing import Dict, List, Optional, Set from ytdl_sub.script.functions import Functions from ytdl_sub.script.types.array import UnresolvedArray -from ytdl_sub.script.types.function import Argument -from ytdl_sub.script.types.function import BuiltInFunction -from ytdl_sub.script.types.function import CustomFunction -from ytdl_sub.script.types.function import Function +from ytdl_sub.script.types.function import Argument, BuiltInFunction, CustomFunction, Function from ytdl_sub.script.types.map import UnresolvedMap -from ytdl_sub.script.types.resolvable import Boolean -from ytdl_sub.script.types.resolvable import Float -from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.types.resolvable import Lambda -from ytdl_sub.script.types.resolvable import NonHashable -from ytdl_sub.script.types.resolvable import String +from ytdl_sub.script.types.resolvable import Boolean, Float, Integer, Lambda, NonHashable, String from ytdl_sub.script.types.syntax_tree import SyntaxTree -from ytdl_sub.script.types.variable import FunctionArgument -from ytdl_sub.script.types.variable import Variable +from ytdl_sub.script.types.variable import FunctionArgument, Variable from ytdl_sub.script.utils.exception_formatters import ParserExceptionFormatter -from ytdl_sub.script.utils.exceptions import UNREACHABLE -from ytdl_sub.script.utils.exceptions import CycleDetected -from ytdl_sub.script.utils.exceptions import FunctionDoesNotExist -from ytdl_sub.script.utils.exceptions import IncompatibleFunctionArguments -from ytdl_sub.script.utils.exceptions import InvalidCustomFunctionArgumentName -from ytdl_sub.script.utils.exceptions import InvalidSyntaxException -from ytdl_sub.script.utils.exceptions import InvalidVariableName -from ytdl_sub.script.utils.exceptions import UserException -from ytdl_sub.script.utils.exceptions import VariableDoesNotExist -from ytdl_sub.script.utils.name_validation import is_function -from ytdl_sub.script.utils.name_validation import to_function_name -from ytdl_sub.script.utils.name_validation import validate_variable_name +from ytdl_sub.script.utils.exceptions import ( + UNREACHABLE, + CycleDetected, + FunctionDoesNotExist, + IncompatibleFunctionArguments, + InvalidCustomFunctionArgumentName, + InvalidSyntaxException, + InvalidVariableName, + UserException, + VariableDoesNotExist, +) +from ytdl_sub.script.utils.name_validation import ( + is_function, + to_function_name, + validate_variable_name, +) # pylint: disable=invalid-name # pylint: disable=too-many-branches @@ -580,7 +572,6 @@ class _Parser: return True def _parse(self) -> SyntaxTree: - while ch := self._read(): continue_parse = self._parse_main_loop(ch) if not continue_parse: diff --git a/src/ytdl_sub/script/script.py b/src/ytdl_sub/script/script.py index 41c3f1be..5652a0c6 100644 --- a/src/ytdl_sub/script/script.py +++ b/src/ytdl_sub/script/script.py @@ -1,32 +1,28 @@ # pylint: disable=missing-raises-doc from collections import defaultdict -from typing import Dict -from typing import List -from typing import Optional -from typing import Set +from typing import Dict, List, Optional, Set from ytdl_sub.script.functions import Functions from ytdl_sub.script.parser import parse from ytdl_sub.script.script_output import ScriptOutput -from ytdl_sub.script.types.resolvable import Argument -from ytdl_sub.script.types.resolvable import BuiltInFunctionType -from ytdl_sub.script.types.resolvable import Lambda -from ytdl_sub.script.types.resolvable import Resolvable -from ytdl_sub.script.types.syntax_tree import ResolvedSyntaxTree -from ytdl_sub.script.types.syntax_tree import SyntaxTree -from ytdl_sub.script.types.variable import FunctionArgument -from ytdl_sub.script.types.variable import Variable +from ytdl_sub.script.types.resolvable import Argument, BuiltInFunctionType, Lambda, Resolvable +from ytdl_sub.script.types.syntax_tree import ResolvedSyntaxTree, SyntaxTree +from ytdl_sub.script.types.variable import FunctionArgument, Variable from ytdl_sub.script.types.variable_dependency import VariableDependency -from ytdl_sub.script.utils.exceptions import UNREACHABLE -from ytdl_sub.script.utils.exceptions import CycleDetected -from ytdl_sub.script.utils.exceptions import IncompatibleFunctionArguments -from ytdl_sub.script.utils.exceptions import InvalidCustomFunctionArguments -from ytdl_sub.script.utils.exceptions import RuntimeException -from ytdl_sub.script.utils.exceptions import ScriptVariableNotResolved -from ytdl_sub.script.utils.name_validation import is_function -from ytdl_sub.script.utils.name_validation import to_function_definition_name -from ytdl_sub.script.utils.name_validation import to_function_name -from ytdl_sub.script.utils.name_validation import validate_variable_name +from ytdl_sub.script.utils.exceptions import ( + UNREACHABLE, + CycleDetected, + IncompatibleFunctionArguments, + InvalidCustomFunctionArguments, + RuntimeException, + ScriptVariableNotResolved, +) +from ytdl_sub.script.utils.name_validation import ( + is_function, + to_function_definition_name, + to_function_name, + validate_variable_name, +) from ytdl_sub.script.utils.type_checking import FunctionSpec @@ -737,7 +733,6 @@ class Script: partially_resolved = True while partially_resolved: - partially_resolved = False for variable in list(to_partially_resolve): diff --git a/src/ytdl_sub/script/script_output.py b/src/ytdl_sub/script/script_output.py index d8275e6e..7e3cc782 100644 --- a/src/ytdl_sub/script/script_output.py +++ b/src/ytdl_sub/script/script_output.py @@ -1,6 +1,5 @@ from dataclasses import dataclass -from typing import Any -from typing import Dict +from typing import Any, Dict from ytdl_sub.script.types.resolvable import Resolvable from ytdl_sub.script.utils.exceptions import ScriptVariableNotResolved diff --git a/src/ytdl_sub/script/types/array.py b/src/ytdl_sub/script/types/array.py index 204697fb..4ec3a444 100644 --- a/src/ytdl_sub/script/types/array.py +++ b/src/ytdl_sub/script/types/array.py @@ -1,15 +1,14 @@ from abc import ABC from dataclasses import dataclass -from typing import Any -from typing import Dict -from typing import List -from typing import Type +from typing import Any, Dict, List, Type -from ytdl_sub.script.types.resolvable import Argument -from ytdl_sub.script.types.resolvable import FutureResolvable -from ytdl_sub.script.types.resolvable import NonHashable -from ytdl_sub.script.types.resolvable import Resolvable -from ytdl_sub.script.types.resolvable import ResolvableToJson +from ytdl_sub.script.types.resolvable import ( + Argument, + FutureResolvable, + NonHashable, + Resolvable, + ResolvableToJson, +) from ytdl_sub.script.types.variable import Variable from ytdl_sub.script.types.variable_dependency import VariableDependency diff --git a/src/ytdl_sub/script/types/function.py b/src/ytdl_sub/script/types/function.py index bf64108b..0fa108e8 100644 --- a/src/ytdl_sub/script/types/function.py +++ b/src/ytdl_sub/script/types/function.py @@ -1,38 +1,34 @@ import functools from abc import ABC from dataclasses import dataclass -from typing import Callable -from typing import Dict -from typing import List -from typing import Optional -from typing import Type -from typing import Union +from typing import Callable, Dict, List, Optional, Type, Union from ytdl_sub.script.functions import Functions -from ytdl_sub.script.types.array import Array -from ytdl_sub.script.types.array import UnresolvedArray -from ytdl_sub.script.types.resolvable import Argument -from ytdl_sub.script.types.resolvable import Boolean -from ytdl_sub.script.types.resolvable import BuiltInFunctionType -from ytdl_sub.script.types.resolvable import FunctionType -from ytdl_sub.script.types.resolvable import FutureResolvable -from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.types.resolvable import Lambda -from ytdl_sub.script.types.resolvable import NamedCustomFunction -from ytdl_sub.script.types.resolvable import Resolvable -from ytdl_sub.script.types.resolvable import ReturnableArgument -from ytdl_sub.script.types.resolvable import ReturnableArgumentA -from ytdl_sub.script.types.resolvable import ReturnableArgumentB -from ytdl_sub.script.types.variable import FunctionArgument -from ytdl_sub.script.types.variable import Variable +from ytdl_sub.script.types.array import Array, UnresolvedArray +from ytdl_sub.script.types.resolvable import ( + Argument, + Boolean, + BuiltInFunctionType, + FunctionType, + FutureResolvable, + Integer, + Lambda, + NamedCustomFunction, + Resolvable, + ReturnableArgument, + ReturnableArgumentA, + ReturnableArgumentB, +) +from ytdl_sub.script.types.variable import FunctionArgument, Variable from ytdl_sub.script.types.variable_dependency import VariableDependency from ytdl_sub.script.utils.exception_formatters import FunctionArgumentsExceptionFormatter -from ytdl_sub.script.utils.exceptions import UNREACHABLE -from ytdl_sub.script.utils.exceptions import FunctionRuntimeException -from ytdl_sub.script.utils.exceptions import RuntimeException -from ytdl_sub.script.utils.exceptions import UserThrownRuntimeError -from ytdl_sub.script.utils.type_checking import FunctionSpec -from ytdl_sub.script.utils.type_checking import is_union +from ytdl_sub.script.utils.exceptions import ( + UNREACHABLE, + FunctionRuntimeException, + RuntimeException, + UserThrownRuntimeError, +) +from ytdl_sub.script.utils.type_checking import FunctionSpec, is_union @dataclass(frozen=True) diff --git a/src/ytdl_sub/script/types/map.py b/src/ytdl_sub/script/types/map.py index d5e2eb27..5efeff75 100644 --- a/src/ytdl_sub/script/types/map.py +++ b/src/ytdl_sub/script/types/map.py @@ -1,17 +1,16 @@ import itertools from abc import ABC from dataclasses import dataclass -from typing import Any -from typing import Dict -from typing import List -from typing import Type +from typing import Any, Dict, List, Type -from ytdl_sub.script.types.resolvable import Argument -from ytdl_sub.script.types.resolvable import FutureResolvable -from ytdl_sub.script.types.resolvable import Hashable -from ytdl_sub.script.types.resolvable import NonHashable -from ytdl_sub.script.types.resolvable import Resolvable -from ytdl_sub.script.types.resolvable import ResolvableToJson +from ytdl_sub.script.types.resolvable import ( + Argument, + FutureResolvable, + Hashable, + NonHashable, + Resolvable, + ResolvableToJson, +) from ytdl_sub.script.types.variable import Variable from ytdl_sub.script.types.variable_dependency import VariableDependency from ytdl_sub.script.utils.exceptions import KeyNotHashableRuntimeException diff --git a/src/ytdl_sub/script/types/resolvable.py b/src/ytdl_sub/script/types/resolvable.py index ad9ff300..8edd4424 100644 --- a/src/ytdl_sub/script/types/resolvable.py +++ b/src/ytdl_sub/script/types/resolvable.py @@ -1,12 +1,7 @@ import json -from abc import ABC -from abc import abstractmethod +from abc import ABC, abstractmethod from dataclasses import dataclass -from typing import Any -from typing import Generic -from typing import List -from typing import Type -from typing import TypeVar +from typing import Any, Generic, List, Type, TypeVar T = TypeVar("T") NumericT = TypeVar("NumericT", bound=int | float) diff --git a/src/ytdl_sub/script/types/syntax_tree.py b/src/ytdl_sub/script/types/syntax_tree.py index e914f396..e38822ff 100644 --- a/src/ytdl_sub/script/types/syntax_tree.py +++ b/src/ytdl_sub/script/types/syntax_tree.py @@ -1,12 +1,8 @@ from dataclasses import dataclass -from typing import Dict -from typing import List -from typing import Optional +from typing import Dict, List, Optional from ytdl_sub.script.types.function import BuiltInFunction -from ytdl_sub.script.types.resolvable import Argument -from ytdl_sub.script.types.resolvable import Resolvable -from ytdl_sub.script.types.resolvable import String +from ytdl_sub.script.types.resolvable import Argument, Resolvable, String from ytdl_sub.script.types.variable import Variable from ytdl_sub.script.types.variable_dependency import VariableDependency diff --git a/src/ytdl_sub/script/types/variable_dependency.py b/src/ytdl_sub/script/types/variable_dependency.py index a185a0af..3599d65c 100644 --- a/src/ytdl_sub/script/types/variable_dependency.py +++ b/src/ytdl_sub/script/types/variable_dependency.py @@ -1,24 +1,17 @@ -from abc import ABC -from abc import abstractmethod +from abc import ABC, abstractmethod from dataclasses import dataclass -from typing import Dict -from typing import Iterable -from typing import List -from typing import Set -from typing import Tuple -from typing import Type -from typing import TypeVar -from typing import final +from typing import Dict, Iterable, List, Set, Tuple, Type, TypeVar, final -from ytdl_sub.script.types.resolvable import Argument -from ytdl_sub.script.types.resolvable import BuiltInFunctionType -from ytdl_sub.script.types.resolvable import FunctionType -from ytdl_sub.script.types.resolvable import Lambda -from ytdl_sub.script.types.resolvable import NamedCustomFunction -from ytdl_sub.script.types.resolvable import ParsedCustomFunction -from ytdl_sub.script.types.resolvable import Resolvable -from ytdl_sub.script.types.variable import FunctionArgument -from ytdl_sub.script.types.variable import Variable +from ytdl_sub.script.types.resolvable import ( + Argument, + BuiltInFunctionType, + FunctionType, + Lambda, + NamedCustomFunction, + ParsedCustomFunction, + Resolvable, +) +from ytdl_sub.script.types.variable import FunctionArgument, Variable from ytdl_sub.script.utils.exceptions import UNREACHABLE TypeT = TypeVar("TypeT") @@ -44,7 +37,7 @@ class VariableDependency(ABC): output.append(arg) elif instance and isinstance(arg, ttype): output.append(arg) - elif type(arg) == ttype: # pylint: disable=unidiomatic-typecheck + elif type(arg) is ttype: # pylint: disable=unidiomatic-typecheck output.append(arg) if isinstance(arg, VariableDependency): diff --git a/src/ytdl_sub/script/utils/exception_formatters.py b/src/ytdl_sub/script/utils/exception_formatters.py index b2cab76d..63a0a275 100644 --- a/src/ytdl_sub/script/utils/exception_formatters.py +++ b/src/ytdl_sub/script/utils/exception_formatters.py @@ -1,12 +1,9 @@ import sys -from typing import List -from typing import TypeVar +from typing import List, TypeVar from ytdl_sub.script.types.resolvable import BuiltInFunctionType -from ytdl_sub.script.utils.exceptions import IncompatibleFunctionArguments -from ytdl_sub.script.utils.exceptions import UserException -from ytdl_sub.script.utils.type_checking import FunctionSpec -from ytdl_sub.script.utils.type_checking import is_union +from ytdl_sub.script.utils.exceptions import IncompatibleFunctionArguments, UserException +from ytdl_sub.script.utils.type_checking import FunctionSpec, is_union UserExceptionT = TypeVar("UserExceptionT", bound=UserException) diff --git a/src/ytdl_sub/script/utils/name_validation.py b/src/ytdl_sub/script/utils/name_validation.py index 5b2597ce..708c51bf 100644 --- a/src/ytdl_sub/script/utils/name_validation.py +++ b/src/ytdl_sub/script/utils/name_validation.py @@ -1,8 +1,7 @@ import re from ytdl_sub.script.functions import Functions -from ytdl_sub.script.utils.exceptions import InvalidFunctionName -from ytdl_sub.script.utils.exceptions import InvalidVariableName +from ytdl_sub.script.utils.exceptions import InvalidFunctionName, InvalidVariableName _NAME_REGEX_VALIDATOR = re.compile(r"^[a-z][a-z0-9_]*$") diff --git a/src/ytdl_sub/script/utils/type_checking.py b/src/ytdl_sub/script/utils/type_checking.py index 7598a526..656c1c46 100644 --- a/src/ytdl_sub/script/utils/type_checking.py +++ b/src/ytdl_sub/script/utils/type_checking.py @@ -3,24 +3,20 @@ import inspect from dataclasses import dataclass from inspect import FullArgSpec from types import NoneType -from typing import Callable -from typing import List -from typing import Optional -from typing import Type -from typing import TypeVar -from typing import Union -from typing import get_origin +from typing import Callable, List, Optional, Type, TypeVar, Union, get_origin -from ytdl_sub.script.types.resolvable import Argument -from ytdl_sub.script.types.resolvable import BuiltInFunctionType -from ytdl_sub.script.types.resolvable import FutureResolvable -from ytdl_sub.script.types.resolvable import Lambda -from ytdl_sub.script.types.resolvable import LambdaReduce -from ytdl_sub.script.types.resolvable import LambdaThree -from ytdl_sub.script.types.resolvable import LambdaTwo -from ytdl_sub.script.types.resolvable import NamedCustomFunction -from ytdl_sub.script.types.resolvable import NamedType -from ytdl_sub.script.types.resolvable import Resolvable +from ytdl_sub.script.types.resolvable import ( + Argument, + BuiltInFunctionType, + FutureResolvable, + Lambda, + LambdaReduce, + LambdaThree, + LambdaTwo, + NamedCustomFunction, + NamedType, + Resolvable, +) from ytdl_sub.script.types.variable import Variable from ytdl_sub.script.utils.exceptions import UNREACHABLE diff --git a/src/ytdl_sub/subscriptions/base_subscription.py b/src/ytdl_sub/subscriptions/base_subscription.py index 553eb74d..55b96240 100644 --- a/src/ytdl_sub/subscriptions/base_subscription.py +++ b/src/ytdl_sub/subscriptions/base_subscription.py @@ -6,15 +6,12 @@ from ytdl_sub.config.config_validator import ConfigOptions from ytdl_sub.config.overrides import Overrides from ytdl_sub.config.plugin.preset_plugins import PresetPlugins from ytdl_sub.config.preset import Preset -from ytdl_sub.config.preset_options import OutputOptions -from ytdl_sub.config.preset_options import YTDLOptions -from ytdl_sub.config.validators.variable_validation import ResolutionLevel -from ytdl_sub.config.validators.variable_validation import VariableValidation +from ytdl_sub.config.preset_options import OutputOptions, YTDLOptions +from ytdl_sub.config.validators.variable_validation import ResolutionLevel, VariableValidation from ytdl_sub.downloaders.url.validators import MultiUrlValidator from ytdl_sub.entries.variables.override_variables import SubscriptionVariables from ytdl_sub.utils.exceptions import SubscriptionPermissionError -from ytdl_sub.utils.file_handler import FileHandler -from ytdl_sub.utils.file_handler import FileHandlerTransactionLog +from ytdl_sub.utils.file_handler import FileHandler, FileHandlerTransactionLog from ytdl_sub.utils.logger import Logger from ytdl_sub.utils.yaml import dump_yaml from ytdl_sub.ytdl_additions.enhanced_download_archive import EnhancedDownloadArchive diff --git a/src/ytdl_sub/subscriptions/subscription.py b/src/ytdl_sub/subscriptions/subscription.py index e40c2663..731ab969 100644 --- a/src/ytdl_sub/subscriptions/subscription.py +++ b/src/ytdl_sub/subscriptions/subscription.py @@ -1,9 +1,6 @@ import copy from pathlib import Path -from typing import Any -from typing import Dict -from typing import List -from typing import Optional +from typing import Any, Dict, List, Optional from mergedeep import mergedeep @@ -143,7 +140,6 @@ class Subscription(SubscriptionDownload): } for subscription_name, subscription_object in subscriptions_dicts.items(): - # Hard-override subscriptions here mergedeep.merge( subscription_object, diff --git a/src/ytdl_sub/subscriptions/subscription_download.py b/src/ytdl_sub/subscriptions/subscription_download.py index 082260cc..f4696f8b 100644 --- a/src/ytdl_sub/subscriptions/subscription_download.py +++ b/src/ytdl_sub/subscriptions/subscription_download.py @@ -4,15 +4,15 @@ import os import shutil from abc import ABC from pathlib import Path -from typing import List -from typing import Optional +from typing import List, Optional -from ytdl_sub.config.plugin.plugin import Plugin -from ytdl_sub.config.plugin.plugin import SplitPlugin +from ytdl_sub.config.plugin.plugin import Plugin, SplitPlugin from ytdl_sub.config.plugin.plugin_mapping import PluginMapping from ytdl_sub.config.plugin.plugin_operation import PluginOperation -from ytdl_sub.downloaders.info_json.info_json_downloader import InfoJsonDownloader -from ytdl_sub.downloaders.info_json.info_json_downloader import InfoJsonDownloaderOptions +from ytdl_sub.downloaders.info_json.info_json_downloader import ( + InfoJsonDownloader, + InfoJsonDownloaderOptions, +) from ytdl_sub.downloaders.source_plugin import SourcePlugin from ytdl_sub.downloaders.url.downloader import MultiUrlDownloader from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder @@ -22,9 +22,7 @@ from ytdl_sub.subscriptions.base_subscription import BaseSubscription from ytdl_sub.subscriptions.subscription_ytdl_options import SubscriptionYTDLOptions from ytdl_sub.utils.datetime import to_date_range from ytdl_sub.utils.exceptions import ValidationException -from ytdl_sub.utils.file_handler import FileHandler -from ytdl_sub.utils.file_handler import FileHandlerTransactionLog -from ytdl_sub.utils.file_handler import FileMetadata +from ytdl_sub.utils.file_handler import FileHandler, FileHandlerTransactionLog, FileMetadata from ytdl_sub.utils.logger import Logger logger: logging.Logger = Logger.get() diff --git a/src/ytdl_sub/subscriptions/subscription_validators.py b/src/ytdl_sub/subscriptions/subscription_validators.py index 9287a15b..6dd391dd 100644 --- a/src/ytdl_sub/subscriptions/subscription_validators.py +++ b/src/ytdl_sub/subscriptions/subscription_validators.py @@ -1,22 +1,20 @@ import copy import dataclasses -from abc import ABC -from abc import abstractmethod -from typing import Dict -from typing import List -from typing import Optional -from typing import final +from abc import ABC, abstractmethod +from typing import Dict, List, Optional, final from ytdl_sub.config.config_file import ConfigFile from ytdl_sub.config.overrides import Overrides from ytdl_sub.entries.variables.override_variables import SubscriptionVariables from ytdl_sub.utils.script import ScriptUtils from ytdl_sub.validators.string_formatter_validators import UnstructuredDictFormatterValidator -from ytdl_sub.validators.validators import DictValidator -from ytdl_sub.validators.validators import LiteralDictValidator -from ytdl_sub.validators.validators import StringListValidator -from ytdl_sub.validators.validators import StringValidator -from ytdl_sub.validators.validators import Validator +from ytdl_sub.validators.validators import ( + DictValidator, + LiteralDictValidator, + StringListValidator, + StringValidator, + Validator, +) class SubscriptionOutput(Validator, ABC): diff --git a/src/ytdl_sub/subscriptions/subscription_ytdl_options.py b/src/ytdl_sub/subscriptions/subscription_ytdl_options.py index c689c88b..8a4526b6 100644 --- a/src/ytdl_sub/subscriptions/subscription_ytdl_options.py +++ b/src/ytdl_sub/subscriptions/subscription_ytdl_options.py @@ -1,9 +1,5 @@ from pathlib import Path -from typing import Dict -from typing import List -from typing import Optional -from typing import Type -from typing import TypeVar +from typing import Dict, List, Optional, Type, TypeVar from yt_dlp import match_filter_func @@ -15,9 +11,7 @@ from ytdl_sub.plugins.audio_extract import AudioExtractPlugin from ytdl_sub.plugins.chapters import ChaptersPlugin from ytdl_sub.plugins.file_convert import FileConvertPlugin from ytdl_sub.plugins.format import FormatPlugin -from ytdl_sub.plugins.match_filters import MatchFiltersPlugin -from ytdl_sub.plugins.match_filters import combine_filters -from ytdl_sub.plugins.match_filters import default_filters +from ytdl_sub.plugins.match_filters import MatchFiltersPlugin, combine_filters, default_filters from ytdl_sub.plugins.subtitles import SubtitlesPlugin from ytdl_sub.plugins.throttle_protection import ThrottleProtectionPlugin from ytdl_sub.utils.ffmpeg import FFMPEG diff --git a/src/ytdl_sub/thread/log_entries_downloaded_listener.py b/src/ytdl_sub/thread/log_entries_downloaded_listener.py index ffa9c3b9..1c4ededb 100644 --- a/src/ytdl_sub/thread/log_entries_downloaded_listener.py +++ b/src/ytdl_sub/thread/log_entries_downloaded_listener.py @@ -4,8 +4,7 @@ import threading import time from json import JSONDecodeError from pathlib import Path -from typing import Optional -from typing import Set +from typing import Optional, Set from ytdl_sub.utils.logger import Logger diff --git a/src/ytdl_sub/utils/chapters.py b/src/ytdl_sub/utils/chapters.py index bdd52f34..22df783a 100644 --- a/src/ytdl_sub/utils/chapters.py +++ b/src/ytdl_sub/utils/chapters.py @@ -1,19 +1,14 @@ import re -from typing import Dict -from typing import List -from typing import Tuple +from typing import Dict, List, Tuple -from ytdl_sub.entries.entry import Entry -from ytdl_sub.entries.entry import ytdl_sub_chapters_from_comments -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions +from ytdl_sub.entries.entry import Entry, ytdl_sub_chapters_from_comments +from ytdl_sub.entries.script.variable_definitions import VARIABLES, VariableDefinitions from ytdl_sub.utils.file_handler import FileMetadata v: VariableDefinitions = VARIABLES class Timestamp: - # Captures the following formats: # 0:00 title # 00:00 title diff --git a/src/ytdl_sub/utils/ffmpeg.py b/src/ytdl_sub/utils/ffmpeg.py index 52374464..6896b03b 100644 --- a/src/ytdl_sub/utils/ffmpeg.py +++ b/src/ytdl_sub/utils/ffmpeg.py @@ -1,8 +1,6 @@ import subprocess import tempfile -from typing import Dict -from typing import List -from typing import Optional +from typing import Dict, List, Optional from ytdl_sub.utils.chapters import Chapters from ytdl_sub.utils.exceptions import ValidationException diff --git a/src/ytdl_sub/utils/file_handler.py b/src/ytdl_sub/utils/file_handler.py index 1db4bb6c..6fe51b1b 100644 --- a/src/ytdl_sub/utils/file_handler.py +++ b/src/ytdl_sub/utils/file_handler.py @@ -4,12 +4,7 @@ import os import shutil from collections import defaultdict from pathlib import Path -from typing import Any -from typing import Dict -from typing import List -from typing import Optional -from typing import Set -from typing import Union +from typing import Any, Dict, List, Optional, Set, Union from ytdl_sub.utils.subtitles import SUBTITLE_EXTENSIONS diff --git a/src/ytdl_sub/utils/logger.py b/src/ytdl_sub/utils/logger.py index fcd734d5..10f98173 100644 --- a/src/ytdl_sub/utils/logger.py +++ b/src/ytdl_sub/utils/logger.py @@ -5,8 +5,7 @@ import sys import tempfile from dataclasses import dataclass from pathlib import Path -from typing import List -from typing import Optional +from typing import List, Optional from ytdl_sub import __local_version__ from ytdl_sub.utils.exceptions import ValidationException @@ -84,7 +83,6 @@ class StreamToLogger(io.StringIO): class Logger: - # The level set via CLI arguments _LOGGER_LEVEL: LoggerLevel = LoggerLevels.DEBUG diff --git a/src/ytdl_sub/utils/retry.py b/src/ytdl_sub/utils/retry.py index 4704a2e5..15e44bf3 100644 --- a/src/ytdl_sub/utils/retry.py +++ b/src/ytdl_sub/utils/retry.py @@ -1,8 +1,5 @@ from time import sleep -from typing import Any -from typing import Optional -from typing import Tuple -from typing import Type +from typing import Any, Optional, Tuple, Type from ytdl_sub.utils.logger import Logger diff --git a/src/ytdl_sub/utils/script.py b/src/ytdl_sub/utils/script.py index 7252d7c4..2e637cf6 100644 --- a/src/ytdl_sub/utils/script.py +++ b/src/ytdl_sub/utils/script.py @@ -1,22 +1,12 @@ import json import re -from typing import Any -from typing import Dict -from typing import Optional +from typing import Any, Dict, Optional from ytdl_sub.script.parser import parse -from ytdl_sub.script.types.array import Array -from ytdl_sub.script.types.array import UnresolvedArray -from ytdl_sub.script.types.function import BuiltInFunction -from ytdl_sub.script.types.function import Function -from ytdl_sub.script.types.map import Map -from ytdl_sub.script.types.map import UnresolvedMap -from ytdl_sub.script.types.resolvable import Argument -from ytdl_sub.script.types.resolvable import Boolean -from ytdl_sub.script.types.resolvable import Float -from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.types.resolvable import Lambda -from ytdl_sub.script.types.resolvable import String +from ytdl_sub.script.types.array import Array, UnresolvedArray +from ytdl_sub.script.types.function import BuiltInFunction, Function +from ytdl_sub.script.types.map import Map, UnresolvedMap +from ytdl_sub.script.types.resolvable import Argument, Boolean, Float, Integer, Lambda, String from ytdl_sub.script.types.syntax_tree import SyntaxTree from ytdl_sub.script.types.variable import Variable from ytdl_sub.script.utils.exceptions import UNREACHABLE @@ -177,7 +167,6 @@ class ScriptUtils: @classmethod def _syntax_tree_to_native_script(cls, tree: SyntaxTree) -> str: - if (output := cls._is_top_level_string(tree)) is not None: return output diff --git a/src/ytdl_sub/utils/scriptable.py b/src/ytdl_sub/utils/scriptable.py index 38780024..c05d1d66 100644 --- a/src/ytdl_sub/utils/scriptable.py +++ b/src/ytdl_sub/utils/scriptable.py @@ -1,13 +1,9 @@ import copy from abc import ABC -from typing import Any -from typing import Dict -from typing import Optional -from typing import Set +from typing import Any, Dict, Optional, Set from ytdl_sub.entries.script.function_scripts import CUSTOM_FUNCTION_SCRIPTS -from ytdl_sub.entries.script.variable_definitions import UNRESOLVED_VARIABLES -from ytdl_sub.entries.script.variable_definitions import VARIABLE_SCRIPTS +from ytdl_sub.entries.script.variable_definitions import UNRESOLVED_VARIABLES, VARIABLE_SCRIPTS from ytdl_sub.entries.script.variable_types import Variable from ytdl_sub.entries.variables.override_variables import REQUIRED_OVERRIDE_VARIABLE_DEFINITIONS from ytdl_sub.script.script import Script diff --git a/src/ytdl_sub/utils/xml.py b/src/ytdl_sub/utils/xml.py index 1e5e3179..223f7532 100644 --- a/src/ytdl_sub/utils/xml.py +++ b/src/ytdl_sub/utils/xml.py @@ -1,9 +1,6 @@ import xml.etree.ElementTree as et from dataclasses import dataclass -from typing import Any -from typing import Dict -from typing import List -from typing import Union +from typing import Any, Dict, List, Union @dataclass diff --git a/src/ytdl_sub/utils/yaml.py b/src/ytdl_sub/utils/yaml.py index f0f04d5c..1c3153f4 100644 --- a/src/ytdl_sub/utils/yaml.py +++ b/src/ytdl_sub/utils/yaml.py @@ -6,8 +6,7 @@ from typing import Dict import yaml from yaml import YAMLError -from ytdl_sub.utils.exceptions import FileNotFoundException -from ytdl_sub.utils.exceptions import InvalidYamlException +from ytdl_sub.utils.exceptions import FileNotFoundException, InvalidYamlException from ytdl_sub.utils.logger import Logger logger = Logger.get(name="yaml") diff --git a/src/ytdl_sub/validators/audo_codec_validator.py b/src/ytdl_sub/validators/audo_codec_validator.py index 959d697a..ae01185c 100644 --- a/src/ytdl_sub/validators/audo_codec_validator.py +++ b/src/ytdl_sub/validators/audo_codec_validator.py @@ -1,5 +1,4 @@ -from typing import Dict -from typing import Set +from typing import Dict, Set from ytdl_sub.validators.string_select_validator import StringSelectValidator diff --git a/src/ytdl_sub/validators/file_path_validators.py b/src/ytdl_sub/validators/file_path_validators.py index f5a69f61..f0076d5a 100644 --- a/src/ytdl_sub/validators/file_path_validators.py +++ b/src/ytdl_sub/validators/file_path_validators.py @@ -3,8 +3,10 @@ from pathlib import Path from typing import Any from ytdl_sub.utils.file_path import FilePathTruncater -from ytdl_sub.validators.string_formatter_validators import OverridesStringFormatterValidator -from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator +from ytdl_sub.validators.string_formatter_validators import ( + OverridesStringFormatterValidator, + StringFormatterValidator, +) from ytdl_sub.validators.validators import StringValidator diff --git a/src/ytdl_sub/validators/nfo_validators.py b/src/ytdl_sub/validators/nfo_validators.py index d5cdd819..ee2d1f3d 100644 --- a/src/ytdl_sub/validators/nfo_validators.py +++ b/src/ytdl_sub/validators/nfo_validators.py @@ -1,18 +1,17 @@ from abc import ABC from collections import defaultdict -from typing import Dict -from typing import List +from typing import Dict, List from ytdl_sub.validators.strict_dict_validator import StrictDictValidator -from ytdl_sub.validators.string_formatter_validators import DictFormatterValidator -from ytdl_sub.validators.string_formatter_validators import ListFormatterValidator -from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator -from ytdl_sub.validators.validators import DictValidator -from ytdl_sub.validators.validators import ListValidator +from ytdl_sub.validators.string_formatter_validators import ( + DictFormatterValidator, + ListFormatterValidator, + StringFormatterValidator, +) +from ytdl_sub.validators.validators import DictValidator, ListValidator class NfoTagsWithAttributesValidator(StrictDictValidator): - _required_keys = {"attributes", "tag"} def __init__(self, name, value): diff --git a/src/ytdl_sub/validators/regex_validator.py b/src/ytdl_sub/validators/regex_validator.py index f7af98c7..7f1034c2 100644 --- a/src/ytdl_sub/validators/regex_validator.py +++ b/src/ytdl_sub/validators/regex_validator.py @@ -1,9 +1,7 @@ import re -from typing import List -from typing import Optional +from typing import List, Optional -from ytdl_sub.validators.validators import ListValidator -from ytdl_sub.validators.validators import StringValidator +from ytdl_sub.validators.validators import ListValidator, StringValidator class RegexValidator(StringValidator): diff --git a/src/ytdl_sub/validators/source_variable_validator.py b/src/ytdl_sub/validators/source_variable_validator.py index ba17c895..851fbd12 100644 --- a/src/ytdl_sub/validators/source_variable_validator.py +++ b/src/ytdl_sub/validators/source_variable_validator.py @@ -1,7 +1,6 @@ from ytdl_sub.script.utils.name_validation import is_valid_name from ytdl_sub.utils.exceptions import InvalidVariableNameException -from ytdl_sub.validators.validators import ListValidator -from ytdl_sub.validators.validators import StringValidator +from ytdl_sub.validators.validators import ListValidator, StringValidator class SourceVariableNameValidator(StringValidator): diff --git a/src/ytdl_sub/validators/strict_dict_validator.py b/src/ytdl_sub/validators/strict_dict_validator.py index e76f4eec..8eb90803 100644 --- a/src/ytdl_sub/validators/strict_dict_validator.py +++ b/src/ytdl_sub/validators/strict_dict_validator.py @@ -1,5 +1,4 @@ -from typing import List -from typing import Set +from typing import List, Set from ytdl_sub.validators.validators import DictValidator diff --git a/src/ytdl_sub/validators/string_formatter_validators.py b/src/ytdl_sub/validators/string_formatter_validators.py index b9fdd3ea..780976ba 100644 --- a/src/ytdl_sub/validators/string_formatter_validators.py +++ b/src/ytdl_sub/validators/string_formatter_validators.py @@ -1,23 +1,23 @@ from datetime import datetime -from typing import Any -from typing import Dict -from typing import Set -from typing import Union -from typing import final +from typing import Any, Dict, Set, Union, final from ytdl_sub.script.parser import parse from ytdl_sub.script.script import Script from ytdl_sub.script.types.syntax_tree import SyntaxTree -from ytdl_sub.script.utils.exceptions import RuntimeException -from ytdl_sub.script.utils.exceptions import ScriptVariableNotResolved -from ytdl_sub.script.utils.exceptions import UserException +from ytdl_sub.script.utils.exceptions import ( + RuntimeException, + ScriptVariableNotResolved, + UserException, +) from ytdl_sub.utils.exceptions import StringFormattingVariableNotFoundException from ytdl_sub.utils.script import ScriptUtils -from ytdl_sub.validators.validators import DictValidator -from ytdl_sub.validators.validators import ListValidator -from ytdl_sub.validators.validators import LiteralDictValidator -from ytdl_sub.validators.validators import StringValidator -from ytdl_sub.validators.validators import Validator +from ytdl_sub.validators.validators import ( + DictValidator, + ListValidator, + LiteralDictValidator, + StringValidator, + Validator, +) # pylint: disable=protected-access diff --git a/src/ytdl_sub/validators/validators.py b/src/ytdl_sub/validators/validators.py index 6c1356ae..462da271 100644 --- a/src/ytdl_sub/validators/validators.py +++ b/src/ytdl_sub/validators/validators.py @@ -1,13 +1,6 @@ import copy from abc import ABC -from typing import Any -from typing import Dict -from typing import Generic -from typing import List -from typing import Optional -from typing import Type -from typing import TypeVar -from typing import final +from typing import Any, Dict, Generic, List, Optional, Type, TypeVar, final from ytdl_sub.utils.exceptions import ValidationException @@ -173,7 +166,7 @@ class ListValidator(Validator, ABC, Generic[ValidatorT]): super().__init__(name, value) self._list: List[ValidatorT] = [ - self._inner_list_type(name=f"{name}.{i+1}", value=val) + self._inner_list_type(name=f"{name}.{i + 1}", value=val) for i, val in enumerate(self._value) ] diff --git a/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py b/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py index 50b12f42..73dba9e0 100644 --- a/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py +++ b/src/ytdl_sub/ytdl_additions/enhanced_download_archive.py @@ -5,22 +5,14 @@ import time from dataclasses import dataclass from datetime import datetime from pathlib import Path -from typing import Any -from typing import Dict -from typing import List -from typing import Optional -from typing import Set +from typing import Any, Dict, List, Optional, Set from yt_dlp import DateRange from yt_dlp.utils import make_archive_id -from ytdl_sub.entries.entry import Entry -from ytdl_sub.entries.entry import ytdl_sub_split_by_chapters_parent_uid -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions -from ytdl_sub.utils.file_handler import FileHandler -from ytdl_sub.utils.file_handler import FileHandlerTransactionLog -from ytdl_sub.utils.file_handler import FileMetadata +from ytdl_sub.entries.entry import Entry, ytdl_sub_split_by_chapters_parent_uid +from ytdl_sub.entries.script.variable_definitions import VARIABLES, VariableDefinitions +from ytdl_sub.utils.file_handler import FileHandler, FileHandlerTransactionLog, FileMetadata from ytdl_sub.utils.logger import Logger logger = Logger.get("archive") diff --git a/tests/conftest.py b/tests/conftest.py index 42d82178..0a2a14e4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -7,19 +7,12 @@ import shutil import sys import tempfile from pathlib import Path -from typing import Any -from typing import Callable -from typing import Dict -from typing import List -from typing import Optional -from typing import Tuple -from typing import Union +from typing import Any, Callable, Dict, List, Optional, Tuple from unittest.mock import patch import pytest from expected_download import _get_files_in_directory -from resources import copy_file_fixture -from resources import file_fixture_path +from resources import copy_file_fixture, file_fixture_path from yt_dlp.utils import sanitize_filename from ytdl_sub.cli.entrypoint import main @@ -28,8 +21,7 @@ from ytdl_sub.entries.script.custom_functions import CustomFunctions from ytdl_sub.subscriptions.subscription import Subscription from ytdl_sub.subscriptions.subscription_download import SubscriptionDownload from ytdl_sub.utils.file_handler import FileHandler -from ytdl_sub.utils.logger import Logger -from ytdl_sub.utils.logger import LoggerLevels +from ytdl_sub.utils.logger import Logger, LoggerLevels from ytdl_sub.utils.yaml import load_yaml @@ -121,9 +113,9 @@ def assert_logs( occurrences += int(expected_message in full_print) if expected_occurrences is not None: - assert ( - occurrences == expected_occurrences - ), f"{expected_message} was expected {expected_occurrences} times, got {occurrences}" + assert occurrences == expected_occurrences, ( + f"{expected_message} was expected {expected_occurrences} times, got {occurrences}" + ) else: assert occurrences > 0, f"{expected_message} was not found in a logger.debug call" diff --git a/tests/e2e/cli/test_view.py b/tests/e2e/cli/test_view.py index 19a8e289..b918cbfb 100644 --- a/tests/e2e/cli/test_view.py +++ b/tests/e2e/cli/test_view.py @@ -15,10 +15,9 @@ class TestView: output_directory, split_chapters, ): - - args = f"view " + args = "view " args += "--split-chapters " if split_chapters else "" - args += f"https://www.youtube.com/playlist?list=PLBsm_SagFMmdWnCnrNtLjA9kzfrRkto4i" + args += "https://www.youtube.com/playlist?list=PLBsm_SagFMmdWnCnrNtLjA9kzfrRkto4i" subscriptions = mock_run_from_cli(args=args) assert len(subscriptions) == 1 diff --git a/tests/e2e/plugins/test_subtitles.py b/tests/e2e/plugins/test_subtitles.py index bead12b1..110d374c 100644 --- a/tests/e2e/plugins/test_subtitles.py +++ b/tests/e2e/plugins/test_subtitles.py @@ -26,9 +26,9 @@ def single_video_subs_embed_preset_dict(output_directory): @pytest.fixture def test_single_video_subs_embed_and_file_preset_dict(single_video_subs_embed_preset_dict): - single_video_subs_embed_preset_dict["subtitles"][ - "subtitles_name" - ] = "{music_video_file_name}.{lang}.{subtitles_ext}" + single_video_subs_embed_preset_dict["subtitles"]["subtitles_name"] = ( + "{music_video_file_name}.{lang}.{subtitles_ext}" + ) return single_video_subs_embed_preset_dict diff --git a/tests/e2e/presets/test_bilateral.py b/tests/e2e/presets/test_bilateral.py index 8b83e83b..8799c2e9 100644 --- a/tests/e2e/presets/test_bilateral.py +++ b/tests/e2e/presets/test_bilateral.py @@ -53,7 +53,6 @@ def tv_show_collection_bilateral_dict(output_directory): @pytest.mark.skipif(DISABLE_YOUTUBE_TESTS, reason="YouTube tests cannot run in GH") class TestBilateral: - def test_tv_show_by_date_downloads_bilateral( self, tv_show_by_date_bilateral_dict: Dict, diff --git a/tests/e2e/youtube/test_channel.py b/tests/e2e/youtube/test_channel.py index 7ef62d09..dc73af1f 100644 --- a/tests/e2e/youtube/test_channel.py +++ b/tests/e2e/youtube/test_channel.py @@ -1,5 +1,4 @@ -from typing import Callable -from typing import Dict +from typing import Callable, Dict import pytest from expected_download import assert_expected_downloads diff --git a/tests/expected_download.py b/tests/expected_download.py index bdb97e14..9df67923 100644 --- a/tests/expected_download.py +++ b/tests/expected_download.py @@ -2,11 +2,9 @@ import json import os.path from dataclasses import dataclass from pathlib import Path -from typing import List -from typing import Optional +from typing import List, Optional -from resources import REGENERATE_FIXTURES -from resources import RESOURCE_PATH +from resources import REGENERATE_FIXTURES, RESOURCE_PATH from ytdl_sub.utils.file_handler import get_file_md5_hash from ytdl_sub.utils.system import IS_WINDOWS @@ -131,9 +129,9 @@ def assert_expected_downloads( ): if dry_run: output_directory_contents = list(Path(output_directory).rglob("*")) - assert ( - len(output_directory_contents) == 0 - ), f"Expected output directory to be empty after a dry-run, but found {output_directory_contents}" + assert len(output_directory_contents) == 0, ( + f"Expected output directory to be empty after a dry-run, but found {output_directory_contents}" + ) return summary_full_path = _EXPECTED_DOWNLOADS_SUMMARY_PATH / expected_download_summary_file_name diff --git a/tests/expected_transaction_log.py b/tests/expected_transaction_log.py index 3eddf176..05dc9dac 100644 --- a/tests/expected_transaction_log.py +++ b/tests/expected_transaction_log.py @@ -2,8 +2,7 @@ import os from pathlib import Path from typing import List -from resources import REGENERATE_FIXTURES -from resources import RESOURCE_PATH +from resources import REGENERATE_FIXTURES, RESOURCE_PATH from ytdl_sub.utils.file_handler import FileHandlerTransactionLog @@ -48,9 +47,9 @@ def assert_transaction_log_matches( # Split, ensure there are the same number of new lines summary_lines: List[str] = summary.split("\n") expected_summary_lines: List[str] = expected_summary.split("\n") - assert len(summary_lines) == len( - expected_summary_lines - ), f"Summary number of lines differ: {len(summary_lines) != len(expected_summary_lines)}" + assert len(summary_lines) == len(expected_summary_lines), ( + f"Summary number of lines differ: {len(summary_lines) != len(expected_summary_lines)}" + ) # Ensure each line equals for idx in range(len(summary_lines)): diff --git a/tests/integration/cli/conftest.py b/tests/integration/cli/conftest.py index b8eb4b29..4f60dbb7 100644 --- a/tests/integration/cli/conftest.py +++ b/tests/integration/cli/conftest.py @@ -1,8 +1,6 @@ -import datetime import os import shutil import tempfile -import time from typing import Callable from unittest.mock import patch @@ -11,8 +9,7 @@ import pytest from ytdl_sub.config.config_file import ConfigFile from ytdl_sub.subscriptions.subscription import Subscription -from ytdl_sub.utils.file_handler import FileHandlerTransactionLog -from ytdl_sub.utils.file_handler import FileMetadata +from ytdl_sub.utils.file_handler import FileHandlerTransactionLog, FileMetadata from ytdl_sub.utils.logger import Logger diff --git a/tests/integration/cli/test_dl.py b/tests/integration/cli/test_dl.py index 013ad4a6..36b8064f 100644 --- a/tests/integration/cli/test_dl.py +++ b/tests/integration/cli/test_dl.py @@ -2,8 +2,7 @@ from typing import Dict from unittest.mock import patch import pytest -from conftest import mock_run_from_cli -from conftest import preset_dict_to_dl_args +from conftest import mock_run_from_cli, preset_dict_to_dl_args from expected_download import assert_expected_downloads from expected_transaction_log import assert_transaction_log_matches diff --git a/tests/integration/cli/test_entrypoint.py b/tests/integration/cli/test_entrypoint.py index 90ea3579..c989b87e 100644 --- a/tests/integration/cli/test_entrypoint.py +++ b/tests/integration/cli/test_entrypoint.py @@ -1,14 +1,12 @@ import re import sys from pathlib import Path -from typing import Callable -from typing import List +from typing import Callable, List from unittest.mock import patch import pytest -from ytdl_sub.cli.entrypoint import _download_subscriptions_from_yaml_files -from ytdl_sub.cli.entrypoint import main +from ytdl_sub.cli.entrypoint import _download_subscriptions_from_yaml_files, main from ytdl_sub.config.config_file import ConfigFile from ytdl_sub.subscriptions.subscription import Subscription from ytdl_sub.utils.exceptions import ExperimentalFeatureNotEnabled @@ -129,7 +127,6 @@ def test_subscription_shuffle( mock_subscription_download_factory: Callable, music_video_subscription_path: Path, ): - subscription_paths = [str(music_video_subscription_path)] with ( diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index b0aab494..335d3706 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -1,11 +1,7 @@ import contextlib import os from pathlib import Path -from typing import Any -from typing import Callable -from typing import Dict -from typing import List -from typing import Optional +from typing import Any, Callable, Dict, List, Optional from unittest.mock import patch import pytest @@ -14,8 +10,7 @@ from resources import copy_file_fixture from ytdl_sub.config.config_file import ConfigFile from ytdl_sub.downloaders.url.downloader import MultiUrlDownloader from ytdl_sub.downloaders.ytdlp import YTDLP -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions +from ytdl_sub.entries.script.variable_definitions import VARIABLES, VariableDefinitions from ytdl_sub.plugins.throttle_protection import ThrottleProtectionPlugin v: VariableDefinitions = VARIABLES diff --git a/tests/integration/plugins/conftest.py b/tests/integration/plugins/conftest.py index 48ac4a3f..7188fb2a 100644 --- a/tests/integration/plugins/conftest.py +++ b/tests/integration/plugins/conftest.py @@ -1,4 +1,3 @@ -import tempfile from unittest.mock import patch import pytest diff --git a/tests/integration/plugins/test_file_convert.py b/tests/integration/plugins/test_file_convert.py index 06980b22..afeede56 100644 --- a/tests/integration/plugins/test_file_convert.py +++ b/tests/integration/plugins/test_file_convert.py @@ -52,7 +52,7 @@ class TestFileConvert: assert_transaction_log_matches( output_directory=output_directory, transaction_log=transaction_log, - transaction_log_summary_file_name=f"plugins/file_convert/custom_ffmpeg_args.txt", + transaction_log_summary_file_name="plugins/file_convert/custom_ffmpeg_args.txt", ) assert_expected_downloads( output_directory=output_directory, diff --git a/tests/integration/plugins/test_filter.py b/tests/integration/plugins/test_filter.py index 9f9e9883..fd958b76 100644 --- a/tests/integration/plugins/test_filter.py +++ b/tests/integration/plugins/test_filter.py @@ -1,5 +1,4 @@ -from typing import Any -from typing import Dict +from typing import Any, Dict import mergedeep import pytest diff --git a/tests/integration/plugins/test_output_options.py b/tests/integration/plugins/test_output_options.py index b65692b5..4314440a 100644 --- a/tests/integration/plugins/test_output_options.py +++ b/tests/integration/plugins/test_output_options.py @@ -36,7 +36,6 @@ def output_options_subscription_dict(output_directory) -> Dict: class TestOutputOptions: - @classmethod def _ensure_subscription_migrates( cls, @@ -114,9 +113,9 @@ class TestOutputOptions: expected_download_summary_file_name="plugins/output_options/pre_migration.json", ) - output_options_subscription_dict["output_options"][ - "migrated_download_archive_name" - ] = ".ytdl-sub-{tv_show_name_sanitized}-migrated-download-archive.json" + output_options_subscription_dict["output_options"]["migrated_download_archive_name"] = ( + ".ytdl-sub-{tv_show_name_sanitized}-migrated-download-archive.json" + ) subscription = Subscription.from_dict( config=config, preset_name=subscription_name, diff --git a/tests/integration/prebuilt_presets/test_filter_duration.py b/tests/integration/prebuilt_presets/test_filter_duration.py index 7faf123f..0529a2e3 100644 --- a/tests/integration/prebuilt_presets/test_filter_duration.py +++ b/tests/integration/prebuilt_presets/test_filter_duration.py @@ -17,7 +17,6 @@ def filter_subscription_dict(output_directory): class TestFilterKeywords: - def test_no_overrides( self, config, @@ -40,7 +39,7 @@ class TestFilterKeywords: assert_transaction_log_matches( output_directory=output_directory, transaction_log=transaction_log, - transaction_log_summary_file_name=f"integration/prebuilt_presets/filter_keywords_empty.txt", + transaction_log_summary_file_name="integration/prebuilt_presets/filter_keywords_empty.txt", ) @pytest.mark.parametrize( @@ -81,7 +80,7 @@ class TestFilterKeywords: assert_transaction_log_matches( output_directory=output_directory, transaction_log=transaction_log, - transaction_log_summary_file_name=f"integration/prebuilt_presets/filter_duration.txt", + transaction_log_summary_file_name="integration/prebuilt_presets/filter_duration.txt", ) @pytest.mark.parametrize( @@ -106,6 +105,6 @@ class TestFilterKeywords: with ( mock_download_collection_entries(is_youtube_channel=False, num_urls=1, is_dry_run=True), - pytest.raises(UserThrownRuntimeError, match=f"filter_duration args must be numeric"), + pytest.raises(UserThrownRuntimeError, match="filter_duration args must be numeric"), ): _ = subscription.download(dry_run=True) diff --git a/tests/integration/prebuilt_presets/test_filter_keywords.py b/tests/integration/prebuilt_presets/test_filter_keywords.py index 733f27b6..947c7d9e 100644 --- a/tests/integration/prebuilt_presets/test_filter_keywords.py +++ b/tests/integration/prebuilt_presets/test_filter_keywords.py @@ -17,7 +17,6 @@ def filter_subscription_dict(output_directory): class TestFilterKeywords: - def test_no_overrides( self, config, @@ -40,7 +39,7 @@ class TestFilterKeywords: assert_transaction_log_matches( output_directory=output_directory, transaction_log=transaction_log, - transaction_log_summary_file_name=f"integration/prebuilt_presets/filter_keywords_empty.txt", + transaction_log_summary_file_name="integration/prebuilt_presets/filter_keywords_empty.txt", ) @pytest.mark.parametrize("filter_mode", ["include", "exclude"]) diff --git a/tests/integration/prebuilt_presets/test_music.py b/tests/integration/prebuilt_presets/test_music.py index 6ef0ec0e..d4465b24 100644 --- a/tests/integration/prebuilt_presets/test_music.py +++ b/tests/integration/prebuilt_presets/test_music.py @@ -10,7 +10,6 @@ from ytdl_sub.subscriptions.subscription import Subscription @pytest.mark.usefixtures(mock_chapters_class.__name__) @pytest.mark.parametrize("music_preset", MusicPresets.preset_names) class TestPrebuiltMusicPresets: - def test_presets_run( self, config, diff --git a/tests/integration/prebuilt_presets/test_music_videos.py b/tests/integration/prebuilt_presets/test_music_videos.py index e4e2399d..526a2a22 100644 --- a/tests/integration/prebuilt_presets/test_music_videos.py +++ b/tests/integration/prebuilt_presets/test_music_videos.py @@ -57,7 +57,6 @@ class TestPrebuiltMusicVideoPresets: @pytest.mark.parametrize("music_video_preset", MusicVideoPresets.preset_names) @pytest.mark.parametrize("multi_url", [True, False]) class TestPrebuiltMusicVideoPresetsWithCategories: - def _preset_dict( self, output_directory: Path, diff --git a/tests/integration/prebuilt_presets/test_tv_show_by_date.py b/tests/integration/prebuilt_presets/test_tv_show_by_date.py index e886e228..0909ad5b 100644 --- a/tests/integration/prebuilt_presets/test_tv_show_by_date.py +++ b/tests/integration/prebuilt_presets/test_tv_show_by_date.py @@ -28,7 +28,6 @@ VALID_ORDERING_COMBOS = [ class TestPrebuiltTVShowPresets: - @staticmethod def run( config: ConfigFile, @@ -40,7 +39,6 @@ class TestPrebuiltTVShowPresets: is_youtube_channel: bool = True, is_many_urls: bool = False, ): - expected_summary_name = "integration/by-date/{}/{}/{}/is_yt_{}{}".format( tv_show_preset.split(" ")[0], season_ordering, @@ -136,7 +134,6 @@ class TestPrebuiltTVShowPresets: mock_download_collection_entries, tv_show_preset: str, ): - with mock_download_collection_entries(is_youtube_channel=True): self.run( config=config, @@ -160,7 +157,6 @@ class TestPrebuiltTVShowPresets: season_ordering: str, episode_ordering: str, ): - with mock_download_collection_entries( is_youtube_channel=True, ): diff --git a/tests/integration/prebuilt_presets/test_tv_show_collection.py b/tests/integration/prebuilt_presets/test_tv_show_collection.py index 2061efd1..05db4981 100644 --- a/tests/integration/prebuilt_presets/test_tv_show_collection.py +++ b/tests/integration/prebuilt_presets/test_tv_show_collection.py @@ -1,6 +1,5 @@ import re -from typing import Dict -from typing import List +from typing import Dict, List import pytest from expected_download import assert_expected_downloads @@ -15,7 +14,6 @@ DEFAULT_EPISODE_ORDERING = "upload-year-month-day" class TestPrebuiltTvShowCollectionPresets: - @staticmethod def run( config: ConfigFile, @@ -124,7 +122,6 @@ class TestPrebuiltTvShowCollectionPresets: media_player_preset: str, season_indices: List[int], ): - with mock_download_collection_entries( is_youtube_channel=True, num_urls=len(season_indices) ): @@ -158,7 +155,6 @@ class TestPrebuiltTvShowCollectionPresets: episode_ordering: str, season_indices: List[int], ): - with mock_download_collection_entries( is_youtube_channel=True, num_urls=len(season_indices) ): diff --git a/tests/integration/prebuilt_presets/test_url.py b/tests/integration/prebuilt_presets/test_url.py index 0da8d4b5..2391bba2 100644 --- a/tests/integration/prebuilt_presets/test_url.py +++ b/tests/integration/prebuilt_presets/test_url.py @@ -1,12 +1,9 @@ import pytest -from conftest import assert_logs from ytdl_sub.downloaders.url.downloader import MultiUrlDownloader from ytdl_sub.downloaders.ytdl_options_builder import YTDLOptionsBuilder -from ytdl_sub.downloaders.ytdlp import YTDLP from ytdl_sub.entries.entry import Entry -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions +from ytdl_sub.entries.script.variable_definitions import VARIABLES, VariableDefinitions from ytdl_sub.subscriptions.subscription import Subscription v: VariableDefinitions = VARIABLES @@ -29,7 +26,6 @@ def subscription_dict(output_directory): class TestUrl: - def test_modified_url_when_downloading( self, config, diff --git a/tests/unit/cli/test_download_args_parser.py b/tests/unit/cli/test_download_args_parser.py index 675f4066..9e4cad03 100644 --- a/tests/unit/cli/test_download_args_parser.py +++ b/tests/unit/cli/test_download_args_parser.py @@ -1,14 +1,10 @@ import shlex -from typing import Callable -from typing import Dict -from typing import List -from typing import Optional +from typing import Callable, Dict, List, Optional import pytest from ytdl_sub.cli.parsers.dl import DownloadArgsParser -from ytdl_sub.cli.parsers.main import MainArguments -from ytdl_sub.cli.parsers.main import parser +from ytdl_sub.cli.parsers.main import MainArguments, parser from ytdl_sub.config.config_validator import ConfigOptions from ytdl_sub.utils.exceptions import InvalidDlArguments @@ -164,7 +160,7 @@ class TestDownloadArgsParser: with pytest.raises( InvalidDlArguments, - match=f"Invalid dl argument --parameter.using.list: " + match="Invalid dl argument --parameter.using.list: " "Cannot specify an argument to be two different types", ): DownloadArgsParser( diff --git a/tests/unit/cli/test_output_summary.py b/tests/unit/cli/test_output_summary.py index a31c9d58..3278eb54 100644 --- a/tests/unit/cli/test_output_summary.py +++ b/tests/unit/cli/test_output_summary.py @@ -1,14 +1,11 @@ -from typing import List -from typing import Optional -from typing import Tuple -from unittest.mock import MagicMock -from unittest.mock import Mock +from typing import List, Optional, Tuple +from unittest.mock import MagicMock, Mock from ytdl_sub.cli.output_summary import output_summary def _to_mock_subscriptions( - subscription_values: List[Tuple[str, int, int, int, int, Optional[Exception]]] + subscription_values: List[Tuple[str, int, int, int, int, Optional[Exception]]], ) -> List[MagicMock]: mock_subscriptions: List[MagicMock] = [] for values in subscription_values: diff --git a/tests/unit/config/test_config_file.py b/tests/unit/config/test_config_file.py index ae1d2231..39560388 100644 --- a/tests/unit/config/test_config_file.py +++ b/tests/unit/config/test_config_file.py @@ -1,8 +1,7 @@ import os.path import re from pathlib import Path -from typing import Dict -from typing import Optional +from typing import Dict, Optional import pytest diff --git a/tests/unit/config/test_preset.py b/tests/unit/config/test_preset.py index a42439be..f36d9290 100644 --- a/tests/unit/config/test_preset.py +++ b/tests/unit/config/test_preset.py @@ -201,7 +201,7 @@ class TestPreset: with pytest.raises( ValidationException, match=re.escape( - f"Override variable with name subtitles_ext cannot be used since" + "Override variable with name subtitles_ext cannot be used since" " it is added by a plugin." ), ): diff --git a/tests/unit/config/test_subscription.py b/tests/unit/config/test_subscription.py index 719ac9f4..a961d8ab 100644 --- a/tests/unit/config/test_subscription.py +++ b/tests/unit/config/test_subscription.py @@ -5,15 +5,11 @@ from typing import Dict from unittest.mock import patch import pytest -import yaml from ytdl_sub.config.config_file import ConfigFile -from ytdl_sub.config.validators.variable_validation import ResolutionLevel -from ytdl_sub.entries.script.variable_definitions import VARIABLES from ytdl_sub.plugins.nfo_tags import NfoTagsOptions from ytdl_sub.subscriptions.subscription import Subscription from ytdl_sub.utils.exceptions import ValidationException -from ytdl_sub.utils.script import ScriptUtils @contextmanager @@ -428,7 +424,7 @@ def test_subscription_file_invalid_form(config_file: ConfigFile): mock_load_yaml(preset_dict={"sub_name": 4332}), pytest.raises( ValidationException, - match=re.escape(f"Subscription value should either be a string, list, or object"), + match=re.escape("Subscription value should either be a string, list, or object"), ), ): _ = Subscription.from_file_path(config=config_file, subscription_path="mocked") diff --git a/tests/unit/config/test_subscription_resolution.py b/tests/unit/config/test_subscription_resolution.py index bfa04d16..12781bb8 100644 --- a/tests/unit/config/test_subscription_resolution.py +++ b/tests/unit/config/test_subscription_resolution.py @@ -42,7 +42,6 @@ def _ensure_resolved_yaml( @pytest.mark.parametrize("resolution_level", ResolutionLevel.all()) class TestResolution: - def test_resolution_tv_show( self, resolution_level: int, diff --git a/tests/unit/config/test_subscription_validation.py b/tests/unit/config/test_subscription_validation.py index 3a6fd13d..a333fbb4 100644 --- a/tests/unit/config/test_subscription_validation.py +++ b/tests/unit/config/test_subscription_validation.py @@ -4,8 +4,7 @@ import pytest from ytdl_sub.config.preset import Preset from ytdl_sub.subscriptions.subscription import Subscription -from ytdl_sub.utils.exceptions import StringFormattingVariableNotFoundException -from ytdl_sub.utils.exceptions import ValidationException +from ytdl_sub.utils.exceptions import StringFormattingVariableNotFoundException, ValidationException class TestSubscriptionValidation: diff --git a/tests/unit/entries/conftest.py b/tests/unit/entries/conftest.py index e3302010..76b9c7c6 100644 --- a/tests/unit/entries/conftest.py +++ b/tests/unit/entries/conftest.py @@ -1,7 +1,6 @@ import pytest from ytdl_sub.entries.entry import Entry -from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator @pytest.fixture diff --git a/tests/unit/entries/test_entry.py b/tests/unit/entries/test_entry.py index 07b7a5a3..8f525797 100644 --- a/tests/unit/entries/test_entry.py +++ b/tests/unit/entries/test_entry.py @@ -1,8 +1,7 @@ import pytest from ytdl_sub.entries.entry import Entry -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions +from ytdl_sub.entries.script.variable_definitions import VARIABLES, VariableDefinitions v: VariableDefinitions = VARIABLES @@ -32,7 +31,6 @@ class TestEntry(object): month_rev_pad, day_rev_pad, ): - mock_entry_kwargs["upload_date"] = upload_date entry = Entry(entry_dict=mock_entry_kwargs, working_directory=".").initialize_script() assert entry.get(v.upload_year_truncated_reversed, int) == year_rev diff --git a/tests/unit/main/test_main.py b/tests/unit/main/test_main.py index 32ff6d57..3ec5a025 100644 --- a/tests/unit/main/test_main.py +++ b/tests/unit/main/test_main.py @@ -12,16 +12,15 @@ from ytdl_sub.cli.parsers.main import DEFAULT_CONFIG_FILE_NAME from ytdl_sub.config.config_file import ConfigFile from ytdl_sub.utils.exceptions import ValidationException from ytdl_sub.utils.file_handler import FileHandler -from ytdl_sub.utils.logger import Logger -from ytdl_sub.utils.logger import LoggerLevels +from ytdl_sub.utils.logger import Logger, LoggerLevels @pytest.fixture def expected_uncaught_error_message(): return ( - f"Version %s\nPlease upload the error log file '%s' and make a " - f"Github issue at https://github.com/jmbannon/ytdl-sub/issues with your config and " - f"command/subscription yaml file to reproduce. Thanks for trying ytdl-sub!" + "Version %s\nPlease upload the error log file '%s' and make a " + "Github issue at https://github.com/jmbannon/ytdl-sub/issues with your config and " + "command/subscription yaml file to reproduce. Thanks for trying ytdl-sub!" ) diff --git a/tests/unit/plugins/test_date_range.py b/tests/unit/plugins/test_date_range.py index a024d8e2..81e5fc2e 100644 --- a/tests/unit/plugins/test_date_range.py +++ b/tests/unit/plugins/test_date_range.py @@ -1,6 +1,5 @@ import re -from typing import Any -from typing import Dict +from typing import Any, Dict import pytest from conftest import get_match_filters @@ -73,7 +72,7 @@ class TestDateRange: subscription=sub, dry_run=False, download_filters=False ) assert metadata_filter == [ - f"!is_live & !is_upcoming & !post_live & upload_date < 20250530 & upload_date >= 20250510" + "!is_live & !is_upcoming & !post_live & upload_date < 20250530 & upload_date >= 20250510" ] assert not metadata_breaking_filter diff --git a/tests/unit/plugins/test_ytdl_options.py b/tests/unit/plugins/test_ytdl_options.py index 205e1750..959d9b74 100644 --- a/tests/unit/plugins/test_ytdl_options.py +++ b/tests/unit/plugins/test_ytdl_options.py @@ -1,6 +1,5 @@ import re -from typing import Any -from typing import Dict +from typing import Any, Dict import pytest import yt_dlp @@ -23,7 +22,6 @@ def preset_dict(output_directory) -> Dict[str, Any]: class TestYtdlOptions: - def test_ytdl_options_are_strings( self, default_config: ConfigFile, diff --git a/tests/unit/prebuilt_presets/test_tv_show_by_date.py b/tests/unit/prebuilt_presets/test_tv_show_by_date.py index 2b21e050..7f8d7042 100644 --- a/tests/unit/prebuilt_presets/test_tv_show_by_date.py +++ b/tests/unit/prebuilt_presets/test_tv_show_by_date.py @@ -8,7 +8,6 @@ from ytdl_sub.subscriptions.subscription import Subscription class TestTvShowByDatePreset: - def test_s01_error_thrown(self, default_config): with pytest.raises( UserThrownRuntimeError, diff --git a/tests/unit/prebuilt_presets/test_tv_show_collection.py b/tests/unit/prebuilt_presets/test_tv_show_collection.py index 0f7e9c5e..f8ecb2da 100644 --- a/tests/unit/prebuilt_presets/test_tv_show_collection.py +++ b/tests/unit/prebuilt_presets/test_tv_show_collection.py @@ -7,7 +7,6 @@ from ytdl_sub.subscriptions.subscription import Subscription class TestTvShowCollectionPreset: - def test_url_error_thrown(self, default_config): with pytest.raises( UserThrownRuntimeError, diff --git a/tests/unit/script/functions/test_date_functions.py b/tests/unit/script/functions/test_date_functions.py index 1c826ea4..e9406e35 100644 --- a/tests/unit/script/functions/test_date_functions.py +++ b/tests/unit/script/functions/test_date_functions.py @@ -1,8 +1,6 @@ import pytest from unit.script.conftest import single_variable_output -from ytdl_sub.script.script import Script - class TestNumericFunctions: @pytest.mark.parametrize( diff --git a/tests/unit/script/functions/test_map_functions.py b/tests/unit/script/functions/test_map_functions.py index befc611e..750bc02f 100644 --- a/tests/unit/script/functions/test_map_functions.py +++ b/tests/unit/script/functions/test_map_functions.py @@ -4,9 +4,11 @@ import pytest from unit.script.conftest import single_variable_output from ytdl_sub.script.script import Script -from ytdl_sub.script.utils.exceptions import FunctionRuntimeException -from ytdl_sub.script.utils.exceptions import KeyDoesNotExistRuntimeException -from ytdl_sub.script.utils.exceptions import KeyNotHashableRuntimeException +from ytdl_sub.script.utils.exceptions import ( + FunctionRuntimeException, + KeyDoesNotExistRuntimeException, + KeyNotHashableRuntimeException, +) class TestMapFunctions: diff --git a/tests/unit/script/functions/test_print_functions.py b/tests/unit/script/functions/test_print_functions.py index 56500d16..a85d15e7 100644 --- a/tests/unit/script/functions/test_print_functions.py +++ b/tests/unit/script/functions/test_print_functions.py @@ -1,6 +1,5 @@ import logging -from typing import Any -from typing import Optional +from typing import Any, Optional from unittest.mock import patch import pytest diff --git a/tests/unit/script/functions/test_regex_functions.py b/tests/unit/script/functions/test_regex_functions.py index b284b865..1f78ae82 100644 --- a/tests/unit/script/functions/test_regex_functions.py +++ b/tests/unit/script/functions/test_regex_functions.py @@ -66,7 +66,7 @@ class TestRegexFunctions: match="no regex strings were captured for input string the string", ): single_variable_output( - f"""{{ + """{ %regex_capture_many( "the string", [ @@ -74,7 +74,7 @@ class TestRegexFunctions: "not here either (.*)" ] ) - }}""" + }""" ) def test_regex_capture_many_fails_unequal_capture_groups(self): @@ -83,7 +83,7 @@ class TestRegexFunctions: match="regex_array elements must contain the same number of capture groups", ): single_variable_output( - f"""{{ + """{ %regex_capture_many( "the string", [ @@ -91,5 +91,5 @@ class TestRegexFunctions: "(.*) not equal to 1 (.*)" ] ) - }}""" + }""" ) diff --git a/tests/unit/script/functions/test_string_functions.py b/tests/unit/script/functions/test_string_functions.py index bc5bfc32..02aafad1 100644 --- a/tests/unit/script/functions/test_string_functions.py +++ b/tests/unit/script/functions/test_string_functions.py @@ -1,5 +1,4 @@ -from typing import List -from typing import Optional +from typing import List, Optional import pytest from unit.script.conftest import single_variable_output diff --git a/tests/unit/script/test_parser.py b/tests/unit/script/test_parser.py index c6694562..2174129b 100644 --- a/tests/unit/script/test_parser.py +++ b/tests/unit/script/test_parser.py @@ -1,23 +1,19 @@ import re -from typing import Optional -from typing import Union +from typing import Optional, Union import pytest -from ytdl_sub.script.parser import _UNEXPECTED_CHAR_ARGUMENT -from ytdl_sub.script.parser import BRACKET_INVALID_CHAR -from ytdl_sub.script.parser import BRACKET_NOT_CLOSED -from ytdl_sub.script.parser import ParsedArgType -from ytdl_sub.script.parser import parse +from ytdl_sub.script.parser import ( + _UNEXPECTED_CHAR_ARGUMENT, + BRACKET_INVALID_CHAR, + BRACKET_NOT_CLOSED, + ParsedArgType, + parse, +) from ytdl_sub.script.types.array import UnresolvedArray from ytdl_sub.script.types.function import BuiltInFunction -from ytdl_sub.script.types.resolvable import Boolean -from ytdl_sub.script.types.resolvable import Float -from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.types.resolvable import Lambda -from ytdl_sub.script.types.resolvable import String -from ytdl_sub.script.types.syntax_tree import ResolvedSyntaxTree -from ytdl_sub.script.types.syntax_tree import SyntaxTree +from ytdl_sub.script.types.resolvable import Boolean, Float, Integer, Lambda, String +from ytdl_sub.script.types.syntax_tree import ResolvedSyntaxTree, SyntaxTree from ytdl_sub.script.types.variable import Variable from ytdl_sub.script.utils.exceptions import InvalidSyntaxException diff --git a/tests/unit/script/types/test_array.py b/tests/unit/script/types/test_array.py index 312ec325..6de29d94 100644 --- a/tests/unit/script/types/test_array.py +++ b/tests/unit/script/types/test_array.py @@ -2,14 +2,15 @@ import re import pytest -from ytdl_sub.script.parser import _UNEXPECTED_CHAR_ARGUMENT -from ytdl_sub.script.parser import _UNEXPECTED_COMMA_ARGUMENT -from ytdl_sub.script.parser import ParsedArgType +from ytdl_sub.script.parser import ( + _UNEXPECTED_CHAR_ARGUMENT, + _UNEXPECTED_COMMA_ARGUMENT, + ParsedArgType, +) from ytdl_sub.script.script import Script from ytdl_sub.script.script_output import ScriptOutput from ytdl_sub.script.types.array import Array -from ytdl_sub.script.types.resolvable import Float -from ytdl_sub.script.types.resolvable import String +from ytdl_sub.script.types.resolvable import Float, String from ytdl_sub.script.types.syntax_tree import SyntaxTree from ytdl_sub.script.types.variable import Variable from ytdl_sub.script.utils.exceptions import InvalidSyntaxException @@ -97,7 +98,7 @@ class TestArray: @pytest.mark.parametrize( "array", [ - "{]}" "{ ]}", + "{]}{ ]}", "{\n]}", ], ) diff --git a/tests/unit/script/types/test_bool.py b/tests/unit/script/types/test_bool.py index 5de7ddb1..9dd4316a 100644 --- a/tests/unit/script/types/test_bool.py +++ b/tests/unit/script/types/test_bool.py @@ -5,8 +5,7 @@ import pytest from ytdl_sub.script.parser import BOOLEAN_ONLY_ARGS from ytdl_sub.script.script import Script from ytdl_sub.script.script_output import ScriptOutput -from ytdl_sub.script.types.resolvable import Boolean -from ytdl_sub.script.types.resolvable import String +from ytdl_sub.script.types.resolvable import Boolean, String from ytdl_sub.script.utils.exceptions import InvalidSyntaxException diff --git a/tests/unit/script/types/test_custom_function.py b/tests/unit/script/types/test_custom_function.py index 17919cc0..89987eca 100644 --- a/tests/unit/script/types/test_custom_function.py +++ b/tests/unit/script/types/test_custom_function.py @@ -8,11 +8,13 @@ from ytdl_sub.script.script_output import ScriptOutput from ytdl_sub.script.types.function import CustomFunction from ytdl_sub.script.types.resolvable import Integer from ytdl_sub.script.types.syntax_tree import SyntaxTree -from ytdl_sub.script.utils.exceptions import CycleDetected -from ytdl_sub.script.utils.exceptions import FunctionDoesNotExist -from ytdl_sub.script.utils.exceptions import InvalidCustomFunctionArgumentName -from ytdl_sub.script.utils.exceptions import InvalidCustomFunctionArguments -from ytdl_sub.script.utils.exceptions import InvalidSyntaxException +from ytdl_sub.script.utils.exceptions import ( + CycleDetected, + FunctionDoesNotExist, + InvalidCustomFunctionArgumentName, + InvalidCustomFunctionArguments, + InvalidSyntaxException, +) class TestCustomFunction: diff --git a/tests/unit/script/types/test_float.py b/tests/unit/script/types/test_float.py index e285ce17..7f4ab8f8 100644 --- a/tests/unit/script/types/test_float.py +++ b/tests/unit/script/types/test_float.py @@ -2,12 +2,10 @@ import re import pytest -from ytdl_sub.script.parser import NUMERICS_INVALID_CHAR -from ytdl_sub.script.parser import NUMERICS_ONLY_ARGS +from ytdl_sub.script.parser import NUMERICS_INVALID_CHAR, NUMERICS_ONLY_ARGS from ytdl_sub.script.script import Script from ytdl_sub.script.script_output import ScriptOutput -from ytdl_sub.script.types.resolvable import Float -from ytdl_sub.script.types.resolvable import String +from ytdl_sub.script.types.resolvable import Float, String from ytdl_sub.script.utils.exceptions import InvalidSyntaxException diff --git a/tests/unit/script/types/test_function.py b/tests/unit/script/types/test_function.py index e13828f4..519078f3 100644 --- a/tests/unit/script/types/test_function.py +++ b/tests/unit/script/types/test_function.py @@ -7,10 +7,12 @@ from ytdl_sub.script.functions import Functions from ytdl_sub.script.parser import FUNCTION_INVALID_CHAR from ytdl_sub.script.script import Script from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.utils.exceptions import FunctionDoesNotExist -from ytdl_sub.script.utils.exceptions import FunctionRuntimeException -from ytdl_sub.script.utils.exceptions import IncompatibleFunctionArguments -from ytdl_sub.script.utils.exceptions import InvalidSyntaxException +from ytdl_sub.script.utils.exceptions import ( + FunctionDoesNotExist, + FunctionRuntimeException, + IncompatibleFunctionArguments, + InvalidSyntaxException, +) def _incompatible_arguments_match(expected: str, recieved: str) -> str: @@ -95,7 +97,7 @@ class TestFunction: def test_register_function(self): try: Functions.register_function(function=mock_register_function) - output = single_variable_output(f"{{%mock_register_function(10)}}") + output = single_variable_output("{%mock_register_function(10)}") assert output == 110 finally: del Functions._custom_functions[mock_register_function.__name__] diff --git a/tests/unit/script/types/test_integer.py b/tests/unit/script/types/test_integer.py index 18747e11..4f686849 100644 --- a/tests/unit/script/types/test_integer.py +++ b/tests/unit/script/types/test_integer.py @@ -2,13 +2,10 @@ import re import pytest -from ytdl_sub.script.parser import NUMERICS_INVALID_CHAR -from ytdl_sub.script.parser import NUMERICS_ONLY_ARGS +from ytdl_sub.script.parser import NUMERICS_INVALID_CHAR, NUMERICS_ONLY_ARGS from ytdl_sub.script.script import Script from ytdl_sub.script.script_output import ScriptOutput -from ytdl_sub.script.types.resolvable import Boolean -from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.types.resolvable import String +from ytdl_sub.script.types.resolvable import Integer, String from ytdl_sub.script.utils.exceptions import InvalidSyntaxException diff --git a/tests/unit/script/types/test_lambda_function.py b/tests/unit/script/types/test_lambda_function.py index 0474a1d3..f40e7d82 100644 --- a/tests/unit/script/types/test_lambda_function.py +++ b/tests/unit/script/types/test_lambda_function.py @@ -6,8 +6,7 @@ from ytdl_sub.script.script import Script from ytdl_sub.script.script_output import ScriptOutput from ytdl_sub.script.types.array import Array from ytdl_sub.script.types.resolvable import Integer -from ytdl_sub.script.utils.exceptions import CycleDetected -from ytdl_sub.script.utils.exceptions import IncompatibleFunctionArguments +from ytdl_sub.script.utils.exceptions import CycleDetected, IncompatibleFunctionArguments class TestLambdaFunction: diff --git a/tests/unit/script/types/test_map.py b/tests/unit/script/types/test_map.py index 576eba35..8a29d3c0 100644 --- a/tests/unit/script/types/test_map.py +++ b/tests/unit/script/types/test_map.py @@ -2,20 +2,20 @@ import re import pytest -from ytdl_sub.script.parser import _UNEXPECTED_COMMA_ARGUMENT -from ytdl_sub.script.parser import BRACKET_NOT_CLOSED -from ytdl_sub.script.parser import MAP_KEY_MULTIPLE_VALUES -from ytdl_sub.script.parser import MAP_KEY_NOT_HASHABLE -from ytdl_sub.script.parser import MAP_KEY_WITH_NO_VALUE -from ytdl_sub.script.parser import MAP_MISSING_KEY -from ytdl_sub.script.parser import ParsedArgType +from ytdl_sub.script.parser import ( + _UNEXPECTED_COMMA_ARGUMENT, + BRACKET_NOT_CLOSED, + MAP_KEY_MULTIPLE_VALUES, + MAP_KEY_NOT_HASHABLE, + MAP_KEY_WITH_NO_VALUE, + MAP_MISSING_KEY, + ParsedArgType, +) from ytdl_sub.script.script import Script from ytdl_sub.script.script_output import ScriptOutput from ytdl_sub.script.types.map import Map -from ytdl_sub.script.types.resolvable import Float -from ytdl_sub.script.types.resolvable import String -from ytdl_sub.script.utils.exceptions import InvalidSyntaxException -from ytdl_sub.script.utils.exceptions import KeyNotHashableRuntimeException +from ytdl_sub.script.types.resolvable import Float, String +from ytdl_sub.script.utils.exceptions import InvalidSyntaxException, KeyNotHashableRuntimeException class TestMap: diff --git a/tests/unit/script/types/test_string.py b/tests/unit/script/types/test_string.py index 11ad9065..28a4cb62 100644 --- a/tests/unit/script/types/test_string.py +++ b/tests/unit/script/types/test_string.py @@ -3,8 +3,7 @@ import re import pytest from unit.script.conftest import single_variable_output -from ytdl_sub.script.parser import STRINGS_NOT_CLOSED -from ytdl_sub.script.parser import STRINGS_ONLY_ARGS +from ytdl_sub.script.parser import STRINGS_NOT_CLOSED, STRINGS_ONLY_ARGS from ytdl_sub.script.script import Script from ytdl_sub.script.script_output import ScriptOutput from ytdl_sub.script.types.resolvable import String diff --git a/tests/unit/script/types/test_variable.py b/tests/unit/script/types/test_variable.py index 526e1476..166c8339 100644 --- a/tests/unit/script/types/test_variable.py +++ b/tests/unit/script/types/test_variable.py @@ -5,9 +5,11 @@ import pytest from ytdl_sub.script.script import Script from ytdl_sub.script.script_output import ScriptOutput from ytdl_sub.script.types.resolvable import String -from ytdl_sub.script.utils.exceptions import CycleDetected -from ytdl_sub.script.utils.exceptions import InvalidVariableName -from ytdl_sub.script.utils.exceptions import VariableDoesNotExist +from ytdl_sub.script.utils.exceptions import ( + CycleDetected, + InvalidVariableName, + VariableDoesNotExist, +) class TestVariable: diff --git a/tests/unit/utils/test_chapters.py b/tests/unit/utils/test_chapters.py index f695a4d0..c7cd5936 100644 --- a/tests/unit/utils/test_chapters.py +++ b/tests/unit/utils/test_chapters.py @@ -1,7 +1,6 @@ import pytest -from ytdl_sub.utils.chapters import Chapters -from ytdl_sub.utils.chapters import Timestamp +from ytdl_sub.utils.chapters import Chapters, Timestamp class TestTimestamp: diff --git a/tests/unit/utils/test_file_handler.py b/tests/unit/utils/test_file_handler.py index 80505e24..44cc01af 100644 --- a/tests/unit/utils/test_file_handler.py +++ b/tests/unit/utils/test_file_handler.py @@ -1,11 +1,8 @@ -import pytest - from ytdl_sub.utils.file_handler import FileHandler from ytdl_sub.utils.system import IS_WINDOWS class TestFileHandler: - def test_directory_exists(self): if IS_WINDOWS: return diff --git a/tests/unit/utils/test_logger.py b/tests/unit/utils/test_logger.py index 1d39de5b..6148eaac 100644 --- a/tests/unit/utils/test_logger.py +++ b/tests/unit/utils/test_logger.py @@ -3,8 +3,7 @@ import time import pytest -from ytdl_sub.utils.logger import Logger -from ytdl_sub.utils.logger import LoggerLevels +from ytdl_sub.utils.logger import Logger, LoggerLevels class TestLogger: diff --git a/tests/unit/utils/test_yaml.py b/tests/unit/utils/test_yaml.py index 7d0fd284..41553e5b 100644 --- a/tests/unit/utils/test_yaml.py +++ b/tests/unit/utils/test_yaml.py @@ -1,11 +1,9 @@ -import os import re import tempfile import pytest -from ytdl_sub.utils.exceptions import FileNotFoundException -from ytdl_sub.utils.exceptions import InvalidYamlException +from ytdl_sub.utils.exceptions import FileNotFoundException, InvalidYamlException from ytdl_sub.utils.file_handler import FileHandler from ytdl_sub.utils.yaml import load_yaml diff --git a/tests/unit/validators/test_dict_validator.py b/tests/unit/validators/test_dict_validator.py index e1eb2aeb..5437522e 100644 --- a/tests/unit/validators/test_dict_validator.py +++ b/tests/unit/validators/test_dict_validator.py @@ -1,10 +1,12 @@ import pytest from ytdl_sub.utils.exceptions import ValidationException -from ytdl_sub.validators.validators import BoolValidator -from ytdl_sub.validators.validators import DictValidator -from ytdl_sub.validators.validators import LiteralDictValidator -from ytdl_sub.validators.validators import StringValidator +from ytdl_sub.validators.validators import ( + BoolValidator, + DictValidator, + LiteralDictValidator, + StringValidator, +) class TestDictValidator: diff --git a/tests/unit/validators/test_regex_validator.py b/tests/unit/validators/test_regex_validator.py index c1398cd1..170c57fb 100644 --- a/tests/unit/validators/test_regex_validator.py +++ b/tests/unit/validators/test_regex_validator.py @@ -1,8 +1,7 @@ import pytest from ytdl_sub.utils.exceptions import ValidationException -from ytdl_sub.validators.regex_validator import RegexListValidator -from ytdl_sub.validators.regex_validator import RegexValidator +from ytdl_sub.validators.regex_validator import RegexListValidator, RegexValidator @pytest.mark.parametrize( diff --git a/tests/unit/validators/test_string_formatter_validator.py b/tests/unit/validators/test_string_formatter_validator.py index 888dc58d..a1a05b85 100644 --- a/tests/unit/validators/test_string_formatter_validator.py +++ b/tests/unit/validators/test_string_formatter_validator.py @@ -1,14 +1,12 @@ import pytest -from yt_dlp.utils import sanitize_filename -from ytdl_sub.utils.exceptions import StringFormattingException from ytdl_sub.utils.exceptions import ValidationException -from ytdl_sub.validators.string_formatter_validators import DictFormatterValidator -from ytdl_sub.validators.string_formatter_validators import OverridesDictFormatterValidator -from ytdl_sub.validators.string_formatter_validators import OverridesStringFormatterValidator -from ytdl_sub.validators.string_formatter_validators import StringFormatterValidator -from ytdl_sub.validators.string_formatter_validators import UnstructuredDictFormatterValidator from ytdl_sub.validators.string_formatter_validators import ( + DictFormatterValidator, + OverridesDictFormatterValidator, + OverridesStringFormatterValidator, + StringFormatterValidator, + UnstructuredDictFormatterValidator, UnstructuredOverridesDictFormatterValidator, ) diff --git a/tools/docgen/configuration.py b/tools/docgen/configuration.py index 958c09a1..9f3b6c24 100644 --- a/tools/docgen/configuration.py +++ b/tools/docgen/configuration.py @@ -7,7 +7,6 @@ from ytdl_sub.config.preset import Preset class ConfigurationDocGen(DocGen): - LOCATION = Path("docs/source/config_reference/config_yaml.rst") DOCSTRING_LOCATION = ( "The respective function docstrings within ytdl_sub/config/config_validator.py" diff --git a/tools/docgen/entry_variables.py b/tools/docgen/entry_variables.py index 4f46c452..f19f5a2f 100644 --- a/tools/docgen/entry_variables.py +++ b/tools/docgen/entry_variables.py @@ -1,16 +1,15 @@ from pathlib import Path -from typing import Any -from typing import Dict -from typing import Type +from typing import Any, Dict, Type from tools.docgen.docgen import DocGen -from tools.docgen.utils import cached_properties -from tools.docgen.utils import camel_case_to_human -from tools.docgen.utils import get_function_docs -from tools.docgen.utils import line_section -from tools.docgen.utils import section -from ytdl_sub.entries.script.variable_definitions import VARIABLES -from ytdl_sub.entries.script.variable_definitions import VariableDefinitions +from tools.docgen.utils import ( + cached_properties, + camel_case_to_human, + get_function_docs, + line_section, + section, +) +from ytdl_sub.entries.script.variable_definitions import VARIABLES, VariableDefinitions def _variable_class_to_name(obj: Type[Any]) -> str: @@ -23,7 +22,6 @@ def _variable_class_to_name(obj: Type[Any]) -> str: class EntryVariablesDocGen(DocGen): - LOCATION = Path("docs/source/config_reference/scripting/entry_variables.rst") DOCSTRING_LOCATION = "src/ytdl_sub/entries/script/variable_definitions.py" diff --git a/tools/docgen/plugins.py b/tools/docgen/plugins.py index f0331acc..73ccdc93 100644 --- a/tools/docgen/plugins.py +++ b/tools/docgen/plugins.py @@ -1,16 +1,11 @@ from pathlib import Path -from typing import Dict -from typing import Set -from typing import Type +from typing import Dict, Set, Type from tools.docgen.docgen import DocGen -from tools.docgen.utils import generate_options_validator_docs -from tools.docgen.utils import line_section -from tools.docgen.utils import section +from tools.docgen.utils import generate_options_validator_docs, line_section, section from ytdl_sub.config.overrides import Overrides from ytdl_sub.config.plugin.plugin_mapping import PluginMapping -from ytdl_sub.config.preset_options import OutputOptions -from ytdl_sub.config.preset_options import YTDLOptions +from ytdl_sub.config.preset_options import OutputOptions, YTDLOptions from ytdl_sub.config.validators.options import OptionsValidator from ytdl_sub.downloaders.url.validators import MultiUrlValidator @@ -28,7 +23,6 @@ PLUGIN_NAMES_TO_SKIP_PROPERTIES: Set[str] = { class PluginsDocGen(DocGen): - LOCATION = Path("docs/source/config_reference/plugins.rst") DOCSTRING_LOCATION = "The respective plugin files under src/ytdl_sub/plugins/" diff --git a/tools/docgen/scripting_functions.py b/tools/docgen/scripting_functions.py index 78924ca4..b54a653d 100644 --- a/tools/docgen/scripting_functions.py +++ b/tools/docgen/scripting_functions.py @@ -1,15 +1,9 @@ import inspect from pathlib import Path -from typing import Any -from typing import Dict -from typing import Optional -from typing import Type +from typing import Any, Dict, Optional, Type from tools.docgen.docgen import DocGen -from tools.docgen.utils import camel_case_to_human -from tools.docgen.utils import line_section -from tools.docgen.utils import section -from tools.docgen.utils import static_methods +from tools.docgen.utils import camel_case_to_human, line_section, section, static_methods from ytdl_sub.entries.script.custom_functions import CustomFunctions from ytdl_sub.script.functions import Functions from ytdl_sub.script.utils.type_checking import FunctionSpec @@ -54,7 +48,6 @@ def get_function_docstring( class ScriptingFunctionsDocGen(DocGen): - LOCATION = Path("docs/source/config_reference/scripting/scripting_functions.rst") DOCSTRING_LOCATION = "The respective function files under src/ytdl_sub/script/functions/" diff --git a/tools/docgen/static_variables.py b/tools/docgen/static_variables.py index b8b0c315..fd5d1d09 100644 --- a/tools/docgen/static_variables.py +++ b/tools/docgen/static_variables.py @@ -1,14 +1,11 @@ from pathlib import Path from tools.docgen.docgen import DocGen -from tools.docgen.utils import get_function_docs -from tools.docgen.utils import section -from tools.docgen.utils import static_methods +from tools.docgen.utils import get_function_docs, section, static_methods from ytdl_sub.entries.variables.override_variables import SubscriptionVariables class StaticVariablesDocGen(DocGen): - LOCATION = Path("docs/source/config_reference/scripting/static_variables.rst") DOCSTRING_LOCATION = "src/ytdl_sub/entries/variables/override_variables.py" diff --git a/tools/docgen/utils.py b/tools/docgen/utils.py index 5cd6f357..e74372af 100644 --- a/tools/docgen/utils.py +++ b/tools/docgen/utils.py @@ -1,13 +1,8 @@ import inspect from functools import cached_property -from typing import Any -from typing import Dict -from typing import List -from typing import Optional -from typing import Type +from typing import Any, Dict, List, Optional, Type -from ytdl_sub.script.utils.type_checking import get_optional_type -from ytdl_sub.script.utils.type_checking import is_optional +from ytdl_sub.script.utils.type_checking import get_optional_type, is_optional from ytdl_sub.validators.validators import Validator LEVEL_CHARS: Dict[int, str] = {0: "=", 1: "-", 2: "~", 3: "^"} diff --git a/tools/linter b/tools/linter deleted file mode 100755 index b3a4fb7f..00000000 --- a/tools/linter +++ /dev/null @@ -1,11 +0,0 @@ -# Run within root directory - -if [[ $1 = "check" ]]; then - isort . --check-only --diff \ - && black . --check \ - && pylint src/ -else - isort . - black . - pylint src/ -fi \ No newline at end of file diff --git a/tools/test b/tools/test deleted file mode 100755 index 445b441c..00000000 --- a/tools/test +++ /dev/null @@ -1,12 +0,0 @@ -# Run within root directory - -if [[ $1 = "html" ]]; then - coverage run -m pytest && coverage report && coverage html -elif [[ $1 = "xml" ]]; then - coverage run -m pytest && coverage report && coverage xml -elif [[ $1 = "unit" ]]; then - coverage run -m pytest tests/unit && coverage report -else - coverage run -m pytest && coverage report -fi -