Skip to content

Commit c2b81da

Browse files
committed
Code cleanup, fix setdefault implementation for pure python
1 parent a57def5 commit c2b81da

File tree

3 files changed

+142
-26
lines changed

3 files changed

+142
-26
lines changed

aiohttp/_multidict.pyx

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -260,10 +260,12 @@ cdef class MultiDict(_Base):
260260
# MutableMapping interface #
261261

262262
def __setitem__(self, key, value):
263+
key = self._upper(key)
263264
self._delitem(key, False)
264265
self._add((key, value))
265266

266267
def __delitem__(self, key):
268+
key = self._upper(key)
267269
self._delitem(key, True)
268270

269271
cdef _delitem(self, key, int raise_key_error):
@@ -355,27 +357,6 @@ cdef class CIMultiDict(MultiDict):
355357
return s
356358
return s.upper()
357359

358-
# MutableMapping interface #
359-
360-
def __setitem__(self, key, value):
361-
key = self._upper(key)
362-
self._delitem(key, False)
363-
self._add((key, value))
364-
365-
def __delitem__(self, key):
366-
self._delitem(self._upper(key), True)
367-
368-
def setdefault(self, key, default=None):
369-
key = self._upper(key)
370-
for k, v in self._items:
371-
if k == key:
372-
return v
373-
self._add((key, default))
374-
return default
375-
376-
def update(self, *args, **kw):
377-
"""Method not allowed."""
378-
raise NotImplementedError("Use extend method instead")
379360

380361

381362
abc.MutableMapping.register(CIMultiDict)

aiohttp/multidict.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,10 @@ def __delitem__(self, key):
268268
def _replace(self, key, value):
269269
super()._replace(key.upper(), value)
270270

271+
def setdefault(self, key, default=None):
272+
key = key.upper()
273+
return super().setdefault(key, default)
274+
271275

272276
class _ViewBase:
273277

tests/test_multidict.py

Lines changed: 136 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -509,11 +509,6 @@ def test_ctor(self):
509509
d = self.make_dict(k1='v1')
510510
self.assertEqual('v1', d['K1'])
511511

512-
def test_add(self):
513-
d = self.make_dict()
514-
d.add('k1', 'v1')
515-
self.assertEqual('v1', d['K1'])
516-
517512
def test_setitem(self):
518513
d = self.make_dict()
519514
d['k1'] = 'v1'
@@ -526,6 +521,142 @@ def test_delitem(self):
526521
del d['k1']
527522
self.assertNotIn('K1', d)
528523

