From 3e3c77e683f62800d97c5718a86ffa9988e393a0 Mon Sep 17 00:00:00 2001 From: Roy Moore Date: Mon, 6 May 2024 16:35:48 +0000 Subject: [PATCH 1/5] feat(core): Added SrvContainer Added doctest to SrcContainer and update readme Fix issue with SrcContainer image handle Add test for SrcContainer Fixed doctest Improve SrvContainer Fix test_srv_container logs check Improve SrvContainer and update tests Updates for SrvContainer --- core/README.rst | 2 + core/testcontainers/core/generic.py | 67 +++++++++++++++++++ .../image_fixtures/python_server/Dockerfile | 3 + core/tests/test_generics.py | 27 ++++++++ 4 files changed, 99 insertions(+) create mode 100644 core/tests/image_fixtures/python_server/Dockerfile create mode 100644 core/tests/test_generics.py diff --git a/core/README.rst b/core/README.rst index bdc46db6d..b8583999d 100644 --- a/core/README.rst +++ b/core/README.rst @@ -7,6 +7,8 @@ testcontainers-core .. autoclass:: testcontainers.core.image.DockerImage +.. autoclass:: testcontainers.core.generic.SrvContainer + Using `DockerContainer` and `DockerImage` directly: .. doctest:: diff --git a/core/testcontainers/core/generic.py b/core/testcontainers/core/generic.py index 6dd635e69..d573ab1d3 100644 --- a/core/testcontainers/core/generic.py +++ b/core/testcontainers/core/generic.py @@ -11,10 +11,13 @@ # License for the specific language governing permissions and limitations # under the License. from typing import Optional +from urllib.error import HTTPError from urllib.parse import quote +from urllib.request import urlopen from testcontainers.core.container import DockerContainer from testcontainers.core.exceptions import ContainerStartException +from testcontainers.core.image import DockerImage from testcontainers.core.utils import raise_for_deprecated_parameter from testcontainers.core.waiting_utils import wait_container_is_ready @@ -79,3 +82,67 @@ def _configure(self) -> None: def _transfer_seed(self) -> None: pass + + +class SrvContainer(DockerContainer): + """ + Container for a generic server that is based on a custom image. + + Example: + + .. doctest:: + + >>> import httpx + >>> from testcontainers.core.generic import SrvContainer + >>> from testcontainers.core.waiting_utils import wait_for_logs + + >>> with SrvContainer(path="./core/tests/image_fixtures/python_server", port=9000, tag="test-srv:latest") as srv: + ... url = srv._create_connection_url() + ... response = httpx.get(f"{url}", timeout=5) + ... assert response.status_code == 200, "Response status code is not 200" + ... delay = wait_for_logs(srv, "GET / HTTP/1.1") + + + :param path: Path to the Dockerfile to build the image + :param tag: Tag for the image to be built (default: None) + """ + + def __init__(self, path: str, port: int, tag: Optional[str], image_cleanup: bool = True) -> None: + self.docker_image = DockerImage(path=path, tag=tag, clean_up=image_cleanup).build() + super().__init__(str(self.docker_image)) + self.internal_port = port + self.with_exposed_ports(self.internal_port) + + @wait_container_is_ready(HTTPError) + def _connect(self) -> None: + # noinspection HttpUrlsUsage + url = self._create_connection_url() + try: + with urlopen(url) as r: + assert b"" in r.read() + except HTTPError as e: + # 404 is expected, as the server may not have the specific endpoint we are looking for + if e.code == 404: + pass + else: + raise + + def get_api_url(self) -> str: + raise NotImplementedError + + def _create_connection_url(self) -> str: + if self._container is None: + raise ContainerStartException("container has not been started") + host = self.get_container_host_ip() + exposed_port = self.get_exposed_port(self.internal_port) + url = f"http://{host}:{exposed_port}" + return url + + def start(self) -> "SrvContainer": + super().start() + self._connect() + return self + + def stop(self, force=True, delete_volume=True) -> None: + super().stop(force, delete_volume) + self.docker_image.remove() diff --git a/core/tests/image_fixtures/python_server/Dockerfile b/core/tests/image_fixtures/python_server/Dockerfile new file mode 100644 index 000000000..f09b26ac1 --- /dev/null +++ b/core/tests/image_fixtures/python_server/Dockerfile @@ -0,0 +1,3 @@ +FROM python:3 +EXPOSE 9000 +CMD ["python", "-m", "http.server", "9000"] diff --git a/core/tests/test_generics.py b/core/tests/test_generics.py new file mode 100644 index 000000000..c6f7fde7d --- /dev/null +++ b/core/tests/test_generics.py @@ -0,0 +1,27 @@ +import pytest +from typing import Optional +from testcontainers.core.generic import SrvContainer + +import re + + +@pytest.mark.parametrize("test_image_cleanup", [True, False]) +@pytest.mark.parametrize("test_image_tag", [None, "custom-image:test"]) +def test_srv_container(test_image_tag: Optional[str], test_image_cleanup: bool, check_for_image, port=9000): + with SrvContainer( + path="./core/tests/image_fixtures/python_server", + port=port, + tag=test_image_tag, + image_cleanup=test_image_cleanup, + ) as srv: + image_short_id = srv.docker_image.short_id + image_build_logs = srv.docker_image.get_logs() + # check if dict is in any of the logs + assert {"stream": f"Step 2/3 : EXPOSE {port}"} in image_build_logs, "Image logs mismatch" + assert (port, None) in srv.ports.items(), "Port mismatch" + with pytest.raises(NotImplementedError): + srv.get_api_url() + test_url = srv._create_connection_url() + assert re.match(r"http://localhost:\d+", test_url), "Connection URL mismatch" + + check_for_image(image_short_id, test_image_cleanup) From a239b79112034b9d2239afc39968081a6b277656 Mon Sep 17 00:00:00 2001 From: Roy Moore Date: Fri, 7 Jun 2024 11:27:25 +0000 Subject: [PATCH 2/5] Rename to ServerContainer --- core/README.rst | 2 +- core/testcontainers/core/generic.py | 8 ++++---- core/tests/test_generics.py | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/README.rst b/core/README.rst index b8583999d..c294de3bd 100644 --- a/core/README.rst +++ b/core/README.rst @@ -7,7 +7,7 @@ testcontainers-core .. autoclass:: testcontainers.core.image.DockerImage -.. autoclass:: testcontainers.core.generic.SrvContainer +.. autoclass:: testcontainers.core.generic.ServerContainer Using `DockerContainer` and `DockerImage` directly: diff --git a/core/testcontainers/core/generic.py b/core/testcontainers/core/generic.py index d573ab1d3..812819f37 100644 --- a/core/testcontainers/core/generic.py +++ b/core/testcontainers/core/generic.py @@ -84,7 +84,7 @@ def _transfer_seed(self) -> None: pass -class SrvContainer(DockerContainer): +class ServerContainer(DockerContainer): """ Container for a generic server that is based on a custom image. @@ -93,10 +93,10 @@ class SrvContainer(DockerContainer): .. doctest:: >>> import httpx - >>> from testcontainers.core.generic import SrvContainer + >>> from testcontainers.core.generic import ServerContainer >>> from testcontainers.core.waiting_utils import wait_for_logs - >>> with SrvContainer(path="./core/tests/image_fixtures/python_server", port=9000, tag="test-srv:latest") as srv: + >>> with ServerContainer(path="./core/tests/image_fixtures/python_server", port=9000, tag="test-srv:latest") as srv: ... url = srv._create_connection_url() ... response = httpx.get(f"{url}", timeout=5) ... assert response.status_code == 200, "Response status code is not 200" @@ -138,7 +138,7 @@ def _create_connection_url(self) -> str: url = f"http://{host}:{exposed_port}" return url - def start(self) -> "SrvContainer": + def start(self) -> "ServerContainer": super().start() self._connect() return self diff --git a/core/tests/test_generics.py b/core/tests/test_generics.py index c6f7fde7d..1e8fe2d7b 100644 --- a/core/tests/test_generics.py +++ b/core/tests/test_generics.py @@ -1,6 +1,6 @@ import pytest from typing import Optional -from testcontainers.core.generic import SrvContainer +from testcontainers.core.generic import ServerContainer import re @@ -8,7 +8,7 @@ @pytest.mark.parametrize("test_image_cleanup", [True, False]) @pytest.mark.parametrize("test_image_tag", [None, "custom-image:test"]) def test_srv_container(test_image_tag: Optional[str], test_image_cleanup: bool, check_for_image, port=9000): - with SrvContainer( + with ServerContainer( path="./core/tests/image_fixtures/python_server", port=port, tag=test_image_tag, From 2bfc8656a83fca6dcf0cc3d77e9eea974a157262 Mon Sep 17 00:00:00 2001 From: David Ankin Date: Sun, 16 Jun 2024 08:08:06 -0400 Subject: [PATCH 3/5] de-couple SC from DockerImage + docs, warnings, prep for DockerImage refactor * fix the docs so that we can mark DbContainer as deprecated for removal * add a warning to ServerContainer just in case it is actually possible to move it out of core * use glob for modules/index.rst * clean up the table of contents so that deprecated classes do not appear on the front page * prepare to refactor the dockerimage stuff with the same class name/structure as Java (DockerImageName, ImageFromDockerfile) --- Makefile | 4 ++++ core/README.rst | 18 ++++++++++---- core/testcontainers/core/generic.py | 27 ++++++++++++--------- core/testcontainers/core/image.py | 3 ++- index.rst | 37 ++++------------------------- modules/index.rst | 11 +++++++++ 6 files changed, 51 insertions(+), 49 deletions(-) create mode 100644 modules/index.rst diff --git a/Makefile b/Makefile index b7bf2826b..4a0594095 100644 --- a/Makefile +++ b/Makefile @@ -63,6 +63,10 @@ ${TESTS_DIND} : %/tests-dind : image docs : poetry run sphinx-build -nW . docs/_build +# Target to build docs watching for changes as per https://stackoverflow.com/a/21389615 +docs-watch : + poetry run sphinx-autobuild . docs/_build # requires 'pip install sphinx-autobuild' + doctests : ${DOCTESTS} poetry run sphinx-build -b doctest . docs/_build diff --git a/core/README.rst b/core/README.rst index c294de3bd..8479efac8 100644 --- a/core/README.rst +++ b/core/README.rst @@ -1,14 +1,10 @@ -testcontainers-core +Testcontainers Core =================== :code:`testcontainers-core` is the core functionality for spinning up Docker containers in test environments. .. autoclass:: testcontainers.core.container.DockerContainer -.. autoclass:: testcontainers.core.image.DockerImage - -.. autoclass:: testcontainers.core.generic.ServerContainer - Using `DockerContainer` and `DockerImage` directly: .. doctest:: @@ -20,3 +16,15 @@ Using `DockerContainer` and `DockerImage` directly: >>> with DockerImage(path="./core/tests/image_fixtures/sample/", tag="test-sample:latest") as image: ... with DockerContainer(str(image)) as container: ... delay = wait_for_logs(container, "Test Sample Image") + +--- + +.. autoclass:: testcontainers.core.image.DockerImage + +--- + +.. autoclass:: testcontainers.core.generic.ServerContainer + +--- + +.. autoclass:: testcontainers.core.generic.DbContainer diff --git a/core/testcontainers/core/generic.py b/core/testcontainers/core/generic.py index 812819f37..2d643c24d 100644 --- a/core/testcontainers/core/generic.py +++ b/core/testcontainers/core/generic.py @@ -10,7 +10,7 @@ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. -from typing import Optional +from typing import Optional, Union from urllib.error import HTTPError from urllib.parse import quote from urllib.request import urlopen @@ -32,6 +32,8 @@ class DbContainer(DockerContainer): """ + **DEPRECATED (for removal)** + Generic database container. """ @@ -86,30 +88,34 @@ def _transfer_seed(self) -> None: class ServerContainer(DockerContainer): """ + **DEPRECATED - will be moved from core to a module (stay tuned for a final/stable import location)** + Container for a generic server that is based on a custom image. Example: - .. doctest:: + todo re-enable this test: + .. code-block:: >>> import httpx >>> from testcontainers.core.generic import ServerContainer >>> from testcontainers.core.waiting_utils import wait_for_logs + >>> from testcontainers.core.image import DockerImage - >>> with ServerContainer(path="./core/tests/image_fixtures/python_server", port=9000, tag="test-srv:latest") as srv: - ... url = srv._create_connection_url() - ... response = httpx.get(f"{url}", timeout=5) - ... assert response.status_code == 200, "Response status code is not 200" - ... delay = wait_for_logs(srv, "GET / HTTP/1.1") + >>> with DockerImage(path="./core/tests/image_fixtures/python_server", tag="test-srv:latest") as image: + >>> with ServerContainer(port=9000, image=image) as srv: + ... url = srv._create_connection_url() + ... response = httpx.get(f"{url}", timeout=5) + ... assert response.status_code == 200, "Response status code is not 200" + ... delay = wait_for_logs(srv, "GET / HTTP/1.1") :param path: Path to the Dockerfile to build the image :param tag: Tag for the image to be built (default: None) """ - def __init__(self, path: str, port: int, tag: Optional[str], image_cleanup: bool = True) -> None: - self.docker_image = DockerImage(path=path, tag=tag, clean_up=image_cleanup).build() - super().__init__(str(self.docker_image)) + def __init__(self, port: int, image: Union[str, DockerImage]) -> None: + super().__init__(str(image)) self.internal_port = port self.with_exposed_ports(self.internal_port) @@ -145,4 +151,3 @@ def start(self) -> "ServerContainer": def stop(self, force=True, delete_volume=True) -> None: super().stop(force, delete_volume) - self.docker_image.remove() diff --git a/core/testcontainers/core/image.py b/core/testcontainers/core/image.py index 399200bf8..652c41d57 100644 --- a/core/testcontainers/core/image.py +++ b/core/testcontainers/core/image.py @@ -36,10 +36,11 @@ def __init__( ) -> None: self.tag = tag self.path = path - self.id = None self._docker = DockerClient(**(docker_client_kw or {})) self.clean_up = clean_up self._kwargs = kwargs + self._image = None + self._logs = None def build(self, **kwargs) -> Self: logger.info(f"Building image from {self.path}") diff --git a/index.rst b/index.rst index 45bc33806..6e7ed596c 100644 --- a/index.rst +++ b/index.rst @@ -13,39 +13,10 @@ testcontainers-python testcontainers-python facilitates the use of Docker containers for functional and integration testing. The collection of packages currently supports the following features. .. toctree:: + :maxdepth: 1 core/README - modules/arangodb/README - modules/azurite/README - modules/cassandra/README - modules/chroma/README - modules/clickhouse/README - modules/elasticsearch/README - modules/google/README - modules/influxdb/README - modules/k3s/README - modules/kafka/README - modules/keycloak/README - modules/localstack/README - modules/memcached/README - modules/milvus/README - modules/minio/README - modules/mongodb/README - modules/mssql/README - modules/mysql/README - modules/nats/README - modules/neo4j/README - modules/nginx/README - modules/opensearch/README - modules/oracle-free/README - modules/postgres/README - modules/qdrant/README - modules/rabbitmq/README - modules/redis/README - modules/registry/README - modules/selenium/README - modules/vault/README - modules/weaviate/README + modules/index Getting Started --------------- @@ -189,4 +160,6 @@ Testcontainers is a collection of `implicit namespace packages __`. +You want to contribute a new feature or container? +Great! You can do that in six steps as outlined +`here `_. diff --git a/modules/index.rst b/modules/index.rst new file mode 100644 index 000000000..d2a67a3d4 --- /dev/null +++ b/modules/index.rst @@ -0,0 +1,11 @@ +Community Modules +================= + +.. + glob: + https://stackoverflow.com/a/44572883/4971476 + +.. toctree:: + :glob: + + */README From 4b5720856c677e17c460c609216c683a74b92ca1 Mon Sep 17 00:00:00 2001 From: David Ankin Date: Sun, 16 Jun 2024 08:30:00 -0400 Subject: [PATCH 4/5] clean up tests, warnings, linting --- core/testcontainers/core/config.py | 5 ++- core/testcontainers/core/generic.py | 5 +-- core/testcontainers/core/image.py | 7 ++-- .../image_fixtures/python_server/Dockerfile | 2 +- core/tests/test_generics.py | 40 ++++++++++++++----- poetry.lock | 8 ++-- pyproject.toml | 19 ++++----- 7 files changed, 54 insertions(+), 32 deletions(-) diff --git a/core/testcontainers/core/config.py b/core/testcontainers/core/config.py index 34b8177a2..3522b91f0 100644 --- a/core/testcontainers/core/config.py +++ b/core/testcontainers/core/config.py @@ -61,9 +61,10 @@ class TestcontainersConfiguration: @property def docker_auth_config(self): - if "DOCKER_AUTH_CONFIG" in _WARNINGS: + config = self._docker_auth_config + if config and "DOCKER_AUTH_CONFIG" in _WARNINGS: warning(_WARNINGS.pop("DOCKER_AUTH_CONFIG")) - return self._docker_auth_config + return config @docker_auth_config.setter def docker_auth_config(self, value: str): diff --git a/core/testcontainers/core/generic.py b/core/testcontainers/core/generic.py index 2d643c24d..11456a515 100644 --- a/core/testcontainers/core/generic.py +++ b/core/testcontainers/core/generic.py @@ -94,8 +94,7 @@ class ServerContainer(DockerContainer): Example: - todo re-enable this test: - .. code-block:: + .. doctest:: >>> import httpx >>> from testcontainers.core.generic import ServerContainer @@ -103,7 +102,7 @@ class ServerContainer(DockerContainer): >>> from testcontainers.core.image import DockerImage >>> with DockerImage(path="./core/tests/image_fixtures/python_server", tag="test-srv:latest") as image: - >>> with ServerContainer(port=9000, image=image) as srv: + ... with ServerContainer(port=9000, image=image) as srv: ... url = srv._create_connection_url() ... response = httpx.get(f"{url}", timeout=5) ... assert response.status_code == 200, "Response status code is not 200" diff --git a/core/testcontainers/core/image.py b/core/testcontainers/core/image.py index 652c41d57..4004e9e44 100644 --- a/core/testcontainers/core/image.py +++ b/core/testcontainers/core/image.py @@ -1,4 +1,5 @@ -from typing import TYPE_CHECKING, Optional +from os import PathLike +from typing import TYPE_CHECKING, Optional, Union from typing_extensions import Self @@ -28,7 +29,7 @@ class DockerImage: def __init__( self, - path: str, + path: Union[str, PathLike], docker_client_kw: Optional[dict] = None, tag: Optional[str] = None, clean_up: bool = True, @@ -45,7 +46,7 @@ def __init__( def build(self, **kwargs) -> Self: logger.info(f"Building image from {self.path}") docker_client = self.get_docker_client() - self._image, self._logs = docker_client.build(path=self.path, tag=self.tag, **kwargs) + self._image, self._logs = docker_client.build(path=str(self.path), tag=self.tag, **kwargs) logger.info(f"Built image {self.short_id} with tag {self.tag}") return self diff --git a/core/tests/image_fixtures/python_server/Dockerfile b/core/tests/image_fixtures/python_server/Dockerfile index f09b26ac1..844acf2b3 100644 --- a/core/tests/image_fixtures/python_server/Dockerfile +++ b/core/tests/image_fixtures/python_server/Dockerfile @@ -1,3 +1,3 @@ -FROM python:3 +FROM python:3-alpine EXPOSE 9000 CMD ["python", "-m", "http.server", "9000"] diff --git a/core/tests/test_generics.py b/core/tests/test_generics.py index 1e8fe2d7b..340ac6655 100644 --- a/core/tests/test_generics.py +++ b/core/tests/test_generics.py @@ -1,21 +1,31 @@ -import pytest +import re +from pathlib import Path from typing import Optional + +import pytest +from httpx import get + +from testcontainers.core.waiting_utils import wait_for_logs +from testcontainers.core.image import DockerImage from testcontainers.core.generic import ServerContainer -import re +TEST_DIR = Path(__file__).parent @pytest.mark.parametrize("test_image_cleanup", [True, False]) @pytest.mark.parametrize("test_image_tag", [None, "custom-image:test"]) def test_srv_container(test_image_tag: Optional[str], test_image_cleanup: bool, check_for_image, port=9000): - with ServerContainer( - path="./core/tests/image_fixtures/python_server", - port=port, - tag=test_image_tag, - image_cleanup=test_image_cleanup, - ) as srv: - image_short_id = srv.docker_image.short_id - image_build_logs = srv.docker_image.get_logs() + with ( + DockerImage( + path=TEST_DIR / "image_fixtures/python_server", + tag=test_image_tag, + clean_up=test_image_cleanup, + # + ) as docker_image, + ServerContainer(port=port, image=docker_image) as srv, + ): + image_short_id = docker_image.short_id + image_build_logs = docker_image.get_logs() # check if dict is in any of the logs assert {"stream": f"Step 2/3 : EXPOSE {port}"} in image_build_logs, "Image logs mismatch" assert (port, None) in srv.ports.items(), "Port mismatch" @@ -25,3 +35,13 @@ def test_srv_container(test_image_tag: Optional[str], test_image_cleanup: bool, assert re.match(r"http://localhost:\d+", test_url), "Connection URL mismatch" check_for_image(image_short_id, test_image_cleanup) + + +def test_like_doctest(): + with DockerImage(path=TEST_DIR / "image_fixtures/python_server", tag="test-srv:latest") as image: + with ServerContainer(port=9000, image=image) as srv: + url = srv._create_connection_url() + response = get(f"{url}", timeout=5) + assert response.status_code == 200, "Response status code is not 200" + delay = wait_for_logs(srv, "GET / HTTP/1.1") + print(delay) diff --git a/poetry.lock b/poetry.lock index 4f07c50b4..149694fbc 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1391,7 +1391,7 @@ setuptools = "*" name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = true +optional = false python-versions = ">=3.7" files = [ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, @@ -1428,7 +1428,7 @@ files = [ name = "httpcore" version = "1.0.5" description = "A minimal low-level HTTP client." -optional = true +optional = false python-versions = ">=3.8" files = [ {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, @@ -1449,7 +1449,7 @@ trio = ["trio (>=0.22.0,<0.26.0)"] name = "httpx" version = "0.27.0" description = "The next generation HTTP client." -optional = true +optional = false python-versions = ">=3.8" files = [ {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, @@ -4464,4 +4464,4 @@ weaviate = ["weaviate-client"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0" -content-hash = "fd8fb814c5b61f11a31e35b34030bb23fb19b935fe49f4941fbd58c7c8859cb1" +content-hash = "aef1253a6196bbd0219e6d4585f73e35ad34ac12c6e437d9f5cb9ac19c764675" diff --git a/pyproject.toml b/pyproject.toml index baaeb24dd..e9c7cd50b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -140,19 +140,20 @@ mypy = "1.7.1" pre-commit = "^3.6" pytest = "7.4.3" pytest-cov = "4.1.0" -sphinx = "^7.2.6" -twine = "^4.0.2" -anyio = "^4.3.0" +sphinx = "7.2.6" +twine = "4.0.2" +anyio = "4.3.0" # for tests only -psycopg2-binary = "*" -pg8000 = "*" -sqlalchemy = "*" -psycopg = "*" -cassandra-driver = "*" +psycopg2-binary = "2.9.9" +pg8000 = "1.30.5" +sqlalchemy = "2.0.28" +psycopg = "3.1.18" +cassandra-driver = "3.29.1" pytest-asyncio = "0.23.5" kafka-python-ng = "^2.2.0" -hvac = "*" +hvac = "2.1.0" pymilvus = "2.4.3" +httpx = "0.27.0" [[tool.poetry.source]] name = "PyPI" From 9fbc8d4d5e7084b93e038c2e863992152207d51b Mon Sep 17 00:00:00 2001 From: David Ankin Date: Tue, 18 Jun 2024 05:01:49 -0400 Subject: [PATCH 5/5] update lockfile --- poetry.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 7b7b5e248..891c7bd75 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4479,4 +4479,4 @@ weaviate = ["weaviate-client"] [metadata] lock-version = "2.0" python-versions = ">=3.9,<4.0" -content-hash = "aef1253a6196bbd0219e6d4585f73e35ad34ac12c6e437d9f5cb9ac19c764675" +content-hash = "043c7eea4ca72646a19a705891b26577a27149673ba38c8a6dd4732d30ce081c"