Hello community,
here is the log from the commit of package python-pathvalidate for
openSUSE:Factory checked in at 2020-03-29 14:27:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pathvalidate (Old)
and /work/SRC/openSUSE:Factory/.python-pathvalidate.new.3160 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pathvalidate"
Sun Mar 29 14:27:03 2020 rev:4 rq:789298 version:2.2.2
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pathvalidate/python-pathvalidate.changes
2020-03-23 12:51:12.095980570 +0100
+++
/work/SRC/openSUSE:Factory/.python-pathvalidate.new.3160/python-pathvalidate.changes
2020-03-29 14:27:09.242142253 +0200
@@ -1,0 +2,11 @@
+Sat Mar 28 12:35:30 UTC 2020 - Martin Hauke <[email protected]>
+
+- Update to version 2.2.2
+ * Fix __str__ method
+ * Fix to avoid raise an exception when an absolute path
+ includes "."/".."
+ * Modify an error message
+ * Modify raising exception from NullNameError to ValidationError
+ of validate_pathtype
+
+-------------------------------------------------------------------
Old:
----
pathvalidate-2.2.1.tar.gz
New:
----
pathvalidate-2.2.2.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-pathvalidate.spec ++++++
--- /var/tmp/diff_new_pack.2jD6Uc/_old 2020-03-29 14:27:10.370142831 +0200
+++ /var/tmp/diff_new_pack.2jD6Uc/_new 2020-03-29 14:27:10.370142831 +0200
@@ -19,7 +19,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
%define skip_python2 1
Name: python-pathvalidate
-Version: 2.2.1
+Version: 2.2.2
Release: 0
Summary: Python library to sanitize/validate a string such as filenames
License: MIT
++++++ pathvalidate-2.2.1.tar.gz -> pathvalidate-2.2.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pathvalidate-2.2.1/PKG-INFO
new/pathvalidate-2.2.2/PKG-INFO
--- old/pathvalidate-2.2.1/PKG-INFO 2020-03-20 12:12:26.292878600 +0100
+++ new/pathvalidate-2.2.2/PKG-INFO 2020-03-28 13:31:57.910138000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: pathvalidate
-Version: 2.2.1
+Version: 2.2.2
Summary: pathvalidate is a Python library to sanitize/validate a string such
as filenames/file-paths/etc.
Home-page: https://github.com/thombashi/pathvalidate
Author: Tsuyoshi Hombashi
@@ -54,7 +54,9 @@
- Sanitize/Validate a string as a:
- file name
- file path
- - filename/filepath validator/sanitizer for ``argparse``/``click``
+ - file name/path argument validator/sanitizer for ``argparse`` and
``click``
+ - Multi platform support:
+ - sanitize/validate file names/paths for a specific platform
(``Linux``/``Windows``/``macOS``/``Posix``) or ``universal`` (platform
independent)
- Multibyte character support
Examples
@@ -79,6 +81,9 @@
_a*b:c<d>e%f/(g)h+i_0.txt -> _abcde%f(g)h+i_0.txt
+ The default target ``platform`` is ``universal``.
+ i.e. the sanitized file name is valid for any platform.
+
Sanitize a filepath
---------------------
:Sample Code:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pathvalidate-2.2.1/README.rst
new/pathvalidate-2.2.2/README.rst
--- old/pathvalidate-2.2.1/README.rst 2020-03-20 12:04:58.000000000 +0100
+++ new/pathvalidate-2.2.2/README.rst 2020-03-28 13:14:15.000000000 +0100
@@ -43,7 +43,9 @@
- Sanitize/Validate a string as a:
- file name
- file path
-- filename/filepath validator/sanitizer for ``argparse``/``click``
+- file name/path argument validator/sanitizer for ``argparse`` and ``click``
+- Multi platform support:
+ - sanitize/validate file names/paths for a specific platform
(``Linux``/``Windows``/``macOS``/``Posix``) or ``universal`` (platform
independent)
- Multibyte character support
Examples
@@ -68,6 +70,9 @@
_a*b:c<d>e%f/(g)h+i_0.txt -> _abcde%f(g)h+i_0.txt
+The default target ``platform`` is ``universal``.
+i.e. the sanitized file name is valid for any platform.
+
Sanitize a filepath
---------------------
:Sample Code:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pathvalidate-2.2.1/pathvalidate/__version__.py
new/pathvalidate-2.2.2/pathvalidate/__version__.py
--- old/pathvalidate-2.2.1/pathvalidate/__version__.py 2020-03-20
12:06:04.000000000 +0100
+++ new/pathvalidate-2.2.2/pathvalidate/__version__.py 2020-03-28
13:17:03.000000000 +0100
@@ -1,6 +1,6 @@
__author__ = "Tsuyoshi Hombashi"
__copyright__ = "Copyright 2016, {}".format(__author__)
__license__ = "MIT License"
-__version__ = "2.2.1"
+__version__ = "2.2.2"
__maintainer__ = __author__
__email__ = "[email protected]"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pathvalidate-2.2.1/pathvalidate/_common.py
new/pathvalidate-2.2.2/pathvalidate/_common.py
--- old/pathvalidate-2.2.1/pathvalidate/_common.py 2020-03-20
12:10:34.000000000 +0100
+++ new/pathvalidate-2.2.2/pathvalidate/_common.py 2020-03-28
08:20:03.000000000 +0100
@@ -29,7 +29,7 @@
def validate_pathtype(text: PathType, error_msg: Optional[str] = None) -> None:
- from .error import NullNameError
+ from .error import ValidationError, ErrorReason
if _is_not_null_string(text) or is_pathlike_obj(text):
return
@@ -38,7 +38,9 @@
if not error_msg:
error_msg = "the value must be a not empty"
- raise NullNameError(error_msg)
+ raise ValidationError(
+ description=error_msg, reason=ErrorReason.NULL_NAME,
+ )
raise TypeError("text must be a string: actual={}".format(type(text)))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pathvalidate-2.2.1/pathvalidate/_filename.py
new/pathvalidate-2.2.2/pathvalidate/_filename.py
--- old/pathvalidate-2.2.1/pathvalidate/_filename.py 2020-02-12
06:42:00.000000000 +0100
+++ new/pathvalidate-2.2.2/pathvalidate/_filename.py 2020-03-28
07:34:36.000000000 +0100
@@ -19,13 +19,7 @@
preprocess,
validate_pathtype,
)
-from .error import (
- ErrorReason,
- InvalidCharError,
- InvalidLengthError,
- ReservedNameError,
- ValidationError,
-)
+from .error import ErrorReason, InvalidCharError, InvalidLengthError,
ValidationError
_DEFAULT_MAX_FILENAME_LEN = 255
@@ -74,14 +68,14 @@
try:
self.__validator.validate(sanitized_filename)
- except ReservedNameError as e:
- if e.reusable_name is False:
+ except ValidationError as e:
+ if e.reason == ErrorReason.RESERVED_NAME and e.reusable_name is
False:
sanitized_filename = re.sub(
re.escape(e.reserved_name), "{}_".format(e.reserved_name),
sanitized_filename
)
- except InvalidCharError:
- if self.platform in [Platform.UNIVERSAL, Platform.WINDOWS]:
- sanitized_filename = sanitized_filename.rstrip(" .")
+ elif e.reason == ErrorReason.INVALID_CHARACTER:
+ if self.platform in [Platform.UNIVERSAL, Platform.WINDOWS]:
+ sanitized_filename = sanitized_filename.rstrip(" .")
if is_pathlike_obj(value):
return Path(sanitized_filename)
@@ -229,14 +223,14 @@
If |True|, check reserved names of the ``platform``.
Raises:
- InvalidLengthError:
+ ValidationError (ErrorReason.INVALID_LENGTH):
If the ``filename`` is longer than ``max_len`` characters.
- InvalidCharError:
+ ValidationError (ErrorReason.INVALID_CHARACTER):
If the ``filename`` includes invalid character(s) for a filename:
|invalid_filename_chars|.
The following characters are also invalid for Windows platform:
|invalid_win_filename_chars|.
- ReservedNameError:
+ ValidationError (ErrorReason.RESERVED_NAME):
If the ``filename`` equals reserved name by OS.
Windows reserved name is as follows:
``"CON"``, ``"PRN"``, ``"AUX"``, ``"NUL"``, ``"COM[1-9]"``,
``"LPT[1-9]"``.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pathvalidate-2.2.1/pathvalidate/_filepath.py
new/pathvalidate-2.2.2/pathvalidate/_filepath.py
--- old/pathvalidate-2.2.1/pathvalidate/_filepath.py 2020-02-12
09:12:46.000000000 +0100
+++ new/pathvalidate-2.2.2/pathvalidate/_filepath.py 2020-03-28
09:11:53.000000000 +0100
@@ -176,7 +176,7 @@
self._validate_reserved_keywords(unicode_file_path)
unicode_file_path = unicode_file_path.replace("\\", "/")
for entry in unicode_file_path.split("/"):
- if not entry:
+ if not entry or entry in (".", ".."):
continue
self.__fname_validator._validate_reserved_keywords(entry)
@@ -202,14 +202,27 @@
reason=ErrorReason.MALFORMED_ABS_PATH,
)
+ if any([self._is_windows() and is_nt_abs, self._is_linux() and
is_posix_abs]):
+ return
+
if self._is_universal() and any([is_posix_abs, is_nt_abs]):
- raise err_object
+ ValidationError(
+ description=(
+ "{}. expected a platform independent file path".format(
+ "POSIX absolute file path found"
+ if is_posix_abs
+ else "NT absolute file path found"
+ )
+ ),
+ platform=self.platform,
+ reason=ErrorReason.MALFORMED_ABS_PATH,
+ )
- if any([self._is_windows(), self._is_universal()]) and
posixpath.isabs(value):
+ if any([self._is_windows(), self._is_universal()]) and is_posix_abs:
raise err_object
drive, _tail = ntpath.splitdrive(value)
- if not self._is_windows() and drive and ntpath.isabs(value):
+ if not self._is_windows() and drive and is_nt_abs:
raise err_object
def __validate_unix_file_path(self, unicode_file_path: str) -> None:
@@ -275,12 +288,12 @@
If |True|, check reserved names of the ``platform``.
Raises:
- InvalidCharError:
+ ValidationError (ErrorReason.INVALID_CHARACTER):
If the ``file_path`` includes invalid char(s):
|invalid_file_path_chars|.
The following characters are also invalid for Windows platform:
|invalid_win_file_path_chars|
- InvalidLengthError:
+ ValidationError (ErrorReason.INVALID_LENGTH):
If the ``file_path`` is longer than ``max_len`` characters.
ValidationError:
If ``file_path`` include invalid values.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pathvalidate-2.2.1/pathvalidate/_ltsv.py
new/pathvalidate-2.2.2/pathvalidate/_ltsv.py
--- old/pathvalidate-2.2.1/pathvalidate/_ltsv.py 2020-02-01
05:55:55.000000000 +0100
+++ new/pathvalidate-2.2.2/pathvalidate/_ltsv.py 2020-03-28
07:18:25.000000000 +0100
@@ -17,7 +17,7 @@
`Labeled Tab-separated Values (LTSV) <http://ltsv.org/>`__ label or not.
:param label: Label to validate.
- :raises pathvalidate.InvalidCharError:
+ :raises pathvalidate.ValidationError:
If invalid character(s) found in the ``label`` for a LTSV format label.
"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pathvalidate-2.2.1/pathvalidate/_symbol.py
new/pathvalidate-2.2.2/pathvalidate/_symbol.py
--- old/pathvalidate-2.2.1/pathvalidate/_symbol.py 2020-01-11
06:04:34.000000000 +0100
+++ new/pathvalidate-2.2.2/pathvalidate/_symbol.py 2020-03-28
07:29:05.000000000 +0100
@@ -33,9 +33,13 @@
"""
Verifying whether symbol(s) included in the ``text`` or not.
- :param text: Input text.
- :raises pathvalidate.InvalidCharError:
- If symbol(s) included in the ``text``.
+ Args:
+ text:
+ Input text to validate.
+
+ Raises:
+ ValidationError (ErrorReason.INVALID_CHARACTER):
+ If symbol(s) included in the ``text``.
"""
match_list = __RE_SYMBOL.findall(preprocess(text))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pathvalidate-2.2.1/pathvalidate/error.py
new/pathvalidate-2.2.2/pathvalidate/error.py
--- old/pathvalidate-2.2.1/pathvalidate/error.py 2020-02-05
22:45:13.000000000 +0100
+++ new/pathvalidate-2.2.2/pathvalidate/error.py 2020-03-28
13:09:19.000000000 +0100
@@ -10,17 +10,28 @@
@enum.unique
class ErrorReason(enum.Enum):
- FOUND_ABS_PATH = "FOUND_ABS_PATH"
- NULL_NAME = "NULL_NAME"
- INVALID_CHARACTER = "INVALID_CHARACTER"
- INVALID_LENGTH = "INVALID_LENGTH"
- MALFORMED_ABS_PATH = "MALFORMED_ABS_PATH"
- RESERVED_NAME = "RESERVED_NAME"
+ """
+ Validation error reasons.
+ """
+
+ FOUND_ABS_PATH = "FOUND_ABS_PATH" #: found an absolute path when
expecting a file name
+ NULL_NAME = "NULL_NAME" #: empty value
+ INVALID_CHARACTER = "INVALID_CHARACTER" #: found invalid characters(s) in
a value
+ INVALID_LENGTH = "INVALID_LENGTH" #: found invalid string length
+ MALFORMED_ABS_PATH = "MALFORMED_ABS_PATH" #: found invalid absolute path
format
+ RESERVED_NAME = "RESERVED_NAME" #: found a reserved name by a platform
class ValidationError(ValueError):
"""
- Base exception class that indicates invalid name errors.
+ Exception class of validation errors.
+
+ .. py:attribute:: reason
+
+ The cause of the error.
+
+ Returns:
+ :py:class:`~pathvalidate.error.ErrorReason`:
"""
@property
@@ -36,6 +47,10 @@
return self.__description
@property
+ def reserved_name(self) -> str:
+ return self.__reserved_name
+
+ @property
def reusable_name(self) -> bool:
return self.__reusable_name
@@ -43,6 +58,7 @@
self.__platform = kwargs.pop("platform", None)
self.__reason = kwargs.pop("reason", None)
self.__description = kwargs.pop("description", None)
+ self.__reserved_name = kwargs.pop("reserved_name", None)
self.__reusable_name = kwargs.pop("reusable_name", None)
try:
@@ -62,7 +78,7 @@
item_list.append("target-platform={}".format(self.platform.value))
if self.description:
item_list.append("description={}".format(self.description))
- if self.reusable_name:
+ if self.__reusable_name is not None:
item_list.append("reusable_name={}".format(self.reusable_name))
return ", ".join(item_list).strip()
@@ -109,13 +125,7 @@
Exception raised when a string matched a reserved name.
"""
- @property
- def reserved_name(self) -> str:
- return self.__reserved_name
-
def __init__(self, *args, **kwargs) -> None:
- self.__reserved_name = kwargs.pop("reserved_name", None)
-
kwargs["reason"] = ErrorReason.RESERVED_NAME
super().__init__(args, **kwargs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pathvalidate-2.2.1/pathvalidate.egg-info/PKG-INFO
new/pathvalidate-2.2.2/pathvalidate.egg-info/PKG-INFO
--- old/pathvalidate-2.2.1/pathvalidate.egg-info/PKG-INFO 2020-03-20
12:12:26.000000000 +0100
+++ new/pathvalidate-2.2.2/pathvalidate.egg-info/PKG-INFO 2020-03-28
13:31:57.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: pathvalidate
-Version: 2.2.1
+Version: 2.2.2
Summary: pathvalidate is a Python library to sanitize/validate a string such
as filenames/file-paths/etc.
Home-page: https://github.com/thombashi/pathvalidate
Author: Tsuyoshi Hombashi
@@ -54,7 +54,9 @@
- Sanitize/Validate a string as a:
- file name
- file path
- - filename/filepath validator/sanitizer for ``argparse``/``click``
+ - file name/path argument validator/sanitizer for ``argparse`` and
``click``
+ - Multi platform support:
+ - sanitize/validate file names/paths for a specific platform
(``Linux``/``Windows``/``macOS``/``Posix``) or ``universal`` (platform
independent)
- Multibyte character support
Examples
@@ -79,6 +81,9 @@
_a*b:c<d>e%f/(g)h+i_0.txt -> _abcde%f(g)h+i_0.txt
+ The default target ``platform`` is ``universal``.
+ i.e. the sanitized file name is valid for any platform.
+
Sanitize a filepath
---------------------
:Sample Code:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pathvalidate-2.2.1/test/test_filename.py
new/pathvalidate-2.2.2/test/test_filename.py
--- old/pathvalidate-2.2.1/test/test_filename.py 2020-02-22
17:24:14.000000000 +0100
+++ new/pathvalidate-2.2.2/test/test_filename.py 2020-03-28
13:13:02.000000000 +0100
@@ -13,10 +13,7 @@
from pathvalidate import (
ErrorReason,
- InvalidCharError,
- InvalidLengthError,
Platform,
- ReservedNameError,
ValidationError,
is_valid_filename,
sanitize_filename,
@@ -151,7 +148,7 @@
[
["lower than one", -1, None],
["valid", 5, None],
- ["invalid_length", 200, InvalidLengthError],
+ ["invalid_length", 200, ErrorReason.INVALID_LENGTH],
],
)
def test_min_len(self, value, min_len, expected):
@@ -159,27 +156,36 @@
validate_filename(value, min_len=min_len)
assert is_valid_filename(value, min_len=min_len)
else:
- with pytest.raises(expected):
+ with pytest.raises(ValidationError) as e:
validate_filename(value, min_len=min_len)
+ assert e.value.reason == expected
@pytest.mark.parametrize(
["value", "platform", "max_len", "expected"],
[
["a" * 255, None, None, None],
- ["a" * 5000, None, 10000, InvalidLengthError],
- ["invalid_max_len", None, 0, ValueError],
+ ["a" * 5000, None, 10000, ErrorReason.INVALID_LENGTH],
["valid_length", "universal", 255, None],
["valid_length", Platform.UNIVERSAL, 255, None],
- ["invalid_length", None, 2, InvalidLengthError],
+ ["invalid_length", None, 2, ErrorReason.INVALID_LENGTH],
],
)
def test_max_len(self, value, platform, max_len, expected):
if expected is None:
validate_filename(value, platform=platform, max_len=max_len)
assert is_valid_filename(value, platform=platform, max_len=max_len)
- else:
- with pytest.raises(expected):
- validate_filename(value, platform=platform, max_len=max_len)
+ return
+
+ with pytest.raises(ValidationError) as e:
+ validate_filename(value, platform=platform, max_len=max_len)
+ assert e.value.reason == expected
+
+ @pytest.mark.parametrize(
+ ["value", "platform", "max_len", "expected"], [["invalid_max_len",
None, 0, ValueError],],
+ )
+ def test_abnormal_max_len(self, value, platform, max_len, expected):
+ with pytest.raises(expected):
+ validate_filename(value, platform=platform, max_len=max_len)
@pytest.mark.parametrize(
["value", "min_len", "max_len", "expected"],
@@ -224,8 +230,9 @@
),
)
def test_exception_invalid_char(self, value, platform):
- with pytest.raises(InvalidCharError):
+ with pytest.raises(ValidationError) as e:
validate_filename(value, platform)
+ assert e.value.reason == ErrorReason.INVALID_CHARACTER
assert not is_valid_filename(value, platform=platform)
@pytest.mark.parametrize(
@@ -241,34 +248,36 @@
],
)
def test_exception_win_invalid_char(self, value, platform):
- with pytest.raises(InvalidCharError):
+ with pytest.raises(ValidationError) as e:
validate_filename(value, platform=platform)
+ assert e.value.reason == ErrorReason.INVALID_CHARACTER
assert not is_valid_filename(value, platform=platform)
@pytest.mark.parametrize(
["value", "platform", "expected"],
[
- [reserved_keyword, platform, ReservedNameError]
+ [reserved_keyword, platform, ValidationError]
for reserved_keyword, platform in product(
WIN_RESERVED_FILE_NAMES, ["windows", "universal"]
)
]
+ [
- ["{}.txt".format(reserved_keyword), platform, ReservedNameError]
+ ["{}.txt".format(reserved_keyword), platform, ValidationError]
for reserved_keyword, platform in product(
WIN_RESERVED_FILE_NAMES, ["windows", "universal"]
)
if reserved_keyword not in [".", ".."]
]
+ [
- [reserved_keyword, platform, ReservedNameError]
+ [reserved_keyword, platform, ValidationError]
for reserved_keyword, platform in product([".", ".."], ["posix",
"linux", "macos"])
]
- + [[":", "posix", ReservedNameError], [":", "macos",
ReservedNameError],],
+ + [[":", "posix", ValidationError], [":", "macos", ValidationError],],
)
def test_exception_reserved_name(self, value, platform, expected):
with pytest.raises(expected) as e:
validate_filename(value, platform=platform)
+ assert e.value.reason == ErrorReason.RESERVED_NAME
assert e.value.reserved_name
assert e.value.reusable_name is False
@@ -292,15 +301,16 @@
@pytest.mark.parametrize(
["value", "platform", "expected"],
[
- [value, platform, InvalidCharError]
+ [value, platform, ErrorReason.INVALID_CHARACTER]
for value, platform in product(["asdf\rsdf"], ["windows",
"universal"])
],
)
def test_exception_escape_err_msg(self, value, platform, expected):
- with pytest.raises(expected) as e:
+ with pytest.raises(ValidationError) as e:
print(platform, repr(value))
validate_filename(value, platform=platform)
+ assert e.value.reason == ErrorReason.INVALID_CHARACTER
assert str(e.value) == (
r"invalid char found: invalids=('\r'), value='asdf\rsdf', "
"reason=INVALID_CHARACTER, target-platform=Windows"
@@ -311,7 +321,7 @@
[
[None, ValueError],
["", ValidationError],
- ["a" * 256, InvalidLengthError],
+ ["a" * 256, ValidationError],
[1, TypeError],
[True, TypeError],
[nan, TypeError],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pathvalidate-2.2.1/test/test_filepath.py
new/pathvalidate-2.2.2/test/test_filepath.py
--- old/pathvalidate-2.2.1/test/test_filepath.py 2020-02-12
07:32:04.000000000 +0100
+++ new/pathvalidate-2.2.2/test/test_filepath.py 2020-03-28
13:24:54.000000000 +0100
@@ -13,10 +13,7 @@
from pathvalidate import (
ErrorReason,
- InvalidCharError,
- InvalidLengthError,
Platform,
- ReservedNameError,
ValidationError,
is_valid_filepath,
sanitize_filepath,
@@ -76,11 +73,11 @@
class Test_validate_filepath:
VALID_CHARS = VALID_PATH_CHARS
- VALID_MULTIBYTE_PATH_LIST = [
+ VALID_MULTIBYTE_PATHS = [
"c:\\Users\\新しいフォルダー\\あいうえお.txt",
"D:\\新しいフォルダー\\ユーザ属性.txt",
]
- WIN_VALID_PATH_LIST = [
+ WIN_VALID_PATHS = [
"D:\\Users\\\\est\\AppData\\Local\\Temp\\pytest-of-test\\pytest-0\\\\hoge.csv",
"D:/Users/test/AppData/Local/Temp/pytest-of-test/pytest-0/test_exception__hoge_csv_heade1/hoge.csv",
# noqa
"C:\\Users\\est\\AppData/Local\\Temp/pytest-of-test\\pytest-0/\\hoge.csv",
@@ -112,7 +109,7 @@
chain.from_iterable(
[
[args for args in product([valid_path], ["windows"])]
- for valid_path in VALID_MULTIBYTE_PATH_LIST
+ for valid_path in VALID_MULTIBYTE_PATHS
]
),
)
@@ -120,7 +117,7 @@
validate_filepath(value, platform)
assert is_valid_filepath(value, platform=platform)
- @pytest.mark.parametrize(["value"], [[valid_path] for valid_path in
WIN_VALID_PATH_LIST])
+ @pytest.mark.parametrize(["value"], [[valid_path] for valid_path in
WIN_VALID_PATHS])
def test_normal_win(self, value):
platform = "windows"
validate_filepath(value, platform=platform)
@@ -131,35 +128,37 @@
[
["lower than one", -1, None],
["valid", 5, None],
- ["invalid_length", 200, InvalidLengthError],
+ ["invalid_length", 200, ErrorReason.INVALID_LENGTH],
],
)
def test_normal_min_len(self, value, min_len, expected):
if expected is None:
validate_filepath(value, min_len=min_len)
assert is_valid_filepath(value, min_len=min_len)
- else:
- with pytest.raises(expected):
- validate_filepath(value, min_len=min_len)
+ return
+
+ with pytest.raises(ValidationError) as e:
+ validate_filepath(value, min_len=min_len)
+ assert e.value.reason == expected
@pytest.mark.parametrize(
["value", "platform", "max_len", "expected"],
[
["a" * 4096, "linux", None, None],
- ["a" * 4097, "linux", None, InvalidLengthError],
+ ["a" * 4097, "linux", None, ErrorReason.INVALID_LENGTH],
["a" * 1024, "posix", None, None],
- ["a" * 1025, "posix", None, InvalidLengthError],
- ["a" * 4097, Platform.LINUX, None, InvalidLengthError],
- ["a" * 255, "linux", 100, InvalidLengthError],
- ["a" * 5000, "windows", 10000, ValidationError],
+ ["a" * 1025, "posix", None, ErrorReason.INVALID_LENGTH],
+ ["a" * 4097, Platform.LINUX, None, ErrorReason.INVALID_LENGTH],
+ ["a" * 255, "linux", 100, ErrorReason.INVALID_LENGTH],
+ ["a" * 5000, "windows", 10000, ErrorReason.INVALID_LENGTH],
["a" * 260, "windows", None, None],
- ["a" * 300, "windows", 1024, ValidationError],
- ["a" * 261, Platform.WINDOWS, None, InvalidLengthError],
- ["a" * 261, "windows", None, InvalidLengthError],
+ ["a" * 300, "windows", 1024, ErrorReason.INVALID_LENGTH],
+ ["a" * 261, Platform.WINDOWS, None, ErrorReason.INVALID_LENGTH],
+ ["a" * 261, "windows", None, ErrorReason.INVALID_LENGTH],
["a" * 260, "universal", None, None],
- ["a" * 261, "universal", None, InvalidLengthError],
- ["a" * 300, "universal", 1024, ValidationError],
- ["a" * 261, Platform.UNIVERSAL, None, InvalidLengthError],
+ ["a" * 261, "universal", None, ErrorReason.INVALID_LENGTH],
+ ["a" * 300, "universal", 1024, ErrorReason.INVALID_LENGTH],
+ ["a" * 261, Platform.UNIVERSAL, None, ErrorReason.INVALID_LENGTH],
],
)
def test_normal_max_len(self, value, platform, max_len, expected):
@@ -168,8 +167,9 @@
assert is_valid_filepath(value, platform=platform, max_len=max_len)
return
- with pytest.raises(expected):
+ with pytest.raises(ValidationError) as e:
validate_filepath(value, platform=platform, max_len=max_len)
+ assert e.value.reason == ErrorReason.INVALID_LENGTH
@pytest.mark.parametrize(
["value", "min_len", "max_len", "expected"],
@@ -186,16 +186,17 @@
if expected is None:
validate_filepath(value, min_len=min_len, max_len=max_len)
assert is_valid_filepath(value, min_len=min_len, max_len=max_len)
- else:
- with pytest.raises(expected):
- validate_filepath(value, min_len=min_len, max_len=max_len)
+ return
+
+ with pytest.raises(expected):
+ validate_filepath(value, min_len=min_len, max_len=max_len)
@pytest.mark.parametrize(
["test_platform", "value", "expected"],
[
["linux", "/a/b/c.txt", None],
["linux", "C:\\a\\b\\c.txt", ValidationError],
- ["windows", "/a/b/c.txt", ValidationError],
+ ["windows", "/a/b/c.txt", None],
["windows", "C:\\a\\b\\c.txt", None],
["universal", "/a/b/c.txt", ValidationError],
["universal", "C:\\a\\b\\c.txt", ValidationError],
@@ -205,21 +206,23 @@
if expected is None:
validate_filepath(value, platform=test_platform)
assert is_valid_filepath(value, platform=test_platform)
- else:
- with pytest.raises(expected):
- validate_filepath(value, platform=test_platform)
+ return
+
+ with pytest.raises(expected):
+ validate_filepath(value, platform=test_platform)
@pytest.mark.skipif(m_platform.system() != "Windows", reason="platform
dependent tests")
@pytest.mark.parametrize(
- ["value", "expected"], [["/a/b/c.txt", ValidationError],
["C:\\a\\b\\c.txt", None],],
+ ["value", "expected"], [["C:\\a\\b\\c.txt", None],],
)
def test_normal_auto_platform_win(self, value, expected):
if expected is None:
validate_filepath(value, platform="auto")
assert is_valid_filepath(value, platform="auto")
- else:
- with pytest.raises(expected):
- validate_filepath(value, platform="auto")
+ return
+
+ with pytest.raises(expected):
+ validate_filepath(value, platform="auto")
@pytest.mark.skipif(m_platform.system() != "Linux", reason="platform
dependent tests")
@pytest.mark.parametrize(
@@ -229,18 +232,23 @@
if expected is None:
validate_filepath(value, platform="auto")
assert is_valid_filepath(value, platform="auto")
- else:
- with pytest.raises(expected):
- validate_filepath(value, platform="auto")
+ return
+
+ with pytest.raises(expected):
+ validate_filepath(value, platform="auto")
@pytest.mark.parametrize(
["test_platform", "value", "expected"],
[
["linux", "a/b/c.txt", None],
["linux", "a/b?/c.txt", None],
+ ["linux", "../a/./../b/c.txt", None],
["windows", "a/b/c.txt", None],
["windows", "a/b?/c.txt", ValidationError],
+ ["windows", "../a/./../b/c.txt", None],
["universal", "a/b/c.txt", None],
+ ["universal", "./a/b/c.txt", None],
+ ["universal", "../a/./../b/c.txt", None],
["universal", "a/b?/c.txt", ValidationError],
],
)
@@ -288,8 +296,9 @@
[["{0}{1}{0}".format(randstr(64), invalid_c)] for invalid_c in
INVALID_PATH_CHARS],
)
def test_exception_invalid_char(self, value):
- with pytest.raises(InvalidCharError):
+ with pytest.raises(ValidationError) as e:
validate_filepath(value)
+ assert e.value.reason == ErrorReason.INVALID_CHARACTER
assert not is_valid_filepath(value)
@pytest.mark.parametrize(
@@ -305,8 +314,9 @@
],
)
def test_exception_invalid_win_char(self, value, platform):
- with pytest.raises(InvalidCharError):
+ with pytest.raises(ValidationError) as e:
validate_filepath(value, platform=platform)
+ assert e.value.reason == ErrorReason.INVALID_CHARACTER
assert not is_valid_filepath(value, platform=platform)
@pytest.mark.parametrize(
@@ -336,26 +346,26 @@
@pytest.mark.parametrize(
["value", "platform", "expected"],
[
- ["abc\\{}\\xyz".format(reserved_keyword), platform,
ReservedNameError]
+ ["abc\\{}\\xyz".format(reserved_keyword), platform,
ValidationError]
for reserved_keyword, platform in product(
WIN_RESERVED_FILE_NAMES, ["windows", "universal"]
)
if reserved_keyword not in [".", ".."]
]
+ [
- ["foo/abc/{}.txt".format(reserved_keyword), platform,
ReservedNameError]
+ ["foo/abc/{}.txt".format(reserved_keyword), platform,
ValidationError]
for reserved_keyword, platform in product(WIN_RESERVED_FILE_NAMES,
["universal"])
if reserved_keyword not in [".", ".."]
]
+ [
- ["{}".format(reserved_keyword), platform, ReservedNameError]
+ ["{}".format(reserved_keyword), platform, ValidationError]
for reserved_keyword, platform in product(
WIN_RESERVED_FILE_NAMES, ["windows", "universal"]
)
if reserved_keyword not in [".", ".."]
]
+ [
- ["{}\\{}".format(drive, filename), platform, ReservedNameError]
+ ["{}\\{}".format(drive, filename), platform, ValidationError]
for drive, platform, filename in product(
["C:", "D:"], ["windows"], NTFS_RESERVED_FILE_NAMES
)
@@ -365,6 +375,7 @@
with pytest.raises(expected) as e:
print(platform, value)
validate_filepath(value, platform=platform)
+ assert e.value.reason == ErrorReason.RESERVED_NAME
assert e.value.reusable_name is False
assert e.value.reserved_name
@@ -373,15 +384,16 @@
@pytest.mark.parametrize(
["value", "platform", "expected"],
[
- [value, platform, InvalidCharError]
+ [value, platform, ErrorReason.INVALID_CHARACTER]
for value, platform in product(["asdf\rsdf"], ["windows",
"universal"])
],
)
def test_exception_escape_err_msg(self, value, platform, expected):
- with pytest.raises(expected) as e:
+ with pytest.raises(ValidationError) as e:
print(platform, repr(value))
validate_filepath(value, platform=platform)
+ assert e.value.reason == expected
assert str(e.value) == (
r"invalid char found: invalids=('\r'), value='asdf\rsdf', "
"reason=INVALID_CHARACTER, target-platform=Windows"
@@ -411,6 +423,7 @@
["C:\\Users/est\\AppData/Local\\Temp/pytest-of-test\\pytest-0/hoge.csv"],
["C:\\Users"],
["C:\\"],
+ ["\\Users"],
],
)
def test_normal(self, value):
@@ -418,34 +431,39 @@
assert is_valid_filepath(value, platform="windows")
@pytest.mark.parametrize(
- ["value", "expected"],
- [["C:\\Users\\" + "a" * 1024, InvalidCharError], ["\\Users",
InvalidCharError]],
+ ["value", "platform", "expected"],
+ [
+ [r"C:\Users\a", "universal", ErrorReason.MALFORMED_ABS_PATH],
+ [r"C:\Users:a", "universal", ErrorReason.MALFORMED_ABS_PATH],
+ ["C:\\Users\\" + "a" * 1024, "windows",
ErrorReason.INVALID_LENGTH],
+ [r"C:\Users:a", "windows", ErrorReason.INVALID_CHARACTER],
+ ],
)
- def test_exception(self, value, expected):
+ def test_exception(self, value, platform, expected):
with pytest.raises(ValidationError) as e:
- validate_filepath(value)
- assert e.value.reason == ErrorReason.MALFORMED_ABS_PATH
- assert not is_valid_filepath(value)
+ validate_filepath(value, platform=platform)
+ assert e.value.reason == expected
+ assert not is_valid_filepath(value, platform=platform)
class Test_sanitize_filepath:
SANITIZE_CHARS = INVALID_WIN_PATH_CHARS + unprintable_ascii_chars
NOT_SANITIZE_CHARS = VALID_PATH_CHARS
- REPLACE_TEXT_LIST = ["", "_"]
+ REPLACE_TEXTS = ["", "_"]
@pytest.mark.parametrize(
["platform", "value", "replace_text", "expected"],
[
["universal", "AA" + c + "B", rep, "AA" + rep + "B"]
- for c, rep in product(SANITIZE_CHARS, REPLACE_TEXT_LIST)
+ for c, rep in product(SANITIZE_CHARS, REPLACE_TEXTS)
]
+ [
["universal", "A" + c + "B", rep, "A" + c + "B"]
- for c, rep in product(NOT_SANITIZE_CHARS, REPLACE_TEXT_LIST)
+ for c, rep in product(NOT_SANITIZE_CHARS, REPLACE_TEXTS)
]
+ [
["universal", "あ" + c + "い", rep, "あ" + c + "い"]
- for c, rep in product(NOT_SANITIZE_CHARS, REPLACE_TEXT_LIST)
+ for c, rep in product(NOT_SANITIZE_CHARS, REPLACE_TEXTS)
]
+ [
[pair.platform, "A" + pair.c + "B", pair.repl, "A" + pair.repl +
"B"]
@@ -454,7 +472,7 @@
{
"platform": ["posix", "linux", "macos"],
"c": INVALID_PATH_CHARS + unprintable_ascii_chars,
- "repl": REPLACE_TEXT_LIST,
+ "repl": REPLACE_TEXTS,
}
)
)
@@ -466,7 +484,7 @@
{
"platform": ["posix", "linux", "macos"],
"c": [":", "*", "?", '"', "<", ">", "|"],
- "repl": REPLACE_TEXT_LIST,
+ "repl": REPLACE_TEXTS,
}
)
)
@@ -550,15 +568,15 @@
["value", "replace_text", "expected"],
[
[Path("AA" + c + "B"), rep, Path("AA" + rep + "B")]
- for c, rep in product(SANITIZE_CHARS, REPLACE_TEXT_LIST)
+ for c, rep in product(SANITIZE_CHARS, REPLACE_TEXTS)
]
+ [
[Path("A" + c + "B"), rep, Path("A" + c + "B")]
- for c, rep in product(NOT_SANITIZE_CHARS, REPLACE_TEXT_LIST)
+ for c, rep in product(NOT_SANITIZE_CHARS, REPLACE_TEXTS)
]
+ [
[Path("あ" + c + "い"), rep, Path("あ" + c + "い")]
- for c, rep in product(NOT_SANITIZE_CHARS, REPLACE_TEXT_LIST)
+ for c, rep in product(NOT_SANITIZE_CHARS, REPLACE_TEXTS)
],
)
def test_normal_pathlike(self, value, replace_text, expected):
@@ -590,10 +608,30 @@
validate_filepath(sanitized_name, platform=test_platform)
assert is_valid_filepath(sanitized_name, platform=test_platform)
+ @pytest.mark.parametrize(
+ ["platform", "value", "expected"],
+ [
+ ["windows", "a/b", "a\\b"],
+ ["windows", "a\\b", "a\\b"],
+ ["windows", "a\\\\b", "a\\b"],
+ ["linux", "a/b", "a/b"],
+ ["linux", "a//b", "a/b"],
+ ["linux", "a\\b", "a/b"],
+ ["linux", "a\\\\b", "a/b"],
+ ["universal", "a/b", "a/b"],
+ ["universal", "a//b", "a/b"],
+ ["universal", "a\\b", "a/b"],
+ ["universal", "a\\\\b", "a/b"],
+ ],
+ )
+ def test_normal_path_separator(self, platform, value, expected):
+ sanitized = sanitize_filepath(value, platform=platform)
+ assert sanitized == expected
+ assert is_valid_filepath(sanitized, platform=platform)
+
@pytest.mark.skipif(m_platform.system() != "Windows", reason="platform
dependent tests")
@pytest.mark.parametrize(
- ["value", "expected"],
- [["/a/b/c.txt", ValidationError], ["C:\\a\\b|c.txt",
"C:\\a\\bc.txt"],],
+ ["value", "expected"], [["C:\\a\\b|c.txt", "C:\\a\\bc.txt"],],
)
def test_normal_auto_platform_win(self, value, expected):
if isinstance(expected, str):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pathvalidate-2.2.1/test/test_ltsv.py
new/pathvalidate-2.2.2/test/test_ltsv.py
--- old/pathvalidate-2.2.1/test/test_ltsv.py 2020-02-01 05:56:47.000000000
+0100
+++ new/pathvalidate-2.2.2/test/test_ltsv.py 2020-03-28 11:43:25.000000000
+0100
@@ -6,7 +6,8 @@
import pytest
-from pathvalidate import InvalidCharError, ValidationError,
sanitize_ltsv_label, validate_ltsv_label
+from pathvalidate import sanitize_ltsv_label, validate_ltsv_label
+from pathvalidate.error import ErrorReason, ValidationError
from ._common import INVALID_WIN_FILENAME_CHARS, alphanum_chars
@@ -58,8 +59,9 @@
+ [["あいうえお"], ["ラベル"]],
)
def test_exception_invalid_char(self, value):
- with pytest.raises(InvalidCharError):
+ with pytest.raises(ValidationError) as e:
validate_ltsv_label(value)
+ assert e.value.reason == ErrorReason.INVALID_CHARACTER
class Test_sanitize_ltsv_label:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pathvalidate-2.2.1/test/test_symbol.py
new/pathvalidate-2.2.2/test/test_symbol.py
--- old/pathvalidate-2.2.1/test/test_symbol.py 2020-01-11 10:35:48.000000000
+0100
+++ new/pathvalidate-2.2.2/test/test_symbol.py 2020-03-28 11:59:31.000000000
+0100
@@ -6,14 +6,9 @@
import pytest
-from pathvalidate import (
- InvalidCharError,
- ascii_symbols,
- replace_symbol,
- unprintable_ascii_chars,
- validate_symbol,
-)
+from pathvalidate import ascii_symbols, replace_symbol,
unprintable_ascii_chars, validate_symbol
from pathvalidate._symbol import replace_unprintable, validate_unprintable
+from pathvalidate.error import ErrorReason, ValidationError
from ._common import alphanum_chars
@@ -42,8 +37,9 @@
],
)
def test_exception_invalid_char(self, value):
- with pytest.raises(InvalidCharError):
+ with pytest.raises(ValidationError) as e:
validate_symbol(value)
+ assert e.value.reason == ErrorReason.INVALID_CHARACTER
class Test_replace_symbol:
@@ -114,8 +110,9 @@
],
)
def test_exception_invalid_char(self, value):
- with pytest.raises(InvalidCharError):
+ with pytest.raises(ValidationError) as e:
validate_unprintable(value)
+ assert e.value.reason == ErrorReason.INVALID_CHARACTER
class Test_replace_unprintable: