meilisearch-python-sdk 5.5.1__tar.gz → 5.5.2__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 (106) hide show
  1. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/.pre-commit-config.yaml +1 -1
  2. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/PKG-INFO +1 -1
  3. meilisearch_python_sdk-5.5.2/meilisearch_python_sdk/_version.py +1 -0
  4. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/index/_common.py +8 -4
  5. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/index/async_index.py +95 -111
  6. meilisearch_python_sdk-5.5.1/meilisearch_python_sdk/_version.py +0 -1
  7. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/.github/FUNDING.yml +0 -0
  8. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/.github/release-draft-template.yaml +0 -0
  9. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/.github/renovate.json5 +0 -0
  10. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/.github/workflows/docs_publish.yml +0 -0
  11. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/.github/workflows/nightly_testing.yml +0 -0
  12. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/.github/workflows/pypi_publish.yml +0 -0
  13. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/.github/workflows/release-drafter.yml +0 -0
  14. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/.github/workflows/testing.yml +0 -0
  15. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/.gitignore +0 -0
  16. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/CONTRIBUTING.md +0 -0
  17. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/LICENSE +0 -0
  18. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/README.md +0 -0
  19. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/assets/add_in_batches.png +0 -0
  20. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/assets/searches.png +0 -0
  21. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/codecov.yml +0 -0
  22. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/datasets/small_movies.json +0 -0
  23. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/docker-compose.https.yml +0 -0
  24. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/docker-compose.yml +0 -0
  25. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/docs/.nojekyll +0 -0
  26. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/docs/CNAME +0 -0
  27. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/docs/async_client_api.md +0 -0
  28. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/docs/async_index_api.md +0 -0
  29. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/docs/client_api.md +0 -0
  30. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/docs/css/custom.css +0 -0
  31. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/docs/decorators_api.md +0 -0
  32. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/docs/index.md +0 -0
  33. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/docs/index_api.md +0 -0
  34. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/docs/js/umami.js +0 -0
  35. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/docs/json_handler.md +0 -0
  36. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/docs/overrides/partials/footer.html +0 -0
  37. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/docs/plugins.md +0 -0
  38. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/docs/pydantic.md +0 -0
  39. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/.gitignore +0 -0
  40. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/README.md +0 -0
  41. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/__init__.py +0 -0
  42. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/add_documents_decorator.py +0 -0
  43. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/add_documents_in_batches.py +0 -0
  44. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/async_add_documents_decorator.py +0 -0
  45. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/async_add_documents_in_batches.py +0 -0
  46. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/async_documents_and_search_results.py +0 -0
  47. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/async_search_tracker.py +0 -0
  48. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/async_update_settings.py +0 -0
  49. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/documents_and_search_results.py +0 -0
  50. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/fastapi_example.py +0 -0
  51. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/orjson_example.py +0 -0
  52. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/pyproject.toml +0 -0
  53. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/requirements.txt +0 -0
  54. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/search_tracker.py +0 -0
  55. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/tests/__init__.py +0 -0
  56. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/tests/conftest.py +0 -0
  57. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/tests/test_async_examples.py +0 -0
  58. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/tests/test_examples.py +0 -0
  59. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/ujson_example.py +0 -0
  60. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/examples/update_settings.py +0 -0
  61. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/justfile +0 -0
  62. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/__init__.py +0 -0
  63. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/_batch.py +0 -0
  64. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/_client.py +0 -0
  65. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/_http_requests.py +0 -0
  66. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/_task.py +0 -0
  67. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/_utils.py +0 -0
  68. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/decorators.py +0 -0
  69. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/errors.py +0 -0
  70. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/index/__init__.py +0 -0
  71. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/index/index.py +0 -0
  72. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/json_handler.py +0 -0
  73. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/models/__init__.py +0 -0
  74. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/models/batch.py +0 -0
  75. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/models/client.py +0 -0
  76. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/models/documents.py +0 -0
  77. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/models/health.py +0 -0
  78. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/models/index.py +0 -0
  79. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/models/search.py +0 -0
  80. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/models/settings.py +0 -0
  81. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/models/task.py +0 -0
  82. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/models/version.py +0 -0
  83. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/models/webhook.py +0 -0
  84. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/plugins.py +0 -0
  85. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/py.typed +0 -0
  86. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/meilisearch_python_sdk/types.py +0 -0
  87. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/mkdocs.yaml +0 -0
  88. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/pyproject.toml +0 -0
  89. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/tests/__init__.py +0 -0
  90. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/tests/conftest.py +0 -0
  91. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/tests/test_async_client.py +0 -0
  92. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/tests/test_async_documents.py +0 -0
  93. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/tests/test_async_index.py +0 -0
  94. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/tests/test_async_index_plugins.py +0 -0
  95. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/tests/test_async_search.py +0 -0
  96. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/tests/test_client.py +0 -0
  97. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/tests/test_decorators.py +0 -0
  98. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/tests/test_documents.py +0 -0
  99. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/tests/test_errors.py +0 -0
  100. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/tests/test_index.py +0 -0
  101. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/tests/test_index_plugins.py +0 -0
  102. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/tests/test_search.py +0 -0
  103. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/tests/test_settings_models.py +0 -0
  104. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/tests/test_utils.py +0 -0
  105. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/tests/test_version.py +0 -0
  106. {meilisearch_python_sdk-5.5.1 → meilisearch_python_sdk-5.5.2}/uv.lock +0 -0
