From 75940910a2ab64e435b2b24f5fc515a794ddfebb Mon Sep 17 00:00:00 2001 From: Scott K Logan Date: Fri, 12 Nov 2021 16:09:00 -0800 Subject: [PATCH 1/2] Add support for wildcard OS name --- src/rosdep2/lookup.py | 6 +++++- test/test_rosdep_lookup.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/rosdep2/lookup.py b/src/rosdep2/lookup.py index 0926dbeb6..a7a0fd791 100644 --- a/src/rosdep2/lookup.py +++ b/src/rosdep2/lookup.py @@ -103,7 +103,11 @@ def get_rule_for_platform(self, os_name, os_version, installer_keys, default_ins 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, os_name, os_version, '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 diff --git a/test/test_rosdep_lookup.py b/test/test_rosdep_lookup.py index 97389690a..9d8bd04bf 100644 --- a/test/test_rosdep_lookup.py +++ b/test/test_rosdep_lookup.py @@ -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 == '*' + 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 From 91cf3a113e491877de5b3744a1102e616f7ba3d6 Mon Sep 17 00:00:00 2001 From: Scott K Logan Date: Tue, 16 Nov 2021 14:21:31 -0800 Subject: [PATCH 2/2] Preserve queried os_name and os_version for error messages --- src/rosdep2/lookup.py | 10 ++++++---- test/test_rosdep_lookup.py | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/rosdep2/lookup.py b/src/rosdep2/lookup.py index a7a0fd791..77f6f24f3 100644 --- a/src/rosdep2/lookup.py +++ b/src/rosdep2/lookup.py @@ -99,12 +99,14 @@ 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: if '*' not in data: - raise ResolutionError(rosdep_key, data, os_name, os_version, 'No definition of [%s] for OS [%s]' % (rosdep_key, os_name)) + 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 = '*' @@ -133,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 = '*' @@ -150,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 9d8bd04bf..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: @@ -226,7 +226,7 @@ def test_RosdepDefinition(): assert False, 'should have raised: %s' % (str(val)) except ResolutionError as e: assert e.rosdep_key == 'non_debian_key' - assert e.os_name == '*' + assert e.os_name == 'ubuntu' assert e.os_version == 'precise' # tripwire str(e)