Fill OSError attributes

This commit is contained in:
dvermd
2022-10-02 18:20:45 +02:00
parent 3301220a6b
commit a18bad2ca3
5 changed files with 61 additions and 12 deletions

View File

@@ -5,6 +5,7 @@ import socket
import unittest
import errno
from errno import EEXIST
import sys
class SubOSError(OSError):
@@ -130,8 +131,8 @@ class AttributesTest(unittest.TestCase):
else:
self.assertNotIn('winerror', dir(OSError))
# TODO: RUSTPYTHON
@unittest.expectedFailure
@unittest.skip("TODO: RUSTPYTHON")
@unittest.skipIf(sys.platform == 'win32', 'winerror not filled yet')
def test_posix_error(self):
e = OSError(EEXIST, "File already exists", "foo.txt")
self.assertEqual(e.errno, EEXIST)

View File

@@ -391,8 +391,6 @@ class PyAutoFileTests(AutoFileTests, unittest.TestCase):
FileIO = _pyio.FileIO
modulename = '_pyio'
# TODO: RUSTPYTHON
@unittest.expectedFailure
def testOpendir(self):
super().testOpendir()

View File

@@ -1547,8 +1547,6 @@ class ProcessTestCase(BaseTestCase):
fds_after_exception = os.listdir(fd_directory)
self.assertEqual(fds_before_popen, fds_after_exception)
# TODO: RUSTPYTHON
@unittest.expectedFailure
@unittest.skipIf(mswindows, "behavior currently not supported on Windows")
def test_file_not_found_includes_filename(self):
with self.assertRaises(FileNotFoundError) as c:

View File

@@ -264,6 +264,40 @@ assert OSError.strerror
assert OSError(1, 2).errno
assert OSError(1, 2).strerror
# OSError Unexpected number of arguments
w = OSError()
assert w.errno == None
assert not sys.platform.startswith("win") or w.winerror == None
assert w.strerror == None
assert w.filename == None
assert w.filename2 == None
assert str(w) == ""
w = OSError(0)
assert w.errno == None
assert not sys.platform.startswith("win") or w.winerror == None
assert w.strerror == None
assert w.filename == None
assert w.filename2 == None
assert str(w) == "0"
w = OSError('foo')
assert w.errno == None
assert not sys.platform.startswith("win") or w.winerror == None
assert w.strerror == None
assert w.filename == None
assert w.filename2 == None
assert str(w) == "foo"
w = OSError('a', 'b', 'c', 'd', 'e', 'f')
assert w.errno == None
assert not sys.platform.startswith("win") or w.winerror == None
assert w.strerror == None
assert w.filename == None
assert w.filename2 == None
assert str(w) == "('a', 'b', 'c', 'd', 'e', 'f')"
# Custom `__new__` and `__init__`:
assert ImportError.__init__.__qualname__ == 'ImportError.__init__'
assert ImportError(name='a').name == 'a'

View File

@@ -752,13 +752,22 @@ impl ExceptionZoo {
let errno_getter =
ctx.new_readonly_getset("errno", excs.os_error, |exc: PyBaseExceptionRef| {
let args = exc.args();
args.get(0).filter(|_| args.len() > 1).cloned()
args.get(0)
.filter(|_| args.len() > 1 && args.len() <= 5)
.cloned()
});
let strerror_getter =
ctx.new_readonly_getset("strerror", excs.os_error, |exc: PyBaseExceptionRef| {
let args = exc.args();
args.get(1)
.filter(|_| args.len() >= 2 && args.len() <= 5)
.cloned()
});
extend_exception!(PyOSError, ctx, excs.os_error, {
// POSIX exception code
"errno" => errno_getter.clone(),
// exception strerror
"strerror" => ctx.new_readonly_getset("strerror", excs.os_error, make_arg_getter(1)),
"strerror" => strerror_getter.clone(),
// exception filename
"filename" => ctx.none(),
// second exception filename
@@ -1260,7 +1269,7 @@ pub(super) mod types {
os_error,
"Base class for I/O related errors.",
os_error_new,
base_exception_init,
os_error_init,
}
#[cfg(not(target_arch = "wasm32"))]
fn os_error_optional_new(
@@ -1268,7 +1277,7 @@ pub(super) mod types {
vm: &VirtualMachine,
) -> Option<PyBaseExceptionRef> {
let len = args.len();
if len >= 2 {
if (2..=5).contains(&len) {
let errno = &args[0];
errno
.payload_if_subclass::<PyInt>(vm)
@@ -1297,9 +1306,18 @@ pub(super) mod types {
fn os_error_new(cls: PyTypeRef, args: FuncArgs, vm: &VirtualMachine) -> PyResult {
PyBaseException::slot_new(cls, args, vm)
}
fn os_error_init(zelf: PyObjectRef, args: FuncArgs, vm: &VirtualMachine) -> PyResult<()> {
let len = args.args.len();
let mut new_args = args;
if (3..=5).contains(&len) {
zelf.set_attr("filename", new_args.args[2].clone(), vm)?;
if len == 5 {
zelf.set_attr("filename2", new_args.args[4].clone(), vm)?;
}
fn base_exception_init(zelf: PyObjectRef, args: FuncArgs, vm: &VirtualMachine) -> PyResult<()> {
PyBaseException::init(zelf, args, vm)
new_args.args.truncate(2);
}
PyBaseException::init(zelf, new_args, vm)
}
define_exception! {