mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
gh-135801: Improve filtering by module in warn_explicit() without module argument (GH-140151)
* Try to match the module name pattern with module names constructed starting from different parent directories of the filename. E.g., for "/path/to/package/module" try to match with "path.to.package.module", "to.package.module", "package.module" and "module". * Ignore trailing "/__init__.py". * Ignore trailing ".pyw" on Windows. * Keep matching with the full filename (without optional ".py" extension) for compatibility. * Only ignore the case of the ".py" extension on Windows.
This commit is contained in:
parent
efc37ba49e
commit
6826166280
13 changed files with 243 additions and 73 deletions
|
|
@ -520,20 +520,50 @@ def warn(message, category=None, stacklevel=1, source=None,
|
|||
)
|
||||
|
||||
|
||||
def _match_filename(pattern, filename, *, MS_WINDOWS=(sys.platform == 'win32')):
|
||||
if not filename:
|
||||
return pattern.match('<unknown>') is not None
|
||||
if filename[0] == '<' and filename[-1] == '>':
|
||||
return pattern.match(filename) is not None
|
||||
|
||||
is_py = (filename[-3:].lower() == '.py'
|
||||
if MS_WINDOWS else
|
||||
filename.endswith('.py'))
|
||||
if is_py:
|
||||
filename = filename[:-3]
|
||||
if pattern.match(filename): # for backward compatibility
|
||||
return True
|
||||
if MS_WINDOWS:
|
||||
if not is_py and filename[-4:].lower() == '.pyw':
|
||||
filename = filename[:-4]
|
||||
is_py = True
|
||||
if is_py and filename[-9:].lower() in (r'\__init__', '/__init__'):
|
||||
filename = filename[:-9]
|
||||
filename = filename.replace('\\', '/')
|
||||
else:
|
||||
if is_py and filename.endswith('/__init__'):
|
||||
filename = filename[:-9]
|
||||
filename = filename.replace('/', '.')
|
||||
i = 0
|
||||
while True:
|
||||
if pattern.match(filename, i):
|
||||
return True
|
||||
i = filename.find('.', i) + 1
|
||||
if not i:
|
||||
return False
|
||||
|
||||
|
||||
def warn_explicit(message, category, filename, lineno,
|
||||
module=None, registry=None, module_globals=None,
|
||||
source=None):
|
||||
lineno = int(lineno)
|
||||
if module is None:
|
||||
module = filename or "<unknown>"
|
||||
if module[-3:].lower() == ".py":
|
||||
module = module[:-3] # XXX What about leading pathname?
|
||||
if isinstance(message, Warning):
|
||||
text = str(message)
|
||||
category = message.__class__
|
||||
else:
|
||||
text = message
|
||||
message = category(message)
|
||||
modules = None
|
||||
key = (text, category, lineno)
|
||||
with _wm._lock:
|
||||
if registry is None:
|
||||
|
|
@ -549,9 +579,11 @@ def warn_explicit(message, category, filename, lineno,
|
|||
action, msg, cat, mod, ln = item
|
||||
if ((msg is None or msg.match(text)) and
|
||||
issubclass(category, cat) and
|
||||
(mod is None or mod.match(module)) and
|
||||
(ln == 0 or lineno == ln)):
|
||||
break
|
||||
(ln == 0 or lineno == ln) and
|
||||
(mod is None or (_match_filename(mod, filename)
|
||||
if module is None else
|
||||
mod.match(module)))):
|
||||
break
|
||||
else:
|
||||
action = _wm.defaultaction
|
||||
# Early exit actions
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue