@@ -187,6 +187,9 @@ def casefold(self, s):
187
187
def casefold_parts (self , parts ):
188
188
return [p .lower () for p in parts ]
189
189
190
+ def compile_pattern (self , pattern ):
191
+ return re .compile (fnmatch .translate (pattern ), re .IGNORECASE ).fullmatch
192
+
190
193
def resolve (self , path , strict = False ):
191
194
s = str (path )
192
195
if not s :
@@ -309,6 +312,9 @@ def casefold(self, s):
309
312
def casefold_parts (self , parts ):
310
313
return parts
311
314
315
+ def compile_pattern (self , pattern ):
316
+ return re .compile (fnmatch .translate (pattern )).fullmatch
317
+
312
318
def resolve (self , path , strict = False ):
313
319
sep = self .sep
314
320
accessor = path ._accessor
@@ -444,7 +450,7 @@ def readlink(self, path):
444
450
# Globbing helpers
445
451
#
446
452
447
- def _make_selector (pattern_parts ):
453
+ def _make_selector (pattern_parts , flavour ):
448
454
pat = pattern_parts [0 ]
449
455
child_parts = pattern_parts [1 :]
450
456
if pat == '**' :
@@ -455,7 +461,7 @@ def _make_selector(pattern_parts):
455
461
cls = _WildcardSelector
456
462
else :
457
463
cls = _PreciseSelector
458
- return cls (pat , child_parts )
464
+ return cls (pat , child_parts , flavour )
459
465
460
466
if hasattr (functools , "lru_cache" ):
461
467
_make_selector = functools .lru_cache ()(_make_selector )
@@ -465,10 +471,10 @@ class _Selector:
465
471
"""A selector matches a specific glob pattern part against the children
466
472
of a given path."""
467
473
468
- def __init__ (self , child_parts ):
474
+ def __init__ (self , child_parts , flavour ):
469
475
self .child_parts = child_parts
470
476
if child_parts :
471
- self .successor = _make_selector (child_parts )
477
+ self .successor = _make_selector (child_parts , flavour )
472
478
self .dironly = True
473
479
else :
474
480
self .successor = _TerminatingSelector ()
@@ -494,9 +500,9 @@ def _select_from(self, parent_path, is_dir, exists, scandir):
494
500
495
501
class _PreciseSelector (_Selector ):
496
502
497
- def __init__ (self , name , child_parts ):
503
+ def __init__ (self , name , child_parts , flavour ):
498
504
self .name = name
499
- _Selector .__init__ (self , child_parts )
505
+ _Selector .__init__ (self , child_parts , flavour )
500
506
501
507
def _select_from (self , parent_path , is_dir , exists , scandir ):
502
508
try :
@@ -510,13 +516,12 @@ def _select_from(self, parent_path, is_dir, exists, scandir):
510
516
511
517
class _WildcardSelector (_Selector ):
512
518
513
- def __init__ (self , pat , child_parts ):
514
- self .pat = re . compile ( fnmatch . translate ( pat ) )
515
- _Selector .__init__ (self , child_parts )
519
+ def __init__ (self , pat , child_parts , flavour ):
520
+ self .match = flavour . compile_pattern ( pat )
521
+ _Selector .__init__ (self , child_parts , flavour )
516
522
517
523
def _select_from (self , parent_path , is_dir , exists , scandir ):
518
524
try :
519
- cf = parent_path ._flavour .casefold
520
525
entries = list (scandir (parent_path ))
521
526
for entry in entries :
522
527
entry_is_dir = False
@@ -527,8 +532,7 @@ def _select_from(self, parent_path, is_dir, exists, scandir):
527
532
raise
528
533
if not self .dironly or entry_is_dir :
529
534
name = entry .name
530
- casefolded = cf (name )
531
- if self .pat .match (casefolded ):
535
+ if self .match (name ):
532
536
path = parent_path ._make_child_relpath (name )
533
537
for p in self .successor ._select_from (path , is_dir , exists , scandir ):
534
538
yield p
@@ -539,8 +543,8 @@ def _select_from(self, parent_path, is_dir, exists, scandir):
539
543
540
544
class _RecursiveWildcardSelector (_Selector ):
541
545
542
- def __init__ (self , pat , child_parts ):
543
- _Selector .__init__ (self , child_parts )
546
+ def __init__ (self , pat , child_parts , flavour ):
547
+ _Selector .__init__ (self , child_parts , flavour )
544
548
545
549
def _iterate_directories (self , parent_path , is_dir , scandir ):
546
550
yield parent_path
@@ -1101,11 +1105,10 @@ def glob(self, pattern):
1101
1105
"""
1102
1106
if not pattern :
1103
1107
raise ValueError ("Unacceptable pattern: {!r}" .format (pattern ))
1104
- pattern = self ._flavour .casefold (pattern )
1105
1108
drv , root , pattern_parts = self ._flavour .parse_parts ((pattern ,))
1106
1109
if drv or root :
1107
1110
raise NotImplementedError ("Non-relative patterns are unsupported" )
1108
- selector = _make_selector (tuple (pattern_parts ))
1111
+ selector = _make_selector (tuple (pattern_parts ), self . _flavour )
1109
1112
for p in selector .select_from (self ):
1110
1113
yield p
1111
1114
@@ -1114,11 +1117,10 @@ def rglob(self, pattern):
1114
1117
directories) matching the given relative pattern, anywhere in
1115
1118
this subtree.
1116
1119
"""
1117
- pattern = self ._flavour .casefold (pattern )
1118
1120
drv , root , pattern_parts = self ._flavour .parse_parts ((pattern ,))
1119
1121
if drv or root :
1120
1122
raise NotImplementedError ("Non-relative patterns are unsupported" )
1121
- selector = _make_selector (("**" ,) + tuple (pattern_parts ))
1123
+ selector = _make_selector (("**" ,) + tuple (pattern_parts ), self . _flavour )
1122
1124
for p in selector .select_from (self ):
1123
1125
yield p
1124
1126
0 commit comments