vendor py.path and py.error

This commit is contained in:
Anthony Sottile 2022-10-19 10:10:49 -04:00
parent baada535a3
commit 19dda7c9bd
6 changed files with 1592 additions and 2 deletions

View File

@ -65,7 +65,6 @@ repos:
args: [] args: []
additional_dependencies: additional_dependencies:
- iniconfig>=1.1.0 - iniconfig>=1.1.0
- py>=1.8.2
- attrs>=19.2.0 - attrs>=19.2.0
- packaging - packaging
- tomli - tomli

View File

@ -36,16 +36,17 @@ packages =
_pytest _pytest
_pytest._code _pytest._code
_pytest._io _pytest._io
_pytest._py
_pytest.assertion _pytest.assertion
_pytest.config _pytest.config
_pytest.mark _pytest.mark
pytest pytest
py_modules = py
install_requires = install_requires =
attrs>=19.2.0 attrs>=19.2.0
iniconfig iniconfig
packaging packaging
pluggy>=0.12,<2.0 pluggy>=0.12,<2.0
py>=1.8.2
colorama;sys_platform=="win32" colorama;sys_platform=="win32"
exceptiongroup>=1.0.0rc8;python_version<"3.11" exceptiongroup>=1.0.0rc8;python_version<"3.11"
importlib-metadata>=0.12;python_version<"3.8" importlib-metadata>=0.12;python_version<"3.8"

View File

91
src/_pytest/_py/error.py Normal file
View File

@ -0,0 +1,91 @@
"""
create errno-specific classes for IO or os calls.
"""
from types import ModuleType
import sys, os, errno
class Error(EnvironmentError):
def __repr__(self):
return "%s.%s %r: %s " %(self.__class__.__module__,
self.__class__.__name__,
self.__class__.__doc__,
" ".join(map(str, self.args)),
#repr(self.args)
)
def __str__(self):
s = "[%s]: %s" %(self.__class__.__doc__,
" ".join(map(str, self.args)),
)
return s
_winerrnomap = {
2: errno.ENOENT,
3: errno.ENOENT,
17: errno.EEXIST,
18: errno.EXDEV,
13: errno.EBUSY, # empty cd drive, but ENOMEDIUM seems unavailiable
22: errno.ENOTDIR,
20: errno.ENOTDIR,
267: errno.ENOTDIR,
5: errno.EACCES, # anything better?
}
class ErrorMaker(ModuleType):
""" lazily provides Exception classes for each possible POSIX errno
(as defined per the 'errno' module). All such instances
subclass EnvironmentError.
"""
Error = Error
_errno2class = {}
def __getattr__(self, name):
if name[0] == "_":
raise AttributeError(name)
eno = getattr(errno, name)
cls = self._geterrnoclass(eno)
setattr(self, name, cls)
return cls
def _geterrnoclass(self, eno):
try:
return self._errno2class[eno]
except KeyError:
clsname = errno.errorcode.get(eno, "UnknownErrno%d" %(eno,))
errorcls = type(Error)(clsname, (Error,),
{'__module__':'py.error',
'__doc__': os.strerror(eno)})
self._errno2class[eno] = errorcls
return errorcls
def checked_call(self, func, *args, **kwargs):
""" call a function and raise an errno-exception if applicable. """
__tracebackhide__ = True
try:
return func(*args, **kwargs)
except self.Error:
raise
except (OSError, EnvironmentError):
cls, value, tb = sys.exc_info()
if not hasattr(value, 'errno'):
raise
__tracebackhide__ = False
errno = value.errno
try:
if not isinstance(value, WindowsError):
raise NameError
except NameError:
# we are not on Windows, or we got a proper OSError
cls = self._geterrnoclass(errno)
else:
try:
cls = self._geterrnoclass(_winerrnomap[errno])
except KeyError:
raise value
raise cls("%s%r" % (func.__name__, args))
__tracebackhide__ = True
error = ErrorMaker('_pytest._py.error')
sys.modules[error.__name__] = error

1489
src/_pytest/_py/path.py Normal file

File diff suppressed because it is too large Load Diff

10
src/py.py Normal file
View File

@ -0,0 +1,10 @@
# shim for pylib going away
# if pylib is installed this file will get skipped
# (`py/__init__.py` has higher precedence)
import sys
import _pytest._py.error as error
import _pytest._py.path as path
sys.modules['py.error'] = error
sys.modules['py.path'] = path