Skip to content

Commit 45cb48f

Browse files
committed
Get rid of getall parameter for multidict views
1 parent c9de376 commit 45cb48f

File tree

5 files changed

+67
-108
lines changed

5 files changed

+67
-108
lines changed

aiohttp/_multidict.pyx

Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -94,23 +94,23 @@ cdef class _Base:
9494
def __len__(self):
9595
return len(self._items)
9696

97-
def keys(self, *, getall=True):
98-
return self._keys_view(getall)
97+
def keys(self):
98+
return self._keys_view()
9999

100-
cdef _KeysView _keys_view(self, getall):
101-
return _KeysView.__new__(_KeysView, self._items, getall)
100+
cdef _KeysView _keys_view(self):
101+
return _KeysView.__new__(_KeysView, self._items)
102102

103-
def items(self, *, getall=True):
104-
return self._items_view(getall)
103+
def items(self):
104+
return self._items_view()
105105

106-
cdef _ItemsView _items_view(self, getall):
107-
return _ItemsView.__new__(_ItemsView, self._items, getall)
106+
cdef _ItemsView _items_view(self):
107+
return _ItemsView.__new__(_ItemsView, self._items)
108108

109-
def values(self, *, getall=True):
110-
return self._values_view(getall)
109+
def values(self):
110+
return self._values_view()
111111

112-
cdef _ValuesView _values_view(self, getall):
113-
return _ValuesView.__new__(_ValuesView, self._items, getall)
112+
cdef _ValuesView _values_view(self):
113+
return _ValuesView.__new__(_ValuesView, self._items)
114114

115115
def __repr__(self):
116116
body = ', '.join("'{}': {!r}".format(k, v) for k, v in self.items())
@@ -367,24 +367,8 @@ cdef class _ViewBase:
367367
cdef list _keys
368368
cdef list _items
369369

370-
def __cinit__(self, list items, int getall):
371-
cdef list items_to_use
372-
cdef set keys
373-
374-
if getall:
375-
self._items = items
376-
self._keys = [item[0] for item in items]
377-
else:
378-
self._items = []
379-
keys = set()
380-
self._keys = []
381-
for i in items:
382-
key = i[0]
383-
if key in keys:
384-
continue
385-
keys.add(key)
386-
self._keys.append(key)
387-
self._items.append(i)
370+
def __cinit__(self, list items):
371+
self._items = items
388372

389373
def __len__(self):
390374
return len(self._items)
@@ -477,12 +461,14 @@ abc.ItemsView.register(_ItemsView)
477461
cdef class _ValuesView(_ViewBase):
478462

479463
def __contains__(self, value):
464+
cdef tuple item
480465
for item in self._items:
481466
if item[1] == value:
482467
return True
483468
return False
484469

485470
def __iter__(self):
471+
cdef tuple item
486472
for item in self._items:
487473
yield item[1]
488474

@@ -494,16 +480,23 @@ cdef class _KeysView(_ViewBaseSet):
494480

495481
def isdisjoint(self, other):
496482
'Return True if two sets have a null intersection.'
497-
for key in self._keys:
498-
if key in other:
483+
cdef tuple item
484+
for item in self._items:
485+
if item[0] in other:
499486
return False
500487
return True
501488

502-
def __contains__(self, key):
503-
return key in self._keys
489+
def __contains__(self, value):
490+
cdef tuple item
491+
for item in self._items:
492+
if item[0] == value:
493+
return True
494+
return False
504495

505496
def __iter__(self):
506-
return iter(self._keys)
497+
cdef tuple item
498+
for item in self._items:
499+
yield item[0]
507500

508501

509502
abc.KeysView.register(_KeysView)

aiohttp/multidict.py

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,14 @@ def __iter__(self):
6767
def __len__(self):
6868
return len(self._items)
6969

70-
def keys(self, *, getall=True):
71-
return _KeysView(self._items, getall=getall)
70+
def keys(self):
71+
return _KeysView(self._items)
7272

73-
def items(self, *, getall=True):
74-
return _ItemsView(self._items, getall=getall)
73+
def items(self):
74+
return _ItemsView(self._items)
7575

76-
def values(self, *, getall=True):
77-
return _ValuesView(self._items, getall=getall)
76+
def values(self):
77+
return _ValuesView(self._items)
7878

7979
def __eq__(self, other):
8080
if not isinstance(other, abc.Mapping):
@@ -277,23 +277,8 @@ class _ViewBase:
277277

278278
__slots__ = ('_keys', '_items')
279279

280-
def __init__(self, items, getall):
281-
if getall:
282-
items_to_use = items
283-
self._keys = [item[0] for item in items]
284-
else:
285-
items_to_use = []
286-
keys = set()
287-
self._keys = []
288-
for i in items:
289-
key = i[0]
290-
if key in keys:
291-
continue
292-
keys.add(key)
293-
self._keys.append(key)
294-
items_to_use.append(i)
295-
296-
self._items = items_to_use
280+
def __init__(self, items):
281+
self._items = items
297282

