mirror of
https://github.com/kennethreitz/requests.git
synced 2026-06-05 22:50:18 +00:00
white / improvements
Signed-off-by: Kenneth Reitz <me@kennethreitz.org>
This commit is contained in:
@@ -63,9 +63,9 @@ def check_compatibility(urllib3_version: str, chardet_version: str) -> None:
|
||||
major, minor, patch = chardet_version.split('.')[:3]
|
||||
major, minor, patch = int(major), int(minor), int(patch)
|
||||
# chardet >= 3.0.2, < 3.1.0
|
||||
assert major == 3
|
||||
assert minor < 1
|
||||
assert patch >= 2
|
||||
assert major == 3 # type: ignore
|
||||
assert minor < 1 # type: ignore
|
||||
assert patch >= 2 # type: ignore
|
||||
|
||||
|
||||
def _check_cryptography(cryptography_version: str) -> None:
|
||||
|
||||
+1
-3
@@ -244,7 +244,6 @@ class Request(RequestHooksMixin):
|
||||
>>> req.prepare()
|
||||
<PreparedRequest [GET]>
|
||||
"""
|
||||
|
||||
__slots__ = (
|
||||
'method',
|
||||
'url',
|
||||
@@ -255,7 +254,7 @@ class Request(RequestHooksMixin):
|
||||
'auth',
|
||||
'cookies',
|
||||
'hooks',
|
||||
'json'
|
||||
'json',
|
||||
)
|
||||
|
||||
def __init__(
|
||||
@@ -640,7 +639,6 @@ class Response(object):
|
||||
'elapsed',
|
||||
'request',
|
||||
]
|
||||
|
||||
__slots__ = __attrs__ + ['_content_consumed', 'raw', '_next', 'connection']
|
||||
|
||||
def __init__(self):
|
||||
|
||||
+22
-40
@@ -2229,7 +2229,6 @@ class TestRequests:
|
||||
resp = requests.get(httpbin('response-headers?' + qs))
|
||||
fruits = resp.headers['fruit']
|
||||
assert fruits == 'Apple, Blood Orange, Banana, Berry, Blue'
|
||||
|
||||
# As we are using HTTPHeaderDict, we should be able to extract the
|
||||
# individual header values too.
|
||||
assert resp.headers.getlist('fruit') == [
|
||||
@@ -2242,14 +2241,12 @@ class TestRequests:
|
||||
# are there, rather than asserting a particular order.
|
||||
qs = 'Fruit=Apple&Fruit=Blood+Orange&Fruit=Banana&Fruit=Berry,+Blue'
|
||||
resp = requests.get(httpbin('response-headers?' + qs))
|
||||
|
||||
# These are all possible acceptable combinations for the header.
|
||||
fruit_choices = ['Apple', 'Blood Orange', 'Banana', 'Berry, Blue']
|
||||
fruit_permutations = itertools.permutations(fruit_choices)
|
||||
fruit_multiheaders = [list(fp) for fp in fruit_permutations]
|
||||
fruit_headers = set(', '.join(fp) for fp in fruit_multiheaders)
|
||||
assert resp.headers['fruit'] in fruit_headers
|
||||
|
||||
# As we are using HTTPHeaderDict, we should be able to extract the
|
||||
# individual header values too.
|
||||
assert resp.headers.getlist('fruit') in fruit_multiheaders
|
||||
@@ -2752,20 +2749,16 @@ class TestPreparingURLs(object):
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
'input, expected',
|
||||
(
|
||||
# TODO: Bugs in rfc3986, apparently.
|
||||
# (
|
||||
# b"http+unix://%2Fvar%2Frun%2Fsocket/path%7E",
|
||||
# u"http+unix://%2Fvar%2Frun%2Fsocket/path~",
|
||||
# ),
|
||||
# (
|
||||
# u"http+unix://%2Fvar%2Frun%2Fsocket/path%7E",
|
||||
# u"http+unix://%2Fvar%2Frun%2Fsocket/path~",
|
||||
# ),
|
||||
(b"mailto:user@example.org", u"mailto:user@example.org"),
|
||||
(u"mailto:user@example.org", u"mailto:user@example.org"),
|
||||
(b"data:SSDimaUgUHl0aG9uIQ==", u"data:SSDimaUgUHl0aG9uIQ=="),
|
||||
),
|
||||
((b"mailto:user@example.org", u"mailto:user@example.org"), (u"mailto:user@example.org", u"mailto:user@example.org"), (b"data:SSDimaUgUHl0aG9uIQ==", u"data:SSDimaUgUHl0aG9uIQ==")),
|
||||
# TODO: Bugs in rfc3986, apparently.
|
||||
# (
|
||||
# b"http+unix://%2Fvar%2Frun%2Fsocket/path%7E",
|
||||
# u"http+unix://%2Fvar%2Frun%2Fsocket/path~",
|
||||
# ),
|
||||
# (
|
||||
# u"http+unix://%2Fvar%2Frun%2Fsocket/path%7E",
|
||||
# u"http+unix://%2Fvar%2Frun%2Fsocket/path~",
|
||||
# ),
|
||||
)
|
||||
def test_url_mutation(self, input, expected):
|
||||
"""
|
||||
@@ -2780,29 +2773,18 @@ class TestPreparingURLs(object):
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
'input, params, expected',
|
||||
(
|
||||
# TODO:
|
||||
# (
|
||||
# b"http+unix://%2Fvar%2Frun%2Fsocket/path",
|
||||
# {"key": "value"},
|
||||
# u"http+unix://%2Fvar%2Frun%2Fsocket/path?key=value",
|
||||
# ),
|
||||
# (
|
||||
# u"http+unix://%2Fvar%2Frun%2Fsocket/path",
|
||||
# {"key": "value"},
|
||||
# u"http+unix://%2Fvar%2Frun%2Fsocket/path?key=value",
|
||||
# ),
|
||||
(
|
||||
b"mailto:user@example.org",
|
||||
{"key": "value"},
|
||||
u"mailto:user@example.org",
|
||||
),
|
||||
(
|
||||
u"mailto:user@example.org",
|
||||
{"key": "value"},
|
||||
u"mailto:user@example.org",
|
||||
),
|
||||
),
|
||||
((b"mailto:user@example.org", {"key": "value"}, u"mailto:user@example.org"), (u"mailto:user@example.org", {"key": "value"}, u"mailto:user@example.org")),
|
||||
# TODO:
|
||||
# (
|
||||
# b"http+unix://%2Fvar%2Frun%2Fsocket/path",
|
||||
# {"key": "value"},
|
||||
# u"http+unix://%2Fvar%2Frun%2Fsocket/path?key=value",
|
||||
# ),
|
||||
# (
|
||||
# u"http+unix://%2Fvar%2Frun%2Fsocket/path",
|
||||
# {"key": "value"},
|
||||
# u"http+unix://%2Fvar%2Frun%2Fsocket/path?key=value",
|
||||
# ),
|
||||
)
|
||||
def test_parameters_for_nonstandard_schemes(self, input, params, expected):
|
||||
"""
|
||||
|
||||
@@ -53,7 +53,6 @@ class TestCaseInsensitiveDict:
|
||||
|
||||
|
||||
class TestHTTPHeaderDictCompatibility(TestCaseInsensitiveDict):
|
||||
|
||||
"""HTTPHeaderDict should be completely compatible with CaseInsensitiveDict
|
||||
when used for headers, so ensure that all the tests for the base class
|
||||
also pass for this one."""
|
||||
@@ -75,22 +74,18 @@ class TestHTTPHeaderDict:
|
||||
('Sauce', 'Bread'),
|
||||
('Sauce', 'Cherry, or Plum Tomato'),
|
||||
]
|
||||
|
||||
# HTTPHeaderDict from urllib3.
|
||||
self.u3dict = ud = U3HeaderDict()
|
||||
[ud.add(*tpl) for tpl in self.kvs]
|
||||
|
||||
# Regular dictionary.
|
||||
self.ddict = dict(self.kvs)
|
||||
self.ddict['Sauce'] = ['Bread!', 'Cherry, or Plum Tomato']
|
||||
|
||||
# Used by test_extend. All of these "extra" values are mostly
|
||||
# equivalent to each other.
|
||||
self.extra_hd = hd2 = HTTPHeaderDict(ANIMAL=['Dog', 'elephant'])
|
||||
hd2['cake'] = 'Babka'
|
||||
hd2.setlist('sound', ['quiet', 'LOUD'])
|
||||
hd2['CUTLERY'] = 'fork'
|
||||
|
||||
self.extra_tuple_pairs = tuple_pairs = [
|
||||
('ANIMAL', 'Dog'),
|
||||
('Animal', 'elephant'),
|
||||
@@ -99,10 +94,8 @@ class TestHTTPHeaderDict:
|
||||
('sound', 'LOUD'),
|
||||
('CUTLERY', 'fork'),
|
||||
]
|
||||
|
||||
self.extra_simple_dict = dict(tuple_pairs)
|
||||
self.extra_simple_dict['sound'] = ('quiet', 'LOUD')
|
||||
|
||||
self.extra_u3 = U3HeaderDict()
|
||||
for k, v in tuple_pairs:
|
||||
if isinstance(v, (tuple, list)):
|
||||
@@ -113,19 +106,15 @@ class TestHTTPHeaderDict:
|
||||
|
||||
def test_item_access(self):
|
||||
hd = HTTPHeaderDict(self.kvs)
|
||||
|
||||
# Test that values are combined.
|
||||
assert hd['Sauce'] == 'Bread, Cherry, or Plum Tomato'
|
||||
assert hd['ANIMAL'] == 'chicken, Cow'
|
||||
|
||||
# Test we can overwrite values.
|
||||
hd['animal'] = 'Goat!'
|
||||
assert hd['anIMal'] == 'Goat!'
|
||||
|
||||
# Test deletion works.
|
||||
del hd['sauce']
|
||||
pytest.raises(KeyError, hd.__getitem__, 'sauce')
|
||||
|
||||
# Only string types allowed.
|
||||
pytest.raises(ValueError, hd.__setitem__, 'cake', ['Cheese', 'sponge'])
|
||||
|
||||
@@ -133,7 +122,6 @@ class TestHTTPHeaderDict:
|
||||
hd = HTTPHeaderDict(self.u3dict)
|
||||
assert hd == self.u3dict
|
||||
assert hd == HTTPHeaderDict(hd)
|
||||
|
||||
# Test that we still work even if we are comparing to a
|
||||
# CaseInsensitiveDict instance.
|
||||
cid = CaseInsensitiveDict(hd)
|
||||
@@ -160,15 +148,12 @@ class TestHTTPHeaderDict:
|
||||
assert hd.getlist('SAUCE') == ['Bread', 'Cherry, or Plum Tomato']
|
||||
assert hd.getlist('CAKE') == ['Cheese!']
|
||||
assert hd.getlist('DRINK') == []
|
||||
|
||||
# Needs to be a regular sequence type containing just strings.
|
||||
pytest.raises(ValueError, hd.setlist, 'Drink', 'Water')
|
||||
pytest.raises(ValueError, hd.setlist, 'Drink', ['H', 2, 'O'])
|
||||
|
||||
# Test multi-setting.
|
||||
hd.setlist('Drink', ['Water', 'Juice'])
|
||||
assert hd.getlist('DRINK') == ['Water', 'Juice']
|
||||
|
||||
# Setting to an empty sequence should remove the entry.
|
||||
hd.setlist('DRInk', [])
|
||||
pytest.raises(KeyError, hd.__getitem__, 'DrinK')
|
||||
@@ -179,37 +164,28 @@ class TestHTTPHeaderDict:
|
||||
hd.add('sound', 'quiet')
|
||||
hd.add('SOUND', 'LOUD')
|
||||
assert hd.getlist('Sound') == ['quiet', 'LOUD']
|
||||
|
||||
# Enforce type-checking in the add method.
|
||||
pytest.raises(ValueError, hd.add, 'Sound', 5)
|
||||
|
||||
@pytest.mark.parametrize('attr,as_arg,animal_arg_is_ordered', [
|
||||
@pytest.mark.parametrize(
|
||||
'attr,as_arg,animal_arg_is_ordered',
|
||||
[('extra_hd', True, True), ('extra_tuple_pairs', True, True), ('extra_simple_dict', True, False), ('extra_u3', True, False), ('extra_simple_dict', False, False)],
|
||||
# These types will have the "animal" arguments in our preferred order.
|
||||
('extra_hd', True, True),
|
||||
('extra_tuple_pairs', True, True),
|
||||
|
||||
# And these types will lose the ordering, so we can't make assertions
|
||||
# about the final order of those values.
|
||||
('extra_simple_dict', True, False),
|
||||
('extra_u3', True, False),
|
||||
('extra_simple_dict', False, False),
|
||||
])
|
||||
)
|
||||
def test_extend(self, attr, as_arg, animal_arg_is_ordered):
|
||||
item = getattr(self, attr)
|
||||
|
||||
# Call extend with the associated values - we should see all of the
|
||||
# merged data in the HTTPHeaderDict instance.
|
||||
extras = {'cutlery': 'knife'}
|
||||
hd = HTTPHeaderDict(self.kvs)
|
||||
|
||||
if as_arg:
|
||||
hd.extend(item, **extras)
|
||||
else:
|
||||
hd.extend(extras, **item)
|
||||
|
||||
# Test all the stored values are what we expect.
|
||||
mget = hd.getlist
|
||||
|
||||
# Depending on the item we merged in, we might be able to make
|
||||
# assumptions what the overall order of the structure is.
|
||||
animal_seq = mget('animal')
|
||||
@@ -221,17 +197,13 @@ class TestHTTPHeaderDict:
|
||||
# two values are added.
|
||||
assert animal_seq in [
|
||||
['chicken', 'Cow', 'Dog', 'elephant'],
|
||||
['chicken', 'Cow', 'elephant', 'Dog']
|
||||
['chicken', 'Cow', 'elephant', 'Dog'],
|
||||
]
|
||||
|
||||
assert mget('cake') == ['Cheese!', 'Babka']
|
||||
assert mget('sound') == ['quiet', 'LOUD']
|
||||
|
||||
# We don't mandate the order in which these dictionaries are
|
||||
# processed, so it's fine whichever order it is.
|
||||
assert mget('cutlery') in [
|
||||
['fork', 'knife'], ['knife', 'fork']
|
||||
]
|
||||
assert mget('cutlery') in [['fork', 'knife'], ['knife', 'fork']]
|
||||
|
||||
def test_extend_type_checking(self):
|
||||
hd = HTTPHeaderDict()
|
||||
@@ -244,7 +216,6 @@ class TestHTTPHeaderDict:
|
||||
assert repr(hd) == "{'type': 'xml'}"
|
||||
hd.add('type', 'html')
|
||||
assert repr(hd) == "{'type': ('xml', 'html')}"
|
||||
|
||||
# We can't guarantee order once we have more than one key.
|
||||
hd.add('Accept', 'text/html')
|
||||
assert repr(hd) in [
|
||||
|
||||
Reference in New Issue
Block a user