From 9cafcde9e11ef64262cef8793b9e738cc5ad7c3a Mon Sep 17 00:00:00 2001 From: Benexl Date: Thu, 24 Jul 2025 11:36:23 +0300 Subject: [PATCH] feat: performance review --- fastanime/cli/commands/anilist/cmd.py | 2 +- fastanime/cli/commands/search.py | 1 - fastanime/cli/config/editor.py | 2 +- fastanime/cli/config/loader.py | 10 ++++++---- fastanime/cli/services/feedback/service.py | 1 - fastanime/cli/services/registry/service.py | 1 - fastanime/cli/utils/completions.py | 16 ---------------- fastanime/core/__init__.py | 0 fastanime/core/config/descriptions.py | 2 +- fastanime/core/utils/file.py | 2 +- fastanime/libs/api/base.py | 9 +++++---- 11 files changed, 15 insertions(+), 31 deletions(-) create mode 100644 fastanime/core/__init__.py diff --git a/fastanime/cli/commands/anilist/cmd.py b/fastanime/cli/commands/anilist/cmd.py index 524da68..019c1b0 100644 --- a/fastanime/cli/commands/anilist/cmd.py +++ b/fastanime/cli/commands/anilist/cmd.py @@ -1,6 +1,5 @@ import click -from ...interactive.session import session from ...utils.lazyloader import LazyGroup from . import examples @@ -33,6 +32,7 @@ def anilist(ctx: click.Context, resume: bool): The entry point for the 'anilist' command. If no subcommand is invoked, it launches the interactive TUI mode. """ + from ...interactive.session import session config = ctx.obj diff --git a/fastanime/cli/commands/search.py b/fastanime/cli/commands/search.py index c13619f..4b1b17b 100644 --- a/fastanime/cli/commands/search.py +++ b/fastanime/cli/commands/search.py @@ -12,7 +12,6 @@ if TYPE_CHECKING: from typing_extensions import Unpack - from ...libs.players.base import BasePlayer from ...libs.providers.anime.base import BaseAnimeProvider from ...libs.providers.anime.types import Anime from ...libs.selectors.base import BaseSelector diff --git a/fastanime/cli/config/editor.py b/fastanime/cli/config/editor.py index d6806e1..dcce5bd 100644 --- a/fastanime/cli/config/editor.py +++ b/fastanime/cli/config/editor.py @@ -1,6 +1,6 @@ import textwrap from pathlib import Path -from typing import TYPE_CHECKING, Any, Literal, get_args, get_origin +from typing import Any, Literal, get_args, get_origin from InquirerPy import inquirer from InquirerPy.validator import NumberValidator diff --git a/fastanime/cli/config/loader.py b/fastanime/cli/config/loader.py index 0c2bf05..ed61b28 100644 --- a/fastanime/cli/config/loader.py +++ b/fastanime/cli/config/loader.py @@ -2,14 +2,11 @@ import configparser from pathlib import Path import click -from InquirerPy import inquirer from pydantic import ValidationError from ...core.config import AppConfig from ...core.constants import USER_CONFIG_PATH from ...core.exceptions import ConfigError -from .generate import generate_config_ini_from_app_model -from .editor import InteractiveConfigEditor class ConfigLoader: @@ -42,7 +39,12 @@ class ConfigLoader: click.echo( "[bold yellow]Welcome to FastAnime![/bold yellow] No configuration file found." ) - choice = inquirer.select( + from InquirerPy import inquirer + + from .editor import InteractiveConfigEditor + from .generate import generate_config_ini_from_app_model + + choice = inquirer.select( # type: ignore message="How would you like to proceed?", choices=[ "Use default settings (Recommended for new users)", diff --git a/fastanime/cli/services/feedback/service.py b/fastanime/cli/services/feedback/service.py index b98a533..bfe2b3f 100644 --- a/fastanime/cli/services/feedback/service.py +++ b/fastanime/cli/services/feedback/service.py @@ -4,7 +4,6 @@ from typing import Optional import click from rich.console import Console -from rich.panel import Panel from rich.progress import Progress, SpinnerColumn, TextColumn console = Console() diff --git a/fastanime/cli/services/registry/service.py b/fastanime/cli/services/registry/service.py index 40e8c6d..41d3e4e 100644 --- a/fastanime/cli/services/registry/service.py +++ b/fastanime/cli/services/registry/service.py @@ -36,7 +36,6 @@ class MediaRegistryService: self._index_file_modified_time = 0 _lock_file = self.config.media_dir / "registry.lock" self._lock = FileLock(_lock_file) - self._load_index() def _ensure_directories(self) -> None: """Ensure registry directories exist.""" diff --git a/fastanime/cli/utils/completions.py b/fastanime/cli/utils/completions.py index 65affc9..4bd00d8 100644 --- a/fastanime/cli/utils/completions.py +++ b/fastanime/cli/utils/completions.py @@ -63,22 +63,6 @@ def get_anime_titles(query: str, variables: dict = {}): return [] -def downloaded_anime_titles(ctx, param, incomplete): - import os - - from ..constants import USER_VIDEOS_DIR - - try: - titles = [ - title - for title in os.listdir(USER_VIDEOS_DIR) - if title.lower().startswith(incomplete.lower()) or not incomplete - ] - return titles - except Exception: - return [] - - def anime_titles_shell_complete(ctx, param, incomplete): incomplete = incomplete.strip() if not incomplete: diff --git a/fastanime/core/__init__.py b/fastanime/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/fastanime/core/config/descriptions.py b/fastanime/core/config/descriptions.py index 5399b9a..88be856 100644 --- a/fastanime/core/config/descriptions.py +++ b/fastanime/core/config/descriptions.py @@ -1,5 +1,5 @@ # GeneralConfig -from fastanime.core.config.defaults import SESSIONS_DIR +from .defaults import SESSIONS_DIR GENERAL_PYGMENT_STYLE = "The pygment style to use" GENERAL_API_CLIENT = "The media database API to use (e.g., 'anilist', 'jikan')." diff --git a/fastanime/core/utils/file.py b/fastanime/core/utils/file.py index 3c7823f..f8c924b 100644 --- a/fastanime/core/utils/file.py +++ b/fastanime/core/utils/file.py @@ -3,7 +3,7 @@ import os import time import uuid from pathlib import Path -from typing import IO, Any, BinaryIO, TextIO, Union +from typing import IO, Any, Union logger = logging.getLogger(__name__) diff --git a/fastanime/libs/api/base.py b/fastanime/libs/api/base.py index e4f0aed..1772229 100644 --- a/fastanime/libs/api/base.py +++ b/fastanime/libs/api/base.py @@ -1,7 +1,5 @@ import abc -from typing import Any, Optional - -from httpx import Client +from typing import TYPE_CHECKING, Any, Optional, Union from ...core.config import AnilistConfig from .params import ( @@ -11,13 +9,16 @@ from .params import ( ) from .types import MediaSearchResult, UserProfile +if TYPE_CHECKING: + from httpx import Client + class BaseApiClient(abc.ABC): """ Abstract Base Class defining a generic contract for media database APIs. """ - def __init__(self, config: AnilistConfig | Any, client: Client): + def __init__(self, config: AnilistConfig | Any, client: "Client"): self.config = config self.http_client = client