Skip to content

Commit 09831e7

Browse files
committed
fix(logger): defer deprecated resource warnings
- lazily init analytics v1, synonyms, and overrides to avoid init logs - add tests for no-log-on-init and warn-once behavior
1 parent e8e8e2b commit 09831e7

4 files changed

Lines changed: 88 additions & 7 deletions

File tree

‎src/typesense/client.py‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def __init__(self, config_dict: ConfigDict) -> None:
110110
self.multi_search = MultiSearch(self.api_call)
111111
self.keys = Keys(self.api_call)
112112
self.aliases = Aliases(self.api_call)
113-
self._analyticsV1 = AnalyticsV1(self.api_call)
113+
self._analyticsV1: typing.Optional[AnalyticsV1] = None
114114
self.analytics = Analytics(self.api_call)
115115
self.stemming = Stemming(self.api_call)
116116
self.curation_sets = CurationSets(self.api_call)
@@ -128,6 +128,8 @@ def __init__(self, config_dict: ConfigDict) -> None:
128128
category=None,
129129
)
130130
def analyticsV1(self) -> AnalyticsV1:
131+
if self._analyticsV1 is None:
132+
self._analyticsV1 = AnalyticsV1(self.api_call)
131133
return self._analyticsV1
132134

133135
def typed_collection(

‎src/typesense/collection.py‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,17 @@ def __init__(self, api_call: ApiCall, name: str):
6565
self.name = name
6666
self.api_call = api_call
6767
self.documents: Documents[TDoc] = Documents(api_call, name)
68-
self._overrides = Overrides(api_call, name)
69-
self._synonyms = Synonyms(api_call, name)
68+
self._overrides: typing.Optional[Overrides] = None
69+
self._synonyms: typing.Optional[Synonyms] = None
7070

7171
@property
7272
@deprecated(
7373
"Synonyms is deprecated on v30+. Use client.synonym_sets instead.",
7474
category=None,
7575
)
7676
def synonyms(self) -> Synonyms:
77+
if self._synonyms is None:
78+
self._synonyms = Synonyms(self.api_call, self.name)
7779
return self._synonyms
7880

7981
@property
@@ -82,6 +84,8 @@ def synonyms(self) -> Synonyms:
8284
category=None,
8385
)
8486
def overrides(self) -> Overrides:
87+
if self._overrides is None:
88+
self._overrides = Overrides(self.api_call, self.name)
8589
return self._overrides
8690

8791
def retrieve(self) -> CollectionSchema:

‎tests/client_test.py‎

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
"""Tests for the Client class."""
22

3+
import logging
4+
35
from tests.fixtures.document_fixtures import Companies
46
from tests.utils.object_assertions import assert_match_object, assert_object_lists_match
57
from typesense.client import Client
68
from typesense.configuration import ConfigDict
9+
import typesense.logger as typesense_logger
710

811

912
def test_client_init(fake_config_dict: ConfigDict) -> None:
@@ -27,9 +30,7 @@ def test_client_init(fake_config_dict: ConfigDict) -> None:
2730
assert fake_client.keys.keys is not None
2831
assert fake_client.aliases
2932
assert fake_client.aliases.aliases is not None
30-
assert fake_client.analyticsV1
31-
assert fake_client.analyticsV1.rules
32-
assert fake_client.analyticsV1.rules.rules is not None
33+
assert fake_client._analyticsV1 is None
3334
assert fake_client.operations
3435
assert fake_client.debug
3536

@@ -72,3 +73,35 @@ def test_retrieve_collection_actual_no_name(
7273
collection = actual_client.typed_collection(model=Companies)
7374

7475
assert collection is not None
76+
77+
78+
def test_analytics_v1_deprecation_not_logged_on_init(
79+
fake_config_dict: ConfigDict,
80+
caplog,
81+
) -> None:
82+
"""Test that analytics v1 deprecation is not logged on client init."""
83+
typesense_logger._deprecation_warnings.clear()
84+
caplog.set_level(logging.WARNING, logger="typesense")
85+
86+
Client(fake_config_dict)
87+
88+
assert "Deprecation warning:" not in caplog.text
89+
90+
91+
def test_analytics_v1_deprecation_logged_once(
92+
fake_config_dict: ConfigDict,
93+
caplog,
94+
) -> None:
95+
"""Test that analytics v1 deprecation is logged once when used."""
96+
typesense_logger._deprecation_warnings.clear()
97+
caplog.set_level(logging.WARNING, logger="typesense")
98+
99+
client = Client(fake_config_dict)
100+
_ = client.analyticsV1
101+
_ = client.analyticsV1
102+
103+
message = (
104+
"Deprecation warning: AnalyticsRulesV1 is deprecated on v30+. "
105+
"Use client.analytics instead."
106+
)
107+
assert caplog.text.count(message) == 1

‎tests/collection_test.py‎

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from __future__ import annotations
44

5+
import logging
56
import time
67

78
import requests_mock
@@ -15,6 +16,7 @@
1516
from typesense.collection import Collection
1617
from typesense.collections import Collections
1718
from typesense.types.collection import CollectionSchema
19+
import typesense.logger as typesense_logger
1820

1921

2022
def test_init(fake_api_call: ApiCall) -> None:
@@ -31,7 +33,8 @@ def test_init(fake_api_call: ApiCall) -> None:
3133
collection.api_call.config.nearest_node,
3234
fake_api_call.config.nearest_node,
3335
)
34-
assert collection.overrides.collection_name == "companies"
36+
assert collection._overrides is None
37+
assert collection._synonyms is None
3538
assert collection._endpoint_path == "/collections/companies" # noqa: WPS437
3639

3740

@@ -252,3 +255,42 @@ def test_actual_update(
252255
}
253256

254257
assert_to_contain_object(response.get("fields")[0], expected.get("fields")[0])
258+
259+
260+
def test_deprecated_resources_not_logged_on_init(
261+
fake_api_call: ApiCall,
262+
caplog,
263+
) -> None:
264+
"""Test that deprecated resources are not logged on collection init."""
265+
typesense_logger._deprecation_warnings.clear()
266+
caplog.set_level(logging.WARNING, logger="typesense")
267+
268+
Collection(fake_api_call, "companies")
269+
270+
assert "Deprecation warning:" not in caplog.text
271+
272+
273+
def test_deprecated_resources_logged_once_on_use(
274+
fake_api_call: ApiCall,
275+
caplog,
276+
) -> None:
277+
"""Test that deprecated resources are logged once when used."""
278+
typesense_logger._deprecation_warnings.clear()
279+
caplog.set_level(logging.WARNING, logger="typesense")
280+
281+
collection = Collection(fake_api_call, "companies")
282+
_ = collection.synonyms
283+
_ = collection.synonyms
284+
_ = collection.overrides
285+
_ = collection.overrides
286+
287+
synonyms_message = (
288+
"Deprecation warning: The synonyms API (collections/{collection}/synonyms) "
289+
"is deprecated is removed on v30+. Use synonym sets (synonym_sets) instead."
290+
)
291+
overrides_message = (
292+
"Deprecation warning: Overrides is deprecated on v30+. "
293+
"Use client.curation_sets instead."
294+
)
295+
assert caplog.text.count(synonyms_message) == 1
296+
assert caplog.text.count(overrides_message) == 1

0 commit comments

Comments
 (0)