Skip to content

Commit

Permalink
Remove dependency on site_packages
Browse files Browse the repository at this point in the history
It is deprecated and the note says to move away when
Python 3.7 is dropped.

Seems like now ;)
  • Loading branch information
hmaarrfk committed Jul 10, 2024
1 parent c295479 commit c18257b
Show file tree
Hide file tree
Showing 8 changed files with 43 additions and 24 deletions.
12 changes: 9 additions & 3 deletions conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,11 +115,17 @@ def reset_conf_before_test():

# Restore completion clients default settings, since they
# don't have default values on the configuration.
from pkg_resources import iter_entry_points

# See compatibility note on `group` keyword:
# https://docs.python.org/3/library/importlib.metadata.html#entry-points
if sys.version_info < (3, 10): # pragma: no cover
from importlib_metadata import entry_points
else: # pragma: no cover
from importlib.metadata import entry_points

provider_configurations = {}
for entry_point in iter_entry_points(COMPLETION_ENTRYPOINT):
Provider = entry_point.resolve()
for entry_point in entry_points(group=COMPLETION_ENTRYPOINT):
Provider = entry_point.load()
provider_name = Provider.COMPLETION_PROVIDER_NAME

(provider_conf_version,
Expand Down
2 changes: 1 addition & 1 deletion install_dev_repos.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from pathlib import Path
from subprocess import check_output

from importlib_metadata import PackageNotFoundError, distribution
from importlib.metadata import PackageNotFoundError, distribution
from packaging.requirements import Requirement

# Remove current/script directory from sys.path[0] if added by the Python invocation,
Expand Down
2 changes: 2 additions & 0 deletions requirements/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,5 @@ dependencies:
- textdistance >=4.2.0
- three-merge >=0.1.1
- watchdog >=0.10.3
# Need at least some compatibility with python 3.10 features
- importlib-metadata >=4.6.0
3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,8 @@ def run(self):
'spyder-kernels>=2.5.2,<2.6.0',
'textdistance>=4.2.0',
'three-merge>=0.1.1',
'watchdog>=0.10.3'
'watchdog>=0.10.3',
'importlib_metadata>=4.8.3;python_version<"3.10"',
]

# Loosen constraints to ensure dev versions still work
Expand Down
27 changes: 15 additions & 12 deletions spyder/app/find_plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,17 @@
Plugin dependency solver.
"""

import sys
import importlib
import logging
import traceback

import pkg_resources
# See compatibility note on `group` keyword:
# https://docs.python.org/3/library/importlib.metadata.html#entry-points
if sys.version_info < (3, 10): # pragma: no cover
from importlib_metadata import entry_points
else: # pragma: no cover
from importlib.metadata import entry_points

from spyder.api.exceptions import SpyderAPIError
from spyder.api.plugins import Plugins
Expand All @@ -28,16 +34,15 @@ def find_internal_plugins():
"""
internal_plugins = {}

entry_points = list(pkg_resources.iter_entry_points("spyder.plugins"))
internal_names = get_class_values(Plugins)

for entry_point in entry_points:
for entry_point in entry_points(group="spyder.plugins"):
name = entry_point.name
if name not in internal_names:
continue

class_name = entry_point.attrs[0]
mod = importlib.import_module(entry_point.module_name)
class_name = entry_point.attr
mod = importlib.import_module(entry_point.module)
plugin_class = getattr(mod, class_name, None)
internal_plugins[name] = plugin_class

Expand All @@ -56,21 +61,19 @@ def find_external_plugins():
Find available external plugins based on setuptools entry points.
"""
internal_names = get_class_values(Plugins)
plugins = list(pkg_resources.iter_entry_points("spyder.plugins"))
external_plugins = {}

for entry_point in plugins:
for entry_point in entry_points(group="spyder.plugins"):
name = entry_point.name
if name not in internal_names:
try:
class_name = entry_point.attrs[0]
mod = importlib.import_module(entry_point.module_name)
class_name = entry_point.attr
mod = importlib.import_module(entry_point.module)
plugin_class = getattr(mod, class_name, None)

# To display in dependencies dialog.
plugin_class._spyder_module_name = entry_point.module_name
plugin_class._spyder_package_name = (
entry_point.dist.project_name)
plugin_class._spyder_module_name = entry_point.module
plugin_class._spyder_package_name = entry_point.dist.name
plugin_class._spyder_version = entry_point.dist.version

external_plugins[name] = plugin_class
Expand Down
13 changes: 10 additions & 3 deletions spyder/plugins/completion/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,23 @@
"""

# Standard library imports
import sys
import functools
import inspect
import logging
import os
from typing import List, Union
import weakref

# See compatibility note on `group` keyword:
# https://docs.python.org/3/library/importlib.metadata.html#entry-points
if sys.version_info < (3, 10): # pragma: no cover
from importlib_metadata import entry_points
else: # pragma: no cover
from importlib.metadata import entry_points

# Third-party imports
from packaging.version import parse
from pkg_resources import iter_entry_points
from qtpy.QtCore import QMutex, QMutexLocker, QTimer, Slot, Signal

# Local imports
Expand Down Expand Up @@ -234,7 +241,7 @@ def __init__(self, parent, configuration=None):

# Find and instantiate all completion providers registered via
# entrypoints
for entry_point in iter_entry_points(COMPLETION_ENTRYPOINT):
for entry_point in entry_points(group=COMPLETION_ENTRYPOINT):
try:
# This absolutely ensures that the Kite provider won't be
# loaded. For instance, it can happen when you have an older
Expand All @@ -243,7 +250,7 @@ def __init__(self, parent, configuration=None):
if 'kite' in entry_point.name:
continue
logger.debug(f'Loading entry point: {entry_point}')
Provider = entry_point.resolve()
Provider = entry_point.load()
self._instantiate_and_register_provider(Provider)
except Exception as e:
logger.warning('Failed to load completion provider from entry '
Expand Down
6 changes: 3 additions & 3 deletions spyder/utils/programs.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@

# Third party imports
from packaging.version import parse
import pkg_resources
import psutil

# Local imports
Expand Down Expand Up @@ -849,9 +848,10 @@ def get_package_version(package_name):
# When support for Python 3.7 and below is dropped, this can be replaced
# with the built-in importlib.metadata.version
try:
ver = pkg_resources.get_distribution(package_name).version
from importlib_metadata import version
ver = version(package_name)
return ver
except pkg_resources.DistributionNotFound:
except PackageNotFoundError:
return None


Expand Down
2 changes: 1 addition & 1 deletion spyder/utils/tests/test_programs.py
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,7 @@ def test_open_files_with_application(tmp_path):


def test_get_package_version():
# Primarily a test of pkg_resources/setuptools being installed properly
# Primarily a test of importlib.metadata being installed properly
assert get_package_version('IPython')
assert get_package_version('python_lsp_black')

Expand Down

0 comments on commit c18257b

Please sign in to comment.