524+
def test_copy(self):
525+
d1 = self.make_dict(key='KEY', a='b')
526+
527+
d2 = d1.copy()
528+
self.assertEqual(d1, d2)
529+
self.assertIsNot(d1, d2)
530+
531+
def test__repr__(self):
532+
d = self.make_dict()
533+
self.assertEqual(str(d), "<%s {}>" % self.cls.__name__)
534+
535+
d = self.make_dict([('KEY', 'one'), ('KEY', 'two')])
536+
537+
self.assertEqual(
538+
str(d),
539+
"<%s {'KEY': 'one', 'KEY': 'two'}>" % self.cls.__name__)
540+
541+
def test_add(self):
542+
d = self.make_dict()
543+
544+
self.assertEqual(d, {})
545+
d['KEY'] = 'one'
546+
self.assertEqual(d, {'KEY': 'one'})
547+
self.assertEqual(d.getall('key'), ['one'])
548+
549+
d['KEY'] = 'two'
550+
self.assertEqual(d, {'KEY': 'two'})
551+
self.assertEqual(d.getall('key'), ['two'])
552+
553+
d.add('KEY', 'one')
554+
self.assertEqual(2, len(d))
555+
self.assertEqual(d.getall('key'), ['two', 'one'])
556+
557+
d.add('FOO', 'bar')
558+
self.assertEqual(3, len(d))
559+
self.assertEqual(d.getall('foo'), ['bar'])
560+
561+
def test_extend(self):
562+
d = self.make_dict()
563+
self.assertEqual(d, {})
564+
565+
d.extend([('KEY', 'one'), ('key', 'two')], key=3, foo='bar')
566+
self.assertNotEqual(d, {'KEY': 'one', 'FOO': 'bar'})
567+
self.assertEqual(4, len(d))
568+
itms = d.items(getall=True)
569+
# we can't guarantee order of kwargs
570+
self.assertTrue(('KEY', 'one') in itms)
571+
self.assertTrue(('KEY', 'two') in itms)
572+
self.assertTrue(('KEY', 3) in itms)
573+
self.assertTrue(('FOO', 'bar') in itms)
574+
575+
other = self.make_dict(bar='baz')
576+
self.assertEqual(other, {'BAR': 'baz'})
577+
578+
d.extend(other)
579+
self.assertIn(('BAR', 'baz'), d.items(getall=True))
580+
581+
d.extend({'FOO': 'moo'})
582+
self.assertIn(('FOO', 'moo'), d.items(getall=True))
583+
584+
d.extend()
585+
self.assertEqual(6, len(d))
586+
587+
with self.assertRaises(TypeError):
588+
d.extend('foo', 'bar')
589+
590+
def test_clear(self):
591+
d = self.make_dict([('KEY', 'one')], key='two', foo='bar')
592+
593+
d.clear()
594+
self.assertEqual(d, {})
595+
self.assertEqual(list(d.items()), [])
596+
597+
def test_del(self):
598+
d = self.make_dict([('KEY', 'one'), ('key', 'two')], foo='bar')
599+
600+
del d['key']
601+
self.assertEqual(d, {'FOO': 'bar'})
602+
self.assertEqual(list(d.items()), [('FOO', 'bar')])
603+
604+
with self.assertRaises(KeyError):
605+
del d['key']
606+
607+
def test_set_default(self):
608+
d = self.make_dict([('KEY', 'one'), ('key', 'two')], foo='bar')
609+
self.assertEqual('one', d.setdefault('key', 'three'))
610+
self.assertEqual('three', d.setdefault('otherkey', 'three'))
611+
self.assertIn('otherkey', d)
612+
self.assertEqual('three', d['OTHERKEY'])
613+
614+
def test_popitem(self):
615+
d = self.make_dict()
616+
d.add('KEY', 'val1')
617+
d.add('key', 'val2')
618+
619+
self.assertEqual(('KEY', 'val1'), d.popitem())
620+
self.assertEqual([('KEY', 'val2')], list(d.items()))
621+
622+
def test_popitem_empty_multidict(self):
623+
d = self.make_dict()
624+
625+
with self.assertRaises(KeyError):
626+
d.popitem()
627+
628+
def test_pop(self):
629+
d = self.make_dict()
630+
d.add('KEY', 'val1')
631+
d.add('key', 'val2')
632+
633+
self.assertEqual('val1', d.pop('KEY'))
634+
self.assertFalse(d)
635+
636+
def test_pop_default(self):
637+
d = self.make_dict(other='val')
638+
639+
self.assertEqual('default', d.pop('key', 'default'))
640+
self.assertIn('other', d)
641+
642+
def test_pop_raises(self):
643+
d = self.make_dict(other='val')
644+
645+
with self.assertRaises(KeyError):
646+
d.pop('key')
647+
648+
self.assertIn('other', d)
649+
650+
def test_update(self):
651+
d = self.make_dict()
652+
d.add('KEY', 'val1')
653+
d.add('key', 'val2')
654+
d.add('key2', 'val3')
655+
656+
d.update(key='val')
657+
658+
self.assertEqual([('KEY2', 'val3'), ('KEY', 'val')], list(d.items()))
659+
529660

530661
class TestPyMultiDictProxy(_TestProxy, unittest.TestCase):
531662

0 commit comments

Comments
 (0)