Skip to content

Commit 97d0858

Browse files
authored
Merge pull request #6655 from ales-erjavec/remove-pkg-resources
[ENH] Remove use of pkg_resources
2 parents ef3f598 + 3550262 commit 97d0858

File tree

13 files changed

+64
-61
lines changed

13 files changed

+64
-61
lines changed

Orange/canvas/__main__.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
from collections import defaultdict
1616
from datetime import date
1717
from urllib.request import urlopen, Request
18+
from packaging.version import Version
1819

19-
import pkg_resources
2020
import yaml
2121

2222
from AnyQt.QtGui import QColor, QDesktopServices, QIcon, QPalette
@@ -101,9 +101,8 @@ def run(self):
101101
self.resultReady.emit(contents)
102102

103103
def compare_versions(latest):
104-
version = pkg_resources.parse_version
105104
skipped = settings.value('startup/latest-skipped-version', "", type=str)
106-
if version(latest) <= version(current) or \
105+
if Version(latest) <= Version(current) or \
107106
latest == skipped:
108107
return
109108

@@ -187,8 +186,6 @@ def pull_notifications():
187186
if not check_notifs:
188187
return None
189188

190-
Version = pkg_resources.parse_version
191-
192189
# create settings_dict for notif requirements purposes (read-only)
193190
spec = canvasconfig.spec + config.spec
194191
settings_dict = canvasconfig.Settings(defaults=spec, store=settings)
@@ -198,7 +195,7 @@ def pull_notifications():
198195
if ep.dist is not None]
199196
installed = defaultdict(lambda: "-1")
200197
for addon in installed_list:
201-
installed[addon.project_name] = addon.version
198+
installed[addon.name] = addon.version
202199

203200
# get set of already displayed notification IDs, stored in settings["notifications/displayed"]
204201
displayedIDs = literal_eval(settings.value("notifications/displayed", "set()", str))

