diff -r 3114f26d5d54 Lib/msilib/__init__.py --- a/Lib/msilib/__init__.py Tue Mar 22 10:46:35 2011 +0100 +++ b/Lib/msilib/__init__.py Sat Mar 26 20:23:10 2011 +0800 @@ -172,10 +172,9 @@ add_data(db, table, getattr(module, table)) def make_id(str): - #str = str.replace(".", "_") # colons are allowed - str = str.replace(" ", "_") - str = str.replace("-", "_") - if str[0] in string.digits: + identifier_chars = string.ascii_letters + string.digits + "._" + str = "".join([c if c in identifier_chars else "_" for c in str]) + if str[0] in string.digits + ".": str = "_"+str assert re.match("^[A-Za-z_][A-Za-z0-9_.]*$", str), "FILE"+str return str diff -r 3114f26d5d54 Lib/msilib/test/test___init__.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/msilib/test/test___init__.py Sat Mar 26 20:23:10 2011 +0800 @@ -0,0 +1,49 @@ +""" Test suite for the code in msilib.__init__ """ + +# Testing imports +import unittest + +# Python imports +import os.path + +# Local imports +import msilib + +class Test_make_id(unittest.TestCase): + #http://msdn.microsoft.com/en-us/library/aa369212(v=vs.85).aspx + """The Identifier data type is a text string. Identifiers may contain the + ASCII characters A-Z (a-z), digits, underscores (_), or periods (.). + However, every identifier must begin with either a letter or an + underscore. + """ + + def is_no_change_required(self, string): + self.assertEqual( + msilib.make_id("short"), "short") + self.assertEqual( + msilib.make_id("nochangerequired"), "nochangerequired") + self.assertEqual( + msilib.make_id("one.dot"), "one.dot") + self.assertEqual( + msilib.make_id("_"), "_") + self.assertEqual( + msilib.make_id("a"), "a") + self.assertEqual( + msilib.make_id(""), "") + + def test_invalid_first_char(self): + self.assertEqual( + msilib.make_id("9.short"), "_9.short") + self.assertEqual( + msilib.make_id(".short"), "_.short") + + def test_invalid_any_char(self): + self.assertEqual( + msilib.make_id(".s\x82ort"), "_.s_ort") + self.assertEqual ( + msilib.make_id(".s\x82o?*+rt"), "_.s_o___rt") + + +if __name__ == "__main__": + unittest.main() +