diff --git a/core/roslib/scripts/python-reserved-words.txt b/core/roslib/scripts/python-reserved-words.txt deleted file mode 100644 index 14ac6ed5..00000000 --- a/core/roslib/scripts/python-reserved-words.txt +++ /dev/null @@ -1,32 +0,0 @@ -and -as -assert -break -class -continue -def -del -elif -else -except -exec -finally -for -from -global -import -if -in -is -lambda -not -or -pass -print -raise -return -self -try -while -with -yield diff --git a/core/roslib/src/roslib/genpy.py b/core/roslib/src/roslib/genpy.py index 4ec61bf4..1f5bb038 100644 --- a/core/roslib/src/roslib/genpy.py +++ b/core/roslib/src/roslib/genpy.py @@ -49,6 +49,7 @@ The structure of the serialization descends several levels of serializers: # creates circular deps import os +import keyword import shutil import atexit import itertools @@ -254,30 +255,9 @@ def _remap_reserved(field_name): @rtype: str """ #doing this lazy saves 0.05s on up-to-date builds - if not _reserved_words: - _load_reserved_words() - if field_name in _reserved_words: + if field_name in keyword.kwlist: return field_name + "_" return field_name - -_reserved_words = [] -def _load_reserved_words(): - """ - load python reserved words file into global _reserved_words. these - reserved words cannot be field names without being altered first - """ - global _reserved_words - roslib_dir = roslib.packages.get_pkg_dir('roslib') - reserved_words_file = os.path.join(roslib_dir, 'scripts', 'python-reserved-words.txt') - if not os.path.exists(reserved_words_file): - print >> sys.stderr, "Cannot load python reserved words file [%s]"%reserved_words_file - return False - f = open(reserved_words_file, 'r') - try: - _reserved_words = [w.strip() for w in f.readlines() if w] - return True - finally: - f.close() ################################################################################ # (de)serialization routines @@ -951,7 +931,17 @@ def msg_generator(package, name, spec): @param spec: parsed .msg specification @type spec: L{MsgSpec} """ - spec = make_python_safe(spec) # remap spec names to be Python-safe + + # #2990: have to compute md5sum before any calls to make_python_safe + + # generate dependencies dictionary. omit files calculation as we + # rely on in-memory MsgSpecs instead so that we can generate code + # for older versions of msg files + gendeps_dict = roslib.gentools.get_dependencies(spec, package, compute_files=False) + md5sum = roslib.gentools.compute_md5(gendeps_dict) + + # remap spec names to be Python-safe + spec = make_python_safe(spec) spec_names = spec.names # #1807 : this will be much cleaner when msggenerator library is @@ -972,14 +962,10 @@ def msg_generator(package, name, spec): fulltype = '%s%s%s'%(package, roslib.msgs.SEP, name) - # generate dependencies dictionary. omit files calculation as we - # rely on in-memory MsgSpecs instead so that we can generate code - # for older versions of msg files - gendeps_dict = roslib.gentools.get_dependencies(spec, package, compute_files=False) #Yield data class first, e.g. Point2D yield 'class %s(roslib.message.Message):'%name - yield ' _md5sum = "%s"'%roslib.gentools.compute_md5(gendeps_dict) - yield ' _type = "%s"'%fulltype + yield ' _md5sum = "%s"'%(md5sum) + yield ' _type = "%s"'%(fulltype) yield ' _has_header = %s #flag to mark the presence of a Header object'%spec.has_header() # note: we introduce an extra newline to protect the escaping from quotes in the message yield ' _full_text = """%s\n"""'%compute_full_text_escaped(gendeps_dict) diff --git a/test/test_roslaunch/test/test_xmlloader.py b/test/test_roslaunch/test/test_xmlloader.py index b11aea1a..f62031d8 100755 --- a/test/test_roslaunch/test/test_xmlloader.py +++ b/test/test_roslaunch/test/test_xmlloader.py @@ -212,7 +212,7 @@ class TestXmlLoader(unittest.TestCase): p = [p for p in mock.params if p.key == '/binaryfile'][0] self.assertEquals(xmlrpclib.Binary(contents), p.value, 1) - f = open(os.path.join(get_pkg_dir('roslib'), 'scripts', 'python-reserved-words.txt')) + f = open(os.path.join(get_pkg_dir('roslaunch'), 'example.launch')) try: contents = f.read() finally: diff --git a/test/test_roslaunch/test/xml/test-params-valid.xml b/test/test_roslaunch/test/xml/test-params-valid.xml index ff76f9f4..96fe3d66 100644 --- a/test/test_roslaunch/test/xml/test-params-valid.xml +++ b/test/test_roslaunch/test/xml/test-params-valid.xml @@ -30,7 +30,7 @@ - + diff --git a/test/test_rospy/msg/PythonKeyword.msg b/test/test_rospy/msg/PythonKeyword.msg new file mode 100644 index 00000000..0949ea88 --- /dev/null +++ b/test/test_rospy/msg/PythonKeyword.msg @@ -0,0 +1 @@ +int32 yield diff --git a/test/test_rospy/test/test_genmsg_py.py b/test/test_rospy/test/test_genmsg_py.py index 36b817df..1cec1f15 100644 --- a/test/test_rospy/test/test_genmsg_py.py +++ b/test/test_rospy/test/test_genmsg_py.py @@ -48,6 +48,14 @@ from roslib.message import SerializationError class TestGenmsgPy(unittest.TestCase): + def test_PythonKeyword(self): + from test_ros.msg import PythonKeyword + # the md5sum is pulled from the c++ message generator. The + # test here is that the Python msg generator didn't + # accidentally mutate a md5sum based on a message that has its + # fieldname remapped. + self.assertEquals(PythonKeyword._md5sum, "1330d6bbfad8e75334346fec949d5133") + ## Utility for testing roundtrip serialization ## @param orig Message to test roundtrip serialization of ## @param blank Uninitialized instance of message to deserialize into diff --git a/tools/roslaunch/example.launch b/tools/roslaunch/example.launch index ca15f5f4..5bca7f33 100644 --- a/tools/roslaunch/example.launch +++ b/tools/roslaunch/example.launch @@ -30,7 +30,7 @@ - +