From 7ec6ac31fab737b97df267f901dfe35865cf81db Mon Sep 17 00:00:00 2001 From: dmi03 Date: Mon, 31 Aug 2026 15:36:56 +0300 Subject: [PATCH] fix(meilisearch): add Meilisearch community module --- docs/community/meilisearch.rst | 2 + docs/modules/meilisearch.md | 32 ++++ docs/modules/meilisearch_example.py | 34 ++++ mkdocs.yml | 1 + pyproject.toml | 2 + .../community/meilisearch/__init__.py | 56 +++++++ .../community/meilisearch/test_meilisearch.py | 36 ++++ uv.lock | 157 +++++++++++------- 8 files changed, 257 insertions(+), 63 deletions(-) create mode 100644 docs/community/meilisearch.rst create mode 100644 docs/modules/meilisearch.md create mode 100644 docs/modules/meilisearch_example.py create mode 100644 src/testcontainers/community/meilisearch/__init__.py create mode 100644 tests/community/meilisearch/test_meilisearch.py diff --git a/docs/community/meilisearch.rst b/docs/community/meilisearch.rst new file mode 100644 index 00000000..93a6f066 --- /dev/null +++ b/docs/community/meilisearch.rst @@ -0,0 +1,2 @@ +.. autoclass:: testcontainers.community.meilisearch.MeilisearchContainer +.. title:: testcontainers.community.meilisearch.MeilisearchContainer diff --git a/docs/modules/meilisearch.md b/docs/modules/meilisearch.md new file mode 100644 index 00000000..3032f0d4 --- /dev/null +++ b/docs/modules/meilisearch.md @@ -0,0 +1,32 @@ +# Meilisearch + +Since testcontainers-python :material-tag: v4.15.0 + +## Introduction + +The Testcontainers module for Meilisearch. + +## Adding this module to your project dependencies + +Please run the following command to add the Meilisearch module to your python dependencies: + +```bash +pip install testcontainers[meilisearch] meilisearch +``` + +## Usage example + + + +[Creating a Meilisearch container](meilisearch_example.py) + + + +## Configuration + +The Meilisearch container can be configured with the following parameters: + +- `image`: Docker image to use (default: `getmeili/meilisearch:v1.53`) +- `port`: Port to expose (default: `7700`) +- `meili_env`: Value of `MEILI_ENV` (default: `production`) +- `master_key`: Master key; a random one is generated if not provided. Must be at least 16 bytes when `meili_env` is `production` \ No newline at end of file diff --git a/docs/modules/meilisearch_example.py b/docs/modules/meilisearch_example.py new file mode 100644 index 00000000..b378cc31 --- /dev/null +++ b/docs/modules/meilisearch_example.py @@ -0,0 +1,34 @@ +from meilisearch import Client + +from testcontainers.community.meilisearch import MeilisearchContainer + + +def basic_example(): + with MeilisearchContainer() as meili: + client = Client(meili.get_connection_url(), meili.get_master_key()) + + print(f"Health: {client.health()['status']}") + + index = client.index("movies") + + documents = [ + {"id": 1, "title": "Interstellar", "genre": "sci-fi"}, + {"id": 2, "title": "Arrival", "genre": "sci-fi"}, + {"id": 3, "title": "The Grand Budapest Hotel", "genre": "comedy"}, + ] + + task = index.add_documents(documents) + client.wait_for_task(task.task_uid) + print(f"Indexed {len(documents)} documents") + + results = index.search("interstelar") + print("\nSearch results (typo-tolerant):") + for hit in results["hits"]: + print(f" {hit['id']}: {hit['title']}") + + results = index.search("", {"filter": None, "limit": 2}) + print(f"\nTotal hits with empty query: {len(results['hits'])}") + + +if __name__ == "__main__": + basic_example() diff --git a/mkdocs.yml b/mkdocs.yml index 761670cd..467ff84f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -62,6 +62,7 @@ nav: - modules/db2.md - modules/elasticsearch.md - modules/influxdb.md + - modules/meilisearch.md - modules/mongodb.md - modules/mssql.md - modules/mysql.md diff --git a/pyproject.toml b/pyproject.toml index 4ba4209e..8f04cd76 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -82,6 +82,7 @@ kafka = [] keycloak = ["python-keycloak>=6; python_version < '4.0'"] localstack = ["boto3>=1"] mailpit = ["cryptography"] +meilisearch = [] memcached = [] minio = ["minio>=7"] milvus = [] @@ -130,6 +131,7 @@ test = [ "cassandra-driver>=3.30", "kafka-python-ng>=2", "hvac>=2; python_version < '4.0'", + "meilisearch>=0.43.0", "pymilvus>=2", "paho-mqtt>=2", "sqlalchemy-cockroachdb>=2", diff --git a/src/testcontainers/community/meilisearch/__init__.py b/src/testcontainers/community/meilisearch/__init__.py new file mode 100644 index 00000000..7b0d41c8 --- /dev/null +++ b/src/testcontainers/community/meilisearch/__init__.py @@ -0,0 +1,56 @@ +import os +import secrets +from typing import Optional + +from testcontainers.core.container import DockerContainer +from testcontainers.core.wait_strategies import HttpWaitStrategy + + +class MeilisearchContainer(DockerContainer): + """ + Meilisearch container. + + Example: + + .. doctest:: + + >>> from meilisearch import Client + >>> from testcontainers.community.meilisearch import MeilisearchContainer + + >>> with MeilisearchContainer() as meili: + ... client = Client(meili.get_connection_url(), meili.get_master_key()) + ... client.health()["status"] + 'available' + """ + + def __init__( + self, + image: str = "getmeili/meilisearch:v1.53", + port: int = 7700, + meili_env: Optional[str] = None, + master_key: Optional[str] = None, + **kwargs, + ) -> None: + super().__init__(image=image, **kwargs) + + self.port = port + self.meili_env = meili_env or os.environ.get("MEILI_ENV", "production") + self.master_key = master_key or os.environ.get("MEILI_MASTER_KEY", secrets.token_urlsafe(32)) + + if self.meili_env == "production" and len(self.master_key.encode()) < 16: + raise ValueError("master key must be at least 16 bytes when MEILI_ENV=production") + + self.with_exposed_ports(self.port) + self.with_env("MEILI_ENV", self.meili_env) + self.with_env("MEILI_MASTER_KEY", self.master_key) + self.with_env("MEILI_NO_ANALYTICS", "true") + + self.waiting_for(HttpWaitStrategy(self.port, "/health")) + + def get_master_key(self) -> str: + return self.master_key + + def get_connection_url(self) -> str: + host = self.get_container_host_ip() + port = self.get_exposed_port(self.port) + return f"http://{host}:{port}" diff --git a/tests/community/meilisearch/test_meilisearch.py b/tests/community/meilisearch/test_meilisearch.py new file mode 100644 index 00000000..129d2724 --- /dev/null +++ b/tests/community/meilisearch/test_meilisearch.py @@ -0,0 +1,36 @@ +import pytest +from meilisearch import Client +from meilisearch.errors import MeilisearchApiError + +from testcontainers.community.meilisearch import MeilisearchContainer + + +def test_docker_run_meilisearch(): + with MeilisearchContainer() as meili: + client = Client(meili.get_connection_url(), meili.get_master_key()) + + assert client.health()["status"] == "available" + + index = client.index("movies") + task = index.add_documents([{"id": 1, "title": "Movie"}]) + client.wait_for_task(task.task_uid) + + assert index.search("Movie")["hits"][0]["id"] == 1 + + +def test_docker_run_meilisearch_requires_master_key(): + with MeilisearchContainer() as meili: + client = Client(meili.get_connection_url()) + + with pytest.raises(MeilisearchApiError): + client.get_keys() + + +def test_meilisearch_rejects_short_master_key_in_production(): + with pytest.raises(ValueError): + MeilisearchContainer(master_key="short") + + +def test_meilisearch_allows_short_master_key_in_development(): + container = MeilisearchContainer(meili_env="development", master_key="short") + assert container.get_master_key() == "short" diff --git a/uv.lock b/uv.lock index e6c8190a..e54d9925 100644 --- a/uv.lock +++ b/uv.lock @@ -577,6 +577,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8c/7b/1fc1c09cc0756cf25861a3be10565915953876da48bb228fb9a672b20a42/cachetools-7.1.4-py3-none-any.whl", hash = "sha256:323dc4127934744db5b54eb4924482d7edafbf9554e820d1531c2e08c0e4ef54", size = 16761, upload-time = "2026-05-21T22:40:41.845Z" }, ] +[[package]] +name = "camel-converter" +version = "5.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/fb/58f39ce79ec56e480ac86e4c6a7758d2ee7503c7e9c6f91f535dcbae81da/camel_converter-5.1.1.tar.gz", hash = "sha256:fd601b343695025e9d4ec316845d1fe6011cd2ded763397032feb1ef74855b7e", size = 50295, upload-time = "2026-08-25T01:03:26.402Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/9f/fcfe35d042eb4405d158aaba613dc712f18350c5e6ea3e2376c8a8dcbe10/camel_converter-5.1.1-py3-none-any.whl", hash = "sha256:7cf028484efd7cf0200a05812307e97e83f161af256552e8dfe5833150bab21c", size = 6968, upload-time = "2026-08-25T01:03:25.416Z" }, +] + +[package.optional-dependencies] +pydantic = [ + { name = "pydantic" }, +] + [[package]] name = "cassandra-driver" version = "3.30.0" @@ -1251,7 +1265,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -1872,7 +1886,7 @@ name = "importlib-metadata" version = "9.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "zipp" }, + { name = "zipp", marker = "python_full_version < '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a9/01/15bb152d77b21318514a96f43af312635eb2500c96b55398d020c93d86ea/importlib_metadata-9.0.0.tar.gz", hash = "sha256:a4f57ab599e6a2e3016d7595cfd72eb4661a5106e787a95bcc90c7105b831efc", size = 56405, upload-time = "2026-03-20T06:42:56.999Z" } wheels = [ @@ -2362,6 +2376,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] +[[package]] +name = "meilisearch" +version = "0.43.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "camel-converter", extra = ["pydantic"] }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/98/0c0231e407683304374c26c41f225bc80424afd1944733df0d9e4bbe8e02/meilisearch-0.43.0.tar.gz", hash = "sha256:c3f578a54070e0b545f081261fe1ee47a73ae022b17d230b949d889f0d9a7e7e", size = 33980, upload-time = "2026-07-22T08:12:29.38Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/70/cd4e0773eb4bcb22cc1f4d6b43d487f4a20fc515dbf1078e76a67e514c75/meilisearch-0.43.0-py3-none-any.whl", hash = "sha256:4226734a510211f0183c2f16af7b6077d239f0c4ec310a58ef564ae704cabe26", size = 34638, upload-time = "2026-07-22T08:12:28.325Z" }, +] + [[package]] name = "mergedeep" version = "1.3.4" @@ -3331,10 +3358,10 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, - { name = "python-dateutil" }, - { name = "pytz" }, - { name = "tzdata" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "python-dateutil", marker = "python_full_version < '3.11'" }, + { name = "pytz", marker = "python_full_version < '3.11'" }, + { name = "tzdata", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } wheels = [ @@ -3409,9 +3436,9 @@ resolution-markers = [ "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" } }, - { name = "python-dateutil" }, - { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.11'" }, + { name = "tzdata", marker = "(python_full_version >= '3.11' and sys_platform == 'emscripten') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f8/87/4341c6252d1c47b08768c3d25ac487362bf403f0313ddae4a2a26c9b1b4c/pandas-3.0.3.tar.gz", hash = "sha256:696a4a00a2a2a35d4e5deb3fc946641b96c944f02230e4f76137fe35d806c4fc", size = 4651414, upload-time = "2026-05-11T18:54:29.21Z" } wheels = [ @@ -5126,8 +5153,8 @@ name = "secretstorage" version = "3.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cryptography" }, - { name = "jeepney" }, + { name = "cryptography", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, + { name = "jeepney", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } wheels = [ @@ -5204,23 +5231,23 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "alabaster" }, - { name = "babel" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" } }, - { name = "imagesize" }, - { name = "jinja2" }, - { name = "packaging" }, - { name = "pygments" }, - { name = "requests" }, - { name = "snowballstemmer" }, - { name = "sphinxcontrib-applehelp" }, - { name = "sphinxcontrib-devhelp" }, - { name = "sphinxcontrib-htmlhelp" }, - { name = "sphinxcontrib-jsmath" }, - { name = "sphinxcontrib-qthelp" }, - { name = "sphinxcontrib-serializinghtml" }, - { name = "tomli" }, + { name = "alabaster", marker = "python_full_version < '3.11'" }, + { name = "babel", marker = "python_full_version < '3.11'" }, + { name = "colorama", marker = "python_full_version < '3.11' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "imagesize", marker = "python_full_version < '3.11'" }, + { name = "jinja2", marker = "python_full_version < '3.11'" }, + { name = "packaging", marker = "python_full_version < '3.11'" }, + { name = "pygments", marker = "python_full_version < '3.11'" }, + { name = "requests", marker = "python_full_version < '3.11'" }, + { name = "snowballstemmer", marker = "python_full_version < '3.11'" }, + { name = "sphinxcontrib-applehelp", marker = "python_full_version < '3.11'" }, + { name = "sphinxcontrib-devhelp", marker = "python_full_version < '3.11'" }, + { name = "sphinxcontrib-htmlhelp", marker = "python_full_version < '3.11'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version < '3.11'" }, + { name = "sphinxcontrib-qthelp", marker = "python_full_version < '3.11'" }, + { name = "sphinxcontrib-serializinghtml", marker = "python_full_version < '3.11'" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611, upload-time = "2024-10-13T20:27:13.93Z" } wheels = [ @@ -5237,23 +5264,23 @@ resolution-markers = [ "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "alabaster" }, - { name = "babel" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" } }, - { name = "imagesize" }, - { name = "jinja2" }, - { name = "packaging" }, - { name = "pygments" }, - { name = "requests" }, - { name = "roman-numerals" }, - { name = "snowballstemmer" }, - { name = "sphinxcontrib-applehelp" }, - { name = "sphinxcontrib-devhelp" }, - { name = "sphinxcontrib-htmlhelp" }, - { name = "sphinxcontrib-jsmath" }, - { name = "sphinxcontrib-qthelp" }, - { name = "sphinxcontrib-serializinghtml" }, + { name = "alabaster", marker = "python_full_version == '3.11.*'" }, + { name = "babel", marker = "python_full_version == '3.11.*'" }, + { name = "colorama", marker = "python_full_version == '3.11.*' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "imagesize", marker = "python_full_version == '3.11.*'" }, + { name = "jinja2", marker = "python_full_version == '3.11.*'" }, + { name = "packaging", marker = "python_full_version == '3.11.*'" }, + { name = "pygments", marker = "python_full_version == '3.11.*'" }, + { name = "requests", marker = "python_full_version == '3.11.*'" }, + { name = "roman-numerals", marker = "python_full_version == '3.11.*'" }, + { name = "snowballstemmer", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-applehelp", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-devhelp", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-htmlhelp", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-qthelp", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-serializinghtml", marker = "python_full_version == '3.11.*'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", size = 8710502, upload-time = "2025-12-04T07:45:27.343Z" } wheels = [ @@ -5279,23 +5306,23 @@ resolution-markers = [ "python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "alabaster" }, - { name = "babel" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" } }, - { name = "imagesize" }, - { name = "jinja2" }, - { name = "packaging" }, - { name = "pygments" }, - { name = "requests" }, - { name = "roman-numerals" }, - { name = "snowballstemmer" }, - { name = "sphinxcontrib-applehelp" }, - { name = "sphinxcontrib-devhelp" }, - { name = "sphinxcontrib-htmlhelp" }, - { name = "sphinxcontrib-jsmath" }, - { name = "sphinxcontrib-qthelp" }, - { name = "sphinxcontrib-serializinghtml" }, + { name = "alabaster", marker = "python_full_version >= '3.12'" }, + { name = "babel", marker = "python_full_version >= '3.12'" }, + { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "imagesize", marker = "python_full_version >= '3.12'" }, + { name = "jinja2", marker = "python_full_version >= '3.12'" }, + { name = "packaging", marker = "python_full_version >= '3.12'" }, + { name = "pygments", marker = "python_full_version >= '3.12'" }, + { name = "requests", marker = "python_full_version >= '3.12'" }, + { name = "roman-numerals", marker = "python_full_version >= '3.12'" }, + { name = "snowballstemmer", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", size = 8718324, upload-time = "2025-12-31T15:09:27.646Z" } wheels = [ @@ -5585,6 +5612,7 @@ dev = [ { name = "cassandra-driver" }, { name = "hvac", marker = "python_full_version < '4'" }, { name = "kafka-python-ng" }, + { name = "meilisearch" }, { name = "mkdocs" }, { name = "mkdocs-codeinclude-plugin" }, { name = "mkdocs-include-markdown-plugin" }, @@ -5638,6 +5666,7 @@ test = [ { name = "cassandra-driver" }, { name = "hvac", marker = "python_full_version < '4'" }, { name = "kafka-python-ng" }, + { name = "meilisearch" }, { name = "paho-mqtt" }, { name = "paramiko" }, { name = "pg8000" }, @@ -5711,7 +5740,7 @@ requires-dist = [ { name = "weaviate-client", marker = "extra == 'weaviate'", specifier = ">=4" }, { name = "wrapt" }, ] -provides-extras = ["arangodb", "aws", "azurite", "cassandra", "clickhouse", "cosmosdb", "cockroachdb", "cratedb", "db2", "elasticsearch", "generic", "test-module-import", "google", "influxdb", "k3s", "kafka", "keycloak", "localstack", "mailpit", "memcached", "minio", "milvus", "mongodb", "mqtt", "mssql", "mysql", "nats", "neo4j", "nginx", "openfga", "opensearch", "ollama", "oracle", "oracle-free", "postgres", "qdrant", "rabbitmq", "redis", "registry", "selenium", "scylla", "sftp", "toxiproxy", "valkey", "vault", "weaviate", "chroma", "trino"] +provides-extras = ["arangodb", "aws", "azurite", "cassandra", "clickhouse", "cosmosdb", "cockroachdb", "cratedb", "db2", "elasticsearch", "generic", "test-module-import", "google", "influxdb", "k3s", "kafka", "keycloak", "localstack", "mailpit", "meilisearch", "memcached", "minio", "milvus", "mongodb", "mqtt", "mssql", "mysql", "nats", "neo4j", "nginx", "openfga", "opensearch", "ollama", "oracle", "oracle-free", "postgres", "qdrant", "rabbitmq", "redis", "registry", "selenium", "scylla", "sftp", "toxiproxy", "valkey", "vault", "weaviate", "chroma", "trino"] [package.metadata.requires-dev] dev = [ @@ -5720,6 +5749,7 @@ dev = [ { name = "cassandra-driver", specifier = ">=3.30" }, { name = "hvac", marker = "python_full_version < '4'", specifier = ">=2" }, { name = "kafka-python-ng", specifier = ">=2" }, + { name = "meilisearch", specifier = ">=0.43.0" }, { name = "mkdocs", specifier = ">=1.5.3,<2.0.0" }, { name = "mkdocs-codeinclude-plugin", specifier = ">=0.2.1,<0.3.0" }, { name = "mkdocs-include-markdown-plugin", specifier = ">=7.1.8,<8.0.0" }, @@ -5771,6 +5801,7 @@ test = [ { name = "cassandra-driver", specifier = ">=3.30" }, { name = "hvac", marker = "python_full_version < '4'", specifier = ">=2" }, { name = "kafka-python-ng", specifier = ">=2" }, + { name = "meilisearch", specifier = ">=0.43.0" }, { name = "paho-mqtt", specifier = ">=2" }, { name = "paramiko", specifier = ">=4" }, { name = "pg8000", specifier = "==1.31.5" },