Skip to content

Commit b101133

Browse files
[Storage] Fix type hints for classmethods in Blob and Datalake (#26611)
1 parent b950e8b commit b101133

21 files changed

+195
-221
lines changed

sdk/storage/azure-storage-blob/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
### Bugs Fixed
1010

1111
### Other Changes
12+
- Added `typing-extensions>=4.0.1` as a dependency.
1213

1314
## 12.14.0 (2022-10-11)
1415

sdk/storage/azure-storage-blob/azure/storage/blob/_blob_client.py

+23-26
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,19 @@
88
from functools import partial
99
from io import BytesIO
1010
from typing import (
11-
Any, AnyStr, Dict, IO, Iterable, List, Optional, overload, Tuple, Type, TypeVar, Union,
11+
Any, AnyStr, Dict, IO, Iterable, List, Optional, overload, Tuple, Union,
1212
TYPE_CHECKING
1313
)
1414
from urllib.parse import urlparse, quote, unquote
1515
import warnings
1616

1717
import six
18+
from typing_extensions import Self
19+
1820
from azure.core.exceptions import ResourceNotFoundError, HttpResponseError, ResourceExistsError
1921
from azure.core.paging import ItemPaged
2022
from azure.core.pipeline import Pipeline
2123
from azure.core.tracing.decorator import distributed_trace
22-
2324
from ._shared import encode_base64
2425
from ._shared.base_client import StorageAccountHostsMixin, parse_connection_str, parse_query, TransportWrapper
2526
from ._shared.uploads import IterStreamer
@@ -66,6 +67,7 @@
6667
)
6768

6869
if TYPE_CHECKING:
70+
from azure.core.credentials import AzureNamedKeyCredential, AzureSasCredential, TokenCredential
6971
from datetime import datetime
7072
from ._generated.models import BlockList
7173
from ._models import (
@@ -80,8 +82,6 @@
8082
'The require_encryption flag is set, but encryption is not supported'
8183
' for this method.')
8284

83-
ClassType = TypeVar("ClassType")
84-
8585

8686
class BlobClient(StorageAccountHostsMixin, StorageEncryptionMixin): # pylint: disable=too-many-public-methods
8787
"""A client to interact with a specific blob, although that blob may not yet exist.
@@ -149,14 +149,13 @@ class BlobClient(StorageAccountHostsMixin, StorageEncryptionMixin): # pylint: d
149149
:caption: Creating the BlobClient from a SAS URL to a blob.
150150
"""
151151
def __init__(
152-
self, account_url, # type: str
153-
container_name, # type: str
154-
blob_name, # type: str
155-
snapshot=None, # type: Optional[Union[str, Dict[str, Any]]]
156-
credential=None, # type: Optional[Union[str, Dict[str, str], AzureNamedKeyCredential, AzureSasCredential, "TokenCredential"]] # pylint: disable=line-too-long
157-
**kwargs # type: Any
158-
):
159-
# type: (...) -> None
152+
self, account_url: str,
153+
container_name: str,
154+
blob_name: str,
155+
snapshot: Optional[Union[str, Dict[str, Any]]] = None,
156+
credential: Optional[Union[str, Dict[str, str], "AzureNamedKeyCredential", "AzureSasCredential", "TokenCredential"]] = None, # pylint: disable=line-too-long
157+
**kwargs: Any
158+
) -> None:
160159
try:
161160
if not account_url.lower().startswith('http'):
162161
account_url = "https://" + account_url
@@ -213,12 +212,11 @@ def _encode_source_url(self, source_url):
213212

214213
@classmethod
215214
def from_blob_url(
216-
cls, # type: Type[ClassType]
217-
blob_url, # type: str
218-
credential=None, # type: Optional[Union[str, Dict[str, str], AzureNamedKeyCredential, AzureSasCredential, "TokenCredential"]] # pylint: disable=line-too-long
219-
snapshot=None, # type: Optional[Union[str, Dict[str, Any]]]
220-
**kwargs # type: Any
221-
): # type: (...) -> ClassType
215+
cls, blob_url: str,
216+
credential: Optional[Union[str, Dict[str, str], "AzureNamedKeyCredential", "AzureSasCredential", "TokenCredential"]] = None, # pylint: disable=line-too-long
217+
snapshot: Optional[Union[str, Dict[str, Any]]] = None,
218+
**kwargs: Any
219+
) -> Self:
222220
"""Create BlobClient from a blob url. This doesn't support customized blob url with '/' in blob name.
223221
224222
:param str blob_url:
@@ -295,14 +293,13 @@ def from_blob_url(
295293

296294
@classmethod
297295
def from_connection_string(
298-
cls, # type: Type[ClassType]
299-
conn_str, # type: str
300-
container_name, # type: str
301-
blob_name, # type: str
302-
snapshot=None, # type: Optional[str]
303-
credential=None, # type: Optional[Union[str, Dict[str, str], AzureNamedKeyCredential, AzureSasCredential, "TokenCredential"]] # pylint: disable=line-too-long
304-
**kwargs # type: Any
305-
): # type: (...) -> ClassType
296+
cls, conn_str: str,
297+
container_name: str,
298+
blob_name: str,
299+
snapshot: Optional[Union[str, Dict[str, Any]]] = None,
300+
credential: Optional[Union[str, Dict[str, str], "AzureNamedKeyCredential", "AzureSasCredential", "TokenCredential"]] = None, # pylint: disable=line-too-long
301+
**kwargs: Any
302+
) -> Self:
306303
"""Create BlobClient from a Connection String.
307304
308305
:param str conn_str:

