Skip to content

Commit 9f110dd

Browse files
authored
cut hard dependency on requests (Azure#19930)
* cut hard dependency on requests * update * update * address review feedback
1 parent a88809f commit 9f110dd

File tree

4 files changed

+112
-60
lines changed

4 files changed

+112
-60
lines changed

sdk/core/azure-core/azure/core/_pipeline_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
RequestIdPolicy,
4040
RetryPolicy,
4141
)
42-
from .pipeline.transport import RequestsTransport
4342
from .pipeline._tools import to_rest_response as _to_rest_response
4443

4544
try:
@@ -181,6 +180,7 @@ def _build_pipeline(self, config, **kwargs): # pylint: disable=no-self-use
181180
policies = policies_1
182181

183182
if not transport:
183+
from .pipeline.transport import RequestsTransport
184184
transport = RequestsTransport(**kwargs)
185185

186186
return Pipeline(transport, policies)

sdk/core/azure-core/azure/core/pipeline/policies/_utils.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@
2525
# --------------------------------------------------------------------------
2626
import datetime
2727
import email.utils
28-
from requests.structures import CaseInsensitiveDict
29-
from ...utils._utils import _FixedOffset
28+
from ...utils._utils import _FixedOffset, _case_insensitive_dict
3029

3130
def _parse_http_date(text):
3231
"""Parse a HTTP date format into datetime."""
@@ -58,7 +57,7 @@ def get_retry_after(response):
5857
:return: Value of Retry-After in seconds.
5958
:rtype: float or None
6059
"""
61-
headers = CaseInsensitiveDict(response.http_response.headers)
60+
headers = _case_insensitive_dict(response.http_response.headers)
6261
retry_after = headers.get("retry-after")
6362
if retry_after:
6463
return parse_retry_after(retry_after)

sdk/core/azure-core/azure/core/pipeline/transport/__init__.py

Lines changed: 107 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -26,82 +26,133 @@
2626

2727
import sys
2828
from ._base import HttpTransport, HttpRequest, HttpResponse
29-
from ._requests_basic import RequestsTransport, RequestsTransportResponse
3029

3130
__all__ = [
3231
'HttpTransport',
3332
'HttpRequest',
3433
'HttpResponse',
35-
'RequestsTransport',
36-
'RequestsTransportResponse',
3734
]
3835

3936
# pylint: disable=unused-import, redefined-outer-name
4037
try:
41-
from ._base_async import AsyncHttpTransport, AsyncHttpResponse
42-
from ._requests_asyncio import AsyncioRequestsTransport, AsyncioRequestsTransportResponse
38+
from ._requests_basic import RequestsTransport, RequestsTransportResponse
4339
__all__.extend([
44-
'AsyncHttpTransport',
45-
'AsyncHttpResponse',
46-
'AsyncioRequestsTransport',
47-
'AsyncioRequestsTransportResponse'
40+
'RequestsTransport',
41+
'RequestsTransportResponse',
4842
])
43+
try:
44+
from ._base_async import AsyncHttpTransport, AsyncHttpResponse
45+
from ._requests_asyncio import AsyncioRequestsTransport, AsyncioRequestsTransportResponse
4946

50-
if sys.version_info >= (3, 7):
5147
__all__.extend([
52-
'TrioRequestsTransport',
53-
'TrioRequestsTransportResponse',
54-
'AioHttpTransport',
55-
'AioHttpTransportResponse',
48+
'AsyncHttpTransport',
49+
'AsyncHttpResponse',
50+
'AsyncioRequestsTransport',
51+
'AsyncioRequestsTransportResponse'
5652
])
5753

58-
def __dir__():
59-
return __all__
60-
61-
def __getattr__(name):
62-
if name == 'AioHttpTransport':
63-
try:
64-
from ._aiohttp import AioHttpTransport
65-
return AioHttpTransport
66-
except ImportError:
67-
raise ImportError("aiohttp package is not installed")
68-
if name == 'AioHttpTransportResponse':
69-
try:
70-
from ._aiohttp import AioHttpTransportResponse
71-
return AioHttpTransportResponse
72-
except ImportError:
73-
raise ImportError("aiohttp package is not installed")
74-
if name == 'TrioRequestsTransport':
75-
try:
76-
from ._requests_trio import TrioRequestsTransport
77-
return TrioRequestsTransport
78-
except ImportError:
79-
raise ImportError("trio package is not installed")
80-
if name == 'TrioRequestsTransportResponse':
81-
try:
82-
from ._requests_trio import TrioRequestsTransportResponse
83-
return TrioRequestsTransportResponse
84-
except ImportError:
85-
raise ImportError("trio package is not installed")
86-
return name
87-
88-
else:
89-
try:
90-
from ._requests_trio import TrioRequestsTransport, TrioRequestsTransportResponse
54+
if sys.version_info >= (3, 7):
9155
__all__.extend([
9256
'TrioRequestsTransport',
93-
'TrioRequestsTransportResponse'
57+
'TrioRequestsTransportResponse',
58+
'AioHttpTransport',
59+
'AioHttpTransportResponse',
9460
])
95-
except ImportError:
96-
pass # Trio not installed
9761

98-
try:
99-
from ._aiohttp import AioHttpTransport, AioHttpTransportResponse
62+
def __dir__():
63+
return __all__
64+
65+
def __getattr__(name):
66+
if name == 'AioHttpTransport':
67+
try:
68+
from ._aiohttp import AioHttpTransport
69+
return AioHttpTransport
70+
except ImportError:
71+
raise ImportError("aiohttp package is not installed")
72+
if name == 'AioHttpTransportResponse':
73+
try:
74+
from ._aiohttp import AioHttpTransportResponse
75+
return AioHttpTransportResponse
76+
except ImportError:
77+
raise ImportError("aiohttp package is not installed")
78+
if name == 'TrioRequestsTransport':
79+
try:
80+
from ._requests_trio import TrioRequestsTransport
81+
return TrioRequestsTransport
82+
except ImportError:
83+
raise ImportError("trio package is not installed")
84+
if name == 'TrioRequestsTransportResponse':
85+
try:
86+
from ._requests_trio import TrioRequestsTransportResponse
87+
return TrioRequestsTransportResponse
88+
except ImportError:
89+
raise ImportError("trio package is not installed")
90+
return name
91+
92+
else:
93+
try:
94+
from ._requests_trio import TrioRequestsTransport, TrioRequestsTransportResponse
95+
96+
__all__.extend([
97+
'TrioRequestsTransport',
98+
'TrioRequestsTransportResponse'
99+
])
100+
except ImportError:
101+
pass # Trio not installed
102+
103+
try:
104+
from ._aiohttp import AioHttpTransport, AioHttpTransportResponse
105+
106+
__all__.extend([
107+
'AioHttpTransport',
108+
'AioHttpTransportResponse',
109+
])
110+
except ImportError:
111+
pass # Aiohttp not installed
112+
except (ImportError, SyntaxError):
113+
# requests library is installed but asynchronous pipelines not supported.
114+
pass
115+
except (ImportError, SyntaxError):
116+
# requests library is not installed
117+
try:
118+
from ._base_async import AsyncHttpTransport, AsyncHttpResponse
119+
__all__.extend([
120+
'AsyncHttpTransport',
121+
'AsyncHttpResponse',
122+
])
123+
124+
if sys.version_info >= (3, 7):
100125
__all__.extend([
101126
'AioHttpTransport',
102127
'AioHttpTransportResponse',
103128
])
104-
except ImportError:
105-
pass # Aiohttp not installed
106-
except (ImportError, SyntaxError):
107-
pass # Asynchronous pipelines not supported.
129+
130+
def __dir__():
131+
return __all__
132+
133+
def __getattr__(name):
134+
if name == 'AioHttpTransport':
135+
try:
136+
from ._aiohttp import AioHttpTransport
137+
return AioHttpTransport
138+
except ImportError:
139+
raise ImportError("aiohttp package is not installed")
140+
if name == 'AioHttpTransportResponse':
141+
try:
142+
from ._aiohttp import AioHttpTransportResponse
143+
return AioHttpTransportResponse
144+
except ImportError:
145+
raise ImportError("aiohttp package is not installed")
146+
return name
147+
148+
else:
149+
try:
150+
from ._aiohttp import AioHttpTransport, AioHttpTransportResponse
151+
__all__.extend([
152+
'AioHttpTransport',
153+
'AioHttpTransportResponse',
154+
])
155+
except ImportError:
156+
pass # Aiohttp not installed
157+
except (ImportError, SyntaxError):
158+
pass # Asynchronous pipelines not supported.

sdk/core/azure-core/azure/core/utils/_utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ def _case_insensitive_dict(*args, **kwargs):
9999
# multidict is installed by aiohttp
100100
from multidict import CIMultiDict
101101

102+
if len(kwargs) == 0 and len(args) == 1 and (not args[0]):
103+
return CIMultiDict() # in case of case_insensitive_dict(None), we don't want to raise exception
102104
return CIMultiDict(*args, **kwargs)
103105
except ImportError:
104106
raise ValueError(

0 commit comments

Comments
 (0)