Skip to content

Commit 0975eb7

Browse files
authored
[TECH DEBT] Add factory type hint (#58)
## Changes Add factory type hint to have the editor recognize the types while developing
1 parent bf52c91 commit 0975eb7

File tree

6 files changed

+47
-27
lines changed

6 files changed

+47
-27
lines changed

src/databricks/labs/pytester/fixtures/baseline.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import logging
22
import random
33
import string
4+
from collections.abc import Callable, Generator
5+
from typing import Any, TypeVar
46

57
from pytest import fixture
68

@@ -55,7 +57,14 @@ def inner(k=16) -> str:
5557
return inner
5658

5759

58-
def factory(name, create, remove):
60+
T = TypeVar("T")
61+
62+
63+
def factory(
64+
name: str,
65+
create: Callable[..., T],
66+
remove: Callable[[T], None],
67+
) -> Generator[Callable[..., T], None, None]:
5968
"""
6069
Factory function for creating fixtures.
6170
@@ -95,13 +104,13 @@ def cleanup(scope):
95104
96105
yield from factory("secret scope", create, cleanup)
97106
"""
98-
cleanup = []
107+
cleanup: list[T] = []
99108

100-
def inner(**kwargs):
101-
some = create(**kwargs)
102-
_LOG.debug(f"added {name} fixture: {some}")
103-
cleanup.append(some)
104-
return some
109+
def inner(**kwargs: Any) -> T:
110+
out = create(**kwargs)
111+
_LOG.debug(f"added {name} fixture: {out}")
112+
cleanup.append(out)
113+
return out
105114

106115
yield inner
107116
_LOG.debug(f"clearing {len(cleanup)} {name} fixtures")

src/databricks/labs/pytester/fixtures/compute.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import json
2-
from collections.abc import Generator
2+
from collections.abc import Callable, Generator
33
from pathlib import Path
44
from pytest import fixture
55

@@ -24,7 +24,7 @@ def make_cluster_policy(
2424
make_random,
2525
log_workspace_link,
2626
watchdog_purge_suffix,
27-
) -> Generator[CreatePolicyResponse, None, None]:
27+
) -> Generator[Callable[..., CreatePolicyResponse], None, None]:
2828
"""
2929
Create a Databricks cluster policy and clean it up after the test. Returns a function to create cluster policies,
3030
which returns `databricks.sdk.service.compute.CreatePolicyResponse` instance.
@@ -56,7 +56,9 @@ def create(*, name: str | None = None, **kwargs) -> CreatePolicyResponse:
5656

5757

5858
@fixture
59-
def make_cluster(ws, make_random, log_workspace_link, watchdog_remove_after) -> Generator[ClusterDetails, None, None]:
59+
def make_cluster(
60+
ws, make_random, log_workspace_link, watchdog_remove_after
61+
) -> Generator[Callable[..., Wait[ClusterDetails]], None, None]:
6062
"""
6163
Create a Databricks cluster, waits for it to start, and clean it up after the test.
6264
Returns a function to create clusters. You can get `cluster_id` attribute from the returned object.
@@ -120,7 +122,7 @@ def make_instance_pool(
120122
make_random,
121123
log_workspace_link,
122124
watchdog_remove_after,
123-
) -> Generator[CreateInstancePoolResponse, None, None]:
125+
) -> Generator[Callable[..., CreateInstancePoolResponse], None, None]:
124126
"""
125127
Create a Databricks instance pool and clean it up after the test. Returns a function to create instance pools.
126128
Use `instance_pool_id` attribute from the returned object to get an ID of the pool.
@@ -155,7 +157,9 @@ def create(*, instance_pool_name=None, node_type_id=None, **kwargs) -> CreateIns
155157

156158

157159
@fixture
158-
def make_job(ws, make_random, make_notebook, log_workspace_link, watchdog_remove_after) -> Generator[Job, None, None]:
160+
def make_job(
161+
ws, make_random, make_notebook, log_workspace_link, watchdog_remove_after
162+
) -> Generator[Callable[..., Job], None, None]:
159163
"""
160164
Create a Databricks job and clean it up after the test. Returns a function to create jobs, that returns
161165
a `databricks.sdk.service.jobs.Job` instance.
@@ -224,7 +228,7 @@ def make_pipeline(
224228
make_notebook,
225229
watchdog_remove_after,
226230
watchdog_purge_suffix,
227-
) -> Generator[CreatePipelineResponse, None, None]:
231+
) -> Generator[Callable[..., CreatePipelineResponse], None, None]:
228232
"""
229233
Create Delta Live Table Pipeline and clean it up after the test. Returns a function to create pipelines.
230234
Results in a `databricks.sdk.service.pipelines.CreatePipelineResponse` instance.
@@ -268,7 +272,9 @@ def create(**kwargs) -> CreatePipelineResponse:
268272

269273

270274
@fixture
271-
def make_warehouse(ws, make_random, watchdog_remove_after) -> Generator[Wait[GetWarehouseResponse], None, None]:
275+
def make_warehouse(
276+
ws, make_random, watchdog_remove_after
277+
) -> Generator[Callable[..., Wait[GetWarehouseResponse]], None, None]:
272278
"""
273279
Create a Databricks warehouse and clean it up after the test. Returns a function to create warehouses.
274280

src/databricks/labs/pytester/fixtures/iam.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import logging
22
import warnings
3-
from collections.abc import Generator
3+
from collections.abc import Callable, Generator
44
from datetime import timedelta
55

66
from pytest import fixture
@@ -140,7 +140,9 @@ def _double_check_group_in_listing() -> None:
140140
_double_check_group_in_listing()
141141

142142