298283
def __len__(self):
299284
return len(self._items)
@@ -326,10 +311,14 @@ def __iter__(self):
326311
class _KeysView(_ViewBase, abc.KeysView):
327312

328313
def __contains__(self, key):
329-
return key in self._keys
314+
for item in self._items:
315+
if item[0] == key:
316+
return True
317+
return False
330318

331319
def __iter__(self):
332-
yield from self._keys
320+
for item in self._items:
321+
yield item[0]
333322

334323

335324
try:

tests/test_http_parser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def test_parse_headers_multi(self):
3636

3737
headers, close, compression = self.parser.parse_headers(hdrs)
3838

39-
self.assertEqual(list(headers.items(getall=True)),
39+
self.assertEqual(list(headers.items()),
4040
[('SET-COOKIE', 'c1=cookie1'),
4141
('SET-COOKIE', 'c2=cookie2')])
4242
self.assertIsNone(close)

tests/test_multidict.py

Lines changed: 23 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ def test_instantiate__empty(self):
4040
self.assertEqual(len(d), 0)
4141
self.assertEqual(list(d.keys()), [])
4242
self.assertEqual(list(d.values()), [])
43-
self.assertEqual(list(d.values(getall=True)), [])
43+
self.assertEqual(list(d.values()), [])
44+
self.assertEqual(list(d.items()), [])
4445
self.assertEqual(list(d.items()), [])
45-
self.assertEqual(list(d.items(getall=True)), [])
4646

4747
self.assertNotEqual(self.make_dict(), list())
4848
with self.assertRaisesRegex(TypeError, "\(2 given\)"):
@@ -55,9 +55,7 @@ def test_instantiate__from_arg0(self):
5555
self.assertEqual(len(d), 1)
5656
self.assertEqual(list(d.keys()), ['key'])
5757
self.assertEqual(list(d.values()), ['value1'])
58-
self.assertEqual(list(d.values(getall=True)), ['value1'])
5958
self.assertEqual(list(d.items()), [('key', 'value1')])
60-
self.assertEqual(list(d.items(getall=True)), [('key', 'value1')])
6159

6260
def test_instantiate__from_arg0_dict(self):
6361
d = self.make_dict({'key': 'value1'})
@@ -66,9 +64,7 @@ def test_instantiate__from_arg0_dict(self):
6664
self.assertEqual(len(d), 1)
6765
self.assertEqual(list(d.keys()), ['key'])
6866
self.assertEqual(list(d.values()), ['value1'])
69-
self.assertEqual(list(d.values(getall=True)), ['value1'])
7067
self.assertEqual(list(d.items()), [('key', 'value1')])
71-
self.assertEqual(list(d.items(getall=True)), [('key', 'value1')])
7268

7369
def test_instantiate__with_kwargs(self):
7470
d = self.make_dict([('key', 'value1')], key2='value2')
@@ -99,54 +95,35 @@ def test__iter__(self):
9995

10096
def test_keys__contains(self):
10197
d = self.make_dict([('key', 'one'), ('key2', 'two'), ('key', 3)])
102-
self.assertEqual(list(d.keys(getall=False)), ['key', 'key2'])
103-
self.assertEqual(list(d.keys(getall=True)), ['key', 'key2', 'key'])
10498
self.assertEqual(list(d.keys()), ['key', 'key2', 'key'])
10599

106-
self.assertIn('key', d.keys(getall=False))
107-
self.assertIn('key2', d.keys(getall=False))
100+
self.assertIn('key', d.keys())
101+
self.assertIn('key2', d.keys())
108102

109-
self.assertIn('key', d.keys(getall=True))
110-
self.assertIn('key2', d.keys(getall=True))
111-
112-
self.assertNotIn('foo', d.keys(getall=False))
113-
self.assertNotIn('foo', d.keys(getall=True))
103+
self.assertNotIn('foo', d.keys())
114104

115105
def test_values__contains(self):
116106
d = self.make_dict([('key', 'one'), ('key', 'two'), ('key', 3)])
117-
self.assertEqual(list(d.values(getall=False)), ['one'])
118-
self.assertEqual(list(d.values(getall=True)), ['one', 'two', 3])
119107
self.assertEqual(list(d.values()), ['one', 'two', 3])
120108

121-
self.assertIn('one', d.values(getall=False))
122-
self.assertNotIn('two', d.values(getall=False))
123-
self.assertNotIn(3, d.values(getall=False))
124-
125-
self.assertIn('one', d.values(getall=True))
126-
self.assertIn('two', d.values(getall=True))
127-
self.assertIn(3, d.values(getall=True))
109+
self.assertIn('one', d.values())
110+
self.assertIn('two', d.values())
111+
self.assertIn(3, d.values())
128112

129-
self.assertNotIn('foo', d.values(getall=False))
130-
self.assertNotIn('foo', d.values(getall=True))
113+
self.assertNotIn('foo', d.values())
131114

132115
def test_items__contains(self):
133116
d = self.make_dict([('key', 'one'), ('key', 'two'), ('key', 3)])
134-
self.assertEqual(list(d.items(getall=False)), [('key', 'one')])
135-
self.assertEqual(list(d.items(getall=True)),
117+
self.assertEqual(list(d.items()),
136118
[('key', 'one'), ('key', 'two'), ('key', 3)])
137119
self.assertEqual(list(d.items()),
138120
[('key', 'one'), ('key', 'two'), ('key', 3)])
139121

140-
self.assertIn(('key', 'one'), d.items(getall=False))
141-
self.assertNotIn(('key', 'two'), d.items(getall=False))
142-
self.assertNotIn(('key', 3), d.items(getall=False))
143-
144-
self.assertIn(('key', 'one'), d.items(getall=True))
145-
self.assertIn(('key', 'two'), d.items(getall=True))
146-
self.assertIn(('key', 3), d.items(getall=True))
122+
self.assertIn(('key', 'one'), d.items())
123+
self.assertIn(('key', 'two'), d.items())
124+
self.assertIn(('key', 3), d.items())
147125

148-
self.assertNotIn(('foo', 'bar'), d.items(getall=False))
149-
self.assertNotIn(('foo', 'bar'), d.items(getall=True))
126+
self.assertNotIn(('foo', 'bar'), d.items())
150127

151128
def test_cannot_create_from_unaccepted(self):
152129
with self.assertRaises(TypeError):
@@ -265,7 +242,7 @@ def test_getall(self):
265242

266243
def test_preserve_stable_ordering(self):
267244
d = self.make_dict([('a', 1), ('b', '2'), ('a', 3)])
268-
s = '&'.join('{}={}'.format(k, v) for k, v in d.items(getall=True))
245+
s = '&'.join('{}={}'.format(k, v) for k, v in d.items())
269246

270247
self.assertEqual('a=1&b=2&a=3', s)
271248

@@ -396,7 +373,7 @@ def test_extend(self):
396373
d.extend([('key', 'one'), ('key', 'two')], key=3, foo='bar')
397374
self.assertNotEqual(d, {'key': 'one', 'foo': 'bar'})
398375
self.assertEqual(4, len(d))
399-
itms = d.items(getall=True)
376+
itms = d.items()
400377
# we can't guarantee order of kwargs
401378
self.assertTrue(('key', 'one') in itms)
402379
self.assertTrue(('key', 'two') in itms)
@@ -407,10 +384,10 @@ def test_extend(self):
407384
self.assertEqual(other, {'bar': 'baz'})
408385

409386
d.extend(other)
410-
self.assertIn(('bar', 'baz'), d.items(getall=True))
387+
self.assertIn(('bar', 'baz'), d.items())
411388

412389
d.extend({'foo': 'moo'})
413-
self.assertIn(('foo', 'moo'), d.items(getall=True))
390+
self.assertIn(('foo', 'moo'), d.items())
414391

415392
d.extend()
416393
self.assertEqual(6, len(d))
@@ -423,14 +400,14 @@ def test_clear(self):
423400

424401
d.clear()
425402
self.assertEqual(d, {})
426-
self.assertEqual(list(d.items(getall=True)), [])
403+
self.assertEqual(list(d.items()), [])
427404

428405
def test_del(self):
429406
d = self.make_dict([('key', 'one'), ('key', 'two')], foo='bar')
430407

431408
del d['key']
432409
self.assertEqual(d, {'foo': 'bar'})
433-
self.assertEqual(list(d.items(getall=True)), [('foo', 'bar')])
410+
self.assertEqual(list(d.items()), [('foo', 'bar')])
434411

435412
with self.assertRaises(KeyError):
436413
del d['key']
@@ -565,7 +542,7 @@ def test_extend(self):
565542
d.extend([('KEY', 'one'), ('key', 'two')], key=3, foo='bar')
566543
self.assertNotEqual(d, {'KEY': 'one', 'FOO': 'bar'})
567544
self.assertEqual(4, len(d))
568-
itms = d.items(getall=True)
545+
itms = d.items()
569546
# we can't guarantee order of kwargs
570547
self.assertTrue(('KEY', 'one') in itms)
571548
self.assertTrue(('KEY', 'two') in itms)
@@ -576,10 +553,10 @@ def test_extend(self):
576553
self.assertEqual(other, {'BAR': 'baz'})
577554

578555
d.extend(other)
579-
self.assertIn(('BAR', 'baz'), d.items(getall=True))
556+
self.assertIn(('BAR', 'baz'), d.items())
580557

581558
d.extend({'FOO': 'moo'})
582-
self.assertIn(('FOO', 'moo'), d.items(getall=True))
559+
self.assertIn(('FOO', 'moo'), d.items())
583560

584561
d.extend()
585562
self.assertEqual(6, len(d))

tests/test_web_functional.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ def test_post_form_with_duplicate_keys(self):
303303
@asyncio.coroutine
304304
def handler(request):
305305
data = yield from request.post()
306-
lst = list(sorted(data.items(getall=True)))
306+
lst = list(sorted(data.items()))
307307
self.assertEqual([('a', '1'), ('a', '2')], lst)
308308
return web.Response(body=b'OK')
309309

0 commit comments

Comments
 (0)