Skip to content

Commit f9e807b

Browse files
authored
fix ruff pyupgrade rule (#341)
1 parent 2846749 commit f9e807b

12 files changed

Lines changed: 122 additions & 130 deletions

File tree

dbtmetabase/__main__.py

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import functools
22
import logging
3+
from collections.abc import Callable, Mapping, Sequence
34
from pathlib import Path
4-
from typing import Any, Callable, List, Mapping, Optional, Sequence, Tuple, Union, cast
5+
from typing import Any, cast
56

67
import click
78
import yaml
@@ -22,8 +23,8 @@ def _click_list_option_kwargs() -> Mapping[str, Any]:
2223
def callback(
2324
ctx: click.Context,
2425
param: click.Option,
25-
value: Union[str, List[str]],
26-
) -> Optional[List[str]]:
26+
value: str | list[str],
27+
) -> list[str] | None:
2728
if value is None:
2829
return None
2930

@@ -173,11 +174,11 @@ def wrapper(
173174
metabase_api_key: str,
174175
metabase_username: str,
175176
metabase_password: str,
176-
metabase_session_id: Optional[str],
177+
metabase_session_id: str | None,
177178
skip_verify: bool,
178-
cert: Optional[str],
179+
cert: str | None,
179180
http_timeout: int,
180-
http_headers: Sequence[Tuple[str, str]],
181+
http_headers: Sequence[tuple[str, str]],
181182
verbose: bool,
182183
**kwargs,
183184
):
@@ -304,16 +305,16 @@ def wrapper(
304305
)
305306
def models(
306307
metabase_database: str,
307-
include_databases: Optional[Sequence[str]],
308-
exclude_databases: Optional[Sequence[str]],
309-
include_schemas: Optional[Sequence[str]],
310-
exclude_schemas: Optional[Sequence[str]],
311-
include_models: Optional[Sequence[str]],
312-
exclude_models: Optional[Sequence[str]],
308+
include_databases: Sequence[str] | None,
309+
exclude_databases: Sequence[str] | None,
310+
include_schemas: Sequence[str] | None,
311+
exclude_schemas: Sequence[str] | None,
312+
include_models: Sequence[str] | None,
313+
exclude_models: Sequence[str] | None,
313314
skip_sources: bool,
314315
sync_timeout: int,
315316
append_tags: bool,
316-
docs_url: Optional[str],
317+
docs_url: str | None,
317318
order_fields: bool,
318319
core: DbtMetabase,
319320
):
@@ -387,9 +388,9 @@ def models(
387388
)
388389
def exposures(
389390
output_path: str,
390-
output_grouping: Optional[str],
391-
include_collections: Optional[Sequence[str]],
392-
exclude_collections: Optional[Sequence[str]],
391+
output_grouping: str | None,
392+
include_collections: Sequence[str] | None,
393+
exclude_collections: Sequence[str] | None,
393394
allow_personal_collections: bool,
394395
exclude_unverified: bool,
395396
tags: Sequence[str],

dbtmetabase/_exposures.py

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,11 @@
44
import logging
55
import re
66
from abc import ABCMeta, abstractmethod
7+
from collections.abc import Iterable, Mapping, MutableMapping, MutableSequence, Sequence
78
from operator import itemgetter
89
from pathlib import Path
910
from typing import (
1011
Any,
11-
Iterable,
12-
Mapping,
13-
MutableMapping,
14-
MutableSequence,
15-
Optional,
16-
Sequence,
17-
Set,
18-
Tuple,
19-
Union,
2012
)
2113
from urllib.parse import unquote
2214

@@ -55,11 +47,11 @@ def metabase(self) -> Metabase:
5547
def extract_exposures(
5648
self,
5749
output_path: str = DEFAULT_EXPOSURES_OUTPUT_PATH,
58-
output_grouping: Optional[str] = None,
59-
collection_filter: Optional[Filter] = None,
50+
output_grouping: str | None = None,
51+
collection_filter: Filter | None = None,
6052
allow_personal_collections: bool = False,
6153
exclude_unverified: bool = False,
62-
tags: Optional[Sequence[str]] = None,
54+
tags: Sequence[str] | None = None,
6355
) -> Iterable[Mapping]:
6456
"""Extract dbt exposures from Metabase.
6557
@@ -273,7 +265,7 @@ def __exposure_query(self, ctx: _Context, exposure: _Exposure, card: Mapping):
273265
dataset_query = card.get("dataset_query", {})
274266
query = dataset_query.get("query", {})
275267

276-
query_source: Union[str, int] = query.get("source-table", card.get("table_id"))
268+
query_source: str | int = query.get("source-table", card.get("table_id"))
277269
if isinstance(query_source, str) and query_source.startswith("card__"):
278270
# Question based on another question
279271
source_card_uid = query_source.split("__")[-1]
@@ -288,7 +280,7 @@ def __exposure_query(self, ctx: _Context, exposure: _Exposure, card: Mapping):
288280

289281
# Find models in joins
290282
for join in query.get("joins", []):
291-
join_source: Union[str, int] = join.get("source-table")
283+
join_source: str | int = join.get("source-table")
292284
if isinstance(join_source, str) and join_source.startswith("card__"):
293285
# Question based on another question
294286
source_card_uid = join_source.split("__")[-1]
@@ -338,8 +330,8 @@ def __exposure_mbql5_stage_mbql(
338330
"""Extracts exposures from an MBQL 5 GUI stage."""
339331

340332
# Extract source-table or source-card
341-
source_table: Optional[int] = stage.get("source-table")
342-
source_card: Optional[int] = stage.get("source-card")
333+
source_table: int | None = stage.get("source-table")
334+
source_card: int | None = stage.get("source-card")
343335

344336
if source_card is not None:
345337
# Stage based on another card/question
@@ -437,11 +429,11 @@ def __format_exposure(
437429
created_at: str,
438430
creator_name: str,
439431
creator_email: str,
440-
last_used_at: Optional[str],
441-
average_query_time: Optional[str],
442-
native_query: Optional[str],
432+
last_used_at: str | None,
433+
average_query_time: str | None,
434+
native_query: str | None,
443435
depends_on: Iterable[str],
444-
tags: Optional[Sequence[str]],
436+
tags: Sequence[str] | None,
445437
) -> Mapping:
446438
"""Builds dbt exposure representation (see https://docs.getdbt.com/reference/exposure-properties)."""
447439

@@ -510,13 +502,13 @@ def __write_exposures(
510502
self,
511503
exposures: Iterable[Mapping],
512504
output_path: str,
513-
output_grouping: Optional[str],
505+
output_grouping: str | None,
514506
):
515507
"""Write exposures to output files."""
516508

517-
grouped: MutableMapping[Tuple[str, ...], MutableSequence[Mapping]] = {}
509+
grouped: MutableMapping[tuple[str, ...], MutableSequence[Mapping]] = {}
518510
for exposure in exposures:
519-
group: Tuple[str, ...] = ("exposures",)
511+
group: tuple[str, ...] = ("exposures",)
520512
if output_grouping == "collection":
521513
group = (exposure["collection"],)
522514
elif output_grouping == "type":
@@ -563,7 +555,7 @@ class _Exposure:
563555
header: str = ""
564556
creator_name: str = ""
565557
creator_email: str = ""
566-
average_query_time: Optional[str] = None
567-
last_used_at: Optional[str] = None
568-
native_query: Optional[str] = None
569-
depends: Set[str] = dc.field(default_factory=set)
558+
average_query_time: str | None = None
559+
last_used_at: str | None = None
560+
native_query: str | None = None
561+
depends: set[str] = dc.field(default_factory=set)

dbtmetabase/_models.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
import logging
55
import time
66
from abc import ABCMeta, abstractmethod
7-
from typing import Any, Iterable, Mapping, MutableMapping, Optional
7+
from collections.abc import Iterable, Mapping, MutableMapping
8+
from typing import Any
89

910
from .errors import MetabaseStateError
1011
from .format import Filter, NullValue, safe_name
@@ -34,13 +35,13 @@ def metabase(self) -> Metabase:
3435
def export_models(
3536
self,
3637
metabase_database: str,
37-
database_filter: Optional[Filter] = None,
38-
schema_filter: Optional[Filter] = None,
39-
model_filter: Optional[Filter] = None,
38+
database_filter: Filter | None = None,
39+
schema_filter: Filter | None = None,
40+
model_filter: Filter | None = None,
4041
skip_sources: bool = False,
4142
sync_timeout: int = DEFAULT_MODELS_SYNC_TIMEOUT,
4243
append_tags: bool = False,
43-
docs_url: Optional[str] = None,
44+
docs_url: str | None = None,
4445
order_fields: bool = False,
4546
):
4647
"""Exports dbt models to Metabase database schema.
@@ -171,7 +172,7 @@ def _export_model(
171172
ctx: _Context,
172173
model: Model,
173174
append_tags: bool,
174-
docs_url: Optional[str],
175+
docs_url: str | None,
175176
order_fields: bool,
176177
) -> bool:
177178
"""Exports one dbt model to Metabase database schema."""
@@ -422,7 +423,7 @@ def __export_column(
422423
if api_field["fk_target_field_id"] and not fk_target_field_id:
423424
fk_target_field_id = api_field["fk_target_field_id"]
424425

425-
body_field: MutableMapping[str, Optional[Any]] = {}
426+
body_field: MutableMapping[str, Any | None] = {}
426427

427428
# Update if specified, otherwise reset one that had been set
428429
api_display_name = api_field.get("display_name")
@@ -529,9 +530,9 @@ def _get_metabase_tables(self, database_id: str) -> Mapping[str, MutableMapping]
529530
def __filtered_models(
530531
self,
531532
models: Iterable[Model],
532-
database_filter: Optional[Filter],
533-
schema_filter: Optional[Filter],
534-
model_filter: Optional[Filter],
533+
database_filter: Filter | None,
534+
schema_filter: Filter | None,
535+
model_filter: Filter | None,
535536
skip_sources: bool,
536537
) -> Iterable[Model]:
537538
def selected(m: Model) -> bool:

dbtmetabase/core.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import logging
44
from pathlib import Path
5-
from typing import Optional, Tuple, Union
65

76
from requests.adapters import HTTPAdapter
87

@@ -21,17 +20,17 @@ class DbtMetabase(ModelsMixin, ExposuresMixin):
2120

2221
def __init__(
2322
self,
24-
manifest_path: Union[str, Path],
23+
manifest_path: str | Path,
2524
metabase_url: str,
26-
metabase_api_key: Optional[str] = None,
27-
metabase_username: Optional[str] = None,
28-
metabase_password: Optional[str] = None,
29-
metabase_session_id: Optional[str] = None,
25+
metabase_api_key: str | None = None,
26+
metabase_username: str | None = None,
27+
metabase_password: str | None = None,
28+
metabase_session_id: str | None = None,
3029
skip_verify: bool = False,
31-
cert: Optional[Union[str, Tuple[str, str]]] = None,
30+
cert: str | tuple[str, str] | None = None,
3231
http_timeout: int = DEFAULT_HTTP_TIMEOUT,
33-
http_headers: Optional[dict] = None,
34-
http_adapter: Optional[HTTPAdapter] = None,
32+
http_headers: dict | None = None,
33+
http_adapter: HTTPAdapter | None = None,
3534
):
3635
"""dbt + Metabase integration.
3736

dbtmetabase/format.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
import fnmatch
44
import logging
55
import re
6+
from collections.abc import MutableSequence, Sequence
67
from logging.handlers import RotatingFileHandler
78
from pathlib import Path
8-
from typing import Any, MutableSequence, Optional, Sequence, TextIO
9+
from typing import Any, TextIO
910

1011
import yaml
1112
from rich.logging import RichHandler
@@ -16,8 +17,8 @@ class Filter:
1617

1718
def __init__(
1819
self,
19-
include: Optional[Sequence[str]] = None,
20-
exclude: Optional[Sequence[str]] = None,
20+
include: Sequence[str] | None = None,
21+
exclude: Sequence[str] | None = None,
2122
):
2223
"""Inclusion/exclusion filtering.
2324
@@ -28,7 +29,7 @@ def __init__(
2829
self.include = self._norm_arg(include)
2930
self.exclude = self._norm_arg(exclude)
3031

31-
def match(self, item: Optional[str]) -> bool:
32+
def match(self, item: str | None) -> bool:
3233
item = self._norm_item(item) if item else ""
3334

3435
for exclude in self.exclude:
@@ -44,7 +45,7 @@ def match(self, item: Optional[str]) -> bool:
4445
return True
4546

4647
@staticmethod
47-
def _norm_arg(arg: Optional[Sequence[str]]) -> Sequence[str]:
48+
def _norm_arg(arg: Sequence[str] | None) -> Sequence[str]:
4849
if isinstance(arg, str):
4950
arg = [arg]
5051
return [Filter._norm_item(x) for x in arg or []]
@@ -88,7 +89,7 @@ def dump_yaml(data: Any, stream: TextIO):
8889
)
8990

9091

91-
def setup_logging(level: int, path: Optional[Path] = None):
92+
def setup_logging(level: int, path: Path | None = None):
9293
"""Basic logger configuration for the CLI.
9394
9495
Args:
@@ -129,7 +130,7 @@ def setup_logging(level: int, path: Optional[Path] = None):
129130
)
130131

131132

132-
def safe_name(text: Optional[str]) -> str:
133+
def safe_name(text: str | None) -> str:
133134
"""Sanitizes a human-readable "friendly" name to a safe string.
134135
135136
For example, "Joe's Collection" becomes "joe_s_collection".
@@ -143,7 +144,7 @@ def safe_name(text: Optional[str]) -> str:
143144
return re.sub(r"[^\w]", "_", text or "").lower()
144145

145146

146-
def safe_description(text: Optional[str]) -> str:
147+
def safe_description(text: str | None) -> str:
147148
"""Sanitizes a human-readable long text, such as description.
148149
149150
Args:

0 commit comments

Comments
 (0)