diff --git a/changelog.d/20240202_153925_danyal.faheem_remove_pkg_resources.md b/changelog.d/20240202_153925_danyal.faheem_remove_pkg_resources.md new file mode 100644 index 0000000..d7cd4d9 --- /dev/null +++ b/changelog.d/20240202_153925_danyal.faheem_remove_pkg_resources.md @@ -0,0 +1 @@ +[Depreciation] Replace pkg_resources with importlib_metadata and importlib_resources. (by @Danyal-Faheem) \ No newline at end of file diff --git a/requirements/base.in b/requirements/base.in index eb60ad6..21e5098 100644 --- a/requirements/base.in +++ b/requirements/base.in @@ -6,3 +6,5 @@ mypy pycryptodome>=3.17.0 pyyaml>=6.0 typing-extensions>=4.4.0 +importlib-metadata>=7.0.1 +importlib-resources>=6.1.1 diff --git a/requirements/base.txt b/requirements/base.txt index 1526e68..37cdb88 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -20,6 +20,10 @@ google-auth==2.23.3 # via kubernetes idna==3.4 # via requests +importlib-metadata==7.0.1 + # via -r requirements/base.in +importlib-resources==6.1.1 + # via -r requirements/base.in jinja2==3.1.3 # via -r requirements/base.in kubernetes==28.1.0 @@ -72,3 +76,7 @@ urllib3==1.26.18 # requests websocket-client==1.6.4 # via kubernetes +zipp==3.17.0 + # via + # importlib-metadata + # importlib-resources diff --git a/requirements/dev.txt b/requirements/dev.txt index 3515973..5c6aba3 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -58,14 +58,17 @@ idna==3.4 # via # -r requirements/base.txt # requests -importlib-metadata==6.8.0 +importlib-metadata==7.0.1 # via + # -r requirements/base.txt # build # keyring # pyinstaller # twine importlib-resources==6.1.1 - # via keyring + # via + # -r requirements/base.txt + # keyring isort==5.12.0 # via pylint jaraco-classes==3.3.0 @@ -232,6 +235,7 @@ wheel==0.41.2 # via pip-tools zipp==3.17.0 # via + # -r requirements/base.txt # importlib-metadata # importlib-resources diff --git a/requirements/docs.txt b/requirements/docs.txt index 8acbfb5..4ca558d 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -42,8 +42,12 @@ idna==3.4 # requests imagesize==1.4.1 # via sphinx -importlib-metadata==6.8.0 - # via sphinx +importlib-metadata==7.0.1 + # via + # -r requirements/base.txt + # sphinx +importlib-resources==6.1.1 + # via -r requirements/base.txt jinja2==3.1.3 # via # -r requirements/base.txt @@ -153,4 +157,7 @@ websocket-client==1.6.4 # -r requirements/base.txt # kubernetes zipp==3.17.0 - # via importlib-metadata + # via + # -r requirements/base.txt + # importlib-metadata + # importlib-resources diff --git a/tutor.spec b/tutor.spec index f68c7c0..1e6f591 100644 --- a/tutor.spec +++ b/tutor.spec @@ -1,7 +1,7 @@ # -*- mode: python -*- import importlib import os -import pkg_resources +from importlib_metadata block_cipher = None @@ -10,10 +10,10 @@ hidden_imports = [] # Auto-discover plugins and include patches & templates folders for entrypoint_version in ["tutor.plugin.v0", "tutor.plugin.v1"]: - for entrypoint in pkg_resources.iter_entry_points(entrypoint_version): + for entrypoint in importlib_metadata.entry_points(group=entrypoint_version): plugin_name = entrypoint.name try: - plugin = entrypoint.load() + plugin = importlib.import_module(entrypoint.value) except Exception as e: print(f"ERROR Failed to load plugin {plugin_name}: {e}") continue diff --git a/tutor/env.py b/tutor/env.py index 5e668b8..470f9dc 100644 --- a/tutor/env.py +++ b/tutor/env.py @@ -7,13 +7,13 @@ import typing as t from copy import deepcopy import jinja2 -import pkg_resources +import importlib_resources from tutor import exceptions, fmt, hooks, plugins, utils from tutor.__about__ import __app__, __version__ from tutor.types import Config, ConfigValue -TEMPLATES_ROOT = pkg_resources.resource_filename("tutor", "templates") +TEMPLATES_ROOT = str(importlib_resources.files("tutor") / "templates") VERSION_FILENAME = "version" BIN_FILE_EXTENSIONS = [ ".ico", diff --git a/tutor/plugins/v0.py b/tutor/plugins/v0.py index 16e6770..b1cf0f7 100644 --- a/tutor/plugins/v0.py +++ b/tutor/plugins/v0.py @@ -5,7 +5,7 @@ import typing as t from glob import glob import click -import pkg_resources +import importlib_metadata from tutor import env, exceptions, fmt, hooks, serialize from tutor.__about__ import __app__ @@ -246,12 +246,12 @@ class EntrypointPlugin(BasePlugin): ENTRYPOINT = "tutor.plugin.v0" - def __init__(self, entrypoint: pkg_resources.EntryPoint) -> None: - self.loader: pkg_resources.EntryPoint + def __init__(self, entrypoint: importlib_metadata.EntryPoint) -> None: + self.loader: importlib_metadata.EntryPoint = entrypoint super().__init__(entrypoint.name, entrypoint) def _load_obj(self) -> None: - self.obj = self.loader.load() + self.obj = importlib.import_module(self.loader.value) def _version(self) -> t.Optional[str]: if not self.loader.dist: @@ -260,12 +260,11 @@ class EntrypointPlugin(BasePlugin): @classmethod def discover_all(cls) -> None: - for entrypoint in pkg_resources.iter_entry_points(cls.ENTRYPOINT): + entrypoints = importlib_metadata.entry_points(group=cls.ENTRYPOINT) + for entrypoint in entrypoints: try: error: t.Optional[str] = None cls(entrypoint) - except pkg_resources.VersionConflict as e: - error = e.report() except Exception as e: # pylint: disable=broad-except error = str(e) if error: diff --git a/tutor/plugins/v1.py b/tutor/plugins/v1.py index cf24bf0..88982b6 100644 --- a/tutor/plugins/v1.py +++ b/tutor/plugins/v1.py @@ -2,7 +2,7 @@ import importlib.util import os from glob import glob -import pkg_resources +import importlib_metadata from tutor import hooks @@ -26,7 +26,7 @@ def _discover_entrypoint_plugins() -> None: """ with hooks.Contexts.PLUGINS.enter(): if "TUTOR_IGNORE_ENTRYPOINT_PLUGINS" not in os.environ: - for entrypoint in pkg_resources.iter_entry_points("tutor.plugin.v1"): + for entrypoint in importlib_metadata.entry_points(group="tutor.plugin.v1"): discover_package(entrypoint) @@ -56,7 +56,7 @@ def discover_module(path: str) -> None: spec.loader.exec_module(module) -def discover_package(entrypoint: pkg_resources.EntryPoint) -> None: +def discover_package(entrypoint: importlib_metadata.EntryPoint) -> None: """ Install a plugin from a python package. """ @@ -68,10 +68,11 @@ def discover_package(entrypoint: pkg_resources.EntryPoint) -> None: # Add plugin information if entrypoint.dist is None: raise ValueError(f"Could not read plugin version: {name}") - hooks.Filters.PLUGINS_INFO.add_item((name, entrypoint.dist.version)) + dist_version = entrypoint.dist.version if entrypoint.dist else "Unknown" + hooks.Filters.PLUGINS_INFO.add_item((name, dist_version)) # Import module on enable @hooks.Actions.PLUGIN_LOADED.add() def load(plugin_name: str) -> None: if name == plugin_name: - entrypoint.load() + importlib.import_module(entrypoint.value)