Orange/canvas/config.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
Orange Canvas Configuration
33
44
"""
5+
import pkgutil
6+
57
import random
68
import uuid
79
import warnings
@@ -11,15 +13,16 @@
1113
from typing import Dict, Any, Optional, Iterable, List
1214

1315
import packaging.version
14-
import pkg_resources
1516
import requests
1617

1718
from AnyQt.QtGui import (
18-
QPainter, QFont, QFontMetrics, QColor, QPixmap, QIcon, QGuiApplication
19+
QPainter, QFont, QFontMetrics, QColor, QImage, QPixmap, QIcon,
20+
QGuiApplication
1921
)
2022
from AnyQt.QtCore import Qt, QPoint, QRect, QSettings
2123

2224
from orangecanvas import config as occonfig
25+
from orangecanvas.config import entry_points, EntryPoint
2326
from orangecanvas.utils.settings import config_slot
2427
from orangewidget.workflow import config
2528
from orangewidget.settings import set_widget_settings_dir_components
@@ -61,6 +64,11 @@
6164
spec = [config_slot(*t) for t in spec]
6265

6366

67+
def _pixmap_from_pkg_data(package, path, format):
68+
contents = pkgutil.get_data(package, path)
69+
return QPixmap.fromImage(QImage.fromData(contents, format))
70+
71+
6472
class Config(config.Config):
6573
"""
6674
Orange application configuration
@@ -96,17 +104,16 @@ def application_icon():
96104
"""
97105
Return the main application icon.
98106
"""
99-
path = pkg_resources.resource_filename(
100-
__name__, "icons/orange-256.png"
107+
return QIcon(
108+
_pixmap_from_pkg_data(__package__, "icons/orange-256.png", "png")
101109
)
102-
return QIcon(path)
103110

104111
@staticmethod
105112
def splash_screen():
106113
splash_n = random.randint(1, 3)
107-
path = pkg_resources.resource_filename(
108-
__name__, f"icons/orange-splash-screen-{splash_n:02}.png")
109-
pm = QPixmap(path)
114+
pm = _pixmap_from_pkg_data(
115+
__name__, f"icons/orange-splash-screen-{splash_n:02}.png", "png"
116+
)
110117

111118
version = Config.ApplicationVersion
112119
if version:
@@ -138,9 +145,9 @@ def widgets_entry_points():
138145
# Ensure the 'this' distribution's ep is the first. iter_entry_points
139146
# yields them in unspecified order.
140147
all_eps = sorted(
141-
pkg_resources.iter_entry_points(WIDGETS_ENTRY),
148+
entry_points(group=WIDGETS_ENTRY),
142149
key=lambda ep:
143-
0 if ep.dist.project_name.lower() == "orange3" else 1
150+
0 if ep.dist.name.lower() == "orange3" else 1
144151
)
145152
return iter(all_eps)
146153

@@ -173,18 +180,18 @@ def core_packages():
173180

174181
@staticmethod
175182
def examples_entry_points():
176-
# type: () -> Iterable[pkg_resources.EntryPoint]
183+
# type: () -> Iterable[EntryPoint]
177184
"""
178185
Return an iterator over the entry points yielding 'Example Workflows'
179186
"""
180187
# `iter_entry_points` yields them in unspecified order, so we order
181188
# them by name. The default is at the beginning, unless another
182189
# entrypoint precedes it alphabetically (e.g. starting with '!').
183-
default_ep = pkg_resources.EntryPoint(
184-
"000-Orange3", "Orange.canvas.workflows",
185-
dist=pkg_resources.get_distribution("Orange3"))
190+
default_ep = EntryPoint(
191+
"000-Orange3", "Orange.canvas.workflows", "orange.widgets.tutorials",
192+
)
186193

187-
all_ep = list(pkg_resources.iter_entry_points("orange.widgets.tutorials"))
194+
all_ep = list(entry_points(group="orange.widgets.tutorials"))
188195
all_ep.append(default_ep)
189196
all_ep.sort(key=lambda x: x.name)
190197
return iter(all_ep)

Orange/tests/test_third_party.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
from unittest import TestCase
22

3-
from pkg_resources import parse_version
3+
from packaging.version import Version
44

55

66
class TestPkgResources(TestCase):
77
def test_parse_version(self):
8-
self.assertGreater(parse_version('3.4.1'), parse_version('3.4.0'))
9-
self.assertGreater(parse_version('3.4.1'), parse_version('3.4.dev'))
10-
self.assertGreater(parse_version('3.4.1'), parse_version('3.4.1.dev'))
11-
self.assertLess(parse_version('3.4.1'), parse_version('3.4.2.dev'))
8+
self.assertGreater(Version('3.4.1'), Version('3.4.0'))
9+
self.assertGreater(Version('3.4.1'), Version('3.4.dev'))
10+
self.assertGreater(Version('3.4.1'), Version('3.4.1.dev'))
11+
self.assertLess(Version('3.4.1'), Version('3.4.2.dev'))

Orange/util.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
import datetime
77
import math
88
import functools
9+
import importlib.resources
910
from contextlib import contextmanager
11+
from importlib.metadata import distribution
1012
from typing import TYPE_CHECKING, Callable, Union, Optional
1113
from weakref import WeakKeyDictionary
12-
13-
import pkg_resources
1414
from enum import Enum as _Enum
1515
from functools import wraps, partial
1616
from operator import attrgetter
@@ -115,20 +115,18 @@ def resource_filename(path):
115115
"""
116116
Return the resource filename path relative to the Orange package.
117117
"""
118-
return pkg_resources.resource_filename("Orange", path)
118+
path = importlib.resources.files("Orange").joinpath(path)
119+
return str(path)
119120

120121

121122
def get_entry_point(dist, group, name):
122123
"""
123124
Load and return the entry point from the distribution.
124-
125-
Unlike `pkg_resources.load_entry_point`, this function does not check
126-
for requirements. Calling this function is preferred because of developers
127-
who experiment with different versions and have inconsistent configurations.
128125
"""
129-
dist = pkg_resources.get_distribution(dist)
130-
ep = dist.get_entry_info(group, name)
131-
return ep.resolve()
126+
dist = distribution(dist)
127+
eps = dist.entry_points.select(group=group, name=name)
128+
ep = next(iter(eps))
129+
return ep.load()
132130

133131

134132
def deprecated(obj):

Orange/widgets/__init__.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,16 @@
44
import os
55
import sysconfig
66

7-
import pkg_resources
8-
97
from orangecanvas.registry import CategoryDescription
108
from orangecanvas.registry.utils import category_from_package_globals
9+
from orangecanvas.utils.pkgmeta import get_distribution
1110
import orangewidget.workflow.discovery
1211

1312

1413
# Entry point for main Orange categories/widgets discovery
1514
def widget_discovery(discovery):
1615
# type: (orangewidget.workflow.discovery.WidgetDiscovery) -> None
17-
dist = pkg_resources.get_distribution("Orange3")
16+
dist = get_distribution("Orange3")
1817
pkgs = [
1918
"Orange.widgets.data",
2019
"Orange.widgets.visualize",

Orange/widgets/data/owpreprocess.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from collections import OrderedDict
2-
import pkg_resources
2+
import importlib.resources
33

44
import numpy
55

@@ -993,7 +993,8 @@ def __init__(self, name, qualname, category, description, viewclass):
993993

994994

995995
def icon_path(basename):
996-
return pkg_resources.resource_filename(__name__, "icons/" + basename)
996+
path = importlib.resources.files(__package__).joinpath("icons/" + basename)
997+
return str(path)
997998

998999

9991000
PREPROCESS_ACTIONS = [

Orange/widgets/tests/test_workflows.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
from os import listdir, environ
33
from os.path import isfile, join, dirname
44
import unittest
5-
import pkg_resources
5+
from unittest import mock
66

77
from AnyQt.QtTest import QTest
88

99
from orangecanvas.registry import WidgetRegistry
10+
from orangecanvas.config import EntryPoint
1011
from orangewidget.workflow import widgetsscheme
1112

1213
from Orange.canvas.config import Config
@@ -63,17 +64,17 @@ def test_scheme_examples(self):
6364
QTest.qWait(0)
6465

6566
def test_examples_order(self):
66-
# register test entrypoints
67-
dist_orange = pkg_resources.working_set.by_key['orange3']
68-
ep_map = dist_orange.get_entry_map()
69-
ep_first = pkg_resources.EntryPoint('!Testname', 'orangecontrib.any_addon.tutorials')
70-
ep_last = pkg_resources.EntryPoint('exampletutorials', 'orangecontrib.other_addon.tutorials')
71-
ep_map['orange.widgets.tutorials'] = {ep_first.name: ep_first, ep_last.name: ep_last}
67+
ep_first = EntryPoint(
68+
'!Testname', 'orangecontrib.any_addon.tutorials', '')
69+
ep_last = EntryPoint(
70+
'exampletutorials', 'orangecontrib.other_addon.tutorials', '')
7271

73-
ep_names = [point.name for point in Config.examples_entry_points()]
72+
def entry_points(*_, **__):
73+
return ep_first, ep_last
74+
75+
with mock.patch("Orange.canvas.config.entry_points", entry_points):
76+
ep_names = [point.name for point in Config.examples_entry_points()]
7477
self.assertLess(ep_names.index(ep_first.name),
7578
ep_names.index("000-Orange3"))
7679
self.assertLess(ep_names.index("000-Orange3"),
7780
ep_names.index(ep_last.name))
78-
79-
del ep_map['orange.widgets.tutorials']

conda-recipe/meta.yaml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ requirements:
3737
run:
3838
- python
3939
# GUI requirements
40-
- orange-canvas-core >=0.1.30,<0.2a
41-
- orange-widget-base >=4.22.0
40+
- orange-canvas-core >=0.2.0,<0.3a
41+
- orange-widget-base >=4.23.0
4242
- anyqt >=0.2.0
4343
- pyqt >=5.12,!=5.15.1,<6.0
4444
- matplotlib-base >=3.2.0
@@ -66,7 +66,6 @@ requirements:
6666
- requests
6767
- scikit-learn >=1.3.0
6868
- scipy >=1.9
69-
- serverfiles
7069
- setuptools >=51.0.0
7170
- xgboost >=1.7.4
7271
- xlsxwriter

i18n/si.jaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,8 +364,10 @@ canvas/config.py:
364364
canvas_settings_dir: false
365365
def `application_icon`:
366366
icons/orange-256.png: false
367+
png: false
367368
def `splash_screen`:
368369
icons/orange-splash-screen-{splash_n:02}.png: false
370+
png: false
369371
.: false
370372
Helvetica: false
371373
'#000000': false

pylintrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,4 +332,4 @@ int-import-graph=
332332
overgeneral-exceptions=builtins.Exception
333333

334334
[isort]
335-
known-standard-library=pkg_resources
335+
known-standard-library=

0 commit comments

Comments
 (0)