[Mobies-commit] [commit] r4270 - in UDM/trunk: Projects/Win32/VC10/src Projects/Win32/VC10/src/UdmPython bin src/UdmPython tests/test_UdmPython

ksmyth at redhat3.isis.vanderbilt.edu ksmyth at redhat3.isis.vanderbilt.edu
Fri Mar 7 10:30:35 CST 2014


Author: ksmyth
Date: Fri Mar  7 10:30:35 2014
New Revision: 4270

Log:
UdmPython: Python 3.3 support

Added:
   UDM/trunk/Projects/Win32/VC10/src/Python33.props
Modified:
   UDM/trunk/Projects/Win32/VC10/src/UdmPython/UdmPython.vcxproj
   UDM/trunk/bin/udm.py
   UDM/trunk/src/UdmPython/UdmPython.cpp
   UDM/trunk/src/UdmPython/setup.py
   UDM/trunk/tests/test_UdmPython/udm_python_test.py

Added: UDM/trunk/Projects/Win32/VC10/src/Python33.props
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ UDM/trunk/Projects/Win32/VC10/src/Python33.props	Fri Mar  7 10:30:35 2014	(r4270)
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ImportGroup Label="PropertySheets" />
+  <PropertyGroup Label="UserMacros">
+    <PYTHON_VERSION>33</PYTHON_VERSION>
+  </PropertyGroup>
+  <PropertyGroup />
+  <ItemDefinitionGroup>
+    <ClCompile>
+      <AdditionalIncludeDirectories>C:\Python33\PC;C:\Python33\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <AdditionalLibraryDirectories>C:\Python33\libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <BuildMacro Include="PYTHON_VERSION">
+      <Value>$(PYTHON_VERSION)</Value>
+    </BuildMacro>
+  </ItemGroup>
+</Project>
\ No newline at end of file

Modified: UDM/trunk/Projects/Win32/VC10/src/UdmPython/UdmPython.vcxproj
==============================================================================
--- UDM/trunk/Projects/Win32/VC10/src/UdmPython/UdmPython.vcxproj	Thu Mar  6 10:51:51 2014	(r4269)
+++ UDM/trunk/Projects/Win32/VC10/src/UdmPython/UdmPython.vcxproj	Fri Mar  7 10:30:35 2014	(r4270)
@@ -17,6 +17,14 @@
       <Configuration>Release27</Configuration>
       <Platform>x64</Platform>
     </ProjectConfiguration>
+    <ProjectConfiguration Include="Release33|Win32">
+      <Configuration>Release33</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release33|x64">
+      <Configuration>Release33</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
     <ProjectConfiguration Include="Release|Win32">
       <Configuration>Release</Configuration>
       <Platform>Win32</Platform>
@@ -61,6 +69,16 @@
     <ConfigurationType>DynamicLibrary</ConfigurationType>
     <CharacterSet>MultiByte</CharacterSet>
   </PropertyGroup>
+  <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release33|x64'">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <CharacterSet>MultiByte</CharacterSet>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+  </PropertyGroup>
+  <PropertyGroup Label="Configuration" Condition="'$(Configuration)|$(Platform)'=='Release33|Win32'">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <CharacterSet>MultiByte</CharacterSet>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+  </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
   </ImportGroup>
@@ -94,6 +112,14 @@
     <Import Project="..\Udm.props" />
     <Import Project="..\Python26.props" />
   </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release33|Win32'">
+    <Import Project="..\Python33.props" />
+    <Import Project="..\Udm.props" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release33|x64'">
+    <Import Project="..\Python33.props" />
+    <Import Project="..\Udm.props" />
+  </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup>
     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
