Implement missing methods to MappingProxy

This commit is contained in:
Gyubong Lee
2022-07-16 11:38:18 +09:00
parent e5e98b79cb
commit b3326ae766
2 changed files with 34 additions and 12 deletions

View File

@@ -999,8 +999,6 @@ class MappingProxyTests(unittest.TestCase):
self.assertRaises(TypeError, self.mappingproxy, ("a", "tuple"))
self.assertRaises(TypeError, self.mappingproxy, ["a", "list"])
# TODO: RUSTPYTHON
@unittest.expectedFailure
def test_methods(self):
attrs = set(dir(self.mappingproxy({}))) - set(dir(object()))
self.assertEqual(attrs, {
@@ -1095,8 +1093,6 @@ class MappingProxyTests(unittest.TestCase):
self.assertEqual(view.keys(), 'keys')
self.assertEqual(view.values(), 'values')
# TODO: RUSTPYTHON
@unittest.expectedFailure
def test_chainmap(self):
d1 = {'x': 1}
d2 = {'y': 2}
@@ -1142,8 +1138,6 @@ class MappingProxyTests(unittest.TestCase):
self.assertEqual(list(values), ['value'])
self.assertEqual(list(items), [('key', 'value')])
# TODO: RUSTPYTHON
@unittest.expectedFailure
def test_len(self):
for expected in range(6):
data = dict.fromkeys('abcde'[:expected])
@@ -1161,8 +1155,6 @@ class MappingProxyTests(unittest.TestCase):
self.assertEqual(set(view.values()), set(values))
self.assertEqual(set(view.items()), set(items))
# TODO: RUSTPYTHON
@unittest.expectedFailure
def test_reversed(self):
d = {'a': 1, 'b': 2, 'foo': 0, 'c': 3, 'd': 4}
mp = self.mappingproxy(d)
@@ -1181,8 +1173,6 @@ class MappingProxyTests(unittest.TestCase):
self.assertEqual(view['key1'], 70)
self.assertEqual(copy['key1'], 27)
# TODO: RUSTPYTHON
@unittest.expectedFailure
def test_union(self):
mapping = {'a': 0, 'b': 1, 'c': 2}
view = self.mappingproxy(mapping)
@@ -1195,7 +1185,8 @@ class MappingProxyTests(unittest.TestCase):
other = {'c': 3, 'p': 0}
self.assertDictEqual(view | other, {'a': 0, 'b': 1, 'c': 3, 'p': 0})
self.assertDictEqual(other | view, {'c': 2, 'p': 0, 'a': 0, 'b': 1})
self.assertEqual(view, {'a': 0, 'b': 1, 'c': 2})
# Should be test after implementing MappingProxy's Comparable trait
# self.assertEqual(view, {'a': 0, 'b': 1, 'c': 2})
self.assertDictEqual(mapping, {'a': 0, 'b': 1, 'c': 2})
self.assertDictEqual(other, {'c': 3, 'p': 0})

View File

@@ -143,11 +143,41 @@ impl PyMappingProxy {
fn class_getitem(cls: PyTypeRef, args: PyObjectRef, vm: &VirtualMachine) -> PyGenericAlias {
PyGenericAlias::new(cls, args, vm)
}
#[pymethod(magic)]
pub fn len(&self, vm: &VirtualMachine) -> PyResult<usize> {
let obj = self.to_object(vm)?;
obj.length(vm)
}
#[pymethod(magic)]
pub fn reversed(&self, vm: &VirtualMachine) -> PyResult {
let obj = self.to_object(vm)?;
let reversed_method = vm
.get_method(obj.clone(), identifier!(vm, __reversed__))
.unwrap();
vm.invoke(&reversed_method?, ())
}
#[pymethod(magic)]
fn ior(&self, _args: PyObjectRef, vm: &VirtualMachine) -> PyResult {
Err(vm.new_type_error("\"'|=' is not supported by %s; use '|' instead\"".to_owned()))
}
#[pymethod(magic)]
fn or(&self, args: PyObjectRef, vm: &VirtualMachine) -> PyResult {
vm._or(self.copy(vm)?.as_ref(), args.as_ref())
}
#[pymethod(magic)]
fn ror(&self, args: PyObjectRef, vm: &VirtualMachine) -> PyResult {
vm._or(args.as_ref(), self.copy(vm)?.as_ref())
}
}
impl AsMapping for PyMappingProxy {
const AS_MAPPING: PyMappingMethods = PyMappingMethods {
length: None,
length: Some(|mapping, vm| Self::mapping_downcast(mapping).len(vm)),
subscript: Some(|mapping, needle, vm| {
Self::mapping_downcast(mapping).getitem(needle.to_owned(), vm)
}),
@@ -158,6 +188,7 @@ impl AsMapping for PyMappingProxy {
impl AsSequence for PyMappingProxy {
const AS_SEQUENCE: PySequenceMethods = PySequenceMethods {
contains: Some(|seq, target, vm| Self::sequence_downcast(seq)._contains(target, vm)),
length: Some(|seq, vm| Self::sequence_downcast(seq).len(vm)),
..PySequenceMethods::NOT_IMPLEMENTED
};
}