sdk/storage/azure-storage-blob/azure/storage/blob/_blob_service_client.py

+13-15
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,18 @@
66

77
import functools
88
import warnings
9-
from typing import ( # pylint: disable=unused-import
10-
Any, Dict, List, Optional, TypeVar, Union,
9+
from typing import (
10+
Any, Dict, List, Optional, Union,
1111
TYPE_CHECKING
1212
)
1313
from urllib.parse import urlparse
1414

15+
from typing_extensions import Self
16+
1517
from azure.core.exceptions import HttpResponseError
1618
from azure.core.paging import ItemPaged
1719
from azure.core.pipeline import Pipeline
1820
from azure.core.tracing.decorator import distributed_trace
19-
2021
from ._shared.base_client import StorageAccountHostsMixin, TransportWrapper, parse_connection_str, parse_query
2122
from ._shared.models import LocationMode
2223
from ._shared.parser import _to_utc_datetime
@@ -36,6 +37,7 @@
3637
from ._serialize import get_api_version
3738

3839
if TYPE_CHECKING:
40+
from azure.core.credentials import AzureNamedKeyCredential, AzureSasCredential, TokenCredential
3941
from datetime import datetime
4042
from ._shared.models import UserDelegationKey
4143
from ._lease import BlobLeaseClient
@@ -51,8 +53,6 @@
5153
FilteredBlob
5254
)
5355

54-
ClassType = TypeVar("ClassType")
55-
5656

5757
class BlobServiceClient(StorageAccountHostsMixin, StorageEncryptionMixin):
5858
"""A client to interact with the Blob Service at the account level.
@@ -119,11 +119,10 @@ class BlobServiceClient(StorageAccountHostsMixin, StorageEncryptionMixin):
119119
"""
120120

121121
def __init__(
122-
self, account_url, # type: str
123-
credential=None, # type: Optional[Union[str, Dict[str, str], AzureNamedKeyCredential, AzureSasCredential, "TokenCredential"]] # pylint: disable=line-too-long
124-
**kwargs # type: Any
125-
):
126-
# type: (...) -> None
122+
self, account_url: str,
123+
credential: Optional[Union[str, Dict[str, str], "AzureNamedKeyCredential", "AzureSasCredential", "TokenCredential"]] = None, # pylint: disable=line-too-long
124+
**kwargs: Any
125+
) -> None:
127126
try:
128127
if not account_url.lower().startswith('http'):
129128
account_url = "https://" + account_url
@@ -148,11 +147,10 @@ def _format_url(self, hostname):
148147

