meilisearch-python-sdk 5.6.0__tar.gz → 5.7.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/PKG-INFO +1 -1
  2. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/_http_requests.py +22 -6
  3. meilisearch_python_sdk-5.7.0/meilisearch_python_sdk/_version.py +1 -0
  4. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/json_handler.py +16 -0
  5. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/tests/test_async_documents.py +11 -0
  6. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/tests/test_documents.py +11 -0
  7. meilisearch_python_sdk-5.7.0/tests/test_http_requests.py +39 -0
  8. meilisearch_python_sdk-5.6.0/meilisearch_python_sdk/_version.py +0 -1
  9. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/.github/FUNDING.yml +0 -0
  10. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/.github/release-draft-template.yaml +0 -0
  11. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/.github/renovate.json5 +0 -0
  12. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/.github/workflows/docs_publish.yml +0 -0
  13. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/.github/workflows/nightly_testing.yml +0 -0
  14. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/.github/workflows/pypi_publish.yml +0 -0
  15. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/.github/workflows/release-drafter.yml +0 -0
  16. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/.github/workflows/testing.yml +0 -0
  17. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/.gitignore +0 -0
  18. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/.pre-commit-config.yaml +0 -0
  19. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/CONTRIBUTING.md +0 -0
  20. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/LICENSE +0 -0
  21. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/README.md +0 -0
  22. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/assets/add_in_batches.png +0 -0
  23. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/assets/searches.png +0 -0
  24. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/codecov.yml +0 -0
  25. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/datasets/small_movies.json +0 -0
  26. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/docker-compose.https.yml +0 -0
  27. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/docker-compose.yml +0 -0
  28. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/docs/.nojekyll +0 -0
  29. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/docs/CNAME +0 -0
  30. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/docs/async_client_api.md +0 -0
  31. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/docs/async_index_api.md +0 -0
  32. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/docs/client_api.md +0 -0
  33. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/docs/css/custom.css +0 -0
  34. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/docs/decorators_api.md +0 -0
  35. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/docs/index.md +0 -0
  36. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/docs/index_api.md +0 -0
  37. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/docs/js/umami.js +0 -0
  38. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/docs/json_handler.md +0 -0
  39. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/docs/overrides/partials/footer.html +0 -0
  40. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/docs/plugins.md +0 -0
  41. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/docs/pydantic.md +0 -0
  42. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/.gitignore +0 -0
  43. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/README.md +0 -0
  44. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/__init__.py +0 -0
  45. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/add_documents_decorator.py +0 -0
  46. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/add_documents_in_batches.py +0 -0
  47. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/async_add_documents_decorator.py +0 -0
  48. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/async_add_documents_in_batches.py +0 -0
  49. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/async_documents_and_search_results.py +0 -0
  50. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/async_search_tracker.py +0 -0
  51. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/async_update_settings.py +0 -0
  52. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/documents_and_search_results.py +0 -0
  53. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/fastapi_example.py +0 -0
  54. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/orjson_example.py +0 -0
  55. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/pyproject.toml +0 -0
  56. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/requirements.txt +0 -0
  57. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/search_tracker.py +0 -0
  58. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/tests/__init__.py +0 -0
  59. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/tests/conftest.py +0 -0
  60. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/tests/test_async_examples.py +0 -0
  61. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/tests/test_examples.py +0 -0
  62. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/ujson_example.py +0 -0
  63. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/examples/update_settings.py +0 -0
  64. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/justfile +0 -0
  65. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/__init__.py +0 -0
  66. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/_batch.py +0 -0
  67. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/_client.py +0 -0
  68. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/_task.py +0 -0
  69. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/_utils.py +0 -0
  70. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/decorators.py +0 -0
  71. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/errors.py +0 -0
  72. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/index/__init__.py +0 -0
  73. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/index/_common.py +0 -0
  74. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/index/async_index.py +0 -0
  75. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/index/index.py +0 -0
  76. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/models/__init__.py +0 -0
  77. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/models/batch.py +0 -0
  78. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/models/client.py +0 -0
  79. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/models/documents.py +0 -0
  80. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/models/health.py +0 -0
  81. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/models/index.py +0 -0
  82. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/models/search.py +0 -0
  83. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/models/settings.py +0 -0
  84. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/models/task.py +0 -0
  85. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/models/version.py +0 -0
  86. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/models/webhook.py +0 -0
  87. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/plugins.py +0 -0
  88. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/py.typed +0 -0
  89. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/meilisearch_python_sdk/types.py +0 -0
  90. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/mkdocs.yaml +0 -0
  91. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/pyproject.toml +0 -0
  92. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/tests/__init__.py +0 -0
  93. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/tests/conftest.py +0 -0
  94. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/tests/test_async_client.py +0 -0
  95. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/tests/test_async_index.py +0 -0
  96. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/tests/test_async_index_plugins.py +0 -0
  97. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/tests/test_async_search.py +0 -0
  98. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/tests/test_client.py +0 -0
  99. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/tests/test_decorators.py +0 -0
  100. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/tests/test_errors.py +0 -0
  101. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/tests/test_index.py +0 -0
  102. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/tests/test_index_plugins.py +0 -0
  103. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/tests/test_search.py +0 -0
  104. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/tests/test_settings_models.py +0 -0
  105. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/tests/test_utils.py +0 -0
  106. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/tests/test_version.py +0 -0
  107. {meilisearch_python_sdk-5.6.0 → meilisearch_python_sdk-5.7.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meilisearch-python-sdk
3
- Version: 5.6.0
3
+ Version: 5.7.0
4
4
  Summary: A Python client providing both async and sync support for the Meilisearch API
5
5
  Project-URL: repository, https://github.com/sanders41/meilisearch-python-sdk
6
6
  Project-URL: homepage, https://github.com/sanders41/meilisearch-python-sdk
@@ -53,11 +53,19 @@ class AsyncHttpRequests:
53
53
  path, content=self.json_handler.dumps(body), headers=headers
54
54
  )
