diff --git a/oura_api_client/api/daily_activity.py b/oura_api_client/api/daily_activity.py index 3923ddf..c01e17b 100644 --- a/oura_api_client/api/daily_activity.py +++ b/oura_api_client/api/daily_activity.py @@ -2,6 +2,7 @@ from datetime import date from oura_api_client.api.base import BaseRouter from oura_api_client.models.daily_activity import DailyActivityResponse, DailyActivityModel +from oura_api_client.utils import build_query_params class DailyActivity(BaseRouter): @@ -22,16 +23,7 @@ def get_daily_activity_documents( Returns: DailyActivityResponse: Response containing daily activity data. """ - if isinstance(start_date, date): - start_date = start_date.isoformat() - if isinstance(end_date, date): - end_date = end_date.isoformat() - params = { - "start_date": start_date if start_date else None, - "end_date": end_date if end_date else None, - "next_token": next_token if next_token else None, - } - params = {k: v for k, v in params.items() if v is not None} + params = build_query_params(start_date, end_date, next_token) response = self.client._make_request( "/usercollection/daily_activity", params=params ) diff --git a/oura_api_client/api/daily_cardiovascular_age.py b/oura_api_client/api/daily_cardiovascular_age.py index e238300..f7f360f 100644 --- a/oura_api_client/api/daily_cardiovascular_age.py +++ b/oura_api_client/api/daily_cardiovascular_age.py @@ -1,6 +1,7 @@ from typing import Optional, Union from datetime import date from oura_api_client.api.base import BaseRouter +from oura_api_client.utils import build_query_params from oura_api_client.models.daily_cardiovascular_age import ( DailyCardiovascularAgeResponse, DailyCardiovascularAgeModel @@ -26,16 +27,7 @@ def get_daily_cardiovascular_age_documents( DailyCardiovascularAgeResponse: Response containing daily cardiovascular age data. """ - if isinstance(start_date, date): - start_date = start_date.isoformat() - if isinstance(end_date, date): - end_date = end_date.isoformat() - params = { - "start_date": start_date if start_date else None, - "end_date": end_date if end_date else None, - "next_token": next_token if next_token else None, - } - params = {k: v for k, v in params.items() if v is not None} + params = build_query_params(start_date, end_date, next_token) response = self.client._make_request( "/usercollection/daily_cardiovascular_age", params=params ) diff --git a/oura_api_client/api/daily_readiness.py b/oura_api_client/api/daily_readiness.py index ab3611c..4494ff8 100644 --- a/oura_api_client/api/daily_readiness.py +++ b/oura_api_client/api/daily_readiness.py @@ -1,6 +1,7 @@ from typing import Optional, Union from datetime import date from oura_api_client.api.base import BaseRouter +from oura_api_client.utils import build_query_params from oura_api_client.models.daily_readiness import ( DailyReadinessResponse, DailyReadinessModel @@ -25,16 +26,7 @@ def get_daily_readiness_documents( Returns: DailyReadinessResponse: Response containing daily readiness data. """ - if isinstance(start_date, date): - start_date = start_date.isoformat() - if isinstance(end_date, date): - end_date = end_date.isoformat() - params = { - "start_date": start_date if start_date else None, - "end_date": end_date if end_date else None, - "next_token": next_token if next_token else None, - } - params = {k: v for k, v in params.items() if v is not None} + params = build_query_params(start_date, end_date, next_token) response = self.client._make_request( "/usercollection/daily_readiness", params=params ) diff --git a/oura_api_client/api/daily_resilience.py b/oura_api_client/api/daily_resilience.py index 284b518..bdeb522 100644 --- a/oura_api_client/api/daily_resilience.py +++ b/oura_api_client/api/daily_resilience.py @@ -1,6 +1,7 @@ from typing import Optional, Union from datetime import date from oura_api_client.api.base import BaseRouter +from oura_api_client.utils import build_query_params from oura_api_client.models.daily_resilience import ( DailyResilienceResponse, DailyResilienceModel @@ -25,16 +26,7 @@ def get_daily_resilience_documents( Returns: DailyResilienceResponse: Response containing daily resilience data. """ - if isinstance(start_date, date): - start_date = start_date.isoformat() - if isinstance(end_date, date): - end_date = end_date.isoformat() - params = { - "start_date": start_date if start_date else None, - "end_date": end_date if end_date else None, - "next_token": next_token if next_token else None, - } - params = {k: v for k, v in params.items() if v is not None} + params = build_query_params(start_date, end_date, next_token) response = self.client._make_request( "/usercollection/daily_resilience", params=params ) diff --git a/oura_api_client/api/daily_sleep.py b/oura_api_client/api/daily_sleep.py index c068c05..ce0c29c 100644 --- a/oura_api_client/api/daily_sleep.py +++ b/oura_api_client/api/daily_sleep.py @@ -1,6 +1,7 @@ from typing import Optional, Union from datetime import date from oura_api_client.api.base import BaseRouter +from oura_api_client.utils import build_query_params from oura_api_client.models.daily_sleep import ( DailySleepResponse, DailySleepModel @@ -25,16 +26,7 @@ def get_daily_sleep_documents( Returns: DailySleepResponse: Response containing daily sleep data. """ - if isinstance(start_date, date): - start_date = start_date.isoformat() - if isinstance(end_date, date): - end_date = end_date.isoformat() - params = { - "start_date": start_date if start_date else None, - "end_date": end_date if end_date else None, - "next_token": next_token if next_token else None, - } - params = {k: v for k, v in params.items() if v is not None} + params = build_query_params(start_date, end_date, next_token) response = self.client._make_request( "/usercollection/daily_sleep", params=params ) diff --git a/oura_api_client/api/daily_spo2.py b/oura_api_client/api/daily_spo2.py index 9479be8..ea7eda1 100644 --- a/oura_api_client/api/daily_spo2.py +++ b/oura_api_client/api/daily_spo2.py @@ -1,6 +1,7 @@ from typing import Optional, Union from datetime import date from oura_api_client.api.base import BaseRouter +from oura_api_client.utils import build_query_params from oura_api_client.models.daily_spo2 import ( DailySpO2Response, DailySpO2Model @@ -25,16 +26,7 @@ def get_daily_spo2_documents( # Renamed method Returns: DailySpO2Response: Response containing daily SpO2 data. """ - if isinstance(start_date, date): - start_date = start_date.isoformat() - if isinstance(end_date, date): - end_date = end_date.isoformat() - params = { - "start_date": start_date if start_date else None, - "end_date": end_date if end_date else None, - "next_token": next_token if next_token else None, - } - params = {k: v for k, v in params.items() if v is not None} + params = build_query_params(start_date, end_date, next_token) response = self.client._make_request( "/usercollection/daily_spo2", params=params ) diff --git a/oura_api_client/api/daily_stress.py b/oura_api_client/api/daily_stress.py index 5951641..e8157e2 100644 --- a/oura_api_client/api/daily_stress.py +++ b/oura_api_client/api/daily_stress.py @@ -1,6 +1,7 @@ from typing import Optional, Union from datetime import date from oura_api_client.api.base import BaseRouter +from oura_api_client.utils import build_query_params from oura_api_client.models.daily_stress import ( DailyStressResponse, DailyStressModel @@ -25,16 +26,7 @@ def get_daily_stress_documents( Returns: DailyStressResponse: Response containing daily stress data. """ - if isinstance(start_date, date): - start_date = start_date.isoformat() - if isinstance(end_date, date): - end_date = end_date.isoformat() - params = { - "start_date": start_date if start_date else None, - "end_date": end_date if end_date else None, - "next_token": next_token if next_token else None, - } - params = {k: v for k, v in params.items() if v is not None} + params = build_query_params(start_date, end_date, next_token) response = self.client._make_request( "/usercollection/daily_stress", params=params ) diff --git a/oura_api_client/api/enhanced_tag.py b/oura_api_client/api/enhanced_tag.py index a74146e..710eb6a 100644 --- a/oura_api_client/api/enhanced_tag.py +++ b/oura_api_client/api/enhanced_tag.py @@ -1,6 +1,7 @@ from typing import Optional, Union from datetime import date # Using date for start_date and end_date from oura_api_client.api.base import BaseRouter +from oura_api_client.utils import build_query_params from oura_api_client.models.enhanced_tag import ( EnhancedTagResponse, EnhancedTagModel @@ -25,16 +26,7 @@ def get_enhanced_tag_documents( Returns: EnhancedTagResponse: Response containing enhanced_tag data. """ - if isinstance(start_date, date): - start_date = start_date.isoformat() - if isinstance(end_date, date): - end_date = end_date.isoformat() - params = { - "start_date": start_date if start_date else None, - "end_date": end_date if end_date else None, - "next_token": next_token if next_token else None, - } - params = {k: v for k, v in params.items() if v is not None} + params = build_query_params(start_date, end_date, next_token) response = self.client._make_request( "/usercollection/enhanced_tag", params=params ) diff --git a/oura_api_client/api/rest_mode_period.py b/oura_api_client/api/rest_mode_period.py index e081848..78fd588 100644 --- a/oura_api_client/api/rest_mode_period.py +++ b/oura_api_client/api/rest_mode_period.py @@ -1,6 +1,7 @@ from typing import Optional, Union from datetime import date from oura_api_client.api.base import BaseRouter +from oura_api_client.utils import build_query_params from oura_api_client.models.rest_mode_period import ( RestModePeriodResponse, RestModePeriodModel @@ -25,16 +26,7 @@ def get_rest_mode_period_documents( Returns: RestModePeriodResponse: Response containing rest_mode_period data. """ - if isinstance(start_date, date): - start_date = start_date.isoformat() - if isinstance(end_date, date): - end_date = end_date.isoformat() - params = { - "start_date": start_date if start_date else None, - "end_date": end_date if end_date else None, - "next_token": next_token if next_token else None, - } - params = {k: v for k, v in params.items() if v is not None} + params = build_query_params(start_date, end_date, next_token) response = self.client._make_request( "/usercollection/rest_mode_period", params=params ) diff --git a/oura_api_client/api/ring_configuration.py b/oura_api_client/api/ring_configuration.py index ce26457..ae767d2 100644 --- a/oura_api_client/api/ring_configuration.py +++ b/oura_api_client/api/ring_configuration.py @@ -1,6 +1,7 @@ from typing import Optional, Union # Union is not strictly needed here but kept for consistency from datetime import date # date is not used by ring_configuration but kept for consistency from oura_api_client.api.base import BaseRouter +from oura_api_client.utils import build_query_params from oura_api_client.models.ring_configuration import ( RingConfigurationResponse, RingConfigurationModel @@ -31,26 +32,11 @@ def get_ring_configuration_documents( Returns: RingConfigurationResponse: Response containing ring configuration data. """ - params = {} - if start_date: - if isinstance(start_date, date): - params["start_date"] = start_date.isoformat() - else: - params["start_date"] = start_date - if end_date: - if isinstance(end_date, date): - params["end_date"] = end_date.isoformat() - else: - params["end_date"] = end_date - if next_token: - params["next_token"] = next_token - - # Remove None params manually as empty dict evaluates to False - final_params = {k: v for k, v in params.items() if v is not None} + params = build_query_params(start_date, end_date, next_token) response = self.client._make_request( "/usercollection/ring_configuration", - params=final_params if final_params else None + params=params if params else None ) return RingConfigurationResponse(**response) diff --git a/oura_api_client/api/session.py b/oura_api_client/api/session.py index 091b058..1083b65 100644 --- a/oura_api_client/api/session.py +++ b/oura_api_client/api/session.py @@ -3,6 +3,7 @@ # as per other endpoints from oura_api_client.api.base import BaseRouter from oura_api_client.models.session import SessionResponse, SessionModel +from oura_api_client.utils import build_query_params class Session(BaseRouter): @@ -25,16 +26,7 @@ def get_session_documents( Returns: SessionResponse: Response containing session data. """ - if isinstance(start_date, date): - start_date = start_date.isoformat() - if isinstance(end_date, date): - end_date = end_date.isoformat() - params = { - "start_date": start_date if start_date else None, - "end_date": end_date if end_date else None, - "next_token": next_token if next_token else None, - } - params = {k: v for k, v in params.items() if v is not None} + params = build_query_params(start_date, end_date, next_token) response = self.client._make_request( "/usercollection/session", params=params ) diff --git a/oura_api_client/api/sleep.py b/oura_api_client/api/sleep.py index b10f2a7..df29d52 100644 --- a/oura_api_client/api/sleep.py +++ b/oura_api_client/api/sleep.py @@ -1,6 +1,7 @@ from typing import Optional, Union from datetime import date # Keep date for start/end_date from oura_api_client.api.base import BaseRouter +from oura_api_client.utils import build_query_params from oura_api_client.models.sleep import ( SleepResponse, SleepModel # Updated model import @@ -27,16 +28,7 @@ def get_sleep_documents( # Renamed method Returns: SleepResponse: Response containing sleep data. """ - if isinstance(start_date, date): - start_date = start_date.isoformat() - if isinstance(end_date, date): - end_date = end_date.isoformat() - params = { - "start_date": start_date if start_date else None, - "end_date": end_date if end_date else None, - "next_token": next_token if next_token else None, - } - params = {k: v for k, v in params.items() if v is not None} + params = build_query_params(start_date, end_date, next_token) # Corrected endpoint URL from daily_sleep to sleep response = self.client._make_request( "/usercollection/sleep", params=params diff --git a/oura_api_client/api/sleep_time.py b/oura_api_client/api/sleep_time.py index affe6d6..f8ac430 100644 --- a/oura_api_client/api/sleep_time.py +++ b/oura_api_client/api/sleep_time.py @@ -1,6 +1,7 @@ from typing import Optional, Union from datetime import date from oura_api_client.api.base import BaseRouter +from oura_api_client.utils import build_query_params from oura_api_client.models.sleep_time import ( SleepTimeResponse, SleepTimeModel @@ -25,16 +26,7 @@ def get_sleep_time_documents( Returns: SleepTimeResponse: Response containing sleep time data. """ - if isinstance(start_date, date): - start_date = start_date.isoformat() - if isinstance(end_date, date): - end_date = end_date.isoformat() - params = { - "start_date": start_date if start_date else None, - "end_date": end_date if end_date else None, - "next_token": next_token if next_token else None, - } - params = {k: v for k, v in params.items() if v is not None} + params = build_query_params(start_date, end_date, next_token) response = self.client._make_request( "/usercollection/sleep_time", params=params ) diff --git a/oura_api_client/api/tag.py b/oura_api_client/api/tag.py index 30b228d..f1eeb2c 100644 --- a/oura_api_client/api/tag.py +++ b/oura_api_client/api/tag.py @@ -2,6 +2,7 @@ from datetime import date # Using date for start_date and end_date from oura_api_client.api.base import BaseRouter from oura_api_client.models.tag import TagResponse, TagModel +from oura_api_client.utils import build_query_params class Tag(BaseRouter): @@ -22,16 +23,7 @@ def get_tag_documents( Returns: TagResponse: Response containing tag data. """ - if isinstance(start_date, date): - start_date = start_date.isoformat() - if isinstance(end_date, date): - end_date = end_date.isoformat() - params = { - "start_date": start_date if start_date else None, - "end_date": end_date if end_date else None, - "next_token": next_token if next_token else None, - } - params = {k: v for k, v in params.items() if v is not None} + params = build_query_params(start_date, end_date, next_token) response = self.client._make_request( "/usercollection/tag", params=params ) diff --git a/oura_api_client/api/vo2_max.py b/oura_api_client/api/vo2_max.py index cf316f1..e4ec3ac 100644 --- a/oura_api_client/api/vo2_max.py +++ b/oura_api_client/api/vo2_max.py @@ -2,6 +2,7 @@ from datetime import date from oura_api_client.api.base import BaseRouter from oura_api_client.models.vo2_max import Vo2MaxResponse, Vo2MaxModel +from oura_api_client.utils import build_query_params class Vo2Max(BaseRouter): @@ -22,16 +23,7 @@ def get_vo2_max_documents( Returns: Vo2MaxResponse: Response containing VO2 max data. """ - if isinstance(start_date, date): - start_date = start_date.isoformat() - if isinstance(end_date, date): - end_date = end_date.isoformat() - params = { - "start_date": start_date if start_date else None, - "end_date": end_date if end_date else None, - "next_token": next_token if next_token else None, - } - params = {k: v for k, v in params.items() if v is not None} + params = build_query_params(start_date, end_date, next_token) response = self.client._make_request( "/usercollection/vO2_max", params=params ) diff --git a/oura_api_client/api/workout.py b/oura_api_client/api/workout.py index dbee601..b6c559f 100644 --- a/oura_api_client/api/workout.py +++ b/oura_api_client/api/workout.py @@ -2,6 +2,7 @@ from datetime import date # Using date for start_date and end_date from oura_api_client.api.base import BaseRouter from oura_api_client.models.workout import WorkoutResponse, WorkoutModel +from oura_api_client.utils import build_query_params class Workout(BaseRouter): @@ -22,16 +23,7 @@ def get_workout_documents( Returns: WorkoutResponse: Response containing workout data. """ - if isinstance(start_date, date): - start_date = start_date.isoformat() - if isinstance(end_date, date): - end_date = end_date.isoformat() - params = { - "start_date": start_date if start_date else None, - "end_date": end_date if end_date else None, - "next_token": next_token if next_token else None, - } - params = {k: v for k, v in params.items() if v is not None} + params = build_query_params(start_date, end_date, next_token) response = self.client._make_request( "/usercollection/workout", params=params ) diff --git a/oura_api_client/models/webhook.py b/oura_api_client/models/webhook.py index ba7c4c9..c207241 100644 --- a/oura_api_client/models/webhook.py +++ b/oura_api_client/models/webhook.py @@ -1,5 +1,5 @@ from pydantic import BaseModel, Field -from typing import Optional, List +from typing import Optional from datetime import datetime from enum import Enum diff --git a/oura_api_client/utils/__init__.py b/oura_api_client/utils/__init__.py index 92cbfff..30931eb 100644 --- a/oura_api_client/utils/__init__.py +++ b/oura_api_client/utils/__init__.py @@ -1 +1,5 @@ """Utility functions for the Oura API client.""" + +from .query_params import build_query_params, convert_date_to_string + +__all__ = ["build_query_params", "convert_date_to_string"] diff --git a/oura_api_client/utils/query_params.py b/oura_api_client/utils/query_params.py new file mode 100644 index 0000000..e09ac59 --- /dev/null +++ b/oura_api_client/utils/query_params.py @@ -0,0 +1,51 @@ +"""Utilities for building query parameters for Oura API requests.""" + +from datetime import date +from typing import Optional, Union, Dict, Any + + +def convert_date_to_string(date_param: Optional[Union[str, date]]) -> Optional[str]: + """Convert a date parameter to ISO format string if it's a date object. + + Args: + date_param: Date parameter that can be a string, date object, or None + + Returns: + ISO format date string or None + """ + if isinstance(date_param, date): + return date_param.isoformat() + return date_param + + +def build_query_params( + start_date: Optional[Union[str, date]] = None, + end_date: Optional[Union[str, date]] = None, + next_token: Optional[str] = None, + **kwargs: Any +) -> Dict[str, Any]: + """Build query parameters dictionary for API requests. + + This function handles common query parameter patterns: + - Converts date objects to ISO format strings + - Filters out None values + - Supports additional parameters via kwargs + + Args: + start_date: Start date for filtering (string or date object) + end_date: End date for filtering (string or date object) + next_token: Token for pagination + **kwargs: Additional query parameters + + Returns: + Dictionary of query parameters with None values filtered out + """ + params = { + "start_date": convert_date_to_string(start_date), + "end_date": convert_date_to_string(end_date), + "next_token": next_token, + **kwargs + } + + # Filter out None values + return {k: v for k, v in params.items() if v is not None}