143-
def _make_group(name: str, cfg: Config, interface, make_random, watchdog_purge_suffix) -> Generator[Group, None, None]:
143+
def _make_group(
144+
name: str, cfg: Config, interface, make_random, watchdog_purge_suffix
145+
) -> Generator[Callable[..., Group], None, None]:
144146
_not_specified = object()
145147

146148
@retried(on=[ResourceConflict], timeout=timedelta(seconds=30))

src/databricks/labs/pytester/fixtures/ml.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from collections.abc import Generator, Callable
1+
from collections.abc import Callable, Generator
22

33
from pytest import fixture
44
from databricks.sdk.service._internal import Wait
@@ -9,7 +9,7 @@
99
ServedModelInputWorkloadSize,
1010
EndpointTag,
1111
)
12-
from databricks.sdk.service.ml import CreateExperimentResponse, ModelTag, GetModelResponse
12+
from databricks.sdk.service.ml import CreateExperimentResponse, ModelDatabricks, ModelTag
1313

1414
from databricks.labs.pytester.fixtures.baseline import factory
1515

@@ -21,7 +21,7 @@ def make_experiment(
2121
make_directory,
2222
log_workspace_link,
2323
watchdog_purge_suffix,
24-
) -> Generator[CreateExperimentResponse, None, None]:
24+
) -> Generator[Callable[..., CreateExperimentResponse], None, None]:
2525
"""
2626
Returns a function to create Databricks Experiments and clean them up after the test.
2727
The function returns a `databricks.sdk.service.ml.CreateExperimentResponse` object.
@@ -63,7 +63,7 @@ def create(
6363

6464

6565
@fixture
66-
def make_model(ws, make_random, watchdog_remove_after) -> Generator[Callable[..., GetModelResponse], None, None]:
66+
def make_model(ws, make_random, watchdog_remove_after) -> Generator[Callable[..., ModelDatabricks], None, None]:
6767
"""
6868
Returns a function to create Databricks Models and clean them up after the test.
6969
The function returns a `databricks.sdk.service.ml.GetModelResponse` object.
@@ -86,7 +86,7 @@ def test_models(make_group, make_model, make_registered_model_permissions):
8686
```
8787
"""
8888

89-
def create(*, model_name: str | None = None, **kwargs) -> GetModelResponse:
89+
def create(*, model_name: str | None = None, **kwargs) -> ModelDatabricks:
9090
if model_name is None:
9191
model_name = f"dummy-{make_random(4)}"
9292
remove_after_tag = ModelTag(key="RemoveAfter", value=watchdog_remove_after)
@@ -96,6 +96,7 @@ def create(*, model_name: str | None = None, **kwargs) -> GetModelResponse:
9696
kwargs["tags"].append(remove_after_tag)
9797
created_model = ws.model_registry.create_model(model_name, **kwargs)
9898
model = ws.model_registry.get_model(created_model.registered_model.name)
99+
assert model.registered_model_databricks is not None
99100
return model.registered_model_databricks
100101

101102
yield from factory("model", create, lambda item: ws.model_registry.delete_model(item.id))

src/databricks/labs/pytester/fixtures/notebooks.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import io
22
import logging
33
import typing
4-
from collections.abc import Generator
4+
from collections.abc import Callable, Generator
55
from pathlib import Path
66

77
from pytest import fixture
@@ -15,7 +15,7 @@
1515

1616

1717
@fixture
18-
def make_notebook(ws, make_random, watchdog_purge_suffix) -> Generator[WorkspacePath, None, None]:
18+
def make_notebook(ws, make_random, watchdog_purge_suffix) -> Generator[Callable[..., WorkspacePath], None, None]:
1919
"""
2020
Returns a function to create Databricks Notebooks and clean them up after the test.
2121
The function returns [`os.PathLike` object](https://github.com/databrickslabs/blueprint?tab=readme-ov-file#python-native-pathlibpath-like-interfaces).
@@ -59,7 +59,9 @@ def create(
5959

6060

6161
@fixture
62-
def make_directory(ws: WorkspaceClient, make_random, watchdog_purge_suffix) -> Generator[WorkspacePath, None, None]:
62+
def make_directory(
63+
ws: WorkspaceClient, make_random, watchdog_purge_suffix
64+
) -> Generator[Callable[..., WorkspacePath], None, None]:
6365
"""
6466
Returns a function to create Databricks Workspace Folders and clean them up after the test.
6567
The function returns [`os.PathLike` object](https://github.com/databrickslabs/blueprint?tab=readme-ov-file#python-native-pathlibpath-like-interfaces).
@@ -90,7 +92,7 @@ def create(*, path: str | Path | None = None) -> WorkspacePath:
9092

9193

9294
@fixture
93-
def make_repo(ws, make_random, watchdog_purge_suffix) -> Generator[RepoInfo, None, None]:
95+
def make_repo(ws, make_random, watchdog_purge_suffix) -> Generator[Callable[..., RepoInfo], None, None]:
9496
"""
9597
Returns a function to create Databricks Repos and clean them up after the test.
9698
The function returns a `databricks.sdk.service.workspace.RepoInfo` object.

src/databricks/labs/pytester/fixtures/redash.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import json
2-
from collections.abc import Generator
2+
from collections.abc import Callable, Generator
33

44
from pytest import fixture
55
from databricks.sdk.service.sql import LegacyQuery
@@ -14,7 +14,7 @@ def make_query(
1414
make_random,
1515
log_workspace_link,
1616
watchdog_remove_after,
17-
) -> Generator[LegacyQuery, None, None]:
17+
) -> Generator[Callable[..., LegacyQuery], None, None]:
1818
"""
1919
Create a query and remove it after the test is done. Returns the `databricks.sdk.service.sql.LegacyQuery` object.
2020

0 commit comments

Comments
 (0)