Coverage report: 47%

Files Functions Classes

coverage.py v7.13.1, created at 2026-01-11 00:40 +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 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   14 14 0   0%
apps / ai / api.py create_remix_endpoint   18 18 0   0%
apps / ai / api.py scale_recipe_endpoint   24 24 0   0%
apps / ai / api.py tips_endpoint   16 16 0   0%
apps / ai / api.py timer_name_endpoint   11 11 0   0%
apps / ai / api.py discover_endpoint   7 7 0   0%
apps / ai / api.py repair_selector_endpoint   14 14 0   0%
apps / ai / api.py sources_needing_attention_endpoint   2 2 0   0%
apps / ai / api.py (no function)   160 0 0   100%
apps / ai / migrations / 0001_initial.py (no function)   5 0 0   100%
apps / ai / migrations / 0002_seed_prompts.py seed_prompts   4 0 0   100%
apps / ai / migrations / 0002_seed_prompts.py remove_prompts   2 2 0   0%
apps / ai / migrations / 0002_seed_prompts.py (no function)   6 0 0   100%
apps / ai / migrations / 0003_nutrition_estimate_prompt.py add_nutrition_prompt   2 0 0   100%
apps / ai / migrations / 0003_nutrition_estimate_prompt.py remove_nutrition_prompt   2 2 0   0%
apps / ai / migrations / 0003_nutrition_estimate_prompt.py (no function)   6 0 0   100%
apps / ai / migrations / 0004_update_serving_adjustment_prompt.py update_prompt   8 2 0   75%
apps / ai / migrations / 0004_update_serving_adjustment_prompt.py revert_prompt   8 8 0   0%
apps / ai / migrations / 0004_update_serving_adjustment_prompt.py (no function)   6 0 0   100%
apps / ai / migrations / 0005_update_serving_adjustment_v2.py update_prompt   8 2 0   75%
apps / ai / migrations / 0005_update_serving_adjustment_v2.py revert_prompt   8 8 0   0%
apps / ai / migrations / 0005_update_serving_adjustment_v2.py (no function)   6 0 0   100%
apps / ai / migrations / 0006_add_ai_discovery_suggestion.py (no function)   5 0 0   100%
apps / ai / migrations / 0007_update_search_ranking_prompt.py update_search_ranking_prompt   7 2 0   71%
apps / ai / migrations / 0007_update_search_ranking_prompt.py reverse_update   7 7 0   0%
apps / ai / migrations / 0007_update_search_ranking_prompt.py (no function)   6 0 0   100%
apps / ai / migrations / 0008_update_serving_adjustment_indivisible.py update_prompt   7 2 0   71%
apps / ai / migrations / 0008_update_serving_adjustment_indivisible.py revert_prompt   7 7 0   0%
apps / ai / migrations / 0008_update_serving_adjustment_indivisible.py (no function)   6 0 0   100%
apps / ai / migrations / 0009_fix_discover_prompts.py update_discover_prompts   9 2 0   78%
apps / ai / migrations / 0009_fix_discover_prompts.py reverse_update   9 9 0   0%
apps / ai / migrations / 0009_fix_discover_prompts.py (no function)   9 0 3   100%
apps / ai / migrations / __init__.py (no function)   0 0 0   100%
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 / 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 6 0   0%
apps / ai / services / openrouter.py OpenRouterService.complete   32 32 0   0%
apps / ai / services / openrouter.py OpenRouterService.complete_async   32 32 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)   28 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)   15 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)   6 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   7 7 0   0%
apps / ai / services / validator.py AIResponseValidator._validate_value   61 61 0   0%
apps / ai / services / validator.py AIResponseValidator.get_schema   1 1 0   0%
apps / ai / services / validator.py (no function)   8 0 0   100%
apps / ai / tests.py AIPromptModelTests.test_prompts_seeded   1 1 0   0%
apps / ai / tests.py AIPromptModelTests.test_all_prompt_types_exist   3 3 0   0%
apps / ai / tests.py AIPromptModelTests.test_get_prompt   2 2 0   0%
apps / ai / tests.py AIPromptModelTests.test_get_prompt_not_found   2 2 0   0%
apps / ai / tests.py AIPromptModelTests.test_format_user_prompt   4 4 0   0%
apps / ai / tests.py AIResponseValidatorTests.setUp   1 1 0   0%
apps / ai / tests.py AIResponseValidatorTests.test_validate_recipe_remix_valid   3 3 0   0%
apps / ai / tests.py AIResponseValidatorTests.test_validate_recipe_remix_missing_field   4 4 0   0%
apps / ai / tests.py AIResponseValidatorTests.test_validate_tips_generation_valid   3 3 0   0%
apps / ai / tests.py AIResponseValidatorTests.test_validate_tips_generation_too_few   4 4 0   0%
apps / ai / tests.py AIResponseValidatorTests.test_validate_remix_suggestions_valid   3 3 0   0%
apps / ai / tests.py AIResponseValidatorTests.test_validate_remix_suggestions_wrong_count   3 3 0   0%
apps / ai / tests.py AIResponseValidatorTests.test_validate_timer_naming_valid   3 3 0   0%
apps / ai / tests.py AIResponseValidatorTests.test_validate_search_ranking_valid   3 3 0   0%
apps / ai / tests.py AIResponseValidatorTests.test_validate_selector_repair_valid   3 3 0   0%
apps / ai / tests.py AIResponseValidatorTests.test_validate_unknown_prompt_type   3 3 0   0%
apps / ai / tests.py AIResponseValidatorTests.test_validate_wrong_type   2 2 0   0%
apps / ai / tests.py AIAPITests.test_ai_status_endpoint   9 9 0   0%
apps / ai / tests.py AIAPITests.test_ai_status_no_api_key   12 12 0   0%
apps / ai / tests.py AIAPITests.test_ai_status_invalid_api_key   12 12 0   0%
apps / ai / tests.py AIAPITests.test_ai_status_valid_api_key   13 13 0   0%
apps / ai / tests.py AIAPITests.test_models_endpoint_no_api_key   4 4 0   0%
apps / ai / tests.py AIAPITests.test_models_endpoint_with_api_key   8 8 0   0%
apps / ai / tests.py AIAPITests.test_prompts_endpoint   4 4 0   0%
apps / ai / tests.py AIAPITests.test_get_prompt_endpoint   5 5 0   0%
apps / ai / tests.py AIAPITests.test_get_prompt_not_found   2 2 0   0%
apps / ai / tests.py AIAPITests.test_update_prompt_endpoint   6 6 0   0%
apps / ai / tests.py AIAPITests.test_update_prompt_invalid_model   8 8 0   0%
apps / ai / tests.py AIAPITests.test_test_api_key_empty   2 2 0   0%
apps / ai / tests.py AIAPITests.test_save_api_key_invalidates_cache   5 5 0   0%
apps / ai / tests.py OpenRouterServiceTests.test_init_requires_api_key   6 6 0   0%
apps / ai / tests.py OpenRouterServiceTests.test_init_with_explicit_key   2 2 0   0%
apps / ai / tests.py OpenRouterServiceTests.test_is_available_without_key   4 4 0   0%
apps / ai / tests.py OpenRouterServiceTests.test_is_available_with_key   4 4 0   0%
apps / ai / tests.py OpenRouterServiceTests.test_validate_key_cached_caches_result   10 10 0   0%
apps / ai / tests.py OpenRouterServiceTests.test_validate_key_cached_caches_invalid_result   9 9 0   0%
apps / ai / tests.py OpenRouterServiceTests.test_validate_key_cached_no_key   4 4 0   0%
apps / ai / tests.py OpenRouterServiceTests.test_invalidate_key_cache   4 4 0   0%
apps / ai / tests.py OpenRouterServiceTests.test_complete_success   10 10 0   0%
apps / ai / tests.py OpenRouterServiceTests.test_complete_handles_code_block_json   9 9 0   0%
apps / ai / tests.py OpenRouterServiceTests.test_complete_invalid_json   10 10 0   0%
apps / ai / tests.py OpenRouterServiceTests.test_complete_no_choices   10 10 0   0%
apps / ai / tests.py OpenRouterServiceTests.test_complete_raw_text_response   9 9 0   0%
apps / ai / tests.py OpenRouterServiceTests.test_test_connection_success   9 9 0   0%
apps / ai / tests.py OpenRouterServiceTests.test_test_connection_no_key   3 3 0   0%
apps / ai / tests.py OpenRouterServiceTests.test_get_available_models_success   17 17 0   0%
apps / ai / tests.py OpenRouterServiceAsyncTests.test_complete_async_success   10 10 0   0%
apps / ai / tests.py TimerNamingServiceTests.test_generate_timer_name_success   7 7 0   0%
apps / ai / tests.py TimerNamingServiceTests.test_generate_timer_name_truncates_long_labels   7 7 0   0%
apps / ai / tests.py TimerNamingServiceTests.test_generate_timer_name_formats_duration   8 8 0   0%
apps / ai / tests.py TimerNamingAPITests.test_timer_name_endpoint_success   5 5 0   0%
apps / ai / tests.py TimerNamingAPITests.test_timer_name_endpoint_missing_step_text   4 4 0   0%
apps / ai / tests.py TimerNamingAPITests.test_timer_name_endpoint_invalid_duration   4 4 0   0%
apps / ai / tests.py TimerNamingAPITests.test_timer_name_endpoint_ai_unavailable   5 5 0   0%
apps / ai / tests.py SelectorRepairServiceTests.setUp   2 2 0   0%
apps / ai / tests.py SelectorRepairServiceTests.test_repair_selector_success   13 13 0   0%
apps / ai / tests.py SelectorRepairServiceTests.test_repair_selector_low_confidence_no_update   11 11 0   0%
apps / ai / tests.py SelectorRepairServiceTests.test_repair_selector_auto_update_disabled   10 10 0   0%
apps / ai / tests.py SelectorRepairServiceTests.test_repair_selector_truncates_html   9 9 0   0%
apps / ai / tests.py SelectorRepairServiceTests.test_get_sources_needing_attention   11 11 0   0%
apps / ai / tests.py SelectorRepairAPITests.setUp   2 2 0   0%
apps / ai / tests.py SelectorRepairAPITests.test_repair_selector_endpoint_success   8 8 0   0%
apps / ai / tests.py SelectorRepairAPITests.test_repair_selector_endpoint_source_not_found   4 4 0   0%
apps / ai / tests.py SelectorRepairAPITests.test_repair_selector_endpoint_empty_html   4 4 0   0%
apps / ai / tests.py SelectorRepairAPITests.test_repair_selector_endpoint_ai_unavailable   5 5 0   0%
apps / ai / tests.py SelectorRepairAPITests.test_repair_selector_endpoint_with_options   8 8 0   0%
apps / ai / tests.py SelectorRepairAPITests.test_sources_needing_attention_endpoint   9 9 0   0%
apps / ai / tests.py SelectorRepairAPITests.test_sources_needing_attention_endpoint_empty   8 8 0   0%
apps / ai / tests.py AIFeatureFallbackTests.setUp   7 7 0   0%
apps / ai / tests.py AIFeatureFallbackTests.test_ai_status_shows_unavailable_without_key   9 9 0   0%
apps / ai / tests.py AIFeatureFallbackTests.test_ai_status_shows_available_with_key   11 11 0   0%
apps / ai / tests.py AIFeatureFallbackTests.test_tips_returns_503_with_action_field_when_ai_unavailable   7 7 0   0%
apps / ai / tests.py AIFeatureFallbackTests.test_remix_suggestions_returns_503_when_ai_unavailable   5 5 0   0%
apps / ai / tests.py AIFeatureFallbackTests.test_scale_returns_503_when_ai_unavailable   5 5 0   0%
apps / ai / tests.py AIFeatureFallbackTests.test_discover_returns_503_when_ai_unavailable   5 5 0   0%
apps / ai / tests.py AIFeatureFallbackTests.test_tips_service_raises_when_no_key   4 4 0   0%
apps / ai / tests.py AIFeatureFallbackTests.test_remix_service_raises_when_no_key   4 4 0   0%
apps / ai / tests.py AIFeatureFallbackTests.test_models_endpoint_returns_empty_list_without_key   7 7 0   0%
apps / ai / tests.py AIFeatureFallbackTests.test_timer_name_returns_503_when_ai_unavailable   5 5 0   0%
apps / ai / tests.py AIResponseErrorTests.setUp   7 7 0   0%
apps / ai / tests.py AIResponseErrorTests.test_tips_returns_400_on_ai_error   5 5 0   0%
apps / ai / tests.py AIResponseErrorTests.test_tips_returns_400_on_validation_error   5 5 0   0%
apps / ai / tests.py AIResponseErrorTests.test_remix_returns_400_on_ai_error   5 5 0   0%
apps / ai / tests.py AIResponseErrorTests.test_repair_selector_returns_400_on_validation_error   7 7 0   0%
apps / ai / tests.py (no function)   142 142 0   0%
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 / 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 / migrations / 0001_initial.py (no function)   5 0 0   100%
apps / core / migrations / __init__.py (no function)   0 0 0   100%
apps / core / models.py AppSettings.save   2 0 0   100%
apps / core / models.py AppSettings.get   2 0 0   100%
apps / core / models.py (no function)   10 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 _is_ai_available   5 2 0   60%
apps / legacy / views.py profile_selector   2 0 0   100%
apps / legacy / views.py home   17 0 0   100%
apps / legacy / views.py search   11 3 0   73%
apps / legacy / views.py recipe_detail   18 4 0   78%
apps / legacy / views.py play_mode   14 3 0   79%
apps / legacy / views.py all_recipes   11 11 0   0%
apps / legacy / views.py favorites   10 3 0   70%
apps / legacy / views.py collections   10 3 0   70%
apps / legacy / views.py collection_detail   12 3 0   75%
apps / legacy / views.py settings   17 17 0   0%
apps / legacy / views.py (no function)   17 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 / migrations / 0001_initial.py (no function)   5 0 0   100%
apps / profiles / migrations / __init__.py (no function)   0 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 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   5 0 0   100%
apps / recipes / api.py delete_recipe   6 1 0   83%
apps / recipes / api.py (no function)   99 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 / migrations / 0001_initial.py (no function)   6 0 0   100%
apps / recipes / migrations / 0002_populate_search_sources.py populate_search_sources   3 0 0   100%
apps / recipes / migrations / 0002_populate_search_sources.py remove_search_sources   3 3 0   0%
apps / recipes / migrations / 0002_populate_search_sources.py (no function)   7 0 0   100%
apps / recipes / migrations / 0003_recipecollection_recipecollectionitem_recipefavorite_and_more.py (no function)   5 0 0   100%
apps / recipes / migrations / 0004_cachedsearchimage.py (no function)   4 0 0   100%
apps / recipes / migrations / 0005_serving_adjustment.py (no function)   5 0 0   100%
apps / recipes / migrations / 0006_serving_adjustment_instructions_times.py (no function)   4 0 0   100%
apps / recipes / migrations / 0007_recipe_profile.py delete_all_recipes   2 0 0   100%
apps / recipes / migrations / 0007_recipe_profile.py noop   1 1 0   0%
apps / recipes / migrations / 0007_recipe_profile.py (no function)   7 0 0   100%
apps / recipes / migrations / 0008_rename_recipes_rec_profile_idx_recipes_rec_profile_7945b8_idx.py (no function)   4 0 0   100%
apps / recipes / migrations / 0009_add_default_selectors.py add_selectors   3 0 0   100%
apps / recipes / migrations / 0009_add_default_selectors.py remove_selectors   3 3 0   0%
apps / recipes / migrations / 0009_add_default_selectors.py (no function)   7 0 0   100%
apps / recipes / migrations / __init__.py (no function)   0 0 0   100%
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)   118 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 5 0   83%
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._extract_result_from_element   43 8 0   81%
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)   34 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 / tests.py BaseTestCase.setUp   7 7 0   0%
apps / recipes / tests.py CollectionTests.test_list_collections_empty   3 3 0   0%
apps / recipes / tests.py CollectionTests.test_create_collection   6 6 0   0%
apps / recipes / tests.py CollectionTests.test_create_collection_duplicate_name   3 3 0   0%
apps / recipes / tests.py CollectionTests.test_list_collections   6 6 0   0%
apps / recipes / tests.py CollectionTests.test_get_collection   8 8 0   0%
apps / recipes / tests.py CollectionTests.test_get_collection_not_found   2 2 0   0%
apps / recipes / tests.py CollectionTests.test_update_collection   6 6 0   0%
apps / recipes / tests.py CollectionTests.test_delete_collection   4 4 0   0%
apps / recipes / tests.py CollectionTests.test_add_recipe_to_collection   6 6 0   0%
apps / recipes / tests.py CollectionTests.test_add_recipe_to_collection_increments_order   6 6 0   0%
apps / recipes / tests.py CollectionTests.test_add_duplicate_recipe_to_collection   4 4 0   0%
apps / recipes / tests.py CollectionTests.test_remove_recipe_from_collection   5 5 0   0%
apps / recipes / tests.py CollectionTests.test_collection_isolation_between_profiles   7 7 0   0%
apps / recipes / tests.py FavoriteTests.test_list_favorites_empty   3 3 0   0%
apps / recipes / tests.py FavoriteTests.test_add_favorite   4 4 0   0%
apps / recipes / tests.py FavoriteTests.test_add_duplicate_favorite   3 3 0   0%
apps / recipes / tests.py FavoriteTests.test_list_favorites   6 6 0   0%
apps / recipes / tests.py FavoriteTests.test_remove_favorite   4 4 0   0%
apps / recipes / tests.py FavoriteTests.test_remove_favorite_not_found   2 2 0   0%
apps / recipes / tests.py FavoriteTests.test_favorites_isolation_between_profiles   5 5 0   0%
apps / recipes / tests.py HistoryTests.test_list_history_empty   3 3 0   0%
apps / recipes / tests.py HistoryTests.test_record_view   4 4 0   0%
apps / recipes / tests.py HistoryTests.test_record_view_updates_timestamp   4 4 0   0%
apps / recipes / tests.py HistoryTests.test_list_history   6 6 0   0%
apps / recipes / tests.py HistoryTests.test_list_history_with_limit   6 6 0   0%
apps / recipes / tests.py HistoryTests.test_clear_history   5 5 0   0%
apps / recipes / tests.py HistoryTests.test_history_isolation_between_profiles   5 5 0   0%
apps / recipes / tests.py NoProfileTests.setUp   3 3 0   0%
apps / recipes / tests.py NoProfileTests.test_favorites_requires_profile   2 2 0   0%
apps / recipes / tests.py NoProfileTests.test_collections_requires_profile   2 2 0   0%
apps / recipes / tests.py NoProfileTests.test_history_requires_profile   2 2 0   0%
apps / recipes / tests.py QuantityTidyingTests.test_decimal_to_fraction_half   2 2 0   0%
apps / recipes / tests.py QuantityTidyingTests.test_decimal_to_fraction_quarter   2 2 0   0%
apps / recipes / tests.py QuantityTidyingTests.test_decimal_to_fraction_third   3 3 0   0%
apps / recipes / tests.py QuantityTidyingTests.test_decimal_to_fraction_two_thirds   3 3 0   0%
apps / recipes / tests.py QuantityTidyingTests.test_decimal_to_fraction_three_quarters   2 2 0   0%
apps / recipes / tests.py QuantityTidyingTests.test_decimal_to_fraction_mixed_number   4 4 0   0%
apps / recipes / tests.py QuantityTidyingTests.test_decimal_to_fraction_whole_number   3 3 0   0%
apps / recipes / tests.py QuantityTidyingTests.test_tidy_ingredient_cups   4 4 0   0%
apps / recipes / tests.py QuantityTidyingTests.test_tidy_ingredient_tablespoons   3 3 0   0%
apps / recipes / tests.py QuantityTidyingTests.test_tidy_ingredient_teaspoons   3 3 0   0%
apps / recipes / tests.py QuantityTidyingTests.test_tidy_ingredient_keeps_grams   3 3 0   0%
apps / recipes / tests.py QuantityTidyingTests.test_tidy_ingredient_keeps_ml   3 3 0   0%
apps / recipes / tests.py QuantityTidyingTests.test_tidy_ingredient_countable_items   3 3 0   0%
apps / recipes / tests.py QuantityTidyingTests.test_tidy_ingredient_no_unit   3 3 0   0%
apps / recipes / tests.py QuantityTidyingTests.test_tidy_quantities_list   7 7 0   0%
apps / recipes / tests.py QuantityTidyingTests.test_tidy_ingredient_empty_string   2 2 0   0%
apps / recipes / tests.py QuantityTidyingTests.test_tidy_ingredient_no_number   3 3 0   0%
apps / recipes / tests.py (no function)   59 59 0   0%
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)   32 0 0   100%
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     3954 2095 3   47%

No items found using the specified filter.

← Back to Dashboard