Coverage report: 56%

Files Functions Classes

coverage.py v7.15.2, created at 2026-08-04 22:15 +0000

File function   statements missing excluded   coverage
src/secchi/__init__.py (no function)   5 2 0   60%
src/secchi/__main__.py (no function)   2 2 0   0%
src/secchi/aggregate.py package_key   2 0 0   100%
src/secchi/aggregate.py logical_package_refs   9 9 0   0%
src/secchi/aggregate.py combine_package_infos   20 20 0   0%
src/secchi/aggregate.py pick_primary_info   5 5 0   0%
src/secchi/aggregate.py unique_registries   2 2 0   0%
src/secchi/aggregate.py combine_download_trends   5 5 0   0%
src/secchi/aggregate.py combine_install_breakdown   10 10 0   0%
src/secchi/aggregate.py (no function)   11 0 0   100%
src/secchi/api/__init__.py (no function)   0 0 0   100%
src/secchi/api/base.py RegistryAdapter.registry   0 0 1   100%
src/secchi/api/base.py RegistryAdapter.fetch_package   0 0 1   100%
src/secchi/api/base.py RegistryAdapter.fetch_versions   0 0 1   100%
src/secchi/api/base.py RegistryAdapter.fetch_dependencies   0 0 1   100%
src/secchi/api/base.py RegistryAdapter.fetch_download_trend   0 0 1   100%
src/secchi/api/base.py RegistryAdapter.fetch_download_counts   0 0 1   100%
src/secchi/api/base.py RegistryAdapter.fetch_release_notes   0 0 1   100%
src/secchi/api/base.py RegistryAdapter.fetch_reverse_dependencies   1 1 0   0%
src/secchi/api/base.py RegistryAdapter.fetch_reverse_dependency_count   1 1 0   0%
src/secchi/api/base.py RegistryAdapter.fetch_version_download_breakdown   1 1 0   0%
src/secchi/api/base.py RegistryAdapter.search   1 1 0   0%
src/secchi/api/base.py AdapterBase.__init__   1 0 0   100%
src/secchi/api/base.py AdapterBase._client_scope   1 0 0   100%
src/secchi/api/base.py _ClientLease.__init__   2 0 0   100%
src/secchi/api/base.py _ClientLease.__aenter__   1 0 0   100%
src/secchi/api/base.py _ClientLease.__aexit__   1 0 0   100%
src/secchi/api/base.py _ClientLease.get   4 0 0   100%
src/secchi/api/base.py create_adapter   9 9 0   0%
src/secchi/api/base.py (no function)   19 0 10   100%
src/secchi/api/cran.py CranAdapter.registry   1 1 0   0%
src/secchi/api/cran.py CranAdapter.fetch_package   6 0 0   100%
src/secchi/api/cran.py CranAdapter.search   5 0 0   100%
src/secchi/api/cran.py _first_url   1 0 0   100%
src/secchi/api/cran.py _dependencies   9 1 0   89%
src/secchi/api/cran.py (no function)   12 0 0   100%
src/secchi/api/crates.py CratesAdapter.registry   1 1 0   0%
src/secchi/api/crates.py CratesAdapter.fetch_package   28 3 0   89%
src/secchi/api/crates.py CratesAdapter.fetch_versions   9 0 0   100%
src/secchi/api/crates.py CratesAdapter.fetch_dependencies   8 0 0   100%
src/secchi/api/crates.py CratesAdapter.fetch_download_trend   13 2 0   85%
src/secchi/api/crates.py CratesAdapter.fetch_download_counts   7 1 0   86%
src/secchi/api/crates.py CratesAdapter.fetch_version_download_breakdown   14 14 0   0%
src/secchi/api/crates.py CratesAdapter.fetch_reverse_dependencies   21 21 0   0%
src/secchi/api/crates.py CratesAdapter.fetch_reverse_dependencies._downloads   7 7 0   0%
src/secchi/api/crates.py CratesAdapter.fetch_reverse_dependency_count   8 8 0   0%
src/secchi/api/crates.py CratesAdapter.fetch_release_notes   1 1 0   0%
src/secchi/api/crates.py CratesAdapter.search   11 2 0   82%
src/secchi/api/crates.py _parse_date   7 3 0   57%
src/secchi/api/crates.py _reverse_dependency_total   8 8 0   0%
src/secchi/api/crates.py (no function)   25 0 0   100%
src/secchi/api/golang.py _module_path   1 0 0   100%
src/secchi/api/golang.py GoModuleAdapter.registry   1 1 0   0%
src/secchi/api/golang.py GoModuleAdapter.fetch_package   8 0 0   100%
src/secchi/api/golang.py GoModuleAdapter.fetch_versions   6 0 0   100%
src/secchi/api/golang.py GoModuleAdapter.search   5 0 0   100%
src/secchi/api/golang.py _repository_url   4 1 0   75%
src/secchi/api/golang.py _parse_time   6 3 0   50%
src/secchi/api/golang.py (no function)   16 0 0   100%
src/secchi/api/homebrew.py HomebrewAdapter.registry   1 1 0   0%
src/secchi/api/homebrew.py HomebrewAdapter.fetch_package   8 0 0   100%
src/secchi/api/homebrew.py HomebrewAdapter.search   9 0 0   100%
src/secchi/api/homebrew.py (no function)   10 0 0   100%
src/secchi/api/npm.py _npm_name   4 2 0   50%
src/secchi/api/npm.py NpmAdapter.registry   1 1 0   0%
src/secchi/api/npm.py NpmAdapter.fetch_package   24 1 0   96%
src/secchi/api/npm.py NpmAdapter.fetch_versions   13 0 0   100%
src/secchi/api/npm.py NpmAdapter.fetch_dependencies   13 0 0   100%
src/secchi/api/npm.py NpmAdapter.fetch_download_trend   14 14 0   0%
src/secchi/api/npm.py NpmAdapter.fetch_download_counts   15 2 0   87%
src/secchi/api/npm.py NpmAdapter.fetch_release_notes   11 11 0   0%
src/secchi/api/npm.py NpmAdapter._fetch_total_downloads   7 2 0   71%
src/secchi/api/npm.py NpmAdapter.search   13 2 0   85%
src/secchi/api/npm.py _parse_npm_time   6 3 0   50%
src/secchi/api/npm.py (no function)   20 0 0   100%
src/secchi/api/pypi.py _derive_kind   4 1 0   75%
src/secchi/api/pypi.py PyPIAdapter.registry   1 1 0   0%
src/secchi/api/pypi.py PyPIAdapter._get_json   3 0 0   100%
src/secchi/api/pypi.py PyPIAdapter.fetch_package   24 2 0   92%
src/secchi/api/pypi.py PyPIAdapter.fetch_versions   19 2 0   89%
src/secchi/api/pypi.py PyPIAdapter.fetch_dependencies   18 2 0   89%
src/secchi/api/pypi.py PyPIAdapter.fetch_download_trend   11 2 0   82%
src/secchi/api/pypi.py PyPIAdapter.fetch_download_counts   13 6 0   54%
src/secchi/api/pypi.py PyPIAdapter.fetch_release_notes   1 1 0   0%
src/secchi/api/pypi.py PyPIAdapter.search   19 13 0   32%
src/secchi/api/pypi.py (no function)   23 0 0   100%
src/secchi/api/sparse.py SparseAdapter.fetch_versions   1 1 0   0%
src/secchi/api/sparse.py SparseAdapter.fetch_dependencies   1 0 0   100%
src/secchi/api/sparse.py SparseAdapter.fetch_download_trend   1 0 0   100%
src/secchi/api/sparse.py SparseAdapter.fetch_download_counts   1 0 0   100%
src/secchi/api/sparse.py SparseAdapter.fetch_release_notes   1 1 0   0%
src/secchi/api/sparse.py SparseAdapter.fetch_reverse_dependencies   1 1 0   0%
src/secchi/api/sparse.py SparseAdapter.fetch_reverse_dependency_count   1 1 0   0%
src/secchi/api/sparse.py SparseAdapter.fetch_version_download_breakdown   1 1 0   0%
src/secchi/api/sparse.py (no function)   12 0 0   100%
src/secchi/cache.py cache_root   3 1 0   67%
src/secchi/cache.py package_cache_path   2 0 0   100%
src/secchi/cache.py load_package_cache   18 2 0   89%
src/secchi/cache.py save_package_cache   7 2 0   71%
src/secchi/cache.py _encode   9 1 0   89%
src/secchi/cache.py _decode_package_info   15 0 0   100%
src/secchi/cache.py _decode_download_counts   1 0 0   100%
src/secchi/cache.py _decode_github_stats   1 0 0   100%
src/secchi/cache.py _decode_version   1 1 0   0%
src/secchi/cache.py _decode_dependency   1 1 0   0%
src/secchi/cache.py _decode_issue_event   1 1 0   0%
src/secchi/cache.py _parse_datetime   6 4 0   33%
src/secchi/cache.py _decode_key   4 4 0   0%
src/secchi/cache.py (no function)   24 0 0   100%
src/secchi/cli.py build_parser   45 45 0   0%
src/secchi/cli.py cmd_init   32 32 0   0%
src/secchi/cli.py _run_dashboard   6 6 0   0%
src/secchi/cli.py _run_search   9 9 0   0%
src/secchi/cli.py main   72 72 0   0%
src/secchi/cli.py (no function)   20 20 0   0%
src/secchi/config.py _config_locations   7 7 0   0%
src/secchi/config.py find_config   9 4 0   56%
src/secchi/config.py load_project   21 5 0   76%
src/secchi/config.py list_projects   5 2 0   60%
src/secchi/config.py load_projects   1 0 0   100%
src/secchi/config.py get_env_token   2 2 0   0%
src/secchi/config.py (no function)   15 1 0   93%
src/secchi/derived.py _now   1 0 0   100%
src/secchi/derived.py _aware   3 0 0   100%
src/secchi/derived.py _days_since   4 0 0   100%
src/secchi/derived.py _score_maintained   14 7 0   50%
src/secchi/derived.py _score_documentation   8 0 0   100%
src/secchi/derived.py _score_testing   1 0 0   100%
src/secchi/derived.py _issue_counts_90d   10 6 0   40%
src/secchi/derived.py _score_community   36 19 0   47%
src/secchi/derived.py _score_activity   15 4 0   73%
src/secchi/derived.py _score_security   9 2 0   78%
src/secchi/derived.py _grade   9 3 0   67%
src/secchi/derived.py compute_health_score   4 0 0   100%
src/secchi/derived.py compute_health_score.scaled   1 0 0   100%
src/secchi/derived.py compute_release_adoption   12 3 0   75%
src/secchi/derived.py _adoption_from_trend   19 1 0   95%
src/secchi/derived.py _adoption_from_trend.parse   4 2 0   50%
src/secchi/derived.py compute_install_breakdown   4 0 0   100%
src/secchi/derived.py _registry_activity_count   2 0 0   100%
src/secchi/derived.py compute_reverse_dependency_summary   4 0 0   100%
src/secchi/derived.py compute_activity_timeline   14 0 0   100%
src/secchi/derived.py compute_downloads_30d   10 0 0   100%
src/secchi/derived.py compute_all   3 0 0   100%
src/secchi/derived.py (no function)   23 0 0   100%
src/secchi/dev.py (no function)   20 20 0   0%
src/secchi/errors.py (no function)   6 0 0   100%
src/secchi/export.py export_package_json   2 0 0   100%
src/secchi/export.py save_export   1 1 0   0%
src/secchi/export.py save_report   9 9 0   0%
src/secchi/export.py _serialize_package_info   1 0 0   100%
src/secchi/export.py _serialize_derived   1 0 0   100%
src/secchi/export.py _json_default   3 3 0   0%
src/secchi/export.py (no function)   12 0 0   100%
src/secchi/history.py history_file_path   6 6 0   0%
src/secchi/history.py _load_all   7 7 0   0%
src/secchi/history.py _save_all   6 6 0   0%
src/secchi/history.py load_snapshots   11 11 0   0%
src/secchi/history.py append_snapshot   5 5 0   0%
src/secchi/history.py find_baseline   13 2 0   85%
src/secchi/history.py compute_delta   3 0 0   100%
src/secchi/history.py (no function)   14 0 0   100%
src/secchi/http.py SecchiAsyncClient.__init__   2 0 0   100%
src/secchi/http.py SecchiAsyncClient.request   14 6 0   57%
src/secchi/http.py HttpClientFactory.__init__   1 0 0   100%
src/secchi/http.py HttpClientFactory.create   1 0 0   100%
src/secchi/http.py _backoff   1 0 0   100%
src/secchi/http.py _retry_after   13 10 0   23%
src/secchi/http.py (no function)   17 0 0   100%
src/secchi/mcp_server.py _resolve_refs   3 3 0   0%
src/secchi/mcp_server.py _package_result   3 1 0   67%
src/secchi/mcp_server.py inspect_package   5 0 0   100%
src/secchi/mcp_server.py search_packages   4 0 0   100%
src/secchi/mcp_server.py inspect_project   5 1 0   80%
src/secchi/mcp_server.py check_package   19 6 0   68%
src/secchi/mcp_server.py compare_packages   6 2 0   67%
src/secchi/mcp_server.py main   1 1 0   0%
src/secchi/mcp_server.py (no function)   36 1 0   97%
src/secchi/models.py Registry.display_name   1 0 0   100%
src/secchi/models.py Registry.icon   1 1 0   0%
src/secchi/models.py Registry.language   1 1 0   0%
src/secchi/models.py Registry.install_command   1 1 0   0%
src/secchi/models.py ActivityEventKind.icon   1 1 0   0%
src/secchi/models.py ActivityEventKind.label   1 1 0   0%
src/secchi/models.py (no function)   190 0 0   100%
src/secchi/policy.py evaluate_default_policy   4 0 0   100%
src/secchi/policy.py (no function)   9 0 0   100%
src/secchi/renderers/__init__.py (no function)   0 0 0   100%
src/secchi/renderers/reports.py build_project_report   12 2 0   83%
src/secchi/renderers/reports.py render_report   7 1 0   86%
src/secchi/renderers/reports.py render_markdown   4 0 0   100%
src/secchi/renderers/reports.py render_html   2 0 0   100%
src/secchi/renderers/reports.py render_terminal_report   1 1 0   0%
src/secchi/renderers/reports.py render_project_report   7 1 0   86%
src/secchi/renderers/reports.py default_report_path   5 5 0   0%
src/secchi/renderers/reports.py _project_report_data   4 0 0   100%
src/secchi/renderers/reports.py _project_markdown   5 0 0   100%
src/secchi/renderers/reports.py _source_markdown_row   2 0 0   100%
src/secchi/renderers/reports.py _project_html   5 0 0   100%
src/secchi/renderers/reports.py _markdown_attribution   2 0 0   100%
src/secchi/renderers/reports.py _source_status   4 1 0   75%
src/secchi/renderers/reports.py _markdown_warnings   4 2 0   50%
src/secchi/renderers/reports.py _html_warnings   4 2 0   50%
src/secchi/renderers/reports.py _html_attribution   3 0 0   100%
src/secchi/renderers/reports.py (no function)   40 0 0   100%
src/secchi/renderers/summary.py render_summary   6 0 0   100%
src/secchi/renderers/summary.py _format_count   7 2 0   71%
src/secchi/renderers/summary.py (no function)   4 0 0   100%
src/secchi/schema.py (no function)   5 0 0   100%
src/secchi/schemas.py CacheEnvelope.validate_supported_version   3 0 0   100%
src/secchi/schemas.py PackageExport.validate_version   3 1 0   67%
src/secchi/schemas.py ProjectExport.validate_version   3 1 0   67%
src/secchi/schemas.py ComparisonExport.validate_version   3 1 0   67%
src/secchi/schemas.py (no function)   55 0 0   100%
src/secchi/services/__init__.py (no function)   0 0 0   100%
src/secchi/services/comparison.py ComparisonResult.winner   2 0 0   100%
src/secchi/services/comparison.py ComparisonResult.as_dict   2 0 0   100%
src/secchi/services/comparison.py compare_intelligence   3 0 0   100%
src/secchi/services/comparison.py evaluate_candidate   45 6 0   87%
src/secchi/services/comparison.py _recommendation   7 1 0   86%
src/secchi/services/comparison.py _momentum_score   3 0 0   100%
src/secchi/services/comparison.py _community_score   5 1 0   80%
src/secchi/services/comparison.py _recency_score   15 8 0   47%
src/secchi/services/comparison.py _completeness_score   2 0 0   100%
src/secchi/services/comparison.py _candidate_dict   3 1 0   67%
src/secchi/services/comparison.py render_comparison   19 19 0   0%
src/secchi/services/comparison.py (no function)   45 0 0   100%
src/secchi/services/intelligence.py PackageIntelligenceService.__init__   3 0 0   100%
src/secchi/services/intelligence.py PackageIntelligenceService.fetch_project   3 3 0   0%
src/secchi/services/intelligence.py PackageIntelligenceService.fetch_package   16 5 0   69%
src/secchi/services/intelligence.py PackageIntelligenceService._fetch_fresh   31 6 0   81%
src/secchi/services/intelligence.py PackageIntelligenceService._optional_signal   4 0 0   100%
src/secchi/services/intelligence.py PackageIntelligenceService._apply_history_deltas   12 12 0   0%
src/secchi/services/intelligence.py PackageIntelligenceService._load_cache   3 3 0   0%
src/secchi/services/intelligence.py PackageIntelligenceService._save_cache   3 1 0   67%
src/secchi/services/intelligence.py PackageIntelligenceService._history_path   2 2 0   0%
src/secchi/services/intelligence.py health_history_points   14 2 0   86%
src/secchi/services/intelligence.py (no function)   43 0 0   100%
src/secchi/services/resolver.py parse_package_spec   12 2 0   83%
src/secchi/services/resolver.py resolve_package   9 4 0   56%
src/secchi/services/resolver.py (no function)   6 0 0   100%
src/secchi/services/search.py PackageSearchService.search   7 0 0   100%
src/secchi/services/search.py PackageSearchService.search.search_registry   9 0 0   100%
src/secchi/services/search.py PackageSearchService._sort_key   3 0 0   100%
src/secchi/services/search.py (no function)   13 0 0   100%
src/secchi/spotlight.py Spotlight.project_stage   7 0 0   100%
src/secchi/spotlight.py spotlight_disabled   2 2 0   0%
src/secchi/spotlight.py spotlight_cache_path   1 1 0   0%
src/secchi/spotlight.py load_cached_spotlight   12 12 0   0%
src/secchi/spotlight.py save_cached_spotlight   7 7 0   0%
src/secchi/spotlight.py fetch_spotlight   17 17 0   0%
src/secchi/spotlight.py _decode_spotlight   11 11 0   0%
src/secchi/spotlight.py _clean_text   2 2 0   0%
src/secchi/spotlight.py _clean_url   8 8 0   0%
src/secchi/spotlight.py _parse_datetime   6 6 0   0%
src/secchi/spotlight.py _parse_stars   6 6 0   0%
src/secchi/spotlight.py (no function)   34 0 0   100%
src/secchi/trending.py _trending_date   1 1 0   0%
src/secchi/trending.py fetch_trending   15 15 0   0%
src/secchi/trending.py _short_stars   5 5 0   0%
src/secchi/trending.py load_cached_trending   12 12 0   0%
src/secchi/trending.py save_cached_trending   7 7 0   0%
src/secchi/trending.py _parse_datetime   6 6 0   0%
src/secchi/trending.py (no function)   24 0 0   100%
src/secchi/ui/__init__.py (no function)   0 0 0   100%
src/secchi/ui/app.py Secchi.__init__   14 0 0   100%
src/secchi/ui/app.py Secchi.project   1 1 0   0%
src/secchi/ui/app.py Secchi.visible_packages   3 1 0   67%
src/secchi/ui/app.py Secchi.workspace_projects   1 1 0   0%
src/secchi/ui/app.py Secchi.refreshed_at   1 1 0   0%
src/secchi/ui/app.py Secchi.package_data   1 1 0   0%
src/secchi/ui/app.py Secchi.get_package_info   5 5 0   0%
src/secchi/ui/app.py Secchi.get_package_error   5 5 0   0%
src/secchi/ui/app.py Secchi.get_package_warnings   4 4 0   0%
src/secchi/ui/app.py Secchi.get_derived   12 12 0   0%
src/secchi/ui/app.py Secchi._matching_refs   3 3 0   0%
src/secchi/ui/app.py Secchi.compose   3 3 0   0%
src/secchi/ui/app.py Secchi.on_mount   5 5 0   0%
src/secchi/ui/app.py Secchi.action_refresh   3 3 0   0%
src/secchi/ui/app.py Secchi.action_toggle_filter   1 1 0   0%
src/secchi/ui/app.py Secchi.action_search   2 2 0   0%
src/secchi/ui/app.py Secchi.action_search._on_result   2 2 0   0%
src/secchi/ui/app.py Secchi.action_help   1 1 0   0%
src/secchi/ui/app.py Secchi.action_export   6 6 0   0%
src/secchi/ui/app.py Secchi.action_export._on_export   23 23 0   0%
src/secchi/ui/app.py Secchi._start_spotlight_fetch   7 7 0   0%
src/secchi/ui/app.py Secchi._fetch_spotlight   5 5 0   0%
src/secchi/ui/app.py Secchi._start_trending_fetch   8 8 0   0%
src/secchi/ui/app.py Secchi._fetch_trending   7 7 0   0%
src/secchi/ui/app.py Secchi._select_default_package   10 2 0   80%
src/secchi/ui/app.py Secchi.navigate_to_package   9 2 0   78%
src/secchi/ui/app.py Secchi._on_package_selected   1 1 0   0%
src/secchi/ui/app.py Secchi._on_project_selected   4 4 0   0%
src/secchi/ui/app.py Secchi._render_selected   7 7 0   0%
src/secchi/ui/app.py Secchi._render_selected_loop   11 11 0   0%
src/secchi/ui/app.py Secchi._render_selected_once   19 19 0   0%
src/secchi/ui/app.py Secchi._start_data_fetch   17 17 0   0%
src/secchi/ui/app.py Secchi._fetch_all_packages   14 14 0   0%
src/secchi/ui/app.py Secchi._fetch_single_package   10 10 0   0%
src/secchi/ui/app.py Secchi._notify_ui_update   7 7 0   0%
src/secchi/ui/app.py (no function)   68 0 0   100%
src/secchi/ui/palette.py (no function)   25 0 0   100%
src/secchi/ui/styles/__init__.py (no function)   0 0 0   100%
src/secchi/ui/widgets/__init__.py (no function)   0 0 0   100%
src/secchi/ui/widgets/badge.py Badge.__init__   9 9 0   0%
src/secchi/ui/widgets/badge.py (no function)   5 5 0   0%
src/secchi/ui/widgets/bar.py render_bar   6 6 0   0%
src/secchi/ui/widgets/bar.py (no function)   5 0 0   100%
src/secchi/ui/widgets/detail.py DetailView.__init__   7 7 0   0%
src/secchi/ui/widgets/detail.py DetailView.compose   10 10 0   0%
src/secchi/ui/widgets/detail.py DetailView._compose_summary_row   4 4 0   0%
src/secchi/ui/widgets/detail.py DetailView._build_project_card   27 27 0   0%
src/secchi/ui/widgets/detail.py DetailView._compose_stat_cards   22 22 0   0%
src/secchi/ui/widgets/detail.py DetailView._compose_tabs   14 14 0   0%
src/secchi/ui/widgets/detail.py DetailView._build_title   3 3 0   0%
src/secchi/ui/widgets/detail.py DetailView._releases_pane   17 17 0   0%
src/secchi/ui/widgets/detail.py DetailView._deps_pane   7 7 0   0%
src/secchi/ui/widgets/detail.py DetailView._versions_pane   7 7 0   0%
src/secchi/ui/widgets/detail.py DetailView._activity_pane   9 9 0   0%
src/secchi/ui/widgets/detail.py _grade_color   5 5 0   0%
src/secchi/ui/widgets/detail.py _health_label   7 7 0   0%
src/secchi/ui/widgets/detail.py _trend_label   3 3 0   0%
src/secchi/ui/widgets/detail.py _trend_color   3 3 0   0%
src/secchi/ui/widgets/detail.py _health_mom   7 7 0   0%
src/secchi/ui/widgets/detail.py _dependent_delta   4 4 0   0%
src/secchi/ui/widgets/detail.py _dependent_signal   9 9 0   0%
src/secchi/ui/widgets/detail.py _growth_color   3 3 0   0%
src/secchi/ui/widgets/detail.py _latest_version_adoption   3 3 0   0%
src/secchi/ui/widgets/detail.py _rollout_signal   7 7 0   0%
src/secchi/ui/widgets/detail.py _rollout_color   7 7 0   0%
src/secchi/ui/widgets/detail.py _short_url   1 1 0   0%
src/secchi/ui/widgets/detail.py _resolve_size   8 8 0   0%
src/secchi/ui/widgets/detail.py _registry_icon_label   1 1 0   0%
src/secchi/ui/widgets/detail.py (no function)   39 0 0   100%
src/secchi/ui/widgets/header_bar.py SecchiHeader.compose   4 4 0   0%
src/secchi/ui/widgets/header_bar.py (no function)   8 0 0   100%
src/secchi/ui/widgets/modals.py SearchScreen.__init__   2 2 0   0%
src/secchi/ui/widgets/modals.py SearchScreen.compose   4 4 0   0%
src/secchi/ui/widgets/modals.py SearchScreen.on_mount   2 2 0   0%
src/secchi/ui/widgets/modals.py SearchScreen._populate   9 9 0   0%
src/secchi/ui/widgets/modals.py SearchScreen._key   2 2 0   0%
src/secchi/ui/widgets/modals.py SearchScreen._on_change   1 1 0   0%
src/secchi/ui/widgets/modals.py SearchScreen._on_submit   5 5 0   0%
src/secchi/ui/widgets/modals.py SearchScreen._on_option   1 1 0   0%
src/secchi/ui/widgets/modals.py SearchScreen._select   8 8 0   0%
src/secchi/ui/widgets/modals.py SearchScreen._visible_packages   9 9 0   0%
src/secchi/ui/widgets/modals.py SearchScreen.action_dismiss_screen   1 1 0   0%
src/secchi/ui/widgets/modals.py HelpScreen.compose   5 5 0   0%
src/secchi/ui/widgets/modals.py HelpScreen.on_key   1 1 0   0%
src/secchi/ui/widgets/modals.py HelpScreen.action_dismiss_screen   1 1 0   0%
src/secchi/ui/widgets/modals.py ExportScreen.__init__   2 2 0   0%
src/secchi/ui/widgets/modals.py ExportScreen.compose   7 7 0   0%
src/secchi/ui/widgets/modals.py ExportScreen.on_mount   3 3 0   0%
src/secchi/ui/widgets/modals.py ExportScreen._on_option_select   1 1 0   0%
src/secchi/ui/widgets/modals.py ExportScreen._on_ok   1 1 0   0%
src/secchi/ui/widgets/modals.py ExportScreen._on_cancel   1 1 0   0%
src/secchi/ui/widgets/modals.py ExportScreen._do_export   9 9 0   0%
src/secchi/ui/widgets/modals.py ExportScreen.action_focus_left   1 1 0   0%
src/secchi/ui/widgets/modals.py ExportScreen.action_focus_right   1 1 0   0%
src/secchi/ui/widgets/modals.py ExportScreen.action_dismiss_none   1 1 0   0%
src/secchi/ui/widgets/modals.py (no function)   47 0 0   100%
src/secchi/ui/widgets/overview.py _downloads_source   1 0 0   100%
src/secchi/ui/widgets/overview.py _source_registries   1 0 0   100%
src/secchi/ui/widgets/overview.py OverviewTab.__init__   4 0 0   100%
src/secchi/ui/widgets/overview.py OverviewTab.compose   14 0 0   100%
src/secchi/ui/widgets/overview.py OverviewTab._on_range_pressed   10 10 0   0%
src/secchi/ui/widgets/overview.py AdoptionTrendPanel.__init__   5 0 0   100%
src/secchi/ui/widgets/overview.py AdoptionTrendPanel.compose_body   1 0 0   100%
src/secchi/ui/widgets/overview.py AdoptionTrendBody.__init__   3 0 0   100%
src/secchi/ui/widgets/overview.py AdoptionTrendBody.on_mount   1 0 0   100%
src/secchi/ui/widgets/overview.py AdoptionTrendBody.on_resize   1 0 0   100%
src/secchi/ui/widgets/overview.py AdoptionTrendBody._update_content   13 7 0   46%
src/secchi/ui/widgets/overview.py HealthScorePanel.__init__   2 0 0   100%
src/secchi/ui/widgets/overview.py HealthScorePanel.compose_body   7 3 0   57%
src/secchi/ui/widgets/overview.py EcosystemDistributionPanel.__init__   2 0 0   100%
src/secchi/ui/widgets/overview.py EcosystemDistributionPanel.compose_body   11 8 0   27%
src/secchi/ui/widgets/overview.py ReverseDependenciesPanel.__init__   2 0 0   100%
src/secchi/ui/widgets/overview.py ReverseDependenciesPanel.compose_body   11 9 0   18%
src/secchi/ui/widgets/overview.py HealthTimelinePanel.__init__   2 0 0   100%
src/secchi/ui/widgets/overview.py HealthTimelinePanel.compose_body   1 0 0   100%
src/secchi/ui/widgets/overview.py HealthTimelineBody.__init__   2 0 0   100%
src/secchi/ui/widgets/overview.py HealthTimelineBody.on_mount   1 0 0   100%
src/secchi/ui/widgets/overview.py HealthTimelineBody.on_resize   1 0 0   100%
src/secchi/ui/widgets/overview.py HealthTimelineBody._update_content   11 6 0   45%
src/secchi/ui/widgets/overview.py VersionAdoptionPanel.__init__   4 0 0   100%
src/secchi/ui/widgets/overview.py VersionAdoptionPanel.compose_body   17 14 0   18%
src/secchi/ui/widgets/overview.py _version_bar   2 2 0   0%
src/secchi/ui/widgets/overview.py _adoption_points   7 0 0   100%
src/secchi/ui/widgets/overview.py _bucket_by_week   11 1 0   91%
src/secchi/ui/widgets/overview.py _bucket_by_month   7 1 0   86%
src/secchi/ui/widgets/overview.py _thin_points   8 1 0   88%
src/secchi/ui/widgets/overview.py _period_download_summary   9 9 0   0%
src/secchi/ui/widgets/overview.py _trend_label   7 3 0   57%
src/secchi/ui/widgets/overview.py _render_line_chart   40 3 0   92%
src/secchi/ui/widgets/overview.py _draw_segment   12 0 0   100%
src/secchi/ui/widgets/overview.py _point_limit   5 0 0   100%
src/secchi/ui/widgets/overview.py _parse_day   4 2 0   50%
src/secchi/ui/widgets/overview.py _short_date_label   4 1 0   75%
src/secchi/ui/widgets/overview.py _short_month   5 1 0   80%
src/secchi/ui/widgets/overview.py _range_label   5 5 0   0%
src/secchi/ui/widgets/overview.py _clip   1 1 0   0%
src/secchi/ui/widgets/overview.py _health_signal   7 3 0   57%
src/secchi/ui/widgets/overview.py (no function)   68 0 0   100%
src/secchi/ui/widgets/panel.py Panel.__init__   5 0 0   100%
src/secchi/ui/widgets/panel.py Panel.on_mount   1 0 0   100%
src/secchi/ui/widgets/panel.py Panel.compose   4 0 0   100%
src/secchi/ui/widgets/panel.py Panel.compose_body   1 1 0   0%
src/secchi/ui/widgets/panel.py Panel.set_caption   5 5 0   0%
src/secchi/ui/widgets/panel.py PanelBody.__init__   2 0 0   100%
src/secchi/ui/widgets/panel.py (no function)   15 0 0   100%
src/secchi/ui/widgets/sidebar.py SidebarItem.__init__   4 4 0   0%
src/secchi/ui/widgets/sidebar.py SidebarItem.set_version   2 2 0   0%
src/secchi/ui/widgets/sidebar.py SidebarItem._content   5 5 0   0%
src/secchi/ui/widgets/sidebar.py SidebarItem.on_click   1 1 0   0%
src/secchi/ui/widgets/sidebar.py ProjectItem.__init__   3 3 0   0%
src/secchi/ui/widgets/sidebar.py ProjectItem.on_click   1 1 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar.PackageSelected.__init__   2 2 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar.ProjectSelected.__init__   2 2 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar.__init__   9 9 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar.compose   11 11 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar.on_mount   1 1 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar._build   43 43 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar._add_item   5 5 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar._refresh_versions   6 6 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar.refresh_versions   1 1 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar.set_spotlight   18 18 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar.set_trending   18 18 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar._pkg_key   2 2 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar.select_package   6 6 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar.deselect_all   2 2 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar._highlight   3 3 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar.action_cursor_down   5 5 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar.action_cursor_up   5 5 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar.action_select_cursor   3 3 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar._scroll_to_cursor   3 3 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar.toggle_favorites_filter   2 2 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar._spotlight_markup   4 4 0   0%
src/secchi/ui/widgets/sidebar.py Sidebar._trending_markup   4 4 0   0%
src/secchi/ui/widgets/sidebar.py (no function)   48 0 0   100%
src/secchi/ui/widgets/stat_card.py StatCard.__init__   9 9 0   0%
src/secchi/ui/widgets/stat_card.py StatCard.compose   4 4 0   0%
src/secchi/ui/widgets/stat_card.py StatCard.set   10 10 0   0%
src/secchi/ui/widgets/stat_card.py StatCard._value_markup   3 3 0   0%
src/secchi/ui/widgets/stat_card.py StatCard._delta_markup   4 4 0   0%
src/secchi/ui/widgets/stat_card.py StatCard._signal_markup   4 4 0   0%
src/secchi/ui/widgets/stat_card.py (no function)   12 0 0   100%
src/secchi/ui/widgets/status_bar.py _format_key   1 0 0   100%
src/secchi/ui/widgets/status_bar.py format_path   6 6 0   0%
src/secchi/ui/widgets/status_bar.py _age_text   11 11 0   0%
src/secchi/ui/widgets/status_bar.py SecchiFooter.__init__   2 2 0   0%
src/secchi/ui/widgets/status_bar.py SecchiFooter.compose   3 3 0   0%
src/secchi/ui/widgets/status_bar.py SecchiFooter.on_mount   2 2 0   0%
src/secchi/ui/widgets/status_bar.py SecchiFooter._tick   6 6 0   0%
src/secchi/ui/widgets/status_bar.py (no function)   19 0 0   100%
src/secchi/utils.py shorten_number   7 3 0   57%
src/secchi/utils.py format_age   19 19 0   0%
src/secchi/utils.py format_age_short   14 14 0   0%
src/secchi/utils.py format_pct_delta   5 5 0   0%
src/secchi/utils.py shorten_bytes   10 10 0   0%
src/secchi/utils.py derive_github_repo   14 10 0   29%
src/secchi/utils.py _gh_headers   5 5 0   0%
src/secchi/utils.py _parse_gh_time   6 6 0   0%
src/secchi/utils.py fetch_github_release_notes   19 19 0   0%
src/secchi/utils.py fetch_github_stats   13 13 0   0%
src/secchi/utils.py fetch_github_repo_signals   15 15 0   0%
src/secchi/utils.py fetch_github_issue_events   19 19 0   0%
src/secchi/utils.py fetch_github_stats_for_package   4 4 0   0%
src/secchi/utils.py fetch_github_extended_stats_for_package   12 9 0   25%
src/secchi/utils.py fetch_release_notes_for_package   9 9 0   0%
src/secchi/utils.py (no function)   23 0 0   100%
src/secchi/workflows/__init__.py (no function)   0 0 0   100%
src/secchi/workflows/check.py CheckResult.passed   1 0 0   100%
src/secchi/workflows/check.py run   6 1 0   83%
src/secchi/workflows/check.py (no function)   14 0 0   100%
src/secchi/workflows/common.py fetch_package   2 0 0   100%
src/secchi/workflows/common.py require_package   6 0 0   100%
src/secchi/workflows/common.py (no function)   7 0 0   100%
src/secchi/workflows/compare.py _resolve_refs   11 11 0   0%
src/secchi/workflows/compare.py run   6 6 0   0%
src/secchi/workflows/compare.py (no function)   7 0 0   100%
src/secchi/workflows/dashboard.py _workspace_project   5 0 0   100%
src/secchi/workflows/dashboard.py run   28 19 0   32%
src/secchi/workflows/dashboard.py (no function)   14 0 0   100%
src/secchi/workflows/inspect.py run   2 2 0   0%
src/secchi/workflows/inspect.py (no function)   3 0 0   100%
src/secchi/workflows/report.py run   19 19 0   0%
src/secchi/workflows/report.py (no function)   14 0 0   100%
src/secchi/workflows/search.py run   2 2 0   0%
src/secchi/workflows/search.py (no function)   3 0 0   100%
src/secchi/workflows/show.py run   4 4 0   0%
src/secchi/workflows/show.py (no function)   5 5 0   0%
src/secchi/workspace/__init__.py (no function)   4 0 0   100%
src/secchi/workspace/aggregate.py logical_package_refs   9 0 0   100%
src/secchi/workspace/aggregate.py combine_package_infos   22 1 0   95%
src/secchi/workspace/aggregate.py pick_primary_info   5 1 0   80%
src/secchi/workspace/aggregate.py unique_registries   7 0 0   100%
src/secchi/workspace/aggregate.py combine_download_trends   5 0 0   100%
src/secchi/workspace/aggregate.py combine_install_breakdown   12 2 0   83%
src/secchi/workspace/aggregate.py (no function)   10 0 0   100%
src/secchi/workspace/state.py WorkspaceState.select   1 0 0   100%
src/secchi/workspace/state.py WorkspaceState.should_load   3 0 0   100%
src/secchi/workspace/state.py WorkspaceState.begin_load   4 0 0   100%
src/secchi/workspace/state.py WorkspaceState.finish_load   2 0 0   100%
src/secchi/workspace/state.py WorkspaceState.cancel_load   1 0 0   100%
src/secchi/workspace/state.py (no function)   13 0 0   100%
Total     4271 1871 17   56%

No items found using the specified filter.