]> granicus.if.org Git - python/commitdiff
Closes #11696: Fix ID generation in msilib.
authorMartin v. Löwis <martin@v.loewis.de>
Sun, 27 Mar 2011 19:05:51 +0000 (21:05 +0200)
committerMartin v. Löwis <martin@v.loewis.de>
Sun, 27 Mar 2011 19:05:51 +0000 (21:05 +0200)
Patch by Mark Mc Mahon.

Lib/msilib/__init__.py
Lib/test/test_msilib.py [new file with mode: 0644]
Misc/ACKS
Misc/NEWS

index ce4365fb69d7cea73ced5e96b67efc154492045d..dbdb32527dff9433fe179d77db5bc48d420f13ca 100644 (file)
@@ -173,9 +173,8 @@ def add_tables(db, module):
         add_data(db, table, getattr(module, table))
 
 def make_id(str):
-    #str = str.replace(".", "_") # colons are allowed
-    for c in " -+~;":
-        str = str.replace(c, "_")
+    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
diff --git a/Lib/test/test_msilib.py b/Lib/test/test_msilib.py
new file mode 100644 (file)
index 0000000..ccdaec7
--- /dev/null
@@ -0,0 +1,46 @@
+""" Test suite for the code in msilib """
+import unittest
+import os
+from test.support import run_unittest, import_module
+msilib = import_module('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 test_is_no_change_required(self):
+        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")
+
+
+def test_main():
+    run_unittest(__name__)
+
+if __name__ == '__main__':
+    test_main()
index 7a0982b78bb3a8582888479bc10c1b17c3b9c654..f5fa82f35f5ec43ec166bac3e1bb5485b22091f5 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -531,6 +531,7 @@ Chris McDonough
 Greg McFarlane
 Alan McIntyre
 Michael McLay
+Mark Mc Mahon
 Gordon McMillan
 Caolan McNamara
 Andrew McNamara
index 0b45ff5ddab9fbba21e83d3e684235187cd24d36..bd390a05b466faa5e8df776586072582201cd75b 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -44,6 +44,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #11696: Fix ID generation in msilib.
+
 - Issue #9696: Fix exception incorrectly raised by xdrlib.Packer.pack_int when
   trying to pack a negative (in-range) integer.