SYMBOL INDEX (607 symbols across 40 files) FILE: example/base.py class BaseModule (line 5) | class BaseModule(decman.Module): method __init__ (line 6) | def __init__(self): method pkgs (line 12) | def pkgs(self) -> set[str]: method aurpkgs (line 26) | def aurpkgs(self) -> set[str]: method files (line 29) | def files(self) -> dict[str, decman.File]: method on_change (line 32) | def on_change(self, store): FILE: example/kde.py class KDE (line 5) | class KDE(decman.Module): method __init__ (line 6) | def __init__(self): method pkgs (line 10) | def pkgs(self) -> set[str]: method units (line 18) | def units(self) -> set[str]: FILE: example/plugin/decman_plugin_example.py class Example (line 6) | class Example(decman.Plugin): method available (line 9) | def available(self) -> bool: method process_modules (line 12) | def process_modules(self, store: decman.Store, modules: list[decman.Mo... method apply (line 17) | def apply( FILE: plugins/decman-flatpak/src/decman/plugins/flatpak.py function packages (line 11) | def packages(fn): function user_packages (line 21) | def user_packages(fn): class Flatpak (line 32) | class Flatpak(plugins.Plugin): method __init__ (line 40) | def __init__(self) -> None: method available (line 46) | def available(self) -> bool: method process_modules (line 49) | def process_modules(self, store: _store.Store, modules: list[module.Mo... method apply (line 87) | def apply( method apply_packages (line 110) | def apply_packages( class FlatpakCommands (line 139) | class FlatpakCommands: method list_apps (line 140) | def list_apps(self, as_user: bool) -> list[str]: method install (line 157) | def install(self, pkgs: set[str], as_user: bool) -> list[str]: method upgrade (line 170) | def upgrade(self, as_user: bool) -> list[str]: method remove (line 182) | def remove(self, pkgs: set[str], as_user: bool) -> list[str]: method remove_unused (line 195) | def remove_unused(self, as_user: bool) -> list[str]: class FlatpakInterface (line 209) | class FlatpakInterface: method __init__ (line 216) | def __init__(self, commands: FlatpakCommands) -> None: method get_apps (line 219) | def get_apps(self, user: str | None = None) -> set[str]: method install (line 239) | def install(self, packages: set[str], user: str | None = None): method upgrade (line 253) | def upgrade(self, user: str | None = None): method remove (line 263) | def remove(self, packages: set[str], user: str | None = None): FILE: plugins/decman-pacman/src/decman/plugins/aur/__init__.py function packages (line 32) | def packages(fn): function custom_packages (line 42) | def custom_packages(fn): class AUR (line 52) | class AUR(plugins.Plugin): method __init__ (line 64) | def __init__(self) -> None: method available (line 86) | def available(self) -> bool: method process_modules (line 93) | def process_modules(self, store: _store.Store, modules: list[module.Mo... method apply (line 128) | def apply( FILE: plugins/decman-pacman/src/decman/plugins/aur/commands.py class AurCommands (line 7) | class AurCommands(pacman.PacmanCommands): method install_as_dependencies (line 8) | def install_as_dependencies(self, pkgs: set[str]) -> list[str]: method install_files_as_dependencies (line 15) | def install_files_as_dependencies(self, pkg_files: list[str]) -> list[... method compare_versions (line 21) | def compare_versions(self, installed_version: str, new_version: str) -... method git_clone (line 27) | def git_clone(self, repo: str, dest: str) -> list[str]: method git_diff (line 33) | def git_diff(self, from_commit: str) -> list[str]: method git_get_commit_id (line 40) | def git_get_commit_id(self) -> list[str]: method git_log_commit_ids (line 46) | def git_log_commit_ids(self) -> list[str]: method review_file (line 52) | def review_file(self, file: str) -> list[str]: method make_chroot (line 58) | def make_chroot(self, chroot_dir: str, with_pkgs: set[str]) -> list[str]: method install_chroot (line 65) | def install_chroot(self, chroot_dir: str, packages: list[str]): method resolve_real_name_chroot (line 78) | def resolve_real_name_chroot(self, chroot_dir: str, pkg: str) -> list[... method remove_chroot (line 92) | def remove_chroot(self, chroot_dir: str, packages: set[str]): method make_chroot_pkg (line 98) | def make_chroot_pkg( method print_srcinfo (line 113) | def print_srcinfo(self) -> list[str]: class AurPacmanInterface (line 121) | class AurPacmanInterface(pacman.PacmanInterface): method __init__ (line 128) | def __init__( method get_foreign_orphans (line 140) | def get_foreign_orphans(self) -> set[str]: method is_provided_by_installed (line 146) | def is_provided_by_installed(self, dependency: str) -> bool: method filter_installed_packages (line 149) | def filter_installed_packages(self, deps: set[str]) -> set[str]: method is_installable (line 156) | def is_installable(self, pkg: str) -> bool: method get_versioned_foreign_packages (line 165) | def get_versioned_foreign_packages(self) -> list[tuple[str, str]]: method install_dependencies (line 176) | def install_dependencies(self, deps: set[str]): method install_files (line 187) | def install_files(self, files: list[str], as_explicit: set[str]): FILE: plugins/decman-pacman/src/decman/plugins/aur/error.py class ForeignPackageManagerError (line 1) | class ForeignPackageManagerError(Exception): class DependencyCycleError (line 7) | class DependencyCycleError(Exception): method __init__ (line 12) | def __init__(self, package1: str, package2: str): class PKGBUILDParseError (line 20) | class PKGBUILDParseError(Exception): method __init__ (line 25) | def __init__(self, git_url: str | None, pkgbuild_directory: str | None... class AurRPCError (line 32) | class AurRPCError(Exception): method __init__ (line 37) | def __init__(self, message: str, url: str): FILE: plugins/decman-pacman/src/decman/plugins/aur/fpm.py function find_latest_cached_package (line 18) | def find_latest_cached_package(store: _store.Store, package: str) -> tup... function add_package_to_cache (line 48) | def add_package_to_cache(store: _store.Store, package: str, version: str... function clean_package_cache (line 69) | def clean_package_cache(store: _store.Store, package: str): function is_devel (line 108) | def is_devel(package: str) -> bool: class ResolvedDependencies (line 126) | class ResolvedDependencies: method __init__ (line 131) | def __init__(self) -> None: method add_pkgbase_info (line 144) | def add_pkgbase_info(self, pkgname: str, pkgbase: str): method get_pkgbase (line 153) | def get_pkgbase(self, pkgname: str) -> str: method get_pkgs_with_common_pkgbase (line 159) | def get_pkgs_with_common_pkgbase(self, pkgname: str) -> set[str]: method all_pkgbases (line 166) | def all_pkgbases(self) -> list[str]: method get_some_pkgname (line 172) | def get_some_pkgname(self, pkgbase: str) -> str: class ForeignPackageManager (line 179) | class ForeignPackageManager: method __init__ (line 184) | def __init__( method upgrade (line 202) | def upgrade( method install (line 246) | def install( method resolve_dependencies (line 334) | def resolve_dependencies( method should_upgrade_package (line 427) | def should_upgrade_package( class PackageBuilder (line 457) | class PackageBuilder: method __init__ (line 464) | def __init__( method __enter__ (line 502) | def __enter__(self): method __exit__ (line 508) | def __exit__(self, exc_type, exc_value, traceback): method store_wd (line 512) | def store_wd(self): method restore_wd (line 518) | def restore_wd(self): method create_build_environment (line 524) | def create_build_environment(self): method remove_build_environment (line 578) | def remove_build_environment(self): method build_packages (line 584) | def build_packages(self, package_base: str, packages: list[ForeignPack... method _are_all_pkgs_cached (line 657) | def _are_all_pkgs_cached(self, pkgs: list[ForeignPackage]) -> bool: method _get_chroot_packages (line 675) | def _get_chroot_packages( method _find_pkgfile (line 733) | def _find_pkgfile(self, pkgname: str, pkgbuild_dir: str) -> str: method _fetch_and_review_pkgbuild (line 758) | def _fetch_and_review_pkgbuild( FILE: plugins/decman-pacman/src/decman/plugins/aur/package.py class PackageInfo (line 19) | class PackageInfo: method __post_init__ (line 72) | def __post_init__(self) -> None: method pkg_file_prefix (line 79) | def pkg_file_prefix(self) -> str: method foreign_dependencies (line 87) | def foreign_dependencies(self, pacman: AurPacmanInterface) -> list[str]: method foreign_make_dependencies (line 97) | def foreign_make_dependencies(self, pacman: AurPacmanInterface) -> lis... method foreign_check_dependencies (line 107) | def foreign_check_dependencies(self, pacman: AurPacmanInterface) -> li... method native_dependencies (line 117) | def native_dependencies(self, pacman: AurPacmanInterface) -> list[str]: method native_make_dependencies (line 127) | def native_make_dependencies(self, pacman: AurPacmanInterface) -> list... method native_check_dependencies (line 137) | def native_check_dependencies(self, pacman: AurPacmanInterface) -> lis... method _classify_dependencies (line 150) | def _classify_dependencies( method _ensure_dependencies_cached (line 165) | def _ensure_dependencies_cached(self, pacman: AurPacmanInterface) -> N... method _ensure_make_dependencies_cached (line 173) | def _ensure_make_dependencies_cached(self, pacman: AurPacmanInterface)... method _ensure_check_dependencies_cached (line 181) | def _ensure_check_dependencies_cached(self, pacman: AurPacmanInterface... class CustomPackage (line 190) | class CustomPackage: method __init__ (line 209) | def __init__( method parse (line 222) | def parse(self, commands: AurCommands) -> PackageInfo: method __eq__ (line 235) | def __eq__(self, other: object) -> bool: method __hash__ (line 244) | def __hash__(self) -> int: method __str__ (line 247) | def __str__(self) -> str: method _srcinfo_from_pkgbuild_directory (line 254) | def _srcinfo_from_pkgbuild_directory(self, commands: AurCommands) -> str: method _srcinfo_from_git (line 293) | def _srcinfo_from_git(self, commands: AurCommands) -> str: method _run_makepkg_printsrcinfo (line 326) | def _run_makepkg_printsrcinfo(self, path: pathlib.Path, commands: AurC... method _parse_srcinfo (line 343) | def _parse_srcinfo(self, srcinfo: str) -> PackageInfo: class PackageSearch (line 477) | class PackageSearch: method __init__ (line 484) | def __init__(self, aur_rpc_timeout: int = 30) -> None: method add_custom_pkg (line 491) | def add_custom_pkg(self, user_pkg: PackageInfo): method _cache_pkg (line 498) | def _cache_pkg(self, pkg: PackageInfo): method try_caching_packages (line 504) | def try_caching_packages(self, packages: list[str]): method get_package_info (line 566) | def get_package_info(self, package: str) -> PackageInfo | None: method find_provider (line 622) | def find_provider(self, stripped_dependency: str) -> PackageInfo | None: method _choose_provider (line 697) | def _choose_provider( FILE: plugins/decman-pacman/src/decman/plugins/aur/resolver.py class ForeignPackage (line 6) | class ForeignPackage: method __init__ (line 11) | def __init__(self, name: str): method __eq__ (line 15) | def __eq__(self, value: object, /) -> bool: method __hash__ (line 23) | def __hash__(self) -> int: method __repr__ (line 26) | def __repr__(self) -> str: method __str__ (line 29) | def __str__(self) -> str: method add_foreign_dependency_packages (line 32) | def add_foreign_dependency_packages(self, package_names: typing.Iterab... method get_all_recursive_foreign_dep_pkgs (line 38) | def get_all_recursive_foreign_dep_pkgs(self) -> set[str]: class DepNode (line 45) | class DepNode: method __init__ (line 50) | def __init__(self, package: ForeignPackage) -> None: method is_pkgname_in_parents_recursive (line 55) | def is_pkgname_in_parents_recursive(self, pkgname: str) -> bool: class DepGraph (line 65) | class DepGraph: method __init__ (line 70) | def __init__(self) -> None: method add_requirement (line 74) | def add_requirement(self, child_pkgname: str, parent_pkgname: typing.O... method get_and_remove_outer_dep_pkgs (line 100) | def get_and_remove_outer_dep_pkgs(self) -> list[ForeignPackage]: FILE: plugins/decman-pacman/src/decman/plugins/pacman.py function packages (line 16) | def packages(fn): function strip_dependency (line 26) | def strip_dependency(dep: str) -> str: class Pacman (line 34) | class Pacman(plugins.Plugin): method __init__ (line 42) | def __init__(self) -> None: method available (line 58) | def available(self) -> bool: method process_modules (line 61) | def process_modules(self, store: _store.Store, modules: list[module.Mo... method apply (line 80) | def apply( class PacmanCommands (line 150) | class PacmanCommands: method list_pacman_repos (line 151) | def list_pacman_repos(self) -> list[str]: method install (line 157) | def install(self, pkgs: set[str]) -> list[str]: method upgrade (line 163) | def upgrade(self) -> list[str]: method set_as_dependencies (line 169) | def set_as_dependencies(self, pkgs: set[str]) -> list[str]: method set_as_explicit (line 175) | def set_as_explicit(self, pkgs: set[str]) -> list[str]: method remove (line 181) | def remove(self, pkgs: set[str]) -> list[str]: class PacmanInterface (line 189) | class PacmanInterface: method __init__ (line 196) | def __init__( method _create_pyalpm_handle (line 215) | def _create_pyalpm_handle(self): method _create_name_index (line 232) | def _create_name_index(self) -> dict[str, pyalpm.Package]: method _create_local_provides_index (line 235) | def _create_local_provides_index(self) -> dict[str, set[str]]: method _create_provides_index (line 243) | def _create_provides_index(self) -> dict[str, set[str]]: method _create_requiredby_index (line 252) | def _create_requiredby_index(self) -> dict[str, set[str]]: method _is_native (line 255) | def _is_native(self, package: str) -> bool: method _is_foreign (line 258) | def _is_foreign(self, package: str) -> bool: method get_all_packages (line 261) | def get_all_packages(self) -> set[str]: method get_native_explicit (line 267) | def get_native_explicit(self) -> set[str]: method _get_orphans (line 279) | def _get_orphans(self, filter_fn: Callable[["PacmanInterface", str], b... method get_native_orphans (line 296) | def get_native_orphans(self) -> set[str]: method get_foreign_explicit (line 302) | def get_foreign_explicit(self) -> set[str]: method get_dependants (line 312) | def get_dependants(self, package: str) -> set[str]: method set_as_dependencies (line 338) | def set_as_dependencies(self, packages: set[str]): method install (line 348) | def install(self, packages: set[str]): method upgrade (line 364) | def upgrade(self): method remove (line 372) | def remove(self, packages: set[str]): method print_highlighted_pacman_messages (line 383) | def print_highlighted_pacman_messages(self, pacman_output: str): FILE: plugins/decman-pacman/tests/test_decman_plugins_aur.py class FakeStore (line 8) | class FakeStore(dict): method ensure (line 9) | def ensure(self, key: str, default: Any) -> None: class FakeModule (line 14) | class FakeModule: method __init__ (line 15) | def __init__(self, name: str, aur_pkgs: set[str], custom_pkgs: set[Any... class FakeCustomPackage (line 22) | class FakeCustomPackage: method __init__ (line 23) | def __init__(self, pkgname: str) -> None: method __hash__ (line 26) | def __hash__(self) -> int: # needed because instances go into sets method __eq__ (line 29) | def __eq__(self, other: object) -> bool: method parse (line 32) | def parse(self, commands: Any) -> str: function test_process_modules_collects_aur_and_custom_packages_and_marks_changed (line 37) | def test_process_modules_collects_aur_and_custom_packages_and_marks_chan... function test_apply_respects_ignored_packages_and_protects_their_dependencies (line 77) | def test_apply_respects_ignored_packages_and_protects_their_dependencies( function test_apply_returns_false_on_aur_rpc_error (line 284) | def test_apply_returns_false_on_aur_rpc_error(monkeypatch: pytest.Monkey... FILE: plugins/decman-pacman/tests/test_decman_plugins_aur_package.py function silence_output (line 14) | def silence_output(monkeypatch): function test_packageinfo_requires_exactly_one_source (line 28) | def test_packageinfo_requires_exactly_one_source(): class DummyPacman (line 42) | class DummyPacman: method __init__ (line 43) | def __init__(self, installable: set[str]): method is_installable (line 47) | def is_installable(self, name: str) -> bool: function _make_pkg_for_deps (line 52) | def _make_pkg_for_deps() -> PackageInfo: function test_packageinfo_foreign_and_native_dependencies_are_split_and_stripped (line 64) | def test_packageinfo_foreign_and_native_dependencies_are_split_and_strip... function test_custompackage_requires_exactly_one_source (line 85) | def test_custompackage_requires_exactly_one_source(): class DummyCommands (line 93) | class DummyCommands: function test_parse_srcinfo_version_handling (line 131) | def test_parse_srcinfo_version_handling(srcinfo: str, expected_version: ... function test_parse_srcinfo_single_package_dependencies (line 141) | def test_parse_srcinfo_single_package_dependencies() -> None: function test_parse_srcinfo_split_package_uses_only_target_pkg_dependencies (line 162) | def test_parse_srcinfo_split_package_uses_only_target_pkg_dependencies(m... function test_parse_srcinfo_arch_specific_ignored_for_other_arch (line 210) | def test_parse_srcinfo_arch_specific_ignored_for_other_arch(monkeypatch)... function test_parse_srcinfo_missing_required_fields_raises (line 233) | def test_parse_srcinfo_missing_required_fields_raises() -> None: function test_parse_srcinfo_missing_target_pkg_raises (line 257) | def test_parse_srcinfo_missing_target_pkg_raises() -> None: function test_srcinfo_from_pkgbuild_directory_missing_dir_raises (line 275) | def test_srcinfo_from_pkgbuild_directory_missing_dir_raises(tmp_path: pa... function test_srcinfo_from_pkgbuild_directory_missing_pkgbuild_raises (line 287) | def test_srcinfo_from_pkgbuild_directory_missing_pkgbuild_raises(tmp_pat... function test_custom_package_equality_and_hash (line 300) | def test_custom_package_equality_and_hash() -> None: function test_custom_package_str_git_and_directory (line 316) | def test_custom_package_str_git_and_directory() -> None: function _make_pkg (line 338) | def _make_pkg(name: str = "pkg") -> PackageInfo: function test_add_custom_pkg_caches_package (line 351) | def test_add_custom_pkg_caches_package(): function test_try_caching_packages_skips_already_cached (line 362) | def test_try_caching_packages_skips_already_cached(monkeypatch): function test_try_caching_packages_caches_from_aur (line 379) | def test_try_caching_packages_caches_from_aur(monkeypatch): function test_try_caching_packages_aur_returns_error (line 412) | def test_try_caching_packages_aur_returns_error(monkeypatch): function test_try_caching_packages_request_exception_raises_aur_error (line 428) | def test_try_caching_packages_request_exception_raises_aur_error(monkeyp... function test_get_package_info_returns_from_cache (line 446) | def test_get_package_info_returns_from_cache(): function test_get_package_info_returns_custom_package_if_not_cached (line 455) | def test_get_package_info_returns_custom_package_if_not_cached(): function test_get_package_info_aur_not_found_returns_none (line 466) | def test_get_package_info_aur_not_found_returns_none(monkeypatch): function test_get_package_info_aur_success_caches_and_returns (line 483) | def test_get_package_info_aur_success_caches_and_returns(monkeypatch): function test_get_package_info_aur_returns_error (line 515) | def test_get_package_info_aur_returns_error(monkeypatch): function test_get_package_info_request_exception_raises_aur_error (line 531) | def test_get_package_info_request_exception_raises_aur_error(monkeypatch): function test_find_provider_uses_selected_providers_cache (line 549) | def test_find_provider_uses_selected_providers_cache(): function test_find_provider_exact_name_match (line 558) | def test_find_provider_exact_name_match(monkeypatch): function test_find_provider_single_known_provider (line 573) | def test_find_provider_single_known_provider(monkeypatch): function test_find_provider_aur_search_not_found (line 591) | def test_find_provider_aur_search_not_found(monkeypatch): function test_find_provider_aur_search_single_result (line 613) | def test_find_provider_aur_search_single_result(monkeypatch): function test_find_provider_aur_search_multiple_results_calls_choose_provider (line 643) | def test_find_provider_aur_search_multiple_results_calls_choose_provider... function test_find_provider_aur_search_error (line 679) | def test_find_provider_aur_search_error(monkeypatch): function test_find_provider_aur_search_request_exception_raises_aur_error (line 700) | def test_find_provider_aur_search_request_exception_raises_aur_error(mon... function test_choose_provider_prompts_and_caches (line 723) | def test_choose_provider_prompts_and_caches(monkeypatch): FILE: plugins/decman-pacman/tests/test_decman_plugins_aur_resolver.py function test_add_dependency (line 6) | def test_add_dependency(): function test_cyclic_dependency_raises (line 19) | def test_cyclic_dependency_raises(): function _build_graph_for_outer_deps (line 30) | def _build_graph_for_outer_deps() -> DepGraph: function _assert_outer_dep_names (line 72) | def _assert_outer_dep_names(graph: DepGraph, expected: set[str]) -> None: function test_get_and_remove_outer_deps_sequence (line 78) | def test_get_and_remove_outer_deps_sequence(): FILE: plugins/decman-pacman/tests/test_decman_plugins_pacman.py function test_strip_dependency (line 18) | def test_strip_dependency(dep, expected): class FakeStore (line 22) | class FakeStore(dict): method ensure (line 23) | def ensure(self, key: str, default: Any) -> None: class FakeModule (line 28) | class FakeModule: method __init__ (line 29) | def __init__(self, name: str, packages: set[str]) -> None: function test_process_modules_collects_packages_and_marks_changed (line 35) | def test_process_modules_collects_packages_and_marks_changed( function test_apply_dry_run_computes_sets_and_does_not_call_pacman (line 65) | def test_apply_dry_run_computes_sets_and_does_not_call_pacman( function test_apply_returns_false_on_command_failure (line 188) | def test_apply_returns_false_on_command_failure(monkeypatch: pytest.Monk... function test_ignored_packages_are_not_removed_or_installed (line 227) | def test_ignored_packages_are_not_removed_or_installed(monkeypatch: pyte... FILE: plugins/decman-pacman/tests/test_deep_orphan_removal.py class FakePackage (line 7) | class FakePackage: method __init__ (line 8) | def __init__(self, name: str, is_explicit: bool, required_by: list[str]): method compute_requiredby (line 14) | def compute_requiredby(self): class FakeDB (line 18) | class FakeDB: method __init__ (line 19) | def __init__(self, pkgcache: list[FakePackage]): class FakePyalpmHandle (line 23) | class FakePyalpmHandle: method __init__ (line 24) | def __init__(self): method get_syncdbs (line 27) | def get_syncdbs(self): method get_localdb (line 42) | def get_localdb(self): function fake_create_pyalpm_handle (line 55) | def fake_create_pyalpm_handle(self): function test_get_native_orphans_pacman (line 59) | def test_get_native_orphans_pacman( function test_get_foreign_orphans_aur (line 75) | def test_get_foreign_orphans_aur( FILE: plugins/decman-pacman/tests/test_fpm.py class FakeAurPacmanInterface (line 11) | class FakeAurPacmanInterface: method __init__ (line 12) | def __init__(self) -> None: method get_native_explicit (line 20) | def get_native_explicit(self) -> set[str]: method get_native_orphans (line 23) | def get_native_orphans(self) -> set[str]: method get_foreign_explicit (line 26) | def get_foreign_explicit(self) -> set[str]: method get_dependants (line 29) | def get_dependants(self, package: str) -> set[str]: method set_as_dependencies (line 32) | def set_as_dependencies(self, packages: set[str]): method install (line 35) | def install(self, packages: set[str]): method upgrade (line 39) | def upgrade(self): method is_provided_by_installed (line 42) | def is_provided_by_installed(self, dependency: str) -> bool: method get_all_packages (line 45) | def get_all_packages(self) -> set[str]: method filter_installed_packages (line 48) | def filter_installed_packages(self, deps: set[str]) -> set[str]: method remove (line 55) | def remove(self, packages: set[str]): method get_foreign_orphans (line 61) | def get_foreign_orphans(self) -> set[str]: method is_installable (line 64) | def is_installable(self, pkg: str) -> bool: method get_versioned_foreign_packages (line 67) | def get_versioned_foreign_packages(self) -> list[tuple[str, str]]: method install_dependencies (line 70) | def install_dependencies(self, deps: set[str]): method install_files (line 73) | def install_files(self, files: list[str], as_explicit: set[str]): class FakeStore (line 83) | class FakeStore: method __init__ (line 84) | def __init__(self) -> None: method __getitem__ (line 87) | def __getitem__(self, key: str) -> typing.Any: method __setitem__ (line 90) | def __setitem__(self, key: str, value: typing.Any) -> None: method get (line 93) | def get(self, key: str, default: typing.Any = None) -> typing.Any: method ensure (line 96) | def ensure(self, key: str, default: typing.Any = None): method __enter__ (line 100) | def __enter__(self) -> "FakeStore": method __exit__ (line 103) | def __exit__(self, exc_type, exc, tb): method save (line 106) | def save(self) -> None: method __repr__ (line 109) | def __repr__(self) -> str: class MockAurServer (line 113) | class MockAurServer: method __init__ (line 114) | def __init__(self) -> None: method seed (line 117) | def seed(self, packages: list[PackageInfo]): method handle_request (line 134) | def handle_request(self, url, *args, **kwargs): function mock_aur (line 182) | def mock_aur(mocker): function mock_pacman (line 189) | def mock_pacman(mocker): function mock_fpm (line 195) | def mock_fpm(mocker, mock_aur, mock_pacman): function test_remove_pacman_deps_provided_by_foreign_packages (line 229) | def test_remove_pacman_deps_provided_by_foreign_packages( function test_remove_pacman_deps_provided_by_already_installed_foreign_packages (line 265) | def test_remove_pacman_deps_provided_by_already_installed_foreign_packages( function test_install_simple_package (line 307) | def test_install_simple_package( function test_upgrade_foreign_package (line 327) | def test_upgrade_foreign_package(mock_fpm, mock_pacman, mock_aur): function test_upgrade_skips_current_package (line 347) | def test_upgrade_skips_current_package(mock_fpm, mock_pacman, mock_aur): function test_install_resolves_dependencies (line 365) | def test_install_resolves_dependencies(mock_fpm, mock_pacman, mock_aur): FILE: plugins/decman-systemd/src/decman/plugins/systemd.py function units (line 12) | def units(fn): function user_units (line 22) | def user_units(fn): class SystemdCommands (line 33) | class SystemdCommands: method enable_units (line 38) | def enable_units(self, units: set[str]) -> list[str]: method disable_units (line 44) | def disable_units(self, units: set[str]) -> list[str]: method enable_user_units (line 50) | def enable_user_units(self, units: set[str], user: str) -> list[str]: method disable_user_units (line 56) | def disable_user_units(self, units: set[str], user: str) -> list[str]: method daemon_reload (line 62) | def daemon_reload(self) -> list[str]: method user_daemon_reload (line 68) | def user_daemon_reload(self, user: str) -> list[str]: class Systemd (line 75) | class Systemd(plugins.Plugin): method __init__ (line 78) | def __init__(self) -> None: method available (line 83) | def available(self) -> bool: method process_modules (line 86) | def process_modules(self, store: _store.Store, modules: list[module.Mo... method apply (line 122) | def apply( method enable_units (line 193) | def enable_units(self, store: _store.Store, units: set[str]): method disable_units (line 205) | def disable_units(self, store: _store.Store, units: set[str]): method enable_user_units (line 217) | def enable_user_units(self, store: _store.Store, units: set[str], user... method disable_user_units (line 231) | def disable_user_units(self, store: _store.Store, units: set[str], use... method reload_user_daemon (line 245) | def reload_user_daemon(self, user: str): method reload_daemon (line 253) | def reload_daemon(self): FILE: plugins/decman-systemd/tests/test_decman_plugins_systemd.py class DummyStore (line 6) | class DummyStore(dict): method ensure (line 7) | def ensure(self, key, default): class DummyModule (line 12) | class DummyModule: method __init__ (line 13) | def __init__(self, name: str): function store (line 19) | def store(): function systemd (line 24) | def systemd(): function test_units_decorator_sets_attribute (line 28) | def test_units_decorator_sets_attribute(): function test_user_units_decorator_sets_attribute (line 36) | def test_user_units_decorator_sets_attribute(): function test_available_true_if_systemctl_found (line 44) | def test_available_true_if_systemctl_found(monkeypatch, systemd): function test_available_false_if_systemctl_missing (line 56) | def test_available_false_if_systemctl_missing(monkeypatch, systemd): function test_process_modules_marks_changed_and_updates_store (line 61) | def test_process_modules_marks_changed_and_updates_store(monkeypatch, st... function test_process_modules_no_change_second_run (line 94) | def test_process_modules_no_change_second_run(monkeypatch, store, systemd): function test_apply_enables_and_disables_units_and_user_units (line 120) | def test_apply_enables_and_disables_units_and_user_units(store): function test_apply_dry_run_does_not_mutate_store_or_call_commands (line 180) | def test_apply_dry_run_does_not_mutate_store_or_call_commands(store): function test_enable_units_success (line 208) | def test_enable_units_success(monkeypatch, store, systemd): function test_disable_units_success (line 223) | def test_disable_units_success(monkeypatch, store, systemd): function test_enable_user_units_success (line 238) | def test_enable_user_units_success(monkeypatch, store, systemd): function test_disable_user_units_success (line 257) | def test_disable_user_units_success(monkeypatch, store, systemd): function test_reload_daemon_uses_command_run (line 273) | def test_reload_daemon_uses_command_run(monkeypatch, systemd): function test_reload_user_daemon_uses_command_run (line 285) | def test_reload_user_daemon_uses_command_run(monkeypatch, systemd): FILE: src/decman/__init__.py function sh (line 77) | def sh( FILE: src/decman/app.py function main (line 16) | def main(): function _execute_source (line 120) | def _execute_source(store: _store.Store, args: argparse.Namespace): function run_decman (line 174) | def run_decman(store: _store.Store, args: argparse.Namespace) -> bool: function _determine_execution_order (line 239) | def _determine_execution_order(args: argparse.Namespace) -> list[str]: function _find_new_modules (line 259) | def _find_new_modules(store: _store.Store): function _find_disabled_modules (line 268) | def _find_disabled_modules(store: _store.Store): function _run_before_update (line 278) | def _run_before_update(store: _store.Store, args: argparse.Namespace): function _run_on_disable (line 286) | def _run_on_disable(store: _store.Store, args: argparse.Namespace, disab... function _run_on_enable (line 303) | def _run_on_enable(store: _store.Store, args: argparse.Namespace, new_mo... function _run_on_change (line 338) | def _run_on_change(store: _store.Store, args: argparse.Namespace): function _run_after_update (line 347) | def _run_after_update(store: _store.Store, args: argparse.Namespace): FILE: src/decman/core/command.py function get_user_info (line 21) | def get_user_info(user: str) -> tuple[int, int]: function prg (line 31) | def prg( function pty_run (line 105) | def pty_run( function run (line 152) | def run( function check_run_result (line 207) | def check_run_result( function _build_env (line 227) | def _build_env( function _exec_in_child (line 260) | def _exec_in_child(command: list[str], env: dict[str, str], user: None |... function _run_parent (line 278) | def _run_parent(master_fd: int, pid: int) -> tuple[int, str]: function _relay_pty (line 318) | def _relay_pty(master_fd: int, stdin_fd: int, stdout_fd: int) -> bytes: function _get_passwd (line 356) | def _get_passwd(user: str) -> pwd.struct_passwd: FILE: src/decman/core/error.py class SourceError (line 4) | class SourceError(Exception): class FSInstallationFailedError (line 10) | class FSInstallationFailedError(Exception): method __init__ (line 15) | def __init__(self, source: str, target: str, reason: str): class FSSymlinkFailedError (line 21) | class FSSymlinkFailedError(Exception): method __init__ (line 26) | def __init__(self, link_name: str, target: str, reason: str): class InvalidOnDisableError (line 32) | class InvalidOnDisableError(Exception): method __init__ (line 37) | def __init__(self, module: str, reason: str): class UserNotFoundError (line 45) | class UserNotFoundError(Exception): method __init__ (line 53) | def __init__(self, user: str) -> None: class GroupNotFoundError (line 58) | class GroupNotFoundError(Exception): method __init__ (line 66) | def __init__(self, group: str) -> None: class CommandFailedError (line 71) | class CommandFailedError(Exception): method __init__ (line 81) | def __init__(self, command: list[str], exit_code: int, output: str | N... FILE: src/decman/core/file_manager.py function update_files (line 11) | def update_files( function _install_files (line 133) | def _install_files( function _install_directories (line 168) | def _install_directories( function _install_symlinks (line 207) | def _install_symlinks( FILE: src/decman/core/fs.py function create_missing_dirs (line 11) | def create_missing_dirs(dirct: str, uid: typing.Optional[int], gid: typi... class File (line 25) | class File: method __init__ (line 76) | def __init__( method copy_to (line 109) | def copy_to( method _write_content (line 161) | def _write_content(self, target: str, variables: dict[str, str], dry_r... class Symlink (line 221) | class Symlink: method __init__ (line 243) | def __init__( method link_to (line 264) | def link_to(self, link_name: str, dry_run: bool = False) -> bool: class Directory (line 313) | class Directory: method __init__ (line 350) | def __init__( method copy_to (line 378) | def copy_to( FILE: src/decman/core/module.py class Module (line 14) | class Module: method __init__ (line 25) | def __init__(self, name: str) -> None: method __init_subclass__ (line 29) | def __init_subclass__(cls, **kwargs): method before_update (line 45) | def before_update(self, store: _store.Store): method after_update (line 55) | def after_update(self, store: _store.Store): method on_enable (line 65) | def on_enable(self, store: _store.Store): method on_change (line 75) | def on_change(self, store: _store.Store): method on_disable (line 87) | def on_disable(): method files (line 95) | def files(self) -> dict[str, fs.File]: method directories (line 101) | def directories(self) -> dict[str, fs.Directory]: method symlinks (line 108) | def symlinks(self) -> dict[str, str | fs.Symlink]: method file_variables (line 115) | def file_variables(self) -> dict[str, str]: method __hash__ (line 122) | def __hash__(self) -> int: method __eq__ (line 125) | def __eq__(self, other: object) -> bool: function write_on_disable_script (line 129) | def write_on_disable_script(mod_obj: Module, out_dir: str) -> str | None: function _iter_code_objects (line 168) | def _iter_code_objects(code: types.CodeType): function _validate_on_disable (line 175) | def _validate_on_disable(module_type: str, func: types.FunctionType) -> ... FILE: src/decman/core/output.py function has_ansi_support (line 26) | def has_ansi_support() -> bool: function _apply_color (line 42) | def _apply_color(code: str, text: str) -> str: function _tag (line 48) | def _tag() -> str: function _continuation_prefix (line 54) | def _continuation_prefix() -> str: function _red (line 58) | def _red(text: str) -> str: function _yellow (line 62) | def _yellow(text: str) -> str: function _cyan (line 66) | def _cyan(text: str) -> str: function _green (line 70) | def _green(text: str) -> str: function _gray (line 74) | def _gray(text: str) -> str: function print_continuation (line 83) | def print_continuation(msg: str, level: int = SUMMARY): function print_error (line 91) | def print_error(error_msg: str): function print_traceback (line 98) | def print_traceback(): function print_warning (line 106) | def print_warning(msg: str): function print_summary (line 113) | def print_summary(msg: str): function print_info (line 120) | def print_info(msg: str): function print_debug (line 128) | def print_debug(msg: str): function print_command_output (line 136) | def print_command_output(command_output: str): function print_list (line 149) | def print_list( function prompt_number (line 213) | def prompt_number( function prompt_confirm (line 238) | def prompt_confirm(msg: str, default: typing.Optional[bool] = None) -> b... FILE: src/decman/core/store.py class Store (line 8) | class Store: method __init__ (line 13) | def __init__(self, path: str, dry_run: bool = False) -> None: method __getitem__ (line 22) | def __getitem__(self, key: str) -> typing.Any: method __setitem__ (line 25) | def __setitem__(self, key: str, value: typing.Any) -> None: method get (line 28) | def get(self, key: str, default: typing.Any = None) -> typing.Any: method ensure (line 31) | def ensure(self, key: str, default: typing.Any = None): method __enter__ (line 35) | def __enter__(self) -> "Store": method __exit__ (line 38) | def __exit__(self, exc_type, exc, tb): method save (line 42) | def save(self) -> None: method __repr__ (line 63) | def __repr__(self) -> str: class _SetJSONEncoder (line 67) | class _SetJSONEncoder(json.JSONEncoder): method default (line 68) | def default(self, obj: typing.Any) -> typing.Any: function _decode_sets (line 75) | def _decode_sets(obj: typing.Any) -> typing.Any: FILE: src/decman/extras/gpg.py class Key (line 29) | class Key: method __post_init__ (line 35) | def __post_init__(self) -> None: class _GPGInterface (line 42) | class _GPGInterface: method __init__ (line 43) | def __init__(self, user: str, home: str): method ensure_home (line 47) | def ensure_home(self) -> bool: method list_fingerprints (line 74) | def list_fingerprints(self) -> set[str]: method set_key_trust (line 88) | def set_key_trust(self, keys: list[tuple[str, OwnerTrust]]): method delete_keys (line 116) | def delete_keys(self, fingerprints: list[str]): method fetch_key (line 132) | def fetch_key(self, uri: str): method import_key (line 148) | def import_key(self, path: str): method receive_key (line 164) | def receive_key(self, fingerprint: str, keyserver: str): class GPGReceiver (line 183) | class GPGReceiver(module.Module): method __init__ (line 201) | def __init__(self) -> None: method receive_key (line 205) | def receive_key( method fetch_key (line 224) | def fetch_key( method import_key (line 236) | def import_key( method _add_key (line 248) | def _add_key(self, gpg: _GPGInterface, key: Key): method before_update (line 257) | def before_update(self, store: _store.Store): FILE: src/decman/extras/users.py class Group (line 13) | class Group: method __str__ (line 25) | def __str__(self) -> str: class User (line 35) | class User: method __str__ (line 51) | def __str__(self) -> str: class UserManager (line 68) | class UserManager(module.Module): method __init__ (line 95) | def __init__(self) -> None: method add_user (line 103) | def add_user(self, user: User): method add_group (line 109) | def add_group(self, group: Group): method add_user_to_group (line 115) | def add_user_to_group(self, user: str, group: str): method add_subuids (line 123) | def add_subuids(self, user: str, first: int, last: int): method add_subgids (line 137) | def add_subgids(self, user: str, first: int, last: int): method _check_user (line 151) | def _check_user(self, user: User, user_groups_index: dict[str, set[str... method _add_user (line 174) | def _add_user(self, user: User): method _ensure_user_matches (line 199) | def _ensure_user_matches( method _user_groups_index (line 234) | def _user_groups_index(self) -> dict[str, set[str]]: method _check_group (line 242) | def _check_group(self, group: Group): method _add_group (line 264) | def _add_group(self, group: Group): method _ensure_group_matches (line 277) | def _ensure_group_matches(self, group: Group, groupdb: grp.struct_group): method _modify_user_groups_subids (line 292) | def _modify_user_groups_subids(self, user: str, store: _store.Store): method _delete_users_and_groups (line 353) | def _delete_users_and_groups(self, store: _store.Store): method before_update (line 375) | def before_update(self, store: _store.Store): method after_update (line 384) | def after_update(self, store: _store.Store): FILE: src/decman/plugins/__init__.py class Plugin (line 8) | class Plugin: method available (line 18) | def available(self) -> bool: method apply (line 28) | def apply( method process_modules (line 43) | def process_modules(self, store: _store.Store, modules: list[module.Mo... function run_method_with_attribute (line 49) | def run_method_with_attribute(mod: module.Module, attribute: str) -> typ... function run_methods_with_attribute (line 67) | def run_methods_with_attribute(mod: module.Module, attribute: str) -> li... function available_plugins (line 84) | def available_plugins() -> dict[str, Plugin]: FILE: tests/test_decman_app.py class DummyStore (line 9) | class DummyStore: method __init__ (line 10) | def __init__(self, enabled=None, scripts=None): method __getitem__ (line 17) | def __getitem__(self, key): method __setitem__ (line 20) | def __setitem__(self, key, value): method ensure (line 23) | def ensure(self, key, default): class DummyModule (line 27) | class DummyModule: method __init__ (line 28) | def __init__(self, name): method before_update (line 36) | def before_update(self, store): method on_enable (line 39) | def on_enable(self, store): method on_change (line 42) | def on_change(self, store): method after_update (line 45) | def after_update(self, store): method on_disable (line 49) | def on_disable(): class DummyPlugin (line 53) | class DummyPlugin: method __init__ (line 54) | def __init__(self, apply_result=True): method process_modules (line 59) | def process_modules(self, store, modules): method apply (line 62) | def apply(self, store, dry_run=False, params=None): function make_args (line 67) | def make_args( function no_op_output (line 79) | def no_op_output(monkeypatch): function base_decman (line 91) | def base_decman(monkeypatch): function file_manager (line 112) | def file_manager(monkeypatch): function test_execution_order_only_and_skip (line 135) | def test_execution_order_only_and_skip(no_op_output, base_decman, file_m... function test_returns_false_when_update_files_fails_and_skips_plugins (line 157) | def test_returns_false_when_update_files_fails_and_skips_plugins( function test_plugin_failure_returns_false (line 180) | def test_plugin_failure_returns_false(no_op_output, base_decman, file_ma... function test_disabled_modules_run_on_disable_script (line 197) | def test_disabled_modules_run_on_disable_script(no_op_output, base_decma... function test_on_disable_not_run_in_dry_run (line 219) | def test_on_disable_not_run_in_dry_run(no_op_output, base_decman, file_m... function test_hooks_called_for_new_and_changed_modules (line 236) | def test_hooks_called_for_new_and_changed_modules( function test_hooks_not_called_when_no_hooks (line 278) | def test_hooks_not_called_when_no_hooks(no_op_output, base_decman, file_... function test_dry_run_skips_all_hooks_but_runs_steps_with_flag (line 299) | def test_dry_run_skips_all_hooks_but_runs_steps_with_flag(no_op_output, ... function test_missing_plugin_emits_warning_but_continues (line 328) | def test_missing_plugin_emits_warning_but_continues(base_decman, file_ma... FILE: tests/test_decman_core_command.py function test_prg_pty_true_uses_pty_run_and_check (line 11) | def test_prg_pty_true_uses_pty_run_and_check(monkeypatch: pytest.MonkeyP... function test_prg_pty_false_uses_run (line 43) | def test_prg_pty_false_uses_run(monkeypatch: pytest.MonkeyPatch): function test_prg_check_false_warns_on_nonzero (line 66) | def test_prg_check_false_warns_on_nonzero(monkeypatch: pytest.MonkeyPatch): function test_prg_check_true_propagates_command_failed_error (line 90) | def test_prg_check_true_propagates_command_failed_error(monkeypatch: pyt... function test_run_simple (line 111) | def test_run_simple(): function test_run_exec_failure (line 117) | def test_run_exec_failure(): function test_run_env_overrides_visible_in_child (line 123) | def test_run_env_overrides_visible_in_child(monkeypatch): function test_pty_run_simple (line 140) | def test_pty_run_simple(): FILE: tests/test_decman_core_file_manager.py class DummyFile (line 15) | class DummyFile: method __init__ (line 16) | def __init__(self, result=True, exc: BaseException | None = None): method copy_to (line 22) | def copy_to(self, target: str, variables=None, dry_run: bool = False) ... class DummyDirectory (line 29) | class DummyDirectory: method __init__ (line 30) | def __init__( method copy_to (line 43) | def copy_to(self, target: str, variables=None, dry_run: bool = False): class DummyModule (line 50) | class DummyModule: method __init__ (line 51) | def __init__( method files (line 66) | def files(self): method directories (line 69) | def directories(self): method symlinks (line 72) | def symlinks(self): method file_variables (line 75) | def file_variables(self): class DummyStore (line 79) | class DummyStore: method __init__ (line 80) | def __init__(self, initial: dict | None = None): method __getitem__ (line 83) | def __getitem__(self, key): method __setitem__ (line 86) | def __setitem__(self, key, value): method ensure (line 89) | def ensure(self, key, default): function test_install_files_non_dry_run_tracks_checked_and_changed (line 96) | def test_install_files_non_dry_run_tracks_checked_and_changed(): function test_install_files_dry_run_uses_dry_run_flag_and_respects_return_value (line 113) | def test_install_files_dry_run_uses_dry_run_flag_and_respects_return_val... function test_install_files_wraps_exceptions (line 139) | def test_install_files_wraps_exceptions(exc): function test_install_directories_aggregates_checked_and_changed (line 154) | def test_install_directories_aggregates_checked_and_changed(): function test_install_directories_wraps_exceptions (line 189) | def test_install_directories_wraps_exceptions(exc): function test_update_files_success_updates_store_and_removes_stale_files (line 204) | def test_update_files_success_updates_store_and_removes_stale_files(monk... function test_update_files_dry_run_does_not_touch_store_or_remove (line 264) | def test_update_files_dry_run_does_not_touch_store_or_remove(monkeypatch): function test_update_files_propagates_fsinstallation_error_and_does_not_modify_store (line 306) | def test_update_files_propagates_fsinstallation_error_and_does_not_modif... function test_install_symlinks_creates_missing_link_and_parents (line 363) | def test_install_symlinks_creates_missing_link_and_parents(tmp_path): function test_install_symlinks_no_change_when_already_points_to_target (line 377) | def test_install_symlinks_no_change_when_already_points_to_target(tmp_pa... function test_install_symlinks_replaces_wrong_target (line 392) | def test_install_symlinks_replaces_wrong_target(tmp_path): function test_install_symlinks_replaces_existing_regular_file (line 409) | def test_install_symlinks_replaces_existing_regular_file(tmp_path): function test_install_symlinks_dry_run_does_not_touch_fs (line 424) | def test_install_symlinks_dry_run_does_not_touch_fs(tmp_path): function test_update_files_tracks_symlinks_and_removes_stale_symlinks (line 437) | def test_update_files_tracks_symlinks_and_removes_stale_symlinks(tmp_path): function test_update_files_dry_run_does_not_create_or_remove_symlinks (line 483) | def test_update_files_dry_run_does_not_create_or_remove_symlinks(tmp_path): FILE: tests/test_decman_core_fs.py function test_file_from_content_creates_and_is_idempotent (line 11) | def test_file_from_content_creates_and_is_idempotent(tmp_path: Path) -> ... function test_file_content_with_variables_and_change_detection (line 31) | def test_file_content_with_variables_and_change_detection(tmp_path: Path... function test_file_from_source_text_with_and_without_variables (line 52) | def test_file_from_source_text_with_and_without_variables(tmp_path: Path... function test_file_binary_from_content (line 78) | def test_file_binary_from_content(tmp_path: Path) -> None: function test_file_binary_copy_from_source (line 94) | def test_file_binary_copy_from_source(tmp_path: Path) -> None: function test_file_creates_parent_directories_and_applies_permissions (line 112) | def test_file_creates_parent_directories_and_applies_permissions(tmp_pat... function _create_sample_source_tree (line 133) | def _create_sample_source_tree(root: Path) -> None: function test_directory_copy_to_creates_and_is_idempotent (line 139) | def test_directory_copy_to_creates_and_is_idempotent(tmp_path: Path) -> ... function test_directory_copy_to_detects_changes_via_variables (line 171) | def test_directory_copy_to_detects_changes_via_variables(tmp_path: Path)... function test_directory_copy_to_dry_run (line 197) | def test_directory_copy_to_dry_run(tmp_path: Path) -> None: function test_directory_copy_to_restores_working_directory (line 229) | def test_directory_copy_to_restores_working_directory(tmp_path: Path) ->... function test_file_copy_to_dry_run (line 249) | def test_file_copy_to_dry_run(tmp_path): FILE: tests/test_decman_core_module.py function test_module_without_on_disable_is_accepted (line 12) | def test_module_without_on_disable_is_accepted(): function test_on_disable_must_be_staticmethod (line 21) | def test_on_disable_must_be_staticmethod(): function test_on_disable_must_take_no_parameters (line 32) | def test_on_disable_must_take_no_parameters(): function test_on_disable_must_not_use_module_level_globals (line 47) | def test_on_disable_must_not_use_module_level_globals(): function test_on_disable_must_not_close_over_outer_variables (line 61) | def test_on_disable_must_not_close_over_outer_variables(): function test_on_disable_nested_function_without_closure_is_allowed (line 80) | def test_on_disable_nested_function_without_closure_is_allowed(): function test_on_disable_can_use_builtins_and_imports_inside_function (line 98) | def test_on_disable_can_use_builtins_and_imports_inside_function(): function test_write_on_disable_script_returns_none_when_no_on_disable (line 113) | def test_write_on_disable_script_returns_none_when_no_on_disable(tmp_path): function test_write_on_disable_script_creates_executable_script (line 124) | def test_write_on_disable_script_creates_executable_script(tmp_path): function test_write_on_disable_script_uses_module_and_class_in_header (line 163) | def test_write_on_disable_script_uses_module_and_class_in_header(tmp_path): FILE: tests/test_decman_core_output.py function reset_config (line 11) | def reset_config(): function test_print_error_with_color_enabled (line 24) | def test_print_error_with_color_enabled(capsys): function test_print_error_with_color_disabled (line 35) | def test_print_error_with_color_disabled(capsys): function test_print_info_respects_quiet_and_debug (line 45) | def test_print_info_respects_quiet_and_debug(capsys): function test_print_debug_only_with_debug_enabled (line 65) | def test_print_debug_only_with_debug_enabled(capsys): function test_print_continuation_respects_level_and_config (line 77) | def test_print_continuation_respects_level_and_config(capsys): function test_print_list_empty_outputs_nothing (line 89) | def test_print_list_empty_outputs_nothing(capsys): function test_print_list_summary_and_elements (line 94) | def test_print_list_summary_and_elements(capsys, monkeypatch): function test_print_list_respects_elements_per_line_and_width (line 113) | def test_print_list_respects_elements_per_line_and_width(capsys, monkeyp... function test_prompt_number_valid_input (line 135) | def test_prompt_number_valid_input(monkeypatch): function test_prompt_number_invalid_then_valid (line 143) | def test_prompt_number_invalid_then_valid(monkeypatch, capsys): function test_prompt_number_default_on_empty (line 155) | def test_prompt_number_default_on_empty(monkeypatch): function test_prompt_confirm (line 175) | def test_prompt_confirm(monkeypatch, user_input, default, expected): function test_prompt_confirm_invalid_then_yes (line 183) | def test_prompt_confirm_invalid_then_yes(monkeypatch, capsys): FILE: tests/test_decman_core_store.py function test_store_initially_empty_when_file_missing (line 9) | def test_store_initially_empty_when_file_missing(tmp_path: Path) -> None: function test_store_loads_existing_file (line 20) | def test_store_loads_existing_file(tmp_path: Path) -> None: function test_setitem_and_getitem_roundtrip (line 33) | def test_setitem_and_getitem_roundtrip(tmp_path: Path) -> None: function test_get_with_default (line 44) | def test_get_with_default(tmp_path: Path) -> None: function test_save_creates_parent_directory_and_persists (line 55) | def test_save_creates_parent_directory_and_persists(tmp_path: Path) -> N... function test_context_manager_saves_on_normal_exit (line 69) | def test_context_manager_saves_on_normal_exit(tmp_path: Path) -> None: function test_context_manager_saves_even_on_exception (line 81) | def test_context_manager_saves_even_on_exception(tmp_path: Path) -> None: function test_repr_matches_underlying_dict (line 95) | def test_repr_matches_underlying_dict(tmp_path: Path) -> None: function test_store_persists_sets (line 106) | def test_store_persists_sets(tmp_path: Path) -> None: FILE: tests/test_decman_init.py function test_sh_calls_prg_with_sh_command (line 8) | def test_sh_calls_prg_with_sh_command(monkeypatch: pytest.MonkeyPatch): FILE: tests/test_decman_plugins.py function mark (line 5) | def mark(attr): function test_runs_marked_method_and_returns_value (line 10) | def test_runs_marked_method_and_returns_value(): function test_runs_marked_methods_and_returns_value (line 20) | def test_runs_marked_methods_and_returns_value(): function test_returns_none_if_no_method_has_attribute (line 34) | def test_returns_none_if_no_method_has_attribute():