@@ -115,6 +141,11 @@
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$([System.IO.Path]::GetFullPath($(UDM_PATH)\bin\Python$(PYTHON_VERSION)))\</OutDir>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$([System.IO.Path]::GetFullPath($(UDM_PATH)\bin\Python$(PYTHON_VERSION)))\</OutDir>
     <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$([System.IO.Path]::GetFullPath($(UDM_PATH)\bin\Python$(PYTHON_VERSION)))\</OutDir>
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release33|Win32'">udm</TargetName>
+    <TargetExt Condition="'$(Configuration)|$(Platform)'=='Release33|Win32'">.pyd</TargetExt>
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release33|x64'">udm</TargetName>
+    <TargetExt Condition="'$(Configuration)|$(Platform)'=='Release33|x64'">.pyd</TargetExt>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release33|Win32'">$([System.IO.Path]::GetFullPath($(UDM_PATH)\bin\Python$(PYTHON_VERSION)))\</OutDir>
   </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <CustomBuildStep />
@@ -249,6 +280,34 @@
     </Link>
     <PostBuildEvent />
   </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release33|x64'">
+    <ClCompile>
+      <PreprocessorDefinitions>UDM_DYNAMIC_LINKING;UDM_PY_MODULE_NAME=$(TargetName);%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <WarningLevel>Level3</WarningLevel>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+    </ClCompile>
+    <Link>
+      <AdditionalLibraryDirectories>$([System.IO.Path]::GetFullPath($(UDM_PATH)\Build\$(Platform)\$(PlatformToolset)\Release\));%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName)_pyd$(PYTHON_VERSION).pdb</ProgramDatabaseFile>
+      <OptimizeReferences>true</OptimizeReferences>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release33|Win32'">
+    <ClCompile>
+      <PreprocessorDefinitions>UDM_DYNAMIC_LINKING;UDM_PY_MODULE_NAME=$(TargetName);%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <WarningLevel>Level3</WarningLevel>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+    </ClCompile>
+    <Link>
+      <AdditionalLibraryDirectories>$([System.IO.Path]::GetFullPath($(UDM_PATH)\Build\$(Platform)\$(PlatformToolset)\Release\));%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <ProgramDatabaseFile>$(TargetDir)$(TargetName)_pyd$(PYTHON_VERSION).pdb</ProgramDatabaseFile>
+      <OptimizeReferences>true</OptimizeReferences>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+    </Link>
+  </ItemDefinitionGroup>
   <ItemGroup>
     <ClCompile Include="..\..\..\..\..\src\UdmPython\UdmPython.cpp" />
   </ItemGroup>

Modified: UDM/trunk/bin/udm.py
==============================================================================
--- UDM/trunk/bin/udm.py	Thu Mar  6 10:51:51 2014	(r4269)
+++ UDM/trunk/bin/udm.py	Fri Mar  7 10:30:35 2014	(r4270)
@@ -3,5 +3,7 @@
     from Python26.udm import *
 elif sys.version_info[0:2] == (2,7):
     from Python27.udm import *
+elif sys.version_info[0:2] == (3,3):
+    from Python33.udm import *
 else:
     raise ImportError("Unsupported Python version " + str(sys.version_info))

Modified: UDM/trunk/src/UdmPython/UdmPython.cpp
==============================================================================
--- UDM/trunk/src/UdmPython/UdmPython.cpp	Thu Mar  6 10:51:51 2014	(r4269)
+++ UDM/trunk/src/UdmPython/UdmPython.cpp	Fri Mar  7 10:30:35 2014	(r4270)
@@ -11,6 +11,10 @@
 #include "boost/python/slice.hpp"
 #include "boost/python/operators.hpp"
 
+#if PY_MAJOR_VERSION >= 3
+#define PY3K
+#endif
+
 #undef min
 #undef max
 
@@ -31,15 +35,24 @@
 {
 	if (PyUnicode_Check(string.ptr()))
 	{
-		object encoded(handle<>(PyUnicode_AsEncodedString(string.ptr(), "UTF-8", "replace")));
 #ifdef PY3K
+#if PY_MINOR_VERSION >= 3
+		return PyUnicode_AsUTF8(string.ptr());
+#else
+		object encoded(handle<>(PyUnicode_AsEncodedString(string.ptr(), "UTF-8", "replace")));
 		return PyBytes_AS_STRING(encoded.ptr());
+#endif
 #else
+		object encoded(handle<>(PyUnicode_AsEncodedString(string.ptr(), "UTF-8", "replace")));
 		return PyString_AS_STRING(encoded.ptr());
 #endif
 	}
 	else
+#ifdef PY3K
+		throw udm_exception("Not a unicode object");
+#else
 		return PyString_AsString(string.ptr());
+#endif
 }
 
 #ifdef _WIN32
