Source code for fatsecret.resources.foods

"""Resource wrapper for the OAS ``Foods`` tag."""

from __future__ import annotations

from typing import Any, Optional

from ._base import BaseResource


class FoodsResource(BaseResource):
    """Resource methods for the OAS `Foods` tag.

    Phase 1: pure-delegation over the flat ``foods_*`` / ``food_*``
    methods on :class:`Fatsecret`. Future phases swap delegation for
    OAS-codegen'd implementations.
    """

[docs] def autocomplete_v1( self, expression: str, max_results: Optional[int] = None, region: Optional[str] = None, ) -> list: """foods.autocomplete v1 (DEPRECATED upstream). Premier-only.""" params = {"method": "foods.autocomplete", "expression": expression} self._client._set_optional(params, [("max_results", max_results), ("region", region)]) payload = self._client._call(params) return self._client._unwrap(payload, "suggestions", list_key="suggestion")
[docs] def autocomplete_v2( self, expression: str, max_results: Optional[int] = None, region: Optional[str] = None, ) -> list: """foods.autocomplete v2 (current). Premier-only.""" params = {"method": "foods.autocomplete.v2", "expression": expression} self._client._set_optional(params, [("max_results", max_results), ("region", region)]) payload = self._client._call(params) return self._client._unwrap(payload, "suggestions", list_key="suggestion")
[docs] def find_id_for_barcode_v1( self, barcode: str, region: Optional[str] = None, language: Optional[str] = None, ) -> Any: """food.find_id_for_barcode v1. Premier (`barcode` scope). Returns food_id (0 if no match).""" params = {"method": "food.find_id_for_barcode", "barcode": barcode} self._client._set_optional(params, [("region", region), ("language", language)]) payload = self._client._call(params) return self._client._unwrap(payload, "food_id")
[docs] def find_id_for_barcode_v2( self, barcode: str, include_sub_categories: Optional[bool] = None, include_food_images: Optional[bool] = None, include_food_attributes: Optional[bool] = None, flag_default_serving: Optional[bool] = None, region: Optional[str] = None, language: Optional[str] = None, ) -> dict: """food.find_id_for_barcode v2. Returns full food record. Premier (`barcode` scope).""" params = {"method": "food.find_id_for_barcode.v2", "barcode": barcode} self._client._set_optional( params, [ ("include_sub_categories", include_sub_categories), ("include_food_images", include_food_images), ("include_food_attributes", include_food_attributes), ("flag_default_serving", flag_default_serving), ("region", region), ("language", language), ], ) payload = self._client._call(params) return self._client._unwrap(payload, "food")
[docs] def get_v1( self, food_id: str, include_sub_categories: Optional[bool] = None, flag_default_serving: Optional[bool] = None, region: Optional[str] = None, language: Optional[str] = None, ) -> dict: """food.get v1 (DEPRECATED upstream). Vitamins A/C, calcium, iron reported as %DV.""" params = {"method": "food.get", "food_id": food_id} self._client._set_optional( params, [ ("include_sub_categories", include_sub_categories), ("flag_default_serving", flag_default_serving), ("region", region), ("language", language), ], ) payload = self._client._call(params) return self._client._unwrap(payload, "food")
[docs] def get_v2(self, food_id, region=None, language=None): """Returns detailed nutritional information for the specified food. Use this call to display nutrition values for a food to users. :param food_id: Fatsecret food identifier :type food_id: str """ params = {"method": "food.get.v2", "food_id": food_id, "format": "json"} if region: params["region"] = region if language: params["language"] = language response = self._client.session.get(self._client.api_url, params=params) return self._client.valid_response(response)
[docs] def get_v3( self, food_id: str, include_sub_categories: Optional[bool] = None, flag_default_serving: Optional[bool] = None, region: Optional[str] = None, language: Optional[str] = None, ) -> dict: """food.get v3 (DEPRECATED upstream). Schema near-identical to v2.""" params = {"method": "food.get.v3", "food_id": food_id} self._client._set_optional( params, [ ("include_sub_categories", include_sub_categories), ("flag_default_serving", flag_default_serving), ("region", region), ("language", language), ], ) payload = self._client._call(params) return self._client._unwrap(payload, "food")
[docs] def get_v4( self, food_id: str, include_sub_categories: Optional[bool] = None, include_food_images: Optional[bool] = None, include_food_attributes: Optional[bool] = None, flag_default_serving: Optional[bool] = None, region: Optional[str] = None, language: Optional[str] = None, ) -> dict: """food.get v4 (DEPRECATED upstream). Adds food_images and food_attributes (allergens, preferences).""" params = {"method": "food.get.v4", "food_id": food_id} self._client._set_optional( params, [ ("include_sub_categories", include_sub_categories), ("include_food_images", include_food_images), ("include_food_attributes", include_food_attributes), ("flag_default_serving", flag_default_serving), ("region", region), ("language", language), ], ) payload = self._client._call(params) return self._client._unwrap(payload, "food")
[docs] def get_v5( self, food_id: str, include_sub_categories: Optional[bool] = None, include_food_images: Optional[bool] = None, include_food_attributes: Optional[bool] = None, flag_default_serving: Optional[bool] = None, region: Optional[str] = None, language: Optional[str] = None, ) -> dict: """food.get v5 (current). Brand foods get derived 100g/100ml servings with serving_id=0.""" params = {"method": "food.get.v5", "food_id": food_id} self._client._set_optional( params, [ ("include_sub_categories", include_sub_categories), ("include_food_images", include_food_images), ("include_food_attributes", include_food_attributes), ("flag_default_serving", flag_default_serving), ("region", region), ("language", language), ], ) payload = self._client._call(params) return self._client._unwrap(payload, "food")
[docs] def search_v1( self, search_expression: str, page_number: Optional[int] = None, max_results: Optional[int] = None, generic_description: Optional[str] = None, region: Optional[str] = None, language: Optional[str] = None, ) -> list: """foods.search v1. Lightweight result set (no nested servings). Region/language are Premier-exclusive on v1. """ params = {"method": "foods.search", "search_expression": search_expression} self._client._set_optional( params, [ ("page_number", page_number), ("max_results", max_results), ("generic_description", generic_description), ("region", region), ("language", language), ], ) payload = self._client._call(params) return self._client._unwrap(payload, "foods", list_key="food")
[docs] def search_v2( self, search_expression: str, page_number: Optional[int] = None, max_results: Optional[int] = None, include_sub_categories: Optional[bool] = None, flag_default_serving: Optional[bool] = None, region: Optional[str] = None, language: Optional[str] = None, ) -> list: """foods.search v2 (DEPRECATED upstream). Returns nested servings + nutrition. Premier.""" params = {"method": "foods.search.v2", "search_expression": search_expression} self._client._set_optional( params, [ ("page_number", page_number), ("max_results", max_results), ("include_sub_categories", include_sub_categories), ("flag_default_serving", flag_default_serving), ("region", region), ("language", language), ], ) payload = self._client._call(params) return self._client._unwrap(payload, "foods_search", "results", list_key="food")
[docs] def search_v3( self, search_expression: str, page_number: Optional[int] = None, max_results: Optional[int] = None, include_sub_categories: Optional[bool] = None, include_food_images: Optional[bool] = None, include_food_attributes: Optional[bool] = None, flag_default_serving: Optional[bool] = None, region: Optional[str] = None, language: Optional[str] = None, ) -> list: """foods.search v3 (DEPRECATED upstream). Adds include_food_images and include_food_attributes. Premier.""" params = {"method": "foods.search.v3", "search_expression": search_expression} self._client._set_optional( params, [ ("page_number", page_number), ("max_results", max_results), ("include_sub_categories", include_sub_categories), ("include_food_images", include_food_images), ("include_food_attributes", include_food_attributes), ("flag_default_serving", flag_default_serving), ("region", region), ("language", language), ], ) payload = self._client._call(params) return self._client._unwrap(payload, "foods_search", "results", list_key="food")
[docs] def search_v4( self, search_expression: str, page_number: Optional[int] = None, max_results: Optional[int] = None, include_sub_categories: Optional[bool] = None, include_food_images: Optional[bool] = None, include_food_attributes: Optional[bool] = None, flag_default_serving: Optional[bool] = None, region: Optional[str] = None, language: Optional[str] = None, ) -> list: """foods.search v4 (DEPRECATED upstream). Brand foods include derived 100g/100ml servings. Premier.""" params = {"method": "foods.search.v4", "search_expression": search_expression} self._client._set_optional( params, [ ("page_number", page_number), ("max_results", max_results), ("include_sub_categories", include_sub_categories), ("include_food_images", include_food_images), ("include_food_attributes", include_food_attributes), ("flag_default_serving", flag_default_serving), ("region", region), ("language", language), ], ) payload = self._client._call(params) return self._client._unwrap(payload, "foods_search", "results", list_key="food")
[docs] def search_v5( self, search_expression: str, page_number: Optional[int] = None, max_results: Optional[int] = None, include_sub_categories: Optional[bool] = None, include_food_images: Optional[bool] = None, include_food_attributes: Optional[bool] = None, flag_default_serving: Optional[bool] = None, food_type: Optional[str] = None, region: Optional[str] = None, language: Optional[str] = None, ) -> list: """foods.search v5 (current). Adds `food_type` filter ('none'/'generic'/'brand'). Premier.""" params = {"method": "foods.search.v5", "search_expression": search_expression} self._client._set_optional( params, [ ("page_number", page_number), ("max_results", max_results), ("include_sub_categories", include_sub_categories), ("include_food_images", include_food_images), ("include_food_attributes", include_food_attributes), ("flag_default_serving", flag_default_serving), ("food_type", food_type), ("region", region), ("language", language), ], ) payload = self._client._call(params) return self._client._unwrap(payload, "foods_search", "results", list_key="food")