Merge pull request #2646 from woxcab/master

[MRG+1] Allowed passing objects of Mapping class or its subclass to the CaselessDict initializer
This commit is contained in:
Paul Tremberth 2017-03-15 13:11:58 +01:00 committed by GitHub
commit 1c0da1749d
2 changed files with 49 additions and 3 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
@ -7,17 +8,62 @@ __doctests__ = ['scrapy.utils.datatypes']
class CaselessDictTest(unittest.TestCase):
def test_init(self):
def test_init_dict(self):
seq = {'red': 1, 'black': 3}
d = CaselessDict(seq)
self.assertEqual(d['red'], 1)
self.assertEqual(d['black'], 3)
def test_init_pair_sequence(self):
seq = (('red', 1), ('black', 3))
d = CaselessDict(seq)
self.assertEqual(d['red'], 1)
self.assertEqual(d['black'], 3)
def test_init_mapping(self):
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)
def test_init_mutable_mapping(self):
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