corehttp 1.0.0b3__py3-none-any.whl → 1.0.0b5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
corehttp/_version.py CHANGED
@@ -9,4 +9,4 @@
9
9
  # regenerated.
10
10
  # --------------------------------------------------------------------------
11
11
 
12
- VERSION = "1.0.0b3"
12
+ VERSION = "1.0.0b5"
corehttp/credentials.py CHANGED
@@ -4,7 +4,6 @@
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
6
  from __future__ import annotations
7
- from collections import namedtuple
8
7
  from types import TracebackType
9
8
  from typing import Any, NamedTuple, Optional, AsyncContextManager, Type
10
9
  from typing_extensions import Protocol, runtime_checkable
@@ -40,7 +39,12 @@ class TokenCredential(Protocol):
40
39
  ...
41
40
 
42
41
 
43
- ServiceNamedKey = namedtuple("ServiceNamedKey", ["name", "key"])
42
+ class ServiceNamedKey(NamedTuple):
43
+ """Represents a name and key pair."""
44
+
45
+ name: str
46
+ key: str
47
+
44
48
 
45
49
  __all__ = [
46
50
  "AccessToken",
corehttp/runtime/_base.py CHANGED
@@ -23,11 +23,11 @@
23
23
  # IN THE SOFTWARE.
24
24
  #
25
25
  # --------------------------------------------------------------------------
26
- from typing import Any
26
+ from typing import Any, Dict
27
27
  from urllib.parse import urlparse
28
28
 
29
29
 
30
- def _format_url_section(template, **kwargs):
30
+ def _format_url_section(template, **kwargs: Dict[str, str]) -> str:
31
31
  """String format the template with the kwargs, auto-skip sections of the template that are NOT in the kwargs.
32
32
 
33
33
  By default in Python, "format" will raise a KeyError if a template element is not found. Here the section between
@@ -53,6 +53,7 @@ def _format_url_section(template, **kwargs):
53
53
  f"The value provided for the url part '{template}' was incorrect, and resulted in an invalid url"
54
54
  ) from key
55
55
  last_template = template
56
+ return last_template
56
57
 
57
58
 
58
59
  def _urljoin(base_url: str, stub_url: str) -> str:
@@ -71,7 +72,7 @@ def _urljoin(base_url: str, stub_url: str) -> str:
71
72
  stub_url_path = split_url.pop(0)
72
73
  stub_url_query = split_url.pop() if split_url else None
73
74
 
74
- # Note that _replace is a public API named that way to avoid to avoid conflicts in namedtuple
75
+ # Note that _replace is a public API named that way to avoid conflicts in namedtuple
75
76
  # https://docs.python.org/3/library/collections.html?highlight=namedtuple#collections.namedtuple
76
77
  parsed_base_url = parsed_base_url._replace(
77
78
  path=parsed_base_url.path.rstrip("/") + "/" + stub_url_path,
@@ -62,6 +62,15 @@ class PipelineClient(PipelineClientBase, Generic[HTTPRequestType, HTTPResponseTy
62
62
 
63
63
  :ivar pipeline: The Pipeline object associated with the client.
64
64
  :vartype pipeline: ~corehttp.runtime.pipeline.Pipeline or None
65
+
66
+ .. admonition:: Example:
67
+
68
+ .. literalinclude:: ../samples/sample_pipeline_client.py
69
+ :start-after: [START build_pipeline_client]
70
+ :end-before: [END build_pipeline_client]
71
+ :language: python
72
+ :dedent: 4
73
+ :caption: Builds the pipeline client.
65
74
  """
66
75
 
67
76
  def __init__(
@@ -141,6 +141,15 @@ class AsyncPipelineClient(
141
141
 
142
142
  :ivar pipeline: The Pipeline object associated with the client.
143
143
  :vartype pipeline: ~corehttp.runtime.pipeline.Pipeline or None
144
+
145
+ .. admonition:: Example:
146
+
147
+ .. literalinclude:: ../samples/sample_async_pipeline_client.py
148
+ :start-after: [START build_async_pipeline_client]
149
+ :end-before: [END build_async_pipeline_client]
150
+ :language: python
151
+ :dedent: 4
152
+ :caption: Builds the async pipeline client.
144
153
  """
145
154
 
146
155
  def __init__(
@@ -26,6 +26,7 @@
26
26
  from __future__ import annotations
27
27
  import logging
28
28
  from typing import Generic, TypeVar, Union, Any, List, Optional, Iterable, ContextManager
29
+ from typing_extensions import TypeGuard
29
30
 
30
31
  from . import (
31
32
  PipelineRequest,
@@ -42,6 +43,18 @@ HTTPRequestType = TypeVar("HTTPRequestType")
42
43
  _LOGGER = logging.getLogger(__name__)
43
44
 
44
45
 
46
+ def is_http_policy(policy: object) -> TypeGuard[HTTPPolicy]:
47
+ if hasattr(policy, "send"):
48
+ return True
49
+ return False
50
+
51
+
52
+ def is_sansio_http_policy(policy: object) -> TypeGuard[SansIOHTTPPolicy]:
53
+ if hasattr(policy, "on_request") and hasattr(policy, "on_response"):
54
+ return True
55
+ return False
56
+
57
+
45
58
  class _SansIOHTTPPolicyRunner(HTTPPolicy[HTTPRequestType, HTTPResponseType]):
46
59
  """Sync implementation of the SansIO policy.
47
60
 
@@ -123,10 +136,14 @@ class Pipeline(ContextManager["Pipeline"], Generic[HTTPRequestType, HTTPResponse
123
136
  self._transport = transport
124
137
 
125
138
  for policy in policies or []:
126
- if isinstance(policy, SansIOHTTPPolicy):
139
+ if is_http_policy(policy):
140
+ self._impl_policies.append(policy)
141
+ elif is_sansio_http_policy(policy):
127
142
  self._impl_policies.append(_SansIOHTTPPolicyRunner(policy))
128
143
  elif policy:
129
- self._impl_policies.append(policy)
144
+ raise AttributeError(
145
+ f"'{type(policy)}' object has no attribute 'send' or both 'on_request' and 'on_response'."
146
+ )
130
147
  for index in range(len(self._impl_policies) - 1):
131
148
  self._impl_policies[index].next = self._impl_policies[index + 1]
132
149
  if self._impl_policies:
@@ -24,12 +24,14 @@
24
24
  #
25
25
  # --------------------------------------------------------------------------
26
26
  from __future__ import annotations
27
+ import inspect
27
28
  from types import TracebackType
28
29
  from typing import Any, Union, Generic, TypeVar, List, Optional, Iterable, Type
29
- from typing_extensions import AsyncContextManager
30
+ from typing_extensions import AsyncContextManager, TypeGuard
30
31
 
31
32
  from . import PipelineRequest, PipelineResponse, PipelineContext
32
33
  from ..policies import AsyncHTTPPolicy, SansIOHTTPPolicy
34
+ from ..pipeline._base import is_sansio_http_policy
33
35
  from ._tools_async import await_result as _await_result
34
36
  from ...transport import AsyncHttpTransport
35
37
 
@@ -37,6 +39,12 @@ AsyncHTTPResponseType = TypeVar("AsyncHTTPResponseType")
37
39
  HTTPRequestType = TypeVar("HTTPRequestType")
38
40
 
39
41
 
42
+ def is_async_http_policy(policy: object) -> TypeGuard[AsyncHTTPPolicy]:
43
+ if hasattr(policy, "send") and inspect.iscoroutinefunction(policy.send):
44
+ return True
45
+ return False
46
+
47
+
40
48
  class _SansIOAsyncHTTPPolicyRunner(
41
49
  AsyncHTTPPolicy[HTTPRequestType, AsyncHTTPResponseType]
42
50
  ): # pylint: disable=unsubscriptable-object
@@ -127,10 +135,14 @@ class AsyncPipeline(AsyncContextManager["AsyncPipeline"], Generic[HTTPRequestTyp
127
135
  self._transport = transport
128
136
 
129
137
  for policy in policies or []:
130
- if isinstance(policy, SansIOHTTPPolicy):
138
+ if is_async_http_policy(policy):
139
+ self._impl_policies.append(policy)
140
+ elif is_sansio_http_policy(policy):
131
141
  self._impl_policies.append(_SansIOAsyncHTTPPolicyRunner(policy))
132
142
  elif policy:
133
- self._impl_policies.append(policy)
143
+ raise AttributeError(
144
+ f"'{type(policy)}' object has no attribute 'send' or both 'on_request' and 'on_response'."
145
+ )
134
146
  for index in range(len(self._impl_policies) - 1):
135
147
  self._impl_policies[index].next = self._impl_policies[index + 1]
136
148
  if self._impl_policies:
@@ -4,7 +4,6 @@
4
4
  # license information.
5
5
  # -------------------------------------------------------------------------
6
6
  from __future__ import annotations
7
- import asyncio
8
7
  import time
9
8
  from typing import TYPE_CHECKING, Any, Awaitable, Optional, cast, TypeVar
10
9
 
@@ -14,6 +13,7 @@ from ..pipeline._tools_async import await_result
14
13
  from ._base_async import AsyncHTTPPolicy
15
14
  from ._authentication import _BearerTokenCredentialPolicyBase
16
15
  from ...rest import AsyncHttpResponse, HttpRequest
16
+ from ...utils._utils import get_running_async_lock
17
17
 
18
18
  if TYPE_CHECKING:
19
19
  from ...credentials import AsyncTokenCredential
@@ -36,10 +36,16 @@ class AsyncBearerTokenCredentialPolicy(AsyncHTTPPolicy[HTTPRequestType, AsyncHTT
36
36
  ) -> None:
37
37
  super().__init__()
38
38
  self._credential = credential
39
- self._lock = asyncio.Lock()
39
+ self._lock_instance = None
40
40
  self._scopes = scopes
41
41
  self._token: Optional["AccessToken"] = None
42
42
 
43
+ @property
44
+ def _lock(self):
45
+ if self._lock_instance is None:
46
+ self._lock_instance = get_running_async_lock()
47
+ return self._lock_instance
48
+
43
49
  async def on_request(self, request: PipelineRequest[HTTPRequestType]) -> None:
44
50
  """Adds a bearer token Authorization header to request and sends request to next policy.
45
51
 
@@ -35,7 +35,7 @@ import platform
35
35
  import xml.etree.ElementTree as ET
36
36
  import types
37
37
  import re
38
- from typing import IO, cast, Union, Optional, AnyStr, Dict, Any, Mapping, TYPE_CHECKING
38
+ from typing import IO, cast, Union, Optional, AnyStr, Dict, Any, MutableMapping, TYPE_CHECKING
39
39
 
40
40
  from ... import __version__ as core_version
41
41
  from ...exceptions import DecodeError
@@ -449,12 +449,12 @@ class ProxyPolicy(SansIOHTTPPolicy[HTTPRequestType, HTTPResponseType]):
449
449
  Dictionary mapping protocol or protocol and host to the URL of the proxy
450
450
  to be used on each Request.
451
451
 
452
- :param dict proxies: Maps protocol or protocol and hostname to the URL
452
+ :param MutableMapping proxies: Maps protocol or protocol and hostname to the URL
453
453
  of the proxy.
454
454
  """
455
455
 
456
456
  def __init__(
457
- self, proxies: Optional[Mapping[str, str]] = None, **kwargs: Any
457
+ self, proxies: Optional[MutableMapping[str, str]] = None, **kwargs: Any
458
458
  ): # pylint: disable=unused-argument,super-init-not-called
459
459
  self.proxies = proxies
460
460
 
@@ -61,7 +61,7 @@ def parse_retry_after(retry_after: str) -> float:
61
61
  """
62
62
  delay: float # Using the Mypy recommendation to use float for "int or float"
63
63
  try:
64
- delay = int(retry_after)
64
+ delay = float(retry_after)
65
65
  except ValueError:
66
66
  # Not an integer? Try HTTP date
67
67
  retry_date = _parse_http_date(retry_after)
@@ -25,18 +25,21 @@
25
25
  # --------------------------------------------------------------------------
26
26
 
27
27
  import sys
28
+ from typing import MutableMapping, Optional
29
+
28
30
  from requests.adapters import HTTPAdapter # pylint: disable=all
31
+ from urllib3.connectionpool import ConnectionPool
29
32
 
30
33
 
31
34
  class BiggerBlockSizeHTTPAdapter(HTTPAdapter):
32
- def get_connection(self, url, proxies=None):
35
+ def get_connection(self, url: str, proxies: Optional[MutableMapping[str, str]] = None) -> ConnectionPool:
33
36
  """Returns a urllib3 connection for the given URL. This should not be
34
37
  called from user code, and is only exposed for use when subclassing the
35
38
  :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
36
39
 
37
40
  :param str url: The URL to connect to.
38
41
  :param dict proxies: (optional) A Requests-style dictionary of proxies used on this request.
39
- :rtype: urllib3.ConnectionPool
42
+ :rtype: urllib3.connectionpool.ConnectionPool
40
43
  :returns: The urllib3 ConnectionPool for the given URL.
41
44
  """
42
45
  conn = super(BiggerBlockSizeHTTPAdapter, self).get_connection(url, proxies)
corehttp/utils/_utils.py CHANGED
@@ -7,6 +7,7 @@
7
7
  import datetime
8
8
  from typing import (
9
9
  Any,
10
+ AsyncContextManager,
10
11
  Iterable,
11
12
  Iterator,
12
13
  Mapping,
@@ -164,3 +165,21 @@ def get_file_items(files: "FilesType") -> Sequence[Tuple[str, "FileType"]]:
164
165
  # though realistically it is ordered python 3.7 and after
165
166
  return cast(Sequence[Tuple[str, "FileType"]], files.items())
166
167
  return files
168
+
169
+
170
+ def get_running_async_lock() -> AsyncContextManager:
171
+ """Get a lock instance from the async library that the current context is running under.
172
+ :return: An instance of the running async library's Lock class.
173
+ :rtype: AsyncContextManager
174
+ :raises: RuntimeError if the current context is not running under an async library.
175
+ """
176
+
177
+ try:
178
+ import asyncio
179
+
180
+ # Check if we are running in an asyncio event loop.
181
+ asyncio.get_running_loop()
182
+ return asyncio.Lock()
183
+ except RuntimeError as err:
184
+ # Otherwise, assume we are running in a trio event loop, but this currently isn't supported.
185
+ raise RuntimeError("An asyncio event loop is required.") from err
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: corehttp
3
- Version: 1.0.0b3
3
+ Version: 1.0.0b5
4
4
  Summary: CoreHTTP Library for Python
5
5
  Home-page: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/core/corehttp
6
6
  Author: Microsoft Corporation
@@ -87,6 +87,18 @@ additional questions or comments.
87
87
 
88
88
  # Release History
89
89
 
90
+ ## 1.0.0b5 (2024-02-29)
91
+
92
+ ### Other Changes
93
+
94
+ - Accept float for `retry_after` header.
95
+
96
+ ## 1.0.0b4 (2024-02-23)
97
+
98
+ ### Other Changes
99
+
100
+ - Relax type checking in `Pipeline` constructors to only check that each user-supplied policy object has either a `send` method or both an `on_request` and `on_response` method. This allows for more flexible policy implementations. [#34296](https://github.com/Azure/azure-sdk-for-python/pull/34296)
101
+
90
102
  ## 1.0.0b3 (2024-02-01)
91
103
 
92
104
  ### Features Added
@@ -1,7 +1,7 @@
1
1
  corehttp/__init__.py,sha256=Wdidh085sV_IhdV_wU79t7FpghhpyxCsRnZGOUoQ0xs,1443
2
2
  corehttp/_match_conditions.py,sha256=3TIhb4vBO1hBe7MaQwS_9i-d6p7o4jn5L6M-OiQahkg,1864
3
- corehttp/_version.py,sha256=WpPNbvTVMgZmXUT0N41Pz54YA5RyfhIlQ5_h53nKNF4,494
4
- corehttp/credentials.py,sha256=YqM4sfpG5Ca0uH0tmZxGpft6l37mf7Ok5ttGKNvrV-A,5231
3
+ corehttp/_version.py,sha256=Adx1gY_uaehKHdReRn2zLYGyMjbGV43k9smdJngNeLo,494
4
+ corehttp/credentials.py,sha256=xx94AN5Nekiz3SNHJNV6ncS2o4ObCc5U_Ya62QzTfaM,5237
5
5
  corehttp/exceptions.py,sha256=qSqzPJVD_ufGO5HEAbNY8BNmVUoXPCgBeVrw195QvF4,11554
6
6
  corehttp/paging.py,sha256=zI-fFLBUgMRZmFegD2T6Q52s_3PFDb6lLjtR7-XSZDc,9520
7
7
  corehttp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -15,23 +15,23 @@ corehttp/rest/_httpx.py,sha256=7mmpEIQ0-GLf3G_Wg3-f2dQnk-mvw4xbqtL9eoPhhwY,8173
15
15
  corehttp/rest/_requests_basic.py,sha256=rw2GwxDMMrG5A4onTKLwQpsQe98MtUaowA_-BfTgsuc,7527
16
16
  corehttp/rest/_rest_py3.py,sha256=JLLGz6svFF-UwxS_GyGUq5c2KHcNL26TB-ARxfBIOY8,14096
17
17
  corehttp/runtime/__init__.py,sha256=OeG_5-Oq3Zp9rJcMfRNiYLv3V39wIZxDcQ-unerauDw,1469
18
- corehttp/runtime/_base.py,sha256=LoOjgukxlbXyb9itBUJLsfiZxMPmdED099tHSe9j_Ow,5011
19
- corehttp/runtime/_pipeline_client.py,sha256=zocWLWc3FXhPNJ2oZDYyIaPgEqqWk-8q0AEViCf27UM,6791
20
- corehttp/runtime/_pipeline_client_async.py,sha256=WK6oZonN_1S_cdCN9y3D8emzc-28iUY_XknYlZsLudI,10046
18
+ corehttp/runtime/_base.py,sha256=gr2xJQJeWuOmtrudFhM07_6ASIhUX66jR1nxSRMh068,5056
19
+ corehttp/runtime/_pipeline_client.py,sha256=A2R0JEcfFIOe6b38VzuQatAxfbiBhtu_RCpOlM968b0,7099
20
+ corehttp/runtime/_pipeline_client_async.py,sha256=dBUqhntQzcS1kbQ6z7d6C4Y3HDghLr4jrobtlKvbVTw,10378
21
21
  corehttp/runtime/pipeline/__init__.py,sha256=gRGAsJ1ZDE20TMp6JDw8OpekZdfA7ZzZvOhVHclNpDI,7727
22
- corehttp/runtime/pipeline/_base.py,sha256=6np0sAUrok6KglirlWe252b8XnpFj2wg38DkoK1q-zA,6341
23
- corehttp/runtime/pipeline/_base_async.py,sha256=2f8ExvZxZZzKsl5ubTuKabEspiCda0eemIvbUv1BIws,6898
22
+ corehttp/runtime/pipeline/_base.py,sha256=WVLDonxHv5knC-Ffq7YW2cRHr22rtZQjRtZ2N9FWzLw,6900
23
+ corehttp/runtime/pipeline/_base_async.py,sha256=4hvZDFlJ9odUs6Z6etQUlXfm9b1Bt_avZxxEee_h3Sw,7370
24
24
  corehttp/runtime/pipeline/_tools.py,sha256=iol34Mo_R6-Rezal7WSFFSzFa1V3dXf90AQydnxRnSQ,2004
25
25
  corehttp/runtime/pipeline/_tools_async.py,sha256=OvEJjH8NuGnSOrcbJBCIlN_TsO8w87kgEJ0LJcwcYH0,2159
26
26
  corehttp/runtime/policies/__init__.py,sha256=_LPYWjRNkDq45FAHUvyMJ92BL0W6pf7-KrjxSZSkF5c,2196
27
27
  corehttp/runtime/policies/_authentication.py,sha256=mgacXdydBBKPQ-5NujqNNWNNCsbt9ETWJBBdqMqgfGc,8819
28
- corehttp/runtime/policies/_authentication_async.py,sha256=xo3w9NKV0JYJ0qosyCrypwC4jWOqEavLNn8x12xxsLc,6741
28
+ corehttp/runtime/policies/_authentication_async.py,sha256=QUUYFlcsc6vJDox7vw1Ggg165c1KXEWiwM70BInoidM,6946
29
29
  corehttp/runtime/policies/_base.py,sha256=zLM4NIwGQwZ75k-KPo3PthmDCpDidHvZy91ok0wnFvQ,5063
30
30
  corehttp/runtime/policies/_base_async.py,sha256=nOZ-3lrKmfnFam3FbSY4wd9sOI7r5pI2HSdqgOC4Vz4,2531
31
31
  corehttp/runtime/policies/_retry.py,sha256=vM40m1JSD-l6yBclxmQV06_ZOK4WAcy1PTqQQpTr3ts,24367
32
32
  corehttp/runtime/policies/_retry_async.py,sha256=rsVFxlQMDyU1Z34FKd1trfxj2VkwGt-Ap7uqiErMeAc,9131
33
- corehttp/runtime/policies/_universal.py,sha256=0LQK27RI67JOerVWr5UW15ylbxxFPDbxyAGZaEjPeO8,19811
34
- corehttp/runtime/policies/_utils.py,sha256=ZODnUkPKLQOfVghqkijm8ifkrCl1oVakGafSGEJBGKA,3594
33
+ corehttp/runtime/policies/_universal.py,sha256=6qfC2MAQbp1KQgWnbbcBKuwprzEZaftx7tfY6QuHmpo,19835
34
+ corehttp/runtime/policies/_utils.py,sha256=kDnGRpC3MxsW7zHZRfkLyPMArlzY4n7vBhwQQVWKQuI,3596
35
35
  corehttp/transport/__init__.py,sha256=6A1i9gjM5isBPb-AL-2JTzxn7pssDj8ux9Ujn6rHjlY,1442
36
36
  corehttp/transport/_base.py,sha256=5gFTZ1u--3Ik9DyrAe10RtObasd-OXX1y9sRSkbvoyY,5107
37
37
  corehttp/transport/_base_async.py,sha256=9zl1Sa8Vm6QBdn8Nf-J3w2qZ-wsjcV9bv1EX5Jr28w4,3827
@@ -40,13 +40,13 @@ corehttp/transport/aiohttp/_aiohttp.py,sha256=EesPhF2tAIMxgM0qwFfUu4IUzwF8mHLHbn
40
40
  corehttp/transport/httpx/__init__.py,sha256=IbjUxTxtGljHK9nq6w0kAFeHd73zAl7qtd27qlqCrzg,1412
41
41
  corehttp/transport/httpx/_httpx.py,sha256=of8Mxyfzm1Rd4ltYNt8wGz1xuTnJVef0KaiJyl99KfE,8579
42
42
  corehttp/transport/requests/__init__.py,sha256=WPdzueqs0eLfvumuedxXPsOIpPCq3dDOvdzmIK4nyHs,1390
43
- corehttp/transport/requests/_bigger_block_size_http_adapters.py,sha256=yogrzcFJ3s9bA3Tsxgb7vjgsblnIUYqEYxk1cnTibrU,2273
43
+ corehttp/transport/requests/_bigger_block_size_http_adapters.py,sha256=0SkJ3lQHdbh1iBlCCbc9NCshDRJsVLZUZdWL-frZ_4Q,2444
44
44
  corehttp/transport/requests/_requests_basic.py,sha256=ChsXobJeBdwLTnNnDzWLZi5JYVg6M95kcxXfcgPZ3r0,8179
45
45
  corehttp/utils/__init__.py,sha256=_h2vJje1Tb-w_9mXm0hO_s2S1b48HLzI4taIlvz3Eu4,1648
46
46
  corehttp/utils/_enum_meta.py,sha256=l2K1mZfpwljsruKxknabYckl0ZbsVftOxfbRhpzF_-s,2816
47
- corehttp/utils/_utils.py,sha256=JVlqFrmVlVKI88JdJ75pWaKXnWGhWV_uxGyG4Gpq0v0,5328
48
- corehttp-1.0.0b3.dist-info/LICENSE,sha256=_VMkgdgo4ToLE8y1mOAjOKNhd0BnWoYu5r3BVBto6T0,1073
49
- corehttp-1.0.0b3.dist-info/METADATA,sha256=YE97sgRjm7Ns9FhR7QUt-8io3FuMhSro6eA5G0dbiG8,4933
50
- corehttp-1.0.0b3.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
51
- corehttp-1.0.0b3.dist-info/top_level.txt,sha256=NAGJ-rIA_vW2ZJghxC5NqIbnfrXDBMmE-TAd-9ud4i4,9
52
- corehttp-1.0.0b3.dist-info/RECORD,,
47
+ corehttp/utils/_utils.py,sha256=TN2IplPve8b6xJPMvIVE-2oF3u_SK89XtYmCb70UDr4,6063
48
+ corehttp-1.0.0b5.dist-info/LICENSE,sha256=_VMkgdgo4ToLE8y1mOAjOKNhd0BnWoYu5r3BVBto6T0,1073
49
+ corehttp-1.0.0b5.dist-info/METADATA,sha256=aTKL6zrEYPPerCUAbEj_uhl07Ex2CsbndYBd3nwjShA,5363
50
+ corehttp-1.0.0b5.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
51
+ corehttp-1.0.0b5.dist-info/top_level.txt,sha256=NAGJ-rIA_vW2ZJghxC5NqIbnfrXDBMmE-TAd-9ud4i4,9
52
+ corehttp-1.0.0b5.dist-info/RECORD,,