53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
from os.path import expanduser, expandvars, isabs, sep
|
|
from posixpath import sep as posix_sep
|
|
import fnmatch
|
|
import sys
|
|
|
|
import six
|
|
|
|
from .pathlib import Path, PurePath
|
|
|
|
|
|
def resolve_from_str(input, root):
|
|
assert not isinstance(input, Path), "would break on py2"
|
|
root = Path(root)
|
|
input = expanduser(input)
|
|
input = expandvars(input)
|
|
if isabs(input):
|
|
return Path(input)
|
|
else:
|
|
return root.joinpath(input)
|
|
|
|
|
|
def fnmatch_ex(pattern, path):
|
|
"""FNMatcher port from py.path.common which works with PurePath() instances.
|
|
|
|
The difference between this algorithm and PurePath.match() is that the latter matches "**" glob expressions
|
|
for each part of the path, while this algorithm uses the whole path instead.
|
|
|
|
For example:
|
|
"tests/foo/bar/doc/test_foo.py" matches pattern "tests/**/doc/test*.py" with this algorithm, but not with
|
|
PurePath.match().
|
|
|
|
This algorithm was ported to keep backward-compatibility with existing settings which assume paths match according
|
|
this logic.
|
|
|
|
References:
|
|
* https://bugs.python.org/issue29249
|
|
* https://bugs.python.org/issue34731
|
|
"""
|
|
path = PurePath(path)
|
|
iswin32 = sys.platform.startswith("win")
|
|
|
|
if iswin32 and sep not in pattern and posix_sep in pattern:
|
|
# Running on Windows, the pattern has no Windows path separators,
|
|
# and the pattern has one or more Posix path separators. Replace
|
|
# the Posix path separators with the Windows path separator.
|
|
pattern = pattern.replace(posix_sep, sep)
|
|
|
|
if sep not in pattern:
|
|
name = path.name
|
|
else:
|
|
name = six.text_type(path)
|
|
return fnmatch.fnmatch(name, pattern)
|