diff --git a/azure-core/azure/__init__.py b/azure-core/azure/__init__.py index 69e3be50dac4..0c36c2076ba0 100644 --- a/azure-core/azure/__init__.py +++ b/azure-core/azure/__init__.py @@ -1 +1 @@ -__path__ = __import__('pkgutil').extend_path(__path__, __name__) +__path__ = __import__('pkgutil').extend_path(__path__, __name__) # type: ignore diff --git a/azure-core/azure/core/paging.py b/azure-core/azure/core/paging.py index c0b281cf1d22..6eacf4600ce8 100644 --- a/azure-core/azure/core/paging.py +++ b/azure-core/azure/core/paging.py @@ -30,11 +30,11 @@ except ImportError: from collections import Iterator -from typing import Dict, Any, List, Callable, Optional, TYPE_CHECKING # pylint: disable=unused-import +from typing import Dict, Any, List, Callable, Optional, TypeVar, TYPE_CHECKING # pylint: disable=unused-import if TYPE_CHECKING: - from .pipeline import HttpResponse # pylint: disable=unused-import - from msrest.serialization import Deserializer, Model # pylint: disable=unused-import + HTTPResponseType = TypeVar("HTTPResponseType") + from msrest.serialization import Deserializer, Model # type: ignore # pylint: disable=unused-import if sys.version_info >= (3, 5, 2): # Not executed on old Python, no syntax error @@ -54,7 +54,7 @@ class Paged(AsyncPagedMixin, Iterator): _attribute_map = {} # type: Dict[str, Dict[str, Any]] def __init__(self, command, deserializer, **kwargs): - # type: (Callable[[str], HttpResponse], Deserializer, Any) -> None + # type: (Callable[[str], HTTPResponseType], Deserializer, Any) -> None super(Paged, self).__init__(**kwargs) # type: ignore # Sets next_link, current_page, and _current_page_iter_index. self.next_link = "" @@ -62,7 +62,7 @@ def __init__(self, command, deserializer, **kwargs): self._current_page_iter_index = 0 self._deserializer = deserializer self._get_next = command - self._response = None # type: Optional[HttpResponse] + self._response = None # type: Optional[HTTPResponseType] def __iter__(self): """Return 'self'.""" diff --git a/azure-core/azure/core/pipeline/__init__.py b/azure-core/azure/core/pipeline/__init__.py index 0f69880febce..a63f3b5b7733 100644 --- a/azure-core/azure/core/pipeline/__init__.py +++ b/azure-core/azure/core/pipeline/__init__.py @@ -25,6 +25,10 @@ # -------------------------------------------------------------------------- import abc +from typing import TYPE_CHECKING, Generic, TypeVar, cast, IO, List, Union, Any, Mapping, Dict, Optional, Tuple, Callable, Iterator # pylint: disable=unused-import + +HTTPResponseType = TypeVar("HTTPResponseType") +HTTPRequestType = TypeVar("HTTPRequestType") try: ABC = abc.ABC @@ -107,7 +111,7 @@ class PipelineResponse(object): However, nothing prevents a policy to actually sub-class this class a return it instead of the initial instance. """ def __init__(self, http_request, http_response, context): - # type: (HttpRequest[HTTPRequestType], HTTPResponseType, Optional[Dict[str, Any]]) -> None + # type: (HTTPRequestType, HTTPResponseType, Optional[Dict[str, Any]]) -> None self.http_request = http_request self.http_response = http_response self.context = context diff --git a/azure-core/azure/core/pipeline/base.py b/azure-core/azure/core/pipeline/base.py index b839b9db9c14..02f3fffb4f29 100644 --- a/azure-core/azure/core/pipeline/base.py +++ b/azure-core/azure/core/pipeline/base.py @@ -28,9 +28,9 @@ import logging import os.path try: - from urlparse import urlparse + from urlparse import urlparse # type: ignore except ImportError: - from urllib.parse import urlparse + from urllib.parse import urlparse # type: ignore import xml.etree.ElementTree as ET from azure.core.pipeline import AbstractContextManager, PipelineRequest, PipelineResponse, PipelineContext from azure.core.pipeline.policies import HTTPPolicy, SansIOHTTPPolicy @@ -52,7 +52,7 @@ def __init__(self, policy): self._policy = policy def send(self, request): - # type: (PipelineRequest[HTTPRequestType], Any) -> PipelineResponse[HTTPRequestType, HTTPResponseType] + # type: (PipelineRequest) -> PipelineResponse self._policy.on_request(request) try: response = self.next.send(request) @@ -67,7 +67,7 @@ def send(self, request): class _TransportRunner(HTTPPolicy): def __init__(self, sender): - # type: (HttpTransport) -> None + # type: (Any) -> None super(_TransportRunner, self).__init__() self._sender = sender @@ -87,7 +87,7 @@ class Pipeline(AbstractContextManager, Generic[HTTPRequestType, HTTPResponseType """ def __init__(self, transport, policies=None): - # type: (HttpTransport, List[Union[HTTPPolicy, SansIOHTTPPolicy]]) -> None + # type: (Any, List[Union[HTTPPolicy, SansIOHTTPPolicy]]) -> None self._impl_policies = [] # type: List[HTTPPolicy] self._transport = transport # type: HTTPPolicy @@ -112,6 +112,6 @@ def __exit__(self, *exc_details): # pylint: disable=arguments-differ def run(self, request, **kwargs): # type: (HTTPRequestType, Any) -> PipelineResponse context = PipelineContext(self._transport, **kwargs) - pipeline_request = PipelineRequest(request, context) # type: PipelineRequest[HTTPRequestType] + pipeline_request = PipelineRequest(request, context) # type: PipelineRequest first_node = self._impl_policies[0] if self._impl_policies else _TransportRunner(self._transport) return first_node.send(pipeline_request) # type: ignore diff --git a/azure-core/azure/core/pipeline/policies/base.py b/azure-core/azure/core/pipeline/policies/base.py index 0065e4c29d55..ddb903cfea4c 100644 --- a/azure-core/azure/core/pipeline/policies/base.py +++ b/azure-core/azure/core/pipeline/policies/base.py @@ -30,7 +30,7 @@ from typing import TYPE_CHECKING, Generic, TypeVar, cast, IO, List, Union, Any, Mapping, Dict, Optional, Tuple, Callable, Iterator # pylint: disable=unused-import -from azure.core.pipeline import ABC +from azure.core.pipeline import ABC, PipelineRequest, PipelineResponse HTTPResponseType = TypeVar("HTTPResponseType") HTTPRequestType = TypeVar("HTTPRequestType") @@ -38,7 +38,7 @@ _LOGGER = logging.getLogger(__name__) -class HTTPPolicy(ABC, Generic[HTTPRequestType, HTTPResponseType]): +class HTTPPolicy(ABC, Generic[HTTPRequestType, HTTPResponseType]): # type: ignore """An HTTP policy ABC. """ def __init__(self): @@ -46,7 +46,7 @@ def __init__(self): @abc.abstractmethod def send(self, request): - # type: (PipelineRequest[HTTPRequestType]) -> PipelineResponse[HTTPRequestType, HTTPResponseType] + # type: (PipelineRequest) -> PipelineResponse """Mutate the request. Context content is dependent on the HttpTransport. @@ -67,20 +67,21 @@ class SansIOHTTPPolicy(Generic[HTTPRequestType, HTTPResponseType]): sync or async implementation or specific HTTP lib """ + def on_request(self, request, **kwargs): - # type: (PipelineRequest[HTTPRequestType], Any) -> None + # type: (PipelineRequest, Any) -> None """Is executed before sending the request to next policy. """ pass def on_response(self, request, response, **kwargs): - # type: (PipelineRequest[HTTPRequestType], PipelineResponse[HTTPRequestType, HTTPResponseType], Any) -> None + # type: (PipelineRequest, PipelineResponse, Any) -> None """Is executed after the request comes back from the policy. """ pass def on_exception(self, request, **kwargs): - # type: (PipelineRequest[HTTPRequestType], Any) -> bool + # type: (PipelineRequest, Any) -> bool """Is executed if an exception comes back fron the following policy. @@ -109,7 +110,7 @@ class RequestHistory(object): """ def __init__(self, http_request, http_response=None, error=None, context=None): - # type: (PipelineRequest[HTTPRequestType], Exception, Optional[Dict[str, Any]]) -> None + # type: (PipelineRequest, PipelineResponse, Exception, Optional[Dict[str, Any]]) -> None self.http_request = copy.deepcopy(http_request) self.http_response = http_response self.error = error diff --git a/azure-core/azure/core/pipeline/policies/base_async.py b/azure-core/azure/core/pipeline/policies/base_async.py index 2d1769407277..0cd7cba9fd89 100644 --- a/azure-core/azure/core/pipeline/policies/base_async.py +++ b/azure-core/azure/core/pipeline/policies/base_async.py @@ -54,10 +54,10 @@ class AsyncHTTPPolicy(abc.ABC, Generic[HTTPRequestType, AsyncHTTPResponseType]): """ def __init__(self) -> None: # next will be set once in the pipeline - self.next = None # type: Optional[Union[AsyncHTTPPolicy[HTTPRequestType, AsyncHTTPResponseType], AsyncHttpTransport[HTTPRequestType, AsyncHTTPResponseType]]] + self.next = None # type: Optional[Any] @abc.abstractmethod - async def send(self, request: PipelineRequest): + async def send(self, request: PipelineRequest) -> PipelineResponse: """Mutate the request. Context content is dependent on the HttpTransport. diff --git a/azure-core/azure/core/pipeline/policies/credentials.py b/azure-core/azure/core/pipeline/policies/credentials.py index 96ba9738b114..641910bdac5c 100644 --- a/azure-core/azure/core/pipeline/policies/credentials.py +++ b/azure-core/azure/core/pipeline/policies/credentials.py @@ -36,7 +36,7 @@ import requests from requests.models import CONTENT_CHUNK_SIZE -from urllib3 import Retry # Needs requests 2.16 at least to be safe +from urllib3 import Retry # type: ignore # Needs requests 2.16 at least to be safe from .base import HTTPPolicy diff --git a/azure-core/azure/core/pipeline/policies/redirect.py b/azure-core/azure/core/pipeline/policies/redirect.py index ed691ec2875a..acb3bf500b27 100644 --- a/azure-core/azure/core/pipeline/policies/redirect.py +++ b/azure-core/azure/core/pipeline/policies/redirect.py @@ -33,9 +33,9 @@ from typing import TYPE_CHECKING, List, Callable, Iterator, Any, Union, Dict, Optional # pylint: disable=unused-import import warnings try: - from urlparse import urlparse + from urlparse import urlparse # type: ignore except ImportError: - from urllib.parse import urlparse + from urllib.parse import urlparse # type: ignore from azure.core.exceptions import TooManyRedirectsError diff --git a/azure-core/azure/core/pipeline/policies/redirect_async.py b/azure-core/azure/core/pipeline/policies/redirect_async.py index f2a9875b276e..14263cd2333c 100644 --- a/azure-core/azure/core/pipeline/policies/redirect_async.py +++ b/azure-core/azure/core/pipeline/policies/redirect_async.py @@ -35,7 +35,7 @@ from azure.core.exceptions import TooManyRedirectsError -class AsyncRedirectPolicy(RedirectPolicy, AsyncHTTPPolicy): +class AsyncRedirectPolicy(RedirectPolicy, AsyncHTTPPolicy): # type: ignore """An async redirect policy.""" async def send(self, request): diff --git a/azure-core/azure/core/pipeline/policies/retry_async.py b/azure-core/azure/core/pipeline/policies/retry_async.py index f685272bf3e4..e6934e5122d6 100644 --- a/azure-core/azure/core/pipeline/policies/retry_async.py +++ b/azure-core/azure/core/pipeline/policies/retry_async.py @@ -43,7 +43,7 @@ -class AsyncRetryPolicy(RetryPolicy, AsyncHTTPPolicy): +class AsyncRetryPolicy(RetryPolicy, AsyncHTTPPolicy): # type: ignore async def _sleep_for_retry(self, response, transport): diff --git a/azure-core/azure/core/pipeline/policies/universal.py b/azure-core/azure/core/pipeline/policies/universal.py index 8a67be605bab..b575e872a80f 100644 --- a/azure-core/azure/core/pipeline/policies/universal.py +++ b/azure-core/azure/core/pipeline/policies/universal.py @@ -33,7 +33,7 @@ import os import platform import threading -from typing import TYPE_CHECKING, cast, List, Callable, Iterator, Any, Union, Dict, Optional # pylint: disable=unused-import +from typing import Mapping, IO, TypeVar, TYPE_CHECKING, cast, List, Callable, Iterator, Any, Union, Dict, Optional # pylint: disable=unused-import import xml.etree.ElementTree as ET import warnings import types @@ -41,13 +41,17 @@ from azure.core import __version__ as azcore_version from .base import HTTPPolicy, SansIOHTTPPolicy -from urllib3 import Retry # Needs requests 2.16 at least to be safe +from urllib3 import Retry # type: ignore # Needs requests 2.16 at least to be safe from azure.core.exceptions import ( DecodeError, raise_with_traceback ) +from azure.core.pipeline import ABC, PipelineRequest, PipelineResponse + +HTTPRequestType = TypeVar("HTTPRequestType") +HTTPResponseType = TypeVar("HTTPResponseType") _LOGGER = logging.getLogger(__name__) @@ -59,9 +63,9 @@ class HeadersPolicy(SansIOHTTPPolicy): This will overwrite any headers already defined in the request. """ def __init__(self, base_headers=None, **kwargs): - # type: (Mapping[str, str]) -> None + # type: (Mapping[str, str], Any) -> None self._headers = base_headers or {} - self._headers.update(kwargs.pop('headers', {})) + self._headers.update(kwargs.pop('headers', {})) # type: ignore @property def headers(self): @@ -72,12 +76,12 @@ def add_header(self, key, value): """Add a header to the configuration to be applied to all requests.""" self._headers[key] = value - def on_request(self, request): + def on_request(self, request, **kwargs): # type: (PipelineRequest, Any) -> None - request.http_request.headers.update(self.headers) - additional_headers = request.context.options.pop('headers', {}) + request.http_request.headers.update(self.headers) # type: ignore + additional_headers = request.context.options.pop('headers', {}) # type: ignore if additional_headers: - request.http_request.headers.update(additional_headers) + request.http_request.headers.update(additional_headers) # type: ignore class UserAgentPolicy(SansIOHTTPPolicy): @@ -116,20 +120,20 @@ def add_user_agent(self, value): """ self._user_agent = "{} {}".format(self._user_agent, value) - def on_request(self, request): + def on_request(self, request, **kwargs): # type: (PipelineRequest, Any) -> None http_request = request.http_request - options = request.context.options + options = request.context.options # type: ignore if 'user_agent' in options: user_agent = options.pop('user_agent') if options.pop('user_agent_overwrite', self.overwrite): - http_request.headers[self._USERAGENT] = user_agent + http_request.headers[self._USERAGENT] = user_agent # type: ignore else: user_agent = "{} {}".format(self.user_agent, user_agent) - http_request.headers[self._USERAGENT] = user_agent + http_request.headers[self._USERAGENT] = user_agent # type: ignore - elif self.overwrite or self._USERAGENT not in http_request.headers: - http_request.headers[self._USERAGENT] = self.user_agent + elif self.overwrite or self._USERAGENT not in http_request.headers: # type: ignore + http_request.headers[self._USERAGENT] = self.user_agent # type: ignore class NetworkTraceLoggingPolicy(SansIOHTTPPolicy): @@ -140,62 +144,62 @@ class NetworkTraceLoggingPolicy(SansIOHTTPPolicy): def __init__(self, logging_enable=False): self.enable_http_logger = logging_enable - def on_request(self, request): + def on_request(self, request, **kwargs): # type: (PipelineRequest, Any) -> None http_request = request.http_request - options = request.context.options - if options.pop("logging_enable", self.enable_http_logger): - request.context["logging_enable"] = True + options = request.context.options # type: ignore + if options.pop("logging_enable", self.enable_http_logger): # type: ignore + request.context["logging_enable"] = True # type: ignore if not _LOGGER.isEnabledFor(logging.DEBUG): return try: - _LOGGER.debug("Request URL: %r", http_request.url) - _LOGGER.debug("Request method: %r", http_request.method) + _LOGGER.debug("Request URL: %r", http_request.url) # type: ignore + _LOGGER.debug("Request method: %r", http_request.method) # type: ignore _LOGGER.debug("Request headers:") - for header, value in http_request.headers.items(): + for header, value in http_request.headers.items(): # type: ignore if header.lower() == 'authorization': value = '*****' _LOGGER.debug(" %r: %r", header, value) _LOGGER.debug("Request body:") # We don't want to log the binary data of a file upload. - if isinstance(http_request.body, types.GeneratorType): + if isinstance(http_request.body, types.GeneratorType): # type: ignore _LOGGER.debug("File upload") else: - _LOGGER.debug(str(http_request.body)) + _LOGGER.debug(str(http_request.body)) # type: ignore except Exception as err: # pylint: disable=broad-except _LOGGER.debug("Failed to log request: %r", err) - def on_response(self, request, response): + def on_response(self, request, response, **kwargs): # type: (PipelineRequest, PipelineResponse, Any) -> None - if response.context.pop("logging_enable", self.enable_http_logger): + if response.context.pop("logging_enable", self.enable_http_logger): # type: ignore if not _LOGGER.isEnabledFor(logging.DEBUG): return try: - _LOGGER.debug("Response status: %r", response.http_response.status_code) + _LOGGER.debug("Response status: %r", response.http_response.status_code) # type: ignore _LOGGER.debug("Response headers:") - for res_header, value in response.http_response.headers.items(): + for res_header, value in response.http_response.headers.items(): # type: ignore _LOGGER.debug(" %r: %r", res_header, value) # We don't want to log binary data if the response is a file. _LOGGER.debug("Response content:") pattern = re.compile(r'attachment; ?filename=["\w.]+', re.IGNORECASE) - header = response.http_response.headers.get('content-disposition') + header = response.http_response.headers.get('content-disposition') # type: ignore if header and pattern.match(header): filename = header.partition('=')[2] _LOGGER.debug("File attachments: %s", filename) - elif response.http_response.headers.get("content-type", "").endswith("octet-stream"): + elif response.http_response.headers.get("content-type", "").endswith("octet-stream"): # type: ignore _LOGGER.debug("Body contains binary data.") - elif response.http_response.headers.get("content-type", "").startswith("image"): + elif response.http_response.headers.get("content-type", "").startswith("image"): # type: ignore _LOGGER.debug("Body contains image data.") else: - if response.context.options.get('stream', False): + if response.context.options.get('stream', False): # type: ignore _LOGGER.debug("Body is streamable") else: - _LOGGER.debug(response.http_response.text()) + _LOGGER.debug(response.http_response.text()) # type: ignore except Exception as err: # pylint: disable=broad-except _LOGGER.debug("Failed to log response: %s", repr(err)) @@ -211,7 +215,7 @@ class ContentDecodePolicy(SansIOHTTPPolicy): @classmethod def deserialize_from_text(cls, response, content_type=None): - # type: (Optional[Union[AnyStr, IO]], Optional[str]) -> Any + # type: (Optional[PipelineResponse], Optional[str]) -> Any """Decode response data according to content-type. Accept a stream of data as well, but will be load at once in memory for now. @@ -222,7 +226,7 @@ def deserialize_from_text(cls, response, content_type=None): :type response: ~azure.core.pipeline.transport.HttpResponse :param str content_type: The content type. """ - data = response.text() + data = response.text() # type: ignore if not data: return None @@ -270,7 +274,7 @@ def _json_attemp(data): @classmethod def deserialize_from_http_generics(cls, response): - # type: (Optional[Union[AnyStr, IO]], Mapping) -> Any + # type: (PipelineResponse) -> Any """Deserialize from HTTP response. Use bytes and headers to NOT use any requests/aiohttp or whatever @@ -279,8 +283,8 @@ def deserialize_from_http_generics(cls, response): """ # Try to use content-type from headers if available content_type = None - if 'content-type' in response.headers: - content_type = response.headers['content-type'].split(";")[0].strip().lower() + if 'content-type' in response.headers: # type: ignore + content_type = response.headers['content-type'].split(";")[0].strip().lower() # type: ignore # Ouch, this server did not declare what it sent... # Let's guess it's JSON... # Also, since Autorest was considering that an empty body was a valid JSON, @@ -290,7 +294,7 @@ def deserialize_from_http_generics(cls, response): return cls.deserialize_from_text(response, content_type) - def on_response(self, request, response): + def on_response(self, request, response, **kwargs): # type: (PipelineRequest, PipelineResponse, Any) -> None """Extract data from the body of a REST response object. @@ -306,10 +310,10 @@ def on_response(self, request, response): :raises xml.etree.ElementTree.ParseError: If bytes is not valid XML """ # If response was asked as stream, do NOT read anything and quit now - if response.context.options.get("stream", True): + if response.context.options.get("stream", True): # type: ignore return - response.context[self.CONTEXT_NAME] = self.deserialize_from_http_generics(response.http_response) + response.context[self.CONTEXT_NAME] = self.deserialize_from_http_generics(response.http_response) # type: ignore class ProxyPolicy(SansIOHTTPPolicy): diff --git a/azure-core/azure/core/pipeline/transport/aiohttp.py b/azure-core/azure/core/pipeline/transport/aiohttp.py index cd758c4e5808..398a7bc07749 100644 --- a/azure-core/azure/core/pipeline/transport/aiohttp.py +++ b/azure-core/azure/core/pipeline/transport/aiohttp.py @@ -93,7 +93,7 @@ def _get_request_data(self, request): return form_data return request.data - async def send(self, request: HttpRequest, **config: Any) -> AsyncHttpResponse: + async def send(self, request: HttpRequest, **config: Any) -> Optional[Any]: """Send the request using this HTTP sender. Will pre-load the body into memory to be available with a sync method. diff --git a/azure-core/azure/core/pipeline/transport/base.py b/azure-core/azure/core/pipeline/transport/base.py index 4d978f816c28..70192a32cb73 100644 --- a/azure-core/azure/core/pipeline/transport/base.py +++ b/azure-core/azure/core/pipeline/transport/base.py @@ -30,9 +30,9 @@ import os import time try: - from urlparse import urlparse + from urlparse import urlparse # type: ignore except ImportError: - from urllib.parse import urlparse + from urllib.parse import urlparse # type: ignore import xml.etree.ElementTree as ET # This file is NOT using any "requests" HTTP implementation @@ -43,7 +43,7 @@ from typing import TYPE_CHECKING, Generic, TypeVar, cast, IO, List, Union, Any, Mapping, Dict, Optional, Tuple, Callable, Iterator # pylint: disable=unused-import from azure.core.exceptions import HttpResponseError -from azure.core.pipeline import ABC, AbstractContextManager +from azure.core.pipeline import ABC, AbstractContextManager, PipelineRequest, PipelineResponse HTTPResponseType = TypeVar("HTTPResponseType") HTTPRequestType = TypeVar("HTTPRequestType") @@ -51,13 +51,13 @@ _LOGGER = logging.getLogger(__name__) -class HttpTransport(AbstractContextManager, ABC, Generic[HTTPRequestType, HTTPResponseType]): +class HttpTransport(AbstractContextManager, ABC, Generic[HTTPRequestType, HTTPResponseType]): # type: ignore """An http sender ABC. """ @abc.abstractmethod def send(self, request, **kwargs): - # type: (PipelineRequest[HTTPRequestType], Any) -> PipelineResponse[HTTPRequestType, HTTPResponseType] + # type: (PipelineRequest, Any) -> PipelineResponse """Send the request using this HTTP sender. """ pass @@ -192,7 +192,7 @@ class _HttpResponseBase(object): Full in-memory using "body" as bytes. """ def __init__(self, request, internal_response, block_size=None): - # type: (HttpRequest, Any) -> None + # type: (HttpRequest, Any, Optional[int]) -> None self.request = request self.internal_response = internal_response self.status_code = None # type: Optional[int] diff --git a/azure-core/azure/core/pipeline/transport/requests_asyncio.py b/azure-core/azure/core/pipeline/transport/requests_asyncio.py index f06b96f3cfd2..cd38daea63ac 100644 --- a/azure-core/azure/core/pipeline/transport/requests_asyncio.py +++ b/azure-core/azure/core/pipeline/transport/requests_asyncio.py @@ -27,8 +27,8 @@ from collections.abc import AsyncIterator import functools import logging -import urllib3 -from typing import Any, Callable, Optional, AsyncIterator as AsyncIteratorType +import urllib3 # type: ignore +from typing import Any, Callable, Union, Optional, AsyncIterator as AsyncIteratorType import requests @@ -72,7 +72,7 @@ async def send(self, request: HttpRequest, **kwargs: Any) -> AsyncHttpResponse: """ loop = kwargs.get("loop", _get_running_loop()) response = None - error = None + error = None # type: Optional[Union[ServiceRequestError, ServiceResponseError]] if self.config.proxy_policy and 'proxies' not in kwargs: kwargs['proxies'] = self.config.proxy_policy.proxies try: @@ -142,8 +142,8 @@ async def __anext__(self): raise -class AsyncioRequestsTransportResponse(AsyncHttpResponse, RequestsTransportResponse): +class AsyncioRequestsTransportResponse(AsyncHttpResponse, RequestsTransportResponse): # type: ignore - def stream_download(self) -> AsyncIteratorType[bytes]: + def stream_download(self) -> AsyncIteratorType[bytes]: # type: ignore """Generator for streaming request body data.""" return AsyncioStreamDownloadGenerator(self.internal_response, self.block_size) diff --git a/azure-core/azure/core/pipeline/transport/requests_basic.py b/azure-core/azure/core/pipeline/transport/requests_basic.py index 9cb26b5510f4..198c2043567c 100644 --- a/azure-core/azure/core/pipeline/transport/requests_basic.py +++ b/azure-core/azure/core/pipeline/transport/requests_basic.py @@ -26,8 +26,10 @@ from __future__ import absolute_import import requests import threading -import urllib3 -from urllib3.util.retry import Retry +import urllib3 # type: ignore +from urllib3.util.retry import Retry # type: ignore +from typing import Iterator, Optional, Any, TypeVar, Union +from . import HttpRequest from .base import ( HttpTransport, @@ -94,7 +96,7 @@ def __next__(self): class RequestsTransportResponse(HttpResponse, _RequestsTransportResponseBase): def stream_download(self): - # type: (Optional[int], Optional[Callable]) -> Iterator[bytes] + # type: () -> Iterator[bytes] """Generator for streaming request body data.""" return StreamDownloadGenerator(self.internal_response, self.block_size) @@ -114,7 +116,7 @@ class RequestsTransport(HttpTransport): _protocols = ['http://', 'https://'] def __init__(self, configuration=None, session=None): - # type: (Optional[requests.Session]) -> None + # type: (Optional[Any], Optional[requests.Session]) -> None self._session_mapping = threading.local() self.config = configuration or Configuration() self.session = session or requests.Session() @@ -158,7 +160,7 @@ def session(self, value): def close(self): self.session.close() - def send(self, request, **kwargs): + def send(self, request, **kwargs): # type: ignore # type: (HttpRequest, Any) -> HttpResponse """Send request object according to configuration. @@ -169,7 +171,7 @@ def send(self, request, **kwargs): :param HttpRequest request: The request object to be sent. """ response = None - error = None + error = None # type: Optional[Union[ServiceRequestError, ServiceResponseError]] if self.config.proxy_policy and 'proxies' not in kwargs: kwargs['proxies'] = self.config.proxy_policy.proxies diff --git a/azure-core/azure/core/pipeline/transport/requests_trio.py b/azure-core/azure/core/pipeline/transport/requests_trio.py index 87a134ae7e2f..6cec2605d817 100644 --- a/azure-core/azure/core/pipeline/transport/requests_trio.py +++ b/azure-core/azure/core/pipeline/transport/requests_trio.py @@ -27,8 +27,8 @@ from collections.abc import AsyncIterator import functools import logging -import urllib3 -from typing import Any, Callable, Optional, AsyncIterator as AsyncIteratorType +import urllib3 # type: ignore +from typing import Any, Callable, Union, Optional, AsyncIterator as AsyncIteratorType import requests from requests.models import CONTENT_CHUNK_SIZE @@ -50,7 +50,7 @@ _LOGGER = logging.getLogger(__name__) -import trio +import trio # type: ignore class TrioStreamDownloadGenerator(AsyncIterator): @@ -80,9 +80,9 @@ async def __anext__(self): self.response.close() raise -class TrioRequestsTransportResponse(AsyncHttpResponse, RequestsTransportResponse): +class TrioRequestsTransportResponse(AsyncHttpResponse, RequestsTransportResponse): # type: ignore - def stream_download(self) -> AsyncIteratorType[bytes]: + def stream_download(self) -> AsyncIteratorType[bytes]: # type: ignore """Generator for streaming request body data. :param callback: Custom callback for monitoring progress. @@ -107,7 +107,7 @@ async def send(self, request: HttpRequest, **kwargs: Any) -> AsyncHttpResponse: """ trio_limiter = kwargs.get("trio_limiter", None) response = None - error = None + error = None # type: Optional[Union[ServiceRequestError, ServiceResponseError]] if self.config.proxy_policy and 'proxies' not in kwargs: kwargs['proxies'] = self.config.proxy_policy.proxies try: diff --git a/azure-core/azure/core/pipeline_client.py b/azure-core/azure/core/pipeline_client.py index 701ee27c2406..e42d3a01b8a9 100644 --- a/azure-core/azure/core/pipeline_client.py +++ b/azure-core/azure/core/pipeline_client.py @@ -28,9 +28,9 @@ import os import sys try: - from urlparse import urljoin, urlparse + from urlparse import urljoin, urlparse # type: ignore except ImportError: - from urllib.parse import urljoin, urlparse + from urllib.parse import urljoin, urlparse # type: ignore import warnings import xml.etree.ElementTree as ET @@ -74,7 +74,7 @@ def _build_pipeline(self, config): ) def _request(self, method, url, params, headers, content, form_content, stream_content): - # type: (str, str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]]) -> HttpRequest + # type: (str, str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]], Any) -> HttpRequest """Create HttpRequest object. :param str url: URL for the request. @@ -135,7 +135,7 @@ def get(self, url, params=None, headers=None, content=None, form_content=None): return request def put(self, url, params=None, headers=None, content=None, form_content=None, stream_content=None): - # type: (str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]]) -> HttpRequest + # type: (str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]], Any) -> HttpRequest """Create a PUT request object. :param str url: The request URL. @@ -147,7 +147,7 @@ def put(self, url, params=None, headers=None, content=None, form_content=None, s return request def post(self, url, params=None, headers=None, content=None, form_content=None, stream_content=None): - # type: (str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]]) -> HttpRequest + # type: (str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]], Any) -> HttpRequest """Create a POST request object. :param str url: The request URL. @@ -159,7 +159,7 @@ def post(self, url, params=None, headers=None, content=None, form_content=None, return request def head(self, url, params=None, headers=None, content=None, form_content=None, stream_content=None): - # type: (str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]]) -> HttpRequest + # type: (str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]], Any) -> HttpRequest """Create a HEAD request object. :param str url: The request URL. @@ -171,7 +171,7 @@ def head(self, url, params=None, headers=None, content=None, form_content=None, return request def patch(self, url, params=None, headers=None, content=None, form_content=None, stream_content=None): - # type: (str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]]) -> HttpRequest + # type: (str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]], Any) -> HttpRequest """Create a PATCH request object. :param str url: The request URL. diff --git a/azure-core/azure/core/pipeline_client_async.py b/azure-core/azure/core/pipeline_client_async.py index 82b2f6b867d2..309339540e49 100644 --- a/azure-core/azure/core/pipeline_client_async.py +++ b/azure-core/azure/core/pipeline_client_async.py @@ -28,9 +28,9 @@ import os import sys try: - from urlparse import urljoin, urlparse + from urlparse import urljoin, urlparse # type: ignore except ImportError: - from urllib.parse import urljoin, urlparse + from urllib.parse import urljoin, urlparse # type: ignore import warnings import xml.etree.ElementTree as ET @@ -74,7 +74,7 @@ def _build_pipeline(self, config): ) def _request(self, method, url, params, headers, content, form_content, stream_content): - # type: (str, str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]]) -> HttpRequest + # type: (str, str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]], Any) -> HttpRequest """Create HttpRequest object. :param str url: URL for the request. @@ -135,7 +135,7 @@ def get(self, url, params=None, headers=None, content=None, form_content=None): return request def put(self, url, params=None, headers=None, content=None, form_content=None, stream_content=None): - # type: (str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]]) -> HttpRequest + # type: (str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]], Any) -> HttpRequest """Create a PUT request object. :param str url: The request URL. @@ -147,7 +147,7 @@ def put(self, url, params=None, headers=None, content=None, form_content=None, s return request def post(self, url, params=None, headers=None, content=None, form_content=None, stream_content=None): - # type: (str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]]) -> HttpRequest + # type: (str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]], Any) -> HttpRequest """Create a POST request object. :param str url: The request URL. @@ -159,7 +159,7 @@ def post(self, url, params=None, headers=None, content=None, form_content=None, return request def head(self, url, params=None, headers=None, content=None, form_content=None, stream_content=None): - # type: (str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]]) -> HttpRequest + # type: (str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]], Any) -> HttpRequest """Create a HEAD request object. :param str url: The request URL. @@ -171,7 +171,7 @@ def head(self, url, params=None, headers=None, content=None, form_content=None, return request def patch(self, url, params=None, headers=None, content=None, form_content=None, stream_content=None): - # type: (str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]]) -> HttpRequest + # type: (str, Optional[Dict[str, str]], Optional[Dict[str, str]], Any, Optional[Dict[str, Any]], Any) -> HttpRequest """Create a PATCH request object. :param str url: The request URL. diff --git a/azure-core/azure/core/polling/poller.py b/azure-core/azure/core/polling/poller.py index aeda11ed8928..95b44c550eff 100644 --- a/azure-core/azure/core/polling/poller.py +++ b/azure-core/azure/core/polling/poller.py @@ -27,7 +27,7 @@ import time import uuid try: - from urlparse import urlparse + from urlparse import urlparse # type: ignore except ImportError: from urllib.parse import urlparse @@ -35,8 +35,8 @@ if TYPE_CHECKING: import requests - from .pipeline import HttpResponse # pylint: disable=unused-import - from msrest.serialization import Model # pylint: disable=unused-import + from .pipeline import HttpResponse # type: ignore # pylint: disable=unused-import + from msrest.serialization import Model # type: ignore # pylint: disable=unused-import class PollingMethod(object): """ABC class for polling method. @@ -120,7 +120,8 @@ def __init__(self, client, initial_response, deserialization_callback, polling_m # This implicit test avoids bringing in an explicit dependency on Model directly try: - deserialization_callback = deserialization_callback.deserialize + deserialization_callback = deserialization_callback.deserialize # type: ignore + except AttributeError: pass diff --git a/azure-core/dev_requirements.txt b/azure-core/dev_requirements.txt index de75bbf26df8..54b4ecbba44f 100644 --- a/azure-core/dev_requirements.txt +++ b/azure-core/dev_requirements.txt @@ -1,3 +1,4 @@ trio; python_version >= '3.5' aiohttp>=3.0; python_version >= '3.5' -aiodns>=2.0; python_version >= '3.5' \ No newline at end of file +aiodns>=2.0; python_version >= '3.5' +mypy>=0.7; python_version >= '3.5' \ No newline at end of file diff --git a/azure-core/setup.py b/azure-core/setup.py index e7618ababe56..fd451f935895 100644 --- a/azure-core/setup.py +++ b/azure-core/setup.py @@ -9,7 +9,7 @@ import re import os.path from io import open -from setuptools import find_packages, setup +from setuptools import find_packages, setup # type: ignore # Change the PACKAGE_NAME only to change folder and different name PACKAGE_NAME = "azure-core" @@ -25,7 +25,7 @@ try: import azure try: - ver = azure.__version__ + ver = azure.__version__ # type: ignore raise Exception( 'This package is incompatible with azure=={}. '.format(ver) + 'Uninstall it with "pip uninstall azure".' @@ -37,7 +37,7 @@ # Version extraction inspired from 'requests' with open(os.path.join(package_folder_path, '__init__.py'), 'r') as fd: - version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', + version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', # type: ignore fd.read(), re.MULTILINE).group(1) if not version: