diff --git a/src/rosdep2/lookup.py b/src/rosdep2/lookup.py index 0926dbeb6..77f6f24f3 100644 --- a/src/rosdep2/lookup.py +++ b/src/rosdep2/lookup.py @@ -99,11 +99,17 @@ def get_rule_for_platform(self, os_name, os_version, installer_keys, default_ins """ rosdep_key = self.rosdep_key data = self.data + queried_os = os_name + queried_ver = os_version if type(data) != dict: raise InvalidData('rosdep value for [%s] must be a dictionary' % (self.rosdep_key), origin=self.origin) if os_name not in data: - raise ResolutionError(rosdep_key, data, os_name, os_version, 'No definition of [%s] for OS [%s]' % (rosdep_key, os_name)) + if '*' not in data: + raise ResolutionError(rosdep_key, data, queried_os, queried_ver, 'No definition of [%s] for OS [%s]' % (rosdep_key, os_name)) + elif type(data['*']) != dict: + raise InvalidData('rosdep value under OS wildcard for [%s] must specify a package manager' % (rosdep_key)) + os_name = '*' data = data[os_name] return_key = default_installer_key @@ -129,10 +135,10 @@ def get_rule_for_platform(self, os_name, os_version, installer_keys, default_ins # dictionary value. # if the os_version is not defined and there is no wildcard if os_version not in data and '*' not in data: - raise ResolutionError(rosdep_key, self.data, os_name, os_version, 'No definition of [%s] for OS version [%s]' % (rosdep_key, os_version)) + raise ResolutionError(rosdep_key, self.data, queried_os, queried_ver, 'No definition of [%s] for OS version [%s]' % (rosdep_key, os_version)) # if the os_version has the value None if os_version in data and data[os_version] is None: - raise ResolutionError(rosdep_key, self.data, os_name, os_version, '[%s] defined as "not available" for OS version [%s]' % (rosdep_key, os_version)) + raise ResolutionError(rosdep_key, self.data, queried_os, queried_ver, '[%s] defined as "not available" for OS version [%s]' % (rosdep_key, os_version)) # if os version is not defined (and there is a wildcard) fallback to the wildcard if os_version not in data: os_version = '*' @@ -146,7 +152,7 @@ def get_rule_for_platform(self, os_name, os_version, installer_keys, default_ins # Check if the rule is null if data is None: - raise ResolutionError(rosdep_key, self.data, os_name, os_version, '[%s] defined as "not available" for OS version [%s]' % (rosdep_key, os_version)) + raise ResolutionError(rosdep_key, self.data, queried_os, queried_ver, '[%s] defined as "not available" for OS version [%s]' % (rosdep_key, os_version)) if type(data) not in (dict, list, type('str')): raise InvalidData('rosdep OS definition for [%s:%s] must be a dictionary, string, or list: %s' % (self.rosdep_key, os_name, data), origin=self.origin) diff --git a/test/test_rosdep_lookup.py b/test/test_rosdep_lookup.py index 97389690a..176abd0d0 100644 --- a/test/test_rosdep_lookup.py +++ b/test/test_rosdep_lookup.py @@ -189,7 +189,7 @@ def test_RosdepDefinition(): except ResolutionError as e: assert e.rosdep_key == 'trusty_only_key' assert e.os_name == 'ubuntu' - assert e.os_version == '*' + assert e.os_version == 'lucid' # tripwire str(e) try: @@ -202,6 +202,41 @@ def test_RosdepDefinition(): # tripwire str(e) + definition = RosdepDefinition('invalid_os_wildcard', {'*': ['pytest']}, 'os_wildcard.txt') + try: + val = definition.get_rule_for_platform('debian', 'sid', ['apt', 'source', 'pip'], 'apt') + assert False, 'should have raised: %s' % (str(val)) + except InvalidData: + pass + + definition = RosdepDefinition('non_debian_key', {'debian': None, '*': {'pip': ['pytest']}}, 'os_wildcard.txt') + try: + val = definition.get_rule_for_platform('debian', 'sid', ['apt', 'source', 'pip'], 'apt') + assert False, 'should have raised: %s' % (str(val)) + except ResolutionError as e: + assert e.rosdep_key == 'non_debian_key' + assert e.os_name == 'debian' + assert e.os_version == 'sid' + # tripwire + str(e) + + # package manager not supported + try: + val = definition.get_rule_for_platform('ubuntu', 'precise', ['apt', 'source'], 'apt') + assert False, 'should have raised: %s' % (str(val)) + except ResolutionError as e: + assert e.rosdep_key == 'non_debian_key' + assert e.os_name == 'ubuntu' + assert e.os_version == 'precise' + # tripwire + str(e) + + val = definition.get_rule_for_platform('ubuntu', 'precise', ['apt', 'source', 'pip'], 'apt') + assert val == ('pip', ['pytest']), val + + val = definition.get_rule_for_platform('fedora', '35', ['dnf', 'source', 'pip'], 'dnf') + assert val == ('pip', ['pytest']), val + # test reverse merging OS things (first is default) definition = RosdepDefinition('test', {'debian': 'libtest-dev'}, 'fake-1.txt') # rule should work as expected before reverse-merge