rospy: #3055 support for __ns remapping

This commit is contained in:
Ken Conley 2010-10-25 09:26:18 +00:00
parent 2751c343f6
commit f003bdd331
2 changed files with 43 additions and 17 deletions

View File

@ -55,14 +55,21 @@ PRIV_NAME = '~'
REMAP = ":=" REMAP = ":="
ANYTYPE = '*' ANYTYPE = '*'
def get_ros_namespace(env=None): def get_ros_namespace(env=None, argv=None):
""" """
@param env: environment dictionary (defaults to os.environ) @param env: environment dictionary (defaults to os.environ)
@type env: dict @type env: dict
@param argv: command-line arguments (defaults to sys.argv)
@type argv: [str]
@return: ROS namespace of current program @return: ROS namespace of current program
@rtype: str @rtype: str
""" """
#we force command-line-specified namespaces to be globally scoped #we force command-line-specified namespaces to be globally scoped
if argv is None:
argv = sys.argv
for a in argv:
if a.startswith('__ns:='):
return make_global_ns(a[len('__ns:='):])
if env is None: if env is None:
env = os.environ env = os.environ
return make_global_ns(env.get(ROS_NAMESPACE, GLOBALNS)) return make_global_ns(env.get(ROS_NAMESPACE, GLOBALNS))

View File

@ -41,27 +41,46 @@ import rostest
class NamesTest(unittest.TestCase): class NamesTest(unittest.TestCase):
def test_get_ros_namespace(self): def test_get_ros_namespace(self):
if 'ROS_NAMESPACE' is os.environ: if 'ROS_NAMESPACE' in os.environ:
rosns = os.environ['ROS_NAMESPACE'] rosns = os.environ['ROS_NAMESPACE']
del os.environ['ROS_NAMESPACE'] del os.environ['ROS_NAMESPACE']
else: else:
rosns = None rosns = None
self.assertEquals('/', roslib.names.get_ros_namespace()) sysargv = sys.argv
self.assertEquals('/', roslib.names.get_ros_namespace(env={}))
os.environ['ROS_NAMESPACE'] = 'unresolved' try:
self.assertEquals('/unresolved/', roslib.names.get_ros_namespace()) sys.argv = []
self.assertEquals('/unresolved/', roslib.names.get_ros_namespace(env={'ROS_NAMESPACE': 'unresolved'})) self.assertEquals('/', roslib.names.get_ros_namespace())
self.assertEquals('/', roslib.names.get_ros_namespace(argv=[]))
os.environ['ROS_NAMESPACE'] = '/resolved/' self.assertEquals('/', roslib.names.get_ros_namespace(env={}))
self.assertEquals('/resolved/', roslib.names.get_ros_namespace()) self.assertEquals('/', roslib.names.get_ros_namespace(env={}, argv=[]))
self.assertEquals('/resolved/', roslib.names.get_ros_namespace(env={'ROS_NAMESPACE': '/resolved'}))
os.environ['ROS_NAMESPACE'] = 'unresolved'
del os.environ['ROS_NAMESPACE'] self.assertEquals('/unresolved/', roslib.names.get_ros_namespace())
self.assertEquals('/unresolved/', roslib.names.get_ros_namespace(env={'ROS_NAMESPACE': 'unresolved'}))
# restore sys.argv = ['foo', '__ns:=unresolved_override']
if rosns: self.assertEquals('/unresolved_override/', roslib.names.get_ros_namespace(env={'ROS_NAMESPACE': 'unresolved'}))
os.environ['ROS_NAMESPACE'] = rosns self.assertEquals('/override2/', roslib.names.get_ros_namespace(env={'ROS_NAMESPACE': 'unresolved'}, argv=['foo', '__ns:=override2']))
sys.argv = []
os.environ['ROS_NAMESPACE'] = '/resolved/'
self.assertEquals('/resolved/', roslib.names.get_ros_namespace())
self.assertEquals('/resolved/', roslib.names.get_ros_namespace(env={'ROS_NAMESPACE': '/resolved'}))
del os.environ['ROS_NAMESPACE']
sys.argv = ['foo', '__ns:=unresolved_ns']
self.assertEquals('/unresolved_ns/', roslib.names.get_ros_namespace())
self.assertEquals('/unresolved_ns2/', roslib.names.get_ros_namespace(argv=['foo', '__ns:=unresolved_ns2']))
sys.argv = ['foo', '__ns:=/resolved_ns/']
self.assertEquals('/resolved_ns/', roslib.names.get_ros_namespace())
self.assertEquals('/resolved_ns2/', roslib.names.get_ros_namespace(argv=['foo', '__ns:=resolved_ns2']))
finally:
sys.argv = sysargv
# restore
if rosns:
os.environ['ROS_NAMESPACE'] = rosns
def test_make_global_ns(self): def test_make_global_ns(self):
from roslib.names import make_global_ns from roslib.names import make_global_ns