Mercurial > hg-stable
changeset 51717:747a1370c598 stable
utils: fix resourceutil use of deprecated importlib.resources
Some importlib functionality was deprecated in 3.11 . The documentation on
https://docs.python.org/3.12/library/importlib.resources.html recommends using
the new .files() API that was introduced in 3.9.
author | Mads Kiilerich <mads@kiilerich.com> |
---|---|
date | Mon, 22 Jul 2024 18:20:03 +0200 |
parents | c5d6a66092e8 |
children | 71044315a536 |
files | mercurial/utils/resourceutil.py |
diffstat | 1 files changed, 26 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/utils/resourceutil.py Tue Jun 27 13:05:03 2023 +0200 +++ b/mercurial/utils/resourceutil.py Mon Jul 22 18:20:03 2024 +0200 @@ -11,6 +11,8 @@ import os import sys +from typing import Iterator + from .. import pycompat @@ -48,6 +50,7 @@ assert dirs[0] == b"mercurial" return os.path.join(_rootpath, *dirs[1:]) + else: datapath = os.path.dirname(os.path.dirname(pycompat.fsencode(__file__))) _rootpath = os.path.dirname(datapath) @@ -62,7 +65,7 @@ from importlib import resources # pytype: disable=import-error # Force loading of the resources module - if hasattr(resources, 'files'): + if hasattr(resources, 'files'): # Introduced in Python 3.9 resources.files # pytype: disable=module-attr else: resources.open_binary # pytype: disable=module-attr @@ -93,6 +96,7 @@ for p in os.listdir(path): yield pycompat.fsencode(p) + else: from .. import encoding @@ -110,13 +114,25 @@ pycompat.sysstr(package), pycompat.sysstr(name) ) - def is_resource(package, name): - return resources.is_resource( # pytype: disable=module-attr - pycompat.sysstr(package), encoding.strfromlocal(name) - ) + def is_resource(package: bytes, name: bytes) -> bool: + if hasattr(resources, 'files'): # Introduced in Python 3.9 + return ( + resources.files(pycompat.sysstr(package)) + .joinpath(encoding.strfromlocal(name)) + .is_file() + ) + else: + return resources.is_resource( # pytype: disable=module-attr + pycompat.sysstr(package), encoding.strfromlocal(name) + ) - def contents(package): - # pytype: disable=module-attr - for r in resources.contents(pycompat.sysstr(package)): - # pytype: enable=module-attr - yield encoding.strtolocal(r) + def contents(package: bytes) -> "Iterator[bytes]": + if hasattr(resources, 'files'): # Introduced in Python 3.9 + for path in resources.files(pycompat.sysstr(package)).iterdir(): + if path.is_file(): + yield encoding.strtolocal(path.name) + else: + # pytype: disable=module-attr + for r in resources.contents(pycompat.sysstr(package)): + # pytype: enable=module-attr + yield encoding.strtolocal(r)