SYMBOL INDEX (264 symbols across 35 files) FILE: .ci/check-changelog.py function main (line 11) | def main() -> None: function get_git_minor_versions (line 32) | def get_git_minor_versions() -> Set[str]: function get_changelog_versions (line 46) | def get_changelog_versions(changelog_path: str) -> Set[str]: function version_to_tuple (line 56) | def version_to_tuple(version: str) -> Tuple[int, ...]: FILE: src/dotbot/cli.py function add_options (line 15) | def add_options(parser: ArgumentParser) -> None: function read_config (line 64) | def read_config(config_files: List[str]) -> Any: function main (line 69) | def main() -> None: FILE: src/dotbot/config.py class ConfigReader (line 10) | class ConfigReader: method __init__ (line 13) | def __init__(self, config_file_paths: List[str]): method _read (line 24) | def _read(self, config_file_path: str) -> Any: method get_config (line 34) | def get_config(self) -> Any: class ReadingError (line 38) | class ReadingError(Exception): FILE: src/dotbot/context.py class Context (line 10) | class Context: method __init__ (line 15) | def __init__( method set_base_directory (line 23) | def set_base_directory(self, base_directory: str) -> None: method base_directory (line 26) | def base_directory(self, canonical_path: bool = True) -> str: # noqa:... method set_defaults (line 32) | def set_defaults(self, defaults: Dict[str, Any]) -> None: method defaults (line 35) | def defaults(self) -> Dict[str, Any]: method options (line 38) | def options(self) -> Namespace: method plugins (line 41) | def plugins(self) -> "Optional[List[Type[Plugin]]]": method dry_run (line 45) | def dry_run(self) -> bool: FILE: src/dotbot/dispatcher.py class Dispatcher (line 19) | class Dispatcher: method __init__ (line 20) | def __init__( method _setup_context (line 41) | def _setup_context( method dispatch (line 50) | def dispatch(self, tasks: List[Dict[str, Any]]) -> bool: class DispatchError (line 114) | class DispatchError(Exception): FILE: src/dotbot/messenger/color.py class Color (line 1) | class Color: FILE: src/dotbot/messenger/level.py class Level (line 5) | class Level(Enum): method __lt__ (line 14) | def __lt__(self, other: Any) -> bool: method __le__ (line 19) | def __le__(self, other: Any) -> bool: method __gt__ (line 24) | def __gt__(self, other: Any) -> bool: method __ge__ (line 29) | def __ge__(self, other: Any) -> bool: method __eq__ (line 34) | def __eq__(self, other: object) -> bool: method __hash__ (line 39) | def __hash__(self) -> int: FILE: src/dotbot/messenger/messenger.py class Messenger (line 6) | class Messenger(metaclass=Singleton): method __init__ (line 7) | def __init__(self, level: Level = Level.ACTION): method set_level (line 11) | def set_level(self, level: Level) -> None: method use_color (line 14) | def use_color(self, yesno: bool) -> None: # noqa: FBT001 method log (line 17) | def log(self, level: Level, message: str) -> None: method debug (line 21) | def debug(self, message: str) -> None: method action (line 24) | def action(self, message: str) -> None: method info (line 27) | def info(self, message: str) -> None: method lowinfo (line 30) | def lowinfo(self, message: str) -> None: method warning (line 34) | def warning(self, message: str) -> None: method error (line 37) | def error(self, message: str) -> None: method _color (line 40) | def _color(self, level: Level) -> str: method _reset (line 56) | def _reset(self) -> str: FILE: src/dotbot/plugin.py class Plugin (line 7) | class Plugin: method __init__ (line 16) | def __init__(self, context: Context): method can_handle (line 20) | def can_handle(self, directive: str) -> bool: method handle (line 26) | def handle(self, directive: str, data: Any) -> bool: FILE: src/dotbot/plugins/clean.py class Clean (line 9) | class Clean(Plugin): method can_handle (line 18) | def can_handle(self, directive: str) -> bool: method handle (line 21) | def handle(self, directive: str, data: Any) -> bool: method _process_clean (line 27) | def _process_clean(self, targets: Any) -> bool: method _clean (line 43) | def _clean(self, target: str, *, force: bool, recursive: bool) -> bool: method _in_directory (line 72) | def _in_directory(self, path: str, directory: str) -> bool: FILE: src/dotbot/plugins/create.py class Create (line 8) | class Create(Plugin): method can_handle (line 17) | def can_handle(self, directive: str) -> bool: method handle (line 20) | def handle(self, directive: str, data: Any) -> bool: method _process_paths (line 26) | def _process_paths(self, paths: Any) -> bool: method _exists (line 43) | def _exists(self, path: str) -> bool: method _create (line 50) | def _create(self, path: str, mode: int) -> bool: FILE: src/dotbot/plugins/link.py class Link (line 13) | class Link(Plugin): method can_handle (line 22) | def can_handle(self, directive: str) -> bool: method handle (line 25) | def handle(self, directive: str, data: Any) -> bool: method _process_links (line 31) | def _process_links(self, links: Any) -> bool: method _test_success (line 157) | def _test_success(self, command: str) -> bool: method _default_target (line 163) | def _default_target(self, link_name: str, target: Optional[str]) -> str: method _has_glob_chars (line 171) | def _has_glob_chars(self, path: str) -> bool: method _glob (line 174) | def _glob(self, path: str) -> List[str]: method _create_glob_results (line 188) | def _create_glob_results(self, path: str, exclude_paths: List[str]) ->... method _is_link (line 201) | def _is_link(self, path: str) -> bool: method _link_target (line 207) | def _link_target(self, path: str) -> str: method _exists (line 217) | def _exists(self, path: str) -> bool: method _lexists (line 224) | def _lexists(self, path: str) -> bool: method _create (line 231) | def _create(self, path: str) -> bool: method _backup (line 249) | def _backup(self, path: str) -> Tuple[bool, bool]: method _delete (line 268) | def _delete( method _relative_path (line 310) | def _relative_path(self, target: str, link_name: str) -> str: method _link (line 318) | def _link( FILE: src/dotbot/plugins/shell.py class Shell (line 7) | class Shell(Plugin): method can_handle (line 17) | def can_handle(self, directive: str) -> bool: method handle (line 20) | def handle(self, directive: str, data: Any) -> bool: method _process_commands (line 26) | def _process_commands(self, data: Any) -> bool: method _get_option_overrides (line 77) | def _get_option_overrides(self) -> Dict[str, bool]: FILE: src/dotbot/util/common.py function shell_command (line 8) | def shell_command( function normslash (line 46) | def normslash(path: str) -> str: FILE: src/dotbot/util/module.py function load (line 13) | def load(path: str) -> List[Type[Plugin]]: function load_module (line 29) | def load_module(module_name: str, path: str) -> ModuleType: function load_plugins (line 39) | def load_plugins(paths: List[str], plugins: Optional[List[Type[Plugin]]]... FILE: src/dotbot/util/singleton.py class Singleton (line 4) | class Singleton(type): method __call__ (line 5) | def __call__(cls, *args: Any, **kwargs: Any) -> Any: method reset_instance (line 10) | def reset_instance(cls) -> None: FILE: src/dotbot/util/string.py function indent_lines (line 1) | def indent_lines(string: str, amount: int = 2, delimiter: str = "\n") ->... FILE: tests/conftest.py function get_long_path (line 18) | def get_long_path(path: str) -> str: function get_path_from_fd (line 38) | def get_path_from_fd(fd: int) -> Optional[str]: function wrap_function (line 60) | def wrap_function( function wrap_open (line 100) | def wrap_open(root: str) -> Callable[..., Any]: function rmtree_error_handler (line 125) | def rmtree_error_handler(_function: Any, path: str, _excinfo: Any) -> None: function standardize_tmp (line 135) | def standardize_tmp() -> None: function root (line 161) | def root(standardize_tmp: None) -> Generator[str, None, None]: function home (line 266) | def home(monkeypatch: pytest.MonkeyPatch, root: str) -> str: class Dotfiles (line 282) | class Dotfiles: method __init__ (line 285) | def __init__(self, root: str): method makedirs (line 292) | def makedirs(self, path: str) -> None: method write (line 295) | def write(self, path: str, content: str = "") -> None: method write_config (line 302) | def write_config(self, config: Any, serializer: str = "yaml", path: Op... method config_filename (line 328) | def config_filename(self) -> str: function dotfiles (line 334) | def dotfiles(root: str) -> Dotfiles: function run_dotbot (line 341) | def run_dotbot(dotfiles: Dotfiles) -> Callable[..., None]: FILE: tests/dotbot_plugin_context_plugin.py class Dispatch (line 10) | class Dispatch(dotbot.Plugin): method can_handle (line 11) | def can_handle(self, directive: str) -> bool: method handle (line 14) | def handle(self, directive: str, data: Any) -> bool: FILE: tests/dotbot_plugin_counter.py class Counter (line 13) | class Counter(dotbot.Plugin): method can_handle (line 14) | def can_handle(self, directive: str) -> bool: method handle (line 17) | def handle(self, directive: str, _data: Any) -> bool: FILE: tests/dotbot_plugin_directory.py class Directory (line 13) | class Directory(dotbot.Plugin): method can_handle (line 14) | def can_handle(self, directive: str) -> bool: method handle (line 17) | def handle(self, directive: str, data: Any) -> bool: FILE: tests/dotbot_plugin_dispatcher_no_plugins.py class Dispatch (line 11) | class Dispatch(dotbot.Plugin): method can_handle (line 12) | def can_handle(self, directive: str) -> bool: method handle (line 15) | def handle(self, directive: str, data: Any) -> bool: FILE: tests/dotbot_plugin_dry_run.py class DryRun (line 7) | class DryRun(dotbot.Plugin): method can_handle (line 13) | def can_handle(self, directive: str) -> bool: method handle (line 16) | def handle(self, _directive: str, _data: Any) -> bool: FILE: tests/dotbot_plugin_file.py class File (line 13) | class File(dotbot.Plugin): method can_handle (line 14) | def can_handle(self, directive: str) -> bool: method handle (line 17) | def handle(self, directive: str, data: Any) -> bool: FILE: tests/dotbot_plugin_issue_357.py class NoopPlugin (line 14) | class NoopPlugin(Plugin): method can_handle (line 17) | def can_handle(self, directive: str) -> bool: method handle (line 20) | def handle(self, directive: str, _data: Any) -> bool: FILE: tests/test_bin_dotbot.py function test_find_python_executable (line 16) | def test_find_python_executable(python_name: Optional[str], home: str, d... FILE: tests/test_clean.py function test_clean_default (line 10) | def test_clean_default(root: str, home: str, dotfiles: Dotfiles, run_dot... function test_clean_environment_variable_expansion (line 30) | def test_clean_environment_variable_expansion(home: str, dotfiles: Dotfi... function test_clean_missing (line 43) | def test_clean_missing(home: str, dotfiles: Dotfiles, run_dotbot: Callab... function test_clean_nonexistent (line 56) | def test_clean_nonexistent(home: str, dotfiles: Dotfiles, run_dotbot: Ca... function test_clean_outside_force (line 65) | def test_clean_outside_force(root: str, home: str, dotfiles: Dotfiles, r... function test_clean_outside (line 75) | def test_clean_outside(home: str, dotfiles: Dotfiles, run_dotbot: Callab... function test_clean_recursive_1 (line 87) | def test_clean_recursive_1(root: str, home: str, dotfiles: Dotfiles, run... function test_clean_recursive_2 (line 102) | def test_clean_recursive_2(root: str, home: str, dotfiles: Dotfiles, run... function test_clean_defaults_1 (line 117) | def test_clean_defaults_1(root: str, home: str, dotfiles: Dotfiles, run_... function test_clean_defaults_2 (line 127) | def test_clean_defaults_2(root: str, home: str, dotfiles: Dotfiles, run_... function test_clean_dry_run (line 142) | def test_clean_dry_run( function test_clean_dry_run_recursive (line 160) | def test_clean_dry_run_recursive( FILE: tests/test_cli.py function test_except_create (line 10) | def test_except_create( function test_except_shell (line 32) | def test_except_shell( function test_except_multiples (line 54) | def test_except_multiples( function test_exit_on_failure (line 76) | def test_exit_on_failure(home: str, dotfiles: Dotfiles, run_dotbot: Call... function test_only (line 93) | def test_only( function test_only_with_defaults (line 111) | def test_only_with_defaults( function test_only_with_multiples (line 130) | def test_only_with_multiples( function test_plugin_loading_file (line 150) | def test_plugin_loading_file(home: str, dotfiles: Dotfiles, run_dotbot: ... function test_plugin_loading_directory (line 162) | def test_plugin_loading_directory(home: str, dotfiles: Dotfiles, run_dot... function test_issue_357 (line 175) | def test_issue_357( function test_disable_builtin_plugins (line 190) | def test_disable_builtin_plugins(home: str, dotfiles: Dotfiles, run_dotb... function test_plugin_context_plugin (line 203) | def test_plugin_context_plugin( function test_plugin_dispatcher_no_plugins (line 218) | def test_plugin_dispatcher_no_plugins( function test_dry_run_unaware_plugin (line 233) | def test_dry_run_unaware_plugin( function test_dry_run_aware_plugin (line 249) | def test_dry_run_aware_plugin( function test_dry_run_aware_plugin_no_dry_run (line 264) | def test_dry_run_aware_plugin_no_dry_run(home: str, dotfiles: Dotfiles, ... FILE: tests/test_config.py function test_config_blank (line 8) | def test_config_blank(dotfiles: Dotfiles, run_dotbot: Callable[..., None... function test_config_empty (line 15) | def test_config_empty(dotfiles: Dotfiles, run_dotbot: Callable[..., None... function test_json (line 22) | def test_json(home: str, dotfiles: Dotfiles, run_dotbot: Callable[..., N... function test_json_tabs (line 32) | def test_json_tabs(home: str, dotfiles: Dotfiles, run_dotbot: Callable[.... function test_multiple_config (line 42) | def test_multiple_config(home: str, dotfiles: Dotfiles, run_dotbot: Call... FILE: tests/test_create.py function test_directory_creation (line 11) | def test_directory_creation(home: str, directory: str, dotfiles: Dotfile... function test_default_mode (line 23) | def test_default_mode(home: str, dotfiles: Dotfiles, run_dotbot: Callabl... function test_default_mode_override (line 42) | def test_default_mode_override(home: str, dotfiles: Dotfiles, run_dotbot... function test_create_dry_run (line 64) | def test_create_dry_run( FILE: tests/test_link.py function test_link_canonicalization (line 15) | def test_link_canonicalization(home: str, dotfiles: Dotfiles, run_dotbot... function test_link_default_target (line 40) | def test_link_default_target( function test_link_environment_user_expansion_link_name (line 69) | def test_link_environment_user_expansion_link_name( function test_link_environment_variable_expansion_target (line 86) | def test_link_environment_variable_expansion_target( function test_link_environment_variable_expansion_target_extended (line 103) | def test_link_environment_variable_expansion_target_extended( function test_link_environment_variable_expansion_link_name (line 120) | def test_link_environment_variable_expansion_link_name( function test_link_environment_variable_unset (line 155) | def test_link_environment_variable_unset( function test_link_force_leaves_when_nonexistent (line 169) | def test_link_force_leaves_when_nonexistent(home: str, dotfiles: Dotfile... function test_link_force_overwrite_symlink (line 190) | def test_link_force_overwrite_symlink(home: str, dotfiles: Dotfiles, run... function test_link_force_directory (line 204) | def test_link_force_directory(home: str, dotfiles: Dotfiles, run_dotbot:... function test_link_backup_directory (line 220) | def test_link_backup_directory(home: str, dotfiles: Dotfiles, run_dotbot... function test_link_backup_file (line 240) | def test_link_backup_file(home: str, dotfiles: Dotfiles, run_dotbot: Cal... function test_link_backup_not_created_if_link (line 259) | def test_link_backup_not_created_if_link(home: str, dotfiles: Dotfiles, ... function test_link_backup_created_if_force (line 274) | def test_link_backup_created_if_force(home: str, dotfiles: Dotfiles, run... function test_link_backup_error_if_dest_already_exists (line 293) | def test_link_backup_error_if_dest_already_exists( function test_link_backup_glob (line 319) | def test_link_backup_glob(home: str, dotfiles: Dotfiles, run_dotbot: Cal... function test_link_backup_dry_run (line 365) | def test_link_backup_dry_run(home: str, dotfiles: Dotfiles, run_dotbot: ... function test_link_backup_relink_force_with_existing_incorrect_symlink (line 381) | def test_link_backup_relink_force_with_existing_incorrect_symlink( function test_link_backup_relink_real_file_skips_delete (line 411) | def test_link_backup_relink_real_file_skips_delete( function test_link_backup_relink_with_existing_incorrect_symlink_glob (line 450) | def test_link_backup_relink_with_existing_incorrect_symlink_glob( function test_link_glob_1 (line 480) | def test_link_glob_1(home: str, dotfiles: Dotfiles, run_dotbot: Callable... function test_link_glob_2 (line 502) | def test_link_glob_2(home: str, dotfiles: Dotfiles, run_dotbot: Callable... function test_link_glob_3 (line 524) | def test_link_glob_3(home: str, dotfiles: Dotfiles, run_dotbot: Callable... function test_link_glob_4 (line 546) | def test_link_glob_4(home: str, dotfiles: Dotfiles, run_dotbot: Callable... function test_link_glob_force (line 574) | def test_link_glob_force(home: str, dotfiles: Dotfiles, run_dotbot: Call... function test_link_glob_ignore_no_glob_chars (line 605) | def test_link_glob_ignore_no_glob_chars( function test_link_glob_exclude_1 (line 628) | def test_link_glob_exclude_1(home: str, dotfiles: Dotfiles, run_dotbot: ... function test_link_glob_exclude_2 (line 670) | def test_link_glob_exclude_2(home: str, dotfiles: Dotfiles, run_dotbot: ... function test_link_glob_exclude_3 (line 714) | def test_link_glob_exclude_3(home: str, dotfiles: Dotfiles, run_dotbot: ... function test_link_glob_exclude_4 (line 765) | def test_link_glob_exclude_4(home: str, dotfiles: Dotfiles, run_dotbot: ... function test_link_glob_multi_star (line 812) | def test_link_glob_multi_star(home: str, dotfiles: Dotfiles, run_dotbot:... function test_link_glob_patterns (line 848) | def test_link_glob_patterns( function test_link_glob_recursive (line 882) | def test_link_glob_recursive(home: str, dotfiles: Dotfiles, run_dotbot: ... function test_link_glob_no_match (line 908) | def test_link_glob_no_match(home: str, dotfiles: Dotfiles, run_dotbot: C... function test_link_glob_single_match (line 922) | def test_link_glob_single_match(home: str, dotfiles: Dotfiles, run_dotbo... function test_link_if (line 946) | def test_link_if(home: str, dotfiles: Dotfiles, run_dotbot: Callable[...... function test_link_if_defaults (line 977) | def test_link_if_defaults(home: str, dotfiles: Dotfiles, run_dotbot: Cal... function test_link_if_windows (line 1010) | def test_link_if_windows(home: str, dotfiles: Dotfiles, run_dotbot: Call... function test_link_if_defaults_windows (line 1041) | def test_link_if_defaults_windows(home: str, dotfiles: Dotfiles, run_dot... function test_link_ignore_missing (line 1071) | def test_link_ignore_missing( function test_link_leaves_file (line 1100) | def test_link_leaves_file(home: str, dotfiles: Dotfiles, run_dotbot: Cal... function test_link_no_canonicalize (line 1115) | def test_link_no_canonicalize(key: str, home: str, dotfiles: Dotfiles, r... function test_link_prefix (line 1133) | def test_link_prefix(home: str, dotfiles: Dotfiles, run_dotbot: Callable... function test_link_relative (line 1161) | def test_link_relative(home: str, dotfiles: Dotfiles, run_dotbot: Callab... function test_link_relink_leaves_file (line 1222) | def test_link_relink_leaves_file(home: str, dotfiles: Dotfiles, run_dotb... function test_link_relink_overwrite_symlink (line 1235) | def test_link_relink_overwrite_symlink(home: str, dotfiles: Dotfiles, ru... function test_link_relink_relative_leaves_file (line 1248) | def test_link_relink_relative_leaves_file(home: str, dotfiles: Dotfiles,... function test_target_is_not_overwritten_by_symlink_trickery (line 1278) | def test_target_is_not_overwritten_by_symlink_trickery( function test_link_defaults_1 (line 1322) | def test_link_defaults_1(home: str, dotfiles: Dotfiles, run_dotbot: Call... function test_link_defaults_2 (line 1343) | def test_link_defaults_2(home: str, dotfiles: Dotfiles, run_dotbot: Call... function test_link_type_symlink (line 1379) | def test_link_type_symlink( function test_link_type_hardlink (line 1407) | def test_link_type_hardlink( function test_unknown_link_type (line 1435) | def test_unknown_link_type( function test_symlink_exists_when_hardlink_requested (line 1450) | def test_symlink_exists_when_hardlink_requested( function test_hardlink_already_exists (line 1475) | def test_hardlink_already_exists( function test_broken_symlink_shows_invalid_link_message (line 1498) | def test_broken_symlink_shows_invalid_link_message( function test_link_dry_run (line 1521) | def test_link_dry_run( function test_link_dry_run_if (line 1552) | def test_link_dry_run_if( function test_link_dry_run_create (line 1588) | def test_link_dry_run_create( function test_link_dry_run_relink (line 1619) | def test_link_dry_run_relink( function test_link_dry_run_overwrite (line 1651) | def test_link_dry_run_overwrite( function test_link_error_creating_link (line 1691) | def test_link_error_creating_link( function test_link_error_creating_directory (line 1725) | def test_link_error_creating_directory( function test_link_error_delete (line 1759) | def test_link_error_delete( FILE: tests/test_noop.py function test_success (line 6) | def test_success(root: str) -> None: function test_failure (line 14) | def test_failure() -> None: FILE: tests/test_plugins.py function test_plugin_file (line 10) | def test_plugin_file(home: str, dotfiles: Dotfiles, run_dotbot: Callable... function test_plugin_absolute_path (line 26) | def test_plugin_absolute_path(home: str, dotfiles: Dotfiles, run_dotbot:... function test_plugin_directory (line 41) | def test_plugin_directory(home: str, dotfiles: Dotfiles, run_dotbot: Cal... function test_plugin_multiple (line 57) | def test_plugin_multiple(home: str, dotfiles: Dotfiles, run_dotbot: Call... function test_plugin_command_line_and_config (line 78) | def test_plugin_command_line_and_config(home: str, dotfiles: Dotfiles, r... function test_plugin_nonexistent (line 99) | def test_plugin_nonexistent( function test_plugin_empty_list (line 117) | def test_plugin_empty_list(home: str, dotfiles: Dotfiles, run_dotbot: Ca... function test_plugin_multiple_directives (line 131) | def test_plugin_multiple_directives(home: str, dotfiles: Dotfiles, run_d... function test_plugin_duplicate_loading (line 153) | def test_plugin_duplicate_loading(home: str, dotfiles: Dotfiles, run_dot... function test_plugin_subdirectory (line 170) | def test_plugin_subdirectory(home: str, dotfiles: Dotfiles, run_dotbot: ... FILE: tests/test_shell.py function test_shell_allow_stdout (line 8) | def test_shell_allow_stdout( function test_shell_cli_verbosity_overrides_1 (line 31) | def test_shell_cli_verbosity_overrides_1( function test_shell_cli_verbosity_overrides_2 (line 43) | def test_shell_cli_verbosity_overrides_2( function test_shell_cli_verbosity_overrides_3 (line 55) | def test_shell_cli_verbosity_overrides_3( function test_shell_cli_verbosity_stderr (line 72) | def test_shell_cli_verbosity_stderr( function test_shell_cli_verbosity_stderr_with_explicit_stdout_off (line 84) | def test_shell_cli_verbosity_stderr_with_explicit_stdout_off( function test_shell_cli_verbosity_stderr_with_defaults_stdout_off (line 107) | def test_shell_cli_verbosity_stderr_with_defaults_stdout_off( function test_shell_single_v_verbosity_stdout (line 134) | def test_shell_single_v_verbosity_stdout( function test_shell_single_v_verbosity_stderr (line 146) | def test_shell_single_v_verbosity_stderr( function test_shell_compact_stdout_1 (line 158) | def test_shell_compact_stdout_1( function test_shell_compact_stdout_2 (line 175) | def test_shell_compact_stdout_2( function test_shell_stdout_disabled_by_default (line 193) | def test_shell_stdout_disabled_by_default( function test_shell_can_override_defaults (line 211) | def test_shell_can_override_defaults( function test_shell_quiet_default (line 228) | def test_shell_quiet_default( function test_shell_quiet_enabled_with_description (line 253) | def test_shell_quiet_enabled_with_description( function test_shell_quiet_enabled_without_description (line 279) | def test_shell_quiet_enabled_without_description( function test_shell_dry_run (line 303) | def test_shell_dry_run(capfd: pytest.CaptureFixture[str], dotfiles: Dotf... FILE: tests/test_shim.py function test_shim (line 11) | def test_shim(home: str, dotfiles: Dotfiles) -> None: