@@ -62,7 +62,7 @@ def _is_case_sensitive(flavour):
62
62
#
63
63
64
64
@functools .lru_cache ()
65
- def _make_selector (pattern_parts , flavour ):
65
+ def _make_selector (pattern_parts , flavour , case_sensitive ):
66
66
pat = pattern_parts [0 ]
67
67
child_parts = pattern_parts [1 :]
68
68
if not pat :
@@ -75,17 +75,17 @@ def _make_selector(pattern_parts, flavour):
75
75
raise ValueError ("Invalid pattern: '**' can only be an entire path component" )
76
76
else :
77
77
cls = _WildcardSelector
78
- return cls (pat , child_parts , flavour )
78
+ return cls (pat , child_parts , flavour , case_sensitive )
79
79
80
80
81
81
class _Selector :
82
82
"""A selector matches a specific glob pattern part against the children
83
83
of a given path."""
84
84
85
- def __init__ (self , child_parts , flavour ):
85
+ def __init__ (self , child_parts , flavour , case_sensitive ):
86
86
self .child_parts = child_parts
87
87
if child_parts :
88
- self .successor = _make_selector (child_parts , flavour )
88
+ self .successor = _make_selector (child_parts , flavour , case_sensitive )
89
89
self .dironly = True
90
90
else :
91
91
self .successor = _TerminatingSelector ()
@@ -108,8 +108,9 @@ def _select_from(self, parent_path, scandir):
108
108
109
109
110
110
class _ParentSelector (_Selector ):
111
- def __init__ (self , name , child_parts , flavour ):
112
- _Selector .__init__ (self , child_parts , flavour )
111
+
112
+ def __init__ (self , name , child_parts , flavour , case_sensitive ):
113
+ _Selector .__init__ (self , child_parts , flavour , case_sensitive )
113
114
114
115
def _select_from (self , parent_path , scandir ):
115
116
path = parent_path ._make_child_relpath ('..' )
@@ -119,10 +120,13 @@ def _select_from(self, parent_path, scandir):
119
120
120
121
class _WildcardSelector (_Selector ):
121
122
122
- def __init__ (self , pat , child_parts , flavour ):
123
- flags = re .NOFLAG if _is_case_sensitive (flavour ) else re .IGNORECASE
123
+ def __init__ (self , pat , child_parts , flavour , case_sensitive ):
124
+ _Selector .__init__ (self , child_parts , flavour , case_sensitive )
125
+ if case_sensitive is None :
126
+ # TODO: evaluate case-sensitivity of each directory in _select_from()
127
+ case_sensitive = _is_case_sensitive (flavour )
128
+ flags = re .NOFLAG if case_sensitive else re .IGNORECASE
124
129
self .match = re .compile (fnmatch .translate (pat ), flags = flags ).fullmatch
125
- _Selector .__init__ (self , child_parts , flavour )
126
130
127
131
def _select_from (self , parent_path , scandir ):
128
132
try :
@@ -153,8 +157,8 @@ def _select_from(self, parent_path, scandir):
153
157
154
158
class _RecursiveWildcardSelector (_Selector ):
155
159
156
- def __init__ (self , pat , child_parts , flavour ):
157
- _Selector .__init__ (self , child_parts , flavour )
160
+ def __init__ (self , pat , child_parts , flavour , case_sensitive ):
161
+ _Selector .__init__ (self , child_parts , flavour , case_sensitive )
158
162
159
163
def _iterate_directories (self , parent_path , scandir ):
160
164
yield parent_path
@@ -819,7 +823,7 @@ def _scandir(self):
819
823
# includes scandir(), which is used to implement glob().
820
824
return os .scandir (self )
821
825
822
- def glob (self , pattern ):
826
+ def glob (self , pattern , * , case_sensitive = None ):
823
827
"""Iterate over this subtree and yield all existing files (of any
824
828
kind, including directories) matching the given relative pattern.
825
829
"""
@@ -831,11 +835,11 @@ def glob(self, pattern):
831
835
raise NotImplementedError ("Non-relative patterns are unsupported" )
832
836
if pattern [- 1 ] in (self ._flavour .sep , self ._flavour .altsep ):
833
837
pattern_parts .append ('' )
834
- selector = _make_selector (tuple (pattern_parts ), self ._flavour )
838
+ selector = _make_selector (tuple (pattern_parts ), self ._flavour , case_sensitive )
835
839
for p in selector .select_from (self ):
836
840
yield p
837
841
838
- def rglob (self , pattern ):
842
+ def rglob (self , pattern , * , case_sensitive = None ):
839
843
"""Recursively yield all existing files (of any kind, including
840
844
directories) matching the given relative pattern, anywhere in
841
845
this subtree.
@@ -846,7 +850,7 @@ def rglob(self, pattern):
846
850
raise NotImplementedError ("Non-relative patterns are unsupported" )
847
851
if pattern and pattern [- 1 ] in (self ._flavour .sep , self ._flavour .altsep ):
848
852
pattern_parts .append ('' )
849
- selector = _make_selector (("**" ,) + tuple (pattern_parts ), self ._flavour )
853
+ selector = _make_selector (("**" ,) + tuple (pattern_parts ), self ._flavour , case_sensitive )
850
854
for p in selector .select_from (self ):
851
855
yield p
852
856
0 commit comments