diff --git a/sacred/dependencies.py b/sacred/dependencies.py index 8470c048..42eaa284 100644 --- a/sacred/dependencies.py +++ b/sacred/dependencies.py @@ -8,7 +8,7 @@ import sys from pathlib import Path -import pkg_resources +from importlib.metadata import distribution, distributions import sacred.optional as opt from sacred import SETTINGS @@ -226,7 +226,7 @@ "pickletools", "pip", "pipes", - "pkg_resources", + "importlib", "pkgutil", "platform", "plistlib", @@ -498,8 +498,11 @@ def __init__(self, name, version): def fill_missing_version(self): if self.version is not None: return - dist = pkg_resources.working_set.by_key.get(self.name) - self.version = dist.version if dist else None + try: + dist = distribution(self.name) + self.version = dist.version + except Exception: + self.version = None def to_json(self): return "{}=={}".format(self.name, self.version or "") @@ -524,11 +527,17 @@ def create(cls, mod): if not cls.modname_to_dist: # some packagenames don't match the module names (e.g. PyYAML) # so we set up a dict to map from module name to package name - for dist in pkg_resources.working_set: + for dist in distributions(): try: - toplevel_names = dist._get_metadata("top_level.txt") - for tln in toplevel_names: - cls.modname_to_dist[tln] = dist.project_name, dist.version + # Use read_text to get top_level.txt content + if dist.files: + for file in dist.files: + if str(file).endswith("top_level.txt"): + top_level_txt = file.read_text() + for tln in top_level_txt.strip().split("\n"): + if tln: + cls.modname_to_dist[tln] = (dist.name, dist.version) + break except Exception: pass @@ -701,7 +710,7 @@ def get_dependencies_from_imported_modules(globs, base_path): def get_dependencies_from_pkg(globs, base_path): dependencies = set() - for dist in pkg_resources.working_set: + for dist in distributions(): if dist.version == "0.0.0": continue # ugly hack to deal with pkg-resource version bug dependencies.add(PackageDependency(dist.project_name, dist.version)) diff --git a/sacred/observers/mongo.py b/sacred/observers/mongo.py index 7c6a90e9..018276dd 100644 --- a/sacred/observers/mongo.py +++ b/sacred/observers/mongo.py @@ -15,16 +15,15 @@ from sacred.observers.queue import QueueObserver from sacred.serializer import flatten from sacred.utils import ObserverError, PathType -import pkg_resources + +import importlib.resources as importlib_resources # type: ignore DEFAULT_MONGO_PRIORITY = 30 -# This ensures consistent mimetype detection across platforms. mimetype_detector = mimetypes.MimeTypes( - filenames=[pkg_resources.resource_filename("sacred", "data/mime.types")] + filenames=[importlib_resources.files("sacred").joinpath("data", "mime.types")] ) - def force_valid_bson_key(key): key = str(key) if key.startswith("$"): @@ -662,4 +661,4 @@ def __init__( ), interval=interval, retry_interval=retry_interval, - ) + ) \ No newline at end of file diff --git a/setup.py b/setup.py index 405e68df..5582084f 100755 --- a/setup.py +++ b/setup.py @@ -8,10 +8,11 @@ Intended Audience :: Science/Research Natural Language :: English Operating System :: OS Independent -Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 +Programming Language :: Python :: 3.12 +Programming Language :: Python :: 3.13 Topic :: Utilities Topic :: Scientific/Engineering Topic :: Scientific/Engineering :: Artificial Intelligence