From 02795a1ee68d6e05558dc5f76988efaf7afb8ed4 Mon Sep 17 00:00:00 2001 From: Shatakshi Mishra Date: Fri, 17 May 2024 15:54:43 +0530 Subject: [PATCH] Address ruff `TCH` (#1764) --- docs/_ext/regenerate_docs.py | 6 +++++- pyproject.toml | 3 --- src/ansible_navigator/action_base.py | 9 +++++++-- src/ansible_navigator/actions/__init__.py | 16 ++++++++++------ src/ansible_navigator/actions/_actions.py | 11 ++++++++--- src/ansible_navigator/actions/collections.py | 8 ++++++-- src/ansible_navigator/actions/config.py | 8 ++++++-- src/ansible_navigator/actions/doc.py | 8 ++++++-- src/ansible_navigator/actions/images.py | 8 ++++++-- src/ansible_navigator/actions/inventory.py | 8 ++++++-- src/ansible_navigator/actions/lint.py | 8 ++++++-- src/ansible_navigator/actions/open_file.py | 19 ++++++++++++------- src/ansible_navigator/actions/run.py | 11 ++++++++--- src/ansible_navigator/actions/settings.py | 6 +++++- src/ansible_navigator/actions/template.py | 8 ++++++-- src/ansible_navigator/app_public.py | 6 +++--- src/ansible_navigator/cli.py | 5 ++++- .../command_runner/command_runner.py | 10 +++++++--- .../configuration_subsystem/definitions.py | 3 ++- .../defs_presentable.py | 6 +++++- .../navigator_configuration.py | 9 +++++++-- .../navigator_post_processor.py | 6 +++++- .../data/catalog_collections.py | 5 ++++- .../data/image_introspect.py | 5 ++++- src/ansible_navigator/diagnostics.py | 15 ++++++++++----- src/ansible_navigator/image_manager/puller.py | 6 +++++- src/ansible_navigator/initialization.py | 6 +++++- src/ansible_navigator/logger.py | 6 +++++- src/ansible_navigator/runner/base.py | 5 ++++- src/ansible_navigator/steps.py | 8 ++++++-- src/ansible_navigator/tm_tokenize/compiler.py | 2 +- src/ansible_navigator/tm_tokenize/rules.py | 3 ++- .../ui_framework/colorize.py | 8 ++++++-- .../ui_framework/curses_window.py | 5 +++-- .../ui_framework/field_button.py | 11 ++++++++--- .../ui_framework/field_checks.py | 3 ++- .../ui_framework/field_curses_information.py | 11 ++++++++--- .../ui_framework/field_information.py | 9 +++++++-- .../ui_framework/field_radio.py | 10 +++++++--- .../ui_framework/field_text.py | 9 +++++++-- .../ui_framework/field_working.py | 9 +++++++-- src/ansible_navigator/ui_framework/form.py | 7 +++++-- .../ui_framework/form_handler_information.py | 4 ++-- .../ui_framework/form_handler_working.py | 4 ++-- .../ui_framework/menu_builder.py | 15 ++++++++++----- src/ansible_navigator/ui_framework/ui.py | 8 ++++++-- src/ansible_navigator/ui_framework/utils.py | 5 ++++- .../ui_framework/validators.py | 6 +++++- src/ansible_navigator/utils/dot_paths.py | 6 +++++- src/ansible_navigator/utils/functions.py | 8 ++++++-- src/ansible_navigator/utils/json_schema.py | 6 +++++- .../utils/key_value_store.py | 6 +++++- src/ansible_navigator/utils/print.py | 6 +++++- .../utils/version_migration/definitions.py | 8 ++++++-- tests/conftest.py | 11 ++++++++--- tests/integration/_action_run_test.py | 11 ++++++++--- tests/integration/_cli2runner.py | 6 +++--- tests/integration/_common.py | 8 ++++++-- tests/integration/_tmux_session.py | 9 +++++++-- tests/integration/actions/doc/base.py | 6 +++++- .../actions/doc/test_stdout_subprocess.py | 9 +++++++-- tests/integration/actions/exec/base.py | 6 +++++- tests/integration/actions/lint/base.py | 6 +++++- tests/integration/actions/run/base.py | 6 +++++- tests/integration/actions/run_unicode/base.py | 6 +++++- tests/integration/actions/templar/base.py | 6 +++++- tests/integration/conftest.py | 8 ++++++-- .../integration/diagnostics/test_from_cli.py | 11 ++++++++--- tests/integration/test_stdout_exit_codes.py | 11 ++++++++--- tests/unit/actions/run/test_artifact.py | 5 ++++- tests/unit/actions/run/test_runner_async.py | 5 ++++- .../unit/configuration_subsystem/conftest.py | 13 +++++++++---- .../test_json_schema.py | 6 +++++- .../test_precedence.py | 8 ++++++-- .../test_settings_effective.py | 8 ++++++-- tests/unit/logger/test_append.py | 6 +++++- tests/unit/logger/test_time_zone.py | 6 +++++- tests/unit/test_circular_imports.py | 8 ++++++-- tests/unit/ui_framework/test_colorize.py | 5 ++++- tests/unit/utils/test_dot_paths.py | 6 +++++- tests/unit/utils/test_serialize_dataclass.py | 8 ++++++-- 81 files changed, 453 insertions(+), 158 deletions(-) diff --git a/docs/_ext/regenerate_docs.py b/docs/_ext/regenerate_docs.py index 88c19725c..8ab8a29f4 100644 --- a/docs/_ext/regenerate_docs.py +++ b/docs/_ext/regenerate_docs.py @@ -7,15 +7,19 @@ from copy import copy from pathlib import Path from re import match +from typing import TYPE_CHECKING import mkdocs_gen_files from ansible_navigator.configuration_subsystem import Constants as C from ansible_navigator.configuration_subsystem import NavigatorConfiguration -from ansible_navigator.configuration_subsystem.definitions import SettingsEntry from ansible_navigator.utils.functions import oxfordcomma +if TYPE_CHECKING: + from ansible_navigator.configuration_subsystem.definitions import SettingsEntry + + logger = logging.getLogger(__name__) DOCS_DIR = Path(__file__).parent.resolve() diff --git a/pyproject.toml b/pyproject.toml index 685daeb33..64ed1f2fe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -347,9 +347,6 @@ ignore = [ 'S607', # Starting a process with a partial executable path 'SLF001', # Private member accessed: `_ui` 'T201', # `print` found - 'TCH001', # Move application import `ansible_navigator.configuration_subsystem.definitions.SettingsEntry` into a type-checking block - 'TCH002', # Move third-party import `ansible_runner.Runner` into a type-checking block - 'TCH003', # Move standard library import `re.Pattern` into a type-checking block 'TD001', # Invalid TODO tag: `FIXME` 'TD002', # Missing author in TODO 'TD003' # Missing issue link on the line following this TODO diff --git a/src/ansible_navigator/action_base.py b/src/ansible_navigator/action_base.py index 695c781f4..e7efa1f34 100644 --- a/src/ansible_navigator/action_base.py +++ b/src/ansible_navigator/action_base.py @@ -5,14 +5,13 @@ import logging from copy import deepcopy -from re import Pattern +from typing import TYPE_CHECKING from ansible_navigator.actions import kegexes from .action_defs import RunStdoutReturn from .app_public import AppPublic from .configuration_subsystem import Constants as C -from .configuration_subsystem.definitions import ApplicationConfiguration from .initialization import parse_and_update from .steps import Steps from .ui_framework import Interaction @@ -24,6 +23,12 @@ from .utils.definitions import LogMessage +if TYPE_CHECKING: + from re import Pattern + + from .configuration_subsystem.definitions import ApplicationConfiguration + + class ActionBase: # pylint: disable=too-many-instance-attributes """Base class for actions.""" diff --git a/src/ansible_navigator/actions/__init__.py b/src/ansible_navigator/actions/__init__.py index 4ae5587a0..6fdde1411 100644 --- a/src/ansible_navigator/actions/__init__.py +++ b/src/ansible_navigator/actions/__init__.py @@ -15,17 +15,21 @@ from __future__ import annotations -from collections.abc import Callable +from typing import TYPE_CHECKING from typing import Any -from ansible_navigator.action_defs import RunStdoutReturn -from ansible_navigator.app_public import AppPublic -from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration -from ansible_navigator.ui_framework import Interaction - from . import _actions as actions +if TYPE_CHECKING: + from collections.abc import Callable + + from ansible_navigator.action_defs import RunStdoutReturn + from ansible_navigator.app_public import AppPublic + from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration + from ansible_navigator.ui_framework import Interaction + + get: Callable[[str], Any] = actions.get_factory(__package__) names = actions.names_factory(__package__) diff --git a/src/ansible_navigator/actions/_actions.py b/src/ansible_navigator/actions/_actions.py index df2c2f3dc..029ff0793 100644 --- a/src/ansible_navigator/actions/_actions.py +++ b/src/ansible_navigator/actions/_actions.py @@ -9,15 +9,20 @@ import os import re -from collections.abc import Callable -from collections.abc import Generator +from typing import TYPE_CHECKING from typing import Any from typing import NamedTuple -from ansible_navigator.action_defs import RunStdoutReturn from ansible_navigator.ui_framework import error_notification +if TYPE_CHECKING: + from collections.abc import Callable + from collections.abc import Generator + + from ansible_navigator.action_defs import RunStdoutReturn + + logger = logging.getLogger(__name__) diff --git a/src/ansible_navigator/actions/collections.py b/src/ansible_navigator/actions/collections.py index 7833e81a1..cc1ed1f7c 100644 --- a/src/ansible_navigator/actions/collections.py +++ b/src/ansible_navigator/actions/collections.py @@ -11,12 +11,11 @@ from copy import deepcopy from json.decoder import JSONDecodeError from pathlib import Path +from typing import TYPE_CHECKING from typing import Any from ansible_navigator.action_base import ActionBase from ansible_navigator.action_defs import RunStdoutReturn -from ansible_navigator.app_public import AppPublic -from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration from ansible_navigator.content_defs import ContentFormat from ansible_navigator.runner import Command from ansible_navigator.steps import Step @@ -35,6 +34,11 @@ from . import run_action +if TYPE_CHECKING: + from ansible_navigator.app_public import AppPublic + from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration + + def color_menu(colno: int, colname: str, entry: dict[str, Any]) -> tuple[int, int]: """Provide a color for a collections menu entry in one column. diff --git a/src/ansible_navigator/actions/config.py b/src/ansible_navigator/actions/config.py index 0477de7c2..ac277b233 100644 --- a/src/ansible_navigator/actions/config.py +++ b/src/ansible_navigator/actions/config.py @@ -8,12 +8,11 @@ import shlex import shutil +from typing import TYPE_CHECKING from typing import Any from ansible_navigator.action_base import ActionBase from ansible_navigator.action_defs import RunStdoutReturn -from ansible_navigator.app_public import AppPublic -from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration from ansible_navigator.runner import AnsibleConfig from ansible_navigator.runner import Command from ansible_navigator.steps import Step @@ -30,6 +29,11 @@ from . import run_action +if TYPE_CHECKING: + from ansible_navigator.app_public import AppPublic + from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration + + def color_menu(colno: int, colname: str, entry: dict[str, Any]) -> tuple[int, int]: """Provide a color for a collections menu entry in one column. diff --git a/src/ansible_navigator/actions/doc.py b/src/ansible_navigator/actions/doc.py index e1213c7e8..d12f23fbb 100644 --- a/src/ansible_navigator/actions/doc.py +++ b/src/ansible_navigator/actions/doc.py @@ -8,13 +8,12 @@ import shlex import shutil +from typing import TYPE_CHECKING from typing import Any from ansible_navigator.action_base import ActionBase from ansible_navigator.action_defs import RunStdoutReturn -from ansible_navigator.app_public import AppPublic from ansible_navigator.configuration_subsystem import Constants as C -from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration from ansible_navigator.runner import AnsibleDoc from ansible_navigator.runner import Command from ansible_navigator.ui_framework import CursesLine @@ -25,6 +24,11 @@ from . import _actions as actions +if TYPE_CHECKING: + from ansible_navigator.app_public import AppPublic + from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration + + @actions.register class Action(ActionBase): """Doc subcommand implementation.""" diff --git a/src/ansible_navigator/actions/images.py b/src/ansible_navigator/actions/images.py index a73c00b8b..660b51230 100644 --- a/src/ansible_navigator/actions/images.py +++ b/src/ansible_navigator/actions/images.py @@ -8,13 +8,12 @@ from copy import deepcopy from functools import partial +from typing import TYPE_CHECKING from typing import Any from ansible_navigator.action_base import ActionBase from ansible_navigator.action_defs import RunStdoutReturn -from ansible_navigator.app_public import AppPublic from ansible_navigator.configuration_subsystem import Constants -from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration from ansible_navigator.content_defs import ContentFormat from ansible_navigator.image_manager import inspect_all from ansible_navigator.runner import Command @@ -31,6 +30,11 @@ from . import run_action +if TYPE_CHECKING: + from ansible_navigator.app_public import AppPublic + from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration + + def filter_content_keys(obj: dict[Any, Any]) -> dict[Any, Any]: """Filter out some keys when showing image content. diff --git a/src/ansible_navigator/actions/inventory.py b/src/ansible_navigator/actions/inventory.py index afd6743c4..8155d2fc8 100644 --- a/src/ansible_navigator/actions/inventory.py +++ b/src/ansible_navigator/actions/inventory.py @@ -9,12 +9,11 @@ import shutil from pathlib import Path +from typing import TYPE_CHECKING from typing import Any from ansible_navigator.action_base import ActionBase from ansible_navigator.action_defs import RunStdoutReturn -from ansible_navigator.app_public import AppPublic -from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration from ansible_navigator.content_defs import ContentFormat from ansible_navigator.runner import AnsibleInventory from ansible_navigator.runner import Command @@ -31,6 +30,11 @@ from . import run_action +if TYPE_CHECKING: + from ansible_navigator.app_public import AppPublic + from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration + + def color_menu(colno: int, colname: str, entry: dict[str, Any]) -> tuple[int, int]: """Provide a color for a inventory menu entry in one column. diff --git a/src/ansible_navigator/actions/lint.py b/src/ansible_navigator/actions/lint.py index af2efeb1c..2a9ac1579 100644 --- a/src/ansible_navigator/actions/lint.py +++ b/src/ansible_navigator/actions/lint.py @@ -24,12 +24,11 @@ from datetime import datetime from datetime import timezone from enum import IntEnum +from typing import TYPE_CHECKING from typing import Any from ansible_navigator.action_base import ActionBase from ansible_navigator.action_defs import RunStdoutReturn -from ansible_navigator.app_public import AppPublic -from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration from ansible_navigator.runner.command import Command from ansible_navigator.steps import Step from ansible_navigator.ui_framework import Color @@ -49,6 +48,11 @@ from . import run_action +if TYPE_CHECKING: + from ansible_navigator.app_public import AppPublic + from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration + + class Severity(IntEnum): """A mapping from ansible-lint severity to an integer represented internally. diff --git a/src/ansible_navigator/actions/open_file.py b/src/ansible_navigator/actions/open_file.py index 6fcca43c7..4fde3ae69 100644 --- a/src/ansible_navigator/actions/open_file.py +++ b/src/ansible_navigator/actions/open_file.py @@ -6,27 +6,32 @@ import logging import os -from collections.abc import Callable from pathlib import Path -from re import Pattern -from types import TracebackType +from typing import TYPE_CHECKING from typing import Any -from ansible_navigator.app_public import AppPublic -from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration from ansible_navigator.content_defs import ContentBase from ansible_navigator.content_defs import ContentFormat from ansible_navigator.content_defs import ContentType from ansible_navigator.content_defs import ContentView from ansible_navigator.content_defs import SerializationFormat -from ansible_navigator.ui_framework import Interaction -from ansible_navigator.ui_framework import Menu from ansible_navigator.utils.functions import remove_dbl_un from ansible_navigator.utils.serialize import serialize_write_temp_file from . import _actions as actions +if TYPE_CHECKING: + from collections.abc import Callable + from re import Pattern + from types import TracebackType + + from ansible_navigator.app_public import AppPublic + from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration + from ansible_navigator.ui_framework import Interaction + from ansible_navigator.ui_framework import Menu + + class SuspendCurses: """Context Manager to temporarily leave curses mode.""" diff --git a/src/ansible_navigator/actions/run.py b/src/ansible_navigator/actions/run.py index 35f8a48df..5d8b0a72a 100644 --- a/src/ansible_navigator/actions/run.py +++ b/src/ansible_navigator/actions/run.py @@ -12,19 +12,17 @@ import time import uuid -from collections.abc import Callable from math import floor from operator import itemgetter from pathlib import Path from queue import Queue +from typing import TYPE_CHECKING from typing import Any from ansible_navigator.action_base import ActionBase from ansible_navigator.action_defs import RunStdoutReturn -from ansible_navigator.app_public import AppPublic from ansible_navigator.configuration_subsystem import to_effective from ansible_navigator.configuration_subsystem import to_sources -from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration from ansible_navigator.content_defs import ContentView from ansible_navigator.content_defs import SerializationFormat from ansible_navigator.runner import CommandAsync @@ -51,6 +49,13 @@ from .stdout import Action as stdout_action +if TYPE_CHECKING: + from collections.abc import Callable + + from ansible_navigator.app_public import AppPublic + from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration + + RESULT_TO_COLOR = [ ("(?i)^failed$", 9), ("(?i)^ok$", 10), diff --git a/src/ansible_navigator/actions/settings.py b/src/ansible_navigator/actions/settings.py index 4e4333db2..b51fec56a 100644 --- a/src/ansible_navigator/actions/settings.py +++ b/src/ansible_navigator/actions/settings.py @@ -4,11 +4,11 @@ from dataclasses import asdict from functools import partial +from typing import TYPE_CHECKING from typing import Any from ansible_navigator.action_base import ActionBase from ansible_navigator.action_defs import RunStdoutReturn -from ansible_navigator.app_public import AppPublic from ansible_navigator.configuration_subsystem import PresentableSettingsEntries from ansible_navigator.configuration_subsystem import PresentableSettingsEntry from ansible_navigator.configuration_subsystem import to_effective @@ -33,6 +33,10 @@ from . import run_action +if TYPE_CHECKING: + from ansible_navigator.app_public import AppPublic + + def color_menu(colno: int, colname: str, entry: PresentableSettingsEntry) -> tuple[int, int]: """Color the menu. diff --git a/src/ansible_navigator/actions/template.py b/src/ansible_navigator/actions/template.py index b317926f2..3e023c9df 100644 --- a/src/ansible_navigator/actions/template.py +++ b/src/ansible_navigator/actions/template.py @@ -8,10 +8,9 @@ import html from collections.abc import Mapping +from typing import TYPE_CHECKING from ansible_navigator.action_base import ActionBase -from ansible_navigator.app_public import AppPublic -from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration from ansible_navigator.content_defs import ContentFormat from ansible_navigator.ui_framework import Interaction from ansible_navigator.ui_framework import warning_notification @@ -21,6 +20,11 @@ from . import _actions as actions +if TYPE_CHECKING: + from ansible_navigator.app_public import AppPublic + from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration + + @actions.register class Action(ActionBase): """Template command implementation.""" diff --git a/src/ansible_navigator/app_public.py b/src/ansible_navigator/app_public.py index 1a7cccaa9..ef5493425 100644 --- a/src/ansible_navigator/app_public.py +++ b/src/ansible_navigator/app_public.py @@ -5,15 +5,15 @@ from __future__ import annotations -from collections.abc import Callable from typing import TYPE_CHECKING from typing import NamedTuple -from .steps import Steps - if TYPE_CHECKING: + from collections.abc import Callable + from .configuration_subsystem.definitions import ApplicationConfiguration + from .steps import Steps class AppPublic(NamedTuple): diff --git a/src/ansible_navigator/cli.py b/src/ansible_navigator/cli.py index 0ac0b3060..0fac9e793 100644 --- a/src/ansible_navigator/cli.py +++ b/src/ansible_navigator/cli.py @@ -14,6 +14,7 @@ from importlib.util import find_spec from pathlib import Path from shutil import copyfile +from typing import TYPE_CHECKING from typing import Any from .action_defs import ActionReturn @@ -24,7 +25,6 @@ from .actions import run_action_stdout from .configuration_subsystem import Constants from .configuration_subsystem import NavigatorConfiguration -from .configuration_subsystem.definitions import ApplicationConfiguration from .image_manager import ImagePuller from .initialization import error_and_exit_early from .initialization import parse_and_update @@ -44,6 +44,9 @@ except ImportError: __version__ = Constants.NOT_SET +if TYPE_CHECKING: + from .configuration_subsystem.definitions import ApplicationConfiguration + APP_NAME = "ansible-navigator" PKG_NAME = "ansible_navigator" diff --git a/src/ansible_navigator/command_runner/command_runner.py b/src/ansible_navigator/command_runner/command_runner.py index 5f2c0de2f..c7b257bbf 100644 --- a/src/ansible_navigator/command_runner/command_runner.py +++ b/src/ansible_navigator/command_runner/command_runner.py @@ -5,13 +5,17 @@ import multiprocessing import subprocess -from collections.abc import Callable from dataclasses import dataclass from dataclasses import field -from queue import Queue +from typing import TYPE_CHECKING from typing import Any -from ansible_navigator.utils.definitions import LogMessage + +if TYPE_CHECKING: + from collections.abc import Callable + from queue import Queue + + from ansible_navigator.utils.definitions import LogMessage PROCESSES = (multiprocessing.cpu_count() - 1) or 1 diff --git a/src/ansible_navigator/configuration_subsystem/definitions.py b/src/ansible_navigator/configuration_subsystem/definitions.py index 0630f729f..207c9fc88 100644 --- a/src/ansible_navigator/configuration_subsystem/definitions.py +++ b/src/ansible_navigator/configuration_subsystem/definitions.py @@ -5,7 +5,6 @@ import copy import re -from collections.abc import Iterable from dataclasses import InitVar from dataclasses import dataclass from dataclasses import field @@ -21,6 +20,8 @@ if TYPE_CHECKING: + from collections.abc import Iterable + from .navigator_configuration import Internals from .navigator_post_processor import NavigatorPostProcessor diff --git a/src/ansible_navigator/configuration_subsystem/defs_presentable.py b/src/ansible_navigator/configuration_subsystem/defs_presentable.py index 62a199044..ae9fef775 100644 --- a/src/ansible_navigator/configuration_subsystem/defs_presentable.py +++ b/src/ansible_navigator/configuration_subsystem/defs_presentable.py @@ -4,6 +4,7 @@ from dataclasses import dataclass from dataclasses import field +from typing import TYPE_CHECKING from typing import Any from typing import ClassVar from typing import NewType @@ -14,10 +15,13 @@ from .definitions import CliParameters from .definitions import Constants as C from .definitions import SettingsEntry -from .navigator_configuration import Internals from .utils import create_settings_file_sample +if TYPE_CHECKING: + from .navigator_configuration import Internals + + PresentableSettingsEntryValue = bool | dict[Any, Any] | str | list[str] CliT = TypeVar("CliT", bound="PresentableCliParameters") EntT = TypeVar("EntT", bound="PresentableSettingsEntry") diff --git a/src/ansible_navigator/configuration_subsystem/navigator_configuration.py b/src/ansible_navigator/configuration_subsystem/navigator_configuration.py index 9572a3b01..b4891d102 100644 --- a/src/ansible_navigator/configuration_subsystem/navigator_configuration.py +++ b/src/ansible_navigator/configuration_subsystem/navigator_configuration.py @@ -7,14 +7,13 @@ from dataclasses import dataclass from dataclasses import field -from pathlib import Path +from typing import TYPE_CHECKING from ansible_navigator.utils.definitions import ExitMessage from ansible_navigator.utils.definitions import LogMessage from ansible_navigator.utils.functions import abs_user_path from ansible_navigator.utils.functions import generate_cache_path from ansible_navigator.utils.functions import oxfordcomma -from ansible_navigator.utils.key_value_store import KeyValueStore from ansible_navigator.utils.packaged_data import ImageEntry from .definitions import ApplicationConfiguration @@ -27,6 +26,12 @@ from .utils import AnsibleConfiguration +if TYPE_CHECKING: + from pathlib import Path + + from ansible_navigator.utils.key_value_store import KeyValueStore + + APP_NAME = "ansible_navigator" initialization_messages: list[LogMessage] = [] diff --git a/src/ansible_navigator/configuration_subsystem/navigator_post_processor.py b/src/ansible_navigator/configuration_subsystem/navigator_post_processor.py index 6f3bd3769..0986bde2c 100644 --- a/src/ansible_navigator/configuration_subsystem/navigator_post_processor.py +++ b/src/ansible_navigator/configuration_subsystem/navigator_post_processor.py @@ -12,12 +12,12 @@ import sys import zoneinfo -from collections.abc import Callable from functools import partialmethod from itertools import chain from itertools import repeat from pathlib import Path from string import Formatter +from typing import TYPE_CHECKING from typing import Any from ansible_navigator.utils.definitions import ExitMessage @@ -42,6 +42,10 @@ from .definitions import VolumeMountError +if TYPE_CHECKING: + from collections.abc import Callable + + def _post_processor(func: Callable[..., Any]) -> Callable[..., Any]: """Decorate a post processing function. diff --git a/src/ansible_navigator/data/catalog_collections.py b/src/ansible_navigator/data/catalog_collections.py index 9332329b9..209578593 100644 --- a/src/ansible_navigator/data/catalog_collections.py +++ b/src/ansible_navigator/data/catalog_collections.py @@ -14,7 +14,6 @@ from collections import Counter from collections import OrderedDict -from collections.abc import Generator from datetime import datetime from datetime import timezone from json.decoder import JSONDecodeError @@ -30,6 +29,10 @@ from yaml.error import YAMLError +if TYPE_CHECKING: + from collections.abc import Generator + + try: from yaml import CSafeLoader as SafeLoader except ImportError: diff --git a/src/ansible_navigator/data/image_introspect.py b/src/ansible_navigator/data/image_introspect.py index 607b4bc55..8382aa7d3 100644 --- a/src/ansible_navigator/data/image_introspect.py +++ b/src/ansible_navigator/data/image_introspect.py @@ -9,13 +9,16 @@ import sys import threading -from collections.abc import Callable from queue import Queue from types import SimpleNamespace +from typing import TYPE_CHECKING from typing import Any from typing import TypeAlias +if TYPE_CHECKING: + from collections.abc import Callable + # https://github.com/python/typing/issues/182#issuecomment-1320974824 JSONTypes: TypeAlias = dict[str, "JSONTypes"] | list["JSONTypes"] | str | int | float | bool | None diff --git a/src/ansible_navigator/diagnostics.py b/src/ansible_navigator/diagnostics.py index d29205382..45550ed1a 100644 --- a/src/ansible_navigator/diagnostics.py +++ b/src/ansible_navigator/diagnostics.py @@ -5,8 +5,6 @@ import sys import traceback -from collections.abc import Callable -from collections.abc import Iterator from dataclasses import asdict from dataclasses import dataclass from datetime import datetime @@ -14,6 +12,7 @@ from importlib.util import find_spec from pathlib import Path from sys import stdout +from typing import TYPE_CHECKING from typing import Any from .command_runner import Command @@ -21,13 +20,10 @@ from .configuration_subsystem import Constants from .configuration_subsystem import to_effective from .configuration_subsystem import to_sources -from .configuration_subsystem.definitions import ApplicationConfiguration from .data import image_introspect from .image_manager import introspector from .utils import ansi from .utils.compatibility import importlib_metadata -from .utils.definitions import ExitMessage -from .utils.definitions import LogMessage from .utils.functions import now_iso from .utils.functions import shlex_join from .utils.serialize import Loader @@ -35,6 +31,15 @@ from .utils.serialize import yaml +if TYPE_CHECKING: + from collections.abc import Callable + from collections.abc import Iterator + + from .configuration_subsystem.definitions import ApplicationConfiguration + from .utils.definitions import ExitMessage + from .utils.definitions import LogMessage + + JSONTypes = bool | int | str | dict[Any, Any] | list[Any] diff --git a/src/ansible_navigator/image_manager/puller.py b/src/ansible_navigator/image_manager/puller.py index 73a896b44..ab1808c39 100644 --- a/src/ansible_navigator/image_manager/puller.py +++ b/src/ansible_navigator/image_manager/puller.py @@ -7,15 +7,19 @@ import subprocess from dataclasses import dataclass +from typing import TYPE_CHECKING from typing import Any -from ansible_navigator.configuration_subsystem import Constants from ansible_navigator.utils.definitions import ExitMessage from ansible_navigator.utils.definitions import ExitPrefix from ansible_navigator.utils.definitions import LogMessage from ansible_navigator.utils.functions import shlex_join +if TYPE_CHECKING: + from ansible_navigator.configuration_subsystem import Constants + + @dataclass(frozen=False) class ImageAssessment: """Data structure containing the image assessment. diff --git a/src/ansible_navigator/initialization.py b/src/ansible_navigator/initialization.py index d2ec20e95..86bc1c21b 100644 --- a/src/ansible_navigator/initialization.py +++ b/src/ansible_navigator/initialization.py @@ -9,12 +9,12 @@ import os import sys +from typing import TYPE_CHECKING from typing import NoReturn from ._version_doc_cache import __version_collection_doc_cache__ as VERSION_CDC from .configuration_subsystem import Configurator from .configuration_subsystem import Constants as C -from .configuration_subsystem.definitions import ApplicationConfiguration from .diagnostics import DiagnosticsCollector from .utils.definitions import ExitMessage from .utils.definitions import ExitMessages @@ -26,6 +26,10 @@ from .utils.key_value_store import KeyValueStore +if TYPE_CHECKING: + from .configuration_subsystem.definitions import ApplicationConfiguration + + def error_and_exit_early(exit_messages: list[ExitMessage]) -> NoReturn: """Exit the application early. diff --git a/src/ansible_navigator/logger.py b/src/ansible_navigator/logger.py index 43fb982e7..f45c48fa7 100644 --- a/src/ansible_navigator/logger.py +++ b/src/ansible_navigator/logger.py @@ -7,10 +7,14 @@ import os import zoneinfo +from typing import TYPE_CHECKING from typing import Any from .configuration_subsystem import Constants -from .configuration_subsystem.definitions import ApplicationConfiguration + + +if TYPE_CHECKING: + from .configuration_subsystem.definitions import ApplicationConfiguration logger = logging.getLogger("ansible_navigator") diff --git a/src/ansible_navigator/runner/base.py b/src/ansible_navigator/runner/base.py index 46decde1e..26baf6777 100644 --- a/src/ansible_navigator/runner/base.py +++ b/src/ansible_navigator/runner/base.py @@ -11,9 +11,12 @@ import sys import tempfile +from typing import TYPE_CHECKING from typing import Any -from ansible_runner import Runner + +if TYPE_CHECKING: + from ansible_runner import Runner class Base: diff --git a/src/ansible_navigator/steps.py b/src/ansible_navigator/steps.py index eba6e6af8..f8b547e40 100644 --- a/src/ansible_navigator/steps.py +++ b/src/ansible_navigator/steps.py @@ -3,16 +3,20 @@ from __future__ import annotations from collections import deque -from collections.abc import Callable -from collections.abc import Sequence from dataclasses import dataclass from dataclasses import field from enum import Enum +from typing import TYPE_CHECKING from typing import Any from typing import Generic from typing import TypeVar +if TYPE_CHECKING: + from collections.abc import Callable + from collections.abc import Sequence + + class Step: # pylint: disable=too-many-instance-attributes # pylint: disable=too-many-arguments diff --git a/src/ansible_navigator/tm_tokenize/compiler.py b/src/ansible_navigator/tm_tokenize/compiler.py index 867eed3c7..f22ed4928 100644 --- a/src/ansible_navigator/tm_tokenize/compiler.py +++ b/src/ansible_navigator/tm_tokenize/compiler.py @@ -4,7 +4,6 @@ from typing import TYPE_CHECKING -from .fchainmap import FChainMap from .reg import make_regset from .rules import EndRule from .rules import Entry @@ -15,6 +14,7 @@ if TYPE_CHECKING: + from .fchainmap import FChainMap from .grammars import Grammar from .grammars import Grammars from .rules import Captures diff --git a/src/ansible_navigator/tm_tokenize/rules.py b/src/ansible_navigator/tm_tokenize/rules.py index 6ab405dfd..f49af9198 100644 --- a/src/ansible_navigator/tm_tokenize/rules.py +++ b/src/ansible_navigator/tm_tokenize/rules.py @@ -1,6 +1,5 @@ from __future__ import annotations -from re import Match from typing import TYPE_CHECKING from typing import Any from typing import NamedTuple @@ -21,6 +20,8 @@ if TYPE_CHECKING: + from re import Match + from .compiler import Compiler from .region import Scope diff --git a/src/ansible_navigator/ui_framework/colorize.py b/src/ansible_navigator/ui_framework/colorize.py index 131a69936..5b3f8b4ef 100644 --- a/src/ansible_navigator/ui_framework/colorize.py +++ b/src/ansible_navigator/ui_framework/colorize.py @@ -13,12 +13,11 @@ from itertools import chain from pathlib import Path +from typing import TYPE_CHECKING from typing import Any from ansible_navigator.tm_tokenize.grammars import Grammars -from ansible_navigator.tm_tokenize.region import Regions from ansible_navigator.tm_tokenize.tokenize import tokenize -from ansible_navigator.utils.compatibility import Traversable from .curses_defs import CursesLine from .curses_defs import CursesLinePart @@ -29,6 +28,11 @@ from .ui_constants import Decoration +if TYPE_CHECKING: + from ansible_navigator.tm_tokenize.region import Regions + from ansible_navigator.utils.compatibility import Traversable + + CURSES_STYLES = { 0: None, 1: getattr(curses, "A_BOLD", None), diff --git a/src/ansible_navigator/ui_framework/curses_window.py b/src/ansible_navigator/ui_framework/curses_window.py index b7457bcd9..8ca3a04ea 100644 --- a/src/ansible_navigator/ui_framework/curses_window.py +++ b/src/ansible_navigator/ui_framework/curses_window.py @@ -9,13 +9,14 @@ from typing import TYPE_CHECKING from .colorize import hex_to_rgb_curses -from .curses_defs import CursesLine -from .ui_config import UIConfig if TYPE_CHECKING: from _curses import _CursesWindow + from .curses_defs import CursesLine + from .ui_config import UIConfig + Window = _CursesWindow else: from typing import Any diff --git a/src/ansible_navigator/ui_framework/field_button.py b/src/ansible_navigator/ui_framework/field_button.py index a22e11f2a..34b14e3bf 100644 --- a/src/ansible_navigator/ui_framework/field_button.py +++ b/src/ansible_navigator/ui_framework/field_button.py @@ -2,16 +2,21 @@ from __future__ import annotations -from collections.abc import Callable from dataclasses import dataclass +from typing import TYPE_CHECKING from typing import Any -from .curses_window import Window -from .form_defs import FieldValidationStates from .form_handler_button import FormHandlerButton from .validators import FieldValidators +if TYPE_CHECKING: + from collections.abc import Callable + + from .curses_window import Window + from .form_defs import FieldValidationStates + + @dataclass class FieldButton: """A text input field.""" diff --git a/src/ansible_navigator/ui_framework/field_checks.py b/src/ansible_navigator/ui_framework/field_checks.py index 208629bc4..98c7eb5f5 100644 --- a/src/ansible_navigator/ui_framework/field_checks.py +++ b/src/ansible_navigator/ui_framework/field_checks.py @@ -4,7 +4,6 @@ import sys -from collections.abc import Callable from dataclasses import dataclass from dataclasses import field from functools import partial @@ -19,6 +18,8 @@ if TYPE_CHECKING: + from collections.abc import Callable + from ansible_navigator.ui_framework.curses_window import Window diff --git a/src/ansible_navigator/ui_framework/field_curses_information.py b/src/ansible_navigator/ui_framework/field_curses_information.py index dbda670ee..02f85ac48 100644 --- a/src/ansible_navigator/ui_framework/field_curses_information.py +++ b/src/ansible_navigator/ui_framework/field_curses_information.py @@ -2,18 +2,23 @@ from __future__ import annotations -from collections.abc import Callable from dataclasses import dataclass +from typing import TYPE_CHECKING from typing import Any -from .curses_defs import CursesLines -from .curses_window import Window from .form_handler_information import FormHandlerInformation from .sentinels import Unknown from .sentinels import unknown from .validators import FieldValidators +if TYPE_CHECKING: + from collections.abc import Callable + + from .curses_defs import CursesLines + from .curses_window import Window + + @dataclass class FieldCursesInformation: """An information field made of curses lines.""" diff --git a/src/ansible_navigator/ui_framework/field_information.py b/src/ansible_navigator/ui_framework/field_information.py index ca265245a..97e79a4bc 100644 --- a/src/ansible_navigator/ui_framework/field_information.py +++ b/src/ansible_navigator/ui_framework/field_information.py @@ -2,17 +2,22 @@ from __future__ import annotations -from collections.abc import Callable from dataclasses import dataclass +from typing import TYPE_CHECKING from typing import Any -from .curses_window import Window from .form_handler_information import FormHandlerInformation from .sentinels import Unknown from .sentinels import unknown from .validators import FieldValidators +if TYPE_CHECKING: + from collections.abc import Callable + + from .curses_window import Window + + @dataclass class FieldInformation: """A text input field.""" diff --git a/src/ansible_navigator/ui_framework/field_radio.py b/src/ansible_navigator/ui_framework/field_radio.py index 1575cf067..2b6e862a7 100644 --- a/src/ansible_navigator/ui_framework/field_radio.py +++ b/src/ansible_navigator/ui_framework/field_radio.py @@ -2,14 +2,12 @@ from __future__ import annotations -from collections.abc import Callable from dataclasses import dataclass from dataclasses import field from functools import partial +from typing import TYPE_CHECKING from typing import Any -from ansible_navigator.ui_framework.curses_window import Window - from .form_handler_options import FormHandlerOptions from .sentinels import Unknown from .sentinels import unknown @@ -17,6 +15,12 @@ from .validators import Validation +if TYPE_CHECKING: + from collections.abc import Callable + + from ansible_navigator.ui_framework.curses_window import Window + + @dataclass class FieldRadio: """A form field containing radios.""" diff --git a/src/ansible_navigator/ui_framework/field_text.py b/src/ansible_navigator/ui_framework/field_text.py index 560d6b2f2..324e8d6e9 100644 --- a/src/ansible_navigator/ui_framework/field_text.py +++ b/src/ansible_navigator/ui_framework/field_text.py @@ -2,11 +2,10 @@ from __future__ import annotations -from collections.abc import Callable from dataclasses import dataclass +from typing import TYPE_CHECKING from typing import Any -from .curses_window import Window from .form_handler_text import FormHandlerText from .sentinels import Unknown from .sentinels import nonexistent @@ -14,6 +13,12 @@ from .validators import FieldValidators +if TYPE_CHECKING: + from collections.abc import Callable + + from .curses_window import Window + + @dataclass class FieldText: # pylint: disable=too-many-instance-attributes diff --git a/src/ansible_navigator/ui_framework/field_working.py b/src/ansible_navigator/ui_framework/field_working.py index 73f8395f2..c9b525877 100644 --- a/src/ansible_navigator/ui_framework/field_working.py +++ b/src/ansible_navigator/ui_framework/field_working.py @@ -2,17 +2,22 @@ from __future__ import annotations -from collections.abc import Callable from dataclasses import dataclass +from typing import TYPE_CHECKING from typing import Any -from .curses_window import Window from .form_handler_working import FormHandlerWorking from .sentinels import Unknown from .sentinels import unknown from .validators import FieldValidators +if TYPE_CHECKING: + from collections.abc import Callable + + from .curses_window import Window + + @dataclass class FieldWorking: """A text input field.""" diff --git a/src/ansible_navigator/ui_framework/form.py b/src/ansible_navigator/ui_framework/form.py index 7648413a1..aed3ba6d8 100644 --- a/src/ansible_navigator/ui_framework/form.py +++ b/src/ansible_navigator/ui_framework/form.py @@ -7,10 +7,9 @@ from curses import ascii as curses_ascii from dataclasses import dataclass from dataclasses import field +from typing import TYPE_CHECKING from typing import Any -from ansible_navigator.ui_framework.ui_config import UIConfig - from .curses_defs import CursesLine from .curses_defs import CursesLinePart from .curses_defs import CursesLines @@ -29,6 +28,10 @@ from .validators import FormValidators +if TYPE_CHECKING: + from ansible_navigator.ui_framework.ui_config import UIConfig + + @dataclass class Form: """Simple abstraction to hold the fields of the form and a convenience method to present it.""" diff --git a/src/ansible_navigator/ui_framework/form_handler_information.py b/src/ansible_navigator/ui_framework/form_handler_information.py index c7d246833..6d2462a70 100644 --- a/src/ansible_navigator/ui_framework/form_handler_information.py +++ b/src/ansible_navigator/ui_framework/form_handler_information.py @@ -6,13 +6,13 @@ from typing import TYPE_CHECKING from typing import Any -from ansible_navigator.ui_framework.ui_config import UIConfig - from .curses_window import CursesWindow from .curses_window import Window if TYPE_CHECKING: + from ansible_navigator.ui_framework.ui_config import UIConfig + from .field_information import FieldInformation diff --git a/src/ansible_navigator/ui_framework/form_handler_working.py b/src/ansible_navigator/ui_framework/form_handler_working.py index 67f623f3d..556568335 100644 --- a/src/ansible_navigator/ui_framework/form_handler_working.py +++ b/src/ansible_navigator/ui_framework/form_handler_working.py @@ -4,13 +4,13 @@ from typing import TYPE_CHECKING -from ansible_navigator.ui_framework.ui_config import UIConfig - from .curses_window import CursesWindow from .curses_window import Window if TYPE_CHECKING: + from ansible_navigator.ui_framework.ui_config import UIConfig + from .field_working import FieldWorking diff --git a/src/ansible_navigator/ui_framework/menu_builder.py b/src/ansible_navigator/ui_framework/menu_builder.py index 7cf905a2e..5ccb68185 100644 --- a/src/ansible_navigator/ui_framework/menu_builder.py +++ b/src/ansible_navigator/ui_framework/menu_builder.py @@ -6,20 +6,25 @@ import enum import re -from collections.abc import Callable +from typing import TYPE_CHECKING from typing import Any -from ansible_navigator.content_defs import ContentBase -from ansible_navigator.content_defs import ContentTypeSequence - from .curses_defs import CursesLine from .curses_defs import CursesLinePart from .curses_defs import CursesLines -from .ui_config import UIConfig from .utils import convert_percentage from .utils import distribute +if TYPE_CHECKING: + from collections.abc import Callable + + from ansible_navigator.content_defs import ContentBase + from ansible_navigator.content_defs import ContentTypeSequence + + from .ui_config import UIConfig + + class MenuBuilder: """Build a menu from list of dicts.""" diff --git a/src/ansible_navigator/ui_framework/ui.py b/src/ansible_navigator/ui_framework/ui.py index 3dd506a97..f21255b16 100644 --- a/src/ansible_navigator/ui_framework/ui.py +++ b/src/ansible_navigator/ui_framework/ui.py @@ -15,6 +15,7 @@ from math import floor from re import Match from re import Pattern +from typing import TYPE_CHECKING from typing import Any from typing import NamedTuple from typing import Protocol @@ -36,14 +37,17 @@ from .curses_window import CursesWindow from .curses_window import Window from .field_text import FieldText -from .form import Form from .form_handler_text import FormHandlerText from .form_utils import warning_notification from .menu_builder import MenuBuilder -from .ui_config import UIConfig from .ui_constants import Decoration +if TYPE_CHECKING: + from .form import Form + from .ui_config import UIConfig + + STANDARD_KEYS = { "^b/PgUp": "page up", "^f/PgDn": "page down", diff --git a/src/ansible_navigator/ui_framework/utils.py b/src/ansible_navigator/ui_framework/utils.py index 353840108..601830bff 100644 --- a/src/ansible_navigator/ui_framework/utils.py +++ b/src/ansible_navigator/ui_framework/utils.py @@ -7,9 +7,12 @@ from dataclasses import is_dataclass from math import floor +from typing import TYPE_CHECKING from typing import Any -from ansible_navigator.content_defs import ContentBase + +if TYPE_CHECKING: + from ansible_navigator.content_defs import ContentBase def convert_percentage( diff --git a/src/ansible_navigator/ui_framework/validators.py b/src/ansible_navigator/ui_framework/validators.py index d35e7b5aa..6bcb6d4b6 100644 --- a/src/ansible_navigator/ui_framework/validators.py +++ b/src/ansible_navigator/ui_framework/validators.py @@ -6,15 +6,19 @@ from collections.abc import Iterable from random import randrange +from typing import TYPE_CHECKING from typing import Any from typing import NamedTuple from urllib.parse import urlparse -from .form_defs import FieldValidationStates from .sentinels import Unknown from .sentinels import unknown +if TYPE_CHECKING: + from .form_defs import FieldValidationStates + + class Validation(NamedTuple): """The response from a validation.""" diff --git a/src/ansible_navigator/utils/dot_paths.py b/src/ansible_navigator/utils/dot_paths.py index 8ab13ab79..caa2e5e3e 100644 --- a/src/ansible_navigator/utils/dot_paths.py +++ b/src/ansible_navigator/utils/dot_paths.py @@ -5,12 +5,16 @@ import copy import operator -from collections.abc import MutableMapping from enum import Enum from functools import reduce +from typing import TYPE_CHECKING from typing import Any +if TYPE_CHECKING: + from collections.abc import MutableMapping + + class MergeBehaviors(Enum): """The merge behaviors.""" diff --git a/src/ansible_navigator/utils/functions.py b/src/ansible_navigator/utils/functions.py index 33b524f63..53a4914ae 100644 --- a/src/ansible_navigator/utils/functions.py +++ b/src/ansible_navigator/utils/functions.py @@ -13,9 +13,8 @@ import shutil import zoneinfo -from collections.abc import Iterable -from collections.abc import Mapping from pathlib import Path +from typing import TYPE_CHECKING from typing import Any from jinja2 import Environment @@ -27,6 +26,11 @@ from .definitions import LogMessage +if TYPE_CHECKING: + from collections.abc import Iterable + from collections.abc import Mapping + + logger = logging.getLogger(__name__) diff --git a/src/ansible_navigator/utils/json_schema.py b/src/ansible_navigator/utils/json_schema.py index 6224533e8..f12984315 100644 --- a/src/ansible_navigator/utils/json_schema.py +++ b/src/ansible_navigator/utils/json_schema.py @@ -4,8 +4,8 @@ import json -from collections import deque from dataclasses import dataclass +from typing import TYPE_CHECKING from typing import Any from jsonschema import SchemaError @@ -15,6 +15,10 @@ from .definitions import ExitMessage +if TYPE_CHECKING: + from collections import deque + + def to_path(schema_path: deque[Any]) -> str: """Flatten a path to a dot delimited string. diff --git a/src/ansible_navigator/utils/key_value_store.py b/src/ansible_navigator/utils/key_value_store.py index 7ec9ed9b2..858b362a9 100644 --- a/src/ansible_navigator/utils/key_value_store.py +++ b/src/ansible_navigator/utils/key_value_store.py @@ -9,7 +9,11 @@ from collections.abc import KeysView from collections.abc import MutableMapping from collections.abc import ValuesView -from pathlib import Path +from typing import TYPE_CHECKING + + +if TYPE_CHECKING: + from pathlib import Path class KVSKeysView(KeysView[str]): diff --git a/src/ansible_navigator/utils/print.py b/src/ansible_navigator/utils/print.py index a84f1f94e..436e21319 100644 --- a/src/ansible_navigator/utils/print.py +++ b/src/ansible_navigator/utils/print.py @@ -7,6 +7,7 @@ import os from sys import stdout +from typing import TYPE_CHECKING from ansible_navigator.constants import GRAMMAR_DIR from ansible_navigator.constants import THEME_PATH @@ -15,10 +16,13 @@ from ansible_navigator.content_defs import ContentView from ansible_navigator.ui_framework.colorize import Colorize from ansible_navigator.ui_framework.colorize import rgb_to_ansi -from ansible_navigator.ui_framework.curses_defs import SimpleLinePart from ansible_navigator.utils.serialize import serialize +if TYPE_CHECKING: + from ansible_navigator.ui_framework.curses_defs import SimpleLinePart + + logger = logging.getLogger(__name__) diff --git a/src/ansible_navigator/utils/version_migration/definitions.py b/src/ansible_navigator/utils/version_migration/definitions.py index 5a151f033..83775b0fc 100644 --- a/src/ansible_navigator/utils/version_migration/definitions.py +++ b/src/ansible_navigator/utils/version_migration/definitions.py @@ -4,9 +4,8 @@ import contextlib -from collections.abc import Callable from enum import Enum -from pathlib import Path +from typing import TYPE_CHECKING from typing import Any from typing import Generic from typing import TypeVar @@ -18,6 +17,11 @@ from ansible_navigator.utils.ansi import working +if TYPE_CHECKING: + from collections.abc import Callable + from pathlib import Path + + class MigrationType(Enum): """Enum for the type of migration.""" diff --git a/tests/conftest.py b/tests/conftest.py index 13e3cf070..f062475fa 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -11,17 +11,15 @@ import subprocess import sys -from collections.abc import Callable -from collections.abc import Generator from copy import deepcopy from functools import lru_cache from pathlib import Path +from typing import TYPE_CHECKING from typing import Protocol import pytest from ansible_navigator.configuration_subsystem import to_sample -from ansible_navigator.configuration_subsystem.definitions import SettingsFileType from ansible_navigator.configuration_subsystem.navigator_configuration import APP_NAME from ansible_navigator.configuration_subsystem.navigator_configuration import NavigatorConfiguration from ansible_navigator.configuration_subsystem.utils import parse_ansible_verison @@ -38,6 +36,13 @@ from .defaults import FIXTURES_DIR +if TYPE_CHECKING: + from collections.abc import Callable + from collections.abc import Generator + + from ansible_navigator.configuration_subsystem.definitions import SettingsFileType + + # implicit verbosity, updated at runtime VERBOSITY = 0 diff --git a/tests/integration/_action_run_test.py b/tests/integration/_action_run_test.py index b12095b15..59f676684 100644 --- a/tests/integration/_action_run_test.py +++ b/tests/integration/_action_run_test.py @@ -7,23 +7,28 @@ import sys import tempfile -from collections.abc import Callable from copy import deepcopy +from typing import TYPE_CHECKING from typing import Any -from ansible_navigator.action_defs import RunStdoutReturn from ansible_navigator.app_public import AppPublic from ansible_navigator.configuration_subsystem import Constants as C from ansible_navigator.configuration_subsystem import NavigatorConfiguration from ansible_navigator.content_defs import ContentFormat from ansible_navigator.content_defs import ContentType from ansible_navigator.steps import Steps -from ansible_navigator.ui_framework.form import Form from ansible_navigator.ui_framework.ui import Action as Ui_action from ansible_navigator.ui_framework.ui import Interaction from ansible_navigator.ui_framework.ui import Ui +if TYPE_CHECKING: + from collections.abc import Callable + + from ansible_navigator.action_defs import RunStdoutReturn + from ansible_navigator.ui_framework.form import Form + + class ActionRunTest: # pylint: disable=too-many-instance-attributes # pylint: disable=too-many-arguments diff --git a/tests/integration/_cli2runner.py b/tests/integration/_cli2runner.py index e035bb478..fe4ffd23b 100644 --- a/tests/integration/_cli2runner.py +++ b/tests/integration/_cli2runner.py @@ -2,17 +2,17 @@ from __future__ import annotations -from pathlib import Path from typing import TYPE_CHECKING import pytest -from pytest_mock import MockerFixture - if TYPE_CHECKING: + from pathlib import Path from unittest.mock import MagicMock # pylint: disable=preferred-module + from pytest_mock import MockerFixture + class RunnerTestError(Exception): """Custom exception for runner to throw.""" diff --git a/tests/integration/_common.py b/tests/integration/_common.py index b1cdcc222..40b8b45d8 100644 --- a/tests/integration/_common.py +++ b/tests/integration/_common.py @@ -8,12 +8,16 @@ import shutil import sys -from collections.abc import Callable from dataclasses import dataclass from pathlib import Path +from typing import TYPE_CHECKING from typing import Any -import pytest + +if TYPE_CHECKING: + from collections.abc import Callable + + import pytest from tests import defaults diff --git a/tests/integration/_tmux_session.py b/tests/integration/_tmux_session.py index 039a40a04..4e0247c35 100644 --- a/tests/integration/_tmux_session.py +++ b/tests/integration/_tmux_session.py @@ -6,17 +6,22 @@ import os import shlex import time -import types import uuid import warnings from pathlib import Path from timeit import default_timer as timer +from typing import TYPE_CHECKING from typing import TypedDict import libtmux import libtmux.exc -import pytest + + +if TYPE_CHECKING: + import types + + import pytest from ._common import generate_test_log_dir diff --git a/tests/integration/actions/doc/base.py b/tests/integration/actions/doc/base.py index b139b30a9..6f6855ca4 100644 --- a/tests/integration/actions/doc/base.py +++ b/tests/integration/actions/doc/base.py @@ -5,7 +5,7 @@ import difflib import os -from collections.abc import Generator +from typing import TYPE_CHECKING import pytest @@ -15,6 +15,10 @@ from tests.integration._tmux_session import TmuxSession +if TYPE_CHECKING: + from collections.abc import Generator + + class BaseClass: """Base class for interactive/stdout doc tests.""" diff --git a/tests/integration/actions/doc/test_stdout_subprocess.py b/tests/integration/actions/doc/test_stdout_subprocess.py index 5514c856f..9db6c3f66 100644 --- a/tests/integration/actions/doc/test_stdout_subprocess.py +++ b/tests/integration/actions/doc/test_stdout_subprocess.py @@ -3,16 +3,21 @@ from __future__ import annotations from dataclasses import dataclass -from pathlib import Path +from typing import TYPE_CHECKING import pytest from ansible_navigator.utils.functions import shlex_join -from tests.conftest import TCmdInTty from tests.defaults import BaseScenario from tests.defaults import id_func +if TYPE_CHECKING: + from pathlib import Path + + from tests.conftest import TCmdInTty + + BUILTINS = ( "validate_argument_spec", "wait_for_connection", diff --git a/tests/integration/actions/exec/base.py b/tests/integration/actions/exec/base.py index 4eed4c8c7..b34997516 100644 --- a/tests/integration/actions/exec/base.py +++ b/tests/integration/actions/exec/base.py @@ -5,8 +5,8 @@ import difflib import os -from collections.abc import Generator from pathlib import Path +from typing import TYPE_CHECKING import pytest @@ -19,6 +19,10 @@ from tests.integration._tmux_session import TmuxSessionKwargs +if TYPE_CHECKING: + from collections.abc import Generator + + TEST_FIXTURE_DIR = Path(FIXTURES_DIR, "integration", "actions", "exec") TEST_CONFIG_FILE = Path(TEST_FIXTURE_DIR, "ansible-navigator.yaml") diff --git a/tests/integration/actions/lint/base.py b/tests/integration/actions/lint/base.py index 2e0c0b05c..5136cc057 100644 --- a/tests/integration/actions/lint/base.py +++ b/tests/integration/actions/lint/base.py @@ -5,7 +5,7 @@ import difflib import os -from collections.abc import Generator +from typing import TYPE_CHECKING import pytest @@ -18,6 +18,10 @@ from tests.integration._tmux_session import TmuxSessionKwargs +if TYPE_CHECKING: + from collections.abc import Generator + + LINT_FIXTURES = os.path.join( FIXTURES_DIR, "integration", diff --git a/tests/integration/actions/run/base.py b/tests/integration/actions/run/base.py index 4ab976398..795d010af 100644 --- a/tests/integration/actions/run/base.py +++ b/tests/integration/actions/run/base.py @@ -5,7 +5,7 @@ import difflib import os -from collections.abc import Generator +from typing import TYPE_CHECKING import pytest @@ -18,6 +18,10 @@ from tests.integration._tmux_session import TmuxSessionKwargs +if TYPE_CHECKING: + from collections.abc import Generator + + # run playbook run_fixture_dir = os.path.join(FIXTURES_DIR, "integration", "actions", "run") inventory_path = os.path.join(run_fixture_dir, "inventory") diff --git a/tests/integration/actions/run_unicode/base.py b/tests/integration/actions/run_unicode/base.py index 179e7f6ab..3a052a56d 100644 --- a/tests/integration/actions/run_unicode/base.py +++ b/tests/integration/actions/run_unicode/base.py @@ -5,7 +5,7 @@ import difflib import os -from collections.abc import Generator +from typing import TYPE_CHECKING import pytest @@ -18,6 +18,10 @@ from tests.integration._tmux_session import TmuxSessionKwargs +if TYPE_CHECKING: + from collections.abc import Generator + + # run playbook run_fixture_dir = os.path.join(FIXTURES_DIR, "integration", "actions", "run_unicode") inventory_path = os.path.join(run_fixture_dir, "inventory") diff --git a/tests/integration/actions/templar/base.py b/tests/integration/actions/templar/base.py index 5aea57372..49690ec60 100644 --- a/tests/integration/actions/templar/base.py +++ b/tests/integration/actions/templar/base.py @@ -5,8 +5,8 @@ import difflib import os -from collections.abc import Generator from copy import copy +from typing import TYPE_CHECKING import pytest @@ -19,6 +19,10 @@ from tests.integration._tmux_session import TmuxSessionKwargs +if TYPE_CHECKING: + from collections.abc import Generator + + # run playbook run_fixture_dir = os.path.join(FIXTURES_DIR, "integration", "actions", "run") inventory_path = os.path.join(run_fixture_dir, "inventory") diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 401c30bf6..8c260863e 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -4,9 +4,8 @@ import os -from collections.abc import Generator from copy import deepcopy -from pathlib import Path +from typing import TYPE_CHECKING import pytest @@ -22,6 +21,11 @@ from ._common import generate_test_log_dir +if TYPE_CHECKING: + from collections.abc import Generator + from pathlib import Path + + EXECUTION_MODES = ["interactive", "stdout"] diff --git a/tests/integration/diagnostics/test_from_cli.py b/tests/integration/diagnostics/test_from_cli.py index 4ae04c9f9..338b32ad1 100644 --- a/tests/integration/diagnostics/test_from_cli.py +++ b/tests/integration/diagnostics/test_from_cli.py @@ -6,11 +6,16 @@ import os import subprocess -from pathlib import Path +from typing import TYPE_CHECKING -import pytest -from ansible_navigator.configuration_subsystem.definitions import SettingsFileType +if TYPE_CHECKING: + from pathlib import Path + + import pytest + + from ansible_navigator.configuration_subsystem.definitions import SettingsFileType + from ansible_navigator.utils.functions import remove_ansi diff --git a/tests/integration/test_stdout_exit_codes.py b/tests/integration/test_stdout_exit_codes.py index 4decdc7ba..51b85059c 100644 --- a/tests/integration/test_stdout_exit_codes.py +++ b/tests/integration/test_stdout_exit_codes.py @@ -4,19 +4,24 @@ import os -from collections.abc import Iterable from pathlib import Path +from typing import TYPE_CHECKING from typing import Any from typing import NamedTuple import pytest from ansible_navigator.utils.functions import shlex_join -from tests.conftest import TCmdInTty from tests.defaults import FIXTURES_DIR from tests.defaults import id_func -from ._action_run_test import ActionRunTest + +if TYPE_CHECKING: + from collections.abc import Iterable + + from tests.conftest import TCmdInTty + + from ._action_run_test import ActionRunTest PLAYBOOK = os.path.join(FIXTURES_DIR, "integration", "stdout_exit_codes", "site.yml") diff --git a/tests/unit/actions/run/test_artifact.py b/tests/unit/actions/run/test_artifact.py index ed33ac057..009a04f02 100644 --- a/tests/unit/actions/run/test_artifact.py +++ b/tests/unit/actions/run/test_artifact.py @@ -9,11 +9,14 @@ from copy import deepcopy from dataclasses import dataclass from re import Pattern +from typing import TYPE_CHECKING from typing import Any import pytest -from pytest_mock import MockerFixture + +if TYPE_CHECKING: + from pytest_mock import MockerFixture from ansible_navigator.actions.run import Action as action from ansible_navigator.configuration_subsystem import NavigatorConfiguration diff --git a/tests/unit/actions/run/test_runner_async.py b/tests/unit/actions/run/test_runner_async.py index b777fbf56..16f01d3c1 100644 --- a/tests/unit/actions/run/test_runner_async.py +++ b/tests/unit/actions/run/test_runner_async.py @@ -6,11 +6,14 @@ from dataclasses import dataclass from pathlib import Path from queue import Queue +from typing import TYPE_CHECKING from typing import Any import pytest -from pytest_mock import MockerFixture + +if TYPE_CHECKING: + from pytest_mock import MockerFixture from ansible_navigator.actions.run import Action as action from ansible_navigator.configuration_subsystem import NavigatorConfiguration diff --git a/tests/unit/configuration_subsystem/conftest.py b/tests/unit/configuration_subsystem/conftest.py index c07ed041f..e936bee6f 100644 --- a/tests/unit/configuration_subsystem/conftest.py +++ b/tests/unit/configuration_subsystem/conftest.py @@ -4,28 +4,33 @@ import os -from collections.abc import Callable from copy import deepcopy +from typing import TYPE_CHECKING from typing import Any from typing import NamedTuple from typing import Protocol import pytest -from ansible_navigator.command_runner import Command from ansible_navigator.command_runner.command_runner import run_command from ansible_navigator.configuration_subsystem import to_schema from ansible_navigator.configuration_subsystem.configurator import Configurator from ansible_navigator.configuration_subsystem.definitions import ApplicationConfiguration from ansible_navigator.configuration_subsystem.definitions import SettingsSchemaType from ansible_navigator.configuration_subsystem.navigator_configuration import NavigatorConfiguration -from ansible_navigator.utils.definitions import ExitMessage -from ansible_navigator.utils.definitions import LogMessage from ansible_navigator.utils.serialize import Loader from ansible_navigator.utils.serialize import yaml from tests.defaults import FIXTURES_DIR +if TYPE_CHECKING: + from collections.abc import Callable + + from ansible_navigator.command_runner import Command + from ansible_navigator.utils.definitions import ExitMessage + from ansible_navigator.utils.definitions import LogMessage + + TEST_FIXTURE_DIR = os.path.join(FIXTURES_DIR, "unit", "configuration_subsystem") diff --git a/tests/unit/configuration_subsystem/test_json_schema.py b/tests/unit/configuration_subsystem/test_json_schema.py index 7ceac5384..352f33220 100644 --- a/tests/unit/configuration_subsystem/test_json_schema.py +++ b/tests/unit/configuration_subsystem/test_json_schema.py @@ -4,6 +4,7 @@ from copy import deepcopy from pathlib import Path +from typing import TYPE_CHECKING from typing import Any import pytest @@ -13,13 +14,16 @@ from ansible_navigator.configuration_subsystem import NavigatorConfiguration from ansible_navigator.configuration_subsystem import to_sample -from ansible_navigator.configuration_subsystem.definitions import SettingsSchemaType from ansible_navigator.utils.serialize import Loader from ansible_navigator.utils.serialize import yaml from .defaults import TEST_FIXTURE_DIR +if TYPE_CHECKING: + from ansible_navigator.configuration_subsystem.definitions import SettingsSchemaType + + def test_basic(schema_dict: SettingsSchemaType) -> None: """Simple test to ensure an exception isn't raised. diff --git a/tests/unit/configuration_subsystem/test_precedence.py b/tests/unit/configuration_subsystem/test_precedence.py index 53c267031..d4ec0d808 100644 --- a/tests/unit/configuration_subsystem/test_precedence.py +++ b/tests/unit/configuration_subsystem/test_precedence.py @@ -4,7 +4,7 @@ import shlex -from collections.abc import Iterable +from typing import TYPE_CHECKING from typing import Any import pytest @@ -13,7 +13,6 @@ from ansible_navigator.configuration_subsystem.definitions import SettingsEntry from ansible_navigator.configuration_subsystem.navigator_configuration import NavigatorConfiguration -from .conftest import GenerateConfigCallable from .data import BASE_EXPECTED from .data import BASE_LONG_CLI from .data import BASE_SHORT_CLI @@ -25,6 +24,11 @@ from .utils import id_for_name +if TYPE_CHECKING: + from collections.abc import Iterable + + from .conftest import GenerateConfigCallable + # pylint: disable=too-many-arguments diff --git a/tests/unit/configuration_subsystem/test_settings_effective.py b/tests/unit/configuration_subsystem/test_settings_effective.py index 7bf658947..3ba8db695 100644 --- a/tests/unit/configuration_subsystem/test_settings_effective.py +++ b/tests/unit/configuration_subsystem/test_settings_effective.py @@ -6,10 +6,14 @@ from copy import deepcopy from functools import reduce -from pathlib import Path +from typing import TYPE_CHECKING from typing import Any -import pytest + +if TYPE_CHECKING: + from pathlib import Path + + import pytest from ansible_navigator.configuration_subsystem import Configurator from ansible_navigator.configuration_subsystem import Constants diff --git a/tests/unit/logger/test_append.py b/tests/unit/logger/test_append.py index 2429ca09a..f1eab1127 100644 --- a/tests/unit/logger/test_append.py +++ b/tests/unit/logger/test_append.py @@ -3,7 +3,7 @@ from __future__ import annotations from dataclasses import dataclass -from pathlib import Path +from typing import TYPE_CHECKING from typing import Any import pytest @@ -13,6 +13,10 @@ from tests.defaults import id_func +if TYPE_CHECKING: + from pathlib import Path + + @dataclass class Scenario(BaseScenario): """Data for the log append tests.""" diff --git a/tests/unit/logger/test_time_zone.py b/tests/unit/logger/test_time_zone.py index c04e225ee..25b7b8678 100644 --- a/tests/unit/logger/test_time_zone.py +++ b/tests/unit/logger/test_time_zone.py @@ -5,8 +5,8 @@ import re from dataclasses import dataclass -from pathlib import Path from re import Pattern +from typing import TYPE_CHECKING from typing import Any import pytest @@ -15,6 +15,10 @@ from tests.defaults import BaseScenario +if TYPE_CHECKING: + from pathlib import Path + + @dataclass class Scenario(BaseScenario): """Data for time zone support in the logs.""" diff --git a/tests/unit/test_circular_imports.py b/tests/unit/test_circular_imports.py index 76d01e882..7f702ebbb 100644 --- a/tests/unit/test_circular_imports.py +++ b/tests/unit/test_circular_imports.py @@ -17,16 +17,20 @@ import subprocess # Required due to the nature of this test import sys -from collections.abc import Generator from itertools import chain from pathlib import Path -from types import ModuleType +from typing import TYPE_CHECKING import pytest import ansible_navigator +if TYPE_CHECKING: + from collections.abc import Generator + from types import ModuleType + + def _find_all_importables(pkg: ModuleType) -> list[str]: """Find all importables in the project. diff --git a/tests/unit/ui_framework/test_colorize.py b/tests/unit/ui_framework/test_colorize.py index 20df96cd6..090f632df 100644 --- a/tests/unit/ui_framework/test_colorize.py +++ b/tests/unit/ui_framework/test_colorize.py @@ -2,11 +2,14 @@ from __future__ import annotations +from typing import TYPE_CHECKING from typing import NamedTuple from unittest.mock import MagicMock # pylint: disable=W0407 from unittest.mock import patch # pylint: disable=W0407 -import pytest + +if TYPE_CHECKING: + import pytest from ansible_navigator.constants import GRAMMAR_DIR from ansible_navigator.constants import THEME_PATH diff --git a/tests/unit/utils/test_dot_paths.py b/tests/unit/utils/test_dot_paths.py index 962682ed8..8bdca50ee 100644 --- a/tests/unit/utils/test_dot_paths.py +++ b/tests/unit/utils/test_dot_paths.py @@ -2,9 +2,9 @@ from __future__ import annotations -from collections.abc import MutableMapping from dataclasses import dataclass from dataclasses import field +from typing import TYPE_CHECKING from typing import Any import pytest @@ -22,6 +22,10 @@ from tests.defaults import id_func +if TYPE_CHECKING: + from collections.abc import MutableMapping + + def test_ascendants_from_path() -> None: """Test ascendant from path.""" path = "a.b.c.d.e" diff --git a/tests/unit/utils/test_serialize_dataclass.py b/tests/unit/utils/test_serialize_dataclass.py index 9c187a4b7..5a376c46d 100644 --- a/tests/unit/utils/test_serialize_dataclass.py +++ b/tests/unit/utils/test_serialize_dataclass.py @@ -2,11 +2,10 @@ from __future__ import annotations -from collections.abc import Callable -from collections.abc import Iterable from dataclasses import asdict from dataclasses import dataclass from functools import partial +from typing import TYPE_CHECKING from typing import Any from typing import NamedTuple @@ -19,6 +18,11 @@ from tests.defaults import id_func +if TYPE_CHECKING: + from collections.abc import Callable + from collections.abc import Iterable + + class ParametrizeView(NamedTuple): """Keyword arguments for parametrization of view."""