Coverage report: 95.3%

Files Functions Classes

coverage.py v7.15.2, created at 2026-07-28 08:17 +0000

      Statements   Branches   Total
File function   coverage statements missing excluded   coverage branches partial   coverage
src/ph/__init__.py (no function)   100.0% 0 0 0   100.0% 0 0   100.0%
src/ph/__main__.py (no function)   0.0% 2 2 0   100.0% 0 0   0.0%
src/ph/app.py build_parser   89.5% 19 2 0   100.0% 0 0   89.5%
src/ph/app.py main   93.9% 49 3 0   87.5% 16 2   92.3%
src/ph/app.py _run_search   100.0% 22 0 0   100.0% 8 0   100.0%
src/ph/app.py _run_download   100.0% 27 0 0   100.0% 12 0   100.0%
src/ph/app.py _print_progress   100.0% 5 0 0   75.0% 4 1   88.9%
src/ph/app.py _print_results   100.0% 4 0 0   100.0% 2 0   100.0%
src/ph/app.py _print_table   100.0% 7 0 0   100.0% 2 0   100.0%
src/ph/app.py (no function)   97.0% 33 1 0   50.0% 2 1   94.3%
src/ph/bittorrent.py TorrentFileChoice.filename   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/bittorrent.py TorrentSelectionRequired.__init__   100.0% 7 0 0   100.0% 0 0   100.0%
src/ph/bittorrent.py BitTorrentSettings.__post_init__   100.0% 8 0 0   100.0% 6 0   100.0%
src/ph/bittorrent.py _BDecoder.__init__   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/bittorrent.py _BDecoder.decode   100.0% 12 0 0   100.0% 10 0   100.0%
src/ph/bittorrent.py _BDecoder._integer   100.0% 10 0 0   100.0% 2 0   100.0%
src/ph/bittorrent.py _BDecoder._bytes   85.7% 14 2 0   100.0% 4 0   88.9%
src/ph/bittorrent.py _BDecoder._list   100.0% 8 0 0   100.0% 4 0   100.0%
src/ph/bittorrent.py _BDecoder._dictionary   100.0% 9 0 0   100.0% 4 0   100.0%
src/ph/bittorrent.py bdecode   100.0% 5 0 0   100.0% 2 0   100.0%
src/ph/bittorrent.py bencode   100.0% 9 0 0   100.0% 8 0   100.0%
src/ph/bittorrent.py parse_torrent   100.0% 43 0 0   95.8% 24 1   98.5%
src/ph/bittorrent.py download_torrent_file   94.8% 58 3 0   81.8% 22 4   91.2%
src/ph/bittorrent.py download_torrent_file.selected_piece_bounds   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/bittorrent.py download_torrent_file.fetch_piece   100.0% 4 0 0   100.0% 0 0   100.0%
src/ph/bittorrent.py _select_torrent_file   100.0% 13 0 0   100.0% 8 0   100.0%
src/ph/bittorrent.py _normalized_filename   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/bittorrent.py _torrent_file_candidates   90.0% 10 1 0   75.0% 4 1   85.7%
src/ph/bittorrent.py _torrent_file_candidates.choice   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/bittorrent.py _normalized_title   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/bittorrent.py discover_peers   100.0% 14 0 0   100.0% 4 0   100.0%
src/ph/bittorrent.py discover_peers.announce   88.9% 9 1 0   100.0% 0 0   88.9%
src/ph/bittorrent.py _announce_http   100.0% 8 0 0   100.0% 2 0   100.0%
src/ph/bittorrent.py _announce_udp   100.0% 25 0 0   100.0% 10 0   100.0%
src/ph/bittorrent.py _parse_tracker_peers   100.0% 13 0 0   100.0% 10 0   100.0%
src/ph/bittorrent.py _parse_compact_peers   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/bittorrent.py _download_piece_from_peers   100.0% 22 0 0   100.0% 8 0   100.0%
src/ph/bittorrent.py _download_piece_from_peers.fetch   88.2% 17 2 0   83.3% 6 1   87.0%
src/ph/bittorrent.py _peer_connection_slot   81.8% 22 4 0   70.0% 10 3   78.1%
src/ph/bittorrent.py _download_piece   93.8% 64 4 0   85.3% 34 5   90.8%
src/ph/bittorrent.py _send_piece_request   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/bittorrent.py _read_peer_message   100.0% 7 0 0   100.0% 4 0   100.0%
src/ph/bittorrent.py _read_exact   100.0% 9 0 0   100.0% 4 0   100.0%
src/ph/bittorrent.py _read_url   100.0% 15 0 0   100.0% 4 0   100.0%
src/ph/bittorrent.py _as_dictionary   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/bittorrent.py _as_list   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/bittorrent.py _as_bytes   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/bittorrent.py _as_positive_integer   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/bittorrent.py _as_nonnegative_integer   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/bittorrent.py _decode_path_part   100.0% 5 0 0   100.0% 2 0   100.0%
src/ph/bittorrent.py compact_peers   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/bittorrent.py _is_usable_peer   100.0% 5 0 0   100.0% 0 0   100.0%
src/ph/bittorrent.py _raise_if_cancelled   100.0% 2 0 0   100.0% 2 0   100.0%
src/ph/bittorrent.py (no function)   100.0% 103 0 0   100.0% 0 0   100.0%
src/ph/cache_policy.py catalogue_ttl_seconds   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/cache_policy.py (no function)   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/compatibility.py CompatibilityInfo.short_label   100.0% 5 0 0   100.0% 4 0   100.0%
src/ph/compatibility.py CompatibilityInfo.detail_label   100.0% 4 0 0   100.0% 2 0   100.0%
src/ph/compatibility.py normalize_title   100.0% 4 0 0   100.0% 0 0   100.0%
src/ph/compatibility.py normalize_console   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/compatibility.py is_unsupported_system   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/compatibility.py filter_supported_results   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/compatibility.py GameCompatibilityClient.__init__   100.0% 6 0 0   100.0% 0 0   100.0%
src/ph/compatibility.py GameCompatibilityClient.lookup_many   100.0% 5 0 0   100.0% 0 0   100.0%
src/ph/compatibility.py GameCompatibilityClient.load   100.0% 4 0 0   50.0% 2 1   83.3%
src/ph/compatibility.py GameCompatibilityClient.refresh   90.0% 10 1 0   100.0% 0 0   90.0%
src/ph/compatibility.py GameCompatibilityClient.cache_age_seconds   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/compatibility.py GameCompatibilityClient.cache_is_stale   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/compatibility.py GameCompatibilityClient._result_console   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/compatibility.py GameCompatibilityClient._lookup   100.0% 14 0 0   100.0% 6 0   100.0%
src/ph/compatibility.py GameCompatibilityClient._load_game_index   100.0% 14 0 0   100.0% 6 0   100.0%
src/ph/compatibility.py GameCompatibilityClient._download_game_index   100.0% 8 0 0   100.0% 2 0   100.0%
src/ph/compatibility.py GameCompatibilityClient._same_origin   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/compatibility.py GameCompatibilityClient._fetch_text   100.0% 6 0 0   100.0% 2 0   100.0%
src/ph/compatibility.py GameCompatibilityClient._fetch_optional   100.0% 4 0 0   100.0% 0 0   100.0%
src/ph/compatibility.py GameCompatibilityClient._read_cache   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/compatibility.py GameCompatibilityClient._read_cache_payload   100.0% 10 0 0   100.0% 2 0   100.0%
src/ph/compatibility.py GameCompatibilityClient._write_cache   100.0% 11 0 0   100.0% 2 0   100.0%
src/ph/compatibility.py parse_game_index   100.0% 12 0 0   100.0% 4 0   100.0%
src/ph/compatibility.py title_match_score   100.0% 20 0 0   100.0% 6 0   100.0%
src/ph/compatibility.py _core_title_tokens   100.0% 15 0 0   100.0% 8 0   100.0%
src/ph/compatibility.py _build_match_indexes   100.0% 6 0 0   100.0% 4 0   100.0%
src/ph/compatibility.py _title_match_keys   100.0% 6 0 0   50.0% 2 1   87.5%
src/ph/compatibility.py (no function)   100.0% 69 0 0   100.0% 0 0   100.0%
src/ph/config.py Config.from_environment   100.0% 20 0 0   100.0% 2 0   100.0%
src/ph/config.py (no function)   100.0% 23 0 0   100.0% 0 0   100.0%
src/ph/download_queue.py RateLimitRetrySettings.__post_init__   100.0% 6 0 0   100.0% 6 0   100.0%
src/ph/download_queue.py _QueuedDownload.snapshot   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/download_queue.py DownloadQueue.__init__   100.0% 27 0 0   100.0% 8 0   100.0%
src/ph/download_queue.py DownloadQueue.enqueue   100.0% 11 0 0   100.0% 4 0   100.0%
src/ph/download_queue.py DownloadQueue.jobs   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/download_queue.py DownloadQueue.find   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/download_queue.py DownloadQueue.dismiss_completed   100.0% 9 0 0   100.0% 2 0   100.0%
src/ph/download_queue.py DownloadQueue.pause   88.2% 17 2 0   83.3% 6 1   87.0%
src/ph/download_queue.py DownloadQueue.resume   100.0% 8 0 0   100.0% 2 0   100.0%
src/ph/download_queue.py DownloadQueue.retry   100.0% 8 0 0   100.0% 2 0   100.0%
src/ph/download_queue.py DownloadQueue.cancel   88.9% 18 2 0   83.3% 6 1   87.5%
src/ph/download_queue.py DownloadQueue.choose_torrent_file   100.0% 18 0 0   100.0% 8 0   100.0%
src/ph/download_queue.py DownloadQueue.refresh_required   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/download_queue.py DownloadQueue.update_retry_settings   0.0% 2 2 0   100.0% 0 0   0.0%
src/ph/download_queue.py DownloadQueue.mark_refreshed   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/download_queue.py DownloadQueue.shutdown   95.0% 20 1 0   90.0% 10 1   93.3%
src/ph/download_queue.py DownloadQueue._submit_locked   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/download_queue.py DownloadQueue._run   91.1% 45 4 4   66.7% 12 4   86.0%
src/ph/download_queue.py DownloadQueue._progress   90.9% 11 1 0   75.0% 4 1   86.7%
src/ph/download_queue.py DownloadQueue._finish_interrupted   92.9% 14 1 0   83.3% 6 1   90.0%
src/ph/download_queue.py DownloadQueue._finish_failed   90.0% 10 1 0   50.0% 2 1   83.3%
src/ph/download_queue.py DownloadQueue._finish_rate_limited   92.9% 14 1 0   50.0% 4 2   83.3%
src/ph/download_queue.py DownloadQueue._schedule_rate_limit_retry_locked   100.0% 6 0 0   100.0% 0 0   100.0%
src/ph/download_queue.py DownloadQueue._retry_rate_limited   88.9% 9 1 0   50.0% 2 1   81.8%
src/ph/download_queue.py DownloadQueue._cancel_retry_timer_locked   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/download_queue.py DownloadQueue._reset_for_run   100.0% 11 0 0   100.0% 2 0   100.0%
src/ph/download_queue.py DownloadQueue._remove_staging   66.7% 3 1 0   50.0% 2 1   60.0%
src/ph/download_queue.py DownloadQueue._load   100.0% 27 0 0   90.0% 10 1   97.3%
src/ph/download_queue.py DownloadQueue._save_locked   70.0% 10 3 0   100.0% 0 0   70.0%
src/ph/download_queue.py _job_to_json   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/download_queue.py _job_from_json   100.0% 7 0 0   100.0% 0 0   100.0%
src/ph/download_queue.py _rate_limit_retry_delay   100.0% 7 0 0   100.0% 2 0   100.0%
src/ph/download_queue.py _media_from_json   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/download_queue.py _choice_from_json   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/download_queue.py _installed_game_to_json   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/download_queue.py _installed_game_from_json   50.0% 4 2 0   50.0% 2 1   50.0%
src/ph/download_queue.py _dictionary   66.7% 3 1 0   50.0% 2 1   60.0%
src/ph/download_queue.py _list   66.7% 3 1 0   50.0% 2 1   60.0%
src/ph/download_queue.py _string   66.7% 3 1 0   50.0% 2 1   60.0%
src/ph/download_queue.py _optional_string   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/download_queue.py _integer   66.7% 3 1 0   50.0% 2 1   60.0%
src/ph/download_queue.py _optional_integer   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/download_queue.py _number   66.7% 3 1 0   50.0% 2 1   60.0%
src/ph/download_queue.py (no function)   100.0% 112 0 0   100.0% 0 0   100.0%
src/ph/downloader.py DownloadRateLimited.__init__   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/downloader.py DownloadSelectionRequired.__init__   100.0% 6 0 0   100.0% 0 0   100.0%
src/ph/downloader.py _safe_filename   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/downloader.py _filename_from_headers   100.0% 5 0 0   100.0% 2 0   100.0%
src/ph/downloader.py download_files   100.0% 31 0 0   100.0% 8 0   100.0%
src/ph/downloader.py _as_media_download   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/downloader.py _download_with_urllib   96.9% 65 2 0   86.4% 22 3   94.3%
src/ph/downloader.py _resumable_partial   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/downloader.py _content_range_total   100.0% 6 0 0   100.0% 4 0   100.0%
src/ph/downloader.py _retry_after_seconds   100.0% 12 0 0   83.3% 6 1   94.4%
src/ph/downloader.py _raise_if_cancelled   100.0% 2 0 0   100.0% 2 0   100.0%
src/ph/downloader.py _unique_download_path   100.0% 12 0 0   100.0% 4 0   100.0%
src/ph/downloader.py (no function)   100.0% 34 0 0   100.0% 0 0   100.0%
src/ph/frontend.py request_game_frontend_refresh   100.0% 11 0 0   100.0% 2 0   100.0%
src/ph/frontend.py (no function)   100.0% 6 0 0   100.0% 0 0   100.0%
src/ph/gamepad.py LinuxJoystick.open_first   0.0% 8 8 0   0.0% 2 0   0.0%
src/ph/gamepad.py LinuxJoystick._read_button_codes   77.8% 9 2 0   100.0% 0 0   77.8%
src/ph/gamepad.py LinuxJoystick.poll   33.3% 15 10 0   33.3% 6 2   33.3%
src/ph/gamepad.py LinuxJoystick.decode_event   96.7% 30 1 0   88.9% 18 2   93.8%
src/ph/gamepad.py LinuxJoystick._button_action   100.0% 9 0 0   83.3% 6 1   93.3%
src/ph/gamepad.py LinuxJoystick._axis_action   100.0% 7 0 0   100.0% 6 0   100.0%
src/ph/gamepad.py LinuxJoystick._start_repeat   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/gamepad.py LinuxJoystick._stop_repeat   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/gamepad.py LinuxJoystick._poll_repeat   100.0% 4 0 0   100.0% 2 0   100.0%
src/ph/gamepad.py LinuxJoystick.close   80.0% 5 1 0   50.0% 2 1   71.4%
src/ph/gamepad.py (no function)   100.0% 74 0 0   100.0% 0 0   100.0%
src/ph/hardware.py HardwareProfile.display_resolution   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/hardware.py detect_hardware_profile   100.0% 15 0 0   100.0% 4 0   100.0%
src/ph/hardware.py _find_input_nodes   83.3% 12 2 0   100.0% 4 0   87.5%
src/ph/hardware.py _find_gpio_keys   86.7% 15 2 0   100.0% 6 0   90.5%
src/ph/hardware.py _detect_display   92.9% 14 1 0   80.0% 10 2   87.5%
src/ph/hardware.py _parse_resolution   72.7% 11 3 0   75.0% 4 1   73.3%
src/ph/hardware.py _read_bytes   100.0% 5 0 0   100.0% 0 0   100.0%
src/ph/hardware.py _read_strings   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/hardware.py _read_text   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/hardware.py _read_u32   100.0% 4 0 0   100.0% 2 0   100.0%
src/ph/hardware.py _relative_node   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/hardware.py (no function)   100.0% 34 0 0   100.0% 0 0   100.0%
src/ph/i18n.py _load_catalogue   66.7% 18 6 0   62.5% 8 3   65.4%
src/ph/i18n.py normalize_language   100.0% 6 0 0   100.0% 4 0   100.0%
src/ph/i18n.py language_name   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/i18n.py translate   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/i18n.py missing_translation_keys   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/i18n.py _placeholder_fields   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/i18n.py mismatched_placeholder_keys   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/i18n.py (no function)   100.0% 20 0 0   100.0% 0 0   100.0%
src/ph/library.py scan_library   100.0% 26 0 0   100.0% 16 0   100.0%
src/ph/library.py platforms_with_installed_games   100.0% 5 0 0   100.0% 4 0   100.0%
src/ph/library.py search_title   100.0% 4 0 0   100.0% 0 0   100.0%
src/ph/library.py delete_game   100.0% 12 0 0   100.0% 4 0   100.0%
src/ph/library.py replace_game   93.1% 29 2 0   87.5% 8 1   91.9%
src/ph/library.py _is_game_candidate   100.0% 5 0 0   100.0% 4 0   100.0%
src/ph/library.py _iter_game_candidates   100.0% 7 0 0   83.3% 6 1   92.3%
src/ph/library.py _referenced_files   100.0% 20 0 0   87.5% 8 1   96.4%
src/ph/library.py (no function)   100.0% 20 0 0   100.0% 0 0   100.0%
src/ph/logging_config.py configure_logging   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/logging_config.py configure_logging_with_fallback   100.0% 33 0 0   100.0% 12 0   100.0%
src/ph/logging_config.py active_log_file   100.0% 5 0 0   100.0% 4 0   100.0%
src/ph/logging_config.py (no function)   100.0% 10 0 0   100.0% 0 0   100.0%
src/ph/minerva_store.py _DirectoryParser.__init__   100.0% 6 0 0   100.0% 0 0   100.0%
src/ph/minerva_store.py _DirectoryParser.handle_starttag   100.0% 10 0 0   87.5% 8 1   94.4%
src/ph/minerva_store.py _DirectoryParser.handle_endtag   100.0% 16 0 0   91.7% 12 1   96.4%
src/ph/minerva_store.py _DirectoryParser.handle_data   100.0% 2 0 0   50.0% 2 1   75.0%
src/ph/minerva_store.py parse_directory   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/minerva_store.py _title_metadata   100.0% 6 0 0   100.0% 0 0   100.0%
src/ph/minerva_store.py MinervaStore.__init__   100.0% 12 0 0   100.0% 4 0   100.0%
src/ph/minerva_store.py MinervaStore.base_url   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/minerva_store.py MinervaStore.download_referrer   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/minerva_store.py MinervaStore.platform_code   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/minerva_store.py MinervaStore.supports_platform   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/minerva_store.py MinervaStore.headers   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/minerva_store.py MinervaStore.search   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/minerva_store.py MinervaStore._fetch_catalogue   100.0% 15 0 0   100.0% 10 0   100.0%
src/ph/minerva_store.py MinervaStore._fetch_catalogue.fetch   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/minerva_store.py MinervaStore.validate_detail_url   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/minerva_store.py MinervaStore.retrieve_download_url   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/minerva_store.py MinervaStore.download_request   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/minerva_store.py MinervaStore._download_metadata   100.0% 8 0 0   100.0% 4 0   100.0%
src/ph/minerva_store.py MinervaStore._detail_target   100.0% 17 0 0   100.0% 10 0   100.0%
src/ph/minerva_store.py MinervaStore._entries   100.0% 9 0 0   100.0% 4 0   100.0%
src/ph/minerva_store.py MinervaStore._get_text   100.0% 17 0 0   100.0% 6 0   100.0%
src/ph/minerva_store.py (no function)   100.0% 52 0 0   100.0% 0 0   100.0%
src/ph/models.py Platform.rom_folders   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/models.py (no function)   100.0% 24 0 0   100.0% 0 0   100.0%
src/ph/organizer.py detect_roms_directories   66.7% 3 1 0   50.0% 2 1   60.0%
src/ph/organizer.py available_roms_directories   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/organizer.py detect_roms_directory   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/organizer.py install_downloads   92.0% 25 2 0   100.0% 10 0   94.3%
src/ph/organizer.py install_bundled_bios   83.3% 24 4 0   100.0% 8 0   87.5%
src/ph/organizer.py _bundled_bios_members   90.5% 21 2 0   83.3% 12 2   87.9%
src/ph/organizer.py _bios_destinations   100.0% 9 0 0   100.0% 4 0   100.0%
src/ph/organizer.py unique_destination   100.0% 10 0 0   100.0% 4 0   100.0%
src/ph/organizer.py (no function)   100.0% 24 0 0   100.0% 0 0   100.0%
src/ph/platforms.py _platform   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/platforms.py discover_platforms   87.5% 16 2 0   100.0% 8 0   91.7%
src/ph/platforms.py _build_aliases   100.0% 7 0 0   100.0% 6 0   100.0%
src/ph/platforms.py platform_catalogue   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/platforms.py resolve_platform   75.0% 4 1 0   50.0% 2 1   66.7%
src/ph/platforms.py (no function)   100.0% 13 0 0   100.0% 0 0   100.0%
src/ph/preferences.py preference_path   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/preferences.py load_preferences   100.0% 46 0 0   100.0% 14 0   100.0%
src/ph/preferences.py save_preferences   100.0% 9 0 0   100.0% 0 0   100.0%
src/ph/preferences.py _integer_setting   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/preferences.py _float_setting   100.0% 4 0 0   100.0% 2 0   100.0%
src/ph/preferences.py _optional_float_setting   100.0% 4 0 0   100.0% 2 0   100.0%
src/ph/preferences.py _relative_directory   100.0% 6 0 0   100.0% 4 0   100.0%
src/ph/preferences.py _store_rom_mappings   90.0% 20 2 0   81.2% 16 3   86.1%
src/ph/preferences.py (no function)   100.0% 33 0 0   100.0% 0 0   100.0%
src/ph/retrobios.py RetroBiosCatalog.__init__   100.0% 6 0 0   100.0% 0 0   100.0%
src/ph/retrobios.py RetroBiosCatalog.from_json   100.0% 20 0 0   100.0% 10 0   100.0%
src/ph/retrobios.py RetroBiosCatalog.cache_age_seconds   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/retrobios.py RetroBiosCatalog.cache_is_stale   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/retrobios.py RetroBiosCatalog.system_for   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/retrobios.py RetroBiosCatalog.requirements_for   100.0% 15 0 0   100.0% 8 0   100.0%
src/ph/retrobios.py RetroBiosCatalog.source_url   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/retrobios.py RetroBiosRepository.__init__   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/retrobios.py RetroBiosRepository.load   100.0% 7 0 0   100.0% 0 0   100.0%
src/ph/retrobios.py RetroBiosRepository.ensure   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/retrobios.py RetroBiosRepository.update   93.0% 43 3 0   75.0% 16 2   88.1%
src/ph/retrobios.py RetroBiosRepository.update.download_profile   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/retrobios.py _download_yaml   87.5% 8 1 0   50.0% 2 1   80.0%
src/ph/retrobios.py _download_json   87.5% 8 1 0   50.0% 2 1   80.0%
src/ph/retrobios.py _download_bytes   100.0% 15 0 0   100.0% 6 0   100.0%
src/ph/retrobios.py _build_manifest   100.0% 20 0 0   100.0% 10 0   100.0%
src/ph/retrobios.py _profile_files   100.0% 4 0 0   100.0% 2 0   100.0%
src/ph/retrobios.py _database_file   100.0% 20 0 0   91.7% 12 1   96.9%
src/ph/retrobios.py audit_bios   100.0% 12 0 0   100.0% 6 0   100.0%
src/ph/retrobios.py audit_bios_roots   100.0% 8 0 0   100.0% 2 0   100.0%
src/ph/retrobios.py bios_destinations   100.0% 12 0 0   100.0% 6 0   100.0%
src/ph/retrobios.py verify_bios_file   100.0% 13 0 0   100.0% 6 0   100.0%
src/ph/retrobios.py install_bios   98.3% 59 1 0   95.5% 22 1   97.5%
src/ph/retrobios.py unresolved   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/retrobios.py _parse_requirement   100.0% 9 0 0   100.0% 4 0   100.0%
src/ph/retrobios.py _optional_string   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/retrobios.py _optional_float   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/retrobios.py _strongest_checksum   100.0% 7 0 0   100.0% 6 0   100.0%
src/ph/retrobios.py _normalize_region   100.0% 10 0 0   100.0% 8 0   100.0%
src/ph/retrobios.py (no function)   100.0% 76 0 0   100.0% 0 0   100.0%
src/ph/store.py StoreError.__init__   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/store.py GameStore._configure_catalogue_cache   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/store.py GameStore._load_catalogue   100.0% 5 0 0   100.0% 2 0   100.0%
src/ph/store.py GameStore._load_catalogue.fetcher   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/store.py GameStore._fetch_catalogue   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/store.py GameStore.refresh_catalogue   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/store.py GameStore.catalogue_cache_status   100.0% 4 0 0   100.0% 2 0   100.0%
src/ph/store.py GameStore.catalogue_cache_file_count   100.0% 4 0 0   100.0% 2 0   100.0%
src/ph/store.py GameStore.set_catalogue_ttl   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/store.py GameStore.set_network_timeout   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/store.py GameStore.base_url   100.0% 0 0 0   100.0% 0 0   100.0%
src/ph/store.py GameStore.download_referrer   100.0% 0 0 0   100.0% 0 0   100.0%
src/ph/store.py GameStore.platform_code   100.0% 0 0 0   100.0% 0 0   100.0%
src/ph/store.py GameStore.supports_platform   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/store.py GameStore.search   100.0% 0 0 0   100.0% 0 0   100.0%
src/ph/store.py GameStore.validate_detail_url   100.0% 0 0 0   100.0% 0 0   100.0%
src/ph/store.py GameStore.retrieve_download_url   100.0% 0 0 0   100.0% 0 0   100.0%
src/ph/store.py GameStore.download_request   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/store.py (no function)   100.0% 35 0 0   100.0% 0 0   100.0%
src/ph/store_cache.py GameCatalogueCache.__init__   100.0% 4 0 0   100.0% 0 0   100.0%
src/ph/store_cache.py GameCatalogueCache._is_stale   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/store_cache.py GameCatalogueCache.path_for   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/store_cache.py GameCatalogueCache.status   100.0% 5 0 0   100.0% 2 0   100.0%
src/ph/store_cache.py GameCatalogueCache.cached_files   100.0% 4 0 0   100.0% 0 0   100.0%
src/ph/store_cache.py GameCatalogueCache.get_or_fetch   100.0% 14 0 0   100.0% 4 0   100.0%
src/ph/store_cache.py GameCatalogueCache._read   100.0% 9 0 0   100.0% 2 0   100.0%
src/ph/store_cache.py GameCatalogueCache._write   100.0% 11 0 0   100.0% 2 0   100.0%
src/ph/store_cache.py _parse_result   100.0% 4 0 0   100.0% 2 0   100.0%
src/ph/store_cache.py _required_string   100.0% 4 0 0   100.0% 2 0   100.0%
src/ph/store_cache.py (no function)   100.0% 30 0 0   100.0% 0 0   100.0%
src/ph/store_catalog.py StoreCatalog.from_config   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/store_catalog.py StoreCatalog.find   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/store_catalog.py (no function)   100.0% 12 0 0   100.0% 0 0   100.0%
src/ph/targets.py LinuxTarget.release_asset_name   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/targets.py resolve_target   100.0% 6 0 0   100.0% 2 0   100.0%
src/ph/targets.py (no function)   100.0% 11 0 0   100.0% 0 0   100.0%
src/ph/translation_keys.py (no function)   100.0% 383 0 0   100.0% 0 0   100.0%
src/ph/translations/__init__.py (no function)   100.0% 0 0 0   100.0% 0 0   100.0%
src/ph/tui.py _keyboard_rows   100.0% 13 0 0   100.0% 10 0   100.0%
src/ph/tui.py _keyboard_key_center   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/tui.py _nearest_keyboard_key   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/tui.py _fit_column   100.0% 5 0 0   100.0% 4 0   100.0%
src/ph/tui.py _marquee_text   100.0% 8 0 0   100.0% 4 0   100.0%
src/ph/tui.py _visible_menu_label   100.0% 7 0 0   100.0% 4 0   100.0%
src/ph/tui.py DownloaderTui.__init__   100.0% 23 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._t   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._setup_screen   100.0% 17 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui.run   93.0% 43 3 0   85.3% 34 5   89.6%
src/ph/tui.py DownloaderTui._download_queue_menu_label   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._search_flow   100.0% 10 0 0   100.0% 4 0   100.0%
src/ph/tui.py DownloaderTui._search_platform_flow   100.0% 23 0 0   100.0% 4 0   100.0%
src/ph/tui.py DownloaderTui._catalog_progress   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._results_flow   100.0% 34 0 0   83.3% 18 3   94.2%
src/ph/tui.py DownloaderTui._direct_download_flow   100.0% 11 0 0   100.0% 6 0   100.0%
src/ph/tui.py DownloaderTui._download_detail   100.0% 18 0 0   100.0% 4 0   100.0%
src/ph/tui.py DownloaderTui._handle_download_completions   100.0% 12 0 0   100.0% 4 0   100.0%
src/ph/tui.py DownloaderTui._download_queue_screen   100.0% 13 0 0   100.0% 6 0   100.0%
src/ph/tui.py DownloaderTui._download_queue_screen.menu_options   100.0% 5 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._download_job_fields   100.0% 8 0 0   100.0% 4 0   100.0%
src/ph/tui.py DownloaderTui._download_job_label   100.0% 6 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._download_job_labels   91.7% 12 1 0   75.0% 4 1   87.5%
src/ph/tui.py DownloaderTui._download_job_controls   97.6% 42 1 0   86.7% 30 4   93.1%
src/ph/tui.py DownloaderTui._download_progress_detail   100.0% 5 0 0   100.0% 4 0   100.0%
src/ph/tui.py DownloaderTui._confirm_download_cancel   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._choose_queued_torrent_file   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._manage_library_flow   93.8% 16 1 0   87.5% 8 1   91.7%
src/ph/tui.py DownloaderTui._manage_platform_library   100.0% 12 0 0   75.0% 8 2   90.0%
src/ph/tui.py DownloaderTui._manage_game   100.0% 7 0 0   100.0% 4 0   100.0%
src/ph/tui.py DownloaderTui._confirm_delete   100.0% 13 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._update_game   100.0% 32 0 0   100.0% 10 0   100.0%
src/ph/tui.py DownloaderTui._choose_roms_directory   100.0% 4 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._preferred_roms_directory   100.0% 5 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._choose_store   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._store_for_operation   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._configure_store   100.0% 21 0 0   100.0% 4 0   100.0%
src/ph/tui.py DownloaderTui._settings_screen   98.0% 50 1 0   94.7% 38 2   96.6%
src/ph/tui.py DownloaderTui._configure_default_roms_directory   100.0% 6 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._platform_for_store   100.0% 4 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._rom_folder_choices   100.0% 5 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._console_folder_mappings_screen   100.0% 22 0 0   100.0% 10 0   100.0%
src/ph/tui.py DownloaderTui._configure_bios_directory   100.0% 7 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._configure_language   80.0% 5 1 0   50.0% 2 1   71.4%
src/ph/tui.py DownloaderTui._edit_setting   100.0% 5 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._configure_catalogue_ttl   76.9% 13 3 0   100.0% 4 0   82.4%
src/ph/tui.py DownloaderTui._configure_max_concurrent_downloads   100.0% 13 0 0   100.0% 4 0   100.0%
src/ph/tui.py DownloaderTui._configure_network_timeout   100.0% 13 0 0   100.0% 4 0   100.0%
src/ph/tui.py DownloaderTui._rate_limit_retry_settings_screen   90.6% 32 3 0   71.4% 14 4   84.8%
src/ph/tui.py DownloaderTui._configure_log_level   100.0% 6 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._configure_file_logging   100.0% 5 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._save_runtime_preferences   100.0% 10 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._apply_runtime_preferences   100.0% 14 0 0   100.0% 6 0   100.0%
src/ph/tui.py DownloaderTui._file_logging_enabled   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._apply_logging_preferences   100.0% 4 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._file_logging_message   100.0% 4 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._refresh_store_catalogue   96.4% 28 1 0   90.0% 10 1   94.7%
src/ph/tui.py DownloaderTui._store_cache_status_label   66.7% 3 1 0   50.0% 2 1   60.0%
src/ph/tui.py DownloaderTui._store_description   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._compatibility_label   90.0% 10 1 0   83.3% 6 1   87.5%
src/ph/tui.py DownloaderTui._bios_state_label   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._progress_label   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._retrobios_cache_label   100.0% 10 0 0   100.0% 4 0   100.0%
src/ph/tui.py DownloaderTui._compatibility_cache_label   100.0% 6 0 0   100.0% 4 0   100.0%
src/ph/tui.py DownloaderTui._update_compatibility_catalogue   100.0% 10 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._load_retrobios_catalogue   59.1% 22 9 0   50.0% 6 1   57.1%
src/ph/tui.py DownloaderTui._load_retrobios_catalogue.report   0.0% 2 2 0   100.0% 0 0   0.0%
src/ph/tui.py DownloaderTui._update_retrobios_catalogue   100.0% 12 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._bios_search_flow   100.0% 58 0 0   96.4% 28 1   98.8%
src/ph/tui.py DownloaderTui._bios_followup   100.0% 24 0 0   100.0% 8 0   100.0%
src/ph/tui.py DownloaderTui._confirm_retrobios_download   100.0% 6 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._install_bios_checks   71.0% 31 9 0   50.0% 6 1   67.6%
src/ph/tui.py DownloaderTui._install_bios_checks.report   0.0% 2 2 0   100.0% 0 0   0.0%
src/ph/tui.py DownloaderTui._install_bios_checks.install_selected   100.0% 5 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._bios_check_label   100.0% 4 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._minerva_bittorrent_settings_screen   96.6% 29 1 0   80.0% 10 2   92.3%
src/ph/tui.py DownloaderTui._save_minerva_bittorrent_settings   100.0% 10 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._format_bittorrent_setting   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._application_update_flow   100.0% 30 0 0   100.0% 6 0   100.0%
src/ph/tui.py DownloaderTui._stage_application_update   42.1% 19 11 0   16.7% 6 1   36.0%
src/ph/tui.py DownloaderTui._stage_application_update.report   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._confirm_exit   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._choose_from_roots   100.0% 14 0 0   100.0% 10 0   100.0%
src/ph/tui.py DownloaderTui._progress   100.0% 7 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._download_media   95.1% 41 2 0   78.6% 14 3   90.9%
src/ph/tui.py DownloaderTui._download_media.report   100.0% 2 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._choose_torrent_file   100.0% 9 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._format_file_size   100.0% 7 0 0   100.0% 4 0   100.0%
src/ph/tui.py DownloaderTui._status_screen   100.0% 11 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._on_screen_keyboard   100.0% 78 0 0   100.0% 44 0   100.0%
src/ph/tui.py DownloaderTui._menu   100.0% 55 0 0   96.2% 26 1   98.8%
src/ph/tui.py DownloaderTui._draw_message   0.0% 14 14 0   0.0% 8 0   0.0%
src/ph/tui.py DownloaderTui._get_input   100.0% 4 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._get_input_until   100.0% 6 0 0   75.0% 4 1   90.0%
src/ph/tui.py DownloaderTui._poll_input   100.0% 6 0 0   75.0% 4 1   90.0%
src/ph/tui.py DownloaderTui._operation_error   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._error   0.0% 1 1 0   100.0% 0 0   0.0%
src/ph/tui.py DownloaderTui._header   100.0% 4 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._footer   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/tui.py DownloaderTui._safe_add   100.0% 6 0 0   100.0% 2 0   100.0%
src/ph/tui.py DownloaderTui._require_size   100.0% 2 0 0   100.0% 2 0   100.0%
src/ph/tui.py run_tui   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/tui.py (no function)   100.0% 164 0 0   100.0% 0 0   100.0%
src/ph/updater.py installed_version   100.0% 4 0 0   100.0% 0 0   100.0%
src/ph/updater.py find_update   100.0% 50 0 0   100.0% 22 0   100.0%
src/ph/updater.py stage_update   100.0% 35 0 0   100.0% 2 0   100.0%
src/ph/updater.py _parse_version   100.0% 4 0 0   100.0% 2 0   100.0%
src/ph/updater.py _download_release   100.0% 34 0 0   100.0% 10 0   100.0%
src/ph/updater.py _extract_bundle   100.0% 19 0 0   100.0% 8 0   100.0%
src/ph/updater.py _safe_bundle_path   100.0% 5 0 0   100.0% 2 0   100.0%
src/ph/updater.py _validate_staged_bundle   87.5% 16 2 0   100.0% 6 0   90.9%
src/ph/updater.py _remove_staging_path   100.0% 3 0 0   100.0% 2 0   100.0%
src/ph/updater.py _raise_if_cancelled   100.0% 2 0 0   100.0% 2 0   100.0%
src/ph/updater.py (no function)   100.0% 40 0 0   100.0% 0 0   100.0%
src/ph/vimm_store.py _Cell.text   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/vimm_store.py _SearchTableParser.__init__   100.0% 7 0 0   100.0% 0 0   100.0%
src/ph/vimm_store.py _SearchTableParser.handle_starttag   100.0% 22 0 0   94.4% 18 1   97.5%
src/ph/vimm_store.py _SearchTableParser.handle_endtag   93.8% 16 1 0   92.9% 14 1   93.3%
src/ph/vimm_store.py _SearchTableParser.handle_data   100.0% 2 0 0   100.0% 2 0   100.0%
src/ph/vimm_store.py _DownloadFormParser.__init__   100.0% 5 0 0   100.0% 0 0   100.0%
src/ph/vimm_store.py _DownloadFormParser.handle_starttag   90.0% 10 1 0   75.0% 8 2   83.3%
src/ph/vimm_store.py _DownloadFormParser.handle_endtag   100.0% 4 0 0   75.0% 4 1   87.5%
src/ph/vimm_store.py parse_search_results   100.0% 12 0 0   100.0% 8 0   100.0%
src/ph/vimm_store.py parse_download_url   85.7% 7 1 0   50.0% 2 1   77.8%
src/ph/vimm_store.py VimmStore.__init__   87.5% 8 1 0   50.0% 2 1   80.0%
src/ph/vimm_store.py VimmStore.base_url   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/vimm_store.py VimmStore.download_referrer   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/vimm_store.py VimmStore.platform_code   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/vimm_store.py VimmStore.headers   100.0% 1 0 0   100.0% 0 0   100.0%
src/ph/vimm_store.py VimmStore.validate_detail_url   100.0% 4 0 0   100.0% 0 0   100.0%
src/ph/vimm_store.py VimmStore.search   100.0% 3 0 0   100.0% 0 0   100.0%
src/ph/vimm_store.py VimmStore._fetch_catalogue   100.0% 12 0 0   100.0% 8 0   100.0%
src/ph/vimm_store.py VimmStore._fetch_catalogue.fetch   91.7% 12 1 0   75.0% 4 1   87.5%
src/ph/vimm_store.py VimmStore.retrieve_download_url   66.7% 3 1 0   50.0% 2 1   60.0%
src/ph/vimm_store.py VimmStore._get_text   70.0% 10 3 0   100.0% 0 0   70.0%
src/ph/vimm_store.py (no function)   100.0% 51 0 0   100.0% 0 0   100.0%
Total     96.5% 5538 192 4   90.9% 1596 124   95.3%

No items found using the specified filter.