@@ -14,7 +14,7 @@ repos:
14
14
  - id: mypy
15
15
  additional_dependencies: [pydantic, orjson, types-aiofiles, types-ujson]
16
16
  - repo: https://github.com/astral-sh/ruff-pre-commit
17
- rev: v0.14.7
17
+ rev: v0.14.8
18
18
  hooks:
19
19
  - id: ruff-check
20
20
  args: [--fix, --exit-non-zero-on-fix]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meilisearch-python-sdk
3
- Version: 5.5.1
3
+ Version: 5.5.2
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
@@ -0,0 +1 @@
1
+ VERSION = "5.5.2"
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from collections.abc import Generator, MutableMapping, Sequence
4
4
  from datetime import datetime
5
+ from itertools import chain, islice
5
6
  from pathlib import Path
6
7
  from typing import TYPE_CHECKING, Any, Literal
7
8
  from urllib.parse import urlencode
@@ -81,13 +82,16 @@ class BaseIndex:
81
82
  def batch(
82
83
  documents: Sequence[MutableMapping], batch_size: int
83
84
  ) -> Generator[Sequence[MutableMapping], None, None]:
84
- total_len = len(documents)
85
- for i in range(0, total_len, batch_size):
86
- yield documents[i : i + batch_size]
85
+ iterator = iter(documents)
86
+ while True:
87
+ batch_slice = list(islice(iterator, batch_size))
88
+ if not batch_slice:
89
+ break
90
+ yield batch_slice
87
91
 
88
92
 
89
93
  def combine_documents(documents: list[list[Any]]) -> list[Any]:
90
- return [x for y in documents for x in y]
94
+ return list(chain.from_iterable(documents))
91
95
 
92
96
 
