Allowed passing objects of Mapping class or its subclass to the CaselessDict initializer

This commit is contained in:
woxcab 2017-03-13 14:16:39 +03:00
parent cfb56400b2
commit fbb411a805
2 changed files with 45 additions and 2 deletions

View File

@ -8,7 +8,7 @@ This module must not depend on any module outside the Standard Library.
import copy
import six
import warnings
from collections import OrderedDict
from collections import OrderedDict, Mapping
from scrapy.exceptions import ScrapyDeprecationWarning
@ -224,7 +224,7 @@ class CaselessDict(dict):
return dict.setdefault(self, self.normkey(key), self.normvalue(def_val))
def update(self, seq):
seq = seq.items() if isinstance(seq, dict) else seq
seq = seq.items() if isinstance(seq, Mapping) else seq
iseq = ((self.normkey(k), self.normvalue(v)) for k, v in seq)
super(CaselessDict, self).update(iseq)

View File

@ -1,5 +1,6 @@
import copy
import unittest
from collections import Mapping, MutableMapping
from scrapy.utils.datatypes import CaselessDict, SequenceExclude
@ -18,6 +19,48 @@ class CaselessDictTest(unittest.TestCase):
self.assertEqual(d['red'], 1)
self.assertEqual(d['black'], 3)
class MyMapping(Mapping):
def __init__(self, **kwargs):
self._d = kwargs
def __getitem__(self, key):
return self._d[key]
def __iter__(self):
return iter(self._d)
def __len__(self):
return len(self._d)
seq = MyMapping(red=1, black=3)
d = CaselessDict(seq)
self.assertEqual(d['red'], 1)
self.assertEqual(d['black'], 3)
class MyMutableMapping(MutableMapping):
def __init__(self, **kwargs):
self._d = kwargs
def __getitem__(self, key):
return self._d[key]
def __setitem__(self, key, value):
self._d[key] = value
def __delitem__(self, key):
del self._d[key]
def __iter__(self):
return iter(self._d)
def __len__(self):
return len(self._d)
seq = MyMutableMapping(red=1, black=3)
d = CaselessDict(seq)
self.assertEqual(d['red'], 1)
self.assertEqual(d['black'], 3)
def test_caseless(self):
d = CaselessDict()
d['key_Lower'] = 1