@@ -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
@@ -446,7 +452,7 @@ def readlink(self, path):
446
452
# Globbing helpers
447
453
#
448
454
449
- def _make_selector (pattern_parts ):
455
+ def _make_selector (pattern_parts , flavour ):
450
456
pat = pattern_parts [0 ]
451
457
child_parts = pattern_parts [1 :]
452
458
if pat == '**' :
@@ -457,7 +463,7 @@ def _make_selector(pattern_parts):
457
463
cls = _WildcardSelector
458
464
else :
459
465
cls = _PreciseSelector
460
- return cls (pat , child_parts )
466
+ return cls (pat , child_parts , flavour )
461
467
462
468
if hasattr (functools , "lru_cache" ):
463
469
_make_selector = functools .lru_cache ()(_make_selector )
@@ -467,10 +473,10 @@ class _Selector:
467
473
"""A selector matches a specific glob pattern part against the children
468
474
of a given path."""
469
475
470
- def __init__ (self , child_parts ):
476
+ def __init__ (self , child_parts , flavour ):
471
477
self .child_parts = child_parts
472
478
if child_parts :
473
- self .successor = _make_selector (child_parts )
479
+ self .successor = _make_selector (child_parts , flavour )
474
480
self .dironly = True
475
481
else :
476
482
self .successor = _TerminatingSelector ()
@@ -496,9 +502,9 @@ def _select_from(self, parent_path, is_dir, exists, scandir):
496
502
497
503
class _PreciseSelector (_Selector ):
498
504
499
- def __init__ (self , name , child_parts ):
505
+ def __init__ (self , name , child_parts , flavour ):
500
506
self .name = name
501
- _Selector .__init__ (self , child_parts )
507
+ _Selector .__init__ (self , child_parts , flavour )
502
508
503
509
def _select_from (self , parent_path , is_dir , exists , scandir ):
504
510
try :
@@ -512,13 +518,12 @@ def _select_from(self, parent_path, is_dir, exists, scandir):
512
518
513
519
class _WildcardSelector (_Selector ):
514
520
515
- def __init__ (self , pat , child_parts ):
516
- self .pat = re . compile ( fnmatch . translate ( pat ) )
517
- _Selector .__init__ (self , child_parts )
521
+ def __init__ (self , pat , child_parts , flavour ):
522
+ self .match = flavour . compile_pattern ( pat )
523
+ _Selector .__init__ (self , child_parts , flavour )
518
524
519
525
def _select_from (self , parent_path , is_dir , exists , scandir ):
520
526
try :
521
- cf = parent_path ._flavour .casefold
522
527
entries = list (scandir (parent_path ))
523
528
for entry in entries :
524
529
entry_is_dir = False
@@ -529,8 +534,7 @@ def _select_from(self, parent_path, is_dir, exists, scandir):
529
534
raise
530
535
if not self .dironly or entry_is_dir :
531
536
name = entry .name
532
- casefolded = cf (name )
533
- if self .pat .match (casefolded ):
537
+ if self .match (name ):
534
538
path = parent_path ._make_child_relpath (name )
535
539
for p in self .successor ._select_from (path , is_dir , exists , scandir ):
536
540
yield p
@@ -541,8 +545,8 @@ def _select_from(self, parent_path, is_dir, exists, scandir):
541
545
542
546
class _RecursiveWildcardSelector (_Selector ):
543
547
544
- def __init__ (self , pat , child_parts ):
545
- _Selector .__init__ (self , child_parts )
548
+ def __init__ (self , pat , child_parts , flavour ):
549
+ _Selector .__init__ (self , child_parts , flavour )
546
550
547
551
def _iterate_directories (self , parent_path , is_dir , scandir ):
548
552
yield parent_path
@@ -1109,11 +1113,10 @@ def glob(self, pattern):
1109
1113
"""
1110
1114
if not pattern :
1111
1115
raise ValueError ("Unacceptable pattern: {!r}" .format (pattern ))
1112
- pattern = self ._flavour .casefold (pattern )
1113
1116
drv , root , pattern_parts = self ._flavour .parse_parts ((pattern ,))
1114
1117
if drv or root :
1115
1118
raise NotImplementedError ("Non-relative patterns are unsupported" )
1116
- selector = _make_selector (tuple (pattern_parts ))
1119
+ selector = _make_selector (tuple (pattern_parts ), self . _flavour )
1117
1120
for p in selector .select_from (self ):
1118
1121
yield p
1119
1122
@@ -1122,11 +1125,10 @@ def rglob(self, pattern):
1122
1125
directories) matching the given relative pattern, anywhere in
1123
1126
this subtree.
1124
1127
"""
1125
- pattern = self ._flavour .casefold (pattern )
1126
1128
drv , root , pattern_parts = self ._flavour .parse_parts ((pattern ,))
1127
1129
if drv or root :
1128
1130
raise NotImplementedError ("Non-relative patterns are unsupported" )
1129
- selector = _make_selector (("**" ,) + tuple (pattern_parts ))
1131
+ selector = _make_selector (("**" ,) + tuple (pattern_parts ), self . _flavour )
1130
1132
for p in selector .select_from (self ):
1131
1133
yield p
1132
1134
0 commit comments