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

Replace pkg_resources with importlib #6273

Merged
merged 4 commits into from Apr 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGES.rst
Expand Up @@ -35,6 +35,8 @@ Internal Changes

- Allow plugins to fully replace the data in a ticket QR code with a custom string
instead of just modifying/extending the JSON dict (:pr:`6266`)
- Replace deprecated ``pkg_resources`` with ``importlib`` from standard library
(:issue:`6272`, :pr:`6273`, thanks :user:`maxnoe`)


Version 3.3.1
Expand Down
4 changes: 2 additions & 2 deletions indico/cli/setup.py
Expand Up @@ -11,6 +11,7 @@
import socket
import subprocess
import sys
from importlib.metadata import entry_points
from operator import attrgetter
from pathlib import Path
from smtplib import SMTP
Expand All @@ -21,7 +22,6 @@
from flask.helpers import get_root_path
from packaging.specifiers import SpecifierSet
from packaging.version import Version
from pkg_resources import iter_entry_points
from prompt_toolkit import prompt
from prompt_toolkit.completion import PathCompleter, WordCompleter
from prompt_toolkit.styles import Style
Expand Down Expand Up @@ -181,7 +181,7 @@ def list_plugins():
"""List the available Indico plugins."""
import_all_models()
table_data = [['Name', 'Title']]
for ep in sorted(iter_entry_points('indico.plugins'), key=attrgetter('name')):
for ep in sorted(entry_points(group='indico.plugins'), key=attrgetter('name')):
plugin = ep.load()
table_data.append([ep.name, plugin.title])
table = AsciiTable(table_data, cformat('%{white!}Available Plugins%{reset}'))
Expand Down
8 changes: 6 additions & 2 deletions indico/core/sentry.py
Expand Up @@ -7,12 +7,12 @@

import logging
import re
from importlib.metadata import entry_points
from urllib.parse import parse_qs, urlsplit, urlunsplit

import requests
import sentry_sdk
from flask import request
from pkg_resources import iter_entry_points
from sentry_sdk.integrations.flask import FlaskIntegration
from sentry_sdk.integrations.logging import LoggingIntegration, ignore_logger
from sentry_sdk.integrations.pure_eval import PureEvalIntegration
Expand All @@ -29,7 +29,11 @@


def init_sentry(app):
plugin_packages = {ep.module_name.split('.')[0] for ep in iter_entry_points('indico.plugins')}
plugin_packages = {
ep.value.split(':')[0].split('.')[0]
for ep in entry_points(group='indico.plugins')
}

