SYMBOL INDEX (342 symbols across 30 files) FILE: docs/.vitepress/config.mjs method transformItems (line 29) | transformItems(items) { FILE: remark/cli/commands.py function get_version (line 29) | def get_version(): class CLI (line 39) | class CLI: method __init__ (line 42) | def __init__(self): method _validate_folder (line 60) | def _validate_folder(self, path: str) -> bool: method _start_update_checker (line 70) | def _start_update_checker(self): method _run_update_check (line 75) | def _run_update_check(self): method check_update_now (line 82) | def check_update_now(self) -> bool: method _wait_for_update_check (line 105) | def _wait_for_update_check(self, timeout: float = 2.0) -> None: method _prompt_update (line 113) | def _prompt_update(self) -> None: method _perform_update (line 129) | def _perform_update(self, update: dict) -> None: method add_comment (line 168) | def add_comment(self, path, comment): method delete_comment (line 174) | def delete_comment(self, path): method install_menu (line 180) | def install_menu(self) -> bool: method uninstall_menu (line 193) | def uninstall_menu(self) -> bool: method gui_mode (line 202) | def gui_mode(self, folder_path: str) -> bool: method view_comment (line 214) | def view_comment(self, path: str) -> None: method interactive_mode (line 253) | def interactive_mode(self) -> None: method _show_command_list (line 299) | def _show_command_list(self) -> None: method _interactive_help (line 305) | def _interactive_help(self) -> None: method show_help (line 315) | def show_help(self) -> None: method _select_from_multiple_candidates (line 341) | def _select_from_multiple_candidates( method _handle_ambiguous_path (line 382) | def _handle_ambiguous_path(self, args_list: list[str]) -> tuple[str | ... method _resolve_path_from_ambiguous_args (line 426) | def _resolve_path_from_ambiguous_args(self, args_list: list[str]) -> s... method run (line 456) | def run(self, argv=None) -> None: function main (line 521) | def main() -> None: FILE: remark/core/base.py class CommentHandler (line 8) | class CommentHandler(ABC): method set_comment (line 12) | def set_comment(self, path, comment): method get_comment (line 17) | def get_comment(self, path): method delete_comment (line 22) | def delete_comment(self, path): method supports (line 27) | def supports(self, path): FILE: remark/core/folder_handler.py class FolderCommentHandler (line 18) | class FolderCommentHandler(CommentHandler): method set_comment (line 21) | def set_comment(self, folder_path: str, comment: str) -> bool: method _set_comment_desktop_ini (line 38) | def _set_comment_desktop_ini(folder_path: str, comment: str) -> bool: method get_comment (line 76) | def get_comment(self, folder_path: str) -> str | None: method delete_comment (line 80) | def delete_comment(self, folder_path: str) -> bool: method supports (line 108) | def supports(self, path: str) -> bool: FILE: remark/gui/remark_dialog.py function show_remark_dialog (line 13) | def show_remark_dialog(folder_path: str) -> str | None: FILE: remark/i18n.py function _get_locale_dir (line 24) | def _get_locale_dir() -> Path: function _get_windows_locale (line 47) | def _get_windows_locale() -> str | None: function get_system_language (line 79) | def get_system_language() -> str: function init_translation (line 137) | def init_translation(language: str | None = None) -> gettext.GNUTranslat... function get_translator (line 172) | def get_translator() -> gettext.GNUTranslations | gettext.NullTranslations: function set_language (line 185) | def set_language(language: str) -> None: function gettext_function (line 196) | def gettext_function(message: str) -> str: function ngettext_function (line 209) | def ngettext_function(singular: str, plural: str, n: int) -> str: FILE: remark/storage/desktop_ini.py class EncodingConversionCanceled (line 20) | class EncodingConversionCanceled(Exception): # noqa: N818 class DesktopIniHandler (line 33) | class DesktopIniHandler: method get_path (line 49) | def get_path(folder_path): method exists (line 62) | def exists(folder_path): method read_info_tip (line 75) | def read_info_tip(folder_path): method write_info_tip (line 136) | def write_info_tip(folder_path, info_tip): method detect_encoding (line 227) | def detect_encoding(file_path): method fix_encoding (line 265) | def fix_encoding(file_path, current_encoding): method ensure_utf16_encoding (line 290) | def ensure_utf16_encoding(file_path): method remove_info_tip (line 351) | def remove_info_tip(folder_path): method delete (line 417) | def delete(folder_path): method set_folder_system_attributes (line 439) | def set_folder_system_attributes(folder_path): method set_file_hidden_system_attributes (line 484) | def set_file_hidden_system_attributes(file_path): method clear_file_attributes (line 506) | def clear_file_attributes(file_path): FILE: remark/utils/path_resolver.py class NextResult (line 16) | class NextResult(Enum): class Cursor (line 24) | class Cursor: method jump_to_last_separator (line 38) | def jump_to_last_separator(self, normalized_args: list[str]) -> None: method next (line 52) | def next(self, normalized_args: list[str]) -> tuple["Cursor", NextResu... function get_between (line 91) | def get_between(begin: Cursor, end: Cursor, normalized_args: list[str]) ... function build_pattern (line 124) | def build_pattern(parts: list[str]) -> re.Pattern: function get_current_working_path (line 155) | def get_current_working_path( function get_inner_items_list (line 191) | def get_inner_items_list(current_working_path: Path) -> list[Path]: function find_candidates (line 201) | def find_candidates( function get_remaining_args (line 337) | def get_remaining_args(cursor: Cursor, normalized_args: list[str]) -> li... FILE: remark/utils/platform.py function check_platform (line 10) | def check_platform() -> bool: FILE: remark/utils/registry.py function get_executable_path (line 27) | def get_executable_path() -> str: function install_context_menu (line 46) | def install_context_menu() -> bool: function uninstall_context_menu (line 93) | def uninstall_context_menu() -> bool: FILE: remark/utils/updater.py function _get_proxies (line 24) | def _get_proxies() -> dict[str, str] | None: function _create_opener (line 38) | def _create_opener(): function _get_cache_file_path (line 47) | def _get_cache_file_path() -> str: function get_executable_path (line 52) | def get_executable_path() -> str: function get_latest_release (line 62) | def get_latest_release() -> dict[str, Any] | None: function should_check_update (line 109) | def should_check_update() -> bool: function update_next_check_time (line 130) | def update_next_check_time() -> None: function check_updates_auto (line 143) | def check_updates_auto(current_version: str) -> dict[str, Any] | None: function check_updates_manual (line 175) | def check_updates_manual(current_version: str) -> dict[str, Any] | None: function download_update (line 201) | def download_update(url: str, dest: str) -> str: function create_update_script (line 245) | def create_update_script(old_exe: str, new_exe: str) -> str: function trigger_update (line 281) | def trigger_update(script_path: str) -> None: FILE: scripts/analyze_exe_size.py function run_archive_viewer (line 19) | def run_archive_viewer(exe_path: str) -> str: function parse_archive_content (line 32) | def parse_archive_content(content: str) -> dict[str, int]: function parse_pyz_content (line 46) | def parse_pyz_content(content: str) -> dict[str, int]: function generate_report (line 76) | def generate_report( function main (line 179) | def main(): FILE: scripts/build.py function get_project_version (line 40) | def get_project_version(): function clean_build_files (line 53) | def clean_build_files(): function ensure_upx (line 68) | def ensure_upx(): function build_exe (line 85) | def build_exe(): function main (line 127) | def main(): FILE: scripts/check_i18n.py function check_po_file (line 8) | def check_po_file(path: str) -> bool: FILE: scripts/ensure_upx.py function get_proxies (line 38) | def get_proxies() -> dict[str, str] | None: function create_opener (line 52) | def create_opener(): function get_system_info (line 61) | def get_system_info(): function get_latest_upx_version (line 74) | def get_latest_upx_version() -> tuple[str, str, str] | None: function find_upx_executable (line 130) | def find_upx_executable() -> str | None: function download_upx (line 153) | def download_upx(version: str, download_url: str, asset_name: str) -> st... function verify_upx (line 232) | def verify_upx(upx_path: str) -> bool: function ensure_upx (line 251) | def ensure_upx() -> str | None: function main (line 293) | def main(): FILE: scripts/release.py function get_current_version (line 34) | def get_current_version(): function update_version (line 45) | def update_version(new_version): function bump_version (line 70) | def bump_version(current, part="patch"): function create_tag (line 87) | def create_tag(version, override=False): function push_tag (line 102) | def push_tag(tag_name, force=False): function commit_version_changes (line 112) | def commit_version_changes(): function check_branch (line 120) | def check_branch(): function check_working_directory_clean (line 132) | def check_working_directory_clean(): function check_remote_sync (line 143) | def check_remote_sync(): function get_latest_tag (line 156) | def get_latest_tag() -> str | None: function validate_version_increment (line 173) | def validate_version_increment(current: str, new: str) -> bool: function is_version_releasable (line 185) | def is_version_releasable(version: str) -> bool: function main (line 194) | def main(): FILE: tests/conftest.py function pytest_configure (line 21) | def pytest_configure(config): function pytest_collection_modifyitems (line 42) | def pytest_collection_modifyitems(config, items): function set_chinese_language (line 52) | def set_chinese_language(): FILE: tests/integration/conftest.py function utf16_encoded_file (line 9) | def utf16_encoded_file(tmp_path): function utf8_encoded_file (line 21) | def utf8_encoded_file(tmp_path): FILE: tests/integration/test_encoding_handling.py class TestEncodingHandling (line 12) | class TestEncodingHandling: method test_write_and_read_utf16 (line 15) | def test_write_and_read_utf16(self, tmp_path): method test_read_gbk_encoded_file (line 32) | def test_read_gbk_encoded_file(self, tmp_path): method test_read_utf8_encoded_file (line 45) | def test_read_utf8_encoded_file(self, tmp_path): method test_encoding_detection_utf16 (line 58) | def test_encoding_detection_utf16(self, utf16_encoded_file): method test_encoding_detection_utf8 (line 64) | def test_encoding_detection_utf8(self, utf8_encoded_file): method test_write_various_characters (line 82) | def test_write_various_characters(self, tmp_path, comment): method test_write_long_comment (line 93) | def test_write_long_comment(self, tmp_path): method test_update_preserves_encoding (line 106) | def test_update_preserves_encoding(self, tmp_path): method test_write_new_line_endings (line 127) | def test_write_new_line_endings(self, tmp_path): method test_read_without_bom (line 144) | def test_read_without_bom(self, tmp_path): method test_empty_folder (line 157) | def test_empty_folder(self, tmp_path): method test_corrupted_ini_file (line 165) | def test_corrupted_ini_file(self, tmp_path): FILE: tests/unit/test_cli_commands.py class TestCLI (line 11) | class TestCLI: method disable_background_update_check (line 15) | def disable_background_update_check(self, monkeypatch): method test_init (line 22) | def test_init(self): method test_validate_folder_not_exists (line 27) | def test_validate_folder_not_exists(self, capsys): method test_validate_folder_not_dir (line 36) | def test_validate_folder_not_dir(self, fs, capsys): method test_validate_folder_success (line 46) | def test_validate_folder_success(self, fs): method test_add_comment_success (line 54) | def test_add_comment_success(self, fs): method test_add_comment_invalid_folder (line 61) | def test_add_comment_invalid_folder(self): method test_delete_comment_success (line 68) | def test_delete_comment_success(self, fs): method test_delete_comment_invalid_folder (line 75) | def test_delete_comment_invalid_folder(self): method test_view_comment_with_content (line 82) | def test_view_comment_with_content(self, fs, capsys): method test_view_comment_without_content (line 95) | def test_view_comment_without_content(self, fs, capsys): method test_view_comment_with_encoding_issue_and_fix (line 108) | def test_view_comment_with_encoding_issue_and_fix(self, fs, capsys): method test_view_comment_with_encoding_issue_and_skip (line 130) | def test_view_comment_with_encoding_issue_and_skip(self, fs, capsys): method test_view_comment_with_correct_encoding (line 151) | def test_view_comment_with_correct_encoding(self, fs, capsys): method test_interactive_mode_valid_input (line 175) | def test_interactive_mode_valid_input(self, fs, monkeypatch): method test_interactive_mode_invalid_path_then_valid (line 208) | def test_interactive_mode_invalid_path_then_valid(self, fs, monkeypatc... method test_interactive_mode_empty_comment_retry (line 241) | def test_interactive_mode_empty_comment_retry(self, fs, monkeypatch, c... method test_show_help (line 273) | def test_show_help(self, capsys): method test_run_with_help (line 282) | def test_run_with_help(self, capsys): method test_run_with_delete (line 290) | def test_run_with_delete(self, fs): method test_run_with_view (line 297) | def test_run_with_view(self, fs): method test_run_with_path_and_comment (line 304) | def test_run_with_path_and_comment(self, fs, monkeypatch): method test_run_interactive_mode (line 312) | def test_run_interactive_mode(self, monkeypatch): method test_run_platform_check_fail (line 319) | def test_run_platform_check_fail(self): class TestResolvePathAmbiguousArgs (line 333) | class TestResolvePathAmbiguousArgs: method disable_background_update_check (line 337) | def disable_background_update_check(self, monkeypatch): method test_resolve_path_valid_folder (line 345) | def test_resolve_path_valid_folder(self, fs): method test_resolve_path_file_rejected (line 354) | def test_resolve_path_file_rejected(self, fs): method test_resolve_path_no_candidates (line 362) | def test_resolve_path_no_candidates(self, fs): method test_resolve_path_single_candidate (line 369) | def test_resolve_path_single_candidate(self, fs, monkeypatch, capsys): method test_resolve_path_multiple_candidates_user_cancels (line 381) | def test_resolve_path_multiple_candidates_user_cancels(self, fs, monke... method test_resolve_path_multiple_candidates_user_selects (line 393) | def test_resolve_path_multiple_candidates_user_selects(self, fs, monke... class TestGetVersion (line 409) | class TestGetVersion: method test_get_version_from_package (line 412) | def test_get_version_from_package(self): method test_get_version_fallback (line 419) | def test_get_version_fallback(self): class TestInteractiveCommands (line 431) | class TestInteractiveCommands: method disable_background_update_check (line 435) | def disable_background_update_check(self, monkeypatch): method test_interactive_commands_list_initialized (line 442) | def test_interactive_commands_list_initialized(self): method test_show_command_list (line 451) | def test_show_command_list(self, capsys): method test_interactive_help_shows_commands (line 463) | def test_interactive_help_shows_commands(self, capsys): method test_interactive_mode_handles_hash_only (line 476) | def test_interactive_mode_handles_hash_only(self, fs, monkeypatch, cap... FILE: tests/unit/test_desktop_ini.py class TestDesktopIniHandler (line 17) | class TestDesktopIniHandler: method test_get_path (line 20) | def test_get_path(self): method test_exists (line 30) | def test_exists(self, exists_return, expected): method test_read_info_tip_no_file (line 36) | def test_read_info_tip_no_file(self): method test_read_info_tip_with_content (line 54) | def test_read_info_tip_with_content(self, content, expected): method test_write_info_tip_empty (line 64) | def test_write_info_tip_empty(self): method test_write_info_tip_new_file (line 69) | def test_write_info_tip_new_file(self): method test_write_info_tip_update_existing (line 79) | def test_write_info_tip_update_existing(self): method test_detect_encoding_utf16_le (line 95) | def test_detect_encoding_utf16_le(self): method test_detect_encoding_utf16_be (line 106) | def test_detect_encoding_utf16_be(self): method test_detect_encoding_utf8_bom (line 117) | def test_detect_encoding_utf8_bom(self): method test_set_file_hidden_system_attributes (line 128) | def test_set_file_hidden_system_attributes(self): method test_clear_file_attributes (line 138) | def test_clear_file_attributes(self): method test_delete_file_exists (line 147) | def test_delete_file_exists(self): method test_delete_no_file (line 153) | def test_delete_no_file(self): method test_constants (line 159) | def test_constants(self): class TestEncodingConversionCanceled (line 166) | class TestEncodingConversionCanceled: method test_exception_creation (line 169) | def test_exception_creation(self): FILE: tests/unit/test_folder_handler.py class TestFolderCommentHandler (line 11) | class TestFolderCommentHandler: method test_init (line 14) | def test_init(self): method test_supports (line 23) | def test_supports(self, is_dir, expected): method test_set_comment_not_folder (line 30) | def test_set_comment_not_folder(self, capsys): method test_set_comment_too_long (line 39) | def test_set_comment_too_long(self, capsys): method test_set_comment_success (line 58) | def test_set_comment_success(self): method test_get_comment (line 76) | def test_get_comment(self, read_return, expected): method test_delete_comment_no_ini (line 86) | def test_delete_comment_no_ini(self, capsys): method test_delete_comment_with_ini (line 95) | def test_delete_comment_with_ini(self): method test_delete_comment_clear_failure (line 112) | def test_delete_comment_clear_failure(self): method test_set_comment_desktop_ini (line 125) | def test_set_comment_desktop_ini(self): method test_max_comment_length_constant (line 149) | def test_max_comment_length_constant(self): FILE: tests/unit/test_i18n.py class TestGetWindowsLocale (line 19) | class TestGetWindowsLocale: method test_get_windows_locale_success (line 30) | def test_get_windows_locale_success(self, locale_name, expected): method test_get_windows_locale_api_fails (line 41) | def test_get_windows_locale_api_fails(self): method test_get_windows_locale_exception (line 47) | def test_get_windows_locale_exception(self): class TestGetSystemLanguage (line 55) | class TestGetSystemLanguage: method test_windows_platform_priority (line 66) | def test_windows_platform_priority(self, windows_locale, expected): method test_windows_unsupported_locale_fallback (line 79) | def test_windows_unsupported_locale_fallback(self, windows_locale): method test_windows_api_null_fallback_to_locale (line 88) | def test_windows_api_null_fallback_to_locale(self): method test_locale_getlocale_variations (line 108) | def test_locale_getlocale_variations(self, locale_value, expected): method test_lang_environment_variable (line 126) | def test_lang_environment_variable(self, env_lang, expected): method test_all_methods_fallback_to_default (line 135) | def test_all_methods_fallback_to_default(self): class TestInitTranslation (line 146) | class TestInitTranslation: method test_init_translation_supported_language (line 156) | def test_init_translation_supported_language(self, language, expected_... method test_init_translation_unsupported_language_fallback (line 162) | def test_init_translation_unsupported_language_fallback(self): method test_init_translation_none_uses_system (line 169) | def test_init_translation_none_uses_system(self): class TestSetLanguage (line 177) | class TestSetLanguage: method test_set_language_updates_translator (line 180) | def test_set_language_updates_translator(self): class TestGetTextFunction (line 191) | class TestGetTextFunction: method test_gettext_function_returns_string (line 194) | def test_gettext_function_returns_string(self): method test_ngettext_function_singular (line 199) | def test_ngettext_function_singular(self): method test_ngettext_function_plural (line 204) | def test_ngettext_function_plural(self): FILE: tests/unit/test_path_resolver.py class TestFindCandidates (line 13) | class TestFindCandidates: method test_single_space_split (line 17) | def test_single_space_split(self, fs): method test_multi_space_folder_name_with_comment (line 43) | def test_multi_space_folder_name_with_comment(self, fs): method test_valid_folder_with_comment (line 69) | def test_valid_folder_with_comment(self, fs): method test_no_match (line 93) | def test_no_match(self, fs): method test_both_single_name_and_extended_exist (line 116) | def test_both_single_name_and_extended_exist(self, fs): method test_subdirectory_recursive_matching (line 154) | def test_subdirectory_recursive_matching(self, fs): method test_empty_args (line 208) | def test_empty_args(self): method test_multiple_slashes_in_single_arg (line 222) | def test_multiple_slashes_in_single_arg(self, fs): method test_absolute_path_with_slash_arg (line 270) | def test_absolute_path_with_slash_arg(self, fs): method test_empty_directory (line 315) | def test_empty_directory(self, fs): method test_separator_no_match (line 337) | def test_separator_no_match(self, fs): method test_file_skipped (line 365) | def test_file_skipped(self, fs): class TestGetCurrentWorkingPath (line 389) | class TestGetCurrentWorkingPath: method test_empty_string (line 392) | def test_empty_string(self): method test_absolute_root (line 401) | def test_absolute_root(self): method test_absolute_with_trailing_slash (line 410) | def test_absolute_with_trailing_slash(self): method test_absolute_without_trailing_slash (line 419) | def test_absolute_without_trailing_slash(self): method test_absolute_multi_level (line 428) | def test_absolute_multi_level(self): method test_forward_slash_normalization (line 437) | def test_forward_slash_normalization(self): method test_relative_single (line 446) | def test_relative_single(self): method test_relative_with_backslash (line 455) | def test_relative_with_backslash(self): FILE: tests/unit/test_platform.py class TestPlatform (line 11) | class TestPlatform: method test_check_platform_windows (line 23) | def test_check_platform_windows(self, system_name, expected): method test_check_platform_non_windows (line 33) | def test_check_platform_non_windows(self, system_name, capsys): method test_check_platform_case_sensitive (line 45) | def test_check_platform_case_sensitive(self, system_name, capsys): FILE: tests/unit/test_registry.py class TestRegistry (line 13) | class TestRegistry: method test_get_executable_path_frozen (line 17) | def test_get_executable_path_frozen(self, mock_sys): method test_get_executable_path_dev (line 28) | def test_get_executable_path_dev(self, mock_path, mock_sys): method test_install_context_menu_success (line 44) | def test_install_context_menu_success(self, mock_get_exe, mock_winreg): method test_install_context_menu_permission_error (line 59) | def test_install_context_menu_permission_error(self, mock_winreg): method test_uninstall_context_menu_success (line 69) | def test_uninstall_context_menu_success(self, mock_get_exe, mock_winreg): method test_uninstall_context_menu_not_installed (line 80) | def test_uninstall_context_menu_not_installed(self, mock_winreg): method test_uninstall_context_menu_permission_error (line 89) | def test_uninstall_context_menu_permission_error(self, mock_winreg): FILE: tests/unit/test_release.py class TestValidateVersionIncrement (line 15) | class TestValidateVersionIncrement: method test_patch_increment (line 18) | def test_patch_increment(self): method test_minor_increment (line 23) | def test_minor_increment(self): method test_major_increment (line 28) | def test_major_increment(self): method test_same_version_fails (line 33) | def test_same_version_fails(self): method test_lower_version_fails (line 37) | def test_lower_version_fails(self): function test_check_working_directory_clean (line 53) | def test_check_working_directory_clean(status_output, expected_result): function test_check_branch (line 73) | def test_check_branch(branch_name, is_main): function test_check_remote_sync (line 94) | def test_check_remote_sync(status_output, is_synced): class TestPushCommitInteraction (line 105) | class TestPushCommitInteraction: method test_push_implies_commit (line 108) | def test_push_implies_commit(self, capsys): FILE: tests/unit/test_updater.py class TestProxyFunctions (line 28) | class TestProxyFunctions: method test_get_proxies_no_env (line 31) | def test_get_proxies_no_env(self, monkeypatch): method test_get_proxies_http_only (line 39) | def test_get_proxies_http_only(self, monkeypatch): method test_get_proxies_http_lowercase (line 48) | def test_get_proxies_http_lowercase(self, monkeypatch): method test_get_proxies_https_only (line 57) | def test_get_proxies_https_only(self, monkeypatch): method test_get_proxies_both (line 66) | def test_get_proxies_both(self, monkeypatch): method test_create_opener_no_proxy (line 79) | def test_create_opener_no_proxy(self, monkeypatch): method test_create_opener_with_proxy (line 87) | def test_create_opener_with_proxy(self, monkeypatch): class TestCacheFilePath (line 98) | class TestCacheFilePath: method test_get_cache_file_path (line 101) | def test_get_cache_file_path(self): class TestExecutablePath (line 109) | class TestExecutablePath: method test_get_executable_path_frozen (line 112) | def test_get_executable_path_frozen(self, monkeypatch): method test_get_executable_path_not_frozen (line 120) | def test_get_executable_path_not_frozen(self, monkeypatch): class TestGitHubAPI (line 131) | class TestGitHubAPI: method test_get_latest_release_success (line 134) | def test_get_latest_release_success(self): method test_get_latest_release_prerelease_filtered (line 170) | def test_get_latest_release_prerelease_filtered(self): method test_get_latest_release_draft_filtered (line 198) | def test_get_latest_release_draft_filtered(self): method test_get_latest_release_no_exe_asset (line 226) | def test_get_latest_release_no_exe_asset(self): method test_get_latest_release_api_error (line 251) | def test_get_latest_release_api_error(self): method test_get_latest_release_json_error (line 268) | def test_get_latest_release_json_error(self): method test_get_latest_release_non_200_status (line 275) | def test_get_latest_release_non_200_status(self): class TestCacheFunctions (line 290) | class TestCacheFunctions: method test_should_check_update_no_cache_file (line 293) | def test_should_check_update_no_cache_file(self, fs): method test_should_check_update_invalid_content (line 298) | def test_should_check_update_invalid_content(self, fs): method test_should_check_update_cache_expired (line 306) | def test_should_check_update_cache_expired(self, fs): method test_should_check_update_cache_valid (line 319) | def test_should_check_update_cache_valid(self, fs): method test_update_next_check_time (line 332) | def test_update_next_check_time(self, fs): method test_update_next_check_time_silent_failure (line 346) | def test_update_next_check_time_silent_failure(self, fs): method test_check_updates_auto_skips_when_not_needed (line 356) | def test_check_updates_auto_skips_when_not_needed(self, fs): method test_check_updates_auto_updates_cache_after_check (line 372) | def test_check_updates_auto_updates_cache_after_check(self, fs): method test_check_updates_auto_has_new_version (line 389) | def test_check_updates_auto_has_new_version(self, fs): method test_check_updates_auto_no_new_version (line 408) | def test_check_updates_auto_no_new_version(self, fs): method test_check_updates_auto_api_failure (line 426) | def test_check_updates_auto_api_failure(self, fs): method test_check_updates_manual_ignores_cache (line 438) | def test_check_updates_manual_ignores_cache(self, fs): method test_check_updates_manual_no_new_version (line 461) | def test_check_updates_manual_no_new_version(self): method test_check_updates_manual_api_returns_none (line 475) | def test_check_updates_manual_api_returns_none(self): class TestDownloadUpdate (line 484) | class TestDownloadUpdate: method test_download_update_success (line 487) | def test_download_update_success(self, tmp_path): method test_download_update_progress (line 502) | def test_download_update_progress(self, tmp_path, capsys): method test_download_update_network_error (line 518) | def test_download_update_network_error(self): class TestUpdateScript (line 533) | class TestUpdateScript: method test_create_update_script (line 536) | def test_create_update_script(self, tmp_path): method test_trigger_update (line 551) | def test_trigger_update(self): class TestInvalidVersion (line 564) | class TestInvalidVersion: method test_check_updates_auto_invalid_version (line 567) | def test_check_updates_auto_invalid_version(self, fs): method test_check_updates_manual_invalid_version (line 585) | def test_check_updates_manual_invalid_version(self): FILE: tests/windows/test_context_menu.py class TestContextMenu (line 20) | class TestContextMenu: method setup_method (line 23) | def setup_method(self): method teardown_method (line 27) | def teardown_method(self): method test_install_and_uninstall (line 31) | def test_install_and_uninstall(self): method test_install_twice (line 54) | def test_install_twice(self): method test_uninstall_not_installed (line 62) | def test_uninstall_not_installed(self): method test_get_executable_path (line 67) | def test_get_executable_path(self): FILE: tests/windows/test_full_workflow.py class TestFullWorkflow (line 16) | class TestFullWorkflow: method test_complete_add_workflow (line 19) | def test_complete_add_workflow(self, tmp_path): method test_complete_delete_workflow (line 50) | def test_complete_delete_workflow(self, tmp_path): method test_update_existing_comment (line 73) | def test_update_existing_comment(self, tmp_path): method test_multiple_folders (line 102) | def test_multiple_folders(self, tmp_path): method test_preserve_other_settings (line 125) | def test_preserve_other_settings(self, tmp_path): method test_empty_comment_removal (line 152) | def test_empty_comment_removal(self, tmp_path): method test_special_characters_in_comment (line 179) | def test_special_characters_in_comment(self, tmp_path): method test_comment_length_truncation (line 204) | def test_comment_length_truncation(self, tmp_path): class TestDesktopIniIntegration (line 226) | class TestDesktopIniIntegration: method test_write_read_cycle (line 229) | def test_write_read_cycle(self, tmp_path): method test_remove_info_tip (line 243) | def test_remove_info_tip(self, tmp_path): method test_file_attributes_workflow (line 262) | def test_file_attributes_workflow(self, tmp_path): method test_folder_readonly_workflow (line 289) | def test_folder_readonly_workflow(self, tmp_path):