mirror of
https://github.com/python/cpython.git
synced 2025-07-23 03:05:38 +00:00
GH-70303: Make pathlib.Path.glob('**')
return both files and directories (#114684)
Return files and directories from `pathlib.Path.glob()` if the pattern ends with `**`. This is more compatible with `PurePath.full_match()` and with other glob implementations such as bash and `glob.glob()`. Users can add a trailing slash to match only directories. In my previous patch I added a `FutureWarning` with the intention of fixing this in Python 3.15. Upon further reflection I think this was an unnecessarily cautious remedy to a clear bug.
This commit is contained in:
parent
6de8aa31f3
commit
fda7445ca5
6 changed files with 35 additions and 23 deletions
|
@ -1765,16 +1765,26 @@ class DummyPathTest(DummyPurePathTest):
|
|||
_check(p, "*/fileB", ["dirB/fileB", "linkB/fileB"])
|
||||
_check(p, "*/", ["dirA/", "dirB/", "dirC/", "dirE/", "linkB/"])
|
||||
_check(p, "dir*/*/..", ["dirC/dirD/..", "dirA/linkC/..", "dirB/linkD/.."])
|
||||
_check(p, "dir*/**", [
|
||||
"dirA", "dirA/linkC", "dirA/linkC/fileB", "dirA/linkC/linkD", "dirA/linkC/linkD/fileB",
|
||||
"dirB", "dirB/fileB", "dirB/linkD", "dirB/linkD/fileB",
|
||||
"dirC", "dirC/fileC", "dirC/dirD", "dirC/dirD/fileD", "dirC/novel.txt",
|
||||
"dirE"])
|
||||
_check(p, "dir*/**/", ["dirA/", "dirA/linkC/", "dirA/linkC/linkD/", "dirB/", "dirB/linkD/",
|
||||
"dirC/", "dirC/dirD/", "dirE/"])
|
||||
_check(p, "dir*/**/..", ["dirA/..", "dirA/linkC/..", "dirB/..",
|
||||
"dirB/linkD/..", "dirA/linkC/linkD/..",
|
||||
"dirC/..", "dirC/dirD/..", "dirE/.."])
|
||||
_check(p, "dir*/*/**", [
|
||||
"dirA/linkC", "dirA/linkC/linkD", "dirA/linkC/fileB", "dirA/linkC/linkD/fileB",
|
||||
"dirB/linkD", "dirB/linkD/fileB",
|
||||
"dirC/dirD", "dirC/dirD/fileD"])
|
||||
_check(p, "dir*/*/**/", ["dirA/linkC/", "dirA/linkC/linkD/", "dirB/linkD/", "dirC/dirD/"])
|
||||
_check(p, "dir*/*/**/..", ["dirA/linkC/..", "dirA/linkC/linkD/..",
|
||||
"dirB/linkD/..", "dirC/dirD/.."])
|
||||
_check(p, "dir*/**/fileC", ["dirC/fileC"])
|
||||
_check(p, "dir*/*/../dirD/**/", ["dirC/dirD/../dirD/"])
|
||||
_check(p, "*/dirD/**", ["dirC/dirD", "dirC/dirD/fileD"])
|
||||
_check(p, "*/dirD/**/", ["dirC/dirD/"])
|
||||
|
||||
@needs_symlinks
|
||||
|
@ -1791,12 +1801,20 @@ class DummyPathTest(DummyPurePathTest):
|
|||
_check(p, "*/fileB", ["dirB/fileB"])
|
||||
_check(p, "*/", ["dirA/", "dirB/", "dirC/", "dirE/"])
|
||||
_check(p, "dir*/*/..", ["dirC/dirD/.."])
|
||||
_check(p, "dir*/**", [
|
||||
"dirA", "dirA/linkC",
|
||||
"dirB", "dirB/fileB", "dirB/linkD",
|
||||
"dirC", "dirC/fileC", "dirC/dirD", "dirC/dirD/fileD", "dirC/novel.txt",
|
||||
"dirE"])
|
||||
_check(p, "dir*/**/", ["dirA/", "dirB/", "dirC/", "dirC/dirD/", "dirE/"])
|
||||
_check(p, "dir*/**/..", ["dirA/..", "dirB/..", "dirC/..", "dirC/dirD/..", "dirE/.."])
|
||||
_check(p, "dir*/*/**", ["dirC/dirD", "dirC/dirD/fileD"])
|
||||
_check(p, "dir*/*/**/", ["dirC/dirD/"])
|
||||
_check(p, "dir*/*/**/..", ["dirC/dirD/.."])
|
||||
_check(p, "dir*/**/fileC", ["dirC/fileC"])
|
||||
_check(p, "dir*/*/../dirD/**", ["dirC/dirD/../dirD", "dirC/dirD/../dirD/fileD"])
|
||||
_check(p, "dir*/*/../dirD/**/", ["dirC/dirD/../dirD/"])
|
||||
_check(p, "*/dirD/**", ["dirC/dirD", "dirC/dirD/fileD"])
|
||||
_check(p, "*/dirD/**/", ["dirC/dirD/"])
|
||||
|
||||
def test_rglob_common(self):
|
||||
|
@ -1833,10 +1851,13 @@ class DummyPathTest(DummyPurePathTest):
|
|||
"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("dir*/**"), ["dirC/dirD", "dirC/dirD/fileD"])
|
||||
_check(p.rglob("dir*/**/"), ["dirC/dirD/"])
|
||||
_check(p.rglob("*/*"), ["dirC/dirD/fileD"])
|
||||
_check(p.rglob("*/"), ["dirC/dirD/"])
|
||||
_check(p.rglob(""), ["dirC/", "dirC/dirD/"])
|
||||
_check(p.rglob("**"), [
|
||||
"dirC", "dirC/fileC", "dirC/dirD", "dirC/dirD/fileD", "dirC/novel.txt"])
|
||||
_check(p.rglob("**/"), ["dirC/", "dirC/dirD/"])
|
||||
# gh-91616, a re module regression
|
||||
_check(p.rglob("*.txt"), ["dirC/novel.txt"])
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue