def resolve_name(name, caller_id=None): """ Resolve a ROS name to its global, canonical form. Private ~names are resolved relative to the node name. @param name: name to resolve. @type name: str @param caller_id: node name to resolve relative to. To resolve to local namespace, omit this parameter (or use None) @type caller_id: str @return: Resolved name. If name is empty/None, resolve_name returns parent namespace. If namespace is empty/None, @rtype: str """ if not caller_id: caller_id = get_name() if not name: #empty string resolves to namespace return namespace(caller_id) name = canonicalize_name(name) if name[0] == SEP: #global name resolved_name = name elif is_private(name): #~name resolved_name = ns_join(caller_id, name[1:]) else: #relative resolved_name = namespace(caller_id) + name #Mappings override general namespace-based resolution # - do this before canonicalization as remappings are meant to # match the name as specified in the code if resolved_name in _resolved_mappings: return _resolved_mappings[resolved_name] else: return resolved_name
def _set_caller_id(caller_id): """ Internal API. Set the global name (i.e. caller_id) and namespace. Methods can check what the name of the current node is by calling get_caller_id. The caller_id is important as it is the first parameter to any API call on a remote node. Invoked by ROSNode constructor @param caller_id: new caller ID @type caller_id: str """ global _caller_id, _caller_namespace _caller_id = caller_id _caller_namespace = namespace(caller_id)
def scoped_name(caller_id, name): """ Convert the global caller_id to a relative name within the namespace. For example, for namespace '/foo' and name '/foo/bar/name', the return value will be 'bar/name' WARNING: scoped_name does not validate that name is actually within the supplied namespace. @param caller_id: caller ID, in canonical form @type caller_id: str @param name: name to scope @type name: str @return: name scoped to the caller_id's namespace. @rtype: str """ if not is_global(caller_id): raise ROSException("caller_id must be global") return canonicalize_name(name)[len(namespace(caller_id)):]
def test_namespace(self): from roslib.names import namespace try: namespace(1) self.fail("1") except TypeError: pass try: namespace(None) self.fail("None") except ValueError: pass self.assertEquals('/', namespace('')) self.assertEquals('/', namespace('/')) self.assertEquals('/', namespace('/foo')) self.assertEquals('/', namespace('/foo/')) self.assertEquals('/foo/', namespace('/foo/bar')) self.assertEquals('/foo/', namespace('/foo/bar/')) self.assertEquals('/foo/bar/', namespace('/foo/bar/baz')) self.assertEquals('/foo/bar/', namespace('/foo/bar/baz/')) # unicode tests self.assertEquals(u'/', namespace(u'')) self.assertEquals(u'/', namespace(u'/')) self.assertEquals(u'/foo/bar/', namespace(u'/foo/bar/baz/'))