Skip to content

Commit 018686e

Browse files
committed
QA: Migrate type checker from mypy to ty, CodeRabbit improvements 1
1 parent bdcca17 commit 018686e

8 files changed

Lines changed: 47 additions & 18 deletions

File tree

cratedb_toolkit/io/awslambda/kinesis.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@
6969
message = f"Invalid value for MESSAGE_FORMAT: {MESSAGE_FORMAT}. Use one of: {message_formats}"
7070
logger.fatal(message)
7171
sys.exit(22)
72+
if MESSAGE_FORMAT == "dynamodb" and not CRATEDB_TABLE:
73+
message = "CRATEDB_TABLE environment variable is required when MESSAGE_FORMAT is 'dynamodb'"
74+
logger.fatal(message)
75+
sys.exit(22)
7276
try:
7377
column_types = ColumnTypeMapStore.from_json(COLUMN_TYPES)
7478
except Exception as ex:

cratedb_toolkit/io/mongodb/cdc.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ def __init__(
6262
if tm:
6363
address = CollectionAddress(
6464
container=self.mongodb_adapter.database_name,
65+
# TODO: Collection name must be permitted to be None?
6566
name=t.cast(str, self.mongodb_adapter.collection_name),
6667
)
6768
try:

cratedb_toolkit/io/mongodb/copy.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import sqlalchemy as sa
66
from boltons.urlutils import URL
7+
from commons_codec.model import SQLOperation
78
from commons_codec.transform.mongodb import MongoDBCrateDBConverter, MongoDBFullLoadTranslator
89
from tikray.model.collection import CollectionAddress
910
from tqdm import tqdm
@@ -13,6 +14,7 @@
1314
from cratedb_toolkit.io.mongodb.adapter import mongodb_adapter_factory
1415
from cratedb_toolkit.io.mongodb.transform import TransformationManager
1516
from cratedb_toolkit.model import DatabaseAddress
17+
from cratedb_toolkit.util.cli import to_list
1618
from cratedb_toolkit.util.database import DatabaseAdapter
1719

1820
logger = logging.getLogger(__name__)
@@ -51,6 +53,7 @@ def __init__(
5153
if tm:
5254
address = CollectionAddress(
5355
container=self.mongodb_adapter.database_name,
56+
# TODO: Collection name must be permitted to be None?
5457
name=t.cast(str, self.mongodb_adapter.collection_name),
5558
)
5659
try:
@@ -88,10 +91,13 @@ def start(self):
8891
logger.info(f"Target: CrateDB table={self.cratedb_table} count={records_target}")
8992
progress_bar = tqdm(total=records_in)
9093

94+
def batch_to_sql_operation(batch: t.List[t.Dict[str, t.Any]]) -> SQLOperation:
95+
return self.translator.to_sql(to_list(batch, []))
96+
9197
processor = BulkProcessor(
9298
connection=connection,
9399
data=self.mongodb_adapter.query(),
94-
batch_to_operation=self.translator.to_sql, # ty: ignore[invalid-argument-type]
100+
batch_to_operation=batch_to_sql_operation,
95101
progress_bar=progress_bar,
96102
on_error=self.on_error,
97103
debug=self.debug,

cratedb_toolkit/testing/testcontainers/cratedb.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -170,17 +170,23 @@ class CrateDBTestAdapter:
170170
"""
171171

172172
def __init__(self, crate_version: str = "nightly", **kwargs):
173-
self.cratedb: CrateDBContainer
174-
self.database: DatabaseAdapter
173+
self.cratedb: Optional[CrateDBContainer] = None
174+
self._database: Optional[DatabaseAdapter] = None
175175
self.image: str = "crate/crate:{}".format(crate_version)
176176

177+
@property
178+
def database(self) -> DatabaseAdapter:
179+
if self._database is None:
180+
raise ValueError("DatabaseAdapter is not initialized")
181+
return self._database
182+
177183
def start(self, **kwargs):
178184
"""
179185
Start testcontainer, used for tests set up
180186
"""
181187
self.cratedb = CrateDBContainer(image=self.image, **kwargs)
182188
self.cratedb.start()
183-
self.database = DatabaseAdapter(dburi=self.get_connection_url(), echo=False)
189+
self._database = DatabaseAdapter(dburi=self.get_connection_url(), echo=False)
184190

185191
def stop(self):
186192
"""
@@ -193,19 +199,19 @@ def reset(self, tables: Optional[list] = None, schemas: Optional[list] = None):
193199
"""
194200
Drop tables from the given list, used for tests set up or tear down
195201
"""
196-
if not self.database:
202+
if not self._database:
197203
return
198204

199205
if schemas:
200206
for reset_schema in schemas:
201-
self.database.connection.exec_driver_sql(
202-
f"DROP SCHEMA IF EXISTS {self.database.quote_relation_name(reset_schema)} CASCADE;"
207+
self._database.connection.exec_driver_sql(
208+
f"DROP SCHEMA IF EXISTS {self._database.quote_relation_name(reset_schema)} CASCADE;"
203209
)
204210

205211
if tables:
206212
for reset_table in tables:
207-
self.database.connection.exec_driver_sql(
208-
f"DROP TABLE IF EXISTS {self.database.quote_relation_name(reset_table)};"
213+
self._database.connection.exec_driver_sql(
214+
f"DROP TABLE IF EXISTS {self._database.quote_relation_name(reset_table)};"
209215
)
210216

211217
def get_connection_url(self, *args, **kwargs):

cratedb_toolkit/testing/testcontainers/mongodb.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@
1313
import os
1414
import time
1515
import typing as t
16+
from urllib.parse import quote
1617

1718
import pymongo.errors
1819
from pymongo import MongoClient
1920
from testcontainers.core.exceptions import ContainerStartException
2021
from testcontainers.mongodb import MongoDbContainer
22+
from yarl import URL
2123

2224
from cratedb_toolkit.testing.testcontainers.util import DockerSkippingContainer, KeepaliveContainer
2325

@@ -26,7 +28,7 @@ class MongoDbContainerWithKeepalive(DockerSkippingContainer, KeepaliveContainer,
2628
"""
2729
A Testcontainer for MongoDB with improved configurability.
2830
29-
It honors the `TC_KEEPALIVE` and `MONGODB_VERSION` environment variables.
31+
It honours the `TC_KEEPALIVE` and `MONGODB_VERSION` environment variables.
3032
3133
Defining `TC_KEEPALIVE` will set a signal not to shut down the container
3234
after running the test cases, in order to speed up subsequent invocations.
@@ -87,6 +89,11 @@ def _create_connection_url(
8789
dbname: t.Optional[str] = None,
8890
**kwargs,
8991
) -> str:
92+
"""
93+
TODO: Why does this method need to be overwritten?
94+
Hint: Probably because of getting rid of credentials forwarding,
95+
which is currently intended to reduce configuration complexity.
96+
"""
9097
from testcontainers.core.utils import raise_for_deprecated_parameter
9198

9299
if raise_for_deprecated_parameter(kwargs, "db_name", "dbname"):
@@ -96,16 +103,20 @@ def _create_connection_url(
96103
host = host or self.get_container_host_ip()
97104
assert port is not None # noqa: S101
98105
port = self.get_exposed_port(port)
99-
url = f"{dialect}://{host}:{port}"
106+
url = URL(f"{dialect}://{host}:{port}")
107+
if username:
108+
url = url.with_user(username)
109+
if password:
110+
url = url.with_password(quote(password, safe=" +"))
100111
if dbname:
101-
url = f"{url}/{dbname}"
102-
return url
112+
url = url.with_path(dbname)
113+
return str(url)
103114

104115
def get_connection_url(self) -> str:
105116
return self._create_connection_url(
106117
dialect="mongodb",
107-
username="admin",
108-
password="",
118+
username=None, # ty: ignore[invalid-argument-type]
119+
password=None, # ty: ignore[invalid-argument-type]
109120
port=self.port,
110121
)
111122

cratedb_toolkit/testing/testcontainers/util.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from docker.errors import DockerException
2020
from docker.models.containers import Container
2121
from testcontainers.core.container import DockerContainer
22+
from testcontainers.core.generic import DbContainer
2223

2324
from cratedb_toolkit.util.data import asbool
2425

@@ -176,7 +177,7 @@ class PytestTestcontainerAdapter:
176177
"""
177178

178179
def __init__(self):
179-
self.container: DockerContainer
180+
self.container: DbContainer
180181
self.run_setup()
181182

182183
@abstractmethod

cratedb_toolkit/util/client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def __enter__(self):
2424
def __exit__(self, type, value, tb): # noqa: A002
2525
if self.jwt_token:
2626
self.patcher.stop()
27-
return self
27+
return False
2828

2929

3030
def _mk_crate_client_request(jwt_token: Optional[str] = None):

tests/io/mongodb/test_integration.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def setUpClass(cls):
4949
logger.debug(f"MongoDB server info: {server_info}")
5050
except pymongo.errors.ServerSelectionTimeoutError as ex:
5151
if cls.SKIP_IF_NOT_RUNNING:
52-
raise cls.skipTest(cls, reason="MongoDB server not running") from ex # ty: ignore[invalid-argument-type]
52+
raise unittest.SkipTest("MongoDB server not running") from ex
5353
else: # noqa: RET506
5454
raise
5555

0 commit comments

Comments
 (0)