mirror of
https://github.com/python/cpython.git
synced 2025-09-25 01:43:11 +00:00
GH-70303: Emit FutureWarning when pathlib glob pattern ends with **
(GH-105413)
In a future Python release, patterns with this ending will match both files and directories. Users may add a trailing slash to remove the warning.
This commit is contained in:
parent
2c25bd82f4
commit
ec0a0d2bd9
4 changed files with 30 additions and 3 deletions
|
@ -976,6 +976,11 @@ call fails (for example because the path doesn't exist).
|
||||||
.. versionchanged:: 3.13
|
.. versionchanged:: 3.13
|
||||||
The *follow_symlinks* parameter was added.
|
The *follow_symlinks* parameter was added.
|
||||||
|
|
||||||
|
.. versionchanged:: 3.13
|
||||||
|
Emits :exc:`FutureWarning` if the pattern ends with "``**``". In a
|
||||||
|
future Python release, patterns with this ending will match both files
|
||||||
|
and directories. Add a trailing slash to match only directories.
|
||||||
|
|
||||||
.. method:: Path.group()
|
.. method:: Path.group()
|
||||||
|
|
||||||
Return the name of the group owning the file. :exc:`KeyError` is raised
|
Return the name of the group owning the file. :exc:`KeyError` is raised
|
||||||
|
|
|
@ -1069,6 +1069,11 @@ class Path(PurePath):
|
||||||
pattern_parts.append('')
|
pattern_parts.append('')
|
||||||
if pattern_parts[-1] == '**':
|
if pattern_parts[-1] == '**':
|
||||||
# GH-70303: '**' only matches directories. Add trailing slash.
|
# GH-70303: '**' only matches directories. Add trailing slash.
|
||||||
|
warnings.warn(
|
||||||
|
"Pattern ending '**' will match files and directories in a "
|
||||||
|
"future Python release. Add a trailing slash to match only "
|
||||||
|
"directories and remove this warning.",
|
||||||
|
FutureWarning, 3)
|
||||||
pattern_parts.append('')
|
pattern_parts.append('')
|
||||||
|
|
||||||
if case_sensitive is None:
|
if case_sensitive is None:
|
||||||
|
|
|
@ -1903,11 +1903,11 @@ class PathTest(unittest.TestCase):
|
||||||
"dirC/dirD", "dirC/dirD/fileD"])
|
"dirC/dirD", "dirC/dirD/fileD"])
|
||||||
_check(p.rglob("file*"), ["dirC/fileC", "dirC/dirD/fileD"])
|
_check(p.rglob("file*"), ["dirC/fileC", "dirC/dirD/fileD"])
|
||||||
_check(p.rglob("**/file*"), ["dirC/fileC", "dirC/dirD/fileD"])
|
_check(p.rglob("**/file*"), ["dirC/fileC", "dirC/dirD/fileD"])
|
||||||
_check(p.rglob("dir*/**"), ["dirC/dirD"])
|
_check(p.rglob("dir*/**/"), ["dirC/dirD"])
|
||||||
_check(p.rglob("*/*"), ["dirC/dirD/fileD"])
|
_check(p.rglob("*/*"), ["dirC/dirD/fileD"])
|
||||||
_check(p.rglob("*/"), ["dirC/dirD"])
|
_check(p.rglob("*/"), ["dirC/dirD"])
|
||||||
_check(p.rglob(""), ["dirC", "dirC/dirD"])
|
_check(p.rglob(""), ["dirC", "dirC/dirD"])
|
||||||
_check(p.rglob("**"), ["dirC", "dirC/dirD"])
|
_check(p.rglob("**/"), ["dirC", "dirC/dirD"])
|
||||||
# gh-91616, a re module regression
|
# gh-91616, a re module regression
|
||||||
_check(p.rglob("*.txt"), ["dirC/novel.txt"])
|
_check(p.rglob("*.txt"), ["dirC/novel.txt"])
|
||||||
_check(p.rglob("*.*"), ["dirC/novel.txt"])
|
_check(p.rglob("*.*"), ["dirC/novel.txt"])
|
||||||
|
@ -2057,7 +2057,20 @@ class PathTest(unittest.TestCase):
|
||||||
path.mkdir(parents=True)
|
path.mkdir(parents=True)
|
||||||
|
|
||||||
with set_recursion_limit(recursion_limit):
|
with set_recursion_limit(recursion_limit):
|
||||||
list(base.glob('**'))
|
list(base.glob('**/'))
|
||||||
|
|
||||||
|
def test_glob_recursive_no_trailing_slash(self):
|
||||||
|
P = self.cls
|
||||||
|
p = P(BASE)
|
||||||
|
with self.assertWarns(FutureWarning):
|
||||||
|
p.glob('**')
|
||||||
|
with self.assertWarns(FutureWarning):
|
||||||
|
p.glob('*/**')
|
||||||
|
with self.assertWarns(FutureWarning):
|
||||||
|
p.rglob('**')
|
||||||
|
with self.assertWarns(FutureWarning):
|
||||||
|
p.rglob('*/**')
|
||||||
|
|
||||||
|
|
||||||
def test_readlink(self):
|
def test_readlink(self):
|
||||||
if not self.can_symlink:
|
if not self.can_symlink:
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
Emit :exc:`FutureWarning` from :meth:`pathlib.Path.glob` and
|
||||||
|
:meth:`~pathlib.Path.rglob` if the given pattern ends with "``**``". In a
|
||||||
|
future Python release, patterns with this ending will match both files and
|
||||||
|
directories. Add a trailing slash to only match directories.
|
Loading…
Add table
Add a link
Reference in a new issue