| 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% |