From 30ac23390b1e5d42289ae61f4c5cd26b6b116869 Mon Sep 17 00:00:00 2001 From: Lucas Giordano Date: Thu, 28 May 2026 08:33:09 -0300 Subject: [PATCH] change logging level to warning --- src/marketdata/client.py | 4 ++-- src/marketdata/settings.py | 2 +- src/tests/test_client.py | 45 +++++++++++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/marketdata/client.py b/src/marketdata/client.py index 24cb9b5..4e7334e 100644 --- a/src/marketdata/client.py +++ b/src/marketdata/client.py @@ -43,8 +43,8 @@ def __init__( self.token if self.token == NO_TOKEN_VALUE else obfuscate_token(self.token) ) self.logger.debug(f"Token: {logged_token}") - self.logger.info(f"Base URL: {settings.marketdata_base_url}") - self.logger.info(f"API Version: {settings.marketdata_api_version}") + self.logger.debug(f"Base URL: {settings.marketdata_base_url}") + self.logger.debug(f"API Version: {settings.marketdata_api_version}") self.base_url = settings.marketdata_base_url self.api_version = settings.marketdata_api_version diff --git a/src/marketdata/settings.py b/src/marketdata/settings.py index c39750a..7bfc906 100644 --- a/src/marketdata/settings.py +++ b/src/marketdata/settings.py @@ -24,7 +24,7 @@ class MarketDataSettings(BaseSettings, UniversalParamsSettings): marketdata_token: str | NoTokenValueType = NO_TOKEN_VALUE marketdata_base_url: str = "https://api.marketdata.app" marketdata_api_version: str = "v1" - marketdata_logging_level: str = "INFO" + marketdata_logging_level: str = "WARNING" model_config = ConfigDict( env_file=".env", diff --git a/src/tests/test_client.py b/src/tests/test_client.py index ee5b4f4..30785e7 100644 --- a/src/tests/test_client.py +++ b/src/tests/test_client.py @@ -1,6 +1,7 @@ import datetime import os -from unittest.mock import patch +from logging import Logger +from unittest.mock import MagicMock, patch import pytest import pytz @@ -412,3 +413,45 @@ def test_settings_extra_env_vars(): ): settings = MarketDataSettings() assert settings.marketdata_token == "test_token" + + +def test_default_logging_level_is_warning(monkeypatch): + """Issue #25: the SDK must default to WARNING so importing it does not + flood the user's terminal with INFO output. + """ + monkeypatch.delenv("MARKETDATA_LOGGING_LEVEL", raising=False) + fresh_settings = MarketDataSettings() + assert fresh_settings.marketdata_logging_level == "WARNING" + + +def test_client_init_base_url_and_api_version_logged_at_debug(respx_mock): + """Issue #25: `Base URL` and `API Version` must be logged at DEBUG rather + than INFO so that the default INFO output stays quiet. + """ + headers = { + "x-api-ratelimit-limit": "100", + "x-api-ratelimit-remaining": "99", + "x-api-ratelimit-reset": "60", + "x-api-ratelimit-consumed": "1", + } + respx_mock.get("https://api.marketdata.app/user/").respond( + json={}, headers=headers, status_code=200 + ) + + logger = MagicMock(spec=Logger) + MarketDataClient(token="test", logger=logger) + + info_messages = [call.args[0] for call in logger.info.call_args_list] + debug_messages = [call.args[0] for call in logger.debug.call_args_list] + + # Sanity: the constructor still emits the top-level "Initializing" line at + # INFO, so the mock is wired correctly. + assert any("Initializing" in m for m in info_messages) + + # The noisy details must not be at INFO anymore. + assert not any("Base URL" in m for m in info_messages) + assert not any("API Version" in m for m in info_messages) + + # They must still be available, just at DEBUG. + assert any("Base URL" in m for m in debug_messages) + assert any("API Version" in m for m in debug_messages)