149148
@classmethod
150149
def from_connection_string(
151-
cls, # type: Type[ClassType]
152-
conn_str, # type: str
153-
credential=None, # type: Optional[Union[str, Dict[str, str], AzureNamedKeyCredential, AzureSasCredential, "TokenCredential"]] # pylint: disable=line-too-long
154-
**kwargs # type: Any
155-
): # type: (...) -> ClassType
150+
cls, conn_str: str,
151+
credential: Optional[Union[str, Dict[str, str], "AzureNamedKeyCredential", "AzureSasCredential", "TokenCredential"]] = None, # pylint: disable=line-too-long
152+
**kwargs: Any
153+
) -> Self:
156154
"""Create BlobServiceClient from a Connection String.
157155
158156
:param str conn_str:

sdk/storage/azure-storage-blob/azure/storage/blob/_container_client.py

+19-23
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,21 @@
66
# --------------------------------------------------------------------------
77

88
import functools
9-
from typing import ( # pylint: disable=unused-import
10-
Any, AnyStr, Dict, List, IO, Iterable, Iterator, Optional, overload, TypeVar, Union,
9+
from typing import (
10+
Any, AnyStr, Dict, List, IO, Iterable, Iterator, Optional, overload, Union,
1111
TYPE_CHECKING
1212
)
1313
from urllib.parse import urlparse, quote, unquote
1414

1515
import six
16+
from typing_extensions import Self
17+
1618
from azure.core import MatchConditions
1719
from azure.core.exceptions import HttpResponseError, ResourceNotFoundError
1820
from azure.core.paging import ItemPaged
1921
from azure.core.pipeline import Pipeline
2022
from azure.core.pipeline.transport import HttpRequest, HttpResponse
2123
from azure.core.tracing.decorator import distributed_trace
22-
2324
from ._shared.base_client import StorageAccountHostsMixin, TransportWrapper, parse_connection_str, parse_query
2425
from ._shared.request_handlers import add_metadata_headers, serialize_iso
2526
from ._shared.response_handlers import (
@@ -50,6 +51,7 @@
5051
from ._serialize import get_modify_conditions, get_container_cpk_scope_info, get_api_version, get_access_conditions
5152

5253
if TYPE_CHECKING:
54+
from azure.core.credentials import AzureNamedKeyCredential, AzureSasCredential, TokenCredential
5355
from datetime import datetime
5456
from ._models import ( # pylint: disable=unused-import
5557
PublicAccess,
@@ -70,9 +72,6 @@ def _get_blob_name(blob):
7072
return blob
7173

7274

73-
ClassType = TypeVar("ClassType")
74-
75-
7675
class ContainerClient(StorageAccountHostsMixin, StorageEncryptionMixin): # pylint: disable=too-many-public-methods
7776
"""A client to interact with a specific container, although that container
7877
may not yet exist.
@@ -138,12 +137,11 @@ class ContainerClient(StorageAccountHostsMixin, StorageEncryptionMixin): # py
138137
:caption: Creating the container client directly.
139138
"""
140139
def __init__(
141-
self, account_url, # type: str
142-
container_name, # type: str
143-
credential=None, # type: Optional[Union[str, Dict[str, str], AzureNamedKeyCredential, AzureSasCredential, "TokenCredential"]] # pylint: disable=line-too-long
144-
**kwargs # type: Any
145-
):
146-
# type: (...) -> None
140+
self, account_url: str,
141+
container_name: str,
142+
credential: Optional[Union[str, Dict[str, str], "AzureNamedKeyCredential", "AzureSasCredential", "TokenCredential"]] = None, # pylint: disable=line-too-long
143+
**kwargs: Any
144+
) -> None:
147145
try:
148146
if not account_url.lower().startswith('http'):
149147
account_url = "https://" + account_url
@@ -182,11 +180,10 @@ def _format_url(self, hostname):
182180

183181
@classmethod
184182
def from_container_url(
185-
cls, # type: Type[ClassType]
186-
container_url, # type: str
187-
credential=None, # type: Optional[Union[str, Dict[str, str], AzureNamedKeyCredential, AzureSasCredential, "TokenCredential"]] # pylint: disable=line-too-long
188-
**kwargs # type: Any
189-
): # type: (...) -> ClassType
183+
cls, container_url: str,
184+
credential: Optional[Union[str, Dict[str, str], "AzureNamedKeyCredential", "AzureSasCredential", "TokenCredential"]] = None, # pylint: disable=line-too-long
185+
**kwargs: Any
186+
) -> Self:
190187
"""Create ContainerClient from a container url.
191188
192189
:param str container_url:
@@ -231,12 +228,11 @@ def from_container_url(
231228

232229
@classmethod
233230
def from_connection_string(
234-
cls, # type: Type[ClassType]
235-
conn_str, # type: str
236-
container_name, # type: str
237-
credential=None, # type: Optional[Union[str, Dict[str, str], AzureNamedKeyCredential, AzureSasCredential, "TokenCredential"]] # pylint: disable=line-too-long
238-
**kwargs # type: Any
239-
): # type: (...) -> ClassType
231+
cls, conn_str: str,
232+
container_name: str,
233+
credential: Optional[Union[str, Dict[str, str], "AzureNamedKeyCredential", "AzureSasCredential", "TokenCredential"]] = None, # pylint: disable=line-too-long
234+
**kwargs: Any
235+
) -> Self:
240236
"""Create ContainerClient from a Connection String.
241237
242238
:param str conn_str:

sdk/storage/azure-storage-blob/azure/storage/blob/aio/_blob_client_async.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
)
4444

4545
if TYPE_CHECKING:
46+
from azure.core.credentials import AzureNamedKeyCredential, AzureSasCredential, TokenCredential
4647
from datetime import datetime
4748
from .._models import ( # pylint: disable=unused-import
4849
ContentSettings,
@@ -115,14 +116,13 @@ class BlobClient(AsyncStorageAccountHostsMixin, BlobClientBase, StorageEncryptio
115116
:caption: Creating the BlobClient from a SAS URL to a blob.
116117
"""
117118
def __init__(
118-
self, account_url, # type: str
119-
container_name, # type: str
120-
blob_name, # type: str
121-
snapshot=None, # type: Optional[Union[str, Dict[str, Any]]]
122-
credential=None, # type: Optional[Union[str, Dict[str, str], AzureNamedKeyCredential, AzureSasCredential, "TokenCredential"]] # pylint: disable=line-too-long
123-
**kwargs # type: Any
124-
):
125-
# type: (...) -> None
119+
self, account_url: str,
120+
container_name: str,
121+
blob_name: str,
122+
snapshot: Optional[Union[str, Dict[str, Any]]] = None,
123+
credential: Optional[Union[str, Dict[str, str], "AzureNamedKeyCredential", "AzureSasCredential", "TokenCredential"]] = None, # pylint: disable=line-too-long
124+
**kwargs: Any
125+
) -> None:
126126
kwargs['retry_policy'] = kwargs.get('retry_policy') or ExponentialRetry(**kwargs)
127127
super(BlobClient, self).__init__(
128128
account_url,

sdk/storage/azure-storage-blob/azure/storage/blob/aio/_blob_service_client_async.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import functools
99
import warnings
10-
from typing import ( # pylint: disable=unused-import
10+
from typing import (
1111
Any, Dict, List, Optional, Union,
1212
TYPE_CHECKING
1313
)
@@ -40,6 +40,7 @@
4040
from ._models import ContainerPropertiesPaged, FilteredBlobPaged
4141

4242
if TYPE_CHECKING:
43+
from azure.core.credentials import AzureNamedKeyCredential, AzureSasCredential, TokenCredential
4344
from datetime import datetime
4445
from .._shared.models import UserDelegationKey
4546
from ._lease_async import BlobLeaseClient
@@ -115,11 +116,10 @@ class BlobServiceClient(AsyncStorageAccountHostsMixin, BlobServiceClientBase, St
115116
"""
116117

117118
def __init__(
118-
self, account_url, # type: str
119-
credential=None, # type: Optional[Union[str, Dict[str, str], AzureNamedKeyCredential, AzureSasCredential, "TokenCredential"]] # pylint: disable=line-too-long
120-
**kwargs # type: Any
121-
):
122-
# type: (...) -> None
119+
self, account_url: str,
120+
credential: Optional[Union[str, Dict[str, str], "AzureNamedKeyCredential", "AzureSasCredential", "TokenCredential"]] = None, # pylint: disable=line-too-long
121+
**kwargs: Any
122+
) -> None:
123123
kwargs['retry_policy'] = kwargs.get('retry_policy') or ExponentialRetry(**kwargs)
124124
super(BlobServiceClient, self).__init__(
125125
account_url,

sdk/storage/azure-storage-blob/azure/storage/blob/aio/_container_client_async.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
from ._models import FilteredBlobPaged
4242

4343
if TYPE_CHECKING:
44+
from azure.core.credentials import AzureNamedKeyCredential, AzureSasCredential, TokenCredential
4445
from datetime import datetime
4546
from .._models import ( # pylint: disable=unused-import
4647
AccessPolicy,
@@ -110,12 +111,11 @@ class ContainerClient(AsyncStorageAccountHostsMixin, ContainerClientBase, Storag
110111
:caption: Creating the container client directly.
111112
"""
112113
def __init__(
113-
self, account_url, # type: str
114-
container_name, # type: str
115-
credential=None, # type: Optional[Union[str, Dict[str, str], AzureNamedKeyCredential, AzureSasCredential, "TokenCredential"]] # pylint: disable=line-too-long
116-
**kwargs # type: Any
117-
):
118-
# type: (...) -> None
114+
self, account_url: str,
115+
container_name: str,
116+
credential: Optional[Union[str, Dict[str, str], "AzureNamedKeyCredential", "AzureSasCredential", "TokenCredential"]] = None, # pylint: disable=line-too-long
117+
**kwargs: Any
118+
) -> None:
119119
kwargs['retry_policy'] = kwargs.get('retry_policy') or ExponentialRetry(**kwargs)
120120
super(ContainerClient, self).__init__(
121121
account_url,

sdk/storage/azure-storage-blob/setup.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
install_requires=[
7979
"azure-core<2.0.0,>=1.24.2",
8080
"msrest>=0.7.1",
81-
"cryptography>=2.1.4"
81+
"cryptography>=2.1.4",
82+
"typing-extensions>=4.0.1"
8283
],
8384
)

sdk/storage/azure-storage-file-datalake/CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
### Bugs Fixed
1010

1111
### Other Changes
12+
- Added `typing-extensions>=4.0.1` as a dependency.
1213

1314
## 12.9.0 (2022-10-11)
1415

0 commit comments

Comments
 (0)