Skip to content

Commit

Permalink
Improve reusability in colcon_ros.package_identification.ros (#160)
Browse files Browse the repository at this point in the history
- Expose public functions for performing package augmentation
- Ensure dependency categories are set on descriptors even when those
  categories are empty (to align with colcon_core)
  • Loading branch information
cottsay authored Jun 13, 2024
1 parent d4fe6ba commit 44cc291
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 48 deletions.
118 changes: 72 additions & 46 deletions colcon_ros/package_identification/ros.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,40 +73,11 @@ def augment_package( # noqa: D102
if not desc.type.startswith('ros.'):
return

pkg, build_type = get_package_with_build_type(str(desc.path))
pkg, _ = get_package_with_build_type(str(desc.path))
if not pkg:
return

desc.metadata['version'] = pkg.version

# get dependencies
for d in pkg.build_depends + pkg.buildtool_depends:
assert d.evaluated_condition is not None
if d.evaluated_condition:
desc.dependencies['build'].add(DependencyDescriptor(
d.name, metadata=_create_metadata(d)))

for d in (
pkg.build_export_depends +
pkg.buildtool_export_depends +
pkg.exec_depends
):
assert d.evaluated_condition is not None
if d.evaluated_condition:
desc.dependencies['run'].add(DependencyDescriptor(
d.name, metadata=_create_metadata(d)))

for d in pkg.test_depends:
assert d.evaluated_condition is not None
if d.evaluated_condition:
desc.dependencies['test'].add(DependencyDescriptor(
d.name, metadata=_create_metadata(d)))

# get any maintainers which list an E-mail address
maintainers = [str(m) for m in pkg.maintainers if m.email]
if maintainers:
desc.metadata.setdefault('maintainers', [])
desc.metadata['maintainers'] += maintainers
augment_package(desc, pkg)

def augment_packages( # noqa: D102
self, descs, *, additional_argument_names=None
Expand All @@ -124,22 +95,68 @@ def augment_packages( # noqa: D102
if pkg:
pkgs[pkg] = desc

metadata = {
'origin': 'ros',
}
add_group_dependencies(pkgs)


def augment_package(desc, pkg):
"""
Augment a package descriptor based on data from a parsed package manifest.
# resolve group members and add them to the descriptor dependencies
for pkg, desc in pkgs.items():
for group_depend in pkg.group_depends:
assert group_depend.evaluated_condition is not None
if not group_depend.evaluated_condition:
continue
group_depend.extract_group_members(pkgs)
for name in group_depend.members:
desc.dependencies['build'].add(DependencyDescriptor(
name, metadata=metadata))
desc.dependencies['run'].add(DependencyDescriptor(
name, metadata=metadata))
:param desc: The package descriptor
:param pkg: The parsed package manifest
"""
desc.metadata['version'] = pkg.version

# get dependencies
desc.dependencies['build'].update(
_enumerate_dependency_descriptors(
pkg.build_depends +
pkg.buildtool_depends
))

desc.dependencies['run'].update(
_enumerate_dependency_descriptors(
pkg.build_export_depends +
pkg.buildtool_export_depends +
pkg.exec_depends
))

desc.dependencies['test'].update(
_enumerate_dependency_descriptors(
pkg.test_depends
))

# get any maintainers which list an E-mail address
maintainers = [str(m) for m in pkg.maintainers if m.email]
if maintainers:
desc.metadata.setdefault('maintainers', [])
desc.metadata['maintainers'] += maintainers


def add_group_dependencies(pkgs):
"""
Add appropriate dependencies based on group membership.
:param dict pkgs: A mapping of parsed package manifests
to associated package descriptors
:
"""
metadata = {
'origin': 'ros',
}

# resolve group members and add them to the descriptor dependencies
for pkg, desc in pkgs.items():
for group_depend in pkg.group_depends:
assert group_depend.evaluated_condition is not None
if not group_depend.evaluated_condition:
continue
group_depend.extract_group_members(pkgs)
for name in group_depend.members:
desc.dependencies['build'].add(DependencyDescriptor(
name, metadata=metadata))
desc.dependencies['run'].add(DependencyDescriptor(
name, metadata=metadata))


def get_package_with_build_type(path: str):
Expand Down Expand Up @@ -196,6 +213,15 @@ def _get_build_type(pkg, path):
return None


def _enumerate_dependency_descriptors(dependencies):
for dependency in dependencies:
assert dependency.evaluated_condition is not None
if not dependency.evaluated_condition:
continue
yield DependencyDescriptor(
dependency.name, metadata=_create_metadata(dependency))


def _create_metadata(dependency):
metadata = {
'origin': 'ros',
Expand Down
3 changes: 1 addition & 2 deletions test/test_package_identification_ros.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,7 @@ def test_identify():

augmentation_extension.augment_packages([desc])
assert desc.metadata['version'] == '0.0.0'
# TODO: This is a behavior deviation from colcon-core
# assert set(desc.dependencies.keys()) == {'build', 'run', 'test'}
assert set(desc.dependencies.keys()) == {'build', 'run', 'test'}
assert not desc.dependencies['build']
assert not desc.dependencies['run']
assert not desc.dependencies['test']
Expand Down

0 comments on commit 44cc291

Please sign in to comment.