Coverage report: 62%

Files Functions Classes

coverage.py v7.13.4, created at 2026-02-14 19:13 +0000

File function   statements missing excluded   coverage
apps / __init__.py (no function)   0 0 0   100%
apps / ai / __init__.py (no function)   0 0 0   100%
apps / ai / api.py handle_ai_errors   3 0 0   100%
apps / ai / api.py handle_ai_errors.wrapper   6 6 0   0%
apps / ai / api.py get_ai_status   14 14 0   0%
apps / ai / api.py test_api_key   4 4 0   0%
apps / ai / api.py save_api_key   5 5 0   0%
apps / ai / api.py list_prompts   2 2 0   0%
apps / ai / api.py get_prompt   5 5 0   0%
apps / ai / api.py update_prompt   25 25 0   0%
apps / ai / api.py list_models   7 7 0   0%
apps / ai / api.py remix_suggestions   10 10 0   0%
apps / ai / api.py create_remix_endpoint   14 14 0   0%
apps / ai / api.py scale_recipe_endpoint   20 20 0   0%
apps / ai / api.py tips_endpoint   12 12 0   0%
apps / ai / api.py timer_name_endpoint   6 6 0   0%
apps / ai / api.py discover_endpoint   5 5 0   0%
apps / ai / api.py repair_selector_endpoint   9 9 0   0%
apps / ai / api.py sources_needing_attention_endpoint   2 2 0   0%
apps / ai / api.py (no function)   169 0 0   100%
apps / ai / fixtures.py get_fixture   4 4 0   0%
apps / ai / fixtures.py (no function)   45 45 0   0%
apps / ai / models.py AIDiscoverySuggestion.__str__   1 1 0   0%
apps / ai / models.py AIPrompt.__str__   1 1 0   0%
apps / ai / models.py AIPrompt.format_user_prompt   1 1 0   0%
apps / ai / models.py AIPrompt.get_prompt   1 1 0   0%
apps / ai / models.py (no function)   35 0 0   100%
apps / ai / services / __init__.py (no function)   0 0 0   100%
apps / ai / services / cache.py _make_cache_key   4 4 0   0%
apps / ai / services / cache.py cache_ai_response   3 0 0   100%
apps / ai / services / cache.py cache_ai_response.decorator   2 0 0   100%
apps / ai / services / cache.py cache_ai_response.decorator.wrapper   15 15 0   0%
apps / ai / services / cache.py invalidate_ai_cache   2 2 0   0%
apps / ai / services / cache.py (no function)   12 0 0   100%
apps / ai / services / discover.py get_discover_suggestions   19 19 0   0%
apps / ai / services / discover.py _format_suggestions   8 8 0   0%
apps / ai / services / discover.py _generate_seasonal_suggestions   23 23 0   0%
apps / ai / services / discover.py _generate_recommended_suggestions   24 24 0   0%
apps / ai / services / discover.py _generate_new_suggestions   24 24 0   0%
apps / ai / services / discover.py _get_season   8 8 0   0%
apps / ai / services / discover.py (no function)   17 0 0   100%
apps / ai / services / openrouter.py OpenRouterService.__init__   6 1 0   83%
apps / ai / services / openrouter.py OpenRouterService._parse_json_response   16 16 0   0%
apps / ai / services / openrouter.py OpenRouterService.complete   17 17 0   0%
apps / ai / services / openrouter.py OpenRouterService.complete_async   17 17 0   0%
apps / ai / services / openrouter.py OpenRouterService.is_available   2 2 0   0%
apps / ai / services / openrouter.py OpenRouterService.get_available_models   12 12 0   0%
apps / ai / services / openrouter.py OpenRouterService.test_connection   10 10 0   0%
apps / ai / services / openrouter.py OpenRouterService.validate_key_cached   18 18 0   0%
apps / ai / services / openrouter.py OpenRouterService.invalidate_key_cache   1 1 0   0%
apps / ai / services / openrouter.py (no function)   29 0 0   100%
apps / ai / services / ranking.py is_ranking_available   5 5 0   0%
apps / ai / services / ranking.py _filter_valid   1 0 0   100%
apps / ai / services / ranking.py _sort_by_image   2 2 0   0%
apps / ai / services / ranking.py rank_results   32 29 0   9%
apps / ai / services / ranking.py _apply_ranking   12 12 0   0%
apps / ai / services / ranking.py (no function)   12 0 0   100%
apps / ai / services / remix.py get_remix_suggestions   9 9 0   0%
apps / ai / services / remix.py create_remix   29 29 0   0%
apps / ai / services / remix.py estimate_nutrition   15 15 0   0%
apps / ai / services / remix.py _parse_time   13 13 0   0%
apps / ai / services / remix.py _parse_servings   7 7 0   0%
apps / ai / services / remix.py _generate_tips_background   13 13 0   0%
apps / ai / services / remix.py (no function)   17 0 0   100%
apps / ai / services / scaling.py _parse_time   12 12 0   0%
apps / ai / services / scaling.py _format_time   9 9 0   0%
apps / ai / services / scaling.py scale_recipe   33 33 0   0%
apps / ai / services / scaling.py calculate_nutrition   20 20 0   0%
apps / ai / services / scaling.py (no function)   13 0 0   100%
apps / ai / services / selector.py repair_selector   21 21 0   0%
apps / ai / services / selector.py get_sources_needing_attention   1 1 0   0%
apps / ai / services / selector.py repair_all_broken_selectors   21 21 0   0%
apps / ai / services / selector.py (no function)   11 0 0   100%
apps / ai / services / timer.py generate_timer_name   18 18 0   0%
apps / ai / services / timer.py (no function)   8 0 0   100%
apps / ai / services / tips.py generate_tips   18 18 0   0%
apps / ai / services / tips.py clear_tips   7 7 0   0%
apps / ai / services / tips.py (no function)   8 0 0   100%
apps / ai / services / validator.py ValidationError.__init__   2 2 0   0%
apps / ai / services / validator.py AIResponseValidator.validate   9 9 0   0%
apps / ai / services / validator.py AIResponseValidator._format_error   21 21 0   0%
apps / ai / services / validator.py AIResponseValidator.get_schema   1 1 0   0%
apps / ai / services / validator.py (no function)   9 0 0   100%
apps / core / __init__.py (no function)   0 0 0   100%
apps / core / api.py health_check   7 2 0   71%
apps / core / api.py get_reset_preview   1 0 0   100%
apps / core / api.py reset_database   35 6 0   83%
apps / core / api.py (no function)   44 0 0   100%
apps / core / apps.py (no function)   4 0 0   100%
apps / core / encryption.py _get_encryption_key   3 3 0   0%
apps / core / encryption.py encrypt_value   8 8 0   0%
apps / core / encryption.py decrypt_value   14 12 0   14%
apps / core / encryption.py is_encrypted   1 1 0   0%
apps / core / encryption.py (no function)   14 4 0   71%
apps / core / middleware.py DeviceDetectionMiddleware.__init__   1 0 0   100%
apps / core / middleware.py DeviceDetectionMiddleware.__call__   2 0 0   100%
apps / core / middleware.py DeviceDetectionMiddleware._is_legacy_device   18 0 0   100%
apps / core / middleware.py (no function)   8 0 0   100%
apps / core / models.py AppSettings.save   4 1 0   75%
apps / core / models.py AppSettings.get   2 0 0   100%
apps / core / models.py AppSettings.openrouter_api_key   1 0 0   100%
apps / core / models.py AppSettings.openrouter_api_key   3 3 0   0%
apps / core / models.py (no function)   15 0 0   100%
apps / legacy / __init__.py (no function)   0 0 0   100%
apps / legacy / apps.py (no function)   4 0 0   100%
apps / legacy / templatetags / __init__.py (no function)   0 0 0   100%
apps / legacy / templatetags / legacy_tags.py format_time   10 6 0   40%
apps / legacy / templatetags / legacy_tags.py in_list   1 0 0   100%
apps / legacy / templatetags / legacy_tags.py format_nutrition_key   7 2 0   71%
apps / legacy / templatetags / legacy_tags.py (no function)   9 0 0   100%
apps / legacy / urls.py (no function)   4 0 0   100%
apps / legacy / views.py require_profile   3 0 0   100%
apps / legacy / views.py require_profile.wrapper   9 0 0   100%
apps / legacy / views.py _is_ai_available   5 2 0   60%
apps / legacy / views.py profile_selector   2 0 0   100%
apps / legacy / views.py home   10 0 0   100%
apps / legacy / views.py search   4 0 0   100%
apps / legacy / views.py recipe_detail   22 2 0   91%
apps / legacy / views.py play_mode   7 0 0   100%
apps / legacy / views.py all_recipes   4 0 0   100%
apps / legacy / views.py favorites   3 0 0   100%
apps / legacy / views.py collections   3 0 0   100%
apps / legacy / views.py collection_detail   5 0 0   100%
apps / legacy / views.py settings   10 1 0   90%
apps / legacy / views.py (no function)   28 0 0   100%
apps / profiles / __init__.py (no function)   0 0 0   100%
apps / profiles / api.py list_profiles   7 2 0   71%
apps / profiles / api.py create_profile   2 0 0   100%
apps / profiles / api.py get_profile   1 0 0   100%
apps / profiles / api.py update_profile   5 0 0   100%
apps / profiles / api.py get_deletion_preview   15 15 0   0%
apps / profiles / api.py delete_profile   18 9 0   50%
apps / profiles / api.py select_profile   3 0 0   100%
apps / profiles / api.py (no function)   70 0 0   100%
apps / profiles / apps.py (no function)   4 0 0   100%
apps / profiles / models.py Profile.__str__   1 1 0   0%
apps / profiles / models.py (no function)   11 0 0   100%
apps / profiles / utils.py get_current_profile   7 2 0   71%
apps / profiles / utils.py get_current_profile_or_none   7 2 0   71%
apps / profiles / utils.py aget_current_profile_or_none   3 0 0   100%
apps / profiles / utils.py aget_current_profile_or_none._get_profile   7 4 0   43%
apps / profiles / utils.py (no function)   6 0 0   100%
apps / recipes / __init__.py (no function)   0 0 0   100%
apps / recipes / api.py RecipeOut.resolve_image   3 1 0   67%
apps / recipes / api.py RecipeOut.resolve_scraped_at   1 0 0   100%
apps / recipes / api.py RecipeOut.resolve_updated_at   1 0 0   100%
apps / recipes / api.py RecipeOut.resolve_remixed_from_id   1 0 0   100%
apps / recipes / api.py RecipeOut.resolve_linked_recipes   1 0 0   100%
apps / recipes / api.py RecipeListOut.resolve_image   3 1 0   67%
apps / recipes / api.py RecipeListOut.resolve_scraped_at   1 0 0   100%
apps / recipes / api.py list_recipes   9 0 0   100%
apps / recipes / api.py scrape_recipe   15 0 0   100%
apps / recipes / api.py search_recipes   19 0 0   100%
apps / recipes / api.py search_recipes.cache_in_background   9 4 0   56%
apps / recipes / api.py cache_health   6 6 0   0%
apps / recipes / api.py get_recipe   17 7 0   59%
apps / recipes / api.py delete_recipe   6 1 0   83%
apps / recipes / api.py (no function)   109 0 0   100%
apps / recipes / api_user.py FavoriteOut.resolve_created_at   1 0 0   100%
apps / recipes / api_user.py list_favorites   2 0 0   100%
apps / recipes / api_user.py add_favorite   7 0 0   100%
apps / recipes / api_user.py remove_favorite   4 0 0   100%
apps / recipes / api_user.py CollectionItemOut.resolve_added_at   1 0 0   100%
apps / recipes / api_user.py CollectionOut.resolve_recipe_count   1 0 0   100%
apps / recipes / api_user.py CollectionOut.resolve_created_at   1 0 0   100%
apps / recipes / api_user.py CollectionOut.resolve_updated_at   1 0 0   100%
apps / recipes / api_user.py CollectionDetailOut.resolve_recipes   1 0 0   100%
apps / recipes / api_user.py CollectionDetailOut.resolve_created_at   1 0 0   100%
apps / recipes / api_user.py CollectionDetailOut.resolve_updated_at   1 0 0   100%
apps / recipes / api_user.py list_collections   2 0 0   100%
apps / recipes / api_user.py create_collection   6 0 0   100%
apps / recipes / api_user.py get_collection   3 0 0   100%
apps / recipes / api_user.py update_collection   9 2 0   78%
apps / recipes / api_user.py delete_collection   4 0 0   100%
apps / recipes / api_user.py add_recipe_to_collection   10 0 0   100%
apps / recipes / api_user.py remove_recipe_from_collection   5 0 0   100%
apps / recipes / api_user.py HistoryOut.resolve_viewed_at   1 0 0   100%
apps / recipes / api_user.py list_history   2 0 0   100%
apps / recipes / api_user.py record_view   5 0 0   100%
apps / recipes / api_user.py clear_history   3 0 0   100%
apps / recipes / api_user.py (no function)   90 0 0   100%
apps / recipes / management / __init__.py (no function)   0 0 0   100%
apps / recipes / management / commands / __init__.py (no function)   0 0 0   100%
apps / recipes / management / commands / cleanup_search_images.py Command.add_arguments   2 2 0   0%
apps / recipes / management / commands / cleanup_search_images.py Command.handle   29 29 0   0%
apps / recipes / management / commands / cleanup_search_images.py (no function)   10 10 0   0%
apps / recipes / models.py Recipe.__str__   1 0 0   100%
apps / recipes / models.py SearchSource.__str__   1 0 0   100%
apps / recipes / models.py RecipeFavorite.__str__   1 1 0   0%
apps / recipes / models.py RecipeCollection.__str__   1 1 0   0%
apps / recipes / models.py RecipeCollectionItem.__str__   1 1 0   0%
apps / recipes / models.py RecipeViewHistory.__str__   1 1 0   0%
apps / recipes / models.py CachedSearchImage.__str__   1 0 0   100%
apps / recipes / models.py ServingAdjustment.__str__   1 1 0   0%
apps / recipes / models.py (no function)   119 0 0   100%
apps / recipes / services / __init__.py (no function)   2 0 0   100%
apps / recipes / services / fingerprint.py get_random_profile   2 2 0   0%
apps / recipes / services / fingerprint.py get_random_delay   1 0 0   100%
apps / recipes / services / fingerprint.py get_fallback_profiles   4 4 0   0%
apps / recipes / services / fingerprint.py (no function)   9 0 0   100%
apps / recipes / services / image_cache.py SearchImageCache.cache_images   6 0 0   100%
apps / recipes / services / image_cache.py SearchImageCache._download_and_save   30 12 0   60%
apps / recipes / services / image_cache.py SearchImageCache._fetch_image   14 0 0   100%
apps / recipes / services / image_cache.py SearchImageCache.get_cached_urls_batch   9 0 0   100%
apps / recipes / services / image_cache.py SearchImageCache._generate_filename   8 0 0   100%
apps / recipes / services / image_cache.py SearchImageCache._convert_to_jpeg   16 0 0   100%
apps / recipes / services / image_cache.py SearchImageCache._is_image_url   3 0 0   100%
apps / recipes / services / image_cache.py (no function)   22 0 0   100%
apps / recipes / services / scraper.py RecipeScraper.__init__   1 0 0   100%
apps / recipes / services / scraper.py RecipeScraper.scrape_url   26 6 0   77%
apps / recipes / services / scraper.py RecipeScraper._generate_tips_background   13 4 0   69%
apps / recipes / services / scraper.py RecipeScraper._fetch_html   12 1 0   92%
apps / recipes / services / scraper.py RecipeScraper._parse_recipe   10 0 0   100%
apps / recipes / services / scraper.py RecipeScraper._safe_get   8 0 0   100%
apps / recipes / services / scraper.py RecipeScraper._safe_get_ingredient_groups   7 2 0   71%
apps / recipes / services / scraper.py RecipeScraper._parse_time   9 0 0   100%
apps / recipes / services / scraper.py RecipeScraper._parse_servings   6 1 0   83%
apps / recipes / services / scraper.py RecipeScraper._parse_rating   6 0 0   100%
apps / recipes / services / scraper.py RecipeScraper._parse_rating_count   6 2 0   67%
apps / recipes / services / scraper.py RecipeScraper._download_image   16 1 0   94%
apps / recipes / services / scraper.py RecipeScraper._convert_webp_to_jpeg   17 12 0   29%
apps / recipes / services / scraper.py RecipeScraper._is_image_url   3 0 0   100%
apps / recipes / services / scraper.py RecipeScraper._generate_image_filename   2 0 0   100%
apps / recipes / services / scraper.py (no function)   39 0 0   100%
apps / recipes / services / search.py RecipeSearch.__init__   1 0 0   100%
apps / recipes / services / search.py RecipeSearch.search   35 0 0   100%
apps / recipes / services / search.py RecipeSearch._apply_ai_ranking   7 3 0   57%
apps / recipes / services / search.py RecipeSearch._search_source   10 1 0   90%
apps / recipes / services / search.py RecipeSearch._parse_search_results   12 0 0   100%
apps / recipes / services / search.py RecipeSearch._find_link   9 1 0   89%
apps / recipes / services / search.py RecipeSearch._extract_title   9 4 0   56%
apps / recipes / services / search.py RecipeSearch._extract_rating   10 2 0   80%
apps / recipes / services / search.py RecipeSearch._extract_image   7 1 0   86%
apps / recipes / services / search.py RecipeSearch._extract_description   4 0 0   100%
apps / recipes / services / search.py RecipeSearch._extract_result_from_element   14 3 0   79%
apps / recipes / services / search.py RecipeSearch._fallback_parse   22 9 0   59%
apps / recipes / services / search.py RecipeSearch._looks_like_recipe_url   20 7 0   65%
apps / recipes / services / search.py RecipeSearch._record_failure   4 0 0   100%
apps / recipes / services / search.py RecipeSearch._record_failure.update   4 0 0   100%
apps / recipes / services / search.py RecipeSearch._record_success   4 0 0   100%
apps / recipes / services / search.py RecipeSearch._record_success.update   4 0 0   100%
apps / recipes / services / search.py (no function)   39 0 0   100%
apps / recipes / sources_api.py SourceOut.resolve_last_validated_at   3 3 0   0%
apps / recipes / sources_api.py list_sources   2 2 0   0%
apps / recipes / sources_api.py enabled_count   3 3 0   0%
apps / recipes / sources_api.py get_source   5 5 0   0%
apps / recipes / sources_api.py toggle_source   7 7 0   0%
apps / recipes / sources_api.py bulk_toggle_sources   2 2 0   0%
apps / recipes / sources_api.py update_selector   7 7 0   0%
apps / recipes / sources_api.py test_source   28 28 0   0%
apps / recipes / sources_api.py test_all_sources   31 31 0   0%
apps / recipes / sources_api.py (no function)   57 0 0   100%
apps / recipes / utils.py decimal_to_fraction   29 29 0   0%
apps / recipes / utils.py tidy_ingredient   20 20 0   0%
apps / recipes / utils.py tidy_quantities   1 1 0   0%
apps / recipes / utils.py (no function)   8 0 0   100%
cookie / __init__.py (no function)   0 0 0   100%
cookie / settings.py get_secret_key   7 3 0   57%
cookie / settings.py (no function)   37 2 0   95%
cookie / urls.py health   1 0 0   100%
cookie / urls.py (no function)   20 0 0   100%
cookie / wsgi.py (no function)   4 4 0   0%
Total     2930 1128 0   62%

No items found using the specified filter.

← Back to Dashboard