Skip to content

Commit

Permalink
Merge pull request #31 from osrf/issue_31
Browse files Browse the repository at this point in the history
Support for nodelet managers
  • Loading branch information
wjwwood committed Nov 10, 2013
2 parents dd1c243 + ddd971b commit 07e0c49
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 6 deletions.
18 changes: 15 additions & 3 deletions src/capabilities/specs/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
remappings:
topics:
'scan': 'nav_stack/scan'
nodelet_manager: 'nav_manager'
You can use this API like this::
Expand All @@ -74,6 +75,8 @@
launch/navigation_nav_stack.launch
>>> print(cp.implements)
navigation/Navigation
>>> print(cp.nodelet_manager)
nav_manager
"""

Expand Down Expand Up @@ -176,8 +179,13 @@ def capability_provider_from_dict(spec, file_name='<dict>'):
if not isinstance(remappings, dict):
raise InvalidProvider("Invalid remappings section, expected dict got: '{0}'".format(type(remappings)),
file_name)
nodelet_manager = spec.get('nodelet_manager', None)
if not isinstance(nodelet_manager, (str, type(None))):
raise InvalidProvider("Invalid nodelet_manager, expected string got: '{0}'".format(type(nodelet_manager)),
file_name)
try:
capability_provider = CapabilityProvider(name, spec_version, implements, launch_file, description, remappings)
capability_provider = CapabilityProvider(name, spec_version, implements, launch_file,
description, remappings, nodelet_manager)
except (AssertionError, ValueError) as e: # Catch remapping errors
raise InvalidProvider(str(e), file_name)
depends_on = spec.get('depends_on', {})
Expand Down Expand Up @@ -215,15 +223,18 @@ class CapabilityProvider(object):
- launch_file (str or None): Path to a launch file which runs the provider, None indicates no launch file to run
- depends_on (dict): list of depends on relationships to Capabilities with remappings and provider preference
- remappings (dict): map of ROS Names defined in the Capability to their new names for this provider
- nodelet_manager (str or None): name of the nodelet manager used by the provider, this is an implementation hint
"""
spec_type = 'provider'

def __init__(self, name, spec_version, implements, launch_file=None, description=None, remappings=None):
def __init__(self, name, spec_version, implements, launch_file=None,
description=None, remappings=None, nodelet_manager=None):
self.name = name
self.spec_version = spec_version
self.description = description
self.implements = implements
self.launch_file = launch_file
self.nodelet_manager = nodelet_manager
self.__remap_collection = RemapCollection()
self.add_remappings_by_dict(remappings or {})
self.__depends_on = {}
Expand Down Expand Up @@ -252,7 +263,7 @@ def __str__(self):
{{
name: {name}
spec version: {spec_version}
implements: {implements}
implements: {implements}{nodelet_manager_str}
description:
{description}
{remappings_str}
Expand All @@ -261,6 +272,7 @@ def __str__(self):
}}
""".format(depends_on_str="[\n" + "\n".join([str(v) for v in self.__depends_on.values()]) + "\n]",
remappings_str=str(self.__remap_collection) + "\n",
nodelet_manager_str='' if self.nodelet_manager is None else '\n' + self.nodelet_manager + '\n',
**self.__dict__)


Expand Down
7 changes: 7 additions & 0 deletions test/unit/specs/providers/invalid_nodelet_manager.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
%YAML 1.1
---
name: minimal
spec_version: 1
spec_type: provider
implements: minimal_pkg/Minimal
nodelet_manager: {'not': 'valid'}
1 change: 1 addition & 0 deletions test/unit/specs/providers/navigation_nav_stack.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ spec_type: provider
description: 'Implements the ability to navigate.'
implements: navigation/Navigation
launch_file: 'launch/navigation_nav_stack.launch'
nodelet_manager: 'nav_manager'
depends_on:
'laser_capability/LaserObservation':
provider: 'hokuyo_capability/hokuyo_base'
Expand Down
7 changes: 4 additions & 3 deletions test/unit/specs/test_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,18 @@ def check_minimal(cp):
'invalid_depends_on_conditional.yaml': [None, provider.InvalidProvider, 'Invalid depends_on interface condition'],
'invalid_depends_on_conditional_section.yaml': [None, provider.InvalidProvider, 'depends_on conditional section'],
'invalid_depends_on_section.yaml': [None, provider.InvalidProvider, 'Invalid depends_on section'],
'invalid_remapping_duplicate.yaml': [None, provider.InvalidProvider, 'is remapped twice, but to different values'],
'invalid_implements_name.yaml': [None, provider.InvalidProvider, 'Invalid spec name for implements'],
'invalid_nodelet_manager.yaml': [None, provider.InvalidProvider, 'Invalid nodelet_manager'],
'invalid_remapping.yaml': [None, provider.InvalidProvider, 'Invalid remappings section'],
'invalid_remapping_duplicate.yaml': [None, provider.InvalidProvider, 'is remapped twice, but to different values'],
'invalid_spec_type.yaml': [None, provider.InvalidProvider, 'Invalid spec type'],
'minimal.yaml': [check_minimal, None, None],
'navigation_nav_stack.yaml': [check_navigation, None, None],
'no_implements.yaml': [None, provider.InvalidProvider, 'No implements specified'],
'no_name.yaml': [None, provider.InvalidProvider, 'No name specified'],
'no_spec_version.yaml': [None, provider.InvalidProvider, 'No spec version specified'],
'no_spec_type.yaml': [None, provider.InvalidProvider, 'No spec type specified'],
'no_spec_version.yaml': [None, provider.InvalidProvider, 'No spec version specified'],
'version_2_spec.yaml': [None, provider.InvalidProvider, 'Invalid spec version'],
'invalid_implements_name.yaml': [None, provider.InvalidProvider, 'Invalid spec name for implements'],
}


Expand Down

0 comments on commit 07e0c49

Please sign in to comment.