@@ -97,7 +110,11 @@
 #endif
 
 void SDN_OpenExisting(Udm::SmartDataNetwork& self, object systemname, const string& metalocator) {
+#ifdef PY3K
+	if (PyUnicode_Check(systemname.ptr()))
+#else
 	if (PyString_Check(systemname.ptr()) || PyUnicode_Check(systemname.ptr()))
+#endif
 	{
 		std::string string_systemname = stringtoutf8(systemname);
 		self.OpenExisting(string_systemname, metalocator, Udm::CHANGES_LOST_DEFAULT);
@@ -819,13 +836,16 @@
 "def map_uml_names(diagram):\n"
 "    import sys\n"
 "    udm = sys.modules['udm']\n"
-"    class_meta = filter(lambda class_: class_.name == 'Class', udm.uml_diagram().children())[0]\n"
-"    namespace_meta = filter(lambda class_: class_.name == 'Namespace', udm.uml_diagram().children())[0]\n"
+"    class_meta = next(filter(lambda class_: class_.name == 'Class', udm.uml_diagram().children()).__iter__())\n"
+"    namespace_meta = next(filter(lambda class_: class_.name == 'Namespace', udm.uml_diagram().children()).__iter__())\n"
 "    class ClassMap(object):\n"
 "        def __init__(self, d):\n"
 "            self.__dict__.update(d)\n"
 "    def map_classes(container):\n"
 "        ret = map(lambda class_: (class_.name, class_), container.children(child_type=class_meta))\n"
+#ifdef PY3K
+"        ret = list(ret)\n"
+#endif
 "        ret.extend(map(lambda namespace: (namespace.name, map_classes(namespace)), container.children(child_type=namespace_meta)))\n"
 "        return ClassMap(ret)\n"
 "    return map_classes(diagram)\n",

Modified: UDM/trunk/src/UdmPython/setup.py
==============================================================================
--- UDM/trunk/src/UdmPython/setup.py	Thu Mar  6 10:51:51 2014	(r4269)
+++ UDM/trunk/src/UdmPython/setup.py	Fri Mar  7 10:30:35 2014	(r4270)
@@ -39,7 +39,7 @@
             import os.path
             try:
                 os.makedirs(os.path.dirname(self.get_ext_fullpath(ext.name)))
-            except WindowsError, e:
+            except WindowsError as e:
                 if e.winerror != 183: # already exists
                     raise
 

Modified: UDM/trunk/tests/test_UdmPython/udm_python_test.py
==============================================================================
--- UDM/trunk/tests/test_UdmPython/udm_python_test.py	Thu Mar  6 10:51:51 2014	(r4269)
+++ UDM/trunk/tests/test_UdmPython/udm_python_test.py	Fri Mar  7 10:30:35 2014	(r4270)
@@ -21,7 +21,7 @@
 elif _platform == "win32":
     # Windows...
     sys.path.append(r"C:\Program Files\ISIS\Udm\bin")
-    if os.environ.has_key("UDM_PATH"):
+    if "UDM_PATH" in os.environ:
         sys.path.append(os.path.join(os.environ["UDM_PATH"], "bin"))
 
 try:
@@ -34,7 +34,7 @@
 
 def get_names(col):
     names = map(lambda x: x.name, col)
-    names.sort()
+    names = sorted(names)
     return names
 
 
@@ -64,14 +64,15 @@
         self.assertEquals(container.children(child_role="cmproleA"), container.cmproleA_role_children)
         self.assertEquals(get_names(container.cmproleB_role_children), [ "cmproleB1"] )
         self.assertEquals(container.type, test_meta.Container)
-        cmproleA1 = filter(lambda x: x.name =="cmproleA1", container.children())[0]
-        cmproleA2 = filter(lambda x: x.name =="cmproleA2", container.children())[0]
+        def first(container): return next(container.__iter__())
+        cmproleA1 = first(filter(lambda x: x.name =="cmproleA1", container.children()))
+        cmproleA2 = first(filter(lambda x: x.name =="cmproleA2", container.children()))
         self.assertEquals(cmproleA1.dstConnection, [cmproleA2])
         self.assertEquals(cmproleA1.adjacent(dst_role="dstConnection"), [cmproleA2])
         self.assertEquals(cmproleA1.adjacent(src_role="srcConnection"), [cmproleA2])
         self.assertEquals(cmproleA2.adjacent(dst_role="dstConnection"), [])
         self.assertEquals(cmproleA2.adjacent(src_role="srcConnection"), [])
-        AtomA1 = filter(lambda x: x.name =="AtomA1", container.children())[0]
+        AtomA1 = first(filter(lambda x: x.name =="AtomA1", container.children()))
         self.assertEquals(AtomA1.boolattr, True)
         self.assertEquals(AtomA1.stringattr, "teststring")
         self.assertEquals(AtomA1.intattr, 42)
@@ -79,12 +80,15 @@
         self.assertEquals(AtomA1.intattr, 60)
         AtomA1.stringattr = "test123"
         self.assertEquals(AtomA1.stringattr, "test123")
+        unicode_teststring = u'\xc1rv\xedzt\u0171r\u0151 t\xfck\xf6rf\xfar\xf3g\xe9p\U0001d11e\u0393\u03b1\u03b6\u03ad\u03b5\u03c2 \u03ba\u03b1\u1f76 \u03bc\u03c5\u03c1\u03c4\u03b9\u1f72\u03c2 \u03b4\u1f72\u03bd \u03b8\u1f70 \u03b2\u03c1\u1ff6 \u03c0\u03b9\u1f70 \u03c3\u03c4\u1f78 \u03c7\u03c1\u03c5\u03c3\u03b1\u03c6\u1f76 \u03be\u03ad\u03c6\u03c9\u03c4\u03bf\u0ca0_\u0ca0\u30a6\u30f0\u30ce\u30aa\u30af\u30e4\u30de \u30b1\u30d5\u30b3\u30a8\u30c6 \u30a2\u30b5\u30ad\u30e6\u30e1\u30df\u30b7 \u30f1\u30d2\u30e2\u30bb\u30b9\u30f3\u0421\u044a\u0435\u0448\u044c \u0436\u0435 \u0435\u0449\u0451 \u044d\u0442\u0438\u0445 \u043c\u044f\u0433\u043a\u0438\u0445 \u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0445 \u0431\u0443\u043b\u043e\u043a \u0434\u0430 \u0432\u044b\u043f\u0435\u0439 \u0447\u0430\u044e'
+        AtomA1.stringattr = unicode_teststring
+        self.assertEquals(AtomA1.stringattr, unicode_teststring)
         
         
         # trying to access nonexistant attribute raises an exception
         try:
             self.assertFalse(container.nonexistantattribute)
-        except RuntimeError, e:
+        except RuntimeError as e:
             # the error message should include the type's name and attribute name
             self.assertTrue(str(e).find("Container") != -1)
             self.assertTrue(str(e).find("nonexistantattribute") != -1)
@@ -141,11 +145,11 @@
                 os.path.join(this_dir, r'..\..\build\Win32\v100\Release\UdmDll_VS10.lib')], stdout=out_file, env=env)
         
         new_exports = {}
-        with open(os.path.join(this_dir, 'UdmDll_VS10.lib.exports'), 'rb') as out_file:
+        with open(os.path.join(this_dir, 'UdmDll_VS10.lib.exports'), 'r') as out_file:
             for line in out_file:
                 new_exports[line.rstrip('\r\n')] = 1
                 
-        with open(os.path.join(this_dir, 'UdmDll_VS10.lib.3.2.12.exports'), 'rb') as existing_file:
+        with open(os.path.join(this_dir, 'UdmDll_VS10.lib.3.2.12.exports'), 'r') as existing_file:
             for lineno, existing_line in enumerate(existing_file):
                 existing_line = existing_line.rstrip('\r\n')
                 self.assertTrue(existing_line in new_exports, existing_line + " doesnt exist anymore. Line " + str(lineno))


More information about the Mobies-commit mailing list