Coverage report: 70%

Files Functions Classes

coverage.py v7.16.1, created at 2026-09-18 22:11 +0000

File function   statements missing excluded   coverage
app.py (no function)   1 1 0   0%
redis_cache/cache_utility.py (no function)   3 0 0   100%
tests/__init__.py (no function)   0 0 0   100%
tests/login/__init__.py (no function)   0 0 0   100%
tests/login/test_login.py make_root_macaroon   4 0 0   100%
tests/login/test_login.py TestLoginViews.setUp   5 0 0   100%
tests/login/test_login.py TestLoginViews.test_login   6 0 0   100%
tests/login/test_login.py TestLoginViews.test_login_next   6 0 0   100%
tests/login/test_login.py TestLoginViews.test_login_api_500   5 0 0   100%
tests/login/test_login.py TestLoginViews.test_logout   6 0 0   100%
tests/login/test_login.py TestLoginViews.test_login_callback   10 0 0   100%
tests/login/test_login.py TestLoginViews.test_login_callback_missing_root_macaroon   6 0 0   100%
tests/login/test_login.py (no function)   26 0 0   100%
tests/mock_data/mock_publisher_logic.py (no function)   7 0 0   100%
tests/mock_data/mock_store_logic.py (no function)   7 0 0   100%
tests/mock_data/search_mock.py (no function)   5 0 0   100%
tests/publisher/__init__.py (no function)   0 0 0   100%
tests/publisher/test_publisher_logic.py TestProcessReleases.setUp   3 0 0   100%
tests/publisher/test_publisher_logic.py TestProcessReleases.test_process_releases_empty_inputs   2 0 0   100%
tests/publisher/test_publisher_logic.py TestProcessReleases.test_process_releases_single_channel_single_revision   3 0 0   100%
tests/publisher/test_publisher_logic.py TestProcessReleases.test_process_releases_multiple_channels_revisions   3 0 0   100%
tests/publisher/test_publisher_logic.py TestGetAllArchitectures.test_get_all_architectures   4 0 0   100%
tests/publisher/test_publisher_logic.py (no function)   11 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.setUp   6 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.set_session   3 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_get_account_details_no_login   5 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_get_account_details   5 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_solutions_csrf_token   5 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_get_publisher   4 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_get_package   4 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_update_package   7 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_update_package_failure   4 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_update_package_unauthorized   5 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_list_page   12 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_solutions_page_empty_state   5 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_edit_solution_handles_empty_deployable_on   8 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_list_page_expired_session_redirects_login   9 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_accept_invite   3 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_accept_post_invite   3 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_accept_post_invite_failed   5 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_accept_post_invite_error_list   4 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_accept_post_invite_macaroon_refresh_required   7 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_reject_post_invite   3 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_get_collaborators   3 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_get_collaborators_failed   3 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_get_pending_invites   3 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_invite_collaborators   4 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_revoke_invite   3 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_register_name   3 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_post_register_name   3 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_post_register_name_already_owned   4 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_post_register_name_api_error_relays_message   6 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_register_name_dispute   3 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_register_name_dispute_redirect   2 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_register_name_dispute_thank_you_redirect   2 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_register_name_dispute_thank_you   3 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_delete_package   3 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_delete_package_failed   4 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_post_create_track   4 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_post_create_track_already_exists   4 0 0   100%
tests/publisher/test_publisher_views.py TestPublisherViews.test_get_releases   6 0 0   100%
tests/publisher/test_publisher_views.py (no function)   81 0 0   100%
tests/solutions/__init__.py (no function)   0 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionsLogic.test_get_solution_from_backend_success   7 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionsLogic.test_get_solution_from_backend_prefers_authenticated_solution   8 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionsLogic.test_get_solution_from_backend_falls_back_to_public_preview   8 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionsLogic.test_get_solution_from_backend_falls_back_when_auth_hash_not_found   11 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionsLogic.test_get_solution_from_backend_not_found   5 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionsLogic.test_get_solution_from_backend_exception   3 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionsLogic.test_get_publisher_solutions_success   10 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionsLogic.test_get_publisher_solutions_auth_failure   3 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionsLogic.test_group_solution_drafts_attaches_draft_to_published   6 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionsLogic.test_group_solution_drafts_standalone_draft_without_published   4 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionsLogic.test_group_solution_drafts_rev1_draft_is_untouched   5 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionsLogic.test_group_solution_drafts_published_without_draft   4 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionsLogic.test_group_solution_drafts_preserves_unrelated_solutions   9 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionCategories.test_get_solution_categories_maps_store_shape   3 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionCategories.test_get_solution_categories_falls_back_to_config   3 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionCategories.test_get_solution_categories_falls_back_on_store_error   3 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionCategories.test_map_category_slugs_to_display_known_slugs   3 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionCategories.test_map_category_slugs_to_display_unknown_slug_fallback   3 0 0   100%
tests/solutions/test_solutions_logic.py TestSolutionCategories.test_map_category_slugs_to_display_empty   2 0 0   100%
tests/solutions/test_solutions_logic.py (no function)   49 0 0   100%
tests/store/__init__.py (no function)   0 0 0   100%
tests/store/test_details_overview.py TestDetailsOverview.setUp   2 0 0   100%
tests/store/test_details_overview.py TestDetailsOverview.test_details_with_discourse_link   5 0 0   100%
tests/store/test_details_overview.py TestDetailsOverview.test_details_with_readthedocs_link   8 0 0   100%
tests/store/test_details_overview.py TestDetailsOverview.test_get_libraries_from_cache   5 0 0   100%
tests/store/test_details_overview.py TestDetailsOverview.test_get_libraries_from_gateway_on_cache_miss   5 0 0   100%
tests/store/test_details_overview.py TestDetailsOverview.test_get_package_details_from_cache   3 0 0   100%
tests/store/test_details_overview.py TestDetailsOverview.test_get_package_details_from_gateway_on_cache_miss   5 0 0   100%
tests/store/test_details_overview.py (no function)   31 0 0   100%
tests/store/test_get_packages.py TestGetPackages.setUp   2 0 0   100%
tests/store/test_get_packages.py TestGetPackages.test_get_packages   5 0 0   100%
tests/store/test_get_packages.py TestGetPackages.test_get_packages_with_query   7 0 0   100%
tests/store/test_get_packages.py TestGetPackages.test_get_packages_with_provides_and_requires   9 0 0   100%
tests/store/test_get_packages.py TestGetPackages.test_get_packages_error_handling   6 1 0   83%
tests/store/test_get_packages.py TestGetPackages.test_get_packages_empty_response   5 0 0   100%
tests/store/test_get_packages.py (no function)   16 0 0   100%
tests/store/test_get_publisher_details.py TestGetPublisherDetails.setUp   2 0 0   100%
tests/store/test_get_publisher_details.py TestGetPublisherDetails.test_get_publisher_details   6 0 0   100%
tests/store/test_get_publisher_details.py TestGetPublisherDetails.test_get_publisher_details_empty_response   6 0 0   100%
tests/store/test_get_publisher_details.py TestGetPublisherDetails.test_get_publisher_details_exception   5 2 0   60%
tests/store/test_get_publisher_details.py TestGetPublisherDetails._assert_heading_section   5 0 0   100%
tests/store/test_get_publisher_details.py TestGetPublisherDetails._assert_content_section   6 0 0   100%
tests/store/test_get_publisher_details.py TestGetPublisherDetails._assert_card   6 0 0   100%
tests/store/test_get_publisher_details.py (no function)   16 0 0   100%
tests/store/test_package_has_sboms.py TestPackageHasSboms.test_package_has_sboms_no_revisions   4 0 0   100%
tests/store/test_package_has_sboms.py TestPackageHasSboms.test_package_has_sboms_success_200   11 0 0   100%
tests/store/test_package_has_sboms.py TestPackageHasSboms.test_package_has_sboms_success_302   11 0 0   100%
tests/store/test_package_has_sboms.py TestPackageHasSboms.test_package_has_sboms_failure_404   11 0 0   100%
tests/store/test_package_has_sboms.py TestPackageHasSboms.test_package_has_sboms_failure_500   11 0 0   100%
tests/store/test_package_has_sboms.py TestPackageHasSboms.test_package_has_sboms_multiple_revisions_uses_first   11 0 0   100%
tests/store/test_package_has_sboms.py TestPackageHasSboms.test_package_has_sboms_request_exception_returns_false   6 0 0   100%
tests/store/test_package_has_sboms.py TestPackageHasSboms.test_package_has_sboms_edge_cases   13 0 0   100%
tests/store/test_package_has_sboms.py (no function)   28 1 0   96%
tests/store/test_store_logic.py TestConvertChannelMaps.test_convert_channel_map   2 0 0   100%
tests/store/test_store_logic.py TestAddStoreFront.test_add_store_front_data   6 0 0   100%
tests/store/test_store_logic.py TestGetBannerUrl.test_banner_url_in_media   3 0 0   100%
tests/store/test_store_logic.py TestGetBannerUrl.test_banner_url_not_in_media   3 0 0   100%
tests/store/test_store_logic.py TestGetBannerUrl.test_empty_media_list   3 0 0   100%
tests/store/test_store_logic.py TestExtractSeries.test_extract_series_short_name   3 0 0   100%
tests/store/test_store_logic.py TestExtractSeries.test_extract_series_long_name   3 0 0   100%
tests/store/test_store_logic.py TestExtractSeries.test_extract_series_duplicate_bases   3 0 0   100%
tests/store/test_store_logic.py TestExtractBases.test_extract_bases   3 0 0   100%
tests/store/test_store_logic.py TestExtractBases.test_extract_bases_empty_bases   3 0 0   100%
tests/store/test_store_logic.py TestExtractBases.test_extract_bases_duplicate_bases   3 0 0   100%
tests/store/test_store_logic.py TestLibraries.test_process_libraries   1 0 0   100%
tests/store/test_store_logic.py TestLibraries.test_get_library   3 0 0   100%
tests/store/test_store_logic.py TestFormatslug.test_format_slug   8 0 0   100%
tests/store/test_store_logic.py TestProcessRevision.test_process_revision   3 0 0   100%
tests/store/test_store_logic.py TestAddOverlayData.test_add_overlay_data   3 0 0   100%
tests/store/test_store_logic.py TestAddOverlayData.test_overlay_data_not_needed   3 0 0   100%
tests/store/test_store_logic.py TestGetRevisions.test_get_revisions_sorted_unique   4 0 0   100%
tests/store/test_store_logic.py TestGetRevisions.test_get_revisions_single_revision   4 0 0   100%
tests/store/test_store_logic.py TestGetRevisions.test_get_revisions_empty_list   4 0 0   100%
tests/store/test_store_logic.py TestGetRevisions.test_get_revisions_all_same_revision   4 0 0   100%
tests/store/test_store_logic.py TestGetRevisions.test_get_revisions_with_sample_data   3 0 0   100%
tests/store/test_store_logic.py (no function)   35 0 0   100%
tests/test_context.py TestContextFunctions.test_schedule_banner   2 0 0   100%
tests/test_context.py (no function)   4 0 0   100%
tests/test_decorators.py TestDecorators.setUp   2 0 0   100%
tests/test_decorators.py TestDecorators.tearDown   1 0 0   100%
tests/test_decorators.py TestDecorators.test_redirect_uppercase_to_lowercase_random_url   8 0 0   100%
tests/test_decorators.py TestDecorators.test_redirect_uppercase_to_lowercase_random_url.test_func   1 0 0   100%
tests/test_decorators.py TestDecorators.test_redirect_uppercase_to_lowercase_localhost   6 0 0   100%
tests/test_decorators.py TestDecorators.test_redirect_uppercase_to_lowercase_localhost.test_func   1 1 0   0%
tests/test_decorators.py TestDecorators.test_redirect_uppercase_to_lowercase_staging   6 0 0   100%
tests/test_decorators.py TestDecorators.test_redirect_uppercase_to_lowercase_staging.test_func   1 1 0   0%
tests/test_decorators.py TestDecorators.test_redirect_uppercase_to_lowercase_production   6 0 0   100%
tests/test_decorators.py TestDecorators.test_redirect_uppercase_to_lowercase_production.test_func   1 1 0   0%
tests/test_decorators.py (no function)   10 0 0   100%
tests/test_param_redirect.py MockCookies.__init__   1 0 0   100%
tests/test_param_redirect.py MockCookies.set_cookie   1 0 0   100%
tests/test_param_redirect.py MockCookies.get   1 0 0   100%
tests/test_param_redirect.py MockRequest.__init__   3 0 0   100%
tests/test_param_redirect.py TestParamRedirect.setUp   1 0 0   100%
tests/test_param_redirect.py TestParamRedirect.test_param_redirect_capture_matches   5 0 0   100%
tests/test_param_redirect.py TestParamRedirect.test_param_redirect_capture_matches_order   5 0 0   100%
tests/test_param_redirect.py TestParamRedirect.test_param_redirect_capture_matches_args   5 0 0   100%
tests/test_param_redirect.py TestParamRedirect.test_param_redirect_capture_does_not_match   4 0 0   100%
tests/test_param_redirect.py TestParamRedirect.test_param_redirect_exec   5 0 0   100%
tests/test_param_redirect.py TestParamRedirect.test_param_redirect_exec_no_match_path   6 0 0   100%
tests/test_param_redirect.py TestParamRedirect.test_param_redirect_exec_no_cookie   6 0 0   100%
tests/test_param_redirect.py (no function)   22 1 0   95%
tests/test_routes.py TestRoutes.setUp   2 0 0   100%
tests/test_routes.py TestRoutes.test_homepage   1 0 0   100%
tests/test_routes.py (no function)   7 1 0   86%
tests/test_search.py TestSearchPackage.setUp   4 0 0   100%
tests/test_search.py TestSearchPackage.test_all_charms   9 0 0   100%
tests/test_search.py TestSearchPackage.test_all_bundles   9 0 0   100%
tests/test_search.py TestAllSearchView.setUp   1 0 0   100%
tests/test_search.py TestAllSearchView.test_search   18 0 0   100%
tests/test_search.py TestAllSearchView.test_search_all_docs   6 0 0   100%
tests/test_search.py TestAllSearchView.test_search_all_topics   8 0 0   100%
tests/test_search.py TestAllSearchView.test_search_with_limit   18 0 0   100%
tests/test_search.py (no function)   29 0 0   100%
tests/test_status_banner.py TestStatusBanner.setUp   3 0 0   100%
tests/test_status_banner.py TestStatusBanner.test_banner_rendered_when_status_banner_set   7 0 0   100%
tests/test_status_banner.py TestStatusBanner.test_banner_hidden_when_status_banner_empty   4 0 0   100%
tests/test_status_banner.py TestStatusBanner.test_publisher_layout_uses_banner   6 0 0   100%
tests/test_status_banner.py (no function)   9 0 0   100%
tests/utils/__init__.py (no function)   0 0 0   100%
tests/utils/test_email.py TestEmailer.setUp   2 0 0   100%
tests/utils/test_email.py TestEmailer.test_send_email_success   12 0 0   100%
tests/utils/test_email.py TestEmailer.test_send_email_template_success   11 0 0   100%
tests/utils/test_email.py TestEmailer.test_validate_config_missing_fields   3 0 0   100%
tests/utils/test_email.py TestEmailer.test_send_raises_smtp_exception   6 0 0   100%
tests/utils/test_email.py TestEmailer.test_create_message_addresses   7 0 0   100%
tests/utils/test_email.py TestEmailer.test_send_email_no_configuration   4 0 0   100%
tests/utils/test_email.py (no function)   15 0 0   100%
webapp/__init__.py (no function)   0 0 0   100%
webapp/app.py request_hook   2 1 0   50%
webapp/app.py get_account_json   7 7 0   0%
webapp/app.py contact_us   1 1 0   0%
webapp/app.py thank_you   1 1 0   0%
webapp/app.py icon_validator   1 1 0   0%
webapp/app.py site_map   4 4 0   0%
webapp/app.py site_map_links   5 5 0   0%
webapp/app.py site_map_operators   7 7 0   0%
webapp/app.py (no function)   58 0 0   100%
webapp/authentication.py is_authenticated   1 0 0   100%
webapp/authentication.py empty_session   3 0 0   100%
webapp/authentication.py (no function)   2 0 0   100%
webapp/config.py (no function)   11 0 0   100%
webapp/decorators.py strtobool   1 0 0   100%
webapp/decorators.py cached_redirect   3 0 0   100%
webapp/decorators.py cached_redirect.param_redirect   4 1 0   75%
webapp/decorators.py login_required   3 0 0   100%
webapp/decorators.py login_required.is_user_logged_in   11 0 0   100%
webapp/decorators.py store_maintenance   3 0 0   100%
webapp/decorators.py store_maintenance.is_store_in_maintenance   3 1 0   67%
webapp/decorators.py redirect_uppercase_to_lowercase   3 0 0   100%
webapp/decorators.py redirect_uppercase_to_lowercase.is_uppercase   10 1 0   90%
webapp/decorators.py (no function)   13 0 0   100%
webapp/extensions.py (no function)   4 0 0   100%
webapp/handlers.py charmhub_utility_processor   4 0 0   100%
webapp/handlers.py set_handlers   17 0 0   100%
webapp/handlers.py set_handlers.utility_processor   1 0 0   100%
webapp/handlers.py set_handlers.redirect_to_login   2 0 0   100%
webapp/handlers.py set_handlers.handle_store_api_timeout   2 2 0   0%
webapp/handlers.py set_handlers.handle_store_api_circuit_breaker_exception   1 1 0   0%
webapp/handlers.py set_handlers.handle_store_api_error_list   10 10 0   0%
webapp/handlers.py set_handlers.handle_macaroon_refresh_required   2 0 0   100%
webapp/handlers.py set_handlers.handle_store_api_error   5 2 0   60%
webapp/handlers.py set_handlers.add_headers   7 0 0   100%
webapp/handlers.py (no function)   15 0 0   100%
webapp/helpers.py get_yaml_loader   3 1 0   67%
webapp/helpers.py is_safe_url   7 2 0   71%
webapp/helpers.py get_soup   2 0 0   100%
webapp/helpers.py decrease_header   5 5 0   0%
webapp/helpers.py add_header_id   20 20 0   0%
webapp/helpers.py modify_headers   5 5 0   0%
webapp/helpers.py schedule_banner   7 2 0   71%
webapp/helpers.py markdown_to_html   2 0 0   100%
webapp/helpers.py sanitize_html   3 0 0   100%
webapp/helpers.py param_redirect_capture   10 0 0   100%
webapp/helpers.py param_redirect_exec   9 0 0   100%
webapp/helpers.py get_csp_as_str   5 0 0   100%
webapp/helpers.py humanize_date   4 4 0   0%
webapp/helpers.py format_solution_status   3 3 0   0%
webapp/helpers.py get_solution_form_value   11 2 0   82%
webapp/helpers.py (no function)   34 0 0   100%
webapp/integrations/logic.py Interfaces.__init__   1 0 0   100%
webapp/integrations/logic.py Interfaces.repo   3 3 0   0%
webapp/integrations/logic.py Interfaces.get_interfaces   14 14 0   0%
webapp/integrations/logic.py Interfaces.get_interface_from_path   40 40 0   0%
webapp/integrations/logic.py Interfaces.get_h_content   2 2 0   0%
webapp/integrations/logic.py Interfaces.extract_headings_and_content   14 14 0   0%
webapp/integrations/logic.py Interfaces.parse_text   14 14 0   0%
webapp/integrations/logic.py Interfaces.convert_readme   26 26 0   0%
webapp/integrations/logic.py Interfaces.get_interface_name_from_readme   2 2 0   0%
webapp/integrations/logic.py (no function)   29 0 0   100%
webapp/integrations/views.py interfaces_json   3 3 0   0%
webapp/integrations/views.py all_interfaces   3 3 0   0%
webapp/integrations/views.py fetch_interface_details   19 19 0   0%
webapp/integrations/views.py get_single_interface   5 5 0   0%
webapp/integrations/views.py get_single_interface_json   4 4 0   0%
webapp/integrations/views.py (no function)   21 0 0   100%
webapp/login/macaroon.py MacaroonRequest.__init__   1 0 0   100%
webapp/login/macaroon.py MacaroonRequest.getExtensionArgs   1 1 0   0%
webapp/login/macaroon.py MacaroonResponse.__init__   1 1 0   0%
webapp/login/macaroon.py MacaroonResponse.getExtensionArgs   3 3 0   0%
webapp/login/macaroon.py MacaroonResponse.fromSuccessResponse   11 11 0   0%
webapp/login/macaroon.py (no function)   13 0 0   100%
webapp/login/views.py get_caveat_id   7 2 0   71%
webapp/login/views.py logout   2 0 0   100%
webapp/login/views.py publisher_login   10 2 0   80%
webapp/login/views.py login_callback   15 1 0   93%
webapp/login/views.py (no function)   26 0 0   100%
webapp/observability/utils.py trace_function   3 0 0   100%
webapp/observability/utils.py trace_function.wrapper   2 0 0   100%
webapp/observability/utils.py start_span   1 1 0   0%
webapp/observability/utils.py (no function)   5 0 0   100%
webapp/packages/__init__.py (no function)   0 0 0   100%
webapp/packages/logic.py get_icon   4 4 0   0%
webapp/packages/logic.py fetch_packages   30 30 0   0%
webapp/packages/logic.py fetch_package   4 4 0   0%
webapp/packages/logic.py get_bundle_charms   9 9 0   0%
webapp/packages/logic.py parse_package_for_card   31 31 0   0%
webapp/packages/logic.py paginate   9 9 0   0%
webapp/packages/logic.py get_packages   7 7 0   0%
webapp/packages/logic.py get_store_categories   13 13 0   0%
webapp/packages/logic.py get_package   7 7 0   0%
webapp/packages/logic.py (no function)   30 0 0   100%
webapp/packages/store_packages.py get_store_packages   4 4 0   0%
webapp/packages/store_packages.py package   4 4 0   0%
webapp/packages/store_packages.py get_store_package   3 3 0   0%
webapp/packages/store_packages.py (no function)   17 0 0   100%
webapp/publisher/__init__.py (no function)   0 0 0   100%
webapp/publisher/form_processors.py extract_basic_form_fields   2 2 0   0%
webapp/publisher/form_processors.py extract_charms_data   1 1 0   0%
webapp/publisher/form_processors.py extract_useful_links_data   7 7 0   0%
webapp/publisher/form_processors.py extract_use_cases_data   7 7 0   0%
webapp/publisher/form_processors.py extract_maintainers_data   2 2 0   0%
webapp/publisher/form_processors.py extract_categories_data   2 2 0   0%
webapp/publisher/form_processors.py extract_platform_data   2 2 0   0%
webapp/publisher/form_processors.py extract_platform_data.clean_list   1 1 0   0%
webapp/publisher/form_processors.py process_solution_form_data   9 9 0   0%
webapp/publisher/form_processors.py create_error_context   1 1 0   0%
webapp/publisher/form_processors.py (no function)   10 0 0   100%
webapp/publisher/logic.py process_releases   20 1 0   95%
webapp/publisher/logic.py get_all_architectures   7 0 0   100%
webapp/publisher/logic.py (no function)   15 0 0   100%
webapp/publisher/views.py paginate_pages   22 17 0   23%
webapp/publisher/views.py render_solution_form_with_errors   5 5 0   0%
webapp/publisher/views.py solutions_csrf_token   4 0 0   100%
webapp/publisher/views.py get_account_details   1 0 0   100%
webapp/publisher/views.py get_package_unlisted   11 11 0   0%
webapp/publisher/views.py get_package_metadata   8 1 0   88%
webapp/publisher/views.py clear_listing_caches   6 0 0   100%
webapp/publisher/views.py get_publisher   4 0 0   100%
webapp/publisher/views.py get_package   3 0 0   100%
webapp/publisher/views.py update_package   21 4 0   81%
webapp/publisher/views.py list_page   21 2 0   90%
webapp/publisher/views.py solutions_page   4 0 0   100%
webapp/publisher/views.py accept_invite   1 0 0   100%
webapp/publisher/views.py accept_post_invite   30 8 0   73%
webapp/publisher/views.py reject_post_invite   25 17 0   32%
webapp/publisher/views.py get_collaborators   12 0 0   100%
webapp/publisher/views.py get_pending_invites   12 5 0   58%
webapp/publisher/views.py invite_collaborators   24 12 0   50%
webapp/publisher/views.py revoke_invite   15 8 0   47%
webapp/publisher/views.py register_name   12 0 0   100%
webapp/publisher/views.py post_register_name   19 4 0   79%
webapp/publisher/views.py register_name_dispute   4 0 0   100%
webapp/publisher/views.py register_name_dispute_thank_you   4 0 0   100%
webapp/publisher/views.py delete_package   7 0 0   100%
webapp/publisher/views.py post_create_track   13 3 0   77%
webapp/publisher/views.py get_releases   17 5 0   71%
webapp/publisher/views.py validate_solution_name   5 5 0   0%
webapp/publisher/views.py show_register_solution_form   4 4 0   0%
webapp/publisher/views.py submit_register_solution   16 16 0   0%
webapp/publisher/views.py edit_solution_form   15 7 0   53%
webapp/publisher/views.py cleanup_old_previews   4 4 0   0%
webapp/publisher/views.py submit_edit_solution   29 29 0   0%
webapp/publisher/views.py (no function)   126 0 0   100%
webapp/search/logic.py search_topics   43 43 0   0%
webapp/search/logic.py search_docs   10 10 0   0%
webapp/search/logic.py search_charms   7 7 0   0%
webapp/search/logic.py search_bundles   7 7 0   0%
webapp/search/logic.py (no function)   16 0 0   100%
webapp/search/views.py all_search   1 1 0   0%
webapp/search/views.py all_search_json   12 2 0   83%
webapp/search/views.py all_charms   15 1 0   93%
webapp/search/views.py all_docs   4 0 0   100%
webapp/search/views.py all_topics   14 1 0   93%
webapp/search/views.py validate_charm   11 11 0   0%
webapp/search/views.py (no function)   27 0 0   100%
webapp/solutions/auth.py login   8 8 0   0%
webapp/solutions/auth.py (no function)   8 0 0   100%
webapp/solutions/logic.py get_solution_categories   9 0 0   100%
webapp/solutions/logic.py map_category_slugs_to_display   4 0 0   100%
webapp/solutions/logic.py get_cached_token   4 1 0   75%
webapp/solutions/logic.py refresh_token   4 0 0   100%
webapp/solutions/logic.py make_authenticated_request   10 3 0   70%
webapp/solutions/logic.py get_solution_from_backend   18 0 0   100%
webapp/solutions/logic.py get_published_solution_by_name   7 7 0   0%
webapp/solutions/logic.py solution_name_exists   8 8 0   0%
webapp/solutions/logic.py get_publisher_solutions   8 0 0   100%
webapp/solutions/logic.py register_solution   15 15 0   0%
webapp/solutions/logic.py update_solution   17 17 0   0%
webapp/solutions/logic.py get_user_teams_for_solutions   9 9 0   0%
webapp/solutions/logic.py group_solution_drafts   9 0 0   100%
webapp/solutions/logic.py (no function)   24 0 0   100%
webapp/solutions/views.py get_charm_data   11 11 0   0%
webapp/solutions/views.py render_solution   29 29 0   0%
webapp/solutions/views.py render_solution.fetch   1 1 0   0%
webapp/solutions/views.py solution_preview   5 5 0   0%
webapp/solutions/views.py solution_preview_draft   21 21 0   0%
webapp/solutions/views.py solution_details   10 10 0   0%
webapp/solutions/views.py (no function)   20 0 0   100%
webapp/store/__init__.py (no function)   0 0 0   100%
webapp/store/logic.py get_summary   4 1 0   75%
webapp/store/logic.py get_description   4 1 0   75%
webapp/store/logic.py get_banner_url   4 0 0   100%
webapp/store/logic.py get_channel_map   7 7 0   0%
webapp/store/logic.py convert_channel_maps   34 5 0   85%
webapp/store/logic.py process_revision   7 0 0   100%
webapp/store/logic.py extract_resources   5 0 0   100%
webapp/store/logic.py extract_default_release_architectures   9 2 0   78%
webapp/store/logic.py extract_all_arch   19 0 0   100%
webapp/store/logic.py extract_series   7 0 0   100%
webapp/store/logic.py extract_bases   17 1 0   94%
webapp/store/logic.py convert_date   5 1 0   80%
webapp/store/logic.py get_icons   2 0 0   100%
webapp/store/logic.py get_docs_topic_id   10 5 0   50%
webapp/store/logic.py convert_categories   6 0 0   100%
webapp/store/logic.py add_store_front_data   36 7 0   81%
webapp/store/logic.py get_bundle_charms   9 9 0   0%
webapp/store/logic.py process_python_docs   4 4 0   0%
webapp/store/logic.py process_libraries   5 0 0   100%
webapp/store/logic.py get_library   4 0 0   100%
webapp/store/logic.py format_slug   1 0 0   100%
webapp/store/logic.py add_overlay_data   3 0 0   100%
webapp/store/logic.py get_doc_link   2 0 0   100%
webapp/store/logic.py get_revisions   2 0 0   100%
webapp/store/logic.py (no function)   63 0 0   100%
webapp/store/views.py get_libraries   7 0 0   100%
webapp/store/views.py get_package_details   7 0 0   100%
webapp/store/views.py get_publisher_details   12 0 0   100%
webapp/store/views.py get_packages   30 0 0   100%
webapp/store/views.py get_package   16 4 0   75%
webapp/store/views.py package_has_sboms   8 0 0   100%
webapp/store/views.py get_sbom   4 4 0   0%
webapp/store/views.py details_overview   60 28 0   53%
webapp/store/views.py details_docs   33 33 0   0%
webapp/store/views.py details_configuration   17 17 0   0%
webapp/store/views.py details_actions   4 4 0   0%
webapp/store/views.py details_libraries   7 7 0   0%
webapp/store/views.py details_library   12 12 0   0%
webapp/store/views.py details_library_source_code   9 9 0   0%
webapp/store/views.py download_library   10 10 0   0%
webapp/store/views.py details_integrations   4 4 0   0%
webapp/store/views.py details_integrations_data   8 8 0   0%
webapp/store/views.py add_required_fields   2 2 0   0%
webapp/store/views.py details_resources   6 6 0   0%
webapp/store/views.py details_resource   25 25 0   0%
webapp/store/views.py details_integrate   3 3 0   0%
webapp/store/views.py entity_badge   26 26 0   0%
webapp/store/views.py entity_embedded_card   12 12 0   0%
webapp/store/views.py entity_embedded_interface_card   9 9 0   0%
webapp/store/views.py entity_icon   9 9 0   0%
webapp/store/views.py entity_icon_missing   9 9 0   0%
webapp/store/views.py get_charms_from_bundle   4 4 0   0%
webapp/store/views.py store_index   2 0 0   100%
webapp/store/views.py (no function)   129 0 0   100%
webapp/store_api.py decorate_all_methods   9 0 0   100%
webapp/store_api.py (no function)   11 0 0   100%
webapp/topics/__init__.py (no function)   0 0 0   100%
webapp/topics/views.py TopicParser.parse_topic   5 5 0   0%
webapp/topics/views.py TopicParser._parse_packages   19 19 0   0%
webapp/topics/views.py TopicParser._replace_packages   4 4 0   0%
webapp/topics/views.py topics_json   18 18 0   0%
webapp/topics/views.py all_topics   4 4 0   0%
webapp/topics/views.py topic_page   24 24 0   0%
webapp/topics/views.py (no function)   35 0 0   100%
webapp/utils/emailer.py Emailer.__init__   5 0 0   100%
webapp/utils/emailer.py Emailer._validate_config   3 1 0   67%
webapp/utils/emailer.py Emailer._create_message   10 0 0   100%
webapp/utils/emailer.py Emailer._send   15 2 0   87%
webapp/utils/emailer.py Emailer.send_email   1 0 0   100%
webapp/utils/emailer.py Emailer.send_email_template   2 0 0   100%
webapp/utils/emailer.py get_emailer   2 0 0   100%
webapp/utils/emailer.py (no function)   22 0 0   100%
Total     4008 1190 0   70%

No items found using the specified filter.