Source code for fatsecret.resources.recipes

"""Recipes resource — recipe.get, recipes.search, recipe_types.get, recipe favorites."""

from __future__ import annotations

from typing import Any, Optional, Union

from ._base import BaseResource


class RecipesResource(BaseResource):
    """Resource methods for the OAS `Recipes` tag."""

    # ------------------------- Recipes: recipe.get -------------------------

[docs] def get_v1(self, recipe_id: str, region: Optional[str] = None) -> dict: """recipe.get v1 (DEPRECATED upstream).""" params = {"method": "recipe.get", "recipe_id": recipe_id} self._client._set_optional(params, [("region", region)]) payload = self._client._call(params) return self._client._unwrap(payload, "recipe")
[docs] def get_v2(self, recipe_id: str, region: Optional[str] = None) -> dict: """recipe.get v2 (current). Adds grams_per_portion.""" params = {"method": "recipe.get.v2", "recipe_id": recipe_id} self._client._set_optional(params, [("region", region)]) payload = self._client._call(params) return self._client._unwrap(payload, "recipe")
# ------------------------- Recipes: recipes.search -------------------------
[docs] def search_v1( self, search_expression: Optional[str] = None, recipe_type: Optional[str] = None, page_number: Optional[int] = None, max_results: Optional[int] = None, ) -> list: """recipes.search v1 (DEPRECATED upstream).""" params: dict = {"method": "recipes.search"} self._client._set_optional( params, [ ("search_expression", search_expression), ("recipe_type", recipe_type), ("page_number", page_number), ("max_results", max_results), ], ) payload = self._client._call(params) return self._client._unwrap(payload, "recipes", list_key="recipe")
[docs] def search_v2( self, search_expression: Optional[str] = None, must_have_images: Optional[bool] = None, calories_from: Optional[int] = None, calories_to: Optional[int] = None, carb_percentage_from: Optional[int] = None, carb_percentage_to: Optional[int] = None, protein_percentage_from: Optional[int] = None, protein_percentage_to: Optional[int] = None, fat_percentage_from: Optional[int] = None, fat_percentage_to: Optional[int] = None, prep_time_from: Optional[int] = None, prep_time_to: Optional[int] = None, page_number: Optional[int] = None, max_results: Optional[int] = None, sort_by: Optional[str] = None, region: Optional[str] = None, ) -> list: """recipes.search v2 (DEPRECATED upstream). Adds nutritional/time filters.""" params: dict = {"method": "recipes.search.v2"} self._client._set_optional( params, [ ("search_expression", search_expression), ("must_have_images", must_have_images), ("calories.from", calories_from), ("calories.to", calories_to), ("carb_percentage.from", carb_percentage_from), ("carb_percentage.to", carb_percentage_to), ("protein_percentage.from", protein_percentage_from), ("protein_percentage.to", protein_percentage_to), ("fat_percentage.from", fat_percentage_from), ("fat_percentage.to", fat_percentage_to), ("prep_time.from", prep_time_from), ("prep_time.to", prep_time_to), ("page_number", page_number), ("max_results", max_results), ("sort_by", sort_by), ("region", region), ], ) payload = self._client._call(params) return self._client._unwrap(payload, "recipes", list_key="recipe")
[docs] def search_v3( self, search_expression: Optional[str] = None, recipe_types: Optional[str] = None, recipe_types_matchall: Optional[bool] = None, must_have_images: Optional[bool] = None, calories_from: Optional[int] = None, calories_to: Optional[int] = None, carb_percentage_from: Optional[int] = None, carb_percentage_to: Optional[int] = None, protein_percentage_from: Optional[int] = None, protein_percentage_to: Optional[int] = None, fat_percentage_from: Optional[int] = None, fat_percentage_to: Optional[int] = None, prep_time_from: Optional[int] = None, prep_time_to: Optional[int] = None, page_number: Optional[int] = None, max_results: Optional[int] = None, sort_by: Optional[str] = None, region: Optional[str] = None, ) -> list: """recipes.search v3 (current). Adds recipe_types comma-list + matchall.""" params: dict = {"method": "recipes.search.v3"} self._client._set_optional( params, [ ("search_expression", search_expression), ("recipe_types", recipe_types), ("recipe_types_matchall", recipe_types_matchall), ("must_have_images", must_have_images), ("calories.from", calories_from), ("calories.to", calories_to), ("carb_percentage.from", carb_percentage_from), ("carb_percentage.to", carb_percentage_to), ("protein_percentage.from", protein_percentage_from), ("protein_percentage.to", protein_percentage_to), ("fat_percentage.from", fat_percentage_from), ("fat_percentage.to", fat_percentage_to), ("prep_time.from", prep_time_from), ("prep_time.to", prep_time_to), ("page_number", page_number), ("max_results", max_results), ("sort_by", sort_by), ("region", region), ], ) payload = self._client._call(params) return self._client._unwrap(payload, "recipes", list_key="recipe")
# ------------------------- Recipes: recipe_types.get -------------------------
[docs] def types_get_v1(self) -> list: """recipe_types.get v1 (DEPRECATED upstream).""" payload = self._client._call({"method": "recipe_types.get"}) return self._client._unwrap(payload, "recipe_types", list_key="recipe_type")
[docs] def types_get_v2( self, region: Optional[str] = None, language: Optional[str] = None ) -> list: """recipe_types.get v2 (current). Region/language are Premier-exclusive.""" params = {"method": "recipe_types.get.v2"} self._client._set_optional(params, [("region", region), ("language", language)]) payload = self._client._call(params) return self._client._unwrap(payload, "recipe_types", list_key="recipe_type")
# ------------------------- Recipes: favorites -------------------------
[docs] def add_favorite_v1(self, recipe_id: str) -> Union[bool, Any]: """recipe.add_favorite v1. Fixes the legacy plural-typo bug (uses singular `recipe.add_favorite`).""" payload = self._client._call( {"method": "recipe.add_favorite", "recipe_id": recipe_id}, method="POST" ) return self._client._mutator_success(payload)
[docs] def delete_favorite_v1(self, recipe_id: str) -> Union[bool, Any]: """recipe.delete_favorite v1. Fixes the legacy plural-typo bug.""" payload = self._client._call( {"method": "recipe.delete_favorite", "recipe_id": recipe_id}, method="DELETE", ) return self._client._mutator_success(payload)
[docs] def get_favorites_v1(self) -> list: """recipes.get_favorites v1 (DEPRECATED upstream). api_method_param: recipe.get_favorites.""" payload = self._client._call({"method": "recipe.get_favorites"}) return self._client._unwrap(payload, "recipes", list_key="recipe")
[docs] def get_favorites_v2(self) -> list: """recipes.get_favorites v2 (current). api_method_param: recipe.get_favorites.v2.""" payload = self._client._call({"method": "recipe.get_favorites.v2"}) return self._client._unwrap(payload, "recipes", list_key="recipe")