mirror of
https://github.com/RustPython/RustPython.git
synced 2026-06-02 19:39:49 +09:00
Implement missing methods to MappingProxy
This commit is contained in:
13
Lib/test/test_types.py
vendored
13
Lib/test/test_types.py
vendored
@@ -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})
|
||||
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user