ignore_logger('indico.flask')
sentry_sdk.init(
dsn=config.SENTRY_DSN,
Expand Down
73 changes: 36 additions & 37 deletions indico/legacy/pdfinterface/base.py
Expand Up @@ -10,9 +10,9 @@
import math
import os
import xml.sax.saxutils as saxutils
from importlib.resources import as_file, files
from io import BytesIO

import pkg_resources
from PIL import Image as PILImage
from reportlab import platypus
from reportlab.lib.enums import TA_CENTER
Expand Down Expand Up @@ -90,42 +90,41 @@ def modifiedFontSize(fontsize, lowerNormalHigher):
def setTTFonts():
global alreadyRegistered
if not alreadyRegistered:
distribution = pkg_resources.get_distribution('indico-fonts')
font_dir = os.path.join(distribution.location, 'indico_fonts')
pdfmetrics.registerFont(TTFont('Times-Roman', os.path.join(font_dir, 'LiberationSerif-Regular.ttf')))
pdfmetrics.registerFont(TTFont('Times-Bold', os.path.join(font_dir, 'LiberationSerif-Bold.ttf')))
pdfmetrics.registerFont(TTFont('Times-Italic', os.path.join(font_dir, 'LiberationSerif-Italic.ttf')))
pdfmetrics.registerFont(TTFont('Times-Bold-Italic', os.path.join(font_dir, 'LiberationSerif-BoldItalic.ttf')))
addMapping('Times-Roman', 0, 0, 'Times-Roman')
addMapping('Times-Roman', 1, 0, 'Times-Bold')
addMapping('Times-Roman', 0, 1, 'Times-Italic')
addMapping('Times-Roman', 1, 1, 'Times-Bold-Italic')
pdfmetrics.registerFont(TTFont('Sans', os.path.join(font_dir, 'LiberationSans-Regular.ttf')))
pdfmetrics.registerFont(TTFont('Sans-Bold', os.path.join(font_dir, 'LiberationSans-Bold.ttf')))
pdfmetrics.registerFont(TTFont('Sans-Italic', os.path.join(font_dir, 'LiberationSans-Italic.ttf')))
pdfmetrics.registerFont(TTFont('Sans-Bold-Italic', os.path.join(font_dir, 'LiberationSans-BoldItalic.ttf')))
addMapping('Sans', 0, 0, 'Sans')
addMapping('Sans', 1, 0, 'Sans-Bold')
addMapping('Sans', 0, 1, 'Sans-Italic')
addMapping('Sans', 1, 1, 'Sans-Bold-Italic')
pdfmetrics.registerFont(TTFont('Courier', os.path.join(font_dir, 'LiberationMono-Regular.ttf')))
pdfmetrics.registerFont(TTFont('Courier-Bold', os.path.join(font_dir, 'LiberationMono-Bold.ttf')))
pdfmetrics.registerFont(TTFont('Courier-Italic', os.path.join(font_dir, 'LiberationMono-Italic.ttf')))
pdfmetrics.registerFont(TTFont('Courier-Bold-Italic', os.path.join(font_dir, 'LiberationMono-BoldItalic.ttf')))
addMapping('Courier', 0, 0, 'Courier')
addMapping('Courier', 1, 0, 'Courier-Bold')
addMapping('Courier', 0, 1, 'Courier-Italic')
addMapping('Courier', 1, 1, 'Courier-Bold-Italic')
pdfmetrics.registerFont(TTFont('LinuxLibertine', os.path.join(font_dir, 'LinLibertine_Rah.ttf')))
pdfmetrics.registerFont(TTFont('LinuxLibertine-Bold', os.path.join(font_dir, 'LinLibertine_RBah.ttf')))
pdfmetrics.registerFont(TTFont('LinuxLibertine-Italic', os.path.join(font_dir, 'LinLibertine_RIah.ttf')))
pdfmetrics.registerFont(TTFont('LinuxLibertine-Bold-Italic', os.path.join(font_dir, 'LinLibertine_RBIah.ttf')))
addMapping('LinuxLibertine', 0, 0, 'LinuxLibertine')
addMapping('LinuxLibertine', 1, 0, 'LinuxLibertine-Bold')
addMapping('LinuxLibertine', 0, 1, 'LinuxLibertine-Italic')
addMapping('LinuxLibertine', 1, 1, 'LinuxLibertine-Bold-Italic')
pdfmetrics.registerFont(TTFont('Kochi-Mincho', os.path.join(font_dir, 'kochi-mincho-subst.ttf')))
pdfmetrics.registerFont(TTFont('Kochi-Gothic', os.path.join(font_dir, 'kochi-gothic-subst.ttf')))
with as_file(files('indico_fonts')) as font_dir:
pdfmetrics.registerFont(TTFont('Times-Roman', os.path.join(font_dir, 'LiberationSerif-Regular.ttf')))
pdfmetrics.registerFont(TTFont('Times-Bold', os.path.join(font_dir, 'LiberationSerif-Bold.ttf')))
pdfmetrics.registerFont(TTFont('Times-Italic', os.path.join(font_dir, 'LiberationSerif-Italic.ttf')))
pdfmetrics.registerFont(TTFont('Times-Bold-Italic', os.path.join(font_dir, 'LiberationSerif-BoldItalic.ttf')))
addMapping('Times-Roman', 0, 0, 'Times-Roman')
addMapping('Times-Roman', 1, 0, 'Times-Bold')
addMapping('Times-Roman', 0, 1, 'Times-Italic')
addMapping('Times-Roman', 1, 1, 'Times-Bold-Italic')
pdfmetrics.registerFont(TTFont('Sans', os.path.join(font_dir, 'LiberationSans-Regular.ttf')))
pdfmetrics.registerFont(TTFont('Sans-Bold', os.path.join(font_dir, 'LiberationSans-Bold.ttf')))
pdfmetrics.registerFont(TTFont('Sans-Italic', os.path.join(font_dir, 'LiberationSans-Italic.ttf')))
pdfmetrics.registerFont(TTFont('Sans-Bold-Italic', os.path.join(font_dir, 'LiberationSans-BoldItalic.ttf')))
addMapping('Sans', 0, 0, 'Sans')
addMapping('Sans', 1, 0, 'Sans-Bold')
addMapping('Sans', 0, 1, 'Sans-Italic')
addMapping('Sans', 1, 1, 'Sans-Bold-Italic')
pdfmetrics.registerFont(TTFont('Courier', os.path.join(font_dir, 'LiberationMono-Regular.ttf')))
pdfmetrics.registerFont(TTFont('Courier-Bold', os.path.join(font_dir, 'LiberationMono-Bold.ttf')))
pdfmetrics.registerFont(TTFont('Courier-Italic', os.path.join(font_dir, 'LiberationMono-Italic.ttf')))
pdfmetrics.registerFont(TTFont('Courier-Bold-Italic', os.path.join(font_dir, 'LiberationMono-BoldItalic.ttf')))
addMapping('Courier', 0, 0, 'Courier')
addMapping('Courier', 1, 0, 'Courier-Bold')
addMapping('Courier', 0, 1, 'Courier-Italic')
addMapping('Courier', 1, 1, 'Courier-Bold-Italic')
pdfmetrics.registerFont(TTFont('LinuxLibertine', os.path.join(font_dir, 'LinLibertine_Rah.ttf')))
pdfmetrics.registerFont(TTFont('LinuxLibertine-Bold', os.path.join(font_dir, 'LinLibertine_RBah.ttf')))
pdfmetrics.registerFont(TTFont('LinuxLibertine-Italic', os.path.join(font_dir, 'LinLibertine_RIah.ttf')))
pdfmetrics.registerFont(TTFont('LinuxLibertine-Bold-Italic', os.path.join(font_dir, 'LinLibertine_RBIah.ttf')))
addMapping('LinuxLibertine', 0, 0, 'LinuxLibertine')
addMapping('LinuxLibertine', 1, 0, 'LinuxLibertine-Bold')
addMapping('LinuxLibertine', 0, 1, 'LinuxLibertine-Italic')
addMapping('LinuxLibertine', 1, 1, 'LinuxLibertine-Bold-Italic')
pdfmetrics.registerFont(TTFont('Kochi-Mincho', os.path.join(font_dir, 'kochi-mincho-subst.ttf')))
pdfmetrics.registerFont(TTFont('Kochi-Gothic', os.path.join(font_dir, 'kochi-gothic-subst.ttf')))
alreadyRegistered = True


Expand Down
8 changes: 4 additions & 4 deletions indico/legacy/pdfinterface/latex.py
Expand Up @@ -9,12 +9,13 @@
import os
import subprocess
import tempfile
from importlib.resources import as_file
from importlib.resources import files as res_files
from io import BytesIO
from operator import attrgetter
from zipfile import ZipFile

import markdown
import pkg_resources
from flask import session
from flask.helpers import get_root_path
from jinja2 import Environment, FileSystemLoader, StrictUndefined
Expand Down Expand Up @@ -195,9 +196,8 @@ def prepare(self, template_name, **kwargs):
with codecs.open(source_filename, 'wb', encoding='utf-8') as f:
f.write(source)

distribution = pkg_resources.get_distribution('indico-fonts')
font_dir = os.path.join(distribution.location, 'indico_fonts')
os.symlink(font_dir, os.path.join(self.source_dir, 'fonts'))
with as_file(res_files('indico_fonts')) as font_dir:
os.symlink(font_dir, os.path.join(self.source_dir, 'fonts'))
return source_filename, target_filename

def run(self, template_name, **kwargs):
Expand Down
7 changes: 4 additions & 3 deletions indico/modules/core/controllers.py
Expand Up @@ -5,12 +5,13 @@
# modify it under the terms of the MIT License; see the
# LICENSE file for more details.

from importlib.metadata import PackageNotFoundError
from importlib.metadata import version as get_version
from urllib.parse import urljoin, urlsplit

import requests
from flask import current_app, flash, jsonify, redirect, request, session
from packaging.version import Version
from pkg_resources import DistributionNotFound, get_distribution
from pytz import common_timezones_set
from webargs import fields
from webargs.flaskparser import abort
Expand Down Expand Up @@ -170,8 +171,8 @@ def _check_version(self, distribution, current_version=None):
return None
if current_version is None:
try:
current_version = get_distribution(distribution).version
except DistributionNotFound:
current_version = get_version(distribution)
except PackageNotFoundError:
return None
current_version = Version(current_version)
if current_version.is_prerelease:
Expand Down
9 changes: 4 additions & 5 deletions indico/util/packaging.py
Expand Up @@ -6,20 +6,19 @@
# LICENSE file for more details.

import sys
from importlib.metadata import distribution
from importlib.util import find_spec
from pathlib import Path

import pkg_resources


def package_is_editable(package):
"""Check whether the Python package is installed in 'editable' mode."""
# based on pip.dist_is_editable
dist = pkg_resources.get_distribution(package)
dist = distribution(package)
ThiefMaster marked this conversation as resolved.
Show resolved Hide resolved
for path_item in sys.path:
if (Path(path_item) / f'{dist.project_name}.egg-link').is_file():
if (Path(path_item) / f'{dist.name}.egg-link').is_file():
return True
if any(Path(path_item).glob(f'__editable__.{dist.project_name}-*.pth')):
if any(Path(path_item).glob(f'__editable__.{dist.name}-*.pth')):
return True
return False

Expand Down