55
55
  else:
56
- if body and compress:
56
+ if compress:
57
57
  if content_type == "application/json":
58
- body = gzip.compress(self.json_handler.dumps(body).encode("utf-8"))
58
+ body = gzip.compress(self.json_handler.dump_bytes(body))
59
59
  else:
60
- body = gzip.compress((body).encode("utf-8"))
60
+ if isinstance(body, bytes):
61
+ data = body
62
+ elif isinstance(body, bytearray):
63
+ data = bytes(body)
64
+ else:
65
+ data = body.encode("utf-8")
66
+
67
+ body = gzip.compress(data)
68
+
61
69
  response = await http_method(path, content=body, headers=headers)
62
70
 
63
71
  response.raise_for_status()
@@ -135,11 +143,19 @@ class HttpRequests:
135
143
  elif content_type == "application/json" and not compress:
136
144
  response = http_method(path, content=self.json_handler.dumps(body), headers=headers)
137
145
  else:
138
- if body and compress:
146
+ if compress:
139
147
  if content_type == "application/json":
140
- body = gzip.compress(self.json_handler.dumps(body).encode("utf-8"))
148
+ body = gzip.compress(self.json_handler.dump_bytes(body))
141
149
  else:
142
- body = gzip.compress((body).encode("utf-8"))
150
+ if isinstance(body, bytes):
151
+ data = body
152
+ elif isinstance(body, bytearray):
153
+ data = bytes(body)
154
+ else:
155
+ data = body.encode("utf-8")
156
+
157
+ body = gzip.compress(data)
158
+
143
159
  response = http_method(path, content=body, headers=headers)
144
160
 
145
161
  response.raise_for_status()
@@ -0,0 +1 @@
1
+ VERSION = "5.7.0"
@@ -20,6 +20,10 @@ class _JsonHandler(ABC):
20
20
  @abstractmethod
21
21
  def dumps(obj: Any) -> str: ...
22
22
 
23
+ @staticmethod
24
+ @abstractmethod
25
+ def dump_bytes(obj: Any) -> bytes: ...
26
+
23
27
  @staticmethod
24
28
  @abstractmethod
25
29
  def loads(json_string: str | bytes | bytearray) -> Any: ...
@@ -41,6 +45,10 @@ class BuiltinHandler(_JsonHandler):
41
45
  def dumps(obj: Any) -> str:
42
46
  return json.dumps(obj, cls=BuiltinHandler.serializer)
43
47
 
48
+ @staticmethod
49
+ def dump_bytes(obj: Any) -> bytes:
50
+ return json.dumps(obj, cls=BuiltinHandler.serializer).encode("utf-8")
51
+
44
52
  @staticmethod
45
53
  def loads(json_string: str | bytes | bytearray) -> Any:
46
54
  return json.loads(json_string)
@@ -55,6 +63,10 @@ class OrjsonHandler(_JsonHandler):
55
63
  def dumps(obj: Any) -> str:
56
64
  return orjson.dumps(obj).decode("utf-8")
57
65
 
66
+ @staticmethod
67
+ def dump_bytes(obj: Any) -> bytes:
68
+ return orjson.dumps(obj)
69
+
58
70
  @staticmethod
59
71
  def loads(json_string: str | bytes | bytearray) -> Any:
60
72
  return orjson.loads(json_string)
@@ -69,6 +81,10 @@ class UjsonHandler(_JsonHandler):
69
81
  def dumps(obj: Any) -> str:
70
82
  return ujson.dumps(obj)
71
83
 
84
+ @staticmethod
85
+ def dump_bytes(obj: Any) -> bytes:
86
+ return ujson.dumps(obj).encode("utf-8")
87
+
72
88
  @staticmethod
73
89
  def loads(json_string: str | bytes | bytearray) -> Any:
74
90
  return ujson.loads(json_string)
@@ -455,6 +455,17 @@ async def test_add_documents_raw_file_csv(
455
455
  assert update.status == "succeeded"
456
456
 
457
457
 
458
+ @pytest.mark.parametrize("compress", (True, False))
459
+ async def test_add_documents_raw_file_csv_empty(compress, async_client, tmp_path):
460
+ index = async_client.index(str(uuid4()))
461
+ path = tmp_path / "test.csv"
462
+ path.write_text("")
463
+ with pytest.raises(MeilisearchApiError) as ex:
464
+ await index.add_documents_from_raw_file(path, compress=compress)
465
+
466
+ assert "A csv payload is missing" in str(ex.value)
467
+
468
+
458
469
  async def test_add_documents_raw_file_csv_with_custom_metadata(async_client, small_movies_csv_path):
459
470
  index = async_client.index(str(uuid4()))
460
471
  custom_metadata = "test metadata"
@@ -393,6 +393,17 @@ def test_add_documents_raw_file_csv(
393
393
  assert index.get_primary_key() == expected_primary_key
394
394
 
395
395
 
396
+ @pytest.mark.parametrize("compress", (True, False))
397
+ def test_add_documents_raw_file_csv_empty(compress, client, tmp_path):
398
+ index = client.index(str(uuid4()))
399
+ path = tmp_path / "test.csv"
400
+ path.write_text("")
401
+ with pytest.raises(MeilisearchApiError) as ex:
402
+ index.add_documents_from_raw_file(path, compress=compress)
403
+
404
+ assert "A csv payload is missing" in str(ex.value)
405
+
406
+
396
407
  def test_add_documents_raw_file_csv_with_custom_metadata(client, small_movies_csv_path):
397
408
  index = client.index(str(uuid4()))
398
409
  custom_metadata = "test metadata"
@@ -0,0 +1,39 @@
1
+ from uuid import uuid4
2
+
3
+
4
+ async def test_async_empty_bytes_compressed(async_client):
5
+ index = async_client.index(str(uuid4()))
6
+ response = await index._http_requests.post(
7
+ index._documents_url, body=b"''", content_type="text/csv", compress=True
8
+ )
9
+
10
+ assert response.status_code == 202
11
+
12
+
13
+ async def test_async_empty_byte_array_compressed(async_client):
14
+ index = async_client.index(str(uuid4()))
15
+ b = bytearray(b"''")
16
+ response = await index._http_requests.post(
17
+ index._documents_url, body=b, content_type="text/csv", compress=True
18
+ )
19
+
20
+ assert response.status_code == 202
21
+
22
+
23
+ def test_empty_bytes_compressed(client):
24
+ index = client.index(str(uuid4()))
25
+ response = index._http_requests.post(
26
+ index._documents_url, body=b"''", content_type="text/csv", compress=True
27
+ )
28
+
29
+ assert response.status_code == 202
30
+
31
+
32
+ def test_empty_byte_array_compressed(client):
33
+ index = client.index(str(uuid4()))
34
+ b = bytearray(b"''")
35
+ response = index._http_requests.post(
36
+ index._documents_url, body=b, content_type="text/csv", compress=True
37
+ )
38
+
39
+ assert response.status_code == 202
@@ -1 +0,0 @@
1
- VERSION = "5.6.0"