Skip to content

Commit 44edc65

Browse files
committed
Bump to latest ty
1 parent 5b0c270 commit 44edc65

4 files changed

Lines changed: 51 additions & 36 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ dev = [
4747
# flake8
4848
"flake8",
4949
"flake8-pyproject",
50-
"ty",
50+
"ty>=0.0.37",
5151
# For stable cog:
5252
"tabulate>=0.10.0",
5353
]

sqlite_utils/cli.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import base64
22
from typing import Any
33
import click
4-
from click_default_group import DefaultGroup # type: ignore
4+
from click_default_group import DefaultGroup
55
from datetime import datetime, timezone
66
import hashlib
77
import pathlib
@@ -222,7 +222,7 @@ def _iter():
222222
else:
223223
items = db.table_names(fts4=fts4, fts5=fts5)
224224
for name in items:
225-
row = [name]
225+
row: list[Any] = [name]
226226
if counts:
227227
row.append(method(name).count)
228228
if columns:
@@ -2121,8 +2121,9 @@ def _execute_query(
21212121
cursor = [[cursor.rowcount]]
21222122
else:
21232123
headers = [c[0] for c in cursor.description]
2124+
cursor_or_rows: Any = cursor
21242125
if raw:
2125-
row = cursor.fetchone() # type: ignore[union-attr]
2126+
row = cursor_or_rows.fetchone()
21262127
data = row[0] if row else None
21272128
if isinstance(data, bytes):
21282129
sys.stdout.buffer.write(data)

sqlite_utils/db.py

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@
1515
import contextlib
1616
import datetime
1717
import decimal
18+
import importlib
1819
import inspect
1920
import itertools
2021
import json
2122
import os
2223
import pathlib
2324
import re
2425
import secrets
25-
from sqlite_fts4 import rank_bm25 # type: ignore
26+
from sqlite_fts4 import rank_bm25
2627
import textwrap
2728
from typing import (
2829
cast,
@@ -43,7 +44,7 @@
4344
from sqlite_utils.plugins import pm
4445

4546
try:
46-
from sqlite_dump import iterdump # type: ignore[import-not-found]
47+
iterdump = importlib.import_module("sqlite_dump").iterdump
4748
except ImportError:
4849
iterdump = None
4950

@@ -82,15 +83,17 @@ def quote_identifier(identifier: str) -> str:
8283
return '"{}"'.format(identifier.replace('"', '""'))
8384

8485

86+
pd: Any = None
8587
try:
86-
import pandas as pd # type: ignore
88+
pd = importlib.import_module("pandas")
8789
except ImportError:
88-
pd = None # type: ignore
90+
pd = None
8991

92+
np: Any = None
9093
try:
91-
import numpy as np # type: ignore
94+
np = importlib.import_module("numpy")
9295
except ImportError:
93-
np = None # type: ignore
96+
np = None
9497

9598
Column = namedtuple(
9699
"Column", ("cid", "name", "type", "notnull", "default_value", "is_pk")
@@ -190,7 +193,10 @@ class Default:
190193

191194
DEFAULT = Default()
192195

193-
COLUMN_TYPE_MAPPING = {
196+
Tracer = Callable[[str, Optional[Union[Sequence[Any], Dict[str, Any]]]], None]
197+
198+
199+
COLUMN_TYPE_MAPPING: Dict[Any, str] = {
194200
float: "REAL",
195201
int: "INTEGER",
196202
bool: "INTEGER",
@@ -339,7 +345,7 @@ def __init__(
339345
memory_name: Optional[str] = None,
340346
recreate: bool = False,
341347
recursive_triggers: bool = True,
342-
tracer: Optional[Callable] = None,
348+
tracer: Optional[Tracer] = None,
343349
use_counts_table: bool = False,
344350
execute_plugins: bool = True,
345351
use_old_upsert: bool = False,
@@ -375,8 +381,8 @@ def __init__(
375381
self.conn = sqlite3.connect(str(filename_or_conn))
376382
else:
377383
assert not recreate, "recreate cannot be used with connections, only paths"
378-
self.conn = filename_or_conn
379-
self._tracer = tracer
384+
self.conn = cast(sqlite3.Connection, filename_or_conn)
385+
self._tracer: Optional[Tracer] = tracer
380386
if recursive_triggers:
381387
self.execute("PRAGMA recursive_triggers=on;")
382388
self._registered_functions: set = set()
@@ -421,7 +427,7 @@ def ensure_autocommit_off(self) -> Generator[None, None, None]:
421427

422428
@contextlib.contextmanager
423429
def tracer(
424-
self, tracer: Optional[Callable[[str, Optional[Sequence]], None]] = None
430+
self, tracer: Optional[Tracer] = None
425431
) -> Generator["Database", None, None]:
426432
"""
427433
Context manager to temporarily set a tracer function - all executed SQL queries will
@@ -439,7 +445,7 @@ def tracer(
439445
:param tracer: Callable accepting ``sql`` and ``parameters`` arguments
440446
"""
441447
prev_tracer = self._tracer
442-
self._tracer = tracer or print
448+
self._tracer = tracer or cast(Tracer, print)
443449
try:
444450
yield self
445451
finally:
@@ -3493,7 +3499,7 @@ def insert_all(
34933499
raise ValueError(
34943500
"When using list-based iteration, the first yielded value must be a list of column name strings"
34953501
)
3496-
column_names = list(first_record)
3502+
column_names = cast(List[str], list(first_record))
34973503
all_columns = column_names
34983504
num_columns = len(column_names)
34993505
# Get the actual first data record
@@ -3535,7 +3541,8 @@ def insert_all(
35353541
chunk_as_dicts = [dict(zip(column_names, row)) for row in chunk]
35363542
column_types = suggest_column_types(chunk_as_dicts)
35373543
else:
3538-
column_types = suggest_column_types(chunk) # type: ignore[arg-type]
3544+
dict_chunk = cast(List[Dict[str, Any]], chunk)
3545+
column_types = suggest_column_types(dict_chunk)
35393546
if extracts:
35403547
for col in extracts:
35413548
if col in column_types:
@@ -3562,14 +3569,14 @@ def insert_all(
35623569
all_columns.insert(0, hash_id)
35633570
else:
35643571
all_columns_set: Set[str] = set()
3565-
for record in chunk:
3566-
all_columns_set.update(record.keys()) # type: ignore[union-attr]
3572+
for record in cast(List[Dict[str, Any]], chunk):
3573+
all_columns_set.update(record.keys())
35673574
all_columns = list(sorted(all_columns_set))
35683575
if hash_id:
35693576
all_columns.insert(0, hash_id)
35703577
else:
35713578
if not list_mode:
3572-
for record in chunk:
3579+
for record in cast(List[Dict[str, Any]], chunk):
35733580
all_columns += [
35743581
column for column in record if column not in all_columns
35753582
]
@@ -3767,6 +3774,7 @@ def lookup(
37673774
:param strict: Boolean, apply STRICT mode if creating the table.
37683775
"""
37693776
assert isinstance(lookup_values, dict)
3777+
assert pk is not None
37703778
if extra_values is not None:
37713779
assert isinstance(extra_values, dict)
37723780
combined_values = dict(lookup_values)
@@ -3786,7 +3794,7 @@ def lookup(
37863794
)
37873795
)
37883796
try:
3789-
return rows[0][pk] # type: ignore[index]
3797+
return rows[0][pk]
37903798
except IndexError:
37913799
return self.insert(
37923800
combined_values,

sqlite_utils/utils.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import csv
44
import enum
55
import hashlib
6+
import importlib
67
import io
78
import itertools
89
import json
@@ -21,6 +22,7 @@
2122
Set,
2223
Tuple,
2324
Type,
25+
TYPE_CHECKING,
2426
TypeVar,
2527
Union,
2628
cast,
@@ -30,22 +32,26 @@
3032

3133
from . import recipes
3234

33-
try:
34-
import pysqlite3 as sqlite3 # type: ignore[import-not-found] # noqa: F401
35-
from pysqlite3 import dbapi2 # type: ignore[import-not-found] # noqa: F401
35+
if TYPE_CHECKING:
36+
import sqlite3 # noqa: F401
37+
from sqlite3 import dbapi2 # noqa: F401
3638

3739
OperationalError = dbapi2.OperationalError
38-
except ImportError:
40+
else:
3941
try:
40-
import sqlean as sqlite3 # type: ignore[import-not-found] # noqa: F401
41-
from sqlean import dbapi2 # type: ignore[import-not-found] # noqa: F401
42-
42+
sqlite3 = importlib.import_module("pysqlite3")
43+
dbapi2 = importlib.import_module("pysqlite3.dbapi2")
4344
OperationalError = dbapi2.OperationalError
4445
except ImportError:
45-
import sqlite3 # noqa: F401
46-
from sqlite3 import dbapi2 # noqa: F401
46+
try:
47+
sqlite3 = importlib.import_module("sqlean")
48+
dbapi2 = importlib.import_module("sqlean.dbapi2")
49+
OperationalError = dbapi2.OperationalError
50+
except ImportError:
51+
import sqlite3 # noqa: F401
52+
from sqlite3 import dbapi2 # noqa: F401
4753

48-
OperationalError = dbapi2.OperationalError
54+
OperationalError = dbapi2.OperationalError
4955

5056

5157
SPATIALITE_PATHS = (
@@ -60,7 +66,7 @@
6066
ORIGINAL_CSV_FIELD_SIZE_LIMIT = csv.field_size_limit()
6167

6268
# Type alias for row dictionaries - values can be various SQLite-compatible types
63-
RowValue = Union[None, int, float, str, bytes, bool]
69+
RowValue = Union[None, int, float, str, bytes, bool, List[str]]
6470
Row = Dict[str, RowValue]
6571

6672
T = TypeVar("T")
@@ -284,7 +290,7 @@ def _extra_key_strategy(
284290
else:
285291
extras_value = row.pop(None)
286292
row_out = cast(Row, row)
287-
row_out[extras_key] = extras_value # type: ignore[assignment]
293+
row_out[extras_key] = cast(RowValue, extras_value)
288294
yield row_out
289295

290296

@@ -464,14 +470,14 @@ def get_tests(cls) -> List[str]:
464470

465471
def test_integer(self, value: object) -> bool:
466472
try:
467-
int(value) # type: ignore
473+
int(cast(Any, value))
468474
return True
469475
except (ValueError, TypeError):
470476
return False
471477

472478
def test_float(self, value: object) -> bool:
473479
try:
474-
float(value) # type: ignore[arg-type]
480+
float(cast(Any, value))
475481
return True
476482
except (ValueError, TypeError):
477483
return False

0 commit comments

Comments
 (0)