Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

upgrade: replace deprecated pkg_resources with importlib, resolves #966 #977

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[Depreciation] Replace pkg_resources with importlib_metadata and importlib_resources. (by @Danyal-Faheem)
2 changes: 2 additions & 0 deletions requirements/base.in
Original file line number Diff line number Diff line change
Expand Up @@ -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
Abdul-Muqadim-Arbisoft marked this conversation as resolved.
Show resolved Hide resolved
10 changes: 7 additions & 3 deletions requirements/base.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#
# This file is autogenerated by pip-compile with Python 3.8
# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
# pip-compile requirements/base.in
Expand All @@ -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.2
# via -r requirements/base.in
kubernetes==28.1.0
Expand Down Expand Up @@ -60,8 +64,6 @@ six==1.16.0
# via
# kubernetes
# python-dateutil
tomli==2.0.1
# via mypy
typing-extensions==4.8.0
# via
# -r requirements/base.in
Expand All @@ -72,3 +74,5 @@ urllib3==1.26.18
# requests
websocket-client==1.6.4
# via kubernetes
zipp==3.17.0
# via importlib-metadata
43 changes: 10 additions & 33 deletions requirements/dev.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
#
# This file is autogenerated by pip-compile with Python 3.8
# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
# pip-compile requirements/dev.in
#
altgraph==0.17.4
# via pyinstaller
# via
# macholib
# pyinstaller
appdirs==1.4.4
# via -r requirements/base.txt
astroid==3.0.1
Expand All @@ -25,8 +27,6 @@ certifi==2023.7.22
# -r requirements/base.txt
# kubernetes
# requests
cffi==1.16.0
# via cryptography
charset-normalizer==3.3.1
# via
# -r requirements/base.txt
Expand All @@ -42,8 +42,6 @@ click-log==0.4.0
# via scriv
coverage==7.3.2
# via -r requirements/dev.in
cryptography==41.0.7
# via secretstorage
dill==0.3.7
# via pylint
docutils==0.18.1
Expand All @@ -58,22 +56,16 @@ idna==3.4
# via
# -r requirements/base.txt
# requests
importlib-metadata==6.8.0
importlib-metadata==7.0.1
# via
# build
# keyring
# pyinstaller
# -r requirements/base.txt
# twine
importlib-resources==6.1.1
# via keyring
# via -r requirements/base.txt
isort==5.12.0
# via pylint
jaraco-classes==3.3.0
# via keyring
jeepney==0.8.0
# via
# keyring
# secretstorage
jinja2==3.1.2
# via
# -r requirements/base.txt
Expand All @@ -82,6 +74,8 @@ keyring==24.2.0
# via twine
kubernetes==28.1.0
# via -r requirements/base.txt
macholib==1.16.3
# via pyinstaller
markdown-it-py==3.0.0
# via
# rich
Expand Down Expand Up @@ -134,8 +128,6 @@ pyasn1-modules==0.3.0
# via
# -r requirements/base.txt
# google-auth
pycparser==2.21
# via cffi
pycryptodome==3.19.0
# via -r requirements/base.txt
pygments==2.16.1
Expand Down Expand Up @@ -184,22 +176,11 @@ rsa==4.9
# google-auth
scriv==1.5.0
# via -r requirements/dev.in
secretstorage==3.3.3
# via keyring
six==1.16.0
# via
# -r requirements/base.txt
# kubernetes
# python-dateutil
tomli==2.0.1
# via
# -r requirements/base.txt
# black
# build
# mypy
# pip-tools
# pylint
# pyproject-hooks
tomlkit==0.12.1
# via pylint
twine==4.0.2
Expand All @@ -213,11 +194,7 @@ types-setuptools==68.2.0.0
typing-extensions==4.8.0
# via
# -r requirements/base.txt
# astroid
# black
# mypy
# pylint
# rich
urllib3==1.26.18
# via
# -r requirements/base.txt
Expand All @@ -232,8 +209,8 @@ wheel==0.41.2
# via pip-tools
zipp==3.17.0
# via
# -r requirements/base.txt
# importlib-metadata
# importlib-resources

# The following packages are considered to be unsafe in a requirements file:
# pip
Expand Down
21 changes: 11 additions & 10 deletions requirements/docs.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#
# This file is autogenerated by pip-compile with Python 3.8
# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
# pip-compile requirements/docs.in
Expand Down Expand Up @@ -42,8 +42,10 @@ 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
importlib-resources==6.1.1
# via -r requirements/base.txt
jinja2==3.1.2
# via
# -r requirements/base.txt
Expand Down Expand Up @@ -84,8 +86,6 @@ python-dateutil==2.8.2
# via
# -r requirements/base.txt
# kubernetes
pytz==2023.3.post1
# via babel
pyyaml==6.0.1
# via
# -r requirements/base.txt
Expand Down Expand Up @@ -135,10 +135,6 @@ sphinxcontrib-qthelp==1.0.3
# via sphinx
sphinxcontrib-serializinghtml==1.1.5
# via sphinx
tomli==2.0.1
# via
# -r requirements/base.txt
# mypy
typing-extensions==4.8.0
# via
# -r requirements/base.txt
Expand All @@ -153,4 +149,9 @@ websocket-client==1.6.4
# -r requirements/base.txt
# kubernetes
zipp==3.17.0
# via importlib-metadata
# via
# -r requirements/base.txt
# importlib-metadata

# The following packages are considered to be unsafe in a requirements file:
# setuptools
6 changes: 3 additions & 3 deletions tutor.spec
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# -*- mode: python -*-
import importlib
import os
import pkg_resources
from importlib_metadata
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FTR, this line did cause an issue during the release. It was fixed by b69a8c7


block_cipher = None

Expand All @@ -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
Expand Down
4 changes: 2 additions & 2 deletions tutor/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@
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", ".jpg", ".patch", ".png", ".ttf", ".woff", ".woff2"]
JinjaFilter = t.Callable[..., t.Any]
Expand Down
13 changes: 6 additions & 7 deletions tutor/plugins/v0.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
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__
Expand Down Expand Up @@ -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:
Expand All @@ -260,12 +260,11 @@ def _version(self) -> t.Optional[str]:

@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:
Expand Down
11 changes: 6 additions & 5 deletions tutor/plugins/v1.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import os
from glob import glob

import pkg_resources
import importlib_metadata

from tutor import hooks

Expand All @@ -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)


Expand Down Expand Up @@ -56,7 +56,7 @@ def load(plugin_name: 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.
"""
Expand All @@ -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)