From 5acd50add3a8a14a6a90ed47b6b1434ef833ab2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven!=20Ragnaro=CC=88k?= Date: Wed, 25 Jun 2025 12:01:19 -0700 Subject: [PATCH 01/15] Start converting bloom to importlib.metadata. --- bloom/__init__.py | 6 +++--- setup.py | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/bloom/__init__.py b/bloom/__init__.py index 6d917ab4..521c71c7 100755 --- a/bloom/__init__.py +++ b/bloom/__init__.py @@ -1,8 +1,8 @@ try: - import pkg_resources + import importlib.metadata try: - __version__ = pkg_resources.require("bloom")[0].version - except pkg_resources.DistributionNotFound: + __version__ = importlib.metadata.metadata("bloom").get("version") + except importlib.metadata.PackageNotFoundError: __version__ = 'unset' except (ImportError, OSError): __version__ = 'unset' diff --git a/setup.py b/setup.py index 476911b0..8512b4ff 100755 --- a/setup.py +++ b/setup.py @@ -21,6 +21,7 @@ 'catkin_pkg >= 0.4.3', 'setuptools', 'empy < 4', + 'importlib-metadata; python_version < "3.8"', 'packaging', 'python-dateutil', 'PyYAML', From e1aeb7aa0e1e53665ed4afebcf8775973a0e6eaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven!=20Ragnaro=CC=88k?= Date: Wed, 25 Jun 2025 14:20:06 -0700 Subject: [PATCH 02/15] Switch usage of pkg_resources to importlib.metadata. --- bloom/commands/generate.py | 6 +++--- bloom/commands/release.py | 4 ++-- bloom/generators/common.py | 6 +++--- test/utils/common.py | 10 ++++++++-- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/bloom/commands/generate.py b/bloom/commands/generate.py index 647fe8c4..901cd1f7 100644 --- a/bloom/commands/generate.py +++ b/bloom/commands/generate.py @@ -34,8 +34,8 @@ from __future__ import print_function import argparse +import importlib.metadata import sys -import pkg_resources from bloom.util import add_global_arguments from bloom.util import handle_global_arguments @@ -45,13 +45,13 @@ def list_generator_commands(): generators = [] - for entry_point in pkg_resources.iter_entry_points(group=BLOOM_GENERATE_CMDS_GROUP): + for entry_point in importlib.metadata.entry_points(group=BLOOM_GENERATE_CMDS_GROUP): generators.append(entry_point.name) return generators def load_generator_description(generator_name): - for entry_point in pkg_resources.iter_entry_points(group=BLOOM_GENERATE_CMDS_GROUP): + for entry_point in importlib.metadata.entry_points(group=BLOOM_GENERATE_CMDS_GROUP): if entry_point.name == generator_name: return entry_point.load() diff --git a/bloom/commands/release.py b/bloom/commands/release.py index 35837e00..6965b6dd 100644 --- a/bloom/commands/release.py +++ b/bloom/commands/release.py @@ -38,8 +38,8 @@ import atexit import datetime import difflib +import importlib.metadata import os -import pkg_resources import platform import shutil import subprocess @@ -865,7 +865,7 @@ def update_summary(track, repository, distro): bloom_v=bloom.__version__, catkin_pkg_v=catkin_pkg.__version__, # Until https://github.com/ros-infrastructure/rosdistro/issues/16 - rosdistro_v=pkg_resources.require("rosdistro")[0].version, + rosdistro_v=importlib.metadata.metadata("rosdistro").version, rosdep_v=rosdep2.__version__, vcstools_v=vcstools.__version__.version ) diff --git a/bloom/generators/common.py b/bloom/generators/common.py index 09ba51d9..63d71bb6 100644 --- a/bloom/generators/common.py +++ b/bloom/generators/common.py @@ -32,7 +32,7 @@ from __future__ import print_function -import pkg_resources +import importlib.metadata import sys import traceback @@ -63,13 +63,13 @@ def list_generators(): generators = [] - for entry_point in pkg_resources.iter_entry_points(group=BLOOM_GROUP): + for entry_point in importlib.metadata.entry_points(group=BLOOM_GROUP): generators.append(entry_point.name) return generators def load_generator(generator_name): - for entry_point in pkg_resources.iter_entry_points(group=BLOOM_GROUP): + for entry_point in importlib.metadata.entry_points(group=BLOOM_GROUP): if entry_point.name == generator_name: return entry_point.load() diff --git a/test/utils/common.py b/test/utils/common.py index 670da773..8ac6a832 100644 --- a/test/utils/common.py +++ b/test/utils/common.py @@ -196,7 +196,7 @@ def user_bloom(cmd, args=None, directory=None, auto_assert=True, assert type(args) in [list, tuple, str], \ "user_bloom args takes [list, tuple, str] only, got " + \ str(type(args)) - from pkg_resources import load_entry_point + from importlib.metadata import entry_points from bloom import __version__ as ver if not cmd.startswith('git-bloom-'): cmd = 'git-bloom-' + cmd @@ -206,7 +206,13 @@ def user_bloom(cmd, args=None, directory=None, auto_assert=True, args = list(args) with change_directory(directory if directory is not None else os.getcwd()): with redirected_stdio() as (out, err): - func = load_entry_point('bloom==' + ver, 'console_scripts', cmd) + # importlib can't filter entry points by distribution because they + # don't compare. So get all matching entry points and filter by + # distribution version and name after. + eps = [ep for ep in entry_points(group="console_scripts", name=cmd) + if ep.dist.version == ver and ep.dist.name == 'bloom'] + assert len(eps) == 1, f"Multiple entry points found for command '{cmd}'." + func = eps[0].load() try: with change_environ(env): ret = func(args) or 0 From 6a43ef3dfad633bd2a362fbd5ae27eae9217f08e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven!=20Ragnaro=CC=88k?= Date: Thu, 26 Jun 2025 11:46:50 -0700 Subject: [PATCH 03/15] Replace use of pkg_resources with importlib.resources. --- bloom/generators/rpm/generator.py | 13 +++++++------ setup.py | 1 + 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/bloom/generators/rpm/generator.py b/bloom/generators/rpm/generator.py index 66c8f3fe..043b8658 100644 --- a/bloom/generators/rpm/generator.py +++ b/bloom/generators/rpm/generator.py @@ -34,15 +34,15 @@ import collections import datetime +import importlib.resources import io import json import os -import pkg_resources import re import shutil import sys -import traceback import textwrap +import traceback from dateutil import tz from packaging.version import Version @@ -102,19 +102,20 @@ def __place_template_folder(group, src, dst, gbp=False): - template_files = pkg_resources.resource_listdir(group, src) + template_files = [os.path.basename(file) + for file in importlib.resources.files(f'{group}.{src.replace("/", ".")}').iterdir()] # For each template, place for template_file in template_files: template_path = os.path.join(src, template_file) template_dst = os.path.join(dst, template_file) - if pkg_resources.resource_isdir(group, template_path): + if importlib.resources.files(group).joinpath(template_path).is_dir(): debug("Recursing on folder '{0}'".format(template_path)) __place_template_folder(group, template_path, template_dst, gbp) else: try: debug("Placing template '{0}'".format(template_path)) - template = pkg_resources.resource_string(group, template_path) - template_abs_path = pkg_resources.resource_filename(group, template_path) + template = importlib.resources.files(group).joinpath(template_path).open().read() + template_abs_path = importlib.resources.files(group).joinpath(template_path) except IOError as err: error("Failed to load template " "'{0}': {1}".format(template_file, str(err)), exit=True) diff --git a/setup.py b/setup.py index 8512b4ff..1efcb363 100755 --- a/setup.py +++ b/setup.py @@ -22,6 +22,7 @@ 'setuptools', 'empy < 4', 'importlib-metadata; python_version < "3.8"', + 'importlib-resources; python_version < "3.8"', 'packaging', 'python-dateutil', 'PyYAML', From 2d691af6f8bcad356293787b4068bdede0c7e25b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven!=20Ragnaro=CC=88k?= Date: Sun, 29 Jun 2025 21:01:30 -0700 Subject: [PATCH 04/15] Replace pkg_resources with importlib resources. --- bloom/generators/debian/generator.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/bloom/generators/debian/generator.py b/bloom/generators/debian/generator.py index c1abe493..bbc606cc 100644 --- a/bloom/generators/debian/generator.py +++ b/bloom/generators/debian/generator.py @@ -34,10 +34,10 @@ import collections import datetime +import importlib.resources import io import json import os -import pkg_resources import re import shutil import sys @@ -126,7 +126,8 @@ def __place_template_folder(group, src, dst, gbp=False): - template_files = pkg_resources.resource_listdir(group, src) + template_files = [os.path.basename(file) + for file in importlib.resources.files(f'{group}.{src.replace("/", ".")}').iterdir()] # For each template, place for template_file in template_files: if not gbp and os.path.basename(template_file) == 'gbp.conf.em': @@ -134,14 +135,14 @@ def __place_template_folder(group, src, dst, gbp=False): continue template_path = os.path.join(src, template_file) template_dst = os.path.join(dst, template_file) - if pkg_resources.resource_isdir(group, template_path): + if importlib.resources.files(group).joinpath(template_path).is_dir(): debug("Recursing on folder '{0}'".format(template_path)) __place_template_folder(group, template_path, template_dst, gbp) else: try: debug("Placing template '{0}'".format(template_path)) - template = pkg_resources.resource_string(group, template_path) - template_abs_path = pkg_resources.resource_filename(group, template_path) + template = importlib.resources.files(group).joinpath(template_path).open().read() + template_abs_path = importlib.resources.files(group).joinpath(template_path) except IOError as err: error("Failed to load template " "'{0}': {1}".format(template_file, str(err)), exit=True) From 0a7172130b02e98a5e7618b416bc09730f66b836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven!=20Ragnaro=CC=88k?= Date: Sun, 29 Jun 2025 21:04:01 -0700 Subject: [PATCH 05/15] Add importlib-resources and importlib-metadata deb dependencies. --- stdeb.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdeb.cfg b/stdeb.cfg index d986283f..17b925ea 100755 --- a/stdeb.cfg +++ b/stdeb.cfg @@ -1,7 +1,7 @@ [DEFAULT] ; release with a high debinc to avoid conflict with upstream debian of the same release version Debian-Version: 100 -Depends3: python3-yaml, python3-empy, python3-packaging, python3-rosdep (>= 0.15.0), python3-rosdistro (>= 0.8.0), python3-vcstools (>= 0.1.22), python3-setuptools, python3-catkin-pkg (>= 0.4.3) +Depends3: python3-yaml, python3-empy, python3-packaging, python3-rosdep (>= 0.15.0), python3-rosdistro (>= 0.8.0), python3-vcstools (>= 0.1.22), python3-setuptools, python3-catkin-pkg (>= 0.4.3), python3 (>= 3.8) | python3-importlib-metadata, python3 (>= 3.8) | python3-importlib-resources Conflicts3: python-bloom Copyright-File: LICENSE.txt Suite3: focal jammy noble bookworm trixie From 00166b3653513ae7decc2dd84c516a6e7b3d251a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven!=20Ragnaro=CC=88k?= Date: Sun, 29 Jun 2025 21:37:45 -0700 Subject: [PATCH 06/15] Bump minimum python version to skip backport. Some APIs used were not introduced until 3.10 so use the backport unless we have it. --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 1efcb363..87abefbd 100755 --- a/setup.py +++ b/setup.py @@ -21,8 +21,8 @@ 'catkin_pkg >= 0.4.3', 'setuptools', 'empy < 4', - 'importlib-metadata; python_version < "3.8"', - 'importlib-resources; python_version < "3.8"', + 'importlib-metadata; python_version < "3.10"', + 'importlib-resources; python_version < "3.10"', 'packaging', 'python-dateutil', 'PyYAML', From 19c667b56f686a0f96b2cc01147addd433326a20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven!=20Ragnaro=CC=88k?= Date: Wed, 2 Jul 2025 12:18:00 -0700 Subject: [PATCH 07/15] Import backport module explicitly. The backport module does not implicitly shadow the standard library modules. APIs that we're using in bloom were only introduced in importlib_metadata 3.6 and 3.10 of the standard library. Thus to use this API we need to check our python version and use the backport module explicitly. --- bloom/commands/generate.py | 10 +++++++--- bloom/generators/common.py | 10 +++++++--- setup.py | 2 +- test/utils/common.py | 5 ++++- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/bloom/commands/generate.py b/bloom/commands/generate.py index 901cd1f7..e1f545ad 100644 --- a/bloom/commands/generate.py +++ b/bloom/commands/generate.py @@ -34,9 +34,13 @@ from __future__ import print_function import argparse -import importlib.metadata import sys +if sys.version_info[0:2] < (3, 10): + from importlib_metadata import entry_points +else: + from importlib.metadata import entry_points + from bloom.util import add_global_arguments from bloom.util import handle_global_arguments @@ -45,13 +49,13 @@ def list_generator_commands(): generators = [] - for entry_point in importlib.metadata.entry_points(group=BLOOM_GENERATE_CMDS_GROUP): + for entry_point in entry_points(group=BLOOM_GENERATE_CMDS_GROUP): generators.append(entry_point.name) return generators def load_generator_description(generator_name): - for entry_point in importlib.metadata.entry_points(group=BLOOM_GENERATE_CMDS_GROUP): + for entry_point in entry_points(group=BLOOM_GENERATE_CMDS_GROUP): if entry_point.name == generator_name: return entry_point.load() diff --git a/bloom/generators/common.py b/bloom/generators/common.py index 63d71bb6..9ce155b1 100644 --- a/bloom/generators/common.py +++ b/bloom/generators/common.py @@ -32,10 +32,14 @@ from __future__ import print_function -import importlib.metadata import sys import traceback +if sys.version_info[0:2] < (3, 10): + from importlib_metadata import entry_points +else: + from importlib.metadata import entry_points + from bloom.logging import debug from bloom.logging import error from bloom.logging import info @@ -63,13 +67,13 @@ def list_generators(): generators = [] - for entry_point in importlib.metadata.entry_points(group=BLOOM_GROUP): + for entry_point in entry_points(group=BLOOM_GROUP): generators.append(entry_point.name) return generators def load_generator(generator_name): - for entry_point in importlib.metadata.entry_points(group=BLOOM_GROUP): + for entry_point in entry_points(group=BLOOM_GROUP): if entry_point.name == generator_name: return entry_point.load() diff --git a/setup.py b/setup.py index 87abefbd..9f423206 100755 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ 'catkin_pkg >= 0.4.3', 'setuptools', 'empy < 4', - 'importlib-metadata; python_version < "3.10"', + 'importlib-metadata >= 3.6; python_version < "3.10"', 'importlib-resources; python_version < "3.10"', 'packaging', 'python-dateutil', diff --git a/test/utils/common.py b/test/utils/common.py index 8ac6a832..dd9f6b25 100644 --- a/test/utils/common.py +++ b/test/utils/common.py @@ -196,7 +196,10 @@ def user_bloom(cmd, args=None, directory=None, auto_assert=True, assert type(args) in [list, tuple, str], \ "user_bloom args takes [list, tuple, str] only, got " + \ str(type(args)) - from importlib.metadata import entry_points + if sys.version_info[0:2] < (3, 10): + from importlib_metadata import entry_points + else: + from importlib.metadata import entry_points from bloom import __version__ as ver if not cmd.startswith('git-bloom-'): cmd = 'git-bloom-' + cmd From 5fc27367b4d868021be31f06527870f0003b0afe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven!=20Ragnaro=CC=88k?= Date: Wed, 2 Jul 2025 12:24:07 -0700 Subject: [PATCH 08/15] Reflect minimum importlib_metadata version in stdeb.cfg. This requirement is met by jammy and noble but _not_ focal which includes python 3.8 and importlib-metadata 1.5. Therefore, to release this PR we'll need to drop support for focal. --- stdeb.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdeb.cfg b/stdeb.cfg index 17b925ea..012769a1 100755 --- a/stdeb.cfg +++ b/stdeb.cfg @@ -1,7 +1,7 @@ [DEFAULT] ; release with a high debinc to avoid conflict with upstream debian of the same release version Debian-Version: 100 -Depends3: python3-yaml, python3-empy, python3-packaging, python3-rosdep (>= 0.15.0), python3-rosdistro (>= 0.8.0), python3-vcstools (>= 0.1.22), python3-setuptools, python3-catkin-pkg (>= 0.4.3), python3 (>= 3.8) | python3-importlib-metadata, python3 (>= 3.8) | python3-importlib-resources +Depends3: python3-yaml, python3-empy, python3-packaging, python3-rosdep (>= 0.15.0), python3-rosdistro (>= 0.8.0), python3-vcstools (>= 0.1.22), python3-setuptools, python3-catkin-pkg (>= 0.4.3), python3 (>= 3.8) | python3-importlib-metadata (>= 3.6), python3 (>= 3.8) | python3-importlib-resources Conflicts3: python-bloom Copyright-File: LICENSE.txt Suite3: focal jammy noble bookworm trixie From a8265b9dcb1de41bc9ee72bd0065c1040323c96c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven!=20Ragnaro=CC=88k?= Date: Wed, 2 Jul 2025 13:08:35 -0700 Subject: [PATCH 09/15] Fix import order. --- bloom/commands/generate.py | 6 +++--- bloom/generators/common.py | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/bloom/commands/generate.py b/bloom/commands/generate.py index e1f545ad..9e1c3df8 100644 --- a/bloom/commands/generate.py +++ b/bloom/commands/generate.py @@ -36,14 +36,14 @@ import argparse import sys +from bloom.util import add_global_arguments +from bloom.util import handle_global_arguments + if sys.version_info[0:2] < (3, 10): from importlib_metadata import entry_points else: from importlib.metadata import entry_points -from bloom.util import add_global_arguments -from bloom.util import handle_global_arguments - BLOOM_GENERATE_CMDS_GROUP = 'bloom.generate_cmds' diff --git a/bloom/generators/common.py b/bloom/generators/common.py index 9ce155b1..4d02618c 100644 --- a/bloom/generators/common.py +++ b/bloom/generators/common.py @@ -35,11 +35,6 @@ import sys import traceback -if sys.version_info[0:2] < (3, 10): - from importlib_metadata import entry_points -else: - from importlib.metadata import entry_points - from bloom.logging import debug from bloom.logging import error from bloom.logging import info @@ -61,6 +56,11 @@ debug(traceback.format_exc()) error("rosdep was not detected, please install it.", exit=True) +if sys.version_info[0:2] < (3, 10): + from importlib_metadata import entry_points +else: + from importlib.metadata import entry_points + BLOOM_GROUP = 'bloom.generators' DEFAULT_ROS_DISTRO = 'indigo' From 87f42370bf252a398dd817e4a9fb7c84a482df82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven!=20Ragnaro=CC=88k?= Date: Wed, 2 Jul 2025 13:25:56 -0700 Subject: [PATCH 10/15] Use backport module explicitly. The backport module for importlib_resources doesn't shadow the standard library import.resources thus we need to import conditionally based on the current Python / standard library version. --- bloom/generators/debian/generator.py | 15 ++++++++++----- bloom/generators/rpm/generator.py | 14 +++++++++----- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/bloom/generators/debian/generator.py b/bloom/generators/debian/generator.py index bbc606cc..8d998e91 100644 --- a/bloom/generators/debian/generator.py +++ b/bloom/generators/debian/generator.py @@ -34,7 +34,6 @@ import collections import datetime -import importlib.resources import io import json import os @@ -89,6 +88,12 @@ from bloom.util import get_rfc_2822_date from bloom.util import maybe_continue +if sys.version_info[0:2] < (3, 10): + import importlib_resources +else: + import importlib.resources as importlib_resources + + try: from catkin_pkg.changelog import get_changelog_from_path from catkin_pkg.changelog import CHANGELOG_FILENAME @@ -127,7 +132,7 @@ def __place_template_folder(group, src, dst, gbp=False): template_files = [os.path.basename(file) - for file in importlib.resources.files(f'{group}.{src.replace("/", ".")}').iterdir()] + for file in importlib_resources.files(f'{group}.{src.replace("/", ".")}').iterdir()] # For each template, place for template_file in template_files: if not gbp and os.path.basename(template_file) == 'gbp.conf.em': @@ -135,14 +140,14 @@ def __place_template_folder(group, src, dst, gbp=False): continue template_path = os.path.join(src, template_file) template_dst = os.path.join(dst, template_file) - if importlib.resources.files(group).joinpath(template_path).is_dir(): + if importlib_resources.files(group).joinpath(template_path).is_dir(): debug("Recursing on folder '{0}'".format(template_path)) __place_template_folder(group, template_path, template_dst, gbp) else: try: debug("Placing template '{0}'".format(template_path)) - template = importlib.resources.files(group).joinpath(template_path).open().read() - template_abs_path = importlib.resources.files(group).joinpath(template_path) + template = importlib_resources.files(group).joinpath(template_path).open().read() + template_abs_path = importlib_resources.files(group).joinpath(template_path) except IOError as err: error("Failed to load template " "'{0}': {1}".format(template_file, str(err)), exit=True) diff --git a/bloom/generators/rpm/generator.py b/bloom/generators/rpm/generator.py index 043b8658..00b51e49 100644 --- a/bloom/generators/rpm/generator.py +++ b/bloom/generators/rpm/generator.py @@ -34,7 +34,6 @@ import collections import datetime -import importlib.resources import io import json import os @@ -83,6 +82,11 @@ from bloom.util import execute_command from bloom.util import maybe_continue +if sys.version_info[0:2] < (3, 10): + import importlib_resources +else: + import importlib.resources as importlib_resources + try: import rosdistro except ImportError as err: @@ -103,19 +107,19 @@ def __place_template_folder(group, src, dst, gbp=False): template_files = [os.path.basename(file) - for file in importlib.resources.files(f'{group}.{src.replace("/", ".")}').iterdir()] + for file in importlib_resources.files(f'{group}.{src.replace("/", ".")}').iterdir()] # For each template, place for template_file in template_files: template_path = os.path.join(src, template_file) template_dst = os.path.join(dst, template_file) - if importlib.resources.files(group).joinpath(template_path).is_dir(): + if importlib_resources.files(group).joinpath(template_path).is_dir(): debug("Recursing on folder '{0}'".format(template_path)) __place_template_folder(group, template_path, template_dst, gbp) else: try: debug("Placing template '{0}'".format(template_path)) - template = importlib.resources.files(group).joinpath(template_path).open().read() - template_abs_path = importlib.resources.files(group).joinpath(template_path) + template = importlib_resources.files(group).joinpath(template_path).open().read() + template_abs_path = importlib_resources.files(group).joinpath(template_path) except IOError as err: error("Failed to load template " "'{0}': {1}".format(template_file, str(err)), exit=True) From 46ba66bc9ac0b1589f4fba09d0c4e51525f5d27d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven!=20Ragnaro=CC=88k?= Date: Wed, 2 Jul 2025 13:40:32 -0700 Subject: [PATCH 11/15] Conditionally import backport module. --- bloom/__init__.py | 11 ++++++++--- bloom/commands/release.py | 9 +++++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/bloom/__init__.py b/bloom/__init__.py index 521c71c7..605797f2 100755 --- a/bloom/__init__.py +++ b/bloom/__init__.py @@ -1,8 +1,13 @@ +import sys + try: - import importlib.metadata + if sys.version_info[0:2] < (3, 10): + import importlib_metadata + else: + import importlib.metadata as importlib_metadata try: - __version__ = importlib.metadata.metadata("bloom").get("version") - except importlib.metadata.PackageNotFoundError: + __version__ = importlib_metadata.metadata("bloom").get("version") + except importlib_metadata.PackageNotFoundError: __version__ = 'unset' except (ImportError, OSError): __version__ = 'unset' diff --git a/bloom/commands/release.py b/bloom/commands/release.py index 6965b6dd..65fe467b 100644 --- a/bloom/commands/release.py +++ b/bloom/commands/release.py @@ -38,7 +38,6 @@ import atexit import datetime import difflib -import importlib.metadata import os import platform import shutil @@ -49,6 +48,12 @@ import webbrowser import yaml +if sys.version_info[0:2] < (3, 10): + import importlib_metadata +else: + import importlib.metadata as importlib_metadata + + # python2/3 compatibility try: from urllib.error import HTTPError, URLError @@ -865,7 +870,7 @@ def update_summary(track, repository, distro): bloom_v=bloom.__version__, catkin_pkg_v=catkin_pkg.__version__, # Until https://github.com/ros-infrastructure/rosdistro/issues/16 - rosdistro_v=importlib.metadata.metadata("rosdistro").version, + rosdistro_v=importlib_metadata.metadata("rosdistro").version, rosdep_v=rosdep2.__version__, vcstools_v=vcstools.__version__.version ) From a93c0231f21a6fbb0173af7a63223eff17de8b62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven!=20Ragnaro=CC=88k?= Date: Wed, 2 Jul 2025 13:45:26 -0700 Subject: [PATCH 12/15] Fix dependency version constraints. --- setup.py | 2 +- stdeb.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 9f423206..cf7aa1e5 100755 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ 'setuptools', 'empy < 4', 'importlib-metadata >= 3.6; python_version < "3.10"', - 'importlib-resources; python_version < "3.10"', + 'importlib-resources >= 5; python_version < "3.10"', 'packaging', 'python-dateutil', 'PyYAML', diff --git a/stdeb.cfg b/stdeb.cfg index 012769a1..53b8d324 100755 --- a/stdeb.cfg +++ b/stdeb.cfg @@ -1,7 +1,7 @@ [DEFAULT] ; release with a high debinc to avoid conflict with upstream debian of the same release version Debian-Version: 100 -Depends3: python3-yaml, python3-empy, python3-packaging, python3-rosdep (>= 0.15.0), python3-rosdistro (>= 0.8.0), python3-vcstools (>= 0.1.22), python3-setuptools, python3-catkin-pkg (>= 0.4.3), python3 (>= 3.8) | python3-importlib-metadata (>= 3.6), python3 (>= 3.8) | python3-importlib-resources +Depends3: python3-yaml, python3-empy, python3-packaging, python3-rosdep (>= 0.15.0), python3-rosdistro (>= 0.8.0), python3-vcstools (>= 0.1.22), python3-setuptools, python3-catkin-pkg (>= 0.4.3), python3 (>= 3.10) | python3-importlib-metadata (>= 3.6), python3 (>= 3.10) | python3-importlib-resources (>= 5.0) Conflicts3: python-bloom Copyright-File: LICENSE.txt Suite3: focal jammy noble bookworm trixie From 3457fef9d98da07ce670594775f66137eb6960ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven!=20Ragnaro=CC=88k?= Date: Wed, 2 Jul 2025 13:49:04 -0700 Subject: [PATCH 13/15] pep8 --- bloom/commands/release.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/bloom/commands/release.py b/bloom/commands/release.py index 65fe467b..42d034fb 100644 --- a/bloom/commands/release.py +++ b/bloom/commands/release.py @@ -48,12 +48,6 @@ import webbrowser import yaml -if sys.version_info[0:2] < (3, 10): - import importlib_metadata -else: - import importlib.metadata as importlib_metadata - - # python2/3 compatibility try: from urllib.error import HTTPError, URLError @@ -144,6 +138,11 @@ from catkin_pkg.changelog import get_changelog_from_path +if sys.version_info[0:2] < (3, 10): + import importlib_metadata +else: + import importlib.metadata as importlib_metadata + _repositories = {} _success = get_success_prefix() From 5537c656631fc74047f35c5227f8a0ce9184e664 Mon Sep 17 00:00:00 2001 From: Scott K Logan Date: Tue, 10 Feb 2026 14:18:08 -0600 Subject: [PATCH 14/15] Handle missing version number on rosdistro package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Timo Röhling --- bloom/commands/release.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bloom/commands/release.py b/bloom/commands/release.py index 42d034fb..4c83d104 100644 --- a/bloom/commands/release.py +++ b/bloom/commands/release.py @@ -869,7 +869,7 @@ def update_summary(track, repository, distro): bloom_v=bloom.__version__, catkin_pkg_v=catkin_pkg.__version__, # Until https://github.com/ros-infrastructure/rosdistro/issues/16 - rosdistro_v=importlib_metadata.metadata("rosdistro").version, + rosdistro_v=importlib_metadata.metadata("rosdistro").get("version"), rosdep_v=rosdep2.__version__, vcstools_v=vcstools.__version__.version ) From 461d3cc64fa5a1ec7e506fb86dafd6ba6c4ff8ed Mon Sep 17 00:00:00 2001 From: Scott K Logan Date: Tue, 10 Feb 2026 14:19:54 -0600 Subject: [PATCH 15/15] Drop dependency on setuptools --- setup.py | 1 - stdeb.cfg | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 5639c111..80b8f63d 100755 --- a/setup.py +++ b/setup.py @@ -18,7 +18,6 @@ }, install_requires=[ 'catkin_pkg >= 0.4.3', - 'setuptools < 82', 'empy', 'importlib-metadata >= 3.6; python_version < "3.10"', 'importlib-resources >= 5; python_version < "3.10"', diff --git a/stdeb.cfg b/stdeb.cfg index e07ed08c..82e1210e 100755 --- a/stdeb.cfg +++ b/stdeb.cfg @@ -1,7 +1,7 @@ [DEFAULT] ; release with a high debinc to avoid conflict with upstream debian of the same release version Debian-Version: 100 -Depends3: python3-yaml, python3-empy, python3-packaging, python3-rosdep (>= 0.15.0), python3-rosdistro (>= 0.8.0), python3-vcstools (>= 0.1.22), python3-setuptools (< 82), python3-catkin-pkg (>= 0.4.3), python3 (>= 3.10) | python3-importlib-metadata (>= 3.6), python3 (>= 3.10) | python3-importlib-resources (>= 5.0) +Depends3: python3-yaml, python3-empy, python3-packaging, python3-rosdep (>= 0.15.0), python3-rosdistro (>= 0.8.0), python3-vcstools (>= 0.1.22), python3-catkin-pkg (>= 0.4.3), python3 (>= 3.10) | python3-importlib-metadata (>= 3.6), python3 (>= 3.10) | python3-importlib-resources (>= 5.0) Conflicts3: python-bloom Copyright-File: LICENSE.txt Suite3: focal jammy noble bookworm trixie