diff --git a/examples/connect/databricks/fastapi/app.py b/examples/connect/databricks/fastapi/app.py index ed01f41c..a3e49e6a 100644 --- a/examples/connect/databricks/fastapi/app.py +++ b/examples/connect/databricks/fastapi/app.py @@ -3,11 +3,11 @@ from __future__ import annotations import os -from typing import TYPE_CHECKING, Annotated from databricks import sql from databricks.sdk.core import Config, databricks_cli from fastapi import FastAPI, Header +from typing_extensions import TYPE_CHECKING, Annotated from posit.connect.external.databricks import PositCredentialsStrategy diff --git a/integration/tests/posit/connect/test_content_item_permissions.py b/integration/tests/posit/connect/test_content_item_permissions.py index 518178d5..9f3ee04b 100644 --- a/integration/tests/posit/connect/test_content_item_permissions.py +++ b/integration/tests/posit/connect/test_content_item_permissions.py @@ -1,8 +1,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING - import pytest +from typing_extensions import TYPE_CHECKING from posit import connect diff --git a/src/posit/connect/_utils.py b/src/posit/connect/_utils.py index 4b0ed291..c35dabd9 100644 --- a/src/posit/connect/_utils.py +++ b/src/posit/connect/_utils.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any +from typing_extensions import Any def update_dict_values(obj: dict[str, Any], /, **kwargs: Any) -> None: diff --git a/src/posit/connect/bundles.py b/src/posit/connect/bundles.py index 3363e3bb..5dba4ee4 100644 --- a/src/posit/connect/bundles.py +++ b/src/posit/connect/bundles.py @@ -3,7 +3,8 @@ from __future__ import annotations import io -from typing import TYPE_CHECKING, List + +from typing_extensions import TYPE_CHECKING, List from . import resources, tasks diff --git a/src/posit/connect/client.py b/src/posit/connect/client.py index 4a2cba3d..a9248d3a 100644 --- a/src/posit/connect/client.py +++ b/src/posit/connect/client.py @@ -2,9 +2,8 @@ from __future__ import annotations -from typing import TYPE_CHECKING, overload - from requests import Response, Session +from typing_extensions import TYPE_CHECKING, overload from . import hooks, me from .auth import Auth diff --git a/src/posit/connect/config.py b/src/posit/connect/config.py index 59d03c87..500bda73 100644 --- a/src/posit/connect/config.py +++ b/src/posit/connect/config.py @@ -1,7 +1,8 @@ """Client configuration.""" import os -from typing import Optional + +from typing_extensions import Optional from . import urls diff --git a/src/posit/connect/context.py b/src/posit/connect/context.py index ec7ff55a..dbc456b7 100644 --- a/src/posit/connect/context.py +++ b/src/posit/connect/context.py @@ -2,9 +2,9 @@ import functools import weakref -from typing import TYPE_CHECKING, Protocol from packaging.version import Version +from typing_extensions import TYPE_CHECKING, Protocol if TYPE_CHECKING: from .client import Client diff --git a/src/posit/connect/cursors.py b/src/posit/connect/cursors.py index 22f406e1..414d965d 100644 --- a/src/posit/connect/cursors.py +++ b/src/posit/connect/cursors.py @@ -1,7 +1,8 @@ from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING, Any, Generator, List + +from typing_extensions import TYPE_CHECKING, Any, Generator, List if TYPE_CHECKING: from .context import Context diff --git a/src/posit/connect/env.py b/src/posit/connect/env.py index 9ffd4dad..8ce42e2e 100644 --- a/src/posit/connect/env.py +++ b/src/posit/connect/env.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, Any, Iterator, List, Mapping, MutableMapping, Optional +from typing_extensions import TYPE_CHECKING, Any, Iterator, List, Mapping, MutableMapping, Optional from .resources import Resources diff --git a/src/posit/connect/environments.py b/src/posit/connect/environments.py index f8e21a20..f235dbbd 100644 --- a/src/posit/connect/environments.py +++ b/src/posit/connect/environments.py @@ -3,11 +3,11 @@ from __future__ import annotations from abc import abstractmethod -from typing import Protocol from typing_extensions import ( List, Literal, + Protocol, TypedDict, runtime_checkable, ) diff --git a/src/posit/connect/errors.py b/src/posit/connect/errors.py index 8e8bf8db..e7ef7997 100644 --- a/src/posit/connect/errors.py +++ b/src/posit/connect/errors.py @@ -1,5 +1,6 @@ import json -from typing import Any + +from typing_extensions import Any class ClientError(Exception): diff --git a/src/posit/connect/external/databricks.py b/src/posit/connect/external/databricks.py index acc5d490..6578d659 100644 --- a/src/posit/connect/external/databricks.py +++ b/src/posit/connect/external/databricks.py @@ -9,9 +9,9 @@ """ import abc -from typing import Callable, Dict, Optional import requests +from typing_extensions import Callable, Dict, Optional from ..client import Client from ..oauth import Credentials diff --git a/src/posit/connect/external/snowflake.py b/src/posit/connect/external/snowflake.py index 670ac0e9..54789c9b 100644 --- a/src/posit/connect/external/snowflake.py +++ b/src/posit/connect/external/snowflake.py @@ -7,7 +7,7 @@ The APIs in this module are provided as a convenience and are subject to breaking changes. """ -from typing import Optional +from typing_extensions import Optional from ..client import Client from .external import is_local diff --git a/src/posit/connect/groups.py b/src/posit/connect/groups.py index fa5cf9dd..36f530e4 100644 --- a/src/posit/connect/groups.py +++ b/src/posit/connect/groups.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, List, Optional, overload +from typing_extensions import TYPE_CHECKING, List, Optional, overload from .paginator import Paginator from .resources import BaseResource, Resources diff --git a/src/posit/connect/jobs.py b/src/posit/connect/jobs.py index 39036be0..69fb38af 100644 --- a/src/posit/connect/jobs.py +++ b/src/posit/connect/jobs.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import ( +from typing_extensions import ( Iterable, Literal, Protocol, diff --git a/src/posit/connect/metrics/shiny_usage.py b/src/posit/connect/metrics/shiny_usage.py index a5240f4f..d9657d9f 100644 --- a/src/posit/connect/metrics/shiny_usage.py +++ b/src/posit/connect/metrics/shiny_usage.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import List, overload +from typing_extensions import List, overload from ..cursors import CursorPaginator from ..resources import BaseResource, Resources diff --git a/src/posit/connect/metrics/usage.py b/src/posit/connect/metrics/usage.py index 47f2f1f0..2bb203f0 100644 --- a/src/posit/connect/metrics/usage.py +++ b/src/posit/connect/metrics/usage.py @@ -2,9 +2,8 @@ from __future__ import annotations -from typing import List, overload - from requests.sessions import Session as Session +from typing_extensions import List, overload from .. import resources from . import shiny_usage, visits diff --git a/src/posit/connect/metrics/visits.py b/src/posit/connect/metrics/visits.py index ea88dfb6..503d14af 100644 --- a/src/posit/connect/metrics/visits.py +++ b/src/posit/connect/metrics/visits.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import List, overload +from typing_extensions import List, overload from ..cursors import CursorPaginator from ..resources import BaseResource, Resources diff --git a/src/posit/connect/oauth/associations.py b/src/posit/connect/oauth/associations.py index 44723dfc..5d20db02 100644 --- a/src/posit/connect/oauth/associations.py +++ b/src/posit/connect/oauth/associations.py @@ -1,6 +1,6 @@ """OAuth association resources.""" -from typing import List +from typing_extensions import List from ..context import Context from ..resources import BaseResource, Resources diff --git a/src/posit/connect/oauth/integrations.py b/src/posit/connect/oauth/integrations.py index 3e3259e9..7dca39eb 100644 --- a/src/posit/connect/oauth/integrations.py +++ b/src/posit/connect/oauth/integrations.py @@ -1,6 +1,6 @@ """OAuth integration resources.""" -from typing import List, Optional, overload +from typing_extensions import List, Optional, overload from ..resources import BaseResource, Resources from .associations import IntegrationAssociations diff --git a/src/posit/connect/oauth/oauth.py b/src/posit/connect/oauth/oauth.py index 90df7270..efec4395 100644 --- a/src/posit/connect/oauth/oauth.py +++ b/src/posit/connect/oauth/oauth.py @@ -1,9 +1,8 @@ from __future__ import annotations import os -from typing import TYPE_CHECKING, Optional -from typing_extensions import TypedDict +from typing_extensions import TYPE_CHECKING, Optional, TypedDict from ..resources import Resources from .integrations import Integrations diff --git a/src/posit/connect/oauth/sessions.py b/src/posit/connect/oauth/sessions.py index fae3981b..e0db5829 100644 --- a/src/posit/connect/oauth/sessions.py +++ b/src/posit/connect/oauth/sessions.py @@ -1,6 +1,6 @@ """OAuth session resources.""" -from typing import List, Optional, overload +from typing_extensions import List, Optional, overload from ..resources import BaseResource, Resources diff --git a/src/posit/connect/paginator.py b/src/posit/connect/paginator.py index 75b224d3..0252e66f 100644 --- a/src/posit/connect/paginator.py +++ b/src/posit/connect/paginator.py @@ -1,7 +1,8 @@ from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING, Generator, List + +from typing_extensions import TYPE_CHECKING, Generator, List if TYPE_CHECKING: from .context import Context diff --git a/src/posit/connect/permissions.py b/src/posit/connect/permissions.py index 211decc2..4b029cb5 100644 --- a/src/posit/connect/permissions.py +++ b/src/posit/connect/permissions.py @@ -2,9 +2,8 @@ from __future__ import annotations -from typing import TYPE_CHECKING, List, Optional, overload - from requests.sessions import Session as Session +from typing_extensions import TYPE_CHECKING, List, Optional, overload from .resources import BaseResource, Resources diff --git a/src/posit/connect/resources.py b/src/posit/connect/resources.py index cae3ab09..6617e4f0 100644 --- a/src/posit/connect/resources.py +++ b/src/posit/connect/resources.py @@ -3,7 +3,8 @@ import posixpath import warnings from abc import ABC -from typing import ( + +from typing_extensions import ( TYPE_CHECKING, Any, Hashable, diff --git a/src/posit/connect/system.py b/src/posit/connect/system.py index c6aa1424..60b46ab8 100644 --- a/src/posit/connect/system.py +++ b/src/posit/connect/system.py @@ -2,9 +2,7 @@ from __future__ import annotations -from typing import TYPE_CHECKING, List, Literal, overload - -from typing_extensions import TypedDict, Unpack +from typing_extensions import TYPE_CHECKING, List, Literal, TypedDict, Unpack, overload from .context import ContextManager from .resources import Active diff --git a/src/posit/connect/tags.py b/src/posit/connect/tags.py index 8762e1f0..4f03a36d 100644 --- a/src/posit/connect/tags.py +++ b/src/posit/connect/tags.py @@ -3,9 +3,8 @@ from __future__ import annotations from abc import ABC, abstractmethod -from typing import TYPE_CHECKING, Optional, overload -from typing_extensions import NotRequired, TypedDict, Unpack +from typing_extensions import TYPE_CHECKING, NotRequired, Optional, TypedDict, Unpack, overload from ._utils import update_dict_values from .context import Context, ContextManager diff --git a/src/posit/connect/tasks.py b/src/posit/connect/tasks.py index 8360304d..ac6b2931 100644 --- a/src/posit/connect/tasks.py +++ b/src/posit/connect/tasks.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import overload +from typing_extensions import overload from . import resources diff --git a/src/posit/connect/users.py b/src/posit/connect/users.py index 334617a5..a925df90 100644 --- a/src/posit/connect/users.py +++ b/src/posit/connect/users.py @@ -2,9 +2,15 @@ from __future__ import annotations -from typing import TYPE_CHECKING, List, Literal - -from typing_extensions import NotRequired, Required, TypedDict, Unpack +from typing_extensions import ( + TYPE_CHECKING, + List, + Literal, + NotRequired, + Required, + TypedDict, + Unpack, +) from . import me from .content import Content diff --git a/src/posit/connect/vanities.py b/src/posit/connect/vanities.py index 9342ec16..1f105f21 100644 --- a/src/posit/connect/vanities.py +++ b/src/posit/connect/vanities.py @@ -1,8 +1,6 @@ """Vanity URL resources.""" -from typing import Callable, List, Optional - -from typing_extensions import NotRequired, Required, TypedDict, Unpack +from typing_extensions import Callable, List, NotRequired, Optional, Required, TypedDict, Unpack from .context import Context from .errors import ClientError diff --git a/src/posit/connect/variants.py b/src/posit/connect/variants.py index 9970c70e..2e518fb0 100644 --- a/src/posit/connect/variants.py +++ b/src/posit/connect/variants.py @@ -1,4 +1,4 @@ -from typing import List +from typing_extensions import List from .context import Context from .resources import BaseResource, Resources diff --git a/tests/posit/connect/external/test_databricks.py b/tests/posit/connect/external/test_databricks.py index 9861b907..134911b1 100644 --- a/tests/posit/connect/external/test_databricks.py +++ b/tests/posit/connect/external/test_databricks.py @@ -1,9 +1,9 @@ import base64 -from typing import Dict from unittest.mock import patch import pytest import responses +from typing_extensions import Dict from posit.connect import Client from posit.connect.external.databricks import ( diff --git a/tests/posit/connect/test_internal_code.py b/tests/posit/connect/test_internal_code.py new file mode 100644 index 00000000..6672911f --- /dev/null +++ b/tests/posit/connect/test_internal_code.py @@ -0,0 +1,20 @@ +from pathlib import Path + +import pytest + +here = Path(__file__).resolve().parent +root_dir = here.parent.parent.parent + +tests_dir = root_dir / "tests" +src_dir = root_dir / "src" +integration_tests_dir = tests_dir / "integration" / "tests" + + +@pytest.mark.parametrize("path", [tests_dir, src_dir, integration_tests_dir]) +def test_no_from_typing_imports(path: Path): + for python_file in path.rglob("*.py"): + file_txt = python_file.read_text() + if "\nfrom typing import" in file_txt: + raise ValueError( + f"Found `from typing import` in {python_file.relative_to(root_dir)}. Please replace the import with `typing_extensions`." + ) diff --git a/tests/posit/connect/test_jobs.py b/tests/posit/connect/test_jobs.py index b2463d98..802dd850 100644 --- a/tests/posit/connect/test_jobs.py +++ b/tests/posit/connect/test_jobs.py @@ -1,8 +1,7 @@ -from typing import TYPE_CHECKING - import pytest import responses from requests.exceptions import HTTPError +from typing_extensions import TYPE_CHECKING from posit.connect.client import Client diff --git a/tests/posit/connect/test_resources.py b/tests/posit/connect/test_resources.py index a17d252b..52536b96 100644 --- a/tests/posit/connect/test_resources.py +++ b/tests/posit/connect/test_resources.py @@ -1,8 +1,9 @@ import warnings -from typing import Optional from unittest import mock from unittest.mock import Mock +from typing_extensions import Optional + from posit.connect.resources import BaseResource config = Mock()