93
97
  def plugin_has_method(
@@ -1598,27 +1598,24 @@ class AsyncIndex(BaseIndex):
1598
1598
  >>> await index.add_documents_in_batches(documents)
1599
1599
  """
1600
1600
  if concurrency_limit:
1601
- async with asyncio.Semaphore(concurrency_limit):
1602
- if not use_task_groups():
1603
- batches = [
1604
- self.add_documents(
1605
- x, primary_key, custom_metadata=custom_metadata, compress=compress
1606
- )
1607
- for x in batch(documents, batch_size)
1608
- ]
1609
- return await asyncio.gather(*batches)
1601
+ semaphore = asyncio.Semaphore(concurrency_limit)
1610
1602
 
1611
- async with asyncio.TaskGroup() as tg: # type: ignore[attr-defined]
1612
- tasks = [
1613
- tg.create_task(
1614
- self.add_documents(
1615
- x, primary_key, custom_metadata=custom_metadata, compress=compress
1616
- )
1617
- )
1618
- for x in batch(documents, batch_size)
1619
- ]
1603
+ async def add_batch_with_limit(batch_data: Sequence[JsonMapping]) -> TaskInfo:
1604
+ async with semaphore:
1605
+ return await self.add_documents(
1606
+ batch_data, primary_key, custom_metadata=custom_metadata, compress=compress
1607
+ )
1608
+
1609
+ if not use_task_groups():
1610
+ batches = [add_batch_with_limit(data) for data in batch(documents, batch_size)]
1611
+ return await asyncio.gather(*batches)
1612
+
1613
+ async with asyncio.TaskGroup() as tg: # type: ignore[attr-defined]
1614
+ tasks = [
1615
+ tg.create_task(add_batch_with_limit(x)) for x in batch(documents, batch_size)
1616
+ ]
1620
1617
 
1621
- return [x.result() for x in tasks]
1618
+ return [x.result() for x in tasks]
1622
1619
 
1623
1620
  if not use_task_groups():
1624
1621
  batches = [
@@ -1712,65 +1709,54 @@ class AsyncIndex(BaseIndex):
1712
1709
  return [response]
1713
1710
 
1714
1711
  if concurrency_limit:
1715
- async with asyncio.Semaphore(concurrency_limit):
1716
- if not use_task_groups():
1717
- add_documents = []
1718
- for path in directory.iterdir():
1719
- if path.suffix == f".{document_type}":
1720
- documents = await _async_load_documents_from_file(
1721
- path, csv_delimiter, json_handler=self._json_handler
1722
- )
1723
- add_documents.append(
1724
- self.add_documents(
1725
- documents,
1726
- primary_key,
1727
- custom_metadata=custom_metadata,
1728
- compress=compress,
1729
- )
1730
- )
1712
+ semaphore = asyncio.Semaphore(concurrency_limit)
1731
1713
 
1732
- raise_on_no_documents(add_documents, document_type, directory_path)
1714
+ async def add_docs_with_limit(docs: Sequence[JsonMapping]) -> TaskInfo:
1715
+ async with semaphore:
1716
+ return await self.add_documents(
1717
+ docs,
1718
+ primary_key,
1719
+ custom_metadata=custom_metadata,
1720
+ compress=compress,
1721
+ )
1733
1722
 
1734
- if len(add_documents) > 1:
1735
- # Send the first document on its own before starting the gather. Otherwise Meilisearch
1736
- # returns an error because it thinks all entries are trying to create the same index.
1737
- first_response = [await add_documents.pop()]
1723
+ if not use_task_groups():
1724
+ add_documents = []
1725
+ for path in directory.iterdir():
1726
+ if path.suffix == f".{document_type}":
1727
+ documents = await _async_load_documents_from_file(
1728
+ path, csv_delimiter, json_handler=self._json_handler
1729
+ )
1730
+ add_documents.append(add_docs_with_limit(documents))
1738
1731
 
1739
- responses = await asyncio.gather(*add_documents)
1740
- responses = [*first_response, *responses]
1741
- else:
1742
- responses = [await add_documents[0]]
1732
+ raise_on_no_documents(add_documents, document_type, directory_path)
1743
1733
 
1744
- return responses
1734
+ if len(add_documents) > 1:
1735
+ # Send the first document on its own before starting the gather. Otherwise Meilisearch
1736
+ # returns an error because it thinks all entries are trying to create the same index.
1737
+ first_response = [await add_documents.pop(0)]
1745
1738
 
1746
- async with asyncio.TaskGroup() as tg: # type: ignore[attr-defined]
1747
- tasks = []
1748
- all_results = []
1749
- for i, path in enumerate(directory.iterdir()):
1750
- if path.suffix == f".{document_type}":
1751
- documents = await _async_load_documents_from_file(
1752
- path, csv_delimiter, json_handler=self._json_handler
1753
- )
1754
- if i == 0:
1755
- all_results = [
1756
- await self.add_documents(
1757
- documents,
1758
- primary_key=primary_key,
1759
- custom_metadata=custom_metadata,
1760
- compress=compress,
1761
- )
1762
- ]
1763
- else:
1764
- tasks.append(
1765
- tg.create_task(
1766
- self.add_documents(
1767
- documents,
1768
- primary_key,
1769
- custom_metadata=custom_metadata,
1770
- compress=compress,
1771
- )
1772
- )
1773
- )
1739
+ responses = await asyncio.gather(*add_documents)
1740
+ responses = [*first_response, *responses]
1741
+ else:
1742
+ responses = [await add_documents[0]]
1743
+
1744
+ return responses
1745
+
1746
+ async with asyncio.TaskGroup() as tg: # type: ignore[attr-defined]
1747
+ tasks = []
1748
+ all_results = []
1749
+ for i, path in enumerate(directory.iterdir()):
1750
+ if path.suffix == f".{document_type}":
1751
+ documents = await _async_load_documents_from_file(
1752
+ path, csv_delimiter, json_handler=self._json_handler
1753
+ )
1754
+ if i == 0:
1755
+ all_results = [await add_docs_with_limit(documents)]
1756
+ else:
1757
+ tasks.append(tg.create_task(add_docs_with_limit(documents)))
1758
+
1759
+ return [*all_results, *[x.result() for x in tasks]]
1774
1760
 
1775
1761
  if not use_task_groups():
1776
1762
  add_documents = []
@@ -2370,29 +2356,26 @@ class AsyncIndex(BaseIndex):
2370
2356
  >>> await index.update_documents_in_batches(documents)
2371
2357
  """
2372
2358
  if concurrency_limit:
2373
- async with asyncio.Semaphore(concurrency_limit):
2374
- if not use_task_groups():
2375
- batches = [
2376
- self.update_documents(
2377
- x,
2378
- primary_key=primary_key,
2379
- custom_metadata=custom_metadata,
2380
- compress=compress,
2381
- )
2382
- for x in batch(documents, batch_size)
2383
- ]
2384
- return await asyncio.gather(*batches)
2359
+ semaphore = asyncio.Semaphore(concurrency_limit)
2385
2360
 
2386
- async with asyncio.TaskGroup() as tg: # type: ignore[attr-defined]
2387
- tasks = [
2388
- tg.create_task(
2389
- self.update_documents(
2390
- x, primary_key, custom_metadata=custom_metadata, compress=compress
2391
- )
2392
- )
2393
- for x in batch(documents, batch_size)
2394
- ]
2395
- return [x.result() for x in tasks]
2361
+ async def update_batch_with_limit(batch_data: Sequence[JsonMapping]) -> TaskInfo:
2362
+ async with semaphore:
2363
+ return await self.update_documents(
2364
+ batch_data,
2365
+ primary_key=primary_key,
2366
+ custom_metadata=custom_metadata,
2367
+ compress=compress,
2368
+ )
2369
+
2370
+ if not use_task_groups():
2371
+ batches = [update_batch_with_limit(x) for x in batch(documents, batch_size)]
2372
+ return await asyncio.gather(*batches)
2373
+
2374
+ async with asyncio.TaskGroup() as tg: # type: ignore[attr-defined]
2375
+ tasks = [
2376
+ tg.create_task(update_batch_with_limit(x)) for x in batch(documents, batch_size)
2377
+ ]
2378
+ return [x.result() for x in tasks]
2396
2379
 
2397
2380
  if not use_task_groups():
2398
2381
  batches = [
@@ -3138,23 +3121,24 @@ class AsyncIndex(BaseIndex):
3138
3121
  >>> )
3139
3122
  """
3140
3123
  if concurrency_limit:
3141
- async with asyncio.Semaphore(concurrency_limit):
3142
- if not use_task_groups():
3143
- tasks = [
3144
- self.delete_documents_by_filter(filter, custom_metadata=custom_metadata)
3145
- for filter in filters
3146
- ]
3147
- return await asyncio.gather(*tasks)
3148
-
3149
- async with asyncio.TaskGroup() as tg: # type: ignore[attr-defined]
3150
- tg_tasks = [
3151
- tg.create_task(
3152
- self.delete_documents_by_filter(filter, custom_metadata=custom_metadata)
3153
- )
3154
- for filter in filters
3155
- ]
3124
+ semaphore = asyncio.Semaphore(concurrency_limit)
3125
+
3126
+ async def delete_with_limit(
3127
+ filter_value: str | list[str | list[str]],
3128
+ ) -> TaskInfo:
3129
+ async with semaphore:
3130
+ return await self.delete_documents_by_filter(
3131
+ filter_value, custom_metadata=custom_metadata
3132
+ )
3133
+
3134
+ if not use_task_groups():
3135
+ tasks = [delete_with_limit(filter) for filter in filters]
3136
+ return await asyncio.gather(*tasks)
3137
+
3138
+ async with asyncio.TaskGroup() as tg: # type: ignore[attr-defined]
3139
+ tg_tasks = [tg.create_task(delete_with_limit(filter)) for filter in filters]
3156
3140
 
3157
- return [x.result() for x in tg_tasks]
3141
+ return [x.result() for x in tg_tasks]
3158
3142
 
3159
3143
  if not use_task_groups():
3160
3144
  tasks = [
@@ -1 +0,0 @@
1
- VERSION = "5.5.1"