From 3f4f05b4eeb8f0ca3c69d26b06e2ebbcdad84d3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0tefan=20F=C3=B6ldesi?= Date: Tue, 27 Aug 2024 16:09:26 +0200 Subject: [PATCH] feat: configurable request timeout --- gopay/api.py | 27 ++++++++++++++++++++------- gopay/http.py | 3 ++- gopay/models.py | 3 ++- tests/test_payments.py | 4 ++-- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/gopay/api.py b/gopay/api.py index 64e3a9c..9d8a5eb 100644 --- a/gopay/api.py +++ b/gopay/api.py @@ -5,7 +5,6 @@ from gopay.enums import ContentType, Language from gopay.http import ApiClient, Request, Response -from gopay.services import DefaultCache, default_logger @dataclass @@ -24,15 +23,29 @@ def __post_init__(self): # Make sure URL will be in the form of example.com/api urlparts = urlsplit(self.config["gateway_url"]) self.base_url = urlunsplit((urlparts.scheme, urlparts.netloc, "/api", "", "")) + + # Prepare + api_client_config = { + "client_id": self.config["client_id"], + "client_secret": self.config["client_secret"], + "gateway_url": self.base_url, + "scope": self.config["scope"], + } + + # Add optional parameters if found + if (timeout := self.config.get("timeout")) is not None: + api_client_config.update({"timeout": timeout}) + + if (logger := self.services.get("logger")) is not None: + api_client_config.update({"logger": logger}) + + if (cache := self.services.get("cache")) is not None: + api_client_config.update({"cache": cache}) + # Create the API client self.api_client = ApiClient( - client_id=self.config["client_id"], - client_secret=self.config["client_secret"], - gateway_url=self.base_url, - scope=self.config["scope"], - logger=self.services.get("logger") or default_logger, - cache=self.services.get("cache") or DefaultCache(), + **api_client_config ) def call( diff --git a/gopay/http.py b/gopay/http.py index d076523..e4c73f5 100644 --- a/gopay/http.py +++ b/gopay/http.py @@ -88,6 +88,7 @@ class ApiClient: client_secret: str gateway_url: str scope: TokenScope + timeout: int = 180 logger: LoggerType = default_logger cache: AbstractCache = field(default_factory=DefaultCache) @@ -141,7 +142,7 @@ def send_request(self, request: Request) -> Response: auth=(self.client_id, self.client_secret) if request.basic_auth else None, data=request.body if request.content_type == ContentType.FORM else None, json=request.body if request.content_type == ContentType.JSON else None, - timeout=300 + timeout=self.timeout ) # Build Response instance, try to decode body as JSON diff --git a/gopay/models.py b/gopay/models.py index 109b14c..022aeb7 100644 --- a/gopay/models.py +++ b/gopay/models.py @@ -1,7 +1,7 @@ from __future__ import annotations from pydantic import BaseModel, Extra - +from typing import Optional from gopay import enums @@ -16,5 +16,6 @@ class GopayConfig(GopayModel): client_id: str client_secret: str gateway_url: str + timeout: Optional[int] = None scope: enums.TokenScope = enums.TokenScope.ALL language: enums.Language = enums.Language.CZECH diff --git a/tests/test_payments.py b/tests/test_payments.py index d6232e8..38cc0ff 100644 --- a/tests/test_payments.py +++ b/tests/test_payments.py @@ -2,11 +2,10 @@ import gopay from gopay.enums import Language, TokenScope -from gopay.http import AccessToken, Request, Response, TokenScope +from gopay.http import AccessToken, Request, Response from gopay.payments import Payments from gopay.services import AbstractCache - def mock_logger(request: Request, response: Response) -> None: pass @@ -45,6 +44,7 @@ def test_full_config( "gateway_url": gateway_url, "scope": TokenScope.ALL, "language": Language.CZECH, + "timeout": 300 } ) assert isinstance(payments, Payments)