mirror of
https://github.com/python/cpython.git
synced 2025-10-28 12:15:13 +00:00
GH-73435: Implement recursive wildcards in pathlib.PurePath.match() (#101398)
`PurePath.match()` now handles the `**` wildcard as in `Path.glob()`, i.e. it matches any number of path segments. We now compile a `re.Pattern` object for the entire pattern. This is made more difficult by `fnmatch` not treating directory separators as special when evaluating wildcards (`*`, `?`, etc), and so we arrange the path parts onto separate *lines* in a string, and ensure we don't set `re.DOTALL`. Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com> Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
This commit is contained in:
parent
4c770617c0
commit
49f90ba1ea
5 changed files with 123 additions and 15 deletions
|
|
@ -310,8 +310,30 @@ def test_match_common(self):
|
|||
self.assertFalse(P('/ab.py').match('/a/*.py'))
|
||||
self.assertFalse(P('/a/b/c.py').match('/a/*.py'))
|
||||
# Multi-part glob-style pattern.
|
||||
self.assertFalse(P('/a/b/c.py').match('/**/*.py'))
|
||||
self.assertTrue(P('a').match('**'))
|
||||
self.assertTrue(P('c.py').match('**'))
|
||||
self.assertTrue(P('a/b/c.py').match('**'))
|
||||
self.assertTrue(P('/a/b/c.py').match('**'))
|
||||
self.assertTrue(P('/a/b/c.py').match('/**'))
|
||||
self.assertTrue(P('/a/b/c.py').match('**/'))
|
||||
self.assertTrue(P('/a/b/c.py').match('/a/**'))
|
||||
self.assertTrue(P('/a/b/c.py').match('**/*.py'))
|
||||
self.assertTrue(P('/a/b/c.py').match('/**/*.py'))
|
||||
self.assertTrue(P('/a/b/c.py').match('/a/**/*.py'))
|
||||
self.assertTrue(P('/a/b/c.py').match('/a/b/**/*.py'))
|
||||
self.assertTrue(P('/a/b/c.py').match('/**/**/**/**/*.py'))
|
||||
self.assertFalse(P('c.py').match('**/a.py'))
|
||||
self.assertFalse(P('c.py').match('c/**'))
|
||||
self.assertFalse(P('a/b/c.py').match('**/a'))
|
||||
self.assertFalse(P('a/b/c.py').match('**/a/b'))
|
||||
self.assertFalse(P('a/b/c.py').match('**/a/b/c'))
|
||||
self.assertFalse(P('a/b/c.py').match('**/a/b/c.'))
|
||||
self.assertFalse(P('a/b/c.py').match('**/a/b/c./**'))
|
||||
self.assertFalse(P('a/b/c.py').match('**/a/b/c./**'))
|
||||
self.assertFalse(P('a/b/c.py').match('/a/b/c.py/**'))
|
||||
self.assertFalse(P('a/b/c.py').match('/**/a/b/c.py'))
|
||||
self.assertRaises(ValueError, P('a').match, '**a/b/c')
|
||||
self.assertRaises(ValueError, P('a').match, 'a/b/c**')
|
||||
# Case-sensitive flag
|
||||
self.assertFalse(P('A.py').match('a.PY', case_sensitive=True))
|
||||
self.assertTrue(P('A.py').match('a.PY', case_sensitive=False))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue