From d79b5e4c140d34017d6b6f02301a3e5a386c1c8a Mon Sep 17 00:00:00 2001 From: alallema Date: Wed, 31 May 2023 13:47:04 +0200 Subject: [PATCH 1/8] Adding a header parameters to the client constructor --- meilisearch/_httprequests.py | 3 ++- meilisearch/client.py | 8 ++++++-- meilisearch/config.py | 9 +++++++-- tests/client/test_http_requests.py | 17 +++++++++++++++++ 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/meilisearch/_httprequests.py b/meilisearch/_httprequests.py index 0304693c..e7d54d5c 100644 --- a/meilisearch/_httprequests.py +++ b/meilisearch/_httprequests.py @@ -19,7 +19,8 @@ def __init__(self, config: Config) -> None: self.config = config self.headers = { "Authorization": f"Bearer {self.config.api_key}", - "User-Agent": qualified_version(), + "User-Agent": qualified_version() + + (";" + ";".join(config.client_agents) if config.client_agents else ""), } def send_request( diff --git a/meilisearch/client.py b/meilisearch/client.py index d5b6ae62..64a0dfaa 100644 --- a/meilisearch/client.py +++ b/meilisearch/client.py @@ -29,7 +29,11 @@ class Client: """ def __init__( - self, url: str, api_key: Optional[str] = None, timeout: Optional[int] = None + self, + url: str, + api_key: Optional[str] = None, + timeout: Optional[int] = None, + client_agents: Optional[List[str]] = None, ) -> None: """ Parameters @@ -39,7 +43,7 @@ def __init__( api_key: The optional API key for Meilisearch """ - self.config = Config(url, api_key, timeout=timeout) + self.config = Config(url, api_key, timeout=timeout, client_agents=client_agents) self.http = HttpRequests(self.config) diff --git a/meilisearch/config.py b/meilisearch/config.py index b2d1a87e..6ff24ab1 100644 --- a/meilisearch/config.py +++ b/meilisearch/config.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Optional +from typing import List, Optional class Config: @@ -35,7 +35,11 @@ class Paths: swap = "swap-indexes" def __init__( - self, url: str, api_key: Optional[str] = None, timeout: Optional[int] = None + self, + url: str, + api_key: Optional[str] = None, + timeout: Optional[int] = None, + client_agents: Optional[List[str]] = None, ) -> None: """ Parameters @@ -49,4 +53,5 @@ def __init__( self.url = url self.api_key = api_key self.timeout = timeout + self.client_agents = client_agents self.paths = self.Paths() diff --git a/tests/client/test_http_requests.py b/tests/client/test_http_requests.py index b9f9749f..a4dabeb9 100644 --- a/tests/client/test_http_requests.py +++ b/tests/client/test_http_requests.py @@ -11,3 +11,20 @@ def test_get_headers_from_http_requests_instance(): assert http.headers["Authorization"] == f"Bearer {MASTER_KEY}" assert http.headers["User-Agent"] == qualified_version() + + +def test_get_headers_with_multiple_user_agent(): + """Tests getting defined headers from instance in HttpRequests.""" + config = Config( + BASE_URL, + MASTER_KEY, + timeout=None, + client_agents=["Meilisearch Package1 (v1.1.1)", "Meilisearch Package2 (v2.2.2)"], + ) + http = HttpRequests(config=config) + + assert http.headers["Authorization"] == f"Bearer {MASTER_KEY}" + assert ( + http.headers["User-Agent"] + == qualified_version() + ";Meilisearch Package1 (v1.1.1);Meilisearch Package2 (v2.2.2)" + ) From 70800529f354c46ae53bc336a3920c008802675e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Am=C3=A9lie?= Date: Wed, 31 May 2023 16:09:50 +0200 Subject: [PATCH 2/8] Update tests/client/test_http_requests.py Co-authored-by: Paul Sanders --- tests/client/test_http_requests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/client/test_http_requests.py b/tests/client/test_http_requests.py index a4dabeb9..7093aa69 100644 --- a/tests/client/test_http_requests.py +++ b/tests/client/test_http_requests.py @@ -19,7 +19,7 @@ def test_get_headers_with_multiple_user_agent(): BASE_URL, MASTER_KEY, timeout=None, - client_agents=["Meilisearch Package1 (v1.1.1)", "Meilisearch Package2 (v2.2.2)"], + client_agents=("Meilisearch Package1 (v1.1.1)", "Meilisearch Package2 (v2.2.2)"), ) http = HttpRequests(config=config) From e462013accf4960526cde61374cc7962771cd71c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Am=C3=A9lie?= Date: Wed, 31 May 2023 16:09:56 +0200 Subject: [PATCH 3/8] Update meilisearch/config.py Co-authored-by: Paul Sanders --- meilisearch/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meilisearch/config.py b/meilisearch/config.py index 6ff24ab1..89e09d14 100644 --- a/meilisearch/config.py +++ b/meilisearch/config.py @@ -39,7 +39,7 @@ def __init__( url: str, api_key: Optional[str] = None, timeout: Optional[int] = None, - client_agents: Optional[List[str]] = None, + client_agents: Optional[Tuple[str]] = None, ) -> None: """ Parameters From b56a225ef20542537f1d32bf6861eb4af3904b27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Am=C3=A9lie?= Date: Wed, 31 May 2023 16:10:17 +0200 Subject: [PATCH 4/8] Exchange List for Tuple Co-authored-by: Paul Sanders --- meilisearch/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meilisearch/client.py b/meilisearch/client.py index 64a0dfaa..dacbc6c8 100644 --- a/meilisearch/client.py +++ b/meilisearch/client.py @@ -33,7 +33,7 @@ def __init__( url: str, api_key: Optional[str] = None, timeout: Optional[int] = None, - client_agents: Optional[List[str]] = None, + client_agents: Optional[Tuple[str]] = None, ) -> None: """ Parameters From 3dc0ddd0e4acb21e6d1f31f9737d261092880545 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Am=C3=A9lie?= Date: Wed, 31 May 2023 16:10:30 +0200 Subject: [PATCH 5/8] Modify import LIst to Tuple Co-authored-by: Paul Sanders --- meilisearch/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meilisearch/config.py b/meilisearch/config.py index 89e09d14..24a2fe85 100644 --- a/meilisearch/config.py +++ b/meilisearch/config.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import List, Optional +from typing import Optional, Tuple class Config: From d40350376af6502711fbcc6179237cfffe0eb307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Am=C3=A9lie?= Date: Wed, 31 May 2023 16:10:55 +0200 Subject: [PATCH 6/8] Update meilisearch/_httprequests.py Co-authored-by: Paul Sanders --- meilisearch/_httprequests.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/meilisearch/_httprequests.py b/meilisearch/_httprequests.py index e7d54d5c..b2a12ae1 100644 --- a/meilisearch/_httprequests.py +++ b/meilisearch/_httprequests.py @@ -19,8 +19,7 @@ def __init__(self, config: Config) -> None: self.config = config self.headers = { "Authorization": f"Bearer {self.config.api_key}", - "User-Agent": qualified_version() - + (";" + ";".join(config.client_agents) if config.client_agents else ""), + "User-Agent": _build_user_agent(config.client_agents), } def send_request( From dce8fe098f3f498ab465dbd5ccc48080c422bf96 Mon Sep 17 00:00:00 2001 From: alallema Date: Wed, 31 May 2023 16:13:41 +0200 Subject: [PATCH 7/8] Adding _build_user_agent method --- meilisearch/_httprequests.py | 13 +++++++++++-- meilisearch/client.py | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/meilisearch/_httprequests.py b/meilisearch/_httprequests.py index b2a12ae1..522efb8b 100644 --- a/meilisearch/_httprequests.py +++ b/meilisearch/_httprequests.py @@ -1,7 +1,8 @@ from __future__ import annotations import json -from typing import Any, Callable, Dict, List, Optional, Union +from functools import lru_cache +from typing import Any, Callable, Dict, List, Optional, Tuple, Union import requests @@ -19,7 +20,7 @@ def __init__(self, config: Config) -> None: self.config = config self.headers = { "Authorization": f"Bearer {self.config.api_key}", - "User-Agent": _build_user_agent(config.client_agents), + "User-Agent": self._build_user_agent(config.client_agents), } def send_request( @@ -94,6 +95,14 @@ def delete( ) -> Any: return self.send_request(requests.delete, path, body) + @lru_cache(maxsize=1) + def _build_user_agent(self, client_agents: Optional[Tuple[str]] = None) -> str: + user_agent = qualified_version() + if not client_agents: + return user_agent + + return f"{user_agent};{';'.join(client_agents)}" + @staticmethod def __to_json(request: requests.Response) -> Any: if request.content == b"": diff --git a/meilisearch/client.py b/meilisearch/client.py index dacbc6c8..a926c1ae 100644 --- a/meilisearch/client.py +++ b/meilisearch/client.py @@ -8,7 +8,7 @@ import hmac import json import re -from typing import Any, Dict, List, Optional, Union +from typing import Any, Dict, List, Optional, Tuple, Union from urllib import parse from meilisearch._httprequests import HttpRequests From 95bd4bc111578303e0045a6ba7e6d7827437f3b9 Mon Sep 17 00:00:00 2001 From: Paul Sanders Date: Wed, 31 May 2023 10:35:53 -0400 Subject: [PATCH 8/8] Move _build_user_agent from a method to a function --- meilisearch/_httprequests.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/meilisearch/_httprequests.py b/meilisearch/_httprequests.py index 522efb8b..1fddb837 100644 --- a/meilisearch/_httprequests.py +++ b/meilisearch/_httprequests.py @@ -20,7 +20,7 @@ def __init__(self, config: Config) -> None: self.config = config self.headers = { "Authorization": f"Bearer {self.config.api_key}", - "User-Agent": self._build_user_agent(config.client_agents), + "User-Agent": _build_user_agent(config.client_agents), } def send_request( @@ -95,14 +95,6 @@ def delete( ) -> Any: return self.send_request(requests.delete, path, body) - @lru_cache(maxsize=1) - def _build_user_agent(self, client_agents: Optional[Tuple[str]] = None) -> str: - user_agent = qualified_version() - if not client_agents: - return user_agent - - return f"{user_agent};{';'.join(client_agents)}" - @staticmethod def __to_json(request: requests.Response) -> Any: if request.content == b"": @@ -116,3 +108,12 @@ def __validate(request: requests.Response) -> Any: return HttpRequests.__to_json(request) except requests.exceptions.HTTPError as err: raise MeilisearchApiError(str(err), request) from err + + +@lru_cache(maxsize=1) +def _build_user_agent(client_agents: Optional[Tuple[str]] = None) -> str: + user_agent = qualified_version() + if not client_agents: + return user_agent + + return f"{user_agent};{';'.join(client_agents)}"