Skip to content

Commit 15102a0

Browse files
committed
Use Mapping interface
1 parent 3dceda0 commit 15102a0

File tree

2 files changed

+25
-11
lines changed

2 files changed

+25
-11
lines changed

pysass.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,17 +150,20 @@ static union Sass_Value* _to_sass_value(PyObject* value) {
150150
Py_DECREF(bytes);
151151
} else if (PySass_Bytes_Check(value)) {
152152
retv = sass_make_string(PySass_Bytes_AS_STRING(value));
153-
} else if (PyDict_Check(value)) {
153+
} else if (PyMapping_Check(value)) {
154154
size_t i = 0;
155155
Py_ssize_t pos = 0;
156156
PyObject* d_key = NULL;
157157
PyObject* d_value = NULL;
158-
retv = sass_make_map(PyDict_Size(value));
159-
while (PyDict_Next(value, &pos, &d_key, &d_value)) {
158+
PyObject* dct = PyDict_New();
159+
PyDict_Update(dct, value);
160+
retv = sass_make_map(PyDict_Size(dct));
161+
while (PyDict_Next(dct, &pos, &d_key, &d_value)) {
160162
sass_map_set_key(retv, i, _to_sass_value(d_key));
161163
sass_map_set_value(retv, i, _to_sass_value(d_value));
162164
i += 1;
163165
}
166+
Py_DECREF(dct);
164167
} else if (PyObject_IsInstance(value, sass_number_t)) {
165168
PyObject* d_value = PyObject_GetAttrString(value, "value");
166169
PyObject* unit = PyObject_GetAttrString(value, "unit");
@@ -190,7 +193,6 @@ static union Sass_Value* _to_sass_value(PyObject* value) {
190193
Py_ssize_t i = 0;
191194
PyObject* items = PyObject_GetAttrString(value, "items");
192195
PyObject* separator = PyObject_GetAttrString(value, "separator");
193-
/* TODO: I don't really like this, maybe move types to C */
194196
Sass_Separator sep = SASS_COMMA;
195197
if (separator == sass_comma) {
196198
sep = SASS_COMMA;

sass.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -457,17 +457,29 @@ def __new__(cls, msg):
457457
return super(SassWarning, cls).__new__(cls, msg)
458458

459459

460-
class SassMap(dict):
460+
class SassMap(collections.Mapping):
461461
"""Because sass maps can have mapping types as keys, we need an immutable
462462
hashable mapping type.
463463
"""
464-
__slots__ = ('_hash',)
464+
__slots__ = ('_dict', '_hash',)
465465

466-
def __new__(cls, *args, **kwargs):
467-
value = super(SassMap, cls).__new__(cls, *args, **kwargs)
466+
def __init__(self, *args, **kwargs):
467+
self._dict = dict(*args, **kwargs)
468468
# An assertion that all things are hashable
469-
value._hash = hash(frozenset(value.items()))
470-
return value
469+
self._hash = hash(frozenset(self._dict.items()))
470+
471+
# Mapping interface
472+
473+
def __getitem__(self, key):
474+
return self._dict[key]
475+
476+
def __iter__(self):
477+
return iter(self._dict)
478+
479+
def __len__(self):
480+
return len(self._dict)
481+
482+
# Our interface
471483

472484
def __repr__(self):
473485
return '{0}({1})'.format(type(self).__name__, frozenset(self.items()))
@@ -476,6 +488,6 @@ def __hash__(self):
476488
return self._hash
477489

478490
def _immutable(self, *_):
479-
raise AssertionError('SassMaps are immutable')
491+
raise TypeError('SassMaps are immutable.')
480492

481493
__setitem__ = __delitem__ = _immutable

0 commit comments

Comments
 (0)