Skip to content

Commit b62248f

Browse files
authored
Merge pull request #96 from Mause/all-repos_autofix_add_mypy_config_v2
Add strict mypy config
2 parents 329ce00 + 0539cae commit b62248f

File tree

5 files changed

+43
-30
lines changed

5 files changed

+43
-30
lines changed

.pre-commit-config.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ repos:
3838
rev: v0.910
3939
hooks:
4040
- id: mypy
41+
additional_dependencies:
42+
- "pytest==6.2.4"
43+
- "hypothesis==6.14.1"
4144
- repo: https://github.com/PyCQA/flake8
4245
rev: '3.9.2' # pick a git hash / tag to point to
4346
hooks:

duckdb_engine/__init__.py

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from dataclasses import dataclass, field
2-
from typing import List
2+
from typing import Any, Dict, List, Tuple, Type
33

44
import duckdb
55
from sqlalchemy.dialects.postgresql import dialect as postgres_dialect
6+
from sqlalchemy.engine import URL
67

78

89
class DBAPI:
@@ -17,25 +18,27 @@ class ConnectionWrapper:
1718
c: duckdb.DuckDBPyConnection
1819
notices: List[str] = field(default_factory=list)
1920

20-
def cursor(self):
21+
def cursor(self) -> "ConnectionWrapper":
2122
return self
2223

23-
def fetchmany(self, size=None):
24+
def fetchmany(self, size: int = None) -> List:
2425
# TODO: remove this once duckdb supports fetchmany natively
2526
return self.c.fetch_df_chunk().values.tolist()
2627

27-
def __getattr__(self, name):
28+
def __getattr__(self, name: str) -> Any:
2829
return getattr(self.c, name)
2930

3031
@property
31-
def connection(self):
32+
def connection(self) -> "ConnectionWrapper":
3233
return self
3334

34-
def close(self):
35+
def close(self) -> None:
3536
# duckdb doesn't support 'soft closes'
3637
pass
3738

38-
def execute(self, statement, parameters=None, context=None):
39+
def execute(
40+
self, statement: str, parameters: Dict = None, context: Any = None
41+
) -> None:
3942
if parameters is None:
4043
self.c.execute(statement)
4144
else:
@@ -47,37 +50,41 @@ class Dialect(postgres_dialect):
4750
identifier_preparer = None
4851
# colspecs TODO: remap types to duckdb types
4952

50-
def connect(self, *args, **kwargs):
53+
def connect(self, *args: Any, **kwargs: Any) -> ConnectionWrapper:
5154
return ConnectionWrapper(duckdb.connect(*args, **kwargs))
5255

53-
def on_connect(self):
56+
def on_connect(self) -> None:
5457
pass
5558

56-
def ddl_compiler(self, dialect, ddl, **kwargs):
59+
def ddl_compiler(
60+
self, dialect: str, ddl: Any, **kwargs: Any
61+
) -> postgres_dialect.ddl_compiler:
5762
# TODO: enforce no `serial` type
5863

5964
# duckdb doesn't support foreign key constraints (yet)
6065
ddl.include_foreign_key_constraints = {}
6166
return postgres_dialect.ddl_compiler(dialect, ddl, **kwargs)
6267

63-
def do_execute(self, cursor, statement, parameters, context):
68+
def do_execute(
69+
self, cursor: ConnectionWrapper, statement: str, parameters: Any, context: Any
70+
) -> None:
6471
cursor.execute(statement, parameters, context)
6572

6673
@staticmethod
67-
def dbapi():
74+
def dbapi() -> Type[DBAPI]:
6875
return DBAPI
6976

70-
def create_connect_args(self, u):
77+
def create_connect_args(self, u: URL) -> Tuple[Tuple, Dict]:
7178
return (), {"database": u.render_as_string(hide_password=False).split("///")[1]}
7279

73-
def initialize(self, connection):
80+
def initialize(self, connection: ConnectionWrapper) -> None:
7481
pass
7582

76-
def do_rollback(self, connection):
83+
def do_rollback(self, connection: ConnectionWrapper) -> None:
7784
pass
7885

7986
@classmethod
80-
def get_dialect_cls(cls, u):
87+
def get_dialect_cls(cls, u: str) -> Type["Dialect"]:
8188
return cls
8289

8390

duckdb_engine/tests/test_basic.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44
from hypothesis.strategies import text
55
from pytest import fixture
66
from sqlalchemy import Column, ForeignKey, Integer, Sequence, String, create_engine
7+
from sqlalchemy.engine import Engine
78
from sqlalchemy.engine.url import registry
89
from sqlalchemy.ext.declarative import declarative_base
9-
from sqlalchemy.orm import RelationshipProperty, relationship, sessionmaker
10+
from sqlalchemy.orm import RelationshipProperty, Session, relationship, sessionmaker
1011

1112

1213
@fixture
13-
def engine():
14+
def engine() -> Engine:
1415
registry.register("duckdb", "duckdb_engine", "Dialect")
1516

1617
eng = create_engine("duckdb:///:memory:")
@@ -41,16 +42,11 @@ class Owner(Base): # type: ignore
4142

4243

4344
@fixture
44-
def Session(engine):
45-
return sessionmaker(bind=engine)
45+
def session(engine: Engine) -> Session:
46+
return sessionmaker(bind=engine)()
4647

4748

48-
@fixture
49-
def session(Session):
50-
return Session()
51-
52-
53-
def test_basic(session):
49+
def test_basic(session: Session) -> None:
5450
session.add(FakeModel(name="Frank"))
5551
session.commit()
5652

@@ -59,7 +55,7 @@ def test_basic(session):
5955
assert frank.name == "Frank"
6056

6157

62-
def test_foreign(session):
58+
def test_foreign(session: Session) -> None:
6359
model = FakeModel(name="Walter")
6460
session.add(model)
6561
session.add(Owner(owned=model))
@@ -71,7 +67,7 @@ def test_foreign(session):
7167

7268

7369
@given(text())
74-
def test_simple_string(s):
70+
def test_simple_string(s: str) -> None:
7571
assume("\x00" not in s)
7672
eng = create_engine("duckdb:///:memory:")
7773
Base.metadata.create_all(eng)

duckdb_engine/tests/test_pandas.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def test_to_sql(
5353
if_exists: str,
5454
method: Optional[str],
5555
index: bool = False,
56-
):
56+
) -> None:
5757
eng = create_engine("duckdb:///:memory:")
5858
try:
5959
sample_df.to_sql(
@@ -71,7 +71,7 @@ def test_to_sql(
7171
@mark.parametrize(params_strings["read_sql"], params["read_sql"])
7272
def test_read_sql(
7373
chunksize: Optional[int],
74-
):
74+
) -> None:
7575
eng = create_engine("duckdb:///:memory:")
7676
sample_df.to_sql(name="test_read", con=eng, if_exists="replace")
7777
query = "SELECT * FROM test_read"

pyproject.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ addopts = "--hypothesis-show-statistics"
2828

2929
[tool.mypy]
3030
ignore_missing_imports = true
31+
disallow_untyped_calls = true
32+
disallow_untyped_defs = true
33+
disallow_incomplete_defs = true
34+
check_untyped_defs = true
35+
disallow_untyped_decorators = true
36+
warn_redundant_casts = true
37+
warn_unused_ignores = true
3138

3239
[build-system]
3340
requires = ["poetry_core>=1.0.0"]

0 commit comments

Comments
 (0)