From 4d2b49e731c47a7e9b3675ef9eb4f7e637bbb219 Mon Sep 17 00:00:00 2001 From: Florian Polster Date: Sun, 12 Mar 2023 12:45:49 +0100 Subject: [PATCH 1/9] Add clickhouse-connect dependency --- clickhouse/setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/clickhouse/setup.py b/clickhouse/setup.py index 004a151c7..ec8c48a7d 100644 --- a/clickhouse/setup.py +++ b/clickhouse/setup.py @@ -12,6 +12,7 @@ url="https://github.com/testcontainers/testcontainers-python", install_requires=[ "testcontainers-core", + "clickhouse-connect", "clickhouse-driver", ], python_requires=">=3.7", From c9a2dd0cae49f23b0a238d117fa995fe8a05696c Mon Sep 17 00:00:00 2001 From: Florian Polster Date: Sun, 12 Mar 2023 12:55:08 +0100 Subject: [PATCH 2/9] Enable using HTTP port --- .../testcontainers/clickhouse/__init__.py | 56 ++++++++++--------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/clickhouse/testcontainers/clickhouse/__init__.py b/clickhouse/testcontainers/clickhouse/__init__.py index b6ffce609..ca6e76599 100644 --- a/clickhouse/testcontainers/clickhouse/__init__.py +++ b/clickhouse/testcontainers/clickhouse/__init__.py @@ -9,12 +9,11 @@ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations -# under the License. -import os -from typing import Optional +# under the License.import os +import clickhouse_connect import clickhouse_driver -from clickhouse_driver.errors import Error +from clickhouse_connect.driver.exceptions import Error from testcontainers.core.generic import DbContainer from testcontainers.core.waiting_utils import wait_container_is_ready @@ -24,20 +23,20 @@ class ClickHouseContainer(DbContainer): """ ClickHouse database container. - Example: + Example + ------- + The example spins up a ClickHouse database and connects to it + using the :code:`clickhouse-driver`. - The example spins up a ClickHouse database and connects to it using the - :code:`clickhouse-driver`. + .. doctest:: - .. doctest:: + >>> import clickhouse_driver + >>> from testcontainers.clickhouse import ClickHouseContainer - >>> import clickhouse_driver - >>> from testcontainers.clickhouse import ClickHouseContainer - - >>> with ClickHouseContainer("clickhouse/clickhouse-server:21.8") as clickhouse: - ... client = clickhouse_driver.Client.from_url(clickhouse.get_connection_url()) - ... client.execute("select 'working'") - [('working',)] + >>> with ClickHouseContainer("clickhouse/clickhouse-server:21.8") as clickhouse: + ... client = clickhouse_driver.Client.from_url(clickhouse.get_connection_url()) + ... client.execute("select 'working'") + [('working',)] """ CLICKHOUSE_USER = os.environ.get("CLICKHOUSE_USER", "test") @@ -46,12 +45,12 @@ class ClickHouseContainer(DbContainer): def __init__( self, - image: str = "clickhouse/clickhouse-server:latest", - port: int = 9000, - user: Optional[str] = None, - password: Optional[str] = None, - dbname: Optional[str] = None - ) -> None: + image="clickhouse/clickhouse-server:latest", + port=9000, + user=None, + password=None, + dbname=None + ): super().__init__(image=image) self.CLICKHOUSE_USER = user or self.CLICKHOUSE_USER @@ -61,16 +60,21 @@ def __init__( self.with_exposed_ports(self.port_to_expose) @wait_container_is_ready(Error, EOFError) - def _connect(self) -> None: - with clickhouse_driver.Client.from_url(self.get_connection_url()) as client: - client.execute("SELECT version()") + def _connect(self): + if self.port_to_expose == 8123: + with clickhouse_connect.get_client(dsn=self.get_connection_url()) as client: + client.command("SELECT version()") + else: + with clickhouse_driver.Client.from_url(self.get_connection_url()) as client: + client.execute("SELECT version()") + - def _configure(self) -> None: + def _configure(self): self.with_env("CLICKHOUSE_USER", self.CLICKHOUSE_USER) self.with_env("CLICKHOUSE_PASSWORD", self.CLICKHOUSE_PASSWORD) self.with_env("CLICKHOUSE_DB", self.CLICKHOUSE_DB) - def get_connection_url(self, host: Optional[str] = None) -> str: + def get_connection_url(self, host=None): return self._create_connection_url( dialect="clickhouse", username=self.CLICKHOUSE_USER, From 9a3c21787f7667eed2648598834b744d74148518 Mon Sep 17 00:00:00 2001 From: Florian Polster Date: Sun, 12 Mar 2023 12:58:16 +0100 Subject: [PATCH 3/9] Adjust doctest --- clickhouse/testcontainers/clickhouse/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/clickhouse/testcontainers/clickhouse/__init__.py b/clickhouse/testcontainers/clickhouse/__init__.py index ca6e76599..1078a1c20 100644 --- a/clickhouse/testcontainers/clickhouse/__init__.py +++ b/clickhouse/testcontainers/clickhouse/__init__.py @@ -30,13 +30,19 @@ class ClickHouseContainer(DbContainer): .. doctest:: - >>> import clickhouse_driver >>> from testcontainers.clickhouse import ClickHouseContainer + >>> import clickhouse_driver >>> with ClickHouseContainer("clickhouse/clickhouse-server:21.8") as clickhouse: ... client = clickhouse_driver.Client.from_url(clickhouse.get_connection_url()) ... client.execute("select 'working'") [('working',)] + + >>> import clickhouse_connect + >>> with ClickHouseContainer("clickhouse/clickhouse-server:21.8", port=8123) as clickhouse: + ... client = clickhouse_connect.get_client(dsn=self.get_connection_url()) + ... client.command("select 'working'") + [('working',)] """ CLICKHOUSE_USER = os.environ.get("CLICKHOUSE_USER", "test") From de8502a9025569874e085627ff0762dfbeccc24c Mon Sep 17 00:00:00 2001 From: Florian Polster Date: Sun, 12 Mar 2023 12:59:28 +0100 Subject: [PATCH 4/9] Repair import --- clickhouse/testcontainers/clickhouse/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/clickhouse/testcontainers/clickhouse/__init__.py b/clickhouse/testcontainers/clickhouse/__init__.py index 1078a1c20..01826318b 100644 --- a/clickhouse/testcontainers/clickhouse/__init__.py +++ b/clickhouse/testcontainers/clickhouse/__init__.py @@ -9,7 +9,8 @@ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations -# under the License.import os +# under the License. +import os import clickhouse_connect import clickhouse_driver From 564ce66182a288375fb1c50ad8534b52523ae112 Mon Sep 17 00:00:00 2001 From: Florian Polster Date: Sun, 12 Mar 2023 13:01:18 +0100 Subject: [PATCH 5/9] Handle all connect errors --- clickhouse/testcontainers/clickhouse/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clickhouse/testcontainers/clickhouse/__init__.py b/clickhouse/testcontainers/clickhouse/__init__.py index 01826318b..2aead3547 100644 --- a/clickhouse/testcontainers/clickhouse/__init__.py +++ b/clickhouse/testcontainers/clickhouse/__init__.py @@ -13,8 +13,9 @@ import os import clickhouse_connect +from clickhouse_connect.driver.exceptions import Error as ClickhouseConnectError import clickhouse_driver -from clickhouse_connect.driver.exceptions import Error +from clickhouse_driver.errors import Error as ClickhouseDriverError from testcontainers.core.generic import DbContainer from testcontainers.core.waiting_utils import wait_container_is_ready @@ -66,7 +67,7 @@ def __init__( self.port_to_expose = port self.with_exposed_ports(self.port_to_expose) - @wait_container_is_ready(Error, EOFError) + @wait_container_is_ready(ClickhouseDriverError, ClickhouseConnectError, EOFError) def _connect(self): if self.port_to_expose == 8123: with clickhouse_connect.get_client(dsn=self.get_connection_url()) as client: From cc4e563aac7bdf9555bccbae289b450c0d791c3f Mon Sep 17 00:00:00 2001 From: Florian Polster Date: Sun, 12 Mar 2023 13:02:55 +0100 Subject: [PATCH 6/9] Reformat doctest --- .../testcontainers/clickhouse/__init__.py | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/clickhouse/testcontainers/clickhouse/__init__.py b/clickhouse/testcontainers/clickhouse/__init__.py index 2aead3547..93288bc9a 100644 --- a/clickhouse/testcontainers/clickhouse/__init__.py +++ b/clickhouse/testcontainers/clickhouse/__init__.py @@ -25,26 +25,25 @@ class ClickHouseContainer(DbContainer): """ ClickHouse database container. - Example - ------- - The example spins up a ClickHouse database and connects to it - using the :code:`clickhouse-driver`. - - .. doctest:: - - >>> from testcontainers.clickhouse import ClickHouseContainer - - >>> import clickhouse_driver - >>> with ClickHouseContainer("clickhouse/clickhouse-server:21.8") as clickhouse: - ... client = clickhouse_driver.Client.from_url(clickhouse.get_connection_url()) - ... client.execute("select 'working'") - [('working',)] - - >>> import clickhouse_connect - >>> with ClickHouseContainer("clickhouse/clickhouse-server:21.8", port=8123) as clickhouse: - ... client = clickhouse_connect.get_client(dsn=self.get_connection_url()) - ... client.command("select 'working'") - [('working',)] + Example: + The example spins up a ClickHouse database and connects to it + using the :code:`clickhouse-driver`. + + .. doctest:: + + >>> from testcontainers.clickhouse import ClickHouseContainer + + >>> import clickhouse_driver + >>> with ClickHouseContainer("clickhouse/clickhouse-server:21.8") as clickhouse: + ... client = clickhouse_driver.Client.from_url(clickhouse.get_connection_url()) + ... client.execute("select 'working'") + [('working',)] + + >>> import clickhouse_connect + >>> with ClickHouseContainer("clickhouse/clickhouse-server:21.8", port=8123) as clickhouse: + ... client = clickhouse_connect.get_client(dsn=self.get_connection_url()) + ... client.command("select 'working'") + [('working',)] """ CLICKHOUSE_USER = os.environ.get("CLICKHOUSE_USER", "test") From 8682063ee4aa9139fb07b73a37fb6b023e06a351 Mon Sep 17 00:00:00 2001 From: Florian Polster Date: Sun, 12 Mar 2023 13:05:04 +0100 Subject: [PATCH 7/9] Revert some accidental changes --- .../testcontainers/clickhouse/__init__.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/clickhouse/testcontainers/clickhouse/__init__.py b/clickhouse/testcontainers/clickhouse/__init__.py index 93288bc9a..495e98462 100644 --- a/clickhouse/testcontainers/clickhouse/__init__.py +++ b/clickhouse/testcontainers/clickhouse/__init__.py @@ -11,6 +11,7 @@ # License for the specific language governing permissions and limitations # under the License. import os +from typing import Optional import clickhouse_connect from clickhouse_connect.driver.exceptions import Error as ClickhouseConnectError @@ -52,12 +53,12 @@ class ClickHouseContainer(DbContainer): def __init__( self, - image="clickhouse/clickhouse-server:latest", - port=9000, - user=None, - password=None, - dbname=None - ): + image: str = "clickhouse/clickhouse-server:latest", + port: int = 9000, + user: Optional[str] = None, + password: Optional[str] = None, + dbname: Optional[str] = None + ) -> None: super().__init__(image=image) self.CLICKHOUSE_USER = user or self.CLICKHOUSE_USER @@ -76,12 +77,12 @@ def _connect(self): client.execute("SELECT version()") - def _configure(self): + def _configure(self) -> None: self.with_env("CLICKHOUSE_USER", self.CLICKHOUSE_USER) self.with_env("CLICKHOUSE_PASSWORD", self.CLICKHOUSE_PASSWORD) self.with_env("CLICKHOUSE_DB", self.CLICKHOUSE_DB) - def get_connection_url(self, host=None): + def get_connection_url(self, host: Optional[str] = None) -> str: return self._create_connection_url( dialect="clickhouse", username=self.CLICKHOUSE_USER, From 04e999cc8e62c6acf86c3028c96861d3b533fa19 Mon Sep 17 00:00:00 2001 From: Florian Polster Date: Sun, 12 Mar 2023 13:05:40 +0100 Subject: [PATCH 8/9] Add type --- clickhouse/testcontainers/clickhouse/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clickhouse/testcontainers/clickhouse/__init__.py b/clickhouse/testcontainers/clickhouse/__init__.py index 495e98462..f24cd453a 100644 --- a/clickhouse/testcontainers/clickhouse/__init__.py +++ b/clickhouse/testcontainers/clickhouse/__init__.py @@ -68,7 +68,7 @@ def __init__( self.with_exposed_ports(self.port_to_expose) @wait_container_is_ready(ClickhouseDriverError, ClickhouseConnectError, EOFError) - def _connect(self): + def _connect(self) -> None: if self.port_to_expose == 8123: with clickhouse_connect.get_client(dsn=self.get_connection_url()) as client: client.command("SELECT version()") From fcc6ccefcdfa181b8404dccd607c249090e885dd Mon Sep 17 00:00:00 2001 From: Pepijn Fijt Date: Fri, 24 Mar 2023 11:36:57 +0100 Subject: [PATCH 9/9] fixed linting clickhouse container and fixed doctest --- clickhouse/testcontainers/clickhouse/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/clickhouse/testcontainers/clickhouse/__init__.py b/clickhouse/testcontainers/clickhouse/__init__.py index f24cd453a..70a46f185 100644 --- a/clickhouse/testcontainers/clickhouse/__init__.py +++ b/clickhouse/testcontainers/clickhouse/__init__.py @@ -41,10 +41,11 @@ class ClickHouseContainer(DbContainer): [('working',)] >>> import clickhouse_connect - >>> with ClickHouseContainer("clickhouse/clickhouse-server:21.8", port=8123) as clickhouse: - ... client = clickhouse_connect.get_client(dsn=self.get_connection_url()) + >>> with ClickHouseContainer("clickhouse/clickhouse-server:21.8", + ... port=8123) as clickhouse: + ... client = clickhouse_connect.get_client(dsn=clickhouse.get_connection_url()) ... client.command("select 'working'") - [('working',)] + 'working' """ CLICKHOUSE_USER = os.environ.get("CLICKHOUSE_USER", "test") @@ -76,7 +77,6 @@ def _connect(self) -> None: with clickhouse_driver.Client.from_url(self.get_connection_url()) as client: client.execute("SELECT version()") - def _configure(self) -> None: self.with_env("CLICKHOUSE_USER", self.CLICKHOUSE_USER) self.with_env("CLICKHOUSE_PASSWORD", self.CLICKHOUSE_PASSWORD)