From cdb9a42d6168811885d87f2f07f00e729f93af6e Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 12 Jan 2017 13:58:27 -0700 Subject: [PATCH 001/324] Remove unreachable code from PY32 That entire section is only for PY32 compatiblity --- src/runtime/runtime.cs | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 80f62df49..b7451ecd1 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1563,27 +1563,11 @@ internal static IntPtr PyString_FromStringAndSize(string value, int length) } } -#if (PYTHON33 || PYTHON34 || PYTHON35 || PYTHON36) [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromStringAndSize(IntPtr value, int size); -#elif (UCS2) - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS2_FromStringAndSize", - ExactSpelling = true, CharSet = CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_FromStringAndSize(IntPtr value, int size); -#else - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS4_FromStringAndSize", - ExactSpelling = true, CharSet = CharSet.Ansi)] - internal unsafe static extern IntPtr - PyUnicode_FromStringAndSize(IntPtr value, int size); -#endif - -#else // Python2x - +#elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr From 5357401a4158d222582fbb18bd715e2f188cdbb6 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 12 Jan 2017 14:05:50 -0700 Subject: [PATCH 002/324] Refactor repeated section from UCS4/UCS2 --- src/runtime/runtime.cs | 42 ++++++++---------------------------------- 1 file changed, 8 insertions(+), 34 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index b7451ecd1..46a0d2d91 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1677,37 +1677,6 @@ internal unsafe static extern IntPtr internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); #endif - - internal static IntPtr PyUnicode_FromString(string s) - { - return PyUnicode_FromUnicode(s, (s.Length)); - } - - internal unsafe static string GetManagedString(IntPtr op) - { - IntPtr type = PyObject_TYPE(op); - -// Python 3 strings are all unicode -#if PYTHON2 - if (type == Runtime.PyStringType) - { - return Marshal.PtrToStringAnsi( - PyString_AS_STRING(op), - Runtime.PyString_Size(op) - ); - } -#endif - - if (type == Runtime.PyUnicodeType) - { - char* p = Runtime.PyUnicode_AsUnicode(op); - int size = Runtime.PyUnicode_GetSize(op); - return new String(p, 0, size); - } - - return null; - } - #endif #if (UCS4) #if (PYTHON33 || PYTHON34 || PYTHON35 || PYTHON36) @@ -1800,6 +1769,7 @@ internal unsafe static extern IntPtr internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); +#endif #endif internal static IntPtr PyUnicode_FromString(string s) @@ -1811,8 +1781,7 @@ internal unsafe static string GetManagedString(IntPtr op) { IntPtr type = PyObject_TYPE(op); -// Python 3 strings are all unicode -#if PYTHON2 +#if PYTHON2 // Python 3 strings are all Unicode if (type == Runtime.PyStringType) { return Marshal.PtrToStringAnsi( @@ -1824,17 +1793,22 @@ internal unsafe static string GetManagedString(IntPtr op) if (type == Runtime.PyUnicodeType) { +#if UCS4 IntPtr p = Runtime.PyUnicode_AsUnicode(op); int length = Runtime.PyUnicode_GetSize(op); int size = length*4; byte[] buffer = new byte[size]; Marshal.Copy(p, buffer, 0, size); return Encoding.UTF32.GetString(buffer, 0, size); +#elif UCS2 + char* p = Runtime.PyUnicode_AsUnicode(op); + int size = Runtime.PyUnicode_GetSize(op); + return new String(p, 0, size); +#endif } return null; } -#endif //==================================================================== // Python dictionary API From 4f298019722c3b71a3dccfa4ea0ceff9ff1a8b1d Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 29 Jan 2017 13:24:47 -0700 Subject: [PATCH 003/324] Clarify nested UCS2/4 PY2/3 directives Clearly shows what each section does --- src/runtime/runtime.cs | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 46a0d2d91..84f237f30 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1590,8 +1590,7 @@ internal static bool PyUnicode_Check(IntPtr ob) return PyObject_TYPE(ob) == Runtime.PyUnicodeType; } -#if (UCS2) -#if (PYTHON33 || PYTHON34 || PYTHON35 || PYTHON36) +#if UCS2 && PYTHON3 [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, ExactSpelling=true, CharSet=CharSet.Unicode)] internal unsafe static extern IntPtr @@ -1633,8 +1632,7 @@ internal unsafe static extern IntPtr ExactSpelling = true, CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); - -#else +#elif UCS2 && PYTHON2 [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, EntryPoint="PyUnicodeUCS2_FromObject", ExactSpelling=true, CharSet=CharSet.Unicode)] @@ -1676,10 +1674,7 @@ internal unsafe static extern IntPtr ExactSpelling=true, CharSet=CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); -#endif -#endif -#if (UCS4) -#if (PYTHON33 || PYTHON34 || PYTHON35 || PYTHON36) +#elif UCS4 && PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling=true, CharSet=CharSet.Unicode)] internal unsafe static extern IntPtr @@ -1723,8 +1718,7 @@ internal unsafe static extern IntPtr ExactSpelling = true, CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); - -#else +#elif UCS4 && PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicodeUCS4_FromObject", ExactSpelling = true, CharSet = CharSet.Unicode)] @@ -1768,8 +1762,6 @@ internal unsafe static extern IntPtr ExactSpelling = true, CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); - -#endif #endif internal static IntPtr PyUnicode_FromString(string s) From 94b9e257eda8a6ce9af08091f3eea8f8ec9201d4 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 29 Jan 2017 13:40:28 -0700 Subject: [PATCH 004/324] Refactor Python version directives Added Python37 definition, won't add interop until final release --- src/runtime/assemblyinfo.cs | 15 +++--- src/runtime/runtime.cs | 96 +++++++++++-------------------------- 2 files changed, 35 insertions(+), 76 deletions(-) diff --git a/src/runtime/assemblyinfo.cs b/src/runtime/assemblyinfo.cs index 49433f0dc..1defa851f 100644 --- a/src/runtime/assemblyinfo.cs +++ b/src/runtime/assemblyinfo.cs @@ -15,20 +15,19 @@ #if PYTHON27 [assembly: AssemblyTitle("Python.Runtime for Python 2.7")] [assembly: AssemblyDescription("Python Runtime for Python 2.7")] -#endif -#if PYTHON33 +#elif PYTHON33 [assembly: AssemblyTitle("Python.Runtime for Python 3.3")] [assembly: AssemblyDescription("Python Runtime for Python 3.3")] -#endif -#if PYTHON34 +#elif PYTHON34 [assembly: AssemblyTitle("Python.Runtime for Python 3.4")] [assembly: AssemblyDescription("Python Runtime for Python 3.4")] -#endif -#if PYTHON35 +#elif PYTHON35 [assembly: AssemblyTitle("Python.Runtime for Python 3.5")] [assembly: AssemblyDescription("Python Runtime for Python 3.5")] -#endif -#if PYTHON36 +#elif PYTHON36 [assembly: AssemblyTitle("Python.Runtime for Python 3.6")] [assembly: AssemblyDescription("Python Runtime for Python 3.6")] +#elif PYTHON37 +[assembly: AssemblyTitle("Python.Runtime for Python 3.7")] +[assembly: AssemblyDescription("Python Runtime for Python 3.7")] #endif diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 84f237f30..4a67e8c65 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -103,96 +103,56 @@ public class Runtime #error You must define either UCS2 or UCS4! #endif -#if (PYTHON23) - public const string pyversion = "2.3"; - public const int pyversionnumber = 23; -#endif -#if (PYTHON24) - public const string pyversion = "2.4"; - public const int pyversionnumber = 24; -#endif -#if (PYTHON25) - public const string pyversion = "2.5"; - public const int pyversionnumber = 25; -#endif -#if (PYTHON26) - public const string pyversion = "2.6"; - public const int pyversionnumber = 26; -#endif -#if (PYTHON27) +#if PYTHON27 public const string pyversion = "2.7"; public const int pyversionnumber = 27; -#endif -#if (PYTHON32) - public const string pyversion = "3.2"; - public const int pyversionnumber = 32; -#endif -#if (PYTHON33) +#elif PYTHON33 public const string pyversion = "3.3"; public const int pyversionnumber = 33; -#endif -#if (PYTHON34) +#elif PYTHON34 public const string pyversion = "3.4"; public const int pyversionnumber = 34; -#endif -#if (PYTHON35) +#elif PYTHON35 public const string pyversion = "3.5"; public const int pyversionnumber = 35; -#endif -#if (PYTHON36) +#elif PYTHON36 public const string pyversion = "3.6"; public const int pyversionnumber = 36; -#endif -#if ! (PYTHON23 || PYTHON24 || PYTHON25 || PYTHON26 || PYTHON27 || PYTHON32 || PYTHON33 || PYTHON34 || PYTHON35 || PYTHON36) -#error You must define one of PYTHON23 to PYTHON36 +#elif PYTHON37 + // TODO: Add interop37 after Python3.7 is released + public const string pyversion = "3.7"; + public const int pyversionnumber = 37; +#else +#error You must define one of PYTHON33 to PYTHON37 or PYTHON27 #endif -#if (PYTHON23) - internal const string dllBase = "python23"; -#endif -#if (PYTHON24) - internal const string dllBase = "python24"; -#endif -#if (PYTHON25) - internal const string dllBase = "python25"; -#endif -#if (PYTHON26) - internal const string dllBase = "python26"; -#endif -#if (PYTHON27) +#if MONO_LINUX || MONO_OSX +#if PYTHON27 internal const string dllBase = "python27"; -#endif -#if (MONO_LINUX || MONO_OSX) -#if (PYTHON32) - internal const string dllBase = "python3.2"; -#endif -#if (PYTHON33) +#elif PYTHON33 internal const string dllBase = "python3.3"; -#endif -#if (PYTHON34) +#elif PYTHON34 internal const string dllBase = "python3.4"; -#endif -#if (PYTHON35) +#elif PYTHON35 internal const string dllBase = "python3.5"; -#endif -#if (PYTHON36) +#elif PYTHON36 internal const string dllBase = "python3.6"; +#elif PYTHON37 + internal const string dllBase = "python3.7"; #endif -#else -#if (PYTHON32) - internal const string dllBase = "python32"; -#endif -#if (PYTHON33) +#else // Windows +#if PYTHON27 + internal const string dllBase = "python27"; +#elif PYTHON33 internal const string dllBase = "python33"; -#endif -#if (PYTHON34) +#elif PYTHON34 internal const string dllBase = "python34"; -#endif -#if (PYTHON35) +#elif PYTHON35 internal const string dllBase = "python35"; -#endif -#if (PYTHON36) +#elif PYTHON36 internal const string dllBase = "python36"; +#elif PYTHON37 + internal const string dllBase = "python37"; #endif #endif From dde711495055c2f77d705ef253bf9c2bd1cbb664 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 29 Jan 2017 13:41:27 -0700 Subject: [PATCH 005/324] Misc directives in runtime --- src/runtime/runtime.cs | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 4a67e8c65..5f0ecfbd2 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1,13 +1,10 @@ using System; using System.Runtime.InteropServices; using System.Security; -#if (UCS4) +#if UCS4 using System.Text; using Mono.Unix; - -#endif - -#if (UCS2 && PYTHON3) +#elif UCS2 && PYTHON3 using System.Text; #endif @@ -16,7 +13,7 @@ namespace Python.Runtime [SuppressUnmanagedCodeSecurityAttribute()] static class NativeMethods { -#if (MONO_LINUX || MONO_OSX) +#if MONO_LINUX || MONO_OSX static public IntPtr LoadLibrary(string fileName) { return dlopen(fileName, RTLD_NOW | RTLD_SHARED); } @@ -40,7 +37,7 @@ static public IntPtr GetProcAddress(IntPtr dllHandle, string name) { return res; } -#if (MONO_OSX) +#if MONO_OSX static int RTLD_NOW = 0x2; static int RTLD_SHARED = 0x20; static IntPtr RTLD_DEFAULT = new IntPtr(-2); @@ -56,7 +53,7 @@ static public IntPtr GetProcAddress(IntPtr dllHandle, string name) { [DllImport("__Internal")] private static extern IntPtr dlerror(); -#else +#elif MONO_LINUX static int RTLD_NOW = 0x2; static int RTLD_SHARED = 0x20; static IntPtr RTLD_DEFAULT = IntPtr.Zero; @@ -74,7 +71,7 @@ static public IntPtr GetProcAddress(IntPtr dllHandle, string name) { private static extern IntPtr dlerror(); #endif -#else +#else // Windows [DllImport("kernel32.dll")] public static extern IntPtr LoadLibrary(string dllToLoad); @@ -93,13 +90,11 @@ public class Runtime /// the responsibility of the caller to have acquired the GIL /// before calling any of these methods. /// -#if (UCS4) +#if UCS4 public const int UCS = 4; -#endif -#if (UCS2) +#elif UCS2 public const int UCS = 2; -#endif -#if ! (UCS2 || UCS4) +#else #error You must define either UCS2 or UCS4! #endif @@ -156,23 +151,23 @@ public class Runtime #endif #endif -#if (PYTHON_WITH_PYDEBUG) +#if PYTHON_WITH_PYDEBUG internal const string dllWithPyDebug = "d"; #else internal const string dllWithPyDebug = ""; #endif -#if (PYTHON_WITH_PYMALLOC) +#if PYTHON_WITH_PYMALLOC internal const string dllWithPyMalloc = "m"; #else internal const string dllWithPyMalloc = ""; #endif -#if (PYTHON_WITH_WIDE_UNICODE) +#if PYTHON_WITH_WIDE_UNICODE internal const string dllWithWideUnicode = "u"; #else internal const string dllWithWideUnicode = ""; #endif -#if (PYTHON_WITHOUT_ENABLE_SHARED) +#if PYTHON_WITHOUT_ENABLE_SHARED public const string dll = "__Internal"; #else public const string dll = dllBase + dllWithPyDebug + dllWithPyMalloc + dllWithWideUnicode; @@ -504,7 +499,7 @@ internal static Type[] PythonArgsToTypeArray(IntPtr arg, bool mangleObjects) internal unsafe static void XIncref(IntPtr op) { -#if (Py_DEBUG) +#if Py_DEBUG // according to Python doc, Py_IncRef() is Py_XINCREF() Py_IncRef(op); return; @@ -526,7 +521,7 @@ internal unsafe static void XIncref(IntPtr op) internal static unsafe void XDecref(IntPtr op) { -#if (Py_DEBUG) +#if Py_DEBUG // Py_DecRef calls Python's Py_DECREF // according to Python doc, Py_DecRef() is Py_XDECREF() Py_DecRef(op); @@ -581,7 +576,7 @@ internal unsafe static long Refcount(IntPtr op) return 0; } -#if (Py_DEBUG) +#if Py_DEBUG // Py_IncRef and Py_DecRef are taking care of the extra payload // in Py_DEBUG builds of Python like _Py_RefTotal [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, @@ -892,7 +887,7 @@ internal unsafe static IntPtr { return IntPtr.Zero; } -#if (Py_DEBUG) +#if Py_DEBUG int n = 3; #else int n = 1; From 67c161266b6c36612eaaf465a549da99112f482a Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 12 Jan 2017 12:44:38 -0700 Subject: [PATCH 006/324] Use built-in check_output (mostly) Replace one check_output to check_call since we don't use the output. --- setup.py | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/setup.py b/setup.py index f8409799a..d854cd141 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ from distutils.spawn import find_executable from distutils import log from platform import architecture -from subprocess import Popen, CalledProcessError, PIPE, check_call +from subprocess import check_output, check_call from glob import glob import fnmatch import sys @@ -179,7 +179,7 @@ def build_extension(self, ext): interop_file = _get_interop_filename() if not os.path.exists(interop_file): geninterop = os.path.join("tools", "geninterop", "geninterop.py") - _check_output([sys.executable, geninterop, interop_file]) + check_call([sys.executable, geninterop, interop_file]) cmd = [ _xbuild, @@ -285,18 +285,9 @@ def run(self): return install_data.run(self) -def _check_output(*popenargs, **kwargs): - """subprocess.check_output from python 2.7. - Added here to support building for earlier versions of Python. - """ - process = Popen(stdout=PIPE, *popenargs, **kwargs) - output, unused_err = process.communicate() - retcode = process.poll() - if retcode: - cmd = kwargs.get("args") - if cmd is None: - cmd = popenargs[0] - raise CalledProcessError(retcode, cmd, output=output) +def _check_output(*args, **kwargs): + """Check output wrapper for py2/py3 compatibility""" + output = check_output(*args, **kwargs) if sys.version_info[0] > 2: return output.decode("ascii") return output From 9143b5491e27f2146159179beb0cb3432f98ee90 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 27 Jan 2017 10:45:45 -0700 Subject: [PATCH 007/324] Rename build classes, and PLATFORM to ARCH --- setup.py | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/setup.py b/setup.py index d854cd141..992030ae2 100644 --- a/setup.py +++ b/setup.py @@ -23,7 +23,7 @@ CONFIG = "Release" # Release or Debug DEVTOOLS = "MsDev" if sys.platform == "win32" else "Mono" VERBOSITY = "minimal" # quiet, minimal, normal, detailed, diagnostic -PLATFORM = "x64" if architecture()[0] == "64bit" else "x86" +ARCH = "x64" if architecture()[0] == "64bit" else "x86" def _find_msbuild_tool(tool="msbuild.exe", use_windows_sdk=False): @@ -41,7 +41,7 @@ def _find_msbuild_tool(tool="msbuild.exe", use_windows_sdk=False): if use_windows_sdk: sdks_root = r"SOFTWARE\Microsoft\Microsoft SDKs\Windows" kits_root = r"SOFTWARE\Microsoft\Windows Kits\Installed Roots" - kits_suffix = os.path.join("bin", PLATFORM) + kits_suffix = os.path.join("bin", ARCH) keys_to_check.extend([ ("Windows Kit 10.0", kits_root, "KitsRoot10", kits_suffix), ("Windows Kit 8.1", kits_root, "KitsRoot81", kits_suffix), @@ -91,7 +91,7 @@ def _find_msbuild_tool(tool="msbuild.exe", use_windows_sdk=False): if use_windows_sdk: localappdata = os.environ["LOCALAPPDATA"] pywinsdk = localappdata + r"\Programs\Common\Microsoft\Visual C++ for Python\9.0\WinSDK\Bin" - if PLATFORM == "x64": + if ARCH == "x64": pywinsdk += r"\x64" paths_to_check.append(("Visual C++ for Python", pywinsdk)) @@ -119,7 +119,7 @@ def _find_msbuild_tool(tool="msbuild.exe", use_windows_sdk=False): "DevTools %s not supported (use MsDev or Mono)" % DEVTOOLS) -class PythonNET_BuildExt(build_ext): +class BuildExtPythonnet(build_ext): def build_extension(self, ext): """Builds the .pyd file using msbuild or xbuild""" if ext.name != "clr": @@ -185,7 +185,7 @@ def build_extension(self, ext): _xbuild, "pythonnet.sln", "/p:Configuration=%s" % _config, - "/p:Platform=%s" % PLATFORM, + "/p:Platform=%s" % ARCH, "/p:DefineConstants=\"%s\"" % _defines_sep.join(defines), "/p:PythonBuildDir=\"%s\"" % os.path.abspath(dest_dir), "/p:PythonInteropFile=\"%s\"" % os.path.basename(interop_file), @@ -250,7 +250,7 @@ def _install_packages(self): check_call(cmd, shell=use_shell) -class PythonNET_InstallLib(install_lib): +class InstallLibPythonnet(install_lib): def install(self): if not os.path.isdir(self.build_dir): self.warn("'%s' does not exist -- no Python modules to install" % @@ -262,16 +262,18 @@ def install(self): # only copy clr.pyd/.so for srcfile in glob(os.path.join(self.build_dir, "clr.*")): - destfile = os.path.join(self.install_dir, os.path.basename(srcfile)) + destfile = os.path.join( + self.install_dir, os.path.basename(srcfile)) self.copy_file(srcfile, destfile) -class PythonNET_InstallData(install_data): +class InstallDataPythonnet(install_data): def run(self): build_cmd = self.get_finalized_command("build_ext") install_cmd = self.get_finalized_command("install") build_lib = os.path.abspath(build_cmd.build_lib) - install_platlib = os.path.relpath(install_cmd.install_platlib, self.install_dir) + install_platlib = os.path.relpath( + install_cmd.install_platlib, self.install_dir) for i, data_files in enumerate(self.data_files): if isinstance(data_files, str): @@ -313,7 +315,8 @@ def _get_interop_filename(): sources.extend(glob("*" + ext)) for root, dirnames, filenames in os.walk("src"): - for ext in (".cs", ".csproj", ".sln", ".snk", ".config", ".il", ".py", ".c", ".h", ".ico"): + for ext in (".cs", ".csproj", ".sln", ".snk", ".config", ".il", + ".py", ".c", ".h", ".ico"): for filename in fnmatch.filter(filenames, "*" + ext): sources.append(os.path.join(root, filename)) @@ -360,9 +363,9 @@ def _get_interop_filename(): ], zip_safe=False, cmdclass={ - "build_ext": PythonNET_BuildExt, - "install_lib": PythonNET_InstallLib, - "install_data": PythonNET_InstallData, + "build_ext": BuildExtPythonnet, + "install_lib": InstallLibPythonnet, + "install_data": InstallDataPythonnet, }, setup_requires=setup_requires ) From 53590980202b62dc9854a1a21c0c43303722bdca Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 27 Jan 2017 10:50:13 -0700 Subject: [PATCH 008/324] Organize imports --- setup.py | 75 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/setup.py b/setup.py index 992030ae2..30f3719fb 100644 --- a/setup.py +++ b/setup.py @@ -6,36 +6,35 @@ an egg or wheel. """ -from setuptools import setup, Extension -from distutils.command.build_ext import build_ext -from distutils.command.install_lib import install_lib -from distutils.command.install_data import install_data -from distutils.sysconfig import get_config_var -from distutils.spawn import find_executable -from distutils import log -from platform import architecture -from subprocess import check_output, check_call -from glob import glob import fnmatch -import sys +import glob import os +import platform +import subprocess +import sys +import sysconfig +from distutils import log, spawn +from distutils.command import build_ext, install_data, install_lib + +from setuptools import Extension, setup CONFIG = "Release" # Release or Debug -DEVTOOLS = "MsDev" if sys.platform == "win32" else "Mono" VERBOSITY = "minimal" # quiet, minimal, normal, detailed, diagnostic -ARCH = "x64" if architecture()[0] == "64bit" else "x86" + +DEVTOOLS = "MsDev" if sys.platform == "win32" else "Mono" +ARCH = "x64" if platform.architecture()[0] == "64bit" else "x86" def _find_msbuild_tool(tool="msbuild.exe", use_windows_sdk=False): """Return full path to one of the Microsoft build tools""" - path = find_executable(tool) + path = spawn.find_executable(tool) if path: return path - try: - import _winreg - except ImportError: - import winreg as _winreg + try: # PY2 + import _winreg as winreg + except ImportError: # PY3 + import winreg keys_to_check = [] if use_windows_sdk: @@ -64,16 +63,16 @@ def _find_msbuild_tool(tool="msbuild.exe", use_windows_sdk=False): # read the possible tools paths from the various registry locations paths_to_check = [] - hreg = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE) + hreg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) try: for key_to_check in keys_to_check: sdk_name, key, value_name = key_to_check[:3] suffix = key_to_check[3] if len(key_to_check) > 3 else None hkey = None try: - hkey = _winreg.OpenKey(hreg, key) - val, type_ = _winreg.QueryValueEx(hkey, value_name) - if type_ != _winreg.REG_SZ: + hkey = winreg.OpenKey(hreg, key) + val, type_ = winreg.QueryValueEx(hkey, value_name) + if type_ != winreg.REG_SZ: continue if suffix: val = os.path.join(val, suffix) @@ -119,11 +118,11 @@ def _find_msbuild_tool(tool="msbuild.exe", use_windows_sdk=False): "DevTools %s not supported (use MsDev or Mono)" % DEVTOOLS) -class BuildExtPythonnet(build_ext): +class BuildExtPythonnet(build_ext.build_ext): def build_extension(self, ext): """Builds the .pyd file using msbuild or xbuild""" if ext.name != "clr": - return build_ext.build_extension(self, ext) + return build_ext.build_ext.build_extension(self, ext) # install packages using nuget self._install_packages() @@ -157,7 +156,7 @@ def build_extension(self, ext): defines.append("MONO_LINUX") # Check if --enable-shared was set when Python was built - enable_shared = get_config_var("Py_ENABLE_SHARED") + enable_shared = sysconfig.get_config_var("Py_ENABLE_SHARED") if enable_shared: # Double-check if libpython is linked dynamically with python lddout = _check_output(["ldd", sys.executable]) @@ -179,7 +178,7 @@ def build_extension(self, ext): interop_file = _get_interop_filename() if not os.path.exists(interop_file): geninterop = os.path.join("tools", "geninterop", "geninterop.py") - check_call([sys.executable, geninterop, interop_file]) + subprocess.check_call([sys.executable, geninterop, interop_file]) cmd = [ _xbuild, @@ -198,8 +197,8 @@ def build_extension(self, ext): self.announce("Building: %s" % " ".join(cmd)) use_shell = True if DEVTOOLS == "Mono" else False - check_call(" ".join(cmd + ["/t:Clean"]), shell=use_shell) - check_call(" ".join(cmd + ["/t:Build"]), shell=use_shell) + subprocess.check_call(" ".join(cmd + ["/t:Clean"]), shell=use_shell) + subprocess.check_call(" ".join(cmd + ["/t:Build"]), shell=use_shell) if DEVTOOLS == "Mono": self._build_monoclr(ext) @@ -211,7 +210,7 @@ def _get_manifest(self, build_dir): cmd = [mt, '-inputresource:"%s"' % sys.executable, '-out:"%s"' % manifest] self.announce("Extracting manifest from %s" % sys.executable) - check_call(" ".join(cmd), shell=False) + subprocess.check_call(" ".join(cmd), shell=False) return manifest def _build_monoclr(self, ext): @@ -231,7 +230,7 @@ def _build_monoclr(self, ext): extra_compile_args=cflags.split(" "), extra_link_args=libs.split(" ")) - build_ext.build_extension(self, clr_ext) + build_ext.build_ext.build_extension(self, clr_ext) def _install_packages(self): """install packages using nuget""" @@ -243,14 +242,14 @@ def _install_packages(self): cmd = "%s update -self" % nuget self.announce("Updating NuGet: %s" % cmd) - check_call(cmd, shell=use_shell) + subprocess.check_call(cmd, shell=use_shell) cmd = "%s restore pythonnet.sln -o packages" % nuget self.announce("Installing packages: %s" % cmd) - check_call(cmd, shell=use_shell) + subprocess.check_call(cmd, shell=use_shell) -class InstallLibPythonnet(install_lib): +class InstallLibPythonnet(install_lib.install_lib): def install(self): if not os.path.isdir(self.build_dir): self.warn("'%s' does not exist -- no Python modules to install" % @@ -261,13 +260,13 @@ def install(self): self.mkpath(self.install_dir) # only copy clr.pyd/.so - for srcfile in glob(os.path.join(self.build_dir, "clr.*")): + for srcfile in glob.glob(os.path.join(self.build_dir, "clr.*")): destfile = os.path.join( self.install_dir, os.path.basename(srcfile)) self.copy_file(srcfile, destfile) -class InstallDataPythonnet(install_data): +class InstallDataPythonnet(install_data.install_data): def run(self): build_cmd = self.get_finalized_command("build_ext") install_cmd = self.get_finalized_command("install") @@ -284,12 +283,12 @@ def run(self): dest = data_files[0].format(install_platlib=install_platlib) self.data_files[i] = dest, data_files[1] - return install_data.run(self) + return install_data.install_data.run(self) def _check_output(*args, **kwargs): """Check output wrapper for py2/py3 compatibility""" - output = check_output(*args, **kwargs) + output = subprocess.check_output(*args, **kwargs) if sys.version_info[0] > 2: return output.decode("ascii") return output @@ -312,7 +311,7 @@ def _get_interop_filename(): sources = [] for ext in (".sln", ".snk", ".config"): - sources.extend(glob("*" + ext)) + sources.extend(glob.glob("*" + ext)) for root, dirnames, filenames in os.walk("src"): for ext in (".cs", ".csproj", ".sln", ".snk", ".config", ".il", From 0078d7600e0337d2cec77773f7c2aa58f81b90c8 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 27 Jan 2017 13:51:10 -0700 Subject: [PATCH 009/324] Move to appropriate context --- setup.py | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/setup.py b/setup.py index 30f3719fb..c160009af 100644 --- a/setup.py +++ b/setup.py @@ -103,21 +103,6 @@ def _find_msbuild_tool(tool="msbuild.exe", use_windows_sdk=False): raise RuntimeError("%s could not be found" % tool) -if DEVTOOLS == "MsDev": - _xbuild = "\"%s\"" % _find_msbuild_tool("msbuild.exe") - _defines_sep = ";" - _config = "%sWin" % CONFIG - -elif DEVTOOLS == "Mono": - _xbuild = "xbuild" - _defines_sep = "," - _config = "%sMono" % CONFIG - -else: - raise NotImplementedError( - "DevTools %s not supported (use MsDev or Mono)" % DEVTOOLS) - - class BuildExtPythonnet(build_ext.build_ext): def build_extension(self, ext): """Builds the .pyd file using msbuild or xbuild""" @@ -180,6 +165,19 @@ def build_extension(self, ext): geninterop = os.path.join("tools", "geninterop", "geninterop.py") subprocess.check_call([sys.executable, geninterop, interop_file]) + if DEVTOOLS == "MsDev": + _xbuild = '"{0}"'.format(_find_msbuild_tool("msbuild.exe")) + _defines_sep = ";" + _config = "{0}Win".format(CONFIG) + + elif DEVTOOLS == "Mono": + _xbuild = "xbuild" + _defines_sep = "," + _config = "{0}Mono".format(CONFIG) + else: + raise NotImplementedError( + "DevTool {0} not supported (use MsDev/Mono)".format(DEVTOOLS)) + cmd = [ _xbuild, "pythonnet.sln", From 8fe702a0907adf123bec849eeddfe7f0ca966c27 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 27 Jan 2017 14:44:00 -0700 Subject: [PATCH 010/324] Refactor registry search Use context manager for closing registries --- setup.py | 128 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 73 insertions(+), 55 deletions(-) diff --git a/setup.py b/setup.py index c160009af..365dc2147 100644 --- a/setup.py +++ b/setup.py @@ -6,6 +6,7 @@ an egg or wheel. """ +import collections import fnmatch import glob import os @@ -24,83 +25,100 @@ DEVTOOLS = "MsDev" if sys.platform == "win32" else "Mono" ARCH = "x64" if platform.architecture()[0] == "64bit" else "x86" +############################################################################### +# Windows Keys Constants for MSBUILD tools +RegKey = collections.namedtuple('RegKey', 'sdk_name key value_name suffix') +vs_python = "Programs\\Common\\Microsoft\\Visual C++ for Python\\9.0\\WinSDK" +vs_root = "SOFTWARE\\Microsoft\\MSBuild\\ToolsVersions\\{0}" +sdks_root = "SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v{0}Win32Tools" +kits_root = "SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots" +kits_suffix = os.path.join("bin", ARCH) +WIN_SDK_KEYS = ( + RegKey(sdk_name="Windows Kit 10.0", key=kits_root, + value_name="KitsRoot10", suffix=kits_suffix), + + RegKey(sdk_name="Windows Kit 8.1", key=kits_root, + value_name="KitsRoot81", suffix=kits_suffix), + + RegKey(sdk_name="Windows Kit 8.0", key=kits_root, + value_name="KitsRoot", suffix=kits_suffix), + + RegKey(sdk_name="Windows SDK 7.1A", key=sdks_root.format("7.1A\\WinSDK-"), + value_name="InstallationFolder", suffix=""), + + RegKey(sdk_name="Windows SDK 7.1", key=sdks_root.format("7.1\\WinSDK"), + value_name="InstallationFolder", suffix=""), + + RegKey(sdk_name="Windows SDK 7.0A", key=sdks_root.format("7.0A\\WinSDK-"), + value_name="InstallationFolder", suffix=""), + + RegKey(sdk_name="Windows SDK 7.0", key=sdks_root.format("7.0\\WinSDK"), + value_name="InstallationFolder", suffix=""), + + RegKey(sdk_name="Windows SDK 6.0A", key=sdks_root.format("6.0A\\WinSDK"), + value_name="InstallationFolder", suffix=""), +) + +VS_KEYS = ( + RegKey(sdk_name="MSBuild 14", key=vs_root.format("14.0"), + value_name="MSBuildToolsPath", suffix=""), + + RegKey(sdk_name="MSBuild 12", key=vs_root.format("12.0"), + value_name="MSBuildToolsPath", suffix=""), + + RegKey(sdk_name="MSBuild 4", key=vs_root.format("4.0"), + value_name="MSBuildToolsPath", suffix=""), + + RegKey(sdk_name="MSBuild 3.5", key=vs_root.format("3.5"), + value_name="MSBuildToolsPath", suffix=""), + + RegKey(sdk_name="MSBuild 2.0", key=vs_root.format("2.0"), + value_name="MSBuildToolsPath", suffix=""), +) + + +############################################################################### def _find_msbuild_tool(tool="msbuild.exe", use_windows_sdk=False): """Return full path to one of the Microsoft build tools""" + # Search in PATH first path = spawn.find_executable(tool) if path: return path + # Search within registry to find build tools try: # PY2 import _winreg as winreg except ImportError: # PY3 import winreg - keys_to_check = [] - if use_windows_sdk: - sdks_root = r"SOFTWARE\Microsoft\Microsoft SDKs\Windows" - kits_root = r"SOFTWARE\Microsoft\Windows Kits\Installed Roots" - kits_suffix = os.path.join("bin", ARCH) - keys_to_check.extend([ - ("Windows Kit 10.0", kits_root, "KitsRoot10", kits_suffix), - ("Windows Kit 8.1", kits_root, "KitsRoot81", kits_suffix), - ("Windows Kit 8.0", kits_root, "KitsRoot", kits_suffix), - ("Windows SDK 7.1A", sdks_root + r"\v7.1A\WinSDK-Win32Tools", "InstallationFolder"), - ("Windows SDK 7.1", sdks_root + r"\v7.1\WinSDKWin32Tools", "InstallationFolder"), - ("Windows SDK 7.0A", sdks_root + r"\v7.0A\WinSDK-Win32Tools", "InstallationFolder"), - ("Windows SDK 7.0", sdks_root + r"\v7.0\WinSDKWin32Tools", "InstallationFolder"), - ("Windows SDK 6.0A", sdks_root + r"\v6.0A\WinSDKWin32Tools", "InstallationFolder") - ]) - else: - vs_root = r"SOFTWARE\Microsoft\MSBuild\ToolsVersions" - keys_to_check.extend([ - ("MSBuild 14", vs_root + r"\14.0", "MSBuildToolsPath"), - ("MSBuild 12", vs_root + r"\12.0", "MSBuildToolsPath"), - ("MSBuild 4", vs_root + r"\4.0", "MSBuildToolsPath"), - ("MSBuild 3.5", vs_root + r"\3.5", "MSBuildToolsPath"), - ("MSBuild 2.0", vs_root + r"\2.0", "MSBuildToolsPath") - ]) - - # read the possible tools paths from the various registry locations - paths_to_check = [] - hreg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) - try: - for key_to_check in keys_to_check: - sdk_name, key, value_name = key_to_check[:3] - suffix = key_to_check[3] if len(key_to_check) > 3 else None - hkey = None - try: - hkey = winreg.OpenKey(hreg, key) - val, type_ = winreg.QueryValueEx(hkey, value_name) + keys_to_check = WIN_SDK_KEYS if use_windows_sdk else VS_KEYS + for rkey in keys_to_check: + try: + with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, rkey.key) as hkey: + val, type_ = winreg.QueryValueEx(hkey, rkey.value_name) if type_ != winreg.REG_SZ: continue - if suffix: - val = os.path.join(val, suffix) - paths_to_check.append((sdk_name, val)) - except WindowsError: - pass - finally: - if hkey: - hkey.Close() - finally: - hreg.Close() + path = os.path.join(val, rkey.suffix, tool) + if os.path.exists(path): + log.info("Using {0} from {1}".format(tool, rkey.sdk_name)) + return path + except WindowsError: + # Key doesn't exist + pass # Add Visual C++ for Python as a fall-back in case one # of the other Windows SDKs isn't installed if use_windows_sdk: + sdk_name = "Visual C++ for Python" localappdata = os.environ["LOCALAPPDATA"] - pywinsdk = localappdata + r"\Programs\Common\Microsoft\Visual C++ for Python\9.0\WinSDK\Bin" - if ARCH == "x64": - pywinsdk += r"\x64" - paths_to_check.append(("Visual C++ for Python", pywinsdk)) - - for sdk_name, path in paths_to_check: - path = os.path.join(path, tool) + suffix = "Bin\\x64" if ARCH == "x64" else "Bin" + path = os.path.join(localappdata, vs_python, suffix, tool) if os.path.exists(path): - log.info("Using %s from %s" % (tool, sdk_name)) + log.info("Using {0} from {1}".format(tool, sdk_name)) return path - raise RuntimeError("%s could not be found" % tool) + raise RuntimeError("{0} could not be found".format(tool)) class BuildExtPythonnet(build_ext.build_ext): From de630171ef0516fb1a038248674f482027df91ac Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 28 Jan 2017 09:25:57 -0700 Subject: [PATCH 011/324] Format setup.py --- setup.py | 81 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/setup.py b/setup.py index 365dc2147..bd048f71f 100644 --- a/setup.py +++ b/setup.py @@ -24,6 +24,8 @@ DEVTOOLS = "MsDev" if sys.platform == "win32" else "Mono" ARCH = "x64" if platform.architecture()[0] == "64bit" else "x86" +PY_MAJOR = sys.version_info[0] +PY_MINOR = sys.version_info[1] ############################################################################### # Windows Keys Constants for MSBUILD tools @@ -144,9 +146,9 @@ def build_extension(self, ext): unicode_width = ctypes.sizeof(ctypes.c_wchar) defines = [ - "PYTHON%d%d" % (sys.version_info[:2]), - "PYTHON%d" % (sys.version_info[:1]), # Python Major Version - "UCS%d" % unicode_width, + "PYTHON{0}{1}".format(PY_MAJOR, PY_MINOR), + "PYTHON{0}".format(PY_MAJOR), # Python Major Version + "UCS{0}".format(unicode_width), ] if CONFIG == "Debug": @@ -185,12 +187,10 @@ def build_extension(self, ext): if DEVTOOLS == "MsDev": _xbuild = '"{0}"'.format(_find_msbuild_tool("msbuild.exe")) - _defines_sep = ";" _config = "{0}Win".format(CONFIG) elif DEVTOOLS == "Mono": _xbuild = "xbuild" - _defines_sep = "," _config = "{0}Mono".format(CONFIG) else: raise NotImplementedError( @@ -198,38 +198,38 @@ def build_extension(self, ext): cmd = [ _xbuild, - "pythonnet.sln", - "/p:Configuration=%s" % _config, - "/p:Platform=%s" % ARCH, - "/p:DefineConstants=\"%s\"" % _defines_sep.join(defines), - "/p:PythonBuildDir=\"%s\"" % os.path.abspath(dest_dir), - "/p:PythonInteropFile=\"%s\"" % os.path.basename(interop_file), - "/verbosity:%s" % VERBOSITY, + 'pythonnet.sln', + '/p:Configuration={}'.format(_config), + '/p:Platform={}'.format(ARCH), + '/p:DefineConstants="{}"'.format(','.join(defines)), + '/p:PythonBuildDir="{}"'.format(os.path.abspath(dest_dir)), + '/p:PythonInteropFile="{}"'.format(os.path.basename(interop_file)), + '/verbosity:{}'.format(VERBOSITY), ] manifest = self._get_manifest(dest_dir) if manifest: - cmd.append("/p:PythonManifest=\"%s\"" % manifest) + cmd.append('/p:PythonManifest="{0}"'.format(manifest)) - self.announce("Building: %s" % " ".join(cmd)) + self.announce("Building: {0}".format(" ".join(cmd))) use_shell = True if DEVTOOLS == "Mono" else False subprocess.check_call(" ".join(cmd + ["/t:Clean"]), shell=use_shell) subprocess.check_call(" ".join(cmd + ["/t:Build"]), shell=use_shell) if DEVTOOLS == "Mono": - self._build_monoclr(ext) + self._build_monoclr() def _get_manifest(self, build_dir): if DEVTOOLS == "MsDev" and sys.version_info[:2] > (2, 5): mt = _find_msbuild_tool("mt.exe", use_windows_sdk=True) manifest = os.path.abspath(os.path.join(build_dir, "app.manifest")) - cmd = [mt, '-inputresource:"%s"' % sys.executable, - '-out:"%s"' % manifest] - self.announce("Extracting manifest from %s" % sys.executable) + cmd = [mt, '-inputresource:"{0}"'.format(sys.executable), + '-out:"{0}"'.format(manifest)] + self.announce("Extracting manifest from {}".format(sys.executable)) subprocess.check_call(" ".join(cmd), shell=False) return manifest - def _build_monoclr(self, ext): + def _build_monoclr(self): mono_libs = _check_output("pkg-config --libs mono-2", shell=True) mono_cflags = _check_output("pkg-config --cflags mono-2", shell=True) glib_libs = _check_output("pkg-config --libs glib-2.0", shell=True) @@ -238,13 +238,15 @@ def _build_monoclr(self, ext): libs = mono_libs.strip() + " " + glib_libs.strip() # build the clr python module - clr_ext = Extension("clr", - sources=[ - "src/monoclr/pynetinit.c", - "src/monoclr/clrmod.c" - ], - extra_compile_args=cflags.split(" "), - extra_link_args=libs.split(" ")) + clr_ext = Extension( + "clr", + sources=[ + "src/monoclr/pynetinit.c", + "src/monoclr/clrmod.c" + ], + extra_compile_args=cflags.split(" "), + extra_link_args=libs.split(" ") + ) build_ext.build_ext.build_extension(self, clr_ext) @@ -253,23 +255,23 @@ def _install_packages(self): nuget = os.path.join("tools", "nuget", "nuget.exe") use_shell = False if DEVTOOLS == "Mono": - nuget = "mono %s" % nuget + nuget = "mono {0}".format(nuget) use_shell = True - cmd = "%s update -self" % nuget - self.announce("Updating NuGet: %s" % cmd) + cmd = "{0} update -self".format(nuget) + self.announce("Updating NuGet: {0}".format(cmd)) subprocess.check_call(cmd, shell=use_shell) - cmd = "%s restore pythonnet.sln -o packages" % nuget - self.announce("Installing packages: %s" % cmd) + cmd = "{0} restore pythonnet.sln -o packages".format(nuget) + self.announce("Installing packages: {0}".format(cmd)) subprocess.check_call(cmd, shell=use_shell) class InstallLibPythonnet(install_lib.install_lib): def install(self): if not os.path.isdir(self.build_dir): - self.warn("'%s' does not exist -- no Python modules to install" % - self.build_dir) + self.warn("'{0}' does not exist -- no Python modules" + " to install".format(self.build_dir)) return if not os.path.exists(self.install_dir): @@ -305,9 +307,9 @@ def run(self): def _check_output(*args, **kwargs): """Check output wrapper for py2/py3 compatibility""" output = subprocess.check_output(*args, **kwargs) - if sys.version_info[0] > 2: - return output.decode("ascii") - return output + if PY_MAJOR == 2: + return output + return output.decode("ascii") def _get_interop_filename(): @@ -316,8 +318,9 @@ def _get_interop_filename(): as most windows users won't have Clang installed, which is required to generate the file. """ - interop_file = "interop%d%d%s.cs" % (sys.version_info[0], sys.version_info[1], getattr(sys, "abiflags", "")) - return os.path.join("src", "runtime", interop_file) + interop_filename = "interop{0}{1}{2}.cs".format( + PY_MAJOR, PY_MINOR, getattr(sys, "abiflags", "")) + return os.path.join("src", "runtime", interop_filename) if __name__ == "__main__": @@ -382,5 +385,5 @@ def _get_interop_filename(): "install_lib": InstallLibPythonnet, "install_data": InstallDataPythonnet, }, - setup_requires=setup_requires + setup_requires=setup_requires, ) From ee210011a7b285e16ce4523f24b6fe5c36c3d01f Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 28 Jan 2017 15:31:02 -0700 Subject: [PATCH 012/324] Organize functions --- setup.py | 141 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 73 insertions(+), 68 deletions(-) diff --git a/setup.py b/setup.py index bd048f71f..847bde9a1 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ import subprocess import sys import sysconfig -from distutils import log, spawn +from distutils import spawn from distutils.command import build_ext, install_data, install_lib from setuptools import Extension, setup @@ -81,46 +81,23 @@ ############################################################################### -def _find_msbuild_tool(tool="msbuild.exe", use_windows_sdk=False): - """Return full path to one of the Microsoft build tools""" - # Search in PATH first - path = spawn.find_executable(tool) - if path: - return path - - # Search within registry to find build tools - try: # PY2 - import _winreg as winreg - except ImportError: # PY3 - import winreg - - keys_to_check = WIN_SDK_KEYS if use_windows_sdk else VS_KEYS - for rkey in keys_to_check: - try: - with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, rkey.key) as hkey: - val, type_ = winreg.QueryValueEx(hkey, rkey.value_name) - if type_ != winreg.REG_SZ: - continue - path = os.path.join(val, rkey.suffix, tool) - if os.path.exists(path): - log.info("Using {0} from {1}".format(tool, rkey.sdk_name)) - return path - except WindowsError: - # Key doesn't exist - pass - - # Add Visual C++ for Python as a fall-back in case one - # of the other Windows SDKs isn't installed - if use_windows_sdk: - sdk_name = "Visual C++ for Python" - localappdata = os.environ["LOCALAPPDATA"] - suffix = "Bin\\x64" if ARCH == "x64" else "Bin" - path = os.path.join(localappdata, vs_python, suffix, tool) - if os.path.exists(path): - log.info("Using {0} from {1}".format(tool, sdk_name)) - return path +def _check_output(*args, **kwargs): + """Check output wrapper for py2/py3 compatibility""" + output = subprocess.check_output(*args, **kwargs) + if PY_MAJOR == 2: + return output + return output.decode("ascii") - raise RuntimeError("{0} could not be found".format(tool)) + +def _get_interop_filename(): + """interopXX.cs is auto-generated as part of the build. + For common windows platforms pre-generated files are included + as most windows users won't have Clang installed, which is + required to generate the file. + """ + interop_filename = "interop{0}{1}{2}.cs".format( + PY_MAJOR, PY_MINOR, getattr(sys, "abiflags", "")) + return os.path.join("src", "runtime", interop_filename) class BuildExtPythonnet(build_ext.build_ext): @@ -139,6 +116,7 @@ def build_extension(self, ext): # Up to Python 3.2 sys.maxunicode is used to determine the size of # Py_UNICODE, but from 3.3 onwards Py_UNICODE is a typedef of wchar_t. + # TODO: Is this doing the right check for Py27? if sys.version_info[:2] <= (3, 2): unicode_width = 2 if sys.maxunicode < 0x10FFFF else 4 else: @@ -186,7 +164,7 @@ def build_extension(self, ext): subprocess.check_call([sys.executable, geninterop, interop_file]) if DEVTOOLS == "MsDev": - _xbuild = '"{0}"'.format(_find_msbuild_tool("msbuild.exe")) + _xbuild = '"{0}"'.format(self._find_msbuild_tool("msbuild.exe")) _config = "{0}Win".format(CONFIG) elif DEVTOOLS == "Mono": @@ -220,14 +198,15 @@ def build_extension(self, ext): self._build_monoclr() def _get_manifest(self, build_dir): - if DEVTOOLS == "MsDev" and sys.version_info[:2] > (2, 5): - mt = _find_msbuild_tool("mt.exe", use_windows_sdk=True) - manifest = os.path.abspath(os.path.join(build_dir, "app.manifest")) - cmd = [mt, '-inputresource:"{0}"'.format(sys.executable), - '-out:"{0}"'.format(manifest)] - self.announce("Extracting manifest from {}".format(sys.executable)) - subprocess.check_call(" ".join(cmd), shell=False) - return manifest + if DEVTOOLS != "MsDev": + return + mt = self._find_msbuild_tool("mt.exe", use_windows_sdk=True) + manifest = os.path.abspath(os.path.join(build_dir, "app.manifest")) + cmd = [mt, '-inputresource:"{0}"'.format(sys.executable), + '-out:"{0}"'.format(manifest)] + self.announce("Extracting manifest from {}".format(sys.executable)) + subprocess.check_call(" ".join(cmd), shell=False) + return manifest def _build_monoclr(self): mono_libs = _check_output("pkg-config --libs mono-2", shell=True) @@ -266,6 +245,50 @@ def _install_packages(self): self.announce("Installing packages: {0}".format(cmd)) subprocess.check_call(cmd, shell=use_shell) + def _find_msbuild_tool(self, tool="msbuild.exe", use_windows_sdk=False): + """Return full path to one of the Microsoft build tools""" + # Search in PATH first + path = spawn.find_executable(tool) + if path: + return path + + # Search within registry to find build tools + try: # PY2 + import _winreg as winreg + except ImportError: # PY3 + import winreg + + keys_to_check = WIN_SDK_KEYS if use_windows_sdk else VS_KEYS + hklm = winreg.HKEY_LOCAL_MACHINE + for rkey in keys_to_check: + try: + with winreg.OpenKey(hklm, rkey.key) as hkey: + val, type_ = winreg.QueryValueEx(hkey, rkey.value_name) + if type_ != winreg.REG_SZ: + continue + path = os.path.join(val, rkey.suffix, tool) + if os.path.exists(path): + self.announce("Using {0} from {1}".format( + tool, rkey.sdk_name)) + return path + except WindowsError: + # Key doesn't exist + pass + + # Add Visual C++ for Python as a fall-back in case one + # of the other Windows SDKs isn't installed. + # TODO: Extend checking by using setuptools/msvc.py? + if use_windows_sdk: + sdk_name = "Visual C++ for Python" + localappdata = os.environ["LOCALAPPDATA"] + suffix = "Bin\\x64" if ARCH == "x64" else "Bin" + path = os.path.join(localappdata, vs_python, suffix, tool) + if os.path.exists(path): + self.announce("Using {0} from {1}".format(tool, sdk_name)) + return path + + raise RuntimeError("{0} could not be found".format(tool)) + class InstallLibPythonnet(install_lib.install_lib): def install(self): @@ -304,25 +327,7 @@ def run(self): return install_data.install_data.run(self) -def _check_output(*args, **kwargs): - """Check output wrapper for py2/py3 compatibility""" - output = subprocess.check_output(*args, **kwargs) - if PY_MAJOR == 2: - return output - return output.decode("ascii") - - -def _get_interop_filename(): - """interopXX.cs is auto-generated as part of the build. - For common windows platforms pre-generated files are included - as most windows users won't have Clang installed, which is - required to generate the file. - """ - interop_filename = "interop{0}{1}{2}.cs".format( - PY_MAJOR, PY_MINOR, getattr(sys, "abiflags", "")) - return os.path.join("src", "runtime", interop_filename) - - +############################################################################### if __name__ == "__main__": setupdir = os.path.dirname(__file__) if setupdir: From b32b4d000000388b9f81aaf0c04f58f1885684ee Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 28 Jan 2017 15:37:34 -0700 Subject: [PATCH 013/324] Create get_source_files function --- setup.py | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/setup.py b/setup.py index 847bde9a1..cc345ac7f 100644 --- a/setup.py +++ b/setup.py @@ -100,6 +100,24 @@ def _get_interop_filename(): return os.path.join("src", "runtime", interop_filename) +def _get_source_files(): + """Walk project and collect the files needed for ext_module""" + for ext in (".sln", ".snk", ".config"): + for path in glob.glob("*" + ext): + yield path + + for root, dirnames, filenames in os.walk("src"): + for ext in (".cs", ".csproj", ".sln", ".snk", ".config", ".il", + ".py", ".c", ".h", ".ico"): + for filename in fnmatch.filter(filenames, "*" + ext): + yield os.path.join(root, filename) + + for root, dirnames, filenames in os.walk("tools"): + for ext in (".exe", ".py", ".c", ".h"): + for filename in fnmatch.filter(filenames, "*" + ext): + yield os.path.join(root, filename) + + class BuildExtPythonnet(build_ext.build_ext): def build_extension(self, ext): """Builds the .pyd file using msbuild or xbuild""" @@ -333,21 +351,6 @@ def run(self): if setupdir: os.chdir(setupdir) - sources = [] - for ext in (".sln", ".snk", ".config"): - sources.extend(glob.glob("*" + ext)) - - for root, dirnames, filenames in os.walk("src"): - for ext in (".cs", ".csproj", ".sln", ".snk", ".config", ".il", - ".py", ".c", ".h", ".ico"): - for filename in fnmatch.filter(filenames, "*" + ext): - sources.append(os.path.join(root, filename)) - - for root, dirnames, filenames in os.walk("tools"): - for ext in (".exe", ".py", ".c", ".h"): - for filename in fnmatch.filter(filenames, "*" + ext): - sources.append(os.path.join(root, filename)) - setup_requires = [] interop_file = _get_interop_filename() if not os.path.exists(interop_file): @@ -377,7 +380,7 @@ def run(self): 'Operating System :: MacOS :: MacOS X', ], ext_modules=[ - Extension("clr", sources=sources) + Extension("clr", sources=list(_get_source_files())) ], data_files=[ ("{install_platlib}", [ From f52082947b655e8c8237687781b1f8a9d89b0953 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 28 Jan 2017 15:55:25 -0700 Subject: [PATCH 014/324] No need to put `setup` in `if __name__==...` --- setup.py | 98 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/setup.py b/setup.py index cc345ac7f..51211e6c7 100644 --- a/setup.py +++ b/setup.py @@ -19,6 +19,8 @@ from setuptools import Extension, setup +# Allow config/verbosity to be set from cli +# http://stackoverflow.com/a/4792601/5208670 CONFIG = "Release" # Release or Debug VERBOSITY = "minimal" # quiet, minimal, normal, detailed, diagnostic @@ -346,52 +348,50 @@ def run(self): ############################################################################### -if __name__ == "__main__": - setupdir = os.path.dirname(__file__) - if setupdir: - os.chdir(setupdir) - - setup_requires = [] - interop_file = _get_interop_filename() - if not os.path.exists(interop_file): - setup_requires.append("pycparser") - - setup( - name="pythonnet", - version="2.2.2", - description=".Net and Mono integration for Python", - url='https://pythonnet.github.io/', - license='MIT', - author="The Python for .Net developers", - classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: MIT License', - 'Programming Language :: C#', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.3', - 'Programming Language :: Python :: 3.4', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', - 'Operating System :: Microsoft :: Windows', - 'Operating System :: POSIX :: Linux', - 'Operating System :: MacOS :: MacOS X', - ], - ext_modules=[ - Extension("clr", sources=list(_get_source_files())) - ], - data_files=[ - ("{install_platlib}", [ - "{build_lib}/Python.Runtime.dll", - "Python.Runtime.dll.config"]), - ], - zip_safe=False, - cmdclass={ - "build_ext": BuildExtPythonnet, - "install_lib": InstallLibPythonnet, - "install_data": InstallDataPythonnet, - }, - setup_requires=setup_requires, - ) +setupdir = os.path.dirname(__file__) +if setupdir: + os.chdir(setupdir) + +setup_requires = [] +if not os.path.exists(_get_interop_filename()): + setup_requires.append("pycparser") + +setup( + name="pythonnet", + version="2.2.2", + description=".Net and Mono integration for Python", + url='https://pythonnet.github.io/', + license='MIT', + author="The Python for .Net developers", + setup_requires=setup_requires, + ext_modules=[ + Extension("clr", sources=list(_get_source_files())) + ], + data_files=[ + ("{install_platlib}", [ + "{build_lib}/Python.Runtime.dll", + "Python.Runtime.dll.config"]), + ], + cmdclass={ + "build_ext": BuildExtPythonnet, + "install_lib": InstallLibPythonnet, + "install_data": InstallDataPythonnet, + }, + classifiers=[ + 'Development Status :: 5 - Production/Stable', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: MIT License', + 'Programming Language :: C#', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Operating System :: Microsoft :: Windows', + 'Operating System :: POSIX :: Linux', + 'Operating System :: MacOS :: MacOS X', + ], + zip_safe=False, +) From 126e5f0acd74017a67fbab29a9297ab39d30937e Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 28 Jan 2017 16:20:23 -0700 Subject: [PATCH 015/324] Add long_description --- setup.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/setup.py b/setup.py index 51211e6c7..ea20a99d3 100644 --- a/setup.py +++ b/setup.py @@ -120,6 +120,15 @@ def _get_source_files(): yield os.path.join(root, filename) +def _get_long_description(): + """Helper to populate long_description for pypi releases""" + try: + import pypandoc + return pypandoc.convert('README.md', 'rst') + except ImportError: + return '.Net and Mono integration for Python' + + class BuildExtPythonnet(build_ext.build_ext): def build_extension(self, ext): """Builds the .pyd file using msbuild or xbuild""" @@ -364,6 +373,7 @@ def run(self): license='MIT', author="The Python for .Net developers", setup_requires=setup_requires, + long_description=_get_long_description(), ext_modules=[ Extension("clr", sources=list(_get_source_files())) ], From ccf96cbe8edcbb73a0f45269d5349e7431828bd3 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 28 Jan 2017 17:28:21 -0700 Subject: [PATCH 016/324] Clean-up getinterop --- tools/geninterop/geninterop.py | 46 ++++++++++++++++------------------ 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/tools/geninterop/geninterop.py b/tools/geninterop/geninterop.py index 946e30217..bf5fdb96b 100644 --- a/tools/geninterop/geninterop.py +++ b/tools/geninterop/geninterop.py @@ -15,16 +15,19 @@ from __future__ import print_function -from distutils.sysconfig import get_config_var -from subprocess import Popen, CalledProcessError, PIPE -from pycparser import c_parser, c_ast import logging -import sys import os +import sys +import sysconfig +import subprocess + +from pycparser import c_ast, c_parser _log = logging.getLogger() logging.basicConfig(level=logging.DEBUG) +PY_MAJOR = sys.version_info[0] +PY_MINOR = sys.version_info[1] # rename some members from their C name when generating the C# _typeoffset_member_renames = { @@ -33,6 +36,14 @@ } +def _check_output(*args, **kwargs): + """Check output wrapper for py2/py3 compatibility""" + output = subprocess.check_output(*args, **kwargs) + if PY_MAJOR == 2: + return output + return output.decode("ascii") + + class AstParser(object): """Walk an AST and determine the members of all structs""" @@ -147,23 +158,6 @@ def __get_struct_name(self, node): return node.name or "_struct_%d" % id(node) -def check_output(*popenargs, **kwargs): - """subprocess.check_output from python 2.7. - Added here to support building for earlier versions of Python. - """ - process = Popen(stdout=PIPE, *popenargs, **kwargs) - output, unused_err = process.communicate() - retcode = process.poll() - if retcode: - cmd = kwargs.get("args") - if cmd is None: - cmd = popenargs[0] - raise CalledProcessError(retcode, cmd) - if sys.version_info[0] > 2: - return output.decode("ascii") - return output - - def preprocess_python_headers(): """Return Python.h pre-processed, ready for parsing. Requires clang. @@ -172,7 +166,7 @@ def preprocess_python_headers(): "fake_libc_include") include_dirs = [fake_libc_include] - include_py = get_config_var("INCLUDEPY") + include_py = sysconfig.get_config_var("INCLUDEPY") include_dirs.append(include_py) defines = [ @@ -195,7 +189,7 @@ def preprocess_python_headers(): # normalize as the parser doesn't like windows line endings. lines = [] - for line in check_output(cmd).splitlines(): + for line in _check_output(cmd).splitlines(): if line.startswith("#"): line = line.replace("\\", "/") lines.append(line) @@ -206,7 +200,7 @@ def gen_interop_code(members): """Generate the TypeOffset C# class""" defines = [ - "PYTHON%d%d" % (sys.version_info[:2]) + "PYTHON{0}{1}".format(PY_MAJOR, PY_MINOR) ] if hasattr(sys, "abiflags"): @@ -217,6 +211,8 @@ def gen_interop_code(members): if "u" in sys.abiflags: defines.append("PYTHON_WITH_WIDE_UNICODE") + filename = os.path.basename(__file__) + defines_str = " && ".join(defines) class_definition = """ // Auto-generated by %s. // DO NOT MODIFIY BY HAND. @@ -252,7 +248,7 @@ def gen_interop_code(members): } // Auto-generated from PyHeapTypeObject in Python.h -""" % (os.path.basename(__file__), " && ".join(defines)) +""" % (filename, defines_str) # All the members are sizeof(void*) so we don't need to do any # extra work to determine the size based on the type. From 65210335d2e4b5efffdb9d840503fb402e037752 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 28 Jan 2017 17:38:58 -0700 Subject: [PATCH 017/324] Fix setup.py log messages self.announce is based on an incomplete logger. use debug_print that turns on when env_var DISTUTILS_DEBUG is present --- setup.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/setup.py b/setup.py index ea20a99d3..3ef19afd7 100644 --- a/setup.py +++ b/setup.py @@ -189,6 +189,7 @@ def build_extension(self, ext): # check the interop file exists, and create it if it doesn't interop_file = _get_interop_filename() if not os.path.exists(interop_file): + self.debug_print("Creating {0}".format(interop_file)) geninterop = os.path.join("tools", "geninterop", "geninterop.py") subprocess.check_call([sys.executable, geninterop, interop_file]) @@ -218,7 +219,7 @@ def build_extension(self, ext): if manifest: cmd.append('/p:PythonManifest="{0}"'.format(manifest)) - self.announce("Building: {0}".format(" ".join(cmd))) + self.debug_print("Building: {0}".format(" ".join(cmd))) use_shell = True if DEVTOOLS == "Mono" else False subprocess.check_call(" ".join(cmd + ["/t:Clean"]), shell=use_shell) subprocess.check_call(" ".join(cmd + ["/t:Build"]), shell=use_shell) @@ -233,7 +234,7 @@ def _get_manifest(self, build_dir): manifest = os.path.abspath(os.path.join(build_dir, "app.manifest")) cmd = [mt, '-inputresource:"{0}"'.format(sys.executable), '-out:"{0}"'.format(manifest)] - self.announce("Extracting manifest from {}".format(sys.executable)) + self.debug_print("Extracting manifest from {}".format(sys.executable)) subprocess.check_call(" ".join(cmd), shell=False) return manifest @@ -267,11 +268,11 @@ def _install_packages(self): use_shell = True cmd = "{0} update -self".format(nuget) - self.announce("Updating NuGet: {0}".format(cmd)) + self.debug_print("Updating NuGet: {0}".format(cmd)) subprocess.check_call(cmd, shell=use_shell) cmd = "{0} restore pythonnet.sln -o packages".format(nuget) - self.announce("Installing packages: {0}".format(cmd)) + self.debug_print("Installing packages: {0}".format(cmd)) subprocess.check_call(cmd, shell=use_shell) def _find_msbuild_tool(self, tool="msbuild.exe", use_windows_sdk=False): @@ -297,7 +298,7 @@ def _find_msbuild_tool(self, tool="msbuild.exe", use_windows_sdk=False): continue path = os.path.join(val, rkey.suffix, tool) if os.path.exists(path): - self.announce("Using {0} from {1}".format( + self.debug_print("Using {0} from {1}".format( tool, rkey.sdk_name)) return path except WindowsError: @@ -313,7 +314,7 @@ def _find_msbuild_tool(self, tool="msbuild.exe", use_windows_sdk=False): suffix = "Bin\\x64" if ARCH == "x64" else "Bin" path = os.path.join(localappdata, vs_python, suffix, tool) if os.path.exists(path): - self.announce("Using {0} from {1}".format(tool, sdk_name)) + self.debug_print("Using {0} from {1}".format(tool, sdk_name)) return path raise RuntimeError("{0} could not be found".format(tool)) From ba7f80fff33d42bba6b3f7089bd19a2d6bea4974 Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Tue, 24 Jan 2017 15:54:28 +0100 Subject: [PATCH 018/324] Make internals (in particular Runtime.*) visible to the tests. --- src/runtime/assemblyinfo.cs | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/src/runtime/assemblyinfo.cs b/src/runtime/assemblyinfo.cs index 1defa851f..1cbd1e749 100644 --- a/src/runtime/assemblyinfo.cs +++ b/src/runtime/assemblyinfo.cs @@ -2,6 +2,7 @@ using System.Reflection; using System.Resources; using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; [assembly: AssemblyProduct("Python for .NET")] [assembly: AssemblyVersion("4.0.0.1")] @@ -11,23 +12,4 @@ [assembly: AssemblyCopyright("MIT License")] [assembly: AssemblyFileVersion("2.0.0.2")] [assembly: NeutralResourcesLanguage("en")] - -#if PYTHON27 -[assembly: AssemblyTitle("Python.Runtime for Python 2.7")] -[assembly: AssemblyDescription("Python Runtime for Python 2.7")] -#elif PYTHON33 -[assembly: AssemblyTitle("Python.Runtime for Python 3.3")] -[assembly: AssemblyDescription("Python Runtime for Python 3.3")] -#elif PYTHON34 -[assembly: AssemblyTitle("Python.Runtime for Python 3.4")] -[assembly: AssemblyDescription("Python Runtime for Python 3.4")] -#elif PYTHON35 -[assembly: AssemblyTitle("Python.Runtime for Python 3.5")] -[assembly: AssemblyDescription("Python Runtime for Python 3.5")] -#elif PYTHON36 -[assembly: AssemblyTitle("Python.Runtime for Python 3.6")] -[assembly: AssemblyDescription("Python Runtime for Python 3.6")] -#elif PYTHON37 -[assembly: AssemblyTitle("Python.Runtime for Python 3.7")] -[assembly: AssemblyDescription("Python Runtime for Python 3.7")] -#endif +[assembly: InternalsVisibleTo("Python.EmbeddingTest")] From 4d8a8e9654d70b518b8e8d11feddb39d03481342 Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Tue, 24 Jan 2017 15:56:42 +0100 Subject: [PATCH 019/324] Simplify the `sys.path` setting in the PyImportTests. --- src/embed_tests/pyimport.cs | 28 +++++++--------------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/src/embed_tests/pyimport.cs b/src/embed_tests/pyimport.cs index 58da0ac13..c7a567bdf 100644 --- a/src/embed_tests/pyimport.cs +++ b/src/embed_tests/pyimport.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using NUnit.Framework; using Python.Runtime; +using System.IO; namespace Python.EmbeddingTest { @@ -17,34 +18,19 @@ public void SetUp() PythonEngine.Initialize(); gs = PythonEngine.AcquireLock(); - //string here = Environment.CurrentDirectory; - //trunk\pythonnet\src\embed_tests\bin\x86\DebugWin - /* * Append the tests directory to sys.path * using reflection to circumvent the private modifires placed on most Runtime methods. */ const string s = @"../../../../tests"; - Type RTClass = typeof(Runtime.Runtime); - - /* pyStrPtr = PyString_FromString(s); */ - MethodInfo PyString_FromString = RTClass.GetMethod("PyString_FromString", - BindingFlags.NonPublic | BindingFlags.Static); - object[] funcArgs = new object[1]; - funcArgs[0] = s; - IntPtr pyStrPtr = (IntPtr)PyString_FromString.Invoke(null, funcArgs); - - /* SysDotPath = sys.path */ - MethodInfo PySys_GetObject = RTClass.GetMethod("PySys_GetObject", - BindingFlags.NonPublic | BindingFlags.Static); - funcArgs[0] = "path"; - IntPtr SysDotPath = (IntPtr)PySys_GetObject.Invoke(null, funcArgs); + var testPath = Path.Combine( + TestContext.CurrentContext.TestDirectory, s + ); - /* SysDotPath.append(*pyStrPtr) */ - MethodInfo PyList_Append = RTClass.GetMethod("PyList_Append", BindingFlags.NonPublic | BindingFlags.Static); - funcArgs = new object[] { SysDotPath, pyStrPtr }; - int r = (int)PyList_Append.Invoke(null, funcArgs); + IntPtr str = Runtime.Runtime.PyString_FromString(testPath); + IntPtr path = Runtime.Runtime.PySys_GetObject("path"); + Runtime.Runtime.PyList_Append(path, str); } [TearDown] From 689c1fcd40b39e727bef9edd2122463a22abd28f Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Tue, 24 Jan 2017 16:05:43 +0100 Subject: [PATCH 020/324] Add Initialize test and update NUnit to 3.5.0 --- src/embed_tests/InitializeTest.cs | 22 +++++++++++++++++++++ src/embed_tests/Python.EmbeddingTest.csproj | 12 ++++++++--- src/embed_tests/packages.config | 3 +-- 3 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 src/embed_tests/InitializeTest.cs diff --git a/src/embed_tests/InitializeTest.cs b/src/embed_tests/InitializeTest.cs new file mode 100644 index 000000000..a9667343c --- /dev/null +++ b/src/embed_tests/InitializeTest.cs @@ -0,0 +1,22 @@ +using NUnit.Framework; +using Python.Runtime; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Python.EmbeddingTest +{ + public class InitializeTest + { + [Test] + public static void Test() + { + PythonEngine.Initialize(); + PythonEngine.Shutdown(); + + PythonEngine.Initialize(); + PythonEngine.Shutdown(); + } + } +} diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index 24645f1bd..f2b4dce61 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -128,20 +128,23 @@ false + + ..\..\packages\NUnit.3.5.0\lib\net40\nunit.framework.dll + True + 3.5 - - ..\..\packages\NUnit.2.6.2\lib\nunit.framework.dll - + + Code @@ -172,6 +175,9 @@ Python.Runtime + + + diff --git a/src/embed_tests/packages.config b/src/embed_tests/packages.config index fdc687a35..53d73768d 100644 --- a/src/embed_tests/packages.config +++ b/src/embed_tests/packages.config @@ -1,5 +1,4 @@ - - + From 50bd03db2d5956eb1bc6a579b4551d7c05ec0078 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 30 Jan 2017 16:06:45 -0700 Subject: [PATCH 021/324] Update CHANGELOG for development --- CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4515cde20..53f75e6af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,22 @@ This project adheres to [Semantic Versioning][]. This document follows the conventions laid out in [Keep a CHANGELOG][]. +## [unreleased][] + +### Added + +- New `Foo` feature + +### Changed + +- Refactored `setup.py` (#337) +- Upgraded NUnit framework to 3.5 (#341) +- Completed refactor of Build Directives on `Runtime.cs` (#339) + +### Fixed + +- Fixed `FooBar` bug + ## [2.2.2][] - 2017-01-29 ### Fixed From 7b76a1bacabf27c2d23eafc93693c3e7f5183d0f Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 30 Jan 2017 16:12:25 -0700 Subject: [PATCH 022/324] Clean-up embedded tests project Remove reference to non-existing file Remove extra property from pyiter Fix typo and final line on files --- src/embed_tests/Python.EmbeddingTest.csproj | 5 +---- src/embed_tests/pyimport.cs | 2 +- src/embed_tests/pyiter.cs | 4 +++- src/embed_tests/pyobject.cs | 2 +- src/embed_tests/pythonexception.cs | 2 +- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index f2b4dce61..ed85beb51 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -138,7 +138,6 @@ - @@ -146,9 +145,7 @@ - - Code - + diff --git a/src/embed_tests/pyimport.cs b/src/embed_tests/pyimport.cs index c7a567bdf..a6c12d49e 100644 --- a/src/embed_tests/pyimport.cs +++ b/src/embed_tests/pyimport.cs @@ -20,7 +20,7 @@ public void SetUp() /* * Append the tests directory to sys.path - * using reflection to circumvent the private modifires placed on most Runtime methods. + * using reflection to circumvent the private modifiers placed on most Runtime methods. */ const string s = @"../../../../tests"; diff --git a/src/embed_tests/pyiter.cs b/src/embed_tests/pyiter.cs index 4939e22fe..1a4084474 100644 --- a/src/embed_tests/pyiter.cs +++ b/src/embed_tests/pyiter.cs @@ -33,11 +33,13 @@ public void TestOnPyList() list.Append(new PyString("baz")); List result = new List(); foreach (PyObject item in list) + { result.Add(item.ToString()); + } Assert.AreEqual(3, result.Count); Assert.AreEqual("foo", result[0]); Assert.AreEqual("bar", result[1]); Assert.AreEqual("baz", result[2]); } } -} \ No newline at end of file +} diff --git a/src/embed_tests/pyobject.cs b/src/embed_tests/pyobject.cs index ba267c3a5..c0f18df39 100644 --- a/src/embed_tests/pyobject.cs +++ b/src/embed_tests/pyobject.cs @@ -30,4 +30,4 @@ public void TestUnicode() Assert.AreEqual("foo\u00e9", s.ToString()); } } -} \ No newline at end of file +} diff --git a/src/embed_tests/pythonexception.cs b/src/embed_tests/pythonexception.cs index 359040601..f0bc39def 100644 --- a/src/embed_tests/pythonexception.cs +++ b/src/embed_tests/pythonexception.cs @@ -44,4 +44,4 @@ public void TestNoError() Assert.AreEqual("", e.Message); } } -} \ No newline at end of file +} From d2cafbbea18cf7fc74f1252e86eed5e4342bbb19 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 30 Jan 2017 16:35:14 -0700 Subject: [PATCH 023/324] Clean up AppVeyor config --- appveyor.yml | 63 +++++++++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 2b0408bf9..e61e6dd2c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,5 @@ version: '{branch}-{build}' +build: off platform: - x86 @@ -6,60 +7,66 @@ platform: environment: global: - PYTHONPATH: "C:\\testdir" - PYTHONWARNINGS: "ignore:::wheel.pep425tags:" - CONDA_BLD_VERSION: "3.5" - CONDA_BLD: "C:\\conda" - NUNIT: "nunit-console" + PYTHONUNBUFFERED: True + PYTHONWARNINGS: 'ignore:::wheel.pep425tags:' + PYTHONPATH: C:\testdir + NUNIT: nunit-console + CONDA_BLD: C:\conda + CONDA_BLD_VERSION: 3.5 # SDK v7.0 MSVC Express 2008's SetEnv.cmd script will fail if the # /E:ON and /V:ON options are not enabled in the batch script interpreter # See: http://stackoverflow.com/a/13751649/163740 - CMD_IN_ENV: "cmd /E:ON /V:ON /C .\\ci\\run_with_env.cmd" + CMD_IN_ENV: 'cmd /E:ON /V:ON /C .\ci\run_with_env.cmd' matrix: - - PYTHON_VERSION: "2.7" - - PYTHON_VERSION: "3.3" - - PYTHON_VERSION: "3.4" - - PYTHON_VERSION: "3.5" - - PYTHON_VERSION: "3.6" + - PYTHON_VERSION: 2.7 + - PYTHON_VERSION: 3.3 + - PYTHON_VERSION: 3.4 + - PYTHON_VERSION: 3.5 + - PYTHON_VERSION: 3.6 init: # Prepare environment - mkdir C:\testdir # Set environment variables depending based on build cfg - - SET CONDA_PY=%PYTHON_VERSION:.=% - - SET CONDA_BLD_ARCH=%PLATFORM:x=% - - SET PYTHON=C:\PYTHON%CONDA_PY% - - IF %PLATFORM%==x86 (SET CONDA_BLD_ARCH=32) - - IF %PLATFORM%==x86 (SET NUNIT=%NUNIT%-x86) - - IF %PLATFORM%==x64 (SET PYTHON=%PYTHON%-x64) + - set CONDA_PY=%PYTHON_VERSION:.=% + - set CONDA_BLD_ARCH=%PLATFORM:x=% + - set PYTHON=C:\PYTHON%PYTHON_VERSION:.=% + - if %PLATFORM%==x86 (set CONDA_BLD_ARCH=32) + - if %PLATFORM%==x86 (set NUNIT=%NUNIT%-x86) + - if %PLATFORM%==x64 (set PYTHON=%PYTHON%-x64) + + # Prepend newly installed Python to the PATH of this build + - set PATH=%PYTHON%;%PYTHON%\Scripts;%PATH% + + # Check that we have the expected version, architecture for Python + - python --version + - python -c "import struct; print(struct.calcsize('P') * 8)" + - python -c "import ctypes; print(ctypes.sizeof(ctypes.c_wchar))" install: # install conda and deps - ps: .\ci\install_miniconda.ps1 # install for wheels - - "%PYTHON%\\python.exe -m pip install --upgrade pip" - - "%PYTHON%\\python.exe -m pip install wheel" - - "%PYTHON%\\python.exe -m pip install six" + - pip install --upgrade pip wheel six build_script: # build clean sdist & wheel - - "%PYTHON%\\python.exe setup.py sdist bdist_wheel" + - python setup.py sdist bdist_wheel # build and dist conda package - - cmd: "%CMD_IN_ENV% %CONDA_BLD%\\Scripts\\conda build conda.recipe" - - ps: $CONDA_PKG=(& "$env:CONDA_BLD\\Scripts\\conda" build conda.recipe --output -q) - - ps: copy-item $CONDA_PKG "$env:APPVEYOR_BUILD_FOLDER\\dist\\" + - '%CMD_IN_ENV% %CONDA_BLD%\Scripts\conda build conda.recipe' + - ps: $CONDA_PKG=(&"$env:CONDA_BLD\Scripts\conda" build conda.recipe --output -q) + - ps: Copy-Item $CONDA_PKG "$env:APPVEYOR_BUILD_FOLDER\dist\" test_script: - - ps: '& "$env:PYTHON\\Scripts\\pip.exe" install --no-cache-dir --force-reinstall --ignore-installed ("dist\\" + (gci dist\*.whl)[0].Name)' - - ps: copy-item (gci -path build -re -include Python.Test.dll)[0].FullName C:\testdir - - "%PYTHON%\\python.exe src\\tests\\runtests.py" + - pip install --no-index --find-links=.\dist\ pythonnet + - ps: Copy-Item (Resolve-Path .\build\*\Python.Test.dll) C:\testdir + - python src\tests\runtests.py # - "%NUNIT% src/embed_tests/bin/%PLATFORM%/ReleaseWin/Python.EmbeddingTest.dll" artifacts: - # bdist_wheel puts your built wheel in the dist directory - path: dist\* From ef133a334227a1241d5f586fdbd1a4cb59ef45e3 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 30 Jan 2017 16:36:29 -0700 Subject: [PATCH 024/324] Remove duplicate reference from EmbeddingTest --- src/embed_tests/Python.EmbeddingTest.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index ed85beb51..4afb131d3 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -140,7 +140,6 @@ - From ffa282b7283ad51671b3a019ec3b9bcdb233506d Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 26 Jan 2017 22:17:55 -0700 Subject: [PATCH 025/324] Travis - Speed up, use containers --- .travis.yml | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index b24531f93..035a267af 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ -sudo: required -language: python +sudo: false +language: python python: - 2.7 - 3.3 @@ -8,14 +8,21 @@ python: - 3.5 - 3.6 -before_install: - - sudo add-apt-repository -y "deb http://archive.ubuntu.com/ubuntu/ trusty main universe" - - sudo apt-get install software-properties-common - - sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF - - echo "deb http://download.mono-project.com/repo/debian wheezy/snapshots/4.2.4.4 main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list - - echo "deb http://download.mono-project.com/repo/debian wheezy-libtiff-compat main" | sudo tee -a /etc/apt/sources.list.d/mono-xamarin.list - - sudo apt-get update - - sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confnew" install mono-devel mono-complete referenceassemblies-pcl ca-certificates-mono nunit-console +env: + global: + - LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so + - SEGFAULT_SIGNALS=all + - PYTHONUNBUFFERED=True + +addons: + apt: + sources: + - mono + - mono-libtiff-compat + packages: + - mono-devel + - ca-certificates-mono + - nunit-console install: - pip install six From 5cdc0b4ef959b0e45f3898423e244b9114364ba9 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 26 Jan 2017 23:07:57 -0700 Subject: [PATCH 026/324] Build conda recipe on Pull Requests --- appveyor.yml | 11 +++-------- ci/appveyor_build_recipe.ps1 | 6 ++++++ conda.recipe/README.md | 5 +++++ 3 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 ci/appveyor_build_recipe.ps1 create mode 100644 conda.recipe/README.md diff --git a/appveyor.yml b/appveyor.yml index e61e6dd2c..524e75969 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -47,9 +47,6 @@ init: - python -c "import ctypes; print(ctypes.sizeof(ctypes.c_wchar))" install: - # install conda and deps - - ps: .\ci\install_miniconda.ps1 - # install for wheels - pip install --upgrade pip wheel six @@ -57,16 +54,14 @@ build_script: # build clean sdist & wheel - python setup.py sdist bdist_wheel - # build and dist conda package - - '%CMD_IN_ENV% %CONDA_BLD%\Scripts\conda build conda.recipe' - - ps: $CONDA_PKG=(&"$env:CONDA_BLD\Scripts\conda" build conda.recipe --output -q) - - ps: Copy-Item $CONDA_PKG "$env:APPVEYOR_BUILD_FOLDER\dist\" - test_script: - pip install --no-index --find-links=.\dist\ pythonnet - ps: Copy-Item (Resolve-Path .\build\*\Python.Test.dll) C:\testdir - python src\tests\runtests.py # - "%NUNIT% src/embed_tests/bin/%PLATFORM%/ReleaseWin/Python.EmbeddingTest.dll" + # Build conda-recipe on Pull Requests + - ps: .\ci\appveyor_build_recipe.ps1 + artifacts: - path: dist\* diff --git a/ci/appveyor_build_recipe.ps1 b/ci/appveyor_build_recipe.ps1 new file mode 100644 index 000000000..0c885d88d --- /dev/null +++ b/ci/appveyor_build_recipe.ps1 @@ -0,0 +1,6 @@ +if ($env:APPVEYOR_PULL_REQUEST_NUMBER) { + Invoke-Expression .\ci\install_miniconda.ps1 + &"$env:CONDA_BLD\Scripts\conda" build conda.recipe --dirty -q + $CONDA_PKG=(&"$env:CONDA_BLD\Scripts\conda" build conda.recipe --output -q) + Copy-Item $CONDA_PKG "$env:APPVEYOR_BUILD_FOLDER\dist\" +} diff --git a/conda.recipe/README.md b/conda.recipe/README.md new file mode 100644 index 000000000..42241999f --- /dev/null +++ b/conda.recipe/README.md @@ -0,0 +1,5 @@ +# Conda Recipe + +The files here are needed to build Python.Net with conda + +http://conda.pydata.org/docs/building/recipe.html From dee134c4939be63e1d4c9dbe407740c64e08f4bc Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 27 Jan 2017 00:42:31 -0700 Subject: [PATCH 027/324] Add coverage --- .travis.yml | 12 +++++++++--- README.md | 3 +++ appveyor.yml | 22 ++++++++++++++-------- ci/appveyor_run_tests.ps1 | 33 +++++++++++++++++++++++++++++++++ src/embed_tests/packages.config | 1 + 5 files changed, 60 insertions(+), 11 deletions(-) create mode 100644 ci/appveyor_run_tests.ps1 diff --git a/.travis.yml b/.travis.yml index 035a267af..418e50cfc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,14 +25,20 @@ addons: - nunit-console install: - - pip install six - - pip install pycparser - - python setup.py build_ext --inplace + - pip install pycparser coverage codecov six + - coverage run setup.py build_ext --inplace script: - export PYTHONPATH=`pwd`:$PYTHONPATH - python src/tests/runtests.py # - nunit-console src/embed_tests/bin/x64/ReleaseMono/Python.EmbeddingTest.dll +after_success: + # Uncomment if need to geninterop, ie. py37 final + # - python tools/geninterop/geninterop.py + + # Waiting on mono-cov support or SharpCover + - codecov + notifications: email: false diff --git a/README.md b/README.md index 0b6abe756..d4640a925 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ [![appveyor shield][]](https://ci.appveyor.com/project/pythonnet/pythonnet/branch/master) [![travis shield][]](https://travis-ci.org/pythonnet/pythonnet) +[![codecov shield][]](https://codecov.io/github/pythonnet/pythonnet) [![license shield][]](./LICENSE) [![pypi package version][]](https://pypi.python.org/pypi/pythonnet) [![python supported shield][]](https://pypi.python.org/pypi/pythonnet) @@ -80,6 +81,8 @@ int32 [appveyor shield]: https://img.shields.io/appveyor/ci/pythonnet/pythonnet/master.svg?label=AppVeyor +[codecov shield]: https://img.shields.io/codecov/c/github/pythonnet/pythonnet/pytest.svg?label=codecov + [license shield]: https://img.shields.io/badge/license-MIT-blue.svg [pypi package version]: https://img.shields.io/pypi/v/pythonnet.svg diff --git a/appveyor.yml b/appveyor.yml index 524e75969..a8827aee7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -10,7 +10,6 @@ environment: PYTHONUNBUFFERED: True PYTHONWARNINGS: 'ignore:::wheel.pep425tags:' PYTHONPATH: C:\testdir - NUNIT: nunit-console CONDA_BLD: C:\conda CONDA_BLD_VERSION: 3.5 @@ -35,7 +34,6 @@ init: - set CONDA_BLD_ARCH=%PLATFORM:x=% - set PYTHON=C:\PYTHON%PYTHON_VERSION:.=% - if %PLATFORM%==x86 (set CONDA_BLD_ARCH=32) - - if %PLATFORM%==x86 (set NUNIT=%NUNIT%-x86) - if %PLATFORM%==x64 (set PYTHON=%PYTHON%-x64) # Prepend newly installed Python to the PATH of this build @@ -47,21 +45,29 @@ init: - python -c "import ctypes; print(ctypes.sizeof(ctypes.c_wchar))" install: - # install for wheels - - pip install --upgrade pip wheel six + # install for wheels & coverage + - pip install --upgrade pip wheel coverage codecov six + + # Install OpenCover. Can't put on packages.config; not Linux/Mono compatible + - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages build_script: - # build clean sdist & wheel - - python setup.py sdist bdist_wheel + # build clean sdist & wheel with coverage of setup.py, install local wheel + - coverage run setup.py sdist bdist_wheel test_script: - pip install --no-index --find-links=.\dist\ pythonnet - ps: Copy-Item (Resolve-Path .\build\*\Python.Test.dll) C:\testdir - - python src\tests\runtests.py - # - "%NUNIT% src/embed_tests/bin/%PLATFORM%/ReleaseWin/Python.EmbeddingTest.dll" + + # Test runner + - ps: .\ci\appveyor_run_tests.ps1 # Build conda-recipe on Pull Requests - ps: .\ci\appveyor_build_recipe.ps1 +on_finish: + # Upload coverage + - codecov + artifacts: - path: dist\* diff --git a/ci/appveyor_run_tests.ps1 b/ci/appveyor_run_tests.ps1 new file mode 100644 index 000000000..9f9a470bd --- /dev/null +++ b/ci/appveyor_run_tests.ps1 @@ -0,0 +1,33 @@ +# Script to simplify appveyor configuration and resolve path to tools + +# Executable paths for OpenCover +# Note if OpenCover fails, it won't affect the exit codes. +$OPENCOVER = Resolve-Path .\packages\OpenCover.*\tools\OpenCover.Console.exe +$NUNIT = Resolve-Path .\packages\NUnit.ConsoleRunner*\tools\nunit3-console.exe +$PY = Get-Command python + +# Can't use ".\build\*\Python.EmbeddingTest.dll". Missing framework files. +$CS_TESTS = Resolve-Path .\src\embed_tests\bin\*\*\Python.EmbeddingTest.dll +$RUNTIME_DIR = Resolve-Path .\src\runtime\bin\*\ReleaseWin\ + +# Run python tests with C# coverage +# why `2>&1 | %{ "$_" }`? see: http://stackoverflow.com/a/20950421/5208670 +.$OPENCOVER -register:user -searchdirs:"$RUNTIME_DIR" -output:py.coverage -target:"$PY" -targetargs:src\tests\runtests.py -returntargetcode 2>&1 | %{ "$_" } +$PYTHON_STATUS = $LastExitCode +if ($PYTHON_STATUS -ne 0) { + Write-Host "Python tests failed, continuing to embedded tests" -ForegroundColor "Red" +} + +# Run Embedded tests with C# coverage +# .$OPENCOVER -register:user -searchdirs:"$RUNTIME_DIR" -output:cs.coverage -target:"$NUNIT" -targetargs:"$CS_TESTS" -returntargetcode +# $NUNIT_STATUS = $LastExitCode +# if ($NUNIT_STATUS -ne 0) { +# Write-Host "Embedded tests failed" -ForegroundColor "Red" +# } + +# Embedded tests failing due to open issues, pass/fail only on Python exit code +# if ($PYTHON_STATUS -ne 0 -or $NUNIT_STATUS -ne 0) { +if ($PYTHON_STATUS -ne 0) { + Write-Host "Tests failed" -ForegroundColor "Red" + $host.SetShouldExit(1) +} diff --git a/src/embed_tests/packages.config b/src/embed_tests/packages.config index 53d73768d..8ab5202ce 100644 --- a/src/embed_tests/packages.config +++ b/src/embed_tests/packages.config @@ -1,4 +1,5 @@ + From 1145a4472c03dc4bdafed03f9b934c5f813b99fe Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 27 Jan 2017 01:47:52 -0700 Subject: [PATCH 028/324] Add tox for quicker local testing --- tox.ini | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 tox.ini diff --git a/tox.ini b/tox.ini new file mode 100644 index 000000000..1cc666ae3 --- /dev/null +++ b/tox.ini @@ -0,0 +1,42 @@ +[tox] +skipsdist=True +skip_missing_interpreters=True +envlist = + py27 + py33 + py34 + py35 + py36 + check + +[testenv] +recreate=True +basepython = + py27: {env:TOXPYTHON:python2.7} + py33: {env:TOXPYTHON:python3.3} + py34: {env:TOXPYTHON:python3.4} + py35: {env:TOXPYTHON:python3.5} + py36: {env:TOXPYTHON:python3.6} + check: python3.5 +setenv = + PYTHONUNBUFFERED=True + DISTUTILS_DEBUG= +passenv = + * +commands = + python --version + python -c "import struct; print('ARCH: %d' % (struct.calcsize('P') * 8))" + python -c "import ctypes; print('UCS%d' % ctypes.sizeof(ctypes.c_wchar))" + python setup.py bdist_wheel + pip install --no-index --find-links=dist/ pythonnet + {posargs:python src\tests\runtests.py} + +[testenv:check] +ignore_errors=True +deps = + check-manifest + flake8 +commands = + check-manifest {toxinidir} + flake8 src setup.py + python setup.py check --strict --metadata From 9912712981867df79493832e32665127359f23dd Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Thu, 26 Jan 2017 17:34:46 +0100 Subject: [PATCH 029/324] Make RunString safer and more standard. --- src/runtime/pythonengine.cs | 59 +++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index 4c676d375..c296f1b87 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -411,33 +411,54 @@ public static PyObject ModuleFromString(string name, string code) /// executing the code string as a PyObject instance, or null if /// an exception was raised. /// - public static PyObject RunString(string code) + public static PyObject RunString( + string code, IntPtr? globals = null, IntPtr? locals = null + ) { - IntPtr globals = Runtime.PyEval_GetGlobals(); - IntPtr locals = Runtime.PyDict_New(); - - IntPtr builtins = Runtime.PyEval_GetBuiltins(); - Runtime.PyDict_SetItemString(locals, "__builtins__", builtins); + bool borrowedGlobals = true; + if (globals == null) + { + globals = Runtime.PyEval_GetGlobals(); + if (globals == IntPtr.Zero) + { + globals = Runtime.PyDict_New(); + Runtime.PyDict_SetItemString( + globals.Value, "__builtins__", + Runtime.PyEval_GetBuiltins() + ); + borrowedGlobals = false; + } + } - IntPtr flag = (IntPtr)257; /* Py_file_input */ - IntPtr result = Runtime.PyRun_String(code, flag, globals, locals); - Runtime.XDecref(locals); - if (result == IntPtr.Zero) + bool borrowedLocals = true; + if (locals == null) { - return null; + locals = Runtime.PyDict_New(); + borrowedLocals = false; } - return new PyObject(result); - } - public static PyObject RunString(string code, IntPtr globals, IntPtr locals) - { IntPtr flag = (IntPtr)257; /* Py_file_input */ - IntPtr result = Runtime.PyRun_String(code, flag, globals, locals); - if (result == IntPtr.Zero) + + try { - return null; + IntPtr result = Runtime.PyRun_String( + code, flag, globals.Value, locals.Value + ); + + if (Runtime.PyErr_Occurred() != 0) + { + throw new PythonException(); + } + + return new PyObject(result); + } + finally + { + if (!borrowedLocals) + Runtime.XDecref(locals.Value); + if (!borrowedGlobals) + Runtime.XDecref(globals.Value); } - return new PyObject(result); } } From 4c8048084e45d0db7d00e52205c274eb78139417 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 31 Jan 2017 10:04:15 -0700 Subject: [PATCH 030/324] Fix Codecov shield branch --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d4640a925..cb9a0f910 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ int32 [appveyor shield]: https://img.shields.io/appveyor/ci/pythonnet/pythonnet/master.svg?label=AppVeyor -[codecov shield]: https://img.shields.io/codecov/c/github/pythonnet/pythonnet/pytest.svg?label=codecov +[codecov shield]: https://img.shields.io/codecov/c/github/pythonnet/pythonnet/master.svg?label=codecov [license shield]: https://img.shields.io/badge/license-MIT-blue.svg From 19936aab15d2b0c43608778e3377a0efd227f1d6 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 31 Jan 2017 10:21:57 -0700 Subject: [PATCH 031/324] Remove unused .csproj properties causing build warnings And remove upgrade/oneclick properties. --- src/clrmodule/clrmodule.csproj | 36 ++-------- src/console/Console.csproj | 27 -------- src/embed_tests/Python.EmbeddingTest.csproj | 75 ++------------------- src/runtime/Python.Runtime.csproj | 14 ---- src/testing/Python.Test.csproj | 36 ++-------- 5 files changed, 18 insertions(+), 170 deletions(-) diff --git a/src/clrmodule/clrmodule.csproj b/src/clrmodule/clrmodule.csproj index d19646778..9575f521f 100644 --- a/src/clrmodule/clrmodule.csproj +++ b/src/clrmodule/clrmodule.csproj @@ -22,42 +22,30 @@ full x86 prompt - true - true - false - + true bin\x64\DebugMono\ TRACE;DEBUG;PYTHON2 full x64 prompt - true - true - false - + bin\x86\ReleaseMono\ PYTHON2 true pdbonly x86 prompt - true - true - false - + bin\x64\ReleaseMono\ PYTHON2 true pdbonly x64 prompt - true - true - false true @@ -66,42 +54,30 @@ full x86 prompt - true - false - false - + true bin\x64\DebugWin\ TRACE;DEBUG;PYTHON2 full x64 prompt - true - true - false - + bin\x86\ReleaseWin\ PYTHON2 true pdbonly x86 prompt - true - true - false - + bin\x64\ReleaseWin\ PYTHON2 true pdbonly x64 prompt - true - true - false diff --git a/src/console/Console.csproj b/src/console/Console.csproj index d2d396341..53306e47f 100644 --- a/src/console/Console.csproj +++ b/src/console/Console.csproj @@ -9,11 +9,6 @@ nPython Python.Runtime OnBuildSuccess - - - - - 3.5 python-clear.ico 10.0.0 2.0 @@ -61,8 +56,6 @@ DEBUG;TRACE full x86 - true - true True 4 False @@ -76,8 +69,6 @@ pdbonly x86 false - true - true 4 @@ -95,8 +86,6 @@ DEBUG;TRACE full x86 - false - false 4 False @@ -115,8 +104,6 @@ DEBUG;TRACE full x86 - true - true 4 False @@ -126,9 +113,6 @@ DEBUG;TRACE full x64 - true - true - false 4 False @@ -140,9 +124,6 @@ pdbonly x64 false - true - true - false 4 @@ -151,9 +132,6 @@ DEBUG;TRACE full x64 - false - false - false 4 False @@ -163,8 +141,6 @@ DEBUG;TRACE full x64 - false - false 4 False @@ -174,9 +150,6 @@ DEBUG;TRACE full x64 - true - true - false 4 False diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index 4afb131d3..264afd0ab 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -9,28 +9,6 @@ Python.EmbeddingTest Python.EmbeddingTest OnBuildSuccess - - - - - 3.5 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - 10.0.0 - 2.0 ..\..\ $(SolutionDir) true @@ -42,22 +20,16 @@ full x86 prompt - true - true - false - + true bin\x64\DebugMono\ DEBUG;TRACE full x64 prompt - true - true - false - + bin\x86\ReleaseMono\ @@ -65,11 +37,8 @@ pdbonly x86 prompt - true - true - false - + bin\x64\ReleaseMono\ @@ -77,9 +46,6 @@ pdbonly x64 prompt - true - true - false true @@ -88,22 +54,16 @@ full x86 prompt - true - false - false - + true bin\x64\DebugWin\ DEBUG;TRACE full x64 prompt - true - true - false - + bin\x86\ReleaseWin\ @@ -111,11 +71,8 @@ pdbonly x86 prompt - true - true - false - + bin\x64\ReleaseWin\ @@ -123,9 +80,6 @@ pdbonly x64 prompt - true - true - false @@ -148,23 +102,6 @@ - - - False - .NET Framework 2.0 %28x86%29 - true - - - False - .NET Framework 3.0 %28x86%29 - false - - - False - .NET Framework 3.5 - false - - {097B4AC0-74E9-4C58-BCF8-C69746EC8271} diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index 81616448c..98a9552ac 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -18,8 +18,6 @@ true pdbonly x86 - false - true bin\x64\ReleaseMono\ @@ -28,8 +26,6 @@ true pdbonly x64 - false - true bin\x86\ReleaseWin\ @@ -38,8 +34,6 @@ true pdbonly x86 - false - true bin\x64\ReleaseWin\ @@ -48,8 +42,6 @@ true pdbonly x64 - false - true true @@ -59,9 +51,6 @@ false full x86 - false - false - false true @@ -80,9 +69,6 @@ false full x86 - false - false - false true diff --git a/src/testing/Python.Test.csproj b/src/testing/Python.Test.csproj index 4566aeccf..1f0134296 100644 --- a/src/testing/Python.Test.csproj +++ b/src/testing/Python.Test.csproj @@ -21,22 +21,16 @@ full x86 prompt - true - true - false - + true bin\x64\DebugMono\ DEBUG;TRACE full x64 prompt - true - true - false - + bin\x86\ReleaseMono\ @@ -44,11 +38,8 @@ pdbonly x86 prompt - true - true - false - + bin\x64\ReleaseMono\ @@ -56,9 +47,6 @@ pdbonly x64 prompt - true - true - false true @@ -67,22 +55,16 @@ full x86 prompt - true - false - false - + true bin\x64\DebugWin\ DEBUG;TRACE full x64 prompt - true - true - false - + bin\x86\ReleaseWin\ @@ -90,11 +72,8 @@ pdbonly x86 prompt - true - true - false - + bin\x64\ReleaseWin\ @@ -102,9 +81,6 @@ pdbonly x64 prompt - true - true - false From 2d1da5de06d272fc12aceb5d6a1c6d1fb664c59a Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 31 Jan 2017 10:25:30 -0700 Subject: [PATCH 032/324] Remove interop26, interop32 Closes #270 --- src/runtime/Python.Runtime.csproj | 2 - src/runtime/interop26.cs | 150 ------------------------------ src/runtime/interop32.cs | 141 ---------------------------- 3 files changed, 293 deletions(-) delete mode 100644 src/runtime/interop26.cs delete mode 100644 src/runtime/interop32.cs diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index 98a9552ac..6309bf4a3 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -164,9 +164,7 @@ - - diff --git a/src/runtime/interop26.cs b/src/runtime/interop26.cs deleted file mode 100644 index 71e3c5115..000000000 --- a/src/runtime/interop26.cs +++ /dev/null @@ -1,150 +0,0 @@ -// Auto-generated by geninterop.py. -// DO NOT MODIFIY BY HAND. - - -#if PYTHON26 -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Runtime.InteropServices; -using System.Reflection; -using System.Text; - -namespace Python.Runtime -{ - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] - internal class TypeOffset - { - static TypeOffset() - { - Type type = typeof(TypeOffset); - FieldInfo[] fi = type.GetFields(); - int size = IntPtr.Size; - for (int i = 0; i < fi.Length; i++) - { - fi[i].SetValue(null, i * size); - } - } - - public static int magic() - { - return ob_size; - } - - // Auto-generated from PyHeapTypeObject in Python.h - public static int ob_refcnt = 0; - public static int ob_type = 0; - public static int ob_size = 0; - public static int tp_name = 0; - public static int tp_basicsize = 0; - public static int tp_itemsize = 0; - public static int tp_dealloc = 0; - public static int tp_print = 0; - public static int tp_getattr = 0; - public static int tp_setattr = 0; - public static int tp_compare = 0; - public static int tp_repr = 0; - public static int tp_as_number = 0; - public static int tp_as_sequence = 0; - public static int tp_as_mapping = 0; - public static int tp_hash = 0; - public static int tp_call = 0; - public static int tp_str = 0; - public static int tp_getattro = 0; - public static int tp_setattro = 0; - public static int tp_as_buffer = 0; - public static int tp_flags = 0; - public static int tp_doc = 0; - public static int tp_traverse = 0; - public static int tp_clear = 0; - public static int tp_richcompare = 0; - public static int tp_weaklistoffset = 0; - public static int tp_iter = 0; - public static int tp_iternext = 0; - public static int tp_methods = 0; - public static int tp_members = 0; - public static int tp_getset = 0; - public static int tp_base = 0; - public static int tp_dict = 0; - public static int tp_descr_get = 0; - public static int tp_descr_set = 0; - public static int tp_dictoffset = 0; - public static int tp_init = 0; - public static int tp_alloc = 0; - public static int tp_new = 0; - public static int tp_free = 0; - public static int tp_is_gc = 0; - public static int tp_bases = 0; - public static int tp_mro = 0; - public static int tp_cache = 0; - public static int tp_subclasses = 0; - public static int tp_weaklist = 0; - public static int tp_del = 0; - public static int tp_version_tag = 0; - public static int nb_add = 0; - public static int nb_subtract = 0; - public static int nb_multiply = 0; - public static int nb_divide = 0; - public static int nb_remainder = 0; - public static int nb_divmod = 0; - public static int nb_power = 0; - public static int nb_negative = 0; - public static int nb_positive = 0; - public static int nb_absolute = 0; - public static int nb_nonzero = 0; - public static int nb_invert = 0; - public static int nb_lshift = 0; - public static int nb_rshift = 0; - public static int nb_and = 0; - public static int nb_xor = 0; - public static int nb_or = 0; - public static int nb_coerce = 0; - public static int nb_int = 0; - public static int nb_long = 0; - public static int nb_float = 0; - public static int nb_oct = 0; - public static int nb_hex = 0; - public static int nb_inplace_add = 0; - public static int nb_inplace_subtract = 0; - public static int nb_inplace_multiply = 0; - public static int nb_inplace_divide = 0; - public static int nb_inplace_remainder = 0; - public static int nb_inplace_power = 0; - public static int nb_inplace_lshift = 0; - public static int nb_inplace_rshift = 0; - public static int nb_inplace_and = 0; - public static int nb_inplace_xor = 0; - public static int nb_inplace_or = 0; - public static int nb_floor_divide = 0; - public static int nb_true_divide = 0; - public static int nb_inplace_floor_divide = 0; - public static int nb_inplace_true_divide = 0; - public static int nb_index = 0; - public static int mp_length = 0; - public static int mp_subscript = 0; - public static int mp_ass_subscript = 0; - public static int sq_length = 0; - public static int sq_concat = 0; - public static int sq_repeat = 0; - public static int sq_item = 0; - public static int sq_slice = 0; - public static int sq_ass_item = 0; - public static int sq_ass_slice = 0; - public static int sq_contains = 0; - public static int sq_inplace_concat = 0; - public static int sq_inplace_repeat = 0; - public static int bf_getreadbuffer = 0; - public static int bf_getwritebuffer = 0; - public static int bf_getsegcount = 0; - public static int bf_getcharbuffer = 0; - public static int bf_getbuffer = 0; - public static int bf_releasebuffer = 0; - public static int name = 0; - public static int ht_slots = 0; - - /* here are optional user slots, followed by the members. */ - public static int members = 0; - } -} - -#endif diff --git a/src/runtime/interop32.cs b/src/runtime/interop32.cs deleted file mode 100644 index 2f7464233..000000000 --- a/src/runtime/interop32.cs +++ /dev/null @@ -1,141 +0,0 @@ -// Auto-generated by geninterop.py. -// DO NOT MODIFIY BY HAND. - - -#if PYTHON32 -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Runtime.InteropServices; -using System.Reflection; -using System.Text; - -namespace Python.Runtime -{ - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] - internal class TypeOffset - { - static TypeOffset() - { - Type type = typeof(TypeOffset); - FieldInfo[] fi = type.GetFields(); - int size = IntPtr.Size; - for (int i = 0; i < fi.Length; i++) - { - fi[i].SetValue(null, i * size); - } - } - - public static int magic() - { - return ob_size; - } - - // Auto-generated from PyHeapTypeObject in Python.h - public static int ob_refcnt = 0; - public static int ob_type = 0; - public static int ob_size = 0; - public static int tp_name = 0; - public static int tp_basicsize = 0; - public static int tp_itemsize = 0; - public static int tp_dealloc = 0; - public static int tp_print = 0; - public static int tp_getattr = 0; - public static int tp_setattr = 0; - public static int tp_reserved = 0; - public static int tp_repr = 0; - public static int tp_as_number = 0; - public static int tp_as_sequence = 0; - public static int tp_as_mapping = 0; - public static int tp_hash = 0; - public static int tp_call = 0; - public static int tp_str = 0; - public static int tp_getattro = 0; - public static int tp_setattro = 0; - public static int tp_as_buffer = 0; - public static int tp_flags = 0; - public static int tp_doc = 0; - public static int tp_traverse = 0; - public static int tp_clear = 0; - public static int tp_richcompare = 0; - public static int tp_weaklistoffset = 0; - public static int tp_iter = 0; - public static int tp_iternext = 0; - public static int tp_methods = 0; - public static int tp_members = 0; - public static int tp_getset = 0; - public static int tp_base = 0; - public static int tp_dict = 0; - public static int tp_descr_get = 0; - public static int tp_descr_set = 0; - public static int tp_dictoffset = 0; - public static int tp_init = 0; - public static int tp_alloc = 0; - public static int tp_new = 0; - public static int tp_free = 0; - public static int tp_is_gc = 0; - public static int tp_bases = 0; - public static int tp_mro = 0; - public static int tp_cache = 0; - public static int tp_subclasses = 0; - public static int tp_weaklist = 0; - public static int tp_del = 0; - public static int tp_version_tag = 0; - public static int nb_add = 0; - public static int nb_subtract = 0; - public static int nb_multiply = 0; - public static int nb_remainder = 0; - public static int nb_divmod = 0; - public static int nb_power = 0; - public static int nb_negative = 0; - public static int nb_positive = 0; - public static int nb_absolute = 0; - public static int nb_bool = 0; - public static int nb_invert = 0; - public static int nb_lshift = 0; - public static int nb_rshift = 0; - public static int nb_and = 0; - public static int nb_xor = 0; - public static int nb_or = 0; - public static int nb_int = 0; - public static int nb_reserved = 0; - public static int nb_float = 0; - public static int nb_inplace_add = 0; - public static int nb_inplace_subtract = 0; - public static int nb_inplace_multiply = 0; - public static int nb_inplace_remainder = 0; - public static int nb_inplace_power = 0; - public static int nb_inplace_lshift = 0; - public static int nb_inplace_rshift = 0; - public static int nb_inplace_and = 0; - public static int nb_inplace_xor = 0; - public static int nb_inplace_or = 0; - public static int nb_floor_divide = 0; - public static int nb_true_divide = 0; - public static int nb_inplace_floor_divide = 0; - public static int nb_inplace_true_divide = 0; - public static int nb_index = 0; - public static int mp_length = 0; - public static int mp_subscript = 0; - public static int mp_ass_subscript = 0; - public static int sq_length = 0; - public static int sq_concat = 0; - public static int sq_repeat = 0; - public static int sq_item = 0; - public static int was_sq_slice = 0; - public static int sq_ass_item = 0; - public static int was_sq_ass_slice = 0; - public static int sq_contains = 0; - public static int sq_inplace_concat = 0; - public static int sq_inplace_repeat = 0; - public static int bf_getbuffer = 0; - public static int bf_releasebuffer = 0; - public static int name = 0; - public static int ht_slots = 0; - - /* here are optional user slots, followed by the members. */ - public static int members = 0; - } -} - -#endif From af6d37f268a2ab5d9f460d4b09ddfa8a6cd800fc Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Thu, 26 Jan 2017 17:53:57 +0100 Subject: [PATCH 033/324] Fix the shutdown issue by keeping PyMethodDef. Keeping the PyMethodDef around like the documentation (https://docs.python.org/3.6/c-api/module.html#c.PyModuleDef) suggests fixes issue #262. --- src/runtime/importhook.cs | 24 +++++++++++------------- src/runtime/interop.cs | 2 +- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/runtime/importhook.cs b/src/runtime/importhook.cs index bdef98c27..dca5a53b4 100644 --- a/src/runtime/importhook.cs +++ b/src/runtime/importhook.cs @@ -16,7 +16,13 @@ internal class ImportHook #if PYTHON3 static IntPtr py_clr_module; - static IntPtr module_def; + static IntPtr module_def = IntPtr.Zero; + + internal static void InitializeModuleDef() + { + if (module_def == IntPtr.Zero) + module_def = ModuleDefOffset.AllocModuleDef("clr"); + } #endif //=================================================================== @@ -44,8 +50,8 @@ internal static void Initialize() root = new CLRModule(); #if PYTHON3 - // create a python module with the same methods as the clr module-like object - module_def = ModuleDefOffset.AllocModuleDef("clr"); + // create a python module with the same methods as the clr module-like object + InitializeModuleDef(); py_clr_module = Runtime.PyModule_Create2(module_def, 3); // both dicts are borrowed references @@ -70,21 +76,13 @@ internal static void Initialize() internal static void Shutdown() { -#if PYTHON3 if (0 != Runtime.Py_IsInitialized()) { +#if PYTHON3 Runtime.XDecref(py_clr_module); - Runtime.XDecref(root.pyHandle); - } - ModuleDefOffset.FreeModuleDef(module_def); #elif PYTHON2 - if (0 != Runtime.Py_IsInitialized()) - { - Runtime.XDecref(root.pyHandle); Runtime.XDecref(root.pyHandle); - } #endif - if (0 != Runtime.Py_IsInitialized()) - { + Runtime.XDecref(root.pyHandle); Runtime.XDecref(py_import); } } diff --git a/src/runtime/interop.cs b/src/runtime/interop.cs index 0657bc3e6..3dc5ad827 100644 --- a/src/runtime/interop.cs +++ b/src/runtime/interop.cs @@ -227,7 +227,7 @@ public static IntPtr AllocModuleDef(string modulename) { byte[] ascii = Encoding.ASCII.GetBytes(modulename); int size = name + ascii.Length + 1; IntPtr ptr = Marshal.AllocHGlobal(size); - for (int i = 0; i <= m_free; i += IntPtr.Size) + for (int i = 0; i < m_free; i += IntPtr.Size) Marshal.WriteIntPtr(ptr, i, IntPtr.Zero); Marshal.Copy(ascii, 0, (IntPtr)(ptr + name), ascii.Length); Marshal.WriteIntPtr(ptr, m_name, (IntPtr)(ptr + name)); From 402bfcf5d7432f30219650f64bb9c91ca2bbefc3 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 21 Jan 2017 17:11:02 -0700 Subject: [PATCH 034/324] Clean-up tests & remove warnfilter Ensure they are using the same functions in py2/py3 Ensure py2/py3 compat Misc. cleanup Add _compat The unittest module has been also updated to use the 'default' filter while running tests. DeprecationWarnings are ignored by default https://docs.python.org/3.3/library/warnings.html#updating-code-for-new-versions-of-python https://docs.python.org/3.3/library/warnings.html#default-warning-filters --- src/tests/PyImportTest/__init__.py | 1 + src/tests/PyImportTest/test/__init__.py | 1 + src/tests/PyImportTest/test/one.py | 1 + src/tests/__init__.py | 1 + src/tests/_compat.py | 65 +++++++++++++++++++ src/tests/leaktest.py | 53 ++++++++------- src/tests/profile.py | 20 ++++-- src/tests/runtests.py | 30 ++++++--- src/tests/stress.py | 40 ++++++++---- src/tests/stresstest.py | 51 ++++++++++----- src/tests/test_array.py | 4 +- src/tests/test_class.py | 6 +- src/tests/test_compat.py | 5 +- src/tests/test_constructors.py | 4 +- src/tests/test_conversion.py | 4 +- src/tests/test_delegate.py | 5 +- src/tests/test_docstring.py | 2 + src/tests/test_engine.py | 11 ++-- src/tests/test_enum.py | 5 +- src/tests/test_event.py | 4 +- src/tests/test_exceptions.py | 5 +- src/tests/test_field.py | 17 +++-- src/tests/test_generic.py | 4 +- src/tests/test_indexer.py | 4 +- src/tests/test_interface.py | 5 +- src/tests/test_method.py | 20 +++--- src/tests/test_module.py | 6 +- src/tests/test_property.py | 13 ++-- src/tests/test_subclass.py | 4 +- src/tests/test_suite/__init__.py | 9 ++- src/tests/test_suite/_missing_import.py | 3 +- src/tests/test_suite/test_callback.py | 12 +++- src/tests/test_suite/test_import.py | 10 ++- ...ursiveTypes.py => test_recursive_types.py} | 12 +++- src/tests/test_thread.py | 16 +++-- src/tests/warnfilter.py | 11 ---- 36 files changed, 327 insertions(+), 137 deletions(-) create mode 100644 src/tests/__init__.py create mode 100644 src/tests/_compat.py rename src/tests/test_suite/{test_recursiveTypes.py => test_recursive_types.py} (77%) delete mode 100644 src/tests/warnfilter.py diff --git a/src/tests/PyImportTest/__init__.py b/src/tests/PyImportTest/__init__.py index e69de29bb..40a96afc6 100644 --- a/src/tests/PyImportTest/__init__.py +++ b/src/tests/PyImportTest/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/src/tests/PyImportTest/test/__init__.py b/src/tests/PyImportTest/test/__init__.py index e69de29bb..40a96afc6 100644 --- a/src/tests/PyImportTest/test/__init__.py +++ b/src/tests/PyImportTest/test/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/src/tests/PyImportTest/test/one.py b/src/tests/PyImportTest/test/one.py index e69de29bb..40a96afc6 100644 --- a/src/tests/PyImportTest/test/one.py +++ b/src/tests/PyImportTest/test/one.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/src/tests/__init__.py b/src/tests/__init__.py new file mode 100644 index 000000000..40a96afc6 --- /dev/null +++ b/src/tests/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/src/tests/_compat.py b/src/tests/_compat.py new file mode 100644 index 000000000..3a9d48c7e --- /dev/null +++ b/src/tests/_compat.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- + +"""Python 2.7, 3.3+ compatibility module. + +Using Python 3 syntax to encourage upgrade unless otherwise noted. +""" + +import operator +import sys +import types + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +if PY3: + import _thread as thread # Using PY2 name + import pickle + from collections import UserList + + indexbytes = operator.getitem + input = input + + string_types = str, + binary_type = bytes + text_type = str + + DictProxyType = type(object.__dict__) + ClassType = type + + # No PY3 equivalents, use PY2 name + long = int + unichr = chr + unicode = str + + # from nowhere import Nothing + cmp = lambda a, b: (a > b) - (a < b) # No Py3 equivalent + map = map + range = range + zip = zip + +elif PY2: + import thread # Using PY2 name + import cPickle as pickle + from UserList import UserList + + indexbytes = lambda buf, i: ord(buf[i]) + input = raw_input + + string_types = str, unicode + bytes_type = str + text_type = unicode + + DictProxyType = types.DictProxyType + ClassType = types.ClassType + + # No PY3 equivalents, use PY2 name + long = long + unichr = unichr + unicode = unicode + + from itertools import izip, imap + cmp = cmp + map = imap + range = xrange + zip = izip diff --git a/src/tests/leaktest.py b/src/tests/leaktest.py index 383da87c8..43a0e83a7 100644 --- a/src/tests/leaktest.py +++ b/src/tests/leaktest.py @@ -1,9 +1,18 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# FIXME: TypeError: 'EventBinding' object is not callable + from __future__ import print_function -import System + +import clr import gc +import System + +from _compat import range + -class LeakTest: +class LeakTest(object): """A leak-check test for the objects implemented in the managed runtime. For each kind of object tested, memory should reach a particular level after warming up and stay essentially the @@ -54,7 +63,7 @@ def report(self): def testModules(self): self.notify("Running module leak check...") - for i in xrange(self.count): + for i in range(self.count): if i == 10: self.start_test() @@ -73,7 +82,7 @@ def testClasses(self): self.notify("Running class leak check...") - for i in xrange(self.count): + for i in range(self.count): if i == 10: self.start_test() @@ -86,7 +95,7 @@ def testClasses(self): del x # Delegate type - x = StringDelegate(hello) + x = StringDelegate(hello_func) del x self.end_test() @@ -96,7 +105,7 @@ def testEnumerations(self): self.notify("Running enum leak check...") - for i in xrange(self.count): + for i in range(self.count): if i == 10: self.start_test() @@ -131,7 +140,7 @@ def testEvents(self): self.notify("Running event leak check...") - for i in xrange(self.count): + for i in range(self.count): if i == 10: self.start_test() @@ -210,13 +219,13 @@ def testDelegates(self): self.notify("Running delegate leak check...") - for i in xrange(self.count): + for i in range(self.count): if i == 10: self.start_test() # Delegate from function testob = DelegateTest() - d = StringDelegate(hello) + d = StringDelegate(hello_func) testob.CallStringDelegate(d) testob.stringDelegate = d testob.stringDelegate() @@ -225,7 +234,7 @@ def testDelegates(self): del d # Delegate from instance method - inst = Hello() + inst = HelloClass() testob = DelegateTest() d = StringDelegate(inst.hello) testob.CallStringDelegate(d) @@ -238,7 +247,7 @@ def testDelegates(self): # Delegate from static method testob = DelegateTest() - d = StringDelegate(Hello.s_hello) + d = StringDelegate(HelloClass.s_hello) testob.CallStringDelegate(d) testob.stringDelegate = d testob.stringDelegate() @@ -248,7 +257,7 @@ def testDelegates(self): # Delegate from class method testob = DelegateTest() - d = StringDelegate(Hello.c_hello) + d = StringDelegate(HelloClass.c_hello) testob.CallStringDelegate(d) testob.stringDelegate = d testob.stringDelegate() @@ -257,7 +266,7 @@ def testDelegates(self): del d # Delegate from callable object - inst = Hello() + inst = HelloClass() testob = DelegateTest() d = StringDelegate(inst) testob.CallStringDelegate(d) @@ -290,7 +299,7 @@ def testDelegates(self): # Nested delegates testob = DelegateTest() - d1 = StringDelegate(hello) + d1 = StringDelegate(hello_func) d2 = StringDelegate(d1) testob.CallStringDelegate(d2) testob.stringDelegate = d2 @@ -302,8 +311,8 @@ def testDelegates(self): # Multicast delegates testob = DelegateTest() - d1 = StringDelegate(hello) - d2 = StringDelegate(hello) + d1 = StringDelegate(hello_func) + d2 = StringDelegate(hello_func) md = System.Delegate.Combine(d1, d2) testob.CallStringDelegate(md) testob.stringDelegate = md @@ -317,7 +326,7 @@ def testDelegates(self): self.end_test() -class GenericHandler: +class GenericHandler(object): """A generic handler to test event callbacks.""" def __init__(self): @@ -327,7 +336,7 @@ def handler(self, sender, args): self.value = args.value -class VariableArgsHandler: +class VariableArgsHandler(object): """A variable args handler to test event callbacks.""" def __init__(self): @@ -338,7 +347,7 @@ def handler(self, *args): self.value = eventargs.value -class CallableHandler: +class CallableHandler(object): """A callable handler to test event callbacks.""" def __init__(self): @@ -348,7 +357,7 @@ def __call__(self, sender, args): self.value = args.value -class VarCallableHandler: +class VarCallableHandler(object): """A variable args callable handler to test event callbacks.""" def __init__(self): @@ -381,7 +390,7 @@ def handler(cls, sender, args): handler = classmethod(handler) -class Hello: +class HelloClass(object): def hello(self): return "hello" @@ -399,7 +408,7 @@ def c_hello(cls): c_hello = classmethod(c_hello) -def hello(): +def hello_func(): return "hello" diff --git a/src/tests/profile.py b/src/tests/profile.py index 6117b9616..ddc076e7b 100644 --- a/src/tests/profile.py +++ b/src/tests/profile.py @@ -1,14 +1,25 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# FIXME: FAIL: testImplicitAssemblyLoad AssertionError: 0 != 1 + """Run all of the unit tests for this package over and over, - in order to provide for better profiling.""" + in order to provide for better profiling. +""" + from __future__ import print_function +import gc +import os +import sys +import time -def main(): - import sys, os, gc, time +import runtests +from _compat import range + +def main(): dirname = os.path.split(__file__) sys.path.append(dirname) - import runtests gc.set_debug(gc.DEBUG_LEAK) @@ -28,4 +39,3 @@ def main(): if __name__ == '__main__': main() - sys.exit(0) diff --git a/src/tests/runtests.py b/src/tests/runtests.py index 660d3442d..57d2e0767 100644 --- a/src/tests/runtests.py +++ b/src/tests/runtests.py @@ -1,11 +1,15 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + """Run all of the unit tests for this package.""" +from __future__ import print_function + import os import sys import unittest -import warnfilter -warnfilter.addClrWarnfilter() +from _compat import input try: import System @@ -14,16 +18,17 @@ import clr test_modules = ( - 'test_module', # Passes on its own, but not here if + # Passes on its own, but not here if # other test modules that import System.Windows.Forms # run first. They must not do module level import/AddReference() # of the System.Windows.Forms namespace. + 'test_module', + 'test_suite', 'test_event', 'test_constructors', 'test_enum', 'test_method', - 'test_exceptions', 'test_compat', 'test_generic', @@ -35,11 +40,18 @@ 'test_indexer', 'test_delegate', 'test_array', - 'test_thread' + 'test_thread', + 'test_docstring', + + # FIXME: Fails due to unhandled exception + # 'test_engine', + + # FIXME: Fails in Linux + # 'test_subclass', ) -def removePyc(): +def remove_pyc(): path = os.path.dirname(os.path.abspath(__file__)) for name in test_modules: pyc = os.path.join(path, "%s.pyc" % name) @@ -48,7 +60,7 @@ def removePyc(): def main(verbosity=1): - removePyc() + remove_pyc() suite = unittest.TestSuite() @@ -62,7 +74,7 @@ def main(verbosity=1): if __name__ == '__main__': - main(1) + main() if '--pause' in sys.argv: print("Press enter to continue") - raw_input() + input() diff --git a/src/tests/stress.py b/src/tests/stress.py index dba74a6df..ebc975d38 100644 --- a/src/tests/stress.py +++ b/src/tests/stress.py @@ -1,15 +1,32 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# FIXME: FAIL: testImplicitAssemblyLoad AssertionError: 0 != 1 + """ Run all of the unit tests for this package multiple times in a highly -multithreaded way to stress the system. This makes it possible to look +multi-threaded way to stress the system. This makes it possible to look for memory leaks and threading issues and provides a good target for a profiler to accumulate better data. """ + from __future__ import print_function -import sys, os, gc, time, threading, thread +import gc +import os +import sys +import threading +import time + +from _compat import range, thread -class StressTest: +def dprint(msg): + # Debugging helper to trace thread-related tests. + if 1: + print(msg) + + +class StressTest(object): def __init__(self): self.dirname = os.path.split(__file__)[0] sys.path.append(self.dirname) @@ -18,10 +35,6 @@ def __init__(self): self.module = runtests self.done = [] - def dprint(self, msg): - # Debugging helper to trace thread-related tests. - if 1: print(msg) - def markStart(self): self._start = time.clock() @@ -37,23 +50,23 @@ def printGCReport(self): def runThread(self, iterations): thread_id = thread.get_ident() - self.dprint("thread %s starting..." % thread_id) + dprint("thread %s starting..." % thread_id) time.sleep(0.1) for i in range(iterations): - self.dprint("thread %s iter %d start" % (thread_id, i)) + dprint("thread %s iter %d start" % (thread_id, i)) self.module.main() - self.dprint("thread %s iter %d end" % (thread_id, i)) + dprint("thread %s iter %d end" % (thread_id, i)) self.done.append(None) - self.dprint("thread %s done" % thread_id) + dprint("thread %s done" % thread_id) def stressTest(self, iterations=1, threads=1): args = (iterations,) self.markStart() - for i in range(threads): + for _ in range(threads): thread = threading.Thread(target=self.runThread, args=args) thread.start() while len(self.done) < (iterations * threads): - self.dprint(len(self.done)) + dprint(len(self.done)) time.sleep(0.1) self.markFinish() took = self.elapsed() @@ -67,4 +80,3 @@ def main(): if __name__ == '__main__': main() - sys.exit(0) diff --git a/src/tests/stresstest.py b/src/tests/stresstest.py index bdb7c3e70..6a4d6684a 100644 --- a/src/tests/stresstest.py +++ b/src/tests/stresstest.py @@ -1,36 +1,53 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# FIXME: FAIL: testImplicitAssemblyLoad AssertionError: 0 != 1 + """Basic stress test.""" +from __future__ import print_function + +import gc +import time +import unittest +# import pdb + +from _compat import range + +try: + import System +except ImportError: + print("Load clr import hook") + import clr + def main(): - import time start = time.clock() for i in range(2000): print(i) for name in ( - 'test_module', - 'test_conversion', - # 'test_class', - 'test_interface', - 'test_enum', - 'test_field', - 'test_property', - 'test_indexer', - 'test_event', - 'test_method', - # 'test_delegate', - 'test_array', + 'test_module', + 'test_conversion', + # 'test_class', + 'test_interface', + 'test_enum', + 'test_field', + 'test_property', + 'test_indexer', + 'test_event', + 'test_method', + # 'test_delegate', + 'test_array', ): module = __import__(name) - module.main() + unittest.TextTestRunner().run(module.test_suite()) - # import pdb; pdb.set_trace() + # pdb.set_trace() stop = time.clock() took = str(stop - start) - print 'Total Time: %s' % took + print('Total Time: %s' % took) - import gc for i in gc.get_objects(): print(i) diff --git a/src/tests/test_array.py b/src/tests/test_array.py index 9e396d7ed..4e9a7ac5e 100644 --- a/src/tests/test_array.py +++ b/src/tests/test_array.py @@ -1,4 +1,6 @@ -import sys, os, string, unittest, types +# -*- coding: utf-8 -*- + +import unittest import Python.Test as Test import System import six diff --git a/src/tests/test_class.py b/src/tests/test_class.py index 9e2af14da..494f59a9a 100644 --- a/src/tests/test_class.py +++ b/src/tests/test_class.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + import clr import types import unittest @@ -202,7 +204,7 @@ def __setitem__(self, key, value): self.assertTrue(table.Count == 3) def testAddAndRemoveClassAttribute(self): - + from System import TimeSpan for i in range(100): @@ -260,7 +262,7 @@ def DoCallback(self): def PyCallback(self, self2): self.PyCallbackWasCalled = True self.SameReference = self == self2 - + testobj = CallbackUser() testobj.DoCallback() self.assertTrue(testobj.PyCallbackWasCalled) diff --git a/src/tests/test_compat.py b/src/tests/test_compat.py index 8c74b855a..84dcc6884 100644 --- a/src/tests/test_compat.py +++ b/src/tests/test_compat.py @@ -1,4 +1,7 @@ -import sys, os, string, unittest, types +# -*- coding: utf-8 -*- + +import unittest +import types import six if six.PY3: diff --git a/src/tests/test_constructors.py b/src/tests/test_constructors.py index 6e02528bb..e8cbe1ea7 100644 --- a/src/tests/test_constructors.py +++ b/src/tests/test_constructors.py @@ -1,4 +1,6 @@ -import sys, os, string, unittest, types +# -*- coding: utf-8 -*- + +import unittest import clr clr.AddReference("Python.Test") diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index a00a91c48..92bad1dcc 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -1,4 +1,6 @@ -import sys, os, string, unittest, types +# -*- coding: utf-8 -*- + +import unittest from Python.Test import ConversionTest import System import six diff --git a/src/tests/test_delegate.py b/src/tests/test_delegate.py index 26b85ec5e..ac3d73a91 100644 --- a/src/tests/test_delegate.py +++ b/src/tests/test_delegate.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + import clr clr.AddReference('Python.Test') @@ -5,7 +7,8 @@ from Python.Test import DelegateTest, PublicDelegate from Python.Test import StringDelegate, ObjectDelegate from Python.Test import BoolDelegate -import sys, os, string, unittest, types +import unittest +import types import Python.Test as Test import System import six diff --git a/src/tests/test_docstring.py b/src/tests/test_docstring.py index 9eaea09bb..ac0512d10 100644 --- a/src/tests/test_docstring.py +++ b/src/tests/test_docstring.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + import unittest import clr diff --git a/src/tests/test_engine.py b/src/tests/test_engine.py index 43437c779..6c0928720 100644 --- a/src/tests/test_engine.py +++ b/src/tests/test_engine.py @@ -1,4 +1,7 @@ -import sys, os, string, unittest, types +# -*- coding: utf-8 -*- + +import sys +import unittest from Python.Runtime import PythonEngine @@ -9,9 +12,9 @@ class EngineTests(unittest.TestCase): def testMultipleCallsToInitialize(self): """Test that multiple initialize calls are harmless.""" - PythonEngine.Initialize(); - PythonEngine.Initialize(); - PythonEngine.Initialize(); + PythonEngine.Initialize() + PythonEngine.Initialize() + PythonEngine.Initialize() def testImportModule(self): """Test module import.""" diff --git a/src/tests/test_enum.py b/src/tests/test_enum.py index fae32bbe6..34a70db45 100644 --- a/src/tests/test_enum.py +++ b/src/tests/test_enum.py @@ -1,4 +1,7 @@ -import sys, os, string, unittest, types +# -*- coding: utf-8 -*- + +import unittest +import types from System import DayOfWeek from Python import Test import six diff --git a/src/tests/test_event.py b/src/tests/test_event.py index c68f9629a..874b37b54 100644 --- a/src/tests/test_event.py +++ b/src/tests/test_event.py @@ -1,8 +1,10 @@ +# -*- coding: utf-8 -*- + import clr clr.AddReference('Python.Test') -import sys, os, string, unittest, types +import unittest from Python.Test import EventTest, TestEventHandler from Python.Test import TestEventArgs diff --git a/src/tests/test_exceptions.py b/src/tests/test_exceptions.py index eedf2aa61..2c89e1351 100644 --- a/src/tests/test_exceptions.py +++ b/src/tests/test_exceptions.py @@ -1,4 +1,7 @@ -import sys, os, string, unittest, types +# -*- coding: utf-8 -*- + +import sys +import unittest import System import six diff --git a/src/tests/test_field.py b/src/tests/test_field.py index d765e3888..0b6163ebd 100644 --- a/src/tests/test_field.py +++ b/src/tests/test_field.py @@ -1,4 +1,7 @@ -import sys, os, string, unittest, types +# -*- coding: utf-8 -*- + +import unittest +import types from Python.Test import FieldTest from Python.Test import ShortEnum import System @@ -15,7 +18,7 @@ class FieldTests(unittest.TestCase): def testPublicInstanceField(self): """Test public instance fields.""" - object = FieldTest(); + object = FieldTest() self.assertTrue(object.PublicField == 0) object.PublicField = 1 @@ -28,7 +31,7 @@ def test(): def testPublicStaticField(self): """Test public static fields.""" - object = FieldTest(); + object = FieldTest() self.assertTrue(FieldTest.PublicStaticField == 0) FieldTest.PublicStaticField = 1 @@ -50,7 +53,7 @@ def test(): def testProtectedInstanceField(self): """Test protected instance fields.""" - object = FieldTest(); + object = FieldTest() self.assertTrue(object.ProtectedField == 0) object.ProtectedField = 1 @@ -63,7 +66,7 @@ def test(): def testProtectedStaticField(self): """Test protected static fields.""" - object = FieldTest(); + object = FieldTest() self.assertTrue(FieldTest.ProtectedStaticField == 0) FieldTest.ProtectedStaticField = 1 @@ -99,7 +102,7 @@ def test(): def testReadOnlyStaticField(self): """Test readonly static fields.""" - object = FieldTest(); + object = FieldTest() self.assertTrue(FieldTest.ReadOnlyStaticField == 0) self.assertTrue(object.ReadOnlyStaticField == 0) @@ -126,7 +129,7 @@ def test(): def testConstantField(self): """Test const fields.""" - object = FieldTest(); + object = FieldTest() self.assertTrue(FieldTest.ConstField == 0) self.assertTrue(object.ConstField == 0) diff --git a/src/tests/test_generic.py b/src/tests/test_generic.py index 1e8b58f21..92e028e47 100644 --- a/src/tests/test_generic.py +++ b/src/tests/test_generic.py @@ -1,9 +1,11 @@ +# -*- coding: utf-8 -*- + import clr clr.AddReference('Python.Test') from System.Collections.Generic import Dictionary, List -import sys, os, string, unittest, types +import unittest import Python.Test as Test import System import six diff --git a/src/tests/test_indexer.py b/src/tests/test_indexer.py index 5e74c76f0..23a722291 100644 --- a/src/tests/test_indexer.py +++ b/src/tests/test_indexer.py @@ -1,4 +1,6 @@ -import sys, os, string, unittest, types +# -*- coding: utf-8 -*- + +import unittest import clr clr.AddReference("Python.Test") diff --git a/src/tests/test_interface.py b/src/tests/test_interface.py index 1e495fe25..58b9ac56f 100644 --- a/src/tests/test_interface.py +++ b/src/tests/test_interface.py @@ -1,5 +1,8 @@ +# -*- coding: utf-8 -*- + from Python.Test import InterfaceTest -import sys, os, string, unittest, types +import unittest +import types import Python.Test as Test import System import six diff --git a/src/tests/test_method.py b/src/tests/test_method.py index 4728d13e4..6429bd246 100644 --- a/src/tests/test_method.py +++ b/src/tests/test_method.py @@ -1,4 +1,6 @@ -import sys, os, string, unittest, types +# -*- coding: utf-8 -*- + +import unittest import clr clr.AddReference("Python.Test") @@ -63,23 +65,23 @@ def test(): def testPublicInstanceMethod(self): """Test public instance method visibility.""" - object = MethodTest(); + object = MethodTest() self.assertTrue(object.PublicMethod() == "public") def testPublicStaticMethod(self): """Test public static method visibility.""" - object = MethodTest(); + object = MethodTest() self.assertTrue(MethodTest.PublicStaticMethod() == "public static") self.assertTrue(object.PublicStaticMethod() == "public static") def testProtectedInstanceMethod(self): """Test protected instance method visibility.""" - object = MethodTest(); + object = MethodTest() self.assertTrue(object.ProtectedMethod() == "protected") def testProtectedStaticMethod(self): """Test protected static method visibility.""" - object = MethodTest(); + object = MethodTest() result = "protected static" self.assertTrue(MethodTest.ProtectedStaticMethod() == result) self.assertTrue(object.ProtectedStaticMethod() == result) @@ -141,7 +143,7 @@ def test(): self.assertRaises(TypeError, test) - object = MethodTestSub(); + object = MethodTestSub() self.assertTrue(MethodTestSub.PublicMethod(object) == "public") self.assertTrue(MethodTestSub.PublicMethod(object, "echo") == "echo") @@ -162,7 +164,7 @@ def test(): self.assertRaises(TypeError, test) - object = MethodTestSub(); + object = MethodTestSub() self.assertTrue(object.PublicMethod() == "public") self.assertTrue(object.PublicMethod("echo") == "echo") @@ -761,14 +763,14 @@ def test(): def testWeCanBindToEncodingGetString(self): """Check that we can bind to the Encoding.GetString method with variables.""" - + from System.Text import Encoding from System.IO import MemoryStream myBytes = Encoding.UTF8.GetBytes('Some testing string') stream = MemoryStream() stream.Write(myBytes, 0, myBytes.Length) stream.Position = 0 - + buff = System.Array.CreateInstance(System.Byte, 3) buff.Initialize() data = [] diff --git a/src/tests/test_module.py b/src/tests/test_module.py index fff044f0c..fc0877265 100644 --- a/src/tests/test_module.py +++ b/src/tests/test_module.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + import clr clr.AddReference('Python.Test') @@ -5,7 +7,9 @@ # testImplicitAssemblyLoad() passes on deprecation warning; perfect! # ##clr.AddReference('System.Windows.Forms') -import sys, os, string, unittest, types, warnings +import unittest +import types +import warnings from fnmatch import fnmatch import six diff --git a/src/tests/test_property.py b/src/tests/test_property.py index 5bb653848..64bc7e946 100644 --- a/src/tests/test_property.py +++ b/src/tests/test_property.py @@ -1,4 +1,7 @@ -import sys, os, string, unittest, types +# -*- coding: utf-8 -*- +# +import unittest +import types from Python.Test import PropertyTest import six @@ -13,7 +16,7 @@ class PropertyTests(unittest.TestCase): def testPublicInstanceProperty(self): """Test public instance properties.""" - object = PropertyTest(); + object = PropertyTest() self.assertTrue(object.PublicProperty == 0) object.PublicProperty = 1 @@ -26,7 +29,7 @@ def test(): def testPublicStaticProperty(self): """Test public static properties.""" - object = PropertyTest(); + object = PropertyTest() self.assertTrue(PropertyTest.PublicStaticProperty == 0) PropertyTest.PublicStaticProperty = 1 @@ -48,7 +51,7 @@ def test(): def testProtectedInstanceProperty(self): """Test protected instance properties.""" - object = PropertyTest(); + object = PropertyTest() self.assertTrue(object.ProtectedProperty == 0) object.ProtectedProperty = 1 @@ -61,7 +64,7 @@ def test(): def testProtectedStaticProperty(self): """Test protected static properties.""" - object = PropertyTest(); + object = PropertyTest() self.assertTrue(PropertyTest.ProtectedStaticProperty == 0) PropertyTest.ProtectedStaticProperty = 1 diff --git a/src/tests/test_subclass.py b/src/tests/test_subclass.py index c486a0fc3..a6eedb101 100644 --- a/src/tests/test_subclass.py +++ b/src/tests/test_subclass.py @@ -1,9 +1,11 @@ +# -*- coding: utf-8 -*- + import clr clr.AddReference('Python.Test') clr.AddReference('System') -import sys, os, string, unittest, types +import unittest from Python.Test import TestFunctions, SubClassTest, IInterfaceTest, TestEventArgs from System.Collections.Generic import List from System import NotImplementedException diff --git a/src/tests/test_suite/__init__.py b/src/tests/test_suite/__init__.py index 5b1cc4ae4..16a3a4cf8 100644 --- a/src/tests/test_suite/__init__.py +++ b/src/tests/test_suite/__init__.py @@ -1,14 +1,17 @@ +# -*- coding: utf-8 -*- + import unittest __all__ = ['test_suite'] from .test_import import test_suite as import_tests from .test_callback import test_suite as callback_tests -from .test_recursiveTypes import test_suite as recursiveTypes_tests +from .test_recursive_types import test_suite as recursive_types_tests + def test_suite(): suite = unittest.TestSuite() suite.addTests((import_tests(),)) suite.addTests((callback_tests(),)) - suite.addTests((recursiveTypes_tests(),)) - return suite \ No newline at end of file + suite.addTests((recursive_types_tests(),)) + return suite diff --git a/src/tests/test_suite/_missing_import.py b/src/tests/test_suite/_missing_import.py index 629ff95be..a104cda49 100644 --- a/src/tests/test_suite/_missing_import.py +++ b/src/tests/test_suite/_missing_import.py @@ -1,2 +1,3 @@ +# -*- coding: utf-8 -*- -import this_package_should_never_exist_ever \ No newline at end of file +import this_package_should_never_exist_ever diff --git a/src/tests/test_suite/test_callback.py b/src/tests/test_suite/test_callback.py index 16c45914d..96070012f 100644 --- a/src/tests/test_suite/test_callback.py +++ b/src/tests/test_suite/test_callback.py @@ -1,15 +1,21 @@ -import unittest, sys +# -*- coding: utf-8 -*- + +import unittest +import sys import clr this_module = sys.modules[__name__] clr.AddReference("Python.Test") import Python.Test as Test from Python.Test import CallbackTest + test_instance = CallbackTest() -def simpleDefaultArg(arg = 'test'): + +def simpleDefaultArg(arg='test'): return arg + class CallbackTests(unittest.TestCase): """Test that callbacks from C# into python work.""" @@ -25,6 +31,6 @@ def testDefaultForNone(self): pythonRetVal = simpleDefaultArg() self.assertEquals(retVal, pythonRetVal) + def test_suite(): return unittest.makeSuite(CallbackTests) - diff --git a/src/tests/test_suite/test_import.py b/src/tests/test_suite/test_import.py index b6d155af3..f3ffbc870 100644 --- a/src/tests/test_suite/test_import.py +++ b/src/tests/test_suite/test_import.py @@ -1,10 +1,15 @@ +# -*- coding: utf-8 -*- + import unittest + class ImportTests(unittest.TestCase): """Test the import statement.""" - def testRealtiveMissingImport(self): - """Test that a relative missing import doesn't crash. Some modules use this to check if a package is installed (realtive import in the site-packages folder""" + def testRelativeMissingImport(self): + """Test that a relative missing import doesn't crash. + Some modules use this to check if a package is installed. + Relative import in the site-packages folder""" try: from . import _missing_import except ImportError: @@ -13,4 +18,3 @@ def testRealtiveMissingImport(self): def test_suite(): return unittest.makeSuite(ImportTests) - diff --git a/src/tests/test_suite/test_recursiveTypes.py b/src/tests/test_suite/test_recursive_types.py similarity index 77% rename from src/tests/test_suite/test_recursiveTypes.py rename to src/tests/test_suite/test_recursive_types.py index 290d7236a..88656f943 100644 --- a/src/tests/test_suite/test_recursiveTypes.py +++ b/src/tests/test_suite/test_recursive_types.py @@ -1,13 +1,20 @@ -import unittest, sys +# -*- coding: utf-8 -*- + +import unittest +import sys import clr this_module = sys.modules[__name__] clr.AddReference("Python.Test") + + class RecursiveTypesTests(unittest.TestCase): """Test if interop with recursive type inheritance works.""" def testRecursiveTypeCreation(self): - """Test that a recursive types don't crash with a StackOverflowException""" + """Test that a recursive types don't crash with a + StackOverflowException""" + import Python.Test as Test from Python.Test import RecursiveInheritance test_instance = RecursiveInheritance.SubClass() @@ -17,4 +24,3 @@ def testRecursiveTypeCreation(self): def test_suite(): return unittest.makeSuite(RecursiveTypesTests) - diff --git a/src/tests/test_thread.py b/src/tests/test_thread.py index 67873d83c..1a0a8963c 100644 --- a/src/tests/test_thread.py +++ b/src/tests/test_thread.py @@ -1,6 +1,12 @@ -import sys, os, string, unittest, types +# -*- coding: utf-8 -*- + +from __future__ import print_function + +import unittest from Python.Test import ThreadTest import six +import threading +import time if six.PY3: import _thread as thread @@ -10,7 +16,8 @@ def dprint(msg): # Debugging helper to trace thread-related tests. - if 0: print(msg) + if 0: + print(msg) class ThreadTests(unittest.TestCase): @@ -34,7 +41,6 @@ def testDoubleCallbackToPython(self): def testPythonThreadCallsToCLR(self): """Test calls by Python-spawned threads into managed code.""" # This test is very likely to hang if something is wrong ;) - import threading, time from System import String done = [] @@ -44,7 +50,7 @@ def run_thread(): time.sleep(0.1) dprint("thread %s %d" % (thread.get_ident(), i)) mstr = String("thread %s %d" % (thread.get_ident(), i)) - pstr = mstr.ToString() + dprint(mstr.ToString()) done.append(None) dprint("thread %s %d done" % (thread.get_ident(), i)) @@ -59,8 +65,6 @@ def start_threads(count): dprint(len(done)) time.sleep(0.1) - return - def test_suite(): return unittest.makeSuite(ThreadTests) diff --git a/src/tests/warnfilter.py b/src/tests/warnfilter.py deleted file mode 100644 index 8e378b86c..000000000 --- a/src/tests/warnfilter.py +++ /dev/null @@ -1,11 +0,0 @@ -"""Warnfilter -""" - -from warnings import filterwarnings -from warnings import resetwarnings - - -def addClrWarnfilter(action="ignore", append=False): - msgs = ["^The CLR module is deprecated.*", "^Importing from the CLR\.\* namespace.*"] - for msg in msgs: - filterwarnings(action, msg, category=DeprecationWarning, append=append) From fb71914e7346c10cc7f2cba0f363b892b53b07ea Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 21 Jan 2017 18:25:42 -0700 Subject: [PATCH 035/324] Sanitize how to run tests * Remove unsupported entry points * Adds reference to Python.Test by default for all tests * Remove redundant add_reference * Avoid some implicit AddReferences that were being done Not all tests added reference to Python.Test consistently. Solve this by making `run_test` the only supported method. --- src/tests/runtests.py | 4 ++++ src/tests/stresstest.py | 4 ++++ src/tests/test_array.py | 8 -------- src/tests/test_class.py | 9 --------- src/tests/test_compat.py | 17 ----------------- src/tests/test_constructors.py | 12 ------------ src/tests/test_conversion.py | 8 -------- src/tests/test_delegate.py | 12 ------------ src/tests/test_docstring.py | 11 ----------- src/tests/test_engine.py | 8 -------- src/tests/test_enum.py | 8 -------- src/tests/test_event.py | 12 ------------ src/tests/test_exceptions.py | 8 -------- src/tests/test_field.py | 8 -------- src/tests/test_generic.py | 11 ----------- src/tests/test_indexer.py | 10 ---------- src/tests/test_interface.py | 8 -------- src/tests/test_method.py | 11 ----------- src/tests/test_module.py | 16 +++------------- src/tests/test_property.py | 8 -------- src/tests/test_subclass.py | 12 ------------ src/tests/test_thread.py | 9 --------- 22 files changed, 11 insertions(+), 203 deletions(-) diff --git a/src/tests/runtests.py b/src/tests/runtests.py index 57d2e0767..3b7ffa08e 100644 --- a/src/tests/runtests.py +++ b/src/tests/runtests.py @@ -16,6 +16,10 @@ except ImportError: print("Load clr import hook") import clr + clr.AddReference("Python.Test") + clr.AddReference("System.Collections") + clr.AddReference("System.Data") + clr.AddReference("System.Management") test_modules = ( # Passes on its own, but not here if diff --git a/src/tests/stresstest.py b/src/tests/stresstest.py index 6a4d6684a..6c02bf566 100644 --- a/src/tests/stresstest.py +++ b/src/tests/stresstest.py @@ -18,6 +18,10 @@ except ImportError: print("Load clr import hook") import clr + clr.AddReference("Python.Test") + clr.AddReference("System.Collections") + clr.AddReference("System.Data") + clr.AddReference("System.Management") def main(): diff --git a/src/tests/test_array.py b/src/tests/test_array.py index 4e9a7ac5e..57034a8da 100644 --- a/src/tests/test_array.py +++ b/src/tests/test_array.py @@ -1480,11 +1480,3 @@ def test(): def test_suite(): return unittest.makeSuite(ArrayTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_class.py b/src/tests/test_class.py index 494f59a9a..5ff0c0e77 100644 --- a/src/tests/test_class.py +++ b/src/tests/test_class.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- -import clr import types import unittest @@ -280,11 +279,3 @@ def kind(self): def test_suite(): return unittest.makeSuite(ClassTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_compat.py b/src/tests/test_compat.py index 84dcc6884..26852ff72 100644 --- a/src/tests/test_compat.py +++ b/src/tests/test_compat.py @@ -159,9 +159,6 @@ def testDottedNameImportFromWithAlias(self): def testFromModuleImportStar(self): """Test from module import * behavior.""" - import clr - clr.AddReference("System.Management") - count = len(locals().keys()) m = __import__('CLR.System.Management', globals(), locals(), ['*']) self.assertTrue(m.__name__ == 'System.Management') @@ -262,17 +259,3 @@ def test000MultipleImports(self): def test_suite(): return unittest.makeSuite(CompatibilityTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - try: - import System - except ImportError: - print("Load clr import hook") - import clr - - main() diff --git a/src/tests/test_constructors.py b/src/tests/test_constructors.py index e8cbe1ea7..e123c7bdc 100644 --- a/src/tests/test_constructors.py +++ b/src/tests/test_constructors.py @@ -1,10 +1,6 @@ # -*- coding: utf-8 -*- import unittest -import clr - -clr.AddReference("Python.Test") -import Python.Test as Test import System @@ -51,11 +47,3 @@ class sub(System.Exception): def test_suite(): return unittest.makeSuite(ConstructorTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index 92bad1dcc..ba45d8e34 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -836,11 +836,3 @@ def testSByteArrayConversion(self): def test_suite(): return unittest.makeSuite(ConversionTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_delegate.py b/src/tests/test_delegate.py index ac3d73a91..1123bfdb5 100644 --- a/src/tests/test_delegate.py +++ b/src/tests/test_delegate.py @@ -1,9 +1,5 @@ # -*- coding: utf-8 -*- -import clr - -clr.AddReference('Python.Test') - from Python.Test import DelegateTest, PublicDelegate from Python.Test import StringDelegate, ObjectDelegate from Python.Test import BoolDelegate @@ -319,11 +315,3 @@ def always_so_negative(): def test_suite(): return unittest.makeSuite(DelegateTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_docstring.py b/src/tests/test_docstring.py index ac0512d10..d1be3c681 100644 --- a/src/tests/test_docstring.py +++ b/src/tests/test_docstring.py @@ -1,9 +1,6 @@ # -*- coding: utf-8 -*- import unittest -import clr - -clr.AddReference('Python.Test') from Python.Test import DocWithCtorTest, DocWithoutCtorTest, DocWithCtorNoDocTest @@ -29,11 +26,3 @@ def testDocWithoutCtor(self): def test_suite(): return unittest.makeSuite(DocStringTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_engine.py b/src/tests/test_engine.py index 6c0928720..c38a471fe 100644 --- a/src/tests/test_engine.py +++ b/src/tests/test_engine.py @@ -39,11 +39,3 @@ def testRunString(self): def test_suite(): return unittest.makeSuite(EngineTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_enum.py b/src/tests/test_enum.py index 34a70db45..6eb7e7592 100644 --- a/src/tests/test_enum.py +++ b/src/tests/test_enum.py @@ -148,11 +148,3 @@ def test(): def test_suite(): return unittest.makeSuite(EnumTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_event.py b/src/tests/test_event.py index 874b37b54..2ddcc55d8 100644 --- a/src/tests/test_event.py +++ b/src/tests/test_event.py @@ -1,9 +1,5 @@ # -*- coding: utf-8 -*- -import clr - -clr.AddReference('Python.Test') - import unittest from Python.Test import EventTest, TestEventHandler from Python.Test import TestEventArgs @@ -678,11 +674,3 @@ def handler(self, sender, args): def test_suite(): return unittest.makeSuite(EventTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_exceptions.py b/src/tests/test_exceptions.py index 2c89e1351..9509cef95 100644 --- a/src/tests/test_exceptions.py +++ b/src/tests/test_exceptions.py @@ -372,11 +372,3 @@ def testChainedExceptions(self): def test_suite(): return unittest.makeSuite(ExceptionTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_field.py b/src/tests/test_field.py index 0b6163ebd..bafb27598 100644 --- a/src/tests/test_field.py +++ b/src/tests/test_field.py @@ -426,11 +426,3 @@ def test(): def test_suite(): return unittest.makeSuite(FieldTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_generic.py b/src/tests/test_generic.py index 92e028e47..c80ff5704 100644 --- a/src/tests/test_generic.py +++ b/src/tests/test_generic.py @@ -1,9 +1,6 @@ # -*- coding: utf-8 -*- import clr - -clr.AddReference('Python.Test') - from System.Collections.Generic import Dictionary, List import unittest import Python.Test as Test @@ -795,11 +792,3 @@ def testNestedGenericClass(self): def test_suite(): return unittest.makeSuite(GenericTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_indexer.py b/src/tests/test_indexer.py index 23a722291..f9d16a1c3 100644 --- a/src/tests/test_indexer.py +++ b/src/tests/test_indexer.py @@ -1,9 +1,7 @@ # -*- coding: utf-8 -*- import unittest -import clr -clr.AddReference("Python.Test") import Python.Test as Test import six @@ -679,11 +677,3 @@ def test(): def test_suite(): return unittest.makeSuite(IndexerTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_interface.py b/src/tests/test_interface.py index 58b9ac56f..6c6bb6228 100644 --- a/src/tests/test_interface.py +++ b/src/tests/test_interface.py @@ -77,11 +77,3 @@ def testExplicitCastToInterface(self): def test_suite(): return unittest.makeSuite(InterfaceTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_method.py b/src/tests/test_method.py index 6429bd246..f6806687c 100644 --- a/src/tests/test_method.py +++ b/src/tests/test_method.py @@ -1,9 +1,6 @@ # -*- coding: utf-8 -*- import unittest -import clr - -clr.AddReference("Python.Test") from Python.Test import MethodTest, MethodTestSub import System @@ -786,11 +783,3 @@ def testWeCanBindToEncodingGetString(self): def test_suite(): return unittest.makeSuite(MethodTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_module.py b/src/tests/test_module.py index fc0877265..8eaedf5c9 100644 --- a/src/tests/test_module.py +++ b/src/tests/test_module.py @@ -2,11 +2,6 @@ import clr -clr.AddReference('Python.Test') -clr.AddReference('System.Data') - -# testImplicitAssemblyLoad() passes on deprecation warning; perfect! # -##clr.AddReference('System.Windows.Forms') import unittest import types import warnings @@ -18,6 +13,9 @@ else: ClassType = types.ClassType +# testImplicitAssemblyLoad() passes on deprecation warning; perfect! # +# clr.AddReference('System.Windows.Forms') + class ModuleTests(unittest.TestCase): """Test CLR modules and the CLR import hook.""" @@ -383,11 +381,3 @@ def test_AssemblyLoadThreadSafety(self): def test_suite(): return unittest.makeSuite(ModuleTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_property.py b/src/tests/test_property.py index 64bc7e946..9ed2a5207 100644 --- a/src/tests/test_property.py +++ b/src/tests/test_property.py @@ -179,11 +179,3 @@ def testInterfaceProperty(self): def test_suite(): return unittest.makeSuite(PropertyTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_subclass.py b/src/tests/test_subclass.py index a6eedb101..f99c4cdc6 100644 --- a/src/tests/test_subclass.py +++ b/src/tests/test_subclass.py @@ -1,10 +1,6 @@ # -*- coding: utf-8 -*- import clr - -clr.AddReference('Python.Test') -clr.AddReference('System') - import unittest from Python.Test import TestFunctions, SubClassTest, IInterfaceTest, TestEventArgs from System.Collections.Generic import List @@ -167,11 +163,3 @@ def test_isinstance(self): def test_suite(): return unittest.makeSuite(SubClassTests) - - -def main(): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() diff --git a/src/tests/test_thread.py b/src/tests/test_thread.py index 1a0a8963c..ba91e3bee 100644 --- a/src/tests/test_thread.py +++ b/src/tests/test_thread.py @@ -68,12 +68,3 @@ def start_threads(count): def test_suite(): return unittest.makeSuite(ThreadTests) - - -def main(): - for i in range(50): - unittest.TextTestRunner().run(test_suite()) - - -if __name__ == '__main__': - main() From a51a4bf8d2e1e63732acaccd007af33e656a6940 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 21 Jan 2017 18:50:36 -0700 Subject: [PATCH 036/324] Remove dependency on six Remove six.u(...), six.b(...) Not needed since dropped older python versions --- .travis.yml | 2 +- appveyor.yml | 2 +- src/tests/test_array.py | 26 +++++----------------- src/tests/test_class.py | 7 +----- src/tests/test_compat.py | 20 +++++++---------- src/tests/test_conversion.py | 42 ++++++++++++++++-------------------- src/tests/test_delegate.py | 8 +------ src/tests/test_enum.py | 9 +------- src/tests/test_exceptions.py | 32 +++++++++++---------------- src/tests/test_field.py | 21 ++++++------------ src/tests/test_generic.py | 29 +++++++++++-------------- src/tests/test_indexer.py | 22 ++++++++----------- src/tests/test_interface.py | 8 +------ src/tests/test_method.py | 19 +++++++--------- src/tests/test_module.py | 27 +++++++++++------------ src/tests/test_property.py | 13 +++-------- src/tests/test_thread.py | 6 +----- 17 files changed, 103 insertions(+), 190 deletions(-) diff --git a/.travis.yml b/.travis.yml index 418e50cfc..1b5806d59 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,7 +25,7 @@ addons: - nunit-console install: - - pip install pycparser coverage codecov six + - pip install pycparser coverage codecov - coverage run setup.py build_ext --inplace script: diff --git a/appveyor.yml b/appveyor.yml index a8827aee7..2795a94f8 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -46,7 +46,7 @@ init: install: # install for wheels & coverage - - pip install --upgrade pip wheel coverage codecov six + - pip install --upgrade pip wheel coverage codecov # Install OpenCover. Can't put on packages.config; not Linux/Mono compatible - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages diff --git a/src/tests/test_array.py b/src/tests/test_array.py index 57034a8da..03440ca6e 100644 --- a/src/tests/test_array.py +++ b/src/tests/test_array.py @@ -3,11 +3,7 @@ import unittest import Python.Test as Test import System -import six - -if six.PY3: - long = int - unichr = chr +from _compat import UserList, PY2, long, unichr class ArrayTests(unittest.TestCase): @@ -1098,10 +1094,6 @@ def testSequenceArrayConversion(self): """Test conversion of sequence-like objects to array arguments.""" from Python.Test import ArrayConversionTest from Python.Test import Spam - if six.PY3: - from collections import UserList - else: - from UserList import UserList items = UserList() for i in range(10): @@ -1115,10 +1107,6 @@ def testSequenceNestedArrayConversion(self): """Test conversion of sequences to array-of-array arguments.""" from Python.Test import ArrayConversionTest from Python.Test import Spam - if six.PY3: - from collections import UserList - else: - from UserList import UserList items = UserList() for i in range(10): @@ -1204,10 +1192,6 @@ def testSequenceArrayConversionTypeChecking(self): """Test error handling for sequence conversion to array arguments.""" from Python.Test import ArrayConversionTest from Python.Test import Spam - if six.PY3: - from collections import UserList - else: - from UserList import UserList # This should work, because null / None is a valid value in an # array of reference types. @@ -1322,9 +1306,9 @@ def testSpecialArrayCreation(self): self.assertTrue(value[1] == 127) self.assertTrue(value.Length == 2) - value = Array[System.Char]([six.u('A'), six.u('Z')]) - self.assertTrue(value[0] == six.u('A')) - self.assertTrue(value[1] == six.u('Z')) + value = Array[System.Char]([u'A', u'Z']) + self.assertTrue(value[0] == u'A') + self.assertTrue(value[1] == u'Z') self.assertTrue(value.Length == 2) value = Array[System.Char]([0, 65535]) @@ -1353,7 +1337,7 @@ def testSpecialArrayCreation(self): self.assertTrue(value.Length == 2) # there's no explicit long type in python3, use System.Int64 instead - if not six.PY3: + if PY2: value = Array[long]([0, long(9223372036854775807)]) self.assertTrue(value[0] == 0) self.assertTrue(value[1] == long(9223372036854775807)) diff --git a/src/tests/test_class.py b/src/tests/test_class.py index 5ff0c0e77..30972d111 100644 --- a/src/tests/test_class.py +++ b/src/tests/test_class.py @@ -1,18 +1,13 @@ # -*- coding: utf-8 -*- -import types import unittest import Python.Test as Test import System -import six from Python.Test import ClassTest from System.Collections import Hashtable -if six.PY3: - DictProxyType = type(object.__dict__) -else: - DictProxyType = types.DictProxyType +from _compat import DictProxyType class ClassTests(unittest.TestCase): diff --git a/src/tests/test_compat.py b/src/tests/test_compat.py index 26852ff72..571d54717 100644 --- a/src/tests/test_compat.py +++ b/src/tests/test_compat.py @@ -2,12 +2,7 @@ import unittest import types -import six - -if six.PY3: - ClassType = type -else: - ClassType = types.ClassType +from _compat import PY2, PY3, ClassType class CompatibilityTests(unittest.TestCase): @@ -19,10 +14,11 @@ def isCLRModule(self, object): return type(object).__name__ == 'ModuleObject' def isCLRRootModule(self, object): - if six.PY3: + if PY3: # in Python 3 the clr module is a normal python module return object.__name__ == "clr" - return type(object).__name__ == 'CLRModule' + elif PY2: + return type(object).__name__ == 'CLRModule' def isCLRClass(self, object): return type(object).__name__ == 'CLR Metatype' # for now @@ -39,12 +35,12 @@ def testSimpleImport(self): self.assertTrue(type(sys) == types.ModuleType) self.assertTrue(sys.__name__ == 'sys') - if six.PY3: + if PY3: import http.client self.assertTrue(type(http.client) == types.ModuleType) self.assertTrue(http.client.__name__ == 'http.client') - else: + elif PY2: import httplib self.assertTrue(type(httplib) == types.ModuleType) self.assertTrue(httplib.__name__ == 'httplib') @@ -59,12 +55,12 @@ def testSimpleImportWithAlias(self): self.assertTrue(type(mySys) == types.ModuleType) self.assertTrue(mySys.__name__ == 'sys') - if six.PY3: + if PY3: import http.client as myHttplib self.assertTrue(type(myHttplib) == types.ModuleType) self.assertTrue(myHttplib.__name__ == 'http.client') - else: + elif PY2: import httplib as myHttplib self.assertTrue(type(myHttplib) == types.ModuleType) self.assertTrue(myHttplib.__name__ == 'httplib') diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index ba45d8e34..9aceb9c11 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -3,11 +3,7 @@ import unittest from Python.Test import ConversionTest import System -import six - -if six.PY3: - long = int - unichr = chr +from _compat import indexbytes, long, unichr class ConversionTests(unittest.TestCase): @@ -171,16 +167,16 @@ def testCharConversion(self): self.assertTrue(System.Char.MinValue == unichr(0)) object = ConversionTest() - self.assertTrue(object.CharField == six.u('A')) + self.assertTrue(object.CharField == u'A') object.CharField = 'B' - self.assertTrue(object.CharField == six.u('B')) + self.assertTrue(object.CharField == u'B') - object.CharField = six.u('B') - self.assertTrue(object.CharField == six.u('B')) + object.CharField = u'B' + self.assertTrue(object.CharField == u'B') object.CharField = 67 - self.assertTrue(object.CharField == six.u('C')) + self.assertTrue(object.CharField == u'C') def test(): ConversionTest().CharField = 65536 @@ -644,25 +640,25 @@ def testStringConversion(self): object = ConversionTest() self.assertTrue(object.StringField == "spam") - self.assertTrue(object.StringField == six.u("spam")) + self.assertTrue(object.StringField == u"spam") object.StringField = "eggs" self.assertTrue(object.StringField == "eggs") - self.assertTrue(object.StringField == six.u("eggs")) + self.assertTrue(object.StringField == u"eggs") - object.StringField = six.u("spam") + object.StringField = u"spam" self.assertTrue(object.StringField == "spam") - self.assertTrue(object.StringField == six.u("spam")) + self.assertTrue(object.StringField == u"spam") - object.StringField = six.u('\uffff\uffff') - self.assertTrue(object.StringField == six.u('\uffff\uffff')) + object.StringField = u'\uffff\uffff' + self.assertTrue(object.StringField == u'\uffff\uffff') object.StringField = System.String("spam") self.assertTrue(object.StringField == "spam") - self.assertTrue(object.StringField == six.u("spam")) + self.assertTrue(object.StringField == u"spam") - object.StringField = System.String(six.u('\uffff\uffff')) - self.assertTrue(object.StringField == six.u('\uffff\uffff')) + object.StringField = System.String(u'\uffff\uffff') + self.assertTrue(object.StringField == u'\uffff\uffff') object.StringField = None self.assertTrue(object.StringField == None) @@ -809,11 +805,11 @@ def testByteArrayConversion(self): self.assertTrue(array[0] == 0) self.assertTrue(array[4] == 4) - value = six.b("testing") + value = b"testing" object.ByteArrayField = value array = object.ByteArrayField for i in range(len(value)): - self.assertTrue(array[i] == six.indexbytes(value, i)) + self.assertTrue(array[i] == indexbytes(value, i)) def testSByteArrayConversion(self): """Test sbyte array conversion.""" @@ -827,11 +823,11 @@ def testSByteArrayConversion(self): self.assertTrue(array[0] == 0) self.assertTrue(array[4] == 4) - value = six.b("testing") + value = b"testing" object.SByteArrayField = value array = object.SByteArrayField for i in range(len(value)): - self.assertTrue(array[i] == six.indexbytes(value, i)) + self.assertTrue(array[i] == indexbytes(value, i)) def test_suite(): diff --git a/src/tests/test_delegate.py b/src/tests/test_delegate.py index 1123bfdb5..c9816da03 100644 --- a/src/tests/test_delegate.py +++ b/src/tests/test_delegate.py @@ -4,15 +4,9 @@ from Python.Test import StringDelegate, ObjectDelegate from Python.Test import BoolDelegate import unittest -import types import Python.Test as Test import System -import six - -if six.PY3: - DictProxyType = type(object.__dict__) -else: - DictProxyType = types.DictProxyType +from _compat import DictProxyType class DelegateTests(unittest.TestCase): diff --git a/src/tests/test_enum.py b/src/tests/test_enum.py index 6eb7e7592..dfc55a655 100644 --- a/src/tests/test_enum.py +++ b/src/tests/test_enum.py @@ -1,16 +1,9 @@ # -*- coding: utf-8 -*- import unittest -import types from System import DayOfWeek from Python import Test -import six - -if six.PY3: - DictProxyType = type(object.__dict__) - long = int -else: - DictProxyType = types.DictProxyType +from _compat import DictProxyType, long class EnumTests(unittest.TestCase): diff --git a/src/tests/test_exceptions.py b/src/tests/test_exceptions.py index 9509cef95..0c4078fb5 100644 --- a/src/tests/test_exceptions.py +++ b/src/tests/test_exceptions.py @@ -3,10 +3,7 @@ import sys import unittest import System -import six - -if six.PY3: - unicode = str +from _compat import PY2, PY3, pickle, text_type class ExceptionTests(unittest.TestCase): @@ -17,7 +14,7 @@ def testUnifiedExceptionSemantics(self): from System import Exception, Object e = Exception('Something bad happened') - if not six.PY3: + if PY2: import exceptions self.assertTrue(isinstance(e, exceptions.Exception)) self.assertTrue(isinstance(e, Exception)) @@ -212,9 +209,9 @@ def testCatchExceptionManagedClass(self): def testCatchExceptionPythonClass(self): """Test catching the python class of an exception.""" from System import OverflowException - if six.PY3: + if PY3: from builtins import Exception - else: + elif PY2: from exceptions import Exception try: @@ -288,8 +285,8 @@ def testStrOfException(self): Convert.ToDateTime('this will fail') except FormatException: e = sys.exc_info()[1] - msg = unicode(e).encode("utf8") # fix for international installation - self.assertTrue(msg.find(unicode('System.Convert.ToDateTime').encode("utf8")) > -1, msg) + msg = text_type(e).encode("utf8") # fix for international installation + self.assertTrue(msg.find(text_type('System.Convert.ToDateTime').encode("utf8")) > -1, msg) def testPythonCompatOfManagedExceptions(self): """Test if managed exceptions are compatible with Python's implementation @@ -299,14 +296,14 @@ def testPythonCompatOfManagedExceptions(self): e = OverflowException(msg) self.assertEqual(str(e), msg) - self.assertEqual(unicode(e), msg) + self.assertEqual(text_type(e), msg) self.assertEqual(e.args, (msg,)) self.assertTrue(isinstance(e.args, tuple)) - if six.PY2: - self.assertEqual(repr(e), "OverflowException(u'A simple message',)") - else: + if PY3: self.assertEqual(repr(e), "OverflowException('A simple message',)") + elif PY2: + self.assertEqual(repr(e), "OverflowException(u'A simple message',)") def testExceptionIsInstanceOfSystemObject(self): """Test behavior of isinstance(, System.Object).""" @@ -337,10 +334,6 @@ def testExceptionIsInstanceOfSystemObject(self): def testPicklingExceptions(self): from System import Exception - try: - import cPickle as pickle - except ImportError: - import pickle exc = Exception("test") dumped = pickle.dumps(exc) @@ -349,7 +342,8 @@ def testPicklingExceptions(self): self.assertEqual(exc.args, loaded.args) def testChainedExceptions(self): - if six.PY3: + # TODO: Why is this test PY3 only? + if PY3: from Python.Test import ExceptionTest try: @@ -358,7 +352,7 @@ def testChainedExceptions(self): msgs = [ "Outer exception", "Inner exception", - "Innermost exception" + "Innermost exception", ] for msg in msgs: diff --git a/src/tests/test_field.py b/src/tests/test_field.py index bafb27598..3cd7eb83e 100644 --- a/src/tests/test_field.py +++ b/src/tests/test_field.py @@ -1,16 +1,9 @@ # -*- coding: utf-8 -*- import unittest -import types from Python.Test import FieldTest from Python.Test import ShortEnum import System -import six - -if six.PY3: - IntType = int -else: - IntType = types.IntType class FieldTests(unittest.TestCase): @@ -203,15 +196,15 @@ def testFieldDescriptorGetSet(self): self.assertTrue(object.PublicStaticField == 0) descriptor = FieldTest.__dict__['PublicStaticField'] - self.assertTrue(type(descriptor) != IntType) + self.assertTrue(type(descriptor) != int) object.PublicStaticField = 0 descriptor = FieldTest.__dict__['PublicStaticField'] - self.assertTrue(type(descriptor) != IntType) + self.assertTrue(type(descriptor) != int) FieldTest.PublicStaticField = 0 descriptor = FieldTest.__dict__['PublicStaticField'] - self.assertTrue(type(descriptor) != IntType) + self.assertTrue(type(descriptor) != int) def testFieldDescriptorWrongType(self): """Test setting a field using a value of the wrong type.""" @@ -272,15 +265,15 @@ def testByteField(self): def testCharField(self): """Test char fields.""" object = FieldTest() - self.assertTrue(object.CharField == six.u('A')) + self.assertTrue(object.CharField == u'A') self.assertTrue(object.CharField == 'A') object.CharField = 'B' - self.assertTrue(object.CharField == six.u('B')) + self.assertTrue(object.CharField == u'B') self.assertTrue(object.CharField == 'B') - object.CharField = six.u('C') - self.assertTrue(object.CharField == six.u('C')) + object.CharField = u'C' + self.assertTrue(object.CharField == u'C') self.assertTrue(object.CharField == 'C') def testInt16Field(self): diff --git a/src/tests/test_generic.py b/src/tests/test_generic.py index c80ff5704..eb87c5271 100644 --- a/src/tests/test_generic.py +++ b/src/tests/test_generic.py @@ -5,12 +5,7 @@ import unittest import Python.Test as Test import System -import six - -if six.PY3: - long = int - unichr = chr - unicode = str +from _compat import PY2, long, unichr, unicode class GenericTests(unittest.TestCase): @@ -171,13 +166,13 @@ def testGenericTypeBinding(self): self._testGenericWrapperByType(bool, True) self._testGenericWrapperByType(System.Byte, 255) self._testGenericWrapperByType(System.SByte, 127) - self._testGenericWrapperByType(System.Char, six.u('A')) + self._testGenericWrapperByType(System.Char, u'A') self._testGenericWrapperByType(System.Int16, 32767) self._testGenericWrapperByType(System.Int32, 2147483647) self._testGenericWrapperByType(int, 2147483647) self._testGenericWrapperByType(System.Int64, long(9223372036854775807)) # Python 3 has no explicit long type, use System.Int64 instead - if not six.PY3: + if PY2: self._testGenericWrapperByType(long, long(9223372036854775807)) self._testGenericWrapperByType(System.UInt16, 65000) self._testGenericWrapperByType(System.UInt32, long(4294967295)) @@ -318,12 +313,12 @@ def testGenericMethodTypeHandling(self): self._testGenericMethodByType(bool, True) self._testGenericMethodByType(System.Byte, 255) self._testGenericMethodByType(System.SByte, 127) - self._testGenericMethodByType(System.Char, six.u('A')) + self._testGenericMethodByType(System.Char, u'A') self._testGenericMethodByType(System.Int16, 32767) self._testGenericMethodByType(System.Int32, 2147483647) self._testGenericMethodByType(int, 2147483647) # Python 3 has no explicit long type, use System.Int64 instead - if not six.PY3: + if PY2: self._testGenericMethodByType(System.Int64, long(9223372036854775807)) self._testGenericMethodByType(long, long(9223372036854775807)) self._testGenericMethodByType(System.UInt32, long(4294967295)) @@ -367,7 +362,7 @@ def testCorrectOverloadSelection(self): atype(value2)) == Math.Max.__overloads__[atype, atype]( atype(value1), atype(value2))) - if (atype is Int64) and six.PY2: + if PY2 and atype is Int64: value2 = long(value2) self.assertTrue( Math.Max(atype(value1), @@ -490,9 +485,9 @@ def testMethodOverloadSelectionWithGenericTypes(self): self.assertTrue(value.value == 127) vtype = GenericWrapper[System.Char] - input = vtype(six.u('A')) + input = vtype(u'A') value = MethodTest.Overloaded.__overloads__[vtype](input) - self.assertTrue(value.value == six.u('A')) + self.assertTrue(value.value == u'A') vtype = GenericWrapper[System.Char] input = vtype(65535) @@ -520,7 +515,7 @@ def testMethodOverloadSelectionWithGenericTypes(self): self.assertTrue(value.value == long(9223372036854775807)) # Python 3 has no explicit long type, use System.Int64 instead - if not six.PY3: + if PY2: vtype = GenericWrapper[long] input = vtype(long(9223372036854775807)) value = MethodTest.Overloaded.__overloads__[vtype](input) @@ -633,9 +628,9 @@ def testOverloadSelectionWithArraysOfGenericTypes(self): gtype = GenericWrapper[System.Char] vtype = System.Array[gtype] - input = vtype([gtype(six.u('A')), gtype(six.u('A'))]) + input = vtype([gtype(u'A'), gtype(u'A')]) value = MethodTest.Overloaded.__overloads__[vtype](input) - self.assertTrue(value[0].value == six.u('A')) + self.assertTrue(value[0].value == u'A') self.assertTrue(value.Length == 2) gtype = GenericWrapper[System.Char] @@ -675,7 +670,7 @@ def testOverloadSelectionWithArraysOfGenericTypes(self): self.assertTrue(value.Length == 2) # Python 3 has no explicit long type, use System.Int64 instead - if not six.PY3: + if PY2: gtype = GenericWrapper[long] vtype = System.Array[gtype] input = vtype([gtype(long(9223372036854775807)), diff --git a/src/tests/test_indexer.py b/src/tests/test_indexer.py index f9d16a1c3..b241ef366 100644 --- a/src/tests/test_indexer.py +++ b/src/tests/test_indexer.py @@ -3,11 +3,7 @@ import unittest import Python.Test as Test -import six - -if six.PY3: - long = int - unichr = chr +from _compat import long, unichr class IndexerTests(unittest.TestCase): @@ -413,19 +409,19 @@ def testStringIndexer(self): object = Test.StringIndexerTest() self.assertTrue(object["spam"] == None) - self.assertTrue(object[six.u("spam")] == None) + self.assertTrue(object[u"spam"] == None) object["spam"] = "spam" self.assertTrue(object["spam"] == "spam") - self.assertTrue(object["spam"] == six.u("spam")) - self.assertTrue(object[six.u("spam")] == "spam") - self.assertTrue(object[six.u("spam")] == six.u("spam")) + self.assertTrue(object["spam"] == u"spam") + self.assertTrue(object[u"spam"] == "spam") + self.assertTrue(object[u"spam"] == u"spam") - object[six.u("eggs")] = six.u("eggs") + object[u"eggs"] = u"eggs" self.assertTrue(object["eggs"] == "eggs") - self.assertTrue(object["eggs"] == six.u("eggs")) - self.assertTrue(object[six.u("eggs")] == "eggs") - self.assertTrue(object[six.u("eggs")] == six.u("eggs")) + self.assertTrue(object["eggs"] == u"eggs") + self.assertTrue(object[u"eggs"] == "eggs") + self.assertTrue(object[u"eggs"] == u"eggs") def test(): object = Test.StringIndexerTest() diff --git a/src/tests/test_interface.py b/src/tests/test_interface.py index 6c6bb6228..13878efbf 100644 --- a/src/tests/test_interface.py +++ b/src/tests/test_interface.py @@ -2,15 +2,9 @@ from Python.Test import InterfaceTest import unittest -import types import Python.Test as Test import System -import six - -if six.PY3: - DictProxyType = type(object.__dict__) -else: - DictProxyType = types.DictProxyType +from _compat import DictProxyType class InterfaceTests(unittest.TestCase): diff --git a/src/tests/test_method.py b/src/tests/test_method.py index f6806687c..67cb9d4a1 100644 --- a/src/tests/test_method.py +++ b/src/tests/test_method.py @@ -4,11 +4,8 @@ from Python.Test import MethodTest, MethodTestSub import System -import six -if six.PY3: - long = int - unichr = chr +from _compat import PY2, long, unichr class MethodTests(unittest.TestCase): @@ -495,8 +492,8 @@ def testExplicitOverloadSelection(self): value = MethodTest.Overloaded.__overloads__[System.SByte](127) self.assertTrue(value == 127) - value = MethodTest.Overloaded.__overloads__[System.Char](six.u('A')) - self.assertTrue(value == six.u('A')) + value = MethodTest.Overloaded.__overloads__[System.Char](u'A') + self.assertTrue(value == u'A') value = MethodTest.Overloaded.__overloads__[System.Char](65535) self.assertTrue(value == unichr(65535)) @@ -516,7 +513,7 @@ def testExplicitOverloadSelection(self): self.assertTrue(value == long(9223372036854775807)) # Python 3 has no explicit long type, use System.Int64 instead - if not six.PY3: + if PY2: value = MethodTest.Overloaded.__overloads__[long]( long(9223372036854775807) ) @@ -612,10 +609,10 @@ def testOverloadSelectionWithArrayTypes(self): self.assertTrue(value[1] == 127) vtype = Array[System.Char] - input = vtype([six.u('A'), six.u('Z')]) + input = vtype([u'A', u'Z']) value = MethodTest.Overloaded.__overloads__[vtype](input) - self.assertTrue(value[0] == six.u('A')) - self.assertTrue(value[1] == six.u('Z')) + self.assertTrue(value[0] == u'A') + self.assertTrue(value[1] == u'Z') vtype = Array[System.Char] input = vtype([0, 65535]) @@ -648,7 +645,7 @@ def testOverloadSelectionWithArrayTypes(self): self.assertTrue(value[1] == long(9223372036854775807)) # Python 3 has no explicit long type, use System.Int64 instead - if not six.PY3: + if PY2: vtype = Array[long] input = vtype([0, long(9223372036854775807)]) value = MethodTest.Overloaded.__overloads__[vtype](input) diff --git a/src/tests/test_module.py b/src/tests/test_module.py index 8eaedf5c9..caa94b1d5 100644 --- a/src/tests/test_module.py +++ b/src/tests/test_module.py @@ -6,12 +6,8 @@ import types import warnings from fnmatch import fnmatch -import six -if six.PY3: - ClassType = type -else: - ClassType = types.ClassType +from _compat import ClassType, PY2, PY3 # testImplicitAssemblyLoad() passes on deprecation warning; perfect! # # clr.AddReference('System.Windows.Forms') @@ -24,10 +20,11 @@ def isCLRModule(self, object): return type(object).__name__ == 'ModuleObject' def isCLRRootModule(self, object): - if six.PY3: + if PY3: # in Python 3 the clr module is a normal python module return object.__name__ == "clr" - return type(object).__name__ == 'CLRModule' + elif PY2: + return type(object).__name__ == 'CLRModule' def isCLRClass(self, object): return type(object).__name__ == 'CLR Metatype' # for now @@ -90,11 +87,11 @@ def testSimpleImport(self): self.assertTrue(type(sys) == types.ModuleType) self.assertTrue(sys.__name__ == 'sys') - if six.PY3: + if PY3: import http.client as httplib self.assertTrue(type(httplib) == types.ModuleType) self.assertTrue(httplib.__name__ == 'http.client') - else: + elif PY2: import httplib self.assertTrue(type(httplib) == types.ModuleType) self.assertTrue(httplib.__name__ == 'httplib') @@ -109,11 +106,11 @@ def testSimpleImportWithAlias(self): self.assertTrue(type(mySys) == types.ModuleType) self.assertTrue(mySys.__name__ == 'sys') - if six.PY3: + if PY3: import http.client as myHttplib self.assertTrue(type(myHttplib) == types.ModuleType) self.assertTrue(myHttplib.__name__ == 'http.client') - else: + elif PY2: import httplib as myHttplib self.assertTrue(type(myHttplib) == types.ModuleType) self.assertTrue(myHttplib.__name__ == 'httplib') @@ -346,10 +343,10 @@ def test_ClrListAssemblies(self): from clr import ListAssemblies verbose = list(ListAssemblies(True)) short = list(ListAssemblies(False)) - self.assertTrue(six.u('mscorlib') in short) - self.assertTrue(six.u('System') in short) - self.assertTrue(six.u('Culture=') in verbose[0]) - self.assertTrue(six.u('Version=') in verbose[0]) + self.assertTrue(u'mscorlib' in short) + self.assertTrue(u'System' in short) + self.assertTrue(u'Culture=' in verbose[0]) + self.assertTrue(u'Version=' in verbose[0]) def test_ClrAddReference(self): from clr import AddReference diff --git a/src/tests/test_property.py b/src/tests/test_property.py index 9ed2a5207..1358f0fe5 100644 --- a/src/tests/test_property.py +++ b/src/tests/test_property.py @@ -1,14 +1,7 @@ # -*- coding: utf-8 -*- # import unittest -import types from Python.Test import PropertyTest -import six - -if six.PY3: - IntType = int -else: - IntType = types.IntType class PropertyTests(unittest.TestCase): @@ -133,15 +126,15 @@ def testPropertyDescriptorGetSet(self): self.assertTrue(object.PublicStaticProperty == 0) descriptor = PropertyTest.__dict__['PublicStaticProperty'] - self.assertTrue(type(descriptor) != IntType) + self.assertTrue(type(descriptor) != int) object.PublicStaticProperty = 0 descriptor = PropertyTest.__dict__['PublicStaticProperty'] - self.assertTrue(type(descriptor) != IntType) + self.assertTrue(type(descriptor) != int) PropertyTest.PublicStaticProperty = 0 descriptor = PropertyTest.__dict__['PublicStaticProperty'] - self.assertTrue(type(descriptor) != IntType) + self.assertTrue(type(descriptor) != int) def testPropertyDescriptorWrongType(self): """Test setting a property using a value of the wrong type.""" diff --git a/src/tests/test_thread.py b/src/tests/test_thread.py index ba91e3bee..09104a91a 100644 --- a/src/tests/test_thread.py +++ b/src/tests/test_thread.py @@ -4,14 +4,10 @@ import unittest from Python.Test import ThreadTest -import six import threading import time -if six.PY3: - import _thread as thread -else: - import thread +from _compat import thread def dprint(msg): From b7bfd2def801e9988bea45c2eaa0aa4e63cebca5 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 21 Jan 2017 19:30:25 -0700 Subject: [PATCH 037/324] Clean-up imports - Fix py2/py3 range/zip behavior - Ensure same functions being used - Fix Exception/System.Exception name clashes --- src/tests/test_array.py | 4 +- src/tests/test_class.py | 31 ++++++++----- src/tests/test_compat.py | 5 ++- src/tests/test_constructors.py | 1 + src/tests/test_conversion.py | 6 ++- src/tests/test_delegate.py | 11 +++-- src/tests/test_docstring.py | 8 +++- src/tests/test_engine.py | 5 ++- src/tests/test_enum.py | 12 ++++- src/tests/test_event.py | 10 +++-- src/tests/test_exceptions.py | 18 +++----- src/tests/test_field.py | 6 ++- src/tests/test_generic.py | 46 ++++++++------------ src/tests/test_indexer.py | 1 + src/tests/test_interface.py | 18 +++++--- src/tests/test_method.py | 5 ++- src/tests/test_module.py | 8 ++-- src/tests/test_property.py | 1 + src/tests/test_subclass.py | 26 ++++++----- src/tests/test_suite/__init__.py | 4 +- src/tests/test_suite/test_callback.py | 15 +++---- src/tests/test_suite/test_recursive_types.py | 9 +--- src/tests/test_thread.py | 19 ++++---- 23 files changed, 151 insertions(+), 118 deletions(-) diff --git a/src/tests/test_array.py b/src/tests/test_array.py index 03440ca6e..0a4270636 100644 --- a/src/tests/test_array.py +++ b/src/tests/test_array.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- import unittest + import Python.Test as Test import System -from _compat import UserList, PY2, long, unichr + +from _compat import PY2, UserList, long, range, unichr class ArrayTests(unittest.TestCase): diff --git a/src/tests/test_class.py b/src/tests/test_class.py index 30972d111..169683883 100644 --- a/src/tests/test_class.py +++ b/src/tests/test_class.py @@ -4,10 +4,8 @@ import Python.Test as Test import System -from Python.Test import ClassTest -from System.Collections import Hashtable -from _compat import DictProxyType +from _compat import DictProxyType, range class ClassTests(unittest.TestCase): @@ -25,6 +23,8 @@ def testBasicValueType(self): def testClassStandardAttrs(self): """Test standard class attributes.""" + from Python.Test import ClassTest + self.assertTrue(ClassTest.__name__ == 'ClassTest') self.assertTrue(ClassTest.__module__ == 'Python.Test') self.assertTrue(type(ClassTest.__dict__) == DictProxyType) @@ -32,6 +32,8 @@ def testClassStandardAttrs(self): def testClassDocstrings(self): """Test standard class docstring generation""" + from Python.Test import ClassTest + value = 'Void .ctor()' self.assertTrue(ClassTest.__doc__ == value) @@ -47,7 +49,6 @@ def testClassDefaultRepr(self): def testNonPublicClass(self): """Test that non-public classes are inaccessible.""" - from Python import Test def test(): from Python.Test import InternalClass @@ -61,6 +62,7 @@ def test(): def testBasicSubclass(self): """Test basic subclass of a managed class.""" + from System.Collections import Hashtable class MyTable(Hashtable): def howMany(self): @@ -141,12 +143,14 @@ def testStructConstruction(self): def testIEnumerableIteration(self): """Test iteration over objects supporting IEnumerable.""" - list = Test.ClassTest.GetArrayList() + from Python.Test import ClassTest + + list = ClassTest.GetArrayList() for item in list: self.assertTrue((item > -1) and (item < 10)) - dict = Test.ClassTest.GetHashtable() + dict = ClassTest.GetHashtable() for item in dict: cname = item.__class__.__name__ @@ -154,13 +158,16 @@ def testIEnumerableIteration(self): def testIEnumeratorIteration(self): """Test iteration over objects supporting IEnumerator.""" - chars = Test.ClassTest.GetEnumerator() + from Python.Test import ClassTest + + chars = ClassTest.GetEnumerator() for item in chars: self.assertTrue(item in 'test string') def testOverrideGetItem(self): """Test managed subclass overriding __getitem__.""" + from System.Collections import Hashtable class MyTable(Hashtable): def __getitem__(self, key): @@ -180,6 +187,7 @@ def __getitem__(self, key): def testOverrideSetItem(self): """Test managed subclass overriding __setitem__.""" + from System.Collections import Hashtable class MyTable(Hashtable): def __setitem__(self, key, value): @@ -198,10 +206,9 @@ def __setitem__(self, key, value): self.assertTrue(table.Count == 3) def testAddAndRemoveClassAttribute(self): - from System import TimeSpan - for i in range(100): + for _ in range(100): TimeSpan.new_method = lambda self: self.TotalMinutes ts = TimeSpan.FromHours(1) self.assertTrue(ts.new_method() == 60) @@ -210,6 +217,7 @@ def testAddAndRemoveClassAttribute(self): def testComparisons(self): from System import DateTimeOffset + from Python.Test import ClassTest d1 = DateTimeOffset.Parse("2016-11-14") d2 = DateTimeOffset.Parse("2016-11-15") @@ -247,12 +255,14 @@ def testComparisons(self): self.assertRaises(TypeError, lambda: c1 < c2) def testSelfCallback(self): - """ Test calling back and forth between this and a c# baseclass.""" + """Test calling back and forth between this and a c# baseclass.""" + class CallbackUser(Test.SelfCallbackTest): def DoCallback(self): self.PyCallbackWasCalled = False self.SameReference = False return self.Callback(self) + def PyCallback(self, self2): self.PyCallbackWasCalled = True self.SameReference = self == self2 @@ -262,6 +272,7 @@ def PyCallback(self, self2): self.assertTrue(testobj.PyCallbackWasCalled) self.assertTrue(testobj.SameReference) + class ClassicClass: def kind(self): return 'classic' diff --git a/src/tests/test_compat.py b/src/tests/test_compat.py index 571d54717..f89aceece 100644 --- a/src/tests/test_compat.py +++ b/src/tests/test_compat.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- -import unittest import types -from _compat import PY2, PY3, ClassType +import unittest + +from _compat import ClassType, PY2, PY3, range class CompatibilityTests(unittest.TestCase): diff --git a/src/tests/test_constructors.py b/src/tests/test_constructors.py index e123c7bdc..b1cf6d438 100644 --- a/src/tests/test_constructors.py +++ b/src/tests/test_constructors.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import unittest + import System diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index 9aceb9c11..7af3ee65e 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- import unittest -from Python.Test import ConversionTest + import System -from _compat import indexbytes, long, unichr +from Python.Test import ConversionTest + +from _compat import indexbytes, long, range, unichr class ConversionTests(unittest.TestCase): diff --git a/src/tests/test_delegate.py b/src/tests/test_delegate.py index c9816da03..df371ca9a 100644 --- a/src/tests/test_delegate.py +++ b/src/tests/test_delegate.py @@ -1,11 +1,12 @@ # -*- coding: utf-8 -*- +# TODO: Add test for ObjectDelegate -from Python.Test import DelegateTest, PublicDelegate -from Python.Test import StringDelegate, ObjectDelegate -from Python.Test import BoolDelegate import unittest + import Python.Test as Test import System +from Python.Test import DelegateTest, StringDelegate + from _compat import DictProxyType @@ -14,6 +15,8 @@ class DelegateTests(unittest.TestCase): def testDelegateStandardAttrs(self): """Test standard delegate attributes.""" + from Python.Test import PublicDelegate + self.assertTrue(PublicDelegate.__name__ == 'PublicDelegate') self.assertTrue(PublicDelegate.__module__ == 'Python.Test') self.assertTrue(type(PublicDelegate.__dict__) == DictProxyType) @@ -264,6 +267,7 @@ def count(self): def testSubclassDelegateFails(self): """Test that subclassing of a delegate type fails.""" + from Python.Test import PublicDelegate def test(): class Boom(PublicDelegate): @@ -284,6 +288,7 @@ def sayhello(): def testBoolDelegate(self): """Test boolean delegate.""" + from Python.Test import BoolDelegate def always_so_negative(): return 0 diff --git a/src/tests/test_docstring.py b/src/tests/test_docstring.py index d1be3c681..afbd1062f 100644 --- a/src/tests/test_docstring.py +++ b/src/tests/test_docstring.py @@ -2,23 +2,27 @@ import unittest -from Python.Test import DocWithCtorTest, DocWithoutCtorTest, DocWithCtorNoDocTest - class DocStringTests(unittest.TestCase): """Test doc strings support.""" def testDocWithCtor(self): + from Python.Test import DocWithCtorTest + self.assertEqual(DocWithCtorTest.__doc__, 'DocWithCtorTest Class') self.assertEqual(DocWithCtorTest.TestMethod.__doc__, 'DocWithCtorTest TestMethod') self.assertEqual(DocWithCtorTest.StaticTestMethod.__doc__, 'DocWithCtorTest StaticTestMethod') def testDocWithCtorNoDoc(self): + from Python.Test import DocWithCtorNoDocTest + self.assertEqual(DocWithCtorNoDocTest.__doc__, 'Void .ctor(Boolean)') self.assertEqual(DocWithCtorNoDocTest.TestMethod.__doc__, 'Void TestMethod(Double, Int32)') self.assertEqual(DocWithCtorNoDocTest.StaticTestMethod.__doc__, 'Void StaticTestMethod(Double, Int32)') def testDocWithoutCtor(self): + from Python.Test import DocWithoutCtorTest + self.assertEqual(DocWithoutCtorTest.__doc__, 'DocWithoutCtorTest Class') self.assertEqual(DocWithoutCtorTest.TestMethod.__doc__, 'DocWithoutCtorTest TestMethod') self.assertEqual(DocWithoutCtorTest.StaticTestMethod.__doc__, 'DocWithoutCtorTest StaticTestMethod') diff --git a/src/tests/test_engine.py b/src/tests/test_engine.py index c38a471fe..274dfb704 100644 --- a/src/tests/test_engine.py +++ b/src/tests/test_engine.py @@ -1,11 +1,12 @@ # -*- coding: utf-8 -*- +# FIXME: This test module fails due to unhandled exceptions import sys import unittest -from Python.Runtime import PythonEngine +import System +from Python.Runtime import PythonEngine -# XXX This test module isn't used! class EngineTests(unittest.TestCase): """Test PythonEngine embedding APIs.""" diff --git a/src/tests/test_enum.py b/src/tests/test_enum.py index dfc55a655..589fc1796 100644 --- a/src/tests/test_enum.py +++ b/src/tests/test_enum.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- import unittest -from System import DayOfWeek -from Python import Test + +import Python.Test as Test + from _compat import DictProxyType, long @@ -11,6 +12,8 @@ class EnumTests(unittest.TestCase): def testEnumStandardAttrs(self): """Test standard enum attributes.""" + from System import DayOfWeek + self.assertTrue(DayOfWeek.__name__ == 'DayOfWeek') self.assertTrue(DayOfWeek.__module__ == 'System') self.assertTrue(type(DayOfWeek.__dict__) == DictProxyType) @@ -18,6 +21,8 @@ def testEnumStandardAttrs(self): def testEnumGetMember(self): """Test access to enum members.""" + from System import DayOfWeek + self.assertTrue(DayOfWeek.Sunday == 0) self.assertTrue(DayOfWeek.Monday == 1) self.assertTrue(DayOfWeek.Tuesday == 2) @@ -76,6 +81,7 @@ def testULongEnum(self): def testInstantiateEnumFails(self): """Test that instantiation of an enum class fails.""" + from System import DayOfWeek def test(): ob = DayOfWeek() @@ -84,6 +90,7 @@ def test(): def testSubclassEnumFails(self): """Test that subclassing of an enumeration fails.""" + from System import DayOfWeek def test(): class Boom(DayOfWeek): @@ -93,6 +100,7 @@ class Boom(DayOfWeek): def testEnumSetMemberFails(self): """Test that setattr operations on enumerations fail.""" + from System import DayOfWeek def test(): DayOfWeek.Sunday = 13 diff --git a/src/tests/test_event.py b/src/tests/test_event.py index 2ddcc55d8..5417b4a8f 100644 --- a/src/tests/test_event.py +++ b/src/tests/test_event.py @@ -1,8 +1,10 @@ # -*- coding: utf-8 -*- import unittest -from Python.Test import EventTest, TestEventHandler -from Python.Test import TestEventArgs + +from Python.Test import EventTest, TestEventArgs + +from _compat import range class EventTests(unittest.TestCase): @@ -515,7 +517,7 @@ def test(): object.PublicEvent -= handler.handler def testIncorrectInvokation(self): - """Test incorrect invokation of events.""" + """Test incorrect invocation of events.""" object = EventTest() handler = GenericHandler() @@ -535,6 +537,8 @@ def test(): def testExplicitCLSEventRegistration(self): """Test explicit CLS event registration.""" + from Python.Test import TestEventHandler + object = EventTest() handler = GenericHandler() diff --git a/src/tests/test_exceptions.py b/src/tests/test_exceptions.py index 0c4078fb5..647106a70 100644 --- a/src/tests/test_exceptions.py +++ b/src/tests/test_exceptions.py @@ -2,7 +2,9 @@ import sys import unittest + import System + from _compat import PY2, PY3, pickle, text_type @@ -11,13 +13,9 @@ class ExceptionTests(unittest.TestCase): def testUnifiedExceptionSemantics(self): """Test unified exception semantics.""" - from System import Exception, Object - - e = Exception('Something bad happened') - if PY2: - import exceptions - self.assertTrue(isinstance(e, exceptions.Exception)) + e = System.Exception('Something bad happened') self.assertTrue(isinstance(e, Exception)) + self.assertTrue(isinstance(e, System.Exception)) def testStandardExceptionAttributes(self): """Test accessing standard exception attributes.""" @@ -38,12 +36,12 @@ def testStandardExceptionAttributes(self): def testExtendedExceptionAttributes(self): """Test accessing extended exception attributes.""" from Python.Test import ExceptionTest, ExtendedException - from System import Exception, OverflowException + from System import OverflowException e = ExceptionTest.GetExtendedException() self.assertTrue(isinstance(e, ExtendedException)) self.assertTrue(isinstance(e, OverflowException)) - self.assertTrue(isinstance(e, Exception)) + self.assertTrue(isinstance(e, System.Exception)) self.assertTrue(e.Message == 'error') @@ -333,9 +331,7 @@ def testExceptionIsInstanceOfSystemObject(self): self.assertFalse(isinstance(o, Object)) def testPicklingExceptions(self): - from System import Exception - - exc = Exception("test") + exc = System.Exception("test") dumped = pickle.dumps(exc) loaded = pickle.loads(dumped) diff --git a/src/tests/test_field.py b/src/tests/test_field.py index 3cd7eb83e..8a2c0c67a 100644 --- a/src/tests/test_field.py +++ b/src/tests/test_field.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- import unittest -from Python.Test import FieldTest -from Python.Test import ShortEnum + import System +from Python.Test import FieldTest class FieldTests(unittest.TestCase): @@ -385,6 +385,8 @@ def testObjectField(self): def testEnumField(self): """Test enum fields.""" + from Python.Test import ShortEnum + object = FieldTest() self.assertTrue(object.EnumField == ShortEnum.Zero) diff --git a/src/tests/test_generic.py b/src/tests/test_generic.py index eb87c5271..67af8acb4 100644 --- a/src/tests/test_generic.py +++ b/src/tests/test_generic.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- import clr -from System.Collections.Generic import Dictionary, List import unittest -import Python.Test as Test + import System -from _compat import PY2, long, unichr, unicode + +from _compat import PY2, long, unicode, unichr, zip class GenericTests(unittest.TestCase): @@ -13,6 +13,8 @@ class GenericTests(unittest.TestCase): def testPythonTypeAliasing(self): """Test python type alias support with generics.""" + from System.Collections.Generic import Dictionary + dict = Dictionary[str, str]() self.assertEquals(dict.Count, 0) dict.Add("one", "one") @@ -66,6 +68,7 @@ def testPythonTypeAliasing(self): def testGenericReferenceType(self): """Test usage of generic reference type definitions.""" from Python.Test import GenericTypeDefinition + inst = GenericTypeDefinition[System.String, System.Int32]("one", 2) self.assertTrue(inst.value1 == "one") self.assertTrue(inst.value2 == 2) @@ -83,9 +86,7 @@ def testGenericDelegate(self): pass def testOpenGenericType(self): - """ - Test behavior of reflected open constructed generic types. - """ + """Test behavior of reflected open constructed generic types.""" from Python.Test import DerivedFromOpenGeneric OpenGenericType = DerivedFromOpenGeneric.__bases__[0] @@ -101,9 +102,7 @@ def test(): self.assertRaises(TypeError, test) def testDerivedFromOpenGenericType(self): - """ - Test a generic type derived from an open generic type. - """ + """Test a generic type derived from an open generic type.""" from Python.Test import DerivedFromOpenGeneric type = DerivedFromOpenGeneric[System.String, System.String] @@ -114,9 +113,7 @@ def testDerivedFromOpenGenericType(self): self.assertTrue(inst.value3 == 'three') def testGenericTypeNameResolution(self): - """ - Test the ability to disambiguate generic type names. - """ + """Test the ability to disambiguate generic type names.""" from Python.Test import GenericNameTest1, GenericNameTest2 # If both a non-generic and generic type exist for a name, the @@ -156,9 +153,7 @@ def _testGenericWrapperByType(self, ptype, value, test_type=0): self.assertTrue(inst.value[1] == value) def testGenericTypeBinding(self): - """ - Test argument conversion / binding for generic methods. - """ + """Test argument conversion / binding for generic methods.""" from Python.Test import InterfaceTest, ISayHello1, ShortEnum import System @@ -300,15 +295,13 @@ def test(): self.assertRaises(TypeError, test) def testGenericMethodTypeHandling(self): - """ - Test argument conversion / binding for generic methods. - """ + """Test argument conversion / binding for generic methods.""" from Python.Test import InterfaceTest, ISayHello1, ShortEnum import System # XXX BUG: The value doesn't fit into Int64 and PythonNet doesn't # recognize it as UInt64 for unknown reasons. - ## self._testGenericMethodByType(System.UInt64, 18446744073709551615L) + # self._testGenericMethodByType(System.UInt64, 18446744073709551615L) self._testGenericMethodByType(System.Boolean, True) self._testGenericMethodByType(bool, True) self._testGenericMethodByType(System.Byte, 255) @@ -337,9 +330,7 @@ def testGenericMethodTypeHandling(self): self._testGenericMethodByType(ISayHello1, InterfaceTest(), 1) def testCorrectOverloadSelection(self): - """ - Test correct overloading selection for common types. - """ + """Test correct overloading selection for common types.""" from System.Drawing import Font from System import (String, Double, Single, @@ -377,10 +368,9 @@ def testCorrectOverloadSelection(self): handler = GCHandle.Alloc(CSArray, GCHandleType.Pinned) def testGenericMethodOverloadSelection(self): - """ - Test explicit overload selection with generic methods. - """ + """Test explicit overload selection with generic methods.""" from Python.Test import GenericMethodTest, GenericStaticMethodTest + type = GenericStaticMethodTest[str] inst = GenericMethodTest[str]() @@ -462,6 +452,7 @@ def testMethodOverloadSelectionWithGenericTypes(self): """Check method overload selection using generic types.""" from Python.Test import ISayHello1, InterfaceTest, ShortEnum from Python.Test import MethodTest, GenericWrapper + inst = InterfaceTest() vtype = GenericWrapper[System.Boolean] @@ -596,6 +587,7 @@ def testOverloadSelectionWithArraysOfGenericTypes(self): """Check overload selection using arrays of generic types.""" from Python.Test import ISayHello1, InterfaceTest, ShortEnum from Python.Test import MethodTest, GenericWrapper + inst = InterfaceTest() gtype = GenericWrapper[System.Boolean] @@ -776,12 +768,12 @@ def testOverloadSelectionWithArraysOfGenericTypes(self): def testGenericOverloadSelectionMagicNameOnly(self): """Test using only __overloads__ to select on type & sig""" - # XXX NotImplemented + # TODO NotImplemented pass def testNestedGenericClass(self): """Check nested generic classes.""" - # XXX NotImplemented + # TODO NotImplemented pass diff --git a/src/tests/test_indexer.py b/src/tests/test_indexer.py index b241ef366..74c9b1876 100644 --- a/src/tests/test_indexer.py +++ b/src/tests/test_indexer.py @@ -3,6 +3,7 @@ import unittest import Python.Test as Test + from _compat import long, unichr diff --git a/src/tests/test_interface.py b/src/tests/test_interface.py index 13878efbf..6bc05fd5f 100644 --- a/src/tests/test_interface.py +++ b/src/tests/test_interface.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- -from Python.Test import InterfaceTest import unittest + import Python.Test as Test -import System + from _compat import DictProxyType @@ -12,14 +12,16 @@ class InterfaceTests(unittest.TestCase): def testInterfaceStandardAttrs(self): """Test standard class attributes.""" - from Python.Test import IPublicInterface as ip - self.assertTrue(ip.__name__ == 'IPublicInterface') - self.assertTrue(ip.__module__ == 'Python.Test') - self.assertTrue(type(ip.__dict__) == DictProxyType) + from Python.Test import IPublicInterface + + self.assertTrue(IPublicInterface.__name__ == 'IPublicInterface') + self.assertTrue(IPublicInterface.__module__ == 'Python.Test') + self.assertTrue(type(IPublicInterface.__dict__) == DictProxyType) def testGlobalInterfaceVisibility(self): """Test visibility of module-level interfaces.""" from Python.Test import IPublicInterface + self.assertTrue(IPublicInterface.__name__ == 'IPublicInterface') def test(): @@ -34,6 +36,8 @@ def test(): def testNestedInterfaceVisibility(self): """Test visibility of nested interfaces.""" + from Python.Test import InterfaceTest + ob = InterfaceTest.IPublic self.assertTrue(ob.__name__ == 'IPublic') @@ -52,6 +56,8 @@ def test(): def testExplicitCastToInterface(self): """Test explicit cast to an interface.""" + from Python.Test import InterfaceTest + ob = InterfaceTest() self.assertTrue(type(ob).__name__ == 'InterfaceTest') self.assertTrue(hasattr(ob, 'HelloProperty')) diff --git a/src/tests/test_method.py b/src/tests/test_method.py index 67cb9d4a1..88652cd71 100644 --- a/src/tests/test_method.py +++ b/src/tests/test_method.py @@ -2,8 +2,8 @@ import unittest -from Python.Test import MethodTest, MethodTestSub import System +from Python.Test import MethodTest from _compat import PY2, long, unichr @@ -128,6 +128,7 @@ def test(): def testUnboundManagedMethodCall(self): """Test calling unbound managed methods.""" + from Python.Test import MethodTestSub object = MethodTest() self.assertTrue(MethodTest.PublicMethod(object) == "public") @@ -148,6 +149,7 @@ def test(): def testOverloadedMethodInheritance(self): """Test that overloads are inherited properly.""" + from Python.Test import MethodTestSub object = MethodTest() self.assertTrue(object.PublicMethod() == "public") @@ -778,5 +780,6 @@ def testWeCanBindToEncodingGetString(self): data = ''.join(data) self.assertEqual(data, 'Some testing string') + def test_suite(): return unittest.makeSuite(MethodTests) diff --git a/src/tests/test_module.py b/src/tests/test_module.py index caa94b1d5..a2624fc4c 100644 --- a/src/tests/test_module.py +++ b/src/tests/test_module.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- import clr - -import unittest import types +import unittest import warnings from fnmatch import fnmatch -from _compat import ClassType, PY2, PY3 +from _compat import ClassType, PY2, PY3, range + # testImplicitAssemblyLoad() passes on deprecation warning; perfect! # # clr.AddReference('System.Windows.Forms') @@ -372,7 +372,7 @@ def test_AssemblyLoadThreadSafety(self): from System import DateTime from System import Guid from System.Collections.Generic import Dictionary - dict = Dictionary[Guid,DateTime]() + dict = Dictionary[Guid, DateTime]() ModuleTest.JoinThreads() diff --git a/src/tests/test_property.py b/src/tests/test_property.py index 1358f0fe5..e5d7112ef 100644 --- a/src/tests/test_property.py +++ b/src/tests/test_property.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- # import unittest + from Python.Test import PropertyTest diff --git a/src/tests/test_subclass.py b/src/tests/test_subclass.py index f99c4cdc6..20938ba88 100644 --- a/src/tests/test_subclass.py +++ b/src/tests/test_subclass.py @@ -1,10 +1,14 @@ # -*- coding: utf-8 -*- +# FIXME: This test module fails on Linux -import clr import unittest -from Python.Test import TestFunctions, SubClassTest, IInterfaceTest, TestEventArgs + +import System +from Python.Test import (IInterfaceTest, SubClassTest, TestEventArgs, + TestFunctions) from System.Collections.Generic import List -from System import NotImplementedException + +from _compat import range # class that implements the test interface @@ -137,7 +141,8 @@ def handler(self, x, args): self.assertEqual(event_handler.value, 1) i = InterfaceTestClass() - self.assertRaises(NotImplementedException, TestFunctions.test_event, i, 2) + with self.assertRaises(System.NotImplementedException): + TestFunctions.test_event(i, 2) d = DerivedEventTest() d.add_TestEvent(event_handler.handler) @@ -146,19 +151,16 @@ def handler(self, x, args): self.assertEqual(len(d.event_handlers), 1) def test_isinstance(self): - from System import Object - from System import String - a = [str(x) for x in range(0, 1000)] - b = [String(x) for x in a] + b = [System.String(x) for x in a] for x in a: - self.assertFalse(isinstance(x, Object)) - self.assertFalse(isinstance(x, String)) + self.assertFalse(isinstance(x, System.Object)) + self.assertFalse(isinstance(x, System.String)) for x in b: - self.assertTrue(isinstance(x, Object)) - self.assertTrue(isinstance(x, String)) + self.assertTrue(isinstance(x, System.Object)) + self.assertTrue(isinstance(x, System.String)) def test_suite(): diff --git a/src/tests/test_suite/__init__.py b/src/tests/test_suite/__init__.py index 16a3a4cf8..ecc1c858f 100644 --- a/src/tests/test_suite/__init__.py +++ b/src/tests/test_suite/__init__.py @@ -2,10 +2,8 @@ import unittest -__all__ = ['test_suite'] - -from .test_import import test_suite as import_tests from .test_callback import test_suite as callback_tests +from .test_import import test_suite as import_tests from .test_recursive_types import test_suite as recursive_types_tests diff --git a/src/tests/test_suite/test_callback.py b/src/tests/test_suite/test_callback.py index 96070012f..7a5e473be 100644 --- a/src/tests/test_suite/test_callback.py +++ b/src/tests/test_suite/test_callback.py @@ -1,15 +1,6 @@ # -*- coding: utf-8 -*- import unittest -import sys -import clr - -this_module = sys.modules[__name__] -clr.AddReference("Python.Test") -import Python.Test as Test -from Python.Test import CallbackTest - -test_instance = CallbackTest() def simpleDefaultArg(arg='test'): @@ -21,12 +12,18 @@ class CallbackTests(unittest.TestCase): def testDefaultForNull(self): """Test that C# can use null for an optional python argument""" + from Python.Test import CallbackTest + + test_instance = CallbackTest() retVal = test_instance.Call_simpleDefaultArg_WithNull(__name__) pythonRetVal = simpleDefaultArg(None) self.assertEquals(retVal, pythonRetVal) def testDefaultForNone(self): """Test that C# can use no argument for an optional python argument""" + from Python.Test import CallbackTest + + test_instance = CallbackTest() retVal = test_instance.Call_simpleDefaultArg_WithEmptyArgs(__name__) pythonRetVal = simpleDefaultArg() self.assertEquals(retVal, pythonRetVal) diff --git a/src/tests/test_suite/test_recursive_types.py b/src/tests/test_suite/test_recursive_types.py index 88656f943..32bcad26e 100644 --- a/src/tests/test_suite/test_recursive_types.py +++ b/src/tests/test_suite/test_recursive_types.py @@ -1,11 +1,6 @@ # -*- coding: utf-8 -*- import unittest -import sys -import clr - -this_module = sys.modules[__name__] -clr.AddReference("Python.Test") class RecursiveTypesTests(unittest.TestCase): @@ -14,12 +9,10 @@ class RecursiveTypesTests(unittest.TestCase): def testRecursiveTypeCreation(self): """Test that a recursive types don't crash with a StackOverflowException""" - - import Python.Test as Test from Python.Test import RecursiveInheritance + test_instance = RecursiveInheritance.SubClass() test_instance.SomeMethod() - pass def test_suite(): diff --git a/src/tests/test_thread.py b/src/tests/test_thread.py index 09104a91a..5f395d9aa 100644 --- a/src/tests/test_thread.py +++ b/src/tests/test_thread.py @@ -2,12 +2,11 @@ from __future__ import print_function -import unittest -from Python.Test import ThreadTest import threading import time +import unittest -from _compat import thread +from _compat import range, thread def dprint(msg): @@ -21,6 +20,8 @@ class ThreadTests(unittest.TestCase): def testSimpleCallbackToPython(self): """Test a call to managed code that then calls back into Python.""" + from Python.Test import ThreadTest + dprint("thread %s SimpleCallBack" % thread.get_ident()) result = ThreadTest.CallEchoString("spam") self.assertTrue(result == "spam") @@ -29,6 +30,8 @@ def testSimpleCallbackToPython(self): def testDoubleCallbackToPython(self): """Test a call to managed code that then calls back into Python that then calls managed code that then calls Python again.""" + from Python.Test import ThreadTest + dprint("thread %s DoubleCallBack" % thread.get_ident()) result = ThreadTest.CallEchoString2("spam") self.assertTrue(result == "spam") @@ -37,7 +40,7 @@ def testDoubleCallbackToPython(self): def testPythonThreadCallsToCLR(self): """Test calls by Python-spawned threads into managed code.""" # This test is very likely to hang if something is wrong ;) - from System import String + import System done = [] @@ -45,15 +48,15 @@ def run_thread(): for i in range(10): time.sleep(0.1) dprint("thread %s %d" % (thread.get_ident(), i)) - mstr = String("thread %s %d" % (thread.get_ident(), i)) + mstr = System.String("thread %s %d" % (thread.get_ident(), i)) dprint(mstr.ToString()) done.append(None) dprint("thread %s %d done" % (thread.get_ident(), i)) def start_threads(count): - for i in range(count): - thread = threading.Thread(target=run_thread) - thread.start() + for _ in range(count): + thread_ = threading.Thread(target=run_thread) + thread_.start() start_threads(5) From 429b51652243346e0330e93ce1e875908f91712d Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 21 Jan 2017 21:09:45 -0700 Subject: [PATCH 038/324] Fix nameclash object --- src/tests/test_array.py | 368 ++++++++++++------------- src/tests/test_conversion.py | 500 +++++++++++++++++----------------- src/tests/test_enum.py | 8 +- src/tests/test_event.py | 300 ++++++++++----------- src/tests/test_field.py | 232 ++++++++-------- src/tests/test_indexer.py | 510 +++++++++++++++++------------------ src/tests/test_method.py | 60 ++--- src/tests/test_property.py | 56 ++-- src/tests/test_subclass.py | 88 +++--- 9 files changed, 1061 insertions(+), 1061 deletions(-) diff --git a/src/tests/test_array.py b/src/tests/test_array.py index 0a4270636..134b95557 100644 --- a/src/tests/test_array.py +++ b/src/tests/test_array.py @@ -13,8 +13,8 @@ class ArrayTests(unittest.TestCase): def testPublicArray(self): """Test public arrays.""" - object = Test.PublicArrayTest() - items = object.items + ob = Test.PublicArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -35,8 +35,8 @@ def testPublicArray(self): def testProtectedArray(self): """Test protected arrays.""" - object = Test.ProtectedArrayTest() - items = object.items + ob = Test.ProtectedArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -59,8 +59,8 @@ def testInternalArray(self): """Test internal arrays.""" def test(): - object = Test.InternalArrayTest() - items = object.items + ob = Test.InternalArrayTest() + items = ob.items self.assertRaises(AttributeError, test) @@ -68,16 +68,16 @@ def testPrivateArray(self): """Test private arrays.""" def test(): - object = Test.PrivateArrayTest() - items = object.items + ob = Test.PrivateArrayTest() + items = ob.items self.assertRaises(AttributeError, test) def testArrayBoundsChecking(self): """Test array bounds checking.""" - object = Test.Int32ArrayTest() - items = object.items + ob = Test.Int32ArrayTest() + items = ob.items self.assertTrue(items[0] == 0) self.assertTrue(items[1] == 1) @@ -92,25 +92,25 @@ def testArrayBoundsChecking(self): self.assertTrue(items[-1] == 4) def test(): - object = Test.Int32ArrayTest() - object.items[5] + ob = Test.Int32ArrayTest() + ob.items[5] self.assertRaises(IndexError, test) def test(): - object = Test.Int32ArrayTest() - object.items[5] = 0 + ob = Test.Int32ArrayTest() + ob.items[5] = 0 self.assertRaises(IndexError, test) def test(): - object = Test.Int32ArrayTest() + ob = Test.Int32ArrayTest() items[-6] self.assertRaises(IndexError, test) def test(): - object = Test.Int32ArrayTest() + ob = Test.Int32ArrayTest() items[-6] = 0 self.assertRaises(IndexError, test) @@ -118,8 +118,8 @@ def test(): def testArrayContains(self): """Test array support for __contains__.""" - object = Test.Int32ArrayTest() - items = object.items + ob = Test.Int32ArrayTest() + items = ob.items self.assertTrue(0 in items) self.assertTrue(1 in items) @@ -134,8 +134,8 @@ def testArrayContains(self): def testBooleanArray(self): """Test boolean arrays.""" - object = Test.BooleanArrayTest() - items = object.items + ob = Test.BooleanArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -152,21 +152,21 @@ def testBooleanArray(self): self.assertTrue(items[0] == True) def test(): - object = Test.ByteArrayTest() - v = object.items["wrong"] + ob = Test.ByteArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.ByteArrayTest() - object[0] = "wrong" + ob = Test.ByteArrayTest() + ob[0] = "wrong" self.assertRaises(TypeError, test) def testByteArray(self): """Test byte arrays.""" - object = Test.ByteArrayTest() - items = object.items + ob = Test.ByteArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -189,33 +189,33 @@ def testByteArray(self): self.assertTrue(items[-1] == min) def test(): - object = Test.ByteArrayTest() - object.items[0] = max + 1 + ob = Test.ByteArrayTest() + ob.items[0] = max + 1 self.assertRaises(OverflowError, test) def test(): - object = Test.ByteArrayTest() - object.items[0] = min - 1 + ob = Test.ByteArrayTest() + ob.items[0] = min - 1 self.assertRaises(OverflowError, test) def test(): - object = Test.ByteArrayTest() - v = object.items["wrong"] + ob = Test.ByteArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.ByteArrayTest() - object[0] = "wrong" + ob = Test.ByteArrayTest() + ob[0] = "wrong" self.assertRaises(TypeError, test) def testSByteArray(self): """Test sbyte arrays.""" - object = Test.SByteArrayTest() - items = object.items + ob = Test.SByteArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -238,33 +238,33 @@ def testSByteArray(self): self.assertTrue(items[-1] == min) def test(): - object = Test.SByteArrayTest() - object.items[0] = max + 1 + ob = Test.SByteArrayTest() + ob.items[0] = max + 1 self.assertRaises(OverflowError, test) def test(): - object = Test.SByteArrayTest() - object.items[0] = min - 1 + ob = Test.SByteArrayTest() + ob.items[0] = min - 1 self.assertRaises(OverflowError, test) def test(): - object = Test.SByteArrayTest() - v = object.items["wrong"] + ob = Test.SByteArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.SByteArrayTest() - object[0] = "wrong" + ob = Test.SByteArrayTest() + ob[0] = "wrong" self.assertRaises(TypeError, test) def testCharArray(self): """Test char arrays.""" - object = Test.CharArrayTest() - items = object.items + ob = Test.CharArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -287,21 +287,21 @@ def testCharArray(self): self.assertTrue(items[-1] == min) def test(): - object = Test.CharArrayTest() - v = object.items["wrong"] + ob = Test.CharArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.CharArrayTest() - object[0] = "wrong" + ob = Test.CharArrayTest() + ob[0] = "wrong" self.assertRaises(TypeError, test) def testInt16Array(self): """Test Int16 arrays.""" - object = Test.Int16ArrayTest() - items = object.items + ob = Test.Int16ArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -324,33 +324,33 @@ def testInt16Array(self): self.assertTrue(items[-1] == min) def test(): - object = Test.Int16ArrayTest() - object.items[0] = max + 1 + ob = Test.Int16ArrayTest() + ob.items[0] = max + 1 self.assertRaises(OverflowError, test) def test(): - object = Test.Int16ArrayTest() - object.items[0] = min - 1 + ob = Test.Int16ArrayTest() + ob.items[0] = min - 1 self.assertRaises(OverflowError, test) def test(): - object = Test.Int16ArrayTest() - v = object.items["wrong"] + ob = Test.Int16ArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.Int16ArrayTest() - object[0] = "wrong" + ob = Test.Int16ArrayTest() + ob[0] = "wrong" self.assertRaises(TypeError, test) def testInt32Array(self): """Test Int32 arrays.""" - object = Test.Int32ArrayTest() - items = object.items + ob = Test.Int32ArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -373,33 +373,33 @@ def testInt32Array(self): self.assertTrue(items[-1] == min) def test(): - object = Test.Int32ArrayTest() - object.items[0] = max + 1 + ob = Test.Int32ArrayTest() + ob.items[0] = max + 1 self.assertRaises(OverflowError, test) def test(): - object = Test.Int32ArrayTest() - object.items[0] = min - 1 + ob = Test.Int32ArrayTest() + ob.items[0] = min - 1 self.assertRaises(OverflowError, test) def test(): - object = Test.Int32ArrayTest() - v = object.items["wrong"] + ob = Test.Int32ArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.Int32ArrayTest() - object[0] = "wrong" + ob = Test.Int32ArrayTest() + ob[0] = "wrong" self.assertRaises(TypeError, test) def testInt64Array(self): """Test Int64 arrays.""" - object = Test.Int64ArrayTest() - items = object.items + ob = Test.Int64ArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -422,33 +422,33 @@ def testInt64Array(self): self.assertTrue(items[-1] == min) def test(): - object = Test.Int64ArrayTest() - object.items[0] = max + 1 + ob = Test.Int64ArrayTest() + ob.items[0] = max + 1 self.assertRaises(OverflowError, test) def test(): - object = Test.Int64ArrayTest() - object.items[0] = min - 1 + ob = Test.Int64ArrayTest() + ob.items[0] = min - 1 self.assertRaises(OverflowError, test) def test(): - object = Test.Int64ArrayTest() - v = object.items["wrong"] + ob = Test.Int64ArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.Int64ArrayTest() - object[0] = "wrong" + ob = Test.Int64ArrayTest() + ob[0] = "wrong" self.assertRaises(TypeError, test) def testUInt16Array(self): """Test UInt16 arrays.""" - object = Test.UInt16ArrayTest() - items = object.items + ob = Test.UInt16ArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -471,33 +471,33 @@ def testUInt16Array(self): self.assertTrue(items[-1] == min) def test(): - object = Test.UInt16ArrayTest() - object.items[0] = max + 1 + ob = Test.UInt16ArrayTest() + ob.items[0] = max + 1 self.assertRaises(OverflowError, test) def test(): - object = Test.UInt16ArrayTest() - object.items[0] = min - 1 + ob = Test.UInt16ArrayTest() + ob.items[0] = min - 1 self.assertRaises(OverflowError, test) def test(): - object = Test.UInt16ArrayTest() - v = object.items["wrong"] + ob = Test.UInt16ArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.UInt16ArrayTest() - object[0] = "wrong" + ob = Test.UInt16ArrayTest() + ob[0] = "wrong" self.assertRaises(TypeError, test) def testUInt32Array(self): """Test UInt32 arrays.""" - object = Test.UInt32ArrayTest() - items = object.items + ob = Test.UInt32ArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -520,33 +520,33 @@ def testUInt32Array(self): self.assertTrue(items[-1] == min) def test(): - object = Test.UInt32ArrayTest() - object.items[0] = max + 1 + ob = Test.UInt32ArrayTest() + ob.items[0] = max + 1 self.assertRaises(OverflowError, test) def test(): - object = Test.UInt32ArrayTest() - object.items[0] = min - 1 + ob = Test.UInt32ArrayTest() + ob.items[0] = min - 1 self.assertRaises(OverflowError, test) def test(): - object = Test.UInt32ArrayTest() - v = object.items["wrong"] + ob = Test.UInt32ArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.UInt32ArrayTest() - object[0] = "wrong" + ob = Test.UInt32ArrayTest() + ob[0] = "wrong" self.assertRaises(TypeError, test) def testUInt64Array(self): """Test UInt64 arrays.""" - object = Test.UInt64ArrayTest() - items = object.items + ob = Test.UInt64ArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -569,33 +569,33 @@ def testUInt64Array(self): self.assertTrue(items[-1] == min) def test(): - object = Test.UInt64ArrayTest() - object.items[0] = max + 1 + ob = Test.UInt64ArrayTest() + ob.items[0] = max + 1 self.assertRaises(OverflowError, test) def test(): - object = Test.UInt64ArrayTest() - object.items[0] = min - 1 + ob = Test.UInt64ArrayTest() + ob.items[0] = min - 1 self.assertRaises(OverflowError, test) def test(): - object = Test.UInt64ArrayTest() - v = object.items["wrong"] + ob = Test.UInt64ArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.UInt64ArrayTest() - object[0] = "wrong" + ob = Test.UInt64ArrayTest() + ob[0] = "wrong" self.assertRaises(TypeError, test) def testSingleArray(self): """Test Single arrays.""" - object = Test.SingleArrayTest() - items = object.items + ob = Test.SingleArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -618,21 +618,21 @@ def testSingleArray(self): self.assertTrue(items[-1] == min) def test(): - object = Test.SingleArrayTest() - v = object.items["wrong"] + ob = Test.SingleArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.SingleArrayTest() - object[0] = "wrong" + ob = Test.SingleArrayTest() + ob[0] = "wrong" self.assertRaises(TypeError, test) def testDoubleArray(self): """Test Double arrays.""" - object = Test.DoubleArrayTest() - items = object.items + ob = Test.DoubleArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -655,21 +655,21 @@ def testDoubleArray(self): self.assertTrue(items[-1] == min) def test(): - object = Test.DoubleArrayTest() - v = object.items["wrong"] + ob = Test.DoubleArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.DoubleArrayTest() - object[0] = "wrong" + ob = Test.DoubleArrayTest() + ob[0] = "wrong" self.assertRaises(TypeError, test) def testDecimalArray(self): """Test Decimal arrays.""" - object = Test.DecimalArrayTest() - items = object.items + ob = Test.DecimalArrayTest() + items = ob.items from System import Decimal max_d = Decimal.Parse("79228162514264337593543950335") @@ -693,21 +693,21 @@ def testDecimalArray(self): self.assertTrue(items[-1] == min_d) def test(): - object = Test.DecimalArrayTest() - v = object.items["wrong"] + ob = Test.DecimalArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.DecimalArrayTest() - object[0] = "wrong" + ob = Test.DecimalArrayTest() + ob[0] = "wrong" self.assertRaises(TypeError, test) def testStringArray(self): """Test String arrays.""" - object = Test.StringArrayTest() - items = object.items + ob = Test.StringArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -727,22 +727,22 @@ def testStringArray(self): self.assertTrue(items[-1] == "eggs") def test(): - object = Test.StringArrayTest() - v = object.items["wrong"] + ob = Test.StringArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.Int64ArrayTest() - object[0] = 0 + ob = Test.Int64ArrayTest() + ob[0] = 0 self.assertRaises(TypeError, test) def testEnumArray(self): """Test enum arrays.""" from Python.Test import ShortEnum - object = Test.EnumArrayTest() - items = object.items + ob = Test.EnumArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -762,28 +762,28 @@ def testEnumArray(self): self.assertTrue(items[-1] == ShortEnum.Zero) def test(): - object = Test.EnumArrayTest() - object.items[0] = 99 + ob = Test.EnumArrayTest() + ob.items[0] = 99 self.assertRaises(ValueError, test) def test(): - object = Test.EnumArrayTest() - v = object.items["wrong"] + ob = Test.EnumArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.EnumArrayTest() - object[0] = "wrong" + ob = Test.EnumArrayTest() + ob[0] = "wrong" self.assertRaises(TypeError, test) def testObjectArray(self): - """Test object arrays.""" + """Test ob arrays.""" from Python.Test import Spam - object = Test.ObjectArrayTest() - items = object.items + ob = Test.ObjectArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -809,21 +809,21 @@ def testObjectArray(self): self.assertTrue(items[0] == None) def test(): - object = Test.ObjectArrayTest() - v = object.items["wrong"] + ob = Test.ObjectArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.ObjectArrayTest() - object.items["wrong"] = "wrong" + ob = Test.ObjectArrayTest() + ob.items["wrong"] = "wrong" self.assertRaises(TypeError, test) def testNullArray(self): """Test null arrays.""" - object = Test.NullArrayTest() - items = object.items + ob = Test.NullArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -842,20 +842,20 @@ def testNullArray(self): items[-1] = None self.assertTrue(items[-1] == None) - empty = object.empty + empty = ob.empty self.assertTrue(len(empty) == 0) def test(): - object = Test.NullArrayTest() - v = object.items["wrong"] + ob = Test.NullArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def testInterfaceArray(self): """Test interface arrays.""" from Python.Test import Spam - object = Test.InterfaceArrayTest() - items = object.items + ob = Test.InterfaceArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -878,28 +878,28 @@ def testInterfaceArray(self): self.assertTrue(items[0] == None) def test(): - object = Test.InterfaceArrayTest() - object.items[0] = 99 + ob = Test.InterfaceArrayTest() + ob.items[0] = 99 self.assertRaises(TypeError, test) def test(): - object = Test.InterfaceArrayTest() - v = object.items["wrong"] + ob = Test.InterfaceArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.InterfaceArrayTest() - object.items["wrong"] = "wrong" + ob = Test.InterfaceArrayTest() + ob.items["wrong"] = "wrong" self.assertRaises(TypeError, test) def testTypedArray(self): """Test typed arrays.""" from Python.Test import Spam - object = Test.TypedArrayTest() - items = object.items + ob = Test.TypedArrayTest() + items = ob.items self.assertTrue(len(items) == 5) @@ -922,27 +922,27 @@ def testTypedArray(self): self.assertTrue(items[0] == None) def test(): - object = Test.TypedArrayTest() - object.items[0] = 99 + ob = Test.TypedArrayTest() + ob.items[0] = 99 self.assertRaises(TypeError, test) def test(): - object = Test.TypedArrayTest() - v = object.items["wrong"] + ob = Test.TypedArrayTest() + v = ob.items["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.TypedArrayTest() - object.items["wrong"] = "wrong" + ob = Test.TypedArrayTest() + ob.items["wrong"] = "wrong" self.assertRaises(TypeError, test) def testMultiDimensionalArray(self): """Test multi-dimensional arrays.""" - object = Test.MultiDimensionalArrayTest() - items = object.items + ob = Test.MultiDimensionalArrayTest() + items = ob.items self.assertTrue(len(items) == 25) @@ -988,26 +988,26 @@ def testMultiDimensionalArray(self): self.assertTrue(items[-1, -1] == min) def test(): - object = Test.MultiDimensionalArrayTest() - object.items[0, 0] = max + 1 + ob = Test.MultiDimensionalArrayTest() + ob.items[0, 0] = max + 1 self.assertRaises(OverflowError, test) def test(): - object = Test.MultiDimensionalArrayTest() - object.items[0, 0] = min - 1 + ob = Test.MultiDimensionalArrayTest() + ob.items[0, 0] = min - 1 self.assertRaises(OverflowError, test) def test(): - object = Test.MultiDimensionalArrayTest() - v = object.items["wrong", 0] + ob = Test.MultiDimensionalArrayTest() + v = ob.items["wrong", 0] self.assertRaises(TypeError, test) def test(): - object = Test.MultiDimensionalArrayTest() - object[0, 0] = "wrong" + ob = Test.MultiDimensionalArrayTest() + ob[0, 0] = "wrong" self.assertRaises(TypeError, test) @@ -1093,7 +1093,7 @@ def testListNestedArrayConversion(self): self.assertTrue(result[0][0].__class__ == Spam) def testSequenceArrayConversion(self): - """Test conversion of sequence-like objects to array arguments.""" + """Test conversion of sequence-like obs to array arguments.""" from Python.Test import ArrayConversionTest from Python.Test import Spam @@ -1419,7 +1419,7 @@ def testSpecialArrayCreation(self): def testArrayAbuse(self): """Test array abuse.""" _class = Test.PublicArrayTest - object = Test.PublicArrayTest() + ob = Test.PublicArrayTest() def test(): del _class.__getitem__ @@ -1427,7 +1427,7 @@ def test(): self.assertRaises(AttributeError, test) def test(): - del object.__getitem__ + del ob.__getitem__ self.assertRaises(AttributeError, test) @@ -1437,7 +1437,7 @@ def test(): self.assertRaises(AttributeError, test) def test(): - del object.__setitem__ + del ob.__setitem__ self.assertRaises(AttributeError, test) diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index 7af3ee65e..f03ed96f9 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -13,75 +13,75 @@ class ConversionTests(unittest.TestCase): def testBoolConversion(self): """Test bool conversion.""" - object = ConversionTest() - self.assertTrue(object.BooleanField == False) - self.assertTrue(object.BooleanField is False) - self.assertTrue(object.BooleanField == 0) - - object.BooleanField = True - self.assertTrue(object.BooleanField == True) - self.assertTrue(object.BooleanField is True) - self.assertTrue(object.BooleanField == 1) - - object.BooleanField = False - self.assertTrue(object.BooleanField == False) - self.assertTrue(object.BooleanField is False) - self.assertTrue(object.BooleanField == 0) - - object.BooleanField = 1 - self.assertTrue(object.BooleanField == True) - self.assertTrue(object.BooleanField is True) - self.assertTrue(object.BooleanField == 1) - - object.BooleanField = 0 - self.assertTrue(object.BooleanField == False) - self.assertTrue(object.BooleanField is False) - self.assertTrue(object.BooleanField == 0) - - object.BooleanField = System.Boolean(None) - self.assertTrue(object.BooleanField == False) - self.assertTrue(object.BooleanField is False) - self.assertTrue(object.BooleanField == 0) - - object.BooleanField = System.Boolean('') - self.assertTrue(object.BooleanField == False) - self.assertTrue(object.BooleanField is False) - self.assertTrue(object.BooleanField == 0) - - object.BooleanField = System.Boolean(0) - self.assertTrue(object.BooleanField == False) - self.assertTrue(object.BooleanField is False) - self.assertTrue(object.BooleanField == 0) - - object.BooleanField = System.Boolean(1) - self.assertTrue(object.BooleanField == True) - self.assertTrue(object.BooleanField is True) - self.assertTrue(object.BooleanField == 1) - - object.BooleanField = System.Boolean('a') - self.assertTrue(object.BooleanField == True) - self.assertTrue(object.BooleanField is True) - self.assertTrue(object.BooleanField == 1) + ob = ConversionTest() + self.assertTrue(ob.BooleanField == False) + self.assertTrue(ob.BooleanField is False) + self.assertTrue(ob.BooleanField == 0) + + ob.BooleanField = True + self.assertTrue(ob.BooleanField == True) + self.assertTrue(ob.BooleanField is True) + self.assertTrue(ob.BooleanField == 1) + + ob.BooleanField = False + self.assertTrue(ob.BooleanField == False) + self.assertTrue(ob.BooleanField is False) + self.assertTrue(ob.BooleanField == 0) + + ob.BooleanField = 1 + self.assertTrue(ob.BooleanField == True) + self.assertTrue(ob.BooleanField is True) + self.assertTrue(ob.BooleanField == 1) + + ob.BooleanField = 0 + self.assertTrue(ob.BooleanField == False) + self.assertTrue(ob.BooleanField is False) + self.assertTrue(ob.BooleanField == 0) + + ob.BooleanField = System.Boolean(None) + self.assertTrue(ob.BooleanField == False) + self.assertTrue(ob.BooleanField is False) + self.assertTrue(ob.BooleanField == 0) + + ob.BooleanField = System.Boolean('') + self.assertTrue(ob.BooleanField == False) + self.assertTrue(ob.BooleanField is False) + self.assertTrue(ob.BooleanField == 0) + + ob.BooleanField = System.Boolean(0) + self.assertTrue(ob.BooleanField == False) + self.assertTrue(ob.BooleanField is False) + self.assertTrue(ob.BooleanField == 0) + + ob.BooleanField = System.Boolean(1) + self.assertTrue(ob.BooleanField == True) + self.assertTrue(ob.BooleanField is True) + self.assertTrue(ob.BooleanField == 1) + + ob.BooleanField = System.Boolean('a') + self.assertTrue(ob.BooleanField == True) + self.assertTrue(ob.BooleanField is True) + self.assertTrue(ob.BooleanField == 1) def testSByteConversion(self): """Test sbyte conversion.""" self.assertTrue(System.SByte.MaxValue == 127) self.assertTrue(System.SByte.MinValue == -128) - object = ConversionTest() - self.assertTrue(object.SByteField == 0) + ob = ConversionTest() + self.assertTrue(ob.SByteField == 0) - object.SByteField = 127 - self.assertTrue(object.SByteField == 127) + ob.SByteField = 127 + self.assertTrue(ob.SByteField == 127) - object.SByteField = -128 - self.assertTrue(object.SByteField == -128) + ob.SByteField = -128 + self.assertTrue(ob.SByteField == -128) - object.SByteField = System.SByte(127) - self.assertTrue(object.SByteField == 127) + ob.SByteField = System.SByte(127) + self.assertTrue(ob.SByteField == 127) - object.SByteField = System.SByte(-128) - self.assertTrue(object.SByteField == -128) + ob.SByteField = System.SByte(-128) + self.assertTrue(ob.SByteField == -128) def test(): ConversionTest().SByteField = "spam" @@ -118,20 +118,20 @@ def testByteConversion(self): self.assertTrue(System.Byte.MaxValue == 255) self.assertTrue(System.Byte.MinValue == 0) - object = ConversionTest() - self.assertTrue(object.ByteField == 0) + ob = ConversionTest() + self.assertTrue(ob.ByteField == 0) - object.ByteField = 255 - self.assertTrue(object.ByteField == 255) + ob.ByteField = 255 + self.assertTrue(ob.ByteField == 255) - object.ByteField = 0 - self.assertTrue(object.ByteField == 0) + ob.ByteField = 0 + self.assertTrue(ob.ByteField == 0) - object.ByteField = System.Byte(255) - self.assertTrue(object.ByteField == 255) + ob.ByteField = System.Byte(255) + self.assertTrue(ob.ByteField == 255) - object.ByteField = System.Byte(0) - self.assertTrue(object.ByteField == 0) + ob.ByteField = System.Byte(0) + self.assertTrue(ob.ByteField == 0) def test(): ConversionTest().ByteField = "spam" @@ -168,17 +168,17 @@ def testCharConversion(self): self.assertTrue(System.Char.MaxValue == unichr(65535)) self.assertTrue(System.Char.MinValue == unichr(0)) - object = ConversionTest() - self.assertTrue(object.CharField == u'A') + ob = ConversionTest() + self.assertTrue(ob.CharField == u'A') - object.CharField = 'B' - self.assertTrue(object.CharField == u'B') + ob.CharField = 'B' + self.assertTrue(ob.CharField == u'B') - object.CharField = u'B' - self.assertTrue(object.CharField == u'B') + ob.CharField = u'B' + self.assertTrue(ob.CharField == u'B') - object.CharField = 67 - self.assertTrue(object.CharField == u'C') + ob.CharField = 67 + self.assertTrue(ob.CharField == u'C') def test(): ConversionTest().CharField = 65536 @@ -200,20 +200,20 @@ def testInt16Conversion(self): self.assertTrue(System.Int16.MaxValue == 32767) self.assertTrue(System.Int16.MinValue == -32768) - object = ConversionTest() - self.assertTrue(object.Int16Field == 0) + ob = ConversionTest() + self.assertTrue(ob.Int16Field == 0) - object.Int16Field = 32767 - self.assertTrue(object.Int16Field == 32767) + ob.Int16Field = 32767 + self.assertTrue(ob.Int16Field == 32767) - object.Int16Field = -32768 - self.assertTrue(object.Int16Field == -32768) + ob.Int16Field = -32768 + self.assertTrue(ob.Int16Field == -32768) - object.Int16Field = System.Int16(32767) - self.assertTrue(object.Int16Field == 32767) + ob.Int16Field = System.Int16(32767) + self.assertTrue(ob.Int16Field == 32767) - object.Int16Field = System.Int16(-32768) - self.assertTrue(object.Int16Field == -32768) + ob.Int16Field = System.Int16(-32768) + self.assertTrue(ob.Int16Field == -32768) def test(): ConversionTest().Int16Field = "spam" @@ -250,20 +250,20 @@ def testInt32Conversion(self): self.assertTrue(System.Int32.MaxValue == 2147483647) self.assertTrue(System.Int32.MinValue == -2147483648) - object = ConversionTest() - self.assertTrue(object.Int32Field == 0) + ob = ConversionTest() + self.assertTrue(ob.Int32Field == 0) - object.Int32Field = 2147483647 - self.assertTrue(object.Int32Field == 2147483647) + ob.Int32Field = 2147483647 + self.assertTrue(ob.Int32Field == 2147483647) - object.Int32Field = -2147483648 - self.assertTrue(object.Int32Field == -2147483648) + ob.Int32Field = -2147483648 + self.assertTrue(ob.Int32Field == -2147483648) - object.Int32Field = System.Int32(2147483647) - self.assertTrue(object.Int32Field == 2147483647) + ob.Int32Field = System.Int32(2147483647) + self.assertTrue(ob.Int32Field == 2147483647) - object.Int32Field = System.Int32(-2147483648) - self.assertTrue(object.Int32Field == -2147483648) + ob.Int32Field = System.Int32(-2147483648) + self.assertTrue(ob.Int32Field == -2147483648) def test(): ConversionTest().Int32Field = "spam" @@ -300,20 +300,20 @@ def testInt64Conversion(self): self.assertTrue(System.Int64.MaxValue == long(9223372036854775807)) self.assertTrue(System.Int64.MinValue == long(-9223372036854775808)) - object = ConversionTest() - self.assertTrue(object.Int64Field == 0) + ob = ConversionTest() + self.assertTrue(ob.Int64Field == 0) - object.Int64Field = long(9223372036854775807) - self.assertTrue(object.Int64Field == long(9223372036854775807)) + ob.Int64Field = long(9223372036854775807) + self.assertTrue(ob.Int64Field == long(9223372036854775807)) - object.Int64Field = long(-9223372036854775808) - self.assertTrue(object.Int64Field == long(-9223372036854775808)) + ob.Int64Field = long(-9223372036854775808) + self.assertTrue(ob.Int64Field == long(-9223372036854775808)) - object.Int64Field = System.Int64(long(9223372036854775807)) - self.assertTrue(object.Int64Field == long(9223372036854775807)) + ob.Int64Field = System.Int64(long(9223372036854775807)) + self.assertTrue(ob.Int64Field == long(9223372036854775807)) - object.Int64Field = System.Int64(long(-9223372036854775808)) - self.assertTrue(object.Int64Field == long(-9223372036854775808)) + ob.Int64Field = System.Int64(long(-9223372036854775808)) + self.assertTrue(ob.Int64Field == long(-9223372036854775808)) def test(): ConversionTest().Int64Field = "spam" @@ -350,20 +350,20 @@ def testUInt16Conversion(self): self.assertTrue(System.UInt16.MaxValue == 65535) self.assertTrue(System.UInt16.MinValue == 0) - object = ConversionTest() - self.assertTrue(object.UInt16Field == 0) + ob = ConversionTest() + self.assertTrue(ob.UInt16Field == 0) - object.UInt16Field = 65535 - self.assertTrue(object.UInt16Field == 65535) + ob.UInt16Field = 65535 + self.assertTrue(ob.UInt16Field == 65535) - object.UInt16Field = -0 - self.assertTrue(object.UInt16Field == 0) + ob.UInt16Field = -0 + self.assertTrue(ob.UInt16Field == 0) - object.UInt16Field = System.UInt16(65535) - self.assertTrue(object.UInt16Field == 65535) + ob.UInt16Field = System.UInt16(65535) + self.assertTrue(ob.UInt16Field == 65535) - object.UInt16Field = System.UInt16(0) - self.assertTrue(object.UInt16Field == 0) + ob.UInt16Field = System.UInt16(0) + self.assertTrue(ob.UInt16Field == 0) def test(): ConversionTest().UInt16Field = "spam" @@ -400,20 +400,20 @@ def testUInt32Conversion(self): self.assertTrue(System.UInt32.MaxValue == long(4294967295)) self.assertTrue(System.UInt32.MinValue == 0) - object = ConversionTest() - self.assertTrue(object.UInt32Field == 0) + ob = ConversionTest() + self.assertTrue(ob.UInt32Field == 0) - object.UInt32Field = long(4294967295) - self.assertTrue(object.UInt32Field == long(4294967295)) + ob.UInt32Field = long(4294967295) + self.assertTrue(ob.UInt32Field == long(4294967295)) - object.UInt32Field = -0 - self.assertTrue(object.UInt32Field == 0) + ob.UInt32Field = -0 + self.assertTrue(ob.UInt32Field == 0) - object.UInt32Field = System.UInt32(long(4294967295)) - self.assertTrue(object.UInt32Field == long(4294967295)) + ob.UInt32Field = System.UInt32(long(4294967295)) + self.assertTrue(ob.UInt32Field == long(4294967295)) - object.UInt32Field = System.UInt32(0) - self.assertTrue(object.UInt32Field == 0) + ob.UInt32Field = System.UInt32(0) + self.assertTrue(ob.UInt32Field == 0) def test(): ConversionTest().UInt32Field = "spam" @@ -450,20 +450,20 @@ def testUInt64Conversion(self): self.assertTrue(System.UInt64.MaxValue == long(18446744073709551615)) self.assertTrue(System.UInt64.MinValue == 0) - object = ConversionTest() - self.assertTrue(object.UInt64Field == 0) + ob = ConversionTest() + self.assertTrue(ob.UInt64Field == 0) - object.UInt64Field = long(18446744073709551615) - self.assertTrue(object.UInt64Field == long(18446744073709551615)) + ob.UInt64Field = long(18446744073709551615) + self.assertTrue(ob.UInt64Field == long(18446744073709551615)) - object.UInt64Field = -0 - self.assertTrue(object.UInt64Field == 0) + ob.UInt64Field = -0 + self.assertTrue(ob.UInt64Field == 0) - object.UInt64Field = System.UInt64(long(18446744073709551615)) - self.assertTrue(object.UInt64Field == long(18446744073709551615)) + ob.UInt64Field = System.UInt64(long(18446744073709551615)) + self.assertTrue(ob.UInt64Field == long(18446744073709551615)) - object.UInt64Field = System.UInt64(0) - self.assertTrue(object.UInt64Field == 0) + ob.UInt64Field = System.UInt64(0) + self.assertTrue(ob.UInt64Field == 0) def test(): ConversionTest().UInt64Field = "spam" @@ -500,20 +500,20 @@ def testSingleConversion(self): self.assertTrue(System.Single.MaxValue == 3.402823e38) self.assertTrue(System.Single.MinValue == -3.402823e38) - object = ConversionTest() - self.assertTrue(object.SingleField == 0.0) + ob = ConversionTest() + self.assertTrue(ob.SingleField == 0.0) - object.SingleField = 3.402823e38 - self.assertTrue(object.SingleField == 3.402823e38) + ob.SingleField = 3.402823e38 + self.assertTrue(ob.SingleField == 3.402823e38) - object.SingleField = -3.402823e38 - self.assertTrue(object.SingleField == -3.402823e38) + ob.SingleField = -3.402823e38 + self.assertTrue(ob.SingleField == -3.402823e38) - object.SingleField = System.Single(3.402823e38) - self.assertTrue(object.SingleField == 3.402823e38) + ob.SingleField = System.Single(3.402823e38) + self.assertTrue(ob.SingleField == 3.402823e38) - object.SingleField = System.Single(-3.402823e38) - self.assertTrue(object.SingleField == -3.402823e38) + ob.SingleField = System.Single(-3.402823e38) + self.assertTrue(ob.SingleField == -3.402823e38) def test(): ConversionTest().SingleField = "spam" @@ -550,20 +550,20 @@ def testDoubleConversion(self): self.assertTrue(System.Double.MaxValue == 1.7976931348623157e308) self.assertTrue(System.Double.MinValue == -1.7976931348623157e308) - object = ConversionTest() - self.assertTrue(object.DoubleField == 0.0) + ob = ConversionTest() + self.assertTrue(ob.DoubleField == 0.0) - object.DoubleField = 1.7976931348623157e308 - self.assertTrue(object.DoubleField == 1.7976931348623157e308) + ob.DoubleField = 1.7976931348623157e308 + self.assertTrue(ob.DoubleField == 1.7976931348623157e308) - object.DoubleField = -1.7976931348623157e308 - self.assertTrue(object.DoubleField == -1.7976931348623157e308) + ob.DoubleField = -1.7976931348623157e308 + self.assertTrue(ob.DoubleField == -1.7976931348623157e308) - object.DoubleField = System.Double(1.7976931348623157e308) - self.assertTrue(object.DoubleField == 1.7976931348623157e308) + ob.DoubleField = System.Double(1.7976931348623157e308) + self.assertTrue(ob.DoubleField == 1.7976931348623157e308) - object.DoubleField = System.Double(-1.7976931348623157e308) - self.assertTrue(object.DoubleField == -1.7976931348623157e308) + ob.DoubleField = System.Double(-1.7976931348623157e308) + self.assertTrue(ob.DoubleField == -1.7976931348623157e308) def test(): ConversionTest().DoubleField = "spam" @@ -604,23 +604,23 @@ def testDecimalConversion(self): self.assertTrue(Decimal.ToInt64(Decimal(10)) == long(10)) - object = ConversionTest() - self.assertTrue(object.DecimalField == Decimal(0)) + ob = ConversionTest() + self.assertTrue(ob.DecimalField == Decimal(0)) - object.DecimalField = Decimal(10) - self.assertTrue(object.DecimalField == Decimal(10)) + ob.DecimalField = Decimal(10) + self.assertTrue(ob.DecimalField == Decimal(10)) - object.DecimalField = Decimal.One - self.assertTrue(object.DecimalField == Decimal.One) + ob.DecimalField = Decimal.One + self.assertTrue(ob.DecimalField == Decimal.One) - object.DecimalField = Decimal.Zero - self.assertTrue(object.DecimalField == Decimal.Zero) + ob.DecimalField = Decimal.Zero + self.assertTrue(ob.DecimalField == Decimal.Zero) - object.DecimalField = max_d - self.assertTrue(object.DecimalField == max_d) + ob.DecimalField = max_d + self.assertTrue(ob.DecimalField == max_d) - object.DecimalField = min_d - self.assertTrue(object.DecimalField == min_d) + ob.DecimalField = min_d + self.assertTrue(ob.DecimalField == min_d) def test(): ConversionTest().DecimalField = None @@ -639,31 +639,31 @@ def test(): def testStringConversion(self): """Test string / unicode conversion.""" - object = ConversionTest() + ob = ConversionTest() - self.assertTrue(object.StringField == "spam") - self.assertTrue(object.StringField == u"spam") + self.assertTrue(ob.StringField == "spam") + self.assertTrue(ob.StringField == u"spam") - object.StringField = "eggs" - self.assertTrue(object.StringField == "eggs") - self.assertTrue(object.StringField == u"eggs") + ob.StringField = "eggs" + self.assertTrue(ob.StringField == "eggs") + self.assertTrue(ob.StringField == u"eggs") - object.StringField = u"spam" - self.assertTrue(object.StringField == "spam") - self.assertTrue(object.StringField == u"spam") + ob.StringField = u"spam" + self.assertTrue(ob.StringField == "spam") + self.assertTrue(ob.StringField == u"spam") - object.StringField = u'\uffff\uffff' - self.assertTrue(object.StringField == u'\uffff\uffff') + ob.StringField = u'\uffff\uffff' + self.assertTrue(ob.StringField == u'\uffff\uffff') - object.StringField = System.String("spam") - self.assertTrue(object.StringField == "spam") - self.assertTrue(object.StringField == u"spam") + ob.StringField = System.String("spam") + self.assertTrue(ob.StringField == "spam") + self.assertTrue(ob.StringField == u"spam") - object.StringField = System.String(u'\uffff\uffff') - self.assertTrue(object.StringField == u'\uffff\uffff') + ob.StringField = System.String(u'\uffff\uffff') + self.assertTrue(ob.StringField == u'\uffff\uffff') - object.StringField = None - self.assertTrue(object.StringField == None) + ob.StringField = None + self.assertTrue(ob.StringField == None) def test(): ConversionTest().StringField = 1 @@ -674,57 +674,57 @@ def testInterfaceConversion(self): """Test interface conversion.""" from Python.Test import Spam, ISpam - object = ConversionTest() + ob = ConversionTest() - self.assertTrue(ISpam(object.SpamField).GetValue() == "spam") - self.assertTrue(object.SpamField.GetValue() == "spam") + self.assertTrue(ISpam(ob.SpamField).GetValue() == "spam") + self.assertTrue(ob.SpamField.GetValue() == "spam") - object.SpamField = Spam("eggs") - self.assertTrue(ISpam(object.SpamField).GetValue() == "eggs") - self.assertTrue(object.SpamField.GetValue() == "eggs") + ob.SpamField = Spam("eggs") + self.assertTrue(ISpam(ob.SpamField).GetValue() == "eggs") + self.assertTrue(ob.SpamField.GetValue() == "eggs") # need to test spam subclass here. - object.SpamField = None - self.assertTrue(object.SpamField == None) + ob.SpamField = None + self.assertTrue(ob.SpamField == None) def test(): - object = ConversionTest() - object.SpamField = System.String("bad") + ob = ConversionTest() + ob.SpamField = System.String("bad") self.assertRaises(TypeError, test) def test(): - object = ConversionTest() - object.SpamField = System.Int32(1) + ob = ConversionTest() + ob.SpamField = System.Int32(1) self.assertRaises(TypeError, test) def testObjectConversion(self): - """Test object conversion.""" + """Test ob conversion.""" from Python.Test import Spam - object = ConversionTest() - self.assertTrue(object.ObjectField == None) + ob = ConversionTest() + self.assertTrue(ob.ObjectField == None) - object.ObjectField = Spam("eggs") - self.assertTrue(object.ObjectField.__class__.__name__ == "Spam") - self.assertTrue(object.ObjectField.GetValue() == "eggs") + ob.ObjectField = Spam("eggs") + self.assertTrue(ob.ObjectField.__class__.__name__ == "Spam") + self.assertTrue(ob.ObjectField.GetValue() == "eggs") - object.ObjectField = None - self.assertTrue(object.ObjectField == None) + ob.ObjectField = None + self.assertTrue(ob.ObjectField == None) - object.ObjectField = System.String("spam") - self.assertTrue(object.ObjectField == "spam") + ob.ObjectField = System.String("spam") + self.assertTrue(ob.ObjectField == "spam") - object.ObjectField = System.Int32(1) - self.assertTrue(object.ObjectField == 1) + ob.ObjectField = System.Int32(1) + self.assertTrue(ob.ObjectField == 1) # need to test subclass here def test(): - object = ConversionTest() - object.ObjectField = self + ob = ConversionTest() + ob.ObjectField = self self.assertRaises(TypeError, test) @@ -732,56 +732,56 @@ def testEnumConversion(self): """Test enum conversion.""" from Python.Test import ShortEnum - object = ConversionTest() - self.assertTrue(object.EnumField == ShortEnum.Zero) + ob = ConversionTest() + self.assertTrue(ob.EnumField == ShortEnum.Zero) - object.EnumField = ShortEnum.One - self.assertTrue(object.EnumField == ShortEnum.One) + ob.EnumField = ShortEnum.One + self.assertTrue(ob.EnumField == ShortEnum.One) - object.EnumField = 0 - self.assertTrue(object.EnumField == ShortEnum.Zero) - self.assertTrue(object.EnumField == 0) + ob.EnumField = 0 + self.assertTrue(ob.EnumField == ShortEnum.Zero) + self.assertTrue(ob.EnumField == 0) - object.EnumField = 1 - self.assertTrue(object.EnumField == ShortEnum.One) - self.assertTrue(object.EnumField == 1) + ob.EnumField = 1 + self.assertTrue(ob.EnumField == ShortEnum.One) + self.assertTrue(ob.EnumField == 1) def test(): - object = ConversionTest() - object.EnumField = 10 + ob = ConversionTest() + ob.EnumField = 10 self.assertRaises(ValueError, test) def test(): - object = ConversionTest() - object.EnumField = 255 + ob = ConversionTest() + ob.EnumField = 255 self.assertRaises(ValueError, test) def test(): - object = ConversionTest() - object.EnumField = 1000000 + ob = ConversionTest() + ob.EnumField = 1000000 self.assertRaises(OverflowError, test) def test(): - object = ConversionTest() - object.EnumField = "spam" + ob = ConversionTest() + ob.EnumField = "spam" self.assertRaises(TypeError, test) def testNullConversion(self): """Test null conversion.""" - object = ConversionTest() + ob = ConversionTest() - object.StringField = None - self.assertTrue(object.StringField == None) + ob.StringField = None + self.assertTrue(ob.StringField == None) - object.ObjectField = None - self.assertTrue(object.ObjectField == None) + ob.ObjectField = None + self.assertTrue(ob.ObjectField == None) - object.SpamField = None - self.assertTrue(object.SpamField == None) + ob.SpamField = None + self.assertTrue(ob.SpamField == None) # Primitive types and enums should not be set to null. @@ -797,37 +797,37 @@ def test(): def testByteArrayConversion(self): """Test byte array conversion.""" - object = ConversionTest() + ob = ConversionTest() - self.assertTrue(object.ByteArrayField == None) + self.assertTrue(ob.ByteArrayField == None) - object.ByteArrayField = [0, 1, 2, 3, 4] - array = object.ByteArrayField + ob.ByteArrayField = [0, 1, 2, 3, 4] + array = ob.ByteArrayField self.assertTrue(len(array) == 5) self.assertTrue(array[0] == 0) self.assertTrue(array[4] == 4) value = b"testing" - object.ByteArrayField = value - array = object.ByteArrayField + ob.ByteArrayField = value + array = ob.ByteArrayField for i in range(len(value)): self.assertTrue(array[i] == indexbytes(value, i)) def testSByteArrayConversion(self): """Test sbyte array conversion.""" - object = ConversionTest() + ob = ConversionTest() - self.assertTrue(object.SByteArrayField == None) + self.assertTrue(ob.SByteArrayField == None) - object.SByteArrayField = [0, 1, 2, 3, 4] - array = object.SByteArrayField + ob.SByteArrayField = [0, 1, 2, 3, 4] + array = ob.SByteArrayField self.assertTrue(len(array) == 5) self.assertTrue(array[0] == 0) self.assertTrue(array[4] == 4) value = b"testing" - object.SByteArrayField = value - array = object.SByteArrayField + ob.SByteArrayField = value + array = ob.SByteArrayField for i in range(len(value)): self.assertTrue(array[i] == indexbytes(value, i)) diff --git a/src/tests/test_enum.py b/src/tests/test_enum.py index 589fc1796..493395d27 100644 --- a/src/tests/test_enum.py +++ b/src/tests/test_enum.py @@ -125,11 +125,11 @@ def test(): def testEnumConversion(self): """Test enumeration conversion.""" - object = Test.FieldTest() - self.assertTrue(object.EnumField == 0) + ob = Test.FieldTest() + self.assertTrue(ob.EnumField == 0) - object.EnumField = Test.ShortEnum.One - self.assertTrue(object.EnumField == 1) + ob.EnumField = Test.ShortEnum.One + self.assertTrue(ob.EnumField == 1) def test(): Test.FieldTest().EnumField = 20 diff --git a/src/tests/test_event.py b/src/tests/test_event.py index 5417b4a8f..008b6b20a 100644 --- a/src/tests/test_event.py +++ b/src/tests/test_event.py @@ -12,17 +12,17 @@ class EventTests(unittest.TestCase): def testPublicInstanceEvent(self): """Test public instance events.""" - object = EventTest() + ob = EventTest() handler = GenericHandler() self.assertTrue(handler.value == None) - object.PublicEvent += handler.handler + ob.PublicEvent += handler.handler - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 10) - object.PublicEvent -= handler.handler + ob.PublicEvent -= handler.handler def testPublicStaticEvent(self): """Test public static events.""" @@ -36,21 +36,21 @@ def testPublicStaticEvent(self): def testProtectedInstanceEvent(self): """Test protected instance events.""" - object = EventTest() + ob = EventTest() handler = GenericHandler() self.assertTrue(handler.value == None) - object.ProtectedEvent += handler.handler + ob.ProtectedEvent += handler.handler - object.OnProtectedEvent(TestEventArgs(10)) + ob.OnProtectedEvent(TestEventArgs(10)) self.assertTrue(handler.value == 10) - object.ProtectedEvent -= handler.handler + ob.ProtectedEvent -= handler.handler def testProtectedStaticEvent(self): """Test protected static events.""" - object = EventTest + ob = EventTest handler = GenericHandler() self.assertTrue(handler.value == None) @@ -100,213 +100,213 @@ def test(): def testMulticastEvent(self): """Test multicast events.""" - object = EventTest() + ob = EventTest() handler1 = GenericHandler() handler2 = GenericHandler() handler3 = GenericHandler() - object.PublicEvent += handler1.handler - object.PublicEvent += handler2.handler - object.PublicEvent += handler3.handler + ob.PublicEvent += handler1.handler + ob.PublicEvent += handler2.handler + ob.PublicEvent += handler3.handler - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler1.value == 10) self.assertTrue(handler2.value == 10) self.assertTrue(handler3.value == 10) - object.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(handler1.value == 20) self.assertTrue(handler2.value == 20) self.assertTrue(handler3.value == 20) - object.PublicEvent -= handler1.handler - object.PublicEvent -= handler2.handler - object.PublicEvent -= handler3.handler + ob.PublicEvent -= handler1.handler + ob.PublicEvent -= handler2.handler + ob.PublicEvent -= handler3.handler def testInstanceMethodHandler(self): """Test instance method handlers.""" - object = EventTest() + ob = EventTest() handler = GenericHandler() - object.PublicEvent += handler.handler + ob.PublicEvent += handler.handler self.assertTrue(handler.value == None) - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 10) - object.PublicEvent -= handler.handler + ob.PublicEvent -= handler.handler self.assertTrue(handler.value == 10) - object.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(handler.value == 10) def testVarArgsInstanceMethodHandler(self): """Test vararg instance method handlers.""" - object = EventTest() + ob = EventTest() handler = VariableArgsHandler() - object.PublicEvent += handler.handler + ob.PublicEvent += handler.handler self.assertTrue(handler.value == None) - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 10) - object.PublicEvent -= handler.handler + ob.PublicEvent -= handler.handler self.assertTrue(handler.value == 10) - object.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(handler.value == 10) - def testCallableObjectHandler(self): - """Test callable object handlers.""" - object = EventTest() + def testCallableobHandler(self): + """Test callable ob handlers.""" + ob = EventTest() handler = CallableHandler() - object.PublicEvent += handler + ob.PublicEvent += handler self.assertTrue(handler.value == None) - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 10) - object.PublicEvent -= handler + ob.PublicEvent -= handler self.assertTrue(handler.value == 10) - object.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(handler.value == 10) def testVarArgsCallableHandler(self): """Test varargs callable handlers.""" - object = EventTest() + ob = EventTest() handler = VarCallableHandler() - object.PublicEvent += handler + ob.PublicEvent += handler self.assertTrue(handler.value == None) - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 10) - object.PublicEvent -= handler + ob.PublicEvent -= handler self.assertTrue(handler.value == 10) - object.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(handler.value == 10) def testStaticMethodHandler(self): """Test static method handlers.""" - object = EventTest() + ob = EventTest() handler = StaticMethodHandler() StaticMethodHandler.value = None - object.PublicEvent += handler.handler + ob.PublicEvent += handler.handler self.assertTrue(handler.value == None) - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 10) - object.PublicEvent -= handler.handler + ob.PublicEvent -= handler.handler self.assertTrue(handler.value == 10) - object.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(handler.value == 10) def testClassMethodHandler(self): """Test class method handlers.""" - object = EventTest() + ob = EventTest() handler = ClassMethodHandler() ClassMethodHandler.value = None - object.PublicEvent += handler.handler + ob.PublicEvent += handler.handler self.assertTrue(handler.value == None) - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 10) - object.PublicEvent -= handler.handler + ob.PublicEvent -= handler.handler self.assertTrue(handler.value == 10) - object.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(handler.value == 10) def testManagedInstanceMethodHandler(self): """Test managed instance method handlers.""" - object = EventTest() + ob = EventTest() - object.PublicEvent += object.GenericHandler - self.assertTrue(object.value == 0) + ob.PublicEvent += ob.GenericHandler + self.assertTrue(ob.value == 0) - object.OnPublicEvent(TestEventArgs(10)) - self.assertTrue(object.value == 10) + ob.OnPublicEvent(TestEventArgs(10)) + self.assertTrue(ob.value == 10) - object.PublicEvent -= object.GenericHandler - self.assertTrue(object.value == 10) + ob.PublicEvent -= ob.GenericHandler + self.assertTrue(ob.value == 10) - object.OnPublicEvent(TestEventArgs(20)) - self.assertTrue(object.value == 10) + ob.OnPublicEvent(TestEventArgs(20)) + self.assertTrue(ob.value == 10) def testManagedStaticMethodHandler(self): """Test managed static method handlers.""" - object = EventTest() + ob = EventTest() EventTest.s_value = 0 - object.PublicEvent += object.StaticHandler + ob.PublicEvent += ob.StaticHandler self.assertTrue(EventTest.s_value == 0) - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(EventTest.s_value == 10) - object.PublicEvent -= object.StaticHandler + ob.PublicEvent -= ob.StaticHandler self.assertTrue(EventTest.s_value == 10) - object.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(EventTest.s_value == 10) def testUnboundMethodHandler(self): """Test failure mode for unbound method handlers.""" - object = EventTest() - object.PublicEvent += GenericHandler.handler + ob = EventTest() + ob.PublicEvent += GenericHandler.handler try: - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) except TypeError: - object.PublicEvent -= GenericHandler.handler + ob.PublicEvent -= GenericHandler.handler return raise TypeError("should have raised a TypeError") def testFunctionHandler(self): """Test function handlers.""" - object = EventTest() + ob = EventTest() dict = {'value': None} def handler(sender, args, dict=dict): dict['value'] = args.value - object.PublicEvent += handler + ob.PublicEvent += handler self.assertTrue(dict['value'] == None) - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(dict['value'] == 10) - object.PublicEvent -= handler + ob.PublicEvent -= handler self.assertTrue(dict['value'] == 10) - object.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(dict['value'] == 10) def testAddNonCallableHandler(self): """Test handling of attempts to add non-callable handlers.""" def test(): - object = EventTest() - object.PublicEvent += 10 + ob = EventTest() + ob.PublicEvent += 10 self.assertRaises(TypeError, test) def test(): - object = EventTest() - object.PublicEvent += "spam" + ob = EventTest() + ob.PublicEvent += "spam" self.assertRaises(TypeError, test) @@ -314,124 +314,124 @@ def test(): class spam: pass - object = EventTest() - object.PublicEvent += spam() + ob = EventTest() + ob.PublicEvent += spam() self.assertRaises(TypeError, test) def testRemoveMultipleHandlers(self): """Test removing multiple instances of the same handler.""" - object = EventTest() + ob = EventTest() handler = MultipleHandler() h1 = handler.handler - object.PublicEvent += h1 + ob.PublicEvent += h1 h2 = handler.handler - object.PublicEvent += h2 + ob.PublicEvent += h2 - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 20) - object.PublicEvent -= h1 + ob.PublicEvent -= h1 - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 30) - object.PublicEvent -= h2 + ob.PublicEvent -= h2 - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 30) # try again, removing in a different order. - object = EventTest() + ob = EventTest() handler = MultipleHandler() h1 = handler.handler - object.PublicEvent += h1 + ob.PublicEvent += h1 h2 = handler.handler - object.PublicEvent += h2 + ob.PublicEvent += h2 - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 20) - object.PublicEvent -= h2 + ob.PublicEvent -= h2 - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 30) - object.PublicEvent -= h1 + ob.PublicEvent -= h1 - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 30) def testRemoveMultipleStaticHandlers(self): """Test removing multiple instances of a static handler.""" - object = EventTest() + ob = EventTest() handler = MultipleHandler() h1 = handler.handler - object.PublicStaticEvent += h1 + ob.PublicStaticEvent += h1 h2 = handler.handler - object.PublicStaticEvent += h2 + ob.PublicStaticEvent += h2 - object.OnPublicStaticEvent(TestEventArgs(10)) + ob.OnPublicStaticEvent(TestEventArgs(10)) self.assertTrue(handler.value == 20) - object.PublicStaticEvent -= h1 + ob.PublicStaticEvent -= h1 - object.OnPublicStaticEvent(TestEventArgs(10)) + ob.OnPublicStaticEvent(TestEventArgs(10)) self.assertTrue(handler.value == 30) - object.PublicStaticEvent -= h2 + ob.PublicStaticEvent -= h2 - object.OnPublicStaticEvent(TestEventArgs(10)) + ob.OnPublicStaticEvent(TestEventArgs(10)) self.assertTrue(handler.value == 30) # try again, removing in a different order. - object = EventTest() + ob = EventTest() handler = MultipleHandler() h1 = handler.handler - object.PublicStaticEvent += h1 + ob.PublicStaticEvent += h1 h2 = handler.handler - object.PublicStaticEvent += h2 + ob.PublicStaticEvent += h2 - object.OnPublicStaticEvent(TestEventArgs(10)) + ob.OnPublicStaticEvent(TestEventArgs(10)) self.assertTrue(handler.value == 20) - object.PublicStaticEvent -= h2 + ob.PublicStaticEvent -= h2 - object.OnPublicStaticEvent(TestEventArgs(10)) + ob.OnPublicStaticEvent(TestEventArgs(10)) self.assertTrue(handler.value == 30) - object.PublicStaticEvent -= h1 + ob.PublicStaticEvent -= h1 - object.OnPublicStaticEvent(TestEventArgs(10)) + ob.OnPublicStaticEvent(TestEventArgs(10)) self.assertTrue(handler.value == 30) def testRandomMultipleHandlers(self): """Test random subscribe / unsubscribe of the same handlers.""" import random - object = EventTest() + ob = EventTest() handler = MultipleHandler() handler2 = MultipleHandler() - object.PublicEvent += handler2.handler - object.PublicEvent += handler2.handler + ob.PublicEvent += handler2.handler + ob.PublicEvent += handler2.handler handlers = [] for i in range(30): method = handler.handler - object.PublicEvent += method + ob.PublicEvent += method handlers.append(method) - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 300) self.assertTrue(handler2.value == 20) handler.value = 0 @@ -440,46 +440,46 @@ def testRandomMultipleHandlers(self): for i in range(30): item = random.choice(handlers) handlers.remove(item) - object.PublicEvent -= item + ob.PublicEvent -= item handler.value = 0 - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == (len(handlers) * 10)) self.assertTrue(handler2.value == ((i + 1) * 20)) handler2.value = 0 - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler2.value == 20) - object.PublicEvent -= handler2.handler + ob.PublicEvent -= handler2.handler handler2.value = 0 - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler2.value == 10) - object.PublicEvent -= handler2.handler + ob.PublicEvent -= handler2.handler handler2.value = 0 - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler2.value == 0) def testRemoveInternalCallHandler(self): """Test remove on an event sink implemented w/internalcall.""" - object = EventTest() + ob = EventTest() def h(sender, args): pass - object.PublicEvent += h - object.PublicEvent -= h + ob.PublicEvent += h + ob.PublicEvent -= h def testRemoveUnknownHandler(self): """Test removing an event handler that was never added.""" def test(): - object = EventTest() + ob = EventTest() handler = GenericHandler() - object.PublicEvent -= handler.handler + ob.PublicEvent -= handler.handler self.assertRaises(ValueError, test) @@ -490,78 +490,78 @@ class BadHandler: def handler(self, one): return 'too many' - object = EventTest() + ob = EventTest() handler = BadHandler() def test(): - object.PublicEvent += handler.handler - object.OnPublicEvent(TestEventArgs(10)) + ob.PublicEvent += handler.handler + ob.OnPublicEvent(TestEventArgs(10)) self.assertRaises(TypeError, test) - object.PublicEvent -= handler.handler + ob.PublicEvent -= handler.handler class BadHandler: def handler(self, one, two, three, four, five): return 'not enough' - object = EventTest() + ob = EventTest() handler = BadHandler() def test(): - object.PublicEvent += handler.handler - object.OnPublicEvent(TestEventArgs(10)) + ob.PublicEvent += handler.handler + ob.OnPublicEvent(TestEventArgs(10)) self.assertRaises(TypeError, test) - object.PublicEvent -= handler.handler + ob.PublicEvent -= handler.handler def testIncorrectInvokation(self): """Test incorrect invocation of events.""" - object = EventTest() + ob = EventTest() handler = GenericHandler() - object.PublicEvent += handler.handler + ob.PublicEvent += handler.handler def test(): - object.OnPublicEvent() + ob.OnPublicEvent() self.assertRaises(TypeError, test) def test(): - object.OnPublicEvent(32) + ob.OnPublicEvent(32) self.assertRaises(TypeError, test) - object.PublicEvent -= handler.handler + ob.PublicEvent -= handler.handler def testExplicitCLSEventRegistration(self): """Test explicit CLS event registration.""" from Python.Test import TestEventHandler - object = EventTest() + ob = EventTest() handler = GenericHandler() delegate = TestEventHandler(handler.handler) - object.add_PublicEvent(delegate) + ob.add_PublicEvent(delegate) self.assertTrue(handler.value == None) - object.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 10) - object.remove_PublicEvent(delegate) + ob.remove_PublicEvent(delegate) self.assertTrue(handler.value == 10) - object.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(handler.value == 10) def testImplicitCLSEventRegistration(self): """Test implicit CLS event registration.""" def test(): - object = EventTest() + ob = EventTest() handler = GenericHandler() - object.add_PublicEvent(handler.handler) + ob.add_PublicEvent(handler.handler) self.assertRaises(TypeError, test) @@ -591,8 +591,8 @@ def test(): self.assertRaises(TypeError, test) def test(): - object = EventTest() - object.PublicEvent = 0 + ob = EventTest() + ob.PublicEvent = 0 self.assertRaises(TypeError, test) diff --git a/src/tests/test_field.py b/src/tests/test_field.py index 8a2c0c67a..1a46e1d96 100644 --- a/src/tests/test_field.py +++ b/src/tests/test_field.py @@ -11,11 +11,11 @@ class FieldTests(unittest.TestCase): def testPublicInstanceField(self): """Test public instance fields.""" - object = FieldTest() - self.assertTrue(object.PublicField == 0) + ob = FieldTest() + self.assertTrue(ob.PublicField == 0) - object.PublicField = 1 - self.assertTrue(object.PublicField == 1) + ob.PublicField = 1 + self.assertTrue(ob.PublicField == 1) def test(): del FieldTest().PublicField @@ -24,15 +24,15 @@ def test(): def testPublicStaticField(self): """Test public static fields.""" - object = FieldTest() + ob = FieldTest() self.assertTrue(FieldTest.PublicStaticField == 0) FieldTest.PublicStaticField = 1 self.assertTrue(FieldTest.PublicStaticField == 1) - self.assertTrue(object.PublicStaticField == 1) - object.PublicStaticField = 0 - self.assertTrue(object.PublicStaticField == 0) + self.assertTrue(ob.PublicStaticField == 1) + ob.PublicStaticField = 0 + self.assertTrue(ob.PublicStaticField == 0) def test(): del FieldTest.PublicStaticField @@ -46,11 +46,11 @@ def test(): def testProtectedInstanceField(self): """Test protected instance fields.""" - object = FieldTest() - self.assertTrue(object.ProtectedField == 0) + ob = FieldTest() + self.assertTrue(ob.ProtectedField == 0) - object.ProtectedField = 1 - self.assertTrue(object.ProtectedField == 1) + ob.ProtectedField = 1 + self.assertTrue(ob.ProtectedField == 1) def test(): del FieldTest().ProtectedField @@ -59,15 +59,15 @@ def test(): def testProtectedStaticField(self): """Test protected static fields.""" - object = FieldTest() + ob = FieldTest() self.assertTrue(FieldTest.ProtectedStaticField == 0) FieldTest.ProtectedStaticField = 1 self.assertTrue(FieldTest.ProtectedStaticField == 1) - self.assertTrue(object.ProtectedStaticField == 1) - object.ProtectedStaticField = 0 - self.assertTrue(object.ProtectedStaticField == 0) + self.assertTrue(ob.ProtectedStaticField == 1) + ob.ProtectedStaticField = 0 + self.assertTrue(ob.ProtectedStaticField == 0) def test(): del FieldTest.ProtectedStaticField @@ -95,10 +95,10 @@ def test(): def testReadOnlyStaticField(self): """Test readonly static fields.""" - object = FieldTest() + ob = FieldTest() self.assertTrue(FieldTest.ReadOnlyStaticField == 0) - self.assertTrue(object.ReadOnlyStaticField == 0) + self.assertTrue(ob.ReadOnlyStaticField == 0) def test(): FieldTest.ReadOnlyStaticField = 1 @@ -122,10 +122,10 @@ def test(): def testConstantField(self): """Test const fields.""" - object = FieldTest() + ob = FieldTest() self.assertTrue(FieldTest.ConstField == 0) - self.assertTrue(object.ConstField == 0) + self.assertTrue(ob.ConstField == 0) def test(): FieldTest().ConstField = 1 @@ -190,15 +190,15 @@ def testFieldDescriptorGetSet(self): # a descriptor actually goes through the descriptor (rather than # silently replacing the descriptor in the instance or type dict. - object = FieldTest() + ob = FieldTest() self.assertTrue(FieldTest.PublicStaticField == 0) - self.assertTrue(object.PublicStaticField == 0) + self.assertTrue(ob.PublicStaticField == 0) descriptor = FieldTest.__dict__['PublicStaticField'] self.assertTrue(type(descriptor) != int) - object.PublicStaticField = 0 + ob.PublicStaticField = 0 descriptor = FieldTest.__dict__['PublicStaticField'] self.assertTrue(type(descriptor) != int) @@ -231,180 +231,180 @@ def test(): def testBooleanField(self): """Test boolean fields.""" # change this to true / false later for Python 2.3? - object = FieldTest() - self.assertTrue(object.BooleanField == False) + ob = FieldTest() + self.assertTrue(ob.BooleanField == False) - object.BooleanField = True - self.assertTrue(object.BooleanField == True) + ob.BooleanField = True + self.assertTrue(ob.BooleanField == True) - object.BooleanField = False - self.assertTrue(object.BooleanField == False) + ob.BooleanField = False + self.assertTrue(ob.BooleanField == False) - object.BooleanField = 1 - self.assertTrue(object.BooleanField == True) + ob.BooleanField = 1 + self.assertTrue(ob.BooleanField == True) - object.BooleanField = 0 - self.assertTrue(object.BooleanField == False) + ob.BooleanField = 0 + self.assertTrue(ob.BooleanField == False) def testSByteField(self): """Test sbyte fields.""" - object = FieldTest() - self.assertTrue(object.SByteField == 0) + ob = FieldTest() + self.assertTrue(ob.SByteField == 0) - object.SByteField = 1 - self.assertTrue(object.SByteField == 1) + ob.SByteField = 1 + self.assertTrue(ob.SByteField == 1) def testByteField(self): """Test byte fields.""" - object = FieldTest() - self.assertTrue(object.ByteField == 0) + ob = FieldTest() + self.assertTrue(ob.ByteField == 0) - object.ByteField = 1 - self.assertTrue(object.ByteField == 1) + ob.ByteField = 1 + self.assertTrue(ob.ByteField == 1) def testCharField(self): """Test char fields.""" - object = FieldTest() - self.assertTrue(object.CharField == u'A') - self.assertTrue(object.CharField == 'A') + ob = FieldTest() + self.assertTrue(ob.CharField == u'A') + self.assertTrue(ob.CharField == 'A') - object.CharField = 'B' - self.assertTrue(object.CharField == u'B') - self.assertTrue(object.CharField == 'B') + ob.CharField = 'B' + self.assertTrue(ob.CharField == u'B') + self.assertTrue(ob.CharField == 'B') - object.CharField = u'C' - self.assertTrue(object.CharField == u'C') - self.assertTrue(object.CharField == 'C') + ob.CharField = u'C' + self.assertTrue(ob.CharField == u'C') + self.assertTrue(ob.CharField == 'C') def testInt16Field(self): """Test int16 fields.""" - object = FieldTest() - self.assertTrue(object.Int16Field == 0) + ob = FieldTest() + self.assertTrue(ob.Int16Field == 0) - object.Int16Field = 1 - self.assertTrue(object.Int16Field == 1) + ob.Int16Field = 1 + self.assertTrue(ob.Int16Field == 1) def testInt32Field(self): """Test int32 fields.""" - object = FieldTest() - self.assertTrue(object.Int32Field == 0) + ob = FieldTest() + self.assertTrue(ob.Int32Field == 0) - object.Int32Field = 1 - self.assertTrue(object.Int32Field == 1) + ob.Int32Field = 1 + self.assertTrue(ob.Int32Field == 1) def testInt64Field(self): """Test int64 fields.""" - object = FieldTest() - self.assertTrue(object.Int64Field == 0) + ob = FieldTest() + self.assertTrue(ob.Int64Field == 0) - object.Int64Field = 1 - self.assertTrue(object.Int64Field == 1) + ob.Int64Field = 1 + self.assertTrue(ob.Int64Field == 1) def testUInt16Field(self): """Test uint16 fields.""" - object = FieldTest() - self.assertTrue(object.UInt16Field == 0) + ob = FieldTest() + self.assertTrue(ob.UInt16Field == 0) - object.UInt16Field = 1 - self.assertTrue(object.UInt16Field == 1) + ob.UInt16Field = 1 + self.assertTrue(ob.UInt16Field == 1) def testUInt32Field(self): """Test uint32 fields.""" - object = FieldTest() - self.assertTrue(object.UInt32Field == 0) + ob = FieldTest() + self.assertTrue(ob.UInt32Field == 0) - object.UInt32Field = 1 - self.assertTrue(object.UInt32Field == 1) + ob.UInt32Field = 1 + self.assertTrue(ob.UInt32Field == 1) def testUInt64Field(self): """Test uint64 fields.""" - object = FieldTest() - self.assertTrue(object.UInt64Field == 0) + ob = FieldTest() + self.assertTrue(ob.UInt64Field == 0) - object.UInt64Field = 1 - self.assertTrue(object.UInt64Field == 1) + ob.UInt64Field = 1 + self.assertTrue(ob.UInt64Field == 1) def testSingleField(self): """Test single fields.""" - object = FieldTest() - self.assertTrue(object.SingleField == 0.0) + ob = FieldTest() + self.assertTrue(ob.SingleField == 0.0) - object.SingleField = 1.1 - self.assertTrue(object.SingleField == 1.1) + ob.SingleField = 1.1 + self.assertTrue(ob.SingleField == 1.1) def testDoubleField(self): """Test double fields.""" - object = FieldTest() - self.assertTrue(object.DoubleField == 0.0) + ob = FieldTest() + self.assertTrue(ob.DoubleField == 0.0) - object.DoubleField = 1.1 - self.assertTrue(object.DoubleField == 1.1) + ob.DoubleField = 1.1 + self.assertTrue(ob.DoubleField == 1.1) def testDecimalField(self): """Test decimal fields.""" - object = FieldTest() - self.assertTrue(object.DecimalField == System.Decimal(0)) + ob = FieldTest() + self.assertTrue(ob.DecimalField == System.Decimal(0)) - object.DecimalField = System.Decimal(1) - self.assertTrue(object.DecimalField == System.Decimal(1)) + ob.DecimalField = System.Decimal(1) + self.assertTrue(ob.DecimalField == System.Decimal(1)) def testStringField(self): """Test string fields.""" - object = FieldTest() - self.assertTrue(object.StringField == "spam") + ob = FieldTest() + self.assertTrue(ob.StringField == "spam") - object.StringField = "eggs" - self.assertTrue(object.StringField == "eggs") + ob.StringField = "eggs" + self.assertTrue(ob.StringField == "eggs") def testInterfaceField(self): """Test interface fields.""" from Python.Test import Spam, ISpam - object = FieldTest() + ob = FieldTest() - self.assertTrue(ISpam(object.SpamField).GetValue() == "spam") - self.assertTrue(object.SpamField.GetValue() == "spam") + self.assertTrue(ISpam(ob.SpamField).GetValue() == "spam") + self.assertTrue(ob.SpamField.GetValue() == "spam") - object.SpamField = Spam("eggs") - self.assertTrue(ISpam(object.SpamField).GetValue() == "eggs") - self.assertTrue(object.SpamField.GetValue() == "eggs") + ob.SpamField = Spam("eggs") + self.assertTrue(ISpam(ob.SpamField).GetValue() == "eggs") + self.assertTrue(ob.SpamField.GetValue() == "eggs") def testObjectField(self): - """Test object fields.""" - object = FieldTest() - self.assertTrue(object.ObjectField == None) + """Test ob fields.""" + ob = FieldTest() + self.assertTrue(ob.ObjectField == None) - object.ObjectField = System.String("spam") - self.assertTrue(object.ObjectField == "spam") + ob.ObjectField = System.String("spam") + self.assertTrue(ob.ObjectField == "spam") - object.ObjectField = System.Int32(1) - self.assertTrue(object.ObjectField == 1) + ob.ObjectField = System.Int32(1) + self.assertTrue(ob.ObjectField == 1) - object.ObjectField = None - self.assertTrue(object.ObjectField == None) + ob.ObjectField = None + self.assertTrue(ob.ObjectField == None) def testEnumField(self): """Test enum fields.""" from Python.Test import ShortEnum - object = FieldTest() - self.assertTrue(object.EnumField == ShortEnum.Zero) + ob = FieldTest() + self.assertTrue(ob.EnumField == ShortEnum.Zero) - object.EnumField = ShortEnum.One - self.assertTrue(object.EnumField == ShortEnum.One) + ob.EnumField = ShortEnum.One + self.assertTrue(ob.EnumField == ShortEnum.One) def testNullableField(self): """Test nullable fields.""" - object = FieldTest() + ob = FieldTest() - object.StringField = None - self.assertTrue(object.StringField == None) + ob.StringField = None + self.assertTrue(ob.StringField == None) - object.ObjectField = None - self.assertTrue(object.ObjectField == None) + ob.ObjectField = None + self.assertTrue(ob.ObjectField == None) - object.SpamField = None - self.assertTrue(object.SpamField == None) + ob.SpamField = None + self.assertTrue(ob.SpamField == None) # Primitive types and enums should not be set to null. diff --git a/src/tests/test_indexer.py b/src/tests/test_indexer.py index 74c9b1876..4e631de4f 100644 --- a/src/tests/test_indexer.py +++ b/src/tests/test_indexer.py @@ -12,616 +12,616 @@ class IndexerTests(unittest.TestCase): def testPublicIndexer(self): """Test public indexers.""" - object = Test.PublicIndexerTest() + ob = Test.PublicIndexerTest() - object[0] = "zero" - self.assertTrue(object[0] == "zero") + ob[0] = "zero" + self.assertTrue(ob[0] == "zero") - object[1] = "one" - self.assertTrue(object[1] == "one") + ob[1] = "one" + self.assertTrue(ob[1] == "one") - self.assertTrue(object[10] == None) + self.assertTrue(ob[10] == None) def testProtectedIndexer(self): """Test protected indexers.""" - object = Test.ProtectedIndexerTest() + ob = Test.ProtectedIndexerTest() - object[0] = "zero" - self.assertTrue(object[0] == "zero") + ob[0] = "zero" + self.assertTrue(ob[0] == "zero") - object[1] = "one" - self.assertTrue(object[1] == "one") + ob[1] = "one" + self.assertTrue(ob[1] == "one") - self.assertTrue(object[10] == None) + self.assertTrue(ob[10] == None) def testInternalIndexer(self): """Test internal indexers.""" - object = Test.InternalIndexerTest() + ob = Test.InternalIndexerTest() def test(): - object[0] = "zero" + ob[0] = "zero" self.assertRaises(TypeError, test) def test(): - Test.InternalIndexerTest.__getitem__(object, 0) + Test.InternalIndexerTest.__getitem__(ob, 0) self.assertRaises(TypeError, test) def test(): - object.__getitem__(0) + ob.__getitem__(0) self.assertRaises(TypeError, test) def testPrivateIndexer(self): """Test private indexers.""" - object = Test.PrivateIndexerTest() + ob = Test.PrivateIndexerTest() def test(): - object[0] = "zero" + ob[0] = "zero" self.assertRaises(TypeError, test) def test(): - Test.PrivateIndexerTest.__getitem__(object, 0) + Test.PrivateIndexerTest.__getitem__(ob, 0) self.assertRaises(TypeError, test) def test(): - object.__getitem__(0) + ob.__getitem__(0) self.assertRaises(TypeError, test) def testBooleanIndexer(self): """Test boolean indexers.""" - object = Test.BooleanIndexerTest() + ob = Test.BooleanIndexerTest() - self.assertTrue(object[True] == None) - self.assertTrue(object[1] == None) + self.assertTrue(ob[True] == None) + self.assertTrue(ob[1] == None) - object[0] = "false" - self.assertTrue(object[0] == "false") + ob[0] = "false" + self.assertTrue(ob[0] == "false") - object[1] = "true" - self.assertTrue(object[1] == "true") + ob[1] = "true" + self.assertTrue(ob[1] == "true") - object[False] = "false" - self.assertTrue(object[False] == "false") + ob[False] = "false" + self.assertTrue(ob[False] == "false") - object[True] = "true" - self.assertTrue(object[True] == "true") + ob[True] = "true" + self.assertTrue(ob[True] == "true") def testByteIndexer(self): """Test byte indexers.""" - object = Test.ByteIndexerTest() + ob = Test.ByteIndexerTest() max = 255 min = 0 - self.assertTrue(object[max] == None) + self.assertTrue(ob[max] == None) - object[max] = str(max) - self.assertTrue(object[max] == str(max)) + ob[max] = str(max) + self.assertTrue(ob[max] == str(max)) - object[min] = str(min) - self.assertTrue(object[min] == str(min)) + ob[min] = str(min) + self.assertTrue(ob[min] == str(min)) def test(): - object = Test.ByteIndexerTest() - object["wrong"] + ob = Test.ByteIndexerTest() + ob["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.ByteIndexerTest() - object["wrong"] = "wrong" + ob = Test.ByteIndexerTest() + ob["wrong"] = "wrong" self.assertRaises(TypeError, test) def testSByteIndexer(self): """Test sbyte indexers.""" - object = Test.SByteIndexerTest() + ob = Test.SByteIndexerTest() max = 127 min = -128 - self.assertTrue(object[max] == None) + self.assertTrue(ob[max] == None) - object[max] = str(max) - self.assertTrue(object[max] == str(max)) + ob[max] = str(max) + self.assertTrue(ob[max] == str(max)) - object[min] = str(min) - self.assertTrue(object[min] == str(min)) + ob[min] = str(min) + self.assertTrue(ob[min] == str(min)) def test(): - object = Test.SByteIndexerTest() - object["wrong"] + ob = Test.SByteIndexerTest() + ob["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.SByteIndexerTest() - object["wrong"] = "wrong" + ob = Test.SByteIndexerTest() + ob["wrong"] = "wrong" self.assertRaises(TypeError, test) def testCharIndexer(self): """Test char indexers.""" - object = Test.CharIndexerTest() + ob = Test.CharIndexerTest() max = unichr(65535) min = unichr(0) - self.assertTrue(object[max] == None) + self.assertTrue(ob[max] == None) - object[max] = "max" - self.assertTrue(object[max] == "max") + ob[max] = "max" + self.assertTrue(ob[max] == "max") - object[min] = "min" - self.assertTrue(object[min] == "min") + ob[min] = "min" + self.assertTrue(ob[min] == "min") def test(): - object = Test.CharIndexerTest() - object["wrong"] + ob = Test.CharIndexerTest() + ob["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.CharIndexerTest() - object["wrong"] = "wrong" + ob = Test.CharIndexerTest() + ob["wrong"] = "wrong" self.assertRaises(TypeError, test) def testInt16Indexer(self): """Test Int16 indexers.""" - object = Test.Int16IndexerTest() + ob = Test.Int16IndexerTest() max = 32767 min = -32768 - self.assertTrue(object[max] == None) + self.assertTrue(ob[max] == None) - object[max] = str(max) - self.assertTrue(object[max] == str(max)) + ob[max] = str(max) + self.assertTrue(ob[max] == str(max)) - object[min] = str(min) - self.assertTrue(object[min] == str(min)) + ob[min] = str(min) + self.assertTrue(ob[min] == str(min)) def test(): - object = Test.Int16IndexerTest() - object["wrong"] + ob = Test.Int16IndexerTest() + ob["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.Int16IndexerTest() - object["wrong"] = "wrong" + ob = Test.Int16IndexerTest() + ob["wrong"] = "wrong" self.assertRaises(TypeError, test) def testInt32Indexer(self): """Test Int32 indexers.""" - object = Test.Int32IndexerTest() + ob = Test.Int32IndexerTest() max = 2147483647 min = -2147483648 - self.assertTrue(object[max] == None) + self.assertTrue(ob[max] == None) - object[max] = str(max) - self.assertTrue(object[max] == str(max)) + ob[max] = str(max) + self.assertTrue(ob[max] == str(max)) - object[min] = str(min) - self.assertTrue(object[min] == str(min)) + ob[min] = str(min) + self.assertTrue(ob[min] == str(min)) def test(): - object = Test.Int32IndexerTest() - object["wrong"] + ob = Test.Int32IndexerTest() + ob["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.Int32IndexerTest() - object["wrong"] = "wrong" + ob = Test.Int32IndexerTest() + ob["wrong"] = "wrong" self.assertRaises(TypeError, test) def testInt64Indexer(self): """Test Int64 indexers.""" - object = Test.Int64IndexerTest() + ob = Test.Int64IndexerTest() max = long(9223372036854775807) min = long(-9223372036854775808) - self.assertTrue(object[max] == None) + self.assertTrue(ob[max] == None) - object[max] = str(max) - self.assertTrue(object[max] == str(max)) + ob[max] = str(max) + self.assertTrue(ob[max] == str(max)) - object[min] = str(min) - self.assertTrue(object[min] == str(min)) + ob[min] = str(min) + self.assertTrue(ob[min] == str(min)) def test(): - object = Test.Int64IndexerTest() - object["wrong"] + ob = Test.Int64IndexerTest() + ob["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.Int64IndexerTest() - object["wrong"] = "wrong" + ob = Test.Int64IndexerTest() + ob["wrong"] = "wrong" self.assertRaises(TypeError, test) def testUInt16Indexer(self): """Test UInt16 indexers.""" - object = Test.UInt16IndexerTest() + ob = Test.UInt16IndexerTest() max = 65535 min = 0 - self.assertTrue(object[max] == None) + self.assertTrue(ob[max] == None) - object[max] = str(max) - self.assertTrue(object[max] == str(max)) + ob[max] = str(max) + self.assertTrue(ob[max] == str(max)) - object[min] = str(min) - self.assertTrue(object[min] == str(min)) + ob[min] = str(min) + self.assertTrue(ob[min] == str(min)) def test(): - object = Test.UInt16IndexerTest() - object["wrong"] + ob = Test.UInt16IndexerTest() + ob["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.UInt16IndexerTest() - object["wrong"] = "wrong" + ob = Test.UInt16IndexerTest() + ob["wrong"] = "wrong" self.assertRaises(TypeError, test) def testUInt32Indexer(self): """Test UInt32 indexers.""" - object = Test.UInt32IndexerTest() + ob = Test.UInt32IndexerTest() max = long(4294967295) min = 0 - self.assertTrue(object[max] == None) + self.assertTrue(ob[max] == None) - object[max] = str(max) - self.assertTrue(object[max] == str(max)) + ob[max] = str(max) + self.assertTrue(ob[max] == str(max)) - object[min] = str(min) - self.assertTrue(object[min] == str(min)) + ob[min] = str(min) + self.assertTrue(ob[min] == str(min)) def test(): - object = Test.UInt32IndexerTest() - object["wrong"] + ob = Test.UInt32IndexerTest() + ob["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.UInt32IndexerTest() - object["wrong"] = "wrong" + ob = Test.UInt32IndexerTest() + ob["wrong"] = "wrong" self.assertRaises(TypeError, test) def testUInt64Indexer(self): """Test UInt64 indexers.""" - object = Test.UInt64IndexerTest() + ob = Test.UInt64IndexerTest() max = long(18446744073709551615) min = 0 - self.assertTrue(object[max] == None) + self.assertTrue(ob[max] == None) - object[max] = str(max) - self.assertTrue(object[max] == str(max)) + ob[max] = str(max) + self.assertTrue(ob[max] == str(max)) - object[min] = str(min) - self.assertTrue(object[min] == str(min)) + ob[min] = str(min) + self.assertTrue(ob[min] == str(min)) def test(): - object = Test.UInt64IndexerTest() - object["wrong"] + ob = Test.UInt64IndexerTest() + ob["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.UInt64IndexerTest() - object["wrong"] = "wrong" + ob = Test.UInt64IndexerTest() + ob["wrong"] = "wrong" self.assertRaises(TypeError, test) def testSingleIndexer(self): """Test Single indexers.""" - object = Test.SingleIndexerTest() + ob = Test.SingleIndexerTest() max = 3.402823e38 min = -3.402823e38 - self.assertTrue(object[max] == None) + self.assertTrue(ob[max] == None) - object[max] = "max" - self.assertTrue(object[max] == "max") + ob[max] = "max" + self.assertTrue(ob[max] == "max") - object[min] = "min" - self.assertTrue(object[min] == "min") + ob[min] = "min" + self.assertTrue(ob[min] == "min") def test(): - object = Test.SingleIndexerTest() - object["wrong"] + ob = Test.SingleIndexerTest() + ob["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.SingleIndexerTest() - object["wrong"] = "wrong" + ob = Test.SingleIndexerTest() + ob["wrong"] = "wrong" self.assertRaises(TypeError, test) def testDoubleIndexer(self): """Test Double indexers.""" - object = Test.DoubleIndexerTest() + ob = Test.DoubleIndexerTest() max = 1.7976931348623157e308 min = -1.7976931348623157e308 - self.assertTrue(object[max] == None) + self.assertTrue(ob[max] == None) - object[max] = "max" - self.assertTrue(object[max] == "max") + ob[max] = "max" + self.assertTrue(ob[max] == "max") - object[min] = "min" - self.assertTrue(object[min] == "min") + ob[min] = "min" + self.assertTrue(ob[min] == "min") def test(): - object = Test.DoubleIndexerTest() - object["wrong"] + ob = Test.DoubleIndexerTest() + ob["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.DoubleIndexerTest() - object["wrong"] = "wrong" + ob = Test.DoubleIndexerTest() + ob["wrong"] = "wrong" self.assertRaises(TypeError, test) def testDecimalIndexer(self): """Test Decimal indexers.""" - object = Test.DecimalIndexerTest() + ob = Test.DecimalIndexerTest() from System import Decimal max_d = Decimal.Parse("79228162514264337593543950335") min_d = Decimal.Parse("-79228162514264337593543950335") - self.assertTrue(object[max_d] == None) + self.assertTrue(ob[max_d] == None) - object[max_d] = "max" - self.assertTrue(object[max_d] == "max") + ob[max_d] = "max" + self.assertTrue(ob[max_d] == "max") - object[min_d] = "min" - self.assertTrue(object[min_d] == "min") + ob[min_d] = "min" + self.assertTrue(ob[min_d] == "min") def test(): - object = Test.DecimalIndexerTest() - object["wrong"] + ob = Test.DecimalIndexerTest() + ob["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.DecimalIndexerTest() - object["wrong"] = "wrong" + ob = Test.DecimalIndexerTest() + ob["wrong"] = "wrong" self.assertRaises(TypeError, test) def testStringIndexer(self): """Test String indexers.""" - object = Test.StringIndexerTest() + ob = Test.StringIndexerTest() - self.assertTrue(object["spam"] == None) - self.assertTrue(object[u"spam"] == None) + self.assertTrue(ob["spam"] == None) + self.assertTrue(ob[u"spam"] == None) - object["spam"] = "spam" - self.assertTrue(object["spam"] == "spam") - self.assertTrue(object["spam"] == u"spam") - self.assertTrue(object[u"spam"] == "spam") - self.assertTrue(object[u"spam"] == u"spam") + ob["spam"] = "spam" + self.assertTrue(ob["spam"] == "spam") + self.assertTrue(ob["spam"] == u"spam") + self.assertTrue(ob[u"spam"] == "spam") + self.assertTrue(ob[u"spam"] == u"spam") - object[u"eggs"] = u"eggs" - self.assertTrue(object["eggs"] == "eggs") - self.assertTrue(object["eggs"] == u"eggs") - self.assertTrue(object[u"eggs"] == "eggs") - self.assertTrue(object[u"eggs"] == u"eggs") + ob[u"eggs"] = u"eggs" + self.assertTrue(ob["eggs"] == "eggs") + self.assertTrue(ob["eggs"] == u"eggs") + self.assertTrue(ob[u"eggs"] == "eggs") + self.assertTrue(ob[u"eggs"] == u"eggs") def test(): - object = Test.StringIndexerTest() - object[1] + ob = Test.StringIndexerTest() + ob[1] self.assertRaises(TypeError, test) def test(): - object = Test.StringIndexerTest() - object[1] = "wrong" + ob = Test.StringIndexerTest() + ob[1] = "wrong" self.assertRaises(TypeError, test) def testEnumIndexer(self): """Test enum indexers.""" - object = Test.EnumIndexerTest() + ob = Test.EnumIndexerTest() key = Test.ShortEnum.One - self.assertTrue(object[key] == None) + self.assertTrue(ob[key] == None) - object[key] = "spam" - self.assertTrue(object[key] == "spam") + ob[key] = "spam" + self.assertTrue(ob[key] == "spam") - object[key] = "eggs" - self.assertTrue(object[key] == "eggs") + ob[key] = "eggs" + self.assertTrue(ob[key] == "eggs") - object[1] = "spam" - self.assertTrue(object[1] == "spam") + ob[1] = "spam" + self.assertTrue(ob[1] == "spam") def test(): - object = Test.EnumIndexerTest() - object["wrong"] + ob = Test.EnumIndexerTest() + ob["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.EnumIndexerTest() - object["wrong"] = "wrong" + ob = Test.EnumIndexerTest() + ob["wrong"] = "wrong" self.assertRaises(TypeError, test) def testObjectIndexer(self): - """Test object indexers.""" - object = Test.ObjectIndexerTest() + """Test ob indexers.""" + ob = Test.ObjectIndexerTest() from Python.Test import Spam spam = Spam("spam") - self.assertTrue(object[spam] == None) - self.assertTrue(object["spam"] == None) - self.assertTrue(object[1] == None) - self.assertTrue(object[None] == None) + self.assertTrue(ob[spam] == None) + self.assertTrue(ob["spam"] == None) + self.assertTrue(ob[1] == None) + self.assertTrue(ob[None] == None) - object[spam] = "spam" - self.assertTrue(object[spam] == "spam") + ob[spam] = "spam" + self.assertTrue(ob[spam] == "spam") - object["spam"] = "eggs" - self.assertTrue(object["spam"] == "eggs") + ob["spam"] = "eggs" + self.assertTrue(ob["spam"] == "eggs") - object[1] = "one" - self.assertTrue(object[1] == "one") + ob[1] = "one" + self.assertTrue(ob[1] == "one") - object[long(1)] = "long" - self.assertTrue(object[long(1)] == "long") + ob[long(1)] = "long" + self.assertTrue(ob[long(1)] == "long") def test(): class eggs: pass key = eggs() - object = Test.ObjectIndexerTest() - object[key] = "wrong" + ob = Test.ObjectIndexerTest() + ob[key] = "wrong" self.assertRaises(TypeError, test) def testInterfaceIndexer(self): """Test interface indexers.""" - object = Test.InterfaceIndexerTest() + ob = Test.InterfaceIndexerTest() from Python.Test import Spam spam = Spam("spam") - self.assertTrue(object[spam] == None) + self.assertTrue(ob[spam] == None) - object[spam] = "spam" - self.assertTrue(object[spam] == "spam") + ob[spam] = "spam" + self.assertTrue(ob[spam] == "spam") - object[spam] = "eggs" - self.assertTrue(object[spam] == "eggs") + ob[spam] = "eggs" + self.assertTrue(ob[spam] == "eggs") def test(): - object = Test.InterfaceIndexerTest() - object["wrong"] + ob = Test.InterfaceIndexerTest() + ob["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.InterfaceIndexerTest() - object["wrong"] = "wrong" + ob = Test.InterfaceIndexerTest() + ob["wrong"] = "wrong" self.assertRaises(TypeError, test) def testTypedIndexer(self): """Test typed indexers.""" - object = Test.TypedIndexerTest() + ob = Test.TypedIndexerTest() from Python.Test import Spam spam = Spam("spam") - self.assertTrue(object[spam] == None) + self.assertTrue(ob[spam] == None) - object[spam] = "spam" - self.assertTrue(object[spam] == "spam") + ob[spam] = "spam" + self.assertTrue(ob[spam] == "spam") - object[spam] = "eggs" - self.assertTrue(object[spam] == "eggs") + ob[spam] = "eggs" + self.assertTrue(ob[spam] == "eggs") def test(): - object = Test.TypedIndexerTest() - object["wrong"] + ob = Test.TypedIndexerTest() + ob["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.TypedIndexerTest() - object["wrong"] = "wrong" + ob = Test.TypedIndexerTest() + ob["wrong"] = "wrong" self.assertRaises(TypeError, test) def testMultiArgIndexer(self): """Test indexers that take multiple index arguments.""" - object = Test.MultiArgIndexerTest() + ob = Test.MultiArgIndexerTest() - object[0, 1] = "zero one" - self.assertTrue(object[0, 1] == "zero one") + ob[0, 1] = "zero one" + self.assertTrue(ob[0, 1] == "zero one") - object[1, 9] = "one nine" - self.assertTrue(object[1, 9] == "one nine") + ob[1, 9] = "one nine" + self.assertTrue(ob[1, 9] == "one nine") - self.assertTrue(object[10, 50] == None) + self.assertTrue(ob[10, 50] == None) def test(): - object = Test.MultiArgIndexerTest() - v = object[0, "one"] + ob = Test.MultiArgIndexerTest() + v = ob[0, "one"] self.assertRaises(TypeError, test) def test(): - object = Test.MultiArgIndexerTest() - object[0, "one"] = "wrong" + ob = Test.MultiArgIndexerTest() + ob[0, "one"] = "wrong" self.assertRaises(TypeError, test) def testMultiTypeIndexer(self): """Test indexers that take multiple indices of different types.""" - object = Test.MultiTypeIndexerTest() + ob = Test.MultiTypeIndexerTest() spam = Test.Spam("spam") - object[0, "one", spam] = "zero one spam" - self.assertTrue(object[0, "one", spam] == "zero one spam") + ob[0, "one", spam] = "zero one spam" + self.assertTrue(ob[0, "one", spam] == "zero one spam") - object[1, "nine", spam] = "one nine spam" - self.assertTrue(object[1, "nine", spam] == "one nine spam") + ob[1, "nine", spam] = "one nine spam" + self.assertTrue(ob[1, "nine", spam] == "one nine spam") def test(): - object = Test.MultiTypeIndexerTest() - v = object[0, 1, spam] + ob = Test.MultiTypeIndexerTest() + v = ob[0, 1, spam] self.assertRaises(TypeError, test) def test(): - object = Test.MultiTypeIndexerTest() - object[0, 1, spam] = "wrong" + ob = Test.MultiTypeIndexerTest() + ob[0, 1, spam] = "wrong" self.assertRaises(TypeError, test) def testMultiDefaultKeyIndexer(self): """Test indexers that take multiple indices with a default key arguments.""" # default argument is 2 in the MultiDefaultKeyIndexerTest object - object = Test.MultiDefaultKeyIndexerTest() - object[0, 2] = "zero one spam" - self.assertTrue(object[0] == "zero one spam") + ob = Test.MultiDefaultKeyIndexerTest() + ob[0, 2] = "zero one spam" + self.assertTrue(ob[0] == "zero one spam") - object[1] = "one nine spam" - self.assertTrue(object[1, 2] == "one nine spam") + ob[1] = "one nine spam" + self.assertTrue(ob[1, 2] == "one nine spam") def testIndexerWrongKeyType(self): """Test calling an indexer using a key of the wrong type.""" def test(): - object = Test.PublicIndexerTest() - v = object["wrong"] + ob = Test.PublicIndexerTest() + v = ob["wrong"] self.assertRaises(TypeError, test) def test(): - object = Test.PublicIndexerTest() - object["wrong"] = "spam" + ob = Test.PublicIndexerTest() + ob["wrong"] = "spam" self.assertRaises(TypeError, test) @@ -629,27 +629,27 @@ def testIndexerWrongValueType(self): """Test calling an indexer using a value of the wrong type.""" def test(): - object = Test.PublicIndexerTest() - object[1] = 9993.9 + ob = Test.PublicIndexerTest() + ob[1] = 9993.9 self.assertRaises(TypeError, test) def testUnboundIndexer(self): """Test calling an unbound indexer.""" - object = Test.PublicIndexerTest() + ob = Test.PublicIndexerTest() - Test.PublicIndexerTest.__setitem__(object, 0, "zero") - self.assertTrue(object[0] == "zero") + Test.PublicIndexerTest.__setitem__(ob, 0, "zero") + self.assertTrue(ob[0] == "zero") - Test.PublicIndexerTest.__setitem__(object, 1, "one") - self.assertTrue(object[1] == "one") + Test.PublicIndexerTest.__setitem__(ob, 1, "one") + self.assertTrue(ob[1] == "one") - self.assertTrue(object[10] == None) + self.assertTrue(ob[10] == None) def testIndexerAbuse(self): """Test indexer abuse.""" _class = Test.PublicIndexerTest - object = Test.PublicIndexerTest() + ob = Test.PublicIndexerTest() def test(): del _class.__getitem__ @@ -657,7 +657,7 @@ def test(): self.assertRaises(AttributeError, test) def test(): - del object.__getitem__ + del ob.__getitem__ self.assertRaises(AttributeError, test) @@ -667,7 +667,7 @@ def test(): self.assertRaises(AttributeError, test) def test(): - del object.__setitem__ + del ob.__setitem__ self.assertRaises(AttributeError, test) diff --git a/src/tests/test_method.py b/src/tests/test_method.py index 88652cd71..0430bb019 100644 --- a/src/tests/test_method.py +++ b/src/tests/test_method.py @@ -59,26 +59,26 @@ def test(): def testPublicInstanceMethod(self): """Test public instance method visibility.""" - object = MethodTest() - self.assertTrue(object.PublicMethod() == "public") + ob = MethodTest() + self.assertTrue(ob.PublicMethod() == "public") def testPublicStaticMethod(self): """Test public static method visibility.""" - object = MethodTest() + ob = MethodTest() self.assertTrue(MethodTest.PublicStaticMethod() == "public static") - self.assertTrue(object.PublicStaticMethod() == "public static") + self.assertTrue(ob.PublicStaticMethod() == "public static") def testProtectedInstanceMethod(self): """Test protected instance method visibility.""" - object = MethodTest() - self.assertTrue(object.ProtectedMethod() == "protected") + ob = MethodTest() + self.assertTrue(ob.ProtectedMethod() == "protected") def testProtectedStaticMethod(self): """Test protected static method visibility.""" - object = MethodTest() + ob = MethodTest() result = "protected static" self.assertTrue(MethodTest.ProtectedStaticMethod() == result) - self.assertTrue(object.ProtectedStaticMethod() == result) + self.assertTrue(ob.ProtectedStaticMethod() == result) def testInternalMethod(self): """Test internal method visibility.""" @@ -130,17 +130,17 @@ def testUnboundManagedMethodCall(self): """Test calling unbound managed methods.""" from Python.Test import MethodTestSub - object = MethodTest() - self.assertTrue(MethodTest.PublicMethod(object) == "public") + ob = MethodTest() + self.assertTrue(MethodTest.PublicMethod(ob) == "public") def test(): MethodTest.PublicMethod() self.assertRaises(TypeError, test) - object = MethodTestSub() - self.assertTrue(MethodTestSub.PublicMethod(object) == "public") - self.assertTrue(MethodTestSub.PublicMethod(object, "echo") == "echo") + ob = MethodTestSub() + self.assertTrue(MethodTestSub.PublicMethod(ob) == "public") + self.assertTrue(MethodTestSub.PublicMethod(ob, "echo") == "echo") def test(): MethodTestSub.PublicMethod("echo") @@ -151,19 +151,19 @@ def testOverloadedMethodInheritance(self): """Test that overloads are inherited properly.""" from Python.Test import MethodTestSub - object = MethodTest() - self.assertTrue(object.PublicMethod() == "public") + ob = MethodTest() + self.assertTrue(ob.PublicMethod() == "public") def test(): - object = MethodTest() - object.PublicMethod("echo") + ob = MethodTest() + ob.PublicMethod("echo") self.assertRaises(TypeError, test) - object = MethodTestSub() - self.assertTrue(object.PublicMethod() == "public") + ob = MethodTestSub() + self.assertTrue(ob.PublicMethod() == "public") - self.assertTrue(object.PublicMethod("echo") == "echo") + self.assertTrue(ob.PublicMethod("echo") == "echo") def testMethodDescriptorAbuse(self): """Test method descriptor abuse.""" @@ -193,27 +193,27 @@ def testMethodCallEnumConversion(self): """Test enum conversion in method call.""" from System import TypeCode - object = MethodTest() - r = object.TestEnumConversion(TypeCode.Int32) + ob = MethodTest() + r = ob.TestEnumConversion(TypeCode.Int32) self.assertTrue(r == TypeCode.Int32) def testMethodCallFlagsConversion(self): """Test flags conversion in method call.""" from System.IO import FileAccess - object = MethodTest() + ob = MethodTest() flags = FileAccess.Read | FileAccess.Write - r = object.TestFlagsConversion(flags) + r = ob.TestFlagsConversion(flags) self.assertTrue(r == flags) def testMethodCallStructConversion(self): """Test struct conversion in method call.""" from System import Guid - object = MethodTest() + ob = MethodTest() guid = Guid.NewGuid() temp = guid.ToString() - r = object.TestStructConversion(guid) + r = ob.TestStructConversion(guid) self.assertTrue(r.ToString() == temp) def testSubclassInstanceConversion(self): @@ -222,17 +222,17 @@ def testSubclassInstanceConversion(self): class TestSubException(System.Exception): pass - object = MethodTest() + ob = MethodTest() instance = TestSubException() - result = object.TestSubclassConversion(instance) + result = ob.TestSubclassConversion(instance) self.assertTrue(isinstance(result, System.Exception)) def testNullArrayConversion(self): """Test null array conversion in method call.""" from System import Type - object = MethodTest() - r = object.TestNullArrayConversion(None) + ob = MethodTest() + r = ob.TestNullArrayConversion(None) self.assertTrue(r == None) def testStringParamsArgs(self): diff --git a/src/tests/test_property.py b/src/tests/test_property.py index e5d7112ef..b0676f6b1 100644 --- a/src/tests/test_property.py +++ b/src/tests/test_property.py @@ -10,11 +10,11 @@ class PropertyTests(unittest.TestCase): def testPublicInstanceProperty(self): """Test public instance properties.""" - object = PropertyTest() + ob = PropertyTest() - self.assertTrue(object.PublicProperty == 0) - object.PublicProperty = 1 - self.assertTrue(object.PublicProperty == 1) + self.assertTrue(ob.PublicProperty == 0) + ob.PublicProperty = 1 + self.assertTrue(ob.PublicProperty == 1) def test(): del PropertyTest().PublicProperty @@ -23,15 +23,15 @@ def test(): def testPublicStaticProperty(self): """Test public static properties.""" - object = PropertyTest() + ob = PropertyTest() self.assertTrue(PropertyTest.PublicStaticProperty == 0) PropertyTest.PublicStaticProperty = 1 self.assertTrue(PropertyTest.PublicStaticProperty == 1) - self.assertTrue(object.PublicStaticProperty == 1) - object.PublicStaticProperty = 0 - self.assertTrue(object.PublicStaticProperty == 0) + self.assertTrue(ob.PublicStaticProperty == 1) + ob.PublicStaticProperty = 0 + self.assertTrue(ob.PublicStaticProperty == 0) def test(): del PropertyTest.PublicStaticProperty @@ -45,11 +45,11 @@ def test(): def testProtectedInstanceProperty(self): """Test protected instance properties.""" - object = PropertyTest() + ob = PropertyTest() - self.assertTrue(object.ProtectedProperty == 0) - object.ProtectedProperty = 1 - self.assertTrue(object.ProtectedProperty == 1) + self.assertTrue(ob.ProtectedProperty == 0) + ob.ProtectedProperty = 1 + self.assertTrue(ob.ProtectedProperty == 1) def test(): del PropertyTest().ProtectedProperty @@ -58,15 +58,15 @@ def test(): def testProtectedStaticProperty(self): """Test protected static properties.""" - object = PropertyTest() + ob = PropertyTest() self.assertTrue(PropertyTest.ProtectedStaticProperty == 0) PropertyTest.ProtectedStaticProperty = 1 self.assertTrue(PropertyTest.ProtectedStaticProperty == 1) - self.assertTrue(object.ProtectedStaticProperty == 1) - object.ProtectedStaticProperty = 0 - self.assertTrue(object.ProtectedStaticProperty == 0) + self.assertTrue(ob.ProtectedStaticProperty == 1) + ob.ProtectedStaticProperty = 0 + self.assertTrue(ob.ProtectedStaticProperty == 0) def test(): del PropertyTest.ProtectedStaticProperty @@ -82,17 +82,17 @@ def testInternalProperty(self): """Test internal properties.""" def test(): - f = PropertyTest().InternalProperty + return PropertyTest().InternalProperty self.assertRaises(AttributeError, test) def test(): - f = PropertyTest().InternalStaticProperty + return PropertyTest().InternalStaticProperty self.assertRaises(AttributeError, test) def test(): - f = PropertyTest.InternalStaticProperty + return PropertyTest.InternalStaticProperty self.assertRaises(AttributeError, test) @@ -100,17 +100,17 @@ def testPrivateProperty(self): """Test private properties.""" def test(): - f = PropertyTest().PrivateProperty + return PropertyTest().PrivateProperty self.assertRaises(AttributeError, test) def test(): - f = PropertyTest().PrivateStaticProperty + return PropertyTest().PrivateStaticProperty self.assertRaises(AttributeError, test) def test(): - f = PropertyTest.PrivateStaticProperty + return PropertyTest.PrivateStaticProperty self.assertRaises(AttributeError, test) @@ -121,15 +121,15 @@ def testPropertyDescriptorGetSet(self): # a descriptor actually goes through the descriptor (rather than # silently replacing the descriptor in the instance or type dict. - object = PropertyTest() + ob = PropertyTest() self.assertTrue(PropertyTest.PublicStaticProperty == 0) - self.assertTrue(object.PublicStaticProperty == 0) + self.assertTrue(ob.PublicStaticProperty == 0) descriptor = PropertyTest.__dict__['PublicStaticProperty'] self.assertTrue(type(descriptor) != int) - object.PublicStaticProperty = 0 + ob.PublicStaticProperty = 0 descriptor = PropertyTest.__dict__['PublicStaticProperty'] self.assertTrue(type(descriptor) != int) @@ -141,8 +141,8 @@ def testPropertyDescriptorWrongType(self): """Test setting a property using a value of the wrong type.""" def test(): - object = PropertyTest() - object.PublicProperty = "spam" + ob = PropertyTest() + ob.PublicProperty = "spam" self.assertTrue(TypeError, test) @@ -164,8 +164,8 @@ def testInterfaceProperty(self): """Test properties of interfaces. Added after a bug report that an IsAbstract check was inappropriate and prevented use of properties when only the interface is known.""" - from System.Collections import Hashtable, ICollection + mapping = Hashtable() coll = ICollection(mapping) self.assertTrue(coll.Count == 0) diff --git a/src/tests/test_subclass.py b/src/tests/test_subclass.py index 20938ba88..444d0a116 100644 --- a/src/tests/test_subclass.py +++ b/src/tests/test_subclass.py @@ -71,65 +71,65 @@ class SubClassTests(unittest.TestCase): def testBaseClass(self): """Test base class managed type""" - object = SubClassTest() - self.assertEqual(object.foo(), "foo") - self.assertEqual(TestFunctions.test_foo(object), "foo") - self.assertEqual(object.bar("bar", 2), "bar") - self.assertEqual(TestFunctions.test_bar(object, "bar", 2), "bar") - self.assertEqual(object.not_overriden(), "not_overriden") - self.assertEqual(list(object.return_list()), ["a", "b", "c"]) - self.assertEqual(list(SubClassTest.test_list(object)), ["a", "b", "c"]) + ob = SubClassTest() + self.assertEqual(ob.foo(), "foo") + self.assertEqual(TestFunctions.test_foo(ob), "foo") + self.assertEqual(ob.bar("bar", 2), "bar") + self.assertEqual(TestFunctions.test_bar(ob, "bar", 2), "bar") + self.assertEqual(ob.not_overriden(), "not_overriden") + self.assertEqual(list(ob.return_list()), ["a", "b", "c"]) + self.assertEqual(list(SubClassTest.test_list(ob)), ["a", "b", "c"]) def testInterface(self): """Test python classes can derive from C# interfaces""" - object = InterfaceTestClass() - self.assertEqual(object.foo(), "InterfaceTestClass") - self.assertEqual(TestFunctions.test_foo(object), "InterfaceTestClass") - self.assertEqual(object.bar("bar", 2), "bar/bar") - self.assertEqual(TestFunctions.test_bar(object, "bar", 2), "bar/bar") + ob = InterfaceTestClass() + self.assertEqual(ob.foo(), "InterfaceTestClass") + self.assertEqual(TestFunctions.test_foo(ob), "InterfaceTestClass") + self.assertEqual(ob.bar("bar", 2), "bar/bar") + self.assertEqual(TestFunctions.test_bar(ob, "bar", 2), "bar/bar") - x = TestFunctions.pass_through(object) - self.assertEqual(id(x), id(object)) + x = TestFunctions.pass_through(ob) + self.assertEqual(id(x), id(ob)) def testDerivedClass(self): """Test python class derived from managed type""" - object = DerivedClass() - self.assertEqual(object.foo(), "DerivedClass") - self.assertEqual(object.base_foo(), "foo") - self.assertEqual(object.super_foo(), "foo") - self.assertEqual(TestFunctions.test_foo(object), "DerivedClass") - self.assertEqual(object.bar("bar", 2), "bar_bar") - self.assertEqual(TestFunctions.test_bar(object, "bar", 2), "bar_bar") - self.assertEqual(object.not_overriden(), "not_overriden") - self.assertEqual(list(object.return_list()), ["A", "B", "C"]) - self.assertEqual(list(SubClassTest.test_list(object)), ["A", "B", "C"]) - - x = TestFunctions.pass_through(object) - self.assertEqual(id(x), id(object)) + ob = DerivedClass() + self.assertEqual(ob.foo(), "DerivedClass") + self.assertEqual(ob.base_foo(), "foo") + self.assertEqual(ob.super_foo(), "foo") + self.assertEqual(TestFunctions.test_foo(ob), "DerivedClass") + self.assertEqual(ob.bar("bar", 2), "bar_bar") + self.assertEqual(TestFunctions.test_bar(ob, "bar", 2), "bar_bar") + self.assertEqual(ob.not_overriden(), "not_overriden") + self.assertEqual(list(ob.return_list()), ["A", "B", "C"]) + self.assertEqual(list(SubClassTest.test_list(ob)), ["A", "B", "C"]) + + x = TestFunctions.pass_through(ob) + self.assertEqual(id(x), id(ob)) def testCreateInstance(self): """Test derived instances can be created from managed code""" - object = TestFunctions.create_instance(DerivedClass) - self.assertEqual(object.foo(), "DerivedClass") - self.assertEqual(TestFunctions.test_foo(object), "DerivedClass") - self.assertEqual(object.bar("bar", 2), "bar_bar") - self.assertEqual(TestFunctions.test_bar(object, "bar", 2), "bar_bar") - self.assertEqual(object.not_overriden(), "not_overriden") + ob = TestFunctions.create_instance(DerivedClass) + self.assertEqual(ob.foo(), "DerivedClass") + self.assertEqual(TestFunctions.test_foo(ob), "DerivedClass") + self.assertEqual(ob.bar("bar", 2), "bar_bar") + self.assertEqual(TestFunctions.test_bar(ob, "bar", 2), "bar_bar") + self.assertEqual(ob.not_overriden(), "not_overriden") - x = TestFunctions.pass_through(object) - self.assertEqual(id(x), id(object)) + x = TestFunctions.pass_through(ob) + self.assertEqual(id(x), id(ob)) - object2 = TestFunctions.create_instance(InterfaceTestClass) - self.assertEqual(object2.foo(), "InterfaceTestClass") - self.assertEqual(TestFunctions.test_foo(object2), "InterfaceTestClass") - self.assertEqual(object2.bar("bar", 2), "bar/bar") - self.assertEqual(TestFunctions.test_bar(object2, "bar", 2), "bar/bar") + ob2 = TestFunctions.create_instance(InterfaceTestClass) + self.assertEqual(ob2.foo(), "InterfaceTestClass") + self.assertEqual(TestFunctions.test_foo(ob2), "InterfaceTestClass") + self.assertEqual(ob2.bar("bar", 2), "bar/bar") + self.assertEqual(TestFunctions.test_bar(ob2, "bar", 2), "bar/bar") - y = TestFunctions.pass_through(object2) - self.assertEqual(id(y), id(object2)) + y = TestFunctions.pass_through(ob2) + self.assertEqual(id(y), id(ob2)) def testEvents(self): - class EventHandler: + class EventHandler(object): def handler(self, x, args): self.value = args.value From 11445f557f5adfdc702c8655862c4ac7156a720a Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 21 Jan 2017 21:10:12 -0700 Subject: [PATCH 039/324] Refactor utility functions --- src/tests/leaktest.py | 97 ++---------------- src/tests/test_class.py | 20 ++-- src/tests/test_compat.py | 54 ++++------ src/tests/test_delegate.py | 66 +++--------- src/tests/test_event.py | 83 ++------------- src/tests/test_generic.py | 202 +++++++++++++++++++------------------ src/tests/test_indexer.py | 2 +- src/tests/test_module.py | 60 +++++------ src/tests/utils.py | 132 ++++++++++++++++++++++++ 9 files changed, 315 insertions(+), 401 deletions(-) create mode 100644 src/tests/utils.py diff --git a/src/tests/leaktest.py b/src/tests/leaktest.py index 43a0e83a7..666e6e276 100644 --- a/src/tests/leaktest.py +++ b/src/tests/leaktest.py @@ -6,10 +6,14 @@ import clr import gc +import sys import System from _compat import range +from utils import (CallableHandler, ClassMethodHandler, GenericHandler, + HelloClass, StaticMethodHandler, VarCallableHandler, + VariableArgsHandler, hello_func) class LeakTest(object): @@ -53,7 +57,6 @@ def run(self): self.testDelegates() def report(self): - import sys, gc gc.collect() dicttype = type({}) for item in gc.get_objects(): @@ -78,7 +81,6 @@ def testModules(self): def testClasses(self): from System.Collections import Hashtable from Python.Test import StringDelegate - from System import Int32 self.notify("Running class leak check...") @@ -91,7 +93,7 @@ def testClasses(self): del x # Value type - x = Int32(99) + x = System.Int32(99) del x # Delegate type @@ -101,7 +103,7 @@ def testClasses(self): self.end_test() def testEnumerations(self): - from Python import Test + import Python.Test as Test self.notify("Running enum leak check...") @@ -215,7 +217,6 @@ def handler(sender, args, dict=dict): def testDelegates(self): from Python.Test import DelegateTest, StringDelegate - import System self.notify("Running delegate leak check...") @@ -326,92 +327,6 @@ def testDelegates(self): self.end_test() -class GenericHandler(object): - """A generic handler to test event callbacks.""" - - def __init__(self): - self.value = None - - def handler(self, sender, args): - self.value = args.value - - -class VariableArgsHandler(object): - """A variable args handler to test event callbacks.""" - - def __init__(self): - self.value = None - - def handler(self, *args): - ob, eventargs = args - self.value = eventargs.value - - -class CallableHandler(object): - """A callable handler to test event callbacks.""" - - def __init__(self): - self.value = None - - def __call__(self, sender, args): - self.value = args.value - - -class VarCallableHandler(object): - """A variable args callable handler to test event callbacks.""" - - def __init__(self): - self.value = None - - def __call__(self, *args): - ob, eventargs = args - self.value = eventargs.value - - -class StaticMethodHandler(object): - """A static method handler to test event callbacks.""" - - value = None - - def handler(sender, args): - StaticMethodHandler.value = args.value - - handler = staticmethod(handler) - - -class ClassMethodHandler(object): - """A class method handler to test event callbacks.""" - - value = None - - def handler(cls, sender, args): - cls.value = args.value - - handler = classmethod(handler) - - -class HelloClass(object): - def hello(self): - return "hello" - - def __call__(self): - return "hello" - - def s_hello(): - return "hello" - - s_hello = staticmethod(s_hello) - - def c_hello(cls): - return "hello" - - c_hello = classmethod(c_hello) - - -def hello_func(): - return "hello" - - if __name__ == '__main__': test = LeakTest() test.run() diff --git a/src/tests/test_class.py b/src/tests/test_class.py index 169683883..b681c3a11 100644 --- a/src/tests/test_class.py +++ b/src/tests/test_class.py @@ -8,6 +8,16 @@ from _compat import DictProxyType, range +class ClassicClass: + def kind(self): + return 'classic' + + +class NewStyleClass(object): + def kind(self): + return 'new-style' + + class ClassTests(unittest.TestCase): """Test CLR class support.""" @@ -273,15 +283,5 @@ def PyCallback(self, self2): self.assertTrue(testobj.SameReference) -class ClassicClass: - def kind(self): - return 'classic' - - -class NewStyleClass(object): - def kind(self): - return 'new-style' - - def test_suite(): return unittest.makeSuite(ClassTests) diff --git a/src/tests/test_compat.py b/src/tests/test_compat.py index f89aceece..fbdd5260e 100644 --- a/src/tests/test_compat.py +++ b/src/tests/test_compat.py @@ -4,32 +4,18 @@ import unittest from _compat import ClassType, PY2, PY3, range +from utils import isCLRClass, isCLRModule, isCLRRootModule class CompatibilityTests(unittest.TestCase): - """ - Backward-compatibility tests for deprecated features. - """ - - def isCLRModule(self, object): - return type(object).__name__ == 'ModuleObject' - - def isCLRRootModule(self, object): - if PY3: - # in Python 3 the clr module is a normal python module - return object.__name__ == "clr" - elif PY2: - return type(object).__name__ == 'CLRModule' - - def isCLRClass(self, object): - return type(object).__name__ == 'CLR Metatype' # for now + """Backward-compatibility tests for deprecated features.""" # Tests for old-style CLR-prefixed module naming. def testSimpleImport(self): """Test simple import.""" import CLR - self.assertTrue(self.isCLRRootModule(CLR)) + self.assertTrue(isCLRRootModule(CLR)) self.assertTrue(CLR.__name__ == 'clr') import sys @@ -49,7 +35,7 @@ def testSimpleImport(self): def testSimpleImportWithAlias(self): """Test simple import with aliasing.""" import CLR as myCLR - self.assertTrue(self.isCLRRootModule(myCLR)) + self.assertTrue(isCLRRootModule(myCLR)) self.assertTrue(myCLR.__name__ == 'clr') import sys as mySys @@ -69,11 +55,11 @@ def testSimpleImportWithAlias(self): def testDottedNameImport(self): """Test dotted-name import.""" import CLR.System - self.assertTrue(self.isCLRModule(CLR.System)) + self.assertTrue(isCLRModule(CLR.System)) self.assertTrue(CLR.System.__name__ == 'System') import System - self.assertTrue(self.isCLRModule(System)) + self.assertTrue(isCLRModule(System)) self.assertTrue(System.__name__ == 'System') self.assertTrue(System is CLR.System) @@ -85,11 +71,11 @@ def testDottedNameImport(self): def testDottedNameImportWithAlias(self): """Test dotted-name import with aliasing.""" import CLR.System as myCLRSystem - self.assertTrue(self.isCLRModule(myCLRSystem)) + self.assertTrue(isCLRModule(myCLRSystem)) self.assertTrue(myCLRSystem.__name__ == 'System') import System as mySystem - self.assertTrue(self.isCLRModule(mySystem)) + self.assertTrue(isCLRModule(mySystem)) self.assertTrue(mySystem.__name__ == 'System') self.assertTrue(mySystem is myCLRSystem) @@ -101,7 +87,7 @@ def testDottedNameImportWithAlias(self): def testSimpleImportFrom(self): """Test simple 'import from'.""" from CLR import System - self.assertTrue(self.isCLRModule(System)) + self.assertTrue(isCLRModule(System)) self.assertTrue(System.__name__ == 'System') from xml import dom @@ -111,7 +97,7 @@ def testSimpleImportFrom(self): def testSimpleImportFromWithAlias(self): """Test simple 'import from' with aliasing.""" from CLR import System as mySystem - self.assertTrue(self.isCLRModule(mySystem)) + self.assertTrue(isCLRModule(mySystem)) self.assertTrue(mySystem.__name__ == 'System') from xml import dom as myDom @@ -121,11 +107,11 @@ def testSimpleImportFromWithAlias(self): def testDottedNameImportFrom(self): """Test dotted-name 'import from'.""" from CLR.System import Xml - self.assertTrue(self.isCLRModule(Xml)) + self.assertTrue(isCLRModule(Xml)) self.assertTrue(Xml.__name__ == 'System.Xml') from CLR.System.Xml import XmlDocument - self.assertTrue(self.isCLRClass(XmlDocument)) + self.assertTrue(isCLRClass(XmlDocument)) self.assertTrue(XmlDocument.__name__ == 'XmlDocument') from xml.dom import pulldom @@ -139,11 +125,11 @@ def testDottedNameImportFrom(self): def testDottedNameImportFromWithAlias(self): """Test dotted-name 'import from' with aliasing.""" from CLR.System import Xml as myXml - self.assertTrue(self.isCLRModule(myXml)) + self.assertTrue(isCLRModule(myXml)) self.assertTrue(myXml.__name__ == 'System.Xml') from CLR.System.Xml import XmlDocument as myXmlDocument - self.assertTrue(self.isCLRClass(myXmlDocument)) + self.assertTrue(isCLRClass(myXmlDocument)) self.assertTrue(myXmlDocument.__name__ == 'XmlDocument') from xml.dom import pulldom as myPulldom @@ -159,12 +145,12 @@ def testFromModuleImportStar(self): count = len(locals().keys()) m = __import__('CLR.System.Management', globals(), locals(), ['*']) self.assertTrue(m.__name__ == 'System.Management') - self.assertTrue(self.isCLRModule(m)) + self.assertTrue(isCLRModule(m)) self.assertTrue(len(locals().keys()) > count + 1) m2 = __import__('System.Management', globals(), locals(), ['*']) self.assertTrue(m2.__name__ == 'System.Management') - self.assertTrue(self.isCLRModule(m2)) + self.assertTrue(isCLRModule(m2)) self.assertTrue(len(locals().keys()) > count + 1) self.assertTrue(m is m2) @@ -193,7 +179,7 @@ def testImplicitLoadAlreadyValidNamespace(self): # Python runtime to "do the right thing", allowing types from both # assemblies to be found in the CLR.System module implicitly. import CLR.System - self.assertTrue(self.isCLRClass(CLR.System.UriBuilder)) + self.assertTrue(isCLRClass(CLR.System.UriBuilder)) def testImportNonExistantModule(self): """Test import failure for a non-existant module.""" @@ -211,7 +197,7 @@ def testLookupNoNamespaceType(self): """Test lookup of types without a qualified namespace.""" import CLR.Python.Test import CLR - self.assertTrue(self.isCLRClass(CLR.NoNamespaceType)) + self.assertTrue(isCLRClass(CLR.NoNamespaceType)) def testModuleLookupRecursion(self): """Test for recursive lookup handling.""" @@ -232,10 +218,10 @@ def testModuleGetAttr(self): import CLR.System as System int_type = System.Int32 - self.assertTrue(self.isCLRClass(int_type)) + self.assertTrue(isCLRClass(int_type)) module = System.Xml - self.assertTrue(self.isCLRModule(module)) + self.assertTrue(isCLRModule(module)) def test(): spam = System.Spam diff --git a/src/tests/test_delegate.py b/src/tests/test_delegate.py index df371ca9a..33940caca 100644 --- a/src/tests/test_delegate.py +++ b/src/tests/test_delegate.py @@ -8,6 +8,7 @@ from Python.Test import DelegateTest, StringDelegate from _compat import DictProxyType +from utils import HelloClass, hello_func, MultipleHandler class DelegateTests(unittest.TestCase): @@ -60,10 +61,7 @@ def test(): def testDelegateFromFunction(self): """Test delegate implemented with a Python function.""" - def sayhello(): - return "hello" - - d = StringDelegate(sayhello) + d = StringDelegate(hello_func) ob = DelegateTest() self.assertTrue(ob.CallStringDelegate(d) == "hello") @@ -76,12 +74,8 @@ def sayhello(): def testDelegateFromMethod(self): """Test delegate implemented with a Python instance method.""" - class Hello: - def sayhello(self): - return "hello" - - inst = Hello() - d = StringDelegate(inst.sayhello) + inst = HelloClass() + d = StringDelegate(inst.hello) ob = DelegateTest() self.assertTrue(ob.CallStringDelegate(d) == "hello") @@ -94,12 +88,8 @@ def sayhello(self): def testDelegateFromUnboundMethod(self): """Test failure mode for unbound methods.""" - class Hello: - def sayhello(self): - return "hello" - def test(): - d = StringDelegate(Hello.sayhello) + d = StringDelegate(HelloClass.hello) d() self.assertRaises(TypeError, test) @@ -107,13 +97,7 @@ def test(): def testDelegateFromStaticMethod(self): """Test delegate implemented with a Python static method.""" - class Hello: - def sayhello(): - return "hello" - - sayhello = staticmethod(sayhello) - - d = StringDelegate(Hello.sayhello) + d = StringDelegate(HelloClass.s_hello) ob = DelegateTest() self.assertTrue(ob.CallStringDelegate(d) == "hello") @@ -123,8 +107,8 @@ def sayhello(): self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") self.assertTrue(ob.stringDelegate() == "hello") - inst = Hello() - d = StringDelegate(inst.sayhello) + inst = HelloClass() + d = StringDelegate(inst.s_hello) ob = DelegateTest() self.assertTrue(ob.CallStringDelegate(d) == "hello") @@ -137,13 +121,7 @@ def sayhello(): def testDelegateFromClassMethod(self): """Test delegate implemented with a Python class method.""" - class Hello: - def sayhello(self): - return "hello" - - sayhello = classmethod(sayhello) - - d = StringDelegate(Hello.sayhello) + d = StringDelegate(HelloClass.c_hello) ob = DelegateTest() self.assertTrue(ob.CallStringDelegate(d) == "hello") @@ -153,8 +131,8 @@ def sayhello(self): self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") self.assertTrue(ob.stringDelegate() == "hello") - inst = Hello() - d = StringDelegate(inst.sayhello) + inst = HelloClass() + d = StringDelegate(inst.c_hello) ob = DelegateTest() self.assertTrue(ob.CallStringDelegate(d) == "hello") @@ -167,11 +145,7 @@ def sayhello(self): def testDelegateFromCallable(self): """Test delegate implemented with a Python callable object.""" - class Hello: - def __call__(self): - return "hello" - - inst = Hello() + inst = HelloClass() d = StringDelegate(inst) ob = DelegateTest() @@ -208,11 +182,7 @@ def testDelegateFromManagedStaticMethod(self): def testDelegateFromDelegate(self): """Test delegate implemented with another delegate.""" - - def sayhello(): - return "hello" - - d1 = StringDelegate(sayhello) + d1 = StringDelegate(hello_func) d2 = StringDelegate(d1) ob = DelegateTest() @@ -244,15 +214,7 @@ def test(): def testMulticastDelegate(self): """Test multicast delegates.""" - class Multi: - def __init__(self): - self.value = 0 - - def count(self): - self.value += 1 - return 'ok' - - inst = Multi() + inst = MultipleHandler() d1 = StringDelegate(inst.count) d2 = StringDelegate(inst.count) diff --git a/src/tests/test_event.py b/src/tests/test_event.py index 008b6b20a..858069f6c 100644 --- a/src/tests/test_event.py +++ b/src/tests/test_event.py @@ -5,6 +5,9 @@ from Python.Test import EventTest, TestEventArgs from _compat import range +from utils import (CallableHandler, ClassMethodHandler, GenericHandler, + MultipleHandler, StaticMethodHandler, VarCallableHandler, + VariableArgsHandler) class EventTests(unittest.TestCase): @@ -311,7 +314,7 @@ def test(): self.assertRaises(TypeError, test) def test(): - class spam: + class spam(object): pass ob = EventTest() @@ -486,7 +489,7 @@ def test(): def testHandlerCallbackFailure(self): """Test failure mode for inappropriate handlers.""" - class BadHandler: + class BadHandler(object): def handler(self, one): return 'too many' @@ -501,7 +504,7 @@ def test(): ob.PublicEvent -= handler.handler - class BadHandler: + class BadHandler(object): def handler(self, one, two, three, four, five): return 'not enough' @@ -602,79 +605,5 @@ def test(): self.assertRaises(TypeError, test) -class GenericHandler: - """A generic handler to test event callbacks.""" - - def __init__(self): - self.value = None - - def handler(self, sender, args): - self.value = args.value - - -class VariableArgsHandler: - """A variable args handler to test event callbacks.""" - - def __init__(self): - self.value = None - - def handler(self, *args): - ob, eventargs = args - self.value = eventargs.value - - -class CallableHandler: - """A callable handler to test event callbacks.""" - - def __init__(self): - self.value = None - - def __call__(self, sender, args): - self.value = args.value - - -class VarCallableHandler: - """A variable args callable handler to test event callbacks.""" - - def __init__(self): - self.value = None - - def __call__(self, *args): - ob, eventargs = args - self.value = eventargs.value - - -class StaticMethodHandler(object): - """A static method handler to test event callbacks.""" - - value = None - - def handler(sender, args): - StaticMethodHandler.value = args.value - - handler = staticmethod(handler) - - -class ClassMethodHandler(object): - """A class method handler to test event callbacks.""" - - value = None - - def handler(cls, sender, args): - cls.value = args.value - - handler = classmethod(handler) - - -class MultipleHandler: - """A generic handler to test multiple callbacks.""" - - def __init__(self): - self.value = 0 - - def handler(self, sender, args): - self.value += args.value - - def test_suite(): return unittest.makeSuite(EventTests) diff --git a/src/tests/test_generic.py b/src/tests/test_generic.py index 67af8acb4..536a2bb7f 100644 --- a/src/tests/test_generic.py +++ b/src/tests/test_generic.py @@ -11,6 +11,107 @@ class GenericTests(unittest.TestCase): """Test CLR generics support.""" + def _testGenericWrapperByType(self, ptype, value): + """Test Helper""" + from Python.Test import GenericWrapper + import System + + inst = GenericWrapper[ptype](value) + self.assertTrue(inst.value == value) + + atype = System.Array[ptype] + items = atype([value, value, value]) + inst = GenericWrapper[atype](items) + self.assertTrue(len(inst.value) == 3) + self.assertTrue(inst.value[0] == value) + self.assertTrue(inst.value[1] == value) + + def _testGenericMethodByType(self, ptype, value, test_type=0): + """Test Helper""" + from Python.Test import GenericMethodTest, GenericStaticMethodTest + import System + + itype = GenericMethodTest[System.Type] + stype = GenericStaticMethodTest[System.Type] + + # Explicit selection (static method) + result = stype.Overloaded[ptype](value) + if test_type: + self.assertTrue(result.__class__ == value.__class__) + else: + self.assertTrue(result == value) + + # Type inference (static method) + result = stype.Overloaded(value) + self.assertTrue(result == value) + if test_type: + self.assertTrue(result.__class__ == value.__class__) + else: + self.assertTrue(result == value) + + # Explicit selection (instance method) + result = itype().Overloaded[ptype](value) + self.assertTrue(result == value) + if test_type: + self.assertTrue(result.__class__ == value.__class__) + else: + self.assertTrue(result == value) + + # Type inference (instance method) + result = itype().Overloaded(value) + self.assertTrue(result == value) + if test_type: + self.assertTrue(result.__class__ == value.__class__) + else: + self.assertTrue(result == value) + + atype = System.Array[ptype] + items = atype([value, value, value]) + + # Explicit selection (static method) + result = stype.Overloaded[atype](items) + if test_type: + self.assertTrue(len(result) == 3) + self.assertTrue(result[0].__class__ == value.__class__) + self.assertTrue(result[1].__class__ == value.__class__) + else: + self.assertTrue(len(result) == 3) + self.assertTrue(result[0] == value) + self.assertTrue(result[1] == value) + + # Type inference (static method) + result = stype.Overloaded(items) + if test_type: + self.assertTrue(len(result) == 3) + self.assertTrue(result[0].__class__ == value.__class__) + self.assertTrue(result[1].__class__ == value.__class__) + else: + self.assertTrue(len(result) == 3) + self.assertTrue(result[0] == value) + self.assertTrue(result[1] == value) + + # Explicit selection (instance method) + result = itype().Overloaded[atype](items) + if test_type: + self.assertTrue(len(result) == 3) + self.assertTrue(result[0].__class__ == value.__class__) + self.assertTrue(result[1].__class__ == value.__class__) + else: + self.assertTrue(len(result) == 3) + self.assertTrue(result[0] == value) + self.assertTrue(result[1] == value) + + # Type inference (instance method) + result = itype().Overloaded(items) + if test_type: + self.assertTrue(len(result) == 3) + self.assertTrue(result[0].__class__ == value.__class__) + self.assertTrue(result[1].__class__ == value.__class__) + else: + self.assertTrue(len(result) == 3) + self.assertTrue(result[0] == value) + self.assertTrue(result[1] == value) + def testPythonTypeAliasing(self): """Test python type alias support with generics.""" from System.Collections.Generic import Dictionary @@ -80,9 +181,11 @@ def testGenericValueType(self): self.assertTrue(inst.Value == 10) def testGenericInterface(self): + # TODO NotImplemented pass def testGenericDelegate(self): + # TODO NotImplemented pass def testOpenGenericType(self): @@ -138,20 +241,6 @@ def test(): self.assertTrue(_class().value == 2) self.assertTrue(_class.value == 2) - def _testGenericWrapperByType(self, ptype, value, test_type=0): - from Python.Test import GenericWrapper - import System - - inst = GenericWrapper[ptype](value) - self.assertTrue(inst.value == value) - - atype = System.Array[ptype] - items = atype([value, value, value]) - inst = GenericWrapper[atype](items) - self.assertTrue(len(inst.value) == 3) - self.assertTrue(inst.value[0] == value) - self.assertTrue(inst.value[1] == value) - def testGenericTypeBinding(self): """Test argument conversion / binding for generic methods.""" from Python.Test import InterfaceTest, ISayHello1, ShortEnum @@ -184,91 +273,6 @@ def testGenericTypeBinding(self): self._testGenericWrapperByType(InterfaceTest, InterfaceTest()) self._testGenericWrapperByType(ISayHello1, InterfaceTest()) - def _testGenericMethodByType(self, ptype, value, test_type=0): - from Python.Test import GenericMethodTest, GenericStaticMethodTest - import System - - itype = GenericMethodTest[System.Type] - stype = GenericStaticMethodTest[System.Type] - - # Explicit selection (static method) - result = stype.Overloaded[ptype](value) - if test_type: - self.assertTrue(result.__class__ == value.__class__) - else: - self.assertTrue(result == value) - - # Type inference (static method) - result = stype.Overloaded(value) - self.assertTrue(result == value) - if test_type: - self.assertTrue(result.__class__ == value.__class__) - else: - self.assertTrue(result == value) - - # Explicit selection (instance method) - result = itype().Overloaded[ptype](value) - self.assertTrue(result == value) - if test_type: - self.assertTrue(result.__class__ == value.__class__) - else: - self.assertTrue(result == value) - - # Type inference (instance method) - result = itype().Overloaded(value) - self.assertTrue(result == value) - if test_type: - self.assertTrue(result.__class__ == value.__class__) - else: - self.assertTrue(result == value) - - atype = System.Array[ptype] - items = atype([value, value, value]) - - # Explicit selection (static method) - result = stype.Overloaded[atype](items) - if test_type: - self.assertTrue(len(result) == 3) - self.assertTrue(result[0].__class__ == value.__class__) - self.assertTrue(result[1].__class__ == value.__class__) - else: - self.assertTrue(len(result) == 3) - self.assertTrue(result[0] == value) - self.assertTrue(result[1] == value) - - # Type inference (static method) - result = stype.Overloaded(items) - if test_type: - self.assertTrue(len(result) == 3) - self.assertTrue(result[0].__class__ == value.__class__) - self.assertTrue(result[1].__class__ == value.__class__) - else: - self.assertTrue(len(result) == 3) - self.assertTrue(result[0] == value) - self.assertTrue(result[1] == value) - - # Explicit selection (instance method) - result = itype().Overloaded[atype](items) - if test_type: - self.assertTrue(len(result) == 3) - self.assertTrue(result[0].__class__ == value.__class__) - self.assertTrue(result[1].__class__ == value.__class__) - else: - self.assertTrue(len(result) == 3) - self.assertTrue(result[0] == value) - self.assertTrue(result[1] == value) - - # Type inference (instance method) - result = itype().Overloaded(items) - if test_type: - self.assertTrue(len(result) == 3) - self.assertTrue(result[0].__class__ == value.__class__) - self.assertTrue(result[1].__class__ == value.__class__) - else: - self.assertTrue(len(result) == 3) - self.assertTrue(result[0] == value) - self.assertTrue(result[1] == value) - def testGenericMethodBinding(self): from Python.Test import GenericMethodTest, GenericStaticMethodTest from System import InvalidOperationException diff --git a/src/tests/test_indexer.py b/src/tests/test_indexer.py index 4e631de4f..eaa02abd0 100644 --- a/src/tests/test_indexer.py +++ b/src/tests/test_indexer.py @@ -490,7 +490,7 @@ def testObjectIndexer(self): self.assertTrue(ob[long(1)] == "long") def test(): - class eggs: + class eggs(object): pass key = eggs() diff --git a/src/tests/test_module.py b/src/tests/test_module.py index a2624fc4c..4748c0497 100644 --- a/src/tests/test_module.py +++ b/src/tests/test_module.py @@ -7,38 +7,24 @@ from fnmatch import fnmatch from _compat import ClassType, PY2, PY3, range +from utils import isCLRClass, isCLRModule, isCLRRootModule # testImplicitAssemblyLoad() passes on deprecation warning; perfect! # # clr.AddReference('System.Windows.Forms') - class ModuleTests(unittest.TestCase): """Test CLR modules and the CLR import hook.""" - def isCLRModule(self, object): - return type(object).__name__ == 'ModuleObject' - - def isCLRRootModule(self, object): - if PY3: - # in Python 3 the clr module is a normal python module - return object.__name__ == "clr" - elif PY2: - return type(object).__name__ == 'CLRModule' - - def isCLRClass(self, object): - return type(object).__name__ == 'CLR Metatype' # for now - def testAAAImportHookWorks(self): """Test that the import hook works correctly both using the included runtime and an external runtime. This must be the first test run in the unit tests!""" - from System import String def test000importClr(self): import clr - self.assertTrue(self.isCLRRootModule(clr)) + self.assertTrue(isCLRRootModule(clr)) def testVersionClr(self): import clr @@ -74,13 +60,13 @@ def testModuleInterface(self): self.assertTrue(fnmatch(system_file, "*System*.dll") or fnmatch(system_file, "*mscorlib.dll"), "unexpected System.__file__: " + system_file) self.assertTrue(System.__doc__.startswith("Namespace containing types from the following assemblies:")) - self.assertTrue(self.isCLRClass(System.String)) - self.assertTrue(self.isCLRClass(System.Int32)) + self.assertTrue(isCLRClass(System.String)) + self.assertTrue(isCLRClass(System.Int32)) def testSimpleImport(self): """Test simple import.""" import System - self.assertTrue(self.isCLRModule(System)) + self.assertTrue(isCLRModule(System)) self.assertTrue(System.__name__ == 'System') import sys @@ -99,7 +85,7 @@ def testSimpleImport(self): def testSimpleImportWithAlias(self): """Test simple import with aliasing.""" import System as mySystem - self.assertTrue(self.isCLRModule(mySystem)) + self.assertTrue(isCLRModule(mySystem)) self.assertTrue(mySystem.__name__ == 'System') import sys as mySys @@ -118,7 +104,7 @@ def testSimpleImportWithAlias(self): def testDottedNameImport(self): """Test dotted-name import.""" import System.Reflection - self.assertTrue(self.isCLRModule(System.Reflection)) + self.assertTrue(isCLRModule(System.Reflection)) self.assertTrue(System.Reflection.__name__ == 'System.Reflection') import xml.dom @@ -128,16 +114,16 @@ def testDottedNameImport(self): def testMultipleDottedNameImport(self): """Test an import bug with multiple dotted imports.""" import System.Data - self.assertTrue(self.isCLRModule(System.Data)) + self.assertTrue(isCLRModule(System.Data)) self.assertTrue(System.Data.__name__ == 'System.Data') import System.Data - self.assertTrue(self.isCLRModule(System.Data)) + self.assertTrue(isCLRModule(System.Data)) self.assertTrue(System.Data.__name__ == 'System.Data') def testDottedNameImportWithAlias(self): """Test dotted-name import with aliasing.""" import System.Reflection as SysRef - self.assertTrue(self.isCLRModule(SysRef)) + self.assertTrue(isCLRModule(SysRef)) self.assertTrue(SysRef.__name__ == 'System.Reflection') import xml.dom as myDom @@ -147,7 +133,7 @@ def testDottedNameImportWithAlias(self): def testSimpleImportFrom(self): """Test simple 'import from'.""" from System import Reflection - self.assertTrue(self.isCLRModule(Reflection)) + self.assertTrue(isCLRModule(Reflection)) self.assertTrue(Reflection.__name__ == 'System.Reflection') from xml import dom @@ -157,7 +143,7 @@ def testSimpleImportFrom(self): def testSimpleImportFromWithAlias(self): """Test simple 'import from' with aliasing.""" from System import Collections as Coll - self.assertTrue(self.isCLRModule(Coll)) + self.assertTrue(isCLRModule(Coll)) self.assertTrue(Coll.__name__ == 'System.Collections') from xml import dom as myDom @@ -167,13 +153,13 @@ def testSimpleImportFromWithAlias(self): def testDottedNameImportFrom(self): """Test dotted-name 'import from'.""" from System.Collections import Specialized - self.assertTrue(self.isCLRModule(Specialized)) + self.assertTrue(isCLRModule(Specialized)) self.assertTrue( Specialized.__name__ == 'System.Collections.Specialized' ) from System.Collections.Specialized import StringCollection - self.assertTrue(self.isCLRClass(StringCollection)) + self.assertTrue(isCLRClass(StringCollection)) self.assertTrue(StringCollection.__name__ == 'StringCollection') from xml.dom import pulldom @@ -187,11 +173,11 @@ def testDottedNameImportFrom(self): def testDottedNameImportFromWithAlias(self): """Test dotted-name 'import from' with aliasing.""" from System.Collections import Specialized as Spec - self.assertTrue(self.isCLRModule(Spec)) + self.assertTrue(isCLRModule(Spec)) self.assertTrue(Spec.__name__ == 'System.Collections.Specialized') from System.Collections.Specialized import StringCollection as SC - self.assertTrue(self.isCLRClass(SC)) + self.assertTrue(isCLRClass(SC)) self.assertTrue(SC.__name__ == 'StringCollection') from xml.dom import pulldom as myPulldom @@ -207,7 +193,7 @@ def testFromModuleImportStar(self): count = len(locals().keys()) m = __import__('System.Xml', globals(), locals(), ['*']) self.assertTrue(m.__name__ == 'System.Xml') - self.assertTrue(self.isCLRModule(m)) + self.assertTrue(isCLRModule(m)) self.assertTrue(len(locals().keys()) > count + 1) def testImplicitAssemblyLoad(self): @@ -225,10 +211,10 @@ def testImplicitAssemblyLoad(self): with warnings.catch_warnings(record=True) as w: clr.AddReference("System.Windows.Forms") import System.Windows.Forms as Forms - self.assertTrue(self.isCLRModule(Forms)) + self.assertTrue(isCLRModule(Forms)) self.assertTrue(Forms.__name__ == 'System.Windows.Forms') from System.Windows.Forms import Form - self.assertTrue(self.isCLRClass(Form)) + self.assertTrue(isCLRClass(Form)) self.assertTrue(Form.__name__ == 'Form') self.assertEqual(len(w), 0) @@ -255,7 +241,7 @@ def testImplicitLoadAlreadyValidNamespace(self): # Python runtime to "do the right thing", allowing types from both # assemblies to be found in the System module implicitly. import System - self.assertTrue(self.isCLRClass(System.UriBuilder)) + self.assertTrue(isCLRClass(System.UriBuilder)) def testImportNonExistantModule(self): """Test import failure for a non-existant module.""" @@ -269,7 +255,7 @@ def testLookupNoNamespaceType(self): """Test lookup of types without a qualified namespace.""" import Python.Test import clr - self.assertTrue(self.isCLRClass(clr.NoNamespaceType)) + self.assertTrue(isCLRClass(clr.NoNamespaceType)) def testModuleLookupRecursion(self): """Test for recursive lookup handling.""" @@ -290,10 +276,10 @@ def testModuleGetAttr(self): import System int_type = System.Int32 - self.assertTrue(self.isCLRClass(int_type)) + self.assertTrue(isCLRClass(int_type)) module = System.Xml - self.assertTrue(self.isCLRModule(module)) + self.assertTrue(isCLRModule(module)) def test(): spam = System.Spam diff --git a/src/tests/utils.py b/src/tests/utils.py new file mode 100644 index 000000000..dd4d8767d --- /dev/null +++ b/src/tests/utils.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- + +"""Tests Utilities + +Refactor utility functions and classes +""" + +from _compat import PY2, PY3 + + +def isCLRModule(ob): + return type(ob).__name__ == 'ModuleObject' + + +def isCLRRootModule(ob): + if PY3: + # in Python 3 the clr module is a normal python module + return ob.__name__ == "clr" + elif PY2: + return type(ob).__name__ == 'CLRModule' + + +def isCLRClass(ob): + return type(ob).__name__ == 'CLR Metatype' # for now + + +class ClassicClass: + def kind(self): + return "classic" + + +class NewStyleClass(object): + def kind(self): + return "new-style" + + +class GenericHandler(object): + """A generic handler to test event callbacks.""" + + def __init__(self): + self.value = None + + def handler(self, sender, args): + self.value = args.value + + +class VariableArgsHandler(object): + """A variable args handler to test event callbacks.""" + + def __init__(self): + self.value = None + + def handler(self, *args): + ob, eventargs = args + self.value = eventargs.value + + +class CallableHandler(object): + """A callable handler to test event callbacks.""" + + def __init__(self): + self.value = None + + def __call__(self, sender, args): + self.value = args.value + + +class VarCallableHandler(object): + """A variable args callable handler to test event callbacks.""" + + def __init__(self): + self.value = None + + def __call__(self, *args): + ob, eventargs = args + self.value = eventargs.value + + +class StaticMethodHandler(object): + """A static method handler to test event callbacks.""" + + value = None + + def handler(sender, args): + StaticMethodHandler.value = args.value + + handler = staticmethod(handler) + + +class ClassMethodHandler(object): + """A class method handler to test event callbacks.""" + + value = None + + def handler(cls, sender, args): + cls.value = args.value + + handler = classmethod(handler) + + +class MultipleHandler(object): + """A generic handler to test multiple callbacks.""" + + def __init__(self): + self.value = 0 + + def handler(self, sender, args): + self.value += args.value + + def count(self): + self.value += 1 + return 'ok' + + +class HelloClass(object): + def hello(self): + return "hello" + + def __call__(self): + return "hello" + + @staticmethod + def s_hello(): + return "hello" + + @classmethod + def c_hello(cls): + return "hello" + + +def hello_func(): + return "hello" From 6bb0255fe0033ec90b5d6fe0bbacde220ed5043b Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 21 Jan 2017 23:18:16 -0700 Subject: [PATCH 040/324] Rename tests --- src/tests/leaktest.py | 10 +-- src/tests/test_array.py | 80 ++++++++++---------- src/tests/test_class.py | 36 ++++----- src/tests/test_compat.py | 32 ++++---- src/tests/test_constructors.py | 8 +- src/tests/test_conversion.py | 40 +++++----- src/tests/test_delegate.py | 34 ++++----- src/tests/test_docstring.py | 6 +- src/tests/test_engine.py | 6 +- src/tests/test_enum.py | 30 ++++---- src/tests/test_event.py | 56 +++++++------- src/tests/test_exceptions.py | 46 +++++------ src/tests/test_field.py | 60 +++++++-------- src/tests/test_generic.py | 34 ++++----- src/tests/test_indexer.py | 58 +++++++------- src/tests/test_interface.py | 8 +- src/tests/test_method.py | 80 ++++++++++---------- src/tests/test_module.py | 54 ++++++------- src/tests/test_property.py | 20 ++--- src/tests/test_subclass.py | 10 +-- src/tests/test_suite/test_callback.py | 4 +- src/tests/test_suite/test_import.py | 2 +- src/tests/test_suite/test_recursive_types.py | 2 +- src/tests/test_thread.py | 6 +- 24 files changed, 361 insertions(+), 361 deletions(-) diff --git a/src/tests/leaktest.py b/src/tests/leaktest.py index 666e6e276..a54774566 100644 --- a/src/tests/leaktest.py +++ b/src/tests/leaktest.py @@ -63,7 +63,7 @@ def report(self): if type(item) != dicttype: print(item, sys.getrefcount(item)) - def testModules(self): + def test_modules(self): self.notify("Running module leak check...") for i in range(self.count): @@ -78,7 +78,7 @@ def testModules(self): self.end_test() - def testClasses(self): + def test_classes(self): from System.Collections import Hashtable from Python.Test import StringDelegate @@ -102,7 +102,7 @@ def testClasses(self): self.end_test() - def testEnumerations(self): + def test_enumerations(self): import Python.Test as Test self.notify("Running enum leak check...") @@ -137,7 +137,7 @@ def testEnumerations(self): self.end_test() - def testEvents(self): + def test_events(self): from Python.Test import EventTest, TestEventArgs self.notify("Running event leak check...") @@ -215,7 +215,7 @@ def handler(sender, args, dict=dict): self.end_test() - def testDelegates(self): + def test_delegates(self): from Python.Test import DelegateTest, StringDelegate self.notify("Running delegate leak check...") diff --git a/src/tests/test_array.py b/src/tests/test_array.py index 134b95557..b12c785e7 100644 --- a/src/tests/test_array.py +++ b/src/tests/test_array.py @@ -11,7 +11,7 @@ class ArrayTests(unittest.TestCase): """Test support for managed arrays.""" - def testPublicArray(self): + def test_public_array(self): """Test public arrays.""" ob = Test.PublicArrayTest() items = ob.items @@ -33,7 +33,7 @@ def testPublicArray(self): items[-1] = 4 self.assertTrue(items[-1] == 4) - def testProtectedArray(self): + def test_protected_array(self): """Test protected arrays.""" ob = Test.ProtectedArrayTest() items = ob.items @@ -55,7 +55,7 @@ def testProtectedArray(self): items[-1] = 4 self.assertTrue(items[-1] == 4) - def testInternalArray(self): + def test_internal_array(self): """Test internal arrays.""" def test(): @@ -64,7 +64,7 @@ def test(): self.assertRaises(AttributeError, test) - def testPrivateArray(self): + def test_private_array(self): """Test private arrays.""" def test(): @@ -73,7 +73,7 @@ def test(): self.assertRaises(AttributeError, test) - def testArrayBoundsChecking(self): + def test_array_bounds_checking(self): """Test array bounds checking.""" ob = Test.Int32ArrayTest() @@ -115,7 +115,7 @@ def test(): self.assertRaises(IndexError, test) - def testArrayContains(self): + def test_array_contains(self): """Test array support for __contains__.""" ob = Test.Int32ArrayTest() @@ -132,7 +132,7 @@ def testArrayContains(self): self.assertFalse(None in items) # which threw ^ here which is a little odd. # But when run from runtests.py. Not when this module ran by itself. - def testBooleanArray(self): + def test_boolean_array(self): """Test boolean arrays.""" ob = Test.BooleanArrayTest() items = ob.items @@ -163,7 +163,7 @@ def test(): self.assertRaises(TypeError, test) - def testByteArray(self): + def test_byte_array(self): """Test byte arrays.""" ob = Test.ByteArrayTest() items = ob.items @@ -212,7 +212,7 @@ def test(): self.assertRaises(TypeError, test) - def testSByteArray(self): + def test_sbyte_array(self): """Test sbyte arrays.""" ob = Test.SByteArrayTest() items = ob.items @@ -261,7 +261,7 @@ def test(): self.assertRaises(TypeError, test) - def testCharArray(self): + def test_char_array(self): """Test char arrays.""" ob = Test.CharArrayTest() items = ob.items @@ -298,7 +298,7 @@ def test(): self.assertRaises(TypeError, test) - def testInt16Array(self): + def test_int16_array(self): """Test Int16 arrays.""" ob = Test.Int16ArrayTest() items = ob.items @@ -347,7 +347,7 @@ def test(): self.assertRaises(TypeError, test) - def testInt32Array(self): + def test_int32_array(self): """Test Int32 arrays.""" ob = Test.Int32ArrayTest() items = ob.items @@ -396,7 +396,7 @@ def test(): self.assertRaises(TypeError, test) - def testInt64Array(self): + def test_int64_array(self): """Test Int64 arrays.""" ob = Test.Int64ArrayTest() items = ob.items @@ -445,7 +445,7 @@ def test(): self.assertRaises(TypeError, test) - def testUInt16Array(self): + def test_uint16_array(self): """Test UInt16 arrays.""" ob = Test.UInt16ArrayTest() items = ob.items @@ -494,7 +494,7 @@ def test(): self.assertRaises(TypeError, test) - def testUInt32Array(self): + def test_uint32_array(self): """Test UInt32 arrays.""" ob = Test.UInt32ArrayTest() items = ob.items @@ -543,7 +543,7 @@ def test(): self.assertRaises(TypeError, test) - def testUInt64Array(self): + def test_uint64_array(self): """Test UInt64 arrays.""" ob = Test.UInt64ArrayTest() items = ob.items @@ -592,7 +592,7 @@ def test(): self.assertRaises(TypeError, test) - def testSingleArray(self): + def test_single_array(self): """Test Single arrays.""" ob = Test.SingleArrayTest() items = ob.items @@ -629,7 +629,7 @@ def test(): self.assertRaises(TypeError, test) - def testDoubleArray(self): + def test_double_array(self): """Test Double arrays.""" ob = Test.DoubleArrayTest() items = ob.items @@ -666,7 +666,7 @@ def test(): self.assertRaises(TypeError, test) - def testDecimalArray(self): + def test_decimal_array(self): """Test Decimal arrays.""" ob = Test.DecimalArrayTest() items = ob.items @@ -704,7 +704,7 @@ def test(): self.assertRaises(TypeError, test) - def testStringArray(self): + def test_string_array(self): """Test String arrays.""" ob = Test.StringArrayTest() items = ob.items @@ -738,7 +738,7 @@ def test(): self.assertRaises(TypeError, test) - def testEnumArray(self): + def test_enum_array(self): """Test enum arrays.""" from Python.Test import ShortEnum ob = Test.EnumArrayTest() @@ -779,7 +779,7 @@ def test(): self.assertRaises(TypeError, test) - def testObjectArray(self): + def test_object_array(self): """Test ob arrays.""" from Python.Test import Spam ob = Test.ObjectArrayTest() @@ -820,7 +820,7 @@ def test(): self.assertRaises(TypeError, test) - def testNullArray(self): + def test_null_array(self): """Test null arrays.""" ob = Test.NullArrayTest() items = ob.items @@ -851,7 +851,7 @@ def test(): self.assertRaises(TypeError, test) - def testInterfaceArray(self): + def test_interface_array(self): """Test interface arrays.""" from Python.Test import Spam ob = Test.InterfaceArrayTest() @@ -895,7 +895,7 @@ def test(): self.assertRaises(TypeError, test) - def testTypedArray(self): + def test_typed_array(self): """Test typed arrays.""" from Python.Test import Spam ob = Test.TypedArrayTest() @@ -939,7 +939,7 @@ def test(): self.assertRaises(TypeError, test) - def testMultiDimensionalArray(self): + def test_multi_dimensional_array(self): """Test multi-dimensional arrays.""" ob = Test.MultiDimensionalArrayTest() items = ob.items @@ -1011,7 +1011,7 @@ def test(): self.assertRaises(TypeError, test) - def testArrayIteration(self): + def test_array_iteration(self): """Test array iteration.""" items = Test.Int32ArrayTest().items @@ -1028,7 +1028,7 @@ def testArrayIteration(self): for i in empty: raise TypeError('iteration over empty array') - def testTupleArrayConversion(self): + def test_tuple_array_conversion(self): """Test conversion of tuples to array arguments.""" from Python.Test import ArrayConversionTest from Python.Test import Spam @@ -1042,7 +1042,7 @@ def testTupleArrayConversion(self): self.assertTrue(result[0].__class__ == Spam) self.assertTrue(len(result) == 10) - def testTupleNestedArrayConversion(self): + def test_tuple_nested_array_conversion(self): """Test conversion of tuples to array-of-array arguments.""" from Python.Test import ArrayConversionTest from Python.Test import Spam @@ -1061,7 +1061,7 @@ def testTupleNestedArrayConversion(self): self.assertTrue(len(result[0]) == 10) self.assertTrue(result[0][0].__class__ == Spam) - def testListArrayConversion(self): + def test_list_array_conversion(self): """Test conversion of lists to array arguments.""" from Python.Test import ArrayConversionTest from Python.Test import Spam @@ -1074,7 +1074,7 @@ def testListArrayConversion(self): self.assertTrue(result[0].__class__ == Spam) self.assertTrue(len(result) == 10) - def testListNestedArrayConversion(self): + def test_list_nested_array_conversion(self): """Test conversion of lists to array-of-array arguments.""" from Python.Test import ArrayConversionTest from Python.Test import Spam @@ -1092,7 +1092,7 @@ def testListNestedArrayConversion(self): self.assertTrue(len(result[0]) == 10) self.assertTrue(result[0][0].__class__ == Spam) - def testSequenceArrayConversion(self): + def test_sequence_array_conversion(self): """Test conversion of sequence-like obs to array arguments.""" from Python.Test import ArrayConversionTest from Python.Test import Spam @@ -1105,7 +1105,7 @@ def testSequenceArrayConversion(self): self.assertTrue(result[0].__class__ == Spam) self.assertTrue(len(result) == 10) - def testSequenceNestedArrayConversion(self): + def test_sequence_nested_array_conversion(self): """Test conversion of sequences to array-of-array arguments.""" from Python.Test import ArrayConversionTest from Python.Test import Spam @@ -1123,7 +1123,7 @@ def testSequenceNestedArrayConversion(self): self.assertTrue(len(result[0]) == 10) self.assertTrue(result[0][0].__class__ == Spam) - def testTupleArrayConversionTypeChecking(self): + def test_tuple_array_conversion_type_checking(self): """Test error handling for tuple conversion to array arguments.""" from Python.Test import ArrayConversionTest from Python.Test import Spam @@ -1159,7 +1159,7 @@ def test(items=items): self.assertRaises(TypeError, test) - def testListArrayConversionTypeChecking(self): + def test_list_array_conversion_type_checking(self): """Test error handling for list conversion to array arguments.""" from Python.Test import ArrayConversionTest from Python.Test import Spam @@ -1190,7 +1190,7 @@ def test(items=items): self.assertRaises(TypeError, test) - def testSequenceArrayConversionTypeChecking(self): + def test_sequence_array_conversion_type_checking(self): """Test error handling for sequence conversion to array arguments.""" from Python.Test import ArrayConversionTest from Python.Test import Spam @@ -1221,7 +1221,7 @@ def test(items=items): self.assertRaises(TypeError, test) - def testMDArrayConversion(self): + def test_md_array_conversion(self): """Test passing of multi-dimensional array arguments.""" from Python.Test import ArrayConversionTest from Python.Test import Spam @@ -1245,7 +1245,7 @@ def testMDArrayConversion(self): self.assertTrue(result[0, 0].__class__ == Spam) self.assertTrue(result[0, 0].__class__ == Spam) - def testBoxedValueTypeMutationResult(self): + def test_boxed_value_type_mutation_result(self): """Test behavior of boxed value types.""" # This test actually exists mostly as documentation of an important @@ -1282,7 +1282,7 @@ def testBoxedValueTypeMutationResult(self): self.assertTrue(items[i].X == i + 1) self.assertTrue(items[i].Y == i + 1) - def testSpecialArrayCreation(self): + def test_special_array_creation(self): """Test using the Array[] syntax for creating arrays.""" from Python.Test import ISayHello1, InterfaceTest, ShortEnum from System import Array @@ -1416,7 +1416,7 @@ def testSpecialArrayCreation(self): self.assertTrue(value[1].__class__ == inst.__class__) self.assertTrue(value.Length == 2) - def testArrayAbuse(self): + def test_array_abuse(self): """Test array abuse.""" _class = Test.PublicArrayTest ob = Test.PublicArrayTest() diff --git a/src/tests/test_class.py b/src/tests/test_class.py index b681c3a11..02d5f1efc 100644 --- a/src/tests/test_class.py +++ b/src/tests/test_class.py @@ -21,17 +21,17 @@ def kind(self): class ClassTests(unittest.TestCase): """Test CLR class support.""" - def testBasicReferenceType(self): + def test_basic_reference_type(self): """Test usage of CLR defined reference types.""" String = System.String self.assertEquals(String.Empty, "") - def testBasicValueType(self): + def test_basic_value_type(self): """Test usage of CLR defined value types.""" Int32 = System.Int32 self.assertEquals(Int32.MaxValue, 2147483647) - def testClassStandardAttrs(self): + def test_class_standard_attrs(self): """Test standard class attributes.""" from Python.Test import ClassTest @@ -40,24 +40,24 @@ def testClassStandardAttrs(self): self.assertTrue(type(ClassTest.__dict__) == DictProxyType) self.assertTrue(len(ClassTest.__doc__) > 0) - def testClassDocstrings(self): + def test_class_docstrings(self): """Test standard class docstring generation""" from Python.Test import ClassTest value = 'Void .ctor()' self.assertTrue(ClassTest.__doc__ == value) - def testClassDefaultStr(self): + def test_class_default_str(self): """Test the default __str__ implementation for managed objects.""" s = System.String("this is a test") self.assertTrue(str(s) == "this is a test") - def testClassDefaultRepr(self): + def test_class_default_repr(self): """Test the default __repr__ implementation for managed objects.""" s = System.String("this is a test") self.assertTrue(repr(s).startswith(" Python type conversions.""" - def testBoolConversion(self): + def test_bool_conversion(self): """Test bool conversion.""" ob = ConversionTest() self.assertTrue(ob.BooleanField == False) @@ -63,7 +63,7 @@ def testBoolConversion(self): self.assertTrue(ob.BooleanField is True) self.assertTrue(ob.BooleanField == 1) - def testSByteConversion(self): + def test_sbyte_conversion(self): """Test sbyte conversion.""" self.assertTrue(System.SByte.MaxValue == 127) self.assertTrue(System.SByte.MinValue == -128) @@ -113,7 +113,7 @@ def test(): self.assertRaises(OverflowError, test) - def testByteConversion(self): + def test_byte_conversion(self): """Test byte conversion.""" self.assertTrue(System.Byte.MaxValue == 255) self.assertTrue(System.Byte.MinValue == 0) @@ -163,7 +163,7 @@ def test(): self.assertRaises(OverflowError, test) - def testCharConversion(self): + def test_char_conversion(self): """Test char conversion.""" self.assertTrue(System.Char.MaxValue == unichr(65535)) self.assertTrue(System.Char.MinValue == unichr(0)) @@ -195,7 +195,7 @@ def test(): self.assertRaises(TypeError, test) - def testInt16Conversion(self): + def test_int16_conversion(self): """Test int16 conversion.""" self.assertTrue(System.Int16.MaxValue == 32767) self.assertTrue(System.Int16.MinValue == -32768) @@ -245,7 +245,7 @@ def test(): self.assertRaises(OverflowError, test) - def testInt32Conversion(self): + def test_int32_conversion(self): """Test int32 conversion.""" self.assertTrue(System.Int32.MaxValue == 2147483647) self.assertTrue(System.Int32.MinValue == -2147483648) @@ -295,7 +295,7 @@ def test(): self.assertRaises(OverflowError, test) - def testInt64Conversion(self): + def test_int64_conversion(self): """Test int64 conversion.""" self.assertTrue(System.Int64.MaxValue == long(9223372036854775807)) self.assertTrue(System.Int64.MinValue == long(-9223372036854775808)) @@ -345,7 +345,7 @@ def test(): self.assertRaises(OverflowError, test) - def testUInt16Conversion(self): + def test_uint16_conversion(self): """Test uint16 conversion.""" self.assertTrue(System.UInt16.MaxValue == 65535) self.assertTrue(System.UInt16.MinValue == 0) @@ -395,7 +395,7 @@ def test(): self.assertRaises(OverflowError, test) - def testUInt32Conversion(self): + def test_uint32_conversion(self): """Test uint32 conversion.""" self.assertTrue(System.UInt32.MaxValue == long(4294967295)) self.assertTrue(System.UInt32.MinValue == 0) @@ -445,7 +445,7 @@ def test(): self.assertRaises(OverflowError, test) - def testUInt64Conversion(self): + def test_uint64_conversion(self): """Test uint64 conversion.""" self.assertTrue(System.UInt64.MaxValue == long(18446744073709551615)) self.assertTrue(System.UInt64.MinValue == 0) @@ -495,7 +495,7 @@ def test(): self.assertRaises(OverflowError, test) - def testSingleConversion(self): + def test_single_conversion(self): """Test single conversion.""" self.assertTrue(System.Single.MaxValue == 3.402823e38) self.assertTrue(System.Single.MinValue == -3.402823e38) @@ -545,7 +545,7 @@ def test(): self.assertRaises(OverflowError, test) - def testDoubleConversion(self): + def test_double_conversion(self): """Test double conversion.""" self.assertTrue(System.Double.MaxValue == 1.7976931348623157e308) self.assertTrue(System.Double.MinValue == -1.7976931348623157e308) @@ -595,7 +595,7 @@ def test(): self.assertRaises(OverflowError, test) - def testDecimalConversion(self): + def test_decimal_conversion(self): """Test decimal conversion.""" from System import Decimal @@ -637,7 +637,7 @@ def test(): self.assertRaises(TypeError, test) - def testStringConversion(self): + def test_string_conversion(self): """Test string / unicode conversion.""" ob = ConversionTest() @@ -670,7 +670,7 @@ def test(): self.assertRaises(TypeError, test) - def testInterfaceConversion(self): + def test_interface_conversion(self): """Test interface conversion.""" from Python.Test import Spam, ISpam @@ -700,7 +700,7 @@ def test(): self.assertRaises(TypeError, test) - def testObjectConversion(self): + def test_object_conversion(self): """Test ob conversion.""" from Python.Test import Spam @@ -728,7 +728,7 @@ def test(): self.assertRaises(TypeError, test) - def testEnumConversion(self): + def test_enum_conversion(self): """Test enum conversion.""" from Python.Test import ShortEnum @@ -770,7 +770,7 @@ def test(): self.assertRaises(TypeError, test) - def testNullConversion(self): + def test_null_conversion(self): """Test null conversion.""" ob = ConversionTest() @@ -795,7 +795,7 @@ def test(): self.assertRaises(TypeError, test) - def testByteArrayConversion(self): + def test_byte_array_conversion(self): """Test byte array conversion.""" ob = ConversionTest() @@ -813,7 +813,7 @@ def testByteArrayConversion(self): for i in range(len(value)): self.assertTrue(array[i] == indexbytes(value, i)) - def testSByteArrayConversion(self): + def test_sbyte_array_conversion(self): """Test sbyte array conversion.""" ob = ConversionTest() diff --git a/src/tests/test_delegate.py b/src/tests/test_delegate.py index 33940caca..37203e77d 100644 --- a/src/tests/test_delegate.py +++ b/src/tests/test_delegate.py @@ -14,7 +14,7 @@ class DelegateTests(unittest.TestCase): """Test CLR delegate support.""" - def testDelegateStandardAttrs(self): + def test_delegate_standard_attrs(self): """Test standard delegate attributes.""" from Python.Test import PublicDelegate @@ -23,7 +23,7 @@ def testDelegateStandardAttrs(self): self.assertTrue(type(PublicDelegate.__dict__) == DictProxyType) self.assertTrue(PublicDelegate.__doc__ == None) - def testGlobalDelegateVisibility(self): + def test_global_delegate_visibility(self): """Test visibility of module-level delegates.""" from Python.Test import PublicDelegate @@ -40,7 +40,7 @@ def test(): self.assertRaises(AttributeError, test) - def testNestedDelegateVisibility(self): + def test_nested_delegate_visibility(self): """Test visibility of nested delegates.""" ob = DelegateTest.PublicDelegate self.assertTrue(ob.__name__ == 'PublicDelegate') @@ -58,7 +58,7 @@ def test(): self.assertRaises(AttributeError, test) - def testDelegateFromFunction(self): + def test_delegate_from_function(self): """Test delegate implemented with a Python function.""" d = StringDelegate(hello_func) @@ -71,7 +71,7 @@ def testDelegateFromFunction(self): self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") self.assertTrue(ob.stringDelegate() == "hello") - def testDelegateFromMethod(self): + def test_delegate_from_method(self): """Test delegate implemented with a Python instance method.""" inst = HelloClass() @@ -85,7 +85,7 @@ def testDelegateFromMethod(self): self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") self.assertTrue(ob.stringDelegate() == "hello") - def testDelegateFromUnboundMethod(self): + def test_delegate_from_unbound_method(self): """Test failure mode for unbound methods.""" def test(): @@ -94,7 +94,7 @@ def test(): self.assertRaises(TypeError, test) - def testDelegateFromStaticMethod(self): + def test_delegate_from_static_method(self): """Test delegate implemented with a Python static method.""" d = StringDelegate(HelloClass.s_hello) @@ -118,7 +118,7 @@ def testDelegateFromStaticMethod(self): self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") self.assertTrue(ob.stringDelegate() == "hello") - def testDelegateFromClassMethod(self): + def test_delegate_from_class_method(self): """Test delegate implemented with a Python class method.""" d = StringDelegate(HelloClass.c_hello) @@ -142,7 +142,7 @@ def testDelegateFromClassMethod(self): self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") self.assertTrue(ob.stringDelegate() == "hello") - def testDelegateFromCallable(self): + def test_delegate_from_callable(self): """Test delegate implemented with a Python callable object.""" inst = HelloClass() @@ -156,7 +156,7 @@ def testDelegateFromCallable(self): self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") self.assertTrue(ob.stringDelegate() == "hello") - def testDelegateFromManagedInstanceMethod(self): + def test_delegate_from_managed_instance_method(self): """Test delegate implemented with a managed instance method.""" ob = DelegateTest() d = StringDelegate(ob.SayHello) @@ -168,7 +168,7 @@ def testDelegateFromManagedInstanceMethod(self): self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") self.assertTrue(ob.stringDelegate() == "hello") - def testDelegateFromManagedStaticMethod(self): + def test_delegate_from_managed_static_method(self): """Test delegate implemented with a managed static method.""" d = StringDelegate(DelegateTest.StaticSayHello) ob = DelegateTest() @@ -180,7 +180,7 @@ def testDelegateFromManagedStaticMethod(self): self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") self.assertTrue(ob.stringDelegate() == "hello") - def testDelegateFromDelegate(self): + def test_delegate_from_delegate(self): """Test delegate implemented with another delegate.""" d1 = StringDelegate(hello_func) d2 = StringDelegate(d1) @@ -193,7 +193,7 @@ def testDelegateFromDelegate(self): self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") self.assertTrue(ob.stringDelegate() == "hello") - def testDelegateWithInvalidArgs(self): + def test_delegate_with_invalid_args(self): """Test delegate instantiation with invalid (non-callable) args.""" def test(): @@ -211,7 +211,7 @@ def test(): self.assertRaises(TypeError, test) - def testMulticastDelegate(self): + def test_multicast_delegate(self): """Test multicast delegates.""" inst = MultipleHandler() @@ -227,7 +227,7 @@ def testMulticastDelegate(self): self.assertTrue(md() == "ok") self.assertTrue(inst.value == 4) - def testSubclassDelegateFails(self): + def test_subclass_delegate_fails(self): """Test that subclassing of a delegate type fails.""" from Python.Test import PublicDelegate @@ -237,7 +237,7 @@ class Boom(PublicDelegate): self.assertRaises(TypeError, test) - def testDelegateEquality(self): + def test_delegate_equality(self): """Test delegate equality.""" def sayhello(): @@ -248,7 +248,7 @@ def sayhello(): ob.stringDelegate = d self.assertTrue(ob.stringDelegate == d) - def testBoolDelegate(self): + def test_bool_delegate(self): """Test boolean delegate.""" from Python.Test import BoolDelegate diff --git a/src/tests/test_docstring.py b/src/tests/test_docstring.py index afbd1062f..f2bc3302b 100644 --- a/src/tests/test_docstring.py +++ b/src/tests/test_docstring.py @@ -6,21 +6,21 @@ class DocStringTests(unittest.TestCase): """Test doc strings support.""" - def testDocWithCtor(self): + def test_doc_with_ctor(self): from Python.Test import DocWithCtorTest self.assertEqual(DocWithCtorTest.__doc__, 'DocWithCtorTest Class') self.assertEqual(DocWithCtorTest.TestMethod.__doc__, 'DocWithCtorTest TestMethod') self.assertEqual(DocWithCtorTest.StaticTestMethod.__doc__, 'DocWithCtorTest StaticTestMethod') - def testDocWithCtorNoDoc(self): + def test_doc_with_ctor_no_doc(self): from Python.Test import DocWithCtorNoDocTest self.assertEqual(DocWithCtorNoDocTest.__doc__, 'Void .ctor(Boolean)') self.assertEqual(DocWithCtorNoDocTest.TestMethod.__doc__, 'Void TestMethod(Double, Int32)') self.assertEqual(DocWithCtorNoDocTest.StaticTestMethod.__doc__, 'Void StaticTestMethod(Double, Int32)') - def testDocWithoutCtor(self): + def test_doc_without_ctor(self): from Python.Test import DocWithoutCtorTest self.assertEqual(DocWithoutCtorTest.__doc__, 'DocWithoutCtorTest Class') diff --git a/src/tests/test_engine.py b/src/tests/test_engine.py index 274dfb704..cfc019b5f 100644 --- a/src/tests/test_engine.py +++ b/src/tests/test_engine.py @@ -11,19 +11,19 @@ class EngineTests(unittest.TestCase): """Test PythonEngine embedding APIs.""" - def testMultipleCallsToInitialize(self): + def test_multiple_calls_to_initialize(self): """Test that multiple initialize calls are harmless.""" PythonEngine.Initialize() PythonEngine.Initialize() PythonEngine.Initialize() - def testImportModule(self): + def test_import_module(self): """Test module import.""" m = PythonEngine.ImportModule("sys") n = m.GetAttr("__name__") self.assertTrue(n.AsManagedObject(System.String) == "sys") - def testRunString(self): + def test_run_string(self): """Test the RunString method.""" PythonEngine.AcquireLock() diff --git a/src/tests/test_enum.py b/src/tests/test_enum.py index 493395d27..6f6097029 100644 --- a/src/tests/test_enum.py +++ b/src/tests/test_enum.py @@ -10,7 +10,7 @@ class EnumTests(unittest.TestCase): """Test CLR enum support.""" - def testEnumStandardAttrs(self): + def test_enum_standard_attrs(self): """Test standard enum attributes.""" from System import DayOfWeek @@ -19,7 +19,7 @@ def testEnumStandardAttrs(self): self.assertTrue(type(DayOfWeek.__dict__) == DictProxyType) self.assertTrue(DayOfWeek.__doc__ == None) - def testEnumGetMember(self): + def test_enum_get_member(self): """Test access to enum members.""" from System import DayOfWeek @@ -31,55 +31,55 @@ def testEnumGetMember(self): self.assertTrue(DayOfWeek.Friday == 5) self.assertTrue(DayOfWeek.Saturday == 6) - def testByteEnum(self): + def test_byte_enum(self): """Test byte enum.""" self.assertTrue(Test.ByteEnum.Zero == 0) self.assertTrue(Test.ByteEnum.One == 1) self.assertTrue(Test.ByteEnum.Two == 2) - def testSByteEnum(self): + def test_sbyte_enum(self): """Test sbyte enum.""" self.assertTrue(Test.SByteEnum.Zero == 0) self.assertTrue(Test.SByteEnum.One == 1) self.assertTrue(Test.SByteEnum.Two == 2) - def testShortEnum(self): + def test_short_enum(self): """Test short enum.""" self.assertTrue(Test.ShortEnum.Zero == 0) self.assertTrue(Test.ShortEnum.One == 1) self.assertTrue(Test.ShortEnum.Two == 2) - def testUShortEnum(self): + def test_ushort_enum(self): """Test ushort enum.""" self.assertTrue(Test.UShortEnum.Zero == 0) self.assertTrue(Test.UShortEnum.One == 1) self.assertTrue(Test.UShortEnum.Two == 2) - def testIntEnum(self): + def test_int_enum(self): """Test int enum.""" self.assertTrue(Test.IntEnum.Zero == 0) self.assertTrue(Test.IntEnum.One == 1) self.assertTrue(Test.IntEnum.Two == 2) - def testUIntEnum(self): + def test_uint_enum(self): """Test uint enum.""" self.assertTrue(Test.UIntEnum.Zero == long(0)) self.assertTrue(Test.UIntEnum.One == long(1)) self.assertTrue(Test.UIntEnum.Two == long(2)) - def testLongEnum(self): + def test_long_enum(self): """Test long enum.""" self.assertTrue(Test.LongEnum.Zero == long(0)) self.assertTrue(Test.LongEnum.One == long(1)) self.assertTrue(Test.LongEnum.Two == long(2)) - def testULongEnum(self): + def test_ulong_enum(self): """Test ulong enum.""" self.assertTrue(Test.ULongEnum.Zero == long(0)) self.assertTrue(Test.ULongEnum.One == long(1)) self.assertTrue(Test.ULongEnum.Two == long(2)) - def testInstantiateEnumFails(self): + def test_instantiate_enum_fails(self): """Test that instantiation of an enum class fails.""" from System import DayOfWeek @@ -88,7 +88,7 @@ def test(): self.assertRaises(TypeError, test) - def testSubclassEnumFails(self): + def test_subclass_enum_fails(self): """Test that subclassing of an enumeration fails.""" from System import DayOfWeek @@ -98,7 +98,7 @@ class Boom(DayOfWeek): self.assertRaises(TypeError, test) - def testEnumSetMemberFails(self): + def test_enum_set_member_fails(self): """Test that setattr operations on enumerations fail.""" from System import DayOfWeek @@ -112,7 +112,7 @@ def test(): self.assertRaises(TypeError, test) - def testEnumWithFlagsAttrConversion(self): + def test_enum_with_flags_attr_conversion(self): """Test enumeration conversion with FlagsAttribute set.""" # This works because the FlagsField enum has FlagsAttribute. Test.FieldTest().FlagsField = 99 @@ -123,7 +123,7 @@ def test(): self.assertRaises(ValueError, test) - def testEnumConversion(self): + def test_enum_conversion(self): """Test enumeration conversion.""" ob = Test.FieldTest() self.assertTrue(ob.EnumField == 0) diff --git a/src/tests/test_event.py b/src/tests/test_event.py index 858069f6c..84a495430 100644 --- a/src/tests/test_event.py +++ b/src/tests/test_event.py @@ -13,7 +13,7 @@ class EventTests(unittest.TestCase): """Test CLR event support.""" - def testPublicInstanceEvent(self): + def test_public_instance_event(self): """Test public instance events.""" ob = EventTest() @@ -27,7 +27,7 @@ def testPublicInstanceEvent(self): ob.PublicEvent -= handler.handler - def testPublicStaticEvent(self): + def test_public_static_event(self): """Test public static events.""" handler = GenericHandler() self.assertTrue(handler.value == None) @@ -37,7 +37,7 @@ def testPublicStaticEvent(self): EventTest.OnPublicStaticEvent(TestEventArgs(10)) self.assertTrue(handler.value == 10) - def testProtectedInstanceEvent(self): + def test_protected_instance_event(self): """Test protected instance events.""" ob = EventTest() @@ -51,7 +51,7 @@ def testProtectedInstanceEvent(self): ob.ProtectedEvent -= handler.handler - def testProtectedStaticEvent(self): + def test_protected_static_event(self): """Test protected static events.""" ob = EventTest @@ -65,7 +65,7 @@ def testProtectedStaticEvent(self): EventTest.ProtectedStaticEvent -= handler.handler - def testInternalEvents(self): + def test_internal_events(self): """Test internal events.""" def test(): @@ -83,7 +83,7 @@ def test(): self.assertRaises(AttributeError, test) - def testPrivateEvents(self): + def test_private_events(self): """Test private events.""" def test(): @@ -101,7 +101,7 @@ def test(): self.assertRaises(AttributeError, test) - def testMulticastEvent(self): + def test_multicast_event(self): """Test multicast events.""" ob = EventTest() @@ -129,7 +129,7 @@ def testMulticastEvent(self): ob.PublicEvent -= handler2.handler ob.PublicEvent -= handler3.handler - def testInstanceMethodHandler(self): + def test_instance_method_handler(self): """Test instance method handlers.""" ob = EventTest() handler = GenericHandler() @@ -146,7 +146,7 @@ def testInstanceMethodHandler(self): ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(handler.value == 10) - def testVarArgsInstanceMethodHandler(self): + def test_var_args_instance_method_handler(self): """Test vararg instance method handlers.""" ob = EventTest() handler = VariableArgsHandler() @@ -163,7 +163,7 @@ def testVarArgsInstanceMethodHandler(self): ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(handler.value == 10) - def testCallableobHandler(self): + def test_callableob_handler(self): """Test callable ob handlers.""" ob = EventTest() handler = CallableHandler() @@ -180,7 +180,7 @@ def testCallableobHandler(self): ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(handler.value == 10) - def testVarArgsCallableHandler(self): + def test_var_args_callable_handler(self): """Test varargs callable handlers.""" ob = EventTest() handler = VarCallableHandler() @@ -197,7 +197,7 @@ def testVarArgsCallableHandler(self): ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(handler.value == 10) - def testStaticMethodHandler(self): + def test_static_method_handler(self): """Test static method handlers.""" ob = EventTest() handler = StaticMethodHandler() @@ -215,7 +215,7 @@ def testStaticMethodHandler(self): ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(handler.value == 10) - def testClassMethodHandler(self): + def test_class_method_handler(self): """Test class method handlers.""" ob = EventTest() handler = ClassMethodHandler() @@ -233,7 +233,7 @@ def testClassMethodHandler(self): ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(handler.value == 10) - def testManagedInstanceMethodHandler(self): + def test_managed_instance_method_handler(self): """Test managed instance method handlers.""" ob = EventTest() @@ -249,7 +249,7 @@ def testManagedInstanceMethodHandler(self): ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(ob.value == 10) - def testManagedStaticMethodHandler(self): + def test_managed_static_method_handler(self): """Test managed static method handlers.""" ob = EventTest() EventTest.s_value = 0 @@ -266,7 +266,7 @@ def testManagedStaticMethodHandler(self): ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(EventTest.s_value == 10) - def testUnboundMethodHandler(self): + def test_unbound_method_handler(self): """Test failure mode for unbound method handlers.""" ob = EventTest() ob.PublicEvent += GenericHandler.handler @@ -278,7 +278,7 @@ def testUnboundMethodHandler(self): raise TypeError("should have raised a TypeError") - def testFunctionHandler(self): + def test_function_handler(self): """Test function handlers.""" ob = EventTest() dict = {'value': None} @@ -298,7 +298,7 @@ def handler(sender, args, dict=dict): ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(dict['value'] == 10) - def testAddNonCallableHandler(self): + def test_add_non_callable_handler(self): """Test handling of attempts to add non-callable handlers.""" def test(): @@ -322,7 +322,7 @@ class spam(object): self.assertRaises(TypeError, test) - def testRemoveMultipleHandlers(self): + def test_remove_multiple_handlers(self): """Test removing multiple instances of the same handler.""" ob = EventTest() handler = MultipleHandler() @@ -370,7 +370,7 @@ def testRemoveMultipleHandlers(self): ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 30) - def testRemoveMultipleStaticHandlers(self): + def test_remove_multiple_static_handlers(self): """Test removing multiple instances of a static handler.""" ob = EventTest() handler = MultipleHandler() @@ -418,7 +418,7 @@ def testRemoveMultipleStaticHandlers(self): ob.OnPublicStaticEvent(TestEventArgs(10)) self.assertTrue(handler.value == 30) - def testRandomMultipleHandlers(self): + def test_random_multiple_handlers(self): """Test random subscribe / unsubscribe of the same handlers.""" import random ob = EventTest() @@ -465,7 +465,7 @@ def testRandomMultipleHandlers(self): ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler2.value == 0) - def testRemoveInternalCallHandler(self): + def test_remove_internal_call_handler(self): """Test remove on an event sink implemented w/internalcall.""" ob = EventTest() @@ -475,7 +475,7 @@ def h(sender, args): ob.PublicEvent += h ob.PublicEvent -= h - def testRemoveUnknownHandler(self): + def test_remove_unknown_handler(self): """Test removing an event handler that was never added.""" def test(): @@ -486,7 +486,7 @@ def test(): self.assertRaises(ValueError, test) - def testHandlerCallbackFailure(self): + def test_handler_callback_failure(self): """Test failure mode for inappropriate handlers.""" class BadHandler(object): @@ -519,7 +519,7 @@ def test(): ob.PublicEvent -= handler.handler - def testIncorrectInvokation(self): + def test_incorrect_invokation(self): """Test incorrect invocation of events.""" ob = EventTest() @@ -538,7 +538,7 @@ def test(): ob.PublicEvent -= handler.handler - def testExplicitCLSEventRegistration(self): + def test_explicit_cls_event_registration(self): """Test explicit CLS event registration.""" from Python.Test import TestEventHandler @@ -558,7 +558,7 @@ def testExplicitCLSEventRegistration(self): ob.OnPublicEvent(TestEventArgs(20)) self.assertTrue(handler.value == 10) - def testImplicitCLSEventRegistration(self): + def test_implicit_cls_event_registration(self): """Test implicit CLS event registration.""" def test(): @@ -568,7 +568,7 @@ def test(): self.assertRaises(TypeError, test) - def testEventDescriptorAbuse(self): + def test_event_descriptor_abuse(self): """Test event descriptor abuse.""" def test(): diff --git a/src/tests/test_exceptions.py b/src/tests/test_exceptions.py index 647106a70..ffd9445eb 100644 --- a/src/tests/test_exceptions.py +++ b/src/tests/test_exceptions.py @@ -11,13 +11,13 @@ class ExceptionTests(unittest.TestCase): """Test exception support.""" - def testUnifiedExceptionSemantics(self): + def test_unified_exception_semantics(self): """Test unified exception semantics.""" e = System.Exception('Something bad happened') self.assertTrue(isinstance(e, Exception)) self.assertTrue(isinstance(e, System.Exception)) - def testStandardExceptionAttributes(self): + def test_standard_exception_attributes(self): """Test accessing standard exception attributes.""" from System import OverflowException from Python.Test import ExceptionTest @@ -33,7 +33,7 @@ def testStandardExceptionAttributes(self): v = e.ToString() self.assertTrue(len(v) > 0) - def testExtendedExceptionAttributes(self): + def test_extended_exception_attributes(self): """Test accessing extended exception attributes.""" from Python.Test import ExceptionTest, ExtendedException from System import OverflowException @@ -57,7 +57,7 @@ def testExtendedExceptionAttributes(self): self.assertTrue(e.GetExtraInfo() == 'changed') - def testRaiseClassException(self): + def test_raise_class_exception(self): """Test class exception propagation.""" from System import NullReferenceException @@ -73,7 +73,7 @@ def test(): self.assertTrue(type is NullReferenceException) self.assertTrue(isinstance(value, NullReferenceException)) - def testRaiseClassExceptionWithValue(self): + def test_raise_class_exception_with_value(self): """Test class exception propagation with associated value.""" from System import NullReferenceException @@ -90,7 +90,7 @@ def test(): self.assertTrue(isinstance(value, NullReferenceException)) self.assertTrue(value.Message == 'Aiiieee!') - def testRaiseInstanceException(self): + def test_raise_instance_exception(self): """Test instance exception propagation.""" from System import NullReferenceException @@ -107,7 +107,7 @@ def test(): self.assertTrue(isinstance(value, NullReferenceException)) self.assertTrue(len(value.Message) > 0) - def testRaiseInstanceExceptionWithArgs(self): + def test_raise_instance_exception_with_args(self): """Test instance exception propagation with args.""" from System import NullReferenceException @@ -124,7 +124,7 @@ def test(): self.assertTrue(isinstance(value, NullReferenceException)) self.assertTrue(value.Message == 'Aiiieee!') - def testManagedExceptionPropagation(self): + def test_managed_exception_propagation(self): """Test propagation of exceptions raised in managed code.""" from System import Decimal, OverflowException @@ -133,7 +133,7 @@ def test(): self.assertRaises(OverflowException, test) - def testManagedExceptionConversion(self): + def test_managed_exception_conversion(self): """Test conversion of managed exceptions.""" from System import Exception, OverflowException from Python.Test import ExceptionTest @@ -158,7 +158,7 @@ def testManagedExceptionConversion(self): v = ExceptionTest.SetWidenedException(OverflowException('error')) self.assertTrue(v) - def testCatchExceptionFromManagedMethod(self): + def test_catch_exception_from_managed_method(self): """Test catching an exception from a managed method.""" from Python.Test import ExceptionTest from System import OverflowException @@ -172,7 +172,7 @@ def testCatchExceptionFromManagedMethod(self): raise SystemError('failed to catch exception from managed method') - def testCatchExceptionFromManagedProperty(self): + def test_catch_exception_from_managed_property(self): """Test catching an exception from a managed property.""" from Python.Test import ExceptionTest from System import OverflowException @@ -193,7 +193,7 @@ def testCatchExceptionFromManagedProperty(self): raise SystemError('failed to catch exception from managed property') - def testCatchExceptionManagedClass(self): + def test_catch_exception_managed_class(self): """Test catching the managed class of an exception.""" from System import OverflowException @@ -204,7 +204,7 @@ def testCatchExceptionManagedClass(self): raise SystemError('failed to catch managed class exception') - def testCatchExceptionPythonClass(self): + def test_catch_exception_python_class(self): """Test catching the python class of an exception.""" from System import OverflowException if PY3: @@ -219,7 +219,7 @@ def testCatchExceptionPythonClass(self): raise SystemError('failed to catch python class exception') - def testCatchExceptionBaseClass(self): + def test_catch_exception_base_class(self): """Test catching the base of an exception.""" from System import OverflowException, ArithmeticException @@ -230,7 +230,7 @@ def testCatchExceptionBaseClass(self): raise SystemError('failed to catch base exception') - def testCatchExceptionNestedBaseClass(self): + def test_catch_exception_nested_base_class(self): """Test catching the nested base of an exception.""" from System import OverflowException, SystemException @@ -241,7 +241,7 @@ def testCatchExceptionNestedBaseClass(self): raise SystemError('failed to catch nested base exception') - def testCatchExceptionWithAssignment(self): + def test_catch_exception_with_assignment(self): """Test catching an exception with assignment.""" from System import OverflowException @@ -251,7 +251,7 @@ def testCatchExceptionWithAssignment(self): e = sys.exc_info()[1] self.assertTrue(isinstance(e, OverflowException)) - def testCatchExceptionUnqualified(self): + def test_catch_exception_unqualified(self): """Test catching an unqualified exception.""" from System import OverflowException @@ -262,14 +262,14 @@ def testCatchExceptionUnqualified(self): raise SystemError('failed to catch unqualified exception') - def testApparentModuleOfException(self): + def test_apparent_module_of_exception(self): """Test the apparent module of an exception.""" from System import Exception, OverflowException self.assertTrue(Exception.__module__ == 'System') self.assertTrue(OverflowException.__module__ == 'System') - def testStrOfException(self): + def test_str_of_exception(self): """Test the str() representation of an exception.""" from System import NullReferenceException from System import Convert, FormatException @@ -286,7 +286,7 @@ def testStrOfException(self): msg = text_type(e).encode("utf8") # fix for international installation self.assertTrue(msg.find(text_type('System.Convert.ToDateTime').encode("utf8")) > -1, msg) - def testPythonCompatOfManagedExceptions(self): + def test_python_compat_of_managed_exceptions(self): """Test if managed exceptions are compatible with Python's implementation """ from System import OverflowException @@ -303,7 +303,7 @@ def testPythonCompatOfManagedExceptions(self): elif PY2: self.assertEqual(repr(e), "OverflowException(u'A simple message',)") - def testExceptionIsInstanceOfSystemObject(self): + def test_exception_is_instance_of_system_object(self): """Test behavior of isinstance(, System.Object).""" # This is an anti-test, in that this is a caveat of the current # implementation. Because exceptions are not allowed to be new-style @@ -330,14 +330,14 @@ def testExceptionIsInstanceOfSystemObject(self): else: self.assertFalse(isinstance(o, Object)) - def testPicklingExceptions(self): + def test_pickling_exceptions(self): exc = System.Exception("test") dumped = pickle.dumps(exc) loaded = pickle.loads(dumped) self.assertEqual(exc.args, loaded.args) - def testChainedExceptions(self): + def test_chained_exceptions(self): # TODO: Why is this test PY3 only? if PY3: from Python.Test import ExceptionTest diff --git a/src/tests/test_field.py b/src/tests/test_field.py index 1a46e1d96..f3ec8b382 100644 --- a/src/tests/test_field.py +++ b/src/tests/test_field.py @@ -9,7 +9,7 @@ class FieldTests(unittest.TestCase): """Test CLR field support.""" - def testPublicInstanceField(self): + def test_public_instance_field(self): """Test public instance fields.""" ob = FieldTest() self.assertTrue(ob.PublicField == 0) @@ -22,7 +22,7 @@ def test(): self.assertRaises(TypeError, test) - def testPublicStaticField(self): + def test_public_static_field(self): """Test public static fields.""" ob = FieldTest() self.assertTrue(FieldTest.PublicStaticField == 0) @@ -44,7 +44,7 @@ def test(): self.assertRaises(TypeError, test) - def testProtectedInstanceField(self): + def test_protected_instance_field(self): """Test protected instance fields.""" ob = FieldTest() self.assertTrue(ob.ProtectedField == 0) @@ -57,7 +57,7 @@ def test(): self.assertRaises(TypeError, test) - def testProtectedStaticField(self): + def test_protected_static_field(self): """Test protected static fields.""" ob = FieldTest() self.assertTrue(FieldTest.ProtectedStaticField == 0) @@ -79,7 +79,7 @@ def test(): self.assertRaises(TypeError, test) - def testReadOnlyInstanceField(self): + def test_read_only_instance_field(self): """Test readonly instance fields.""" self.assertTrue(FieldTest().ReadOnlyField == 0) @@ -93,7 +93,7 @@ def test(): self.assertRaises(TypeError, test) - def testReadOnlyStaticField(self): + def test_read_only_static_field(self): """Test readonly static fields.""" ob = FieldTest() @@ -120,7 +120,7 @@ def test(): self.assertRaises(TypeError, test) - def testConstantField(self): + def test_constant_field(self): """Test const fields.""" ob = FieldTest() @@ -147,7 +147,7 @@ def test(): self.assertRaises(TypeError, test) - def testInternalField(self): + def test_internal_field(self): """Test internal fields.""" def test(): @@ -165,7 +165,7 @@ def test(): self.assertRaises(AttributeError, test) - def testPrivateField(self): + def test_private_field(self): """Test private fields.""" def test(): @@ -183,7 +183,7 @@ def test(): self.assertRaises(AttributeError, test) - def testFieldDescriptorGetSet(self): + def test_field_descriptor_get_set(self): """Test field descriptor get / set.""" # This test ensures that setting an attribute implemented with @@ -206,7 +206,7 @@ def testFieldDescriptorGetSet(self): descriptor = FieldTest.__dict__['PublicStaticField'] self.assertTrue(type(descriptor) != int) - def testFieldDescriptorWrongType(self): + def test_field_descriptor_wrong_type(self): """Test setting a field using a value of the wrong type.""" def test(): @@ -214,7 +214,7 @@ def test(): self.assertRaises(TypeError, test) - def testFieldDescriptorAbuse(self): + def test_field_descriptor_abuse(self): """Test field descriptor abuse.""" desc = FieldTest.__dict__['PublicField'] @@ -228,7 +228,7 @@ def test(): self.assertRaises(TypeError, test) - def testBooleanField(self): + def test_boolean_field(self): """Test boolean fields.""" # change this to true / false later for Python 2.3? ob = FieldTest() @@ -246,7 +246,7 @@ def testBooleanField(self): ob.BooleanField = 0 self.assertTrue(ob.BooleanField == False) - def testSByteField(self): + def test_sbyte_field(self): """Test sbyte fields.""" ob = FieldTest() self.assertTrue(ob.SByteField == 0) @@ -254,7 +254,7 @@ def testSByteField(self): ob.SByteField = 1 self.assertTrue(ob.SByteField == 1) - def testByteField(self): + def test_byte_field(self): """Test byte fields.""" ob = FieldTest() self.assertTrue(ob.ByteField == 0) @@ -262,7 +262,7 @@ def testByteField(self): ob.ByteField = 1 self.assertTrue(ob.ByteField == 1) - def testCharField(self): + def test_char_field(self): """Test char fields.""" ob = FieldTest() self.assertTrue(ob.CharField == u'A') @@ -276,7 +276,7 @@ def testCharField(self): self.assertTrue(ob.CharField == u'C') self.assertTrue(ob.CharField == 'C') - def testInt16Field(self): + def test_int16_field(self): """Test int16 fields.""" ob = FieldTest() self.assertTrue(ob.Int16Field == 0) @@ -284,7 +284,7 @@ def testInt16Field(self): ob.Int16Field = 1 self.assertTrue(ob.Int16Field == 1) - def testInt32Field(self): + def test_int32_field(self): """Test int32 fields.""" ob = FieldTest() self.assertTrue(ob.Int32Field == 0) @@ -292,7 +292,7 @@ def testInt32Field(self): ob.Int32Field = 1 self.assertTrue(ob.Int32Field == 1) - def testInt64Field(self): + def test_int64_field(self): """Test int64 fields.""" ob = FieldTest() self.assertTrue(ob.Int64Field == 0) @@ -300,7 +300,7 @@ def testInt64Field(self): ob.Int64Field = 1 self.assertTrue(ob.Int64Field == 1) - def testUInt16Field(self): + def test_uint16_field(self): """Test uint16 fields.""" ob = FieldTest() self.assertTrue(ob.UInt16Field == 0) @@ -308,7 +308,7 @@ def testUInt16Field(self): ob.UInt16Field = 1 self.assertTrue(ob.UInt16Field == 1) - def testUInt32Field(self): + def test_uint32_field(self): """Test uint32 fields.""" ob = FieldTest() self.assertTrue(ob.UInt32Field == 0) @@ -316,7 +316,7 @@ def testUInt32Field(self): ob.UInt32Field = 1 self.assertTrue(ob.UInt32Field == 1) - def testUInt64Field(self): + def test_uint64_field(self): """Test uint64 fields.""" ob = FieldTest() self.assertTrue(ob.UInt64Field == 0) @@ -324,7 +324,7 @@ def testUInt64Field(self): ob.UInt64Field = 1 self.assertTrue(ob.UInt64Field == 1) - def testSingleField(self): + def test_single_field(self): """Test single fields.""" ob = FieldTest() self.assertTrue(ob.SingleField == 0.0) @@ -332,7 +332,7 @@ def testSingleField(self): ob.SingleField = 1.1 self.assertTrue(ob.SingleField == 1.1) - def testDoubleField(self): + def test_double_field(self): """Test double fields.""" ob = FieldTest() self.assertTrue(ob.DoubleField == 0.0) @@ -340,7 +340,7 @@ def testDoubleField(self): ob.DoubleField = 1.1 self.assertTrue(ob.DoubleField == 1.1) - def testDecimalField(self): + def test_decimal_field(self): """Test decimal fields.""" ob = FieldTest() self.assertTrue(ob.DecimalField == System.Decimal(0)) @@ -348,7 +348,7 @@ def testDecimalField(self): ob.DecimalField = System.Decimal(1) self.assertTrue(ob.DecimalField == System.Decimal(1)) - def testStringField(self): + def test_string_field(self): """Test string fields.""" ob = FieldTest() self.assertTrue(ob.StringField == "spam") @@ -356,7 +356,7 @@ def testStringField(self): ob.StringField = "eggs" self.assertTrue(ob.StringField == "eggs") - def testInterfaceField(self): + def test_interface_field(self): """Test interface fields.""" from Python.Test import Spam, ISpam @@ -369,7 +369,7 @@ def testInterfaceField(self): self.assertTrue(ISpam(ob.SpamField).GetValue() == "eggs") self.assertTrue(ob.SpamField.GetValue() == "eggs") - def testObjectField(self): + def test_object_field(self): """Test ob fields.""" ob = FieldTest() self.assertTrue(ob.ObjectField == None) @@ -383,7 +383,7 @@ def testObjectField(self): ob.ObjectField = None self.assertTrue(ob.ObjectField == None) - def testEnumField(self): + def test_enum_field(self): """Test enum fields.""" from Python.Test import ShortEnum @@ -393,7 +393,7 @@ def testEnumField(self): ob.EnumField = ShortEnum.One self.assertTrue(ob.EnumField == ShortEnum.One) - def testNullableField(self): + def test_nullable_field(self): """Test nullable fields.""" ob = FieldTest() diff --git a/src/tests/test_generic.py b/src/tests/test_generic.py index 536a2bb7f..d4c93c060 100644 --- a/src/tests/test_generic.py +++ b/src/tests/test_generic.py @@ -112,7 +112,7 @@ def _testGenericMethodByType(self, ptype, value, test_type=0): self.assertTrue(result[0] == value) self.assertTrue(result[1] == value) - def testPythonTypeAliasing(self): + def test_python_type_aliasing(self): """Test python type alias support with generics.""" from System.Collections.Generic import Dictionary @@ -166,7 +166,7 @@ def testPythonTypeAliasing(self): dict.Add(True, False) self.assertTrue(dict[True] == False) - def testGenericReferenceType(self): + def test_generic_reference_type(self): """Test usage of generic reference type definitions.""" from Python.Test import GenericTypeDefinition @@ -174,21 +174,21 @@ def testGenericReferenceType(self): self.assertTrue(inst.value1 == "one") self.assertTrue(inst.value2 == 2) - def testGenericValueType(self): + def test_generic_value_type(self): """Test usage of generic value type definitions.""" inst = System.Nullable[System.Int32](10) self.assertTrue(inst.HasValue) self.assertTrue(inst.Value == 10) - def testGenericInterface(self): + def test_generic_interface(self): # TODO NotImplemented pass - def testGenericDelegate(self): + def test_generic_delegate(self): # TODO NotImplemented pass - def testOpenGenericType(self): + def test_open_generic_type(self): """Test behavior of reflected open constructed generic types.""" from Python.Test import DerivedFromOpenGeneric @@ -204,7 +204,7 @@ def test(): self.assertRaises(TypeError, test) - def testDerivedFromOpenGenericType(self): + def test_derived_from_open_generic_type(self): """Test a generic type derived from an open generic type.""" from Python.Test import DerivedFromOpenGeneric @@ -215,7 +215,7 @@ def testDerivedFromOpenGenericType(self): self.assertTrue(inst.value2 == 'two') self.assertTrue(inst.value3 == 'three') - def testGenericTypeNameResolution(self): + def test_generic_type_name_resolution(self): """Test the ability to disambiguate generic type names.""" from Python.Test import GenericNameTest1, GenericNameTest2 @@ -241,7 +241,7 @@ def test(): self.assertTrue(_class().value == 2) self.assertTrue(_class.value == 2) - def testGenericTypeBinding(self): + def test_generic_type_binding(self): """Test argument conversion / binding for generic methods.""" from Python.Test import InterfaceTest, ISayHello1, ShortEnum import System @@ -273,7 +273,7 @@ def testGenericTypeBinding(self): self._testGenericWrapperByType(InterfaceTest, InterfaceTest()) self._testGenericWrapperByType(ISayHello1, InterfaceTest()) - def testGenericMethodBinding(self): + def test_generic_method_binding(self): from Python.Test import GenericMethodTest, GenericStaticMethodTest from System import InvalidOperationException @@ -298,7 +298,7 @@ def test(): self.assertRaises(TypeError, test) - def testGenericMethodTypeHandling(self): + def test_generic_method_type_handling(self): """Test argument conversion / binding for generic methods.""" from Python.Test import InterfaceTest, ISayHello1, ShortEnum import System @@ -333,7 +333,7 @@ def testGenericMethodTypeHandling(self): self._testGenericMethodByType(InterfaceTest, InterfaceTest(), 1) self._testGenericMethodByType(ISayHello1, InterfaceTest(), 1) - def testCorrectOverloadSelection(self): + def test_correct_overload_selection(self): """Test correct overloading selection for common types.""" from System.Drawing import Font @@ -371,7 +371,7 @@ def testCorrectOverloadSelection(self): CSArray = Array.CreateInstance(Byte, 1000) handler = GCHandle.Alloc(CSArray, GCHandleType.Pinned) - def testGenericMethodOverloadSelection(self): + def test_generic_method_overload_selection(self): """Test explicit overload selection with generic methods.""" from Python.Test import GenericMethodTest, GenericStaticMethodTest @@ -452,7 +452,7 @@ def test(): self.assertRaises(TypeError, test) - def testMethodOverloadSelectionWithGenericTypes(self): + def test_method_overload_selection_with_generic_types(self): """Check method overload selection using generic types.""" from Python.Test import ISayHello1, InterfaceTest, ShortEnum from Python.Test import MethodTest, GenericWrapper @@ -587,7 +587,7 @@ def testMethodOverloadSelectionWithGenericTypes(self): self.assertTrue(value[0].value == 0) self.assertTrue(value[1].value == 1) - def testOverloadSelectionWithArraysOfGenericTypes(self): + def test_overload_selection_with_arrays_of_generic_types(self): """Check overload selection using arrays of generic types.""" from Python.Test import ISayHello1, InterfaceTest, ShortEnum from Python.Test import MethodTest, GenericWrapper @@ -770,12 +770,12 @@ def testOverloadSelectionWithArraysOfGenericTypes(self): self.assertTrue(value[0].value.__class__ == inst.__class__) self.assertTrue(value.Length == 2) - def testGenericOverloadSelectionMagicNameOnly(self): + def test_generic_overload_selection_magic_name_only(self): """Test using only __overloads__ to select on type & sig""" # TODO NotImplemented pass - def testNestedGenericClass(self): + def test_nested_generic_class(self): """Check nested generic classes.""" # TODO NotImplemented pass diff --git a/src/tests/test_indexer.py b/src/tests/test_indexer.py index eaa02abd0..daec3d7f7 100644 --- a/src/tests/test_indexer.py +++ b/src/tests/test_indexer.py @@ -10,7 +10,7 @@ class IndexerTests(unittest.TestCase): """Test support for indexer properties.""" - def testPublicIndexer(self): + def test_public_indexer(self): """Test public indexers.""" ob = Test.PublicIndexerTest() @@ -22,7 +22,7 @@ def testPublicIndexer(self): self.assertTrue(ob[10] == None) - def testProtectedIndexer(self): + def test_protected_indexer(self): """Test protected indexers.""" ob = Test.ProtectedIndexerTest() @@ -34,7 +34,7 @@ def testProtectedIndexer(self): self.assertTrue(ob[10] == None) - def testInternalIndexer(self): + def test_internal_indexer(self): """Test internal indexers.""" ob = Test.InternalIndexerTest() @@ -53,7 +53,7 @@ def test(): self.assertRaises(TypeError, test) - def testPrivateIndexer(self): + def test_private_indexer(self): """Test private indexers.""" ob = Test.PrivateIndexerTest() @@ -72,7 +72,7 @@ def test(): self.assertRaises(TypeError, test) - def testBooleanIndexer(self): + def test_boolean_indexer(self): """Test boolean indexers.""" ob = Test.BooleanIndexerTest() @@ -91,7 +91,7 @@ def testBooleanIndexer(self): ob[True] = "true" self.assertTrue(ob[True] == "true") - def testByteIndexer(self): + def test_byte_indexer(self): """Test byte indexers.""" ob = Test.ByteIndexerTest() max = 255 @@ -117,7 +117,7 @@ def test(): self.assertRaises(TypeError, test) - def testSByteIndexer(self): + def test_sbyte_indexer(self): """Test sbyte indexers.""" ob = Test.SByteIndexerTest() max = 127 @@ -143,7 +143,7 @@ def test(): self.assertRaises(TypeError, test) - def testCharIndexer(self): + def test_char_indexer(self): """Test char indexers.""" ob = Test.CharIndexerTest() max = unichr(65535) @@ -169,7 +169,7 @@ def test(): self.assertRaises(TypeError, test) - def testInt16Indexer(self): + def test_int16_indexer(self): """Test Int16 indexers.""" ob = Test.Int16IndexerTest() max = 32767 @@ -195,7 +195,7 @@ def test(): self.assertRaises(TypeError, test) - def testInt32Indexer(self): + def test_int32_indexer(self): """Test Int32 indexers.""" ob = Test.Int32IndexerTest() max = 2147483647 @@ -221,7 +221,7 @@ def test(): self.assertRaises(TypeError, test) - def testInt64Indexer(self): + def test_int64_indexer(self): """Test Int64 indexers.""" ob = Test.Int64IndexerTest() max = long(9223372036854775807) @@ -247,7 +247,7 @@ def test(): self.assertRaises(TypeError, test) - def testUInt16Indexer(self): + def test_uint16_indexer(self): """Test UInt16 indexers.""" ob = Test.UInt16IndexerTest() max = 65535 @@ -273,7 +273,7 @@ def test(): self.assertRaises(TypeError, test) - def testUInt32Indexer(self): + def test_uint32_indexer(self): """Test UInt32 indexers.""" ob = Test.UInt32IndexerTest() max = long(4294967295) @@ -299,7 +299,7 @@ def test(): self.assertRaises(TypeError, test) - def testUInt64Indexer(self): + def test_uint64_indexer(self): """Test UInt64 indexers.""" ob = Test.UInt64IndexerTest() max = long(18446744073709551615) @@ -325,7 +325,7 @@ def test(): self.assertRaises(TypeError, test) - def testSingleIndexer(self): + def test_single_indexer(self): """Test Single indexers.""" ob = Test.SingleIndexerTest() max = 3.402823e38 @@ -351,7 +351,7 @@ def test(): self.assertRaises(TypeError, test) - def testDoubleIndexer(self): + def test_double_indexer(self): """Test Double indexers.""" ob = Test.DoubleIndexerTest() max = 1.7976931348623157e308 @@ -377,7 +377,7 @@ def test(): self.assertRaises(TypeError, test) - def testDecimalIndexer(self): + def test_decimal_indexer(self): """Test Decimal indexers.""" ob = Test.DecimalIndexerTest() @@ -405,7 +405,7 @@ def test(): self.assertRaises(TypeError, test) - def testStringIndexer(self): + def test_string_indexer(self): """Test String indexers.""" ob = Test.StringIndexerTest() @@ -436,7 +436,7 @@ def test(): self.assertRaises(TypeError, test) - def testEnumIndexer(self): + def test_enum_indexer(self): """Test enum indexers.""" ob = Test.EnumIndexerTest() @@ -465,7 +465,7 @@ def test(): self.assertRaises(TypeError, test) - def testObjectIndexer(self): + def test_object_indexer(self): """Test ob indexers.""" ob = Test.ObjectIndexerTest() @@ -499,7 +499,7 @@ class eggs(object): self.assertRaises(TypeError, test) - def testInterfaceIndexer(self): + def test_interface_indexer(self): """Test interface indexers.""" ob = Test.InterfaceIndexerTest() @@ -526,7 +526,7 @@ def test(): self.assertRaises(TypeError, test) - def testTypedIndexer(self): + def test_typed_indexer(self): """Test typed indexers.""" ob = Test.TypedIndexerTest() @@ -553,7 +553,7 @@ def test(): self.assertRaises(TypeError, test) - def testMultiArgIndexer(self): + def test_multi_arg_indexer(self): """Test indexers that take multiple index arguments.""" ob = Test.MultiArgIndexerTest() @@ -577,7 +577,7 @@ def test(): self.assertRaises(TypeError, test) - def testMultiTypeIndexer(self): + def test_multi_type_indexer(self): """Test indexers that take multiple indices of different types.""" ob = Test.MultiTypeIndexerTest() spam = Test.Spam("spam") @@ -600,7 +600,7 @@ def test(): self.assertRaises(TypeError, test) - def testMultiDefaultKeyIndexer(self): + def test_multi_default_key_indexer(self): """Test indexers that take multiple indices with a default key arguments.""" # default argument is 2 in the MultiDefaultKeyIndexerTest object ob = Test.MultiDefaultKeyIndexerTest() @@ -610,7 +610,7 @@ def testMultiDefaultKeyIndexer(self): ob[1] = "one nine spam" self.assertTrue(ob[1, 2] == "one nine spam") - def testIndexerWrongKeyType(self): + def test_indexer_wrong_key_type(self): """Test calling an indexer using a key of the wrong type.""" def test(): @@ -625,7 +625,7 @@ def test(): self.assertRaises(TypeError, test) - def testIndexerWrongValueType(self): + def test_indexer_wrong_value_type(self): """Test calling an indexer using a value of the wrong type.""" def test(): @@ -634,7 +634,7 @@ def test(): self.assertRaises(TypeError, test) - def testUnboundIndexer(self): + def test_unbound_indexer(self): """Test calling an unbound indexer.""" ob = Test.PublicIndexerTest() @@ -646,7 +646,7 @@ def testUnboundIndexer(self): self.assertTrue(ob[10] == None) - def testIndexerAbuse(self): + def test_indexer_abuse(self): """Test indexer abuse.""" _class = Test.PublicIndexerTest ob = Test.PublicIndexerTest() diff --git a/src/tests/test_interface.py b/src/tests/test_interface.py index 6bc05fd5f..d47c6279a 100644 --- a/src/tests/test_interface.py +++ b/src/tests/test_interface.py @@ -10,7 +10,7 @@ class InterfaceTests(unittest.TestCase): """Test CLR interface support.""" - def testInterfaceStandardAttrs(self): + def test_interface_standard_attrs(self): """Test standard class attributes.""" from Python.Test import IPublicInterface @@ -18,7 +18,7 @@ def testInterfaceStandardAttrs(self): self.assertTrue(IPublicInterface.__module__ == 'Python.Test') self.assertTrue(type(IPublicInterface.__dict__) == DictProxyType) - def testGlobalInterfaceVisibility(self): + def test_global_interface_visibility(self): """Test visibility of module-level interfaces.""" from Python.Test import IPublicInterface @@ -34,7 +34,7 @@ def test(): self.assertRaises(AttributeError, test) - def testNestedInterfaceVisibility(self): + def test_nested_interface_visibility(self): """Test visibility of nested interfaces.""" from Python.Test import InterfaceTest @@ -54,7 +54,7 @@ def test(): self.assertRaises(AttributeError, test) - def testExplicitCastToInterface(self): + def test_explicit_cast_to_interface(self): """Test explicit cast to an interface.""" from Python.Test import InterfaceTest diff --git a/src/tests/test_method.py b/src/tests/test_method.py index 0430bb019..677a69b52 100644 --- a/src/tests/test_method.py +++ b/src/tests/test_method.py @@ -11,7 +11,7 @@ class MethodTests(unittest.TestCase): """Test CLR method support.""" - def testInstanceMethodDescriptor(self): + def test_instance_method_descriptor(self): """Test instance method descriptor behavior.""" def test(): @@ -34,7 +34,7 @@ def test(): self.assertRaises(AttributeError, test) - def testStaticMethodDescriptor(self): + def test_static_method_descriptor(self): """Test static method descriptor behavior.""" def test(): @@ -57,30 +57,30 @@ def test(): self.assertRaises(AttributeError, test) - def testPublicInstanceMethod(self): + def test_public_instance_method(self): """Test public instance method visibility.""" ob = MethodTest() self.assertTrue(ob.PublicMethod() == "public") - def testPublicStaticMethod(self): + def test_public_static_method(self): """Test public static method visibility.""" ob = MethodTest() self.assertTrue(MethodTest.PublicStaticMethod() == "public static") self.assertTrue(ob.PublicStaticMethod() == "public static") - def testProtectedInstanceMethod(self): + def test_protected_instance_method(self): """Test protected instance method visibility.""" ob = MethodTest() self.assertTrue(ob.ProtectedMethod() == "protected") - def testProtectedStaticMethod(self): + def test_protected_static_method(self): """Test protected static method visibility.""" ob = MethodTest() result = "protected static" self.assertTrue(MethodTest.ProtectedStaticMethod() == result) self.assertTrue(ob.ProtectedStaticMethod() == result) - def testInternalMethod(self): + def test_internal_method(self): """Test internal method visibility.""" def test(): @@ -103,7 +103,7 @@ def test(): self.assertRaises(AttributeError, test) - def testPrivateMethod(self): + def test_private_method(self): """Test private method visibility.""" def test(): @@ -126,7 +126,7 @@ def test(): self.assertRaises(AttributeError, test) - def testUnboundManagedMethodCall(self): + def test_unbound_managed_method_call(self): """Test calling unbound managed methods.""" from Python.Test import MethodTestSub @@ -147,7 +147,7 @@ def test(): self.assertRaises(TypeError, test) - def testOverloadedMethodInheritance(self): + def test_overloaded_method_inheritance(self): """Test that overloads are inherited properly.""" from Python.Test import MethodTestSub @@ -165,7 +165,7 @@ def test(): self.assertTrue(ob.PublicMethod("echo") == "echo") - def testMethodDescriptorAbuse(self): + def test_method_descriptor_abuse(self): """Test method descriptor abuse.""" desc = MethodTest.__dict__['PublicMethod'] @@ -179,7 +179,7 @@ def test(): self.assertRaises(AttributeError, test) - def testMethodDocstrings(self): + def test_method_docstrings(self): """Test standard method docstring generation""" method = MethodTest.GetType value = 'System.Type GetType()' @@ -189,7 +189,7 @@ def testMethodDocstrings(self): # Tests of specific argument and result conversion scenarios # ====================================================================== - def testMethodCallEnumConversion(self): + def test_method_call_enum_conversion(self): """Test enum conversion in method call.""" from System import TypeCode @@ -197,7 +197,7 @@ def testMethodCallEnumConversion(self): r = ob.TestEnumConversion(TypeCode.Int32) self.assertTrue(r == TypeCode.Int32) - def testMethodCallFlagsConversion(self): + def test_method_call_flags_conversion(self): """Test flags conversion in method call.""" from System.IO import FileAccess @@ -206,7 +206,7 @@ def testMethodCallFlagsConversion(self): r = ob.TestFlagsConversion(flags) self.assertTrue(r == flags) - def testMethodCallStructConversion(self): + def test_method_call_struct_conversion(self): """Test struct conversion in method call.""" from System import Guid @@ -216,7 +216,7 @@ def testMethodCallStructConversion(self): r = ob.TestStructConversion(guid) self.assertTrue(r.ToString() == temp) - def testSubclassInstanceConversion(self): + def test_subclass_instance_conversion(self): """Test subclass instance conversion in method call.""" class TestSubException(System.Exception): @@ -227,7 +227,7 @@ class TestSubException(System.Exception): result = ob.TestSubclassConversion(instance) self.assertTrue(isinstance(result, System.Exception)) - def testNullArrayConversion(self): + def test_null_array_conversion(self): """Test null array conversion in method call.""" from System import Type @@ -235,7 +235,7 @@ def testNullArrayConversion(self): r = ob.TestNullArrayConversion(None) self.assertTrue(r == None) - def testStringParamsArgs(self): + def test_string_params_args(self): """Test use of string params.""" result = MethodTest.TestStringParamsArg('one', 'two', 'three') self.assertEqual(result.Length, 3) @@ -250,7 +250,7 @@ def testStringParamsArgs(self): self.assertTrue(result[1] == 'two') self.assertTrue(result[2] == 'three') - def testObjectParamsArgs(self): + def test_object_params_args(self): """Test use of object params.""" result = MethodTest.TestObjectParamsArg('one', 'two', 'three') self.assertEqual(len(result), 3, result) @@ -264,7 +264,7 @@ def testObjectParamsArgs(self): self.assertTrue(result[1] == 'two') self.assertTrue(result[2] == 'three') - def testValueParamsArgs(self): + def test_value_params_args(self): """Test use of value type params.""" result = MethodTest.TestValueParamsArg(1, 2, 3) self.assertEqual(len(result), 3) @@ -278,12 +278,12 @@ def testValueParamsArgs(self): self.assertTrue(result[1] == 2) self.assertTrue(result[2] == 3) - def testNonParamsArrayInLastPlace(self): + def test_non_params_array_in_last_place(self): """Test overload resolution with of non-"params" array as last parameter.""" result = MethodTest.TestNonParamsArrayInLastPlace(1, 2, 3) self.assertTrue(result) - def testStringOutParams(self): + def test_string_out_params(self): """Test use of string out-parameters.""" result = MethodTest.TestStringOutParams("hi", "there") self.assertTrue(type(result) == type(())) @@ -297,7 +297,7 @@ def testStringOutParams(self): self.assertTrue(result[0] == True) self.assertTrue(result[1] == "output string") - def testStringRefParams(self): + def test_string_ref_params(self): """Test use of string byref parameters.""" result = MethodTest.TestStringRefParams("hi", "there") self.assertTrue(type(result) == type(())) @@ -311,7 +311,7 @@ def testStringRefParams(self): self.assertTrue(result[0] == True) self.assertTrue(result[1] == "output string") - def testValueOutParams(self): + def test_value_out_params(self): """Test use of value type out-parameters.""" result = MethodTest.TestValueOutParams("hi", 1) self.assertTrue(type(result) == type(())) @@ -325,7 +325,7 @@ def test(): # None cannot be converted to a value type like int, long, etc. self.assertRaises(TypeError, test) - def testValueRefParams(self): + def test_value_ref_params(self): """Test use of value type byref parameters.""" result = MethodTest.TestValueRefParams("hi", 1) self.assertTrue(type(result) == type(())) @@ -339,7 +339,7 @@ def test(): # None cannot be converted to a value type like int, long, etc. self.assertRaises(TypeError, test) - def testObjectOutParams(self): + def test_object_out_params(self): """Test use of object out-parameters.""" result = MethodTest.TestObjectOutParams("hi", MethodTest()) self.assertTrue(type(result) == type(())) @@ -353,7 +353,7 @@ def testObjectOutParams(self): self.assertTrue(result[0] == True) self.assertTrue(isinstance(result[1], System.Exception)) - def testObjectRefParams(self): + def test_object_ref_params(self): """Test use of object byref parameters.""" result = MethodTest.TestObjectRefParams("hi", MethodTest()) self.assertTrue(type(result) == type(())) @@ -367,7 +367,7 @@ def testObjectRefParams(self): self.assertTrue(result[0] == True) self.assertTrue(isinstance(result[1], System.Exception)) - def testStructOutParams(self): + def test_struct_out_params(self): """Test use of struct out-parameters.""" result = MethodTest.TestStructOutParams("hi", System.Guid.NewGuid()) self.assertTrue(type(result) == type(())) @@ -381,7 +381,7 @@ def test(): # None cannot be converted to a value type like a struct self.assertRaises(TypeError, test) - def testStructRefParams(self): + def test_struct_ref_params(self): """Test use of struct byref parameters.""" result = MethodTest.TestStructRefParams("hi", System.Guid.NewGuid()) self.assertTrue(type(result) == type(())) @@ -395,7 +395,7 @@ def test(): # None cannot be converted to a value type like a struct self.assertRaises(TypeError, test) - def testVoidSingleOutParam(self): + def test_void_single_out_param(self): """Test void method with single out-parameter.""" result = MethodTest.TestVoidSingleOutParam(9) self.assertTrue(result == 42) @@ -406,7 +406,7 @@ def test(): # None cannot be converted to a value type self.assertRaises(TypeError, test) - def testVoidSingleRefParam(self): + def test_void_single_ref_param(self): """Test void method with single ref-parameter.""" result = MethodTest.TestVoidSingleRefParam(9) self.assertTrue(result == 42) @@ -417,12 +417,12 @@ def test(): # None cannot be converted to a value type self.assertRaises(TypeError, test) - def testSingleDefaultParam(self): + def test_single_default_param(self): """Test void method with single ref-parameter.""" result = MethodTest.TestSingleDefaultParam() self.assertTrue(result == 5) - def testOneArgAndTwoDefaultParam(self): + def test_one_arg_and_two_default_param(self): """Test void method with single ref-parameter.""" result = MethodTest.TestOneArgAndTwoDefaultParam(11) self.assertTrue(result == 22) @@ -433,12 +433,12 @@ def testOneArgAndTwoDefaultParam(self): result = MethodTest.TestOneArgAndTwoDefaultParam(20) self.assertTrue(result == 31) - def testTwoDefaultParam(self): + def test_two_default_param(self): """Test void method with single ref-parameter.""" result = MethodTest.TestTwoDefaultParam() self.assertTrue(result == 11) - def testExplicitSelectionWithOutModifier(self): + def test_explicit_selection_with_out_modifier(self): """Check explicit overload selection with out modifiers.""" refstr = System.String("").GetType().MakeByRefType() result = MethodTest.TestStringOutParams.__overloads__[str, refstr]( @@ -457,7 +457,7 @@ def testExplicitSelectionWithOutModifier(self): self.assertTrue(result[0] == True) self.assertTrue(result[1] == "output string") - def testExplicitSelectionWithRefModifier(self): + def test_explicit_selection_with_ref_modifier(self): """Check explicit overload selection with ref modifiers.""" refstr = System.String("").GetType().MakeByRefType() result = MethodTest.TestStringRefParams.__overloads__[str, refstr]( @@ -476,7 +476,7 @@ def testExplicitSelectionWithRefModifier(self): self.assertTrue(result[0] == True) self.assertTrue(result[1] == "output string") - def testExplicitOverloadSelection(self): + def test_explicit_overload_selection(self): """Check explicit overload selection using [] syntax.""" from Python.Test import ISayHello1, InterfaceTest, ShortEnum from System import Array @@ -580,7 +580,7 @@ def testExplicitOverloadSelection(self): value = MethodTest.Overloaded.__overloads__[int, str](1, "one") self.assertTrue(value == 1) - def testOverloadSelectionWithArrayTypes(self): + def test_overload_selection_with_array_types(self): """Check overload selection using array types.""" from Python.Test import ISayHello1, InterfaceTest, ShortEnum from System import Array @@ -732,7 +732,7 @@ def testOverloadSelectionWithArrayTypes(self): self.assertTrue(value[0].__class__ == inst.__class__) self.assertTrue(value[1].__class__ == inst.__class__) - def testExplicitOverloadSelectionFailure(self): + def test_explicit_overload_selection_failure(self): """Check that overload selection fails correctly.""" def test(): @@ -757,7 +757,7 @@ def test(): self.assertRaises(TypeError, test) - def testWeCanBindToEncodingGetString(self): + def test_we_can_bind_to_encoding_get_string(self): """Check that we can bind to the Encoding.GetString method with variables.""" from System.Text import Encoding diff --git a/src/tests/test_module.py b/src/tests/test_module.py index 4748c0497..998124d67 100644 --- a/src/tests/test_module.py +++ b/src/tests/test_module.py @@ -16,21 +16,21 @@ class ModuleTests(unittest.TestCase): """Test CLR modules and the CLR import hook.""" - def testAAAImportHookWorks(self): + def test_import_hook_works(self): """Test that the import hook works correctly both using the included runtime and an external runtime. This must be the first test run in the unit tests!""" from System import String - def test000importClr(self): + def test_import_clr(self): import clr self.assertTrue(isCLRRootModule(clr)) - def testVersionClr(self): + def test_version_clr(self): import clr self.assertTrue(clr.__version__ >= "2.2.0") - def testPreloadVar(self): + def test_preload_var(self): import clr self.assertTrue(clr.getPreload() is False, clr.getPreload()) clr.setPreload(False) @@ -49,7 +49,7 @@ def testPreloadVar(self): finally: clr.setPreload(False) - def testModuleInterface(self): + def test_module_interface(self): """Test the interface exposed by CLR module objects.""" import System self.assertEquals(type(System.__dict__), type({})) @@ -63,7 +63,7 @@ def testModuleInterface(self): self.assertTrue(isCLRClass(System.String)) self.assertTrue(isCLRClass(System.Int32)) - def testSimpleImport(self): + def test_simple_import(self): """Test simple import.""" import System self.assertTrue(isCLRModule(System)) @@ -82,7 +82,7 @@ def testSimpleImport(self): self.assertTrue(type(httplib) == types.ModuleType) self.assertTrue(httplib.__name__ == 'httplib') - def testSimpleImportWithAlias(self): + def test_simple_import_with_alias(self): """Test simple import with aliasing.""" import System as mySystem self.assertTrue(isCLRModule(mySystem)) @@ -101,7 +101,7 @@ def testSimpleImportWithAlias(self): self.assertTrue(type(myHttplib) == types.ModuleType) self.assertTrue(myHttplib.__name__ == 'httplib') - def testDottedNameImport(self): + def test_dotted_name_import(self): """Test dotted-name import.""" import System.Reflection self.assertTrue(isCLRModule(System.Reflection)) @@ -111,7 +111,7 @@ def testDottedNameImport(self): self.assertTrue(type(xml.dom) == types.ModuleType) self.assertTrue(xml.dom.__name__ == 'xml.dom') - def testMultipleDottedNameImport(self): + def test_multiple_dotted_name_import(self): """Test an import bug with multiple dotted imports.""" import System.Data self.assertTrue(isCLRModule(System.Data)) @@ -120,7 +120,7 @@ def testMultipleDottedNameImport(self): self.assertTrue(isCLRModule(System.Data)) self.assertTrue(System.Data.__name__ == 'System.Data') - def testDottedNameImportWithAlias(self): + def test_dotted_name_import_with_alias(self): """Test dotted-name import with aliasing.""" import System.Reflection as SysRef self.assertTrue(isCLRModule(SysRef)) @@ -130,7 +130,7 @@ def testDottedNameImportWithAlias(self): self.assertTrue(type(myDom) == types.ModuleType) self.assertTrue(myDom.__name__ == 'xml.dom') - def testSimpleImportFrom(self): + def test_simple_import_from(self): """Test simple 'import from'.""" from System import Reflection self.assertTrue(isCLRModule(Reflection)) @@ -140,7 +140,7 @@ def testSimpleImportFrom(self): self.assertTrue(type(dom) == types.ModuleType) self.assertTrue(dom.__name__ == 'xml.dom') - def testSimpleImportFromWithAlias(self): + def test_simple_import_from_with_alias(self): """Test simple 'import from' with aliasing.""" from System import Collections as Coll self.assertTrue(isCLRModule(Coll)) @@ -150,7 +150,7 @@ def testSimpleImportFromWithAlias(self): self.assertTrue(type(myDom) == types.ModuleType) self.assertTrue(myDom.__name__ == 'xml.dom') - def testDottedNameImportFrom(self): + def test_dotted_name_import_from(self): """Test dotted-name 'import from'.""" from System.Collections import Specialized self.assertTrue(isCLRModule(Specialized)) @@ -170,7 +170,7 @@ def testDottedNameImportFrom(self): self.assertTrue(type(PullDOM) == ClassType) self.assertTrue(PullDOM.__name__ == 'PullDOM') - def testDottedNameImportFromWithAlias(self): + def test_dotted_name_import_from_with_alias(self): """Test dotted-name 'import from' with aliasing.""" from System.Collections import Specialized as Spec self.assertTrue(isCLRModule(Spec)) @@ -188,7 +188,7 @@ def testDottedNameImportFromWithAlias(self): self.assertTrue(type(myPullDOM) == ClassType) self.assertTrue(myPullDOM.__name__ == 'PullDOM') - def testFromModuleImportStar(self): + def test_from_module_import_star(self): """Test from module import * behavior.""" count = len(locals().keys()) m = __import__('System.Xml', globals(), locals(), ['*']) @@ -196,7 +196,7 @@ def testFromModuleImportStar(self): self.assertTrue(isCLRModule(m)) self.assertTrue(len(locals().keys()) > count + 1) - def testImplicitAssemblyLoad(self): + def test_implicit_assembly_load(self): """Test implicit assembly loading via import.""" with warnings.catch_warnings(record=True) as w: warnings.simplefilter("always") @@ -218,7 +218,7 @@ def testImplicitAssemblyLoad(self): self.assertTrue(Form.__name__ == 'Form') self.assertEqual(len(w), 0) - def testExplicitAssemblyLoad(self): + def test_explicit_assembly_load(self): """Test explicit assembly loading using standard CLR tools.""" from System.Reflection import Assembly import System, sys @@ -232,7 +232,7 @@ def testExplicitAssemblyLoad(self): assembly = Assembly.LoadWithPartialName('SpamSpamSpamSpamEggsAndSpam') self.assertTrue(assembly == None) - def testImplicitLoadAlreadyValidNamespace(self): + def test_implicit_load_already_valid_namespace(self): """Test implicit assembly load over an already valid namespace.""" # In this case, the mscorlib assembly (loaded by default) defines # a number of types in the System namespace. There is also a System @@ -243,7 +243,7 @@ def testImplicitLoadAlreadyValidNamespace(self): import System self.assertTrue(isCLRClass(System.UriBuilder)) - def testImportNonExistantModule(self): + def test_import_non_existant_module(self): """Test import failure for a non-existant module.""" def test(): @@ -251,13 +251,13 @@ def test(): self.assertTrue(ImportError, test) - def testLookupNoNamespaceType(self): + def test_lookup_no_namespace_type(self): """Test lookup of types without a qualified namespace.""" import Python.Test import clr self.assertTrue(isCLRClass(clr.NoNamespaceType)) - def testModuleLookupRecursion(self): + def test_module_lookup_recursion(self): """Test for recursive lookup handling.""" def test1(): @@ -271,7 +271,7 @@ def test2(): self.assertTrue(AttributeError, test2) - def testModuleGetAttr(self): + def test_module_get_attr(self): """Test module getattr behavior.""" import System @@ -291,7 +291,7 @@ def test(): self.assertTrue(TypeError, test) - def testModuleAttrAbuse(self): + def test_module_attr_abuse(self): """Test handling of attempts to set module attributes.""" # It would be safer to use a dict-proxy as the __dict__ for CLR @@ -305,7 +305,7 @@ def test(): self.assertTrue(test()) - def testModuleTypeAbuse(self): + def test_module_type_abuse(self): """Test handling of attempts to break the module type.""" import System mtype = type(System) @@ -325,7 +325,7 @@ def test(): self.assertTrue(TypeError, test) - def test_ClrListAssemblies(self): + def test_clr_list_assemblies(self): from clr import ListAssemblies verbose = list(ListAssemblies(True)) short = list(ListAssemblies(False)) @@ -334,7 +334,7 @@ def test_ClrListAssemblies(self): self.assertTrue(u'Culture=' in verbose[0]) self.assertTrue(u'Version=' in verbose[0]) - def test_ClrAddReference(self): + def test_clr_add_reference(self): from clr import AddReference from System.IO import FileNotFoundException for name in ("System", "Python.Runtime"): @@ -345,7 +345,7 @@ def test_ClrAddReference(self): self.assertRaises(FileNotFoundException, AddReference, "somethingtotallysilly") - def test_AssemblyLoadThreadSafety(self): + def test_assembly_load_thread_safety(self): import time from Python.Test import ModuleTest # spin up .NET thread which loads assemblies and triggers AppDomain.AssemblyLoad event diff --git a/src/tests/test_property.py b/src/tests/test_property.py index b0676f6b1..d8d967658 100644 --- a/src/tests/test_property.py +++ b/src/tests/test_property.py @@ -8,7 +8,7 @@ class PropertyTests(unittest.TestCase): """Test CLR property support.""" - def testPublicInstanceProperty(self): + def test_public_instance_property(self): """Test public instance properties.""" ob = PropertyTest() @@ -21,7 +21,7 @@ def test(): self.assertRaises(TypeError, test) - def testPublicStaticProperty(self): + def test_public_static_property(self): """Test public static properties.""" ob = PropertyTest() @@ -43,7 +43,7 @@ def test(): self.assertRaises(TypeError, test) - def testProtectedInstanceProperty(self): + def test_protected_instance_property(self): """Test protected instance properties.""" ob = PropertyTest() @@ -56,7 +56,7 @@ def test(): self.assertRaises(TypeError, test) - def testProtectedStaticProperty(self): + def test_protected_static_property(self): """Test protected static properties.""" ob = PropertyTest() @@ -78,7 +78,7 @@ def test(): self.assertRaises(TypeError, test) - def testInternalProperty(self): + def test_internal_property(self): """Test internal properties.""" def test(): @@ -96,7 +96,7 @@ def test(): self.assertRaises(AttributeError, test) - def testPrivateProperty(self): + def test_private_property(self): """Test private properties.""" def test(): @@ -114,7 +114,7 @@ def test(): self.assertRaises(AttributeError, test) - def testPropertyDescriptorGetSet(self): + def test_property_descriptor_get_set(self): """Test property descriptor get / set.""" # This test ensures that setting an attribute implemented with @@ -137,7 +137,7 @@ def testPropertyDescriptorGetSet(self): descriptor = PropertyTest.__dict__['PublicStaticProperty'] self.assertTrue(type(descriptor) != int) - def testPropertyDescriptorWrongType(self): + def test_property_descriptor_wrong_type(self): """Test setting a property using a value of the wrong type.""" def test(): @@ -146,7 +146,7 @@ def test(): self.assertTrue(TypeError, test) - def testPropertyDescriptorAbuse(self): + def test_property_descriptor_abuse(self): """Test property descriptor abuse.""" desc = PropertyTest.__dict__['PublicProperty'] @@ -160,7 +160,7 @@ def test(): self.assertRaises(TypeError, test) - def testInterfaceProperty(self): + def test_interface_property(self): """Test properties of interfaces. Added after a bug report that an IsAbstract check was inappropriate and prevented use of properties when only the interface is known.""" diff --git a/src/tests/test_subclass.py b/src/tests/test_subclass.py index 444d0a116..a1caa27a9 100644 --- a/src/tests/test_subclass.py +++ b/src/tests/test_subclass.py @@ -69,7 +69,7 @@ def OnTestEvent(self, value): class SubClassTests(unittest.TestCase): """Test subclassing managed types""" - def testBaseClass(self): + def test_base_class(self): """Test base class managed type""" ob = SubClassTest() self.assertEqual(ob.foo(), "foo") @@ -80,7 +80,7 @@ def testBaseClass(self): self.assertEqual(list(ob.return_list()), ["a", "b", "c"]) self.assertEqual(list(SubClassTest.test_list(ob)), ["a", "b", "c"]) - def testInterface(self): + def test_interface(self): """Test python classes can derive from C# interfaces""" ob = InterfaceTestClass() self.assertEqual(ob.foo(), "InterfaceTestClass") @@ -91,7 +91,7 @@ def testInterface(self): x = TestFunctions.pass_through(ob) self.assertEqual(id(x), id(ob)) - def testDerivedClass(self): + def test_derived_class(self): """Test python class derived from managed type""" ob = DerivedClass() self.assertEqual(ob.foo(), "DerivedClass") @@ -107,7 +107,7 @@ def testDerivedClass(self): x = TestFunctions.pass_through(ob) self.assertEqual(id(x), id(ob)) - def testCreateInstance(self): + def test_create_instance(self): """Test derived instances can be created from managed code""" ob = TestFunctions.create_instance(DerivedClass) self.assertEqual(ob.foo(), "DerivedClass") @@ -128,7 +128,7 @@ def testCreateInstance(self): y = TestFunctions.pass_through(ob2) self.assertEqual(id(y), id(ob2)) - def testEvents(self): + def test_events(self): class EventHandler(object): def handler(self, x, args): self.value = args.value diff --git a/src/tests/test_suite/test_callback.py b/src/tests/test_suite/test_callback.py index 7a5e473be..412a27a66 100644 --- a/src/tests/test_suite/test_callback.py +++ b/src/tests/test_suite/test_callback.py @@ -10,7 +10,7 @@ def simpleDefaultArg(arg='test'): class CallbackTests(unittest.TestCase): """Test that callbacks from C# into python work.""" - def testDefaultForNull(self): + def test_default_for_null(self): """Test that C# can use null for an optional python argument""" from Python.Test import CallbackTest @@ -19,7 +19,7 @@ def testDefaultForNull(self): pythonRetVal = simpleDefaultArg(None) self.assertEquals(retVal, pythonRetVal) - def testDefaultForNone(self): + def test_default_for_none(self): """Test that C# can use no argument for an optional python argument""" from Python.Test import CallbackTest diff --git a/src/tests/test_suite/test_import.py b/src/tests/test_suite/test_import.py index f3ffbc870..baea6d5cf 100644 --- a/src/tests/test_suite/test_import.py +++ b/src/tests/test_suite/test_import.py @@ -6,7 +6,7 @@ class ImportTests(unittest.TestCase): """Test the import statement.""" - def testRelativeMissingImport(self): + def test_relative_missing_import(self): """Test that a relative missing import doesn't crash. Some modules use this to check if a package is installed. Relative import in the site-packages folder""" diff --git a/src/tests/test_suite/test_recursive_types.py b/src/tests/test_suite/test_recursive_types.py index 32bcad26e..a213937a5 100644 --- a/src/tests/test_suite/test_recursive_types.py +++ b/src/tests/test_suite/test_recursive_types.py @@ -6,7 +6,7 @@ class RecursiveTypesTests(unittest.TestCase): """Test if interop with recursive type inheritance works.""" - def testRecursiveTypeCreation(self): + def test_recursive_type_creation(self): """Test that a recursive types don't crash with a StackOverflowException""" from Python.Test import RecursiveInheritance diff --git a/src/tests/test_thread.py b/src/tests/test_thread.py index 5f395d9aa..0f947933a 100644 --- a/src/tests/test_thread.py +++ b/src/tests/test_thread.py @@ -18,7 +18,7 @@ def dprint(msg): class ThreadTests(unittest.TestCase): """Test CLR bridge threading and GIL handling.""" - def testSimpleCallbackToPython(self): + def test_simple_callback_to_python(self): """Test a call to managed code that then calls back into Python.""" from Python.Test import ThreadTest @@ -27,7 +27,7 @@ def testSimpleCallbackToPython(self): self.assertTrue(result == "spam") dprint("thread %s SimpleCallBack ret" % thread.get_ident()) - def testDoubleCallbackToPython(self): + def test_double_callback_to_python(self): """Test a call to managed code that then calls back into Python that then calls managed code that then calls Python again.""" from Python.Test import ThreadTest @@ -37,7 +37,7 @@ def testDoubleCallbackToPython(self): self.assertTrue(result == "spam") dprint("thread %s DoubleCallBack ret" % thread.get_ident()) - def testPythonThreadCallsToCLR(self): + def test_python_thread_calls_to_clr(self): """Test calls by Python-spawned threads into managed code.""" # This test is very likely to hang if something is wrong ;) import System From 04cf0b5ae8842f5af84e874fd723ccf701dcfdda Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 22 Jan 2017 00:13:43 -0700 Subject: [PATCH 041/324] Refactor assertRaises test_exceptions: Add exc_info test & fix Exception nameclash --- src/tests/test_array.py | 324 +++++++--------------------- src/tests/test_class.py | 19 +- src/tests/test_compat.py | 31 +-- src/tests/test_conversion.py | 304 +++++++------------------- src/tests/test_delegate.py | 36 +--- src/tests/test_enum.py | 32 +-- src/tests/test_event.py | 84 ++------ src/tests/test_exceptions.py | 188 +++++++--------- src/tests/test_field.py | 108 +++------- src/tests/test_generic.py | 28 +-- src/tests/test_indexer.py | 200 +++++------------ src/tests/test_interface.py | 18 +- src/tests/test_method.py | 124 +++-------- src/tests/test_module.py | 39 +--- src/tests/test_property.py | 72 ++----- src/tests/test_suite/test_import.py | 4 +- 16 files changed, 443 insertions(+), 1168 deletions(-) diff --git a/src/tests/test_array.py b/src/tests/test_array.py index b12c785e7..a107253c6 100644 --- a/src/tests/test_array.py +++ b/src/tests/test_array.py @@ -58,21 +58,17 @@ def test_protected_array(self): def test_internal_array(self): """Test internal arrays.""" - def test(): + with self.assertRaises(AttributeError): ob = Test.InternalArrayTest() items = ob.items - self.assertRaises(AttributeError, test) - def test_private_array(self): """Test private arrays.""" - def test(): + with self.assertRaises(AttributeError): ob = Test.PrivateArrayTest() items = ob.items - self.assertRaises(AttributeError, test) - def test_array_bounds_checking(self): """Test array bounds checking.""" @@ -91,30 +87,22 @@ def test_array_bounds_checking(self): self.assertTrue(items[-2] == 3) self.assertTrue(items[-1] == 4) - def test(): + with self.assertRaises(IndexError): ob = Test.Int32ArrayTest() ob.items[5] - self.assertRaises(IndexError, test) - - def test(): + with self.assertRaises(IndexError): ob = Test.Int32ArrayTest() ob.items[5] = 0 - self.assertRaises(IndexError, test) - - def test(): + with self.assertRaises(IndexError): ob = Test.Int32ArrayTest() items[-6] - self.assertRaises(IndexError, test) - - def test(): + with self.assertRaises(IndexError): ob = Test.Int32ArrayTest() items[-6] = 0 - self.assertRaises(IndexError, test) - def test_array_contains(self): """Test array support for __contains__.""" @@ -151,18 +139,14 @@ def test_boolean_array(self): items[0] = True self.assertTrue(items[0] == True) - def test(): + with self.assertRaises(TypeError): ob = Test.ByteArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.ByteArrayTest() ob[0] = "wrong" - self.assertRaises(TypeError, test) - def test_byte_array(self): """Test byte arrays.""" ob = Test.ByteArrayTest() @@ -188,30 +172,22 @@ def test_byte_array(self): items[-1] = min self.assertTrue(items[-1] == min) - def test(): + with self.assertRaises(OverflowError): ob = Test.ByteArrayTest() ob.items[0] = max + 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ob = Test.ByteArrayTest() ob.items[0] = min - 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.ByteArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.ByteArrayTest() ob[0] = "wrong" - self.assertRaises(TypeError, test) - def test_sbyte_array(self): """Test sbyte arrays.""" ob = Test.SByteArrayTest() @@ -237,30 +213,22 @@ def test_sbyte_array(self): items[-1] = min self.assertTrue(items[-1] == min) - def test(): + with self.assertRaises(OverflowError): ob = Test.SByteArrayTest() ob.items[0] = max + 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ob = Test.SByteArrayTest() ob.items[0] = min - 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.SByteArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.SByteArrayTest() ob[0] = "wrong" - self.assertRaises(TypeError, test) - def test_char_array(self): """Test char arrays.""" ob = Test.CharArrayTest() @@ -286,18 +254,14 @@ def test_char_array(self): items[-1] = min self.assertTrue(items[-1] == min) - def test(): + with self.assertRaises(TypeError): ob = Test.CharArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.CharArrayTest() ob[0] = "wrong" - self.assertRaises(TypeError, test) - def test_int16_array(self): """Test Int16 arrays.""" ob = Test.Int16ArrayTest() @@ -323,30 +287,22 @@ def test_int16_array(self): items[-1] = min self.assertTrue(items[-1] == min) - def test(): + with self.assertRaises(OverflowError): ob = Test.Int16ArrayTest() ob.items[0] = max + 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ob = Test.Int16ArrayTest() ob.items[0] = min - 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.Int16ArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.Int16ArrayTest() ob[0] = "wrong" - self.assertRaises(TypeError, test) - def test_int32_array(self): """Test Int32 arrays.""" ob = Test.Int32ArrayTest() @@ -372,30 +328,22 @@ def test_int32_array(self): items[-1] = min self.assertTrue(items[-1] == min) - def test(): + with self.assertRaises(OverflowError): ob = Test.Int32ArrayTest() ob.items[0] = max + 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ob = Test.Int32ArrayTest() ob.items[0] = min - 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.Int32ArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.Int32ArrayTest() ob[0] = "wrong" - self.assertRaises(TypeError, test) - def test_int64_array(self): """Test Int64 arrays.""" ob = Test.Int64ArrayTest() @@ -421,30 +369,22 @@ def test_int64_array(self): items[-1] = min self.assertTrue(items[-1] == min) - def test(): + with self.assertRaises(OverflowError): ob = Test.Int64ArrayTest() ob.items[0] = max + 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ob = Test.Int64ArrayTest() ob.items[0] = min - 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.Int64ArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.Int64ArrayTest() ob[0] = "wrong" - self.assertRaises(TypeError, test) - def test_uint16_array(self): """Test UInt16 arrays.""" ob = Test.UInt16ArrayTest() @@ -470,30 +410,22 @@ def test_uint16_array(self): items[-1] = min self.assertTrue(items[-1] == min) - def test(): + with self.assertRaises(OverflowError): ob = Test.UInt16ArrayTest() ob.items[0] = max + 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ob = Test.UInt16ArrayTest() ob.items[0] = min - 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.UInt16ArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.UInt16ArrayTest() ob[0] = "wrong" - self.assertRaises(TypeError, test) - def test_uint32_array(self): """Test UInt32 arrays.""" ob = Test.UInt32ArrayTest() @@ -519,30 +451,22 @@ def test_uint32_array(self): items[-1] = min self.assertTrue(items[-1] == min) - def test(): + with self.assertRaises(OverflowError): ob = Test.UInt32ArrayTest() ob.items[0] = max + 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ob = Test.UInt32ArrayTest() ob.items[0] = min - 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.UInt32ArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.UInt32ArrayTest() ob[0] = "wrong" - self.assertRaises(TypeError, test) - def test_uint64_array(self): """Test UInt64 arrays.""" ob = Test.UInt64ArrayTest() @@ -568,30 +492,22 @@ def test_uint64_array(self): items[-1] = min self.assertTrue(items[-1] == min) - def test(): + with self.assertRaises(OverflowError): ob = Test.UInt64ArrayTest() ob.items[0] = max + 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ob = Test.UInt64ArrayTest() ob.items[0] = min - 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.UInt64ArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.UInt64ArrayTest() ob[0] = "wrong" - self.assertRaises(TypeError, test) - def test_single_array(self): """Test Single arrays.""" ob = Test.SingleArrayTest() @@ -617,18 +533,14 @@ def test_single_array(self): items[-1] = min self.assertTrue(items[-1] == min) - def test(): + with self.assertRaises(TypeError): ob = Test.SingleArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.SingleArrayTest() ob[0] = "wrong" - self.assertRaises(TypeError, test) - def test_double_array(self): """Test Double arrays.""" ob = Test.DoubleArrayTest() @@ -654,18 +566,14 @@ def test_double_array(self): items[-1] = min self.assertTrue(items[-1] == min) - def test(): + with self.assertRaises(TypeError): ob = Test.DoubleArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.DoubleArrayTest() ob[0] = "wrong" - self.assertRaises(TypeError, test) - def test_decimal_array(self): """Test Decimal arrays.""" ob = Test.DecimalArrayTest() @@ -692,18 +600,14 @@ def test_decimal_array(self): items[-1] = min_d self.assertTrue(items[-1] == min_d) - def test(): + with self.assertRaises(TypeError): ob = Test.DecimalArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.DecimalArrayTest() ob[0] = "wrong" - self.assertRaises(TypeError, test) - def test_string_array(self): """Test String arrays.""" ob = Test.StringArrayTest() @@ -726,18 +630,14 @@ def test_string_array(self): items[-1] = "eggs" self.assertTrue(items[-1] == "eggs") - def test(): + with self.assertRaises(TypeError): ob = Test.StringArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.Int64ArrayTest() ob[0] = 0 - self.assertRaises(TypeError, test) - def test_enum_array(self): """Test enum arrays.""" from Python.Test import ShortEnum @@ -761,24 +661,18 @@ def test_enum_array(self): items[-1] = ShortEnum.Zero self.assertTrue(items[-1] == ShortEnum.Zero) - def test(): + with self.assertRaises(ValueError): ob = Test.EnumArrayTest() ob.items[0] = 99 - self.assertRaises(ValueError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.EnumArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.EnumArrayTest() ob[0] = "wrong" - self.assertRaises(TypeError, test) - def test_object_array(self): """Test ob arrays.""" from Python.Test import Spam @@ -808,18 +702,14 @@ def test_object_array(self): items[0] = None self.assertTrue(items[0] == None) - def test(): + with self.assertRaises(TypeError): ob = Test.ObjectArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.ObjectArrayTest() ob.items["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_null_array(self): """Test null arrays.""" ob = Test.NullArrayTest() @@ -845,12 +735,10 @@ def test_null_array(self): empty = ob.empty self.assertTrue(len(empty) == 0) - def test(): + with self.assertRaises(TypeError): ob = Test.NullArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - def test_interface_array(self): """Test interface arrays.""" from Python.Test import Spam @@ -877,24 +765,18 @@ def test_interface_array(self): items[0] = None self.assertTrue(items[0] == None) - def test(): + with self.assertRaises(TypeError): ob = Test.InterfaceArrayTest() ob.items[0] = 99 - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.InterfaceArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.InterfaceArrayTest() ob.items["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_typed_array(self): """Test typed arrays.""" from Python.Test import Spam @@ -921,24 +803,18 @@ def test_typed_array(self): items[0] = None self.assertTrue(items[0] == None) - def test(): + with self.assertRaises(TypeError): ob = Test.TypedArrayTest() ob.items[0] = 99 - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.TypedArrayTest() v = ob.items["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.TypedArrayTest() ob.items["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_multi_dimensional_array(self): """Test multi-dimensional arrays.""" ob = Test.MultiDimensionalArrayTest() @@ -987,30 +863,22 @@ def test_multi_dimensional_array(self): items[-1, -1] = min self.assertTrue(items[-1, -1] == min) - def test(): + with self.assertRaises(OverflowError): ob = Test.MultiDimensionalArrayTest() ob.items[0, 0] = max + 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ob = Test.MultiDimensionalArrayTest() ob.items[0, 0] = min - 1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.MultiDimensionalArrayTest() v = ob.items["wrong", 0] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.MultiDimensionalArrayTest() ob[0, 0] = "wrong" - self.assertRaises(TypeError, test) - def test_array_iteration(self): """Test array iteration.""" items = Test.Int32ArrayTest().items @@ -1143,22 +1011,16 @@ def test_tuple_array_conversion_type_checking(self): self.assertTrue(result[1] == None) self.assertTrue(len(result) == 10) - def test(items=items): + with self.assertRaises(TypeError): temp = list(items) temp[1] = 1 - result = ArrayConversionTest.EchoRange(tuple(temp)) - self.assertRaises(TypeError, test) - - def test(items=items): + with self.assertRaises(TypeError): temp = list(items) temp[1] = "spam" - result = ArrayConversionTest.EchoRange(tuple(temp)) - self.assertRaises(TypeError, test) - def test_list_array_conversion_type_checking(self): """Test error handling for list conversion to array arguments.""" from Python.Test import ArrayConversionTest @@ -1178,18 +1040,14 @@ def test_list_array_conversion_type_checking(self): self.assertTrue(result[1] == None) self.assertTrue(len(result) == 10) - def test(items=items): + with self.assertRaises(TypeError): items[1] = 1 result = ArrayConversionTest.EchoRange(items) - self.assertRaises(TypeError, test) - - def test(items=items): + with self.assertRaises(TypeError): items[1] = "spam" result = ArrayConversionTest.EchoRange(items) - self.assertRaises(TypeError, test) - def test_sequence_array_conversion_type_checking(self): """Test error handling for sequence conversion to array arguments.""" from Python.Test import ArrayConversionTest @@ -1209,18 +1067,14 @@ def test_sequence_array_conversion_type_checking(self): self.assertTrue(result[1] == None) self.assertTrue(len(result) == 10) - def test(items=items): + with self.assertRaises(TypeError): items[1] = 1 result = ArrayConversionTest.EchoRange(items) - self.assertRaises(TypeError, test) - - def test(items=items): + with self.assertRaises(TypeError): items[1] = "spam" result = ArrayConversionTest.EchoRange(items) - self.assertRaises(TypeError, test) - def test_md_array_conversion(self): """Test passing of multi-dimensional array arguments.""" from Python.Test import ArrayConversionTest @@ -1263,7 +1117,7 @@ def test_boxed_value_type_mutation_result(self): items[i] = Point(i, i) for i in range(5): - # Boxed items, so settr will not change the array member. + # Boxed items, so set_attr will not change the array member. self.assertTrue(items[i].X == i) self.assertTrue(items[i].Y == i) items[i].X = i + 1 @@ -1421,48 +1275,32 @@ def test_array_abuse(self): _class = Test.PublicArrayTest ob = Test.PublicArrayTest() - def test(): + with self.assertRaises(AttributeError): del _class.__getitem__ - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): del ob.__getitem__ - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): del _class.__setitem__ - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): del ob.__setitem__ - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(TypeError): Test.PublicArrayTest.__getitem__(0, 0) - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): Test.PublicArrayTest.__setitem__(0, 0, 0) - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): desc = Test.PublicArrayTest.__dict__['__getitem__'] desc(0, 0) - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): desc = Test.PublicArrayTest.__dict__['__setitem__'] desc(0, 0, 0) - self.assertRaises(TypeError, test) - def test_suite(): return unittest.makeSuite(ArrayTests) diff --git a/src/tests/test_class.py b/src/tests/test_class.py index 02d5f1efc..373bb326d 100644 --- a/src/tests/test_class.py +++ b/src/tests/test_class.py @@ -59,17 +59,12 @@ def test_class_default_repr(self): def test_non_public_class(self): """Test that non-public classes are inaccessible.""" - - def test(): + with self.assertRaises(ImportError): from Python.Test import InternalClass - self.assertRaises(ImportError, test) - - def test(): + with self.assertRaises(AttributeError): x = Test.InternalClass - self.assertRaises(AttributeError, test) - def test_basic_subclass(self): """Test basic subclass of a managed class.""" from System.Collections import Hashtable @@ -256,13 +251,17 @@ def test_comparisons(self): self.assertEqual(d2 >= d1, True) self.assertEqual(d2 > d1, True) - self.assertRaises(TypeError, lambda: d1 < None) - self.assertRaises(TypeError, lambda: d1 < System.Guid()) + with self.assertRaises(TypeError): + d1 < None + + with self.assertRaises(TypeError): + d1 < System.Guid() # ClassTest does not implement IComparable c1 = ClassTest() c2 = ClassTest() - self.assertRaises(TypeError, lambda: c1 < c2) + with self.assertRaises(TypeError): + c1 < c2 def test_self_callback(self): """Test calling back and forth between this and a c# baseclass.""" diff --git a/src/tests/test_compat.py b/src/tests/test_compat.py index 6eaf752c9..6570f2c1c 100644 --- a/src/tests/test_compat.py +++ b/src/tests/test_compat.py @@ -182,17 +182,13 @@ def test_implicit_load_already_valid_namespace(self): self.assertTrue(isCLRClass(CLR.System.UriBuilder)) def test_import_non_existant_module(self): - """Test import failure for a non-existant module.""" - - def test(): + """Test import failure for a non-existent module.""" + with self.assertRaises(ImportError): import System.SpamSpamSpam - def testclr(): + with self.assertRaises(ImportError): import CLR.System.SpamSpamSpam - self.assertRaises(ImportError, test) - self.assertRaises(ImportError, testclr) - def test_lookup_no_namespace_type(self): """Test lookup of types without a qualified namespace.""" import CLR.Python.Test @@ -201,18 +197,13 @@ def test_lookup_no_namespace_type(self): def test_module_lookup_recursion(self): """Test for recursive lookup handling.""" - - def test1(): + with self.assertRaises(ImportError): from CLR import CLR - self.assertRaises(ImportError, test1) - - def test2(): + with self.assertRaises(AttributeError): import CLR x = CLR.CLR - self.assertRaises(AttributeError, test2) - def test_module_get_attr(self): """Test module getattr behavior.""" import CLR.System as System @@ -223,20 +214,16 @@ def test_module_get_attr(self): module = System.Xml self.assertTrue(isCLRModule(module)) - def test(): + with self.assertRaises(AttributeError): spam = System.Spam - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(TypeError): spam = getattr(System, 1) - self.assertRaises(TypeError, test) - - def test000_multiple_imports(self): + def test_multiple_imports(self): # import CLR did raise a Seg Fault once # test if the Exceptions.warn() method still causes it - for n in range(100): + for _ in range(100): import CLR diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index a63e0793d..7423e2201 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -83,36 +83,24 @@ def test_sbyte_conversion(self): ob.SByteField = System.SByte(-128) self.assertTrue(ob.SByteField == -128) - def test(): + with self.assertRaises(TypeError): ConversionTest().SByteField = "spam" - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ConversionTest().SByteField = None - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().SByteField = 128 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().SByteField = -129 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.SByte(128) - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.SByte(-129) - self.assertRaises(OverflowError, test) - def test_byte_conversion(self): """Test byte conversion.""" self.assertTrue(System.Byte.MaxValue == 255) @@ -133,36 +121,24 @@ def test_byte_conversion(self): ob.ByteField = System.Byte(0) self.assertTrue(ob.ByteField == 0) - def test(): + with self.assertRaises(TypeError): ConversionTest().ByteField = "spam" - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ConversionTest().ByteField = None - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().ByteField = 256 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().ByteField = -1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.Byte(256) - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.Byte(-1) - self.assertRaises(OverflowError, test) - def test_char_conversion(self): """Test char conversion.""" self.assertTrue(System.Char.MaxValue == unichr(65535)) @@ -180,21 +156,15 @@ def test_char_conversion(self): ob.CharField = 67 self.assertTrue(ob.CharField == u'C') - def test(): + with self.assertRaises(OverflowError): ConversionTest().CharField = 65536 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().CharField = -1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(TypeError): ConversionTest().CharField = None - self.assertRaises(TypeError, test) - def test_int16_conversion(self): """Test int16 conversion.""" self.assertTrue(System.Int16.MaxValue == 32767) @@ -215,36 +185,24 @@ def test_int16_conversion(self): ob.Int16Field = System.Int16(-32768) self.assertTrue(ob.Int16Field == -32768) - def test(): + with self.assertRaises(TypeError): ConversionTest().Int16Field = "spam" - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ConversionTest().Int16Field = None - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().Int16Field = 32768 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().Int16Field = -32769 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.Int16(32768) - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.Int16(-32769) - self.assertRaises(OverflowError, test) - def test_int32_conversion(self): """Test int32 conversion.""" self.assertTrue(System.Int32.MaxValue == 2147483647) @@ -265,36 +223,24 @@ def test_int32_conversion(self): ob.Int32Field = System.Int32(-2147483648) self.assertTrue(ob.Int32Field == -2147483648) - def test(): + with self.assertRaises(TypeError): ConversionTest().Int32Field = "spam" - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ConversionTest().Int32Field = None - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().Int32Field = 2147483648 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().Int32Field = -2147483649 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.Int32(2147483648) - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.Int32(-2147483649) - self.assertRaises(OverflowError, test) - def test_int64_conversion(self): """Test int64 conversion.""" self.assertTrue(System.Int64.MaxValue == long(9223372036854775807)) @@ -315,36 +261,24 @@ def test_int64_conversion(self): ob.Int64Field = System.Int64(long(-9223372036854775808)) self.assertTrue(ob.Int64Field == long(-9223372036854775808)) - def test(): + with self.assertRaises(TypeError): ConversionTest().Int64Field = "spam" - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ConversionTest().Int64Field = None - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().Int64Field = long(9223372036854775808) - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().Int64Field = long(-9223372036854775809) - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.Int64(long(9223372036854775808)) - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.Int64(long(-9223372036854775809)) - self.assertRaises(OverflowError, test) - def test_uint16_conversion(self): """Test uint16 conversion.""" self.assertTrue(System.UInt16.MaxValue == 65535) @@ -365,36 +299,24 @@ def test_uint16_conversion(self): ob.UInt16Field = System.UInt16(0) self.assertTrue(ob.UInt16Field == 0) - def test(): + with self.assertRaises(TypeError): ConversionTest().UInt16Field = "spam" - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ConversionTest().UInt16Field = None - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().UInt16Field = 65536 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().UInt16Field = -1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.UInt16(65536) - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.UInt16(-1) - self.assertRaises(OverflowError, test) - def test_uint32_conversion(self): """Test uint32 conversion.""" self.assertTrue(System.UInt32.MaxValue == long(4294967295)) @@ -415,36 +337,24 @@ def test_uint32_conversion(self): ob.UInt32Field = System.UInt32(0) self.assertTrue(ob.UInt32Field == 0) - def test(): + with self.assertRaises(TypeError): ConversionTest().UInt32Field = "spam" - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ConversionTest().UInt32Field = None - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().UInt32Field = long(4294967296) - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().UInt32Field = -1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.UInt32(long(4294967296)) - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.UInt32(-1) - self.assertRaises(OverflowError, test) - def test_uint64_conversion(self): """Test uint64 conversion.""" self.assertTrue(System.UInt64.MaxValue == long(18446744073709551615)) @@ -465,36 +375,24 @@ def test_uint64_conversion(self): ob.UInt64Field = System.UInt64(0) self.assertTrue(ob.UInt64Field == 0) - def test(): + with self.assertRaises(TypeError): ConversionTest().UInt64Field = "spam" - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ConversionTest().UInt64Field = None - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().UInt64Field = long(18446744073709551616) - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().UInt64Field = -1 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.UInt64(long(18446744073709551616)) - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.UInt64(-1) - self.assertRaises(OverflowError, test) - def test_single_conversion(self): """Test single conversion.""" self.assertTrue(System.Single.MaxValue == 3.402823e38) @@ -515,36 +413,24 @@ def test_single_conversion(self): ob.SingleField = System.Single(-3.402823e38) self.assertTrue(ob.SingleField == -3.402823e38) - def test(): + with self.assertRaises(TypeError): ConversionTest().SingleField = "spam" - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ConversionTest().SingleField = None - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().SingleField = 3.402824e38 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().SingleField = -3.402824e38 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.Single(3.402824e38) - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.Single(-3.402824e38) - self.assertRaises(OverflowError, test) - def test_double_conversion(self): """Test double conversion.""" self.assertTrue(System.Double.MaxValue == 1.7976931348623157e308) @@ -565,36 +451,24 @@ def test_double_conversion(self): ob.DoubleField = System.Double(-1.7976931348623157e308) self.assertTrue(ob.DoubleField == -1.7976931348623157e308) - def test(): + with self.assertRaises(TypeError): ConversionTest().DoubleField = "spam" - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ConversionTest().DoubleField = None - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().DoubleField = 1.7976931348623159e308 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): ConversionTest().DoubleField = -1.7976931348623159e308 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.Double(1.7976931348623159e308) - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(OverflowError): value = System.Double(-1.7976931348623159e308) - self.assertRaises(OverflowError, test) - def test_decimal_conversion(self): """Test decimal conversion.""" from System import Decimal @@ -622,21 +496,15 @@ def test_decimal_conversion(self): ob.DecimalField = min_d self.assertTrue(ob.DecimalField == min_d) - def test(): + with self.assertRaises(TypeError): ConversionTest().DecimalField = None - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ConversionTest().DecimalField = "spam" - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ConversionTest().DecimalField = 1 - self.assertRaises(TypeError, test) - def test_string_conversion(self): """Test string / unicode conversion.""" ob = ConversionTest() @@ -665,11 +533,9 @@ def test_string_conversion(self): ob.StringField = None self.assertTrue(ob.StringField == None) - def test(): + with self.assertRaises(TypeError): ConversionTest().StringField = 1 - self.assertRaises(TypeError, test) - def test_interface_conversion(self): """Test interface conversion.""" from Python.Test import Spam, ISpam @@ -688,18 +554,14 @@ def test_interface_conversion(self): ob.SpamField = None self.assertTrue(ob.SpamField == None) - def test(): + with self.assertRaises(TypeError): ob = ConversionTest() ob.SpamField = System.String("bad") - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = ConversionTest() ob.SpamField = System.Int32(1) - self.assertRaises(TypeError, test) - def test_object_conversion(self): """Test ob conversion.""" from Python.Test import Spam @@ -722,12 +584,10 @@ def test_object_conversion(self): # need to test subclass here - def test(): + with self.assertRaises(TypeError): ob = ConversionTest() ob.ObjectField = self - self.assertRaises(TypeError, test) - def test_enum_conversion(self): """Test enum conversion.""" from Python.Test import ShortEnum @@ -746,30 +606,22 @@ def test_enum_conversion(self): self.assertTrue(ob.EnumField == ShortEnum.One) self.assertTrue(ob.EnumField == 1) - def test(): + with self.assertRaises(ValueError): ob = ConversionTest() ob.EnumField = 10 - self.assertRaises(ValueError, test) - - def test(): + with self.assertRaises(ValueError): ob = ConversionTest() ob.EnumField = 255 - self.assertRaises(ValueError, test) - - def test(): + with self.assertRaises(OverflowError): ob = ConversionTest() ob.EnumField = 1000000 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(TypeError): ob = ConversionTest() ob.EnumField = "spam" - self.assertRaises(TypeError, test) - def test_null_conversion(self): """Test null conversion.""" ob = ConversionTest() @@ -785,16 +637,12 @@ def test_null_conversion(self): # Primitive types and enums should not be set to null. - def test(): + with self.assertRaises(TypeError): ConversionTest().Int32Field = None - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ConversionTest().EnumField = None - self.assertRaises(TypeError, test) - def test_byte_array_conversion(self): """Test byte array conversion.""" ob = ConversionTest() diff --git a/src/tests/test_delegate.py b/src/tests/test_delegate.py index 37203e77d..0c51c2937 100644 --- a/src/tests/test_delegate.py +++ b/src/tests/test_delegate.py @@ -30,16 +30,12 @@ def test_global_delegate_visibility(self): self.assertTrue(PublicDelegate.__name__ == 'PublicDelegate') self.assertTrue(Test.PublicDelegate.__name__ == 'PublicDelegate') - def test(): + with self.assertRaises(ImportError): from Python.Test import InternalDelegate - self.assertRaises(ImportError, test) - - def test(): + with self.assertRaises(AttributeError): i = Test.InternalDelegate - self.assertRaises(AttributeError, test) - def test_nested_delegate_visibility(self): """Test visibility of nested delegates.""" ob = DelegateTest.PublicDelegate @@ -48,16 +44,12 @@ def test_nested_delegate_visibility(self): ob = DelegateTest.ProtectedDelegate self.assertTrue(ob.__name__ == 'ProtectedDelegate') - def test(): + with self.assertRaises(AttributeError): ob = DelegateTest.InternalDelegate - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): ob = DelegateTest.PrivateDelegate - self.assertRaises(AttributeError, test) - def test_delegate_from_function(self): """Test delegate implemented with a Python function.""" @@ -88,12 +80,10 @@ def test_delegate_from_method(self): def test_delegate_from_unbound_method(self): """Test failure mode for unbound methods.""" - def test(): + with self.assertRaises(TypeError): d = StringDelegate(HelloClass.hello) d() - self.assertRaises(TypeError, test) - def test_delegate_from_static_method(self): """Test delegate implemented with a Python static method.""" @@ -196,21 +186,15 @@ def test_delegate_from_delegate(self): def test_delegate_with_invalid_args(self): """Test delegate instantiation with invalid (non-callable) args.""" - def test(): + with self.assertRaises(TypeError): d = StringDelegate(None) - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): d = StringDelegate("spam") - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): d = StringDelegate(1) - self.assertRaises(TypeError, test) - def test_multicast_delegate(self): """Test multicast delegates.""" @@ -231,12 +215,10 @@ def test_subclass_delegate_fails(self): """Test that subclassing of a delegate type fails.""" from Python.Test import PublicDelegate - def test(): + with self.assertRaises(TypeError): class Boom(PublicDelegate): pass - self.assertRaises(TypeError, test) - def test_delegate_equality(self): """Test delegate equality.""" diff --git a/src/tests/test_enum.py b/src/tests/test_enum.py index 6f6097029..170a47fd1 100644 --- a/src/tests/test_enum.py +++ b/src/tests/test_enum.py @@ -83,46 +83,36 @@ def test_instantiate_enum_fails(self): """Test that instantiation of an enum class fails.""" from System import DayOfWeek - def test(): + with self.assertRaises(TypeError): ob = DayOfWeek() - self.assertRaises(TypeError, test) - def test_subclass_enum_fails(self): """Test that subclassing of an enumeration fails.""" from System import DayOfWeek - def test(): + with self.assertRaises(TypeError): class Boom(DayOfWeek): pass - self.assertRaises(TypeError, test) - def test_enum_set_member_fails(self): """Test that setattr operations on enumerations fail.""" from System import DayOfWeek - def test(): + with self.assertRaises(TypeError): DayOfWeek.Sunday = 13 - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): del DayOfWeek.Sunday - self.assertRaises(TypeError, test) - def test_enum_with_flags_attr_conversion(self): """Test enumeration conversion with FlagsAttribute set.""" # This works because the FlagsField enum has FlagsAttribute. Test.FieldTest().FlagsField = 99 # This should fail because our test enum doesn't have it. - def test(): + with self.assertRaises(ValueError): Test.FieldTest().EnumField = 99 - self.assertRaises(ValueError, test) - def test_enum_conversion(self): """Test enumeration conversion.""" ob = Test.FieldTest() @@ -131,21 +121,15 @@ def test_enum_conversion(self): ob.EnumField = Test.ShortEnum.One self.assertTrue(ob.EnumField == 1) - def test(): + with self.assertRaises(ValueError): Test.FieldTest().EnumField = 20 - self.assertRaises(ValueError, test) - - def test(): + with self.assertRaises(OverflowError): Test.FieldTest().EnumField = 100000 - self.assertRaises(OverflowError, test) - - def test(): + with self.assertRaises(TypeError): Test.FieldTest().EnumField = "str" - self.assertRaises(TypeError, test) - def test_suite(): return unittest.makeSuite(EnumTests) diff --git a/src/tests/test_event.py b/src/tests/test_event.py index 84a495430..64ecc615c 100644 --- a/src/tests/test_event.py +++ b/src/tests/test_event.py @@ -68,39 +68,27 @@ def test_protected_static_event(self): def test_internal_events(self): """Test internal events.""" - def test(): + with self.assertRaises(AttributeError): f = EventTest().InternalEvent - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): f = EventTest().InternalStaticEvent - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): f = EventTest.InternalStaticEvent - self.assertRaises(AttributeError, test) - def test_private_events(self): """Test private events.""" - def test(): + with self.assertRaises(AttributeError): f = EventTest().PrivateEvent - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): f = EventTest().PrivateStaticEvent - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): f = EventTest.PrivateStaticEvent - self.assertRaises(AttributeError, test) - def test_multicast_event(self): """Test multicast events.""" ob = EventTest() @@ -301,27 +289,21 @@ def handler(sender, args, dict=dict): def test_add_non_callable_handler(self): """Test handling of attempts to add non-callable handlers.""" - def test(): + with self.assertRaises(TypeError): ob = EventTest() ob.PublicEvent += 10 - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = EventTest() ob.PublicEvent += "spam" - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): class spam(object): pass ob = EventTest() ob.PublicEvent += spam() - self.assertRaises(TypeError, test) - def test_remove_multiple_handlers(self): """Test removing multiple instances of the same handler.""" ob = EventTest() @@ -478,14 +460,12 @@ def h(sender, args): def test_remove_unknown_handler(self): """Test removing an event handler that was never added.""" - def test(): + with self.assertRaises(ValueError): ob = EventTest() handler = GenericHandler() ob.PublicEvent -= handler.handler - self.assertRaises(ValueError, test) - def test_handler_callback_failure(self): """Test failure mode for inappropriate handlers.""" @@ -496,12 +476,10 @@ def handler(self, one): ob = EventTest() handler = BadHandler() - def test(): + with self.assertRaises(TypeError): ob.PublicEvent += handler.handler ob.OnPublicEvent(TestEventArgs(10)) - self.assertRaises(TypeError, test) - ob.PublicEvent -= handler.handler class BadHandler(object): @@ -511,12 +489,10 @@ def handler(self, one, two, three, four, five): ob = EventTest() handler = BadHandler() - def test(): + with self.assertRaises(TypeError): ob.PublicEvent += handler.handler ob.OnPublicEvent(TestEventArgs(10)) - self.assertRaises(TypeError, test) - ob.PublicEvent -= handler.handler def test_incorrect_invokation(self): @@ -526,16 +502,12 @@ def test_incorrect_invokation(self): handler = GenericHandler() ob.PublicEvent += handler.handler - def test(): + with self.assertRaises(TypeError): ob.OnPublicEvent() - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob.OnPublicEvent(32) - self.assertRaises(TypeError, test) - ob.PublicEvent -= handler.handler def test_explicit_cls_event_registration(self): @@ -561,49 +533,35 @@ def test_explicit_cls_event_registration(self): def test_implicit_cls_event_registration(self): """Test implicit CLS event registration.""" - def test(): + with self.assertRaises(TypeError): ob = EventTest() handler = GenericHandler() ob.add_PublicEvent(handler.handler) - self.assertRaises(TypeError, test) - def test_event_descriptor_abuse(self): """Test event descriptor abuse.""" - def test(): + with self.assertRaises(TypeError): del EventTest.PublicEvent - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): del EventTest.__dict__['PublicEvent'] - self.assertRaises(TypeError, test) - desc = EventTest.__dict__['PublicEvent'] - def test(): + with self.assertRaises(TypeError): desc.__get__(0, 0) - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): desc.__set__(0, 0) - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = EventTest() ob.PublicEvent = 0 - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): EventTest.PublicStaticEvent = 0 - self.assertRaises(TypeError, test) - def test_suite(): return unittest.makeSuite(EventTests) diff --git a/src/tests/test_exceptions.py b/src/tests/test_exceptions.py index ffd9445eb..aeec1fee3 100644 --- a/src/tests/test_exceptions.py +++ b/src/tests/test_exceptions.py @@ -61,95 +61,84 @@ def test_raise_class_exception(self): """Test class exception propagation.""" from System import NullReferenceException - def test(): + with self.assertRaises(NullReferenceException) as cm: raise NullReferenceException - self.assertRaises(NullReferenceException, test) + exc = cm.exception + self.assertTrue(isinstance(exc, NullReferenceException)) + def test_exc_info(self): + """Test class exception propagation. + Behavior of exc_info changed in Py3. Refactoring its test""" + from System import NullReferenceException try: - raise NullReferenceException - except: - type, value, tb = sys.exc_info() - self.assertTrue(type is NullReferenceException) - self.assertTrue(isinstance(value, NullReferenceException)) + raise NullReferenceException("message") + except Exception as exc: + type_, value, tb = sys.exc_info() + self.assertTrue(type_ is NullReferenceException) + self.assertTrue(value.Message == "message") + self.assertTrue(exc.Message == "message") + # FIXME: Lower-case message isn't implemented + # self.assertTrue(exc.message == "message") + self.assertTrue(value is exc) def test_raise_class_exception_with_value(self): """Test class exception propagation with associated value.""" from System import NullReferenceException - def test(): + with self.assertRaises(NullReferenceException) as cm: raise NullReferenceException('Aiiieee!') - self.assertRaises(NullReferenceException, test) - - try: - raise NullReferenceException('Aiiieee!') - except: - type, value, tb = sys.exc_info() - self.assertTrue(type is NullReferenceException) - self.assertTrue(isinstance(value, NullReferenceException)) - self.assertTrue(value.Message == 'Aiiieee!') + exc = cm.exception + self.assertTrue(isinstance(exc, NullReferenceException)) + self.assertTrue(exc.Message == 'Aiiieee!') def test_raise_instance_exception(self): """Test instance exception propagation.""" from System import NullReferenceException - def test(): + with self.assertRaises(NullReferenceException) as cm: raise NullReferenceException() - self.assertRaises(NullReferenceException, test) - - try: - raise NullReferenceException() - except: - type, value, tb = sys.exc_info() - self.assertTrue(type is NullReferenceException) - self.assertTrue(isinstance(value, NullReferenceException)) - self.assertTrue(len(value.Message) > 0) + exc = cm.exception + self.assertTrue(isinstance(exc, NullReferenceException)) + self.assertTrue(len(exc.Message) > 0) def test_raise_instance_exception_with_args(self): """Test instance exception propagation with args.""" from System import NullReferenceException - def test(): - raise NullReferenceException("Aiieeee!") - - self.assertRaises(NullReferenceException, test) + with self.assertRaises(NullReferenceException) as cm: + raise NullReferenceException("Aiiieee!") - try: - raise NullReferenceException('Aiiieee!') - except: - type, value, tb = sys.exc_info() - self.assertTrue(type is NullReferenceException) - self.assertTrue(isinstance(value, NullReferenceException)) - self.assertTrue(value.Message == 'Aiiieee!') + exc = cm.exception + self.assertTrue(isinstance(exc, NullReferenceException)) + self.assertTrue(exc.Message == 'Aiiieee!') def test_managed_exception_propagation(self): """Test propagation of exceptions raised in managed code.""" from System import Decimal, OverflowException - def test(): - l = Decimal.ToInt64(Decimal.MaxValue) - - self.assertRaises(OverflowException, test) + with self.assertRaises(OverflowException): + Decimal.ToInt64(Decimal.MaxValue) def test_managed_exception_conversion(self): """Test conversion of managed exceptions.""" - from System import Exception, OverflowException + from System import OverflowException from Python.Test import ExceptionTest e = ExceptionTest.GetBaseException() - self.assertTrue(isinstance(e, Exception)) + self.assertTrue(isinstance(e, System.Exception)) e = ExceptionTest.GetExplicitException() self.assertTrue(isinstance(e, OverflowException)) - self.assertTrue(isinstance(e, Exception)) + self.assertTrue(isinstance(e, System.Exception)) e = ExceptionTest.GetWidenedException() self.assertTrue(isinstance(e, OverflowException)) - self.assertTrue(isinstance(e, Exception)) + self.assertTrue(isinstance(e, System.Exception)) - v = ExceptionTest.SetBaseException(Exception('error')) + v = ExceptionTest.SetBaseException(System.Exception('error')) self.assertTrue(v) v = ExceptionTest.SetExplicitException(OverflowException('error')) @@ -163,93 +152,66 @@ def test_catch_exception_from_managed_method(self): from Python.Test import ExceptionTest from System import OverflowException - try: + with self.assertRaises(OverflowException) as cm: ExceptionTest().ThrowException() - except OverflowException: - e = sys.exc_info()[1] - self.assertTrue(isinstance(e, OverflowException)) - return - raise SystemError('failed to catch exception from managed method') + e = cm.exception + self.assertTrue(isinstance(e, OverflowException)) def test_catch_exception_from_managed_property(self): """Test catching an exception from a managed property.""" from Python.Test import ExceptionTest from System import OverflowException - try: - v = ExceptionTest().ThrowProperty - except OverflowException: - e = sys.exc_info()[1] - self.assertTrue(isinstance(e, OverflowException)) - return + with self.assertRaises(OverflowException) as cm: + _ = ExceptionTest().ThrowProperty - try: + e = cm.exception + self.assertTrue(isinstance(e, OverflowException)) + + with self.assertRaises(OverflowException) as cm: ExceptionTest().ThrowProperty = 1 - except OverflowException: - e = sys.exc_info()[1] - self.assertTrue(isinstance(e, OverflowException)) - return - raise SystemError('failed to catch exception from managed property') + e = cm.exception + self.assertTrue(isinstance(e, OverflowException)) def test_catch_exception_managed_class(self): """Test catching the managed class of an exception.""" from System import OverflowException - try: + with self.assertRaises(OverflowException): raise OverflowException('overflow') - except OverflowException: - return - - raise SystemError('failed to catch managed class exception') def test_catch_exception_python_class(self): """Test catching the python class of an exception.""" from System import OverflowException - if PY3: - from builtins import Exception - elif PY2: - from exceptions import Exception - try: + with self.assertRaises(Exception): raise OverflowException('overflow') - except Exception: - return - - raise SystemError('failed to catch python class exception') def test_catch_exception_base_class(self): """Test catching the base of an exception.""" from System import OverflowException, ArithmeticException - try: + with self.assertRaises(ArithmeticException): raise OverflowException('overflow') - except ArithmeticException: - return - - raise SystemError('failed to catch base exception') def test_catch_exception_nested_base_class(self): """Test catching the nested base of an exception.""" from System import OverflowException, SystemException - try: + with self.assertRaises(SystemException): raise OverflowException('overflow') - except SystemException: - return - - raise SystemError('failed to catch nested base exception') def test_catch_exception_with_assignment(self): """Test catching an exception with assignment.""" from System import OverflowException - try: + with self.assertRaises(OverflowException) as cm: raise OverflowException('overflow') - except OverflowException: - e = sys.exc_info()[1] - self.assertTrue(isinstance(e, OverflowException)) + + e = cm.exception + self.assertTrue(isinstance(e, OverflowException)) def test_catch_exception_unqualified(self): """Test catching an unqualified exception.""" @@ -259,14 +221,21 @@ def test_catch_exception_unqualified(self): raise OverflowException('overflow') except: return + else: + self.fail("failed to catch unqualified exception") + + def test_catch_baseexception(self): + """Test catching an unqualified exception with BaseException.""" + from System import OverflowException - raise SystemError('failed to catch unqualified exception') + with self.assertRaises(BaseException): + raise OverflowException('overflow') def test_apparent_module_of_exception(self): """Test the apparent module of an exception.""" - from System import Exception, OverflowException + from System import OverflowException - self.assertTrue(Exception.__module__ == 'System') + self.assertTrue(System.Exception.__module__ == 'System') self.assertTrue(OverflowException.__module__ == 'System') def test_str_of_exception(self): @@ -283,14 +252,15 @@ def test_str_of_exception(self): Convert.ToDateTime('this will fail') except FormatException: e = sys.exc_info()[1] - msg = text_type(e).encode("utf8") # fix for international installation - self.assertTrue(msg.find(text_type('System.Convert.ToDateTime').encode("utf8")) > -1, msg) + # fix for international installation + msg = text_type(e).encode("utf8") + fnd = text_type('System.Convert.ToDateTime').encode("utf8") + self.assertTrue(msg.find(fnd) > -1, msg) def test_python_compat_of_managed_exceptions(self): - """Test if managed exceptions are compatible with Python's implementation - """ + """Test managed exceptions compatible with Python's implementation""" from System import OverflowException - msg = "A simple message" + msg = "Simple message" e = OverflowException(msg) self.assertEqual(str(e), msg) @@ -299,9 +269,9 @@ def test_python_compat_of_managed_exceptions(self): self.assertEqual(e.args, (msg,)) self.assertTrue(isinstance(e.args, tuple)) if PY3: - self.assertEqual(repr(e), "OverflowException('A simple message',)") + self.assertEqual(repr(e), "OverflowException('Simple message',)") elif PY2: - self.assertEqual(repr(e), "OverflowException(u'A simple message',)") + self.assertEqual(repr(e), "OverflowException(u'Simple message',)") def test_exception_is_instance_of_system_object(self): """Test behavior of isinstance(, System.Object).""" @@ -338,24 +308,20 @@ def test_pickling_exceptions(self): self.assertEqual(exc.args, loaded.args) def test_chained_exceptions(self): - # TODO: Why is this test PY3 only? + # __cause__ is py3 only if PY3: from Python.Test import ExceptionTest try: ExceptionTest.ThrowChainedExceptions() except Exception as exc: - msgs = [ - "Outer exception", - "Inner exception", - "Innermost exception", - ] - + msgs = ("Outer exception", + "Inner exception", + "Innermost exception",) for msg in msgs: self.assertEqual(exc.Message, msg) self.assertEqual(exc.__cause__, exc.InnerException) exc = exc.__cause__ - else: self.fail("Test should raise an exception") diff --git a/src/tests/test_field.py b/src/tests/test_field.py index f3ec8b382..1f2ca87ea 100644 --- a/src/tests/test_field.py +++ b/src/tests/test_field.py @@ -17,11 +17,9 @@ def test_public_instance_field(self): ob.PublicField = 1 self.assertTrue(ob.PublicField == 1) - def test(): + with self.assertRaises(TypeError): del FieldTest().PublicField - self.assertRaises(TypeError, test) - def test_public_static_field(self): """Test public static fields.""" ob = FieldTest() @@ -34,16 +32,12 @@ def test_public_static_field(self): ob.PublicStaticField = 0 self.assertTrue(ob.PublicStaticField == 0) - def test(): + with self.assertRaises(TypeError): del FieldTest.PublicStaticField - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): del FieldTest().PublicStaticField - self.assertRaises(TypeError, test) - def test_protected_instance_field(self): """Test protected instance fields.""" ob = FieldTest() @@ -52,11 +46,9 @@ def test_protected_instance_field(self): ob.ProtectedField = 1 self.assertTrue(ob.ProtectedField == 1) - def test(): + with self.assertRaises(TypeError): del FieldTest().ProtectedField - self.assertRaises(TypeError, test) - def test_protected_static_field(self): """Test protected static fields.""" ob = FieldTest() @@ -69,30 +61,22 @@ def test_protected_static_field(self): ob.ProtectedStaticField = 0 self.assertTrue(ob.ProtectedStaticField == 0) - def test(): + with self.assertRaises(TypeError): del FieldTest.ProtectedStaticField - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): del FieldTest().ProtectedStaticField - self.assertRaises(TypeError, test) - def test_read_only_instance_field(self): """Test readonly instance fields.""" self.assertTrue(FieldTest().ReadOnlyField == 0) - def test(): + with self.assertRaises(TypeError): FieldTest().ReadOnlyField = 1 - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): del FieldTest().ReadOnlyField - self.assertRaises(TypeError, test) - def test_read_only_static_field(self): """Test readonly static fields.""" ob = FieldTest() @@ -100,26 +84,18 @@ def test_read_only_static_field(self): self.assertTrue(FieldTest.ReadOnlyStaticField == 0) self.assertTrue(ob.ReadOnlyStaticField == 0) - def test(): + with self.assertRaises(TypeError): FieldTest.ReadOnlyStaticField = 1 - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): FieldTest().ReadOnlyStaticField = 1 - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): del FieldTest.ReadOnlyStaticField - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): del FieldTest().ReadOnlyStaticField - self.assertRaises(TypeError, test) - def test_constant_field(self): """Test const fields.""" ob = FieldTest() @@ -127,62 +103,42 @@ def test_constant_field(self): self.assertTrue(FieldTest.ConstField == 0) self.assertTrue(ob.ConstField == 0) - def test(): + with self.assertRaises(TypeError): FieldTest().ConstField = 1 - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): FieldTest.ConstField = 1 - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): del FieldTest().ConstField - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): del FieldTest.ConstField - self.assertRaises(TypeError, test) - def test_internal_field(self): """Test internal fields.""" - def test(): + with self.assertRaises(AttributeError): f = FieldTest().InternalField - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): f = FieldTest().InternalStaticField - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): f = FieldTest.InternalStaticField - self.assertRaises(AttributeError, test) - def test_private_field(self): """Test private fields.""" - def test(): + with self.assertRaises(AttributeError): f = FieldTest().PrivateField - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): f = FieldTest().PrivateStaticField - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): f = FieldTest.PrivateStaticField - self.assertRaises(AttributeError, test) - def test_field_descriptor_get_set(self): """Test field descriptor get / set.""" @@ -209,25 +165,19 @@ def test_field_descriptor_get_set(self): def test_field_descriptor_wrong_type(self): """Test setting a field using a value of the wrong type.""" - def test(): + with self.assertRaises(TypeError): FieldTest().PublicField = "spam" - self.assertRaises(TypeError, test) - def test_field_descriptor_abuse(self): """Test field descriptor abuse.""" desc = FieldTest.__dict__['PublicField'] - def test(): + with self.assertRaises(TypeError): desc.__get__(0, 0) - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): desc.__set__(0, 0) - self.assertRaises(TypeError, test) - def test_boolean_field(self): """Test boolean fields.""" # change this to true / false later for Python 2.3? @@ -408,16 +358,12 @@ def test_nullable_field(self): # Primitive types and enums should not be set to null. - def test(): + with self.assertRaises(TypeError): FieldTest().Int32Field = None - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): FieldTest().EnumField = None - self.assertRaises(TypeError, test) - def test_suite(): return unittest.makeSuite(FieldTests) diff --git a/src/tests/test_generic.py b/src/tests/test_generic.py index d4c93c060..e85e76667 100644 --- a/src/tests/test_generic.py +++ b/src/tests/test_generic.py @@ -194,16 +194,12 @@ def test_open_generic_type(self): OpenGenericType = DerivedFromOpenGeneric.__bases__[0] - def test(): + with self.assertRaises(TypeError): inst = OpenGenericType() - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): type = OpenGenericType[System.String] - self.assertRaises(TypeError, test) - def test_derived_from_open_generic_type(self): """Test a generic type derived from an open generic type.""" from Python.Test import DerivedFromOpenGeneric @@ -228,11 +224,9 @@ def test_generic_type_name_resolution(self): # If no non-generic type exists for a name, the unadorned name # cannot be instantiated. It can only be used to bind a generic. - def test(): + with self.assertRaises(TypeError): inst = GenericNameTest2() - self.assertRaises(TypeError, test) - _class = GenericNameTest2[int] self.assertTrue(_class().value == 1) self.assertTrue(_class.value == 1) @@ -281,23 +275,19 @@ def test_generic_method_binding(self): value = GenericStaticMethodTest[str].Overloaded() self.assertTrue(value == 1) - def test(): + with self.assertRaises(InvalidOperationException): # Cannot invoke a static member on an open type. GenericStaticMethodTest.Overloaded() - self.assertRaises(InvalidOperationException, test) - # Can invoke an instance member on a closed generic type. value = GenericMethodTest[str]().Overloaded() self.assertTrue(value == 1) - def test(): + with self.assertRaises(TypeError): # Cannot invoke an instance member on an open type, # because the open type cannot be instantiated. GenericMethodTest().Overloaded() - self.assertRaises(TypeError, test) - def test_generic_method_type_handling(self): """Test argument conversion / binding for generic methods.""" from Python.Test import InterfaceTest, ISayHello1, ShortEnum @@ -442,16 +432,12 @@ def test_generic_method_overload_selection(self): value = inst.Overloaded[str](123, 456, "success") self.assertTrue(value == "success") - def test(): + with self.assertRaises(TypeError): value = type.Overloaded[str, bool, int]("true", True, 1) - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): value = inst.Overloaded[str, bool, int]("true", True, 1) - self.assertRaises(TypeError, test) - def test_method_overload_selection_with_generic_types(self): """Check method overload selection using generic types.""" from Python.Test import ISayHello1, InterfaceTest, ShortEnum diff --git a/src/tests/test_indexer.py b/src/tests/test_indexer.py index daec3d7f7..90a8d71f0 100644 --- a/src/tests/test_indexer.py +++ b/src/tests/test_indexer.py @@ -38,40 +38,28 @@ def test_internal_indexer(self): """Test internal indexers.""" ob = Test.InternalIndexerTest() - def test(): + with self.assertRaises(TypeError): ob[0] = "zero" - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): Test.InternalIndexerTest.__getitem__(ob, 0) - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob.__getitem__(0) - self.assertRaises(TypeError, test) - def test_private_indexer(self): """Test private indexers.""" ob = Test.PrivateIndexerTest() - def test(): + with self.assertRaises(TypeError): ob[0] = "zero" - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): Test.PrivateIndexerTest.__getitem__(ob, 0) - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob.__getitem__(0) - self.assertRaises(TypeError, test) - def test_boolean_indexer(self): """Test boolean indexers.""" ob = Test.BooleanIndexerTest() @@ -105,18 +93,14 @@ def test_byte_indexer(self): ob[min] = str(min) self.assertTrue(ob[min] == str(min)) - def test(): + with self.assertRaises(TypeError): ob = Test.ByteIndexerTest() ob["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.ByteIndexerTest() ob["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_sbyte_indexer(self): """Test sbyte indexers.""" ob = Test.SByteIndexerTest() @@ -131,18 +115,14 @@ def test_sbyte_indexer(self): ob[min] = str(min) self.assertTrue(ob[min] == str(min)) - def test(): + with self.assertRaises(TypeError): ob = Test.SByteIndexerTest() ob["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.SByteIndexerTest() ob["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_char_indexer(self): """Test char indexers.""" ob = Test.CharIndexerTest() @@ -157,18 +137,14 @@ def test_char_indexer(self): ob[min] = "min" self.assertTrue(ob[min] == "min") - def test(): + with self.assertRaises(TypeError): ob = Test.CharIndexerTest() ob["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.CharIndexerTest() ob["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_int16_indexer(self): """Test Int16 indexers.""" ob = Test.Int16IndexerTest() @@ -183,18 +159,14 @@ def test_int16_indexer(self): ob[min] = str(min) self.assertTrue(ob[min] == str(min)) - def test(): + with self.assertRaises(TypeError): ob = Test.Int16IndexerTest() ob["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.Int16IndexerTest() ob["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_int32_indexer(self): """Test Int32 indexers.""" ob = Test.Int32IndexerTest() @@ -209,18 +181,14 @@ def test_int32_indexer(self): ob[min] = str(min) self.assertTrue(ob[min] == str(min)) - def test(): + with self.assertRaises(TypeError): ob = Test.Int32IndexerTest() ob["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.Int32IndexerTest() ob["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_int64_indexer(self): """Test Int64 indexers.""" ob = Test.Int64IndexerTest() @@ -235,18 +203,14 @@ def test_int64_indexer(self): ob[min] = str(min) self.assertTrue(ob[min] == str(min)) - def test(): + with self.assertRaises(TypeError): ob = Test.Int64IndexerTest() ob["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.Int64IndexerTest() ob["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_uint16_indexer(self): """Test UInt16 indexers.""" ob = Test.UInt16IndexerTest() @@ -261,18 +225,14 @@ def test_uint16_indexer(self): ob[min] = str(min) self.assertTrue(ob[min] == str(min)) - def test(): + with self.assertRaises(TypeError): ob = Test.UInt16IndexerTest() ob["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.UInt16IndexerTest() ob["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_uint32_indexer(self): """Test UInt32 indexers.""" ob = Test.UInt32IndexerTest() @@ -287,18 +247,14 @@ def test_uint32_indexer(self): ob[min] = str(min) self.assertTrue(ob[min] == str(min)) - def test(): + with self.assertRaises(TypeError): ob = Test.UInt32IndexerTest() ob["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.UInt32IndexerTest() ob["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_uint64_indexer(self): """Test UInt64 indexers.""" ob = Test.UInt64IndexerTest() @@ -313,18 +269,14 @@ def test_uint64_indexer(self): ob[min] = str(min) self.assertTrue(ob[min] == str(min)) - def test(): + with self.assertRaises(TypeError): ob = Test.UInt64IndexerTest() ob["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.UInt64IndexerTest() ob["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_single_indexer(self): """Test Single indexers.""" ob = Test.SingleIndexerTest() @@ -339,18 +291,14 @@ def test_single_indexer(self): ob[min] = "min" self.assertTrue(ob[min] == "min") - def test(): + with self.assertRaises(TypeError): ob = Test.SingleIndexerTest() ob["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.SingleIndexerTest() ob["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_double_indexer(self): """Test Double indexers.""" ob = Test.DoubleIndexerTest() @@ -365,18 +313,14 @@ def test_double_indexer(self): ob[min] = "min" self.assertTrue(ob[min] == "min") - def test(): + with self.assertRaises(TypeError): ob = Test.DoubleIndexerTest() ob["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.DoubleIndexerTest() ob["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_decimal_indexer(self): """Test Decimal indexers.""" ob = Test.DecimalIndexerTest() @@ -393,18 +337,14 @@ def test_decimal_indexer(self): ob[min_d] = "min" self.assertTrue(ob[min_d] == "min") - def test(): + with self.assertRaises(TypeError): ob = Test.DecimalIndexerTest() ob["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.DecimalIndexerTest() ob["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_string_indexer(self): """Test String indexers.""" ob = Test.StringIndexerTest() @@ -424,18 +364,14 @@ def test_string_indexer(self): self.assertTrue(ob[u"eggs"] == "eggs") self.assertTrue(ob[u"eggs"] == u"eggs") - def test(): + with self.assertRaises(TypeError): ob = Test.StringIndexerTest() ob[1] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.StringIndexerTest() ob[1] = "wrong" - self.assertRaises(TypeError, test) - def test_enum_indexer(self): """Test enum indexers.""" ob = Test.EnumIndexerTest() @@ -453,18 +389,14 @@ def test_enum_indexer(self): ob[1] = "spam" self.assertTrue(ob[1] == "spam") - def test(): + with self.assertRaises(TypeError): ob = Test.EnumIndexerTest() ob["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.EnumIndexerTest() ob["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_object_indexer(self): """Test ob indexers.""" ob = Test.ObjectIndexerTest() @@ -489,7 +421,7 @@ def test_object_indexer(self): ob[long(1)] = "long" self.assertTrue(ob[long(1)] == "long") - def test(): + with self.assertRaises(TypeError): class eggs(object): pass @@ -497,8 +429,6 @@ class eggs(object): ob = Test.ObjectIndexerTest() ob[key] = "wrong" - self.assertRaises(TypeError, test) - def test_interface_indexer(self): """Test interface indexers.""" ob = Test.InterfaceIndexerTest() @@ -514,18 +444,14 @@ def test_interface_indexer(self): ob[spam] = "eggs" self.assertTrue(ob[spam] == "eggs") - def test(): + with self.assertRaises(TypeError): ob = Test.InterfaceIndexerTest() ob["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.InterfaceIndexerTest() ob["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_typed_indexer(self): """Test typed indexers.""" ob = Test.TypedIndexerTest() @@ -541,18 +467,14 @@ def test_typed_indexer(self): ob[spam] = "eggs" self.assertTrue(ob[spam] == "eggs") - def test(): + with self.assertRaises(TypeError): ob = Test.TypedIndexerTest() ob["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.TypedIndexerTest() ob["wrong"] = "wrong" - self.assertRaises(TypeError, test) - def test_multi_arg_indexer(self): """Test indexers that take multiple index arguments.""" ob = Test.MultiArgIndexerTest() @@ -565,18 +487,14 @@ def test_multi_arg_indexer(self): self.assertTrue(ob[10, 50] == None) - def test(): + with self.assertRaises(TypeError): ob = Test.MultiArgIndexerTest() v = ob[0, "one"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.MultiArgIndexerTest() ob[0, "one"] = "wrong" - self.assertRaises(TypeError, test) - def test_multi_type_indexer(self): """Test indexers that take multiple indices of different types.""" ob = Test.MultiTypeIndexerTest() @@ -588,18 +506,14 @@ def test_multi_type_indexer(self): ob[1, "nine", spam] = "one nine spam" self.assertTrue(ob[1, "nine", spam] == "one nine spam") - def test(): + with self.assertRaises(TypeError): ob = Test.MultiTypeIndexerTest() v = ob[0, 1, spam] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.MultiTypeIndexerTest() ob[0, 1, spam] = "wrong" - self.assertRaises(TypeError, test) - def test_multi_default_key_indexer(self): """Test indexers that take multiple indices with a default key arguments.""" # default argument is 2 in the MultiDefaultKeyIndexerTest object @@ -613,27 +527,21 @@ def test_multi_default_key_indexer(self): def test_indexer_wrong_key_type(self): """Test calling an indexer using a key of the wrong type.""" - def test(): + with self.assertRaises(TypeError): ob = Test.PublicIndexerTest() v = ob["wrong"] - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): ob = Test.PublicIndexerTest() ob["wrong"] = "spam" - self.assertRaises(TypeError, test) - def test_indexer_wrong_value_type(self): """Test calling an indexer using a value of the wrong type.""" - def test(): + with self.assertRaises(TypeError): ob = Test.PublicIndexerTest() ob[1] = 9993.9 - self.assertRaises(TypeError, test) - def test_unbound_indexer(self): """Test calling an unbound indexer.""" ob = Test.PublicIndexerTest() @@ -651,26 +559,18 @@ def test_indexer_abuse(self): _class = Test.PublicIndexerTest ob = Test.PublicIndexerTest() - def test(): + with self.assertRaises(AttributeError): del _class.__getitem__ - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): del ob.__getitem__ - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): del _class.__setitem__ - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): del ob.__setitem__ - self.assertRaises(AttributeError, test) - def test_suite(): return unittest.makeSuite(IndexerTests) diff --git a/src/tests/test_interface.py b/src/tests/test_interface.py index d47c6279a..ab109458b 100644 --- a/src/tests/test_interface.py +++ b/src/tests/test_interface.py @@ -24,15 +24,11 @@ def test_global_interface_visibility(self): self.assertTrue(IPublicInterface.__name__ == 'IPublicInterface') - def test(): + with self.assertRaises(ImportError): from Python.Test import IInternalInterface - self.assertRaises(ImportError, test) - - def test(): - i = Test.IInternalInterface - - self.assertRaises(AttributeError, test) + with self.assertRaises(AttributeError): + Test.IInternalInterface def test_nested_interface_visibility(self): """Test visibility of nested interfaces.""" @@ -44,16 +40,12 @@ def test_nested_interface_visibility(self): ob = InterfaceTest.IProtected self.assertTrue(ob.__name__ == 'IProtected') - def test(): + with self.assertRaises(AttributeError): ob = InterfaceTest.IInternal - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): ob = InterfaceTest.IPrivate - self.assertRaises(AttributeError, test) - def test_explicit_cast_to_interface(self): """Test explicit cast to an interface.""" from Python.Test import InterfaceTest diff --git a/src/tests/test_method.py b/src/tests/test_method.py index 677a69b52..29d921dac 100644 --- a/src/tests/test_method.py +++ b/src/tests/test_method.py @@ -14,49 +14,33 @@ class MethodTests(unittest.TestCase): def test_instance_method_descriptor(self): """Test instance method descriptor behavior.""" - def test(): + with self.assertRaises(AttributeError): MethodTest().PublicMethod = 0 - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): MethodTest.PublicMethod = 0 - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): del MethodTest().PublicMethod - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): del MethodTest.PublicMethod - self.assertRaises(AttributeError, test) - def test_static_method_descriptor(self): """Test static method descriptor behavior.""" - def test(): + with self.assertRaises(AttributeError): MethodTest().PublicStaticMethod = 0 - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): MethodTest.PublicStaticMethod = 0 - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): del MethodTest().PublicStaticMethod - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): del MethodTest.PublicStaticMethod - self.assertRaises(AttributeError, test) - def test_public_instance_method(self): """Test public instance method visibility.""" ob = MethodTest() @@ -83,49 +67,33 @@ def test_protected_static_method(self): def test_internal_method(self): """Test internal method visibility.""" - def test(): + with self.assertRaises(AttributeError): f = MethodTest().InternalMethod - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): f = MethodTest.InternalMethod - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): f = MethodTest().InternalStaticMethod - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): f = MethodTest.InternalStaticMethod - self.assertRaises(AttributeError, test) - def test_private_method(self): """Test private method visibility.""" - def test(): + with self.assertRaises(AttributeError): f = MethodTest().PrivateMethod - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): f = MethodTest.PrivateMethod - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): f = MethodTest().PrivateStaticMethod - self.assertRaises(AttributeError, test) - - def test(): + with self.assertRaises(AttributeError): f = MethodTest.PrivateStaticMethod - self.assertRaises(AttributeError, test) - def test_unbound_managed_method_call(self): """Test calling unbound managed methods.""" from Python.Test import MethodTestSub @@ -133,20 +101,16 @@ def test_unbound_managed_method_call(self): ob = MethodTest() self.assertTrue(MethodTest.PublicMethod(ob) == "public") - def test(): + with self.assertRaises(TypeError): MethodTest.PublicMethod() - self.assertRaises(TypeError, test) - ob = MethodTestSub() self.assertTrue(MethodTestSub.PublicMethod(ob) == "public") self.assertTrue(MethodTestSub.PublicMethod(ob, "echo") == "echo") - def test(): + with self.assertRaises(TypeError): MethodTestSub.PublicMethod("echo") - self.assertRaises(TypeError, test) - def test_overloaded_method_inheritance(self): """Test that overloads are inherited properly.""" from Python.Test import MethodTestSub @@ -154,12 +118,10 @@ def test_overloaded_method_inheritance(self): ob = MethodTest() self.assertTrue(ob.PublicMethod() == "public") - def test(): + with self.assertRaises(TypeError): ob = MethodTest() ob.PublicMethod("echo") - self.assertRaises(TypeError, test) - ob = MethodTestSub() self.assertTrue(ob.PublicMethod() == "public") @@ -169,16 +131,12 @@ def test_method_descriptor_abuse(self): """Test method descriptor abuse.""" desc = MethodTest.__dict__['PublicMethod'] - def test(): + with self.assertRaises(TypeError): desc.__get__(0, 0) - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(AttributeError): desc.__set__(0, 0) - self.assertRaises(AttributeError, test) - def test_method_docstrings(self): """Test standard method docstring generation""" method = MethodTest.GetType @@ -319,12 +277,10 @@ def test_value_out_params(self): self.assertTrue(result[0] == True) self.assertTrue(result[1] == 42) - def test(): + with self.assertRaises(TypeError): MethodTest.TestValueOutParams("hi", None) # None cannot be converted to a value type like int, long, etc. - self.assertRaises(TypeError, test) - def test_value_ref_params(self): """Test use of value type byref parameters.""" result = MethodTest.TestValueRefParams("hi", 1) @@ -333,12 +289,10 @@ def test_value_ref_params(self): self.assertTrue(result[0] == True) self.assertTrue(result[1] == 42) - def test(): + with self.assertRaises(TypeError): MethodTest.TestValueRefParams("hi", None) # None cannot be converted to a value type like int, long, etc. - self.assertRaises(TypeError, test) - def test_object_out_params(self): """Test use of object out-parameters.""" result = MethodTest.TestObjectOutParams("hi", MethodTest()) @@ -375,12 +329,10 @@ def test_struct_out_params(self): self.assertTrue(result[0] == True) self.assertTrue(isinstance(result[1], System.Guid)) - def test(): + with self.assertRaises(TypeError): MethodTest.TestValueRefParams("hi", None) # None cannot be converted to a value type like a struct - self.assertRaises(TypeError, test) - def test_struct_ref_params(self): """Test use of struct byref parameters.""" result = MethodTest.TestStructRefParams("hi", System.Guid.NewGuid()) @@ -389,34 +341,28 @@ def test_struct_ref_params(self): self.assertTrue(result[0] == True) self.assertTrue(isinstance(result[1], System.Guid)) - def test(): + with self.assertRaises(TypeError): MethodTest.TestValueRefParams("hi", None) # None cannot be converted to a value type like a struct - self.assertRaises(TypeError, test) - def test_void_single_out_param(self): """Test void method with single out-parameter.""" result = MethodTest.TestVoidSingleOutParam(9) self.assertTrue(result == 42) - def test(): + with self.assertRaises(TypeError): MethodTest.TestVoidSingleOutParam(None) # None cannot be converted to a value type - self.assertRaises(TypeError, test) - def test_void_single_ref_param(self): """Test void method with single ref-parameter.""" result = MethodTest.TestVoidSingleRefParam(9) self.assertTrue(result == 42) - def test(): + with self.assertRaises(TypeError): MethodTest.TestVoidSingleRefParam(None) # None cannot be converted to a value type - self.assertRaises(TypeError, test) - def test_single_default_param(self): """Test void method with single ref-parameter.""" result = MethodTest.TestSingleDefaultParam() @@ -735,28 +681,20 @@ def test_overload_selection_with_array_types(self): def test_explicit_overload_selection_failure(self): """Check that overload selection fails correctly.""" - def test(): + with self.assertRaises(TypeError): value = MethodTest.Overloaded.__overloads__[System.Type](True) - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): value = MethodTest.Overloaded.__overloads__[int, int](1, 1) - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): value = MethodTest.Overloaded.__overloads__[str, int, int]( "", 1, 1 ) - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): value = MethodTest.Overloaded.__overloads__[int, long](1) - self.assertRaises(TypeError, test) - def test_we_can_bind_to_encoding_get_string(self): """Check that we can bind to the Encoding.GetString method with variables.""" diff --git a/src/tests/test_module.py b/src/tests/test_module.py index 998124d67..ad27cae9b 100644 --- a/src/tests/test_module.py +++ b/src/tests/test_module.py @@ -244,13 +244,10 @@ def test_implicit_load_already_valid_namespace(self): self.assertTrue(isCLRClass(System.UriBuilder)) def test_import_non_existant_module(self): - """Test import failure for a non-existant module.""" - - def test(): + """Test import failure for a non-existent module.""" + with self.assertRaises(ImportError): import System.SpamSpamSpam - self.assertTrue(ImportError, test) - def test_lookup_no_namespace_type(self): """Test lookup of types without a qualified namespace.""" import Python.Test @@ -260,17 +257,13 @@ def test_lookup_no_namespace_type(self): def test_module_lookup_recursion(self): """Test for recursive lookup handling.""" - def test1(): + with self.assertRaises(ImportError): from System import System - self.assertTrue(ImportError, test1) - - def test2(): + with self.assertRaises(AttributeError): import System x = System.System - self.assertTrue(AttributeError, test2) - def test_module_get_attr(self): """Test module getattr behavior.""" import System @@ -281,16 +274,12 @@ def test_module_get_attr(self): module = System.Xml self.assertTrue(isCLRModule(module)) - def test(): + with self.assertRaises(AttributeError): spam = System.Spam - self.assertTrue(AttributeError, test) - - def test(): + with self.assertRaises(TypeError): spam = getattr(System, 1) - self.assertTrue(TypeError, test) - def test_module_attr_abuse(self): """Test handling of attempts to set module attributes.""" @@ -310,21 +299,15 @@ def test_module_type_abuse(self): import System mtype = type(System) - def test(): + with self.assertRaises(TypeError): mtype.__getattribute__(0, 'spam') - self.assertTrue(TypeError, test) - - def test(): + with self.assertRaises(TypeError): mtype.__setattr__(0, 'spam', 1) - self.assertTrue(TypeError, test) - - def test(): + with self.assertRaises(TypeError): mtype.__repr__(0) - self.assertTrue(TypeError, test) - def test_clr_list_assemblies(self): from clr import ListAssemblies verbose = list(ListAssemblies(True)) @@ -342,8 +325,8 @@ def test_clr_add_reference(self): assyName = assy.GetName().Name self.assertEqual(assyName, name) - self.assertRaises(FileNotFoundException, - AddReference, "somethingtotallysilly") + with self.assertRaises(FileNotFoundException): + AddReference("somethingtotallysilly") def test_assembly_load_thread_safety(self): import time diff --git a/src/tests/test_property.py b/src/tests/test_property.py index d8d967658..8f1d5f9e1 100644 --- a/src/tests/test_property.py +++ b/src/tests/test_property.py @@ -16,11 +16,9 @@ def test_public_instance_property(self): ob.PublicProperty = 1 self.assertTrue(ob.PublicProperty == 1) - def test(): + with self.assertRaises(TypeError): del PropertyTest().PublicProperty - self.assertRaises(TypeError, test) - def test_public_static_property(self): """Test public static properties.""" ob = PropertyTest() @@ -33,16 +31,12 @@ def test_public_static_property(self): ob.PublicStaticProperty = 0 self.assertTrue(ob.PublicStaticProperty == 0) - def test(): + with self.assertRaises(TypeError): del PropertyTest.PublicStaticProperty - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): del PropertyTest().PublicStaticProperty - self.assertRaises(TypeError, test) - def test_protected_instance_property(self): """Test protected instance properties.""" ob = PropertyTest() @@ -51,11 +45,9 @@ def test_protected_instance_property(self): ob.ProtectedProperty = 1 self.assertTrue(ob.ProtectedProperty == 1) - def test(): + with self.assertRaises(TypeError): del PropertyTest().ProtectedProperty - self.assertRaises(TypeError, test) - def test_protected_static_property(self): """Test protected static properties.""" ob = PropertyTest() @@ -68,51 +60,35 @@ def test_protected_static_property(self): ob.ProtectedStaticProperty = 0 self.assertTrue(ob.ProtectedStaticProperty == 0) - def test(): + with self.assertRaises(TypeError): del PropertyTest.ProtectedStaticProperty - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): del PropertyTest().ProtectedStaticProperty - self.assertRaises(TypeError, test) - def test_internal_property(self): """Test internal properties.""" - def test(): - return PropertyTest().InternalProperty - - self.assertRaises(AttributeError, test) - - def test(): - return PropertyTest().InternalStaticProperty + with self.assertRaises(AttributeError): + PropertyTest().InternalProperty - self.assertRaises(AttributeError, test) + with self.assertRaises(AttributeError): + PropertyTest().InternalStaticProperty - def test(): - return PropertyTest.InternalStaticProperty - - self.assertRaises(AttributeError, test) + with self.assertRaises(AttributeError): + PropertyTest.InternalStaticProperty def test_private_property(self): """Test private properties.""" - def test(): - return PropertyTest().PrivateProperty - - self.assertRaises(AttributeError, test) - - def test(): - return PropertyTest().PrivateStaticProperty - - self.assertRaises(AttributeError, test) + with self.assertRaises(AttributeError): + PropertyTest().PrivateProperty - def test(): - return PropertyTest.PrivateStaticProperty + with self.assertRaises(AttributeError): + PropertyTest().PrivateStaticProperty - self.assertRaises(AttributeError, test) + with self.assertRaises(AttributeError): + PropertyTest.PrivateStaticProperty def test_property_descriptor_get_set(self): """Test property descriptor get / set.""" @@ -140,26 +116,20 @@ def test_property_descriptor_get_set(self): def test_property_descriptor_wrong_type(self): """Test setting a property using a value of the wrong type.""" - def test(): + with self.assertRaises(TypeError): ob = PropertyTest() ob.PublicProperty = "spam" - self.assertTrue(TypeError, test) - def test_property_descriptor_abuse(self): """Test property descriptor abuse.""" desc = PropertyTest.__dict__['PublicProperty'] - def test(): + with self.assertRaises(TypeError): desc.__get__(0, 0) - self.assertRaises(TypeError, test) - - def test(): + with self.assertRaises(TypeError): desc.__set__(0, 0) - self.assertRaises(TypeError, test) - def test_interface_property(self): """Test properties of interfaces. Added after a bug report that an IsAbstract check was inappropriate and prevented diff --git a/src/tests/test_suite/test_import.py b/src/tests/test_suite/test_import.py index baea6d5cf..9bae9ca5f 100644 --- a/src/tests/test_suite/test_import.py +++ b/src/tests/test_suite/test_import.py @@ -10,10 +10,8 @@ def test_relative_missing_import(self): """Test that a relative missing import doesn't crash. Some modules use this to check if a package is installed. Relative import in the site-packages folder""" - try: + with self.assertRaises(ImportError): from . import _missing_import - except ImportError: - pass def test_suite(): From 2b42cdf0377d9aff1c5cf8e8d6f4b173d852be55 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 22 Jan 2017 01:59:32 -0700 Subject: [PATCH 042/324] Format for pep8 and linters Fix max min nameclash --- src/tests/leaktest.py | 12 +- src/tests/profile.py | 4 +- src/tests/runtests.py | 2 +- src/tests/stress.py | 35 +-- src/tests/stresstest.py | 2 +- src/tests/test_array.py | 340 ++++++++++---------- src/tests/test_class.py | 40 +-- src/tests/test_compat.py | 46 +-- src/tests/test_constructors.py | 4 +- src/tests/test_conversion.py | 46 +-- src/tests/test_delegate.py | 20 +- src/tests/test_engine.py | 9 +- src/tests/test_enum.py | 3 +- src/tests/test_event.py | 42 ++- src/tests/test_exceptions.py | 25 +- src/tests/test_field.py | 12 +- src/tests/test_generic.py | 426 +++++++++++++------------- src/tests/test_indexer.py | 175 +++++------ src/tests/test_interface.py | 7 +- src/tests/test_method.py | 186 ++++++----- src/tests/test_module.py | 65 ++-- src/tests/test_property.py | 14 +- src/tests/test_subclass.py | 8 +- src/tests/test_suite/test_callback.py | 12 +- src/tests/test_thread.py | 9 +- src/tests/utils.py | 14 +- 26 files changed, 763 insertions(+), 795 deletions(-) diff --git a/src/tests/leaktest.py b/src/tests/leaktest.py index a54774566..2167060ad 100644 --- a/src/tests/leaktest.py +++ b/src/tests/leaktest.py @@ -43,10 +43,10 @@ def end_test(self): end = System.Environment.WorkingSet diff = end - start if diff > 0: - diff = '+%d' % diff + diff = '+{0}'.format(diff) else: - diff = '%d' % diff - print(" start: %d end: %d diff: %s" % (start, end, diff)) + diff = '{0}'.format(diff) + print(" start: {0} end: {1} diff: {2}".format(start, end, diff)) print("") def run(self): @@ -203,10 +203,10 @@ def test_events(self): testob.PublicEvent -= EventTest.StaticHandler # Function event handler - dict = {'value': None} + dict_ = {'value': None} - def handler(sender, args, dict=dict): - dict['value'] = args.value + def handler(sender, args, dict_=dict_): + dict_['value'] = args.value testob.PublicEvent += handler testob.PublicEvent(testob, TestEventArgs(10)) diff --git a/src/tests/profile.py b/src/tests/profile.py index ddc076e7b..f6576ddce 100644 --- a/src/tests/profile.py +++ b/src/tests/profile.py @@ -26,12 +26,12 @@ def main(): start = time.clock() for i in range(50): - print('iteration: %d' % i) + print('iteration: {0:d}'.format(i)) runtests.main() stop = time.clock() took = str(stop - start) - print('Total Time: %s' % took) + print('Total Time: {0}'.format(took)) for item in gc.get_objects(): print(item, sys.getrefcount(item)) diff --git a/src/tests/runtests.py b/src/tests/runtests.py index 3b7ffa08e..919d4b7e5 100644 --- a/src/tests/runtests.py +++ b/src/tests/runtests.py @@ -58,7 +58,7 @@ def remove_pyc(): path = os.path.dirname(os.path.abspath(__file__)) for name in test_modules: - pyc = os.path.join(path, "%s.pyc" % name) + pyc = os.path.join(path, "{0}.pyc".format(name)) if os.path.isfile(pyc): os.unlink(pyc) diff --git a/src/tests/stress.py b/src/tests/stress.py index ebc975d38..2ffe06958 100644 --- a/src/tests/stress.py +++ b/src/tests/stress.py @@ -18,12 +18,7 @@ import time from _compat import range, thread - - -def dprint(msg): - # Debugging helper to trace thread-related tests. - if 1: - print(msg) +from utils import dprint class StressTest(object): @@ -35,47 +30,47 @@ def __init__(self): self.module = runtests self.done = [] - def markStart(self): + def mark_start(self): self._start = time.clock() - def markFinish(self): + def mark_finish(self): self._finish = time.clock() def elapsed(self): return self._finish - self._start - def printGCReport(self): + def print_gc_report(self): for item in gc.get_objects(): print(item, sys.getrefcount(item)) - def runThread(self, iterations): + def run_thread(self, iterations): thread_id = thread.get_ident() - dprint("thread %s starting..." % thread_id) + dprint("thread {0} starting...".format(thread_id)) time.sleep(0.1) for i in range(iterations): - dprint("thread %s iter %d start" % (thread_id, i)) + dprint("thread {0} iter {1} start".format(thread_id, i)) self.module.main() - dprint("thread %s iter %d end" % (thread_id, i)) + dprint("thread {0} iter {1} end".format(thread_id, i)) self.done.append(None) - dprint("thread %s done" % thread_id) + dprint("thread {0} done".format(thread_id)) - def stressTest(self, iterations=1, threads=1): + def stress_test(self, iterations=1, threads=1): args = (iterations,) - self.markStart() + self.mark_start() for _ in range(threads): - thread = threading.Thread(target=self.runThread, args=args) + thread = threading.Thread(target=self.run_thread, args=args) thread.start() while len(self.done) < (iterations * threads): dprint(len(self.done)) time.sleep(0.1) - self.markFinish() + self.mark_finish() took = self.elapsed() - self.printGCReport() + self.print_gc_report() def main(): test = StressTest() - test.stressTest(2, 10) + test.stress_test(2, 10) if __name__ == '__main__': diff --git a/src/tests/stresstest.py b/src/tests/stresstest.py index 6c02bf566..947959239 100644 --- a/src/tests/stresstest.py +++ b/src/tests/stresstest.py @@ -50,7 +50,7 @@ def main(): stop = time.clock() took = str(stop - start) - print('Total Time: %s' % took) + print('Total Time: {0}'.format(took)) for i in gc.get_objects(): print(i) diff --git a/src/tests/test_array.py b/src/tests/test_array.py index a107253c6..bcd50e386 100644 --- a/src/tests/test_array.py +++ b/src/tests/test_array.py @@ -60,14 +60,14 @@ def test_internal_array(self): with self.assertRaises(AttributeError): ob = Test.InternalArrayTest() - items = ob.items + _ = ob.items def test_private_array(self): """Test private arrays.""" with self.assertRaises(AttributeError): ob = Test.PrivateArrayTest() - items = ob.items + _ = ob.items def test_array_bounds_checking(self): """Test array bounds checking.""" @@ -89,7 +89,7 @@ def test_array_bounds_checking(self): with self.assertRaises(IndexError): ob = Test.Int32ArrayTest() - ob.items[5] + _ = ob.items[5] with self.assertRaises(IndexError): ob = Test.Int32ArrayTest() @@ -141,7 +141,7 @@ def test_boolean_array(self): with self.assertRaises(TypeError): ob = Test.ByteArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.ByteArrayTest() @@ -157,32 +157,32 @@ def test_byte_array(self): self.assertTrue(items[0] == 0) self.assertTrue(items[4] == 4) - max = 255 - min = 0 + max_ = 255 + min_ = 0 - items[0] = max - self.assertTrue(items[0] == max) + items[0] = max_ + self.assertTrue(items[0] == max_) - items[0] = min - self.assertTrue(items[0] == min) + items[0] = min_ + self.assertTrue(items[0] == min_) - items[-4] = max - self.assertTrue(items[-4] == max) + items[-4] = max_ + self.assertTrue(items[-4] == max_) - items[-1] = min - self.assertTrue(items[-1] == min) + items[-1] = min_ + self.assertTrue(items[-1] == min_) with self.assertRaises(OverflowError): ob = Test.ByteArrayTest() - ob.items[0] = max + 1 + ob.items[0] = max_ + 1 with self.assertRaises(OverflowError): ob = Test.ByteArrayTest() - ob.items[0] = min - 1 + ob.items[0] = min_ - 1 with self.assertRaises(TypeError): ob = Test.ByteArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.ByteArrayTest() @@ -198,32 +198,32 @@ def test_sbyte_array(self): self.assertTrue(items[0] == 0) self.assertTrue(items[4] == 4) - max = 127 - min = -128 + max_ = 127 + min_ = -128 - items[0] = max - self.assertTrue(items[0] == max) + items[0] = max_ + self.assertTrue(items[0] == max_) - items[0] = min - self.assertTrue(items[0] == min) + items[0] = min_ + self.assertTrue(items[0] == min_) - items[-4] = max - self.assertTrue(items[-4] == max) + items[-4] = max_ + self.assertTrue(items[-4] == max_) - items[-1] = min - self.assertTrue(items[-1] == min) + items[-1] = min_ + self.assertTrue(items[-1] == min_) with self.assertRaises(OverflowError): ob = Test.SByteArrayTest() - ob.items[0] = max + 1 + ob.items[0] = max_ + 1 with self.assertRaises(OverflowError): ob = Test.SByteArrayTest() - ob.items[0] = min - 1 + ob.items[0] = min_ - 1 with self.assertRaises(TypeError): ob = Test.SByteArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.SByteArrayTest() @@ -239,24 +239,24 @@ def test_char_array(self): self.assertTrue(items[0] == 'a') self.assertTrue(items[4] == 'e') - max = unichr(65535) - min = unichr(0) + max_ = unichr(65535) + min_ = unichr(0) - items[0] = max - self.assertTrue(items[0] == max) + items[0] = max_ + self.assertTrue(items[0] == max_) - items[0] = min - self.assertTrue(items[0] == min) + items[0] = min_ + self.assertTrue(items[0] == min_) - items[-4] = max - self.assertTrue(items[-4] == max) + items[-4] = max_ + self.assertTrue(items[-4] == max_) - items[-1] = min - self.assertTrue(items[-1] == min) + items[-1] = min_ + self.assertTrue(items[-1] == min_) with self.assertRaises(TypeError): ob = Test.CharArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.CharArrayTest() @@ -272,32 +272,32 @@ def test_int16_array(self): self.assertTrue(items[0] == 0) self.assertTrue(items[4] == 4) - max = 32767 - min = -32768 + max_ = 32767 + min_ = -32768 - items[0] = max - self.assertTrue(items[0] == max) + items[0] = max_ + self.assertTrue(items[0] == max_) - items[0] = min - self.assertTrue(items[0] == min) + items[0] = min_ + self.assertTrue(items[0] == min_) - items[-4] = max - self.assertTrue(items[-4] == max) + items[-4] = max_ + self.assertTrue(items[-4] == max_) - items[-1] = min - self.assertTrue(items[-1] == min) + items[-1] = min_ + self.assertTrue(items[-1] == min_) with self.assertRaises(OverflowError): ob = Test.Int16ArrayTest() - ob.items[0] = max + 1 + ob.items[0] = max_ + 1 with self.assertRaises(OverflowError): ob = Test.Int16ArrayTest() - ob.items[0] = min - 1 + ob.items[0] = min_ - 1 with self.assertRaises(TypeError): ob = Test.Int16ArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.Int16ArrayTest() @@ -313,32 +313,32 @@ def test_int32_array(self): self.assertTrue(items[0] == 0) self.assertTrue(items[4] == 4) - max = 2147483647 - min = -2147483648 + max_ = 2147483647 + min_ = -2147483648 - items[0] = max - self.assertTrue(items[0] == max) + items[0] = max_ + self.assertTrue(items[0] == max_) - items[0] = min - self.assertTrue(items[0] == min) + items[0] = min_ + self.assertTrue(items[0] == min_) - items[-4] = max - self.assertTrue(items[-4] == max) + items[-4] = max_ + self.assertTrue(items[-4] == max_) - items[-1] = min - self.assertTrue(items[-1] == min) + items[-1] = min_ + self.assertTrue(items[-1] == min_) with self.assertRaises(OverflowError): ob = Test.Int32ArrayTest() - ob.items[0] = max + 1 + ob.items[0] = max_ + 1 with self.assertRaises(OverflowError): ob = Test.Int32ArrayTest() - ob.items[0] = min - 1 + ob.items[0] = min_ - 1 with self.assertRaises(TypeError): ob = Test.Int32ArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.Int32ArrayTest() @@ -354,32 +354,32 @@ def test_int64_array(self): self.assertTrue(items[0] == 0) self.assertTrue(items[4] == 4) - max = long(9223372036854775807) - min = long(-9223372036854775808) + max_ = long(9223372036854775807) + min_ = long(-9223372036854775808) - items[0] = max - self.assertTrue(items[0] == max) + items[0] = max_ + self.assertTrue(items[0] == max_) - items[0] = min - self.assertTrue(items[0] == min) + items[0] = min_ + self.assertTrue(items[0] == min_) - items[-4] = max - self.assertTrue(items[-4] == max) + items[-4] = max_ + self.assertTrue(items[-4] == max_) - items[-1] = min - self.assertTrue(items[-1] == min) + items[-1] = min_ + self.assertTrue(items[-1] == min_) with self.assertRaises(OverflowError): ob = Test.Int64ArrayTest() - ob.items[0] = max + 1 + ob.items[0] = max_ + 1 with self.assertRaises(OverflowError): ob = Test.Int64ArrayTest() - ob.items[0] = min - 1 + ob.items[0] = min_ - 1 with self.assertRaises(TypeError): ob = Test.Int64ArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.Int64ArrayTest() @@ -395,32 +395,32 @@ def test_uint16_array(self): self.assertTrue(items[0] == 0) self.assertTrue(items[4] == 4) - max = 65535 - min = 0 + max_ = 65535 + min_ = 0 - items[0] = max - self.assertTrue(items[0] == max) + items[0] = max_ + self.assertTrue(items[0] == max_) - items[0] = min - self.assertTrue(items[0] == min) + items[0] = min_ + self.assertTrue(items[0] == min_) - items[-4] = max - self.assertTrue(items[-4] == max) + items[-4] = max_ + self.assertTrue(items[-4] == max_) - items[-1] = min - self.assertTrue(items[-1] == min) + items[-1] = min_ + self.assertTrue(items[-1] == min_) with self.assertRaises(OverflowError): ob = Test.UInt16ArrayTest() - ob.items[0] = max + 1 + ob.items[0] = max_ + 1 with self.assertRaises(OverflowError): ob = Test.UInt16ArrayTest() - ob.items[0] = min - 1 + ob.items[0] = min_ - 1 with self.assertRaises(TypeError): ob = Test.UInt16ArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.UInt16ArrayTest() @@ -436,32 +436,32 @@ def test_uint32_array(self): self.assertTrue(items[0] == 0) self.assertTrue(items[4] == 4) - max = long(4294967295) - min = 0 + max_ = long(4294967295) + min_ = 0 - items[0] = max - self.assertTrue(items[0] == max) + items[0] = max_ + self.assertTrue(items[0] == max_) - items[0] = min - self.assertTrue(items[0] == min) + items[0] = min_ + self.assertTrue(items[0] == min_) - items[-4] = max - self.assertTrue(items[-4] == max) + items[-4] = max_ + self.assertTrue(items[-4] == max_) - items[-1] = min - self.assertTrue(items[-1] == min) + items[-1] = min_ + self.assertTrue(items[-1] == min_) with self.assertRaises(OverflowError): ob = Test.UInt32ArrayTest() - ob.items[0] = max + 1 + ob.items[0] = max_ + 1 with self.assertRaises(OverflowError): ob = Test.UInt32ArrayTest() - ob.items[0] = min - 1 + ob.items[0] = min_ - 1 with self.assertRaises(TypeError): ob = Test.UInt32ArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.UInt32ArrayTest() @@ -477,32 +477,32 @@ def test_uint64_array(self): self.assertTrue(items[0] == 0) self.assertTrue(items[4] == 4) - max = long(18446744073709551615) - min = 0 + max_ = long(18446744073709551615) + min_ = 0 - items[0] = max - self.assertTrue(items[0] == max) + items[0] = max_ + self.assertTrue(items[0] == max_) - items[0] = min - self.assertTrue(items[0] == min) + items[0] = min_ + self.assertTrue(items[0] == min_) - items[-4] = max - self.assertTrue(items[-4] == max) + items[-4] = max_ + self.assertTrue(items[-4] == max_) - items[-1] = min - self.assertTrue(items[-1] == min) + items[-1] = min_ + self.assertTrue(items[-1] == min_) with self.assertRaises(OverflowError): ob = Test.UInt64ArrayTest() - ob.items[0] = max + 1 + ob.items[0] = max_ + 1 with self.assertRaises(OverflowError): ob = Test.UInt64ArrayTest() - ob.items[0] = min - 1 + ob.items[0] = min_ - 1 with self.assertRaises(TypeError): ob = Test.UInt64ArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.UInt64ArrayTest() @@ -518,24 +518,24 @@ def test_single_array(self): self.assertTrue(items[0] == 0.0) self.assertTrue(items[4] == 4.0) - max = 3.402823e38 - min = -3.402823e38 + max_ = 3.402823e38 + min_ = -3.402823e38 - items[0] = max - self.assertTrue(items[0] == max) + items[0] = max_ + self.assertTrue(items[0] == max_) - items[0] = min - self.assertTrue(items[0] == min) + items[0] = min_ + self.assertTrue(items[0] == min_) - items[-4] = max - self.assertTrue(items[-4] == max) + items[-4] = max_ + self.assertTrue(items[-4] == max_) - items[-1] = min - self.assertTrue(items[-1] == min) + items[-1] = min_ + self.assertTrue(items[-1] == min_) with self.assertRaises(TypeError): ob = Test.SingleArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.SingleArrayTest() @@ -551,24 +551,24 @@ def test_double_array(self): self.assertTrue(items[0] == 0.0) self.assertTrue(items[4] == 4.0) - max = 1.7976931348623157e308 - min = -1.7976931348623157e308 + max_ = 1.7976931348623157e308 + min_ = -1.7976931348623157e308 - items[0] = max - self.assertTrue(items[0] == max) + items[0] = max_ + self.assertTrue(items[0] == max_) - items[0] = min - self.assertTrue(items[0] == min) + items[0] = min_ + self.assertTrue(items[0] == min_) - items[-4] = max - self.assertTrue(items[-4] == max) + items[-4] = max_ + self.assertTrue(items[-4] == max_) - items[-1] = min - self.assertTrue(items[-1] == min) + items[-1] = min_ + self.assertTrue(items[-1] == min_) with self.assertRaises(TypeError): ob = Test.DoubleArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.DoubleArrayTest() @@ -602,7 +602,7 @@ def test_decimal_array(self): with self.assertRaises(TypeError): ob = Test.DecimalArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.DecimalArrayTest() @@ -632,7 +632,7 @@ def test_string_array(self): with self.assertRaises(TypeError): ob = Test.StringArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.Int64ArrayTest() @@ -667,7 +667,7 @@ def test_enum_array(self): with self.assertRaises(TypeError): ob = Test.EnumArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.EnumArrayTest() @@ -704,7 +704,7 @@ def test_object_array(self): with self.assertRaises(TypeError): ob = Test.ObjectArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.ObjectArrayTest() @@ -737,7 +737,7 @@ def test_null_array(self): with self.assertRaises(TypeError): ob = Test.NullArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] def test_interface_array(self): """Test interface arrays.""" @@ -771,7 +771,7 @@ def test_interface_array(self): with self.assertRaises(TypeError): ob = Test.InterfaceArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.InterfaceArrayTest() @@ -809,7 +809,7 @@ def test_typed_array(self): with self.assertRaises(TypeError): ob = Test.TypedArrayTest() - v = ob.items["wrong"] + _ = ob.items["wrong"] with self.assertRaises(TypeError): ob = Test.TypedArrayTest() @@ -848,32 +848,32 @@ def test_multi_dimensional_array(self): self.assertTrue(items[4, 3] == 23) self.assertTrue(items[4, 4] == 24) - max = 2147483647 - min = -2147483648 + max_ = 2147483647 + min_ = -2147483648 - items[0, 0] = max - self.assertTrue(items[0, 0] == max) + items[0, 0] = max_ + self.assertTrue(items[0, 0] == max_) - items[0, 0] = min - self.assertTrue(items[0, 0] == min) + items[0, 0] = min_ + self.assertTrue(items[0, 0] == min_) - items[-4, 0] = max - self.assertTrue(items[-4, 0] == max) + items[-4, 0] = max_ + self.assertTrue(items[-4, 0] == max_) - items[-1, -1] = min - self.assertTrue(items[-1, -1] == min) + items[-1, -1] = min_ + self.assertTrue(items[-1, -1] == min_) with self.assertRaises(OverflowError): ob = Test.MultiDimensionalArrayTest() - ob.items[0, 0] = max + 1 + ob.items[0, 0] = max_ + 1 with self.assertRaises(OverflowError): ob = Test.MultiDimensionalArrayTest() - ob.items[0, 0] = min - 1 + ob.items[0, 0] = min_ - 1 with self.assertRaises(TypeError): ob = Test.MultiDimensionalArrayTest() - v = ob.items["wrong", 0] + _ = ob.items["wrong", 0] with self.assertRaises(TypeError): ob = Test.MultiDimensionalArrayTest() @@ -918,7 +918,7 @@ def test_tuple_nested_array_conversion(self): items = [] for i in range(10): subs = [] - for n in range(10): + for _ in range(10): subs.append(Spam(str(i))) items.append(tuple(subs)) items = tuple(items) @@ -950,7 +950,7 @@ def test_list_nested_array_conversion(self): items = [] for i in range(10): subs = [] - for n in range(10): + for _ in range(10): subs.append(Spam(str(i))) items.append(subs) @@ -981,7 +981,7 @@ def test_sequence_nested_array_conversion(self): items = UserList() for i in range(10): subs = UserList() - for n in range(10): + for _ in range(10): subs.append(Spam(str(i))) items.append(subs) @@ -1014,12 +1014,12 @@ def test_tuple_array_conversion_type_checking(self): with self.assertRaises(TypeError): temp = list(items) temp[1] = 1 - result = ArrayConversionTest.EchoRange(tuple(temp)) + _ = ArrayConversionTest.EchoRange(tuple(temp)) with self.assertRaises(TypeError): temp = list(items) temp[1] = "spam" - result = ArrayConversionTest.EchoRange(tuple(temp)) + _ = ArrayConversionTest.EchoRange(tuple(temp)) def test_list_array_conversion_type_checking(self): """Test error handling for list conversion to array arguments.""" @@ -1042,11 +1042,11 @@ def test_list_array_conversion_type_checking(self): with self.assertRaises(TypeError): items[1] = 1 - result = ArrayConversionTest.EchoRange(items) + _ = ArrayConversionTest.EchoRange(items) with self.assertRaises(TypeError): items[1] = "spam" - result = ArrayConversionTest.EchoRange(items) + _ = ArrayConversionTest.EchoRange(items) def test_sequence_array_conversion_type_checking(self): """Test error handling for sequence conversion to array arguments.""" @@ -1069,11 +1069,11 @@ def test_sequence_array_conversion_type_checking(self): with self.assertRaises(TypeError): items[1] = 1 - result = ArrayConversionTest.EchoRange(items) + _ = ArrayConversionTest.EchoRange(items) with self.assertRaises(TypeError): items[1] = "spam" - result = ArrayConversionTest.EchoRange(items) + _ = ArrayConversionTest.EchoRange(items) def test_md_array_conversion(self): """Test passing of multi-dimensional array arguments.""" diff --git a/src/tests/test_class.py b/src/tests/test_class.py index 373bb326d..80cee9009 100644 --- a/src/tests/test_class.py +++ b/src/tests/test_class.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# TODO: Add tests for ClassicClass, NewStyleClass? import unittest @@ -8,28 +9,16 @@ from _compat import DictProxyType, range -class ClassicClass: - def kind(self): - return 'classic' - - -class NewStyleClass(object): - def kind(self): - return 'new-style' - - class ClassTests(unittest.TestCase): """Test CLR class support.""" def test_basic_reference_type(self): """Test usage of CLR defined reference types.""" - String = System.String - self.assertEquals(String.Empty, "") + self.assertEquals(System.String.Empty, "") def test_basic_value_type(self): """Test usage of CLR defined value types.""" - Int32 = System.Int32 - self.assertEquals(Int32.MaxValue, 2147483647) + self.assertEquals(System.Int32.MaxValue, 2147483647) def test_class_standard_attrs(self): """Test standard class attributes.""" @@ -63,14 +52,14 @@ def test_non_public_class(self): from Python.Test import InternalClass with self.assertRaises(AttributeError): - x = Test.InternalClass + _ = Test.InternalClass def test_basic_subclass(self): """Test basic subclass of a managed class.""" from System.Collections import Hashtable class MyTable(Hashtable): - def howMany(self): + def how_many(self): return self.Count table = MyTable() @@ -80,16 +69,14 @@ def howMany(self): self.assertTrue(len(table.__class__.__bases__) == 1) self.assertTrue(table.__class__.__bases__[0] == Hashtable) - self.assertTrue(table.howMany() == 0) + self.assertTrue(table.how_many() == 0) self.assertTrue(table.Count == 0) table.set_Item('one', 'one') - self.assertTrue(table.howMany() == 1) + self.assertTrue(table.how_many() == 1) self.assertTrue(table.Count == 1) - MyTable = None - def test_subclass_with_no_arg_constructor(self): """Test subclass of a managed class with a no-arg constructor.""" from Python.Test import ClassCtorTest1 @@ -99,7 +86,7 @@ def __init__(self, name): self.name = name # This failed in earlier versions - inst = SubClass('test') + _ = SubClass('test') def test_subclass_with_various_constructors(self): """Test subclass of a managed class with various constructors.""" @@ -145,19 +132,18 @@ def test_struct_construction(self): # test recursion # test - def test_ienumerable_iteration(self): """Test iteration over objects supporting IEnumerable.""" from Python.Test import ClassTest - list = ClassTest.GetArrayList() + list_ = ClassTest.GetArrayList() - for item in list: + for item in list_: self.assertTrue((item > -1) and (item < 10)) - dict = ClassTest.GetHashtable() + dict_ = ClassTest.GetHashtable() - for item in dict: + for item in dict_: cname = item.__class__.__name__ self.assertTrue(cname.endswith('DictionaryEntry')) @@ -214,7 +200,7 @@ def test_add_and_remove_class_attribute(self): from System import TimeSpan for _ in range(100): - TimeSpan.new_method = lambda self: self.TotalMinutes + TimeSpan.new_method = lambda self_: self_.TotalMinutes ts = TimeSpan.FromHours(1) self.assertTrue(ts.new_method() == 60) del TimeSpan.new_method diff --git a/src/tests/test_compat.py b/src/tests/test_compat.py index 6570f2c1c..c26bb9e5d 100644 --- a/src/tests/test_compat.py +++ b/src/tests/test_compat.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- +# TODO: Complete removal of methods below. Similar to test_module import types import unittest from _compat import ClassType, PY2, PY3, range -from utils import isCLRClass, isCLRModule, isCLRRootModule +from utils import is_clr_class, is_clr_module, is_clr_root_module class CompatibilityTests(unittest.TestCase): @@ -15,7 +16,7 @@ class CompatibilityTests(unittest.TestCase): def test_simple_import(self): """Test simple import.""" import CLR - self.assertTrue(isCLRRootModule(CLR)) + self.assertTrue(is_clr_root_module(CLR)) self.assertTrue(CLR.__name__ == 'clr') import sys @@ -35,7 +36,7 @@ def test_simple_import(self): def test_simple_import_with_alias(self): """Test simple import with aliasing.""" import CLR as myCLR - self.assertTrue(isCLRRootModule(myCLR)) + self.assertTrue(is_clr_root_module(myCLR)) self.assertTrue(myCLR.__name__ == 'clr') import sys as mySys @@ -55,11 +56,11 @@ def test_simple_import_with_alias(self): def test_dotted_name_import(self): """Test dotted-name import.""" import CLR.System - self.assertTrue(isCLRModule(CLR.System)) + self.assertTrue(is_clr_module(CLR.System)) self.assertTrue(CLR.System.__name__ == 'System') import System - self.assertTrue(isCLRModule(System)) + self.assertTrue(is_clr_module(System)) self.assertTrue(System.__name__ == 'System') self.assertTrue(System is CLR.System) @@ -71,11 +72,11 @@ def test_dotted_name_import(self): def test_dotted_name_import_with_alias(self): """Test dotted-name import with aliasing.""" import CLR.System as myCLRSystem - self.assertTrue(isCLRModule(myCLRSystem)) + self.assertTrue(is_clr_module(myCLRSystem)) self.assertTrue(myCLRSystem.__name__ == 'System') import System as mySystem - self.assertTrue(isCLRModule(mySystem)) + self.assertTrue(is_clr_module(mySystem)) self.assertTrue(mySystem.__name__ == 'System') self.assertTrue(mySystem is myCLRSystem) @@ -87,7 +88,7 @@ def test_dotted_name_import_with_alias(self): def test_simple_import_from(self): """Test simple 'import from'.""" from CLR import System - self.assertTrue(isCLRModule(System)) + self.assertTrue(is_clr_module(System)) self.assertTrue(System.__name__ == 'System') from xml import dom @@ -97,7 +98,7 @@ def test_simple_import_from(self): def test_simple_import_from_with_alias(self): """Test simple 'import from' with aliasing.""" from CLR import System as mySystem - self.assertTrue(isCLRModule(mySystem)) + self.assertTrue(is_clr_module(mySystem)) self.assertTrue(mySystem.__name__ == 'System') from xml import dom as myDom @@ -107,11 +108,11 @@ def test_simple_import_from_with_alias(self): def test_dotted_name_import_from(self): """Test dotted-name 'import from'.""" from CLR.System import Xml - self.assertTrue(isCLRModule(Xml)) + self.assertTrue(is_clr_module(Xml)) self.assertTrue(Xml.__name__ == 'System.Xml') from CLR.System.Xml import XmlDocument - self.assertTrue(isCLRClass(XmlDocument)) + self.assertTrue(is_clr_class(XmlDocument)) self.assertTrue(XmlDocument.__name__ == 'XmlDocument') from xml.dom import pulldom @@ -125,11 +126,11 @@ def test_dotted_name_import_from(self): def test_dotted_name_import_from_with_alias(self): """Test dotted-name 'import from' with aliasing.""" from CLR.System import Xml as myXml - self.assertTrue(isCLRModule(myXml)) + self.assertTrue(is_clr_module(myXml)) self.assertTrue(myXml.__name__ == 'System.Xml') from CLR.System.Xml import XmlDocument as myXmlDocument - self.assertTrue(isCLRClass(myXmlDocument)) + self.assertTrue(is_clr_class(myXmlDocument)) self.assertTrue(myXmlDocument.__name__ == 'XmlDocument') from xml.dom import pulldom as myPulldom @@ -145,12 +146,12 @@ def test_from_module_import_star(self): count = len(locals().keys()) m = __import__('CLR.System.Management', globals(), locals(), ['*']) self.assertTrue(m.__name__ == 'System.Management') - self.assertTrue(isCLRModule(m)) + self.assertTrue(is_clr_module(m)) self.assertTrue(len(locals().keys()) > count + 1) m2 = __import__('System.Management', globals(), locals(), ['*']) self.assertTrue(m2.__name__ == 'System.Management') - self.assertTrue(isCLRModule(m2)) + self.assertTrue(is_clr_module(m2)) self.assertTrue(len(locals().keys()) > count + 1) self.assertTrue(m is m2) @@ -179,7 +180,7 @@ def test_implicit_load_already_valid_namespace(self): # Python runtime to "do the right thing", allowing types from both # assemblies to be found in the CLR.System module implicitly. import CLR.System - self.assertTrue(isCLRClass(CLR.System.UriBuilder)) + self.assertTrue(is_clr_class(CLR.System.UriBuilder)) def test_import_non_existant_module(self): """Test import failure for a non-existent module.""" @@ -193,7 +194,7 @@ def test_lookup_no_namespace_type(self): """Test lookup of types without a qualified namespace.""" import CLR.Python.Test import CLR - self.assertTrue(isCLRClass(CLR.NoNamespaceType)) + self.assertTrue(is_clr_class(CLR.NoNamespaceType)) def test_module_lookup_recursion(self): """Test for recursive lookup handling.""" @@ -202,29 +203,30 @@ def test_module_lookup_recursion(self): with self.assertRaises(AttributeError): import CLR - x = CLR.CLR + _ = CLR.CLR def test_module_get_attr(self): """Test module getattr behavior.""" import CLR.System as System int_type = System.Int32 - self.assertTrue(isCLRClass(int_type)) + self.assertTrue(is_clr_class(int_type)) module = System.Xml - self.assertTrue(isCLRModule(module)) + self.assertTrue(is_clr_module(module)) with self.assertRaises(AttributeError): - spam = System.Spam + _ = System.Spam with self.assertRaises(TypeError): - spam = getattr(System, 1) + _ = getattr(System, 1) def test_multiple_imports(self): # import CLR did raise a Seg Fault once # test if the Exceptions.warn() method still causes it for _ in range(100): import CLR + _ = CLR def test_suite(): diff --git a/src/tests/test_constructors.py b/src/tests/test_constructors.py index b1f3aacb1..0039f9bf3 100644 --- a/src/tests/test_constructors.py +++ b/src/tests/test_constructors.py @@ -38,10 +38,10 @@ def test_subclass_constructor(self): """Test subclass constructor args""" from Python.Test import SubclassConstructorTest - class sub(System.Exception): + class Sub(System.Exception): pass - instance = sub() + instance = Sub() ob = SubclassConstructorTest(instance) self.assertTrue(isinstance(ob.value, System.Exception)) diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index 7423e2201..8400292d5 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -5,7 +5,7 @@ import System from Python.Test import ConversionTest -from _compat import indexbytes, long, range, unichr +from _compat import indexbytes, long, unichr class ConversionTests(unittest.TestCase): @@ -96,10 +96,10 @@ def test_sbyte_conversion(self): ConversionTest().SByteField = -129 with self.assertRaises(OverflowError): - value = System.SByte(128) + _ = System.SByte(128) with self.assertRaises(OverflowError): - value = System.SByte(-129) + _ = System.SByte(-129) def test_byte_conversion(self): """Test byte conversion.""" @@ -134,10 +134,10 @@ def test_byte_conversion(self): ConversionTest().ByteField = -1 with self.assertRaises(OverflowError): - value = System.Byte(256) + _ = System.Byte(256) with self.assertRaises(OverflowError): - value = System.Byte(-1) + _ = System.Byte(-1) def test_char_conversion(self): """Test char conversion.""" @@ -198,10 +198,10 @@ def test_int16_conversion(self): ConversionTest().Int16Field = -32769 with self.assertRaises(OverflowError): - value = System.Int16(32768) + _ = System.Int16(32768) with self.assertRaises(OverflowError): - value = System.Int16(-32769) + _ = System.Int16(-32769) def test_int32_conversion(self): """Test int32 conversion.""" @@ -236,10 +236,10 @@ def test_int32_conversion(self): ConversionTest().Int32Field = -2147483649 with self.assertRaises(OverflowError): - value = System.Int32(2147483648) + _ = System.Int32(2147483648) with self.assertRaises(OverflowError): - value = System.Int32(-2147483649) + _ = System.Int32(-2147483649) def test_int64_conversion(self): """Test int64 conversion.""" @@ -274,10 +274,10 @@ def test_int64_conversion(self): ConversionTest().Int64Field = long(-9223372036854775809) with self.assertRaises(OverflowError): - value = System.Int64(long(9223372036854775808)) + _ = System.Int64(long(9223372036854775808)) with self.assertRaises(OverflowError): - value = System.Int64(long(-9223372036854775809)) + _ = System.Int64(long(-9223372036854775809)) def test_uint16_conversion(self): """Test uint16 conversion.""" @@ -312,10 +312,10 @@ def test_uint16_conversion(self): ConversionTest().UInt16Field = -1 with self.assertRaises(OverflowError): - value = System.UInt16(65536) + _ = System.UInt16(65536) with self.assertRaises(OverflowError): - value = System.UInt16(-1) + _ = System.UInt16(-1) def test_uint32_conversion(self): """Test uint32 conversion.""" @@ -350,10 +350,10 @@ def test_uint32_conversion(self): ConversionTest().UInt32Field = -1 with self.assertRaises(OverflowError): - value = System.UInt32(long(4294967296)) + _ = System.UInt32(long(4294967296)) with self.assertRaises(OverflowError): - value = System.UInt32(-1) + _ = System.UInt32(-1) def test_uint64_conversion(self): """Test uint64 conversion.""" @@ -388,10 +388,10 @@ def test_uint64_conversion(self): ConversionTest().UInt64Field = -1 with self.assertRaises(OverflowError): - value = System.UInt64(long(18446744073709551616)) + _ = System.UInt64(long(18446744073709551616)) with self.assertRaises(OverflowError): - value = System.UInt64(-1) + _ = System.UInt64(-1) def test_single_conversion(self): """Test single conversion.""" @@ -426,10 +426,10 @@ def test_single_conversion(self): ConversionTest().SingleField = -3.402824e38 with self.assertRaises(OverflowError): - value = System.Single(3.402824e38) + _ = System.Single(3.402824e38) with self.assertRaises(OverflowError): - value = System.Single(-3.402824e38) + _ = System.Single(-3.402824e38) def test_double_conversion(self): """Test double conversion.""" @@ -464,10 +464,10 @@ def test_double_conversion(self): ConversionTest().DoubleField = -1.7976931348623159e308 with self.assertRaises(OverflowError): - value = System.Double(1.7976931348623159e308) + _ = System.Double(1.7976931348623159e308) with self.assertRaises(OverflowError): - value = System.Double(-1.7976931348623159e308) + _ = System.Double(-1.7976931348623159e308) def test_decimal_conversion(self): """Test decimal conversion.""" @@ -658,7 +658,7 @@ def test_byte_array_conversion(self): value = b"testing" ob.ByteArrayField = value array = ob.ByteArrayField - for i in range(len(value)): + for i, _ in enumerate(value): self.assertTrue(array[i] == indexbytes(value, i)) def test_sbyte_array_conversion(self): @@ -676,7 +676,7 @@ def test_sbyte_array_conversion(self): value = b"testing" ob.SByteArrayField = value array = ob.SByteArrayField - for i in range(len(value)): + for i, _ in enumerate(value): self.assertTrue(array[i] == indexbytes(value, i)) diff --git a/src/tests/test_delegate.py b/src/tests/test_delegate.py index 0c51c2937..1d0c30533 100644 --- a/src/tests/test_delegate.py +++ b/src/tests/test_delegate.py @@ -32,9 +32,10 @@ def test_global_delegate_visibility(self): with self.assertRaises(ImportError): from Python.Test import InternalDelegate + _ = InternalDelegate with self.assertRaises(AttributeError): - i = Test.InternalDelegate + _ = Test.InternalDelegate def test_nested_delegate_visibility(self): """Test visibility of nested delegates.""" @@ -45,10 +46,10 @@ def test_nested_delegate_visibility(self): self.assertTrue(ob.__name__ == 'ProtectedDelegate') with self.assertRaises(AttributeError): - ob = DelegateTest.InternalDelegate + _ = DelegateTest.InternalDelegate with self.assertRaises(AttributeError): - ob = DelegateTest.PrivateDelegate + _ = DelegateTest.PrivateDelegate def test_delegate_from_function(self): """Test delegate implemented with a Python function.""" @@ -187,13 +188,13 @@ def test_delegate_with_invalid_args(self): """Test delegate instantiation with invalid (non-callable) args.""" with self.assertRaises(TypeError): - d = StringDelegate(None) + _ = StringDelegate(None) with self.assertRaises(TypeError): - d = StringDelegate("spam") + _ = StringDelegate("spam") with self.assertRaises(TypeError): - d = StringDelegate(1) + _ = StringDelegate(1) def test_multicast_delegate(self): """Test multicast delegates.""" @@ -218,14 +219,12 @@ def test_subclass_delegate_fails(self): with self.assertRaises(TypeError): class Boom(PublicDelegate): pass + _ = Boom def test_delegate_equality(self): """Test delegate equality.""" - def sayhello(): - return "hello" - - d = StringDelegate(sayhello) + d = StringDelegate(hello_func) ob = DelegateTest() ob.stringDelegate = d self.assertTrue(ob.stringDelegate == d) @@ -242,7 +241,6 @@ def always_so_negative(): ob.CallBoolDelegate(d) self.assertTrue(not d()) - self.assertTrue(not ob.CallBoolDelegate(d)) # test async delegates diff --git a/src/tests/test_engine.py b/src/tests/test_engine.py index cfc019b5f..a39cb4aa8 100644 --- a/src/tests/test_engine.py +++ b/src/tests/test_engine.py @@ -13,9 +13,12 @@ class EngineTests(unittest.TestCase): def test_multiple_calls_to_initialize(self): """Test that multiple initialize calls are harmless.""" - PythonEngine.Initialize() - PythonEngine.Initialize() - PythonEngine.Initialize() + try: + PythonEngine.Initialize() + PythonEngine.Initialize() + PythonEngine.Initialize() + except BaseException: + self.fail("Initialize() raise an exception.") def test_import_module(self): """Test module import.""" diff --git a/src/tests/test_enum.py b/src/tests/test_enum.py index 170a47fd1..c24f5aabd 100644 --- a/src/tests/test_enum.py +++ b/src/tests/test_enum.py @@ -84,7 +84,7 @@ def test_instantiate_enum_fails(self): from System import DayOfWeek with self.assertRaises(TypeError): - ob = DayOfWeek() + _ = DayOfWeek() def test_subclass_enum_fails(self): """Test that subclassing of an enumeration fails.""" @@ -93,6 +93,7 @@ def test_subclass_enum_fails(self): with self.assertRaises(TypeError): class Boom(DayOfWeek): pass + _ = Boom def test_enum_set_member_fails(self): """Test that setattr operations on enumerations fail.""" diff --git a/src/tests/test_event.py b/src/tests/test_event.py index 64ecc615c..de337c00b 100644 --- a/src/tests/test_event.py +++ b/src/tests/test_event.py @@ -53,8 +53,6 @@ def test_protected_instance_event(self): def test_protected_static_event(self): """Test protected static events.""" - ob = EventTest - handler = GenericHandler() self.assertTrue(handler.value == None) @@ -69,25 +67,25 @@ def test_internal_events(self): """Test internal events.""" with self.assertRaises(AttributeError): - f = EventTest().InternalEvent + _ = EventTest().InternalEvent with self.assertRaises(AttributeError): - f = EventTest().InternalStaticEvent + _ = EventTest().InternalStaticEvent with self.assertRaises(AttributeError): - f = EventTest.InternalStaticEvent + _ = EventTest.InternalStaticEvent def test_private_events(self): """Test private events.""" with self.assertRaises(AttributeError): - f = EventTest().PrivateEvent + _ = EventTest().PrivateEvent with self.assertRaises(AttributeError): - f = EventTest().PrivateStaticEvent + _ = EventTest().PrivateStaticEvent with self.assertRaises(AttributeError): - f = EventTest.PrivateStaticEvent + _ = EventTest.PrivateStaticEvent def test_multicast_event(self): """Test multicast events.""" @@ -258,33 +256,31 @@ def test_unbound_method_handler(self): """Test failure mode for unbound method handlers.""" ob = EventTest() ob.PublicEvent += GenericHandler.handler - try: + + with self.assertRaises(TypeError): ob.OnPublicEvent(TestEventArgs(10)) - except TypeError: - ob.PublicEvent -= GenericHandler.handler - return - raise TypeError("should have raised a TypeError") + ob.PublicEvent -= GenericHandler.handler def test_function_handler(self): """Test function handlers.""" ob = EventTest() - dict = {'value': None} + dict_ = {'value': None} - def handler(sender, args, dict=dict): - dict['value'] = args.value + def handler(sender, args, dict_=dict_): + dict_['value'] = args.value ob.PublicEvent += handler - self.assertTrue(dict['value'] == None) + self.assertTrue(dict_['value'] == None) ob.OnPublicEvent(TestEventArgs(10)) - self.assertTrue(dict['value'] == 10) + self.assertTrue(dict_['value'] == 10) ob.PublicEvent -= handler - self.assertTrue(dict['value'] == 10) + self.assertTrue(dict_['value'] == 10) ob.OnPublicEvent(TestEventArgs(20)) - self.assertTrue(dict['value'] == 10) + self.assertTrue(dict_['value'] == 10) def test_add_non_callable_handler(self): """Test handling of attempts to add non-callable handlers.""" @@ -298,11 +294,11 @@ def test_add_non_callable_handler(self): ob.PublicEvent += "spam" with self.assertRaises(TypeError): - class spam(object): + class Spam(object): pass ob = EventTest() - ob.PublicEvent += spam() + ob.PublicEvent += Spam() def test_remove_multiple_handlers(self): """Test removing multiple instances of the same handler.""" @@ -411,7 +407,7 @@ def test_random_multiple_handlers(self): ob.PublicEvent += handler2.handler handlers = [] - for i in range(30): + for _ in range(30): method = handler.handler ob.PublicEvent += method handlers.append(method) diff --git a/src/tests/test_exceptions.py b/src/tests/test_exceptions.py index aeec1fee3..7d60e0732 100644 --- a/src/tests/test_exceptions.py +++ b/src/tests/test_exceptions.py @@ -220,7 +220,7 @@ def test_catch_exception_unqualified(self): try: raise OverflowException('overflow') except: - return + pass else: self.fail("failed to catch unqualified exception") @@ -240,22 +240,22 @@ def test_apparent_module_of_exception(self): def test_str_of_exception(self): """Test the str() representation of an exception.""" - from System import NullReferenceException - from System import Convert, FormatException + from System import NullReferenceException, Convert, FormatException + e = NullReferenceException('') self.assertEqual(str(e), '') e = NullReferenceException('Something bad happened') self.assertTrue(str(e).startswith('Something bad happened')) - try: + with self.assertRaises(FormatException) as cm: Convert.ToDateTime('this will fail') - except FormatException: - e = sys.exc_info()[1] - # fix for international installation - msg = text_type(e).encode("utf8") - fnd = text_type('System.Convert.ToDateTime').encode("utf8") - self.assertTrue(msg.find(fnd) > -1, msg) + + e = cm.exception + # fix for international installation + msg = text_type(e).encode("utf8") + fnd = text_type('System.Convert.ToDateTime').encode("utf8") + self.assertTrue(msg.find(fnd) > -1, msg) def test_python_compat_of_managed_exceptions(self): """Test managed exceptions compatible with Python's implementation""" @@ -286,12 +286,11 @@ def test_exception_is_instance_of_system_object(self): # here mainly to remind me to update the caveat in the documentation # one day when when exceptions can be new-style classes. - # This behaviour is now over-shadowed by the implementation of + # This behavior is now over-shadowed by the implementation of # __instancecheck__ (i.e., overloading isinstance), so for all Python # version >= 2.6 we expect isinstance(, Object) to # be true, even though it does not really subclass Object. - from System import OverflowException - from System import Object + from System import OverflowException, Object o = OverflowException('error') diff --git a/src/tests/test_field.py b/src/tests/test_field.py index 1f2ca87ea..6300309ce 100644 --- a/src/tests/test_field.py +++ b/src/tests/test_field.py @@ -119,25 +119,25 @@ def test_internal_field(self): """Test internal fields.""" with self.assertRaises(AttributeError): - f = FieldTest().InternalField + _ = FieldTest().InternalField with self.assertRaises(AttributeError): - f = FieldTest().InternalStaticField + _ = FieldTest().InternalStaticField with self.assertRaises(AttributeError): - f = FieldTest.InternalStaticField + _ = FieldTest.InternalStaticField def test_private_field(self): """Test private fields.""" with self.assertRaises(AttributeError): - f = FieldTest().PrivateField + _ = FieldTest().PrivateField with self.assertRaises(AttributeError): - f = FieldTest().PrivateStaticField + _ = FieldTest().PrivateStaticField with self.assertRaises(AttributeError): - f = FieldTest.PrivateStaticField + _ = FieldTest.PrivateStaticField def test_field_descriptor_get_set(self): """Test field descriptor get / set.""" diff --git a/src/tests/test_generic.py b/src/tests/test_generic.py index e85e76667..fb5e0e5ea 100644 --- a/src/tests/test_generic.py +++ b/src/tests/test_generic.py @@ -11,7 +11,7 @@ class GenericTests(unittest.TestCase): """Test CLR generics support.""" - def _testGenericWrapperByType(self, ptype, value): + def _assert_generic_wrapper_by_type(self, ptype, value): """Test Helper""" from Python.Test import GenericWrapper import System @@ -26,7 +26,7 @@ def _testGenericWrapperByType(self, ptype, value): self.assertTrue(inst.value[0] == value) self.assertTrue(inst.value[1] == value) - def _testGenericMethodByType(self, ptype, value, test_type=0): + def _assert_generic_method_by_type(self, ptype, value, test_type=0): """Test Helper""" from Python.Test import GenericMethodTest, GenericStaticMethodTest import System @@ -116,55 +116,55 @@ def test_python_type_aliasing(self): """Test python type alias support with generics.""" from System.Collections.Generic import Dictionary - dict = Dictionary[str, str]() - self.assertEquals(dict.Count, 0) - dict.Add("one", "one") - self.assertTrue(dict["one"] == "one") - - dict = Dictionary[System.String, System.String]() - self.assertEquals(dict.Count, 0) - dict.Add("one", "one") - self.assertTrue(dict["one"] == "one") - - dict = Dictionary[int, int]() - self.assertEquals(dict.Count, 0) - dict.Add(1, 1) - self.assertTrue(dict[1] == 1) - - dict = Dictionary[System.Int32, System.Int32]() - self.assertEquals(dict.Count, 0) - dict.Add(1, 1) - self.assertTrue(dict[1] == 1) - - dict = Dictionary[long, long]() - self.assertEquals(dict.Count, 0) - dict.Add(long(1), long(1)) - self.assertTrue(dict[long(1)] == long(1)) - - dict = Dictionary[System.Int64, System.Int64]() - self.assertEquals(dict.Count, 0) - dict.Add(long(1), long(1)) - self.assertTrue(dict[long(1)] == long(1)) - - dict = Dictionary[float, float]() - self.assertEquals(dict.Count, 0) - dict.Add(1.5, 1.5) - self.assertTrue(dict[1.5] == 1.5) - - dict = Dictionary[System.Double, System.Double]() - self.assertEquals(dict.Count, 0) - dict.Add(1.5, 1.5) - self.assertTrue(dict[1.5] == 1.5) - - dict = Dictionary[bool, bool]() - self.assertEquals(dict.Count, 0) - dict.Add(True, False) - self.assertTrue(dict[True] == False) - - dict = Dictionary[System.Boolean, System.Boolean]() - self.assertEquals(dict.Count, 0) - dict.Add(True, False) - self.assertTrue(dict[True] == False) + dict_ = Dictionary[str, str]() + self.assertEquals(dict_.Count, 0) + dict_.Add("one", "one") + self.assertTrue(dict_["one"] == "one") + + dict_ = Dictionary[System.String, System.String]() + self.assertEquals(dict_.Count, 0) + dict_.Add("one", "one") + self.assertTrue(dict_["one"] == "one") + + dict_ = Dictionary[int, int]() + self.assertEquals(dict_.Count, 0) + dict_.Add(1, 1) + self.assertTrue(dict_[1] == 1) + + dict_ = Dictionary[System.Int32, System.Int32]() + self.assertEquals(dict_.Count, 0) + dict_.Add(1, 1) + self.assertTrue(dict_[1] == 1) + + dict_ = Dictionary[long, long]() + self.assertEquals(dict_.Count, 0) + dict_.Add(long(1), long(1)) + self.assertTrue(dict_[long(1)] == long(1)) + + dict_ = Dictionary[System.Int64, System.Int64]() + self.assertEquals(dict_.Count, 0) + dict_.Add(long(1), long(1)) + self.assertTrue(dict_[long(1)] == long(1)) + + dict_ = Dictionary[float, float]() + self.assertEquals(dict_.Count, 0) + dict_.Add(1.5, 1.5) + self.assertTrue(dict_[1.5] == 1.5) + + dict_ = Dictionary[System.Double, System.Double]() + self.assertEquals(dict_.Count, 0) + dict_.Add(1.5, 1.5) + self.assertTrue(dict_[1.5] == 1.5) + + dict_ = Dictionary[bool, bool]() + self.assertEquals(dict_.Count, 0) + dict_.Add(True, False) + self.assertTrue(dict_[True] == False) + + dict_ = Dictionary[System.Boolean, System.Boolean]() + self.assertEquals(dict_.Count, 0) + dict_.Add(True, False) + self.assertTrue(dict_[True] == False) def test_generic_reference_type(self): """Test usage of generic reference type definitions.""" @@ -192,20 +192,20 @@ def test_open_generic_type(self): """Test behavior of reflected open constructed generic types.""" from Python.Test import DerivedFromOpenGeneric - OpenGenericType = DerivedFromOpenGeneric.__bases__[0] + open_generic_type = DerivedFromOpenGeneric.__bases__[0] with self.assertRaises(TypeError): - inst = OpenGenericType() + _ = open_generic_type() with self.assertRaises(TypeError): - type = OpenGenericType[System.String] + _ = open_generic_type[System.String] def test_derived_from_open_generic_type(self): """Test a generic type derived from an open generic type.""" from Python.Test import DerivedFromOpenGeneric - type = DerivedFromOpenGeneric[System.String, System.String] - inst = type(1, 'two', 'three') + type_ = DerivedFromOpenGeneric[System.String, System.String] + inst = type_(1, 'two', 'three') self.assertTrue(inst.value1 == 1) self.assertTrue(inst.value2 == 'two') @@ -225,7 +225,7 @@ def test_generic_type_name_resolution(self): # cannot be instantiated. It can only be used to bind a generic. with self.assertRaises(TypeError): - inst = GenericNameTest2() + _ = GenericNameTest2() _class = GenericNameTest2[int] self.assertTrue(_class().value == 1) @@ -240,32 +240,32 @@ def test_generic_type_binding(self): from Python.Test import InterfaceTest, ISayHello1, ShortEnum import System - self._testGenericWrapperByType(System.Boolean, True) - self._testGenericWrapperByType(bool, True) - self._testGenericWrapperByType(System.Byte, 255) - self._testGenericWrapperByType(System.SByte, 127) - self._testGenericWrapperByType(System.Char, u'A') - self._testGenericWrapperByType(System.Int16, 32767) - self._testGenericWrapperByType(System.Int32, 2147483647) - self._testGenericWrapperByType(int, 2147483647) - self._testGenericWrapperByType(System.Int64, long(9223372036854775807)) + self._assert_generic_wrapper_by_type(System.Boolean, True) + self._assert_generic_wrapper_by_type(bool, True) + self._assert_generic_wrapper_by_type(System.Byte, 255) + self._assert_generic_wrapper_by_type(System.SByte, 127) + self._assert_generic_wrapper_by_type(System.Char, u'A') + self._assert_generic_wrapper_by_type(System.Int16, 32767) + self._assert_generic_wrapper_by_type(System.Int32, 2147483647) + self._assert_generic_wrapper_by_type(int, 2147483647) + self._assert_generic_wrapper_by_type(System.Int64, long(9223372036854775807)) # Python 3 has no explicit long type, use System.Int64 instead if PY2: - self._testGenericWrapperByType(long, long(9223372036854775807)) - self._testGenericWrapperByType(System.UInt16, 65000) - self._testGenericWrapperByType(System.UInt32, long(4294967295)) - self._testGenericWrapperByType(System.UInt64, long(18446744073709551615)) - self._testGenericWrapperByType(System.Single, 3.402823e38) - self._testGenericWrapperByType(System.Double, 1.7976931348623157e308) - self._testGenericWrapperByType(float, 1.7976931348623157e308) - self._testGenericWrapperByType(System.Decimal, System.Decimal.One) - self._testGenericWrapperByType(System.String, "test") - self._testGenericWrapperByType(unicode, "test") - self._testGenericWrapperByType(str, "test") - self._testGenericWrapperByType(ShortEnum, ShortEnum.Zero) - self._testGenericWrapperByType(System.Object, InterfaceTest()) - self._testGenericWrapperByType(InterfaceTest, InterfaceTest()) - self._testGenericWrapperByType(ISayHello1, InterfaceTest()) + self._assert_generic_wrapper_by_type(long, long(9223372036854775807)) + self._assert_generic_wrapper_by_type(System.UInt16, 65000) + self._assert_generic_wrapper_by_type(System.UInt32, long(4294967295)) + self._assert_generic_wrapper_by_type(System.UInt64, long(18446744073709551615)) + self._assert_generic_wrapper_by_type(System.Single, 3.402823e38) + self._assert_generic_wrapper_by_type(System.Double, 1.7976931348623157e308) + self._assert_generic_wrapper_by_type(float, 1.7976931348623157e308) + self._assert_generic_wrapper_by_type(System.Decimal, System.Decimal.One) + self._assert_generic_wrapper_by_type(System.String, "test") + self._assert_generic_wrapper_by_type(unicode, "test") + self._assert_generic_wrapper_by_type(str, "test") + self._assert_generic_wrapper_by_type(ShortEnum, ShortEnum.Zero) + self._assert_generic_wrapper_by_type(System.Object, InterfaceTest()) + self._assert_generic_wrapper_by_type(InterfaceTest, InterfaceTest()) + self._assert_generic_wrapper_by_type(ISayHello1, InterfaceTest()) def test_generic_method_binding(self): from Python.Test import GenericMethodTest, GenericStaticMethodTest @@ -293,40 +293,38 @@ def test_generic_method_type_handling(self): from Python.Test import InterfaceTest, ISayHello1, ShortEnum import System - # XXX BUG: The value doesn't fit into Int64 and PythonNet doesn't + # FIXME: The value doesn't fit into Int64 and PythonNet doesn't # recognize it as UInt64 for unknown reasons. - # self._testGenericMethodByType(System.UInt64, 18446744073709551615L) - self._testGenericMethodByType(System.Boolean, True) - self._testGenericMethodByType(bool, True) - self._testGenericMethodByType(System.Byte, 255) - self._testGenericMethodByType(System.SByte, 127) - self._testGenericMethodByType(System.Char, u'A') - self._testGenericMethodByType(System.Int16, 32767) - self._testGenericMethodByType(System.Int32, 2147483647) - self._testGenericMethodByType(int, 2147483647) + # self._assert_generic_method_by_type(System.UInt64, 18446744073709551615L) + self._assert_generic_method_by_type(System.Boolean, True) + self._assert_generic_method_by_type(bool, True) + self._assert_generic_method_by_type(System.Byte, 255) + self._assert_generic_method_by_type(System.SByte, 127) + self._assert_generic_method_by_type(System.Char, u'A') + self._assert_generic_method_by_type(System.Int16, 32767) + self._assert_generic_method_by_type(System.Int32, 2147483647) + self._assert_generic_method_by_type(int, 2147483647) # Python 3 has no explicit long type, use System.Int64 instead if PY2: - self._testGenericMethodByType(System.Int64, long(9223372036854775807)) - self._testGenericMethodByType(long, long(9223372036854775807)) - self._testGenericMethodByType(System.UInt32, long(4294967295)) - self._testGenericMethodByType(System.Int64, long(1844674407370955161)) - self._testGenericMethodByType(System.UInt16, 65000) - self._testGenericMethodByType(System.Single, 3.402823e38) - self._testGenericMethodByType(System.Double, 1.7976931348623157e308) - self._testGenericMethodByType(float, 1.7976931348623157e308) - self._testGenericMethodByType(System.Decimal, System.Decimal.One) - self._testGenericMethodByType(System.String, "test") - self._testGenericMethodByType(unicode, "test") - self._testGenericMethodByType(str, "test") - self._testGenericMethodByType(ShortEnum, ShortEnum.Zero) - self._testGenericMethodByType(System.Object, InterfaceTest()) - self._testGenericMethodByType(InterfaceTest, InterfaceTest(), 1) - self._testGenericMethodByType(ISayHello1, InterfaceTest(), 1) + self._assert_generic_method_by_type(System.Int64, long(9223372036854775807)) + self._assert_generic_method_by_type(long, long(9223372036854775807)) + self._assert_generic_method_by_type(System.UInt32, long(4294967295)) + self._assert_generic_method_by_type(System.Int64, long(1844674407370955161)) + self._assert_generic_method_by_type(System.UInt16, 65000) + self._assert_generic_method_by_type(System.Single, 3.402823e38) + self._assert_generic_method_by_type(System.Double, 1.7976931348623157e308) + self._assert_generic_method_by_type(float, 1.7976931348623157e308) + self._assert_generic_method_by_type(System.Decimal, System.Decimal.One) + self._assert_generic_method_by_type(System.String, "test") + self._assert_generic_method_by_type(unicode, "test") + self._assert_generic_method_by_type(str, "test") + self._assert_generic_method_by_type(ShortEnum, ShortEnum.Zero) + self._assert_generic_method_by_type(System.Object, InterfaceTest()) + self._assert_generic_method_by_type(InterfaceTest, InterfaceTest(), 1) + self._assert_generic_method_by_type(ISayHello1, InterfaceTest(), 1) def test_correct_overload_selection(self): """Test correct overloading selection for common types.""" - from System.Drawing import Font - from System import (String, Double, Single, Int16, Int32, Int64) from System import Math @@ -345,21 +343,19 @@ def test_correct_overload_selection(self): self.assertTrue( Math.Max(atype(value1), atype(value2)) == Math.Max.__overloads__[atype, atype]( - atype(value1), - atype(value2))) + atype(value1), atype(value2))) if PY2 and atype is Int64: value2 = long(value2) self.assertTrue( Math.Max(atype(value1), value2) == Math.Max.__overloads__[atype, atype]( - atype(value1), - atype(value2))) + atype(value1), atype(value2))) clr.AddReference("System.Runtime.InteropServices") from System.Runtime.InteropServices import GCHandle, GCHandleType from System import Array, Byte - CSArray = Array.CreateInstance(Byte, 1000) - handler = GCHandle.Alloc(CSArray, GCHandleType.Pinned) + cs_array = Array.CreateInstance(Byte, 1000) + handler = GCHandle.Alloc(cs_array, GCHandleType.Pinned) def test_generic_method_overload_selection(self): """Test explicit overload selection with generic methods.""" @@ -433,10 +429,10 @@ def test_generic_method_overload_selection(self): self.assertTrue(value == "success") with self.assertRaises(TypeError): - value = type.Overloaded[str, bool, int]("true", True, 1) + _ = type.Overloaded[str, bool, int]("true", True, 1) with self.assertRaises(TypeError): - value = inst.Overloaded[str, bool, int]("true", True, 1) + _ = inst.Overloaded[str, bool, int]("true", True, 1) def test_method_overload_selection_with_generic_types(self): """Check method overload selection using generic types.""" @@ -446,130 +442,130 @@ def test_method_overload_selection_with_generic_types(self): inst = InterfaceTest() vtype = GenericWrapper[System.Boolean] - input = vtype(True) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(True) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == True) vtype = GenericWrapper[bool] - input = vtype(True) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(True) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == True) vtype = GenericWrapper[System.Byte] - input = vtype(255) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(255) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == 255) vtype = GenericWrapper[System.SByte] - input = vtype(127) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(127) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == 127) vtype = GenericWrapper[System.Char] - input = vtype(u'A') - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(u'A') + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == u'A') vtype = GenericWrapper[System.Char] - input = vtype(65535) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(65535) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == unichr(65535)) vtype = GenericWrapper[System.Int16] - input = vtype(32767) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(32767) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == 32767) vtype = GenericWrapper[System.Int32] - input = vtype(2147483647) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(2147483647) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == 2147483647) vtype = GenericWrapper[int] - input = vtype(2147483647) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(2147483647) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == 2147483647) vtype = GenericWrapper[System.Int64] - input = vtype(long(9223372036854775807)) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(long(9223372036854775807)) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == long(9223372036854775807)) # Python 3 has no explicit long type, use System.Int64 instead if PY2: vtype = GenericWrapper[long] - input = vtype(long(9223372036854775807)) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(long(9223372036854775807)) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == long(9223372036854775807)) vtype = GenericWrapper[System.UInt16] - input = vtype(65000) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(65000) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == 65000) vtype = GenericWrapper[System.UInt32] - input = vtype(long(4294967295)) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(long(4294967295)) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == long(4294967295)) vtype = GenericWrapper[System.UInt64] - input = vtype(long(18446744073709551615)) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(long(18446744073709551615)) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == long(18446744073709551615)) vtype = GenericWrapper[System.Single] - input = vtype(3.402823e38) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(3.402823e38) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == 3.402823e38) vtype = GenericWrapper[System.Double] - input = vtype(1.7976931348623157e308) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(1.7976931348623157e308) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == 1.7976931348623157e308) vtype = GenericWrapper[float] - input = vtype(1.7976931348623157e308) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(1.7976931348623157e308) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == 1.7976931348623157e308) vtype = GenericWrapper[System.Decimal] - input = vtype(System.Decimal.One) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(System.Decimal.One) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == System.Decimal.One) vtype = GenericWrapper[System.String] - input = vtype("spam") - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype("spam") + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == "spam") vtype = GenericWrapper[str] - input = vtype("spam") - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype("spam") + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == "spam") vtype = GenericWrapper[ShortEnum] - input = vtype(ShortEnum.Zero) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(ShortEnum.Zero) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value == ShortEnum.Zero) vtype = GenericWrapper[System.Object] - input = vtype(inst) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(inst) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value.__class__ == inst.__class__) vtype = GenericWrapper[InterfaceTest] - input = vtype(inst) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(inst) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value.__class__ == inst.__class__) vtype = GenericWrapper[ISayHello1] - input = vtype(inst) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(inst) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value.value.__class__ == inst.__class__) vtype = System.Array[GenericWrapper[int]] - input = vtype([GenericWrapper[int](0), GenericWrapper[int](1)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([GenericWrapper[int](0), GenericWrapper[int](1)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == 0) self.assertTrue(value[1].value == 1) @@ -582,72 +578,72 @@ def test_overload_selection_with_arrays_of_generic_types(self): gtype = GenericWrapper[System.Boolean] vtype = System.Array[gtype] - input = vtype([gtype(True), gtype(True)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype(True), gtype(True)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == True) self.assertTrue(value.Length == 2) gtype = GenericWrapper[bool] vtype = System.Array[gtype] - input = vtype([gtype(True), gtype(True)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype(True), gtype(True)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == True) self.assertTrue(value.Length == 2) gtype = GenericWrapper[System.Byte] vtype = System.Array[gtype] - input = vtype([gtype(255), gtype(255)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype(255), gtype(255)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == 255) self.assertTrue(value.Length == 2) gtype = GenericWrapper[System.SByte] vtype = System.Array[gtype] - input = vtype([gtype(127), gtype(127)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype(127), gtype(127)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == 127) self.assertTrue(value.Length == 2) gtype = GenericWrapper[System.Char] vtype = System.Array[gtype] - input = vtype([gtype(u'A'), gtype(u'A')]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype(u'A'), gtype(u'A')]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == u'A') self.assertTrue(value.Length == 2) gtype = GenericWrapper[System.Char] vtype = System.Array[gtype] - input = vtype([gtype(65535), gtype(65535)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype(65535), gtype(65535)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == unichr(65535)) self.assertTrue(value.Length == 2) gtype = GenericWrapper[System.Int16] vtype = System.Array[gtype] - input = vtype([gtype(32767), gtype(32767)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype(32767), gtype(32767)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == 32767) self.assertTrue(value.Length == 2) gtype = GenericWrapper[System.Int32] vtype = System.Array[gtype] - input = vtype([gtype(2147483647), gtype(2147483647)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype(2147483647), gtype(2147483647)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == 2147483647) self.assertTrue(value.Length == 2) gtype = GenericWrapper[int] vtype = System.Array[gtype] - input = vtype([gtype(2147483647), gtype(2147483647)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype(2147483647), gtype(2147483647)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == 2147483647) self.assertTrue(value.Length == 2) gtype = GenericWrapper[System.Int64] vtype = System.Array[gtype] - input = vtype([gtype(long(9223372036854775807)), + input_ = vtype([gtype(long(9223372036854775807)), gtype(long(9223372036854775807))]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == long(9223372036854775807)) self.assertTrue(value.Length == 2) @@ -655,104 +651,104 @@ def test_overload_selection_with_arrays_of_generic_types(self): if PY2: gtype = GenericWrapper[long] vtype = System.Array[gtype] - input = vtype([gtype(long(9223372036854775807)), + input_ = vtype([gtype(long(9223372036854775807)), gtype(long(9223372036854775807))]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == long(9223372036854775807)) self.assertTrue(value.Length == 2) gtype = GenericWrapper[System.UInt16] vtype = System.Array[gtype] - input = vtype([gtype(65000), gtype(65000)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype(65000), gtype(65000)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == 65000) self.assertTrue(value.Length == 2) gtype = GenericWrapper[System.UInt32] vtype = System.Array[gtype] - input = vtype([gtype(long(4294967295)), gtype(long(4294967295))]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype(long(4294967295)), gtype(long(4294967295))]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == long(4294967295)) self.assertTrue(value.Length == 2) gtype = GenericWrapper[System.UInt64] vtype = System.Array[gtype] - input = vtype([gtype(long(18446744073709551615)), + input_ = vtype([gtype(long(18446744073709551615)), gtype(long(18446744073709551615))]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == long(18446744073709551615)) self.assertTrue(value.Length == 2) gtype = GenericWrapper[System.Single] vtype = System.Array[gtype] - input = vtype([gtype(3.402823e38), gtype(3.402823e38)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype(3.402823e38), gtype(3.402823e38)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == 3.402823e38) self.assertTrue(value.Length == 2) gtype = GenericWrapper[System.Double] vtype = System.Array[gtype] - input = vtype([gtype(1.7976931348623157e308), + input_ = vtype([gtype(1.7976931348623157e308), gtype(1.7976931348623157e308)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == 1.7976931348623157e308) self.assertTrue(value.Length == 2) gtype = GenericWrapper[float] vtype = System.Array[gtype] - input = vtype([gtype(1.7976931348623157e308), + input_ = vtype([gtype(1.7976931348623157e308), gtype(1.7976931348623157e308)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == 1.7976931348623157e308) self.assertTrue(value.Length == 2) gtype = GenericWrapper[System.Decimal] vtype = System.Array[gtype] - input = vtype([gtype(System.Decimal.One), + input_ = vtype([gtype(System.Decimal.One), gtype(System.Decimal.One)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == System.Decimal.One) self.assertTrue(value.Length == 2) gtype = GenericWrapper[System.String] vtype = System.Array[gtype] - input = vtype([gtype("spam"), gtype("spam")]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype("spam"), gtype("spam")]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == "spam") self.assertTrue(value.Length == 2) gtype = GenericWrapper[str] vtype = System.Array[gtype] - input = vtype([gtype("spam"), gtype("spam")]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype("spam"), gtype("spam")]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == "spam") self.assertTrue(value.Length == 2) gtype = GenericWrapper[ShortEnum] vtype = System.Array[gtype] - input = vtype([gtype(ShortEnum.Zero), gtype(ShortEnum.Zero)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype(ShortEnum.Zero), gtype(ShortEnum.Zero)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value == ShortEnum.Zero) self.assertTrue(value.Length == 2) gtype = GenericWrapper[System.Object] vtype = System.Array[gtype] - input = vtype([gtype(inst), gtype(inst)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype(inst), gtype(inst)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value.__class__ == inst.__class__) self.assertTrue(value.Length == 2) gtype = GenericWrapper[InterfaceTest] vtype = System.Array[gtype] - input = vtype([gtype(inst), gtype(inst)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype(inst), gtype(inst)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value.__class__ == inst.__class__) self.assertTrue(value.Length == 2) gtype = GenericWrapper[ISayHello1] vtype = System.Array[gtype] - input = vtype([gtype(inst), gtype(inst)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([gtype(inst), gtype(inst)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].value.__class__ == inst.__class__) self.assertTrue(value.Length == 2) diff --git a/src/tests/test_indexer.py b/src/tests/test_indexer.py index 90a8d71f0..62581aed4 100644 --- a/src/tests/test_indexer.py +++ b/src/tests/test_indexer.py @@ -82,16 +82,16 @@ def test_boolean_indexer(self): def test_byte_indexer(self): """Test byte indexers.""" ob = Test.ByteIndexerTest() - max = 255 - min = 0 + max_ = 255 + min_ = 0 - self.assertTrue(ob[max] == None) + self.assertTrue(ob[max_] == None) - ob[max] = str(max) - self.assertTrue(ob[max] == str(max)) + ob[max_] = str(max_) + self.assertTrue(ob[max_] == str(max_)) - ob[min] = str(min) - self.assertTrue(ob[min] == str(min)) + ob[min_] = str(min_) + self.assertTrue(ob[min_] == str(min_)) with self.assertRaises(TypeError): ob = Test.ByteIndexerTest() @@ -104,16 +104,16 @@ def test_byte_indexer(self): def test_sbyte_indexer(self): """Test sbyte indexers.""" ob = Test.SByteIndexerTest() - max = 127 - min = -128 + max_ = 127 + min_ = -128 - self.assertTrue(ob[max] == None) + self.assertTrue(ob[max_] == None) - ob[max] = str(max) - self.assertTrue(ob[max] == str(max)) + ob[max_] = str(max_) + self.assertTrue(ob[max_] == str(max_)) - ob[min] = str(min) - self.assertTrue(ob[min] == str(min)) + ob[min_] = str(min_) + self.assertTrue(ob[min_] == str(min_)) with self.assertRaises(TypeError): ob = Test.SByteIndexerTest() @@ -126,16 +126,16 @@ def test_sbyte_indexer(self): def test_char_indexer(self): """Test char indexers.""" ob = Test.CharIndexerTest() - max = unichr(65535) - min = unichr(0) + max_ = unichr(65535) + min_ = unichr(0) - self.assertTrue(ob[max] == None) + self.assertTrue(ob[max_] == None) - ob[max] = "max" - self.assertTrue(ob[max] == "max") + ob[max_] = "max_" + self.assertTrue(ob[max_] == "max_") - ob[min] = "min" - self.assertTrue(ob[min] == "min") + ob[min_] = "min_" + self.assertTrue(ob[min_] == "min_") with self.assertRaises(TypeError): ob = Test.CharIndexerTest() @@ -148,16 +148,16 @@ def test_char_indexer(self): def test_int16_indexer(self): """Test Int16 indexers.""" ob = Test.Int16IndexerTest() - max = 32767 - min = -32768 + max_ = 32767 + min_ = -32768 - self.assertTrue(ob[max] == None) + self.assertTrue(ob[max_] == None) - ob[max] = str(max) - self.assertTrue(ob[max] == str(max)) + ob[max_] = str(max_) + self.assertTrue(ob[max_] == str(max_)) - ob[min] = str(min) - self.assertTrue(ob[min] == str(min)) + ob[min_] = str(min_) + self.assertTrue(ob[min_] == str(min_)) with self.assertRaises(TypeError): ob = Test.Int16IndexerTest() @@ -170,16 +170,16 @@ def test_int16_indexer(self): def test_int32_indexer(self): """Test Int32 indexers.""" ob = Test.Int32IndexerTest() - max = 2147483647 - min = -2147483648 + max_ = 2147483647 + min_ = -2147483648 - self.assertTrue(ob[max] == None) + self.assertTrue(ob[max_] == None) - ob[max] = str(max) - self.assertTrue(ob[max] == str(max)) + ob[max_] = str(max_) + self.assertTrue(ob[max_] == str(max_)) - ob[min] = str(min) - self.assertTrue(ob[min] == str(min)) + ob[min_] = str(min_) + self.assertTrue(ob[min_] == str(min_)) with self.assertRaises(TypeError): ob = Test.Int32IndexerTest() @@ -192,16 +192,16 @@ def test_int32_indexer(self): def test_int64_indexer(self): """Test Int64 indexers.""" ob = Test.Int64IndexerTest() - max = long(9223372036854775807) - min = long(-9223372036854775808) + max_ = long(9223372036854775807) + min_ = long(-9223372036854775808) - self.assertTrue(ob[max] == None) + self.assertTrue(ob[max_] == None) - ob[max] = str(max) - self.assertTrue(ob[max] == str(max)) + ob[max_] = str(max_) + self.assertTrue(ob[max_] == str(max_)) - ob[min] = str(min) - self.assertTrue(ob[min] == str(min)) + ob[min_] = str(min_) + self.assertTrue(ob[min_] == str(min_)) with self.assertRaises(TypeError): ob = Test.Int64IndexerTest() @@ -214,16 +214,16 @@ def test_int64_indexer(self): def test_uint16_indexer(self): """Test UInt16 indexers.""" ob = Test.UInt16IndexerTest() - max = 65535 - min = 0 + max_ = 65535 + min_ = 0 - self.assertTrue(ob[max] == None) + self.assertTrue(ob[max_] == None) - ob[max] = str(max) - self.assertTrue(ob[max] == str(max)) + ob[max_] = str(max_) + self.assertTrue(ob[max_] == str(max_)) - ob[min] = str(min) - self.assertTrue(ob[min] == str(min)) + ob[min_] = str(min_) + self.assertTrue(ob[min_] == str(min_)) with self.assertRaises(TypeError): ob = Test.UInt16IndexerTest() @@ -236,16 +236,16 @@ def test_uint16_indexer(self): def test_uint32_indexer(self): """Test UInt32 indexers.""" ob = Test.UInt32IndexerTest() - max = long(4294967295) - min = 0 + max_ = long(4294967295) + min_ = 0 - self.assertTrue(ob[max] == None) + self.assertTrue(ob[max_] == None) - ob[max] = str(max) - self.assertTrue(ob[max] == str(max)) + ob[max_] = str(max_) + self.assertTrue(ob[max_] == str(max_)) - ob[min] = str(min) - self.assertTrue(ob[min] == str(min)) + ob[min_] = str(min_) + self.assertTrue(ob[min_] == str(min_)) with self.assertRaises(TypeError): ob = Test.UInt32IndexerTest() @@ -258,16 +258,16 @@ def test_uint32_indexer(self): def test_uint64_indexer(self): """Test UInt64 indexers.""" ob = Test.UInt64IndexerTest() - max = long(18446744073709551615) - min = 0 + max_ = long(18446744073709551615) + min_ = 0 - self.assertTrue(ob[max] == None) + self.assertTrue(ob[max_] == None) - ob[max] = str(max) - self.assertTrue(ob[max] == str(max)) + ob[max_] = str(max_) + self.assertTrue(ob[max_] == str(max_)) - ob[min] = str(min) - self.assertTrue(ob[min] == str(min)) + ob[min_] = str(min_) + self.assertTrue(ob[min_] == str(min_)) with self.assertRaises(TypeError): ob = Test.UInt64IndexerTest() @@ -280,16 +280,16 @@ def test_uint64_indexer(self): def test_single_indexer(self): """Test Single indexers.""" ob = Test.SingleIndexerTest() - max = 3.402823e38 - min = -3.402823e38 + max_ = 3.402823e38 + min_ = -3.402823e38 - self.assertTrue(ob[max] == None) + self.assertTrue(ob[max_] == None) - ob[max] = "max" - self.assertTrue(ob[max] == "max") + ob[max_] = "max_" + self.assertTrue(ob[max_] == "max_") - ob[min] = "min" - self.assertTrue(ob[min] == "min") + ob[min_] = "min_" + self.assertTrue(ob[min_] == "min_") with self.assertRaises(TypeError): ob = Test.SingleIndexerTest() @@ -302,16 +302,16 @@ def test_single_indexer(self): def test_double_indexer(self): """Test Double indexers.""" ob = Test.DoubleIndexerTest() - max = 1.7976931348623157e308 - min = -1.7976931348623157e308 + max_ = 1.7976931348623157e308 + min_ = -1.7976931348623157e308 - self.assertTrue(ob[max] == None) + self.assertTrue(ob[max_] == None) - ob[max] = "max" - self.assertTrue(ob[max] == "max") + ob[max_] = "max_" + self.assertTrue(ob[max_] == "max_") - ob[min] = "min" - self.assertTrue(ob[min] == "min") + ob[min_] = "min_" + self.assertTrue(ob[min_] == "min_") with self.assertRaises(TypeError): ob = Test.DoubleIndexerTest() @@ -331,11 +331,11 @@ def test_decimal_indexer(self): self.assertTrue(ob[max_d] == None) - ob[max_d] = "max" - self.assertTrue(ob[max_d] == "max") + ob[max_d] = "max_" + self.assertTrue(ob[max_d] == "max_") - ob[min_d] = "min" - self.assertTrue(ob[min_d] == "min") + ob[min_d] = "min_" + self.assertTrue(ob[min_d] == "min_") with self.assertRaises(TypeError): ob = Test.DecimalIndexerTest() @@ -422,10 +422,10 @@ def test_object_indexer(self): self.assertTrue(ob[long(1)] == "long") with self.assertRaises(TypeError): - class eggs(object): + class Eggs(object): pass - key = eggs() + key = Eggs() ob = Test.ObjectIndexerTest() ob[key] = "wrong" @@ -489,7 +489,7 @@ def test_multi_arg_indexer(self): with self.assertRaises(TypeError): ob = Test.MultiArgIndexerTest() - v = ob[0, "one"] + _ = ob[0, "one"] with self.assertRaises(TypeError): ob = Test.MultiArgIndexerTest() @@ -508,14 +508,15 @@ def test_multi_type_indexer(self): with self.assertRaises(TypeError): ob = Test.MultiTypeIndexerTest() - v = ob[0, 1, spam] + _ = ob[0, 1, spam] with self.assertRaises(TypeError): ob = Test.MultiTypeIndexerTest() ob[0, 1, spam] = "wrong" def test_multi_default_key_indexer(self): - """Test indexers that take multiple indices with a default key arguments.""" + """Test indexers that take multiple indices with a default + key arguments.""" # default argument is 2 in the MultiDefaultKeyIndexerTest object ob = Test.MultiDefaultKeyIndexerTest() ob[0, 2] = "zero one spam" @@ -529,7 +530,7 @@ def test_indexer_wrong_key_type(self): with self.assertRaises(TypeError): ob = Test.PublicIndexerTest() - v = ob["wrong"] + _ = ob["wrong"] with self.assertRaises(TypeError): ob = Test.PublicIndexerTest() diff --git a/src/tests/test_interface.py b/src/tests/test_interface.py index ab109458b..d83a7a9f1 100644 --- a/src/tests/test_interface.py +++ b/src/tests/test_interface.py @@ -26,9 +26,10 @@ def test_global_interface_visibility(self): with self.assertRaises(ImportError): from Python.Test import IInternalInterface + _ = IInternalInterface with self.assertRaises(AttributeError): - Test.IInternalInterface + _ = Test.IInternalInterface def test_nested_interface_visibility(self): """Test visibility of nested interfaces.""" @@ -41,10 +42,10 @@ def test_nested_interface_visibility(self): self.assertTrue(ob.__name__ == 'IProtected') with self.assertRaises(AttributeError): - ob = InterfaceTest.IInternal + _ = InterfaceTest.IInternal with self.assertRaises(AttributeError): - ob = InterfaceTest.IPrivate + _ = InterfaceTest.IPrivate def test_explicit_cast_to_interface(self): """Test explicit cast to an interface.""" diff --git a/src/tests/test_method.py b/src/tests/test_method.py index 29d921dac..07b73a1e7 100644 --- a/src/tests/test_method.py +++ b/src/tests/test_method.py @@ -68,31 +68,31 @@ def test_internal_method(self): """Test internal method visibility.""" with self.assertRaises(AttributeError): - f = MethodTest().InternalMethod + _ = MethodTest().InternalMethod with self.assertRaises(AttributeError): - f = MethodTest.InternalMethod + _ = MethodTest.InternalMethod with self.assertRaises(AttributeError): - f = MethodTest().InternalStaticMethod + _ = MethodTest().InternalStaticMethod with self.assertRaises(AttributeError): - f = MethodTest.InternalStaticMethod + _ = MethodTest.InternalStaticMethod def test_private_method(self): """Test private method visibility.""" with self.assertRaises(AttributeError): - f = MethodTest().PrivateMethod + _ = MethodTest().PrivateMethod with self.assertRaises(AttributeError): - f = MethodTest.PrivateMethod + _ = MethodTest.PrivateMethod with self.assertRaises(AttributeError): - f = MethodTest().PrivateStaticMethod + _ = MethodTest().PrivateStaticMethod with self.assertRaises(AttributeError): - f = MethodTest.PrivateStaticMethod + _ = MethodTest.PrivateStaticMethod def test_unbound_managed_method_call(self): """Test calling unbound managed methods.""" @@ -187,8 +187,6 @@ class TestSubException(System.Exception): def test_null_array_conversion(self): """Test null array conversion in method call.""" - from System import Type - ob = MethodTest() r = ob.TestNullArrayConversion(None) self.assertTrue(r == None) @@ -237,7 +235,8 @@ def test_value_params_args(self): self.assertTrue(result[2] == 3) def test_non_params_array_in_last_place(self): - """Test overload resolution with of non-"params" array as last parameter.""" + """Test overload resolution with of non-"params" array as + last parameter.""" result = MethodTest.TestNonParamsArrayInLastPlace(1, 2, 3) self.assertTrue(result) @@ -277,10 +276,10 @@ def test_value_out_params(self): self.assertTrue(result[0] == True) self.assertTrue(result[1] == 42) + # None cannot be converted to a value type like int, long, etc. with self.assertRaises(TypeError): MethodTest.TestValueOutParams("hi", None) - # None cannot be converted to a value type like int, long, etc. def test_value_ref_params(self): """Test use of value type byref parameters.""" result = MethodTest.TestValueRefParams("hi", 1) @@ -289,10 +288,10 @@ def test_value_ref_params(self): self.assertTrue(result[0] == True) self.assertTrue(result[1] == 42) + # None cannot be converted to a value type like int, long, etc. with self.assertRaises(TypeError): MethodTest.TestValueRefParams("hi", None) - # None cannot be converted to a value type like int, long, etc. def test_object_out_params(self): """Test use of object out-parameters.""" result = MethodTest.TestObjectOutParams("hi", MethodTest()) @@ -329,10 +328,10 @@ def test_struct_out_params(self): self.assertTrue(result[0] == True) self.assertTrue(isinstance(result[1], System.Guid)) + # None cannot be converted to a value type like a struct with self.assertRaises(TypeError): MethodTest.TestValueRefParams("hi", None) - # None cannot be converted to a value type like a struct def test_struct_ref_params(self): """Test use of struct byref parameters.""" result = MethodTest.TestStructRefParams("hi", System.Guid.NewGuid()) @@ -341,28 +340,28 @@ def test_struct_ref_params(self): self.assertTrue(result[0] == True) self.assertTrue(isinstance(result[1], System.Guid)) + # None cannot be converted to a value type like a struct with self.assertRaises(TypeError): MethodTest.TestValueRefParams("hi", None) - # None cannot be converted to a value type like a struct def test_void_single_out_param(self): """Test void method with single out-parameter.""" result = MethodTest.TestVoidSingleOutParam(9) self.assertTrue(result == 42) + # None cannot be converted to a value type with self.assertRaises(TypeError): MethodTest.TestVoidSingleOutParam(None) - # None cannot be converted to a value type def test_void_single_ref_param(self): """Test void method with single ref-parameter.""" result = MethodTest.TestVoidSingleRefParam(9) self.assertTrue(result == 42) + # None cannot be converted to a value type with self.assertRaises(TypeError): MethodTest.TestVoidSingleRefParam(None) - # None cannot be converted to a value type def test_single_default_param(self): """Test void method with single ref-parameter.""" result = MethodTest.TestSingleDefaultParam() @@ -388,16 +387,14 @@ def test_explicit_selection_with_out_modifier(self): """Check explicit overload selection with out modifiers.""" refstr = System.String("").GetType().MakeByRefType() result = MethodTest.TestStringOutParams.__overloads__[str, refstr]( - "hi", "there" - ) + "hi", "there") self.assertTrue(type(result) == type(())) self.assertTrue(len(result) == 2) self.assertTrue(result[0] == True) self.assertTrue(result[1] == "output string") result = MethodTest.TestStringOutParams.__overloads__[str, refstr]( - "hi", None - ) + "hi", None) self.assertTrue(type(result) == type(())) self.assertTrue(len(result) == 2) self.assertTrue(result[0] == True) @@ -407,16 +404,14 @@ def test_explicit_selection_with_ref_modifier(self): """Check explicit overload selection with ref modifiers.""" refstr = System.String("").GetType().MakeByRefType() result = MethodTest.TestStringRefParams.__overloads__[str, refstr]( - "hi", "there" - ) + "hi", "there") self.assertTrue(type(result) == type(())) self.assertTrue(len(result) == 2) self.assertTrue(result[0] == True) self.assertTrue(result[1] == "output string") result = MethodTest.TestStringRefParams.__overloads__[str, refstr]( - "hi", None - ) + "hi", None) self.assertTrue(type(result) == type(())) self.assertTrue(len(result) == 2) self.assertTrue(result[0] == True) @@ -426,6 +421,7 @@ def test_explicit_overload_selection(self): """Check explicit overload selection using [] syntax.""" from Python.Test import ISayHello1, InterfaceTest, ShortEnum from System import Array + inst = InterfaceTest() value = MethodTest.Overloaded.__overloads__[System.Boolean](True) @@ -456,44 +452,39 @@ def test_explicit_overload_selection(self): self.assertTrue(value == 2147483647) value = MethodTest.Overloaded.__overloads__[System.Int64]( - long(9223372036854775807) - ) + long(9223372036854775807)) self.assertTrue(value == long(9223372036854775807)) # Python 3 has no explicit long type, use System.Int64 instead if PY2: value = MethodTest.Overloaded.__overloads__[long]( - long(9223372036854775807) - ) + long(9223372036854775807)) self.assertTrue(value == long(9223372036854775807)) value = MethodTest.Overloaded.__overloads__[System.UInt16](65000) self.assertTrue(value == 65000) - value = MethodTest.Overloaded.__overloads__[System.UInt32](long(4294967295)) + value = MethodTest.Overloaded.__overloads__[System.UInt32]( + long(4294967295)) self.assertTrue(value == long(4294967295)) value = MethodTest.Overloaded.__overloads__[System.UInt64]( - long(18446744073709551615) - ) + long(18446744073709551615)) self.assertTrue(value == long(18446744073709551615)) value = MethodTest.Overloaded.__overloads__[System.Single](3.402823e38) self.assertTrue(value == 3.402823e38) value = MethodTest.Overloaded.__overloads__[System.Double]( - 1.7976931348623157e308 - ) + 1.7976931348623157e308) self.assertTrue(value == 1.7976931348623157e308) value = MethodTest.Overloaded.__overloads__[float]( - 1.7976931348623157e308 - ) + 1.7976931348623157e308) self.assertTrue(value == 1.7976931348623157e308) value = MethodTest.Overloaded.__overloads__[System.Decimal]( - System.Decimal.One - ) + System.Decimal.One) self.assertTrue(value == System.Decimal.One) value = MethodTest.Overloaded.__overloads__[System.String]("spam") @@ -516,8 +507,7 @@ def test_explicit_overload_selection(self): atype = Array[System.Object] value = MethodTest.Overloaded.__overloads__[str, int, atype]( - "one", 1, atype([1, 2, 3]) - ) + "one", 1, atype([1, 2, 3])) self.assertTrue(value == 3) value = MethodTest.Overloaded.__overloads__[str, int]("one", 1) @@ -530,151 +520,152 @@ def test_overload_selection_with_array_types(self): """Check overload selection using array types.""" from Python.Test import ISayHello1, InterfaceTest, ShortEnum from System import Array + inst = InterfaceTest() vtype = Array[System.Boolean] - input = vtype([True, True]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([True, True]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == True) self.assertTrue(value[1] == True) vtype = Array[bool] - input = vtype([True, True]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([True, True]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == True) self.assertTrue(value[1] == True) vtype = Array[System.Byte] - input = vtype([0, 255]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([0, 255]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == 0) self.assertTrue(value[1] == 255) vtype = Array[System.SByte] - input = vtype([0, 127]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([0, 127]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == 0) self.assertTrue(value[1] == 127) vtype = Array[System.Char] - input = vtype([u'A', u'Z']) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([u'A', u'Z']) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == u'A') self.assertTrue(value[1] == u'Z') vtype = Array[System.Char] - input = vtype([0, 65535]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([0, 65535]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == unichr(0)) self.assertTrue(value[1] == unichr(65535)) vtype = Array[System.Int16] - input = vtype([0, 32767]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([0, 32767]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == 0) self.assertTrue(value[1] == 32767) vtype = Array[System.Int32] - input = vtype([0, 2147483647]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([0, 2147483647]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == 0) self.assertTrue(value[1] == 2147483647) vtype = Array[int] - input = vtype([0, 2147483647]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([0, 2147483647]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == 0) self.assertTrue(value[1] == 2147483647) vtype = Array[System.Int64] - input = vtype([0, long(9223372036854775807)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([0, long(9223372036854775807)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == 0) self.assertTrue(value[1] == long(9223372036854775807)) # Python 3 has no explicit long type, use System.Int64 instead if PY2: vtype = Array[long] - input = vtype([0, long(9223372036854775807)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([0, long(9223372036854775807)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == 0) self.assertTrue(value[1] == long(9223372036854775807)) vtype = Array[System.UInt16] - input = vtype([0, 65000]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([0, 65000]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == 0) self.assertTrue(value[1] == 65000) vtype = Array[System.UInt32] - input = vtype([0, long(4294967295)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([0, long(4294967295)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == 0) self.assertTrue(value[1] == long(4294967295)) vtype = Array[System.UInt64] - input = vtype([0, long(18446744073709551615)]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([0, long(18446744073709551615)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == 0) self.assertTrue(value[1] == long(18446744073709551615)) vtype = Array[System.Single] - input = vtype([0.0, 3.402823e38]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([0.0, 3.402823e38]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == 0.0) self.assertTrue(value[1] == 3.402823e38) vtype = Array[System.Double] - input = vtype([0.0, 1.7976931348623157e308]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([0.0, 1.7976931348623157e308]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == 0.0) self.assertTrue(value[1] == 1.7976931348623157e308) vtype = Array[float] - input = vtype([0.0, 1.7976931348623157e308]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([0.0, 1.7976931348623157e308]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == 0.0) self.assertTrue(value[1] == 1.7976931348623157e308) vtype = Array[System.Decimal] - input = vtype([System.Decimal.Zero, System.Decimal.One]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([System.Decimal.Zero, System.Decimal.One]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == System.Decimal.Zero) self.assertTrue(value[1] == System.Decimal.One) vtype = Array[System.String] - input = vtype(["one", "two"]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(["one", "two"]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == "one") self.assertTrue(value[1] == "two") vtype = Array[str] - input = vtype(["one", "two"]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype(["one", "two"]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == "one") self.assertTrue(value[1] == "two") vtype = Array[ShortEnum] - input = vtype([ShortEnum.Zero, ShortEnum.One]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([ShortEnum.Zero, ShortEnum.One]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0] == ShortEnum.Zero) self.assertTrue(value[1] == ShortEnum.One) vtype = Array[System.Object] - input = vtype([inst, inst]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([inst, inst]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].__class__ == inst.__class__) self.assertTrue(value[1].__class__ == inst.__class__) vtype = Array[InterfaceTest] - input = vtype([inst, inst]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([inst, inst]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].__class__ == inst.__class__) self.assertTrue(value[1].__class__ == inst.__class__) vtype = Array[ISayHello1] - input = vtype([inst, inst]) - value = MethodTest.Overloaded.__overloads__[vtype](input) + input_ = vtype([inst, inst]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) self.assertTrue(value[0].__class__ == inst.__class__) self.assertTrue(value[1].__class__ == inst.__class__) @@ -682,27 +673,26 @@ def test_explicit_overload_selection_failure(self): """Check that overload selection fails correctly.""" with self.assertRaises(TypeError): - value = MethodTest.Overloaded.__overloads__[System.Type](True) + _ = MethodTest.Overloaded.__overloads__[System.Type](True) with self.assertRaises(TypeError): - value = MethodTest.Overloaded.__overloads__[int, int](1, 1) + _ = MethodTest.Overloaded.__overloads__[int, int](1, 1) with self.assertRaises(TypeError): - value = MethodTest.Overloaded.__overloads__[str, int, int]( - "", 1, 1 - ) + _ = MethodTest.Overloaded.__overloads__[str, int, int]("", 1, 1) with self.assertRaises(TypeError): - value = MethodTest.Overloaded.__overloads__[int, long](1) + _ = MethodTest.Overloaded.__overloads__[int, long](1) def test_we_can_bind_to_encoding_get_string(self): - """Check that we can bind to the Encoding.GetString method with variables.""" - + """Check that we can bind to the Encoding.GetString method + with variables.""" from System.Text import Encoding from System.IO import MemoryStream - myBytes = Encoding.UTF8.GetBytes('Some testing string') + + my_bytes = Encoding.UTF8.GetBytes('Some testing string') stream = MemoryStream() - stream.Write(myBytes, 0, myBytes.Length) + stream.Write(my_bytes, 0, my_bytes.Length) stream.Position = 0 buff = System.Array.CreateInstance(System.Byte, 3) diff --git a/src/tests/test_module.py b/src/tests/test_module.py index ad27cae9b..45f20a911 100644 --- a/src/tests/test_module.py +++ b/src/tests/test_module.py @@ -1,13 +1,14 @@ # -*- coding: utf-8 -*- import clr +import time import types import unittest import warnings from fnmatch import fnmatch from _compat import ClassType, PY2, PY3, range -from utils import isCLRClass, isCLRModule, isCLRRootModule +from utils import is_clr_class, is_clr_module, is_clr_root_module # testImplicitAssemblyLoad() passes on deprecation warning; perfect! # @@ -24,7 +25,7 @@ def test_import_hook_works(self): def test_import_clr(self): import clr - self.assertTrue(isCLRRootModule(clr)) + self.assertTrue(is_clr_root_module(clr)) def test_version_clr(self): import clr @@ -60,13 +61,13 @@ def test_module_interface(self): self.assertTrue(fnmatch(system_file, "*System*.dll") or fnmatch(system_file, "*mscorlib.dll"), "unexpected System.__file__: " + system_file) self.assertTrue(System.__doc__.startswith("Namespace containing types from the following assemblies:")) - self.assertTrue(isCLRClass(System.String)) - self.assertTrue(isCLRClass(System.Int32)) + self.assertTrue(is_clr_class(System.String)) + self.assertTrue(is_clr_class(System.Int32)) def test_simple_import(self): """Test simple import.""" import System - self.assertTrue(isCLRModule(System)) + self.assertTrue(is_clr_module(System)) self.assertTrue(System.__name__ == 'System') import sys @@ -85,7 +86,7 @@ def test_simple_import(self): def test_simple_import_with_alias(self): """Test simple import with aliasing.""" import System as mySystem - self.assertTrue(isCLRModule(mySystem)) + self.assertTrue(is_clr_module(mySystem)) self.assertTrue(mySystem.__name__ == 'System') import sys as mySys @@ -104,7 +105,7 @@ def test_simple_import_with_alias(self): def test_dotted_name_import(self): """Test dotted-name import.""" import System.Reflection - self.assertTrue(isCLRModule(System.Reflection)) + self.assertTrue(is_clr_module(System.Reflection)) self.assertTrue(System.Reflection.__name__ == 'System.Reflection') import xml.dom @@ -114,16 +115,16 @@ def test_dotted_name_import(self): def test_multiple_dotted_name_import(self): """Test an import bug with multiple dotted imports.""" import System.Data - self.assertTrue(isCLRModule(System.Data)) + self.assertTrue(is_clr_module(System.Data)) self.assertTrue(System.Data.__name__ == 'System.Data') import System.Data - self.assertTrue(isCLRModule(System.Data)) + self.assertTrue(is_clr_module(System.Data)) self.assertTrue(System.Data.__name__ == 'System.Data') def test_dotted_name_import_with_alias(self): """Test dotted-name import with aliasing.""" import System.Reflection as SysRef - self.assertTrue(isCLRModule(SysRef)) + self.assertTrue(is_clr_module(SysRef)) self.assertTrue(SysRef.__name__ == 'System.Reflection') import xml.dom as myDom @@ -133,7 +134,7 @@ def test_dotted_name_import_with_alias(self): def test_simple_import_from(self): """Test simple 'import from'.""" from System import Reflection - self.assertTrue(isCLRModule(Reflection)) + self.assertTrue(is_clr_module(Reflection)) self.assertTrue(Reflection.__name__ == 'System.Reflection') from xml import dom @@ -143,7 +144,7 @@ def test_simple_import_from(self): def test_simple_import_from_with_alias(self): """Test simple 'import from' with aliasing.""" from System import Collections as Coll - self.assertTrue(isCLRModule(Coll)) + self.assertTrue(is_clr_module(Coll)) self.assertTrue(Coll.__name__ == 'System.Collections') from xml import dom as myDom @@ -153,13 +154,12 @@ def test_simple_import_from_with_alias(self): def test_dotted_name_import_from(self): """Test dotted-name 'import from'.""" from System.Collections import Specialized - self.assertTrue(isCLRModule(Specialized)) + self.assertTrue(is_clr_module(Specialized)) self.assertTrue( - Specialized.__name__ == 'System.Collections.Specialized' - ) + Specialized.__name__ == 'System.Collections.Specialized') from System.Collections.Specialized import StringCollection - self.assertTrue(isCLRClass(StringCollection)) + self.assertTrue(is_clr_class(StringCollection)) self.assertTrue(StringCollection.__name__ == 'StringCollection') from xml.dom import pulldom @@ -173,11 +173,11 @@ def test_dotted_name_import_from(self): def test_dotted_name_import_from_with_alias(self): """Test dotted-name 'import from' with aliasing.""" from System.Collections import Specialized as Spec - self.assertTrue(isCLRModule(Spec)) + self.assertTrue(is_clr_module(Spec)) self.assertTrue(Spec.__name__ == 'System.Collections.Specialized') from System.Collections.Specialized import StringCollection as SC - self.assertTrue(isCLRClass(SC)) + self.assertTrue(is_clr_class(SC)) self.assertTrue(SC.__name__ == 'StringCollection') from xml.dom import pulldom as myPulldom @@ -193,7 +193,7 @@ def test_from_module_import_star(self): count = len(locals().keys()) m = __import__('System.Xml', globals(), locals(), ['*']) self.assertTrue(m.__name__ == 'System.Xml') - self.assertTrue(isCLRModule(m)) + self.assertTrue(is_clr_module(m)) self.assertTrue(len(locals().keys()) > count + 1) def test_implicit_assembly_load(self): @@ -211,10 +211,10 @@ def test_implicit_assembly_load(self): with warnings.catch_warnings(record=True) as w: clr.AddReference("System.Windows.Forms") import System.Windows.Forms as Forms - self.assertTrue(isCLRModule(Forms)) + self.assertTrue(is_clr_module(Forms)) self.assertTrue(Forms.__name__ == 'System.Windows.Forms') from System.Windows.Forms import Form - self.assertTrue(isCLRClass(Form)) + self.assertTrue(is_clr_class(Form)) self.assertTrue(Form.__name__ == 'Form') self.assertEqual(len(w), 0) @@ -241,7 +241,7 @@ def test_implicit_load_already_valid_namespace(self): # Python runtime to "do the right thing", allowing types from both # assemblies to be found in the System module implicitly. import System - self.assertTrue(isCLRClass(System.UriBuilder)) + self.assertTrue(is_clr_class(System.UriBuilder)) def test_import_non_existant_module(self): """Test import failure for a non-existent module.""" @@ -252,7 +252,7 @@ def test_lookup_no_namespace_type(self): """Test lookup of types without a qualified namespace.""" import Python.Test import clr - self.assertTrue(isCLRClass(clr.NoNamespaceType)) + self.assertTrue(is_clr_class(clr.NoNamespaceType)) def test_module_lookup_recursion(self): """Test for recursive lookup handling.""" @@ -262,23 +262,23 @@ def test_module_lookup_recursion(self): with self.assertRaises(AttributeError): import System - x = System.System + _ = System.System def test_module_get_attr(self): """Test module getattr behavior.""" import System int_type = System.Int32 - self.assertTrue(isCLRClass(int_type)) + self.assertTrue(is_clr_class(int_type)) module = System.Xml - self.assertTrue(isCLRModule(module)) + self.assertTrue(is_clr_module(module)) with self.assertRaises(AttributeError): - spam = System.Spam + _ = System.Spam with self.assertRaises(TypeError): - spam = getattr(System, 1) + _ = getattr(System, 1) def test_module_attr_abuse(self): """Test handling of attempts to set module attributes.""" @@ -322,26 +322,25 @@ def test_clr_add_reference(self): from System.IO import FileNotFoundException for name in ("System", "Python.Runtime"): assy = AddReference(name) - assyName = assy.GetName().Name - self.assertEqual(assyName, name) + assy_name = assy.GetName().Name + self.assertEqual(assy_name, name) with self.assertRaises(FileNotFoundException): AddReference("somethingtotallysilly") def test_assembly_load_thread_safety(self): - import time from Python.Test import ModuleTest # spin up .NET thread which loads assemblies and triggers AppDomain.AssemblyLoad event ModuleTest.RunThreads() time.sleep(1e-5) - for i in range(1, 100): + for _ in range(1, 100): # call import clr, which in AssemblyManager.GetNames iterates through the loaded types import clr # import some .NET types from System import DateTime from System import Guid from System.Collections.Generic import Dictionary - dict = Dictionary[Guid, DateTime]() + _ = Dictionary[Guid, DateTime]() ModuleTest.JoinThreads() diff --git a/src/tests/test_property.py b/src/tests/test_property.py index 8f1d5f9e1..8fb37768a 100644 --- a/src/tests/test_property.py +++ b/src/tests/test_property.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# + import unittest from Python.Test import PropertyTest @@ -70,25 +70,25 @@ def test_internal_property(self): """Test internal properties.""" with self.assertRaises(AttributeError): - PropertyTest().InternalProperty + _ = PropertyTest().InternalProperty with self.assertRaises(AttributeError): - PropertyTest().InternalStaticProperty + _ = PropertyTest().InternalStaticProperty with self.assertRaises(AttributeError): - PropertyTest.InternalStaticProperty + _ = PropertyTest.InternalStaticProperty def test_private_property(self): """Test private properties.""" with self.assertRaises(AttributeError): - PropertyTest().PrivateProperty + _ = PropertyTest().PrivateProperty with self.assertRaises(AttributeError): - PropertyTest().PrivateStaticProperty + _ = PropertyTest().PrivateStaticProperty with self.assertRaises(AttributeError): - PropertyTest.PrivateStaticProperty + _ = PropertyTest.PrivateStaticProperty def test_property_descriptor_get_set(self): """Test property descriptor get / set.""" diff --git a/src/tests/test_subclass.py b/src/tests/test_subclass.py index a1caa27a9..922e2651c 100644 --- a/src/tests/test_subclass.py +++ b/src/tests/test_subclass.py @@ -11,8 +11,8 @@ from _compat import range -# class that implements the test interface class InterfaceTestClass(IInterfaceTest): + """class that implements the test interface""" __namespace__ = "Python.Test" def foo(self): @@ -22,8 +22,8 @@ def bar(self, x, i): return "/".join([x] * i) -# class that derives from a class deriving from IInterfaceTest class DerivedClass(SubClassTest): + """class that derives from a class deriving from IInterfaceTest""" __namespace__ = "Python.Test" def foo(self): @@ -46,8 +46,8 @@ def return_list(self): return l -# class that implements IInterfaceTest.TestEvent class DerivedEventTest(IInterfaceTest): + """class that implements IInterfaceTest.TestEvent""" __namespace__ = "Python.Test" def __init__(self): @@ -67,7 +67,7 @@ def OnTestEvent(self, value): class SubClassTests(unittest.TestCase): - """Test subclassing managed types""" + """Test sub-classing managed types""" def test_base_class(self): """Test base class managed type""" diff --git a/src/tests/test_suite/test_callback.py b/src/tests/test_suite/test_callback.py index 412a27a66..2cb234442 100644 --- a/src/tests/test_suite/test_callback.py +++ b/src/tests/test_suite/test_callback.py @@ -15,18 +15,18 @@ def test_default_for_null(self): from Python.Test import CallbackTest test_instance = CallbackTest() - retVal = test_instance.Call_simpleDefaultArg_WithNull(__name__) - pythonRetVal = simpleDefaultArg(None) - self.assertEquals(retVal, pythonRetVal) + ret_val = test_instance.Call_simpleDefaultArg_WithNull(__name__) + python_ret_val = simpleDefaultArg(None) + self.assertEquals(ret_val, python_ret_val) def test_default_for_none(self): """Test that C# can use no argument for an optional python argument""" from Python.Test import CallbackTest test_instance = CallbackTest() - retVal = test_instance.Call_simpleDefaultArg_WithEmptyArgs(__name__) - pythonRetVal = simpleDefaultArg() - self.assertEquals(retVal, pythonRetVal) + ret_val = test_instance.Call_simpleDefaultArg_WithEmptyArgs(__name__) + python_ret_val = simpleDefaultArg() + self.assertEquals(ret_val, python_ret_val) def test_suite(): diff --git a/src/tests/test_thread.py b/src/tests/test_thread.py index 0f947933a..623be60a0 100644 --- a/src/tests/test_thread.py +++ b/src/tests/test_thread.py @@ -1,18 +1,11 @@ # -*- coding: utf-8 -*- -from __future__ import print_function - import threading import time import unittest from _compat import range, thread - - -def dprint(msg): - # Debugging helper to trace thread-related tests. - if 0: - print(msg) +from utils import dprint class ThreadTests(unittest.TestCase): diff --git a/src/tests/utils.py b/src/tests/utils.py index dd4d8767d..6729d7b30 100644 --- a/src/tests/utils.py +++ b/src/tests/utils.py @@ -5,14 +5,22 @@ Refactor utility functions and classes """ +from __future__ import print_function + from _compat import PY2, PY3 -def isCLRModule(ob): +def dprint(msg): + # Debugging helper to trace thread-related tests. + if 0: + print(msg) + + +def is_clr_module(ob): return type(ob).__name__ == 'ModuleObject' -def isCLRRootModule(ob): +def is_clr_root_module(ob): if PY3: # in Python 3 the clr module is a normal python module return ob.__name__ == "clr" @@ -20,7 +28,7 @@ def isCLRRootModule(ob): return type(ob).__name__ == 'CLRModule' -def isCLRClass(ob): +def is_clr_class(ob): return type(ob).__name__ == 'CLR Metatype' # for now From 5ca887e29db9cec8514f78c993c3dd34ffa0dc11 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 22 Jan 2017 02:38:47 -0700 Subject: [PATCH 043/324] Fix tests comparison to None, True, False, isinstance - Replace type(()) with tuple to clarify intent --- src/tests/test_array.py | 44 ++++++++++---------- src/tests/test_class.py | 2 +- src/tests/test_compat.py | 32 +++++++-------- src/tests/test_conversion.py | 38 +++++++++--------- src/tests/test_delegate.py | 4 +- src/tests/test_enum.py | 4 +- src/tests/test_event.py | 24 +++++------ src/tests/test_field.py | 20 ++++----- src/tests/test_generic.py | 20 ++++----- src/tests/test_indexer.py | 54 ++++++++++++------------- src/tests/test_interface.py | 2 +- src/tests/test_method.py | 78 ++++++++++++++++++------------------ src/tests/test_module.py | 32 +++++++-------- 13 files changed, 177 insertions(+), 177 deletions(-) diff --git a/src/tests/test_array.py b/src/tests/test_array.py index bcd50e386..36f225c82 100644 --- a/src/tests/test_array.py +++ b/src/tests/test_array.py @@ -127,17 +127,17 @@ def test_boolean_array(self): self.assertTrue(len(items) == 5) - self.assertTrue(items[0] == True) - self.assertTrue(items[1] == False) - self.assertTrue(items[2] == True) - self.assertTrue(items[3] == False) - self.assertTrue(items[4] == True) + self.assertTrue(items[0] is True) + self.assertTrue(items[1] is False) + self.assertTrue(items[2] is True) + self.assertTrue(items[3] is False) + self.assertTrue(items[4] is True) items[0] = False - self.assertTrue(items[0] == False) + self.assertTrue(items[0] is False) items[0] = True - self.assertTrue(items[0] == True) + self.assertTrue(items[0] is True) with self.assertRaises(TypeError): ob = Test.ByteArrayTest() @@ -700,7 +700,7 @@ def test_object_array(self): self.assertTrue(items[0] == 99) items[0] = None - self.assertTrue(items[0] == None) + self.assertTrue(items[0] is None) with self.assertRaises(TypeError): ob = Test.ObjectArrayTest() @@ -717,20 +717,20 @@ def test_null_array(self): self.assertTrue(len(items) == 5) - self.assertTrue(items[0] == None) - self.assertTrue(items[4] == None) + self.assertTrue(items[0] is None) + self.assertTrue(items[4] is None) items[0] = "spam" self.assertTrue(items[0] == "spam") items[0] = None - self.assertTrue(items[0] == None) + self.assertTrue(items[0] is None) items[-4] = "spam" self.assertTrue(items[-4] == "spam") items[-1] = None - self.assertTrue(items[-1] == None) + self.assertTrue(items[-1] is None) empty = ob.empty self.assertTrue(len(empty) == 0) @@ -763,7 +763,7 @@ def test_interface_array(self): self.assertTrue(items[-1].GetValue() == "0") items[0] = None - self.assertTrue(items[0] == None) + self.assertTrue(items[0] is None) with self.assertRaises(TypeError): ob = Test.InterfaceArrayTest() @@ -801,7 +801,7 @@ def test_typed_array(self): self.assertTrue(items[-1].GetValue() == "0") items[0] = None - self.assertTrue(items[0] == None) + self.assertTrue(items[0] is None) with self.assertRaises(TypeError): ob = Test.TypedArrayTest() @@ -889,7 +889,7 @@ def test_array_iteration(self): items = Test.NullArrayTest().items for i in items: - self.assertTrue(i == None) + self.assertTrue(i is None) empty = Test.NullArrayTest().empty @@ -1008,7 +1008,7 @@ def test_tuple_array_conversion_type_checking(self): result = ArrayConversionTest.EchoRange(items) self.assertTrue(result[0].__class__ == Spam) - self.assertTrue(result[1] == None) + self.assertTrue(result[1] is None) self.assertTrue(len(result) == 10) with self.assertRaises(TypeError): @@ -1037,7 +1037,7 @@ def test_list_array_conversion_type_checking(self): result = ArrayConversionTest.EchoRange(items) self.assertTrue(result[0].__class__ == Spam) - self.assertTrue(result[1] == None) + self.assertTrue(result[1] is None) self.assertTrue(len(result) == 10) with self.assertRaises(TypeError): @@ -1064,7 +1064,7 @@ def test_sequence_array_conversion_type_checking(self): result = ArrayConversionTest.EchoRange(items) self.assertTrue(result[0].__class__ == Spam) - self.assertTrue(result[1] == None) + self.assertTrue(result[1] is None) self.assertTrue(len(result) == 10) with self.assertRaises(TypeError): @@ -1143,13 +1143,13 @@ def test_special_array_creation(self): inst = InterfaceTest() value = Array[System.Boolean]([True, True]) - self.assertTrue(value[0] == True) - self.assertTrue(value[1] == True) + self.assertTrue(value[0] is True) + self.assertTrue(value[1] is True) self.assertTrue(value.Length == 2) value = Array[bool]([True, True]) - self.assertTrue(value[0] == True) - self.assertTrue(value[1] == True) + self.assertTrue(value[0] is True) + self.assertTrue(value[1] is True) self.assertTrue(value.Length == 2) value = Array[System.Byte]([0, 255]) diff --git a/src/tests/test_class.py b/src/tests/test_class.py index 80cee9009..bf3b6f143 100644 --- a/src/tests/test_class.py +++ b/src/tests/test_class.py @@ -26,7 +26,7 @@ def test_class_standard_attrs(self): self.assertTrue(ClassTest.__name__ == 'ClassTest') self.assertTrue(ClassTest.__module__ == 'Python.Test') - self.assertTrue(type(ClassTest.__dict__) == DictProxyType) + self.assertTrue(isinstance(ClassTest.__dict__, DictProxyType)) self.assertTrue(len(ClassTest.__doc__) > 0) def test_class_docstrings(self): diff --git a/src/tests/test_compat.py b/src/tests/test_compat.py index c26bb9e5d..cea51ca49 100644 --- a/src/tests/test_compat.py +++ b/src/tests/test_compat.py @@ -20,17 +20,17 @@ def test_simple_import(self): self.assertTrue(CLR.__name__ == 'clr') import sys - self.assertTrue(type(sys) == types.ModuleType) + self.assertTrue(isinstance(sys, types.ModuleType)) self.assertTrue(sys.__name__ == 'sys') if PY3: import http.client - self.assertTrue(type(http.client) == types.ModuleType) + self.assertTrue(isinstance(http.client, types.ModuleType)) self.assertTrue(http.client.__name__ == 'http.client') elif PY2: import httplib - self.assertTrue(type(httplib) == types.ModuleType) + self.assertTrue(isinstance(httplib, types.ModuleType)) self.assertTrue(httplib.__name__ == 'httplib') def test_simple_import_with_alias(self): @@ -40,17 +40,17 @@ def test_simple_import_with_alias(self): self.assertTrue(myCLR.__name__ == 'clr') import sys as mySys - self.assertTrue(type(mySys) == types.ModuleType) + self.assertTrue(isinstance(mySys, types.ModuleType)) self.assertTrue(mySys.__name__ == 'sys') if PY3: import http.client as myHttplib - self.assertTrue(type(myHttplib) == types.ModuleType) + self.assertTrue(isinstance(myHttplib, types.ModuleType)) self.assertTrue(myHttplib.__name__ == 'http.client') elif PY2: import httplib as myHttplib - self.assertTrue(type(myHttplib) == types.ModuleType) + self.assertTrue(isinstance(myHttplib, types.ModuleType)) self.assertTrue(myHttplib.__name__ == 'httplib') def test_dotted_name_import(self): @@ -66,7 +66,7 @@ def test_dotted_name_import(self): self.assertTrue(System is CLR.System) import xml.dom - self.assertTrue(type(xml.dom) == types.ModuleType) + self.assertTrue(isinstance(xml.dom, types.ModuleType)) self.assertTrue(xml.dom.__name__ == 'xml.dom') def test_dotted_name_import_with_alias(self): @@ -82,7 +82,7 @@ def test_dotted_name_import_with_alias(self): self.assertTrue(mySystem is myCLRSystem) import xml.dom as myDom - self.assertTrue(type(myDom) == types.ModuleType) + self.assertTrue(isinstance(myDom, types.ModuleType)) self.assertTrue(myDom.__name__ == 'xml.dom') def test_simple_import_from(self): @@ -92,7 +92,7 @@ def test_simple_import_from(self): self.assertTrue(System.__name__ == 'System') from xml import dom - self.assertTrue(type(dom) == types.ModuleType) + self.assertTrue(isinstance(dom, types.ModuleType)) self.assertTrue(dom.__name__ == 'xml.dom') def test_simple_import_from_with_alias(self): @@ -102,7 +102,7 @@ def test_simple_import_from_with_alias(self): self.assertTrue(mySystem.__name__ == 'System') from xml import dom as myDom - self.assertTrue(type(myDom) == types.ModuleType) + self.assertTrue(isinstance(myDom, types.ModuleType)) self.assertTrue(myDom.__name__ == 'xml.dom') def test_dotted_name_import_from(self): @@ -116,11 +116,11 @@ def test_dotted_name_import_from(self): self.assertTrue(XmlDocument.__name__ == 'XmlDocument') from xml.dom import pulldom - self.assertTrue(type(pulldom) == types.ModuleType) + self.assertTrue(isinstance(pulldom, types.ModuleType)) self.assertTrue(pulldom.__name__ == 'xml.dom.pulldom') from xml.dom.pulldom import PullDOM - self.assertTrue(type(PullDOM) == ClassType) + self.assertTrue(isinstance(PullDOM, ClassType)) self.assertTrue(PullDOM.__name__ == 'PullDOM') def test_dotted_name_import_from_with_alias(self): @@ -134,11 +134,11 @@ def test_dotted_name_import_from_with_alias(self): self.assertTrue(myXmlDocument.__name__ == 'XmlDocument') from xml.dom import pulldom as myPulldom - self.assertTrue(type(myPulldom) == types.ModuleType) + self.assertTrue(isinstance(myPulldom, types.ModuleType)) self.assertTrue(myPulldom.__name__ == 'xml.dom.pulldom') from xml.dom.pulldom import PullDOM as myPullDOM - self.assertTrue(type(myPullDOM) == ClassType) + self.assertTrue(isinstance(myPullDOM, ClassType)) self.assertTrue(myPullDOM.__name__ == 'PullDOM') def test_from_module_import_star(self): @@ -163,13 +163,13 @@ def test_explicit_assembly_load(self): import sys assembly = Assembly.LoadWithPartialName('System.Data') - self.assertTrue(assembly != None) + self.assertTrue(assembly is not None) import CLR.System.Data self.assertTrue('System.Data' in sys.modules) assembly = Assembly.LoadWithPartialName('SpamSpamSpamSpamEggsAndSpam') - self.assertTrue(assembly == None) + self.assertTrue(assembly is None) def test_implicit_load_already_valid_namespace(self): """Test implicit assembly load over an already valid namespace.""" diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index 8400292d5..0d0cd4008 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -14,52 +14,52 @@ class ConversionTests(unittest.TestCase): def test_bool_conversion(self): """Test bool conversion.""" ob = ConversionTest() - self.assertTrue(ob.BooleanField == False) + self.assertTrue(ob.BooleanField is False) self.assertTrue(ob.BooleanField is False) self.assertTrue(ob.BooleanField == 0) ob.BooleanField = True - self.assertTrue(ob.BooleanField == True) + self.assertTrue(ob.BooleanField is True) self.assertTrue(ob.BooleanField is True) self.assertTrue(ob.BooleanField == 1) ob.BooleanField = False - self.assertTrue(ob.BooleanField == False) + self.assertTrue(ob.BooleanField is False) self.assertTrue(ob.BooleanField is False) self.assertTrue(ob.BooleanField == 0) ob.BooleanField = 1 - self.assertTrue(ob.BooleanField == True) + self.assertTrue(ob.BooleanField is True) self.assertTrue(ob.BooleanField is True) self.assertTrue(ob.BooleanField == 1) ob.BooleanField = 0 - self.assertTrue(ob.BooleanField == False) + self.assertTrue(ob.BooleanField is False) self.assertTrue(ob.BooleanField is False) self.assertTrue(ob.BooleanField == 0) ob.BooleanField = System.Boolean(None) - self.assertTrue(ob.BooleanField == False) + self.assertTrue(ob.BooleanField is False) self.assertTrue(ob.BooleanField is False) self.assertTrue(ob.BooleanField == 0) ob.BooleanField = System.Boolean('') - self.assertTrue(ob.BooleanField == False) + self.assertTrue(ob.BooleanField is False) self.assertTrue(ob.BooleanField is False) self.assertTrue(ob.BooleanField == 0) ob.BooleanField = System.Boolean(0) - self.assertTrue(ob.BooleanField == False) + self.assertTrue(ob.BooleanField is False) self.assertTrue(ob.BooleanField is False) self.assertTrue(ob.BooleanField == 0) ob.BooleanField = System.Boolean(1) - self.assertTrue(ob.BooleanField == True) + self.assertTrue(ob.BooleanField is True) self.assertTrue(ob.BooleanField is True) self.assertTrue(ob.BooleanField == 1) ob.BooleanField = System.Boolean('a') - self.assertTrue(ob.BooleanField == True) + self.assertTrue(ob.BooleanField is True) self.assertTrue(ob.BooleanField is True) self.assertTrue(ob.BooleanField == 1) @@ -531,7 +531,7 @@ def test_string_conversion(self): self.assertTrue(ob.StringField == u'\uffff\uffff') ob.StringField = None - self.assertTrue(ob.StringField == None) + self.assertTrue(ob.StringField is None) with self.assertRaises(TypeError): ConversionTest().StringField = 1 @@ -552,7 +552,7 @@ def test_interface_conversion(self): # need to test spam subclass here. ob.SpamField = None - self.assertTrue(ob.SpamField == None) + self.assertTrue(ob.SpamField is None) with self.assertRaises(TypeError): ob = ConversionTest() @@ -567,14 +567,14 @@ def test_object_conversion(self): from Python.Test import Spam ob = ConversionTest() - self.assertTrue(ob.ObjectField == None) + self.assertTrue(ob.ObjectField is None) ob.ObjectField = Spam("eggs") self.assertTrue(ob.ObjectField.__class__.__name__ == "Spam") self.assertTrue(ob.ObjectField.GetValue() == "eggs") ob.ObjectField = None - self.assertTrue(ob.ObjectField == None) + self.assertTrue(ob.ObjectField is None) ob.ObjectField = System.String("spam") self.assertTrue(ob.ObjectField == "spam") @@ -627,13 +627,13 @@ def test_null_conversion(self): ob = ConversionTest() ob.StringField = None - self.assertTrue(ob.StringField == None) + self.assertTrue(ob.StringField is None) ob.ObjectField = None - self.assertTrue(ob.ObjectField == None) + self.assertTrue(ob.ObjectField is None) ob.SpamField = None - self.assertTrue(ob.SpamField == None) + self.assertTrue(ob.SpamField is None) # Primitive types and enums should not be set to null. @@ -647,7 +647,7 @@ def test_byte_array_conversion(self): """Test byte array conversion.""" ob = ConversionTest() - self.assertTrue(ob.ByteArrayField == None) + self.assertTrue(ob.ByteArrayField is None) ob.ByteArrayField = [0, 1, 2, 3, 4] array = ob.ByteArrayField @@ -665,7 +665,7 @@ def test_sbyte_array_conversion(self): """Test sbyte array conversion.""" ob = ConversionTest() - self.assertTrue(ob.SByteArrayField == None) + self.assertTrue(ob.SByteArrayField is None) ob.SByteArrayField = [0, 1, 2, 3, 4] array = ob.SByteArrayField diff --git a/src/tests/test_delegate.py b/src/tests/test_delegate.py index 1d0c30533..4963a09b8 100644 --- a/src/tests/test_delegate.py +++ b/src/tests/test_delegate.py @@ -20,8 +20,8 @@ def test_delegate_standard_attrs(self): self.assertTrue(PublicDelegate.__name__ == 'PublicDelegate') self.assertTrue(PublicDelegate.__module__ == 'Python.Test') - self.assertTrue(type(PublicDelegate.__dict__) == DictProxyType) - self.assertTrue(PublicDelegate.__doc__ == None) + self.assertTrue(isinstance(PublicDelegate.__dict__, DictProxyType)) + self.assertTrue(PublicDelegate.__doc__ is None) def test_global_delegate_visibility(self): """Test visibility of module-level delegates.""" diff --git a/src/tests/test_enum.py b/src/tests/test_enum.py index c24f5aabd..e7147e69c 100644 --- a/src/tests/test_enum.py +++ b/src/tests/test_enum.py @@ -16,8 +16,8 @@ def test_enum_standard_attrs(self): self.assertTrue(DayOfWeek.__name__ == 'DayOfWeek') self.assertTrue(DayOfWeek.__module__ == 'System') - self.assertTrue(type(DayOfWeek.__dict__) == DictProxyType) - self.assertTrue(DayOfWeek.__doc__ == None) + self.assertTrue(isinstance(DayOfWeek.__dict__, DictProxyType)) + self.assertTrue(DayOfWeek.__doc__ is None) def test_enum_get_member(self): """Test access to enum members.""" diff --git a/src/tests/test_event.py b/src/tests/test_event.py index de337c00b..237d60777 100644 --- a/src/tests/test_event.py +++ b/src/tests/test_event.py @@ -18,7 +18,7 @@ def test_public_instance_event(self): ob = EventTest() handler = GenericHandler() - self.assertTrue(handler.value == None) + self.assertTrue(handler.value is None) ob.PublicEvent += handler.handler @@ -30,7 +30,7 @@ def test_public_instance_event(self): def test_public_static_event(self): """Test public static events.""" handler = GenericHandler() - self.assertTrue(handler.value == None) + self.assertTrue(handler.value is None) EventTest.PublicStaticEvent += handler.handler @@ -42,7 +42,7 @@ def test_protected_instance_event(self): ob = EventTest() handler = GenericHandler() - self.assertTrue(handler.value == None) + self.assertTrue(handler.value is None) ob.ProtectedEvent += handler.handler @@ -54,7 +54,7 @@ def test_protected_instance_event(self): def test_protected_static_event(self): """Test protected static events.""" handler = GenericHandler() - self.assertTrue(handler.value == None) + self.assertTrue(handler.value is None) EventTest.ProtectedStaticEvent += handler.handler @@ -121,7 +121,7 @@ def test_instance_method_handler(self): handler = GenericHandler() ob.PublicEvent += handler.handler - self.assertTrue(handler.value == None) + self.assertTrue(handler.value is None) ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 10) @@ -138,7 +138,7 @@ def test_var_args_instance_method_handler(self): handler = VariableArgsHandler() ob.PublicEvent += handler.handler - self.assertTrue(handler.value == None) + self.assertTrue(handler.value is None) ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 10) @@ -155,7 +155,7 @@ def test_callableob_handler(self): handler = CallableHandler() ob.PublicEvent += handler - self.assertTrue(handler.value == None) + self.assertTrue(handler.value is None) ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 10) @@ -172,7 +172,7 @@ def test_var_args_callable_handler(self): handler = VarCallableHandler() ob.PublicEvent += handler - self.assertTrue(handler.value == None) + self.assertTrue(handler.value is None) ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 10) @@ -190,7 +190,7 @@ def test_static_method_handler(self): StaticMethodHandler.value = None ob.PublicEvent += handler.handler - self.assertTrue(handler.value == None) + self.assertTrue(handler.value is None) ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 10) @@ -208,7 +208,7 @@ def test_class_method_handler(self): ClassMethodHandler.value = None ob.PublicEvent += handler.handler - self.assertTrue(handler.value == None) + self.assertTrue(handler.value is None) ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 10) @@ -271,7 +271,7 @@ def handler(sender, args, dict_=dict_): dict_['value'] = args.value ob.PublicEvent += handler - self.assertTrue(dict_['value'] == None) + self.assertTrue(dict_['value'] is None) ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(dict_['value'] == 10) @@ -515,7 +515,7 @@ def test_explicit_cls_event_registration(self): delegate = TestEventHandler(handler.handler) ob.add_PublicEvent(delegate) - self.assertTrue(handler.value == None) + self.assertTrue(handler.value is None) ob.OnPublicEvent(TestEventArgs(10)) self.assertTrue(handler.value == 10) diff --git a/src/tests/test_field.py b/src/tests/test_field.py index 6300309ce..b1d596fea 100644 --- a/src/tests/test_field.py +++ b/src/tests/test_field.py @@ -182,19 +182,19 @@ def test_boolean_field(self): """Test boolean fields.""" # change this to true / false later for Python 2.3? ob = FieldTest() - self.assertTrue(ob.BooleanField == False) + self.assertTrue(ob.BooleanField is False) ob.BooleanField = True - self.assertTrue(ob.BooleanField == True) + self.assertTrue(ob.BooleanField is True) ob.BooleanField = False - self.assertTrue(ob.BooleanField == False) + self.assertTrue(ob.BooleanField is False) ob.BooleanField = 1 - self.assertTrue(ob.BooleanField == True) + self.assertTrue(ob.BooleanField is True) ob.BooleanField = 0 - self.assertTrue(ob.BooleanField == False) + self.assertTrue(ob.BooleanField is False) def test_sbyte_field(self): """Test sbyte fields.""" @@ -322,7 +322,7 @@ def test_interface_field(self): def test_object_field(self): """Test ob fields.""" ob = FieldTest() - self.assertTrue(ob.ObjectField == None) + self.assertTrue(ob.ObjectField is None) ob.ObjectField = System.String("spam") self.assertTrue(ob.ObjectField == "spam") @@ -331,7 +331,7 @@ def test_object_field(self): self.assertTrue(ob.ObjectField == 1) ob.ObjectField = None - self.assertTrue(ob.ObjectField == None) + self.assertTrue(ob.ObjectField is None) def test_enum_field(self): """Test enum fields.""" @@ -348,13 +348,13 @@ def test_nullable_field(self): ob = FieldTest() ob.StringField = None - self.assertTrue(ob.StringField == None) + self.assertTrue(ob.StringField is None) ob.ObjectField = None - self.assertTrue(ob.ObjectField == None) + self.assertTrue(ob.ObjectField is None) ob.SpamField = None - self.assertTrue(ob.SpamField == None) + self.assertTrue(ob.SpamField is None) # Primitive types and enums should not be set to null. diff --git a/src/tests/test_generic.py b/src/tests/test_generic.py index fb5e0e5ea..8d5ea4c4c 100644 --- a/src/tests/test_generic.py +++ b/src/tests/test_generic.py @@ -159,12 +159,12 @@ def test_python_type_aliasing(self): dict_ = Dictionary[bool, bool]() self.assertEquals(dict_.Count, 0) dict_.Add(True, False) - self.assertTrue(dict_[True] == False) + self.assertTrue(dict_[True] is False) dict_ = Dictionary[System.Boolean, System.Boolean]() self.assertEquals(dict_.Count, 0) dict_.Add(True, False) - self.assertTrue(dict_[True] == False) + self.assertTrue(dict_[True] is False) def test_generic_reference_type(self): """Test usage of generic reference type definitions.""" @@ -398,11 +398,11 @@ def test_generic_method_overload_selection(self): # public static Q Overloaded(Q arg) value = type.Overloaded[bool](True) - self.assertTrue(value == True) + self.assertTrue(value is True) # public Q Overloaded(Q arg) value = inst.Overloaded[bool](True) - self.assertTrue(value == True) + self.assertTrue(value is True) # public static U Overloaded(Q arg1, U arg2) value = type.Overloaded[bool, str](True, "true") @@ -414,11 +414,11 @@ def test_generic_method_overload_selection(self): # public static U Overloaded(Q arg1, U arg2) value = type.Overloaded[str, bool]("true", True) - self.assertTrue(value == True) + self.assertTrue(value is True) # public U Overloaded(Q arg1, U arg2) value = inst.Overloaded[str, bool]("true", True) - self.assertTrue(value == True) + self.assertTrue(value is True) # public static string Overloaded(int arg1, int arg2, string arg3) value = type.Overloaded[str](123, 456, "success") @@ -444,12 +444,12 @@ def test_method_overload_selection_with_generic_types(self): vtype = GenericWrapper[System.Boolean] input_ = vtype(True) value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == True) + self.assertTrue(value.value is True) vtype = GenericWrapper[bool] input_ = vtype(True) value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == True) + self.assertTrue(value.value is True) vtype = GenericWrapper[System.Byte] input_ = vtype(255) @@ -580,14 +580,14 @@ def test_overload_selection_with_arrays_of_generic_types(self): vtype = System.Array[gtype] input_ = vtype([gtype(True), gtype(True)]) value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == True) + self.assertTrue(value[0].value is True) self.assertTrue(value.Length == 2) gtype = GenericWrapper[bool] vtype = System.Array[gtype] input_ = vtype([gtype(True), gtype(True)]) value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == True) + self.assertTrue(value[0].value is True) self.assertTrue(value.Length == 2) gtype = GenericWrapper[System.Byte] diff --git a/src/tests/test_indexer.py b/src/tests/test_indexer.py index 62581aed4..422f7282e 100644 --- a/src/tests/test_indexer.py +++ b/src/tests/test_indexer.py @@ -20,7 +20,7 @@ def test_public_indexer(self): ob[1] = "one" self.assertTrue(ob[1] == "one") - self.assertTrue(ob[10] == None) + self.assertTrue(ob[10] is None) def test_protected_indexer(self): """Test protected indexers.""" @@ -32,7 +32,7 @@ def test_protected_indexer(self): ob[1] = "one" self.assertTrue(ob[1] == "one") - self.assertTrue(ob[10] == None) + self.assertTrue(ob[10] is None) def test_internal_indexer(self): """Test internal indexers.""" @@ -64,8 +64,8 @@ def test_boolean_indexer(self): """Test boolean indexers.""" ob = Test.BooleanIndexerTest() - self.assertTrue(ob[True] == None) - self.assertTrue(ob[1] == None) + self.assertTrue(ob[True] is None) + self.assertTrue(ob[1] is None) ob[0] = "false" self.assertTrue(ob[0] == "false") @@ -85,7 +85,7 @@ def test_byte_indexer(self): max_ = 255 min_ = 0 - self.assertTrue(ob[max_] == None) + self.assertTrue(ob[max_] is None) ob[max_] = str(max_) self.assertTrue(ob[max_] == str(max_)) @@ -107,7 +107,7 @@ def test_sbyte_indexer(self): max_ = 127 min_ = -128 - self.assertTrue(ob[max_] == None) + self.assertTrue(ob[max_] is None) ob[max_] = str(max_) self.assertTrue(ob[max_] == str(max_)) @@ -129,7 +129,7 @@ def test_char_indexer(self): max_ = unichr(65535) min_ = unichr(0) - self.assertTrue(ob[max_] == None) + self.assertTrue(ob[max_] is None) ob[max_] = "max_" self.assertTrue(ob[max_] == "max_") @@ -151,7 +151,7 @@ def test_int16_indexer(self): max_ = 32767 min_ = -32768 - self.assertTrue(ob[max_] == None) + self.assertTrue(ob[max_] is None) ob[max_] = str(max_) self.assertTrue(ob[max_] == str(max_)) @@ -173,7 +173,7 @@ def test_int32_indexer(self): max_ = 2147483647 min_ = -2147483648 - self.assertTrue(ob[max_] == None) + self.assertTrue(ob[max_] is None) ob[max_] = str(max_) self.assertTrue(ob[max_] == str(max_)) @@ -195,7 +195,7 @@ def test_int64_indexer(self): max_ = long(9223372036854775807) min_ = long(-9223372036854775808) - self.assertTrue(ob[max_] == None) + self.assertTrue(ob[max_] is None) ob[max_] = str(max_) self.assertTrue(ob[max_] == str(max_)) @@ -217,7 +217,7 @@ def test_uint16_indexer(self): max_ = 65535 min_ = 0 - self.assertTrue(ob[max_] == None) + self.assertTrue(ob[max_] is None) ob[max_] = str(max_) self.assertTrue(ob[max_] == str(max_)) @@ -239,7 +239,7 @@ def test_uint32_indexer(self): max_ = long(4294967295) min_ = 0 - self.assertTrue(ob[max_] == None) + self.assertTrue(ob[max_] is None) ob[max_] = str(max_) self.assertTrue(ob[max_] == str(max_)) @@ -261,7 +261,7 @@ def test_uint64_indexer(self): max_ = long(18446744073709551615) min_ = 0 - self.assertTrue(ob[max_] == None) + self.assertTrue(ob[max_] is None) ob[max_] = str(max_) self.assertTrue(ob[max_] == str(max_)) @@ -283,7 +283,7 @@ def test_single_indexer(self): max_ = 3.402823e38 min_ = -3.402823e38 - self.assertTrue(ob[max_] == None) + self.assertTrue(ob[max_] is None) ob[max_] = "max_" self.assertTrue(ob[max_] == "max_") @@ -305,7 +305,7 @@ def test_double_indexer(self): max_ = 1.7976931348623157e308 min_ = -1.7976931348623157e308 - self.assertTrue(ob[max_] == None) + self.assertTrue(ob[max_] is None) ob[max_] = "max_" self.assertTrue(ob[max_] == "max_") @@ -329,7 +329,7 @@ def test_decimal_indexer(self): max_d = Decimal.Parse("79228162514264337593543950335") min_d = Decimal.Parse("-79228162514264337593543950335") - self.assertTrue(ob[max_d] == None) + self.assertTrue(ob[max_d] is None) ob[max_d] = "max_" self.assertTrue(ob[max_d] == "max_") @@ -349,8 +349,8 @@ def test_string_indexer(self): """Test String indexers.""" ob = Test.StringIndexerTest() - self.assertTrue(ob["spam"] == None) - self.assertTrue(ob[u"spam"] == None) + self.assertTrue(ob["spam"] is None) + self.assertTrue(ob[u"spam"] is None) ob["spam"] = "spam" self.assertTrue(ob["spam"] == "spam") @@ -378,7 +378,7 @@ def test_enum_indexer(self): key = Test.ShortEnum.One - self.assertTrue(ob[key] == None) + self.assertTrue(ob[key] is None) ob[key] = "spam" self.assertTrue(ob[key] == "spam") @@ -404,10 +404,10 @@ def test_object_indexer(self): from Python.Test import Spam spam = Spam("spam") - self.assertTrue(ob[spam] == None) - self.assertTrue(ob["spam"] == None) - self.assertTrue(ob[1] == None) - self.assertTrue(ob[None] == None) + self.assertTrue(ob[spam] is None) + self.assertTrue(ob["spam"] is None) + self.assertTrue(ob[1] is None) + self.assertTrue(ob[None] is None) ob[spam] = "spam" self.assertTrue(ob[spam] == "spam") @@ -436,7 +436,7 @@ def test_interface_indexer(self): from Python.Test import Spam spam = Spam("spam") - self.assertTrue(ob[spam] == None) + self.assertTrue(ob[spam] is None) ob[spam] = "spam" self.assertTrue(ob[spam] == "spam") @@ -459,7 +459,7 @@ def test_typed_indexer(self): from Python.Test import Spam spam = Spam("spam") - self.assertTrue(ob[spam] == None) + self.assertTrue(ob[spam] is None) ob[spam] = "spam" self.assertTrue(ob[spam] == "spam") @@ -485,7 +485,7 @@ def test_multi_arg_indexer(self): ob[1, 9] = "one nine" self.assertTrue(ob[1, 9] == "one nine") - self.assertTrue(ob[10, 50] == None) + self.assertTrue(ob[10, 50] is None) with self.assertRaises(TypeError): ob = Test.MultiArgIndexerTest() @@ -553,7 +553,7 @@ def test_unbound_indexer(self): Test.PublicIndexerTest.__setitem__(ob, 1, "one") self.assertTrue(ob[1] == "one") - self.assertTrue(ob[10] == None) + self.assertTrue(ob[10] is None) def test_indexer_abuse(self): """Test indexer abuse.""" diff --git a/src/tests/test_interface.py b/src/tests/test_interface.py index d83a7a9f1..1fac36eb8 100644 --- a/src/tests/test_interface.py +++ b/src/tests/test_interface.py @@ -16,7 +16,7 @@ def test_interface_standard_attrs(self): self.assertTrue(IPublicInterface.__name__ == 'IPublicInterface') self.assertTrue(IPublicInterface.__module__ == 'Python.Test') - self.assertTrue(type(IPublicInterface.__dict__) == DictProxyType) + self.assertTrue(isinstance(IPublicInterface.__dict__, DictProxyType)) def test_global_interface_visibility(self): """Test visibility of module-level interfaces.""" diff --git a/src/tests/test_method.py b/src/tests/test_method.py index 07b73a1e7..6c4454004 100644 --- a/src/tests/test_method.py +++ b/src/tests/test_method.py @@ -189,7 +189,7 @@ def test_null_array_conversion(self): """Test null array conversion in method call.""" ob = MethodTest() r = ob.TestNullArrayConversion(None) - self.assertTrue(r == None) + self.assertTrue(r is None) def test_string_params_args(self): """Test use of string params.""" @@ -243,37 +243,37 @@ def test_non_params_array_in_last_place(self): def test_string_out_params(self): """Test use of string out-parameters.""" result = MethodTest.TestStringOutParams("hi", "there") - self.assertTrue(type(result) == type(())) + self.assertTrue(isinstance(result, tuple)) self.assertEqual(len(result), 2) - self.assertTrue(result[0] == True) + self.assertTrue(result[0] is True) self.assertTrue(result[1] == "output string") result = MethodTest.TestStringOutParams("hi", None) - self.assertTrue(type(result) == type(())) + self.assertTrue(isinstance(result, tuple)) self.assertEqual(len(result), 2) - self.assertTrue(result[0] == True) + self.assertTrue(result[0] is True) self.assertTrue(result[1] == "output string") def test_string_ref_params(self): """Test use of string byref parameters.""" result = MethodTest.TestStringRefParams("hi", "there") - self.assertTrue(type(result) == type(())) + self.assertTrue(isinstance(result, tuple)) self.assertEqual(len(result), 2) - self.assertTrue(result[0] == True) + self.assertTrue(result[0] is True) self.assertTrue(result[1] == "output string") result = MethodTest.TestStringRefParams("hi", None) - self.assertTrue(type(result) == type(())) + self.assertTrue(isinstance(result, tuple)) self.assertEqual(len(result), 2) - self.assertTrue(result[0] == True) + self.assertTrue(result[0] is True) self.assertTrue(result[1] == "output string") def test_value_out_params(self): """Test use of value type out-parameters.""" result = MethodTest.TestValueOutParams("hi", 1) - self.assertTrue(type(result) == type(())) + self.assertTrue(isinstance(result, tuple)) self.assertEqual(len(result), 2) - self.assertTrue(result[0] == True) + self.assertTrue(result[0] is True) self.assertTrue(result[1] == 42) # None cannot be converted to a value type like int, long, etc. @@ -283,9 +283,9 @@ def test_value_out_params(self): def test_value_ref_params(self): """Test use of value type byref parameters.""" result = MethodTest.TestValueRefParams("hi", 1) - self.assertTrue(type(result) == type(())) + self.assertTrue(isinstance(result, tuple)) self.assertEqual(len(result), 2) - self.assertTrue(result[0] == True) + self.assertTrue(result[0] is True) self.assertTrue(result[1] == 42) # None cannot be converted to a value type like int, long, etc. @@ -295,37 +295,37 @@ def test_value_ref_params(self): def test_object_out_params(self): """Test use of object out-parameters.""" result = MethodTest.TestObjectOutParams("hi", MethodTest()) - self.assertTrue(type(result) == type(())) + self.assertTrue(isinstance(result, tuple)) self.assertTrue(len(result) == 2) - self.assertTrue(result[0] == True) + self.assertTrue(result[0] is True) self.assertTrue(isinstance(result[1], System.Exception)) result = MethodTest.TestObjectOutParams("hi", None) - self.assertTrue(type(result) == type(())) + self.assertTrue(isinstance(result, tuple)) self.assertEqual(len(result), 2) - self.assertTrue(result[0] == True) + self.assertTrue(result[0] is True) self.assertTrue(isinstance(result[1], System.Exception)) def test_object_ref_params(self): """Test use of object byref parameters.""" result = MethodTest.TestObjectRefParams("hi", MethodTest()) - self.assertTrue(type(result) == type(())) + self.assertTrue(isinstance(result, tuple)) self.assertEqual(len(result), 2) - self.assertTrue(result[0] == True) + self.assertTrue(result[0] is True) self.assertTrue(isinstance(result[1], System.Exception)) result = MethodTest.TestObjectRefParams("hi", None) - self.assertTrue(type(result) == type(())) + self.assertTrue(isinstance(result, tuple)) self.assertEqual(len(result), 2) - self.assertTrue(result[0] == True) + self.assertTrue(result[0] is True) self.assertTrue(isinstance(result[1], System.Exception)) def test_struct_out_params(self): """Test use of struct out-parameters.""" result = MethodTest.TestStructOutParams("hi", System.Guid.NewGuid()) - self.assertTrue(type(result) == type(())) + self.assertTrue(isinstance(result, tuple)) self.assertEqual(len(result), 2) - self.assertTrue(result[0] == True) + self.assertTrue(result[0] is True) self.assertTrue(isinstance(result[1], System.Guid)) # None cannot be converted to a value type like a struct @@ -335,9 +335,9 @@ def test_struct_out_params(self): def test_struct_ref_params(self): """Test use of struct byref parameters.""" result = MethodTest.TestStructRefParams("hi", System.Guid.NewGuid()) - self.assertTrue(type(result) == type(())) + self.assertTrue(isinstance(result, tuple)) self.assertTrue(len(result) == 2) - self.assertTrue(result[0] == True) + self.assertTrue(result[0] is True) self.assertTrue(isinstance(result[1], System.Guid)) # None cannot be converted to a value type like a struct @@ -388,16 +388,16 @@ def test_explicit_selection_with_out_modifier(self): refstr = System.String("").GetType().MakeByRefType() result = MethodTest.TestStringOutParams.__overloads__[str, refstr]( "hi", "there") - self.assertTrue(type(result) == type(())) + self.assertTrue(isinstance(result, tuple)) self.assertTrue(len(result) == 2) - self.assertTrue(result[0] == True) + self.assertTrue(result[0] is True) self.assertTrue(result[1] == "output string") result = MethodTest.TestStringOutParams.__overloads__[str, refstr]( "hi", None) - self.assertTrue(type(result) == type(())) + self.assertTrue(isinstance(result, tuple)) self.assertTrue(len(result) == 2) - self.assertTrue(result[0] == True) + self.assertTrue(result[0] is True) self.assertTrue(result[1] == "output string") def test_explicit_selection_with_ref_modifier(self): @@ -405,16 +405,16 @@ def test_explicit_selection_with_ref_modifier(self): refstr = System.String("").GetType().MakeByRefType() result = MethodTest.TestStringRefParams.__overloads__[str, refstr]( "hi", "there") - self.assertTrue(type(result) == type(())) + self.assertTrue(isinstance(result, tuple)) self.assertTrue(len(result) == 2) - self.assertTrue(result[0] == True) + self.assertTrue(result[0] is True) self.assertTrue(result[1] == "output string") result = MethodTest.TestStringRefParams.__overloads__[str, refstr]( "hi", None) - self.assertTrue(type(result) == type(())) + self.assertTrue(isinstance(result, tuple)) self.assertTrue(len(result) == 2) - self.assertTrue(result[0] == True) + self.assertTrue(result[0] is True) self.assertTrue(result[1] == "output string") def test_explicit_overload_selection(self): @@ -425,10 +425,10 @@ def test_explicit_overload_selection(self): inst = InterfaceTest() value = MethodTest.Overloaded.__overloads__[System.Boolean](True) - self.assertTrue(value == True) + self.assertTrue(value is True) value = MethodTest.Overloaded.__overloads__[bool](True) - self.assertTrue(value == True) + self.assertTrue(value is True) value = MethodTest.Overloaded.__overloads__[System.Byte](255) self.assertTrue(value == 255) @@ -526,14 +526,14 @@ def test_overload_selection_with_array_types(self): vtype = Array[System.Boolean] input_ = vtype([True, True]) value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == True) - self.assertTrue(value[1] == True) + self.assertTrue(value[0] is True) + self.assertTrue(value[1] is True) vtype = Array[bool] input_ = vtype([True, True]) value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == True) - self.assertTrue(value[1] == True) + self.assertTrue(value[0] is True) + self.assertTrue(value[1] is True) vtype = Array[System.Byte] input_ = vtype([0, 255]) diff --git a/src/tests/test_module.py b/src/tests/test_module.py index 45f20a911..5ee8e6fc2 100644 --- a/src/tests/test_module.py +++ b/src/tests/test_module.py @@ -71,16 +71,16 @@ def test_simple_import(self): self.assertTrue(System.__name__ == 'System') import sys - self.assertTrue(type(sys) == types.ModuleType) + self.assertTrue(isinstance(sys, types.ModuleType)) self.assertTrue(sys.__name__ == 'sys') if PY3: import http.client as httplib - self.assertTrue(type(httplib) == types.ModuleType) + self.assertTrue(isinstance(httplib, types.ModuleType)) self.assertTrue(httplib.__name__ == 'http.client') elif PY2: import httplib - self.assertTrue(type(httplib) == types.ModuleType) + self.assertTrue(isinstance(httplib, types.ModuleType)) self.assertTrue(httplib.__name__ == 'httplib') def test_simple_import_with_alias(self): @@ -90,16 +90,16 @@ def test_simple_import_with_alias(self): self.assertTrue(mySystem.__name__ == 'System') import sys as mySys - self.assertTrue(type(mySys) == types.ModuleType) + self.assertTrue(isinstance(mySys, types.ModuleType)) self.assertTrue(mySys.__name__ == 'sys') if PY3: import http.client as myHttplib - self.assertTrue(type(myHttplib) == types.ModuleType) + self.assertTrue(isinstance(myHttplib, types.ModuleType)) self.assertTrue(myHttplib.__name__ == 'http.client') elif PY2: import httplib as myHttplib - self.assertTrue(type(myHttplib) == types.ModuleType) + self.assertTrue(isinstance(myHttplib, types.ModuleType)) self.assertTrue(myHttplib.__name__ == 'httplib') def test_dotted_name_import(self): @@ -109,7 +109,7 @@ def test_dotted_name_import(self): self.assertTrue(System.Reflection.__name__ == 'System.Reflection') import xml.dom - self.assertTrue(type(xml.dom) == types.ModuleType) + self.assertTrue(isinstance(xml.dom, types.ModuleType)) self.assertTrue(xml.dom.__name__ == 'xml.dom') def test_multiple_dotted_name_import(self): @@ -128,7 +128,7 @@ def test_dotted_name_import_with_alias(self): self.assertTrue(SysRef.__name__ == 'System.Reflection') import xml.dom as myDom - self.assertTrue(type(myDom) == types.ModuleType) + self.assertTrue(isinstance(myDom, types.ModuleType)) self.assertTrue(myDom.__name__ == 'xml.dom') def test_simple_import_from(self): @@ -138,7 +138,7 @@ def test_simple_import_from(self): self.assertTrue(Reflection.__name__ == 'System.Reflection') from xml import dom - self.assertTrue(type(dom) == types.ModuleType) + self.assertTrue(isinstance(dom, types.ModuleType)) self.assertTrue(dom.__name__ == 'xml.dom') def test_simple_import_from_with_alias(self): @@ -148,7 +148,7 @@ def test_simple_import_from_with_alias(self): self.assertTrue(Coll.__name__ == 'System.Collections') from xml import dom as myDom - self.assertTrue(type(myDom) == types.ModuleType) + self.assertTrue(isinstance(myDom, types.ModuleType)) self.assertTrue(myDom.__name__ == 'xml.dom') def test_dotted_name_import_from(self): @@ -163,11 +163,11 @@ def test_dotted_name_import_from(self): self.assertTrue(StringCollection.__name__ == 'StringCollection') from xml.dom import pulldom - self.assertTrue(type(pulldom) == types.ModuleType) + self.assertTrue(isinstance(pulldom, types.ModuleType)) self.assertTrue(pulldom.__name__ == 'xml.dom.pulldom') from xml.dom.pulldom import PullDOM - self.assertTrue(type(PullDOM) == ClassType) + self.assertTrue(isinstance(PullDOM, ClassType)) self.assertTrue(PullDOM.__name__ == 'PullDOM') def test_dotted_name_import_from_with_alias(self): @@ -181,11 +181,11 @@ def test_dotted_name_import_from_with_alias(self): self.assertTrue(SC.__name__ == 'StringCollection') from xml.dom import pulldom as myPulldom - self.assertTrue(type(myPulldom) == types.ModuleType) + self.assertTrue(isinstance(myPulldom, types.ModuleType)) self.assertTrue(myPulldom.__name__ == 'xml.dom.pulldom') from xml.dom.pulldom import PullDOM as myPullDOM - self.assertTrue(type(myPullDOM) == ClassType) + self.assertTrue(isinstance(myPullDOM, ClassType)) self.assertTrue(myPullDOM.__name__ == 'PullDOM') def test_from_module_import_star(self): @@ -224,13 +224,13 @@ def test_explicit_assembly_load(self): import System, sys assembly = Assembly.LoadWithPartialName('System.Data') - self.assertTrue(assembly != None) + self.assertTrue(assembly is not None) import System.Data self.assertTrue('System.Data' in sys.modules) assembly = Assembly.LoadWithPartialName('SpamSpamSpamSpamEggsAndSpam') - self.assertTrue(assembly == None) + self.assertTrue(assembly is None) def test_implicit_load_already_valid_namespace(self): """Test implicit assembly load over an already valid namespace.""" From afb585ebe5cd2be838c75b95fc5b372a5e9a8c05 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 22 Jan 2017 03:30:27 -0700 Subject: [PATCH 044/324] Rename test fixtures Can mess with test discovery --- src/testing/eventtest.cs | 38 +++++++------- src/testing/subclasstest.cs | 8 +-- src/tests/leaktest.py | 20 ++++---- src/tests/test_event.py | 98 ++++++++++++++++++------------------- src/tests/test_subclass.py | 44 ++++++++--------- 5 files changed, 104 insertions(+), 104 deletions(-) diff --git a/src/testing/eventtest.cs b/src/testing/eventtest.cs index 544e0f259..d39557c4d 100644 --- a/src/testing/eventtest.cs +++ b/src/testing/eventtest.cs @@ -6,26 +6,26 @@ namespace Python.Test // Supports CLR event unit tests. //======================================================================== - public delegate void TestEventHandler(object sender, TestEventArgs e); + public delegate void EventHandlerTest(object sender, EventArgsTest e); public class EventTest { - public static event TestEventHandler PublicStaticEvent; + public static event EventHandlerTest PublicStaticEvent; - protected static event TestEventHandler ProtectedStaticEvent; + protected static event EventHandlerTest ProtectedStaticEvent; - internal static event TestEventHandler InternalStaticEvent; + internal static event EventHandlerTest InternalStaticEvent; - private static event TestEventHandler PrivateStaticEvent; + private static event EventHandlerTest PrivateStaticEvent; - public event TestEventHandler PublicEvent; + public event EventHandlerTest PublicEvent; - protected event TestEventHandler ProtectedEvent; + protected event EventHandlerTest ProtectedEvent; - internal event TestEventHandler InternalEvent; + internal event EventHandlerTest InternalEvent; - private event TestEventHandler PrivateEvent; + private event EventHandlerTest PrivateEvent; public static int s_value; @@ -42,7 +42,7 @@ static EventTest() } - public void OnPublicEvent(TestEventArgs e) + public void OnPublicEvent(EventArgsTest e) { if (PublicEvent != null) { @@ -51,7 +51,7 @@ public void OnPublicEvent(TestEventArgs e) } - public void OnProtectedEvent(TestEventArgs e) + public void OnProtectedEvent(EventArgsTest e) { if (ProtectedEvent != null) { @@ -60,7 +60,7 @@ public void OnProtectedEvent(TestEventArgs e) } - public static void OnPublicStaticEvent(TestEventArgs e) + public static void OnPublicStaticEvent(EventArgsTest e) { if (PublicStaticEvent != null) { @@ -69,7 +69,7 @@ public static void OnPublicStaticEvent(TestEventArgs e) } - protected static void OnProtectedStaticEvent(TestEventArgs e) + protected static void OnProtectedStaticEvent(EventArgsTest e) { if (ProtectedStaticEvent != null) { @@ -78,12 +78,12 @@ protected static void OnProtectedStaticEvent(TestEventArgs e) } - public void GenericHandler(object sender, TestEventArgs e) + public void GenericHandler(object sender, EventArgsTest e) { this.value = e.value; } - public static void StaticHandler(object sender, TestEventArgs e) + public static void StaticHandler(object sender, EventArgsTest e) { s_value = e.value; } @@ -92,7 +92,7 @@ public static void ShutUpCompiler() { // Quiet compiler warnings. EventTest e = new EventTest(); - TestEventHandler f = new TestEventHandler(e.GenericHandler); + EventHandlerTest f = new EventHandlerTest(e.GenericHandler); ProtectedStaticEvent += f; InternalStaticEvent += f; PrivateStaticEvent += f; @@ -103,13 +103,13 @@ public static void ShutUpCompiler() } - public class TestEventArgs : EventArgs + public class EventArgsTest : EventArgs { public int value; - public TestEventArgs(int v) + public EventArgsTest(int v) { this.value = v; } } -} \ No newline at end of file +} diff --git a/src/testing/subclasstest.cs b/src/testing/subclasstest.cs index 2b61be254..3229bdb94 100644 --- a/src/testing/subclasstest.cs +++ b/src/testing/subclasstest.cs @@ -14,14 +14,14 @@ public interface IInterfaceTest string bar(string s, int i); // test events on interfaces - event TestEventHandler TestEvent; + event EventHandlerTest TestEvent; void OnTestEvent(int value); } public class SubClassTest : IInterfaceTest { - public event TestEventHandler TestEvent; + public event EventHandlerTest TestEvent; public SubClassTest() { @@ -60,7 +60,7 @@ public static IList test_list(SubClassTest x) public virtual void OnTestEvent(int value) { if (null != TestEvent) - TestEvent(this, new TestEventArgs(value)); + TestEvent(this, new EventArgsTest(value)); } } @@ -75,7 +75,7 @@ public void SomeMethod() } } - public class TestFunctions + public class FunctionsTest { public static string test_foo(IInterfaceTest x) { diff --git a/src/tests/leaktest.py b/src/tests/leaktest.py index 2167060ad..646cb512e 100644 --- a/src/tests/leaktest.py +++ b/src/tests/leaktest.py @@ -138,7 +138,7 @@ def test_enumerations(self): self.end_test() def test_events(self): - from Python.Test import EventTest, TestEventArgs + from Python.Test import EventTest, EventArgsTest self.notify("Running event leak check...") @@ -151,28 +151,28 @@ def test_events(self): # Instance method event handler handler = GenericHandler() testob.PublicEvent += handler.handler - testob.PublicEvent(testob, TestEventArgs(10)) + testob.PublicEvent(testob, EventArgsTest(10)) testob.PublicEvent -= handler.handler del handler # Vararg method event handler handler = VariableArgsHandler() testob.PublicEvent += handler.handler - testob.PublicEvent(testob, TestEventArgs(10)) + testob.PublicEvent(testob, EventArgsTest(10)) testob.PublicEvent -= handler.handler del handler # Callable object event handler handler = CallableHandler() testob.PublicEvent += handler - testob.PublicEvent(testob, TestEventArgs(10)) + testob.PublicEvent(testob, EventArgsTest(10)) testob.PublicEvent -= handler del handler # Callable vararg event handler handler = VarCallableHandler() testob.PublicEvent += handler - testob.PublicEvent(testob, TestEventArgs(10)) + testob.PublicEvent(testob, EventArgsTest(10)) testob.PublicEvent -= handler del handler @@ -180,7 +180,7 @@ def test_events(self): handler = StaticMethodHandler() StaticMethodHandler.value = None testob.PublicEvent += handler.handler - testob.PublicEvent(testob, TestEventArgs(10)) + testob.PublicEvent(testob, EventArgsTest(10)) testob.PublicEvent -= handler.handler del handler @@ -188,18 +188,18 @@ def test_events(self): handler = ClassMethodHandler() ClassMethodHandler.value = None testob.PublicEvent += handler.handler - testob.PublicEvent(testob, TestEventArgs(10)) + testob.PublicEvent(testob, EventArgsTest(10)) testob.PublicEvent -= handler.handler del handler # Managed instance event handler testob.PublicEvent += testob.GenericHandler - testob.PublicEvent(testob, TestEventArgs(10)) + testob.PublicEvent(testob, EventArgsTest(10)) testob.PublicEvent -= testob.GenericHandler # Static managed event handler testob.PublicEvent += EventTest.StaticHandler - testob.PublicEvent(testob, TestEventArgs(10)) + testob.PublicEvent(testob, EventArgsTest(10)) testob.PublicEvent -= EventTest.StaticHandler # Function event handler @@ -209,7 +209,7 @@ def handler(sender, args, dict_=dict_): dict_['value'] = args.value testob.PublicEvent += handler - testob.PublicEvent(testob, TestEventArgs(10)) + testob.PublicEvent(testob, EventArgsTest(10)) testob.PublicEvent -= handler del handler diff --git a/src/tests/test_event.py b/src/tests/test_event.py index 237d60777..047af47f3 100644 --- a/src/tests/test_event.py +++ b/src/tests/test_event.py @@ -2,7 +2,7 @@ import unittest -from Python.Test import EventTest, TestEventArgs +from Python.Test import EventTest, EventArgsTest from _compat import range from utils import (CallableHandler, ClassMethodHandler, GenericHandler, @@ -22,7 +22,7 @@ def test_public_instance_event(self): ob.PublicEvent += handler.handler - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler.value == 10) ob.PublicEvent -= handler.handler @@ -34,7 +34,7 @@ def test_public_static_event(self): EventTest.PublicStaticEvent += handler.handler - EventTest.OnPublicStaticEvent(TestEventArgs(10)) + EventTest.OnPublicStaticEvent(EventArgsTest(10)) self.assertTrue(handler.value == 10) def test_protected_instance_event(self): @@ -46,7 +46,7 @@ def test_protected_instance_event(self): ob.ProtectedEvent += handler.handler - ob.OnProtectedEvent(TestEventArgs(10)) + ob.OnProtectedEvent(EventArgsTest(10)) self.assertTrue(handler.value == 10) ob.ProtectedEvent -= handler.handler @@ -58,7 +58,7 @@ def test_protected_static_event(self): EventTest.ProtectedStaticEvent += handler.handler - EventTest.OnProtectedStaticEvent(TestEventArgs(10)) + EventTest.OnProtectedStaticEvent(EventArgsTest(10)) self.assertTrue(handler.value == 10) EventTest.ProtectedStaticEvent -= handler.handler @@ -99,13 +99,13 @@ def test_multicast_event(self): ob.PublicEvent += handler2.handler ob.PublicEvent += handler3.handler - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler1.value == 10) self.assertTrue(handler2.value == 10) self.assertTrue(handler3.value == 10) - ob.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(EventArgsTest(20)) self.assertTrue(handler1.value == 20) self.assertTrue(handler2.value == 20) @@ -123,13 +123,13 @@ def test_instance_method_handler(self): ob.PublicEvent += handler.handler self.assertTrue(handler.value is None) - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler.value == 10) ob.PublicEvent -= handler.handler self.assertTrue(handler.value == 10) - ob.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(EventArgsTest(20)) self.assertTrue(handler.value == 10) def test_var_args_instance_method_handler(self): @@ -140,13 +140,13 @@ def test_var_args_instance_method_handler(self): ob.PublicEvent += handler.handler self.assertTrue(handler.value is None) - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler.value == 10) ob.PublicEvent -= handler.handler self.assertTrue(handler.value == 10) - ob.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(EventArgsTest(20)) self.assertTrue(handler.value == 10) def test_callableob_handler(self): @@ -157,13 +157,13 @@ def test_callableob_handler(self): ob.PublicEvent += handler self.assertTrue(handler.value is None) - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler.value == 10) ob.PublicEvent -= handler self.assertTrue(handler.value == 10) - ob.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(EventArgsTest(20)) self.assertTrue(handler.value == 10) def test_var_args_callable_handler(self): @@ -174,13 +174,13 @@ def test_var_args_callable_handler(self): ob.PublicEvent += handler self.assertTrue(handler.value is None) - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler.value == 10) ob.PublicEvent -= handler self.assertTrue(handler.value == 10) - ob.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(EventArgsTest(20)) self.assertTrue(handler.value == 10) def test_static_method_handler(self): @@ -192,13 +192,13 @@ def test_static_method_handler(self): ob.PublicEvent += handler.handler self.assertTrue(handler.value is None) - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler.value == 10) ob.PublicEvent -= handler.handler self.assertTrue(handler.value == 10) - ob.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(EventArgsTest(20)) self.assertTrue(handler.value == 10) def test_class_method_handler(self): @@ -210,13 +210,13 @@ def test_class_method_handler(self): ob.PublicEvent += handler.handler self.assertTrue(handler.value is None) - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler.value == 10) ob.PublicEvent -= handler.handler self.assertTrue(handler.value == 10) - ob.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(EventArgsTest(20)) self.assertTrue(handler.value == 10) def test_managed_instance_method_handler(self): @@ -226,13 +226,13 @@ def test_managed_instance_method_handler(self): ob.PublicEvent += ob.GenericHandler self.assertTrue(ob.value == 0) - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(ob.value == 10) ob.PublicEvent -= ob.GenericHandler self.assertTrue(ob.value == 10) - ob.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(EventArgsTest(20)) self.assertTrue(ob.value == 10) def test_managed_static_method_handler(self): @@ -243,13 +243,13 @@ def test_managed_static_method_handler(self): ob.PublicEvent += ob.StaticHandler self.assertTrue(EventTest.s_value == 0) - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(EventTest.s_value == 10) ob.PublicEvent -= ob.StaticHandler self.assertTrue(EventTest.s_value == 10) - ob.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(EventArgsTest(20)) self.assertTrue(EventTest.s_value == 10) def test_unbound_method_handler(self): @@ -258,7 +258,7 @@ def test_unbound_method_handler(self): ob.PublicEvent += GenericHandler.handler with self.assertRaises(TypeError): - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) ob.PublicEvent -= GenericHandler.handler @@ -273,13 +273,13 @@ def handler(sender, args, dict_=dict_): ob.PublicEvent += handler self.assertTrue(dict_['value'] is None) - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(dict_['value'] == 10) ob.PublicEvent -= handler self.assertTrue(dict_['value'] == 10) - ob.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(EventArgsTest(20)) self.assertTrue(dict_['value'] == 10) def test_add_non_callable_handler(self): @@ -311,17 +311,17 @@ def test_remove_multiple_handlers(self): h2 = handler.handler ob.PublicEvent += h2 - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler.value == 20) ob.PublicEvent -= h1 - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler.value == 30) ob.PublicEvent -= h2 - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler.value == 30) # try again, removing in a different order. @@ -335,17 +335,17 @@ def test_remove_multiple_handlers(self): h2 = handler.handler ob.PublicEvent += h2 - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler.value == 20) ob.PublicEvent -= h2 - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler.value == 30) ob.PublicEvent -= h1 - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler.value == 30) def test_remove_multiple_static_handlers(self): @@ -359,17 +359,17 @@ def test_remove_multiple_static_handlers(self): h2 = handler.handler ob.PublicStaticEvent += h2 - ob.OnPublicStaticEvent(TestEventArgs(10)) + ob.OnPublicStaticEvent(EventArgsTest(10)) self.assertTrue(handler.value == 20) ob.PublicStaticEvent -= h1 - ob.OnPublicStaticEvent(TestEventArgs(10)) + ob.OnPublicStaticEvent(EventArgsTest(10)) self.assertTrue(handler.value == 30) ob.PublicStaticEvent -= h2 - ob.OnPublicStaticEvent(TestEventArgs(10)) + ob.OnPublicStaticEvent(EventArgsTest(10)) self.assertTrue(handler.value == 30) # try again, removing in a different order. @@ -383,17 +383,17 @@ def test_remove_multiple_static_handlers(self): h2 = handler.handler ob.PublicStaticEvent += h2 - ob.OnPublicStaticEvent(TestEventArgs(10)) + ob.OnPublicStaticEvent(EventArgsTest(10)) self.assertTrue(handler.value == 20) ob.PublicStaticEvent -= h2 - ob.OnPublicStaticEvent(TestEventArgs(10)) + ob.OnPublicStaticEvent(EventArgsTest(10)) self.assertTrue(handler.value == 30) ob.PublicStaticEvent -= h1 - ob.OnPublicStaticEvent(TestEventArgs(10)) + ob.OnPublicStaticEvent(EventArgsTest(10)) self.assertTrue(handler.value == 30) def test_random_multiple_handlers(self): @@ -412,7 +412,7 @@ def test_random_multiple_handlers(self): ob.PublicEvent += method handlers.append(method) - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler.value == 300) self.assertTrue(handler2.value == 20) handler.value = 0 @@ -423,24 +423,24 @@ def test_random_multiple_handlers(self): handlers.remove(item) ob.PublicEvent -= item handler.value = 0 - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler.value == (len(handlers) * 10)) self.assertTrue(handler2.value == ((i + 1) * 20)) handler2.value = 0 - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler2.value == 20) ob.PublicEvent -= handler2.handler handler2.value = 0 - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler2.value == 10) ob.PublicEvent -= handler2.handler handler2.value = 0 - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler2.value == 0) def test_remove_internal_call_handler(self): @@ -474,7 +474,7 @@ def handler(self, one): with self.assertRaises(TypeError): ob.PublicEvent += handler.handler - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) ob.PublicEvent -= handler.handler @@ -487,7 +487,7 @@ def handler(self, one, two, three, four, five): with self.assertRaises(TypeError): ob.PublicEvent += handler.handler - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) ob.PublicEvent -= handler.handler @@ -508,22 +508,22 @@ def test_incorrect_invokation(self): def test_explicit_cls_event_registration(self): """Test explicit CLS event registration.""" - from Python.Test import TestEventHandler + from Python.Test import EventHandlerTest ob = EventTest() handler = GenericHandler() - delegate = TestEventHandler(handler.handler) + delegate = EventHandlerTest(handler.handler) ob.add_PublicEvent(delegate) self.assertTrue(handler.value is None) - ob.OnPublicEvent(TestEventArgs(10)) + ob.OnPublicEvent(EventArgsTest(10)) self.assertTrue(handler.value == 10) ob.remove_PublicEvent(delegate) self.assertTrue(handler.value == 10) - ob.OnPublicEvent(TestEventArgs(20)) + ob.OnPublicEvent(EventArgsTest(20)) self.assertTrue(handler.value == 10) def test_implicit_cls_event_registration(self): diff --git a/src/tests/test_subclass.py b/src/tests/test_subclass.py index 922e2651c..28a634a18 100644 --- a/src/tests/test_subclass.py +++ b/src/tests/test_subclass.py @@ -4,8 +4,8 @@ import unittest import System -from Python.Test import (IInterfaceTest, SubClassTest, TestEventArgs, - TestFunctions) +from Python.Test import (IInterfaceTest, SubClassTest, EventArgsTest, + FunctionsTest) from System.Collections.Generic import List from _compat import range @@ -61,7 +61,7 @@ def remove_TestEvent(self, handler): self.event_handlers.remove(handler) def OnTestEvent(self, value): - args = TestEventArgs(value) + args = EventArgsTest(value) for handler in self.event_handlers: handler(self, args) @@ -73,9 +73,9 @@ def test_base_class(self): """Test base class managed type""" ob = SubClassTest() self.assertEqual(ob.foo(), "foo") - self.assertEqual(TestFunctions.test_foo(ob), "foo") + self.assertEqual(FunctionsTest.test_foo(ob), "foo") self.assertEqual(ob.bar("bar", 2), "bar") - self.assertEqual(TestFunctions.test_bar(ob, "bar", 2), "bar") + self.assertEqual(FunctionsTest.test_bar(ob, "bar", 2), "bar") self.assertEqual(ob.not_overriden(), "not_overriden") self.assertEqual(list(ob.return_list()), ["a", "b", "c"]) self.assertEqual(list(SubClassTest.test_list(ob)), ["a", "b", "c"]) @@ -84,11 +84,11 @@ def test_interface(self): """Test python classes can derive from C# interfaces""" ob = InterfaceTestClass() self.assertEqual(ob.foo(), "InterfaceTestClass") - self.assertEqual(TestFunctions.test_foo(ob), "InterfaceTestClass") + self.assertEqual(FunctionsTest.test_foo(ob), "InterfaceTestClass") self.assertEqual(ob.bar("bar", 2), "bar/bar") - self.assertEqual(TestFunctions.test_bar(ob, "bar", 2), "bar/bar") + self.assertEqual(FunctionsTest.test_bar(ob, "bar", 2), "bar/bar") - x = TestFunctions.pass_through(ob) + x = FunctionsTest.pass_through(ob) self.assertEqual(id(x), id(ob)) def test_derived_class(self): @@ -97,35 +97,35 @@ def test_derived_class(self): self.assertEqual(ob.foo(), "DerivedClass") self.assertEqual(ob.base_foo(), "foo") self.assertEqual(ob.super_foo(), "foo") - self.assertEqual(TestFunctions.test_foo(ob), "DerivedClass") + self.assertEqual(FunctionsTest.test_foo(ob), "DerivedClass") self.assertEqual(ob.bar("bar", 2), "bar_bar") - self.assertEqual(TestFunctions.test_bar(ob, "bar", 2), "bar_bar") + self.assertEqual(FunctionsTest.test_bar(ob, "bar", 2), "bar_bar") self.assertEqual(ob.not_overriden(), "not_overriden") self.assertEqual(list(ob.return_list()), ["A", "B", "C"]) self.assertEqual(list(SubClassTest.test_list(ob)), ["A", "B", "C"]) - x = TestFunctions.pass_through(ob) + x = FunctionsTest.pass_through(ob) self.assertEqual(id(x), id(ob)) def test_create_instance(self): """Test derived instances can be created from managed code""" - ob = TestFunctions.create_instance(DerivedClass) + ob = FunctionsTest.create_instance(DerivedClass) self.assertEqual(ob.foo(), "DerivedClass") - self.assertEqual(TestFunctions.test_foo(ob), "DerivedClass") + self.assertEqual(FunctionsTest.test_foo(ob), "DerivedClass") self.assertEqual(ob.bar("bar", 2), "bar_bar") - self.assertEqual(TestFunctions.test_bar(ob, "bar", 2), "bar_bar") + self.assertEqual(FunctionsTest.test_bar(ob, "bar", 2), "bar_bar") self.assertEqual(ob.not_overriden(), "not_overriden") - x = TestFunctions.pass_through(ob) + x = FunctionsTest.pass_through(ob) self.assertEqual(id(x), id(ob)) - ob2 = TestFunctions.create_instance(InterfaceTestClass) + ob2 = FunctionsTest.create_instance(InterfaceTestClass) self.assertEqual(ob2.foo(), "InterfaceTestClass") - self.assertEqual(TestFunctions.test_foo(ob2), "InterfaceTestClass") + self.assertEqual(FunctionsTest.test_foo(ob2), "InterfaceTestClass") self.assertEqual(ob2.bar("bar", 2), "bar/bar") - self.assertEqual(TestFunctions.test_bar(ob2, "bar", 2), "bar/bar") + self.assertEqual(FunctionsTest.test_bar(ob2, "bar", 2), "bar/bar") - y = TestFunctions.pass_through(ob2) + y = FunctionsTest.pass_through(ob2) self.assertEqual(id(y), id(ob2)) def test_events(self): @@ -137,16 +137,16 @@ def handler(self, x, args): x = SubClassTest() x.TestEvent += event_handler.handler - self.assertEqual(TestFunctions.test_event(x, 1), 1) + self.assertEqual(FunctionsTest.test_event(x, 1), 1) self.assertEqual(event_handler.value, 1) i = InterfaceTestClass() with self.assertRaises(System.NotImplementedException): - TestFunctions.test_event(i, 2) + FunctionsTest.test_event(i, 2) d = DerivedEventTest() d.add_TestEvent(event_handler.handler) - self.assertEqual(TestFunctions.test_event(d, 3), 3) + self.assertEqual(FunctionsTest.test_event(d, 3), 3) self.assertEqual(event_handler.value, 3) self.assertEqual(len(d.event_handlers), 1) From 1eeab58f3004e7265adcbb38a5611b203f10460d Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 22 Jan 2017 03:38:27 -0700 Subject: [PATCH 045/324] Remove unused `using` from testing and format --- src/testing/arraytest.cs | 5 +---- src/testing/callbacktest.cs | 20 +++++++++----------- src/testing/classtest.cs | 3 +-- src/testing/constructortests.cs | 3 +-- src/testing/conversiontest.cs | 5 +---- src/testing/delegatetest.cs | 4 +--- src/testing/doctest.cs | 14 +++++++------- src/testing/enumtest.cs | 4 ++-- src/testing/exceptiontest.cs | 2 +- src/testing/fieldtest.cs | 5 +---- src/testing/generictest.cs | 5 +---- src/testing/globaltest.cs | 4 +--- src/testing/indexertest.cs | 3 +-- src/testing/interfacetest.cs | 4 +--- src/testing/methodtest.cs | 7 +++---- src/testing/moduletest.cs | 12 ++++++++---- src/testing/propertytest.cs | 4 +--- src/testing/subclasstest.cs | 3 --- src/testing/threadtest.cs | 3 +-- 19 files changed, 42 insertions(+), 68 deletions(-) diff --git a/src/testing/arraytest.cs b/src/testing/arraytest.cs index b9891cac8..591b5b1c4 100644 --- a/src/testing/arraytest.cs +++ b/src/testing/arraytest.cs @@ -1,6 +1,3 @@ -using System; -using System.Collections; - namespace Python.Test { //======================================================================== @@ -318,4 +315,4 @@ public static Spam[][] EchoRangeAA(Spam[][] items) return items; } } -} \ No newline at end of file +} diff --git a/src/testing/callbacktest.cs b/src/testing/callbacktest.cs index f95cbc602..33e240531 100644 --- a/src/testing/callbacktest.cs +++ b/src/testing/callbacktest.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using Python.Runtime; namespace Python.Test { @@ -13,17 +10,18 @@ public class CallbackTest { public string Call_simpleDefaultArg_WithNull(string moduleName) { - using (Runtime.Py.GIL()) + using (Py.GIL()) { - dynamic module = Runtime.Py.Import(moduleName); + dynamic module = Py.Import(moduleName); return module.simpleDefaultArg(null); } } + public string Call_simpleDefaultArg_WithEmptyArgs(string moduleName) { - using (Runtime.Py.GIL()) + using (Py.GIL()) { - dynamic module = Runtime.Py.Import(moduleName); + dynamic module = Py.Import(moduleName); return module.simpleDefaultArg(); } } @@ -31,14 +29,14 @@ public string Call_simpleDefaultArg_WithEmptyArgs(string moduleName) //========================================================================== // Tests calling from Python into C# and back into Python using a PyObject. - // SelfCallbackTest should be inherited by a Python class. + // SelfCallbackTest should be inherited by a Python class. // Used in test_class.py / testCallback //========================================================================== public class SelfCallbackTest { - public void Callback(Runtime.PyObject self) + public void Callback(PyObject self) { - using (Runtime.Py.GIL()) + using (Py.GIL()) ((dynamic)self).PyCallback(self); } } diff --git a/src/testing/classtest.cs b/src/testing/classtest.cs index 5f3b0d7ed..ab0cad7ad 100644 --- a/src/testing/classtest.cs +++ b/src/testing/classtest.cs @@ -1,4 +1,3 @@ -using System; using System.Collections; namespace Python.Test @@ -61,4 +60,4 @@ public ClassCtorTest2(string v) internal class InternalClass { } -} \ No newline at end of file +} diff --git a/src/testing/constructortests.cs b/src/testing/constructortests.cs index cffcee888..4d3cc5710 100644 --- a/src/testing/constructortests.cs +++ b/src/testing/constructortests.cs @@ -1,5 +1,4 @@ using System; -using System.Collections; using System.IO; namespace Python.Test @@ -50,4 +49,4 @@ public SubclassConstructorTest(Exception v) this.value = v; } } -} \ No newline at end of file +} diff --git a/src/testing/conversiontest.cs b/src/testing/conversiontest.cs index e4d4762e6..5686a1943 100644 --- a/src/testing/conversiontest.cs +++ b/src/testing/conversiontest.cs @@ -1,6 +1,3 @@ -using System; - - namespace Python.Test { //======================================================================== @@ -58,4 +55,4 @@ public string GetValue() return value; } } -} \ No newline at end of file +} diff --git a/src/testing/delegatetest.cs b/src/testing/delegatetest.cs index d13750c49..94169f650 100644 --- a/src/testing/delegatetest.cs +++ b/src/testing/delegatetest.cs @@ -1,5 +1,3 @@ -using System; - namespace Python.Test { //======================================================================== @@ -60,4 +58,4 @@ public bool CallBoolDelegate(BoolDelegate d) return d(); } } -} \ No newline at end of file +} diff --git a/src/testing/doctest.cs b/src/testing/doctest.cs index 156248029..a0f60b2e1 100644 --- a/src/testing/doctest.cs +++ b/src/testing/doctest.cs @@ -8,19 +8,19 @@ namespace Python.Test // Classes with a constructor have their docstring set to the ctor signature. // Test if a class has an explicit doc string it gets set correctly. - [DocStringAttribute("DocWithCtorTest Class")] + [DocString("DocWithCtorTest Class")] public class DocWithCtorTest { public DocWithCtorTest() { } - [DocStringAttribute("DocWithCtorTest TestMethod")] + [DocString("DocWithCtorTest TestMethod")] public void TestMethod() { } - [DocStringAttribute("DocWithCtorTest StaticTestMethod")] + [DocString("DocWithCtorTest StaticTestMethod")] public static void StaticTestMethod() { } @@ -41,17 +41,17 @@ public static void StaticTestMethod(double a, int b) } } - [DocStringAttribute("DocWithoutCtorTest Class")] + [DocString("DocWithoutCtorTest Class")] public class DocWithoutCtorTest { - [DocStringAttribute("DocWithoutCtorTest TestMethod")] + [DocString("DocWithoutCtorTest TestMethod")] public void TestMethod() { } - [DocStringAttribute("DocWithoutCtorTest StaticTestMethod")] + [DocString("DocWithoutCtorTest StaticTestMethod")] public static void StaticTestMethod() { } } -} \ No newline at end of file +} diff --git a/src/testing/enumtest.cs b/src/testing/enumtest.cs index 162771980..0d0d56190 100644 --- a/src/testing/enumtest.cs +++ b/src/testing/enumtest.cs @@ -86,7 +86,7 @@ public enum ULongEnum : ulong Five } - [FlagsAttribute] + [Flags] public enum FlagsEnum { Zero, @@ -96,4 +96,4 @@ public enum FlagsEnum Four, Five } -} \ No newline at end of file +} diff --git a/src/testing/exceptiontest.cs b/src/testing/exceptiontest.cs index 414c25d82..ae5fc86c0 100644 --- a/src/testing/exceptiontest.cs +++ b/src/testing/exceptiontest.cs @@ -99,4 +99,4 @@ public string GetExtraInfo() return extra; } } -} \ No newline at end of file +} diff --git a/src/testing/fieldtest.cs b/src/testing/fieldtest.cs index 5860bdafb..4d41cf084 100644 --- a/src/testing/fieldtest.cs +++ b/src/testing/fieldtest.cs @@ -1,6 +1,3 @@ -using System; - - namespace Python.Test { //======================================================================== @@ -54,4 +51,4 @@ public void Shutup() public object ObjectField; public ISpam SpamField; } -} \ No newline at end of file +} diff --git a/src/testing/generictest.cs b/src/testing/generictest.cs index 3019c1eb6..b38f5e8e5 100644 --- a/src/testing/generictest.cs +++ b/src/testing/generictest.cs @@ -1,6 +1,3 @@ -using System; -using System.Collections; - namespace Python.Test { //======================================================================== @@ -131,4 +128,4 @@ public static string Overloaded(int arg1, int arg2, string arg3) return arg3; } } -} \ No newline at end of file +} diff --git a/src/testing/globaltest.cs b/src/testing/globaltest.cs index 887668d96..2d6d56cda 100644 --- a/src/testing/globaltest.cs +++ b/src/testing/globaltest.cs @@ -1,9 +1,7 @@ -using System; - //======================================================================== // Supports units tests for access to types without a namespace. //======================================================================== public class NoNamespaceType { -} \ No newline at end of file +} diff --git a/src/testing/indexertest.cs b/src/testing/indexertest.cs index eb0381777..f1dcbda0b 100644 --- a/src/testing/indexertest.cs +++ b/src/testing/indexertest.cs @@ -1,4 +1,3 @@ -using System; using System.Collections; namespace Python.Test @@ -415,4 +414,4 @@ public MultiDefaultKeyIndexerTest() : base() } } } -} \ No newline at end of file +} diff --git a/src/testing/interfacetest.cs b/src/testing/interfacetest.cs index b35ca81a8..4c4056d68 100644 --- a/src/testing/interfacetest.cs +++ b/src/testing/interfacetest.cs @@ -1,5 +1,3 @@ -using System; - namespace Python.Test { //======================================================================== @@ -62,4 +60,4 @@ private interface IPrivate { } } -} \ No newline at end of file +} diff --git a/src/testing/methodtest.cs b/src/testing/methodtest.cs index 675b1577c..65e39cf69 100644 --- a/src/testing/methodtest.cs +++ b/src/testing/methodtest.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using System.Collections.Generic; namespace Python.Test { @@ -156,13 +155,13 @@ public static bool TestValueRefParams(string s, ref int i1) public static bool TestObjectOutParams(object o, out object o1) { - o1 = new System.Exception("test"); + o1 = new Exception("test"); return true; } public static bool TestObjectRefParams(object o, ref object o1) { - o1 = new System.Exception("test"); + o1 = new Exception("test"); return true; } @@ -630,4 +629,4 @@ public string PublicMethod(string echo) return echo; } } -} \ No newline at end of file +} diff --git a/src/testing/moduletest.cs b/src/testing/moduletest.cs index ca75a1313..2d5734a11 100644 --- a/src/testing/moduletest.cs +++ b/src/testing/moduletest.cs @@ -1,16 +1,20 @@ using System; using System.Threading; -namespace Python.Test { - public class ModuleTest { +namespace Python.Test +{ + public class ModuleTest + { private static Thread _thread; public static void RunThreads() { - _thread = new Thread(() => { + _thread = new Thread(() => + { var appdomain = AppDomain.CurrentDomain; var assemblies = appdomain.GetAssemblies(); - foreach (var assembly in assemblies) { + foreach (var assembly in assemblies) + { assembly.GetTypes(); } }); diff --git a/src/testing/propertytest.cs b/src/testing/propertytest.cs index f01c02e0b..b70e9487a 100644 --- a/src/testing/propertytest.cs +++ b/src/testing/propertytest.cs @@ -1,5 +1,3 @@ -using System; - namespace Python.Test { //======================================================================== @@ -84,4 +82,4 @@ public ShortEnum EnumProperty set { _enum_property = value; } } } -} \ No newline at end of file +} diff --git a/src/testing/subclasstest.cs b/src/testing/subclasstest.cs index 3229bdb94..9ee105aef 100644 --- a/src/testing/subclasstest.cs +++ b/src/testing/subclasstest.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; namespace Python.Test { @@ -70,7 +68,6 @@ public class SubClass : RecursiveInheritance { public void SomeMethod() { - } } } diff --git a/src/testing/threadtest.cs b/src/testing/threadtest.cs index 0a4f46ccc..0cb2abe57 100644 --- a/src/testing/threadtest.cs +++ b/src/testing/threadtest.cs @@ -1,5 +1,4 @@ using System; -using System.Collections; using Python.Runtime; namespace Python.Test @@ -77,4 +76,4 @@ public static string CallEchoString2(string arg) } } } -} \ No newline at end of file +} From 400f688ed5f4a039bb0729a4194fa9d397a8cad3 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 22 Jan 2017 13:14:32 -0700 Subject: [PATCH 046/324] Use unittest.skip(...) --- src/tests/runtests.py | 11 ++-- src/tests/test_engine.py | 3 +- src/tests/test_exceptions.py | 31 +++++----- src/tests/test_subclass.py | 107 ++++++++++++++++++++++------------- 4 files changed, 91 insertions(+), 61 deletions(-) diff --git a/src/tests/runtests.py b/src/tests/runtests.py index 919d4b7e5..9b77f99dd 100644 --- a/src/tests/runtests.py +++ b/src/tests/runtests.py @@ -16,13 +16,14 @@ except ImportError: print("Load clr import hook") import clr + clr.AddReference("Python.Test") clr.AddReference("System.Collections") clr.AddReference("System.Data") clr.AddReference("System.Management") test_modules = ( - # Passes on its own, but not here if + # test_module passes on its own, but not here if # other test modules that import System.Windows.Forms # run first. They must not do module level import/AddReference() # of the System.Windows.Forms namespace. @@ -47,11 +48,11 @@ 'test_thread', 'test_docstring', - # FIXME: Fails due to unhandled exception - # 'test_engine', + # FIXME: Has tests that are being skipped. + 'test_engine', - # FIXME: Fails in Linux - # 'test_subclass', + # FIXME: Has tests that are being skipped. + 'test_subclass', ) diff --git a/src/tests/test_engine.py b/src/tests/test_engine.py index a39cb4aa8..b605a3796 100644 --- a/src/tests/test_engine.py +++ b/src/tests/test_engine.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -# FIXME: This test module fails due to unhandled exceptions import sys import unittest @@ -20,12 +19,14 @@ def test_multiple_calls_to_initialize(self): except BaseException: self.fail("Initialize() raise an exception.") + @unittest.skip(reason="FIXME: test crashes") def test_import_module(self): """Test module import.""" m = PythonEngine.ImportModule("sys") n = m.GetAttr("__name__") self.assertTrue(n.AsManagedObject(System.String) == "sys") + @unittest.skip(reason="FIXME: test freezes") def test_run_string(self): """Test the RunString method.""" PythonEngine.AcquireLock() diff --git a/src/tests/test_exceptions.py b/src/tests/test_exceptions.py index 7d60e0732..2fb55589c 100644 --- a/src/tests/test_exceptions.py +++ b/src/tests/test_exceptions.py @@ -306,23 +306,22 @@ def test_pickling_exceptions(self): self.assertEqual(exc.args, loaded.args) + @unittest.skipIf(PY2, "__cause__ isn't implemented in PY2") def test_chained_exceptions(self): - # __cause__ is py3 only - if PY3: - from Python.Test import ExceptionTest - - try: - ExceptionTest.ThrowChainedExceptions() - except Exception as exc: - msgs = ("Outer exception", - "Inner exception", - "Innermost exception",) - for msg in msgs: - self.assertEqual(exc.Message, msg) - self.assertEqual(exc.__cause__, exc.InnerException) - exc = exc.__cause__ - else: - self.fail("Test should raise an exception") + from Python.Test import ExceptionTest + + with self.assertRaises(Exception) as cm: + ExceptionTest.ThrowChainedExceptions() + + exc = cm.exception + + msgs = ("Outer exception", + "Inner exception", + "Innermost exception",) + for msg in msgs: + self.assertEqual(exc.Message, msg) + self.assertEqual(exc.__cause__, exc.InnerException) + exc = exc.__cause__ def test_suite(): diff --git a/src/tests/test_subclass.py b/src/tests/test_subclass.py index 28a634a18..34ec86d9a 100644 --- a/src/tests/test_subclass.py +++ b/src/tests/test_subclass.py @@ -1,5 +1,8 @@ # -*- coding: utf-8 -*- -# FIXME: This test module fails on Linux +# FIXME: This test module randomly passes/fails even if all tests are skipped. +# Something fishy is going on with the Test fixtures. Behavior seen on CI on +# both Linux and Windows +# TODO: Remove delay of class creations. Adding SetUp/TearDown may help import unittest @@ -11,64 +14,80 @@ from _compat import range -class InterfaceTestClass(IInterfaceTest): - """class that implements the test interface""" - __namespace__ = "Python.Test" +def interface_test_class_fixture(): + """Delay creation of class until test starts.""" - def foo(self): - return "InterfaceTestClass" + class InterfaceTestClass(IInterfaceTest): + """class that implements the test interface""" + __namespace__ = "Python.Test" - def bar(self, x, i): - return "/".join([x] * i) + def foo(self): + return "InterfaceTestClass" + def bar(self, x, i): + return "/".join([x] * i) -class DerivedClass(SubClassTest): - """class that derives from a class deriving from IInterfaceTest""" - __namespace__ = "Python.Test" + return InterfaceTestClass - def foo(self): - return "DerivedClass" - def base_foo(self): - return SubClassTest.foo(self) +def derived_class_fixture(): + """Delay creation of class until test starts.""" - def super_foo(self): - return super(DerivedClass, self).foo() + class DerivedClass(SubClassTest): + """class that derives from a class deriving from IInterfaceTest""" + __namespace__ = "Python.Test" - def bar(self, x, i): - return "_".join([x] * i) + def foo(self): + return "DerivedClass" - def return_list(self): - l = List[str]() - l.Add("A") - l.Add("B") - l.Add("C") - return l + def base_foo(self): + return SubClassTest.foo(self) + def super_foo(self): + return super(DerivedClass, self).foo() -class DerivedEventTest(IInterfaceTest): - """class that implements IInterfaceTest.TestEvent""" - __namespace__ = "Python.Test" + def bar(self, x, i): + return "_".join([x] * i) - def __init__(self): - self.event_handlers = [] + def return_list(self): + l = List[str]() + l.Add("A") + l.Add("B") + l.Add("C") + return l - # event handling - def add_TestEvent(self, handler): - self.event_handlers.append(handler) + return DerivedClass - def remove_TestEvent(self, handler): - self.event_handlers.remove(handler) - def OnTestEvent(self, value): - args = EventArgsTest(value) - for handler in self.event_handlers: - handler(self, args) +def derived_event_test_class_fixture(): + """Delay creation of class until test starts.""" + + class DerivedEventTest(IInterfaceTest): + """class that implements IInterfaceTest.TestEvent""" + __namespace__ = "Python.Test" + + def __init__(self): + self.event_handlers = [] + + # event handling + def add_TestEvent(self, handler): + self.event_handlers.append(handler) + + def remove_TestEvent(self, handler): + self.event_handlers.remove(handler) + + def OnTestEvent(self, value): + args = EventArgsTest(value) + for handler in self.event_handlers: + handler(self, args) + + return DerivedEventTest class SubClassTests(unittest.TestCase): """Test sub-classing managed types""" + @unittest.skip(reason="FIXME: test randomly pass/fails") def test_base_class(self): """Test base class managed type""" ob = SubClassTest() @@ -80,8 +99,10 @@ def test_base_class(self): self.assertEqual(list(ob.return_list()), ["a", "b", "c"]) self.assertEqual(list(SubClassTest.test_list(ob)), ["a", "b", "c"]) + @unittest.skip(reason="FIXME: test randomly pass/fails") def test_interface(self): """Test python classes can derive from C# interfaces""" + InterfaceTestClass = interface_test_class_fixture() ob = InterfaceTestClass() self.assertEqual(ob.foo(), "InterfaceTestClass") self.assertEqual(FunctionsTest.test_foo(ob), "InterfaceTestClass") @@ -91,8 +112,10 @@ def test_interface(self): x = FunctionsTest.pass_through(ob) self.assertEqual(id(x), id(ob)) + @unittest.skip(reason="FIXME: test randomly pass/fails") def test_derived_class(self): """Test python class derived from managed type""" + DerivedClass = derived_class_fixture() ob = DerivedClass() self.assertEqual(ob.foo(), "DerivedClass") self.assertEqual(ob.base_foo(), "foo") @@ -107,8 +130,10 @@ def test_derived_class(self): x = FunctionsTest.pass_through(ob) self.assertEqual(id(x), id(ob)) + @unittest.skip(reason="FIXME: test randomly pass/fails") def test_create_instance(self): """Test derived instances can be created from managed code""" + DerivedClass = derived_class_fixture() ob = FunctionsTest.create_instance(DerivedClass) self.assertEqual(ob.foo(), "DerivedClass") self.assertEqual(FunctionsTest.test_foo(ob), "DerivedClass") @@ -119,6 +144,7 @@ def test_create_instance(self): x = FunctionsTest.pass_through(ob) self.assertEqual(id(x), id(ob)) + InterfaceTestClass = interface_test_class_fixture() ob2 = FunctionsTest.create_instance(InterfaceTestClass) self.assertEqual(ob2.foo(), "InterfaceTestClass") self.assertEqual(FunctionsTest.test_foo(ob2), "InterfaceTestClass") @@ -128,6 +154,7 @@ def test_create_instance(self): y = FunctionsTest.pass_through(ob2) self.assertEqual(id(y), id(ob2)) + @unittest.skip(reason="FIXME: test randomly pass/fails") def test_events(self): class EventHandler(object): def handler(self, x, args): @@ -140,10 +167,12 @@ def handler(self, x, args): self.assertEqual(FunctionsTest.test_event(x, 1), 1) self.assertEqual(event_handler.value, 1) + InterfaceTestClass = interface_test_class_fixture() i = InterfaceTestClass() with self.assertRaises(System.NotImplementedException): FunctionsTest.test_event(i, 2) + DerivedEventTest = derived_event_test_class_fixture() d = DerivedEventTest() d.add_TestEvent(event_handler.handler) self.assertEqual(FunctionsTest.test_event(d, 3), 3) From 3058bf7919122659fc118b07888bcada9c9221a6 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 31 Jan 2017 14:38:16 -0700 Subject: [PATCH 047/324] Cleanup testing format --- src/embed_tests/pyimport.cs | 23 ++++++++++------------- src/embed_tests/pyiter.cs | 4 ++-- src/embed_tests/pythonexception.cs | 4 ++-- src/testing/callbacktest.cs | 2 ++ src/testing/classtest.cs | 8 ++++---- src/testing/constructortests.cs | 8 ++++---- src/testing/eventtest.cs | 10 +++++----- src/testing/exceptiontest.cs | 2 +- src/testing/generictest.cs | 6 +++--- src/testing/moduletest.cs | 7 ++++--- src/testing/subclasstest.cs | 6 ++++-- src/testing/threadtest.cs | 8 ++++---- 12 files changed, 45 insertions(+), 43 deletions(-) diff --git a/src/embed_tests/pyimport.cs b/src/embed_tests/pyimport.cs index a6c12d49e..0e4cb3806 100644 --- a/src/embed_tests/pyimport.cs +++ b/src/embed_tests/pyimport.cs @@ -18,15 +18,13 @@ public void SetUp() PythonEngine.Initialize(); gs = PythonEngine.AcquireLock(); - /* - * Append the tests directory to sys.path - * using reflection to circumvent the private modifiers placed on most Runtime methods. + /* Append the tests directory to sys.path + * using reflection to circumvent the private + * modifiers placed on most Runtime methods. */ const string s = @"../../../../tests"; - var testPath = Path.Combine( - TestContext.CurrentContext.TestDirectory, s - ); + string testPath = Path.Combine(TestContext.CurrentContext.TestDirectory, s); IntPtr str = Runtime.Runtime.PyString_FromString(testPath); IntPtr path = Runtime.Runtime.PySys_GetObject("path"); @@ -44,13 +42,12 @@ public void TearDown() /// Test subdirectory import /// /// - /// The required directory structure was added to the \trunk\pythonnet\src\tests directory: - /// - /// PyImportTest/ - /// __init__.py - /// test/ - /// __init__.py - /// one.py + /// The required directory structure was added to .\pythonnet\src\tests\ directory: + /// + PyImportTest/ + /// | - __init__.py + /// | + test/ + /// | | - __init__.py + /// | | - one.py /// [Test] public void TestDottedName() diff --git a/src/embed_tests/pyiter.cs b/src/embed_tests/pyiter.cs index 1a4084474..1f0c651f8 100644 --- a/src/embed_tests/pyiter.cs +++ b/src/embed_tests/pyiter.cs @@ -27,11 +27,11 @@ public void TearDown() [Test] public void TestOnPyList() { - PyList list = new PyList(); + var list = new PyList(); list.Append(new PyString("foo")); list.Append(new PyString("bar")); list.Append(new PyString("baz")); - List result = new List(); + var result = new List(); foreach (PyObject item in list) { result.Add(item.ToString()); diff --git a/src/embed_tests/pythonexception.cs b/src/embed_tests/pythonexception.cs index f0bc39def..aaaf2c61c 100644 --- a/src/embed_tests/pythonexception.cs +++ b/src/embed_tests/pythonexception.cs @@ -26,7 +26,7 @@ public void TearDown() [Test] public void TestMessage() { - PyList list = new PyList(); + var list = new PyList(); try { PyObject junk = list[0]; @@ -40,7 +40,7 @@ public void TestMessage() [Test] public void TestNoError() { - PythonException e = new PythonException(); //There is no PyErr to fetch + var e = new PythonException(); //There is no PyErr to fetch Assert.AreEqual("", e.Message); } } diff --git a/src/testing/callbacktest.cs b/src/testing/callbacktest.cs index 33e240531..2838a12ca 100644 --- a/src/testing/callbacktest.cs +++ b/src/testing/callbacktest.cs @@ -37,7 +37,9 @@ public class SelfCallbackTest public void Callback(PyObject self) { using (Py.GIL()) + { ((dynamic)self).PyCallback(self); + } } } } diff --git a/src/testing/classtest.cs b/src/testing/classtest.cs index ab0cad7ad..333764610 100644 --- a/src/testing/classtest.cs +++ b/src/testing/classtest.cs @@ -10,8 +10,8 @@ public class ClassTest { public static ArrayList GetArrayList() { - ArrayList list = new ArrayList(); - for (int i = 0; i < 10; i++) + var list = new ArrayList(); + for (var i = 0; i < 10; i++) { list.Add(i); } @@ -20,7 +20,7 @@ public static ArrayList GetArrayList() public static Hashtable GetHashtable() { - Hashtable dict = new Hashtable(); + var dict = new Hashtable(); dict.Add("one", 1); dict.Add("two", 2); dict.Add("three", 3); @@ -31,7 +31,7 @@ public static Hashtable GetHashtable() public static IEnumerator GetEnumerator() { - string temp = "test string"; + var temp = "test string"; return temp.GetEnumerator(); } } diff --git a/src/testing/constructortests.cs b/src/testing/constructortests.cs index 4d3cc5710..71e50cae9 100644 --- a/src/testing/constructortests.cs +++ b/src/testing/constructortests.cs @@ -13,7 +13,7 @@ public class EnumConstructorTest public EnumConstructorTest(TypeCode v) { - this.value = v; + value = v; } } @@ -24,7 +24,7 @@ public class FlagsConstructorTest public FlagsConstructorTest(FileAccess v) { - this.value = v; + value = v; } } @@ -35,7 +35,7 @@ public class StructConstructorTest public StructConstructorTest(Guid v) { - this.value = v; + value = v; } } @@ -46,7 +46,7 @@ public class SubclassConstructorTest public SubclassConstructorTest(Exception v) { - this.value = v; + value = v; } } } diff --git a/src/testing/eventtest.cs b/src/testing/eventtest.cs index d39557c4d..b5a27a244 100644 --- a/src/testing/eventtest.cs +++ b/src/testing/eventtest.cs @@ -33,7 +33,7 @@ public class EventTest public EventTest() { - this.value = 0; + value = 0; } static EventTest() @@ -80,7 +80,7 @@ protected static void OnProtectedStaticEvent(EventArgsTest e) public void GenericHandler(object sender, EventArgsTest e) { - this.value = e.value; + value = e.value; } public static void StaticHandler(object sender, EventArgsTest e) @@ -91,8 +91,8 @@ public static void StaticHandler(object sender, EventArgsTest e) public static void ShutUpCompiler() { // Quiet compiler warnings. - EventTest e = new EventTest(); - EventHandlerTest f = new EventHandlerTest(e.GenericHandler); + var e = new EventTest(); + EventHandlerTest f = e.GenericHandler; ProtectedStaticEvent += f; InternalStaticEvent += f; PrivateStaticEvent += f; @@ -109,7 +109,7 @@ public class EventArgsTest : EventArgs public EventArgsTest(int v) { - this.value = v; + value = v; } } } diff --git a/src/testing/exceptiontest.cs b/src/testing/exceptiontest.cs index ae5fc86c0..9c45227ea 100644 --- a/src/testing/exceptiontest.cs +++ b/src/testing/exceptiontest.cs @@ -78,7 +78,7 @@ public static void ThrowChainedExceptions() public class ExtendedException : OverflowException { - public ExtendedException() : base() + public ExtendedException() { } diff --git a/src/testing/generictest.cs b/src/testing/generictest.cs index b38f5e8e5..f6aaed181 100644 --- a/src/testing/generictest.cs +++ b/src/testing/generictest.cs @@ -21,8 +21,8 @@ public class GenericTypeDefinition public GenericTypeDefinition(T arg1, U arg2) { - this.value1 = arg1; - this.value2 = arg2; + value1 = arg1; + value2 = arg2; } } @@ -34,7 +34,7 @@ public class DerivedFromOpenGeneric : public DerivedFromOpenGeneric(int arg1, V arg2, W arg3) : base(arg1, arg2) { - this.value3 = arg3; + value3 = arg3; } } diff --git a/src/testing/moduletest.cs b/src/testing/moduletest.cs index 2d5734a11..2df5269f3 100644 --- a/src/testing/moduletest.cs +++ b/src/testing/moduletest.cs @@ -1,4 +1,5 @@ using System; +using System.Reflection; using System.Threading; namespace Python.Test @@ -11,9 +12,9 @@ public static void RunThreads() { _thread = new Thread(() => { - var appdomain = AppDomain.CurrentDomain; - var assemblies = appdomain.GetAssemblies(); - foreach (var assembly in assemblies) + AppDomain appdomain = AppDomain.CurrentDomain; + Assembly[] assemblies = appdomain.GetAssemblies(); + foreach (Assembly assembly in assemblies) { assembly.GetTypes(); } diff --git a/src/testing/subclasstest.cs b/src/testing/subclasstest.cs index 9ee105aef..9817d865e 100644 --- a/src/testing/subclasstest.cs +++ b/src/testing/subclasstest.cs @@ -58,7 +58,9 @@ public static IList test_list(SubClassTest x) public virtual void OnTestEvent(int value) { if (null != TestEvent) + { TestEvent(this, new EventArgsTest(value)); + } } } @@ -89,7 +91,7 @@ public static string test_bar(IInterfaceTest x, string s, int i) // test instances can be constructed in managed code public static IInterfaceTest create_instance(Type t) { - return (IInterfaceTest)t.GetConstructor(new Type[] { }).Invoke(new Object[] { }); + return (IInterfaceTest)t.GetConstructor(new Type[] { }).Invoke(new object[] { }); } // test instances pass through managed code unchanged @@ -101,7 +103,7 @@ public static IInterfaceTest pass_through(IInterfaceTest s) public static int test_event(IInterfaceTest x, int value) { // reuse the event handler from eventtest.cs - EventTest et = new EventTest(); + var et = new EventTest(); x.TestEvent += et.GenericHandler; // raise the event (should trigger both python and managed handlers) diff --git a/src/testing/threadtest.cs b/src/testing/threadtest.cs index 0cb2abe57..d47d494a1 100644 --- a/src/testing/threadtest.cs +++ b/src/testing/threadtest.cs @@ -37,9 +37,9 @@ public static string CallEchoString(string arg) module = PythonEngine.ModuleFromString("tt", testmod); } PyObject func = module.GetAttr("echostring"); - PyString parg = new PyString(arg); + var parg = new PyString(arg); PyObject temp = func.Invoke(parg); - string result = (string)temp.AsManagedObject(typeof(String)); + var result = (string)temp.AsManagedObject(typeof(string)); func.Dispose(); parg.Dispose(); temp.Dispose(); @@ -62,9 +62,9 @@ public static string CallEchoString2(string arg) } PyObject func = module.GetAttr("echostring2"); - PyString parg = new PyString(arg); + var parg = new PyString(arg); PyObject temp = func.Invoke(parg); - string result = (string)temp.AsManagedObject(typeof(String)); + var result = (string)temp.AsManagedObject(typeof(string)); func.Dispose(); parg.Dispose(); temp.Dispose(); From bd73d5ae887a70a50d1c4254d0dc675b883162ae Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 31 Jan 2017 14:48:47 -0700 Subject: [PATCH 048/324] XML Docs on test fixtures --- src/testing/arraytest.cs | 7 +++---- src/testing/callbacktest.cs | 17 ++++++++--------- src/testing/classtest.cs | 7 +++---- src/testing/constructortests.cs | 7 +++---- src/testing/conversiontest.cs | 7 +++---- src/testing/delegatetest.cs | 7 +++---- src/testing/doctest.cs | 13 +++++++------ src/testing/enumtest.cs | 7 +++---- src/testing/eventtest.cs | 7 +++---- src/testing/exceptiontest.cs | 7 +++---- src/testing/fieldtest.cs | 7 +++---- src/testing/generictest.cs | 7 +++---- src/testing/globaltest.cs | 6 +++--- src/testing/indexertest.cs | 7 +++---- src/testing/interfacetest.cs | 7 +++---- src/testing/methodtest.cs | 14 ++++++-------- src/testing/propertytest.cs | 7 +++---- src/testing/threadtest.cs | 16 ++++++++-------- 18 files changed, 71 insertions(+), 86 deletions(-) diff --git a/src/testing/arraytest.cs b/src/testing/arraytest.cs index 591b5b1c4..946684962 100644 --- a/src/testing/arraytest.cs +++ b/src/testing/arraytest.cs @@ -1,9 +1,8 @@ namespace Python.Test { - //======================================================================== - // Supports units tests for indexer access. - //======================================================================== - + /// + /// Supports units tests for indexer access. + /// public class PublicArrayTest { public int[] items; diff --git a/src/testing/callbacktest.cs b/src/testing/callbacktest.cs index 2838a12ca..321ecc86f 100644 --- a/src/testing/callbacktest.cs +++ b/src/testing/callbacktest.cs @@ -2,10 +2,9 @@ namespace Python.Test { - //======================================================================== - // Tests callbacks into python code. - //======================================================================== - + /// + /// Tests callbacks into python code. + /// public class CallbackTest { public string Call_simpleDefaultArg_WithNull(string moduleName) @@ -27,11 +26,11 @@ public string Call_simpleDefaultArg_WithEmptyArgs(string moduleName) } } - //========================================================================== - // Tests calling from Python into C# and back into Python using a PyObject. - // SelfCallbackTest should be inherited by a Python class. - // Used in test_class.py / testCallback - //========================================================================== + /// + /// Tests calling from Python into C# and back into Python using a PyObject. + /// SelfCallbackTest should be inherited by a Python class. + /// Used in test_class.py / testCallback + /// public class SelfCallbackTest { public void Callback(PyObject self) diff --git a/src/testing/classtest.cs b/src/testing/classtest.cs index 333764610..68c0d8c55 100644 --- a/src/testing/classtest.cs +++ b/src/testing/classtest.cs @@ -2,10 +2,9 @@ namespace Python.Test { - //======================================================================== - // Supports CLR class unit tests. - //======================================================================== - + /// + /// Supports CLR class unit tests. + /// public class ClassTest { public static ArrayList GetArrayList() diff --git a/src/testing/constructortests.cs b/src/testing/constructortests.cs index 71e50cae9..8800c94a1 100644 --- a/src/testing/constructortests.cs +++ b/src/testing/constructortests.cs @@ -3,10 +3,9 @@ namespace Python.Test { - //======================================================================== - // These classes support the CLR constructor unit tests. - //======================================================================== - + /// + /// These classes support the CLR constructor unit tests. + /// public class EnumConstructorTest { public TypeCode value; diff --git a/src/testing/conversiontest.cs b/src/testing/conversiontest.cs index 5686a1943..f204a9f85 100644 --- a/src/testing/conversiontest.cs +++ b/src/testing/conversiontest.cs @@ -1,9 +1,8 @@ namespace Python.Test { - //======================================================================== - // Supports units tests for field access. - //======================================================================== - + /// + /// Supports units tests for field access. + /// public class ConversionTest { public ConversionTest() diff --git a/src/testing/delegatetest.cs b/src/testing/delegatetest.cs index 94169f650..e2df9475f 100644 --- a/src/testing/delegatetest.cs +++ b/src/testing/delegatetest.cs @@ -1,9 +1,8 @@ namespace Python.Test { - //======================================================================== - // Supports CLR class unit tests. - //======================================================================== - + /// + /// Supports CLR class unit tests. + /// public delegate void PublicDelegate(); internal delegate void InternalDelegate(); diff --git a/src/testing/doctest.cs b/src/testing/doctest.cs index a0f60b2e1..98ca05de4 100644 --- a/src/testing/doctest.cs +++ b/src/testing/doctest.cs @@ -2,12 +2,13 @@ namespace Python.Test { - //======================================================================== - // Supports units tests for exposing docstrings from C# to Python - //======================================================================== - - // Classes with a constructor have their docstring set to the ctor signature. - // Test if a class has an explicit doc string it gets set correctly. + /// + /// Supports units tests for exposing docstrings from C# to Python + /// + /// + /// Classes with a constructor have their docstring set to the ctor signature. + /// Test if a class has an explicit doc string it gets set correctly. + /// [DocString("DocWithCtorTest Class")] public class DocWithCtorTest { diff --git a/src/testing/enumtest.cs b/src/testing/enumtest.cs index 0d0d56190..de5d8f5ee 100644 --- a/src/testing/enumtest.cs +++ b/src/testing/enumtest.cs @@ -2,10 +2,9 @@ namespace Python.Test { - //======================================================================== - // Supports CLR enum unit tests. - //======================================================================== - + /// + /// Supports CLR enum unit tests. + /// public enum ByteEnum : byte { Zero, diff --git a/src/testing/eventtest.cs b/src/testing/eventtest.cs index b5a27a244..4c701d488 100644 --- a/src/testing/eventtest.cs +++ b/src/testing/eventtest.cs @@ -2,10 +2,9 @@ namespace Python.Test { - //======================================================================== - // Supports CLR event unit tests. - //======================================================================== - + /// + /// Supports CLR event unit tests. + /// public delegate void EventHandlerTest(object sender, EventArgsTest e); diff --git a/src/testing/exceptiontest.cs b/src/testing/exceptiontest.cs index 9c45227ea..e4f683721 100644 --- a/src/testing/exceptiontest.cs +++ b/src/testing/exceptiontest.cs @@ -2,10 +2,9 @@ namespace Python.Test { - //======================================================================== - // Supports CLR Exception unit tests. - //======================================================================== - + /// + /// Supports CLR Exception unit tests. + /// public class ExceptionTest { public int ThrowProperty diff --git a/src/testing/fieldtest.cs b/src/testing/fieldtest.cs index 4d41cf084..d1bf6e983 100644 --- a/src/testing/fieldtest.cs +++ b/src/testing/fieldtest.cs @@ -1,9 +1,8 @@ namespace Python.Test { - //======================================================================== - // Supports units tests for field access. - //======================================================================== - + /// + /// Supports units tests for field access. + /// public class FieldTest { public FieldTest() diff --git a/src/testing/generictest.cs b/src/testing/generictest.cs index f6aaed181..848ee5cea 100644 --- a/src/testing/generictest.cs +++ b/src/testing/generictest.cs @@ -1,9 +1,8 @@ namespace Python.Test { - //======================================================================== - // Supports CLR generics unit tests. - //======================================================================== - + /// + /// Supports CLR generics unit tests. + /// public class GenericWrapper { public T value; diff --git a/src/testing/globaltest.cs b/src/testing/globaltest.cs index 2d6d56cda..83a2bc439 100644 --- a/src/testing/globaltest.cs +++ b/src/testing/globaltest.cs @@ -1,7 +1,7 @@ -//======================================================================== -// Supports units tests for access to types without a namespace. -//======================================================================== +/// +/// Supports units tests for access to types without a namespace. +/// public class NoNamespaceType { } diff --git a/src/testing/indexertest.cs b/src/testing/indexertest.cs index f1dcbda0b..74ba69755 100644 --- a/src/testing/indexertest.cs +++ b/src/testing/indexertest.cs @@ -2,10 +2,9 @@ namespace Python.Test { - //======================================================================== - // Supports units tests for indexer access. - //======================================================================== - + /// + /// Supports units tests for indexer access. + /// public class IndexerBase { protected Hashtable t; diff --git a/src/testing/interfacetest.cs b/src/testing/interfacetest.cs index 4c4056d68..2c24596bc 100644 --- a/src/testing/interfacetest.cs +++ b/src/testing/interfacetest.cs @@ -1,9 +1,8 @@ namespace Python.Test { - //======================================================================== - // Supports CLR class unit tests. - //======================================================================== - + /// + /// Supports CLR class unit tests. + /// public interface IPublicInterface { } diff --git a/src/testing/methodtest.cs b/src/testing/methodtest.cs index 65e39cf69..567dd9227 100644 --- a/src/testing/methodtest.cs +++ b/src/testing/methodtest.cs @@ -3,10 +3,9 @@ namespace Python.Test { - //======================================================================== - // Supports units tests for method access. - //======================================================================== - + /// + /// Supports units tests for method access. + /// public class MethodTest { public MethodTest() @@ -54,10 +53,9 @@ private static string PrivateStaticMethod() } - //=================================================================== - // Methods to support specific argument conversion unit tests - //=================================================================== - + /// + /// Methods to support specific argument conversion unit tests + /// public TypeCode TestEnumConversion(TypeCode v) { return v; diff --git a/src/testing/propertytest.cs b/src/testing/propertytest.cs index b70e9487a..999865ef6 100644 --- a/src/testing/propertytest.cs +++ b/src/testing/propertytest.cs @@ -1,9 +1,8 @@ namespace Python.Test { - //======================================================================== - // Supports units tests for property access. - //======================================================================== - + /// + /// Supports units tests for property access. + /// public class PropertyTest { public PropertyTest() diff --git a/src/testing/threadtest.cs b/src/testing/threadtest.cs index d47d494a1..2825c3fef 100644 --- a/src/testing/threadtest.cs +++ b/src/testing/threadtest.cs @@ -3,10 +3,9 @@ namespace Python.Test { - //======================================================================== - // Supports CLR threading / reentrancy unit tests. - //======================================================================== - + /// + /// Supports CLR threading / reentrant unit tests. + /// public class ThreadTest { private static PyObject module; @@ -23,10 +22,11 @@ public class ThreadTest "\n"; - // This method calls back into the CPython runtime - tests - // call this from Python to check that we don't hang on - // nested transitions from managed to Python code and back. - + /// + /// This method calls back into the CPython runtime - tests + /// call this from Python to check that we don't hang on + /// nested transitions from managed to Python code and back. + /// public static string CallEchoString(string arg) { IntPtr gs = PythonEngine.AcquireLock(); From f7f2fc0d2c1786399c8b1ef8e090d8ddf5bfeb03 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 31 Jan 2017 15:04:28 -0700 Subject: [PATCH 049/324] Update CHANGELOG --- CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53f75e6af..dbf9f4c9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,17 +9,19 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ### Added -- New `Foo` feature +- Code Coverage (#345) ### Changed - Refactored `setup.py` (#337) - Upgraded NUnit framework to 3.5 (#341) - Completed refactor of Build Directives on `Runtime.cs` (#339) +- Refactor tests and removed dependency on `six` (#329) +- Unfroze Mono version on Travis (#345) ### Fixed -- Fixed `FooBar` bug +- Fixed crash during Shutdown (#343) ## [2.2.2][] - 2017-01-29 From eca5ac904a4568fa06c356dfa8f628873e0192ae Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Tue, 24 Jan 2017 15:52:14 +0100 Subject: [PATCH 050/324] Implement Py.SetArgv. --- src/runtime/pythonengine.cs | 30 +++++++++++++++++++++++++++++- src/runtime/runtime.cs | 19 +++++++++++++++++-- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index c296f1b87..626a8ffca 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -500,7 +500,7 @@ public class KeywordArguments : PyDict public static KeywordArguments kw(params object[] kv) { var dict = new KeywordArguments(); - if (kv.Length%2 != 0) + if (kv.Length % 2 != 0) throw new ArgumentException("Must have an equal number of keys and values"); for (int i = 0; i < kv.Length; i += 2) { @@ -521,5 +521,33 @@ public static PyObject Import(string name) { return PythonEngine.ImportModule(name); } + + public static void SetArgv() + { + IEnumerable args; + try + { + args = Environment.GetCommandLineArgs(); + } + catch (NotSupportedException) + { + args = Enumerable.Empty(); + } + + SetArgv( + new[] { "" }.Concat( + Environment.GetCommandLineArgs().Skip(1) + ) + ); + } + + public static void SetArgv(IEnumerable argv) + { + using (GIL()) + { + var arr = argv.ToArray(); + Runtime.PySys_SetArgvEx(arr.Length, arr, 0); + } + } } } diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 5f0ecfbd2..9b5c4ffb5 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -2027,11 +2027,26 @@ internal unsafe static extern IntPtr internal unsafe static extern IntPtr PyImport_GetModuleDict(); - +#if PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern void - PySys_SetArgv(int argc, IntPtr argv); + PySys_SetArgvEx( + int argc, + [MarshalAsAttribute(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] + string[] argv, + int updatepath + ); +#elif PYTHON2 + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + internal unsafe static extern void + PySys_SetArgvEx( + int argc, + string[] argv, + int updatepath + ); +#endif [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] From 331524f16a0a60afd7f845a9b73222e386747cf7 Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Thu, 26 Jan 2017 17:32:16 +0100 Subject: [PATCH 051/324] Add a `Py.Throw` function. Checks whether an error occurred and in case it has throws a PythonException. --- src/runtime/pythonengine.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index 626a8ffca..93df4c778 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -549,5 +549,13 @@ public static void SetArgv(IEnumerable argv) Runtime.PySys_SetArgvEx(arr.Length, arr, 0); } } + + internal static void Throw() + { + if (Runtime.PyErr_Occurred() != 0) + { + throw new PythonException(); + } + } } } From a0849a9d490bc199752e498946153911bf0e7761 Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Mon, 30 Jan 2017 14:03:18 +0100 Subject: [PATCH 052/324] Add overload for Initialize to pass specific args. --- src/embed_tests/InitializeTest.cs | 36 +++++++++++++++++++++++++++++++ src/runtime/pythonengine.cs | 19 +++++++++++++--- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/src/embed_tests/InitializeTest.cs b/src/embed_tests/InitializeTest.cs index a9667343c..212fbcff1 100644 --- a/src/embed_tests/InitializeTest.cs +++ b/src/embed_tests/InitializeTest.cs @@ -9,6 +9,42 @@ namespace Python.EmbeddingTest { public class InitializeTest { + [Test] + public static void LoadSpecificArgs() + { + var args = new[] { "test1", "test2" }; + PythonEngine.Initialize(args); + try + { + using (var argv = new PyList(Runtime.Runtime.PySys_GetObject("argv"))) + { + Assert.That(argv[0].ToString() == args[0]); + Assert.That(argv[1].ToString() == args[1]); + } + } + finally + { + PythonEngine.Shutdown(); + } + } + + [Test] + public static void LoadDefaultArgs() + { + PythonEngine.Initialize(); + try + { + using (var argv = new PyList(Runtime.Runtime.PySys_GetObject("argv"))) + { + Assert.That(argv.Length() != 0); + } + } + finally + { + PythonEngine.Shutdown(); + } + } + [Test] public static void Test() { diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index 93df4c778..06510d955 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -2,6 +2,8 @@ using System.IO; using System.Threading; using System.Reflection; +using System.Collections.Generic; +using System.Linq; namespace Python.Runtime { @@ -102,6 +104,11 @@ public static int RunSimpleString(string code) #endregion + public static void Initialize() + { + Initialize(Enumerable.Empty()); + } + /// /// Initialize Method /// @@ -112,7 +119,7 @@ public static int RunSimpleString(string code) /// first call. It is *not* necessary to hold the Python global /// interpreter lock (GIL) to call this method. /// - public static void Initialize() + public static void Initialize(IEnumerable args) { if (!initialized) { @@ -126,6 +133,9 @@ public static void Initialize() initialized = true; Exceptions.Clear(); + Py.SetArgv(args); + Py.Throw(); + // register the atexit callback (this doesn't use Py_AtExit as the C atexit // callbacks are called after python is fully finalized but the python ones // are called while the python engine is still running). @@ -552,9 +562,12 @@ public static void SetArgv(IEnumerable argv) internal static void Throw() { - if (Runtime.PyErr_Occurred() != 0) + using (GIL()) { - throw new PythonException(); + if (Runtime.PyErr_Occurred() != 0) + { + throw new PythonException(); + } } } } From 4f67c5da5d592d11fb90b287c5e4b70ab68e30e8 Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Tue, 31 Jan 2017 13:47:17 +0100 Subject: [PATCH 053/324] Allow the engine to be initialized as a Disposable. --- src/embed_tests/InitializeTest.cs | 30 ++++++++---------------------- src/runtime/pythonengine.cs | 30 ++++++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/src/embed_tests/InitializeTest.cs b/src/embed_tests/InitializeTest.cs index 212fbcff1..6c6f0f1f1 100644 --- a/src/embed_tests/InitializeTest.cs +++ b/src/embed_tests/InitializeTest.cs @@ -13,40 +13,26 @@ public class InitializeTest public static void LoadSpecificArgs() { var args = new[] { "test1", "test2" }; - PythonEngine.Initialize(args); - try + using (new PythonEngine(args)) + using (var argv = new PyList(Runtime.Runtime.PySys_GetObject("argv"))) { - using (var argv = new PyList(Runtime.Runtime.PySys_GetObject("argv"))) - { - Assert.That(argv[0].ToString() == args[0]); - Assert.That(argv[1].ToString() == args[1]); - } - } - finally - { - PythonEngine.Shutdown(); + Assert.That(argv[0].ToString() == args[0]); + Assert.That(argv[1].ToString() == args[1]); } } [Test] public static void LoadDefaultArgs() { - PythonEngine.Initialize(); - try - { - using (var argv = new PyList(Runtime.Runtime.PySys_GetObject("argv"))) - { - Assert.That(argv.Length() != 0); - } - } - finally + using (new PythonEngine()) + using (var argv = new PyList(Runtime.Runtime.PySys_GetObject("argv"))) { - PythonEngine.Shutdown(); + Assert.That(argv.Length() != 0); } } [Test] - public static void Test() + public static void StartAndStopTwice() { PythonEngine.Initialize(); PythonEngine.Shutdown(); diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index 06510d955..0449d3c31 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -10,11 +10,31 @@ namespace Python.Runtime /// /// This class provides the public interface of the Python runtime. /// - public class PythonEngine + public class PythonEngine : IDisposable { private static DelegateManager delegateManager; private static bool initialized; + public PythonEngine() + { + Initialize(); + } + + public PythonEngine(params string[] args) + { + Initialize(args); + } + + public PythonEngine(IEnumerable args) + { + Initialize(args); + } + + public void Dispose() + { + Shutdown(); + } + #region Properties public static bool IsInitialized @@ -197,7 +217,8 @@ public static void Initialize(IEnumerable args) // when it is imported by the CLR extension module. //==================================================================== #if PYTHON3 - public static IntPtr InitExt() { + public static IntPtr InitExt() + { #elif PYTHON2 public static void InitExt() { @@ -551,6 +572,11 @@ public static void SetArgv() ); } + public static void SetArgv(params string[] argv) + { + SetArgv(argv as IEnumerable); + } + public static void SetArgv(IEnumerable argv) { using (GIL()) From 3785c40a10d4754803374112212fc87a8da7e31d Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Tue, 31 Jan 2017 14:32:09 +0100 Subject: [PATCH 054/324] Use Py.Throw in a few more places. In particular in Py.Import. --- src/runtime/pythonengine.cs | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index 0449d3c31..754aaf2cd 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -154,7 +154,6 @@ public static void Initialize(IEnumerable args) Exceptions.Clear(); Py.SetArgv(args); - Py.Throw(); // register the atexit callback (this doesn't use Py_AtExit as the C atexit // callbacks are called after python is fully finalized but the python ones @@ -382,10 +381,7 @@ public static void EndAllowThreads(IntPtr ts) public static PyObject ImportModule(string name) { IntPtr op = Runtime.PyImport_ImportModule(name); - if (op == IntPtr.Zero) - { - return null; - } + Py.Throw(); return new PyObject(op); } @@ -401,10 +397,7 @@ public static PyObject ImportModule(string name) public static PyObject ReloadModule(PyObject module) { IntPtr op = Runtime.PyImport_ReloadModule(module.Handle); - if (op == IntPtr.Zero) - { - throw new PythonException(); - } + Py.Throw(); return new PyObject(op); } @@ -420,15 +413,9 @@ public static PyObject ReloadModule(PyObject module) public static PyObject ModuleFromString(string name, string code) { IntPtr c = Runtime.Py_CompileString(code, "none", (IntPtr)257); - if (c == IntPtr.Zero) - { - throw new PythonException(); - } + Py.Throw(); IntPtr m = Runtime.PyImport_ExecCodeModule(name, c); - if (m == IntPtr.Zero) - { - throw new PythonException(); - } + Py.Throw(); return new PyObject(m); } @@ -476,10 +463,7 @@ public static PyObject RunString( code, flag, globals.Value, locals.Value ); - if (Runtime.PyErr_Occurred() != 0) - { - throw new PythonException(); - } + Py.Throw(); return new PyObject(result); } @@ -583,6 +567,7 @@ public static void SetArgv(IEnumerable argv) { var arr = argv.ToArray(); Runtime.PySys_SetArgvEx(arr.Length, arr, 0); + Py.Throw(); } } From 78fb457c804ca3f9cec62b83fb6dbe696abccbb4 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 31 Jan 2017 19:18:13 -0700 Subject: [PATCH 055/324] Add PY3.7 to travis with allow_failure --- .travis.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.travis.yml b/.travis.yml index 1b5806d59..f23a4ee6c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,11 @@ python: - 3.4 - 3.5 - 3.6 + - 3.7-dev + +matrix: + allow_failures: + - python: 3.7-dev env: global: From cb6ec6d1967dc851fb2616a81f72130f511917eb Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 31 Jan 2017 20:50:37 -0700 Subject: [PATCH 056/324] Format & Whitespace *.cs linelength 120 Allman --- src/console/assemblyinfo.cs | 3 +- src/runtime/arrayobject.cs | 22 +- src/runtime/assemblymanager.cs | 37 +- src/runtime/classbase.cs | 13 +- src/runtime/classderived.cs | 3 +- src/runtime/classmanager.cs | 2 +- src/runtime/classobject.cs | 25 +- src/runtime/codegenerator.cs | 2 +- src/runtime/constructorbinder.cs | 9 +- src/runtime/constructorbinding.cs | 3 +- src/runtime/converter.cs | 154 ++++---- src/runtime/debughelper.cs | 4 +- src/runtime/delegatemanager.cs | 12 +- src/runtime/delegateobject.cs | 3 +- src/runtime/eventbinding.cs | 10 +- src/runtime/eventobject.cs | 14 +- src/runtime/extensiontype.cs | 13 +- src/runtime/fieldobject.cs | 21 +- src/runtime/generictype.cs | 9 +- src/runtime/genericutil.cs | 5 +- src/runtime/importhook.cs | 39 +- src/runtime/indexer.cs | 2 +- src/runtime/interfaceobject.cs | 13 +- src/runtime/interfaces.cs | 2 +- src/runtime/interop.cs | 41 +- src/runtime/iterator.cs | 2 +- src/runtime/managedtype.cs | 6 +- src/runtime/metatype.cs | 18 +- src/runtime/methodbinder.cs | 82 ++-- src/runtime/methodbinding.cs | 5 +- src/runtime/methodobject.cs | 5 +- src/runtime/methodwrapper.cs | 4 +- src/runtime/modulefunctionobject.cs | 2 +- src/runtime/moduleobject.cs | 5 +- src/runtime/modulepropertyobject.cs | 2 +- src/runtime/monosupport.cs | 15 +- src/runtime/nativecall.cs | 8 +- src/runtime/overload.cs | 2 +- src/runtime/propertyobject.cs | 13 +- src/runtime/pyansistring.cs | 8 +- src/runtime/pydict.cs | 2 +- src/runtime/pyfloat.cs | 2 +- src/runtime/pyint.cs | 2 +- src/runtime/pyiter.cs | 2 +- src/runtime/pylist.cs | 2 +- src/runtime/pylong.cs | 2 +- src/runtime/pynumber.cs | 2 +- src/runtime/pyobject.cs | 4 +- src/runtime/pysequence.cs | 2 +- src/runtime/pystring.cs | 2 +- src/runtime/pythonengine.cs | 3 +- src/runtime/pythonexception.cs | 2 +- src/runtime/pytuple.cs | 2 +- src/runtime/runtime.cs | 589 ++++++++++++++-------------- src/runtime/typemanager.cs | 29 +- src/runtime/typemethod.cs | 5 +- src/testing/generictest.cs | 6 +- src/testing/indexertest.cs | 6 +- src/testing/methodtest.cs | 111 ++---- 59 files changed, 647 insertions(+), 766 deletions(-) diff --git a/src/console/assemblyinfo.cs b/src/console/assemblyinfo.cs index c7d957326..fcdc2b693 100644 --- a/src/console/assemblyinfo.cs +++ b/src/console/assemblyinfo.cs @@ -10,8 +10,7 @@ [assembly: AssemblyDefaultAlias("python.exe")] [assembly: CLSCompliant(true)] [assembly: ComVisible(false)] -[assembly: PermissionSet(SecurityAction.RequestMinimum, - Name = "FullTrust")] +[assembly: PermissionSet(SecurityAction.RequestMinimum, Name = "FullTrust")] [assembly: AssemblyDescription("")] [assembly: AssemblyCopyright("MIT License")] [assembly: AssemblyFileVersion("2.0.0.4")] diff --git a/src/runtime/arrayobject.cs b/src/runtime/arrayobject.cs index 2fe433e57..eaff49214 100644 --- a/src/runtime/arrayobject.cs +++ b/src/runtime/arrayobject.cs @@ -80,9 +80,7 @@ public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) } catch (IndexOutOfRangeException) { - Exceptions.SetError(Exceptions.IndexError, - "array index out of range" - ); + Exceptions.SetError(Exceptions.IndexError, "array index out of range"); return IntPtr.Zero; } @@ -93,9 +91,7 @@ public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) if (!Runtime.PyTuple_Check(idx)) { - Exceptions.SetError(Exceptions.TypeError, - "invalid index value" - ); + Exceptions.SetError(Exceptions.TypeError, "invalid index value"); return IntPtr.Zero; } @@ -127,9 +123,7 @@ public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) } catch (IndexOutOfRangeException) { - Exceptions.SetError(Exceptions.IndexError, - "array index out of range" - ); + Exceptions.SetError(Exceptions.IndexError, "array index out of range"); return IntPtr.Zero; } @@ -182,9 +176,7 @@ public static int mp_ass_subscript(IntPtr ob, IntPtr idx, IntPtr v) } catch (IndexOutOfRangeException) { - Exceptions.SetError(Exceptions.IndexError, - "array index out of range" - ); + Exceptions.SetError(Exceptions.IndexError, "array index out of range"); return -1; } @@ -226,9 +218,7 @@ public static int mp_ass_subscript(IntPtr ob, IntPtr idx, IntPtr v) } catch (IndexOutOfRangeException) { - Exceptions.SetError(Exceptions.IndexError, - "array index out of range" - ); + Exceptions.SetError(Exceptions.IndexError, "array index out of range"); return -1; } @@ -272,4 +262,4 @@ public static int mp_length(IntPtr ob) return items.Length; } } -} \ No newline at end of file +} diff --git a/src/runtime/assemblymanager.cs b/src/runtime/assemblymanager.cs index 5d9759375..f263728bb 100644 --- a/src/runtime/assemblymanager.cs +++ b/src/runtime/assemblymanager.cs @@ -39,8 +39,7 @@ private AssemblyManager() internal static void Initialize() { - namespaces = new - ConcurrentDictionary>(); + namespaces = new ConcurrentDictionary>(); probed = new Dictionary(32); //generics = new Dictionary>(); assemblies = new AssemblyList(16); @@ -206,9 +205,10 @@ public static Assembly LoadAssembly(string name) { assembly = Assembly.Load(name); } - catch (System.Exception e) + catch (System.Exception) { - //if (!(e is System.IO.FileNotFoundException)) { + //if (!(e is System.IO.FileNotFoundException)) + //{ // throw; //} } @@ -480,13 +480,15 @@ public static Type LookupType(string qname) } /// - /// Wrapper around List for thread safe access + /// Wrapper around List<Assembly> for thread safe access /// - private class AssemblyList : IEnumerable{ + private class AssemblyList : IEnumerable + { private readonly List _list; private readonly ReaderWriterLockSlim _lock; - public AssemblyList(int capacity) { + public AssemblyList(int capacity) + { _list = new List(capacity); _lock = new ReaderWriterLockSlim(); } @@ -496,16 +498,19 @@ public int Count get { _lock.EnterReadLock(); - try { + try + { return _list.Count; } - finally { + finally + { _lock.ExitReadLock(); } } } - public void Add(Assembly assembly) { + public void Add(Assembly assembly) + { _lock.EnterWriteLock(); try { @@ -519,7 +524,7 @@ public void Add(Assembly assembly) { public IEnumerator GetEnumerator() { - return ((IEnumerable) this).GetEnumerator(); + return ((IEnumerable)this).GetEnumerator(); } /// @@ -555,9 +560,15 @@ public void Reset() _listEnumerator.Reset(); } - public Assembly Current { get { return _listEnumerator.Current; } } + public Assembly Current + { + get { return _listEnumerator.Current; } + } - object IEnumerator.Current { get { return Current; } } + object IEnumerator.Current + { + get { return Current; } + } } IEnumerator IEnumerable.GetEnumerator() diff --git a/src/runtime/classbase.cs b/src/runtime/classbase.cs index 3089465e3..7c7bb0509 100644 --- a/src/runtime/classbase.cs +++ b/src/runtime/classbase.cs @@ -68,7 +68,8 @@ public virtual IntPtr type_subscript(IntPtr idx) // Standard comparison implementation for instances of reflected types. //==================================================================== - public static IntPtr tp_richcompare(IntPtr ob, IntPtr other, int op) { + public static IntPtr tp_richcompare(IntPtr ob, IntPtr other, int op) + { CLRObject co1; CLRObject co2; switch (op) @@ -116,7 +117,7 @@ public static IntPtr tp_richcompare(IntPtr ob, IntPtr other, int op) { case Runtime.Py_GE: co1 = GetManagedObject(ob) as CLRObject; co2 = GetManagedObject(other) as CLRObject; - if(co1 == null || co2 == null) + if (co1 == null || co2 == null) return Exceptions.RaiseTypeError("Cannot get managed object"); var co1Comp = co1.inst as IComparable; if (co1Comp == null) @@ -150,10 +151,12 @@ public static IntPtr tp_richcompare(IntPtr ob, IntPtr other, int op) { } else { - if (op == Runtime.Py_GE || op == Runtime.Py_GT) { + if (op == Runtime.Py_GE || op == Runtime.Py_GT) + { pyCmp = Runtime.PyTrue; } - else { + else + { pyCmp = Runtime.PyFalse; } } @@ -285,4 +288,4 @@ public static void tp_dealloc(IntPtr ob) self.gcHandle.Free(); } } -} \ No newline at end of file +} diff --git a/src/runtime/classderived.cs b/src/runtime/classderived.cs index 02d734c26..ea0cbb7e9 100644 --- a/src/runtime/classderived.cs +++ b/src/runtime/classderived.cs @@ -33,8 +33,7 @@ static ClassDerivedObject() moduleBuilders = new Dictionary, ModuleBuilder>(); } - internal ClassDerivedObject(Type tp) - : base(tp) + internal ClassDerivedObject(Type tp): base(tp) { } diff --git a/src/runtime/classmanager.cs b/src/runtime/classmanager.cs index 52fecf39c..2588adf7e 100644 --- a/src/runtime/classmanager.cs +++ b/src/runtime/classmanager.cs @@ -397,4 +397,4 @@ internal ClassInfo(Type t) public Hashtable members; public Indexer indexer; } -} \ No newline at end of file +} diff --git a/src/runtime/classobject.cs b/src/runtime/classobject.cs index bd4702c20..671f0c8e6 100644 --- a/src/runtime/classobject.cs +++ b/src/runtime/classobject.cs @@ -71,9 +71,7 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) { if (Runtime.PyTuple_Size(args) != 1) { - Exceptions.SetError(Exceptions.TypeError, - "no constructors match given arguments" - ); + Exceptions.SetError(Exceptions.TypeError, "no constructors match given arguments"); return IntPtr.Zero; } @@ -90,17 +88,13 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) if (type.IsAbstract) { - Exceptions.SetError(Exceptions.TypeError, - "cannot instantiate abstract class" - ); + Exceptions.SetError(Exceptions.TypeError, "cannot instantiate abstract class"); return IntPtr.Zero; } if (type.IsEnum) { - Exceptions.SetError(Exceptions.TypeError, - "cannot instantiate enumeration" - ); + Exceptions.SetError(Exceptions.TypeError, "cannot instantiate enumeration"); return IntPtr.Zero; } @@ -178,9 +172,7 @@ public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) if (cls.indexer == null || !cls.indexer.CanGet) { - Exceptions.SetError(Exceptions.TypeError, - "unindexable object" - ); + Exceptions.SetError(Exceptions.TypeError, "unindexable object"); return IntPtr.Zero; } @@ -228,9 +220,7 @@ public static int mp_ass_subscript(IntPtr ob, IntPtr idx, IntPtr v) if (cls.indexer == null || !cls.indexer.CanSet) { - Exceptions.SetError(Exceptions.TypeError, - "object doesn't support item assignment" - ); + Exceptions.SetError(Exceptions.TypeError, "object doesn't support item assignment"); return -1; } @@ -314,8 +304,7 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) if (cb.type != typeof(System.Delegate)) { - Exceptions.SetError(Exceptions.TypeError, - "object is not callable"); + Exceptions.SetError(Exceptions.TypeError, "object is not callable"); return IntPtr.Zero; } @@ -331,4 +320,4 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) return binder.Invoke(ob, args, kw); } } -} \ No newline at end of file +} diff --git a/src/runtime/codegenerator.cs b/src/runtime/codegenerator.cs index 01edd79ba..527ef418a 100644 --- a/src/runtime/codegenerator.cs +++ b/src/runtime/codegenerator.cs @@ -49,4 +49,4 @@ internal TypeBuilder DefineType(string name, Type basetype) return mBuilder.DefineType(name, attrs, basetype); } } -} \ No newline at end of file +} diff --git a/src/runtime/constructorbinder.cs b/src/runtime/constructorbinder.cs index 7ea7602b8..837c7ff2e 100644 --- a/src/runtime/constructorbinder.cs +++ b/src/runtime/constructorbinder.cs @@ -49,8 +49,7 @@ internal object InvokeRaw(IntPtr inst, IntPtr args, IntPtr kw) /// Binding binding = this.Bind(inst, args, kw, info); /// to take advantage of Bind()'s ability to use a single MethodBase (CI or MI). /// - internal object InvokeRaw(IntPtr inst, IntPtr args, IntPtr kw, - MethodBase info) + internal object InvokeRaw(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info) { Object result; @@ -96,9 +95,7 @@ internal object InvokeRaw(IntPtr inst, IntPtr args, IntPtr kw, if (binding == null) { - Exceptions.SetError(Exceptions.TypeError, - "no constructor matches given arguments" - ); + Exceptions.SetError(Exceptions.TypeError, "no constructor matches given arguments"); return null; } } @@ -123,4 +120,4 @@ internal object InvokeRaw(IntPtr inst, IntPtr args, IntPtr kw, return result; } } -} \ No newline at end of file +} diff --git a/src/runtime/constructorbinding.cs b/src/runtime/constructorbinding.cs index 8710f53bf..940650186 100644 --- a/src/runtime/constructorbinding.cs +++ b/src/runtime/constructorbinding.cs @@ -169,8 +169,7 @@ internal class BoundContructor : ExtensionType ConstructorInfo ctorInfo; IntPtr repr; - public BoundContructor(Type type, IntPtr pyTypeHndl, ConstructorBinder ctorBinder, ConstructorInfo ci) - : base() + public BoundContructor(Type type, IntPtr pyTypeHndl, ConstructorBinder ctorBinder, ConstructorInfo ci) : base() { this.type = type; Runtime.XIncref(pyTypeHndl); diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index ac1085c18..320d6eb58 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -126,7 +126,7 @@ internal static IntPtr ToPython(T value) internal static IntPtr ToPython(Object value, Type type) { - if(value is PyObject) + if (value is PyObject) { IntPtr handle = ((PyObject)value).Handle; Runtime.XIncref(handle); @@ -144,7 +144,7 @@ internal static IntPtr ToPython(Object value, Type type) } // it the type is a python subclass of a managed type then return the - // underying python object rather than construct a new wrapper object. + // underlying python object rather than construct a new wrapper object. IPythonDerivedType pyderived = value as IPythonDerivedType; if (null != pyderived) { @@ -303,7 +303,7 @@ internal static bool ToManagedValue(IntPtr value, Type obType, result = ((ClassBase)mt).type; return true; } - // shouldnt happen + // shouldn't happen return false; } @@ -323,16 +323,13 @@ internal static bool ToManagedValue(IntPtr value, Type obType, return ToEnum(value, obType, out result, setError); } - // Conversion to 'Object' is done based on some reasonable - // default conversions (Python string -> managed string, - // Python int -> Int32 etc.). - + // Conversion to 'Object' is done based on some reasonable default + // conversions (Python string -> managed string, Python int -> Int32 etc.). if (obType == objectType) { if (Runtime.IsStringType(value)) { - return ToPrimitive(value, stringType, out result, - setError); + return ToPrimitive(value, stringType, out result, setError); } else if (Runtime.PyBool_Check(value)) @@ -357,23 +354,18 @@ internal static bool ToManagedValue(IntPtr value, Type obType, else if (Runtime.PySequence_Check(value)) { - return ToArray(value, typeof(object[]), out result, - setError); + return ToArray(value, typeof(object[]), out result, setError); } if (setError) { - Exceptions.SetError(Exceptions.TypeError, - "value cannot be converted to Object" - ); + Exceptions.SetError(Exceptions.TypeError, "value cannot be converted to Object"); } return false; } - // Conversion to 'Type' is done using the same mappings as above - // for objects. - + // Conversion to 'Type' is done using the same mappings as above for objects. if (obType == typeType) { if (value == Runtime.PyStringType) @@ -414,9 +406,7 @@ internal static bool ToManagedValue(IntPtr value, Type obType, if (setError) { - Exceptions.SetError(Exceptions.TypeError, - "value cannot be converted to Type" - ); + Exceptions.SetError(Exceptions.TypeError, "value cannot be converted to Type"); } return false; @@ -429,8 +419,7 @@ internal static bool ToManagedValue(IntPtr value, Type obType, // Convert a Python value to an instance of a primitive managed type. //==================================================================== - static bool ToPrimitive(IntPtr value, Type obType, out Object result, - bool setError) + static bool ToPrimitive(IntPtr value, Type obType, out Object result, bool setError) { IntPtr overflow = Exceptions.OverflowError; TypeCode tc = Type.GetTypeCode(obType); @@ -450,8 +439,8 @@ static bool ToPrimitive(IntPtr value, Type obType, out Object result, return true; case TypeCode.Int32: -#if PYTHON2 - // Trickery to support 64-bit platforms. +#if PYTHON2 // Trickery to support 64-bit platforms. + if (IntPtr.Size == 4) { op = Runtime.PyNumber_Int(value); @@ -478,33 +467,32 @@ static bool ToPrimitive(IntPtr value, Type obType, out Object result, } else { -#elif PYTHON3 - // When using Python3 always use the PyLong API +#elif PYTHON3 // When using Python3 always use the PyLong API { #endif - op = Runtime.PyNumber_Long(value); - if (op == IntPtr.Zero) - { - Exceptions.Clear(); - if (Exceptions.ExceptionMatches(overflow)) - { - goto overflow; - } - goto type_error; - } - long ll = (long)Runtime.PyLong_AsLongLong(op); - Runtime.XDecref(op); - if ((ll == -1) && Exceptions.ErrorOccurred()) - { - goto overflow; - } - if (ll > Int32.MaxValue || ll < Int32.MinValue) + op = Runtime.PyNumber_Long(value); + if (op == IntPtr.Zero) + { + Exceptions.Clear(); + if (Exceptions.ExceptionMatches(overflow)) { goto overflow; } - result = (int)ll; - return true; + goto type_error; + } + long ll = (long)Runtime.PyLong_AsLongLong(op); + Runtime.XDecref(op); + if ((ll == -1) && Exceptions.ErrorOccurred()) + { + goto overflow; + } + if (ll > Int32.MaxValue || ll < Int32.MinValue) + { + goto overflow; } + result = (int)ll; + return true; + } case TypeCode.Boolean: result = (Runtime.PyObject_IsTrue(value) != 0); @@ -512,16 +500,16 @@ static bool ToPrimitive(IntPtr value, Type obType, out Object result, case TypeCode.Byte: #if PYTHON3 - if (Runtime.PyObject_TypeCheck(value, Runtime.PyBytesType)) - { - if (Runtime.PyBytes_Size(value) == 1) + if (Runtime.PyObject_TypeCheck(value, Runtime.PyBytesType)) { - op = Runtime.PyBytes_AS_STRING(value); - result = (byte)Marshal.ReadByte(op); - return true; + if (Runtime.PyBytes_Size(value) == 1) + { + op = Runtime.PyBytes_AS_STRING(value); + result = (byte)Marshal.ReadByte(op); + return true; + } + goto type_error; } - goto type_error; - } #elif PYTHON2 if (Runtime.PyObject_TypeCheck(value, Runtime.PyStringType)) { @@ -557,14 +545,16 @@ static bool ToPrimitive(IntPtr value, Type obType, out Object result, case TypeCode.SByte: #if PYTHON3 - if (Runtime.PyObject_TypeCheck(value, Runtime.PyBytesType)) { - if (Runtime.PyBytes_Size(value) == 1) { - op = Runtime.PyBytes_AS_STRING(value); - result = (byte)Marshal.ReadByte(op); - return true; + if (Runtime.PyObject_TypeCheck(value, Runtime.PyBytesType)) + { + if (Runtime.PyBytes_Size(value) == 1) + { + op = Runtime.PyBytes_AS_STRING(value); + result = (byte)Marshal.ReadByte(op); + return true; + } + goto type_error; } - goto type_error; - } #elif PYTHON2 if (Runtime.PyObject_TypeCheck(value, Runtime.PyStringType)) { @@ -600,14 +590,16 @@ static bool ToPrimitive(IntPtr value, Type obType, out Object result, case TypeCode.Char: #if PYTHON3 - if (Runtime.PyObject_TypeCheck(value, Runtime.PyBytesType)) { - if (Runtime.PyBytes_Size(value) == 1) { - op = Runtime.PyBytes_AS_STRING(value); - result = (byte)Marshal.ReadByte(op); - return true; + if (Runtime.PyObject_TypeCheck(value, Runtime.PyBytesType)) + { + if (Runtime.PyBytes_Size(value) == 1) + { + op = Runtime.PyBytes_AS_STRING(value); + result = (byte)Marshal.ReadByte(op); + return true; + } + goto type_error; } - goto type_error; - } #elif PYTHON2 if (Runtime.PyObject_TypeCheck(value, Runtime.PyStringType)) { @@ -620,19 +612,18 @@ static bool ToPrimitive(IntPtr value, Type obType, out Object result, goto type_error; } #endif - else if (Runtime.PyObject_TypeCheck(value, - Runtime.PyUnicodeType)) + else if (Runtime.PyObject_TypeCheck(value, Runtime.PyUnicodeType)) { if (Runtime.PyUnicode_GetSize(value) == 1) { op = Runtime.PyUnicode_AS_UNICODE(value); #if !UCS4 - // 2011-01-02: Marshal as character array because the cast - // result = (char)Marshal.ReadInt16(op); throws an OverflowException - // on negative numbers with Check Overflow option set on the project - Char[] buff = new Char[1]; - Marshal.Copy(op, buff, 0, 1); - result = buff[0]; + // 2011-01-02: Marshal as character array because the cast + // result = (char)Marshal.ReadInt16(op); throws an OverflowException + // on negative numbers with Check Overflow option set on the project + Char[] buff = new Char[1]; + Marshal.Copy(op, buff, 0, 1); + result = buff[0]; #else // XXX this is probably NOT correct? result = (char)Marshal.ReadInt32(op); @@ -830,9 +821,7 @@ static void SetConversionError(IntPtr value, Type target) IntPtr ob = Runtime.PyObject_Repr(value); string src = Runtime.GetManagedString(ob); Runtime.XDecref(ob); - string error = String.Format( - "Cannot convert {0} to {1}", src, target - ); + string error = String.Format("Cannot convert {0} to {1}", src, target); Exceptions.SetError(Exceptions.TypeError, error); } @@ -843,8 +832,7 @@ static void SetConversionError(IntPtr value, Type target) // items in the sequence must be convertible to the target array type. //==================================================================== - static bool ToArray(IntPtr value, Type obType, out Object result, - bool setError) + static bool ToArray(IntPtr value, Type obType, out Object result, bool setError) { Type elementType = obType.GetElementType(); int size = Runtime.PySequence_Size(value); @@ -861,8 +849,7 @@ static bool ToArray(IntPtr value, Type obType, out Object result, Array items = Array.CreateInstance(elementType, size); - // XXX - is there a better way to unwrap this if it is a real - // array? + // XXX - is there a better way to unwrap this if it is a real array? for (int i = 0; i < size; i++) { Object obj = null; @@ -895,8 +882,7 @@ static bool ToArray(IntPtr value, Type obType, out Object result, // Convert a Python value to a correctly typed managed enum instance. //==================================================================== - static bool ToEnum(IntPtr value, Type obType, out Object result, - bool setError) + static bool ToEnum(IntPtr value, Type obType, out Object result, bool setError) { Type etype = Enum.GetUnderlyingType(obType); result = null; diff --git a/src/runtime/debughelper.cs b/src/runtime/debughelper.cs index d65300e39..94dd026f6 100644 --- a/src/runtime/debughelper.cs +++ b/src/runtime/debughelper.cs @@ -67,7 +67,7 @@ internal static void DumpType(IntPtr type) for (int i = 0; i < slots.Length; i++) { - int offset = i*size; + int offset = i * size; name = slots[i].Name; op = Marshal.ReadIntPtr(type, offset); Console.WriteLine(" {0}: {1}", name, op); @@ -119,4 +119,4 @@ internal static void debug(string msg) return; } } -} \ No newline at end of file +} diff --git a/src/runtime/delegatemanager.cs b/src/runtime/delegatemanager.cs index 1e652214b..a9e26fb01 100644 --- a/src/runtime/delegatemanager.cs +++ b/src/runtime/delegatemanager.cs @@ -108,12 +108,7 @@ private Type GetDispatcher(Type dtype) signature[i] = pi[i].ParameterType; } - MethodBuilder mb = tb.DefineMethod( - "Invoke", - MethodAttributes.Public, - method.ReturnType, - signature - ); + MethodBuilder mb = tb.DefineMethod("Invoke", MethodAttributes.Public, method.ReturnType, signature); ConstructorInfo ctor = listtype.GetConstructor(Type.EmptyTypes); MethodInfo dispatch = basetype.GetMethod("Dispatch"); @@ -271,8 +266,7 @@ public object TrueDispatch(ArrayList args) Object result = null; if (!Converter.ToManaged(op, rtype, out result, false)) { - string s = "could not convert Python result to " + - rtype.ToString(); + string s = "could not convert Python result to " + rtype.ToString(); Runtime.XDecref(op); throw new ConversionException(s); } @@ -293,4 +287,4 @@ public ConversionException(string msg) : base(msg) { } } -} \ No newline at end of file +} diff --git a/src/runtime/delegateobject.cs b/src/runtime/delegateobject.cs index 61e91942b..2186e98ad 100644 --- a/src/runtime/delegateobject.cs +++ b/src/runtime/delegateobject.cs @@ -103,7 +103,8 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) // Implements __cmp__ for reflected delegate types. //==================================================================== #if PYTHON3 - public static new IntPtr tp_richcompare(IntPtr ob, IntPtr other, int op) { + public static new IntPtr tp_richcompare(IntPtr ob, IntPtr other, int op) + { if (op != Runtime.Py_EQ && op != Runtime.Py_NE) { Runtime.XIncref(Runtime.PyNotImplemented); diff --git a/src/runtime/eventbinding.cs b/src/runtime/eventbinding.cs index 6035c8e0b..090d812ca 100644 --- a/src/runtime/eventbinding.cs +++ b/src/runtime/eventbinding.cs @@ -29,9 +29,7 @@ public static IntPtr nb_inplace_add(IntPtr ob, IntPtr arg) if (Runtime.PyCallable_Check(arg) < 1) { - Exceptions.SetError(Exceptions.TypeError, - "event handlers must be callable" - ); + Exceptions.SetError(Exceptions.TypeError, "event handlers must be callable"); return IntPtr.Zero; } @@ -55,9 +53,7 @@ public static IntPtr nb_inplace_subtract(IntPtr ob, IntPtr arg) if (Runtime.PyCallable_Check(arg) < 1) { - Exceptions.SetError(Exceptions.TypeError, - "invalid event handler" - ); + Exceptions.SetError(Exceptions.TypeError, "invalid event handler"); return IntPtr.Zero; } @@ -131,4 +127,4 @@ public static IntPtr tp_repr(IntPtr ob) ExtensionType.FinalizeObject(self); } } -} \ No newline at end of file +} diff --git a/src/runtime/eventobject.cs b/src/runtime/eventobject.cs index 6523f7e20..191a95546 100644 --- a/src/runtime/eventobject.cs +++ b/src/runtime/eventobject.cs @@ -87,9 +87,7 @@ internal bool RemoveEventHandler(IntPtr target, IntPtr handler) IntPtr hash = Runtime.PyObject_Hash(handler); if (Exceptions.ErrorOccurred() || (reg == null)) { - Exceptions.SetError(Exceptions.ValueError, - "unknown event handler" - ); + Exceptions.SetError(Exceptions.ValueError, "unknown event handler"); return false; } @@ -98,9 +96,7 @@ internal bool RemoveEventHandler(IntPtr target, IntPtr handler) if (list == null) { - Exceptions.SetError(Exceptions.ValueError, - "unknown event handler" - ); + Exceptions.SetError(Exceptions.ValueError, "unknown event handler"); return false; } @@ -127,9 +123,7 @@ internal bool RemoveEventHandler(IntPtr target, IntPtr handler) return true; } - Exceptions.SetError(Exceptions.ValueError, - "unknown event handler" - ); + Exceptions.SetError(Exceptions.ValueError, "unknown event handler"); return false; } @@ -236,4 +230,4 @@ public Handler(IntPtr hash, Delegate d) this.del = d; } } -} \ No newline at end of file +} diff --git a/src/runtime/extensiontype.cs b/src/runtime/extensiontype.cs index 91ff5be2e..769904444 100644 --- a/src/runtime/extensiontype.cs +++ b/src/runtime/extensiontype.cs @@ -21,11 +21,12 @@ public ExtensionType() : base() IntPtr tp = TypeManager.GetTypeHandle(this.GetType()); -// int rc = (int)Marshal.ReadIntPtr(tp, TypeOffset.ob_refcnt); -// if (rc > 1050) { -// DebugUtil.Print("tp is: ", tp); -// DebugUtil.DumpType(tp); -// } + //int rc = (int)Marshal.ReadIntPtr(tp, TypeOffset.ob_refcnt); + //if (rc > 1050) + //{ + // DebugUtil.Print("tp is: ", tp); + // DebugUtil.DumpType(tp); + //} IntPtr py = Runtime.PyType_GenericAlloc(tp, 0); @@ -120,4 +121,4 @@ public static void tp_dealloc(IntPtr ob) FinalizeObject(self); } } -} \ No newline at end of file +} diff --git a/src/runtime/fieldobject.cs b/src/runtime/fieldobject.cs index d9740d9b1..53597aee7 100644 --- a/src/runtime/fieldobject.cs +++ b/src/runtime/fieldobject.cs @@ -41,9 +41,7 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) if (!info.IsStatic) { Exceptions.SetError(Exceptions.TypeError, - "instance attribute must be accessed " + - "through a class instance" - ); + "instance attribute must be accessed " + "through a class instance"); return IntPtr.Zero; } try @@ -89,9 +87,7 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) if (val == IntPtr.Zero) { - Exceptions.SetError(Exceptions.TypeError, - "cannot delete field" - ); + Exceptions.SetError(Exceptions.TypeError, "cannot delete field"); return -1; } @@ -99,9 +95,7 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) if (info.IsLiteral || info.IsInitOnly) { - Exceptions.SetError(Exceptions.TypeError, - "field is read-only" - ); + Exceptions.SetError(Exceptions.TypeError, "field is read-only"); return -1; } @@ -112,15 +106,12 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) if (!is_static) { Exceptions.SetError(Exceptions.TypeError, - "instance attribute must be set " + - "through a class instance" - ); + "instance attribute must be set " + "through a class instance"); return -1; } } - if (!Converter.ToManaged(val, info.FieldType, out newval, - true)) + if (!Converter.ToManaged(val, info.FieldType, out newval, true)) { return -1; } @@ -156,4 +147,4 @@ public static IntPtr tp_repr(IntPtr ob) return Runtime.PyString_FromStringAndSize(s, s.Length); } } -} \ No newline at end of file +} diff --git a/src/runtime/generictype.cs b/src/runtime/generictype.cs index d5caec38e..19cde37bf 100644 --- a/src/runtime/generictype.cs +++ b/src/runtime/generictype.cs @@ -21,9 +21,7 @@ internal GenericType(Type tp) : base(tp) public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) { - Exceptions.SetError(Exceptions.TypeError, - "cannot instantiate an open generic type" - ); + Exceptions.SetError(Exceptions.TypeError, "cannot instantiate an open generic type"); return IntPtr.Zero; } @@ -34,9 +32,8 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) { - Exceptions.SetError(Exceptions.TypeError, - "object is not callable"); + Exceptions.SetError(Exceptions.TypeError, "object is not callable"); return IntPtr.Zero; } } -} \ No newline at end of file +} diff --git a/src/runtime/genericutil.cs b/src/runtime/genericutil.cs index 18d59602a..9870b2a5b 100644 --- a/src/runtime/genericutil.cs +++ b/src/runtime/genericutil.cs @@ -21,8 +21,7 @@ private GenericUtil() static GenericUtil() { - mapping = new - Dictionary>>(); + mapping = new Dictionary>>(); } //==================================================================== @@ -162,4 +161,4 @@ public static string GenericNameForBaseName(string ns, string name) return null; } } -} \ No newline at end of file +} diff --git a/src/runtime/importhook.cs b/src/runtime/importhook.cs index dca5a53b4..851bf49d7 100644 --- a/src/runtime/importhook.cs +++ b/src/runtime/importhook.cs @@ -76,7 +76,8 @@ internal static void Initialize() internal static void Shutdown() { - if (0 != Runtime.Py_IsInitialized()) { + if (0 != Runtime.Py_IsInitialized()) + { #if PYTHON3 Runtime.XDecref(py_clr_module); #elif PYTHON2 @@ -94,23 +95,27 @@ public static IntPtr GetCLRModule(IntPtr? fromList = null) { root.InitializePreload(); #if PYTHON3 - // update the module dictionary with the contents of the root dictionary + // update the module dictionary with the contents of the root dictionary root.LoadNames(); IntPtr py_mod_dict = Runtime.PyModule_GetDict(py_clr_module); IntPtr clr_dict = Runtime._PyObject_GetDictPtr(root.pyHandle); // PyObject** clr_dict = (IntPtr)Marshal.PtrToStructure(clr_dict, typeof(IntPtr)); Runtime.PyDict_Update(py_mod_dict, clr_dict); - // find any items from the fromlist and get them from the root if they're not - // aleady in the module dictionary - if (fromList != null && fromList != IntPtr.Zero) { + // find any items from the from list and get them from the root if they're not + // already in the module dictionary + if (fromList != null && fromList != IntPtr.Zero) + { if (Runtime.PyTuple_Check(fromList.GetValueOrDefault())) { Runtime.XIncref(py_mod_dict); - using(PyDict mod_dict = new PyDict(py_mod_dict)) { + using (PyDict mod_dict = new PyDict(py_mod_dict)) + { Runtime.XIncref(fromList.GetValueOrDefault()); - using (PyTuple from = new PyTuple(fromList.GetValueOrDefault())) { - foreach (PyObject item in from) { + using (PyTuple from = new PyTuple(fromList.GetValueOrDefault())) + { + foreach (PyObject item in from) + { if (mod_dict.HasKey(item)) continue; @@ -123,7 +128,8 @@ public static IntPtr GetCLRModule(IntPtr? fromList = null) continue; Runtime.XIncref(attr.pyHandle); - using (PyObject obj = new PyObject(attr.pyHandle)) { + using (PyObject obj = new PyObject(attr.pyHandle)) + { mod_dict.SetItem(s, obj); } } @@ -153,9 +159,7 @@ public static IntPtr __import__(IntPtr self, IntPtr args, IntPtr kw) int num_args = Runtime.PyTuple_Size(args); if (num_args < 1) { - return Exceptions.RaiseTypeError( - "__import__() takes at least 1 argument (0 given)" - ); + return Exceptions.RaiseTypeError("__import__() takes at least 1 argument (0 given)"); } // borrowed reference @@ -200,8 +204,7 @@ public static IntPtr __import__(IntPtr self, IntPtr args, IntPtr kw) } if (mod_name == "CLR") { - Exceptions.deprecation("The CLR module is deprecated. " + - "Please use 'clr'."); + Exceptions.deprecation("The CLR module is deprecated. " + "Please use 'clr'."); IntPtr clr_module = GetCLRModule(fromList); if (clr_module != IntPtr.Zero) { @@ -337,16 +340,12 @@ public static IntPtr __import__(IntPtr self, IntPtr args, IntPtr kw) } // Add the module to sys.modules - Runtime.PyDict_SetItemString(modules, - tail.moduleName, - tail.pyHandle); + Runtime.PyDict_SetItemString(modules, tail.moduleName, tail.pyHandle); // If imported from CLR add CLR. to sys.modules as well if (clr_prefix != null) { - Runtime.PyDict_SetItemString(modules, - clr_prefix + tail.moduleName, - tail.pyHandle); + Runtime.PyDict_SetItemString(modules, clr_prefix + tail.moduleName, tail.pyHandle); } } diff --git a/src/runtime/indexer.cs b/src/runtime/indexer.cs index 86e290d5b..06355c9f7 100644 --- a/src/runtime/indexer.cs +++ b/src/runtime/indexer.cs @@ -111,4 +111,4 @@ internal IntPtr GetDefaultArgs(IntPtr args) return defaultArgs; } } -} \ No newline at end of file +} diff --git a/src/runtime/interfaceobject.cs b/src/runtime/interfaceobject.cs index f550a95a8..076ecc727 100644 --- a/src/runtime/interfaceobject.cs +++ b/src/runtime/interfaceobject.cs @@ -16,8 +16,7 @@ internal class InterfaceObject : ClassBase internal InterfaceObject(Type tp) : base(tp) { - CoClassAttribute coclass = (CoClassAttribute) - Attribute.GetCustomAttribute(tp, cc_attr); + CoClassAttribute coclass = (CoClassAttribute)Attribute.GetCustomAttribute(tp, cc_attr); if (coclass != null) { ctor = coclass.CoClass.GetConstructor(Type.EmptyTypes); @@ -63,22 +62,18 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) if (obj == null || !type.IsInstanceOfType(obj)) { - Exceptions.SetError(Exceptions.TypeError, - "CoClass default constructor failed" - ); + Exceptions.SetError(Exceptions.TypeError, "CoClass default constructor failed"); return IntPtr.Zero; } } else { - Exceptions.SetError(Exceptions.TypeError, - "interface takes exactly one argument" - ); + Exceptions.SetError(Exceptions.TypeError, "interface takes exactly one argument"); return IntPtr.Zero; } return CLRObject.GetInstHandle(obj, self.pyHandle); } } -} \ No newline at end of file +} diff --git a/src/runtime/interfaces.cs b/src/runtime/interfaces.cs index 28f343529..d0edfbf9c 100644 --- a/src/runtime/interfaces.cs +++ b/src/runtime/interfaces.cs @@ -29,4 +29,4 @@ internal interface IReflectedArray : IReflectedType internal interface IReflectedGenericClass : IReflectedClass { } -} \ No newline at end of file +} diff --git a/src/runtime/interop.cs b/src/runtime/interop.cs index 3dc5ad827..9be8169d2 100644 --- a/src/runtime/interop.cs +++ b/src/runtime/interop.cs @@ -81,16 +81,16 @@ static ObjectOffset() _ob_prev = 1 * size; n = 2; #endif - ob_refcnt = (n + 0)*size; - ob_type = (n + 1)*size; - ob_dict = (n + 2)*size; - ob_data = (n + 3)*size; + ob_refcnt = (n + 0) * size; + ob_type = (n + 1) * size; + ob_dict = (n + 2) * size; + ob_data = (n + 3) * size; } public static int magic(IntPtr ob) { if ((Runtime.PyObject_TypeCheck(ob, Exceptions.BaseException) || - (Runtime.PyType_Check(ob) && Runtime.PyType_IsSubtype(ob, Exceptions.BaseException)))) + (Runtime.PyType_Check(ob) && Runtime.PyType_IsSubtype(ob, Exceptions.BaseException)))) { return ExceptionOffset.ob_data; } @@ -100,7 +100,7 @@ public static int magic(IntPtr ob) public static int DictOffset(IntPtr ob) { if ((Runtime.PyObject_TypeCheck(ob, Exceptions.BaseException) || - (Runtime.PyType_Check(ob) && Runtime.PyType_IsSubtype(ob, Exceptions.BaseException)))) + (Runtime.PyType_Check(ob) && Runtime.PyType_IsSubtype(ob, Exceptions.BaseException)))) { return ExceptionOffset.ob_dict; } @@ -110,7 +110,7 @@ public static int DictOffset(IntPtr ob) public static int Size(IntPtr ob) { if ((Runtime.PyObject_TypeCheck(ob, Exceptions.BaseException) || - (Runtime.PyType_Check(ob) && Runtime.PyType_IsSubtype(ob, Exceptions.BaseException)))) + (Runtime.PyType_Check(ob) && Runtime.PyType_IsSubtype(ob, Exceptions.BaseException)))) { return ExceptionOffset.Size(); } @@ -186,7 +186,7 @@ static BytesOffset() /* The *real* layout of a type object when allocated on the heap */ //typedef struct _heaptypeobject { -#if Py_DEBUG // #ifdef Py_TRACE_REFS +#if Py_DEBUG // #ifdef Py_TRACE_REFS /* _PyObject_HEAD_EXTRA defines pointers to support a doubly-linked list of all live heap objects. */ public static int _ob_next = 0; public static int _ob_prev = 0; @@ -196,7 +196,7 @@ static BytesOffset() public static int ob_refcnt = 0; public static int ob_type = 0; // } - public static int ob_size = 0; /* Number of items in _VAR_iable part */ + public static int ob_size = 0; /* Number of items in _VAR_iable part */ // } public static int ob_shash = 0; public static int ob_sval = 0; /* start of data */ @@ -223,7 +223,8 @@ static ModuleDefOffset() } } - public static IntPtr AllocModuleDef(string modulename) { + public static IntPtr AllocModuleDef(string modulename) + { byte[] ascii = Encoding.ASCII.GetBytes(modulename); int size = name + ascii.Length + 1; IntPtr ptr = Marshal.AllocHGlobal(size); @@ -235,7 +236,8 @@ public static IntPtr AllocModuleDef(string modulename) { return ptr; } - public static void FreeModuleDef(IntPtr ptr) { + public static void FreeModuleDef(IntPtr ptr) + { Marshal.FreeHGlobal(ptr); } @@ -268,8 +270,7 @@ public static void FreeModuleDef(IntPtr ptr) { /// internal class TypeFlags { -#if PYTHON2 - // these flags were removed in Python 3 +#if PYTHON2 // these flags were removed in Python 3 public static int HaveGetCharBuffer = (1 << 0); public static int HaveSequenceIn = (1 << 1); public static int GC = 0; @@ -307,8 +308,7 @@ internal class TypeFlags public static int BaseExceptionSubclass = (1 << 30); public static int TypeSubclass = (1 << 31); -#if PYTHON2 - // Default flags for Python 2 +#if PYTHON2 // Default flags for Python 2 public static int Default = ( HaveGetCharBuffer | HaveSequenceIn | @@ -318,13 +318,12 @@ internal class TypeFlags HaveIter | HaveClass | HaveStacklessExtension | - HaveIndex | - 0); -#elif PYTHON3 - // Default flags for Python 3 + HaveIndex | + 0); +#elif PYTHON3 // Default flags for Python 3 public static int Default = ( - HaveStacklessExtension | - HaveVersionTag); + HaveStacklessExtension | + HaveVersionTag); #endif } diff --git a/src/runtime/iterator.cs b/src/runtime/iterator.cs index c9b232e5e..dcab722f1 100644 --- a/src/runtime/iterator.cs +++ b/src/runtime/iterator.cs @@ -41,4 +41,4 @@ public static IntPtr tp_iter(IntPtr ob) return ob; } } -} \ No newline at end of file +} diff --git a/src/runtime/managedtype.cs b/src/runtime/managedtype.cs index 782865f93..ebb2057b9 100644 --- a/src/runtime/managedtype.cs +++ b/src/runtime/managedtype.cs @@ -51,9 +51,7 @@ internal static ManagedType GetManagedObjectErr(IntPtr ob) ManagedType result = GetManagedObject(ob); if (result == null) { - Exceptions.SetError(Exceptions.TypeError, - "invalid argument, expected CLR type" - ); + Exceptions.SetError(Exceptions.TypeError, "invalid argument, expected CLR type"); } return result; } @@ -78,4 +76,4 @@ internal static bool IsManagedType(IntPtr ob) return false; } } -} \ No newline at end of file +} diff --git a/src/runtime/metatype.cs b/src/runtime/metatype.cs index b2ad78078..b1761c2d7 100644 --- a/src/runtime/metatype.cs +++ b/src/runtime/metatype.cs @@ -51,9 +51,7 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) if (Runtime.PyTuple_Size(bases) != 1) { - return Exceptions.RaiseTypeError( - "cannot use multiple inheritance with managed classes" - ); + return Exceptions.RaiseTypeError("cannot use multiple inheritance with managed classes"); } IntPtr base_type = Runtime.PyTuple_GetItem(bases, 0); @@ -72,18 +70,14 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) { if (!cb.CanSubclass()) { - return Exceptions.RaiseTypeError( - "delegates, enums and array types cannot be subclassed" - ); + return Exceptions.RaiseTypeError("delegates, enums and array types cannot be subclassed"); } } IntPtr slots = Runtime.PyDict_GetItemString(dict, "__slots__"); if (slots != IntPtr.Zero) { - return Exceptions.RaiseTypeError( - "subclasses of managed classes do not support __slots__" - ); + return Exceptions.RaiseTypeError("subclasses of managed classes do not support __slots__"); } // If __assembly__ or __namespace__ are in the class dictionary then create @@ -101,8 +95,7 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) } // otherwise just create a basic type without reflecting back into the managed side. - IntPtr func = Marshal.ReadIntPtr(Runtime.PyTypeType, - TypeOffset.tp_new); + IntPtr func = Marshal.ReadIntPtr(Runtime.PyTypeType, TypeOffset.tp_new); IntPtr type = NativeCall.Call_3(func, tp, args, kw); if (type == IntPtr.Zero) { @@ -227,8 +220,7 @@ public static int tp_setattro(IntPtr tp, IntPtr name, IntPtr value) } else { - Exceptions.SetError(Exceptions.AttributeError, - "attribute is read-only"); + Exceptions.SetError(Exceptions.AttributeError, "attribute is read-only"); return -1; } } diff --git a/src/runtime/methodbinder.cs b/src/runtime/methodbinder.cs index c3b3e4a70..c4d41d156 100644 --- a/src/runtime/methodbinder.cs +++ b/src/runtime/methodbinder.cs @@ -198,23 +198,38 @@ internal static int GetPrecedence(MethodBase mi) internal static int ArgPrecedence(Type t) { Type objectType = typeof(Object); - if (t == objectType) return 3000; + if (t == objectType) + return 3000; TypeCode tc = Type.GetTypeCode(t); - if (tc == TypeCode.Object) return 1; - if (tc == TypeCode.UInt64) return 10; - if (tc == TypeCode.UInt32) return 11; - if (tc == TypeCode.UInt16) return 12; - if (tc == TypeCode.Int64) return 13; - if (tc == TypeCode.Int32) return 14; - if (tc == TypeCode.Int16) return 15; - if (tc == TypeCode.Char) return 16; - if (tc == TypeCode.SByte) return 17; - if (tc == TypeCode.Byte) return 18; - if (tc == TypeCode.Single) return 20; - if (tc == TypeCode.Double) return 21; - if (tc == TypeCode.String) return 30; - if (tc == TypeCode.Boolean) return 40; + if (tc == TypeCode.Object) + return 1; + if (tc == TypeCode.UInt64) + return 10; + if (tc == TypeCode.UInt32) + return 11; + if (tc == TypeCode.UInt16) + return 12; + if (tc == TypeCode.Int64) + return 13; + if (tc == TypeCode.Int32) + return 14; + if (tc == TypeCode.Int16) + return 15; + if (tc == TypeCode.Char) + return 16; + if (tc == TypeCode.SByte) + return 17; + if (tc == TypeCode.Byte) + return 18; + if (tc == TypeCode.Single) + return 20; + if (tc == TypeCode.Double) + return 21; + if (tc == TypeCode.String) + return 30; + if (tc == TypeCode.Boolean) + return 40; if (t.IsArray) { @@ -238,14 +253,12 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw) return this.Bind(inst, args, kw, null, null); } - internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, - MethodBase info) + internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info) { return this.Bind(inst, args, kw, info, null); } - internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, - MethodBase info, MethodInfo[] methodinfo) + internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, MethodInfo[] methodinfo) { // loop to find match, return invoker w/ or /wo error MethodBase[] _methods = null; @@ -255,9 +268,7 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, ArrayList defaultArgList = null; if (info != null) { - _methods = (MethodBase[])Array.CreateInstance( - typeof(MethodBase), 1 - ); + _methods = (MethodBase[])Array.CreateInstance(typeof(MethodBase), 1); _methods.SetValue(info, 0); } else @@ -461,14 +472,12 @@ internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw) return this.Invoke(inst, args, kw, null, null); } - internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw, - MethodBase info) + internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info) { return this.Invoke(inst, args, kw, info, null); } - internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw, - MethodBase info, MethodInfo[] methodinfo) + internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, MethodInfo[] methodinfo) { Binding binding = this.Bind(inst, args, kw, info, methodinfo); Object result; @@ -476,9 +485,7 @@ internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw, if (binding == null) { - Exceptions.SetError(Exceptions.TypeError, - "No method matches given arguments" - ); + Exceptions.SetError(Exceptions.TypeError, "No method matches given arguments"); return IntPtr.Zero; } @@ -489,11 +496,7 @@ internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw, try { - result = binding.info.Invoke(binding.inst, - BindingFlags.Default, - null, - binding.args, - null); + result = binding.info.Invoke(binding.inst, BindingFlags.Default, null, binding.args, null); } catch (Exception e) { @@ -574,8 +577,10 @@ int IComparer.Compare(Object m1, Object m2) { int p1 = MethodBinder.GetPrecedence((MethodBase)m1); int p2 = MethodBinder.GetPrecedence((MethodBase)m2); - if (p1 < p2) return -1; - if (p1 > p2) return 1; + if (p1 < p2) + return -1; + if (p1 > p2) + return 1; return 0; } } @@ -594,8 +599,7 @@ internal class Binding public Object inst; public int outs; - internal Binding(MethodBase info, Object inst, Object[] args, - int outs) + internal Binding(MethodBase info, Object inst, Object[] args, int outs) { this.info = info; this.inst = inst; @@ -603,4 +607,4 @@ internal Binding(MethodBase info, Object inst, Object[] args, this.outs = outs; } } -} \ No newline at end of file +} diff --git a/src/runtime/methodbinding.cs b/src/runtime/methodbinding.cs index d8fec069c..9d328381f 100644 --- a/src/runtime/methodbinding.cs +++ b/src/runtime/methodbinding.cs @@ -117,7 +117,8 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) { Type[] genericTp = self.info.GetGenericArguments(); MethodInfo betterMatch = MethodBinder.MatchSignatureAndParameters(self.m.info, genericTp, sigTp); - if (betterMatch != null) self.info = betterMatch; + if (betterMatch != null) + self.info = betterMatch; } } } @@ -245,4 +246,4 @@ public static IntPtr tp_repr(IntPtr ob) ExtensionType.FinalizeObject(self); } } -} \ No newline at end of file +} diff --git a/src/runtime/methodobject.cs b/src/runtime/methodobject.cs index 20f757d58..b3e1a66c5 100644 --- a/src/runtime/methodobject.cs +++ b/src/runtime/methodobject.cs @@ -53,8 +53,7 @@ public virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw) return this.Invoke(inst, args, kw, null); } - public virtual IntPtr Invoke(IntPtr target, IntPtr args, IntPtr kw, - MethodBase info) + public virtual IntPtr Invoke(IntPtr target, IntPtr args, IntPtr kw, MethodBase info) { return binder.Invoke(target, args, kw, info, this.info); } @@ -210,4 +209,4 @@ public static IntPtr tp_repr(IntPtr ob) ExtensionType.FinalizeObject(self); } } -} \ No newline at end of file +} diff --git a/src/runtime/methodwrapper.cs b/src/runtime/methodwrapper.cs index 53c0a3cc9..71932ddd0 100644 --- a/src/runtime/methodwrapper.cs +++ b/src/runtime/methodwrapper.cs @@ -24,7 +24,7 @@ public MethodWrapper(Type type, string name, string funcType = null) // Allocate and initialize a PyMethodDef structure to represent // the managed method, then create a PyCFunction. - mdef = Runtime.PyMem_Malloc(4*IntPtr.Size); + mdef = Runtime.PyMem_Malloc(4 * IntPtr.Size); TypeManager.WriteMethodDef(mdef, name, fp, 0x0003); ptr = Runtime.PyCFunction_NewEx(mdef, IntPtr.Zero, IntPtr.Zero); } @@ -34,4 +34,4 @@ public IntPtr Call(IntPtr args, IntPtr kw) return Runtime.PyCFunction_Call(ptr, args, kw); } } -} \ No newline at end of file +} diff --git a/src/runtime/modulefunctionobject.cs b/src/runtime/modulefunctionobject.cs index efd0384c4..667b37fe9 100644 --- a/src/runtime/modulefunctionobject.cs +++ b/src/runtime/modulefunctionobject.cs @@ -43,4 +43,4 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) return Runtime.PyString_FromStringAndSize(s, s.Length); } } -} \ No newline at end of file +} diff --git a/src/runtime/moduleobject.cs b/src/runtime/moduleobject.cs index 87e3ed2f1..c4fec976b 100644 --- a/src/runtime/moduleobject.cs +++ b/src/runtime/moduleobject.cs @@ -159,8 +159,7 @@ public ManagedType GetAttribute(string name, bool guess) if (guess) { - string gname = GenericUtil.GenericNameForBaseName( - _namespace, name); + string gname = GenericUtil.GenericNameForBaseName(_namespace, name); if (gname != null) { ManagedType o = GetAttribute(gname, false); @@ -447,4 +446,4 @@ public static int _AtExit() return Runtime.AtExit(); } } -} \ No newline at end of file +} diff --git a/src/runtime/modulepropertyobject.cs b/src/runtime/modulepropertyobject.cs index 1f67f89ec..7f7841890 100644 --- a/src/runtime/modulepropertyobject.cs +++ b/src/runtime/modulepropertyobject.cs @@ -15,4 +15,4 @@ public ModulePropertyObject(PropertyInfo md) : base() throw new NotImplementedException("ModulePropertyObject"); } } -} \ No newline at end of file +} diff --git a/src/runtime/monosupport.cs b/src/runtime/monosupport.cs index 52c2921da..7ddf9aa1a 100644 --- a/src/runtime/monosupport.cs +++ b/src/runtime/monosupport.cs @@ -6,12 +6,9 @@ namespace Python.Runtime { - // The Utf32Marshaler was written Jonathan Pryor and has been placed - // in the PUBLIC DOMAIN. public class Utf32Marshaler : ICustomMarshaler { - private static Utf32Marshaler instance = new - Utf32Marshaler(); + private static Utf32Marshaler instance = new Utf32Marshaler(); public static ICustomMarshaler GetInstance(string s) { @@ -37,17 +34,13 @@ public IntPtr MarshalManagedToNative(object obj) string s = obj as string; if (s == null) return IntPtr.Zero; - return UnixMarshal.StringToHeap(s, - Encoding.UTF32); + return UnixMarshal.StringToHeap(s, Encoding.UTF32); } - public object MarshalNativeToManaged(IntPtr - pNativeData) + public object MarshalNativeToManaged(IntPtr pNativeData) { - return UnixMarshal.PtrToString(pNativeData, - Encoding.UTF32); + return UnixMarshal.PtrToString(pNativeData, Encoding.UTF32); } } } - #endif diff --git a/src/runtime/nativecall.cs b/src/runtime/nativecall.cs index a37729ab2..7eb8b87c8 100644 --- a/src/runtime/nativecall.cs +++ b/src/runtime/nativecall.cs @@ -128,14 +128,12 @@ public static void Void_Call_1(IntPtr fp, IntPtr a1) Impl.Void_Call_1(fp, a1); } - public static IntPtr Call_3(IntPtr fp, IntPtr a1, IntPtr a2, - IntPtr a3) + public static IntPtr Call_3(IntPtr fp, IntPtr a1, IntPtr a2, IntPtr a3) { return Impl.Call_3(fp, a1, a2, a3); } - public static int Int_Call_3(IntPtr fp, IntPtr a1, IntPtr a2, - IntPtr a3) + public static int Int_Call_3(IntPtr fp, IntPtr a1, IntPtr a2, IntPtr a3) { return Impl.Int_Call_3(fp, a1, a2, a3); } @@ -155,4 +153,4 @@ public interface INativeCall IntPtr Call_3(IntPtr funcPtr, IntPtr a1, IntPtr a2, IntPtr a3); } -} \ No newline at end of file +} diff --git a/src/runtime/overload.cs b/src/runtime/overload.cs index 2a339df66..e7d548a23 100644 --- a/src/runtime/overload.cs +++ b/src/runtime/overload.cs @@ -74,4 +74,4 @@ public static IntPtr tp_repr(IntPtr op) ExtensionType.FinalizeObject(self); } } -} \ No newline at end of file +} diff --git a/src/runtime/propertyobject.cs b/src/runtime/propertyobject.cs index 5bbf94d1a..bfb70899f 100644 --- a/src/runtime/propertyobject.cs +++ b/src/runtime/propertyobject.cs @@ -47,9 +47,7 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) if (!(getter.IsStatic)) { Exceptions.SetError(Exceptions.TypeError, - "instance property must be accessed through " + - "a class instance" - ); + "instance property must be accessed through " + "a class instance"); return IntPtr.Zero; } @@ -112,8 +110,7 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) } - if (!Converter.ToManaged(val, self.info.PropertyType, out newval, - true)) + if (!Converter.ToManaged(val, self.info.PropertyType, out newval, true)) { return -1; } @@ -124,9 +121,7 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) { if (!(is_static)) { - Exceptions.RaiseTypeError( - "instance property must be set on an instance" - ); + Exceptions.RaiseTypeError("instance property must be set on an instance"); return -1; } } @@ -172,4 +167,4 @@ public static IntPtr tp_repr(IntPtr ob) return Runtime.PyString_FromStringAndSize(s, s.Length); } } -} \ No newline at end of file +} diff --git a/src/runtime/pyansistring.cs b/src/runtime/pyansistring.cs index 1a2cb7955..71dec3362 100644 --- a/src/runtime/pyansistring.cs +++ b/src/runtime/pyansistring.cs @@ -27,8 +27,7 @@ public PyAnsiString(IntPtr ptr) : base(ptr) /// An ArgumentException will be thrown if the given object is not /// a Python string object. /// - public PyAnsiString(PyObject o) - : base() + public PyAnsiString(PyObject o) : base() { if (!IsStringType(o)) { @@ -46,8 +45,7 @@ public PyAnsiString(PyObject o) /// /// Creates a Python string from a managed string. /// - public PyAnsiString(string s) - : base() + public PyAnsiString(string s) : base() { obj = Runtime.PyString_FromStringAndSize(s, s.Length); if (obj == IntPtr.Zero) @@ -69,4 +67,4 @@ public static bool IsStringType(PyObject value) return Runtime.PyString_Check(value.obj); } } -} \ No newline at end of file +} diff --git a/src/runtime/pydict.cs b/src/runtime/pydict.cs index fc8b98377..0d1449862 100644 --- a/src/runtime/pydict.cs +++ b/src/runtime/pydict.cs @@ -201,4 +201,4 @@ public void Clear() Runtime.PyDict_Clear(obj); } } -} \ No newline at end of file +} diff --git a/src/runtime/pyfloat.cs b/src/runtime/pyfloat.cs index 27a13f184..c8a363ea8 100644 --- a/src/runtime/pyfloat.cs +++ b/src/runtime/pyfloat.cs @@ -113,4 +113,4 @@ public static PyFloat AsFloat(PyObject value) return new PyFloat(op); } } -} \ No newline at end of file +} diff --git a/src/runtime/pyint.cs b/src/runtime/pyint.cs index 935f54a8b..847ad2ebf 100644 --- a/src/runtime/pyint.cs +++ b/src/runtime/pyint.cs @@ -252,4 +252,4 @@ public long ToInt64() return System.Convert.ToInt64(this.ToInt32()); } } -} \ No newline at end of file +} diff --git a/src/runtime/pyiter.cs b/src/runtime/pyiter.cs index 5d11fb4d4..5310c4d8b 100644 --- a/src/runtime/pyiter.cs +++ b/src/runtime/pyiter.cs @@ -79,4 +79,4 @@ public object Current #endregion } -} \ No newline at end of file +} diff --git a/src/runtime/pylist.cs b/src/runtime/pylist.cs index bdbc806fd..681e864a4 100644 --- a/src/runtime/pylist.cs +++ b/src/runtime/pylist.cs @@ -182,4 +182,4 @@ public void Sort() } } } -} \ No newline at end of file +} diff --git a/src/runtime/pylong.cs b/src/runtime/pylong.cs index 63c613402..8e17d2a59 100644 --- a/src/runtime/pylong.cs +++ b/src/runtime/pylong.cs @@ -287,4 +287,4 @@ public long ToInt64() return Runtime.PyLong_AsLongLong(obj); } } -} \ No newline at end of file +} diff --git a/src/runtime/pynumber.cs b/src/runtime/pynumber.cs index c8da3e7a6..e6805d708 100644 --- a/src/runtime/pynumber.cs +++ b/src/runtime/pynumber.cs @@ -33,4 +33,4 @@ public static bool IsNumberType(PyObject value) // TODO: add all of the PyNumber_XXX methods. } -} \ No newline at end of file +} diff --git a/src/runtime/pyobject.cs b/src/runtime/pyobject.cs index 781f6313d..19a2f178b 100644 --- a/src/runtime/pyobject.cs +++ b/src/runtime/pyobject.cs @@ -126,7 +126,7 @@ protected virtual void Dispose(bool disposing) disposed = true; } } - + public void Dispose() { Dispose(true); @@ -1189,4 +1189,4 @@ public override bool TryUnaryOperation(UnaryOperationBinder binder, out Object r return true; } } -} \ No newline at end of file +} diff --git a/src/runtime/pysequence.cs b/src/runtime/pysequence.cs index d32921901..a5f6f3dad 100644 --- a/src/runtime/pysequence.cs +++ b/src/runtime/pysequence.cs @@ -160,4 +160,4 @@ public PyObject Repeat(int count) return new PyObject(op); } } -} \ No newline at end of file +} diff --git a/src/runtime/pystring.cs b/src/runtime/pystring.cs index 46b8fd657..a3d198a2c 100644 --- a/src/runtime/pystring.cs +++ b/src/runtime/pystring.cs @@ -72,4 +72,4 @@ public static bool IsStringType(PyObject value) return Runtime.PyString_Check(value.obj); } } -} \ No newline at end of file +} diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index 754aaf2cd..3f0022467 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -217,11 +217,10 @@ public static void Initialize(IEnumerable args) //==================================================================== #if PYTHON3 public static IntPtr InitExt() - { #elif PYTHON2 public static void InitExt() - { #endif + { try { Initialize(); diff --git a/src/runtime/pythonexception.cs b/src/runtime/pythonexception.cs index 2999432c1..124636457 100644 --- a/src/runtime/pythonexception.cs +++ b/src/runtime/pythonexception.cs @@ -176,4 +176,4 @@ public static bool Matches(IntPtr ob) return Runtime.PyErr_ExceptionMatches(ob) != 0; } } -} \ No newline at end of file +} diff --git a/src/runtime/pytuple.cs b/src/runtime/pytuple.cs index 123ad4359..97f4c5bbc 100644 --- a/src/runtime/pytuple.cs +++ b/src/runtime/pytuple.cs @@ -115,4 +115,4 @@ public static PyTuple AsTuple(PyObject value) return new PyTuple(op); } } -} \ No newline at end of file +} diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 9b5c4ffb5..f79daa970 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -14,15 +14,18 @@ namespace Python.Runtime static class NativeMethods { #if MONO_LINUX || MONO_OSX - static public IntPtr LoadLibrary(string fileName) { + static public IntPtr LoadLibrary(string fileName) + { return dlopen(fileName, RTLD_NOW | RTLD_SHARED); } - static public void FreeLibrary(IntPtr handle) { + static public void FreeLibrary(IntPtr handle) + { dlclose(handle); } - static public IntPtr GetProcAddress(IntPtr dllHandle, string name) { + static public IntPtr GetProcAddress(IntPtr dllHandle, string name) + { // look in the exe if dllHandle is NULL if (IntPtr.Zero == dllHandle) dllHandle = RTLD_DEFAULT; @@ -31,7 +34,8 @@ static public IntPtr GetProcAddress(IntPtr dllHandle, string name) { dlerror(); var res = dlsym(dllHandle, name); var errPtr = dlerror(); - if (errPtr != IntPtr.Zero) { + if (errPtr != IntPtr.Zero) + { throw new Exception("dlsym: " + Marshal.PtrToStringAnsi(errPtr)); } return res; @@ -72,6 +76,7 @@ static public IntPtr GetProcAddress(IntPtr dllHandle, string name) { #endif #else // Windows + [DllImport("kernel32.dll")] public static extern IntPtr LoadLibrary(string dllToLoad); @@ -113,8 +118,7 @@ public class Runtime #elif PYTHON36 public const string pyversion = "3.6"; public const int pyversionnumber = 36; -#elif PYTHON37 - // TODO: Add interop37 after Python3.7 is released +#elif PYTHON37 // TODO: Add interop37 after Python3.7 is released public const string pyversion = "3.7"; public const int pyversionnumber = 37; #else @@ -270,8 +274,8 @@ internal static void Initialize() Runtime.XDecref(op); #if PYTHON3 - PyClassType = IntPtr.Zero; - PyInstanceType = IntPtr.Zero; + PyClassType = IntPtr.Zero; + PyInstanceType = IntPtr.Zero; #elif PYTHON2 IntPtr s = Runtime.PyString_FromString("_temp"); IntPtr d = Runtime.PyDict_New(); @@ -291,15 +295,17 @@ internal static void Initialize() Error = new IntPtr(-1); #if PYTHON3 - IntPtr dll = IntPtr.Zero; - if ("__Internal" != Runtime.dll) { - NativeMethods.LoadLibrary(Runtime.dll); - } - _PyObject_NextNotImplemented = NativeMethods.GetProcAddress(dll, "_PyObject_NextNotImplemented"); + IntPtr dll = IntPtr.Zero; + if ("__Internal" != Runtime.dll) + { + NativeMethods.LoadLibrary(Runtime.dll); + } + _PyObject_NextNotImplemented = NativeMethods.GetProcAddress(dll, "_PyObject_NextNotImplemented"); #if !(MONO_LINUX || MONO_OSX) - if (IntPtr.Zero != dll) { - NativeMethods.FreeLibrary(dll); - } + if (IntPtr.Zero != dll) + { + NativeMethods.FreeLibrary(dll); + } #endif #endif @@ -500,9 +506,9 @@ internal static Type[] PythonArgsToTypeArray(IntPtr arg, bool mangleObjects) internal unsafe static void XIncref(IntPtr op) { #if Py_DEBUG - // according to Python doc, Py_IncRef() is Py_XINCREF() - Py_IncRef(op); - return; + // according to Python doc, Py_IncRef() is Py_XINCREF() + Py_IncRef(op); + return; #else void* p = (void*)op; if ((void*)0 != p) @@ -522,10 +528,10 @@ internal unsafe static void XIncref(IntPtr op) internal static unsafe void XDecref(IntPtr op) { #if Py_DEBUG - // Py_DecRef calls Python's Py_DECREF - // according to Python doc, Py_DecRef() is Py_XDECREF() - Py_DecRef(op); - return; + // Py_DecRef calls Python's Py_DECREF + // according to Python doc, Py_DecRef() is Py_XDECREF() + Py_DecRef(op); + return; #else void* p = (void*)op; if ((void*)0 != p) @@ -577,17 +583,17 @@ internal unsafe static long Refcount(IntPtr op) } #if Py_DEBUG - // Py_IncRef and Py_DecRef are taking care of the extra payload - // in Py_DEBUG builds of Python like _Py_RefTotal - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - private unsafe static extern void - Py_IncRef(IntPtr ob); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - private unsafe static extern void - Py_DecRef(IntPtr ob); + // Py_IncRef and Py_DecRef are taking care of the extra payload + // in Py_DEBUG builds of Python like _Py_RefTotal + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + private unsafe static extern void + Py_IncRef(IntPtr ob); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + private unsafe static extern void + Py_DecRef(IntPtr ob); #endif [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, @@ -663,10 +669,10 @@ internal unsafe static extern IntPtr PyGILState_GetThisThreadState(); #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - public unsafe static extern int - Py_Main(int argc, [MarshalAsAttribute(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPWStr)] string[] argv); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + public unsafe static extern int + Py_Main(int argc, [MarshalAsAttribute(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] argv); #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] @@ -731,38 +737,38 @@ internal unsafe static extern IntPtr #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - [return: MarshalAs(UnmanagedType.LPWStr)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + [return: MarshalAs(UnmanagedType.LPWStr)] internal unsafe static extern string - Py_GetProgramName(); + Py_GetProgramName(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern void - Py_SetProgramName([MarshalAsAttribute(UnmanagedType.LPWStr)]string name); + Py_SetProgramName([MarshalAsAttribute(UnmanagedType.LPWStr)] string name); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - [return: MarshalAs(UnmanagedType.LPWStr)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + [return: MarshalAs(UnmanagedType.LPWStr)] internal unsafe static extern string - Py_GetPythonHome(); + Py_GetPythonHome(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern void - Py_SetPythonHome([MarshalAsAttribute(UnmanagedType.LPWStr)]string home); + Py_SetPythonHome([MarshalAsAttribute(UnmanagedType.LPWStr)] string home); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - [return: MarshalAs(UnmanagedType.LPWStr)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + [return: MarshalAs(UnmanagedType.LPWStr)] internal unsafe static extern string - Py_GetPath(); + Py_GetPath(); - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern void - Py_SetPath([MarshalAsAttribute(UnmanagedType.LPWStr)]string home); + Py_SetPath([MarshalAsAttribute(UnmanagedType.LPWStr)] string home); #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] @@ -888,7 +894,7 @@ internal unsafe static IntPtr return IntPtr.Zero; } #if Py_DEBUG - int n = 3; + int n = 3; #else int n = 1; #endif @@ -982,34 +988,35 @@ internal unsafe static extern IntPtr PyObject_CallObject(IntPtr pointer, IntPtr args); #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - internal unsafe static extern int - PyObject_RichCompareBool(IntPtr value1, IntPtr value2, int opid); - - internal static int PyObject_Compare(IntPtr value1, IntPtr value2) { - int res; - res = PyObject_RichCompareBool(value1, value2, Py_LT); - if (-1 == res) - return -1; - else if (1 == res) - return -1; - - res = PyObject_RichCompareBool(value1, value2, Py_EQ); - if (-1 == res) - return -1; - else if (1 == res) - return 0; + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + internal unsafe static extern int + PyObject_RichCompareBool(IntPtr value1, IntPtr value2, int opid); - res = PyObject_RichCompareBool(value1, value2, Py_GT); - if (-1 == res) + internal static int PyObject_Compare(IntPtr value1, IntPtr value2) + { + int res; + res = PyObject_RichCompareBool(value1, value2, Py_LT); + if (-1 == res) + return -1; + else if (1 == res) + return -1; + + res = PyObject_RichCompareBool(value1, value2, Py_EQ); + if (-1 == res) + return -1; + else if (1 == res) + return 0; + + res = PyObject_RichCompareBool(value1, value2, Py_GT); + if (-1 == res) + return -1; + else if (1 == res) + return 1; + + Exceptions.SetError(Exceptions.SystemError, "Error comparing objects"); return -1; - else if (1 == res) - return 1; - - Exceptions.SetError(Exceptions.SystemError, "Error comparing objects"); - return -1; - } + } #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] @@ -1064,11 +1071,11 @@ internal unsafe static extern IntPtr PyObject_Str(IntPtr pointer); #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint="PyObject_Str", - ExactSpelling = true, CharSet = CharSet.Ansi)] - internal unsafe static extern IntPtr - PyObject_Unicode(IntPtr pointer); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyObject_Str", + ExactSpelling = true, CharSet = CharSet.Ansi)] + internal unsafe static extern IntPtr + PyObject_Unicode(IntPtr pointer); #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] @@ -1087,11 +1094,11 @@ internal unsafe static extern IntPtr //==================================================================== #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint = "PyNumber_Long", - ExactSpelling=true, CharSet=CharSet.Ansi)] - internal unsafe static extern IntPtr - PyNumber_Int(IntPtr ob); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyNumber_Long", + ExactSpelling = true, CharSet = CharSet.Ansi)] + internal unsafe static extern IntPtr + PyNumber_Int(IntPtr ob); #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, @@ -1140,29 +1147,29 @@ internal static IntPtr PyInt_FromInt64(long value) } #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyLong_FromLong", - ExactSpelling = true, CharSet = CharSet.Ansi)] - private unsafe static extern IntPtr - PyInt_FromLong(IntPtr value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint = "PyLong_AsLong", - ExactSpelling=true, CharSet=CharSet.Ansi)] - internal unsafe static extern int - PyInt_AsLong(IntPtr value); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint = "PyLong_FromString", - ExactSpelling=true, CharSet=CharSet.Ansi)] - internal unsafe static extern IntPtr - PyInt_FromString(string value, IntPtr end, int radix); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint = "PyLong_GetMax", - ExactSpelling=true, CharSet=CharSet.Ansi)] - internal unsafe static extern int - PyInt_GetMax(); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyLong_FromLong", + ExactSpelling = true, CharSet = CharSet.Ansi)] + private unsafe static extern IntPtr + PyInt_FromLong(IntPtr value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyLong_AsLong", + ExactSpelling = true, CharSet = CharSet.Ansi)] + internal unsafe static extern int + PyInt_AsLong(IntPtr value); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyLong_FromString", + ExactSpelling = true, CharSet = CharSet.Ansi)] + internal unsafe static extern IntPtr + PyInt_FromString(string value, IntPtr end, int radix); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyLong_GetMax", + ExactSpelling = true, CharSet = CharSet.Ansi)] + internal unsafe static extern int + PyInt_GetMax(); #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, @@ -1488,40 +1495,43 @@ internal static IntPtr PyString_FromString(string value) } #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - internal unsafe static extern IntPtr - PyBytes_FromString(string op); - - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] - internal unsafe static extern int - PyBytes_Size(IntPtr op); - - internal static IntPtr PyBytes_AS_STRING(IntPtr ob) { - return ob + BytesOffset.ob_sval; - } + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + internal unsafe static extern IntPtr + PyBytes_FromString(string op); - internal static IntPtr PyString_FromStringAndSize(string value, int length) - { - // copy the string into an unmanaged UTF-8 buffer - int len = Encoding.UTF8.GetByteCount(value); - byte[] buffer = new byte[len + 1]; - Encoding.UTF8.GetBytes(value, 0, value.Length, buffer, 0); - IntPtr nativeUtf8 = Marshal.AllocHGlobal(buffer.Length); - try { - Marshal.Copy(buffer, 0, nativeUtf8, buffer.Length); - return PyUnicode_FromStringAndSize(nativeUtf8, length); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + internal unsafe static extern int + PyBytes_Size(IntPtr op); + + internal static IntPtr PyBytes_AS_STRING(IntPtr ob) + { + return ob + BytesOffset.ob_sval; } - finally { - Marshal.FreeHGlobal(nativeUtf8); + + internal static IntPtr PyString_FromStringAndSize(string value, int length) + { + // copy the string into an unmanaged UTF-8 buffer + int len = Encoding.UTF8.GetByteCount(value); + byte[] buffer = new byte[len + 1]; + Encoding.UTF8.GetBytes(value, 0, value.Length, buffer, 0); + IntPtr nativeUtf8 = Marshal.AllocHGlobal(buffer.Length); + try + { + Marshal.Copy(buffer, 0, nativeUtf8, buffer.Length); + return PyUnicode_FromStringAndSize(nativeUtf8, length); + } + finally + { + Marshal.FreeHGlobal(nativeUtf8); + } } - } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_FromStringAndSize(IntPtr value, int size); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Unicode)] + internal unsafe static extern IntPtr + PyUnicode_FromStringAndSize(IntPtr value, int size); #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] @@ -1546,133 +1556,135 @@ internal static bool PyUnicode_Check(IntPtr ob) } #if UCS2 && PYTHON3 - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_FromObject(IntPtr ob); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint="PyUnicode_FromKindAndData", - ExactSpelling=true, - CharSet=CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_FromKindAndString(int kind, string s, int size); - - internal static IntPtr PyUnicode_FromUnicode(string s, int size) { - return PyUnicode_FromKindAndString(2, s, size); - } + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Unicode)] + internal unsafe static extern IntPtr + PyUnicode_FromObject(IntPtr ob); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Unicode)] + internal unsafe static extern IntPtr + PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Unicode)] - internal unsafe static extern int - PyUnicode_GetSize(IntPtr ob); - - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Unicode)] - internal unsafe static extern char * - PyUnicode_AsUnicode(IntPtr ob); - - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicode_AsUnicode", - ExactSpelling = true, CharSet = CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_AS_UNICODE(IntPtr op); - - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_FromOrdinal(int c); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicode_FromKindAndData", + ExactSpelling = true, + CharSet = CharSet.Unicode)] + internal unsafe static extern IntPtr + PyUnicode_FromKindAndString(int kind, string s, int size); + + internal static IntPtr PyUnicode_FromUnicode(string s, int size) + { + return PyUnicode_FromKindAndString(2, s, size); + } + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Unicode)] + internal unsafe static extern int + PyUnicode_GetSize(IntPtr ob); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Unicode)] + internal unsafe static extern char* + PyUnicode_AsUnicode(IntPtr ob); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicode_AsUnicode", + ExactSpelling = true, CharSet = CharSet.Unicode)] + internal unsafe static extern IntPtr + PyUnicode_AS_UNICODE(IntPtr op); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Unicode)] + internal unsafe static extern IntPtr + PyUnicode_FromOrdinal(int c); #elif UCS2 && PYTHON2 - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint="PyUnicodeUCS2_FromObject", - ExactSpelling=true, CharSet=CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_FromObject(IntPtr ob); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint="PyUnicodeUCS2_FromEncodedObject", - ExactSpelling=true, CharSet=CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint="PyUnicodeUCS2_FromUnicode", - ExactSpelling=true, CharSet=CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_FromUnicode(string s, int size); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint="PyUnicodeUCS2_GetSize", - ExactSpelling=true, CharSet=CharSet.Ansi)] - internal unsafe static extern int - PyUnicode_GetSize(IntPtr ob); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint="PyUnicodeUCS2_AsUnicode", - ExactSpelling=true)] - internal unsafe static extern char * - PyUnicode_AsUnicode(IntPtr ob); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint="PyUnicodeUCS2_AsUnicode", - ExactSpelling=true, CharSet=CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_AS_UNICODE(IntPtr op); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - EntryPoint="PyUnicodeUCS2_FromOrdinal", - ExactSpelling=true, CharSet=CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_FromOrdinal(int c); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicodeUCS2_FromObject", + ExactSpelling = true, CharSet = CharSet.Unicode)] + internal unsafe static extern IntPtr + PyUnicode_FromObject(IntPtr ob); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicodeUCS2_FromEncodedObject", + ExactSpelling = true, CharSet = CharSet.Unicode)] + internal unsafe static extern IntPtr + PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicodeUCS2_FromUnicode", + ExactSpelling = true, CharSet = CharSet.Unicode)] + internal unsafe static extern IntPtr + PyUnicode_FromUnicode(string s, int size); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicodeUCS2_GetSize", + ExactSpelling = true, CharSet = CharSet.Ansi)] + internal unsafe static extern int + PyUnicode_GetSize(IntPtr ob); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicodeUCS2_AsUnicode", + ExactSpelling = true)] + internal unsafe static extern char* + PyUnicode_AsUnicode(IntPtr ob); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicodeUCS2_AsUnicode", + ExactSpelling = true, CharSet = CharSet.Unicode)] + internal unsafe static extern IntPtr + PyUnicode_AS_UNICODE(IntPtr op); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicodeUCS2_FromOrdinal", + ExactSpelling = true, CharSet = CharSet.Unicode)] + internal unsafe static extern IntPtr + PyUnicode_FromOrdinal(int c); #elif UCS4 && PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_FromObject(IntPtr ob); - - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicode_FromKindAndData", - ExactSpelling = true)] - internal unsafe static extern IntPtr - PyUnicode_FromKindAndString(int kind, - [MarshalAs (UnmanagedType.CustomMarshaler, - MarshalTypeRef=typeof(Utf32Marshaler))] string s, - int size); - - internal static IntPtr PyUnicode_FromUnicode(string s, int size) { - return PyUnicode_FromKindAndString(4, s, size); - } + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Unicode)] + internal unsafe static extern IntPtr + PyUnicode_FromObject(IntPtr ob); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Unicode)] + internal unsafe static extern IntPtr + PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicode_FromKindAndData", + ExactSpelling = true)] + internal unsafe static extern IntPtr + PyUnicode_FromKindAndString(int kind, + [MarshalAs(UnmanagedType.CustomMarshaler, + MarshalTypeRef = typeof(Utf32Marshaler))] string s, + int size); + + internal static IntPtr PyUnicode_FromUnicode(string s, int size) + { + return PyUnicode_FromKindAndString(4, s, size); + } + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + internal unsafe static extern int + PyUnicode_GetSize(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] - internal unsafe static extern int - PyUnicode_GetSize(IntPtr ob); - - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true)] - internal unsafe static extern IntPtr - PyUnicode_AsUnicode(IntPtr ob); - - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicode_AsUnicode", - ExactSpelling = true, CharSet = CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_AS_UNICODE(IntPtr op); - - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_FromOrdinal(int c); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true)] + internal unsafe static extern IntPtr + PyUnicode_AsUnicode(IntPtr ob); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicode_AsUnicode", + ExactSpelling = true, CharSet = CharSet.Unicode)] + internal unsafe static extern IntPtr + PyUnicode_AS_UNICODE(IntPtr op); + + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Unicode)] + internal unsafe static extern IntPtr + PyUnicode_FromOrdinal(int c); #elif UCS4 && PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicodeUCS4_FromObject", @@ -1734,7 +1746,7 @@ internal unsafe static string GetManagedString(IntPtr op) return Marshal.PtrToStringAnsi( PyString_AS_STRING(op), Runtime.PyString_Size(op) - ); + ); } #endif @@ -1743,7 +1755,7 @@ internal unsafe static string GetManagedString(IntPtr op) #if UCS4 IntPtr p = Runtime.PyUnicode_AsUnicode(op); int length = Runtime.PyUnicode_GetSize(op); - int size = length*4; + int size = length * 4; byte[] buffer = new byte[size]; Marshal.Copy(p, buffer, 0, size); return Encoding.UTF32.GetString(buffer, 0, size); @@ -1957,13 +1969,13 @@ internal unsafe static extern int internal unsafe static extern bool PyIter_Check(IntPtr pointer); #elif PYTHON3 - internal static bool - PyIter_Check(IntPtr pointer) - { - IntPtr ob_type = (IntPtr)Marshal.PtrToStructure(pointer + ObjectOffset.ob_type, typeof(IntPtr)); - IntPtr tp_iternext = ob_type + TypeOffset.tp_iternext; - return tp_iternext != null && tp_iternext != _PyObject_NextNotImplemented; - } + internal static bool + PyIter_Check(IntPtr pointer) + { + IntPtr ob_type = (IntPtr)Marshal.PtrToStructure(pointer + ObjectOffset.ob_type, typeof(IntPtr)); + IntPtr tp_iternext = ob_type + TypeOffset.tp_iternext; + return tp_iternext != null && tp_iternext != _PyObject_NextNotImplemented; + } #endif [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, @@ -1996,10 +2008,10 @@ internal unsafe static extern string PyModule_GetFilename(IntPtr module); #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention=CallingConvention.Cdecl, - ExactSpelling=true, CharSet=CharSet.Ansi)] - internal unsafe static extern IntPtr - PyModule_Create2(IntPtr module, int apiver); + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, + ExactSpelling = true, CharSet = CharSet.Ansi)] + internal unsafe static extern IntPtr + PyModule_Create2(IntPtr module, int apiver); #endif [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, @@ -2033,10 +2045,9 @@ internal unsafe static extern IntPtr internal unsafe static extern void PySys_SetArgvEx( int argc, - [MarshalAsAttribute(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] - string[] argv, + [MarshalAsAttribute(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] argv, int updatepath - ); + ); #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] @@ -2045,7 +2056,7 @@ internal unsafe static extern void int argc, string[] argv, int updatepath - ); + ); #endif [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, diff --git a/src/runtime/typemanager.cs b/src/runtime/typemanager.cs index 40e60336d..d6c474f8d 100644 --- a/src/runtime/typemanager.cs +++ b/src/runtime/typemanager.cs @@ -268,10 +268,10 @@ internal static IntPtr CreateSubType(IntPtr py_name, IntPtr py_base_type, IntPtr internal static IntPtr WriteMethodDef(IntPtr mdef, IntPtr name, IntPtr func, int flags, IntPtr doc) { Marshal.WriteIntPtr(mdef, name); - Marshal.WriteIntPtr(mdef, (1*IntPtr.Size), func); - Marshal.WriteInt32(mdef, (2*IntPtr.Size), flags); - Marshal.WriteIntPtr(mdef, (3*IntPtr.Size), doc); - return mdef + 4*IntPtr.Size; + Marshal.WriteIntPtr(mdef, (1 * IntPtr.Size), func); + Marshal.WriteInt32(mdef, (2 * IntPtr.Size), flags); + Marshal.WriteIntPtr(mdef, (3 * IntPtr.Size), doc); + return mdef + 4 * IntPtr.Size; } internal static IntPtr WriteMethodDef(IntPtr mdef, string name, IntPtr func, int flags = 0x0001, @@ -325,19 +325,19 @@ internal static IntPtr CreateMetaType(Type impl) // We need space for 3 PyMethodDef structs, each of them // 4 int-ptrs in size. - IntPtr mdef = Runtime.PyMem_Malloc(3*(4*IntPtr.Size)); + IntPtr mdef = Runtime.PyMem_Malloc(3 * (4 * IntPtr.Size)); IntPtr mdefStart = mdef; mdef = WriteMethodDef( mdef, "__instancecheck__", Interop.GetThunk(typeof(MetaType).GetMethod("__instancecheck__"), "BinaryFunc") - ); + ); mdef = WriteMethodDef( mdef, "__subclasscheck__", Interop.GetThunk(typeof(MetaType).GetMethod("__subclasscheck__"), "BinaryFunc") - ); + ); mdef = WriteMethodDefSentinel(mdef); @@ -355,8 +355,7 @@ internal static IntPtr CreateMetaType(Type impl) } - internal static IntPtr BasicSubType(string name, IntPtr base_, - Type impl) + internal static IntPtr BasicSubType(string name, IntPtr base_, Type impl) { // Utility to create a subtype of a std Python type, but with // a managed type able to override implementation @@ -408,9 +407,9 @@ internal static IntPtr AllocateTypeObject(string name) // the Python version of the type name - otherwise we'd have to // allocate the tp_name and would have no way to free it. #if PYTHON3 - // For python3 we leak two objects. One for the ascii representation - // required for tp_name, and another for the unicode representation - // for ht_name. + // For python3 we leak two objects. One for the ASCII representation + // required for tp_name, and another for the Unicode representation + // for ht_name. IntPtr temp = Runtime.PyBytes_FromString(name); IntPtr raw = Runtime.PyBytes_AS_STRING(temp); temp = Runtime.PyUnicode_FromString(name); @@ -438,12 +437,10 @@ internal static IntPtr AllocateTypeObject(string name) #if PYTHON3 temp = new IntPtr(ptr + TypeOffset.bf_getbuffer); - Marshal.WriteIntPtr(type, TypeOffset.tp_as_buffer, temp); #elif PYTHON2 temp = new IntPtr(ptr + TypeOffset.bf_getreadbuffer); - Marshal.WriteIntPtr(type, TypeOffset.tp_as_buffer, temp); #endif - + Marshal.WriteIntPtr(type, TypeOffset.tp_as_buffer, temp); return type; } @@ -471,7 +468,7 @@ internal static void InitializeSlots(IntPtr type, Type impl) name.StartsWith("sq_") || name.StartsWith("mp_") || name.StartsWith("bf_") - )) + )) { continue; } diff --git a/src/runtime/typemethod.cs b/src/runtime/typemethod.cs index 4e46da2da..0c60301a0 100644 --- a/src/runtime/typemethod.cs +++ b/src/runtime/typemethod.cs @@ -35,8 +35,7 @@ public override IntPtr Invoke(IntPtr ob, IntPtr args, IntPtr kw) { inst = GetManagedObject(ob); } - return (IntPtr)mi.Invoke(inst, BindingFlags.Default, null, arglist, - null); + return (IntPtr)mi.Invoke(inst, BindingFlags.Default, null, arglist, null); } catch (Exception e) { @@ -45,4 +44,4 @@ public override IntPtr Invoke(IntPtr ob, IntPtr args, IntPtr kw) } } } -} \ No newline at end of file +} diff --git a/src/testing/generictest.cs b/src/testing/generictest.cs index 848ee5cea..1e9c71ac6 100644 --- a/src/testing/generictest.cs +++ b/src/testing/generictest.cs @@ -25,13 +25,11 @@ public GenericTypeDefinition(T arg1, U arg2) } } - public class DerivedFromOpenGeneric : - GenericTypeDefinition + public class DerivedFromOpenGeneric : GenericTypeDefinition { public W value3; - public DerivedFromOpenGeneric(int arg1, V arg2, W arg3) : - base(arg1, arg2) + public DerivedFromOpenGeneric(int arg1, V arg2, W arg3) : base(arg1, arg2) { value3 = arg3; } diff --git a/src/testing/indexertest.cs b/src/testing/indexertest.cs index 74ba69755..ae39eb2b1 100644 --- a/src/testing/indexertest.cs +++ b/src/testing/indexertest.cs @@ -375,8 +375,7 @@ public MultiTypeIndexerTest() : base() { get { - string key = i1.ToString() + i2.ToString() + - i3.GetHashCode().ToString(); + string key = i1.ToString() + i2.ToString() + i3.GetHashCode().ToString(); object value = t[key]; if (value != null) { @@ -386,8 +385,7 @@ public MultiTypeIndexerTest() : base() } set { - string key = i1.ToString() + i2.ToString() + - i3.GetHashCode().ToString(); + string key = i1.ToString() + i2.ToString() + i3.GetHashCode().ToString(); t[key] = value; } } diff --git a/src/testing/methodtest.cs b/src/testing/methodtest.cs index 567dd9227..7634c4839 100644 --- a/src/testing/methodtest.cs +++ b/src/testing/methodtest.cs @@ -101,8 +101,7 @@ public static int[] TestOneArgWithParams(string s, params int[] args) return args; } - public static int[] TestTwoArgWithParams(string s, string x, - params int[] args) + public static int[] TestTwoArgWithParams(string s, string x, params int[] args) { return args; } @@ -383,218 +382,182 @@ public static ISayHello1[] Overloaded(ISayHello1[] v) return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper Overloaded( - GenericWrapper v) + public static GenericWrapper Overloaded(GenericWrapper v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } - public static GenericWrapper[] Overloaded( - GenericWrapper[] v) + public static GenericWrapper[] Overloaded(GenericWrapper[] v) { return v; } From 8a50e135ddfdf4eb5d726b0af406baa5551dc062 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 31 Jan 2017 22:03:51 -0700 Subject: [PATCH 057/324] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dbf9f4c9a..b547712fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ### Added - Code Coverage (#345) +- Add `pysetargv` (#347) ### Changed From a12b2b2701462964090ecc4fe9ef1ba0f931e50b Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 31 Jan 2017 12:10:01 -0700 Subject: [PATCH 058/324] Change applicable comments to xml-docs --- src/runtime/arrayobject.cs | 28 ++--- src/runtime/assemblymanager.cs | 188 +++++++++++++--------------- src/runtime/classbase.cs | 60 ++++----- src/runtime/classderived.cs | 15 ++- src/runtime/classmanager.cs | 20 ++- src/runtime/classobject.cs | 52 ++++---- src/runtime/codegenerator.cs | 14 +-- src/runtime/constructorbinder.cs | 32 +++-- src/runtime/constructorbinding.cs | 34 +++-- src/runtime/converter.cs | 69 +++++----- src/runtime/delegatemanager.cs | 31 +++-- src/runtime/delegateobject.cs | 37 +++--- src/runtime/eventbinding.cs | 42 +++---- src/runtime/eventobject.cs | 59 ++++----- src/runtime/exceptions.cs | 21 ++-- src/runtime/extensiontype.cs | 37 +++--- src/runtime/fieldobject.cs | 36 +++--- src/runtime/generictype.cs | 14 +-- src/runtime/genericutil.cs | 28 ++--- src/runtime/importhook.cs | 34 +++-- src/runtime/indexer.cs | 9 +- src/runtime/interfaceobject.cs | 7 +- src/runtime/interop.cs | 11 +- src/runtime/iterator.cs | 16 ++- src/runtime/managedtype.cs | 18 ++- src/runtime/metatype.cs | 72 +++++------ src/runtime/methodbinder.cs | 96 +++++++------- src/runtime/methodbinding.cs | 53 ++++---- src/runtime/methodobject.cs | 76 ++++++----- src/runtime/modulefunctionobject.cs | 14 +-- src/runtime/moduleobject.cs | 60 ++++----- src/runtime/overload.cs | 30 ++--- src/runtime/propertyobject.cs | 36 +++--- src/runtime/pyansistring.cs | 4 - src/runtime/pydict.cs | 12 -- src/runtime/pyfloat.cs | 7 -- src/runtime/pyint.cs | 17 --- src/runtime/pyiter.cs | 2 - src/runtime/pylist.cs | 10 -- src/runtime/pylong.cs | 18 --- src/runtime/pynumber.cs | 1 - src/runtime/pysequence.cs | 8 -- src/runtime/pystring.cs | 4 - src/runtime/pythonengine.cs | 10 +- src/runtime/pythonexception.cs | 7 -- src/runtime/pytuple.cs | 6 - src/runtime/runtime.cs | 124 +++++++++--------- src/runtime/typemanager.cs | 86 ++++++------- src/runtime/typemethod.cs | 7 +- 49 files changed, 708 insertions(+), 964 deletions(-) diff --git a/src/runtime/arrayobject.cs b/src/runtime/arrayobject.cs index eaff49214..6096706dd 100644 --- a/src/runtime/arrayobject.cs +++ b/src/runtime/arrayobject.cs @@ -38,10 +38,9 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) } - //==================================================================== - // Implements __getitem__ for array types. - //==================================================================== - + /// + /// Implements __getitem__ for array types. + /// public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) { CLRObject obj = (CLRObject)ManagedType.GetManagedObject(ob); @@ -131,10 +130,9 @@ public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) } - //==================================================================== - // Implements __setitem__ for array types. - //==================================================================== - + /// + /// Implements __setitem__ for array types. + /// public static int mp_ass_subscript(IntPtr ob, IntPtr idx, IntPtr v) { CLRObject obj = (CLRObject)ManagedType.GetManagedObject(ob); @@ -226,10 +224,9 @@ public static int mp_ass_subscript(IntPtr ob, IntPtr idx, IntPtr v) } - //==================================================================== - // Implements __contains__ for array types. - //==================================================================== - + /// + /// Implements __contains__ for array types. + /// public static int sq_contains(IntPtr ob, IntPtr v) { CLRObject obj = (CLRObject)ManagedType.GetManagedObject(ob); @@ -251,10 +248,9 @@ public static int sq_contains(IntPtr ob, IntPtr v) } - //==================================================================== - // Implements __len__ for array types. - //==================================================================== - + /// + /// Implements __len__ for array types. + /// public static int mp_length(IntPtr ob) { CLRObject self = (CLRObject)ManagedType.GetManagedObject(ob); diff --git a/src/runtime/assemblymanager.cs b/src/runtime/assemblymanager.cs index f263728bb..b98455ec3 100644 --- a/src/runtime/assemblymanager.cs +++ b/src/runtime/assemblymanager.cs @@ -31,12 +31,11 @@ private AssemblyManager() { } - //=================================================================== - // Initialization performed on startup of the Python runtime. Here we - // scan all of the currently loaded assemblies to determine exported - // names, and register to be notified of new assembly loads. - //=================================================================== - + /// + /// Initialization performed on startup of the Python runtime. Here we + /// scan all of the currently loaded assemblies to determine exported + /// names, and register to be notified of new assembly loads. + /// internal static void Initialize() { namespaces = new ConcurrentDictionary>(); @@ -69,10 +68,9 @@ internal static void Initialize() } - //=================================================================== - // Cleanup resources upon shutdown of the Python runtime. - //=================================================================== - + /// + /// Cleanup resources upon shutdown of the Python runtime. + /// internal static void Shutdown() { AppDomain domain = AppDomain.CurrentDomain; @@ -81,14 +79,13 @@ internal static void Shutdown() } - //=================================================================== - // Event handler for assembly load events. At the time the Python - // runtime loads, we scan the app domain to map the assemblies that - // are loaded at the time. We also have to register this event handler - // so that we can know about assemblies that get loaded after the - // Python runtime is initialized. - //=================================================================== - + /// + /// Event handler for assembly load events. At the time the Python + /// runtime loads, we scan the app domain to map the assemblies that + /// are loaded at the time. We also have to register this event handler + /// so that we can know about assemblies that get loaded after the + /// Python runtime is initialized. + /// static void AssemblyLoadHandler(Object ob, AssemblyLoadEventArgs args) { Assembly assembly = args.LoadedAssembly; @@ -97,14 +94,13 @@ static void AssemblyLoadHandler(Object ob, AssemblyLoadEventArgs args) } - //=================================================================== - // Event handler for assembly resolve events. This is needed because - // we augment the assembly search path with the PYTHONPATH when we - // load an assembly from Python. Because of that, we need to listen - // for failed loads, because they might be dependencies of something - // we loaded from Python which also needs to be found on PYTHONPATH. - //=================================================================== - + /// + /// Event handler for assembly resolve events. This is needed because + /// we augment the assembly search path with the PYTHONPATH when we + /// load an assembly from Python. Because of that, we need to listen + /// for failed loads, because they might be dependencies of something + /// we loaded from Python which also needs to be found on PYTHONPATH. + /// static Assembly ResolveHandler(Object ob, ResolveEventArgs args) { string name = args.Name.ToLower(); @@ -120,19 +116,17 @@ static Assembly ResolveHandler(Object ob, ResolveEventArgs args) } - //=================================================================== - // We __really__ want to avoid using Python objects or APIs when - // probing for assemblies to load, since our ResolveHandler may be - // called in contexts where we don't have the Python GIL and can't - // even safely try to get it without risking a deadlock ;( - // - // To work around that, we update a managed copy of sys.path (which - // is the main thing we care about) when UpdatePath is called. The - // import hook calls this whenever it knows its about to use the - // assembly manager, which lets us keep up with changes to sys.path - // in a relatively lightweight and low-overhead way. - //=================================================================== - + /// + /// We __really__ want to avoid using Python objects or APIs when + /// probing for assemblies to load, since our ResolveHandler may be + /// called in contexts where we don't have the Python GIL and can't + /// even safely try to get it without risking a deadlock ;( + /// To work around that, we update a managed copy of sys.path (which + /// is the main thing we care about) when UpdatePath is called. The + /// import hook calls this whenever it knows its about to use the + /// assembly manager, which lets us keep up with changes to sys.path + /// in a relatively lightweight and low-overhead way. + /// internal static void UpdatePath() { IntPtr list = Runtime.PySys_GetObject("path"); @@ -154,12 +148,11 @@ internal static void UpdatePath() } - //=================================================================== - // Given an assembly name, try to find this assembly file using the - // PYTHONPATH. If not found, return null to indicate implicit load - // using standard load semantics (app base directory then GAC, etc.) - //=================================================================== - + /// + /// Given an assembly name, try to find this assembly file using the + /// PYTHONPATH. If not found, return null to indicate implicit load + /// using standard load semantics (app base directory then GAC, etc.) + /// public static string FindAssembly(string name) { char sep = Path.DirectorySeparatorChar; @@ -193,11 +186,10 @@ public static string FindAssembly(string name) } - //=================================================================== - // Loads an assembly from the application directory or the GAC - // given a simple assembly name. Returns the assembly if loaded. - //=================================================================== - + /// + /// Loads an assembly from the application directory or the GAC + /// given a simple assembly name. Returns the assembly if loaded. + /// public static Assembly LoadAssembly(string name) { Assembly assembly = null; @@ -216,10 +208,9 @@ public static Assembly LoadAssembly(string name) } - //=================================================================== - // Loads an assembly using an augmented search path (the python path). - //=================================================================== - + /// + /// Loads an assembly using an augmented search path (the python path). + /// public static Assembly LoadAssemblyPath(string name) { string path = FindAssembly(name); @@ -240,8 +231,10 @@ public static Assembly LoadAssemblyPath(string name) /// /// Loads an assembly using full path. /// - /// - /// + /// + /// + /// + /// public static Assembly LoadAssemblyFullPath(string name) { Assembly assembly = null; @@ -263,10 +256,9 @@ public static Assembly LoadAssemblyFullPath(string name) return assembly; } - //=================================================================== - // Returns an assembly that's already been loaded - //=================================================================== - + /// + /// Returns an assembly that's already been loaded + /// public static Assembly FindLoadedAssembly(string name) { foreach (Assembly a in assemblies) @@ -279,18 +271,19 @@ public static Assembly FindLoadedAssembly(string name) return null; } - //=================================================================== - // Given a qualified name of the form A.B.C.D, attempt to load - // an assembly named after each of A.B.C.D, A.B.C, A.B, A. This - // will only actually probe for the assembly once for each unique - // namespace. Returns true if any assemblies were loaded. - // TODO item 3 "* Deprecate implicit loading of assemblies": - // Set the fromFile flag if the name of the loaded assembly matches - // the fully qualified name that was requested if the framework - // actually loads an assembly. - // Call ONLY for namespaces that HAVE NOT been cached yet. - //=================================================================== - + /// + /// Given a qualified name of the form A.B.C.D, attempt to load + /// an assembly named after each of A.B.C.D, A.B.C, A.B, A. This + /// will only actually probe for the assembly once for each unique + /// namespace. Returns true if any assemblies were loaded. + /// + /// + /// TODO item 3 "* Deprecate implicit loading of assemblies": + /// Set the fromFile flag if the name of the loaded assembly matches + /// the fully qualified name that was requested if the framework + /// actually loads an assembly. + /// Call ONLY for namespaces that HAVE NOT been cached yet. + /// public static bool LoadImplicit(string name, bool warn = true) { string[] names = name.Split('.'); @@ -339,13 +332,12 @@ public static bool LoadImplicit(string name, bool warn = true) } - //=================================================================== - // Scans an assembly for exported namespaces, adding them to the - // mapping of valid namespaces. Note that for a given namespace - // a.b.c.d, each of a, a.b, a.b.c and a.b.c.d are considered to - // be valid namespaces (to better match Python import semantics). - //=================================================================== - + /// + /// Scans an assembly for exported namespaces, adding them to the + /// mapping of valid namespaces. Note that for a given namespace + /// a.b.c.d, each of a, a.b, a.b.c and a.b.c.d are considered to + /// be valid namespaces (to better match Python import semantics). + /// internal static void ScanAssembly(Assembly assembly) { // A couple of things we want to do here: first, we want to @@ -390,20 +382,18 @@ public static AssemblyName[] ListAssemblies() return names.ToArray(); } - //=================================================================== - // Returns true if the given qualified name matches a namespace - // exported by an assembly loaded in the current app domain. - //=================================================================== - + /// + /// Returns true if the given qualified name matches a namespace + /// exported by an assembly loaded in the current app domain. + /// public static bool IsValidNamespace(string name) { return !String.IsNullOrEmpty(name) && namespaces.ContainsKey(name); } - //=================================================================== - // Returns list of assemblies that declare types in a given namespace - //=================================================================== - + /// + /// Returns list of assemblies that declare types in a given namespace + /// public static IEnumerable GetAssemblies(string nsname) { if (!namespaces.ContainsKey(nsname)) @@ -412,10 +402,9 @@ public static IEnumerable GetAssemblies(string nsname) return namespaces[nsname].Keys; } - //=================================================================== - // Returns the current list of valid names for the input namespace. - //=================================================================== - + /// + /// Returns the current list of valid names for the input namespace. + /// public static List GetNames(string nsname) { //Dictionary seen = new Dictionary(); @@ -460,12 +449,11 @@ public static List GetNames(string nsname) return names; } - //=================================================================== - // Returns the System.Type object for a given qualified name, - // looking in the currently loaded assemblies for the named - // type. Returns null if the named type cannot be found. - //=================================================================== - + /// + /// Returns the System.Type object for a given qualified name, + /// looking in the currently loaded assemblies for the named + /// type. Returns null if the named type cannot be found. + /// public static Type LookupType(string qname) { foreach (Assembly assembly in assemblies) @@ -528,8 +516,8 @@ public IEnumerator GetEnumerator() } /// - /// Enumerator wrapping around 's enumerator. - /// Acquires and releases a read lock on during enumeration + /// Enumerator wrapping around 's enumerator. + /// Acquires and releases a read lock on during enumeration /// private class Enumerator : IEnumerator { diff --git a/src/runtime/classbase.cs b/src/runtime/classbase.cs index 7c7bb0509..6ed43689b 100644 --- a/src/runtime/classbase.cs +++ b/src/runtime/classbase.cs @@ -30,19 +30,17 @@ internal virtual bool CanSubclass() return (!this.type.IsEnum); } - //==================================================================== - // Implements __init__ for reflected classes and value types. - //==================================================================== - + /// + /// Implements __init__ for reflected classes and value types. + /// public static int tp_init(IntPtr ob, IntPtr args, IntPtr kw) { return 0; } - //==================================================================== - // Default implementation of [] semantics for reflected types. - //==================================================================== - + /// + /// Default implementation of [] semantics for reflected types. + /// public virtual IntPtr type_subscript(IntPtr idx) { Type[] types = Runtime.PythonArgsToTypeArray(idx); @@ -64,10 +62,9 @@ public virtual IntPtr type_subscript(IntPtr idx) return Exceptions.RaiseTypeError("no type matches params"); } - //==================================================================== - // Standard comparison implementation for instances of reflected types. - //==================================================================== - + /// + /// Standard comparison implementation for instances of reflected types. + /// public static IntPtr tp_richcompare(IntPtr ob, IntPtr other, int op) { CLRObject co1; @@ -173,12 +170,11 @@ public static IntPtr tp_richcompare(IntPtr ob, IntPtr other, int op) } } - //==================================================================== - // Standard iteration support for instances of reflected types. This - // allows natural iteration over objects that either are IEnumerable - // or themselves support IEnumerator directly. - //==================================================================== - + /// + /// Standard iteration support for instances of reflected types. This + /// allows natural iteration over objects that either are IEnumerable + /// or themselves support IEnumerator directly. + /// public static IntPtr tp_iter(IntPtr ob) { CLRObject co = GetManagedObject(ob) as CLRObject; @@ -209,10 +205,9 @@ public static IntPtr tp_iter(IntPtr ob) } - //==================================================================== - // Standard __hash__ implementation for instances of reflected types. - //==================================================================== - + /// + /// Standard __hash__ implementation for instances of reflected types. + /// public static IntPtr tp_hash(IntPtr ob) { CLRObject co = GetManagedObject(ob) as CLRObject; @@ -224,10 +219,9 @@ public static IntPtr tp_hash(IntPtr ob) } - //==================================================================== - // Standard __str__ implementation for instances of reflected types. - //==================================================================== - + /// + /// Standard __str__ implementation for instances of reflected types. + /// public static IntPtr tp_str(IntPtr ob) { CLRObject co = GetManagedObject(ob) as CLRObject; @@ -251,10 +245,9 @@ public static IntPtr tp_str(IntPtr ob) } - //==================================================================== - // Default implementations for required Python GC support. - //==================================================================== - + /// + /// Default implementations for required Python GC support. + /// public static int tp_traverse(IntPtr ob, IntPtr func, IntPtr args) { return 0; @@ -270,10 +263,9 @@ public static int tp_is_gc(IntPtr type) return 1; } - //==================================================================== - // Standard dealloc implementation for instances of reflected types. - //==================================================================== - + /// + /// Standard dealloc implementation for instances of reflected types. + /// public static void tp_dealloc(IntPtr ob) { ManagedType self = GetManagedObject(ob); diff --git a/src/runtime/classderived.cs b/src/runtime/classderived.cs index ea0cbb7e9..c7f60e7af 100644 --- a/src/runtime/classderived.cs +++ b/src/runtime/classderived.cs @@ -16,7 +16,6 @@ namespace Python.Runtime /// Python type objects. Each of those type objects is associated with /// an instance of ClassObject, which provides its implementation. /// - // interface used to idenfity which C# types were dynamically created as python subclasses public interface IPythonDerivedType { @@ -569,13 +568,13 @@ private static ModuleBuilder GetModuleBuilder(string assemblyName, string module // public class PythonDerivedType { - //==================================================================== - // This is the implementaion of the overriden methods in the derived - // type. It looks for a python method with the same name as the method - // on the managed base class and if it exists and isn't the managed - // method binding (ie it has been overriden in the derived python - // class) it calls it, otherwise it calls the base method. - //==================================================================== + /// + /// This is the implementaion of the overriden methods in the derived + /// type. It looks for a python method with the same name as the method + /// on the managed base class and if it exists and isn't the managed + /// method binding (ie it has been overriden in the derived python + /// class) it calls it, otherwise it calls the base method. + /// public static T InvokeMethod(IPythonDerivedType obj, string methodName, string origMethodName, Object[] args) { FieldInfo fi = obj.GetType().GetField("__pyobj__"); diff --git a/src/runtime/classmanager.cs b/src/runtime/classmanager.cs index 2588adf7e..2af783f12 100644 --- a/src/runtime/classmanager.cs +++ b/src/runtime/classmanager.cs @@ -35,11 +35,10 @@ static ClassManager() dtype = typeof(System.MulticastDelegate); } - //==================================================================== - // Return the ClassBase-derived instance that implements a particular - // reflected managed type, creating it if it doesn't yet exist. - //==================================================================== - + /// + /// Return the ClassBase-derived instance that implements a particular + /// reflected managed type, creating it if it doesn't yet exist. + /// internal static ClassBase GetClass(Type type) { ClassBase cb = null; @@ -56,12 +55,11 @@ internal static ClassBase GetClass(Type type) } - //==================================================================== - // Create a new ClassBase-derived instance that implements a reflected - // managed type. The new object will be associated with a generated - // Python type object. - //==================================================================== - + /// + /// Create a new ClassBase-derived instance that implements a reflected + /// managed type. The new object will be associated with a generated + /// Python type object. + /// private static ClassBase CreateClass(Type type) { // Next, select the appropriate managed implementation class. diff --git a/src/runtime/classobject.cs b/src/runtime/classobject.cs index 671f0c8e6..13eab44b0 100644 --- a/src/runtime/classobject.cs +++ b/src/runtime/classobject.cs @@ -26,10 +26,9 @@ internal ClassObject(Type tp) : base(tp) } - //==================================================================== - // Helper to get docstring from reflected constructor info. - //==================================================================== - + /// + /// Helper to get docstring from reflected constructor info. + /// internal IntPtr GetDocString() { MethodBase[] methods = binder.GetMethods(); @@ -44,10 +43,9 @@ internal IntPtr GetDocString() } - //==================================================================== - // Implements __new__ for reflected classes and value types. - //==================================================================== - + /// + /// Implements __new__ for reflected classes and value types. + /// public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) { ClassObject self = GetManagedObject(tp) as ClassObject; @@ -108,12 +106,11 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) } - //==================================================================== - // Implementation of [] semantics for reflected types. This exists - // both to implement the Array[int] syntax for creating arrays and - // to support generic name overload resolution using []. - //==================================================================== - + /// + /// Implementation of [] semantics for reflected types. This exists + /// both to implement the Array[int] syntax for creating arrays and + /// to support generic name overload resolution using []. + /// public override IntPtr type_subscript(IntPtr idx) { // If this type is the Array type, the [] means we need to @@ -160,10 +157,9 @@ public override IntPtr type_subscript(IntPtr idx) } - //==================================================================== - // Implements __getitem__ for reflected classes and value types. - //==================================================================== - + /// + /// Implements __getitem__ for reflected classes and value types. + /// public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) { //ManagedType self = GetManagedObject(ob); @@ -208,10 +204,9 @@ public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) } - //==================================================================== - // Implements __setitem__ for reflected classes and value types. - //==================================================================== - + /// + /// Implements __setitem__ for reflected classes and value types. + /// public static int mp_ass_subscript(IntPtr ob, IntPtr idx, IntPtr v) { //ManagedType self = GetManagedObject(ob); @@ -289,13 +284,12 @@ public static int mp_ass_subscript(IntPtr ob, IntPtr idx, IntPtr v) } - //==================================================================== - // This is a hack. Generally, no managed class is considered callable - // from Python - with the exception of System.Delegate. It is useful - // to be able to call a System.Delegate instance directly, especially - // when working with multicast delegates. - //==================================================================== - + /// + /// This is a hack. Generally, no managed class is considered callable + /// from Python - with the exception of System.Delegate. It is useful + /// to be able to call a System.Delegate instance directly, especially + /// when working with multicast delegates. + /// public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) { //ManagedType self = GetManagedObject(ob); diff --git a/src/runtime/codegenerator.cs b/src/runtime/codegenerator.cs index 527ef418a..d592843cb 100644 --- a/src/runtime/codegenerator.cs +++ b/src/runtime/codegenerator.cs @@ -29,20 +29,18 @@ internal CodeGenerator() mBuilder = aBuilder.DefineDynamicModule("__CodeGenerator_Module"); } - //==================================================================== - // DefineType is a shortcut utility to get a new TypeBuilder. - //==================================================================== - + /// + /// DefineType is a shortcut utility to get a new TypeBuilder. + /// internal TypeBuilder DefineType(string name) { TypeAttributes attrs = TypeAttributes.Public; return mBuilder.DefineType(name, attrs); } - //==================================================================== - // DefineType is a shortcut utility to get a new TypeBuilder. - //==================================================================== - + /// + /// DefineType is a shortcut utility to get a new TypeBuilder. + /// internal TypeBuilder DefineType(string name, Type basetype) { TypeAttributes attrs = TypeAttributes.Public; diff --git a/src/runtime/constructorbinder.cs b/src/runtime/constructorbinder.cs index 837c7ff2e..400a0dd54 100644 --- a/src/runtime/constructorbinder.cs +++ b/src/runtime/constructorbinder.cs @@ -3,14 +3,13 @@ namespace Python.Runtime { - //======================================================================== - // A ConstructorBinder encapsulates information about one or more managed - // constructors, and is responsible for selecting the right constructor - // given a set of Python arguments. This is slightly different than the - // standard MethodBinder because of a difference in invoking constructors - // using reflection (which is seems to be a CLR bug). - //======================================================================== - + /// + /// A ConstructorBinder encapsulates information about one or more managed + /// constructors, and is responsible for selecting the right constructor + /// given a set of Python arguments. This is slightly different than the + /// standard MethodBinder because of a difference in invoking constructors + /// using reflection (which is seems to be a CLR bug). + /// internal class ConstructorBinder : MethodBinder { private Type _containingType = null; @@ -20,15 +19,14 @@ internal ConstructorBinder(Type containingType) : base() _containingType = containingType; } - //==================================================================== - // Constructors get invoked when an instance of a wrapped managed - // class or a subclass of a managed class is created. This differs - // from the MethodBinder implementation in that we return the raw - // result of the constructor rather than wrapping it as a Python - // object - the reason is that only the caller knows the correct - // Python type to use when wrapping the result (may be a subclass). - //==================================================================== - + /// + /// Constructors get invoked when an instance of a wrapped managed + /// class or a subclass of a managed class is created. This differs + /// from the MethodBinder implementation in that we return the raw + /// result of the constructor rather than wrapping it as a Python + /// object - the reason is that only the caller knows the correct + /// Python type to use when wrapping the result (may be a subclass). + /// internal object InvokeRaw(IntPtr inst, IntPtr args, IntPtr kw) { return this.InvokeRaw(inst, args, kw, null); diff --git a/src/runtime/constructorbinding.cs b/src/runtime/constructorbinding.cs index 940650186..6a929eff7 100644 --- a/src/runtime/constructorbinding.cs +++ b/src/runtime/constructorbinding.cs @@ -77,9 +77,9 @@ public static IntPtr tp_descr_get(IntPtr op, IntPtr instance, IntPtr owner) return self.pyHandle; } - //==================================================================== - // Implement explicit overload selection using subscript syntax ([]). - //==================================================================== + /// + /// Implement explicit overload selection using subscript syntax ([]). + /// /// /// ConstructorBinding.GetItem(PyObject *o, PyObject *key) /// Return element of o corresponding to the object key or NULL on failure. @@ -112,10 +112,9 @@ public static IntPtr mp_subscript(IntPtr op, IntPtr key) return boundCtor.pyHandle; } - //==================================================================== - // ConstructorBinding __repr__ implementation [borrowed from MethodObject]. - //==================================================================== - + /// + /// ConstructorBinding __repr__ implementation [borrowed from MethodObject]. + /// public static IntPtr tp_repr(IntPtr ob) { ConstructorBinding self = (ConstructorBinding)GetManagedObject(ob); @@ -140,10 +139,9 @@ public static IntPtr tp_repr(IntPtr ob) return self.repr; } - //==================================================================== - // ConstructorBinding dealloc implementation. - //==================================================================== - + /// + /// ConstructorBinding dealloc implementation. + /// public static new void tp_dealloc(IntPtr ob) { ConstructorBinding self = (ConstructorBinding)GetManagedObject(ob); @@ -207,10 +205,9 @@ public static IntPtr tp_call(IntPtr op, IntPtr args, IntPtr kw) return CLRObject.GetInstHandle(obj, self.pyTypeHndl); } - //==================================================================== - // BoundContructor __repr__ implementation [borrowed from MethodObject]. - //==================================================================== - + /// + /// BoundContructor __repr__ implementation [borrowed from MethodObject]. + /// public static IntPtr tp_repr(IntPtr ob) { BoundContructor self = (BoundContructor)GetManagedObject(ob); @@ -228,10 +225,9 @@ public static IntPtr tp_repr(IntPtr ob) return self.repr; } - //==================================================================== - // ConstructorBinding dealloc implementation. - //==================================================================== - + /// + /// ConstructorBinding dealloc implementation. + /// public static new void tp_dealloc(IntPtr ob) { BoundContructor self = (BoundContructor)GetManagedObject(ob); diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index 320d6eb58..697d84858 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -7,10 +7,9 @@ namespace Python.Runtime { - //======================================================================== - // Performs data conversions between managed types and Python types. - //======================================================================== - + /// + /// Performs data conversions between managed types and Python types. + /// [SuppressUnmanagedCodeSecurityAttribute()] internal class Converter { @@ -48,10 +47,9 @@ static Converter() } - //==================================================================== - // Given a builtin Python type, return the corresponding CLR type. - //==================================================================== - + /// + /// Given a builtin Python type, return the corresponding CLR type. + /// internal static Type GetTypeByAlias(IntPtr op) { if ((op == Runtime.PyStringType) || @@ -113,12 +111,12 @@ internal static IntPtr GetPythonTypeByAlias(Type op) } - //==================================================================== - // Return a Python object for the given native object, converting - // basic types (string, int, etc.) into equivalent Python objects. - // This always returns a new reference. Note that the System.Decimal - // type has no Python equivalent and converts to a managed instance. - //==================================================================== + /// + /// Return a Python object for the given native object, converting + /// basic types (string, int, etc.) into equivalent Python objects. + /// This always returns a new reference. Note that the System.Decimal + /// type has no Python equivalent and converts to a managed instance. + /// internal static IntPtr ToPython(T value) { return ToPython(value, typeof(T)); @@ -234,11 +232,10 @@ internal static IntPtr ToPython(Object value, Type type) } - //==================================================================== - // In a few situations, we don't have any advisory type information - // when we want to convert an object to Python. - //==================================================================== - + /// + /// In a few situations, we don't have any advisory type information + /// when we want to convert an object to Python. + /// internal static IntPtr ToPythonImplicit(Object value) { if (value == null) @@ -252,11 +249,10 @@ internal static IntPtr ToPythonImplicit(Object value) } - //==================================================================== - // Return a managed object for the given Python object, taking funny - // byref types into account. - //==================================================================== - + /// + /// Return a managed object for the given Python object, taking funny + /// byref types into account. + /// internal static bool ToManaged(IntPtr value, Type type, out object result, bool setError) { @@ -415,10 +411,9 @@ internal static bool ToManagedValue(IntPtr value, Type obType, return ToPrimitive(value, obType, out result, setError); } - //==================================================================== - // Convert a Python value to an instance of a primitive managed type. - //==================================================================== - + /// + /// Convert a Python value to an instance of a primitive managed type. + /// static bool ToPrimitive(IntPtr value, Type obType, out Object result, bool setError) { IntPtr overflow = Exceptions.OverflowError; @@ -826,12 +821,11 @@ static void SetConversionError(IntPtr value, Type target) } - //==================================================================== - // Convert a Python value to a correctly typed managed array instance. - // The Python value must support the Python sequence protocol and the - // items in the sequence must be convertible to the target array type. - //==================================================================== - + /// + /// Convert a Python value to a correctly typed managed array instance. + /// The Python value must support the Python sequence protocol and the + /// items in the sequence must be convertible to the target array type. + /// static bool ToArray(IntPtr value, Type obType, out Object result, bool setError) { Type elementType = obType.GetElementType(); @@ -878,10 +872,9 @@ static bool ToArray(IntPtr value, Type obType, out Object result, bool setError) } - //==================================================================== - // Convert a Python value to a correctly typed managed enum instance. - //==================================================================== - + /// + /// Convert a Python value to a correctly typed managed enum instance. + /// static bool ToEnum(IntPtr value, Type obType, out Object result, bool setError) { Type etype = Enum.GetUnderlyingType(obType); diff --git a/src/runtime/delegatemanager.cs b/src/runtime/delegatemanager.cs index a9e26fb01..0a29b8e13 100644 --- a/src/runtime/delegatemanager.cs +++ b/src/runtime/delegatemanager.cs @@ -33,12 +33,11 @@ public DelegateManager() codeGenerator = new CodeGenerator(); } - //==================================================================== - // Given a true delegate instance, return the PyObject handle of the - // Python object implementing the delegate (or IntPtr.Zero if the - // delegate is not implemented in Python code. - //==================================================================== - + /// + /// Given a true delegate instance, return the PyObject handle of the + /// Python object implementing the delegate (or IntPtr.Zero if the + /// delegate is not implemented in Python code. + /// public IntPtr GetPythonHandle(Delegate d) { if ((d != null) && (d.Target is Dispatcher)) @@ -49,11 +48,10 @@ public IntPtr GetPythonHandle(Delegate d) return IntPtr.Zero; } - //==================================================================== - // GetDispatcher is responsible for creating a class that provides - // an appropriate managed callback method for a given delegate type. - //==================================================================== - + /// + /// GetDispatcher is responsible for creating a class that provides + /// an appropriate managed callback method for a given delegate type. + /// private Type GetDispatcher(Type dtype) { // If a dispatcher type for the given delegate type has already @@ -154,12 +152,11 @@ private Type GetDispatcher(Type dtype) return disp; } - //==================================================================== - // Given a delegate type and a callable Python object, GetDelegate - // returns an instance of the delegate type. The delegate instance - // returned will dispatch calls to the given Python object. - //==================================================================== - + /// + /// Given a delegate type and a callable Python object, GetDelegate + /// returns an instance of the delegate type. The delegate instance + /// returned will dispatch calls to the given Python object. + /// internal Delegate GetDelegate(Type dtype, IntPtr callable) { Type dispatcher = GetDispatcher(dtype); diff --git a/src/runtime/delegateobject.cs b/src/runtime/delegateobject.cs index 2186e98ad..2d305e5f2 100644 --- a/src/runtime/delegateobject.cs +++ b/src/runtime/delegateobject.cs @@ -20,11 +20,10 @@ internal DelegateObject(Type tp) : base(tp) } - //==================================================================== - // Given a PyObject pointer to an instance of a delegate type, return - // the true managed delegate the Python object represents (or null). - //==================================================================== - + /// + /// Given a PyObject pointer to an instance of a delegate type, return + /// the true managed delegate the Python object represents (or null). + /// private static Delegate GetTrueDelegate(IntPtr op) { CLRObject o = GetManagedObject(op) as CLRObject; @@ -43,14 +42,13 @@ internal override bool CanSubclass() } - //==================================================================== - // DelegateObject __new__ implementation. The result of this is a new - // PyObject whose type is DelegateObject and whose ob_data is a handle - // to an actual delegate instance. The method wrapped by the actual - // delegate instance belongs to an object generated to relay the call - // to the Python callable passed in. - //==================================================================== - + /// + /// DelegateObject __new__ implementation. The result of this is a new + /// PyObject whose type is DelegateObject and whose ob_data is a handle + /// to an actual delegate instance. The method wrapped by the actual + /// delegate instance belongs to an object generated to relay the call + /// to the Python callable passed in. + /// public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) { DelegateObject self = (DelegateObject)GetManagedObject(tp); @@ -73,10 +71,9 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) } - //==================================================================== - // Implements __call__ for reflected delegate types. - //==================================================================== - + /// + /// Implements __call__ for reflected delegate types. + /// public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) { // todo: add fast type check! @@ -99,9 +96,9 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) } - //==================================================================== - // Implements __cmp__ for reflected delegate types. - //==================================================================== + /// + /// Implements __cmp__ for reflected delegate types. + /// #if PYTHON3 public static new IntPtr tp_richcompare(IntPtr ob, IntPtr other, int op) { diff --git a/src/runtime/eventbinding.cs b/src/runtime/eventbinding.cs index 090d812ca..b31286b4c 100644 --- a/src/runtime/eventbinding.cs +++ b/src/runtime/eventbinding.cs @@ -2,10 +2,9 @@ namespace Python.Runtime { - //======================================================================== - // Implements a Python event binding type, similar to a method binding. - //======================================================================== - + /// + /// Implements a Python event binding type, similar to a method binding. + /// internal class EventBinding : ExtensionType { EventObject e; @@ -19,10 +18,9 @@ public EventBinding(EventObject e, IntPtr target) : base() } - //==================================================================== - // EventBinding += operator implementation. - //==================================================================== - + /// + /// EventBinding += operator implementation. + /// public static IntPtr nb_inplace_add(IntPtr ob, IntPtr arg) { EventBinding self = (EventBinding)GetManagedObject(ob); @@ -43,10 +41,9 @@ public static IntPtr nb_inplace_add(IntPtr ob, IntPtr arg) } - //==================================================================== - // EventBinding -= operator implementation. - //==================================================================== - + /// + /// EventBinding -= operator implementation. + /// public static IntPtr nb_inplace_subtract(IntPtr ob, IntPtr arg) { EventBinding self = (EventBinding)GetManagedObject(ob); @@ -67,10 +64,9 @@ public static IntPtr nb_inplace_subtract(IntPtr ob, IntPtr arg) } - //==================================================================== - // EventBinding __hash__ implementation. - //==================================================================== - + /// + /// EventBinding __hash__ implementation. + /// public static IntPtr tp_hash(IntPtr ob) { EventBinding self = (EventBinding)GetManagedObject(ob); @@ -103,10 +99,9 @@ public static IntPtr tp_hash(IntPtr ob) } - //==================================================================== - // EventBinding __repr__ implementation. - //==================================================================== - + /// + /// EventBinding __repr__ implementation. + /// public static IntPtr tp_repr(IntPtr ob) { EventBinding self = (EventBinding)GetManagedObject(ob); @@ -116,10 +111,9 @@ public static IntPtr tp_repr(IntPtr ob) } - //==================================================================== - // EventBinding dealloc implementation. - //==================================================================== - + /// + /// EventBinding dealloc implementation. + /// public static new void tp_dealloc(IntPtr ob) { EventBinding self = (EventBinding)GetManagedObject(ob); diff --git a/src/runtime/eventobject.cs b/src/runtime/eventobject.cs index 191a95546..8ac0ed3ac 100644 --- a/src/runtime/eventobject.cs +++ b/src/runtime/eventobject.cs @@ -4,10 +4,9 @@ namespace Python.Runtime { - //======================================================================== - // Implements a Python descriptor type that provides access to CLR events. - //======================================================================== - + /// + /// Implements a Python descriptor type that provides access to CLR events. + /// internal class EventObject : ExtensionType { internal string name; @@ -22,10 +21,9 @@ public EventObject(EventInfo info) : base() } - //==================================================================== - // Register a new Python object event handler with the event. - //==================================================================== - + /// + /// Register a new Python object event handler with the event. + /// internal bool AddEventHandler(IntPtr target, IntPtr handler) { Object obj = null; @@ -71,10 +69,9 @@ internal bool AddEventHandler(IntPtr target, IntPtr handler) } - //==================================================================== - // Remove the given Python object event handler. - //==================================================================== - + /// + /// Remove the given Python object event handler. + /// internal bool RemoveEventHandler(IntPtr target, IntPtr handler) { Object obj = null; @@ -128,11 +125,10 @@ internal bool RemoveEventHandler(IntPtr target, IntPtr handler) } - //==================================================================== - // Descriptor __get__ implementation. A getattr on an event returns - // a "bound" event that keeps a reference to the object instance. - //==================================================================== - + /// + /// Descriptor __get__ implementation. A getattr on an event returns + /// a "bound" event that keeps a reference to the object instance. + /// public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) { EventObject self = GetManagedObject(ds) as EventObject; @@ -168,14 +164,13 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) } - //==================================================================== - // Descriptor __set__ implementation. This actually never allows you - // to set anything; it exists solely to support the '+=' spelling of - // event handler registration. The reason is that given code like: - // 'ob.SomeEvent += method', Python will attempt to set the attribute - // SomeEvent on ob to the result of the '+=' operation. - //==================================================================== - + /// + /// Descriptor __set__ implementation. This actually never allows you + /// to set anything; it exists solely to support the '+=' spelling of + /// event handler registration. The reason is that given code like: + /// 'ob.SomeEvent += method', Python will attempt to set the attribute + /// SomeEvent on ob to the result of the '+=' operation. + /// public static new int tp_descr_set(IntPtr ds, IntPtr ob, IntPtr val) { EventBinding e = GetManagedObject(val) as EventBinding; @@ -191,10 +186,9 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) } - //==================================================================== - // Descriptor __repr__ implementation. - //==================================================================== - + /// + /// Descriptor __repr__ implementation. + /// public static IntPtr tp_repr(IntPtr ob) { EventObject self = (EventObject)GetManagedObject(ob); @@ -203,10 +197,9 @@ public static IntPtr tp_repr(IntPtr ob) } - //==================================================================== - // Descriptor dealloc implementation. - //==================================================================== - + /// + /// Descriptor dealloc implementation. + /// public static new void tp_dealloc(IntPtr ob) { EventObject self = (EventObject)GetManagedObject(ob); diff --git a/src/runtime/exceptions.cs b/src/runtime/exceptions.cs index 429c09212..448655213 100644 --- a/src/runtime/exceptions.cs +++ b/src/runtime/exceptions.cs @@ -38,10 +38,9 @@ internal static Exception ToException(IntPtr ob) return e; } - //==================================================================== - // Exception __str__ implementation - //==================================================================== - + /// + /// Exception __str__ implementation + /// public new static IntPtr tp_str(IntPtr ob) { Exception e = ToException(ob); @@ -78,10 +77,9 @@ private Exceptions() { } - //=================================================================== - // Initialization performed on startup of the Python runtime. - //=================================================================== - + /// + /// Initialization performed on startup of the Python runtime. + /// internal static void Initialize() { #if PYTHON3 @@ -111,10 +109,9 @@ internal static void Initialize() } - //=================================================================== - // Cleanup resources upon shutdown of the Python runtime. - //=================================================================== - + /// + /// Cleanup resources upon shutdown of the Python runtime. + /// internal static void Shutdown() { if (0 != Runtime.Py_IsInitialized()) diff --git a/src/runtime/extensiontype.cs b/src/runtime/extensiontype.cs index 769904444..a09f57696 100644 --- a/src/runtime/extensiontype.cs +++ b/src/runtime/extensiontype.cs @@ -46,10 +46,9 @@ public ExtensionType() : base() } - //==================================================================== - // Common finalization code to support custom tp_deallocs. - //==================================================================== - + /// + /// Common finalization code to support custom tp_deallocs. + /// public static void FinalizeObject(ManagedType self) { Runtime.PyObject_GC_Del(self.pyHandle); @@ -58,10 +57,9 @@ public static void FinalizeObject(ManagedType self) } - //==================================================================== - // Type __setattr__ implementation. - //==================================================================== - + /// + /// Type __setattr__ implementation. + /// public static int tp_setattro(IntPtr ob, IntPtr key, IntPtr val) { string message = "type does not support setting attributes"; @@ -74,11 +72,10 @@ public static int tp_setattro(IntPtr ob, IntPtr key, IntPtr val) } - //==================================================================== - // Default __set__ implementation - this prevents descriptor instances - // being silently replaced in a type __dict__ by default __setattr__. - //==================================================================== - + /// + /// Default __set__ implementation - this prevents descriptor instances + /// being silently replaced in a type __dict__ by default __setattr__. + /// public static int tp_descr_set(IntPtr ds, IntPtr ob, IntPtr val) { string message = "attribute is read-only"; @@ -87,10 +84,9 @@ public static int tp_descr_set(IntPtr ds, IntPtr ob, IntPtr val) } - //==================================================================== - // Required Python GC support. - //==================================================================== - + /// + /// Required Python GC support. + /// public static int tp_traverse(IntPtr ob, IntPtr func, IntPtr args) { return 0; @@ -109,10 +105,9 @@ public static int tp_is_gc(IntPtr type) } - //==================================================================== - // Default dealloc implementation. - //==================================================================== - + /// + /// Default dealloc implementation. + /// public static void tp_dealloc(IntPtr ob) { // Clean up a Python instance of this extension type. This diff --git a/src/runtime/fieldobject.cs b/src/runtime/fieldobject.cs index 53597aee7..3d65f5fd3 100644 --- a/src/runtime/fieldobject.cs +++ b/src/runtime/fieldobject.cs @@ -5,10 +5,9 @@ namespace Python.Runtime { - //======================================================================== - // Implements a Python descriptor type that provides access to CLR fields. - //======================================================================== - + /// + /// Implements a Python descriptor type that provides access to CLR fields. + /// internal class FieldObject : ExtensionType { FieldInfo info; @@ -18,12 +17,11 @@ public FieldObject(FieldInfo info) : base() this.info = info; } - //==================================================================== - // Descriptor __get__ implementation. This method returns the - // value of the field on the given object. The returned value - // is converted to an appropriately typed Python object. - //==================================================================== - + /// + /// Descriptor __get__ implementation. This method returns the + /// value of the field on the given object. The returned value + /// is converted to an appropriately typed Python object. + /// public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) { FieldObject self = (FieldObject)GetManagedObject(ds); @@ -69,12 +67,11 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) } } - //==================================================================== - // Descriptor __set__ implementation. This method sets the value of - // a field based on the given Python value. The Python value must be - // convertible to the type of the field. - //==================================================================== - + /// + /// Descriptor __set__ implementation. This method sets the value of + /// a field based on the given Python value. The Python value must be + /// convertible to the type of the field. + /// public static new int tp_descr_set(IntPtr ds, IntPtr ob, IntPtr val) { FieldObject self = (FieldObject)GetManagedObject(ds); @@ -136,10 +133,9 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) } } - //==================================================================== - // Descriptor __repr__ implementation. - //==================================================================== - + /// + /// Descriptor __repr__ implementation. + /// public static IntPtr tp_repr(IntPtr ob) { FieldObject self = (FieldObject)GetManagedObject(ob); diff --git a/src/runtime/generictype.cs b/src/runtime/generictype.cs index 19cde37bf..761efc045 100644 --- a/src/runtime/generictype.cs +++ b/src/runtime/generictype.cs @@ -15,10 +15,9 @@ internal GenericType(Type tp) : base(tp) { } - //==================================================================== - // Implements __new__ for reflected generic types. - //==================================================================== - + /// + /// Implements __new__ for reflected generic types. + /// public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) { Exceptions.SetError(Exceptions.TypeError, "cannot instantiate an open generic type"); @@ -26,10 +25,9 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) } - //==================================================================== - // Implements __call__ for reflected generic types. - //==================================================================== - + /// + /// Implements __call__ for reflected generic types. + /// public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) { Exceptions.SetError(Exceptions.TypeError, "object is not callable"); diff --git a/src/runtime/genericutil.cs b/src/runtime/genericutil.cs index 9870b2a5b..6568ac438 100644 --- a/src/runtime/genericutil.cs +++ b/src/runtime/genericutil.cs @@ -24,10 +24,9 @@ static GenericUtil() mapping = new Dictionary>>(); } - //==================================================================== - // Register a generic type that appears in a given namespace. - //==================================================================== - + /// + /// Register a generic type that appears in a given namespace. + /// internal static void Register(Type t) { if (null == t.Namespace || null == t.Name) @@ -56,10 +55,9 @@ internal static void Register(Type t) gnames.Add(t.Name); } - //==================================================================== - // xxx - //==================================================================== - + /// + /// xxx + /// public static List GetGenericBaseNames(string ns) { Dictionary> nsmap = null; @@ -76,10 +74,9 @@ public static List GetGenericBaseNames(string ns) return names; } - //==================================================================== - // xxx - //==================================================================== - + /// + /// xxx + /// public static Type GenericForType(Type t, int paramCount) { return GenericByName(t.Namespace, t.Name, paramCount); @@ -136,10 +133,9 @@ public static List GenericsByName(string ns, string basename) return result; } - //==================================================================== - // xxx - //==================================================================== - + /// + /// xxx + /// public static string GenericNameForBaseName(string ns, string name) { Dictionary> nsmap = null; diff --git a/src/runtime/importhook.cs b/src/runtime/importhook.cs index 851bf49d7..68d81ac14 100644 --- a/src/runtime/importhook.cs +++ b/src/runtime/importhook.cs @@ -4,10 +4,9 @@ namespace Python.Runtime { - //======================================================================== - // Implements the "import hook" used to integrate Python with the CLR. - //======================================================================== - + /// + /// Implements the "import hook" used to integrate Python with the CLR. + /// internal class ImportHook { static IntPtr py_import; @@ -25,10 +24,9 @@ internal static void InitializeModuleDef() } #endif - //=================================================================== - // Initialization performed on startup of the Python runtime. - //=================================================================== - + /// + /// Initialization performed on startup of the Python runtime. + /// internal static void Initialize() { // Initialize the Python <--> CLR module hook. We replace the @@ -70,10 +68,9 @@ internal static void Initialize() } - //=================================================================== - // Cleanup resources upon shutdown of the Python runtime. - //=================================================================== - + /// + /// Cleanup resources upon shutdown of the Python runtime. + /// internal static void Shutdown() { if (0 != Runtime.Py_IsInitialized()) @@ -88,9 +85,9 @@ internal static void Shutdown() } } - //=================================================================== - // Return the clr python module (new reference) - //=================================================================== + /// + /// Return the clr python module (new reference) + /// public static IntPtr GetCLRModule(IntPtr? fromList = null) { root.InitializePreload(); @@ -146,10 +143,9 @@ public static IntPtr GetCLRModule(IntPtr? fromList = null) #endif } - //=================================================================== - // The actual import hook that ties Python to the managed world. - //=================================================================== - + /// + /// The actual import hook that ties Python to the managed world. + /// public static IntPtr __import__(IntPtr self, IntPtr args, IntPtr kw) { // Replacement for the builtin __import__. The original import diff --git a/src/runtime/indexer.cs b/src/runtime/indexer.cs index 06355c9f7..7f0b6fe10 100644 --- a/src/runtime/indexer.cs +++ b/src/runtime/indexer.cs @@ -5,10 +5,9 @@ namespace Python.Runtime { - //======================================================================== - // Bundles the information required to support an indexer property. - //======================================================================== - + /// + /// Bundles the information required to support an indexer property. + /// internal class Indexer { public MethodBinder GetterBinder; @@ -81,7 +80,7 @@ internal bool NeedsDefaultArgs(IntPtr args) /// /// This will return default arguments a new instance of a tuple. The size - /// of the tuple will indicate the number of default arguments. + /// of the tuple will indicate the number of default arguments. /// /// This is pointing to the tuple args passed in /// a new instance of the tuple containing the default args diff --git a/src/runtime/interfaceobject.cs b/src/runtime/interfaceobject.cs index 076ecc727..8e64c24d7 100644 --- a/src/runtime/interfaceobject.cs +++ b/src/runtime/interfaceobject.cs @@ -30,10 +30,9 @@ static InterfaceObject() cc_attr = typeof(CoClassAttribute); } - //==================================================================== - // Implements __new__ for reflected interface types. - //==================================================================== - + /// + /// Implements __new__ for reflected interface types. + /// public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) { InterfaceObject self = (InterfaceObject)GetManagedObject(tp); diff --git a/src/runtime/interop.cs b/src/runtime/interop.cs index 9be8169d2..148ca2d2c 100644 --- a/src/runtime/interop.cs +++ b/src/runtime/interop.cs @@ -7,12 +7,11 @@ namespace Python.Runtime { - //======================================================================= - // This file defines objects to support binary interop with the Python - // runtime. Generally, the definitions here need to be kept up to date - // when moving to new Python versions. - //======================================================================= - + /// + /// This file defines objects to support binary interop with the Python + /// runtime. Generally, the definitions here need to be kept up to date + /// when moving to new Python versions. + /// [Serializable()] [AttributeUsage(AttributeTargets.All)] public class DocStringAttribute : Attribute diff --git a/src/runtime/iterator.cs b/src/runtime/iterator.cs index dcab722f1..f2a32deb4 100644 --- a/src/runtime/iterator.cs +++ b/src/runtime/iterator.cs @@ -4,11 +4,10 @@ namespace Python.Runtime { - //======================================================================== - // Implements a generic Python iterator for IEnumerable objects and - // managed array objects. This supports 'for i in object:' in Python. - //======================================================================== - + /// + /// Implements a generic Python iterator for IEnumerable objects and + /// managed array objects. This supports 'for i in object:' in Python. + /// internal class Iterator : ExtensionType { IEnumerator iter; @@ -19,10 +18,9 @@ public Iterator(IEnumerator e) : base() } - //==================================================================== - // Implements support for the Python iteration protocol. - //==================================================================== - + /// + /// Implements support for the Python iteration protocol. + /// public static IntPtr tp_iternext(IntPtr ob) { Iterator self = GetManagedObject(ob) as Iterator; diff --git a/src/runtime/managedtype.cs b/src/runtime/managedtype.cs index ebb2057b9..0d46f2366 100644 --- a/src/runtime/managedtype.cs +++ b/src/runtime/managedtype.cs @@ -5,12 +5,11 @@ namespace Python.Runtime { - //======================================================================== - // Common base class for all objects that are implemented in managed - // code. It defines the common fields that associate CLR and Python - // objects and common utilities to convert between those identities. - //======================================================================== - + /// + /// Common base class for all objects that are implemented in managed + /// code. It defines the common fields that associate CLR and Python + /// objects and common utilities to convert between those identities. + /// internal abstract class ManagedType { internal GCHandle gcHandle; // Native handle @@ -18,10 +17,9 @@ internal abstract class ManagedType internal IntPtr tpHandle; // PyType * - //==================================================================== - // Given a Python object, return the associated managed object or null. - //==================================================================== - + /// + /// Given a Python object, return the associated managed object or null. + /// internal static ManagedType GetManagedObject(IntPtr ob) { if (ob != IntPtr.Zero) diff --git a/src/runtime/metatype.cs b/src/runtime/metatype.cs index b1761c2d7..6701a2a07 100644 --- a/src/runtime/metatype.cs +++ b/src/runtime/metatype.cs @@ -5,21 +5,19 @@ namespace Python.Runtime { - //======================================================================== - // The managed metatype. This object implements the type of all reflected - // types. It also provides support for single-inheritance from reflected - // managed types. - //======================================================================== - + /// + /// The managed metatype. This object implements the type of all reflected + /// types. It also provides support for single-inheritance from reflected + /// managed types. + /// internal class MetaType : ManagedType { static IntPtr PyCLRMetaType; - //==================================================================== - // Metatype initialization. This bootstraps the CLR metatype to life. - //==================================================================== - + /// + /// Metatype initialization. This bootstraps the CLR metatype to life. + /// public static IntPtr Initialize() { PyCLRMetaType = TypeManager.CreateMetaType(typeof(MetaType)); @@ -27,11 +25,10 @@ public static IntPtr Initialize() } - //==================================================================== - // Metatype __new__ implementation. This is called to create a new - // class / type when a reflected class is subclassed. - //==================================================================== - + /// + /// Metatype __new__ implementation. This is called to create a new + /// class / type when a reflected class is subclassed. + /// public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) { int len = Runtime.PyTuple_Size(args); @@ -141,12 +138,11 @@ public static void tp_free(IntPtr tp) } - //==================================================================== - // Metatype __call__ implementation. This is needed to ensure correct - // initialization (__init__ support), because the tp_call we inherit - // from PyType_Type won't call __init__ for metatypes it doesnt know. - //==================================================================== - + /// + /// Metatype __call__ implementation. This is needed to ensure correct + /// initialization (__init__ support), because the tp_call we inherit + /// from PyType_Type won't call __init__ for metatypes it doesnt know. + /// public static IntPtr tp_call(IntPtr tp, IntPtr args, IntPtr kw) { IntPtr func = Marshal.ReadIntPtr(tp, TypeOffset.tp_new); @@ -192,14 +188,13 @@ public static IntPtr tp_call(IntPtr tp, IntPtr args, IntPtr kw) } - //==================================================================== - // Type __setattr__ implementation for reflected types. Note that this - // is slightly different than the standard setattr implementation for - // the normal Python metatype (PyTypeType). We need to look first in - // the type object of a reflected type for a descriptor in order to - // support the right setattr behavior for static fields and properties. - //==================================================================== - + /// + /// Type __setattr__ implementation for reflected types. Note that this + /// is slightly different than the standard setattr implementation for + /// the normal Python metatype (PyTypeType). We need to look first in + /// the type object of a reflected type for a descriptor in order to + /// support the right setattr behavior for static fields and properties. + /// public static int tp_setattro(IntPtr tp, IntPtr name, IntPtr value) { IntPtr descr = Runtime._PyType_Lookup(tp, name); @@ -232,11 +227,11 @@ public static int tp_setattro(IntPtr tp, IntPtr name, IntPtr value) return res; } - //==================================================================== - // The metatype has to implement [] semantics for generic types, so - // here we just delegate to the generic type def implementation. Its - // own mp_subscript - //==================================================================== + /// + /// The metatype has to implement [] semantics for generic types, so + /// here we just delegate to the generic type def implementation. Its + /// own mp_subscript + /// public static IntPtr mp_subscript(IntPtr tp, IntPtr idx) { ClassBase cb = GetManagedObject(tp) as ClassBase; @@ -247,11 +242,10 @@ public static IntPtr mp_subscript(IntPtr tp, IntPtr idx) return Exceptions.RaiseTypeError("unsubscriptable object"); } - //==================================================================== - // Dealloc implementation. This is called when a Python type generated - // by this metatype is no longer referenced from the Python runtime. - //==================================================================== - + /// + /// Dealloc implementation. This is called when a Python type generated + /// by this metatype is no longer referenced from the Python runtime. + /// public static void tp_dealloc(IntPtr tp) { // Fix this when we dont cheat on the handle for subclasses! diff --git a/src/runtime/methodbinder.cs b/src/runtime/methodbinder.cs index c4d41d156..651791599 100644 --- a/src/runtime/methodbinder.cs +++ b/src/runtime/methodbinder.cs @@ -4,13 +4,12 @@ namespace Python.Runtime { - //======================================================================== - // A MethodBinder encapsulates information about a (possibly overloaded) - // managed method, and is responsible for selecting the right method given - // a set of Python arguments. This is also used as a base class for the - // ConstructorBinder, a minor variation used to invoke constructors. - //======================================================================== - + /// + /// A MethodBinder encapsulates information about a (possibly overloaded) + /// managed method, and is responsible for selecting the right method given + /// a set of Python arguments. This is also used as a base class for the + /// ConstructorBinder, a minor variation used to invoke constructors. + /// internal class MethodBinder { public ArrayList list; @@ -39,11 +38,10 @@ internal void AddMethod(MethodBase m) this.list.Add(m); } - //==================================================================== - // Given a sequence of MethodInfo and a sequence of types, return the - // MethodInfo that matches the signature represented by those types. - //==================================================================== - + /// + /// Given a sequence of MethodInfo and a sequence of types, return the + /// MethodInfo that matches the signature represented by those types. + /// internal static MethodInfo MatchSignature(MethodInfo[] mi, Type[] tp) { if (tp == null) @@ -73,11 +71,10 @@ internal static MethodInfo MatchSignature(MethodInfo[] mi, Type[] tp) return null; } - //==================================================================== - // Given a sequence of MethodInfo and a sequence of type parameters, - // return the MethodInfo that represents the matching closed generic. - //==================================================================== - + /// + /// Given a sequence of MethodInfo and a sequence of type parameters, + /// return the MethodInfo that represents the matching closed generic. + /// internal static MethodInfo MatchParameters(MethodInfo[] mi, Type[] tp) { if (tp == null) @@ -102,11 +99,10 @@ internal static MethodInfo MatchParameters(MethodInfo[] mi, Type[] tp) } - //==================================================================== - // Given a sequence of MethodInfo and two sequences of type parameters, - // return the MethodInfo that matches the signature and the closed generic. - //==================================================================== - + /// + /// Given a sequence of MethodInfo and two sequences of type parameters, + /// return the MethodInfo that matches the signature and the closed generic. + /// internal static MethodInfo MatchSignatureAndParameters(MethodInfo[] mi, Type[] genericTp, Type[] sigTp) { if ((genericTp == null) || (sigTp == null)) @@ -153,12 +149,11 @@ internal static MethodInfo MatchSignatureAndParameters(MethodInfo[] mi, Type[] g } - //==================================================================== - // Return the array of MethodInfo for this method. The result array - // is arranged in order of precendence (done lazily to avoid doing it - // at all for methods that are never called). - //==================================================================== - + /// + /// Return the array of MethodInfo for this method. The result array + /// is arranged in order of precendence (done lazily to avoid doing it + /// at all for methods that are never called). + /// internal MethodBase[] GetMethods() { if (!init) @@ -171,11 +166,10 @@ internal MethodBase[] GetMethods() return methods; } - //==================================================================== - // Precedence algorithm largely lifted from jython - the concerns are - // generally the same so we'll start w/this and tweak as necessary. - //==================================================================== - + /// + /// Precedence algorithm largely lifted from jython - the concerns are + /// generally the same so we'll start w/this and tweak as necessary. + /// internal static int GetPrecedence(MethodBase mi) { ParameterInfo[] pi = mi.GetParameters(); @@ -191,10 +185,9 @@ internal static int GetPrecedence(MethodBase mi) return val; } - //==================================================================== - // Return a precedence value for a particular Type object. - //==================================================================== - + /// + /// Return a precedence value for a particular Type object. + /// internal static int ArgPrecedence(Type t) { Type objectType = typeof(Object); @@ -242,12 +235,11 @@ internal static int ArgPrecedence(Type t) return 2000; } - //==================================================================== - // Bind the given Python instance and arguments to a particular method - // overload and return a structure that contains the converted Python - // instance, converted arguments and the correct method to call. - //==================================================================== - + /// + /// Bind the given Python instance and arguments to a particular method + /// overload and return a structure that contains the converted Python + /// instance, converted arguments and the correct method to call. + /// internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw) { return this.Bind(inst, args, kw, null, null); @@ -567,10 +559,9 @@ internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw, MethodBase i } - //======================================================================== - // Utility class to sort method info by parameter type precedence. - //======================================================================== - + /// + /// Utility class to sort method info by parameter type precedence. + /// internal class MethodSorter : IComparer { int IComparer.Compare(Object m1, Object m2) @@ -586,12 +577,11 @@ int IComparer.Compare(Object m1, Object m2) } - //======================================================================== - // A Binding is a utility instance that bundles together a MethodInfo - // representing a method to call, a (possibly null) target instance for - // the call, and the arguments for the call (all as managed values). - //======================================================================== - + /// + /// A Binding is a utility instance that bundles together a MethodInfo + /// representing a method to call, a (possibly null) target instance for + /// the call, and the arguments for the call (all as managed values). + /// internal class Binding { public MethodBase info; diff --git a/src/runtime/methodbinding.cs b/src/runtime/methodbinding.cs index 9d328381f..878779989 100644 --- a/src/runtime/methodbinding.cs +++ b/src/runtime/methodbinding.cs @@ -4,12 +4,11 @@ namespace Python.Runtime { - //======================================================================== - // Implements a Python binding type for CLR methods. These work much like - // standard Python method bindings, but the same type is used to bind - // both static and instance methods. - //======================================================================== - + /// + /// Implements a Python binding type for CLR methods. These work much like + /// standard Python method bindings, but the same type is used to bind + /// both static and instance methods. + /// internal class MethodBinding : ExtensionType { internal MethodInfo info; @@ -35,10 +34,9 @@ public MethodBinding(MethodObject m, IntPtr target) : this(m, target, IntPtr.Zer { } - //==================================================================== - // Implement binding of generic methods using the subscript syntax []. - //==================================================================== - + /// + /// Implement binding of generic methods using the subscript syntax []. + /// public static IntPtr mp_subscript(IntPtr tp, IntPtr idx) { MethodBinding self = (MethodBinding)GetManagedObject(tp); @@ -63,10 +61,9 @@ public static IntPtr mp_subscript(IntPtr tp, IntPtr idx) } - //==================================================================== - // MethodBinding __getattribute__ implementation. - //==================================================================== - + /// + /// MethodBinding __getattribute__ implementation. + /// public static IntPtr tp_getattro(IntPtr ob, IntPtr key) { MethodBinding self = (MethodBinding)GetManagedObject(ob); @@ -97,10 +94,9 @@ public static IntPtr tp_getattro(IntPtr ob, IntPtr key) } - //==================================================================== - // MethodBinding __call__ implementation. - //==================================================================== - + /// + /// MethodBinding __call__ implementation. + /// public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) { MethodBinding self = (MethodBinding)GetManagedObject(ob); @@ -187,10 +183,9 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) } - //==================================================================== - // MethodBinding __hash__ implementation. - //==================================================================== - + /// + /// MethodBinding __hash__ implementation. + /// public static IntPtr tp_hash(IntPtr ob) { MethodBinding self = (MethodBinding)GetManagedObject(ob); @@ -222,10 +217,9 @@ public static IntPtr tp_hash(IntPtr ob) return new IntPtr(x); } - //==================================================================== - // MethodBinding __repr__ implementation. - //==================================================================== - + /// + /// MethodBinding __repr__ implementation. + /// public static IntPtr tp_repr(IntPtr ob) { MethodBinding self = (MethodBinding)GetManagedObject(ob); @@ -234,10 +228,9 @@ public static IntPtr tp_repr(IntPtr ob) return Runtime.PyString_FromStringAndSize(s, s.Length); } - //==================================================================== - // MethodBinding dealloc implementation. - //==================================================================== - + /// + /// MethodBinding dealloc implementation. + /// public static new void tp_dealloc(IntPtr ob) { MethodBinding self = (MethodBinding)GetManagedObject(ob); diff --git a/src/runtime/methodobject.cs b/src/runtime/methodobject.cs index b3e1a66c5..d30188d44 100644 --- a/src/runtime/methodobject.cs +++ b/src/runtime/methodobject.cs @@ -4,12 +4,13 @@ namespace Python.Runtime { - //======================================================================== - // Implements a Python type that represents a CLR method. Method objects - // support a subscript syntax [] to allow explicit overload selection. - //======================================================================== - // TODO: ForbidPythonThreadsAttribute per method info - + /// + /// Implements a Python type that represents a CLR method. Method objects + /// support a subscript syntax [] to allow explicit overload selection. + /// + /// + /// TODO: ForbidPythonThreadsAttribute per method info + /// internal class MethodObject : ExtensionType { internal MethodInfo[] info; @@ -58,10 +59,9 @@ public virtual IntPtr Invoke(IntPtr target, IntPtr args, IntPtr kw, MethodBase i return binder.Invoke(target, args, kw, info, this.info); } - //==================================================================== - // Helper to get docstrings from reflected method / param info. - //==================================================================== - + /// + /// Helper to get docstrings from reflected method / param info. + /// internal IntPtr GetDocString() { if (doc != IntPtr.Zero) @@ -91,28 +91,27 @@ internal IntPtr GetDocString() } - //==================================================================== - // This is a little tricky: a class can actually have a static method - // and instance methods all with the same name. That makes it tough - // to support calling a method 'unbound' (passing the instance as the - // first argument), because in this case we can't know whether to call - // the instance method unbound or call the static method. - // - // The rule we is that if there are both instance and static methods - // with the same name, then we always call the static method. So this - // method returns true if any of the methods that are represented by - // the descriptor are static methods (called by MethodBinding). - //==================================================================== - + /// + /// This is a little tricky: a class can actually have a static method + /// and instance methods all with the same name. That makes it tough + /// to support calling a method 'unbound' (passing the instance as the + /// first argument), because in this case we can't know whether to call + /// the instance method unbound or call the static method. + /// + /// + /// The rule we is that if there are both instance and static methods + /// with the same name, then we always call the static method. So this + /// method returns true if any of the methods that are represented by + /// the descriptor are static methods (called by MethodBinding). + /// internal bool IsStatic() { return this.is_static; } - //==================================================================== - // Descriptor __getattribute__ implementation. - //==================================================================== - + /// + /// Descriptor __getattribute__ implementation. + /// public static IntPtr tp_getattro(IntPtr ob, IntPtr key) { MethodObject self = (MethodObject)GetManagedObject(ob); @@ -133,11 +132,10 @@ public static IntPtr tp_getattro(IntPtr ob, IntPtr key) return Runtime.PyObject_GenericGetAttr(ob, key); } - //==================================================================== - // Descriptor __get__ implementation. Accessing a CLR method returns - // a "bound" method similar to a Python bound method. - //==================================================================== - + /// + /// Descriptor __get__ implementation. Accessing a CLR method returns + /// a "bound" method similar to a Python bound method. + /// public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) { MethodObject self = (MethodObject)GetManagedObject(ds); @@ -183,10 +181,9 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) return binding.pyHandle; } - //==================================================================== - // Descriptor __repr__ implementation. - //==================================================================== - + /// + /// Descriptor __repr__ implementation. + /// public static IntPtr tp_repr(IntPtr ob) { MethodObject self = (MethodObject)GetManagedObject(ob); @@ -194,10 +191,9 @@ public static IntPtr tp_repr(IntPtr ob) return Runtime.PyString_FromStringAndSize(s, s.Length); } - //==================================================================== - // Descriptor dealloc implementation. - //==================================================================== - + /// + /// Descriptor dealloc implementation. + /// public static new void tp_dealloc(IntPtr ob) { MethodObject self = (MethodObject)GetManagedObject(ob); diff --git a/src/runtime/modulefunctionobject.cs b/src/runtime/modulefunctionobject.cs index 667b37fe9..b6f2899d8 100644 --- a/src/runtime/modulefunctionobject.cs +++ b/src/runtime/modulefunctionobject.cs @@ -22,20 +22,18 @@ public ModuleFunctionObject(Type type, string name, MethodInfo[] info, bool allo } } - //==================================================================== - // __call__ implementation. - //==================================================================== - + /// + /// __call__ implementation. + /// public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) { ModuleFunctionObject self = (ModuleFunctionObject)GetManagedObject(ob); return self.Invoke(ob, args, kw); } - //==================================================================== - // __repr__ implementation. - //==================================================================== - + /// + /// __repr__ implementation. + /// public static new IntPtr tp_repr(IntPtr ob) { ModuleFunctionObject self = (ModuleFunctionObject)GetManagedObject(ob); diff --git a/src/runtime/moduleobject.cs b/src/runtime/moduleobject.cs index c4fec976b..3b9ad94a9 100644 --- a/src/runtime/moduleobject.cs +++ b/src/runtime/moduleobject.cs @@ -7,11 +7,10 @@ namespace Python.Runtime { - //======================================================================== - // Implements a Python type that provides access to CLR namespaces. The - // type behaves like a Python module, and can contain other sub-modules. - //======================================================================== - + /// + /// Implements a Python type that provides access to CLR namespaces. The + /// type behaves like a Python module, and can contain other sub-modules. + /// internal class ModuleObject : ExtensionType { Dictionary cache; @@ -61,13 +60,12 @@ public ModuleObject(string name) : base() } - //=================================================================== - // Returns a ClassBase object representing a type that appears in - // this module's namespace or a ModuleObject representing a child - // namespace (or null if the name is not found). This method does - // not increment the Python refcount of the returned object. - //=================================================================== - + /// + /// Returns a ClassBase object representing a type that appears in + /// this module's namespace or a ModuleObject representing a child + /// namespace (or null if the name is not found). This method does + /// not increment the Python refcount of the returned object. + /// public ManagedType GetAttribute(string name, bool guess) { ManagedType cached = null; @@ -175,10 +173,9 @@ public ManagedType GetAttribute(string name, bool guess) } - //=================================================================== - // Stores an attribute in the instance dict for future lookups. - //=================================================================== - + /// + /// Stores an attribute in the instance dict for future lookups. + /// private void StoreAttribute(string name, ManagedType ob) { Runtime.PyDict_SetItemString(dict, name, ob.pyHandle); @@ -186,12 +183,11 @@ private void StoreAttribute(string name, ManagedType ob) } - //=================================================================== - // Preloads all currently-known names for the module namespace. This - // can be called multiple times, to add names from assemblies that - // may have been loaded since the last call to the method. - //=================================================================== - + /// + /// Preloads all currently-known names for the module namespace. This + /// can be called multiple times, to add names from assemblies that + /// may have been loaded since the last call to the method. + /// public void LoadNames() { ManagedType m = null; @@ -253,13 +249,12 @@ internal void InitializeModuleMembers() } - //==================================================================== - // ModuleObject __getattribute__ implementation. Module attributes - // are always either classes or sub-modules representing subordinate - // namespaces. CLR modules implement a lazy pattern - the sub-modules - // and classes are created when accessed and cached for future use. - //==================================================================== - + /// + /// ModuleObject __getattribute__ implementation. Module attributes + /// are always either classes or sub-modules representing subordinate + /// namespaces. CLR modules implement a lazy pattern - the sub-modules + /// and classes are created when accessed and cached for future use. + /// public static IntPtr tp_getattro(IntPtr ob, IntPtr key) { ModuleObject self = (ModuleObject)GetManagedObject(ob); @@ -296,10 +291,9 @@ public static IntPtr tp_getattro(IntPtr ob, IntPtr key) return attr.pyHandle; } - //==================================================================== - // ModuleObject __repr__ implementation. - //==================================================================== - + /// + /// ModuleObject __repr__ implementation. + /// public static IntPtr tp_repr(IntPtr ob) { ModuleObject self = (ModuleObject)GetManagedObject(ob); diff --git a/src/runtime/overload.cs b/src/runtime/overload.cs index e7d548a23..a183863d6 100644 --- a/src/runtime/overload.cs +++ b/src/runtime/overload.cs @@ -3,11 +3,10 @@ namespace Python.Runtime { - //======================================================================== - // Implements the __overloads__ attribute of method objects. This object - // supports the [] syntax to explicitly select an overload by signature. - //======================================================================== - + /// + /// Implements the __overloads__ attribute of method objects. This object + /// supports the [] syntax to explicitly select an overload by signature. + /// internal class OverloadMapper : ExtensionType { MethodObject m; @@ -20,10 +19,9 @@ public OverloadMapper(MethodObject m, IntPtr target) : base() this.m = m; } - //==================================================================== - // Implement explicit overload selection using subscript syntax ([]). - //==================================================================== - + /// + /// Implement explicit overload selection using subscript syntax ([]). + /// public static IntPtr mp_subscript(IntPtr tp, IntPtr idx) { OverloadMapper self = (OverloadMapper)GetManagedObject(tp); @@ -51,10 +49,9 @@ public static IntPtr mp_subscript(IntPtr tp, IntPtr idx) return mb.pyHandle; } - //==================================================================== - // OverloadMapper __repr__ implementation. - //==================================================================== - + /// + /// OverloadMapper __repr__ implementation. + /// public static IntPtr tp_repr(IntPtr op) { OverloadMapper self = (OverloadMapper)GetManagedObject(op); @@ -63,10 +60,9 @@ public static IntPtr tp_repr(IntPtr op) return doc; } - //==================================================================== - // OverloadMapper dealloc implementation. - //==================================================================== - + /// + /// OverloadMapper dealloc implementation. + /// public static new void tp_dealloc(IntPtr ob) { OverloadMapper self = (OverloadMapper)GetManagedObject(ob); diff --git a/src/runtime/propertyobject.cs b/src/runtime/propertyobject.cs index bfb70899f..ea029cc91 100644 --- a/src/runtime/propertyobject.cs +++ b/src/runtime/propertyobject.cs @@ -5,10 +5,9 @@ namespace Python.Runtime { - //======================================================================== - // Implements a Python descriptor type that manages CLR properties. - //======================================================================== - + /// + /// Implements a Python descriptor type that manages CLR properties. + /// internal class PropertyObject : ExtensionType { PropertyInfo info; @@ -24,12 +23,11 @@ public PropertyObject(PropertyInfo md) : base() } - //==================================================================== - // Descriptor __get__ implementation. This method returns the - // value of the property on the given object. The returned value - // is converted to an appropriately typed Python object. - //==================================================================== - + /// + /// Descriptor __get__ implementation. This method returns the + /// value of the property on the given object. The returned value + /// is converted to an appropriately typed Python object. + /// public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) { PropertyObject self = (PropertyObject)GetManagedObject(ds); @@ -85,12 +83,11 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) } - //==================================================================== - // Descriptor __set__ implementation. This method sets the value of - // a property based on the given Python value. The Python value must - // be convertible to the type of the property. - //==================================================================== - + /// + /// Descriptor __set__ implementation. This method sets the value of + /// a property based on the given Python value. The Python value must + /// be convertible to the type of the property. + /// public static new int tp_descr_set(IntPtr ds, IntPtr ob, IntPtr val) { PropertyObject self = (PropertyObject)GetManagedObject(ds); @@ -156,10 +153,9 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) } - //==================================================================== - // Descriptor __repr__ implementation. - //==================================================================== - + /// + /// Descriptor __repr__ implementation. + /// public static IntPtr tp_repr(IntPtr ob) { PropertyObject self = (PropertyObject)GetManagedObject(ob); diff --git a/src/runtime/pyansistring.cs b/src/runtime/pyansistring.cs index 71dec3362..d15961ee3 100644 --- a/src/runtime/pyansistring.cs +++ b/src/runtime/pyansistring.cs @@ -7,7 +7,6 @@ public class PyAnsiString : PySequence /// /// PyAnsiString Constructor /// - /// /// /// Creates a new PyAnsiString from an existing object reference. Note /// that the instance assumes ownership of the object reference. @@ -21,7 +20,6 @@ public PyAnsiString(IntPtr ptr) : base(ptr) /// /// PyString Constructor /// - /// /// /// Copy constructor - obtain a PyAnsiString from a generic PyObject. /// An ArgumentException will be thrown if the given object is not @@ -41,7 +39,6 @@ public PyAnsiString(PyObject o) : base() /// /// PyAnsiString Constructor /// - /// /// /// Creates a Python string from a managed string. /// @@ -58,7 +55,6 @@ public PyAnsiString(string s) : base() /// /// IsStringType Method /// - /// /// /// Returns true if the given object is a Python string. /// diff --git a/src/runtime/pydict.cs b/src/runtime/pydict.cs index 0d1449862..1672df4fe 100644 --- a/src/runtime/pydict.cs +++ b/src/runtime/pydict.cs @@ -12,7 +12,6 @@ public class PyDict : PyObject /// /// PyDict Constructor /// - /// /// /// Creates a new PyDict from an existing object reference. Note /// that the instance assumes ownership of the object reference. @@ -26,7 +25,6 @@ public PyDict(IntPtr ptr) : base(ptr) /// /// PyDict Constructor /// - /// /// /// Creates a new Python dictionary object. /// @@ -43,7 +41,6 @@ public PyDict() : base() /// /// PyDict Constructor /// - /// /// /// Copy constructor - obtain a PyDict from a generic PyObject. An /// ArgumentException will be thrown if the given object is not a @@ -63,7 +60,6 @@ public PyDict(PyObject o) : base() /// /// IsDictType Method /// - /// /// /// Returns true if the given object is a Python dictionary. /// @@ -76,7 +72,6 @@ public static bool IsDictType(PyObject value) /// /// HasKey Method /// - /// /// /// Returns true if the object key appears in the dictionary. /// @@ -89,7 +84,6 @@ public bool HasKey(PyObject key) /// /// HasKey Method /// - /// /// /// Returns true if the string key appears in the dictionary. /// @@ -103,7 +97,6 @@ public bool HasKey(string key) /// /// Keys Method /// - /// /// /// Returns a sequence containing the keys of the dictionary. /// @@ -121,7 +114,6 @@ public PyObject Keys() /// /// Values Method /// - /// /// /// Returns a sequence containing the values of the dictionary. /// @@ -139,7 +131,6 @@ public PyObject Values() /// /// Items Method /// - /// /// /// Returns a sequence containing the items of the dictionary. /// @@ -157,7 +148,6 @@ public PyObject Items() /// /// Copy Method /// - /// /// /// Returns a copy of the dictionary. /// @@ -175,7 +165,6 @@ public PyDict Copy() /// /// Update Method /// - /// /// /// Update the dictionary from another dictionary. /// @@ -192,7 +181,6 @@ public void Update(PyObject other) /// /// Clear Method /// - /// /// /// Clears the dictionary. /// diff --git a/src/runtime/pyfloat.cs b/src/runtime/pyfloat.cs index c8a363ea8..bcd5ad23d 100644 --- a/src/runtime/pyfloat.cs +++ b/src/runtime/pyfloat.cs @@ -12,7 +12,6 @@ public class PyFloat : PyNumber /// /// PyFloat Constructor /// - /// /// /// Creates a new PyFloat from an existing object reference. Note /// that the instance assumes ownership of the object reference. @@ -26,7 +25,6 @@ public PyFloat(IntPtr ptr) : base(ptr) /// /// PyFloat Constructor /// - /// /// /// Copy constructor - obtain a PyFloat from a generic PyObject. An /// ArgumentException will be thrown if the given object is not a @@ -46,7 +44,6 @@ public PyFloat(PyObject o) : base() /// /// PyFloat Constructor /// - /// /// /// Creates a new Python float from a double value. /// @@ -63,7 +60,6 @@ public PyFloat(double value) : base() /// /// PyFloat Constructor /// - /// /// /// Creates a new Python float from a string value. /// @@ -83,7 +79,6 @@ public PyFloat(string value) : base() /// /// IsFloatType Method /// - /// /// /// Returns true if the given object is a Python float. /// @@ -96,8 +91,6 @@ public static bool IsFloatType(PyObject value) /// /// AsFloat Method /// - /// - /// /// /// Convert a Python object to a Python float if possible, raising /// a PythonException if the conversion is not possible. This is diff --git a/src/runtime/pyint.cs b/src/runtime/pyint.cs index 847ad2ebf..43f9d02aa 100644 --- a/src/runtime/pyint.cs +++ b/src/runtime/pyint.cs @@ -12,7 +12,6 @@ public class PyInt : PyNumber /// /// PyInt Constructor /// - /// /// /// Creates a new PyInt from an existing object reference. Note /// that the instance assumes ownership of the object reference. @@ -26,7 +25,6 @@ public PyInt(IntPtr ptr) : base(ptr) /// /// PyInt Constructor /// - /// /// /// Copy constructor - obtain a PyInt from a generic PyObject. An /// ArgumentException will be thrown if the given object is not a @@ -46,7 +44,6 @@ public PyInt(PyObject o) : base() /// /// PyInt Constructor /// - /// /// /// Creates a new Python int from an int32 value. /// @@ -63,7 +60,6 @@ public PyInt(int value) : base() /// /// PyInt Constructor /// - /// /// /// Creates a new Python int from a uint32 value. /// @@ -81,7 +77,6 @@ public PyInt(uint value) : base(IntPtr.Zero) /// /// PyInt Constructor /// - /// /// /// Creates a new Python int from an int64 value. /// @@ -98,7 +93,6 @@ public PyInt(long value) : base(IntPtr.Zero) /// /// PyInt Constructor /// - /// /// /// Creates a new Python int from a uint64 value. /// @@ -116,7 +110,6 @@ public PyInt(ulong value) : base(IntPtr.Zero) /// /// PyInt Constructor /// - /// /// /// Creates a new Python int from an int16 value. /// @@ -128,7 +121,6 @@ public PyInt(short value) : this((int)value) /// /// PyInt Constructor /// - /// /// /// Creates a new Python int from a uint16 value. /// @@ -141,7 +133,6 @@ public PyInt(ushort value) : this((int)value) /// /// PyInt Constructor /// - /// /// /// Creates a new Python int from a byte value. /// @@ -153,7 +144,6 @@ public PyInt(byte value) : this((int)value) /// /// PyInt Constructor /// - /// /// /// Creates a new Python int from an sbyte value. /// @@ -166,7 +156,6 @@ public PyInt(sbyte value) : this((int)value) /// /// PyInt Constructor /// - /// /// /// Creates a new Python int from a string value. /// @@ -183,7 +172,6 @@ public PyInt(string value) : base() /// /// IsIntType Method /// - /// /// /// Returns true if the given object is a Python int. /// @@ -196,8 +184,6 @@ public static bool IsIntType(PyObject value) /// /// AsInt Method /// - /// - /// /// /// Convert a Python object to a Python int if possible, raising /// a PythonException if the conversion is not possible. This is @@ -217,7 +203,6 @@ public static PyInt AsInt(PyObject value) /// /// ToInt16 Method /// - /// /// /// Return the value of the Python int object as an int16. /// @@ -230,7 +215,6 @@ public short ToInt16() /// /// ToInt32 Method /// - /// /// /// Return the value of the Python int object as an int32. /// @@ -243,7 +227,6 @@ public int ToInt32() /// /// ToInt64 Method /// - /// /// /// Return the value of the Python int object as an int64. /// diff --git a/src/runtime/pyiter.cs b/src/runtime/pyiter.cs index 5310c4d8b..a2f239ccf 100644 --- a/src/runtime/pyiter.cs +++ b/src/runtime/pyiter.cs @@ -14,7 +14,6 @@ public class PyIter : PyObject, IEnumerator /// /// PyIter Constructor /// - /// /// /// Creates a new PyIter from an existing iterator reference. Note /// that the instance assumes ownership of the object reference. @@ -27,7 +26,6 @@ public PyIter(IntPtr ptr) : base(ptr) /// /// PyIter Constructor /// - /// /// /// Creates a Python iterator from an iterable. Like doing "iter(iterable)" in python. /// diff --git a/src/runtime/pylist.cs b/src/runtime/pylist.cs index 681e864a4..235f39c77 100644 --- a/src/runtime/pylist.cs +++ b/src/runtime/pylist.cs @@ -11,7 +11,6 @@ public class PyList : PySequence /// /// PyList Constructor /// - /// /// /// Creates a new PyList from an existing object reference. Note /// that the instance assumes ownership of the object reference. @@ -25,7 +24,6 @@ public PyList(IntPtr ptr) : base(ptr) /// /// PyList Constructor /// - /// /// /// Copy constructor - obtain a PyList from a generic PyObject. An /// ArgumentException will be thrown if the given object is not a @@ -45,7 +43,6 @@ public PyList(PyObject o) : base() /// /// PyList Constructor /// - /// /// /// Creates a new empty Python list object. /// @@ -62,7 +59,6 @@ public PyList() : base() /// /// PyList Constructor /// - /// /// /// Creates a new Python list object from an array of PyObjects. /// @@ -86,7 +82,6 @@ public PyList(PyObject[] items) : base() /// /// IsListType Method /// - /// /// /// Returns true if the given object is a Python list. /// @@ -99,7 +94,6 @@ public static bool IsListType(PyObject value) /// /// AsList Method /// - /// /// /// Converts a Python object to a Python list if possible, raising /// a PythonException if the conversion is not possible. This is @@ -119,7 +113,6 @@ public static PyList AsList(PyObject value) /// /// Append Method /// - /// /// /// Append an item to the list object. /// @@ -135,7 +128,6 @@ public void Append(PyObject item) /// /// Insert Method /// - /// /// /// Insert an item in the list object at the given index. /// @@ -152,7 +144,6 @@ public void Insert(int index, PyObject item) /// /// Reverse Method /// - /// /// /// Reverse the order of the list object in place. /// @@ -169,7 +160,6 @@ public void Reverse() /// /// Sort Method /// - /// /// /// Sort the list in place. /// diff --git a/src/runtime/pylong.cs b/src/runtime/pylong.cs index 8e17d2a59..a4ce60279 100644 --- a/src/runtime/pylong.cs +++ b/src/runtime/pylong.cs @@ -11,7 +11,6 @@ public class PyLong : PyNumber /// /// PyLong Constructor /// - /// /// /// Creates a new PyLong from an existing object reference. Note /// that the instance assumes ownership of the object reference. @@ -25,7 +24,6 @@ public PyLong(IntPtr ptr) : base(ptr) /// /// PyLong Constructor /// - /// /// /// Copy constructor - obtain a PyLong from a generic PyObject. An /// ArgumentException will be thrown if the given object is not a @@ -45,7 +43,6 @@ public PyLong(PyObject o) : base() /// /// PyLong Constructor /// - /// /// /// Creates a new PyLong from an int32 value. /// @@ -62,7 +59,6 @@ public PyLong(int value) : base() /// /// PyLong Constructor /// - /// /// /// Creates a new PyLong from a uint32 value. /// @@ -80,7 +76,6 @@ public PyLong(uint value) : base() /// /// PyLong Constructor /// - /// /// /// Creates a new PyLong from an int64 value. /// @@ -97,7 +92,6 @@ public PyLong(long value) : base() /// /// PyLong Constructor /// - /// /// /// Creates a new PyLong from a uint64 value. /// @@ -115,7 +109,6 @@ public PyLong(ulong value) : base() /// /// PyLong Constructor /// - /// /// /// Creates a new PyLong from an int16 value. /// @@ -132,7 +125,6 @@ public PyLong(short value) : base() /// /// PyLong Constructor /// - /// /// /// Creates a new PyLong from an uint16 value. /// @@ -150,7 +142,6 @@ public PyLong(ushort value) : base() /// /// PyLong Constructor /// - /// /// /// Creates a new PyLong from a byte value. /// @@ -167,7 +158,6 @@ public PyLong(byte value) : base() /// /// PyLong Constructor /// - /// /// /// Creates a new PyLong from an sbyte value. /// @@ -185,7 +175,6 @@ public PyLong(sbyte value) : base() /// /// PyLong Constructor /// - /// /// /// Creates a new PyLong from an double value. /// @@ -202,7 +191,6 @@ public PyLong(double value) : base() /// /// PyLong Constructor /// - /// /// /// Creates a new PyLong from a string value. /// @@ -219,7 +207,6 @@ public PyLong(string value) : base() /// /// IsLongType Method /// - /// /// /// Returns true if the given object is a Python long. /// @@ -232,8 +219,6 @@ public static bool IsLongType(PyObject value) /// /// AsLong Method /// - /// - /// /// /// Convert a Python object to a Python long if possible, raising /// a PythonException if the conversion is not possible. This is @@ -252,7 +237,6 @@ public static PyLong AsLong(PyObject value) /// /// ToInt16 Method /// - /// /// /// Return the value of the Python long object as an int16. /// @@ -265,7 +249,6 @@ public short ToInt16() /// /// ToInt32 Method /// - /// /// /// Return the value of the Python long object as an int32. /// @@ -278,7 +261,6 @@ public int ToInt32() /// /// ToInt64 Method /// - /// /// /// Return the value of the Python long object as an int64. /// diff --git a/src/runtime/pynumber.cs b/src/runtime/pynumber.cs index e6805d708..14b32b593 100644 --- a/src/runtime/pynumber.cs +++ b/src/runtime/pynumber.cs @@ -21,7 +21,6 @@ protected PyNumber() : base() /// /// IsNumberType Method /// - /// /// /// Returns true if the given object is a Python numeric type. /// diff --git a/src/runtime/pysequence.cs b/src/runtime/pysequence.cs index a5f6f3dad..85101128b 100644 --- a/src/runtime/pysequence.cs +++ b/src/runtime/pysequence.cs @@ -22,7 +22,6 @@ protected PySequence() : base() /// /// IsSequenceType Method /// - /// /// /// Returns true if the given object implements the sequence protocol. /// @@ -35,7 +34,6 @@ public static bool IsSequenceType(PyObject value) /// /// GetSlice Method /// - /// /// /// Return the slice of the sequence with the given indices. /// @@ -53,7 +51,6 @@ public PyObject GetSlice(int i1, int i2) /// /// SetSlice Method /// - /// /// /// Sets the slice of the sequence with the given indices. /// @@ -70,7 +67,6 @@ public void SetSlice(int i1, int i2, PyObject v) /// /// DelSlice Method /// - /// /// /// Deletes the slice of the sequence with the given indices. /// @@ -87,7 +83,6 @@ public void DelSlice(int i1, int i2) /// /// Index Method /// - /// /// /// Return the index of the given item in the sequence, or -1 if /// the item does not appear in the sequence. @@ -107,7 +102,6 @@ public int Index(PyObject item) /// /// Contains Method /// - /// /// /// Return true if the sequence contains the given item. This method /// throws a PythonException if an error occurs during the check. @@ -126,7 +120,6 @@ public bool Contains(PyObject item) /// /// Concat Method /// - /// /// /// Return the concatenation of the sequence object with the passed in /// sequence object. @@ -145,7 +138,6 @@ public PyObject Concat(PyObject other) /// /// Repeat Method /// - /// /// /// Return the sequence object repeated N times. This is equivalent /// to the Python expression "object * count". diff --git a/src/runtime/pystring.cs b/src/runtime/pystring.cs index a3d198a2c..1fe3a6d7e 100644 --- a/src/runtime/pystring.cs +++ b/src/runtime/pystring.cs @@ -12,7 +12,6 @@ public class PyString : PySequence /// /// PyString Constructor /// - /// /// /// Creates a new PyString from an existing object reference. Note /// that the instance assumes ownership of the object reference. @@ -26,7 +25,6 @@ public PyString(IntPtr ptr) : base(ptr) /// /// PyString Constructor /// - /// /// /// Copy constructor - obtain a PyString from a generic PyObject. /// An ArgumentException will be thrown if the given object is not @@ -46,7 +44,6 @@ public PyString(PyObject o) : base() /// /// PyString Constructor /// - /// /// /// Creates a Python string from a managed string. /// @@ -63,7 +60,6 @@ public PyString(string s) : base() /// /// IsStringType Method /// - /// /// /// Returns true if the given object is a Python string. /// diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index 3f0022467..a2eccff0d 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -210,11 +210,11 @@ public static void Initialize(IEnumerable args) } } - //==================================================================== - // A helper to perform initialization from the context of an active - // CPython interpreter process - this bootstraps the managed runtime - // when it is imported by the CLR extension module. - //==================================================================== + /// + /// A helper to perform initialization from the context of an active + /// CPython interpreter process - this bootstraps the managed runtime + /// when it is imported by the CLR extension module. + /// #if PYTHON3 public static IntPtr InitExt() #elif PYTHON2 diff --git a/src/runtime/pythonexception.cs b/src/runtime/pythonexception.cs index 124636457..d2475664c 100644 --- a/src/runtime/pythonexception.cs +++ b/src/runtime/pythonexception.cs @@ -76,7 +76,6 @@ public void Restore() /// /// PyType Property /// - /// /// /// Returns the exception type as a Python object. /// @@ -88,7 +87,6 @@ public IntPtr PyType /// /// PyValue Property /// - /// /// /// Returns the exception value as a Python object. /// @@ -100,7 +98,6 @@ public IntPtr PyValue /// /// PyTB Property /// - /// /// /// Returns the TraceBack as a Python object. /// @@ -112,7 +109,6 @@ public IntPtr PyTB /// /// Message Property /// - /// /// /// A string representing the python exception message. /// @@ -124,7 +120,6 @@ public override string Message /// /// StackTrace Property /// - /// /// /// A string representing the python exception stack trace. /// @@ -137,7 +132,6 @@ public override string StackTrace /// /// Dispose Method /// - /// /// /// The Dispose method provides a way to explicitly release the /// Python objects represented by a PythonException. @@ -166,7 +160,6 @@ public void Dispose() /// /// Matches Method /// - /// /// /// Returns true if the Python exception type represented by the /// PythonException instance matches the given exception type. diff --git a/src/runtime/pytuple.cs b/src/runtime/pytuple.cs index 97f4c5bbc..682ed3f50 100644 --- a/src/runtime/pytuple.cs +++ b/src/runtime/pytuple.cs @@ -11,7 +11,6 @@ public class PyTuple : PySequence /// /// PyTuple Constructor /// - /// /// /// Creates a new PyTuple from an existing object reference. Note /// that the instance assumes ownership of the object reference. @@ -25,7 +24,6 @@ public PyTuple(IntPtr ptr) : base(ptr) /// /// PyTuple Constructor /// - /// /// /// Copy constructor - obtain a PyTuple from a generic PyObject. An /// ArgumentException will be thrown if the given object is not a @@ -45,7 +43,6 @@ public PyTuple(PyObject o) : base() /// /// PyTuple Constructor /// - /// /// /// Creates a new empty PyTuple. /// @@ -62,7 +59,6 @@ public PyTuple() : base() /// /// PyTuple Constructor /// - /// /// /// Creates a new PyTuple from an array of PyObject instances. /// @@ -86,7 +82,6 @@ public PyTuple(PyObject[] items) : base() /// /// IsTupleType Method /// - /// /// /// Returns true if the given object is a Python tuple. /// @@ -99,7 +94,6 @@ public static bool IsTupleType(PyObject value) /// /// AsTuple Method /// - /// /// /// Convert a Python object to a Python tuple if possible, raising /// a PythonException if the conversion is not possible. This is diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index f79daa970..2c1ab87ab 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -184,7 +184,7 @@ public class Runtime internal static bool is32bit; /// - /// Intitialize the runtime... + /// Initialize the runtime... /// internal static void Initialize() { @@ -333,7 +333,7 @@ internal static void Shutdown() Py_Finalize(); } - // called *without* the GIL aquired by clr._AtExit + // called *without* the GIL acquired by clr._AtExit internal static int AtExit() { lock (IsFinalizingLock) @@ -497,12 +497,11 @@ internal static Type[] PythonArgsToTypeArray(IntPtr arg, bool mangleObjects) return types; } - //=================================================================== - // Managed exports of the Python C API. Where appropriate, we do - // some optimization to avoid managed <--> unmanaged transitions - // (mostly for heavily used methods). - //=================================================================== - + /// + /// Managed exports of the Python C API. Where appropriate, we do + /// some optimization to avoid managed <--> unmanaged transitions + /// (mostly for heavily used methods). + /// internal unsafe static void XIncref(IntPtr op) { #if Py_DEBUG @@ -877,14 +876,14 @@ internal unsafe static extern IntPtr PyMethod_New(IntPtr func, IntPtr self, IntPtr cls); - //==================================================================== - // Python abstract object API - //==================================================================== - - // A macro-like method to get the type of a Python object. This is - // designed to be lean and mean in IL & avoid managed <-> unmanaged - // transitions. Note that this does not incref the type object. - + /// + /// Python abstract object API + /// + /// + /// A macro-like method to get the type of a Python object. This is + /// designed to be lean and mean in IL & avoid managed <-> unmanaged + /// transitions. Note that this does not incref the type object. + /// internal unsafe static IntPtr PyObject_TYPE(IntPtr op) { @@ -908,10 +907,11 @@ internal unsafe static IntPtr } } - // Managed version of the standard Python C API PyObject_Type call. - // This version avoids a managed <-> unmanaged transition. This one - // does incref the returned type object. - + /// + /// Managed version of the standard Python C API PyObject_Type call. + /// This version avoids a managed <-> unmanaged transition. This one + /// does incref the returned type object. + /// internal unsafe static IntPtr PyObject_Type(IntPtr op) { @@ -1089,10 +1089,9 @@ internal unsafe static extern IntPtr PyObject_Dir(IntPtr pointer); - //==================================================================== - // Python number API - //==================================================================== - + /// + /// Python number API + /// #if PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyNumber_Long", @@ -1394,10 +1393,9 @@ internal unsafe static extern IntPtr internal unsafe static extern IntPtr PyNumber_Invert(IntPtr o1); - //==================================================================== - // Python sequence API - //==================================================================== - + /// + /// Python sequence API + /// [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern bool @@ -1474,10 +1472,9 @@ internal unsafe static extern IntPtr PySequence_List(IntPtr pointer); - //==================================================================== - // Python string API - //==================================================================== - + /// + /// Python string API + /// internal static bool IsStringType(IntPtr op) { IntPtr t = PyObject_TYPE(op); @@ -1769,10 +1766,9 @@ internal unsafe static string GetManagedString(IntPtr op) return null; } - //==================================================================== - // Python dictionary API - //==================================================================== - + /// + /// Python dictionary API + /// internal static bool PyDict_Check(IntPtr ob) { return PyObject_TYPE(ob) == Runtime.PyDictType; @@ -1859,10 +1855,9 @@ internal unsafe static extern int PyDict_Size(IntPtr pointer); - //==================================================================== - // Python list API - //==================================================================== - + /// + /// Python list API + /// internal static bool PyList_Check(IntPtr ob) { return PyObject_TYPE(ob) == Runtime.PyListType; @@ -1924,10 +1919,9 @@ internal unsafe static extern int PyList_Size(IntPtr pointer); - //==================================================================== - // Python tuple API - //==================================================================== - + /// + /// Python tuple API + /// internal static bool PyTuple_Check(IntPtr ob) { return PyObject_TYPE(ob) == Runtime.PyTupleType; @@ -1959,10 +1953,9 @@ internal unsafe static extern int PyTuple_Size(IntPtr pointer); - //==================================================================== - // Python iterator API - //==================================================================== - + /// + /// Python iterator API + /// #if PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] @@ -1983,10 +1976,9 @@ internal static bool internal unsafe static extern IntPtr PyIter_Next(IntPtr pointer); - //==================================================================== - // Python module API - //==================================================================== - + /// + /// Python module API + /// [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr @@ -2070,10 +2062,9 @@ internal unsafe static extern int PySys_SetObject(string name, IntPtr ob); - //==================================================================== - // Python type object API - //==================================================================== - + /// + /// Python type object API + /// internal static bool PyType_Check(IntPtr ob) { return PyObject_TypeCheck(ob, Runtime.PyTypeType); @@ -2151,10 +2142,9 @@ internal unsafe static extern void PyObject_GC_UnTrack(IntPtr tp); - //==================================================================== - // Python memory API - //==================================================================== - + /// + /// Python memory API + /// [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr @@ -2171,10 +2161,9 @@ internal unsafe static extern void PyMem_Free(IntPtr ptr); - //==================================================================== - // Python exception API - //==================================================================== - + /// + /// Python exception API + /// [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern void @@ -2236,10 +2225,9 @@ internal unsafe static extern void PyErr_Print(); - //==================================================================== - // Miscellaneous - //==================================================================== - + /// + /// Miscellaneous + /// [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr diff --git a/src/runtime/typemanager.cs b/src/runtime/typemanager.cs index d6c474f8d..d85bdf9bb 100644 --- a/src/runtime/typemanager.cs +++ b/src/runtime/typemanager.cs @@ -8,11 +8,10 @@ namespace Python.Runtime { - //======================================================================= - // The TypeManager class is responsible for building binary-compatible - // Python type objects that are implemented in managed code. - //======================================================================= - + /// + /// The TypeManager class is responsible for building binary-compatible + /// Python type objects that are implemented in managed code. + /// internal class TypeManager { static BindingFlags tbFlags; @@ -25,13 +24,12 @@ static TypeManager() } - //==================================================================== - // Given a managed Type derived from ExtensionType, get the handle to - // a Python type object that delegates its implementation to the Type - // object. These Python type instances are used to implement internal - // descriptor and utility types like ModuleObject, PropertyObject, etc. - //==================================================================== - + /// + /// Given a managed Type derived from ExtensionType, get the handle to + /// a Python type object that delegates its implementation to the Type + /// object. These Python type instances are used to implement internal + /// descriptor and utility types like ModuleObject, PropertyObject, etc. + /// internal static IntPtr GetTypeHandle(Type type) { // Note that these types are cached with a refcount of 1, so they @@ -48,12 +46,11 @@ internal static IntPtr GetTypeHandle(Type type) } - //==================================================================== - // Get the handle of a Python type that reflects the given CLR type. - // The given ManagedType instance is a managed object that implements - // the appropriate semantics in Python for the reflected managed type. - //==================================================================== - + /// + /// Get the handle of a Python type that reflects the given CLR type. + /// The given ManagedType instance is a managed object that implements + /// the appropriate semantics in Python for the reflected managed type. + /// internal static IntPtr GetTypeHandle(ManagedType obj, Type type) { IntPtr handle = IntPtr.Zero; @@ -68,15 +65,14 @@ internal static IntPtr GetTypeHandle(ManagedType obj, Type type) } - //==================================================================== - // The following CreateType implementations do the necessary work to - // create Python types to represent managed extension types, reflected - // types, subclasses of reflected types and the managed metatype. The - // dance is slightly different for each kind of type due to different - // behavior needed and the desire to have the existing Python runtime - // do as much of the allocation and initialization work as possible. - //==================================================================== - + /// + /// The following CreateType implementations do the necessary work to + /// create Python types to represent managed extension types, reflected + /// types, subclasses of reflected types and the managed metatype. The + /// dance is slightly different for each kind of type due to different + /// behavior needed and the desire to have the existing Python runtime + /// do as much of the allocation and initialization work as possible. + /// internal static IntPtr CreateType(Type impl) { IntPtr type = AllocateTypeObject(impl.Name); @@ -395,10 +391,9 @@ internal static IntPtr BasicSubType(string name, IntPtr base_, Type impl) } - //==================================================================== - // Utility method to allocate a type object & do basic initialization. - //==================================================================== - + /// + /// Utility method to allocate a type object & do basic initialization. + /// internal static IntPtr AllocateTypeObject(string name) { IntPtr type = Runtime.PyType_GenericAlloc(Runtime.PyTypeType, 0); @@ -445,12 +440,11 @@ internal static IntPtr AllocateTypeObject(string name) } - //==================================================================== - // Given a newly allocated Python type object and a managed Type that - // provides the implementation for the type, connect the type slots of - // the Python object to the managed methods of the implementing Type. - //==================================================================== - + /// + /// Given a newly allocated Python type object and a managed Type that + /// provides the implementation for the type, connect the type slots of + /// the Python object to the managed methods of the implementing Type. + /// internal static void InitializeSlots(IntPtr type, Type impl) { Hashtable seen = new Hashtable(8); @@ -492,12 +486,11 @@ internal static void InitializeSlots(IntPtr type, Type impl) } - //==================================================================== - // Given a newly allocated Python type object and a managed Type that - // implements it, initialize any methods defined by the Type that need - // to appear in the Python type __dict__ (based on custom attribute). - //==================================================================== - + /// + /// Given a newly allocated Python type object and a managed Type that + /// implements it, initialize any methods defined by the Type that need + /// to appear in the Python type __dict__ (based on custom attribute). + /// private static void InitMethods(IntPtr pytype, Type type) { IntPtr dict = Marshal.ReadIntPtr(pytype, TypeOffset.tp_dict); @@ -531,10 +524,9 @@ private static void InitMethods(IntPtr pytype, Type type) } - //==================================================================== - // Utility method to copy slots from a given type to another type. - //==================================================================== - + /// + /// Utility method to copy slots from a given type to another type. + /// internal static void CopySlot(IntPtr from, IntPtr to, int offset) { IntPtr fp = Marshal.ReadIntPtr(from, offset); diff --git a/src/runtime/typemethod.cs b/src/runtime/typemethod.cs index 0c60301a0..50577f93d 100644 --- a/src/runtime/typemethod.cs +++ b/src/runtime/typemethod.cs @@ -4,10 +4,9 @@ namespace Python.Runtime { - //======================================================================== - // Implements a Python type that provides access to CLR object methods. - //======================================================================== - + /// + /// Implements a Python type that provides access to CLR object methods. + /// internal class TypeMethod : MethodObject { public TypeMethod(Type type, string name, MethodInfo[] info) : From 82f965b434150f34caf8be515cd5511cc2f87d43 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 1 Feb 2017 23:56:57 -0700 Subject: [PATCH 059/324] Update API website on docs & fix section headers Runtime.cs section headers got changed to docs. --- src/runtime/pydict.cs | 4 +- src/runtime/pyfloat.cs | 4 +- src/runtime/pyint.cs | 4 +- src/runtime/pyiter.cs | 4 +- src/runtime/pylist.cs | 4 +- src/runtime/pylong.cs | 4 +- src/runtime/pynumber.cs | 4 +- src/runtime/pyobject.cs | 4 +- src/runtime/pysequence.cs | 4 +- src/runtime/pystring.cs | 8 ++- src/runtime/pytuple.cs | 4 +- src/runtime/runtime.cs | 103 +++++++++++++++++++++----------------- 12 files changed, 94 insertions(+), 57 deletions(-) diff --git a/src/runtime/pydict.cs b/src/runtime/pydict.cs index 1672df4fe..18f0939b2 100644 --- a/src/runtime/pydict.cs +++ b/src/runtime/pydict.cs @@ -5,7 +5,9 @@ namespace Python.Runtime { /// /// Represents a Python dictionary object. See the documentation at - /// http://www.python.org/doc/current/api/dictObjects.html for details. + /// PY2: https://docs.python.org/2/c-api/dict.html + /// PY3: https://docs.python.org/3/c-api/dict.html + /// for details. /// public class PyDict : PyObject { diff --git a/src/runtime/pyfloat.cs b/src/runtime/pyfloat.cs index bcd5ad23d..959657118 100644 --- a/src/runtime/pyfloat.cs +++ b/src/runtime/pyfloat.cs @@ -5,7 +5,9 @@ namespace Python.Runtime { /// /// Represents a Python float object. See the documentation at - /// http://www.python.org/doc/current/api/floatObjects.html + /// PY2: https://docs.python.org/2/c-api/float.html + /// PY3: https://docs.python.org/3/c-api/float.html + /// for details. /// public class PyFloat : PyNumber { diff --git a/src/runtime/pyint.cs b/src/runtime/pyint.cs index 43f9d02aa..e89c1e87e 100644 --- a/src/runtime/pyint.cs +++ b/src/runtime/pyint.cs @@ -5,7 +5,9 @@ namespace Python.Runtime { /// /// Represents a Python integer object. See the documentation at - /// http://www.python.org/doc/current/api/intObjects.html for details. + /// PY2: https://docs.python.org/2/c-api/int.html + /// PY3: No equivalent + /// for details. /// public class PyInt : PyNumber { diff --git a/src/runtime/pyiter.cs b/src/runtime/pyiter.cs index a2f239ccf..c1bab2781 100644 --- a/src/runtime/pyiter.cs +++ b/src/runtime/pyiter.cs @@ -5,7 +5,9 @@ namespace Python.Runtime { /// /// Represents a standard Python iterator object. See the documentation at - /// http://www.python.org/doc/2.4.4/api/iterator.html for details. + /// PY2: https://docs.python.org/2/c-api/iterator.html + /// PY3: https://docs.python.org/3/c-api/iterator.html + /// for details. /// public class PyIter : PyObject, IEnumerator { diff --git a/src/runtime/pylist.cs b/src/runtime/pylist.cs index 235f39c77..8a369f654 100644 --- a/src/runtime/pylist.cs +++ b/src/runtime/pylist.cs @@ -4,7 +4,9 @@ namespace Python.Runtime { /// /// Represents a standard Python list object. See the documentation at - /// http://www.python.org/doc/current/api/listObjects.html for details. + /// PY2: https://docs.python.org/2/c-api/list.html + /// PY3: https://docs.python.org/3/c-api/list.html + /// for details. /// public class PyList : PySequence { diff --git a/src/runtime/pylong.cs b/src/runtime/pylong.cs index a4ce60279..8deac242e 100644 --- a/src/runtime/pylong.cs +++ b/src/runtime/pylong.cs @@ -4,7 +4,9 @@ namespace Python.Runtime { /// /// Represents a Python long int object. See the documentation at - /// http://www.python.org/doc/current/api/longObjects.html + /// PY2: https://docs.python.org/2/c-api/long.html + /// PY3: https://docs.python.org/3/c-api/long.html + /// for details. /// public class PyLong : PyNumber { diff --git a/src/runtime/pynumber.cs b/src/runtime/pynumber.cs index 14b32b593..73dde6744 100644 --- a/src/runtime/pynumber.cs +++ b/src/runtime/pynumber.cs @@ -5,7 +5,9 @@ namespace Python.Runtime /// /// Represents a generic Python number. The methods of this class are /// equivalent to the Python "abstract number API". See - /// http://www.python.org/doc/current/api/number.html for details. + /// PY2: https://docs.python.org/2/c-api/number.html + /// PY3: https://docs.python.org/3/c-api/number.html + /// for details. /// public class PyNumber : PyObject { diff --git a/src/runtime/pyobject.cs b/src/runtime/pyobject.cs index 19a2f178b..ccebb708e 100644 --- a/src/runtime/pyobject.cs +++ b/src/runtime/pyobject.cs @@ -8,7 +8,9 @@ namespace Python.Runtime /// /// Represents a generic Python object. The methods of this class are /// generally equivalent to the Python "abstract object API". See - /// http://www.python.org/doc/current/api/object.html for details. + /// PY2: https://docs.python.org/2/c-api/object.html + /// PY3: https://docs.python.org/3/c-api/object.html + /// for details. /// public class PyObject : DynamicObject, IDisposable { diff --git a/src/runtime/pysequence.cs b/src/runtime/pysequence.cs index 85101128b..d54959599 100644 --- a/src/runtime/pysequence.cs +++ b/src/runtime/pysequence.cs @@ -6,7 +6,9 @@ namespace Python.Runtime /// /// Represents a generic Python sequence. The methods of this class are /// equivalent to the Python "abstract sequence API". See - /// http://www.python.org/doc/current/api/sequence.html for details. + /// PY2: https://docs.python.org/2/c-api/sequence.html + /// PY3: https://docs.python.org/3/c-api/sequence.html + /// for details. /// public class PySequence : PyObject, IEnumerable { diff --git a/src/runtime/pystring.cs b/src/runtime/pystring.cs index 1fe3a6d7e..39e7a8f96 100644 --- a/src/runtime/pystring.cs +++ b/src/runtime/pystring.cs @@ -4,9 +4,13 @@ namespace Python.Runtime { /// /// Represents a Python (ansi) string object. See the documentation at - /// http://www.python.org/doc/current/api/stringObjects.html for details. - /// 2011-01-29: ...Then why does the string constructor call PyUnicode_FromUnicode()??? + /// PY2: https://docs.python.org/2/c-api/string.html + /// PY3: No Equivalent + /// for details. /// + /// + /// 2011-01-29: ...Then why does the string constructor call PyUnicode_FromUnicode()??? + /// public class PyString : PySequence { /// diff --git a/src/runtime/pytuple.cs b/src/runtime/pytuple.cs index 682ed3f50..76ca616ae 100644 --- a/src/runtime/pytuple.cs +++ b/src/runtime/pytuple.cs @@ -4,7 +4,9 @@ namespace Python.Runtime { /// /// Represents a Python tuple object. See the documentation at - /// http://www.python.org/doc/current/api/tupleObjects.html for details. + /// PY2: https://docs.python.org/2/c-api/tupleObjects.html + /// PY3: https://docs.python.org/3/c-api/tupleObjects.html + /// for details. /// public class PyTuple : PySequence { diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 2c1ab87ab..3757ce6aa 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -88,13 +88,13 @@ static public IntPtr GetProcAddress(IntPtr dllHandle, string name) #endif } + /// + /// Encapsulates the low-level Python C API. Note that it is + /// the responsibility of the caller to have acquired the GIL + /// before calling any of these methods. + /// public class Runtime { - /// - /// Encapsulates the low-level Python C API. Note that it is - /// the responsibility of the caller to have acquired the GIL - /// before calling any of these methods. - /// #if UCS4 public const int UCS = 4; #elif UCS2 @@ -876,14 +876,15 @@ internal unsafe static extern IntPtr PyMethod_New(IntPtr func, IntPtr self, IntPtr cls); + //==================================================================== + // Python abstract object API + //==================================================================== + /// - /// Python abstract object API - /// - /// /// A macro-like method to get the type of a Python object. This is /// designed to be lean and mean in IL & avoid managed <-> unmanaged /// transitions. Note that this does not incref the type object. - /// + /// internal unsafe static IntPtr PyObject_TYPE(IntPtr op) { @@ -1089,9 +1090,10 @@ internal unsafe static extern IntPtr PyObject_Dir(IntPtr pointer); - /// - /// Python number API - /// + //==================================================================== + // Python number API + //==================================================================== + #if PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyNumber_Long", @@ -1393,9 +1395,10 @@ internal unsafe static extern IntPtr internal unsafe static extern IntPtr PyNumber_Invert(IntPtr o1); - /// - /// Python sequence API - /// + //==================================================================== + // Python sequence API + //==================================================================== + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern bool @@ -1472,9 +1475,10 @@ internal unsafe static extern IntPtr PySequence_List(IntPtr pointer); - /// - /// Python string API - /// + //==================================================================== + // Python string API + //==================================================================== + internal static bool IsStringType(IntPtr op) { IntPtr t = PyObject_TYPE(op); @@ -1766,9 +1770,10 @@ internal unsafe static string GetManagedString(IntPtr op) return null; } - /// - /// Python dictionary API - /// + //==================================================================== + // Python dictionary API + //==================================================================== + internal static bool PyDict_Check(IntPtr ob) { return PyObject_TYPE(ob) == Runtime.PyDictType; @@ -1855,9 +1860,10 @@ internal unsafe static extern int PyDict_Size(IntPtr pointer); - /// - /// Python list API - /// + //==================================================================== + // Python list API + //==================================================================== + internal static bool PyList_Check(IntPtr ob) { return PyObject_TYPE(ob) == Runtime.PyListType; @@ -1919,9 +1925,10 @@ internal unsafe static extern int PyList_Size(IntPtr pointer); - /// - /// Python tuple API - /// + //==================================================================== + // Python tuple API + //==================================================================== + internal static bool PyTuple_Check(IntPtr ob) { return PyObject_TYPE(ob) == Runtime.PyTupleType; @@ -1953,9 +1960,10 @@ internal unsafe static extern int PyTuple_Size(IntPtr pointer); - /// - /// Python iterator API - /// + //==================================================================== + // Python iterator API + //==================================================================== + #if PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] @@ -1976,9 +1984,10 @@ internal static bool internal unsafe static extern IntPtr PyIter_Next(IntPtr pointer); - /// - /// Python module API - /// + //==================================================================== + // Python module API + //==================================================================== + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr @@ -2062,9 +2071,10 @@ internal unsafe static extern int PySys_SetObject(string name, IntPtr ob); - /// - /// Python type object API - /// + //==================================================================== + // Python type object API + //==================================================================== + internal static bool PyType_Check(IntPtr ob) { return PyObject_TypeCheck(ob, Runtime.PyTypeType); @@ -2142,9 +2152,10 @@ internal unsafe static extern void PyObject_GC_UnTrack(IntPtr tp); - /// - /// Python memory API - /// + //==================================================================== + // Python memory API + //==================================================================== + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr @@ -2161,9 +2172,10 @@ internal unsafe static extern void PyMem_Free(IntPtr ptr); - /// - /// Python exception API - /// + //==================================================================== + // Python exception API + //==================================================================== + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern void @@ -2225,9 +2237,10 @@ internal unsafe static extern void PyErr_Print(); - /// - /// Miscellaneous - /// + //==================================================================== + // Miscellaneous + //==================================================================== + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr From 26ce7d8badb50f5dbee937c26070fd3855977fd4 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 1 Feb 2017 11:17:47 -0700 Subject: [PATCH 060/324] Alias root.pyHandle to py_clr_module --- src/runtime/importhook.cs | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/src/runtime/importhook.cs b/src/runtime/importhook.cs index 68d81ac14..255be0d5a 100644 --- a/src/runtime/importhook.cs +++ b/src/runtime/importhook.cs @@ -12,9 +12,9 @@ internal class ImportHook static IntPtr py_import; static CLRModule root; static MethodWrapper hook; + static IntPtr py_clr_module; #if PYTHON3 - static IntPtr py_clr_module; static IntPtr module_def = IntPtr.Zero; internal static void InitializeModuleDef() @@ -36,11 +36,10 @@ internal static void Initialize() IntPtr dict = Runtime.PyImport_GetModuleDict(); #if PYTHON3 IntPtr mod = Runtime.PyImport_ImportModule("builtins"); - py_import = Runtime.PyObject_GetAttrString(mod, "__import__"); #elif PYTHON2 IntPtr mod = Runtime.PyDict_GetItemString(dict, "__builtin__"); - py_import = Runtime.PyObject_GetAttrString(mod, "__import__"); #endif + py_import = Runtime.PyObject_GetAttrString(mod, "__import__"); hook = new MethodWrapper(typeof(ImportHook), "__import__", "TernaryFunc"); Runtime.PyObject_SetAttrString(mod, "__import__", hook.ptr); Runtime.XDecref(hook.ptr); @@ -58,13 +57,12 @@ internal static void Initialize() clr_dict = (IntPtr)Marshal.PtrToStructure(clr_dict, typeof(IntPtr)); Runtime.PyDict_Update(mod_dict, clr_dict); - Runtime.PyDict_SetItemString(dict, "CLR", py_clr_module); - Runtime.PyDict_SetItemString(dict, "clr", py_clr_module); #elif PYTHON2 Runtime.XIncref(root.pyHandle); // we are using the module two times - Runtime.PyDict_SetItemString(dict, "CLR", root.pyHandle); - Runtime.PyDict_SetItemString(dict, "clr", root.pyHandle); + py_clr_module = root.pyHandle; // Alias handle for PY2/PY3 #endif + Runtime.PyDict_SetItemString(dict, "CLR", py_clr_module); + Runtime.PyDict_SetItemString(dict, "clr", py_clr_module); } @@ -75,11 +73,7 @@ internal static void Shutdown() { if (0 != Runtime.Py_IsInitialized()) { -#if PYTHON3 Runtime.XDecref(py_clr_module); -#elif PYTHON2 - Runtime.XDecref(root.pyHandle); -#endif Runtime.XDecref(root.pyHandle); Runtime.XDecref(py_import); } @@ -134,13 +128,9 @@ public static IntPtr GetCLRModule(IntPtr? fromList = null) } } } - +#endif Runtime.XIncref(py_clr_module); return py_clr_module; -#elif PYTHON2 - Runtime.XIncref(root.pyHandle); - return root.pyHandle; -#endif } /// From 0e74f869ad1e6423b3680858f9e43144fb75271a Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 1 Feb 2017 11:57:51 -0700 Subject: [PATCH 061/324] Syntax cleanup --- src/runtime/importhook.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/runtime/importhook.cs b/src/runtime/importhook.cs index 255be0d5a..e5843d436 100644 --- a/src/runtime/importhook.cs +++ b/src/runtime/importhook.cs @@ -71,7 +71,7 @@ internal static void Initialize() /// internal static void Shutdown() { - if (0 != Runtime.Py_IsInitialized()) + if (Runtime.Py_IsInitialized() != 0) { Runtime.XDecref(py_clr_module); Runtime.XDecref(root.pyHandle); @@ -111,11 +111,11 @@ public static IntPtr GetCLRModule(IntPtr? fromList = null) continue; string s = item.AsManagedObject(typeof(string)) as string; - if (null == s) + if (s == null) continue; ManagedType attr = root.GetAttribute(s, true); - if (null == attr) + if (attr == null) continue; Runtime.XIncref(attr.pyHandle); @@ -190,7 +190,7 @@ public static IntPtr __import__(IntPtr self, IntPtr args, IntPtr kw) } if (mod_name == "CLR") { - Exceptions.deprecation("The CLR module is deprecated. " + "Please use 'clr'."); + Exceptions.deprecation("The CLR module is deprecated. Please use 'clr'."); IntPtr clr_module = GetCLRModule(fromList); if (clr_module != IntPtr.Zero) { @@ -305,9 +305,8 @@ public static IntPtr __import__(IntPtr self, IntPtr args, IntPtr kw) ModuleObject tail = root; root.InitializePreload(); - for (int i = 0; i < names.Length; i++) + foreach (string name in names) { - string name = names[i]; ManagedType mt = tail.GetAttribute(name, true); if (!(mt is ModuleObject)) { From 7cf4ba96f76e5fa7546af374cf4c38f3bdcdba56 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 2 Feb 2017 09:47:44 -0700 Subject: [PATCH 062/324] Simple classes cleanup (#348) --- src/runtime/arrayobject.cs | 44 ++++++++++----------- src/runtime/assemblymanager.cs | 55 +++++++++++++-------------- src/runtime/classbase.cs | 20 +++++----- src/runtime/clrobject.cs | 24 ++++++------ src/runtime/codegenerator.cs | 12 ++---- src/runtime/constructorbinder.cs | 14 +++---- src/runtime/debughelper.cs | 27 ++++++------- src/runtime/delegateobject.cs | 14 +++---- src/runtime/extensiontype.cs | 17 ++++----- src/runtime/fieldobject.cs | 31 +++++++-------- src/runtime/generictype.cs | 1 - src/runtime/genericutil.cs | 8 +++- src/runtime/importhook.cs | 20 +++++----- src/runtime/interfaceobject.cs | 12 +++--- src/runtime/interfaces.cs | 2 - src/runtime/iterator.cs | 7 ++-- src/runtime/managedtype.cs | 10 ++--- src/runtime/methodwrapper.cs | 2 - src/runtime/modulefunctionobject.cs | 18 ++++----- src/runtime/modulepropertyobject.cs | 4 +- src/runtime/monosupport.cs | 6 +-- src/runtime/nativecall.cs | 27 ++++++------- src/runtime/overload.cs | 17 ++++----- src/runtime/propertyobject.cs | 33 ++++++++-------- src/runtime/pyansistring.cs | 4 +- src/runtime/pydict.cs | 11 +++--- src/runtime/pyfloat.cs | 9 ++--- src/runtime/pyint.cs | 13 +++---- src/runtime/pyiter.cs | 8 +++- src/runtime/pylist.cs | 8 ++-- src/runtime/pylong.cs | 38 +++++++++---------- src/runtime/pynumber.cs | 2 +- src/runtime/pysequence.cs | 4 +- src/runtime/pystring.cs | 4 +- src/runtime/pythonexception.cs | 10 ++--- src/runtime/pytuple.cs | 8 ++-- src/runtime/typemanager.cs | 59 +++++++++++++++-------------- src/runtime/typemethod.cs | 6 +-- 38 files changed, 290 insertions(+), 319 deletions(-) diff --git a/src/runtime/arrayobject.cs b/src/runtime/arrayobject.cs index 6096706dd..caf40ca50 100644 --- a/src/runtime/arrayobject.cs +++ b/src/runtime/arrayobject.cs @@ -1,6 +1,5 @@ using System; using System.Collections; -using System.Reflection; namespace Python.Runtime { @@ -22,13 +21,13 @@ internal override bool CanSubclass() public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) { - ArrayObject self = GetManagedObject(tp) as ArrayObject; + var self = GetManagedObject(tp) as ArrayObject; if (Runtime.PyTuple_Size(args) != 1) { return Exceptions.RaiseTypeError("array expects 1 argument"); } IntPtr op = Runtime.PyTuple_GetItem(args, 0); - Object result; + object result; if (!Converter.ToManaged(op, self.type, out result, true)) { @@ -43,11 +42,11 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) /// public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) { - CLRObject obj = (CLRObject)ManagedType.GetManagedObject(ob); - Array items = obj.inst as Array; + var obj = (CLRObject)GetManagedObject(ob); + var items = obj.inst as Array; Type itemType = obj.inst.GetType().GetElementType(); int rank = items.Rank; - int index = 0; + int index; object value; // Note that CLR 1.0 only supports int indexes - methods to @@ -61,7 +60,7 @@ public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) if (rank == 1) { - index = (int)Runtime.PyInt_AsLong(idx); + index = Runtime.PyInt_AsLong(idx); if (Exceptions.ErrorOccurred()) { @@ -83,7 +82,7 @@ public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) return IntPtr.Zero; } - return Converter.ToPython(items.GetValue(index), itemType); + return Converter.ToPython(value, itemType); } // Multi-dimensional arrays can be indexed a la: list[1, 2, 3]. @@ -96,12 +95,12 @@ public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) int count = Runtime.PyTuple_Size(idx); - Array args = Array.CreateInstance(typeof(Int32), count); + var args = new int[count]; - for (int i = 0; i < count; i++) + for (var i = 0; i < count; i++) { IntPtr op = Runtime.PyTuple_GetItem(idx, i); - index = (int)Runtime.PyInt_AsLong(op); + index = Runtime.PyInt_AsLong(op); if (Exceptions.ErrorOccurred()) { @@ -135,11 +134,11 @@ public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) /// public static int mp_ass_subscript(IntPtr ob, IntPtr idx, IntPtr v) { - CLRObject obj = (CLRObject)ManagedType.GetManagedObject(ob); - Array items = obj.inst as Array; + var obj = (CLRObject)GetManagedObject(ob); + var items = obj.inst as Array; Type itemType = obj.inst.GetType().GetElementType(); int rank = items.Rank; - int index = 0; + int index; object value; if (items.IsReadOnly) @@ -155,7 +154,7 @@ public static int mp_ass_subscript(IntPtr ob, IntPtr idx, IntPtr v) if (rank == 1) { - index = (int)Runtime.PyInt_AsLong(idx); + index = Runtime.PyInt_AsLong(idx); if (Exceptions.ErrorOccurred()) { @@ -188,13 +187,12 @@ public static int mp_ass_subscript(IntPtr ob, IntPtr idx, IntPtr v) } int count = Runtime.PyTuple_Size(idx); + var args = new int[count]; - Array args = Array.CreateInstance(typeof(Int32), count); - - for (int i = 0; i < count; i++) + for (var i = 0; i < count; i++) { IntPtr op = Runtime.PyTuple_GetItem(idx, i); - index = (int)Runtime.PyInt_AsLong(op); + index = Runtime.PyInt_AsLong(op); if (Exceptions.ErrorOccurred()) { @@ -229,9 +227,9 @@ public static int mp_ass_subscript(IntPtr ob, IntPtr idx, IntPtr v) /// public static int sq_contains(IntPtr ob, IntPtr v) { - CLRObject obj = (CLRObject)ManagedType.GetManagedObject(ob); + var obj = (CLRObject)GetManagedObject(ob); Type itemType = obj.inst.GetType().GetElementType(); - IList items = obj.inst as IList; + var items = obj.inst as IList; object value; if (!Converter.ToManaged(v, itemType, out value, false)) @@ -253,8 +251,8 @@ public static int sq_contains(IntPtr ob, IntPtr v) /// public static int mp_length(IntPtr ob) { - CLRObject self = (CLRObject)ManagedType.GetManagedObject(ob); - Array items = self.inst as Array; + var self = (CLRObject)GetManagedObject(ob); + var items = self.inst as Array; return items.Length; } } diff --git a/src/runtime/assemblymanager.cs b/src/runtime/assemblymanager.cs index b98455ec3..29851c32e 100644 --- a/src/runtime/assemblymanager.cs +++ b/src/runtime/assemblymanager.cs @@ -21,8 +21,10 @@ internal class AssemblyManager //static Dictionary> generics; static AssemblyLoadEventHandler lhandler; static ResolveEventHandler rhandler; + // updated only under GIL? static Dictionary probed; + // modified from event handlers below, potentially triggered from different .NET threads static AssemblyList assemblies; internal static List pypath; @@ -53,7 +55,7 @@ internal static void Initialize() domain.AssemblyResolve += rhandler; Assembly[] items = domain.GetAssemblies(); - foreach (var a in items) + foreach (Assembly a in items) { try { @@ -62,7 +64,7 @@ internal static void Initialize() } catch (Exception ex) { - Debug.WriteLine(string.Format("Error scanning assembly {0}. {1}", a, ex)); + Debug.WriteLine("Error scanning assembly {0}. {1}", a, ex); } } } @@ -86,7 +88,7 @@ internal static void Shutdown() /// so that we can know about assemblies that get loaded after the /// Python runtime is initialized. /// - static void AssemblyLoadHandler(Object ob, AssemblyLoadEventArgs args) + private static void AssemblyLoadHandler(object ob, AssemblyLoadEventArgs args) { Assembly assembly = args.LoadedAssembly; assemblies.Add(assembly); @@ -101,7 +103,7 @@ static void AssemblyLoadHandler(Object ob, AssemblyLoadEventArgs args) /// for failed loads, because they might be dependencies of something /// we loaded from Python which also needs to be found on PYTHONPATH. /// - static Assembly ResolveHandler(Object ob, ResolveEventArgs args) + private static Assembly ResolveHandler(object ob, ResolveEventArgs args) { string name = args.Name.ToLower(); foreach (Assembly a in assemblies) @@ -135,7 +137,7 @@ internal static void UpdatePath() { pypath.Clear(); probed.Clear(); - for (int i = 0; i < count; i++) + for (var i = 0; i < count; i++) { IntPtr item = Runtime.PyList_GetItem(list, i); string path = Runtime.GetManagedString(item); @@ -159,7 +161,7 @@ public static string FindAssembly(string name) string path; string temp; - for (int i = 0; i < pypath.Count; i++) + for (var i = 0; i < pypath.Count; i++) { string head = pypath[i]; if (head == null || head.Length == 0) @@ -197,7 +199,7 @@ public static Assembly LoadAssembly(string name) { assembly = Assembly.Load(name); } - catch (System.Exception) + catch (Exception) { //if (!(e is System.IO.FileNotFoundException)) //{ @@ -221,7 +223,7 @@ public static Assembly LoadAssemblyPath(string name) { assembly = Assembly.LoadFrom(path); } - catch + catch (Exception) { } } @@ -241,7 +243,9 @@ public static Assembly LoadAssemblyFullPath(string name) if (Path.IsPathRooted(name)) { if (!Path.HasExtension(name)) + { name = name + ".dll"; + } if (File.Exists(name)) { try @@ -287,13 +291,13 @@ public static Assembly FindLoadedAssembly(string name) public static bool LoadImplicit(string name, bool warn = true) { string[] names = name.Split('.'); - bool loaded = false; - string s = ""; + var loaded = false; + var s = ""; Assembly lastAssembly = null; HashSet assembliesSet = null; - for (int i = 0; i < names.Length; i++) + for (var i = 0; i < names.Length; i++) { - s = (i == 0) ? names[0] : s + "." + names[i]; + s = i == 0 ? names[0] : s + "." + names[i]; if (!probed.ContainsKey(s)) { if (assembliesSet == null) @@ -321,7 +325,7 @@ public static bool LoadImplicit(string name, bool warn = true) // Deprecation warning if (warn && loaded) { - string deprWarning = String.Format( + string deprWarning = string.Format( "\nThe module was found, but not in a referenced namespace.\n" + "Implicit loading is deprecated. Please use clr.AddReference(\"{0}\").", Path.GetFileNameWithoutExtension(lastAssembly.Location)); @@ -345,24 +349,23 @@ internal static void ScanAssembly(Assembly assembly) // the assembly. Type[] types = assembly.GetTypes(); - for (int i = 0; i < types.Length; i++) + foreach (Type t in types) { - Type t = types[i]; string ns = t.Namespace ?? ""; if (!namespaces.ContainsKey(ns)) { string[] names = ns.Split('.'); - string s = ""; - for (int n = 0; n < names.Length; n++) + var s = ""; + for (var n = 0; n < names.Length; n++) { - s = (n == 0) ? names[0] : s + "." + names[n]; + s = n == 0 ? names[0] : s + "." + names[n]; namespaces.TryAdd(s, new ConcurrentDictionary()); } } if (ns != null) { - namespaces[ns].TryAdd(assembly, String.Empty); + namespaces[ns].TryAdd(assembly, string.Empty); } if (ns != null && t.IsGenericTypeDefinition) @@ -374,7 +377,7 @@ internal static void ScanAssembly(Assembly assembly) public static AssemblyName[] ListAssemblies() { - List names = new List(assemblies.Count); + var names = new List(assemblies.Count); foreach (Assembly assembly in assemblies) { names.Add(assembly.GetName()); @@ -388,7 +391,7 @@ public static AssemblyName[] ListAssemblies() /// public static bool IsValidNamespace(string name) { - return !String.IsNullOrEmpty(name) && namespaces.ContainsKey(name); + return !string.IsNullOrEmpty(name) && namespaces.ContainsKey(name); } /// @@ -396,10 +399,7 @@ public static bool IsValidNamespace(string name) /// public static IEnumerable GetAssemblies(string nsname) { - if (!namespaces.ContainsKey(nsname)) - return new List(); - - return namespaces[nsname].Keys; + return !namespaces.ContainsKey(nsname) ? new List() : namespaces[nsname].Keys; } /// @@ -408,7 +408,7 @@ public static IEnumerable GetAssemblies(string nsname) public static List GetNames(string nsname) { //Dictionary seen = new Dictionary(); - List names = new List(8); + var names = new List(8); List g = GenericUtil.GetGenericBaseNames(nsname); if (g != null) @@ -424,9 +424,8 @@ public static List GetNames(string nsname) foreach (Assembly a in namespaces[nsname].Keys) { Type[] types = a.GetTypes(); - for (int i = 0; i < types.Length; i++) + foreach (Type t in types) { - Type t = types[i]; if ((t.Namespace ?? "") == nsname) { names.Add(t.Name); diff --git a/src/runtime/classbase.cs b/src/runtime/classbase.cs index 6ed43689b..580fcabe4 100644 --- a/src/runtime/classbase.cs +++ b/src/runtime/classbase.cs @@ -19,7 +19,7 @@ internal class ClassBase : ManagedType internal Indexer indexer; internal Type type; - internal ClassBase(Type tp) : base() + internal ClassBase(Type tp) { indexer = null; type = tp; @@ -97,10 +97,10 @@ public static IntPtr tp_richcompare(IntPtr ob, IntPtr other, int op) return pyfalse; } - Object o1 = co1.inst; - Object o2 = co2.inst; + object o1 = co1.inst; + object o2 = co2.inst; - if (Object.Equals(o1, o2)) + if (Equals(o1, o2)) { Runtime.XIncref(pytrue); return pytrue; @@ -121,7 +121,7 @@ public static IntPtr tp_richcompare(IntPtr ob, IntPtr other, int op) return Exceptions.RaiseTypeError("Cannot convert object of type " + co1.GetType() + " to IComparable"); try { - var cmp = co1Comp.CompareTo(co2.inst); + int cmp = co1Comp.CompareTo(co2.inst); IntPtr pyCmp; if (cmp < 0) @@ -177,13 +177,13 @@ public static IntPtr tp_richcompare(IntPtr ob, IntPtr other, int op) /// public static IntPtr tp_iter(IntPtr ob) { - CLRObject co = GetManagedObject(ob) as CLRObject; + var co = GetManagedObject(ob) as CLRObject; if (co == null) { return Exceptions.RaiseTypeError("invalid object"); } - IEnumerable e = co.inst as IEnumerable; + var e = co.inst as IEnumerable; IEnumerator o; if (e != null) @@ -196,7 +196,7 @@ public static IntPtr tp_iter(IntPtr ob) if (o == null) { - string message = "iteration over non-sequence"; + var message = "iteration over non-sequence"; return Exceptions.RaiseTypeError(message); } } @@ -210,7 +210,7 @@ public static IntPtr tp_iter(IntPtr ob) /// public static IntPtr tp_hash(IntPtr ob) { - CLRObject co = GetManagedObject(ob) as CLRObject; + var co = GetManagedObject(ob) as CLRObject; if (co == null) { return Exceptions.RaiseTypeError("unhashable type"); @@ -224,7 +224,7 @@ public static IntPtr tp_hash(IntPtr ob) /// public static IntPtr tp_str(IntPtr ob) { - CLRObject co = GetManagedObject(ob) as CLRObject; + var co = GetManagedObject(ob) as CLRObject; if (co == null) { return Exceptions.RaiseTypeError("invalid object"); diff --git a/src/runtime/clrobject.cs b/src/runtime/clrobject.cs index e7bb345f8..472e5dcbb 100644 --- a/src/runtime/clrobject.cs +++ b/src/runtime/clrobject.cs @@ -1,19 +1,17 @@ using System; -using System.Collections; -using System.Reflection; using System.Runtime.InteropServices; namespace Python.Runtime { internal class CLRObject : ManagedType { - internal Object inst; + internal object inst; - internal CLRObject(Object ob, IntPtr tp) : base() + internal CLRObject(object ob, IntPtr tp) { IntPtr py = Runtime.PyType_GenericAlloc(tp, 0); - int flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags); + var flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags); if ((flags & TypeFlags.Subclass) != 0) { IntPtr dict = Marshal.ReadIntPtr(py, ObjectOffset.DictOffset(tp)); @@ -26,9 +24,9 @@ internal CLRObject(Object ob, IntPtr tp) : base() GCHandle gc = GCHandle.Alloc(this); Marshal.WriteIntPtr(py, ObjectOffset.magic(tp), (IntPtr)gc); - this.tpHandle = tp; - this.pyHandle = py; - this.gcHandle = gc; + tpHandle = tp; + pyHandle = py; + gcHandle = gc; inst = ob; // Fix the BaseException args (and __cause__ in case of Python 3) @@ -37,27 +35,27 @@ internal CLRObject(Object ob, IntPtr tp) : base() } - internal static CLRObject GetInstance(Object ob, IntPtr pyType) + internal static CLRObject GetInstance(object ob, IntPtr pyType) { return new CLRObject(ob, pyType); } - internal static CLRObject GetInstance(Object ob) + internal static CLRObject GetInstance(object ob) { ClassBase cc = ClassManager.GetClass(ob.GetType()); return GetInstance(ob, cc.tpHandle); } - internal static IntPtr GetInstHandle(Object ob, IntPtr pyType) + internal static IntPtr GetInstHandle(object ob, IntPtr pyType) { CLRObject co = GetInstance(ob, pyType); return co.pyHandle; } - internal static IntPtr GetInstHandle(Object ob, Type type) + internal static IntPtr GetInstHandle(object ob, Type type) { ClassBase cc = ClassManager.GetClass(type); CLRObject co = GetInstance(ob, cc.tpHandle); @@ -65,7 +63,7 @@ internal static IntPtr GetInstHandle(Object ob, Type type) } - internal static IntPtr GetInstHandle(Object ob) + internal static IntPtr GetInstHandle(object ob) { CLRObject co = GetInstance(ob); return co.pyHandle; diff --git a/src/runtime/codegenerator.cs b/src/runtime/codegenerator.cs index d592843cb..4620b0f0c 100644 --- a/src/runtime/codegenerator.cs +++ b/src/runtime/codegenerator.cs @@ -1,8 +1,5 @@ using System; using System.Threading; -using System.Runtime.InteropServices; -using System.Runtime.CompilerServices; -using System.Collections; using System.Reflection; using System.Reflection.Emit; @@ -21,9 +18,8 @@ internal class CodeGenerator internal CodeGenerator() { - AssemblyName aname = new AssemblyName(); - aname.Name = "__CodeGenerator_Assembly"; - AssemblyBuilderAccess aa = AssemblyBuilderAccess.Run; + var aname = new AssemblyName { Name = "__CodeGenerator_Assembly" }; + var aa = AssemblyBuilderAccess.Run; aBuilder = Thread.GetDomain().DefineDynamicAssembly(aname, aa); mBuilder = aBuilder.DefineDynamicModule("__CodeGenerator_Module"); @@ -34,7 +30,7 @@ internal CodeGenerator() /// internal TypeBuilder DefineType(string name) { - TypeAttributes attrs = TypeAttributes.Public; + var attrs = TypeAttributes.Public; return mBuilder.DefineType(name, attrs); } @@ -43,7 +39,7 @@ internal TypeBuilder DefineType(string name) /// internal TypeBuilder DefineType(string name, Type basetype) { - TypeAttributes attrs = TypeAttributes.Public; + var attrs = TypeAttributes.Public; return mBuilder.DefineType(name, attrs, basetype); } } diff --git a/src/runtime/constructorbinder.cs b/src/runtime/constructorbinder.cs index 400a0dd54..1fc541920 100644 --- a/src/runtime/constructorbinder.cs +++ b/src/runtime/constructorbinder.cs @@ -12,9 +12,9 @@ namespace Python.Runtime /// internal class ConstructorBinder : MethodBinder { - private Type _containingType = null; + private Type _containingType; - internal ConstructorBinder(Type containingType) : base() + internal ConstructorBinder(Type containingType) { _containingType = containingType; } @@ -29,7 +29,7 @@ internal ConstructorBinder(Type containingType) : base() /// internal object InvokeRaw(IntPtr inst, IntPtr args, IntPtr kw) { - return this.InvokeRaw(inst, args, kw, null); + return InvokeRaw(inst, args, kw, null); } /// @@ -49,7 +49,7 @@ internal object InvokeRaw(IntPtr inst, IntPtr args, IntPtr kw) /// internal object InvokeRaw(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info) { - Object result; + object result; if (_containingType.IsValueType && !_containingType.IsPrimitive && !_containingType.IsEnum && _containingType != typeof(decimal) && @@ -76,7 +76,7 @@ internal object InvokeRaw(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info) return result; } - Binding binding = this.Bind(inst, args, kw, info); + Binding binding = Bind(inst, args, kw, info); if (binding == null) { @@ -88,7 +88,7 @@ internal object InvokeRaw(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info) // any extra args are intended for the subclass' __init__. IntPtr eargs = Runtime.PyTuple_New(0); - binding = this.Bind(inst, eargs, kw); + binding = Bind(inst, eargs, kw); Runtime.XDecref(eargs); if (binding == null) @@ -99,7 +99,7 @@ internal object InvokeRaw(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info) } // Fire the selected ctor and catch errors... - ConstructorInfo ci = (ConstructorInfo)binding.info; + var ci = (ConstructorInfo)binding.info; // Object construction is presumed to be non-blocking and fast // enough that we shouldn't really need to release the GIL. try diff --git a/src/runtime/debughelper.cs b/src/runtime/debughelper.cs index 94dd026f6..f42ad2e37 100644 --- a/src/runtime/debughelper.cs +++ b/src/runtime/debughelper.cs @@ -1,5 +1,4 @@ using System; -using System.Collections; using System.Reflection; using System.Runtime.InteropServices; using System.Diagnostics; @@ -20,19 +19,18 @@ public static void Print(string msg, params IntPtr[] args) string result = msg; result += " "; - for (int i = 0; i < args.Length; i++) + foreach (IntPtr t in args) { - if (args[i] == IntPtr.Zero) + if (t == IntPtr.Zero) { Console.WriteLine("null arg to print"); } - IntPtr ob = Runtime.PyObject_Repr(args[i]); + IntPtr ob = Runtime.PyObject_Repr(t); result += Runtime.GetManagedString(ob); Runtime.XDecref(ob); result += " "; } Console.WriteLine(result); - return; } [Conditional("DEBUG")] @@ -50,13 +48,13 @@ internal static void DumpType(IntPtr type) Console.WriteLine("Dump type: {0}", name); op = Marshal.ReadIntPtr(type, TypeOffset.ob_type); - DebugUtil.Print(" type: ", op); + Print(" type: ", op); op = Marshal.ReadIntPtr(type, TypeOffset.tp_base); - DebugUtil.Print(" base: ", op); + Print(" base: ", op); op = Marshal.ReadIntPtr(type, TypeOffset.tp_bases); - DebugUtil.Print(" bases: ", op); + Print(" bases: ", op); //op = Marshal.ReadIntPtr(type, TypeOffset.tp_mro); //DebugUtil.Print(" mro: ", op); @@ -65,7 +63,7 @@ internal static void DumpType(IntPtr type) FieldInfo[] slots = typeof(TypeOffset).GetFields(); int size = IntPtr.Size; - for (int i = 0; i < slots.Length; i++) + for (var i = 0; i < slots.Length; i++) { int offset = i * size; name = slots[i].Name; @@ -83,7 +81,7 @@ internal static void DumpType(IntPtr type) } else { - DebugUtil.Print(" dict: ", op); + Print(" dict: ", op); } } @@ -91,11 +89,11 @@ internal static void DumpType(IntPtr type) internal static void DumpInst(IntPtr ob) { IntPtr tp = Runtime.PyObject_TYPE(ob); - int sz = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_basicsize); + var sz = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_basicsize); - for (int i = 0; i < sz; i += IntPtr.Size) + for (var i = 0; i < sz; i += IntPtr.Size) { - IntPtr pp = new IntPtr(ob.ToInt64() + i); + var pp = new IntPtr(ob.ToInt64() + i); IntPtr v = Marshal.ReadIntPtr(pp); Console.WriteLine("offset {0}: {1}", i, v); } @@ -107,7 +105,7 @@ internal static void DumpInst(IntPtr ob) [Conditional("DEBUG")] internal static void debug(string msg) { - StackTrace st = new StackTrace(1, true); + var st = new StackTrace(1, true); StackFrame sf = st.GetFrame(0); MethodBase mb = sf.GetMethod(); Type mt = mb.DeclaringType; @@ -116,7 +114,6 @@ internal static void debug(string msg) string tid = t.GetHashCode().ToString(); Console.WriteLine("thread {0} : {1}", tid, caller); Console.WriteLine(" {0}", msg); - return; } } } diff --git a/src/runtime/delegateobject.cs b/src/runtime/delegateobject.cs index 2d305e5f2..ff64ff094 100644 --- a/src/runtime/delegateobject.cs +++ b/src/runtime/delegateobject.cs @@ -26,10 +26,10 @@ internal DelegateObject(Type tp) : base(tp) /// private static Delegate GetTrueDelegate(IntPtr op) { - CLRObject o = GetManagedObject(op) as CLRObject; + var o = GetManagedObject(op) as CLRObject; if (o != null) { - Delegate d = o.inst as Delegate; + var d = o.inst as Delegate; return d; } return null; @@ -51,11 +51,11 @@ internal override bool CanSubclass() /// public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) { - DelegateObject self = (DelegateObject)GetManagedObject(tp); + var self = (DelegateObject)GetManagedObject(tp); if (Runtime.PyTuple_Size(args) != 1) { - string message = "class takes exactly one argument"; + var message = "class takes exactly one argument"; return Exceptions.RaiseTypeError(message); } @@ -78,15 +78,15 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) { // todo: add fast type check! IntPtr pytype = Runtime.PyObject_TYPE(ob); - DelegateObject self = (DelegateObject)GetManagedObject(pytype); - CLRObject o = GetManagedObject(ob) as CLRObject; + var self = (DelegateObject)GetManagedObject(pytype); + var o = GetManagedObject(ob) as CLRObject; if (o == null) { return Exceptions.RaiseTypeError("invalid argument"); } - Delegate d = o.inst as Delegate; + var d = o.inst as Delegate; if (d == null) { diff --git a/src/runtime/extensiontype.cs b/src/runtime/extensiontype.cs index a09f57696..37ab11239 100644 --- a/src/runtime/extensiontype.cs +++ b/src/runtime/extensiontype.cs @@ -1,7 +1,5 @@ using System; using System.Runtime.InteropServices; -using System.Collections; -using System.Reflection; namespace Python.Runtime { @@ -12,14 +10,14 @@ namespace Python.Runtime /// internal abstract class ExtensionType : ManagedType { - public ExtensionType() : base() + public ExtensionType() { // Create a new PyObject whose type is a generated type that is // implemented by the particuar concrete ExtensionType subclass. // The Python instance object is related to an instance of a // particular concrete subclass with a hidden CLR gchandle. - IntPtr tp = TypeManager.GetTypeHandle(this.GetType()); + IntPtr tp = TypeManager.GetTypeHandle(GetType()); //int rc = (int)Marshal.ReadIntPtr(tp, TypeOffset.ob_refcnt); //if (rc > 1050) @@ -40,9 +38,9 @@ public ExtensionType() : base() Runtime.PyObject_GC_UnTrack(py); - this.tpHandle = tp; - this.pyHandle = py; - this.gcHandle = gc; + tpHandle = tp; + pyHandle = py; + gcHandle = gc; } @@ -62,7 +60,7 @@ public static void FinalizeObject(ManagedType self) /// public static int tp_setattro(IntPtr ob, IntPtr key, IntPtr val) { - string message = "type does not support setting attributes"; + var message = "type does not support setting attributes"; if (val == IntPtr.Zero) { message = "readonly attribute"; @@ -78,8 +76,7 @@ public static int tp_setattro(IntPtr ob, IntPtr key, IntPtr val) /// public static int tp_descr_set(IntPtr ds, IntPtr ob, IntPtr val) { - string message = "attribute is read-only"; - Exceptions.SetError(Exceptions.AttributeError, message); + Exceptions.SetError(Exceptions.AttributeError, "attribute is read-only"); return -1; } diff --git a/src/runtime/fieldobject.cs b/src/runtime/fieldobject.cs index 3d65f5fd3..6eefb5b0a 100644 --- a/src/runtime/fieldobject.cs +++ b/src/runtime/fieldobject.cs @@ -1,7 +1,5 @@ using System; -using System.Collections; using System.Reflection; -using System.Runtime.InteropServices; namespace Python.Runtime { @@ -12,7 +10,7 @@ internal class FieldObject : ExtensionType { FieldInfo info; - public FieldObject(FieldInfo info) : base() + public FieldObject(FieldInfo info) { this.info = info; } @@ -24,8 +22,8 @@ public FieldObject(FieldInfo info) : base() /// public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) { - FieldObject self = (FieldObject)GetManagedObject(ds); - Object result; + var self = (FieldObject)GetManagedObject(ds); + object result; if (self == null) { @@ -34,12 +32,12 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) FieldInfo info = self.info; - if ((ob == IntPtr.Zero) || (ob == Runtime.PyNone)) + if (ob == IntPtr.Zero || ob == Runtime.PyNone) { if (!info.IsStatic) { Exceptions.SetError(Exceptions.TypeError, - "instance attribute must be accessed " + "through a class instance"); + "instance attribute must be accessed through a class instance"); return IntPtr.Zero; } try @@ -56,7 +54,7 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) try { - CLRObject co = (CLRObject)GetManagedObject(ob); + var co = (CLRObject)GetManagedObject(ob); result = info.GetValue(co.inst); return Converter.ToPython(result, info.FieldType); } @@ -72,10 +70,10 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) /// a field based on the given Python value. The Python value must be /// convertible to the type of the field. /// - public static new int tp_descr_set(IntPtr ds, IntPtr ob, IntPtr val) + public new static int tp_descr_set(IntPtr ds, IntPtr ob, IntPtr val) { - FieldObject self = (FieldObject)GetManagedObject(ds); - Object newval; + var self = (FieldObject)GetManagedObject(ds); + object newval; if (self == null) { @@ -98,12 +96,11 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) bool is_static = info.IsStatic; - if ((ob == IntPtr.Zero) || (ob == Runtime.PyNone)) + if (ob == IntPtr.Zero || ob == Runtime.PyNone) { if (!is_static) { - Exceptions.SetError(Exceptions.TypeError, - "instance attribute must be set " + "through a class instance"); + Exceptions.SetError(Exceptions.TypeError, "instance attribute must be set through a class instance"); return -1; } } @@ -117,7 +114,7 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) { if (!is_static) { - CLRObject co = (CLRObject)GetManagedObject(ob); + var co = (CLRObject)GetManagedObject(ob); info.SetValue(co.inst, newval); } else @@ -138,8 +135,8 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) /// public static IntPtr tp_repr(IntPtr ob) { - FieldObject self = (FieldObject)GetManagedObject(ob); - string s = String.Format("", self.info.Name); + var self = (FieldObject)GetManagedObject(ob); + string s = $""; return Runtime.PyString_FromStringAndSize(s, s.Length); } } diff --git a/src/runtime/generictype.cs b/src/runtime/generictype.cs index 761efc045..eeae801d2 100644 --- a/src/runtime/generictype.cs +++ b/src/runtime/generictype.cs @@ -1,5 +1,4 @@ using System; -using System.Reflection; namespace Python.Runtime { diff --git a/src/runtime/genericutil.cs b/src/runtime/genericutil.cs index 6568ac438..d1de1c374 100644 --- a/src/runtime/genericutil.cs +++ b/src/runtime/genericutil.cs @@ -30,7 +30,9 @@ static GenericUtil() internal static void Register(Type t) { if (null == t.Namespace || null == t.Name) + { return; + } Dictionary> nsmap = null; mapping.TryGetValue(t.Namespace, out nsmap); @@ -66,7 +68,7 @@ public static List GetGenericBaseNames(string ns) { return null; } - List names = new List(); + var names = new List(); foreach (string key in nsmap.Keys) { names.Add(key); @@ -87,7 +89,9 @@ public static Type GenericByName(string ns, string name, int paramCount) foreach (Type t in GenericsByName(ns, name)) { if (t.GetGenericArguments().Length == paramCount) + { return t; + } } return null; } @@ -119,7 +123,7 @@ public static List GenericsByName(string ns, string basename) return null; } - List result = new List(); + var result = new List(); foreach (string name in names) { string qname = ns + "." + name; diff --git a/src/runtime/importhook.cs b/src/runtime/importhook.cs index e5843d436..96a343773 100644 --- a/src/runtime/importhook.cs +++ b/src/runtime/importhook.cs @@ -59,7 +59,7 @@ internal static void Initialize() Runtime.PyDict_Update(mod_dict, clr_dict); #elif PYTHON2 Runtime.XIncref(root.pyHandle); // we are using the module two times - py_clr_module = root.pyHandle; // Alias handle for PY2/PY3 + py_clr_module = root.pyHandle; // Alias handle for PY2/PY3 #endif Runtime.PyDict_SetItemString(dict, "CLR", py_clr_module); Runtime.PyDict_SetItemString(dict, "clr", py_clr_module); @@ -150,8 +150,8 @@ public static IntPtr __import__(IntPtr self, IntPtr args, IntPtr kw) // borrowed reference IntPtr py_mod_name = Runtime.PyTuple_GetItem(args, 0); - if ((py_mod_name == IntPtr.Zero) || - (!Runtime.IsStringType(py_mod_name))) + if (py_mod_name == IntPtr.Zero || + !Runtime.IsStringType(py_mod_name)) { return Exceptions.RaiseTypeError("string expected"); } @@ -160,12 +160,12 @@ public static IntPtr __import__(IntPtr self, IntPtr args, IntPtr kw) // This determines whether we return the head or tail module. IntPtr fromList = IntPtr.Zero; - bool fromlist = false; + var fromlist = false; if (num_args >= 4) { fromList = Runtime.PyTuple_GetItem(args, 3); - if ((fromList != IntPtr.Zero) && - (Runtime.PyObject_IsTrue(fromList) == 1)) + if (fromList != IntPtr.Zero && + Runtime.PyObject_IsTrue(fromList) == 1) { fromlist = true; } @@ -208,7 +208,7 @@ public static IntPtr __import__(IntPtr self, IntPtr args, IntPtr kw) { clr_prefix = "CLR."; // prepend when adding the module to sys.modules realname = mod_name.Substring(4); - string msg = String.Format("Importing from the CLR.* namespace " + + string msg = string.Format("Importing from the CLR.* namespace " + "is deprecated. Please import '{0}' directly.", realname); Exceptions.deprecation(msg); } @@ -301,7 +301,7 @@ public static IntPtr __import__(IntPtr self, IntPtr args, IntPtr kw) // enable preloading in a non-interactive python processing by // setting clr.preload = True - ModuleObject head = (mod_name == realname) ? null : root; + ModuleObject head = mod_name == realname ? null : root; ModuleObject tail = root; root.InitializePreload(); @@ -310,7 +310,7 @@ public static IntPtr __import__(IntPtr self, IntPtr args, IntPtr kw) ManagedType mt = tail.GetAttribute(name, true); if (!(mt is ModuleObject)) { - string error = String.Format("No module named {0}", name); + string error = string.Format("No module named {0}", name); Exceptions.SetError(Exceptions.ImportError, error); return IntPtr.Zero; } @@ -339,7 +339,7 @@ public static IntPtr __import__(IntPtr self, IntPtr args, IntPtr kw) if (fromlist && Runtime.PySequence_Size(fromList) == 1) { IntPtr fp = Runtime.PySequence_GetItem(fromList, 0); - if ((!CLRModule.preload) && Runtime.GetManagedString(fp) == "*") + if (!CLRModule.preload && Runtime.GetManagedString(fp) == "*") { mod.LoadNames(); } diff --git a/src/runtime/interfaceobject.cs b/src/runtime/interfaceobject.cs index 8e64c24d7..e1c816f01 100644 --- a/src/runtime/interfaceobject.cs +++ b/src/runtime/interfaceobject.cs @@ -16,7 +16,7 @@ internal class InterfaceObject : ClassBase internal InterfaceObject(Type tp) : base(tp) { - CoClassAttribute coclass = (CoClassAttribute)Attribute.GetCustomAttribute(tp, cc_attr); + var coclass = (CoClassAttribute)Attribute.GetCustomAttribute(tp, cc_attr); if (coclass != null) { ctor = coclass.CoClass.GetConstructor(Type.EmptyTypes); @@ -35,17 +35,17 @@ static InterfaceObject() /// public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) { - InterfaceObject self = (InterfaceObject)GetManagedObject(tp); + var self = (InterfaceObject)GetManagedObject(tp); int nargs = Runtime.PyTuple_Size(args); Type type = self.type; - Object obj; + object obj; if (nargs == 1) { IntPtr inst = Runtime.PyTuple_GetItem(args, 0); - CLRObject co = GetManagedObject(inst) as CLRObject; + var co = GetManagedObject(inst) as CLRObject; - if ((co == null) || (!type.IsInstanceOfType(co.inst))) + if (co == null || !type.IsInstanceOfType(co.inst)) { string msg = "object does not implement " + type.Name; Exceptions.SetError(Exceptions.TypeError, msg); @@ -55,7 +55,7 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) obj = co.inst; } - else if ((nargs == 0) && (self.ctor != null)) + else if (nargs == 0 && self.ctor != null) { obj = self.ctor.Invoke(null); diff --git a/src/runtime/interfaces.cs b/src/runtime/interfaces.cs index d0edfbf9c..5ce319858 100644 --- a/src/runtime/interfaces.cs +++ b/src/runtime/interfaces.cs @@ -1,6 +1,4 @@ using System; -using System.Reflection; -using System.Runtime.InteropServices; namespace Python.Runtime { diff --git a/src/runtime/iterator.cs b/src/runtime/iterator.cs index f2a32deb4..efa49537c 100644 --- a/src/runtime/iterator.cs +++ b/src/runtime/iterator.cs @@ -1,6 +1,5 @@ using System; using System.Collections; -using System.Reflection; namespace Python.Runtime { @@ -12,9 +11,9 @@ internal class Iterator : ExtensionType { IEnumerator iter; - public Iterator(IEnumerator e) : base() + public Iterator(IEnumerator e) { - this.iter = e; + iter = e; } @@ -23,7 +22,7 @@ public Iterator(IEnumerator e) : base() /// public static IntPtr tp_iternext(IntPtr ob) { - Iterator self = GetManagedObject(ob) as Iterator; + var self = GetManagedObject(ob) as Iterator; if (!self.iter.MoveNext()) { Exceptions.SetError(Exceptions.StopIteration, Runtime.PyNone); diff --git a/src/runtime/managedtype.cs b/src/runtime/managedtype.cs index 0d46f2366..9ee8d223b 100644 --- a/src/runtime/managedtype.cs +++ b/src/runtime/managedtype.cs @@ -1,7 +1,5 @@ using System; using System.Runtime.InteropServices; -using System.Collections; -using System.Reflection; namespace Python.Runtime { @@ -30,13 +28,13 @@ internal static ManagedType GetManagedObject(IntPtr ob) tp = ob; } - int flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags); + var flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags); if ((flags & TypeFlags.Managed) != 0) { - IntPtr op = (tp == ob) + IntPtr op = tp == ob ? Marshal.ReadIntPtr(tp, TypeOffset.magic()) : Marshal.ReadIntPtr(ob, ObjectOffset.magic(ob)); - GCHandle gc = (GCHandle)op; + var gc = (GCHandle)op; return (ManagedType)gc.Target; } } @@ -65,7 +63,7 @@ internal static bool IsManagedType(IntPtr ob) tp = ob; } - int flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags); + var flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags); if ((flags & TypeFlags.Managed) != 0) { return true; diff --git a/src/runtime/methodwrapper.cs b/src/runtime/methodwrapper.cs index 71932ddd0..2f3ce3ef2 100644 --- a/src/runtime/methodwrapper.cs +++ b/src/runtime/methodwrapper.cs @@ -1,6 +1,4 @@ using System; -using System.Collections; -using System.Runtime.InteropServices; namespace Python.Runtime { diff --git a/src/runtime/modulefunctionobject.cs b/src/runtime/modulefunctionobject.cs index b6f2899d8..aa4c8fb06 100644 --- a/src/runtime/modulefunctionobject.cs +++ b/src/runtime/modulefunctionobject.cs @@ -1,5 +1,5 @@ using System; -using System.Collections; +using System.Linq; using System.Reflection; namespace Python.Runtime @@ -12,13 +12,9 @@ internal class ModuleFunctionObject : MethodObject public ModuleFunctionObject(Type type, string name, MethodInfo[] info, bool allow_threads) : base(type, name, info, allow_threads) { - for (int i = 0; i < info.Length; i++) + if (info.Any(item => !item.IsStatic)) { - MethodInfo item = (MethodInfo)info[i]; - if (!item.IsStatic) - { - throw new Exception("Module function must be static."); - } + throw new Exception("Module function must be static."); } } @@ -27,17 +23,17 @@ public ModuleFunctionObject(Type type, string name, MethodInfo[] info, bool allo /// public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) { - ModuleFunctionObject self = (ModuleFunctionObject)GetManagedObject(ob); + var self = (ModuleFunctionObject)GetManagedObject(ob); return self.Invoke(ob, args, kw); } /// /// __repr__ implementation. /// - public static new IntPtr tp_repr(IntPtr ob) + public new static IntPtr tp_repr(IntPtr ob) { - ModuleFunctionObject self = (ModuleFunctionObject)GetManagedObject(ob); - string s = String.Format("", self.name); + var self = (ModuleFunctionObject)GetManagedObject(ob); + string s = $""; return Runtime.PyString_FromStringAndSize(s, s.Length); } } diff --git a/src/runtime/modulepropertyobject.cs b/src/runtime/modulepropertyobject.cs index 7f7841890..8f5edb6ef 100644 --- a/src/runtime/modulepropertyobject.cs +++ b/src/runtime/modulepropertyobject.cs @@ -1,7 +1,5 @@ using System; -using System.Collections; using System.Reflection; -using System.Security.Permissions; namespace Python.Runtime { @@ -10,7 +8,7 @@ namespace Python.Runtime /// internal class ModulePropertyObject : ExtensionType { - public ModulePropertyObject(PropertyInfo md) : base() + public ModulePropertyObject(PropertyInfo md) { throw new NotImplementedException("ModulePropertyObject"); } diff --git a/src/runtime/monosupport.cs b/src/runtime/monosupport.cs index 7ddf9aa1a..fc39f9065 100644 --- a/src/runtime/monosupport.cs +++ b/src/runtime/monosupport.cs @@ -31,10 +31,8 @@ public int GetNativeDataSize() public IntPtr MarshalManagedToNative(object obj) { - string s = obj as string; - if (s == null) - return IntPtr.Zero; - return UnixMarshal.StringToHeap(s, Encoding.UTF32); + var s = obj as string; + return s == null ? IntPtr.Zero : UnixMarshal.StringToHeap(s, Encoding.UTF32); } public object MarshalNativeToManaged(IntPtr pNativeData) diff --git a/src/runtime/nativecall.cs b/src/runtime/nativecall.cs index 7eb8b87c8..f49f08e7b 100644 --- a/src/runtime/nativecall.cs +++ b/src/runtime/nativecall.cs @@ -13,12 +13,10 @@ namespace Python.Runtime /// C API can just be wrapped with p/invoke, but there are some /// situations (specifically, calling functions through Python /// type structures) where we need to call functions indirectly. - /// /// This class uses Reflection.Emit to generate IJW thunks that /// support indirect calls to native code using various common /// call signatures. This is mainly a workaround for the fact /// that you can't spell an indirect call in C# (but can in IL). - /// /// Another approach that would work is for this to be turned /// into a separate utility program that could be run during the /// build process to generate the thunks as a separate assembly @@ -40,14 +38,14 @@ static NativeCall() // interface (defined below) and generate the required thunk // code based on the method signatures. - AssemblyName aname = new AssemblyName(); + var aname = new AssemblyName(); aname.Name = "e__NativeCall_Assembly"; - AssemblyBuilderAccess aa = AssemblyBuilderAccess.Run; + var aa = AssemblyBuilderAccess.Run; aBuilder = Thread.GetDomain().DefineDynamicAssembly(aname, aa); mBuilder = aBuilder.DefineDynamicModule("e__NativeCall_Module"); - TypeAttributes ta = TypeAttributes.Public; + var ta = TypeAttributes.Public; TypeBuilder tBuilder = mBuilder.DefineType("e__NativeCall", ta); Type iType = typeof(INativeCall); @@ -72,8 +70,8 @@ private static void GenerateThunk(TypeBuilder tb, MethodInfo method) int count = pi.Length; int argc = count - 1; - Type[] args = new Type[count]; - for (int i = 0; i < count; i++) + var args = new Type[count]; + for (var i = 0; i < count; i++) { args[i] = pi[i].ParameterType; } @@ -84,16 +82,16 @@ private static void GenerateThunk(TypeBuilder tb, MethodInfo method) MethodAttributes.Virtual, method.ReturnType, args - ); + ); // Build the method signature for the actual native function. // This is essentially the signature of the wrapper method // minus the first argument (the passed in function pointer). - Type[] nargs = new Type[argc]; - for (int i = 1; i < count; i++) + var nargs = new Type[argc]; + for (var i = 1; i < count; i++) { - nargs[(i - 1)] = args[i]; + nargs[i - 1] = args[i]; } // IL generation: the (implicit) first argument of the method @@ -103,9 +101,9 @@ private static void GenerateThunk(TypeBuilder tb, MethodInfo method) ILGenerator il = mb.GetILGenerator(); - for (int i = 0; i < argc; i++) + for (var i = 0; i < argc; i++) { - il.Emit(OpCodes.Ldarg_S, (i + 2)); + il.Emit(OpCodes.Ldarg_S, i + 2); } il.Emit(OpCodes.Ldarg_1); @@ -114,12 +112,11 @@ private static void GenerateThunk(TypeBuilder tb, MethodInfo method) CallingConvention.Cdecl, method.ReturnType, nargs - ); + ); il.Emit(OpCodes.Ret); tb.DefineMethodOverride(mb, method); - return; } diff --git a/src/runtime/overload.cs b/src/runtime/overload.cs index a183863d6..e8f51c01d 100644 --- a/src/runtime/overload.cs +++ b/src/runtime/overload.cs @@ -12,7 +12,7 @@ internal class OverloadMapper : ExtensionType MethodObject m; IntPtr target; - public OverloadMapper(MethodObject m, IntPtr target) : base() + public OverloadMapper(MethodObject m, IntPtr target) { Runtime.XIncref(target); this.target = target; @@ -24,7 +24,7 @@ public OverloadMapper(MethodObject m, IntPtr target) : base() /// public static IntPtr mp_subscript(IntPtr tp, IntPtr idx) { - OverloadMapper self = (OverloadMapper)GetManagedObject(tp); + var self = (OverloadMapper)GetManagedObject(tp); // Note: if the type provides a non-generic method with N args // and a generic method that takes N params, then we always @@ -39,12 +39,11 @@ public static IntPtr mp_subscript(IntPtr tp, IntPtr idx) MethodInfo mi = MethodBinder.MatchSignature(self.m.info, types); if (mi == null) { - string e = "No match found for signature"; + var e = "No match found for signature"; return Exceptions.RaiseTypeError(e); } - MethodBinding mb = new MethodBinding(self.m, self.target); - mb.info = mi; + var mb = new MethodBinding(self.m, self.target) { info = mi }; Runtime.XIncref(mb.pyHandle); return mb.pyHandle; } @@ -54,7 +53,7 @@ public static IntPtr mp_subscript(IntPtr tp, IntPtr idx) /// public static IntPtr tp_repr(IntPtr op) { - OverloadMapper self = (OverloadMapper)GetManagedObject(op); + var self = (OverloadMapper)GetManagedObject(op); IntPtr doc = self.m.GetDocString(); Runtime.XIncref(doc); return doc; @@ -63,11 +62,11 @@ public static IntPtr tp_repr(IntPtr op) /// /// OverloadMapper dealloc implementation. /// - public static new void tp_dealloc(IntPtr ob) + public new static void tp_dealloc(IntPtr ob) { - OverloadMapper self = (OverloadMapper)GetManagedObject(ob); + var self = (OverloadMapper)GetManagedObject(ob); Runtime.XDecref(self.target); - ExtensionType.FinalizeObject(self); + FinalizeObject(self); } } } diff --git a/src/runtime/propertyobject.cs b/src/runtime/propertyobject.cs index ea029cc91..dae47667f 100644 --- a/src/runtime/propertyobject.cs +++ b/src/runtime/propertyobject.cs @@ -1,5 +1,4 @@ using System; -using System.Collections; using System.Reflection; using System.Security.Permissions; @@ -14,8 +13,8 @@ internal class PropertyObject : ExtensionType MethodInfo getter; MethodInfo setter; - [StrongNameIdentityPermissionAttribute(SecurityAction.Assert)] - public PropertyObject(PropertyInfo md) : base() + [StrongNameIdentityPermission(SecurityAction.Assert)] + public PropertyObject(PropertyInfo md) { getter = md.GetGetMethod(true); setter = md.GetSetMethod(true); @@ -30,9 +29,9 @@ public PropertyObject(PropertyInfo md) : base() /// public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) { - PropertyObject self = (PropertyObject)GetManagedObject(ds); + var self = (PropertyObject)GetManagedObject(ds); MethodInfo getter = self.getter; - Object result; + object result; if (getter == null) @@ -40,12 +39,12 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) return Exceptions.RaiseTypeError("property cannot be read"); } - if ((ob == IntPtr.Zero) || (ob == Runtime.PyNone)) + if (ob == IntPtr.Zero || ob == Runtime.PyNone) { - if (!(getter.IsStatic)) + if (!getter.IsStatic) { Exceptions.SetError(Exceptions.TypeError, - "instance property must be accessed through " + "a class instance"); + "instance property must be accessed through a class instance"); return IntPtr.Zero; } @@ -60,7 +59,7 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) } } - CLRObject co = GetManagedObject(ob) as CLRObject; + var co = GetManagedObject(ob) as CLRObject; if (co == null) { return Exceptions.RaiseTypeError("invalid target"); @@ -88,11 +87,11 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) /// a property based on the given Python value. The Python value must /// be convertible to the type of the property. /// - public static new int tp_descr_set(IntPtr ds, IntPtr ob, IntPtr val) + public new static int tp_descr_set(IntPtr ds, IntPtr ob, IntPtr val) { - PropertyObject self = (PropertyObject)GetManagedObject(ds); + var self = (PropertyObject)GetManagedObject(ds); MethodInfo setter = self.setter; - Object newval; + object newval; if (val == IntPtr.Zero) { @@ -114,9 +113,9 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) bool is_static = setter.IsStatic; - if ((ob == IntPtr.Zero) || (ob == Runtime.PyNone)) + if (ob == IntPtr.Zero || ob == Runtime.PyNone) { - if (!(is_static)) + if (!is_static) { Exceptions.RaiseTypeError("instance property must be set on an instance"); return -1; @@ -127,7 +126,7 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) { if (!is_static) { - CLRObject co = GetManagedObject(ob) as CLRObject; + var co = GetManagedObject(ob) as CLRObject; if (co == null) { Exceptions.RaiseTypeError("invalid target"); @@ -158,8 +157,8 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) /// public static IntPtr tp_repr(IntPtr ob) { - PropertyObject self = (PropertyObject)GetManagedObject(ob); - string s = String.Format("", self.info.Name); + var self = (PropertyObject)GetManagedObject(ob); + string s = $""; return Runtime.PyString_FromStringAndSize(s, s.Length); } } diff --git a/src/runtime/pyansistring.cs b/src/runtime/pyansistring.cs index d15961ee3..4973d8b2a 100644 --- a/src/runtime/pyansistring.cs +++ b/src/runtime/pyansistring.cs @@ -25,7 +25,7 @@ public PyAnsiString(IntPtr ptr) : base(ptr) /// An ArgumentException will be thrown if the given object is not /// a Python string object. /// - public PyAnsiString(PyObject o) : base() + public PyAnsiString(PyObject o) { if (!IsStringType(o)) { @@ -42,7 +42,7 @@ public PyAnsiString(PyObject o) : base() /// /// Creates a Python string from a managed string. /// - public PyAnsiString(string s) : base() + public PyAnsiString(string s) { obj = Runtime.PyString_FromStringAndSize(s, s.Length); if (obj == IntPtr.Zero) diff --git a/src/runtime/pydict.cs b/src/runtime/pydict.cs index 18f0939b2..7237d1990 100644 --- a/src/runtime/pydict.cs +++ b/src/runtime/pydict.cs @@ -1,5 +1,4 @@ using System; -using System.Runtime.InteropServices; namespace Python.Runtime { @@ -30,7 +29,7 @@ public PyDict(IntPtr ptr) : base(ptr) /// /// Creates a new Python dictionary object. /// - public PyDict() : base() + public PyDict() { obj = Runtime.PyDict_New(); if (obj == IntPtr.Zero) @@ -48,7 +47,7 @@ public PyDict() : base() /// ArgumentException will be thrown if the given object is not a /// Python dictionary object. /// - public PyDict(PyObject o) : base() + public PyDict(PyObject o) { if (!IsDictType(o)) { @@ -79,7 +78,7 @@ public static bool IsDictType(PyObject value) /// public bool HasKey(PyObject key) { - return (Runtime.PyMapping_HasKey(obj, key.obj) != 0); + return Runtime.PyMapping_HasKey(obj, key.obj) != 0; } @@ -91,8 +90,10 @@ public bool HasKey(PyObject key) /// public bool HasKey(string key) { - using (PyString str = new PyString(key)) + using (var str = new PyString(key)) + { return HasKey(str); + } } diff --git a/src/runtime/pyfloat.cs b/src/runtime/pyfloat.cs index 959657118..cca436def 100644 --- a/src/runtime/pyfloat.cs +++ b/src/runtime/pyfloat.cs @@ -1,5 +1,4 @@ using System; -using System.Runtime.InteropServices; namespace Python.Runtime { @@ -32,7 +31,7 @@ public PyFloat(IntPtr ptr) : base(ptr) /// ArgumentException will be thrown if the given object is not a /// Python float object. /// - public PyFloat(PyObject o) : base() + public PyFloat(PyObject o) { if (!IsFloatType(o)) { @@ -49,7 +48,7 @@ public PyFloat(PyObject o) : base() /// /// Creates a new Python float from a double value. /// - public PyFloat(double value) : base() + public PyFloat(double value) { obj = Runtime.PyFloat_FromDouble(value); if (obj == IntPtr.Zero) @@ -65,9 +64,9 @@ public PyFloat(double value) : base() /// /// Creates a new Python float from a string value. /// - public PyFloat(string value) : base() + public PyFloat(string value) { - using (PyString s = new PyString(value)) + using (var s = new PyString(value)) { obj = Runtime.PyFloat_FromString(s.obj, IntPtr.Zero); if (obj == IntPtr.Zero) diff --git a/src/runtime/pyint.cs b/src/runtime/pyint.cs index e89c1e87e..c84939482 100644 --- a/src/runtime/pyint.cs +++ b/src/runtime/pyint.cs @@ -1,5 +1,4 @@ using System; -using System.Runtime.InteropServices; namespace Python.Runtime { @@ -32,7 +31,7 @@ public PyInt(IntPtr ptr) : base(ptr) /// ArgumentException will be thrown if the given object is not a /// Python int object. /// - public PyInt(PyObject o) : base() + public PyInt(PyObject o) { if (!IsIntType(o)) { @@ -49,7 +48,7 @@ public PyInt(PyObject o) : base() /// /// Creates a new Python int from an int32 value. /// - public PyInt(int value) : base() + public PyInt(int value) { obj = Runtime.PyInt_FromInt32(value); if (obj == IntPtr.Zero) @@ -68,7 +67,7 @@ public PyInt(int value) : base() [CLSCompliant(false)] public PyInt(uint value) : base(IntPtr.Zero) { - obj = Runtime.PyInt_FromInt64((long)value); + obj = Runtime.PyInt_FromInt64(value); if (obj == IntPtr.Zero) { throw new PythonException(); @@ -161,7 +160,7 @@ public PyInt(sbyte value) : this((int)value) /// /// Creates a new Python int from a string value. /// - public PyInt(string value) : base() + public PyInt(string value) { obj = Runtime.PyInt_FromString(value, IntPtr.Zero, 0); if (obj == IntPtr.Zero) @@ -210,7 +209,7 @@ public static PyInt AsInt(PyObject value) /// public short ToInt16() { - return System.Convert.ToInt16(this.ToInt32()); + return Convert.ToInt16(ToInt32()); } @@ -234,7 +233,7 @@ public int ToInt32() /// public long ToInt64() { - return System.Convert.ToInt64(this.ToInt32()); + return Convert.ToInt64(ToInt32()); } } } diff --git a/src/runtime/pyiter.cs b/src/runtime/pyiter.cs index c1bab2781..3c9b2a238 100644 --- a/src/runtime/pyiter.cs +++ b/src/runtime/pyiter.cs @@ -11,7 +11,7 @@ namespace Python.Runtime /// public class PyIter : PyObject, IEnumerator { - private PyObject _current = null; + private PyObject _current; /// /// PyIter Constructor @@ -31,11 +31,13 @@ public PyIter(IntPtr ptr) : base(ptr) /// /// Creates a Python iterator from an iterable. Like doing "iter(iterable)" in python. /// - public PyIter(PyObject iterable) : base() + public PyIter(PyObject iterable) { obj = Runtime.PyObject_GetIter(iterable.obj); if (obj == IntPtr.Zero) + { throw new PythonException(); + } } protected override void Dispose(bool disposing) @@ -61,7 +63,9 @@ public bool MoveNext() IntPtr next = Runtime.PyIter_Next(obj); if (next == IntPtr.Zero) + { return false; + } _current = new PyObject(next); return true; diff --git a/src/runtime/pylist.cs b/src/runtime/pylist.cs index 8a369f654..b22d9d51f 100644 --- a/src/runtime/pylist.cs +++ b/src/runtime/pylist.cs @@ -31,7 +31,7 @@ public PyList(IntPtr ptr) : base(ptr) /// ArgumentException will be thrown if the given object is not a /// Python list object. /// - public PyList(PyObject o) : base() + public PyList(PyObject o) { if (!IsListType(o)) { @@ -48,7 +48,7 @@ public PyList(PyObject o) : base() /// /// Creates a new empty Python list object. /// - public PyList() : base() + public PyList() { obj = Runtime.PyList_New(0); if (obj == IntPtr.Zero) @@ -64,11 +64,11 @@ public PyList() : base() /// /// Creates a new Python list object from an array of PyObjects. /// - public PyList(PyObject[] items) : base() + public PyList(PyObject[] items) { int count = items.Length; obj = Runtime.PyList_New(count); - for (int i = 0; i < count; i++) + for (var i = 0; i < count; i++) { IntPtr ptr = items[i].obj; Runtime.XIncref(ptr); diff --git a/src/runtime/pylong.cs b/src/runtime/pylong.cs index 8deac242e..ade7cb42c 100644 --- a/src/runtime/pylong.cs +++ b/src/runtime/pylong.cs @@ -31,7 +31,7 @@ public PyLong(IntPtr ptr) : base(ptr) /// ArgumentException will be thrown if the given object is not a /// Python long object. /// - public PyLong(PyObject o) : base() + public PyLong(PyObject o) { if (!IsLongType(o)) { @@ -48,9 +48,9 @@ public PyLong(PyObject o) : base() /// /// Creates a new PyLong from an int32 value. /// - public PyLong(int value) : base() + public PyLong(int value) { - obj = Runtime.PyLong_FromLong((long)value); + obj = Runtime.PyLong_FromLong(value); if (obj == IntPtr.Zero) { throw new PythonException(); @@ -65,9 +65,9 @@ public PyLong(int value) : base() /// Creates a new PyLong from a uint32 value. /// [CLSCompliant(false)] - public PyLong(uint value) : base() + public PyLong(uint value) { - obj = Runtime.PyLong_FromLong((long)value); + obj = Runtime.PyLong_FromLong(value); if (obj == IntPtr.Zero) { throw new PythonException(); @@ -81,7 +81,7 @@ public PyLong(uint value) : base() /// /// Creates a new PyLong from an int64 value. /// - public PyLong(long value) : base() + public PyLong(long value) { obj = Runtime.PyLong_FromLongLong(value); if (obj == IntPtr.Zero) @@ -98,7 +98,7 @@ public PyLong(long value) : base() /// Creates a new PyLong from a uint64 value. /// [CLSCompliant(false)] - public PyLong(ulong value) : base() + public PyLong(ulong value) { obj = Runtime.PyLong_FromUnsignedLongLong(value); if (obj == IntPtr.Zero) @@ -114,9 +114,9 @@ public PyLong(ulong value) : base() /// /// Creates a new PyLong from an int16 value. /// - public PyLong(short value) : base() + public PyLong(short value) { - obj = Runtime.PyLong_FromLong((long)value); + obj = Runtime.PyLong_FromLong(value); if (obj == IntPtr.Zero) { throw new PythonException(); @@ -131,9 +131,9 @@ public PyLong(short value) : base() /// Creates a new PyLong from an uint16 value. /// [CLSCompliant(false)] - public PyLong(ushort value) : base() + public PyLong(ushort value) { - obj = Runtime.PyLong_FromLong((long)value); + obj = Runtime.PyLong_FromLong(value); if (obj == IntPtr.Zero) { throw new PythonException(); @@ -147,9 +147,9 @@ public PyLong(ushort value) : base() /// /// Creates a new PyLong from a byte value. /// - public PyLong(byte value) : base() + public PyLong(byte value) { - obj = Runtime.PyLong_FromLong((long)value); + obj = Runtime.PyLong_FromLong(value); if (obj == IntPtr.Zero) { throw new PythonException(); @@ -164,9 +164,9 @@ public PyLong(byte value) : base() /// Creates a new PyLong from an sbyte value. /// [CLSCompliant(false)] - public PyLong(sbyte value) : base() + public PyLong(sbyte value) { - obj = Runtime.PyLong_FromLong((long)value); + obj = Runtime.PyLong_FromLong(value); if (obj == IntPtr.Zero) { throw new PythonException(); @@ -180,7 +180,7 @@ public PyLong(sbyte value) : base() /// /// Creates a new PyLong from an double value. /// - public PyLong(double value) : base() + public PyLong(double value) { obj = Runtime.PyLong_FromDouble(value); if (obj == IntPtr.Zero) @@ -196,7 +196,7 @@ public PyLong(double value) : base() /// /// Creates a new PyLong from a string value. /// - public PyLong(string value) : base() + public PyLong(string value) { obj = Runtime.PyLong_FromString(value, IntPtr.Zero, 0); if (obj == IntPtr.Zero) @@ -244,7 +244,7 @@ public static PyLong AsLong(PyObject value) /// public short ToInt16() { - return System.Convert.ToInt16(this.ToInt64()); + return Convert.ToInt16(ToInt64()); } @@ -256,7 +256,7 @@ public short ToInt16() /// public int ToInt32() { - return System.Convert.ToInt32(this.ToInt64()); + return Convert.ToInt32(ToInt64()); } diff --git a/src/runtime/pynumber.cs b/src/runtime/pynumber.cs index 73dde6744..371d9f4f6 100644 --- a/src/runtime/pynumber.cs +++ b/src/runtime/pynumber.cs @@ -15,7 +15,7 @@ protected PyNumber(IntPtr ptr) : base(ptr) { } - protected PyNumber() : base() + protected PyNumber() { } diff --git a/src/runtime/pysequence.cs b/src/runtime/pysequence.cs index d54959599..bfaee79a6 100644 --- a/src/runtime/pysequence.cs +++ b/src/runtime/pysequence.cs @@ -16,7 +16,7 @@ protected PySequence(IntPtr ptr) : base(ptr) { } - protected PySequence() : base() + protected PySequence() { } @@ -115,7 +115,7 @@ public bool Contains(PyObject item) { throw new PythonException(); } - return (r != 0); + return r != 0; } diff --git a/src/runtime/pystring.cs b/src/runtime/pystring.cs index 39e7a8f96..3bd99b87c 100644 --- a/src/runtime/pystring.cs +++ b/src/runtime/pystring.cs @@ -34,7 +34,7 @@ public PyString(IntPtr ptr) : base(ptr) /// An ArgumentException will be thrown if the given object is not /// a Python string object. /// - public PyString(PyObject o) : base() + public PyString(PyObject o) { if (!IsStringType(o)) { @@ -51,7 +51,7 @@ public PyString(PyObject o) : base() /// /// Creates a Python string from a managed string. /// - public PyString(string s) : base() + public PyString(string s) { obj = Runtime.PyUnicode_FromUnicode(s, s.Length); if (obj == IntPtr.Zero) diff --git a/src/runtime/pythonexception.cs b/src/runtime/pythonexception.cs index d2475664c..8e2f992f4 100644 --- a/src/runtime/pythonexception.cs +++ b/src/runtime/pythonexception.cs @@ -15,26 +15,26 @@ public class PythonException : System.Exception private string _message = ""; private bool disposed = false; - public PythonException() : base() + public PythonException() { IntPtr gs = PythonEngine.AcquireLock(); Runtime.PyErr_Fetch(ref _pyType, ref _pyValue, ref _pyTB); Runtime.XIncref(_pyType); Runtime.XIncref(_pyValue); Runtime.XIncref(_pyTB); - if ((_pyType != IntPtr.Zero) && (_pyValue != IntPtr.Zero)) + if (_pyType != IntPtr.Zero && _pyValue != IntPtr.Zero) { string type; string message; Runtime.XIncref(_pyType); - using (PyObject pyType = new PyObject(_pyType)) + using (var pyType = new PyObject(_pyType)) using (PyObject pyTypeName = pyType.GetAttr("__name__")) { type = pyTypeName.ToString(); } Runtime.XIncref(_pyValue); - using (PyObject pyValue = new PyObject(_pyValue)) + using (var pyValue = new PyObject(_pyValue)) { message = pyValue.ToString(); } @@ -44,7 +44,7 @@ public PythonException() : base() { PyObject tb_module = PythonEngine.ImportModule("traceback"); Runtime.XIncref(_pyTB); - using (PyObject pyTB = new PyObject(_pyTB)) + using (var pyTB = new PyObject(_pyTB)) { _tb = tb_module.InvokeMethod("format_tb", pyTB).ToString(); } diff --git a/src/runtime/pytuple.cs b/src/runtime/pytuple.cs index 76ca616ae..b3fb95733 100644 --- a/src/runtime/pytuple.cs +++ b/src/runtime/pytuple.cs @@ -31,7 +31,7 @@ public PyTuple(IntPtr ptr) : base(ptr) /// ArgumentException will be thrown if the given object is not a /// Python tuple object. /// - public PyTuple(PyObject o) : base() + public PyTuple(PyObject o) { if (!IsTupleType(o)) { @@ -48,7 +48,7 @@ public PyTuple(PyObject o) : base() /// /// Creates a new empty PyTuple. /// - public PyTuple() : base() + public PyTuple() { obj = Runtime.PyTuple_New(0); if (obj == IntPtr.Zero) @@ -64,11 +64,11 @@ public PyTuple() : base() /// /// Creates a new PyTuple from an array of PyObject instances. /// - public PyTuple(PyObject[] items) : base() + public PyTuple(PyObject[] items) { int count = items.Length; obj = Runtime.PyTuple_New(count); - for (int i = 0; i < count; i++) + for (var i = 0; i < count; i++) { IntPtr ptr = items[i].obj; Runtime.XIncref(ptr); diff --git a/src/runtime/typemanager.cs b/src/runtime/typemanager.cs index d85bdf9bb..49c931183 100644 --- a/src/runtime/typemanager.cs +++ b/src/runtime/typemanager.cs @@ -1,10 +1,8 @@ using System; using System.Runtime.InteropServices; -using System.Reflection.Emit; using System.Collections.Generic; using System.Collections; using System.Reflection; -using System.Threading; namespace Python.Runtime { @@ -34,7 +32,7 @@ internal static IntPtr GetTypeHandle(Type type) { // Note that these types are cached with a refcount of 1, so they // effectively exist until the CPython runtime is finalized. - IntPtr handle = IntPtr.Zero; + IntPtr handle; cache.TryGetValue(type, out handle); if (handle != IntPtr.Zero) { @@ -53,7 +51,7 @@ internal static IntPtr GetTypeHandle(Type type) /// internal static IntPtr GetTypeHandle(ManagedType obj, Type type) { - IntPtr handle = IntPtr.Zero; + IntPtr handle; cache.TryGetValue(type, out handle); if (handle != IntPtr.Zero) { @@ -81,7 +79,7 @@ internal static IntPtr CreateType(Type impl) // Set tp_basicsize to the size of our managed instance objects. Marshal.WriteIntPtr(type, TypeOffset.tp_basicsize, (IntPtr)ob_size); - IntPtr offset = (IntPtr)ObjectOffset.DictOffset(type); + var offset = (IntPtr)ObjectOffset.DictOffset(type); Marshal.WriteIntPtr(type, TypeOffset.tp_dictoffset, offset); InitializeSlots(type, impl); @@ -124,13 +122,13 @@ internal static IntPtr CreateType(ManagedType impl, Type clrType) // XXX Hack, use a different base class for System.Exception // Python 2.5+ allows new style class exceptions but they *must* // subclass BaseException (or better Exception). - if (typeof(System.Exception).IsAssignableFrom(clrType)) + if (typeof(Exception).IsAssignableFrom(clrType)) { ob_size = ObjectOffset.Size(Exceptions.Exception); tp_dictoffset = ObjectOffset.DictOffset(Exceptions.Exception); } - if (clrType == typeof(System.Exception)) + if (clrType == typeof(Exception)) { base_ = Exceptions.Exception; } @@ -171,7 +169,7 @@ internal static IntPtr CreateType(ManagedType impl, Type clrType) Runtime.PyType_Ready(type); IntPtr dict = Marshal.ReadIntPtr(type, TypeOffset.tp_dict); - string mn = clrType.Namespace != null ? clrType.Namespace : ""; + string mn = clrType.Namespace ?? ""; IntPtr mod = Runtime.PyString_FromString(mn); Runtime.PyDict_SetItemString(dict, "__module__", mod); @@ -200,37 +198,43 @@ internal static IntPtr CreateSubType(IntPtr py_name, IntPtr py_base_type, IntPtr object assembly = null; object namespaceStr = null; - List disposeList = new List(); + var disposeList = new List(); try { - PyObject assemblyKey = new PyObject(Converter.ToPython("__assembly__", typeof(String))); + var assemblyKey = new PyObject(Converter.ToPython("__assembly__", typeof(string))); disposeList.Add(assemblyKey); if (0 != Runtime.PyMapping_HasKey(py_dict, assemblyKey.Handle)) { - PyObject pyAssembly = new PyObject(Runtime.PyDict_GetItem(py_dict, assemblyKey.Handle)); + var pyAssembly = new PyObject(Runtime.PyDict_GetItem(py_dict, assemblyKey.Handle)); disposeList.Add(pyAssembly); - if (!Converter.ToManagedValue(pyAssembly.Handle, typeof(String), out assembly, false)) + if (!Converter.ToManagedValue(pyAssembly.Handle, typeof(string), out assembly, false)) + { throw new InvalidCastException("Couldn't convert __assembly__ value to string"); + } } - PyObject namespaceKey = new PyObject(Converter.ToPythonImplicit("__namespace__")); + var namespaceKey = new PyObject(Converter.ToPythonImplicit("__namespace__")); disposeList.Add(namespaceKey); if (0 != Runtime.PyMapping_HasKey(py_dict, namespaceKey.Handle)) { - PyObject pyNamespace = new PyObject(Runtime.PyDict_GetItem(py_dict, namespaceKey.Handle)); + var pyNamespace = new PyObject(Runtime.PyDict_GetItem(py_dict, namespaceKey.Handle)); disposeList.Add(pyNamespace); - if (!Converter.ToManagedValue(pyNamespace.Handle, typeof(String), out namespaceStr, false)) + if (!Converter.ToManagedValue(pyNamespace.Handle, typeof(string), out namespaceStr, false)) + { throw new InvalidCastException("Couldn't convert __namespace__ value to string"); + } } } finally { foreach (PyObject o in disposeList) + { o.Dispose(); + } } // create the new managed type subclassing the base managed type - ClassBase baseClass = ManagedType.GetManagedObject(py_base_type) as ClassBase; + var baseClass = ManagedType.GetManagedObject(py_base_type) as ClassBase; if (null == baseClass) { return Exceptions.RaiseTypeError("invalid base class, expected CLR class type"); @@ -264,9 +268,9 @@ internal static IntPtr CreateSubType(IntPtr py_name, IntPtr py_base_type, IntPtr internal static IntPtr WriteMethodDef(IntPtr mdef, IntPtr name, IntPtr func, int flags, IntPtr doc) { Marshal.WriteIntPtr(mdef, name); - Marshal.WriteIntPtr(mdef, (1 * IntPtr.Size), func); - Marshal.WriteInt32(mdef, (2 * IntPtr.Size), flags); - Marshal.WriteIntPtr(mdef, (3 * IntPtr.Size), doc); + Marshal.WriteIntPtr(mdef, 1 * IntPtr.Size, func); + Marshal.WriteInt32(mdef, 2 * IntPtr.Size, flags); + Marshal.WriteIntPtr(mdef, 3 * IntPtr.Size, doc); return mdef + 4 * IntPtr.Size; } @@ -321,7 +325,7 @@ internal static IntPtr CreateMetaType(Type impl) // We need space for 3 PyMethodDef structs, each of them // 4 int-ptrs in size. - IntPtr mdef = Runtime.PyMem_Malloc(3 * (4 * IntPtr.Size)); + IntPtr mdef = Runtime.PyMem_Malloc(3 * 4 * IntPtr.Size); IntPtr mdefStart = mdef; mdef = WriteMethodDef( mdef, @@ -335,6 +339,7 @@ internal static IntPtr CreateMetaType(Type impl) Interop.GetThunk(typeof(MetaType).GetMethod("__subclasscheck__"), "BinaryFunc") ); + // FIXME: mdef is not used mdef = WriteMethodDefSentinel(mdef); Marshal.WriteIntPtr(type, TypeOffset.tp_methods, mdefStart); @@ -447,15 +452,14 @@ internal static IntPtr AllocateTypeObject(string name) /// internal static void InitializeSlots(IntPtr type, Type impl) { - Hashtable seen = new Hashtable(8); + var seen = new Hashtable(8); Type offsetType = typeof(TypeOffset); while (impl != null) { MethodInfo[] methods = impl.GetMethods(tbFlags); - for (int i = 0; i < methods.Length; i++) + foreach (MethodInfo method in methods) { - MethodInfo method = methods[i]; string name = method.Name; if (!(name.StartsWith("tp_") || name.StartsWith("nb_") || @@ -473,7 +477,7 @@ internal static void InitializeSlots(IntPtr type, Type impl) } FieldInfo fi = offsetType.GetField(name); - int offset = (int)fi.GetValue(offsetType); + var offset = (int)fi.GetValue(offsetType); IntPtr slot = Interop.GetThunk(method); Marshal.WriteIntPtr(type, offset, slot); @@ -497,21 +501,20 @@ private static void InitMethods(IntPtr pytype, Type type) Type marker = typeof(PythonMethodAttribute); BindingFlags flags = BindingFlags.Public | BindingFlags.Static; - HashSet addedMethods = new HashSet(); + var addedMethods = new HashSet(); while (type != null) { MethodInfo[] methods = type.GetMethods(flags); - for (int i = 0; i < methods.Length; i++) + foreach (MethodInfo method in methods) { - MethodInfo method = methods[i]; if (!addedMethods.Contains(method.Name)) { object[] attrs = method.GetCustomAttributes(marker, false); if (attrs.Length > 0) { string method_name = method.Name; - MethodInfo[] mi = new MethodInfo[1]; + var mi = new MethodInfo[1]; mi[0] = method; MethodObject m = new TypeMethod(type, method_name, mi); Runtime.PyDict_SetItemString(dict, method_name, m.pyHandle); diff --git a/src/runtime/typemethod.cs b/src/runtime/typemethod.cs index 50577f93d..946c769b2 100644 --- a/src/runtime/typemethod.cs +++ b/src/runtime/typemethod.cs @@ -21,15 +21,15 @@ public TypeMethod(Type type, string name, MethodInfo[] info, bool allow_threads) public override IntPtr Invoke(IntPtr ob, IntPtr args, IntPtr kw) { - MethodInfo mi = this.info[0]; - Object[] arglist = new Object[3]; + MethodInfo mi = info[0]; + var arglist = new object[3]; arglist[0] = ob; arglist[1] = args; arglist[2] = kw; try { - Object inst = null; + object inst = null; if (ob != IntPtr.Zero) { inst = GetManagedObject(ob); From 448117e29328d42f1c356b0bdc95b5aa19c3ded5 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 30 Jan 2017 21:44:33 -0700 Subject: [PATCH 063/324] Standarize properties used across projects Console had it owns set of properties going on --- pythonnet.sln | 37 +++++---- src/console/Console.csproj | 162 +++++++++++-------------------------- 2 files changed, 64 insertions(+), 135 deletions(-) diff --git a/pythonnet.sln b/pythonnet.sln index 0a4dbe1f7..520dd9709 100644 --- a/pythonnet.sln +++ b/pythonnet.sln @@ -1,7 +1,6 @@ - Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.30110.0 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Python.Runtime", "src\runtime\Python.Runtime.csproj", "{097B4AC0-74E9-4C58-BCF8-C69746EC8271}" EndProject @@ -73,22 +72,22 @@ Global {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 - {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMono|x64.ActiveCfg = DebugMono_x86|x64 - {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMono|x64.Build.0 = DebugMono_x86|x64 - {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMono|x86.ActiveCfg = DebugMono_x86|x86 - {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMono|x86.Build.0 = DebugMono_x86|x86 - {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWin|x64.ActiveCfg = DebugMono_x86|x64 - {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWin|x64.Build.0 = DebugMono_x86|x64 - {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWin|x86.ActiveCfg = DebugMono_x86|x86 - {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWin|x86.Build.0 = DebugMono_x86|x86 - {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMono|x64.ActiveCfg = Release|x64 - {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMono|x64.Build.0 = Release|x64 - {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMono|x86.ActiveCfg = Release|x86 - {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMono|x86.Build.0 = Release|x86 - {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x64.ActiveCfg = Release|x64 - {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x64.Build.0 = Release|x64 - {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x86.ActiveCfg = Release|x86 - {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x86.Build.0 = Release|x86 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMono|x64.ActiveCfg = DebugMono|x64 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMono|x64.Build.0 = DebugMono|x64 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMono|x86.ActiveCfg = DebugMono|x86 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMono|x86.Build.0 = DebugMono|x86 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWin|x64.ActiveCfg = DebugWin|x64 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWin|x64.Build.0 = DebugWin|x64 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWin|x86.ActiveCfg = DebugWin|x86 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWin|x86.Build.0 = DebugWin|x86 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMono|x64.Build.0 = ReleaseMono|x64 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMono|x86.Build.0 = ReleaseMono|x86 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugMono|x64.ActiveCfg = DebugWin|x64 {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugMono|x86.ActiveCfg = DebugWin|x86 {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWin|x64.ActiveCfg = DebugWin|x64 diff --git a/src/console/Console.csproj b/src/console/Console.csproj index 53306e47f..a2834c7f6 100644 --- a/src/console/Console.csproj +++ b/src/console/Console.csproj @@ -15,143 +15,73 @@ ..\..\ $(SolutionDir) - - True - full - False - bin\Debug\ - DEBUG;TRACE - 4 - - - pdbonly - True - bin\Release\ - TRACE - True - false - 4 - - - True - bin\EmbeddingTest\ - DEBUG;TRACE - full - AnyCPU - 4 - False - - - True - bin\UnitTests\ - DEBUG;TRACE - full - AnyCPU - 4 - False - - - True - bin\x86\Debug\ + + true + bin\x86\DebugMono\ DEBUG;TRACE full x86 - True - 4 - False - False - - - True - bin\x86\Release\ - TRACE - True - pdbonly - x86 - false - 4 + prompt - - True - bin\x86\EmbeddingTest\ + + true + bin\x64\DebugMono\ DEBUG;TRACE full - x86 - 4 - False + x64 + prompt - - True - bin\x86\UnitTests\ - DEBUG;TRACE - full + + bin\x86\ReleaseMono\ + + + true + pdbonly x86 - 4 - False + prompt - - True - bin\DebugMono_x86\ - DEBUG;TRACE - full - AnyCPU - 4 - False + + bin\x64\ReleaseMono\ + + + true + pdbonly + x64 + prompt - - True - bin\x86\DebugMono_x86\ + + true + bin\x86\DebugWin\ DEBUG;TRACE full x86 - 4 - False + prompt - - True - bin\x64\Debug\ + + true + bin\x64\DebugWin\ DEBUG;TRACE full x64 - 4 - False + prompt - - True - bin\x64\Release\ - TRACE - True + + bin\x86\ReleaseWin\ + + + true pdbonly - x64 - false - 4 - - - True - bin\x64\EmbeddingTest\ - DEBUG;TRACE - full - x64 - 4 - False - - - True - bin\x64\UnitTests\ - DEBUG;TRACE - full - x64 - 4 - False + x86 + prompt - - True - bin\x64\DebugMono_x86\ - DEBUG;TRACE - full + + bin\x64\ReleaseWin\ + + + true + pdbonly x64 - 4 - False + prompt $(PythonManifest) From 9e070f91cc765ddc1efbb78926851d8e48bc5a3b Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 30 Jan 2017 22:01:33 -0700 Subject: [PATCH 064/324] Add pyproj from @denfromufa Corrected the configs, won't interfere with users without PTVS --- src/tests/tests.pyproj | 67 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/tests/tests.pyproj diff --git a/src/tests/tests.pyproj b/src/tests/tests.pyproj new file mode 100644 index 000000000..737ec2e79 --- /dev/null +++ b/src/tests/tests.pyproj @@ -0,0 +1,67 @@ + + + + Debug + 2.0 + {250c535c-c060-4f0c-bd80-41f2bf373565} + + runtests.py + + . + . + {888888a0-9f3d-457c-b088-3a5042f75d52} + Standard Python launcher + + + + + + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Python Tools\Microsoft.PythonTools.targets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 01a3c8d2fcd6b1bac27897ba4b9b0ce142a598c6 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 31 Jan 2017 10:50:46 -0700 Subject: [PATCH 065/324] Consolidate output paths http://stackoverflow.com/questions/30191387/what-are-the-consequences-of-setting-same-output-path-for-all-configurations --- .travis.yml | 2 +- ci/appveyor_run_tests.ps1 | 4 ++-- src/clrmodule/clrmodule.csproj | 16 ++++++++-------- src/console/Console.csproj | 16 ++++++++-------- src/embed_tests/Python.EmbeddingTest.csproj | 16 ++++++++-------- src/runtime/Python.Runtime.csproj | 16 ++++++++-------- src/testing/Python.Test.csproj | 16 ++++++++-------- 7 files changed, 43 insertions(+), 43 deletions(-) diff --git a/.travis.yml b/.travis.yml index f23a4ee6c..df89014f4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,7 +36,7 @@ install: script: - export PYTHONPATH=`pwd`:$PYTHONPATH - python src/tests/runtests.py - # - nunit-console src/embed_tests/bin/x64/ReleaseMono/Python.EmbeddingTest.dll + # - nunit-console src/embed_tests/bin/Python.EmbeddingTest.dll after_success: # Uncomment if need to geninterop, ie. py37 final diff --git a/ci/appveyor_run_tests.ps1 b/ci/appveyor_run_tests.ps1 index 9f9a470bd..3a7d25af8 100644 --- a/ci/appveyor_run_tests.ps1 +++ b/ci/appveyor_run_tests.ps1 @@ -7,8 +7,8 @@ $NUNIT = Resolve-Path .\packages\NUnit.ConsoleRunner*\tools\nunit3-console.exe $PY = Get-Command python # Can't use ".\build\*\Python.EmbeddingTest.dll". Missing framework files. -$CS_TESTS = Resolve-Path .\src\embed_tests\bin\*\*\Python.EmbeddingTest.dll -$RUNTIME_DIR = Resolve-Path .\src\runtime\bin\*\ReleaseWin\ +$CS_TESTS = ".\src\embed_tests\bin\Python.EmbeddingTest.dll" +$RUNTIME_DIR = ".\src\runtime\bin\" # Run python tests with C# coverage # why `2>&1 | %{ "$_" }`? see: http://stackoverflow.com/a/20950421/5208670 diff --git a/src/clrmodule/clrmodule.csproj b/src/clrmodule/clrmodule.csproj index 9575f521f..44d809f05 100644 --- a/src/clrmodule/clrmodule.csproj +++ b/src/clrmodule/clrmodule.csproj @@ -17,7 +17,7 @@ true - bin\x86\DebugMono\ + bin\ TRACE;DEBUG;PYTHON2 full x86 @@ -25,14 +25,14 @@ true - bin\x64\DebugMono\ + bin\ TRACE;DEBUG;PYTHON2 full x64 prompt - bin\x86\ReleaseMono\ + bin\ PYTHON2 true pdbonly @@ -40,7 +40,7 @@ prompt - bin\x64\ReleaseMono\ + bin\ PYTHON2 true pdbonly @@ -49,7 +49,7 @@ true - bin\x86\DebugWin\ + bin\ TRACE;DEBUG;PYTHON2 full x86 @@ -57,14 +57,14 @@ true - bin\x64\DebugWin\ + bin\ TRACE;DEBUG;PYTHON2 full x64 prompt - bin\x86\ReleaseWin\ + bin\ PYTHON2 true pdbonly @@ -72,7 +72,7 @@ prompt - bin\x64\ReleaseWin\ + bin\ PYTHON2 true pdbonly diff --git a/src/console/Console.csproj b/src/console/Console.csproj index a2834c7f6..1ec09736b 100644 --- a/src/console/Console.csproj +++ b/src/console/Console.csproj @@ -17,7 +17,7 @@ true - bin\x86\DebugMono\ + bin\ DEBUG;TRACE full x86 @@ -25,14 +25,14 @@ true - bin\x64\DebugMono\ + bin\ DEBUG;TRACE full x64 prompt - bin\x86\ReleaseMono\ + bin\ true @@ -41,7 +41,7 @@ prompt - bin\x64\ReleaseMono\ + bin\ true @@ -51,7 +51,7 @@ true - bin\x86\DebugWin\ + bin\ DEBUG;TRACE full x86 @@ -59,14 +59,14 @@ true - bin\x64\DebugWin\ + bin\ DEBUG;TRACE full x64 prompt - bin\x86\ReleaseWin\ + bin\ true @@ -75,7 +75,7 @@ prompt - bin\x64\ReleaseWin\ + bin\ true diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index 264afd0ab..34724247f 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -15,7 +15,7 @@ true - bin\x86\DebugMono\ + bin\ DEBUG;TRACE full x86 @@ -23,14 +23,14 @@ true - bin\x64\DebugMono\ + bin\ DEBUG;TRACE full x64 prompt - bin\x86\ReleaseMono\ + bin\ true @@ -39,7 +39,7 @@ prompt - bin\x64\ReleaseMono\ + bin\ true @@ -49,7 +49,7 @@ true - bin\x86\DebugWin\ + bin\ DEBUG;TRACE full x86 @@ -57,14 +57,14 @@ true - bin\x64\DebugWin\ + bin\ DEBUG;TRACE full x64 prompt - bin\x86\ReleaseWin\ + bin\ true @@ -73,7 +73,7 @@ prompt - bin\x64\ReleaseWin\ + bin\ true diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index 6309bf4a3..091aac643 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -12,7 +12,7 @@ $(SolutionDir) - bin\x86\ReleaseMono\ + bin\ PYTHON2;PYTHON27;UCS4 true true @@ -20,7 +20,7 @@ x86 - bin\x64\ReleaseMono\ + bin\ PYTHON2;PYTHON27;UCS4 true true @@ -28,7 +28,7 @@ x64 - bin\x86\ReleaseWin\ + bin\ PYTHON2;PYTHON27;UCS2 true true @@ -36,7 +36,7 @@ x86 - bin\x64\ReleaseWin\ + bin\ PYTHON2;PYTHON27;UCS2 true true @@ -45,7 +45,7 @@ true - bin\x86\DebugMono\ + bin\ TRACE;DEBUG;PYTHON2;PYTHON27;UCS4 true false @@ -54,7 +54,7 @@ true - bin\x64\DebugMono\ + bin\ TRACE;DEBUG;PYTHON2;PYTHON27;UCS4 true false @@ -63,7 +63,7 @@ true - bin\x86\DebugWin\ + bin\ TRACE;DEBUG;PYTHON2;PYTHON27;UCS2 true false @@ -72,7 +72,7 @@ true - bin\x64\DebugWin\ + bin\ TRACE;DEBUG;PYTHON2;PYTHON27;UCS2 true false diff --git a/src/testing/Python.Test.csproj b/src/testing/Python.Test.csproj index 1f0134296..fa01790fc 100644 --- a/src/testing/Python.Test.csproj +++ b/src/testing/Python.Test.csproj @@ -16,7 +16,7 @@ true - bin\x86\DebugMono\ + bin\ DEBUG;TRACE full x86 @@ -24,14 +24,14 @@ true - bin\x64\DebugMono\ + bin\ DEBUG;TRACE full x64 prompt - bin\x86\ReleaseMono\ + bin\ true @@ -40,7 +40,7 @@ prompt - bin\x64\ReleaseMono\ + bin\ true @@ -50,7 +50,7 @@ true - bin\x86\DebugWin\ + bin\ DEBUG;TRACE full x86 @@ -58,14 +58,14 @@ true - bin\x64\DebugWin\ + bin\ DEBUG;TRACE full x64 prompt - bin\x86\ReleaseWin\ + bin\ true @@ -74,7 +74,7 @@ prompt - bin\x64\ReleaseWin\ + bin\ true From c5f63bd2dda7fd0a4c655992614eaf05bb879828 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 31 Jan 2017 11:07:48 -0700 Subject: [PATCH 066/324] Fix clrmodule config mismapping --- pythonnet.sln | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pythonnet.sln b/pythonnet.sln index 520dd9709..85f7a8303 100644 --- a/pythonnet.sln +++ b/pythonnet.sln @@ -88,14 +88,14 @@ Global {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 - {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugMono|x64.ActiveCfg = DebugWin|x64 - {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugMono|x86.ActiveCfg = DebugWin|x86 + {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugMono|x64.ActiveCfg = DebugMono|x64 + {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugMono|x86.ActiveCfg = DebugMono|x86 {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWin|x64.ActiveCfg = DebugWin|x64 {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWin|x64.Build.0 = DebugWin|x64 {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWin|x86.ActiveCfg = DebugWin|x86 {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWin|x86.Build.0 = DebugWin|x86 - {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseMono|x64.ActiveCfg = ReleaseWin|x64 - {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseMono|x86.ActiveCfg = ReleaseWin|x86 + {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 + {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 From 73b8a9d69d60501644f303e9eb49cdc9d8ce704d Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 31 Jan 2017 11:12:56 -0700 Subject: [PATCH 067/324] Add PY3 project/sln configs --- pythonnet.sln | 84 +++++++++++++++++++++ src/clrmodule/clrmodule.csproj | 64 ++++++++++++++++ src/console/Console.csproj | 68 +++++++++++++++++ src/embed_tests/Python.EmbeddingTest.csproj | 68 +++++++++++++++++ src/runtime/Python.Runtime.csproj | 68 +++++++++++++++++ src/testing/Python.Test.csproj | 68 +++++++++++++++++ src/tests/tests.pyproj | 4 + 7 files changed, 424 insertions(+) diff --git a/pythonnet.sln b/pythonnet.sln index 85f7a8303..c5afd66c3 100644 --- a/pythonnet.sln +++ b/pythonnet.sln @@ -16,90 +16,174 @@ Global GlobalSection(SolutionConfigurationPlatforms) = preSolution DebugMono|x64 = DebugMono|x64 DebugMono|x86 = DebugMono|x86 + DebugMonoPY3|x64 = DebugMonoPY3|x64 + DebugMonoPY3|x86 = DebugMonoPY3|x86 DebugWin|x64 = DebugWin|x64 DebugWin|x86 = DebugWin|x86 + DebugWinPY3|x64 = DebugWinPY3|x64 + DebugWinPY3|x86 = DebugWinPY3|x86 ReleaseMono|x64 = ReleaseMono|x64 ReleaseMono|x86 = ReleaseMono|x86 + ReleaseMonoPY3|x64 = ReleaseMonoPY3|x64 + ReleaseMonoPY3|x86 = ReleaseMonoPY3|x86 ReleaseWin|x64 = ReleaseWin|x64 ReleaseWin|x86 = ReleaseWin|x86 + ReleaseWinPY3|x64 = ReleaseWinPY3|x64 + ReleaseWinPY3|x86 = ReleaseWinPY3|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x64.ActiveCfg = DebugMono|x64 {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x64.Build.0 = DebugMono|x64 {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x86.ActiveCfg = DebugMono|x86 {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x86.Build.0 = DebugMono|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86 {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x64.ActiveCfg = DebugWin|x64 {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x64.Build.0 = DebugWin|x64 {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x86.ActiveCfg = DebugWin|x86 {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x86.Build.0 = DebugWin|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x64.Build.0 = ReleaseMono|x64 {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x86.Build.0 = ReleaseMono|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86 {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMono|x64.ActiveCfg = DebugMono|x64 {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMono|x64.Build.0 = DebugMono|x64 {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMono|x86.ActiveCfg = DebugMono|x86 {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMono|x86.Build.0 = DebugMono|x86 + {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 + {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64 + {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 + {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86 {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugWin|x64.ActiveCfg = DebugWin|x64 {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugWin|x64.Build.0 = DebugWin|x64 {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugWin|x86.ActiveCfg = DebugWin|x86 {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugWin|x86.Build.0 = DebugWin|x86 + {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 + {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 + {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 + {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseMono|x64.Build.0 = ReleaseMono|x64 {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseMono|x86.Build.0 = ReleaseMono|x86 + {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 + {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64 + {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 + {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86 {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 + {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 + {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 + {6F401A34-273B-450F-9A4C-13550BE0767B}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugMono|x64.ActiveCfg = DebugMono|x64 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugMono|x64.Build.0 = DebugMono|x64 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugMono|x86.ActiveCfg = DebugMono|x86 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugMono|x86.Build.0 = DebugMono|x86 + {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 + {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64 + {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 + {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugWin|x64.ActiveCfg = DebugWin|x64 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugWin|x64.Build.0 = DebugWin|x64 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugWin|x86.ActiveCfg = DebugWin|x86 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugWin|x86.Build.0 = DebugWin|x86 + {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 + {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 + {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 + {4165C59D-2822-499F-A6DB-EACA4C331EB5}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseMono|x64.Build.0 = ReleaseMono|x64 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseMono|x86.Build.0 = ReleaseMono|x86 + {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 + {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64 + {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 + {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 + {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 + {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 + {4165C59D-2822-499F-A6DB-EACA4C331EB5}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMono|x64.ActiveCfg = DebugMono|x64 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMono|x64.Build.0 = DebugMono|x64 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMono|x86.ActiveCfg = DebugMono|x86 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMono|x86.Build.0 = DebugMono|x86 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWin|x64.ActiveCfg = DebugWin|x64 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWin|x64.Build.0 = DebugWin|x64 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWin|x86.ActiveCfg = DebugWin|x86 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWin|x86.Build.0 = DebugWin|x86 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMono|x64.Build.0 = ReleaseMono|x64 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMono|x86.Build.0 = ReleaseMono|x86 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 + {E29DCF0A-5114-4A98-B1DD-71264B6EA349}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugMono|x64.ActiveCfg = DebugMono|x64 {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugMono|x86.ActiveCfg = DebugMono|x86 + {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 + {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWin|x64.ActiveCfg = DebugWin|x64 {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWin|x64.Build.0 = DebugWin|x64 {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWin|x86.ActiveCfg = DebugWin|x86 {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWin|x86.Build.0 = DebugWin|x86 + {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 + {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 + {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 + {86E834DE-1139-4511-96CC-69636A56E7AC}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 + {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 + {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 + {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 + {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 + {86E834DE-1139-4511-96CC-69636A56E7AC}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/clrmodule/clrmodule.csproj b/src/clrmodule/clrmodule.csproj index 44d809f05..8939d5ad0 100644 --- a/src/clrmodule/clrmodule.csproj +++ b/src/clrmodule/clrmodule.csproj @@ -79,6 +79,70 @@ x64 prompt + + true + bin\ + TRACE;DEBUG;PYTHON3 + full + x86 + prompt + + + true + bin\ + TRACE;DEBUG;PYTHON3 + full + x64 + prompt + + + bin\ + PYTHON3 + true + pdbonly + x86 + prompt + + + bin\ + PYTHON3 + true + pdbonly + x64 + prompt + + + true + bin\ + TRACE;DEBUG;PYTHON3 + full + x86 + prompt + + + true + bin\ + TRACE;DEBUG;PYTHON3 + full + x64 + prompt + + + bin\ + PYTHON3 + true + pdbonly + x86 + prompt + + + bin\ + PYTHON3 + true + pdbonly + x64 + prompt + ..\..\packages\UnmanagedExports.1.2.7\lib\net\RGiesecke.DllExport.Metadata.dll diff --git a/src/console/Console.csproj b/src/console/Console.csproj index 1ec09736b..49fd402dc 100644 --- a/src/console/Console.csproj +++ b/src/console/Console.csproj @@ -83,6 +83,74 @@ x64 prompt + + true + bin\ + DEBUG;TRACE + full + x86 + prompt + + + true + bin\ + DEBUG;TRACE + full + x64 + prompt + + + bin\ + + + true + pdbonly + x86 + prompt + + + bin\ + + + true + pdbonly + x64 + prompt + + + true + bin\ + DEBUG;TRACE + full + x86 + prompt + + + true + bin\ + DEBUG;TRACE + full + x64 + prompt + + + bin\ + + + true + pdbonly + x86 + prompt + + + bin\ + + + true + pdbonly + x64 + prompt + $(PythonManifest) diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index 34724247f..7e083d5e0 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -81,6 +81,74 @@ x64 prompt + + true + bin\ + DEBUG;TRACE + full + x86 + prompt + + + true + bin\ + DEBUG;TRACE + full + x64 + prompt + + + bin\ + + + true + pdbonly + x86 + prompt + + + bin\ + + + true + pdbonly + x64 + prompt + + + true + bin\ + DEBUG;TRACE + full + x86 + prompt + + + true + bin\ + DEBUG;TRACE + full + x64 + prompt + + + bin\ + + + true + pdbonly + x86 + prompt + + + bin\ + + + true + pdbonly + x64 + prompt + ..\..\packages\NUnit.3.5.0\lib\net40\nunit.framework.dll diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index 091aac643..5d4d2161b 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -79,6 +79,74 @@ full x64 + + bin\ + PYTHON3;PYTHON35;UCS4 + true + true + pdbonly + x86 + + + bin\ + PYTHON3;PYTHON35;UCS4 + true + true + pdbonly + x64 + + + bin\ + PYTHON3;PYTHON35;UCS2 + true + true + pdbonly + x86 + + + bin\ + PYTHON3;PYTHON35;UCS2 + true + true + pdbonly + x64 + + + true + bin\ + TRACE;DEBUG;PYTHON3;PYTHON35;UCS4 + true + false + full + x86 + + + true + bin\ + TRACE;DEBUG;PYTHON3;PYTHON35;UCS4 + true + false + full + x64 + + + true + bin\ + TRACE;DEBUG;PYTHON3;PYTHON35;UCS2 + true + false + full + x86 + + + true + bin\ + TRACE;DEBUG;PYTHON3;PYTHON35;UCS2 + true + false + full + x64 + diff --git a/src/testing/Python.Test.csproj b/src/testing/Python.Test.csproj index fa01790fc..3201cd635 100644 --- a/src/testing/Python.Test.csproj +++ b/src/testing/Python.Test.csproj @@ -82,6 +82,74 @@ x64 prompt + + true + bin\ + DEBUG;TRACE + full + x86 + prompt + + + true + bin\ + DEBUG;TRACE + full + x64 + prompt + + + bin\ + + + true + pdbonly + x86 + prompt + + + bin\ + + + true + pdbonly + x64 + prompt + + + true + bin\ + DEBUG;TRACE + full + x86 + prompt + + + true + bin\ + DEBUG;TRACE + full + x64 + prompt + + + bin\ + + + true + pdbonly + x86 + prompt + + + bin\ + + + true + pdbonly + x64 + prompt + diff --git a/src/tests/tests.pyproj b/src/tests/tests.pyproj index 737ec2e79..cf8f74a4a 100644 --- a/src/tests/tests.pyproj +++ b/src/tests/tests.pyproj @@ -18,6 +18,10 @@ + + + + 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Python Tools\Microsoft.PythonTools.targets From 3f914ca98d699a7a8c693ee05601363cf2e65098 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 2 Feb 2017 11:38:39 -0700 Subject: [PATCH 068/324] Update test PyImport path Changed when consolidate output paths --- src/embed_tests/pyimport.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/embed_tests/pyimport.cs b/src/embed_tests/pyimport.cs index 0e4cb3806..e4ba8d546 100644 --- a/src/embed_tests/pyimport.cs +++ b/src/embed_tests/pyimport.cs @@ -22,7 +22,7 @@ public void SetUp() * using reflection to circumvent the private * modifiers placed on most Runtime methods. */ - const string s = @"../../../../tests"; + const string s = @"../../tests"; string testPath = Path.Combine(TestContext.CurrentContext.TestDirectory, s); From b8234001e43a0427aa2cc8ae379b2eb280e1ee4c Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 2 Feb 2017 15:19:29 -0700 Subject: [PATCH 069/324] Update runtime.csproj --- src/runtime/Python.Runtime.csproj | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index 5d4d2161b..4ddd312b1 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -81,7 +81,7 @@ bin\ - PYTHON3;PYTHON35;UCS4 + PYTHON3;PYTHON36;UCS4 true true pdbonly @@ -89,7 +89,7 @@ bin\ - PYTHON3;PYTHON35;UCS4 + PYTHON3;PYTHON36;UCS4 true true pdbonly @@ -97,7 +97,7 @@ bin\ - PYTHON3;PYTHON35;UCS2 + PYTHON3;PYTHON36;UCS2 true true pdbonly @@ -105,7 +105,7 @@ bin\ - PYTHON3;PYTHON35;UCS2 + PYTHON3;PYTHON36;UCS2 true true pdbonly @@ -114,7 +114,7 @@ true bin\ - TRACE;DEBUG;PYTHON3;PYTHON35;UCS4 + TRACE;DEBUG;PYTHON3;PYTHON36;UCS4 true false full @@ -123,7 +123,7 @@ true bin\ - TRACE;DEBUG;PYTHON3;PYTHON35;UCS4 + TRACE;DEBUG;PYTHON3;PYTHON36;UCS4 true false full @@ -132,7 +132,7 @@ true bin\ - TRACE;DEBUG;PYTHON3;PYTHON35;UCS2 + TRACE;DEBUG;PYTHON3;PYTHON36;UCS2 true false full @@ -141,7 +141,7 @@ true bin\ - TRACE;DEBUG;PYTHON3;PYTHON35;UCS2 + TRACE;DEBUG;PYTHON3;PYTHON36;UCS2 true false full From 6ce9b53fae6fdf8a7fe11ff71ee5d570d3e2a647 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 2 Feb 2017 15:27:22 -0700 Subject: [PATCH 070/324] Documentation clean-up --- src/runtime/classmanager.cs | 1 - src/runtime/constructorbinding.cs | 16 +++++----- src/runtime/exceptions.cs | 10 +------ src/runtime/pyobject.cs | 50 ------------------------------- src/runtime/pythonengine.cs | 15 ---------- 5 files changed, 10 insertions(+), 82 deletions(-) diff --git a/src/runtime/classmanager.cs b/src/runtime/classmanager.cs index 2af783f12..c4a02e563 100644 --- a/src/runtime/classmanager.cs +++ b/src/runtime/classmanager.cs @@ -10,7 +10,6 @@ namespace Python.Runtime /// /// The ClassManager is responsible for creating and managing instances /// that implement the Python type objects that reflect managed classes. - /// /// Each managed type reflected to Python is represented by an instance /// of a concrete subclass of ClassBase. Each instance is associated with /// a generated Python type object, whose slots point to static methods diff --git a/src/runtime/constructorbinding.cs b/src/runtime/constructorbinding.cs index 6a929eff7..ea48f97ce 100644 --- a/src/runtime/constructorbinding.cs +++ b/src/runtime/constructorbinding.cs @@ -9,14 +9,13 @@ namespace Python.Runtime /// /// /// ClassManager stores a ConstructorBinding instance in the class's __dict__['Overloads'] - /// /// SomeType.Overloads[Type, ...] works like this: /// 1) Python retreives the Overloads attribute from this ClassObject's dictionary normally /// and finds a non-null tp_descr_get slot which is called by the interpreter /// and returns an IncRef()ed pyHandle to itself. /// 2) The ConstructorBinding object handles the [] syntax in its mp_subscript by matching /// the Type object parameters to a contructor overload using Type.GetConstructor() - /// [NOTE: I don't know why method overloads are not searched the same way.] + /// [NOTE: I don't know why method overloads are not searched the same way.] /// and creating the BoundContructor oject which contains ContructorInfo object. /// 3) In tp_call, if ctorInfo is not null, ctorBinder.InvokeRaw() is called. /// @@ -43,12 +42,15 @@ public ConstructorBinding(Type type, IntPtr pyTypeHndl, ConstructorBinder ctorBi /// selection. /// /// PyObject* to a Constructors wrapper - /// the instance that the attribute was accessed through, - /// or None when the attribute is accessed through the owner + /// + /// the instance that the attribute was accessed through, + /// or None when the attribute is accessed through the owner + /// /// always the owner class - /// a CtorMapper (that borrows a reference to this python type and the - /// ClassObject's ConstructorBinder) wrapper. - /// + /// + /// a CtorMapper (that borrows a reference to this python type and the + /// ClassObject's ConstructorBinder) wrapper. + /// /// /// Python 2.6.5 docs: /// object.__get__(self, instance, owner) diff --git a/src/runtime/exceptions.cs b/src/runtime/exceptions.cs index 448655213..33d5d2ecd 100644 --- a/src/runtime/exceptions.cs +++ b/src/runtime/exceptions.cs @@ -183,9 +183,8 @@ internal unsafe static void ErrorCheck(IntPtr pointer) } /// - /// Shortcut for (pointer == NULL or ErrorOccurred()) -> throw PythonException + /// Shortcut for (pointer == NULL or ErrorOccurred()) -> throw PythonException /// - /// Shortcut for (pointer == NULL) -> throw PythonException internal unsafe static void ErrorOccurredCheck(IntPtr pointer) { if ((pointer == IntPtr.Zero) || Exceptions.ErrorOccurred()) @@ -197,7 +196,6 @@ internal unsafe static void ErrorOccurredCheck(IntPtr pointer) /// /// ExceptionMatches Method /// - /// /// /// Returns true if the current Python exception matches the given /// Python object. This is a wrapper for PyErr_ExceptionMatches. @@ -210,7 +208,6 @@ public static bool ExceptionMatches(IntPtr ob) /// /// ExceptionMatches Method /// - /// /// /// Returns true if the given Python exception matches the given /// Python object. This is a wrapper for PyErr_GivenExceptionMatches. @@ -224,7 +221,6 @@ public static bool ExceptionMatches(IntPtr exc, IntPtr ob) /// /// SetError Method /// - /// /// /// Sets the current Python exception given a native string. /// This is a wrapper for the Python PyErr_SetString call. @@ -237,7 +233,6 @@ public static void SetError(IntPtr ob, string value) /// /// SetError Method /// - /// /// /// Sets the current Python exception given a Python object. /// This is a wrapper for the Python PyErr_SetObject call. @@ -250,7 +245,6 @@ public static void SetError(IntPtr ob, IntPtr value) /// /// SetError Method /// - /// /// /// Sets the current Python exception given a CLR exception /// object. The CLR exception instance is wrapped as a Python @@ -280,7 +274,6 @@ public static void SetError(Exception e) /// /// ErrorOccurred Method /// - /// /// /// Returns true if an exception occurred in the Python runtime. /// This is a wrapper for the Python PyErr_Occurred call. @@ -293,7 +286,6 @@ public static bool ErrorOccurred() /// /// Clear Method /// - /// /// /// Clear any exception that has been set in the Python runtime. /// diff --git a/src/runtime/pyobject.cs b/src/runtime/pyobject.cs index ccebb708e..ddc0e4c4c 100644 --- a/src/runtime/pyobject.cs +++ b/src/runtime/pyobject.cs @@ -20,7 +20,6 @@ public class PyObject : DynamicObject, IDisposable /// /// PyObject Constructor /// - /// /// /// Creates a new PyObject from an IntPtr object reference. Note that /// the PyObject instance assumes ownership of the object reference @@ -51,7 +50,6 @@ protected PyObject() /// /// Handle Property /// - /// /// /// Gets the native handle of the underlying Python object. This /// value is generally for internal use by the PythonNet runtime. @@ -65,7 +63,6 @@ public IntPtr Handle /// /// FromManagedObject Method /// - /// /// /// Given an arbitrary managed object, return a Python instance that /// reflects the managed object. @@ -86,7 +83,6 @@ public static PyObject FromManagedObject(object ob) /// /// AsManagedObject Method /// - /// /// /// Return a managed object of the given type, based on the /// value of the Python object. @@ -105,7 +101,6 @@ public object AsManagedObject(Type t) /// /// Dispose Method /// - /// /// /// The Dispose method provides a way to explicitly release the /// Python object represented by a PyObject instance. It is a good @@ -139,7 +134,6 @@ public void Dispose() /// /// GetPythonType Method /// - /// /// /// Returns the Python type of the object. This method is equivalent /// to the Python expression: type(object). @@ -154,7 +148,6 @@ public PyObject GetPythonType() /// /// TypeCheck Method /// - /// /// /// Returns true if the object o is of type typeOrClass or a subtype /// of typeOrClass. @@ -168,7 +161,6 @@ public bool TypeCheck(PyObject typeOrClass) /// /// HasAttr Method /// - /// /// /// Returns true if the object has an attribute with the given name. /// @@ -181,7 +173,6 @@ public bool HasAttr(string name) /// /// HasAttr Method /// - /// /// /// Returns true if the object has an attribute with the given name, /// where name is a PyObject wrapping a string or unicode object. @@ -195,7 +186,6 @@ public bool HasAttr(PyObject name) /// /// GetAttr Method /// - /// /// /// Returns the named attribute of the Python object, or raises a /// PythonException if the attribute access fails. @@ -214,7 +204,6 @@ public PyObject GetAttr(string name) /// /// GetAttr Method /// - /// /// /// Returns the named attribute of the Python object, or the given /// default object if the attribute access fails. @@ -234,7 +223,6 @@ public PyObject GetAttr(string name, PyObject _default) /// /// GetAttr Method /// - /// /// /// Returns the named attribute of the Python object or raises a /// PythonException if the attribute access fails. The name argument @@ -254,7 +242,6 @@ public PyObject GetAttr(PyObject name) /// /// GetAttr Method /// - /// /// /// Returns the named attribute of the Python object, or the given /// default object if the attribute access fails. The name argument @@ -275,7 +262,6 @@ public PyObject GetAttr(PyObject name, PyObject _default) /// /// SetAttr Method /// - /// /// /// Set an attribute of the object with the given name and value. This /// method throws a PythonException if the attribute set fails. @@ -293,7 +279,6 @@ public void SetAttr(string name, PyObject value) /// /// SetAttr Method /// - /// /// /// Set an attribute of the object with the given name and value, /// where the name is a Python string or unicode object. This method @@ -312,7 +297,6 @@ public void SetAttr(PyObject name, PyObject value) /// /// DelAttr Method /// - /// /// /// Delete the named attribute of the Python object. This method /// throws a PythonException if the attribute set fails. @@ -330,7 +314,6 @@ public void DelAttr(string name) /// /// DelAttr Method /// - /// /// /// Delete the named attribute of the Python object, where name is a /// PyObject wrapping a Python string or unicode object. This method @@ -349,7 +332,6 @@ public void DelAttr(PyObject name) /// /// GetItem Method /// - /// /// /// For objects that support the Python sequence or mapping protocols, /// return the item at the given object index. This method raises a @@ -369,7 +351,6 @@ public virtual PyObject GetItem(PyObject key) /// /// GetItem Method /// - /// /// /// For objects that support the Python sequence or mapping protocols, /// return the item at the given string index. This method raises a @@ -387,7 +368,6 @@ public virtual PyObject GetItem(string key) /// /// GetItem Method /// - /// /// /// For objects that support the Python sequence or mapping protocols, /// return the item at the given numeric index. This method raises a @@ -405,7 +385,6 @@ public virtual PyObject GetItem(int index) /// /// SetItem Method /// - /// /// /// For objects that support the Python sequence or mapping protocols, /// set the item at the given object index to the given value. This @@ -424,7 +403,6 @@ public virtual void SetItem(PyObject key, PyObject value) /// /// SetItem Method /// - /// /// /// For objects that support the Python sequence or mapping protocols, /// set the item at the given string index to the given value. This @@ -442,7 +420,6 @@ public virtual void SetItem(string key, PyObject value) /// /// SetItem Method /// - /// /// /// For objects that support the Python sequence or mapping protocols, /// set the item at the given numeric index to the given value. This @@ -460,7 +437,6 @@ public virtual void SetItem(int index, PyObject value) /// /// DelItem Method /// - /// /// /// For objects that support the Python sequence or mapping protocols, /// delete the item at the given object index. This method raises a @@ -479,7 +455,6 @@ public virtual void DelItem(PyObject key) /// /// DelItem Method /// - /// /// /// For objects that support the Python sequence or mapping protocols, /// delete the item at the given string index. This method raises a @@ -497,7 +472,6 @@ public virtual void DelItem(string key) /// /// DelItem Method /// - /// /// /// For objects that support the Python sequence or mapping protocols, /// delete the item at the given numeric index. This method raises a @@ -515,7 +489,6 @@ public virtual void DelItem(int index) /// /// Length Method /// - /// /// /// Returns the length for objects that support the Python sequence /// protocol, or 0 if the object does not support the protocol. @@ -535,7 +508,6 @@ public virtual int Length() /// /// String Indexer /// - /// /// /// Provides a shorthand for the string versions of the GetItem and /// SetItem methods. @@ -550,7 +522,6 @@ public virtual PyObject this[string key] /// /// PyObject Indexer /// - /// /// /// Provides a shorthand for the object versions of the GetItem and /// SetItem methods. @@ -565,7 +536,6 @@ public virtual PyObject this[PyObject key] /// /// Numeric Indexer /// - /// /// /// Provides a shorthand for the numeric versions of the GetItem and /// SetItem methods. @@ -580,7 +550,6 @@ public virtual PyObject this[int index] /// /// GetIterator Method /// - /// /// /// Return a new (Python) iterator for the object. This is equivalent /// to the Python expression "iter(object)". A PythonException will be @@ -599,7 +568,6 @@ public PyObject GetIterator() /// /// GetEnumerator Method /// - /// /// /// Return a new PyIter object for the object. This allows any iterable /// python object to be iterated over in C#. A PythonException will be @@ -614,7 +582,6 @@ public IEnumerator GetEnumerator() /// /// Invoke Method /// - /// /// /// Invoke the callable object with the given arguments, passed as a /// PyObject[]. A PythonException is raised if the invokation fails. @@ -635,7 +602,6 @@ public PyObject Invoke(params PyObject[] args) /// /// Invoke Method /// - /// /// /// Invoke the callable object with the given arguments, passed as a /// Python tuple. A PythonException is raised if the invokation fails. @@ -654,7 +620,6 @@ public PyObject Invoke(PyTuple args) /// /// Invoke Method /// - /// /// /// Invoke the callable object with the given positional and keyword /// arguments. A PythonException is raised if the invokation fails. @@ -675,7 +640,6 @@ public PyObject Invoke(PyObject[] args, PyDict kw) /// /// Invoke Method /// - /// /// /// Invoke the callable object with the given positional and keyword /// arguments. A PythonException is raised if the invokation fails. @@ -694,7 +658,6 @@ public PyObject Invoke(PyTuple args, PyDict kw) /// /// InvokeMethod Method /// - /// /// /// Invoke the named method of the object with the given arguments. /// A PythonException is raised if the invokation is unsuccessful. @@ -711,7 +674,6 @@ public PyObject InvokeMethod(string name, params PyObject[] args) /// /// InvokeMethod Method /// - /// /// /// Invoke the named method of the object with the given arguments. /// A PythonException is raised if the invokation is unsuccessful. @@ -728,7 +690,6 @@ public PyObject InvokeMethod(string name, PyTuple args) /// /// InvokeMethod Method /// - /// /// /// Invoke the named method of the object with the given arguments /// and keyword arguments. Keyword args are passed as a PyDict object. @@ -746,7 +707,6 @@ public PyObject InvokeMethod(string name, PyObject[] args, PyDict kw) /// /// InvokeMethod Method /// - /// /// /// Invoke the named method of the object with the given arguments /// and keyword arguments. Keyword args are passed as a PyDict object. @@ -764,7 +724,6 @@ public PyObject InvokeMethod(string name, PyTuple args, PyDict kw) /// /// IsInstance Method /// - /// /// /// Return true if the object is an instance of the given Python type /// or class. This method always succeeds. @@ -784,7 +743,6 @@ public bool IsInstance(PyObject typeOrClass) /// /// IsSubclass Method /// - /// /// /// Return true if the object is identical to or derived from the /// given Python type or class. This method always succeeds. @@ -804,7 +762,6 @@ public bool IsSubclass(PyObject typeOrClass) /// /// IsCallable Method /// - /// /// /// Returns true if the object is a callable object. This method /// always succeeds. @@ -818,7 +775,6 @@ public bool IsCallable() /// /// IsIterable Method /// - /// /// /// Returns true if the object is iterable object. This method /// always succeeds. @@ -832,7 +788,6 @@ public bool IsIterable() /// /// IsTrue Method /// - /// /// /// Return true if the object is true according to Python semantics. /// This method always succeeds. @@ -846,7 +801,6 @@ public bool IsTrue() /// /// Dir Method /// - /// /// /// Return a list of the names of the attributes of the object. This /// is equivalent to the Python expression "dir(object)". @@ -865,7 +819,6 @@ public PyList Dir() /// /// Repr Method /// - /// /// /// Return a string representation of the object. This method is /// the managed equivalent of the Python expression "repr(object)". @@ -882,7 +835,6 @@ public string Repr() /// /// ToString Method /// - /// /// /// Return the string representation of the object. This method is /// the managed equivalent of the Python expression "str(object)". @@ -899,7 +851,6 @@ public override string ToString() /// /// Equals Method /// - /// /// /// Return true if this object is equal to the given object. This /// method is based on Python equality semantics. @@ -926,7 +877,6 @@ public override bool Equals(object o) /// /// GetHashCode Method /// - /// /// /// Return a hashcode based on the Python object. This returns the /// hash as computed by Python, equivalent to the Python expression diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index a2eccff0d..c66ae0c47 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -132,7 +132,6 @@ public static void Initialize() /// /// Initialize Method /// - /// /// /// Initialize the Python runtime. It is safe to call this method /// more than once, though initialization will only happen on the @@ -276,7 +275,6 @@ public static void InitExt() /// /// Shutdown Method /// - /// /// /// Shutdown and release resources held by the Python runtime. The /// Python runtime can no longer be used in the current process @@ -295,17 +293,14 @@ public static void Shutdown() /// /// AcquireLock Method /// - /// /// /// Acquire the Python global interpreter lock (GIL). Managed code /// *must* call this method before using any objects or calling any /// methods on objects in the Python.Runtime namespace. The only /// exception is PythonEngine.Initialize, which may be called without /// first calling AcquireLock. - /// /// Each call to AcquireLock must be matched by a corresponding call /// to ReleaseLock, passing the token obtained from AcquireLock. - /// /// For more information, see the "Extending and Embedding" section /// of the Python documentation on www.python.org. /// @@ -318,11 +313,9 @@ public static IntPtr AcquireLock() /// /// ReleaseLock Method /// - /// /// /// Release the Python global interpreter lock using a token obtained /// from a previous call to AcquireLock. - /// /// For more information, see the "Extending and Embedding" section /// of the Python documentation on www.python.org. /// @@ -335,12 +328,10 @@ public static void ReleaseLock(IntPtr gs) /// /// BeginAllowThreads Method /// - /// /// /// Release the Python global interpreter lock to allow other threads /// to run. This is equivalent to the Py_BEGIN_ALLOW_THREADS macro /// provided by the C Python API. - /// /// For more information, see the "Extending and Embedding" section /// of the Python documentation on www.python.org. /// @@ -353,12 +344,10 @@ public static IntPtr BeginAllowThreads() /// /// EndAllowThreads Method /// - /// /// /// Re-aquire the Python global interpreter lock for the current /// thread. This is equivalent to the Py_END_ALLOW_THREADS macro /// provided by the C Python API. - /// /// For more information, see the "Extending and Embedding" section /// of the Python documentation on www.python.org. /// @@ -371,7 +360,6 @@ public static void EndAllowThreads(IntPtr ts) /// /// ImportModule Method /// - /// /// /// Given a fully-qualified module or package name, import the /// module and return the resulting module object as a PyObject @@ -388,7 +376,6 @@ public static PyObject ImportModule(string name) /// /// ReloadModule Method /// - /// /// /// Given a PyObject representing a previously loaded module, reload /// the module. @@ -404,7 +391,6 @@ public static PyObject ReloadModule(PyObject module) /// /// ModuleFromString Method /// - /// /// /// Given a string module name and a string containing Python code, /// execute the code in and return a module of the given name. @@ -422,7 +408,6 @@ public static PyObject ModuleFromString(string name, string code) /// /// RunString Method /// - /// /// /// Run a string containing Python code. Returns the result of /// executing the code string as a PyObject instance, or null if From ebbad479046363906845a250457d31653d099623 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 1 Feb 2017 22:59:15 -0700 Subject: [PATCH 071/324] Downgrade to nunit2 --- appveyor.yml | 2 ++ ci/appveyor_run_tests.ps1 | 12 ++++++------ src/embed_tests/Python.EmbeddingTest.csproj | 5 ++--- src/embed_tests/packages.config | 4 ++-- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 2795a94f8..fd5822ac9 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -10,6 +10,7 @@ environment: PYTHONUNBUFFERED: True PYTHONWARNINGS: 'ignore:::wheel.pep425tags:' PYTHONPATH: C:\testdir + NUNIT: nunit-console CONDA_BLD: C:\conda CONDA_BLD_VERSION: 3.5 @@ -34,6 +35,7 @@ init: - set CONDA_BLD_ARCH=%PLATFORM:x=% - set PYTHON=C:\PYTHON%PYTHON_VERSION:.=% - if %PLATFORM%==x86 (set CONDA_BLD_ARCH=32) + - if %PLATFORM%==x86 (set NUNIT=%NUNIT%-x86) - if %PLATFORM%==x64 (set PYTHON=%PYTHON%-x64) # Prepend newly installed Python to the PATH of this build diff --git a/ci/appveyor_run_tests.ps1 b/ci/appveyor_run_tests.ps1 index 3a7d25af8..78bae50b9 100644 --- a/ci/appveyor_run_tests.ps1 +++ b/ci/appveyor_run_tests.ps1 @@ -3,7 +3,7 @@ # Executable paths for OpenCover # Note if OpenCover fails, it won't affect the exit codes. $OPENCOVER = Resolve-Path .\packages\OpenCover.*\tools\OpenCover.Console.exe -$NUNIT = Resolve-Path .\packages\NUnit.ConsoleRunner*\tools\nunit3-console.exe +$NUNIT = Resolve-Path .\packages\NUnit.Runners*\tools\"$env:NUNIT".exe $PY = Get-Command python # Can't use ".\build\*\Python.EmbeddingTest.dll". Missing framework files. @@ -19,11 +19,11 @@ if ($PYTHON_STATUS -ne 0) { } # Run Embedded tests with C# coverage -# .$OPENCOVER -register:user -searchdirs:"$RUNTIME_DIR" -output:cs.coverage -target:"$NUNIT" -targetargs:"$CS_TESTS" -returntargetcode -# $NUNIT_STATUS = $LastExitCode -# if ($NUNIT_STATUS -ne 0) { -# Write-Host "Embedded tests failed" -ForegroundColor "Red" -# } +.$OPENCOVER -register:user -searchdirs:"$RUNTIME_DIR" -output:cs.coverage -target:"$NUNIT" -targetargs:"$CS_TESTS" -returntargetcode +$NUNIT_STATUS = $LastExitCode +if ($NUNIT_STATUS -ne 0) { + Write-Host "Embedded tests failed" -ForegroundColor "Red" +} # Embedded tests failing due to open issues, pass/fail only on Python exit code # if ($PYTHON_STATUS -ne 0 -or $NUNIT_STATUS -ne 0) { diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index 7e083d5e0..c9586cf4a 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -150,9 +150,8 @@ prompt - - ..\..\packages\NUnit.3.5.0\lib\net40\nunit.framework.dll - True + + ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll diff --git a/src/embed_tests/packages.config b/src/embed_tests/packages.config index 8ab5202ce..33152fe85 100644 --- a/src/embed_tests/packages.config +++ b/src/embed_tests/packages.config @@ -1,5 +1,5 @@ - - + + From 8627843e21d2acba9489a5b877cd2547622b919b Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 2 Feb 2017 16:00:03 -0700 Subject: [PATCH 072/324] Syntax cleanup --- src/runtime/arrayobject.cs | 4 +- src/runtime/assemblyinfo.cs | 2 +- src/runtime/assemblymanager.cs | 17 +- src/runtime/classbase.cs | 15 +- src/runtime/classderived.cs | 272 ++++++++++++++++++------------ src/runtime/classmanager.cs | 70 ++++---- src/runtime/classobject.cs | 30 ++-- src/runtime/codegenerator.cs | 2 +- src/runtime/constructorbinding.cs | 52 +++--- src/runtime/converter.cs | 6 +- src/runtime/debughelper.cs | 4 +- src/runtime/delegatemanager.cs | 39 ++--- src/runtime/delegateobject.cs | 19 +-- src/runtime/eventbinding.cs | 18 +- src/runtime/eventobject.cs | 53 +++--- src/runtime/exceptions.cs | 33 ++-- src/runtime/extensiontype.cs | 4 +- src/runtime/genericutil.cs | 10 +- src/runtime/importhook.cs | 25 +-- src/runtime/indexer.cs | 23 ++- src/runtime/interfaceobject.cs | 3 +- src/runtime/metatype.cs | 41 ++--- src/runtime/methodbinder.cs | 160 +++++++++++------- src/runtime/methodbinding.cs | 55 +++--- src/runtime/methodobject.cs | 36 ++-- src/runtime/moduleobject.cs | 87 +++++----- src/runtime/nativecall.cs | 8 +- src/runtime/pynumber.cs | 6 +- src/runtime/pyobject.cs | 62 ++++--- src/runtime/pystring.cs | 2 +- src/runtime/typemanager.cs | 4 +- src/runtime/typemethod.cs | 1 - 32 files changed, 634 insertions(+), 529 deletions(-) diff --git a/src/runtime/arrayobject.cs b/src/runtime/arrayobject.cs index caf40ca50..a10688749 100644 --- a/src/runtime/arrayobject.cs +++ b/src/runtime/arrayobject.cs @@ -117,7 +117,7 @@ public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) try { - value = items.GetValue((int[])args); + value = items.GetValue(args); } catch (IndexOutOfRangeException) { @@ -210,7 +210,7 @@ public static int mp_ass_subscript(IntPtr ob, IntPtr idx, IntPtr v) try { - items.SetValue(value, (int[])args); + items.SetValue(value, args); } catch (IndexOutOfRangeException) { diff --git a/src/runtime/assemblyinfo.cs b/src/runtime/assemblyinfo.cs index 1cbd1e749..a357b81d9 100644 --- a/src/runtime/assemblyinfo.cs +++ b/src/runtime/assemblyinfo.cs @@ -1,8 +1,8 @@ using System; using System.Reflection; using System.Resources; -using System.Runtime.InteropServices; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; [assembly: AssemblyProduct("Python for .NET")] [assembly: AssemblyVersion("4.0.0.1")] diff --git a/src/runtime/assemblymanager.cs b/src/runtime/assemblymanager.cs index 29851c32e..692351f11 100644 --- a/src/runtime/assemblymanager.cs +++ b/src/runtime/assemblymanager.cs @@ -158,12 +158,10 @@ internal static void UpdatePath() public static string FindAssembly(string name) { char sep = Path.DirectorySeparatorChar; - string path; - string temp; - for (var i = 0; i < pypath.Count; i++) + foreach (string head in pypath) { - string head = pypath[i]; + string path; if (head == null || head.Length == 0) { path = name; @@ -173,11 +171,12 @@ public static string FindAssembly(string name) path = head + sep + name; } - temp = path + ".dll"; + string temp = path + ".dll"; if (File.Exists(temp)) { return temp; } + temp = path + ".exe"; if (File.Exists(temp)) { @@ -233,10 +232,8 @@ public static Assembly LoadAssemblyPath(string name) /// /// Loads an assembly using full path. /// - /// - /// - /// - /// + /// + /// public static Assembly LoadAssemblyFullPath(string name) { Assembly assembly = null; @@ -252,7 +249,7 @@ public static Assembly LoadAssemblyFullPath(string name) { assembly = Assembly.LoadFrom(name); } - catch + catch (Exception) { } } diff --git a/src/runtime/classbase.cs b/src/runtime/classbase.cs index 580fcabe4..e480b309a 100644 --- a/src/runtime/classbase.cs +++ b/src/runtime/classbase.cs @@ -1,7 +1,5 @@ using System; using System.Collections; -using System.Reflection; -using System.Security; using System.Runtime.InteropServices; namespace Python.Runtime @@ -27,7 +25,7 @@ internal ClassBase(Type tp) internal virtual bool CanSubclass() { - return (!this.type.IsEnum); + return !type.IsEnum; } /// @@ -49,12 +47,12 @@ public virtual IntPtr type_subscript(IntPtr idx) return Exceptions.RaiseTypeError("type(s) expected"); } - Type target = GenericUtil.GenericForType(this.type, types.Length); + Type target = GenericUtil.GenericForType(type, types.Length); if (target != null) { Type t = target.MakeGenericType(types); - ManagedType c = (ManagedType)ClassManager.GetClass(t); + ManagedType c = ClassManager.GetClass(t); Runtime.XIncref(c.pyHandle); return c.pyHandle; } @@ -115,10 +113,15 @@ public static IntPtr tp_richcompare(IntPtr ob, IntPtr other, int op) co1 = GetManagedObject(ob) as CLRObject; co2 = GetManagedObject(other) as CLRObject; if (co1 == null || co2 == null) + { return Exceptions.RaiseTypeError("Cannot get managed object"); + } var co1Comp = co1.inst as IComparable; if (co1Comp == null) - return Exceptions.RaiseTypeError("Cannot convert object of type " + co1.GetType() + " to IComparable"); + { + Type co1Type = co1.GetType(); + return Exceptions.RaiseTypeError($"Cannot convert object of type {co1Type} to IComparable"); + } try { int cmp = co1Comp.CompareTo(co2.inst); diff --git a/src/runtime/classderived.cs b/src/runtime/classderived.cs index c7f60e7af..0f8f156e8 100644 --- a/src/runtime/classderived.cs +++ b/src/runtime/classderived.cs @@ -1,10 +1,8 @@ using System; -using System.IO; -using System.Reflection; -using System.Reflection.Emit; using System.Collections.Generic; -using System.Threading; using System.Linq; +using System.Reflection; +using System.Reflection.Emit; using System.Runtime.InteropServices; using System.Threading.Tasks; @@ -16,15 +14,17 @@ namespace Python.Runtime /// Python type objects. Each of those type objects is associated with /// an instance of ClassObject, which provides its implementation. /// - // interface used to idenfity which C# types were dynamically created as python subclasses + /// + /// interface used to identify which C# types were dynamically created as python subclasses + /// public interface IPythonDerivedType { } internal class ClassDerivedObject : ClassObject { - static private Dictionary assemblyBuilders; - static private Dictionary, ModuleBuilder> moduleBuilders; + private static Dictionary assemblyBuilders; + private static Dictionary, ModuleBuilder> moduleBuilders; static ClassDerivedObject() { @@ -32,30 +32,32 @@ static ClassDerivedObject() moduleBuilders = new Dictionary, ModuleBuilder>(); } - internal ClassDerivedObject(Type tp): base(tp) + internal ClassDerivedObject(Type tp) : base(tp) { } /// /// Implements __new__ for derived classes of reflected classes. - /// - new public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) + /// + public new static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) { - ClassDerivedObject cls = GetManagedObject(tp) as ClassDerivedObject; + var cls = GetManagedObject(tp) as ClassDerivedObject; // call the managed constructor - Object obj = cls.binder.InvokeRaw(IntPtr.Zero, args, kw); + object obj = cls.binder.InvokeRaw(IntPtr.Zero, args, kw); if (obj == null) + { return IntPtr.Zero; + } // return the pointer to the python object // (this indirectly calls ClassDerivedObject.ToPython) return Converter.ToPython(obj, cls.GetType()); } - new public static void tp_dealloc(IntPtr ob) + public new static void tp_dealloc(IntPtr ob) { - CLRObject self = (CLRObject)GetManagedObject(ob); + var self = (CLRObject)GetManagedObject(ob); // don't let the python GC destroy this object Runtime.PyObject_GC_UnTrack(self.pyHandle); @@ -70,14 +72,16 @@ internal ClassDerivedObject(Type tp): base(tp) self.gcHandle = gc; } - // Called from Converter.ToPython for types that are python subclasses of managed types. - // The referenced python object is returned instead of a new wrapper. + /// + /// Called from Converter.ToPython for types that are python subclasses of managed types. + /// The referenced python object is returned instead of a new wrapper. + /// internal static IntPtr ToPython(IPythonDerivedType obj) { // derived types have a __pyobj__ field that gets set to the python - // object in the overriden constructor + // object in the overridden constructor FieldInfo fi = obj.GetType().GetField("__pyobj__"); - CLRObject self = (CLRObject)fi.GetValue(obj); + var self = (CLRObject)fi.GetValue(obj); Runtime.XIncref(self.pyHandle); @@ -102,8 +106,8 @@ internal static IntPtr ToPython(IPythonDerivedType obj) /// /// Creates a new managed type derived from a base type with any virtual - /// methods overriden to call out to python if the associated python - /// object has overriden the method. + /// methods overridden to call out to python if the associated python + /// object has overridden the method. /// internal static Type CreateDerivedType(string name, Type baseType, @@ -113,31 +117,35 @@ internal static Type CreateDerivedType(string name, string moduleName = "Python.Runtime.Dynamic.dll") { if (null != namespaceStr) + { name = namespaceStr + "." + name; + } if (null == assemblyName) + { assemblyName = Assembly.GetExecutingAssembly().FullName; + } ModuleBuilder moduleBuilder = GetModuleBuilder(assemblyName, moduleName); - TypeBuilder typeBuilder; Type baseClass = baseType; - List interfaces = new List { typeof(IPythonDerivedType) }; + var interfaces = new List { typeof(IPythonDerivedType) }; // if the base type is an interface then use System.Object as the base class // and add the base type to the list of interfaces this new class will implement. if (baseType.IsInterface) { interfaces.Add(baseType); - baseClass = typeof(System.Object); + baseClass = typeof(object); } - typeBuilder = moduleBuilder.DefineType(name, + TypeBuilder typeBuilder = moduleBuilder.DefineType(name, TypeAttributes.Public | TypeAttributes.Class, baseClass, interfaces.ToArray()); // add a field for storing the python object pointer + // FIXME: fb not used FieldBuilder fb = typeBuilder.DefineField("__pyobj__", typeof(CLRObject), FieldAttributes.Public); // override any constructors @@ -147,17 +155,18 @@ internal static Type CreateDerivedType(string name, AddConstructor(ctor, baseType, typeBuilder); } - // Override any properties explicitly overriden in python - HashSet pyProperties = new HashSet(); + // Override any properties explicitly overridden in python + var pyProperties = new HashSet(); if (py_dict != IntPtr.Zero && Runtime.PyDict_Check(py_dict)) { Runtime.XIncref(py_dict); - using (PyDict dict = new PyDict(py_dict)) + using (var dict = new PyDict(py_dict)) using (PyObject keys = dict.Keys()) { foreach (PyObject pyKey in keys) { using (PyObject value = dict[pyKey]) + { if (value.HasAttr("_clr_property_type_")) { string propertyName = pyKey.ToString(); @@ -166,23 +175,28 @@ internal static Type CreateDerivedType(string name, // Add the property to the type AddPythonProperty(propertyName, value, typeBuilder); } + } } } } - // override any virtual methods not already overriden by the properties above + // override any virtual methods not already overridden by the properties above MethodInfo[] methods = baseType.GetMethods(); - HashSet virtualMethods = new HashSet(); + var virtualMethods = new HashSet(); foreach (MethodInfo method in methods) { if (!method.Attributes.HasFlag(MethodAttributes.Virtual) | method.Attributes.HasFlag(MethodAttributes.Final)) + { continue; + } - // skip if this property has already been overriden + // skip if this property has already been overridden if ((method.Name.StartsWith("get_") || method.Name.StartsWith("set_")) && pyProperties.Contains(method.Name.Substring(4))) + { continue; + } // keep track of the virtual methods redirected to the python instance virtualMethods.Add(method.Name); @@ -195,23 +209,27 @@ internal static Type CreateDerivedType(string name, if (py_dict != IntPtr.Zero && Runtime.PyDict_Check(py_dict)) { Runtime.XIncref(py_dict); - using (PyDict dict = new PyDict(py_dict)) + using (var dict = new PyDict(py_dict)) using (PyObject keys = dict.Keys()) { foreach (PyObject pyKey in keys) { using (PyObject value = dict[pyKey]) + { if (value.HasAttr("_clr_return_type_") && value.HasAttr("_clr_arg_types_")) { string methodName = pyKey.ToString(); // if this method has already been redirected to the python method skip it if (virtualMethods.Contains(methodName)) + { continue; + } // Add the method to the type AddPythonMethod(methodName, value, typeBuilder); } + } } } } @@ -237,6 +255,7 @@ internal static Type CreateDerivedType(string name, Assembly assembly = Assembly.GetAssembly(type); AssemblyManager.ScanAssembly(assembly); + // FIXME: assemblyBuilder not used AssemblyBuilder assemblyBuilder = assemblyBuilders[assemblyName]; return type; @@ -265,8 +284,10 @@ private static void AddConstructor(ConstructorInfo ctor, Type baseType, TypeBuil // emit the assembly for calling the original method using call instead of callvirt ILGenerator il = methodBuilder.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); - for (int i = 0; i < parameters.Length; ++i) + for (var i = 0; i < parameters.Length; ++i) + { il.Emit(OpCodes.Ldarg, i + 1); + } il.Emit(OpCodes.Call, ctor); il.Emit(OpCodes.Ret); @@ -277,20 +298,22 @@ private static void AddConstructor(ConstructorInfo ctor, Type baseType, TypeBuil ctor.CallingConvention, parameterTypes); il = cb.GetILGenerator(); - il.DeclareLocal(typeof(Object[])); + il.DeclareLocal(typeof(object[])); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldstr, baseCtorName); il.Emit(OpCodes.Ldc_I4, parameters.Length); - il.Emit(OpCodes.Newarr, typeof(System.Object)); + il.Emit(OpCodes.Newarr, typeof(object)); il.Emit(OpCodes.Stloc_0); - for (int i = 0; i < parameters.Length; ++i) + for (var i = 0; i < parameters.Length; ++i) { il.Emit(OpCodes.Ldloc_0); il.Emit(OpCodes.Ldc_I4, i); il.Emit(OpCodes.Ldarg, i + 1); if (parameterTypes[i].IsValueType) + { il.Emit(OpCodes.Box, parameterTypes[i]); - il.Emit(OpCodes.Stelem, typeof(Object)); + } + il.Emit(OpCodes.Stelem, typeof(object)); } il.Emit(OpCodes.Ldloc_0); il.Emit(OpCodes.Call, typeof(PythonDerivedType).GetMethod("InvokeCtor")); @@ -301,7 +324,7 @@ private static void AddConstructor(ConstructorInfo ctor, Type baseType, TypeBuil /// Add a virtual method override that checks for an override on the python instance /// and calls it, otherwise fall back to the base class method. /// - /// virtual method to be overriden + /// virtual method to be overridden /// Python callable object /// TypeBuilder for the new type the method is to be added to private static void AddVirtualMethod(MethodInfo method, Type baseType, TypeBuilder typeBuilder) @@ -324,8 +347,10 @@ private static void AddVirtualMethod(MethodInfo method, Type baseType, TypeBuild // emit the assembly for calling the original method using call instead of callvirt ILGenerator baseIl = baseMethodBuilder.GetILGenerator(); baseIl.Emit(OpCodes.Ldarg_0); - for (int i = 0; i < parameters.Length; ++i) + for (var i = 0; i < parameters.Length; ++i) + { baseIl.Emit(OpCodes.Ldarg, i + 1); + } baseIl.Emit(OpCodes.Call, method); baseIl.Emit(OpCodes.Ret); } @@ -340,27 +365,33 @@ private static void AddVirtualMethod(MethodInfo method, Type baseType, TypeBuild method.ReturnType, parameterTypes); ILGenerator il = methodBuilder.GetILGenerator(); - il.DeclareLocal(typeof(Object[])); + il.DeclareLocal(typeof(object[])); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldstr, method.Name); // don't fall back to the base type's method if it's abstract if (null != baseMethodName) + { il.Emit(OpCodes.Ldstr, baseMethodName); + } else + { il.Emit(OpCodes.Ldnull); + } il.Emit(OpCodes.Ldc_I4, parameters.Length); - il.Emit(OpCodes.Newarr, typeof(System.Object)); + il.Emit(OpCodes.Newarr, typeof(object)); il.Emit(OpCodes.Stloc_0); - for (int i = 0; i < parameters.Length; ++i) + for (var i = 0; i < parameters.Length; ++i) { il.Emit(OpCodes.Ldloc_0); il.Emit(OpCodes.Ldc_I4, i); il.Emit(OpCodes.Ldarg, i + 1); if (parameterTypes[i].IsValueType) + { il.Emit(OpCodes.Box, parameterTypes[i]); - il.Emit(OpCodes.Stelem, typeof(Object)); + } + il.Emit(OpCodes.Stelem, typeof(object)); } il.Emit(OpCodes.Ldloc_0); if (method.ReturnType == typeof(void)) @@ -377,9 +408,9 @@ private static void AddVirtualMethod(MethodInfo method, Type baseType, TypeBuild /// /// Python method may have the following function attributes set to control how they're exposed: - /// - _clr_return_type_ - method return type (required) - /// - _clr_arg_types_ - list of method argument types (required) - /// - _clr_method_name_ - method name, if different from the python method name (optional) + /// - _clr_return_type_ - method return type (required) + /// - _clr_arg_types_ - list of method argument types (required) + /// - _clr_method_name_ - method name, if different from the python method name (optional) /// /// Method name to add to the type /// Python callable object @@ -389,25 +420,33 @@ private static void AddPythonMethod(string methodName, PyObject func, TypeBuilde if (func.HasAttr("_clr_method_name_")) { using (PyObject pyMethodName = func.GetAttr("_clr_method_name_")) + { methodName = pyMethodName.ToString(); + } } using (PyObject pyReturnType = func.GetAttr("_clr_return_type_")) using (PyObject pyArgTypes = func.GetAttr("_clr_arg_types_")) { - Type returnType = pyReturnType.AsManagedObject(typeof(Type)) as Type; + var returnType = pyReturnType.AsManagedObject(typeof(Type)) as Type; if (returnType == null) + { returnType = typeof(void); + } if (!pyArgTypes.IsIterable()) + { throw new ArgumentException("_clr_arg_types_ must be a list or tuple of CLR types"); + } - List argTypes = new List(); + var argTypes = new List(); foreach (PyObject pyArgType in pyArgTypes) { - Type argType = pyArgType.AsManagedObject(typeof(Type)) as Type; + var argType = pyArgType.AsManagedObject(typeof(Type)) as Type; if (argType == null) + { throw new ArgumentException("_clr_arg_types_ must be a list or tuple of CLR types"); + } argTypes.Add(argType); } @@ -423,21 +462,23 @@ private static void AddPythonMethod(string methodName, PyObject func, TypeBuilde argTypes.ToArray()); ILGenerator il = methodBuilder.GetILGenerator(); - il.DeclareLocal(typeof(Object[])); + il.DeclareLocal(typeof(object[])); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldstr, methodName); il.Emit(OpCodes.Ldnull); // don't fall back to the base type's method il.Emit(OpCodes.Ldc_I4, argTypes.Count); - il.Emit(OpCodes.Newarr, typeof(System.Object)); + il.Emit(OpCodes.Newarr, typeof(object)); il.Emit(OpCodes.Stloc_0); - for (int i = 0; i < argTypes.Count; ++i) + for (var i = 0; i < argTypes.Count; ++i) { il.Emit(OpCodes.Ldloc_0); il.Emit(OpCodes.Ldc_I4, i); il.Emit(OpCodes.Ldarg, i + 1); if (argTypes[i].IsValueType) + { il.Emit(OpCodes.Box, argTypes[i]); - il.Emit(OpCodes.Stelem, typeof(Object)); + } + il.Emit(OpCodes.Stelem, typeof(object)); } il.Emit(OpCodes.Ldloc_0); if (returnType == typeof(void)) @@ -455,7 +496,7 @@ private static void AddPythonMethod(string methodName, PyObject func, TypeBuilde /// /// Python properties may have the following function attributes set to control how they're exposed: - /// - _clr_property_type_ - property type (required) + /// - _clr_property_type_ - property type (required) /// /// Property name to add to the type /// Python property object @@ -471,9 +512,11 @@ private static void AddPythonProperty(string propertyName, PyObject func, TypeBu using (PyObject pyPropertyType = func.GetAttr("_clr_property_type_")) { - Type propertyType = pyPropertyType.AsManagedObject(typeof(Type)) as Type; + var propertyType = pyPropertyType.AsManagedObject(typeof(Type)) as Type; if (propertyType == null) + { throw new ArgumentException("_clr_property_type must be a CLR type"); + } PropertyBuilder propertyBuilder = typeBuilder.DefineProperty(propertyName, PropertyAttributes.None, @@ -483,6 +526,7 @@ private static void AddPythonProperty(string propertyName, PyObject func, TypeBu if (func.HasAttr("fget")) { using (PyObject pyfget = func.GetAttr("fget")) + { if (pyfget.IsTrue()) { MethodBuilder methodBuilder = typeBuilder.DefineMethod("get_" + propertyName, @@ -499,17 +543,19 @@ private static void AddPythonProperty(string propertyName, PyObject func, TypeBu propertyBuilder.SetGetMethod(methodBuilder); } + } } if (func.HasAttr("fset")) { using (PyObject pyset = func.GetAttr("fset")) + { if (pyset.IsTrue()) { MethodBuilder methodBuilder = typeBuilder.DefineMethod("set_" + propertyName, methodAttribs, null, - new Type[] { propertyType }); + new[] { propertyType }); ILGenerator il = methodBuilder.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); @@ -521,6 +567,7 @@ private static void AddPythonProperty(string propertyName, PyObject func, TypeBu propertyBuilder.SetSetMethod(methodBuilder); } + } } } } @@ -529,7 +576,7 @@ private static ModuleBuilder GetModuleBuilder(string assemblyName, string module { // find or create a dynamic assembly and module AppDomain domain = AppDomain.CurrentDomain; - ModuleBuilder moduleBuilder = null; + ModuleBuilder moduleBuilder; if (moduleBuilders.ContainsKey(Tuple.Create(assemblyName, moduleName))) { @@ -537,7 +584,7 @@ private static ModuleBuilder GetModuleBuilder(string assemblyName, string module } else { - AssemblyBuilder assemblyBuilder = null; + AssemblyBuilder assemblyBuilder; if (assemblyBuilders.ContainsKey(assemblyName)) { assemblyBuilder = assemblyBuilders[assemblyName]; @@ -557,53 +604,54 @@ private static ModuleBuilder GetModuleBuilder(string assemblyName, string module } } - // - // PythonDerivedType contains static methods used by the dynamically created - // derived type that allow it to call back into python from overriden virtual - // methods, and also handle the construction and destruction of the python - // object. - // - // This has to be public as it's called from methods on dynamically built classes - // potentially in other assemblies. - // + /// + /// PythonDerivedType contains static methods used by the dynamically created + /// derived type that allow it to call back into python from overridden virtual + /// methods, and also handle the construction and destruction of the python + /// object. + /// + /// + /// This has to be public as it's called from methods on dynamically built classes + /// potentially in other assemblies. + /// public class PythonDerivedType { /// - /// This is the implementaion of the overriden methods in the derived + /// This is the implementation of the overridden methods in the derived /// type. It looks for a python method with the same name as the method /// on the managed base class and if it exists and isn't the managed - /// method binding (ie it has been overriden in the derived python + /// method binding (i.e. it has been overridden in the derived python /// class) it calls it, otherwise it calls the base method. /// - public static T InvokeMethod(IPythonDerivedType obj, string methodName, string origMethodName, Object[] args) + public static T InvokeMethod(IPythonDerivedType obj, string methodName, string origMethodName, object[] args) { FieldInfo fi = obj.GetType().GetField("__pyobj__"); - CLRObject self = (CLRObject)fi.GetValue(obj); + var self = (CLRObject)fi.GetValue(obj); if (null != self) { - List disposeList = new List(); + var disposeList = new List(); IntPtr gs = Runtime.PyGILState_Ensure(); try { Runtime.XIncref(self.pyHandle); - PyObject pyself = new PyObject(self.pyHandle); + var pyself = new PyObject(self.pyHandle); disposeList.Add(pyself); Runtime.XIncref(Runtime.PyNone); - PyObject pynone = new PyObject(Runtime.PyNone); + var pynone = new PyObject(Runtime.PyNone); disposeList.Add(pynone); PyObject method = pyself.GetAttr(methodName, pynone); disposeList.Add(method); if (method.Handle != Runtime.PyNone) { - // if the method hasn't been overriden then it will be a managed object + // if the method hasn't been overridden then it will be a managed object ManagedType managedMethod = ManagedType.GetManagedObject(method.Handle); if (null == managedMethod) { - PyObject[] pyargs = new PyObject[args.Length]; - for (int i = 0; i < args.Length; ++i) + var pyargs = new PyObject[args.Length]; + for (var i = 0; i < args.Length; ++i) { pyargs[i] = new PyObject(Converter.ToPythonImplicit(args[i])); disposeList.Add(pyargs[i]); @@ -619,15 +667,16 @@ public static T InvokeMethod(IPythonDerivedType obj, string methodName, strin { foreach (PyObject x in disposeList) { - if (x != null) - x.Dispose(); + x?.Dispose(); } Runtime.PyGILState_Release(gs); } } if (origMethodName == null) + { throw new NotImplementedException("Python object does not have a '" + methodName + "' method"); + } return (T)obj.GetType().InvokeMember(origMethodName, BindingFlags.InvokeMethod, @@ -637,34 +686,34 @@ public static T InvokeMethod(IPythonDerivedType obj, string methodName, strin } public static void InvokeMethodVoid(IPythonDerivedType obj, string methodName, string origMethodName, - Object[] args) + object[] args) { FieldInfo fi = obj.GetType().GetField("__pyobj__"); - CLRObject self = (CLRObject)fi.GetValue(obj); + var self = (CLRObject)fi.GetValue(obj); if (null != self) { - List disposeList = new List(); + var disposeList = new List(); IntPtr gs = Runtime.PyGILState_Ensure(); try { Runtime.XIncref(self.pyHandle); - PyObject pyself = new PyObject(self.pyHandle); + var pyself = new PyObject(self.pyHandle); disposeList.Add(pyself); Runtime.XIncref(Runtime.PyNone); - PyObject pynone = new PyObject(Runtime.PyNone); + var pynone = new PyObject(Runtime.PyNone); disposeList.Add(pynone); PyObject method = pyself.GetAttr(methodName, pynone); disposeList.Add(method); if (method.Handle != Runtime.PyNone) { - // if the method hasn't been overriden then it will be a managed object + // if the method hasn't been overridden then it will be a managed object ManagedType managedMethod = ManagedType.GetManagedObject(method.Handle); if (null == managedMethod) { - PyObject[] pyargs = new PyObject[args.Length]; - for (int i = 0; i < args.Length; ++i) + var pyargs = new PyObject[args.Length]; + for (var i = 0; i < args.Length; ++i) { pyargs[i] = new PyObject(Converter.ToPythonImplicit(args[i])); disposeList.Add(pyargs[i]); @@ -680,15 +729,16 @@ public static void InvokeMethodVoid(IPythonDerivedType obj, string methodName, s { foreach (PyObject x in disposeList) { - if (x != null) - x.Dispose(); + x?.Dispose(); } Runtime.PyGILState_Release(gs); } } if (origMethodName == null) + { throw new NotImplementedException("Python object does not have a '" + methodName + "' method"); + } obj.GetType().InvokeMember(origMethodName, BindingFlags.InvokeMethod, @@ -700,18 +750,22 @@ public static void InvokeMethodVoid(IPythonDerivedType obj, string methodName, s public static T InvokeGetProperty(IPythonDerivedType obj, string propertyName) { FieldInfo fi = obj.GetType().GetField("__pyobj__"); - CLRObject self = (CLRObject)fi.GetValue(obj); + var self = (CLRObject)fi.GetValue(obj); if (null == self) + { throw new NullReferenceException("Instance must be specified when getting a property"); + } IntPtr gs = Runtime.PyGILState_Ensure(); try { Runtime.XIncref(self.pyHandle); - using (PyObject pyself = new PyObject(self.pyHandle)) + using (var pyself = new PyObject(self.pyHandle)) using (PyObject pyvalue = pyself.GetAttr(propertyName)) + { return (T)pyvalue.AsManagedObject(typeof(T)); + } } finally { @@ -722,18 +776,22 @@ public static T InvokeGetProperty(IPythonDerivedType obj, string propertyName public static void InvokeSetProperty(IPythonDerivedType obj, string propertyName, T value) { FieldInfo fi = obj.GetType().GetField("__pyobj__"); - CLRObject self = (CLRObject)fi.GetValue(obj); + var self = (CLRObject)fi.GetValue(obj); if (null == self) + { throw new NullReferenceException("Instance must be specified when setting a property"); + } IntPtr gs = Runtime.PyGILState_Ensure(); try { Runtime.XIncref(self.pyHandle); - using (PyObject pyself = new PyObject(self.pyHandle)) - using (PyObject pyvalue = new PyObject(Converter.ToPythonImplicit(value))) + using (var pyself = new PyObject(self.pyHandle)) + using (var pyvalue = new PyObject(Converter.ToPythonImplicit(value))) + { pyself.SetAttr(propertyName, pyvalue); + } } finally { @@ -741,7 +799,7 @@ public static void InvokeSetProperty(IPythonDerivedType obj, string propertyN } } - public static void InvokeCtor(IPythonDerivedType obj, string origCtorName, Object[] args) + public static void InvokeCtor(IPythonDerivedType obj, string origCtorName, object[] args) { // call the base constructor obj.GetType().InvokeMember(origCtorName, @@ -750,7 +808,7 @@ public static void InvokeCtor(IPythonDerivedType obj, string origCtorName, Objec obj, args); - List disposeList = new List(); + var disposeList = new List(); CLRObject self = null; IntPtr gs = Runtime.PyGILState_Ensure(); try @@ -765,11 +823,11 @@ public static void InvokeCtor(IPythonDerivedType obj, string origCtorName, Objec fi.SetValue(obj, self); Runtime.XIncref(self.pyHandle); - PyObject pyself = new PyObject(self.pyHandle); + var pyself = new PyObject(self.pyHandle); disposeList.Add(pyself); Runtime.XIncref(Runtime.PyNone); - PyObject pynone = new PyObject(Runtime.PyNone); + var pynone = new PyObject(Runtime.PyNone); disposeList.Add(pynone); // call __init__ @@ -777,12 +835,12 @@ public static void InvokeCtor(IPythonDerivedType obj, string origCtorName, Objec disposeList.Add(init); if (init.Handle != Runtime.PyNone) { - // if __init__ hasn't been overriden then it will be a managed object + // if __init__ hasn't been overridden then it will be a managed object ManagedType managedMethod = ManagedType.GetManagedObject(init.Handle); if (null == managedMethod) { - PyObject[] pyargs = new PyObject[args.Length]; - for (int i = 0; i < args.Length; ++i) + var pyargs = new PyObject[args.Length]; + for (var i = 0; i < args.Length; ++i) { pyargs[i] = new PyObject(Converter.ToPython(args[i], args[i]?.GetType())); disposeList.Add(pyargs[i]); @@ -796,15 +854,16 @@ public static void InvokeCtor(IPythonDerivedType obj, string origCtorName, Objec { foreach (PyObject x in disposeList) { - if (x != null) - x.Dispose(); + x?.Dispose(); } // Decrement the python object's reference count. // This doesn't actually destroy the object, it just sets the reference to this object // to be a weak reference and it will be destroyed when the C# object is destroyed. if (null != self) + { Runtime.XDecref(self.pyHandle); + } Runtime.PyGILState_Release(gs); } @@ -813,7 +872,7 @@ public static void InvokeCtor(IPythonDerivedType obj, string origCtorName, Objec public static void Finalize(IPythonDerivedType obj) { FieldInfo fi = obj.GetType().GetField("__pyobj__"); - CLRObject self = (CLRObject)fi.GetValue(obj); + var self = (CLRObject)fi.GetValue(obj); // If python's been terminated then just free the gchandle. lock (Runtime.IsFinalizingLock) @@ -825,9 +884,10 @@ public static void Finalize(IPythonDerivedType obj) } } - // delete the python object in an asnyc task as we may not be able to acquire + // delete the python object in an async task as we may not be able to acquire // the GIL immediately and we don't want to block the GC thread. - var t = Task.Factory.StartNew(() => + // FIXME: t isn't used + Task t = Task.Factory.StartNew(() => { lock (Runtime.IsFinalizingLock) { @@ -846,7 +906,9 @@ public static void Finalize(IPythonDerivedType obj) // python object. IntPtr dict = Marshal.ReadIntPtr(self.pyHandle, ObjectOffset.DictOffset(self.pyHandle)); if (dict != IntPtr.Zero) + { Runtime.XDecref(dict); + } Runtime.PyObject_GC_Del(self.pyHandle); self.gcHandle.Free(); } diff --git a/src/runtime/classmanager.cs b/src/runtime/classmanager.cs index c4a02e563..333f3e7ce 100644 --- a/src/runtime/classmanager.cs +++ b/src/runtime/classmanager.cs @@ -1,8 +1,8 @@ using System; -using System.Runtime.InteropServices; -using System.Collections.Generic; using System.Collections; +using System.Collections.Generic; using System.Reflection; +using System.Runtime.InteropServices; using System.Security; namespace Python.Runtime @@ -27,11 +27,11 @@ private ClassManager() static ClassManager() { cache = new Dictionary(128); - // SEE: http://msdn.microsoft.com/en-us/library/96b1ayy4%28VS.90%29.aspx + // SEE: https://msdn.microsoft.com/en-us/library/96b1ayy4(v=vs.100).aspx // ""All delegates inherit from MulticastDelegate, which inherits from Delegate."" // Was Delegate, which caused a null MethodInfo returned from GetMethode("Invoke") // and crashed on Linux under Mono. - dtype = typeof(System.MulticastDelegate); + dtype = typeof(MulticastDelegate); } /// @@ -48,7 +48,8 @@ internal static ClassBase GetClass(Type type) } cb = CreateClass(type); cache.Add(type, cb); - // Initialize the object later, as this might call this GetClass method recursivly (for example when a nested class inherits its declaring class...) + // Initialize the object later, as this might call this GetClass method + // recursively (for example when a nested class inherits its declaring class...) InitClassBase(type, cb); return cb; } @@ -137,30 +138,29 @@ private static void InitClassBase(Type type, ClassBase impl) IDictionaryEnumerator iter = info.members.GetEnumerator(); while (iter.MoveNext()) { - ManagedType item = (ManagedType)iter.Value; - string name = (string)iter.Key; + var item = (ManagedType)iter.Value; + var name = (string)iter.Key; Runtime.PyDict_SetItemString(dict, name, item.pyHandle); } // If class has constructors, generate an __doc__ attribute. - IntPtr doc = IntPtr.Zero; Type marker = typeof(DocStringAttribute); - Attribute[] attrs = (Attribute[])type.GetCustomAttributes(marker, false); + var attrs = (Attribute[])type.GetCustomAttributes(marker, false); if (attrs.Length == 0) { doc = IntPtr.Zero; } else { - DocStringAttribute attr = (DocStringAttribute)attrs[0]; + var attr = (DocStringAttribute)attrs[0]; string docStr = attr.DocString; doc = Runtime.PyString_FromString(docStr); Runtime.PyDict_SetItemString(dict, "__doc__", doc); Runtime.XDecref(doc); } - ClassObject co = impl as ClassObject; + var co = impl as ClassObject; // If this is a ClassObject AND it has constructors, generate a __doc__ attribute. // required that the ClassObject.ctors be changed to internal if (co != null) @@ -170,9 +170,9 @@ private static void InitClassBase(Type type, ClassBase impl) // Implement Overloads on the class object if (!CLRModule._SuppressOverloads) { - ConstructorBinding ctors = new ConstructorBinding(type, tp, co.binder); + var ctors = new ConstructorBinding(type, tp, co.binder); // ExtensionType types are untracked, so don't Incref() them. - // XXX deprecate __overloads__ soon... + // TODO: deprecate __overloads__ soon... Runtime.PyDict_SetItemString(dict, "__overloads__", ctors.pyHandle); Runtime.PyDict_SetItemString(dict, "Overloads", ctors.pyHandle); } @@ -186,18 +186,17 @@ private static void InitClassBase(Type type, ClassBase impl) } } } - } private static ClassInfo GetClassInfo(Type type) { - ClassInfo ci = new ClassInfo(type); - Hashtable methods = new Hashtable(); + var ci = new ClassInfo(type); + var methods = new Hashtable(); ArrayList list; MethodInfo meth; ManagedType ob; - String name; - Object item; + string name; + object item; Type tp; int i, n; @@ -207,15 +206,14 @@ private static ClassInfo GetClassInfo(Type type) // method and a class B that defines two more. The name-based // descriptor Python will find needs to know about inherited // overloads as well as those declared on the sub class. - BindingFlags flags = BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; MemberInfo[] info = type.GetMembers(flags); - Hashtable local = new Hashtable(); - ArrayList items = new ArrayList(); + var local = new Hashtable(); + var items = new ArrayList(); MemberInfo m; // Loop through once to find out which names are declared @@ -270,7 +268,7 @@ private static ClassInfo GetClassInfo(Type type) for (i = 0; i < items.Count; i++) { - MemberInfo mi = (MemberInfo)items[i]; + var mi = (MemberInfo)items[i]; switch (mi.MemberType) { @@ -278,7 +276,9 @@ private static ClassInfo GetClassInfo(Type type) meth = (MethodInfo)mi; if (!(meth.IsPublic || meth.IsFamily || meth.IsFamilyOrAssembly)) + { continue; + } name = meth.Name; item = methods[name]; if (item == null) @@ -290,7 +290,7 @@ private static ClassInfo GetClassInfo(Type type) continue; case MemberTypes.Property: - PropertyInfo pi = (PropertyInfo)mi; + var pi = (PropertyInfo)mi; MethodInfo mm = null; try @@ -314,7 +314,9 @@ private static ClassInfo GetClassInfo(Type type) } if (!(mm.IsPublic || mm.IsFamily || mm.IsFamilyOrAssembly)) + { continue; + } // Check for indexer ParameterInfo[] args = pi.GetIndexParameters(); @@ -335,18 +337,22 @@ private static ClassInfo GetClassInfo(Type type) continue; case MemberTypes.Field: - FieldInfo fi = (FieldInfo)mi; + var fi = (FieldInfo)mi; if (!(fi.IsPublic || fi.IsFamily || fi.IsFamilyOrAssembly)) + { continue; + } ob = new FieldObject(fi); ci.members[mi.Name] = ob; continue; case MemberTypes.Event: - EventInfo ei = (EventInfo)mi; + var ei = (EventInfo)mi; MethodInfo me = ei.GetAddMethod(true); if (!(me.IsPublic || me.IsFamily || me.IsFamilyOrAssembly)) + { continue; + } ob = new EventObject(ei); ci.members[ei.Name] = ob; continue; @@ -355,9 +361,11 @@ private static ClassInfo GetClassInfo(Type type) tp = (Type)mi; if (!(tp.IsNestedPublic || tp.IsNestedFamily || tp.IsNestedFamORAssem)) + { continue; + } // Note the given instance might be uninitialized - ob = ClassManager.GetClass(tp); + ob = GetClass(tp); ci.members[mi.Name] = ob; continue; } @@ -370,9 +378,7 @@ private static ClassInfo GetClassInfo(Type type) name = (string)iter.Key; list = (ArrayList)iter.Value; - MethodInfo[] mlist = (MethodInfo[])list.ToArray( - typeof(MethodInfo) - ); + var mlist = (MethodInfo[])list.ToArray(typeof(MethodInfo)); ob = new MethodObject(type, name, mlist); ci.members[name] = ob; @@ -385,13 +391,13 @@ private static ClassInfo GetClassInfo(Type type) internal class ClassInfo { + public Indexer indexer; + public Hashtable members; + internal ClassInfo(Type t) { members = new Hashtable(); indexer = null; } - - public Hashtable members; - public Indexer indexer; } } diff --git a/src/runtime/classobject.cs b/src/runtime/classobject.cs index 13eab44b0..08656aefe 100644 --- a/src/runtime/classobject.cs +++ b/src/runtime/classobject.cs @@ -19,9 +19,9 @@ internal ClassObject(Type tp) : base(tp) ctors = type.GetConstructors(); binder = new ConstructorBinder(type); - for (int i = 0; i < ctors.Length; i++) + foreach (ConstructorInfo t in ctors) { - binder.AddMethod(ctors[i]); + binder.AddMethod(t); } } @@ -33,11 +33,11 @@ internal IntPtr GetDocString() { MethodBase[] methods = binder.GetMethods(); string str = ""; - for (int i = 0; i < methods.Length; i++) + foreach (MethodBase t in methods) { if (str.Length > 0) str += Environment.NewLine; - str += methods[i].ToString(); + str += t.ToString(); } return Runtime.PyString_FromString(str); } @@ -53,7 +53,6 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) // Sanity check: this ensures a graceful error if someone does // something intentially wrong like use the managed metatype for // a class that is not really derived from a managed class. - if (self == null) { return Exceptions.RaiseTypeError("invalid object"); @@ -64,8 +63,7 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) // Primitive types do not have constructors, but they look like // they do from Python. If the ClassObject represents one of the // convertible primitive types, just convert the arg directly. - - if (type.IsPrimitive || type == typeof(String)) + if (type.IsPrimitive || type == typeof(string)) { if (Runtime.PyTuple_Size(args) != 1) { @@ -115,8 +113,7 @@ public override IntPtr type_subscript(IntPtr idx) { // If this type is the Array type, the [] means we need to // construct and return an array type of the given element type. - - if ((this.type) == typeof(Array)) + if (type == typeof(Array)) { if (Runtime.PyTuple_Check(idx)) { @@ -137,21 +134,19 @@ public override IntPtr type_subscript(IntPtr idx) // If there are generics in our namespace with the same base name // as the current type, then [] means the caller wants to // bind the generic type matching the given type parameters. - Type[] types = Runtime.PythonArgsToTypeArray(idx); if (types == null) { return Exceptions.RaiseTypeError("type(s) expected"); } - string gname = this.type.FullName + "`" + types.Length.ToString(); - Type gtype = AssemblyManager.LookupType(gname); + Type gtype = AssemblyManager.LookupType($"{type.FullName}`{types.Length}"); if (gtype != null) { - GenericType g = ClassManager.GetClass(gtype) as GenericType; + var g = ClassManager.GetClass(gtype) as GenericType; return g.type_subscript(idx); - /*Runtime.XIncref(g.pyHandle); - return g.pyHandle;*/ + //Runtime.XIncref(g.pyHandle); + //return g.pyHandle; } return Exceptions.RaiseTypeError("unsubscriptable object"); } @@ -175,7 +170,6 @@ public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) // Arg may be a tuple in the case of an indexer with multiple // parameters. If so, use it directly, else make a new tuple // with the index arg (method binders expect arg tuples). - IntPtr args = idx; bool free = false; @@ -187,7 +181,7 @@ public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) free = true; } - IntPtr value = IntPtr.Zero; + IntPtr value; try { @@ -296,7 +290,7 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) IntPtr tp = Runtime.PyObject_TYPE(ob); ClassBase cb = (ClassBase)GetManagedObject(tp); - if (cb.type != typeof(System.Delegate)) + if (cb.type != typeof(Delegate)) { Exceptions.SetError(Exceptions.TypeError, "object is not callable"); return IntPtr.Zero; diff --git a/src/runtime/codegenerator.cs b/src/runtime/codegenerator.cs index 4620b0f0c..56bed758f 100644 --- a/src/runtime/codegenerator.cs +++ b/src/runtime/codegenerator.cs @@ -1,7 +1,7 @@ using System; -using System.Threading; using System.Reflection; using System.Reflection.Emit; +using System.Threading; namespace Python.Runtime { diff --git a/src/runtime/constructorbinding.cs b/src/runtime/constructorbinding.cs index ea48f97ce..295faaa7e 100644 --- a/src/runtime/constructorbinding.cs +++ b/src/runtime/constructorbinding.cs @@ -10,13 +10,13 @@ namespace Python.Runtime /// /// ClassManager stores a ConstructorBinding instance in the class's __dict__['Overloads'] /// SomeType.Overloads[Type, ...] works like this: - /// 1) Python retreives the Overloads attribute from this ClassObject's dictionary normally + /// 1) Python retrieves the Overloads attribute from this ClassObject's dictionary normally /// and finds a non-null tp_descr_get slot which is called by the interpreter /// and returns an IncRef()ed pyHandle to itself. /// 2) The ConstructorBinding object handles the [] syntax in its mp_subscript by matching - /// the Type object parameters to a contructor overload using Type.GetConstructor() + /// the Type object parameters to a constructor overload using Type.GetConstructor() /// [NOTE: I don't know why method overloads are not searched the same way.] - /// and creating the BoundContructor oject which contains ContructorInfo object. + /// and creating the BoundContructor object which contains ContructorInfo object. /// 3) In tp_call, if ctorInfo is not null, ctorBinder.InvokeRaw() is called. /// internal class ConstructorBinding : ExtensionType @@ -26,7 +26,7 @@ internal class ConstructorBinding : ExtensionType ConstructorBinder ctorBinder; IntPtr repr; - public ConstructorBinding(Type type, IntPtr pyTypeHndl, ConstructorBinder ctorBinder) : base() + public ConstructorBinding(Type type, IntPtr pyTypeHndl, ConstructorBinder ctorBinder) { this.type = type; Runtime.XIncref(pyTypeHndl); @@ -62,7 +62,7 @@ public ConstructorBinding(Type type, IntPtr pyTypeHndl, ConstructorBinder ctorBi /// public static IntPtr tp_descr_get(IntPtr op, IntPtr instance, IntPtr owner) { - ConstructorBinding self = (ConstructorBinding)GetManagedObject(op); + var self = (ConstructorBinding)GetManagedObject(op); if (self == null) { return IntPtr.Zero; @@ -92,7 +92,7 @@ public static IntPtr tp_descr_get(IntPtr op, IntPtr instance, IntPtr owner) /// public static IntPtr mp_subscript(IntPtr op, IntPtr key) { - ConstructorBinding self = (ConstructorBinding)GetManagedObject(op); + var self = (ConstructorBinding)GetManagedObject(op); Type[] types = Runtime.PythonArgsToTypeArray(key); if (types == null) @@ -104,12 +104,12 @@ public static IntPtr mp_subscript(IntPtr op, IntPtr key) ConstructorInfo ci = self.type.GetConstructor(types); if (ci == null) { - string msg = "No match found for constructor signature"; + var msg = "No match found for constructor signature"; return Exceptions.RaiseTypeError(msg); } - BoundContructor boundCtor = new BoundContructor(self.type, self.pyTypeHndl, self.ctorBinder, ci); + var boundCtor = new BoundContructor(self.type, self.pyTypeHndl, self.ctorBinder, ci); - /* Since nothing's chached, do we need the increment??? + /* Since nothing is cached, do we need the increment??? Runtime.XIncref(boundCtor.pyHandle); // Decref'd by the interpreter??? */ return boundCtor.pyHandle; } @@ -119,7 +119,7 @@ public static IntPtr mp_subscript(IntPtr op, IntPtr key) /// public static IntPtr tp_repr(IntPtr ob) { - ConstructorBinding self = (ConstructorBinding)GetManagedObject(ob); + var self = (ConstructorBinding)GetManagedObject(ob); if (self.repr != IntPtr.Zero) { Runtime.XIncref(self.repr); @@ -127,14 +127,16 @@ public static IntPtr tp_repr(IntPtr ob) } MethodBase[] methods = self.ctorBinder.GetMethods(); string name = self.type.FullName; - string doc = ""; - for (int i = 0; i < methods.Length; i++) + var doc = ""; + foreach (MethodBase t in methods) { if (doc.Length > 0) + { doc += "\n"; - string str = methods[i].ToString(); + } + string str = t.ToString(); int idx = str.IndexOf("("); - doc += String.Format("{0}{1}", name, str.Substring(idx)); + doc += string.Format("{0}{1}", name, str.Substring(idx)); } self.repr = Runtime.PyString_FromString(doc); Runtime.XIncref(self.repr); @@ -144,9 +146,9 @@ public static IntPtr tp_repr(IntPtr ob) /// /// ConstructorBinding dealloc implementation. /// - public static new void tp_dealloc(IntPtr ob) + public new static void tp_dealloc(IntPtr ob) { - ConstructorBinding self = (ConstructorBinding)GetManagedObject(ob); + var self = (ConstructorBinding)GetManagedObject(ob); Runtime.XDecref(self.repr); Runtime.XDecref(self.pyTypeHndl); ExtensionType.FinalizeObject(self); @@ -154,7 +156,7 @@ public static IntPtr tp_repr(IntPtr ob) } /// - /// Implements a Python type that constucts the given Type given a particular ContructorInfo. + /// Implements a Python type that constructs the given Type given a particular ContructorInfo. /// /// /// Here mostly because I wanted a new __repr__ function for the selected constructor. @@ -169,7 +171,7 @@ internal class BoundContructor : ExtensionType ConstructorInfo ctorInfo; IntPtr repr; - public BoundContructor(Type type, IntPtr pyTypeHndl, ConstructorBinder ctorBinder, ConstructorInfo ci) : base() + public BoundContructor(Type type, IntPtr pyTypeHndl, ConstructorBinder ctorBinder, ConstructorInfo ci) { this.type = type; Runtime.XIncref(pyTypeHndl); @@ -188,7 +190,7 @@ public BoundContructor(Type type, IntPtr pyTypeHndl, ConstructorBinder ctorBinde /// A reference to a new instance of the class by invoking the selected ctor(). public static IntPtr tp_call(IntPtr op, IntPtr args, IntPtr kw) { - BoundContructor self = (BoundContructor)GetManagedObject(op); + var self = (BoundContructor)GetManagedObject(op); // Even though a call with null ctorInfo just produces the old behavior /*if (self.ctorInfo == null) { string msg = "Usage: Class.Overloads[CLR_or_python_Type, ...]"; @@ -196,7 +198,7 @@ public static IntPtr tp_call(IntPtr op, IntPtr args, IntPtr kw) }*/ // Bind using ConstructorBinder.Bind and invoke the ctor providing a null instancePtr // which will fire self.ctorInfo using ConstructorInfo.Invoke(). - Object obj = self.ctorBinder.InvokeRaw(IntPtr.Zero, args, kw, self.ctorInfo); + object obj = self.ctorBinder.InvokeRaw(IntPtr.Zero, args, kw, self.ctorInfo); if (obj == null) { // XXX set an error @@ -212,7 +214,7 @@ public static IntPtr tp_call(IntPtr op, IntPtr args, IntPtr kw) /// public static IntPtr tp_repr(IntPtr ob) { - BoundContructor self = (BoundContructor)GetManagedObject(ob); + var self = (BoundContructor)GetManagedObject(ob); if (self.repr != IntPtr.Zero) { Runtime.XIncref(self.repr); @@ -221,7 +223,7 @@ public static IntPtr tp_repr(IntPtr ob) string name = self.type.FullName; string str = self.ctorInfo.ToString(); int idx = str.IndexOf("("); - str = String.Format("returns a new {0}{1}", name, str.Substring(idx)); + str = string.Format("returns a new {0}{1}", name, str.Substring(idx)); self.repr = Runtime.PyString_FromString(str); Runtime.XIncref(self.repr); return self.repr; @@ -230,12 +232,12 @@ public static IntPtr tp_repr(IntPtr ob) /// /// ConstructorBinding dealloc implementation. /// - public static new void tp_dealloc(IntPtr ob) + public new static void tp_dealloc(IntPtr ob) { - BoundContructor self = (BoundContructor)GetManagedObject(ob); + var self = (BoundContructor)GetManagedObject(ob); Runtime.XDecref(self.repr); Runtime.XDecref(self.pyTypeHndl); - ExtensionType.FinalizeObject(self); + FinalizeObject(self); } } } diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index 697d84858..5e292e82d 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -436,7 +436,7 @@ static bool ToPrimitive(IntPtr value, Type obType, out Object result, bool setEr case TypeCode.Int32: #if PYTHON2 // Trickery to support 64-bit platforms. - if (IntPtr.Size == 4) + if (Runtime.is32bit) { op = Runtime.PyNumber_Int(value); @@ -612,14 +612,14 @@ static bool ToPrimitive(IntPtr value, Type obType, out Object result, bool setEr if (Runtime.PyUnicode_GetSize(value) == 1) { op = Runtime.PyUnicode_AS_UNICODE(value); -#if !UCS4 +#if UCS2 // 2011-01-02: Marshal as character array because the cast // result = (char)Marshal.ReadInt16(op); throws an OverflowException // on negative numbers with Check Overflow option set on the project Char[] buff = new Char[1]; Marshal.Copy(op, buff, 0, 1); result = buff[0]; -#else +#elif UCS4 // XXX this is probably NOT correct? result = (char)Marshal.ReadInt32(op); #endif diff --git a/src/runtime/debughelper.cs b/src/runtime/debughelper.cs index f42ad2e37..777a61e35 100644 --- a/src/runtime/debughelper.cs +++ b/src/runtime/debughelper.cs @@ -1,7 +1,7 @@ using System; +using System.Diagnostics; using System.Reflection; using System.Runtime.InteropServices; -using System.Diagnostics; using System.Threading; namespace Python.Runtime @@ -9,7 +9,7 @@ namespace Python.Runtime /// /// Debugging helper utilities. /// The methods are only executed when the DEBUG flag is set. Otherwise - /// they are automagically hidden by the compiler and silently surpressed. + /// they are automagically hidden by the compiler and silently suppressed. /// internal class DebugUtil { diff --git a/src/runtime/delegatemanager.cs b/src/runtime/delegatemanager.cs index 0a29b8e13..ce17a2e6e 100644 --- a/src/runtime/delegatemanager.cs +++ b/src/runtime/delegatemanager.cs @@ -1,7 +1,4 @@ using System; -using System.Threading; -using System.Runtime.InteropServices; -using System.Runtime.CompilerServices; using System.Collections; using System.Reflection; using System.Reflection.Emit; @@ -40,9 +37,9 @@ public DelegateManager() /// public IntPtr GetPythonHandle(Delegate d) { - if ((d != null) && (d.Target is Dispatcher)) + if (d?.Target is Dispatcher) { - Dispatcher disp = d.Target as Dispatcher; + var disp = (Dispatcher)d.Target; return disp.target; } return IntPtr.Zero; @@ -61,25 +58,24 @@ private Type GetDispatcher(Type dtype) // unique signatures rather than delegate types, since multiple // delegate types with the same sig could use the same dispatcher. - Object item = cache[dtype]; + object item = cache[dtype]; if (item != null) { return (Type)item; } - string name = "__" + dtype.FullName + "Dispatcher"; + string name = $"__{dtype.FullName}Dispatcher"; name = name.Replace('.', '_'); name = name.Replace('+', '_'); TypeBuilder tb = codeGenerator.DefineType(name, basetype); // Generate a constructor for the generated type that calls the // appropriate constructor of the Dispatcher base type. - MethodAttributes ma = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName; - CallingConventions cc = CallingConventions.Standard; + var cc = CallingConventions.Standard; Type[] args = { ptrtype, typetype }; ConstructorBuilder cb = tb.DefineConstructor(ma, cc, args); ConstructorInfo ci = basetype.GetConstructor(args); @@ -96,12 +92,11 @@ private Type GetDispatcher(Type dtype) // arguments and hands them to the Dispatch() method, which deals // with converting the arguments, calling the Python method and // converting the result of the call. - MethodInfo method = dtype.GetMethod("Invoke"); ParameterInfo[] pi = method.GetParameters(); - Type[] signature = new Type[pi.Length]; - for (int i = 0; i < pi.Length; i++) + var signature = new Type[pi.Length]; + for (var i = 0; i < pi.Length; i++) { signature[i] = pi[i].ParameterType; } @@ -117,7 +112,7 @@ private Type GetDispatcher(Type dtype) il.Emit(OpCodes.Newobj, ctor); il.Emit(OpCodes.Stloc_0); - for (int c = 0; c < signature.Length; c++) + for (var c = 0; c < signature.Length; c++) { Type t = signature[c]; il.Emit(OpCodes.Ldloc_0); @@ -184,10 +179,7 @@ A possible alternate strategy would be to create custom subclasses of the required delegate type, storing the IntPtr in it directly. This would be slightly cleaner, but I'm not sure if delegates are too "special" for this to work. It would be more work, so for now - the 80/20 rule applies :) - - */ - + the 80/20 rule applies :) */ public class Dispatcher { public IntPtr target; @@ -238,7 +230,7 @@ public object TrueDispatch(ArrayList args) IntPtr pyargs = Runtime.PyTuple_New(pi.Length); Type rtype = method.ReturnType; - for (int i = 0; i < pi.Length; i++) + for (var i = 0; i < pi.Length; i++) { // Here we own the reference to the Python value, and we // give the ownership to the arg tuple. @@ -251,7 +243,7 @@ public object TrueDispatch(ArrayList args) if (op == IntPtr.Zero) { - PythonException e = new PythonException(); + var e = new PythonException(); throw e; } @@ -260,12 +252,11 @@ public object TrueDispatch(ArrayList args) return null; } - Object result = null; + object result = null; if (!Converter.ToManaged(op, rtype, out result, false)) { - string s = "could not convert Python result to " + rtype.ToString(); Runtime.XDecref(op); - throw new ConversionException(s); + throw new ConversionException($"could not convert Python result to {rtype}"); } Runtime.XDecref(op); @@ -274,9 +265,9 @@ public object TrueDispatch(ArrayList args) } - public class ConversionException : System.Exception + public class ConversionException : Exception { - public ConversionException() : base() + public ConversionException() { } diff --git a/src/runtime/delegateobject.cs b/src/runtime/delegateobject.cs index ff64ff094..bf9ddea16 100644 --- a/src/runtime/delegateobject.cs +++ b/src/runtime/delegateobject.cs @@ -1,6 +1,4 @@ using System; -using System.Reflection; -using System.Runtime.InteropServices; namespace Python.Runtime { @@ -55,8 +53,7 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) if (Runtime.PyTuple_Size(args) != 1) { - var message = "class takes exactly one argument"; - return Exceptions.RaiseTypeError(message); + return Exceptions.RaiseTypeError("class takes exactly one argument"); } IntPtr method = Runtime.PyTuple_GetItem(args, 0); @@ -76,7 +73,7 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) /// public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) { - // todo: add fast type check! + // TODO: add fast type check! IntPtr pytype = Runtime.PyObject_TYPE(ob); var self = (DelegateObject)GetManagedObject(pytype); var o = GetManagedObject(ob) as CLRObject; @@ -99,8 +96,8 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) /// /// Implements __cmp__ for reflected delegate types. /// -#if PYTHON3 - public static new IntPtr tp_richcompare(IntPtr ob, IntPtr other, int op) +#if PYTHON3 // TODO: Doesn't PY2 implement tp_richcompare too? + public new static IntPtr tp_richcompare(IntPtr ob, IntPtr other, int op) { if (op != Runtime.Py_EQ && op != Runtime.Py_NE) { @@ -130,15 +127,11 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) return pyfalse; } #elif PYTHON2 - public static new int tp_compare(IntPtr ob, IntPtr other) + public static int tp_compare(IntPtr ob, IntPtr other) { Delegate d1 = GetTrueDelegate(ob); Delegate d2 = GetTrueDelegate(other); - if (d1 == d2) - { - return 0; - } - return -1; + return d1 == d2 ? 0 : -1; } #endif } diff --git a/src/runtime/eventbinding.cs b/src/runtime/eventbinding.cs index b31286b4c..552472430 100644 --- a/src/runtime/eventbinding.cs +++ b/src/runtime/eventbinding.cs @@ -10,7 +10,7 @@ internal class EventBinding : ExtensionType EventObject e; IntPtr target; - public EventBinding(EventObject e, IntPtr target) : base() + public EventBinding(EventObject e, IntPtr target) { Runtime.XIncref(target); this.target = target; @@ -23,7 +23,7 @@ public EventBinding(EventObject e, IntPtr target) : base() /// public static IntPtr nb_inplace_add(IntPtr ob, IntPtr arg) { - EventBinding self = (EventBinding)GetManagedObject(ob); + var self = (EventBinding)GetManagedObject(ob); if (Runtime.PyCallable_Check(arg) < 1) { @@ -46,7 +46,7 @@ public static IntPtr nb_inplace_add(IntPtr ob, IntPtr arg) /// public static IntPtr nb_inplace_subtract(IntPtr ob, IntPtr arg) { - EventBinding self = (EventBinding)GetManagedObject(ob); + var self = (EventBinding)GetManagedObject(ob); if (Runtime.PyCallable_Check(arg) < 1) { @@ -69,7 +69,7 @@ public static IntPtr nb_inplace_subtract(IntPtr ob, IntPtr arg) /// public static IntPtr tp_hash(IntPtr ob) { - EventBinding self = (EventBinding)GetManagedObject(ob); + var self = (EventBinding)GetManagedObject(ob); long x = 0; long y = 0; @@ -104,9 +104,9 @@ public static IntPtr tp_hash(IntPtr ob) /// public static IntPtr tp_repr(IntPtr ob) { - EventBinding self = (EventBinding)GetManagedObject(ob); - string type = (self.target == IntPtr.Zero) ? "unbound" : "bound"; - string s = String.Format("<{0} event '{1}'>", type, self.e.name); + var self = (EventBinding)GetManagedObject(ob); + string type = self.target == IntPtr.Zero ? "unbound" : "bound"; + string s = string.Format("<{0} event '{1}'>", type, self.e.name); return Runtime.PyString_FromString(s); } @@ -114,9 +114,9 @@ public static IntPtr tp_repr(IntPtr ob) /// /// EventBinding dealloc implementation. /// - public static new void tp_dealloc(IntPtr ob) + public new static void tp_dealloc(IntPtr ob) { - EventBinding self = (EventBinding)GetManagedObject(ob); + var self = (EventBinding)GetManagedObject(ob); Runtime.XDecref(self.target); ExtensionType.FinalizeObject(self); } diff --git a/src/runtime/eventobject.cs b/src/runtime/eventobject.cs index 8ac0ed3ac..5f18c4609 100644 --- a/src/runtime/eventobject.cs +++ b/src/runtime/eventobject.cs @@ -14,7 +14,7 @@ internal class EventObject : ExtensionType internal EventInfo info; internal Hashtable reg; - public EventObject(EventInfo info) : base() + public EventObject(EventInfo info) { this.name = info.Name; this.info = info; @@ -26,31 +26,29 @@ public EventObject(EventInfo info) : base() /// internal bool AddEventHandler(IntPtr target, IntPtr handler) { - Object obj = null; + object obj = null; if (target != IntPtr.Zero) { - CLRObject co = (CLRObject)ManagedType.GetManagedObject(target); + var co = (CLRObject)GetManagedObject(target); obj = co.inst; } // Create a true delegate instance of the appropriate type to // wrap the Python handler. Note that wrapper delegate creation // always succeeds, though calling the wrapper may fail. - - Type type = this.info.EventHandlerType; + Type type = info.EventHandlerType; Delegate d = PythonEngine.DelegateManager.GetDelegate(type, handler); // Now register the handler in a mapping from instance to pairs // of (handler hash, delegate) so we can lookup to remove later. // All this is done lazily to avoid overhead until an event is // actually subscribed to by a Python event handler. - if (reg == null) { reg = new Hashtable(); } - object key = (obj != null) ? obj : this.info.ReflectedType; - ArrayList list = reg[key] as ArrayList; + object key = obj ?? info.ReflectedType; + var list = reg[key] as ArrayList; if (list == null) { list = new ArrayList(); @@ -60,9 +58,8 @@ internal bool AddEventHandler(IntPtr target, IntPtr handler) // Note that AddEventHandler helper only works for public events, // so we have to get the underlying add method explicitly. - object[] args = { d }; - MethodInfo mi = this.info.GetAddMethod(true); + MethodInfo mi = info.GetAddMethod(true); mi.Invoke(obj, BindingFlags.Default, null, args, null); return true; @@ -74,22 +71,22 @@ internal bool AddEventHandler(IntPtr target, IntPtr handler) /// internal bool RemoveEventHandler(IntPtr target, IntPtr handler) { - Object obj = null; + object obj = null; if (target != IntPtr.Zero) { - CLRObject co = (CLRObject)ManagedType.GetManagedObject(target); + var co = (CLRObject)GetManagedObject(target); obj = co.inst; } IntPtr hash = Runtime.PyObject_Hash(handler); - if (Exceptions.ErrorOccurred() || (reg == null)) + if (Exceptions.ErrorOccurred() || reg == null) { Exceptions.SetError(Exceptions.ValueError, "unknown event handler"); return false; } - object key = (obj != null) ? obj : this.info.ReflectedType; - ArrayList list = reg[key] as ArrayList; + object key = obj ?? info.ReflectedType; + var list = reg[key] as ArrayList; if (list == null) { @@ -98,11 +95,11 @@ internal bool RemoveEventHandler(IntPtr target, IntPtr handler) } object[] args = { null }; - MethodInfo mi = this.info.GetRemoveMethod(true); + MethodInfo mi = info.GetRemoveMethod(true); - for (int i = 0; i < list.Count; i++) + for (var i = 0; i < list.Count; i++) { - Handler item = (Handler)list[i]; + var item = (Handler)list[i]; if (item.hash != hash) { continue; @@ -131,7 +128,7 @@ internal bool RemoveEventHandler(IntPtr target, IntPtr handler) /// public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) { - EventObject self = GetManagedObject(ds) as EventObject; + var self = GetManagedObject(ds) as EventObject; EventBinding binding; if (self == null) @@ -171,17 +168,16 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) /// 'ob.SomeEvent += method', Python will attempt to set the attribute /// SomeEvent on ob to the result of the '+=' operation. /// - public static new int tp_descr_set(IntPtr ds, IntPtr ob, IntPtr val) + public new static int tp_descr_set(IntPtr ds, IntPtr ob, IntPtr val) { - EventBinding e = GetManagedObject(val) as EventBinding; + var e = GetManagedObject(val) as EventBinding; if (e != null) { return 0; } - string message = "cannot set event attributes"; - Exceptions.RaiseTypeError(message); + Exceptions.RaiseTypeError("cannot set event attributes"); return -1; } @@ -191,23 +187,22 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) /// public static IntPtr tp_repr(IntPtr ob) { - EventObject self = (EventObject)GetManagedObject(ob); - string s = String.Format("", self.name); - return Runtime.PyString_FromString(s); + var self = (EventObject)GetManagedObject(ob); + return Runtime.PyString_FromString($""); } /// /// Descriptor dealloc implementation. /// - public static new void tp_dealloc(IntPtr ob) + public new static void tp_dealloc(IntPtr ob) { - EventObject self = (EventObject)GetManagedObject(ob); + var self = (EventObject)GetManagedObject(ob); if (self.unbound != null) { Runtime.XDecref(self.unbound.pyHandle); } - ExtensionType.FinalizeObject(self); + FinalizeObject(self); } } diff --git a/src/runtime/exceptions.cs b/src/runtime/exceptions.cs index 33d5d2ecd..dbdd9a67b 100644 --- a/src/runtime/exceptions.cs +++ b/src/runtime/exceptions.cs @@ -1,6 +1,5 @@ using System; using System.Reflection; -using System.Collections; using System.Runtime.InteropServices; @@ -25,12 +24,12 @@ internal ExceptionClassObject(Type tp) : base(tp) internal static Exception ToException(IntPtr ob) { - CLRObject co = GetManagedObject(ob) as CLRObject; + var co = GetManagedObject(ob) as CLRObject; if (co == null) { return null; } - Exception e = co.inst as Exception; + var e = co.inst as Exception; if (e == null) { return null; @@ -49,8 +48,8 @@ internal static Exception ToException(IntPtr ob) return Exceptions.RaiseTypeError("invalid object"); } - string message = String.Empty; - if (e.Message != String.Empty) + string message = string.Empty; + if (e.Message != string.Empty) { message = e.Message; } @@ -102,7 +101,7 @@ internal static void Initialize() else { fi.SetValue(type, IntPtr.Zero); - DebugUtil.Print("Unknown exception: " + fi.Name); + DebugUtil.Print($"Unknown exception: {fi.Name}"); } } Runtime.PyErr_Clear(); @@ -114,13 +113,13 @@ internal static void Initialize() /// internal static void Shutdown() { - if (0 != Runtime.Py_IsInitialized()) + if (Runtime.Py_IsInitialized() != 0) { Type type = typeof(Exceptions); foreach (FieldInfo fi in type.GetFields(BindingFlags.Public | BindingFlags.Static)) { - IntPtr op = (IntPtr)fi.GetValue(type); + var op = (IntPtr)fi.GetValue(type); if (op != IntPtr.Zero) { Runtime.XDecref(op); @@ -143,15 +142,17 @@ internal static void Shutdown() /// The python object wrapping internal static void SetArgsAndCause(IntPtr ob) { - var e = ExceptionClassObject.ToException(ob); + Exception e = ExceptionClassObject.ToException(ob); if (e == null) + { return; + } IntPtr args; if (!string.IsNullOrEmpty(e.Message)) { args = Runtime.PyTuple_New(1); - var msg = Runtime.PyUnicode_FromString(e.Message); + IntPtr msg = Runtime.PyUnicode_FromString(e.Message); Runtime.PyTuple_SetItem(args, 0, msg); } else @@ -171,7 +172,7 @@ internal static void SetArgsAndCause(IntPtr ob) } /// - /// Shortcut for (pointer == NULL) -> throw PythonException + /// Shortcut for (pointer == NULL) -> throw PythonException /// /// Pointer to a Python object internal unsafe static void ErrorCheck(IntPtr pointer) @@ -187,7 +188,7 @@ internal unsafe static void ErrorCheck(IntPtr pointer) /// internal unsafe static void ErrorOccurredCheck(IntPtr pointer) { - if ((pointer == IntPtr.Zero) || Exceptions.ErrorOccurred()) + if (pointer == IntPtr.Zero || ErrorOccurred()) { throw new PythonException(); } @@ -215,7 +216,7 @@ public static bool ExceptionMatches(IntPtr ob) public static bool ExceptionMatches(IntPtr exc, IntPtr ob) { int i = Runtime.PyErr_GivenExceptionMatches(exc, ob); - return (i != 0); + return i != 0; } /// @@ -252,12 +253,12 @@ public static void SetError(IntPtr ob, IntPtr value) /// public static void SetError(Exception e) { - // Because delegates allow arbitrary nestings of Python calling + // Because delegates allow arbitrary nesting of Python calling // managed calling Python calling... etc. it is possible that we // might get a managed exception raised that is a wrapper for a // Python exception. In that case we'd rather have the real thing. - PythonException pe = e as PythonException; + var pe = e as PythonException; if (pe != null) { Runtime.PyErr_SetObject(pe.PyType, pe.PyValue); @@ -303,7 +304,7 @@ public static void Clear() /// public static void warn(string message, IntPtr exception, int stacklevel) { - if ((exception == IntPtr.Zero) || + if (exception == IntPtr.Zero || (Runtime.PyObject_IsSubclass(exception, Exceptions.Warning) != 1)) { Exceptions.RaiseTypeError("Invalid exception"); diff --git a/src/runtime/extensiontype.cs b/src/runtime/extensiontype.cs index 37ab11239..9569b0485 100644 --- a/src/runtime/extensiontype.cs +++ b/src/runtime/extensiontype.cs @@ -6,14 +6,14 @@ namespace Python.Runtime /// /// Base class for extensions whose instances *share* a single Python /// type object, such as the types that represent CLR methods, fields, - /// etc. Instances implemented by this class do not support subtyping. + /// etc. Instances implemented by this class do not support sub-typing. /// internal abstract class ExtensionType : ManagedType { public ExtensionType() { // Create a new PyObject whose type is a generated type that is - // implemented by the particuar concrete ExtensionType subclass. + // implemented by the particular concrete ExtensionType subclass. // The Python instance object is related to an instance of a // particular concrete subclass with a hidden CLR gchandle. diff --git a/src/runtime/genericutil.cs b/src/runtime/genericutil.cs index d1de1c374..57f28cdc0 100644 --- a/src/runtime/genericutil.cs +++ b/src/runtime/genericutil.cs @@ -1,9 +1,5 @@ using System; -using System.Runtime.InteropServices; using System.Collections.Generic; -using System.Collections; -using System.Reflection; -using System.Security; namespace Python.Runtime { @@ -150,11 +146,7 @@ public static string GenericNameForBaseName(string ns, string name) } List gnames = null; nsmap.TryGetValue(name, out gnames); - if (gnames == null) - { - return null; - } - if (gnames.Count > 0) + if (gnames?.Count > 0) { return gnames[0]; } diff --git a/src/runtime/importhook.cs b/src/runtime/importhook.cs index 96a343773..df3877c29 100644 --- a/src/runtime/importhook.cs +++ b/src/runtime/importhook.cs @@ -1,5 +1,4 @@ using System; -using System.Collections; using System.Runtime.InteropServices; namespace Python.Runtime @@ -20,7 +19,9 @@ internal class ImportHook internal static void InitializeModuleDef() { if (module_def == IntPtr.Zero) + { module_def = ModuleDefOffset.AllocModuleDef("clr"); + } } #endif @@ -100,26 +101,32 @@ public static IntPtr GetCLRModule(IntPtr? fromList = null) if (Runtime.PyTuple_Check(fromList.GetValueOrDefault())) { Runtime.XIncref(py_mod_dict); - using (PyDict mod_dict = new PyDict(py_mod_dict)) + using (var mod_dict = new PyDict(py_mod_dict)) { Runtime.XIncref(fromList.GetValueOrDefault()); - using (PyTuple from = new PyTuple(fromList.GetValueOrDefault())) + using (var from = new PyTuple(fromList.GetValueOrDefault())) { foreach (PyObject item in from) { if (mod_dict.HasKey(item)) + { continue; + } - string s = item.AsManagedObject(typeof(string)) as string; + var s = item.AsManagedObject(typeof(string)) as string; if (s == null) + { continue; + } ManagedType attr = root.GetAttribute(s, true); if (attr == null) + { continue; + } Runtime.XIncref(attr.pyHandle); - using (PyObject obj = new PyObject(attr.pyHandle)) + using (var obj = new PyObject(attr.pyHandle)) { mod_dict.SetItem(s, obj); } @@ -208,8 +215,7 @@ public static IntPtr __import__(IntPtr self, IntPtr args, IntPtr kw) { clr_prefix = "CLR."; // prepend when adding the module to sys.modules realname = mod_name.Substring(4); - string msg = string.Format("Importing from the CLR.* namespace " + - "is deprecated. Please import '{0}' directly.", realname); + string msg = $"Importing from the CLR.* namespace is deprecated. Please import '{realname}' directly."; Exceptions.deprecation(msg); } else @@ -270,7 +276,7 @@ public static IntPtr __import__(IntPtr self, IntPtr args, IntPtr kw) } // See if sys.modules for this interpreter already has the - // requested module. If so, just return the exising module. + // requested module. If so, just return the existing module. IntPtr modules = Runtime.PyImport_GetModuleDict(); IntPtr module = Runtime.PyDict_GetItem(modules, py_mod_name); @@ -310,8 +316,7 @@ public static IntPtr __import__(IntPtr self, IntPtr args, IntPtr kw) ManagedType mt = tail.GetAttribute(name, true); if (!(mt is ModuleObject)) { - string error = string.Format("No module named {0}", name); - Exceptions.SetError(Exceptions.ImportError, error); + Exceptions.SetError(Exceptions.ImportError, $"No module named {name}"); return IntPtr.Zero; } if (head == null) diff --git a/src/runtime/indexer.cs b/src/runtime/indexer.cs index 7f0b6fe10..7b6d90ca8 100644 --- a/src/runtime/indexer.cs +++ b/src/runtime/indexer.cs @@ -1,7 +1,5 @@ using System; -using System.Collections; using System.Reflection; -using System.Security.Permissions; namespace Python.Runtime { @@ -59,21 +57,27 @@ internal void SetItem(IntPtr inst, IntPtr args) internal bool NeedsDefaultArgs(IntPtr args) { int pynargs = Runtime.PyTuple_Size(args); - var methods = SetterBinder.GetMethods(); + MethodBase[] methods = SetterBinder.GetMethods(); if (methods.Length == 0) + { return false; + } MethodBase mi = methods[0]; ParameterInfo[] pi = mi.GetParameters(); // need to subtract one for the value int clrnargs = pi.Length - 1; if (pynargs == clrnargs || pynargs > clrnargs) + { return false; + } for (int v = pynargs; v < clrnargs; v++) { if (pi[v].DefaultValue == DBNull.Value) + { return false; + } } return true; } @@ -88,24 +92,25 @@ internal IntPtr GetDefaultArgs(IntPtr args) { // if we don't need default args return empty tuple if (!NeedsDefaultArgs(args)) + { return Runtime.PyTuple_New(0); + } int pynargs = Runtime.PyTuple_Size(args); // Get the default arg tuple - var methods = SetterBinder.GetMethods(); + MethodBase[] methods = SetterBinder.GetMethods(); MethodBase mi = methods[0]; ParameterInfo[] pi = mi.GetParameters(); int clrnargs = pi.Length - 1; IntPtr defaultArgs = Runtime.PyTuple_New(clrnargs - pynargs); - for (int i = 0; i < (clrnargs - pynargs); i++) + for (var i = 0; i < clrnargs - pynargs; i++) { if (pi[i + pynargs].DefaultValue == DBNull.Value) - continue; - else { - IntPtr arg = Converter.ToPython(pi[i + pynargs].DefaultValue, pi[i + pynargs].ParameterType); - Runtime.PyTuple_SetItem(defaultArgs, i, arg); + continue; } + IntPtr arg = Converter.ToPython(pi[i + pynargs].DefaultValue, pi[i + pynargs].ParameterType); + Runtime.PyTuple_SetItem(defaultArgs, i, arg); } return defaultArgs; } diff --git a/src/runtime/interfaceobject.cs b/src/runtime/interfaceobject.cs index e1c816f01..2085feac8 100644 --- a/src/runtime/interfaceobject.cs +++ b/src/runtime/interfaceobject.cs @@ -47,8 +47,7 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) if (co == null || !type.IsInstanceOfType(co.inst)) { - string msg = "object does not implement " + type.Name; - Exceptions.SetError(Exceptions.TypeError, msg); + Exceptions.SetError(Exceptions.TypeError, $"object does not implement {type.Name}"); return IntPtr.Zero; } diff --git a/src/runtime/metatype.cs b/src/runtime/metatype.cs index 6701a2a07..64c47b63e 100644 --- a/src/runtime/metatype.cs +++ b/src/runtime/metatype.cs @@ -1,7 +1,5 @@ using System; using System.Runtime.InteropServices; -using System.Collections; -using System.Reflection; namespace Python.Runtime { @@ -54,7 +52,7 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) IntPtr base_type = Runtime.PyTuple_GetItem(bases, 0); IntPtr mt = Runtime.PyObject_TYPE(base_type); - if (!((mt == PyCLRMetaType) || (mt == Runtime.PyTypeType))) + if (!(mt == PyCLRMetaType || mt == Runtime.PyTypeType)) { return Exceptions.RaiseTypeError("invalid metatype"); } @@ -62,7 +60,7 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) // Ensure that the reflected type is appropriate for subclassing, // disallowing subclassing of delegates, enums and array types. - ClassBase cb = GetManagedObject(base_type) as ClassBase; + var cb = GetManagedObject(base_type) as ClassBase; if (cb != null) { if (!cb.CanSubclass()) @@ -84,10 +82,12 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) if (IntPtr.Zero != dict) { Runtime.XIncref(dict); - using (PyDict clsDict = new PyDict(dict)) + using (var clsDict = new PyDict(dict)) { if (clsDict.HasKey("__assembly__") || clsDict.HasKey("__namespace__")) + { return TypeManager.CreateSubType(name, base_type, dict); + } } } @@ -141,7 +141,7 @@ public static void tp_free(IntPtr tp) /// /// Metatype __call__ implementation. This is needed to ensure correct /// initialization (__init__ support), because the tp_call we inherit - /// from PyType_Type won't call __init__ for metatypes it doesnt know. + /// from PyType_Type won't call __init__ for metatypes it doesn't know. /// public static IntPtr tp_call(IntPtr tp, IntPtr args, IntPtr kw) { @@ -206,22 +206,19 @@ public static int tp_setattro(IntPtr tp, IntPtr name, IntPtr value) if (dt == Runtime.PyWrapperDescriptorType || dt == Runtime.PyMethodType || typeof(ExtensionType).IsInstanceOfType(GetManagedObject(descr)) - ) + ) { IntPtr fp = Marshal.ReadIntPtr(dt, TypeOffset.tp_descr_set); if (fp != IntPtr.Zero) { return NativeCall.Impl.Int_Call_3(fp, descr, name, value); } - else - { - Exceptions.SetError(Exceptions.AttributeError, "attribute is read-only"); - return -1; - } + Exceptions.SetError(Exceptions.AttributeError, "attribute is read-only"); + return -1; } } - var res = Runtime.PyObject_GenericSetAttr(tp, name, value); + int res = Runtime.PyObject_GenericSetAttr(tp, name, value); Runtime.PyType_Modified(tp); return res; @@ -234,7 +231,7 @@ public static int tp_setattro(IntPtr tp, IntPtr name, IntPtr value) /// public static IntPtr mp_subscript(IntPtr tp, IntPtr idx) { - ClassBase cb = GetManagedObject(tp) as ClassBase; + var cb = GetManagedObject(tp) as ClassBase; if (cb != null) { return cb.type_subscript(idx); @@ -250,7 +247,7 @@ public static void tp_dealloc(IntPtr tp) { // Fix this when we dont cheat on the handle for subclasses! - int flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags); + var flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags); if ((flags & TypeFlags.Subclass) == 0) { IntPtr gc = Marshal.ReadIntPtr(tp, TypeOffset.magic()); @@ -267,13 +264,11 @@ public static void tp_dealloc(IntPtr tp) op = Marshal.ReadIntPtr(Runtime.PyTypeType, TypeOffset.tp_dealloc); NativeCall.Void_Call_1(op, tp); - - return; } static IntPtr DoInstanceCheck(IntPtr tp, IntPtr args, bool checkType) { - ClassBase cb = GetManagedObject(tp) as ClassBase; + var cb = GetManagedObject(tp) as ClassBase; if (cb == null) { @@ -281,17 +276,23 @@ static IntPtr DoInstanceCheck(IntPtr tp, IntPtr args, bool checkType) return Runtime.PyFalse; } - using (PyList argsObj = new PyList(args)) + using (var argsObj = new PyList(args)) { if (argsObj.Length() != 1) + { return Exceptions.RaiseTypeError("Invalid parameter count"); + } PyObject arg = argsObj[0]; PyObject otherType; if (checkType) + { otherType = arg; + } else + { otherType = arg.GetPythonType(); + } if (Runtime.PyObject_TYPE(otherType.Handle) != PyCLRMetaType) { @@ -299,7 +300,7 @@ static IntPtr DoInstanceCheck(IntPtr tp, IntPtr args, bool checkType) return Runtime.PyFalse; } - ClassBase otherCb = GetManagedObject(otherType.Handle) as ClassBase; + var otherCb = GetManagedObject(otherType.Handle) as ClassBase; if (otherCb == null) { Runtime.XIncref(Runtime.PyFalse); diff --git a/src/runtime/methodbinder.cs b/src/runtime/methodbinder.cs index 651791599..86a76dd82 100644 --- a/src/runtime/methodbinder.cs +++ b/src/runtime/methodbinder.cs @@ -19,23 +19,22 @@ internal class MethodBinder internal MethodBinder() { - this.list = new ArrayList(); + list = new ArrayList(); } - internal MethodBinder(MethodInfo mi) : base() + internal MethodBinder(MethodInfo mi) { - this.list = new ArrayList(); - this.list.Add(mi); + list = new ArrayList { mi }; } public int Count { - get { return this.list.Count; } + get { return list.Count; } } internal void AddMethod(MethodBase m) { - this.list.Add(m); + list.Add(m); } /// @@ -49,22 +48,22 @@ internal static MethodInfo MatchSignature(MethodInfo[] mi, Type[] tp) return null; } int count = tp.Length; - for (int i = 0; i < mi.Length; i++) + foreach (MethodInfo t in mi) { - ParameterInfo[] pi = mi[i].GetParameters(); + ParameterInfo[] pi = t.GetParameters(); if (pi.Length != count) { continue; } - for (int n = 0; n < pi.Length; n++) + for (var n = 0; n < pi.Length; n++) { if (tp[n] != pi[n].ParameterType) { break; } - if (n == (pi.Length - 1)) + if (n == pi.Length - 1) { - return mi[i]; + return t; } } } @@ -82,18 +81,18 @@ internal static MethodInfo MatchParameters(MethodInfo[] mi, Type[] tp) return null; } int count = tp.Length; - for (int i = 0; i < mi.Length; i++) + foreach (MethodInfo t in mi) { - if (!mi[i].IsGenericMethodDefinition) + if (!t.IsGenericMethodDefinition) { continue; } - Type[] args = mi[i].GetGenericArguments(); + Type[] args = t.GetGenericArguments(); if (args.Length != count) { continue; } - return mi[i].MakeGenericMethod(tp); + return t.MakeGenericMethod(tp); } return null; } @@ -105,39 +104,40 @@ internal static MethodInfo MatchParameters(MethodInfo[] mi, Type[] tp) /// internal static MethodInfo MatchSignatureAndParameters(MethodInfo[] mi, Type[] genericTp, Type[] sigTp) { - if ((genericTp == null) || (sigTp == null)) + if (genericTp == null || sigTp == null) { return null; } int genericCount = genericTp.Length; int signatureCount = sigTp.Length; - for (int i = 0; i < mi.Length; i++) + foreach (MethodInfo t in mi) { - if (!mi[i].IsGenericMethodDefinition) + if (!t.IsGenericMethodDefinition) { continue; } - Type[] genericArgs = mi[i].GetGenericArguments(); + Type[] genericArgs = t.GetGenericArguments(); if (genericArgs.Length != genericCount) { continue; } - ParameterInfo[] pi = mi[i].GetParameters(); + ParameterInfo[] pi = t.GetParameters(); if (pi.Length != signatureCount) { continue; } - for (int n = 0; n < pi.Length; n++) + for (var n = 0; n < pi.Length; n++) { if (sigTp[n] != pi[n].ParameterType) { break; } - if (n == (pi.Length - 1)) + if (n == pi.Length - 1) { - MethodInfo match = mi[i]; + MethodInfo match = t; if (match.IsGenericMethodDefinition) { + // FIXME: typeArgs not used Type[] typeArgs = match.GetGenericArguments(); return match.MakeGenericMethod(genericTp); } @@ -151,7 +151,7 @@ internal static MethodInfo MatchSignatureAndParameters(MethodInfo[] mi, Type[] g /// /// Return the array of MethodInfo for this method. The result array - /// is arranged in order of precendence (done lazily to avoid doing it + /// is arranged in order of precedence (done lazily to avoid doing it /// at all for methods that are never called). /// internal MethodBase[] GetMethods() @@ -176,8 +176,8 @@ internal static int GetPrecedence(MethodBase mi) int val = mi.IsStatic ? 3000 : 0; int num = pi.Length; - val += (mi.IsGenericMethod ? 1 : 0); - for (int i = 0; i < num; i++) + val += mi.IsGenericMethod ? 1 : 0; + for (var i = 0; i < num; i++) { val += ArgPrecedence(pi[i].ParameterType); } @@ -190,45 +190,78 @@ internal static int GetPrecedence(MethodBase mi) /// internal static int ArgPrecedence(Type t) { - Type objectType = typeof(Object); + Type objectType = typeof(object); if (t == objectType) + { return 3000; + } TypeCode tc = Type.GetTypeCode(t); + // TODO: Clean up if (tc == TypeCode.Object) + { return 1; + } if (tc == TypeCode.UInt64) + { return 10; + } if (tc == TypeCode.UInt32) + { return 11; + } if (tc == TypeCode.UInt16) + { return 12; + } if (tc == TypeCode.Int64) + { return 13; + } if (tc == TypeCode.Int32) + { return 14; + } if (tc == TypeCode.Int16) + { return 15; + } if (tc == TypeCode.Char) + { return 16; + } if (tc == TypeCode.SByte) + { return 17; + } if (tc == TypeCode.Byte) + { return 18; + } if (tc == TypeCode.Single) + { return 20; + } if (tc == TypeCode.Double) + { return 21; + } if (tc == TypeCode.String) + { return 30; + } if (tc == TypeCode.Boolean) + { return 40; + } if (t.IsArray) { Type e = t.GetElementType(); if (e == objectType) + { return 2500; + } return 100 + ArgPrecedence(e); } @@ -242,12 +275,12 @@ internal static int ArgPrecedence(Type t) /// internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw) { - return this.Bind(inst, args, kw, null, null); + return Bind(inst, args, kw, null, null); } internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info) { - return this.Bind(inst, args, kw, info, null); + return Bind(inst, args, kw, info, null); } internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, MethodInfo[] methodinfo) @@ -256,11 +289,11 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth MethodBase[] _methods = null; int pynargs = Runtime.PyTuple_Size(args); object arg; - bool isGeneric = false; + var isGeneric = false; ArrayList defaultArgList = null; if (info != null) { - _methods = (MethodBase[])Array.CreateInstance(typeof(MethodBase), 1); + _methods = new MethodBase[1]; _methods.SetValue(info, 0); } else @@ -268,19 +301,18 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth _methods = GetMethods(); } Type clrtype; - for (int i = 0; i < _methods.Length; i++) + // TODO: Clean up + foreach (MethodBase mi in _methods) { - MethodBase mi = _methods[i]; - if (mi.IsGenericMethod) { isGeneric = true; } ParameterInfo[] pi = mi.GetParameters(); int clrnargs = pi.Length; - bool match = false; + var match = false; int arrayStart = -1; - int outs = 0; + var outs = 0; if (pynargs == clrnargs) { @@ -293,12 +325,16 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth for (int v = pynargs; v < clrnargs; v++) { if (pi[v].DefaultValue == DBNull.Value) + { match = false; + } else - defaultArgList.Add((object)pi[v].DefaultValue); + { + defaultArgList.Add(pi[v].DefaultValue); + } } } - else if ((pynargs > clrnargs) && (clrnargs > 0) && + else if (pynargs > clrnargs && clrnargs > 0 && Attribute.IsDefined(pi[clrnargs - 1], typeof(ParamArrayAttribute))) { // This is a spam(params object[] egg) style method @@ -308,9 +344,9 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth if (match) { - Object[] margs = new Object[clrnargs]; + var margs = new object[clrnargs]; - for (int n = 0; n < clrnargs; n++) + for (var n = 0; n < clrnargs; n++) { IntPtr op; if (n < pynargs) @@ -346,7 +382,7 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth if (clrtype != null) { - bool typematch = false; + var typematch = false; if (pi[n].ParameterType != clrtype) { IntPtr pytype = Converter.GetPythonTypeByAlias(pi[n].ParameterType); @@ -415,7 +451,9 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth else { if (defaultArgList != null) + { margs[n] = defaultArgList[n - pynargs]; + } } } @@ -424,13 +462,13 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth continue; } - Object target = null; - if ((!mi.IsStatic) && (inst != IntPtr.Zero)) + object target = null; + if (!mi.IsStatic && inst != IntPtr.Zero) { //CLRObject co = (CLRObject)ManagedType.GetManagedObject(inst); // InvalidCastException: Unable to cast object of type // 'Python.Runtime.ClassObject' to type 'Python.Runtime.CLRObject' - CLRObject co = ManagedType.GetManagedObject(inst) as CLRObject; + var co = ManagedType.GetManagedObject(inst) as CLRObject; // Sanity check: this ensures a graceful exit if someone does // something intentionally wrong like call a non-static method @@ -450,10 +488,10 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth // is a generic method and info is null. That happens when a generic // method was not called using the [] syntax. Let's introspect the // type of the arguments and use it to construct the correct method. - if (isGeneric && (info == null) && (methodinfo != null)) + if (isGeneric && info == null && methodinfo != null) { Type[] types = Runtime.PythonArgsToTypeArray(args, true); - MethodInfo mi = MethodBinder.MatchParameters(methodinfo, types); + MethodInfo mi = MatchParameters(methodinfo, types); return Bind(inst, args, kw, mi, null); } return null; @@ -461,18 +499,18 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw) { - return this.Invoke(inst, args, kw, null, null); + return Invoke(inst, args, kw, null, null); } internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info) { - return this.Invoke(inst, args, kw, info, null); + return Invoke(inst, args, kw, info, null); } internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, MethodInfo[] methodinfo) { - Binding binding = this.Bind(inst, args, kw, info, methodinfo); - Object result; + Binding binding = Bind(inst, args, kw, info, methodinfo); + object result; IntPtr ts = IntPtr.Zero; if (binding == null) @@ -515,9 +553,9 @@ internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw, MethodBase i // we return the out parameter as the result to Python (for // code compatibility with ironpython). - MethodInfo mi = (MethodInfo)binding.info; + var mi = (MethodInfo)binding.info; - if ((binding.outs == 1) && (mi.ReturnType == typeof(void))) + if (binding.outs == 1 && mi.ReturnType == typeof(void)) { } @@ -525,14 +563,14 @@ internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw, MethodBase i { ParameterInfo[] pi = mi.GetParameters(); int c = pi.Length; - int n = 0; + var n = 0; IntPtr t = Runtime.PyTuple_New(binding.outs + 1); IntPtr v = Converter.ToPython(result, mi.ReturnType); Runtime.PyTuple_SetItem(t, n, v); n++; - for (int i = 0; i < c; i++) + for (var i = 0; i < c; i++) { Type pt = pi[i].ParameterType; if (pi[i].IsOut || pt.IsByRef) @@ -543,7 +581,7 @@ internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw, MethodBase i } } - if ((binding.outs == 1) && (mi.ReturnType == typeof(void))) + if (binding.outs == 1 && mi.ReturnType == typeof(void)) { v = Runtime.PyTuple_GetItem(t, 1); Runtime.XIncref(v); @@ -564,14 +602,18 @@ internal virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw, MethodBase i /// internal class MethodSorter : IComparer { - int IComparer.Compare(Object m1, Object m2) + int IComparer.Compare(object m1, object m2) { int p1 = MethodBinder.GetPrecedence((MethodBase)m1); int p2 = MethodBinder.GetPrecedence((MethodBase)m2); if (p1 < p2) + { return -1; + } if (p1 > p2) + { return 1; + } return 0; } } @@ -585,11 +627,11 @@ int IComparer.Compare(Object m1, Object m2) internal class Binding { public MethodBase info; - public Object[] args; - public Object inst; + public object[] args; + public object inst; public int outs; - internal Binding(MethodBase info, Object inst, Object[] args, int outs) + internal Binding(MethodBase info, object inst, object[] args, int outs) { this.info = info; this.inst = inst; diff --git a/src/runtime/methodbinding.cs b/src/runtime/methodbinding.cs index 878779989..22b883186 100644 --- a/src/runtime/methodbinding.cs +++ b/src/runtime/methodbinding.cs @@ -1,6 +1,6 @@ using System; -using System.Reflection; using System.Collections.Generic; +using System.Reflection; namespace Python.Runtime { @@ -16,14 +16,16 @@ internal class MethodBinding : ExtensionType internal IntPtr target; internal IntPtr targetType; - public MethodBinding(MethodObject m, IntPtr target, IntPtr targetType) : base() + public MethodBinding(MethodObject m, IntPtr target, IntPtr targetType) { Runtime.XIncref(target); this.target = target; Runtime.XIncref(targetType); if (targetType == IntPtr.Zero) + { targetType = Runtime.PyObject_Type(target); + } this.targetType = targetType; this.info = null; @@ -39,7 +41,7 @@ public MethodBinding(MethodObject m, IntPtr target) : this(m, target, IntPtr.Zer /// public static IntPtr mp_subscript(IntPtr tp, IntPtr idx) { - MethodBinding self = (MethodBinding)GetManagedObject(tp); + var self = (MethodBinding)GetManagedObject(tp); Type[] types = Runtime.PythonArgsToTypeArray(idx); if (types == null) @@ -50,11 +52,10 @@ public static IntPtr mp_subscript(IntPtr tp, IntPtr idx) MethodInfo mi = MethodBinder.MatchParameters(self.m.info, types); if (mi == null) { - string e = "No match found for given type params"; - return Exceptions.RaiseTypeError(e); + return Exceptions.RaiseTypeError("No match found for given type params"); } - MethodBinding mb = new MethodBinding(self.m, self.target); + var mb = new MethodBinding(self.m, self.target); mb.info = mi; Runtime.XIncref(mb.pyHandle); return mb.pyHandle; @@ -66,7 +67,7 @@ public static IntPtr mp_subscript(IntPtr tp, IntPtr idx) /// public static IntPtr tp_getattro(IntPtr ob, IntPtr key) { - MethodBinding self = (MethodBinding)GetManagedObject(ob); + var self = (MethodBinding)GetManagedObject(ob); if (!Runtime.PyString_Check(key)) { @@ -82,10 +83,10 @@ public static IntPtr tp_getattro(IntPtr ob, IntPtr key) return doc; } - // XXX deprecate __overloads__ soon... + // FIXME: deprecate __overloads__ soon... if (name == "__overloads__" || name == "Overloads") { - OverloadMapper om = new OverloadMapper(self.m, self.target); + var om = new OverloadMapper(self.m, self.target); Runtime.XIncref(om.pyHandle); return om.pyHandle; } @@ -99,7 +100,7 @@ public static IntPtr tp_getattro(IntPtr ob, IntPtr key) /// public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) { - MethodBinding self = (MethodBinding)GetManagedObject(ob); + var self = (MethodBinding)GetManagedObject(ob); // This works around a situation where the wrong generic method is picked, // for example this method in the tests: string Overloaded(int arg1, int arg2, string arg3) @@ -107,14 +108,16 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) { if (self.info.IsGenericMethod) { - int len = Runtime.PyTuple_Size(args); + int len = Runtime.PyTuple_Size(args); //FIXME: Never used Type[] sigTp = Runtime.PythonArgsToTypeArray(args, true); if (sigTp != null) { Type[] genericTp = self.info.GetGenericArguments(); MethodInfo betterMatch = MethodBinder.MatchSignatureAndParameters(self.m.info, genericTp, sigTp); if (betterMatch != null) + { self.info = betterMatch; + } } } } @@ -123,12 +126,12 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) // as the first argument. Note that this is not supported if any // of the overloads are static since we can't know if the intent // was to call the static method or the unbound instance method. - List disposeList = new List(); + var disposeList = new List(); try { IntPtr target = self.target; - if ((target == IntPtr.Zero) && (!self.m.IsStatic())) + if (target == IntPtr.Zero && !self.m.IsStatic()) { int len = Runtime.PyTuple_Size(args); if (len < 1) @@ -150,19 +153,21 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) IntPtr superType = IntPtr.Zero; if (Runtime.PyObject_TYPE(target) != self.targetType) { - CLRObject inst = CLRObject.GetManagedObject(target) as CLRObject; - if (inst != null && (inst.inst as IPythonDerivedType) != null) + var inst = GetManagedObject(target) as CLRObject; + if (inst?.inst is IPythonDerivedType) { - ClassBase baseType = GetManagedObject(self.targetType) as ClassBase; + var baseType = GetManagedObject(self.targetType) as ClassBase; if (baseType != null) { string baseMethodName = "_" + baseType.type.Name + "__" + self.m.name; IntPtr baseMethod = Runtime.PyObject_GetAttrString(target, baseMethodName); if (baseMethod != IntPtr.Zero) { - MethodBinding baseSelf = GetManagedObject(baseMethod) as MethodBinding; + var baseSelf = GetManagedObject(baseMethod) as MethodBinding; if (baseSelf != null) + { self = baseSelf; + } Runtime.XDecref(baseMethod); } else @@ -178,7 +183,9 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) finally { foreach (IntPtr ptr in disposeList) + { Runtime.XDecref(ptr); + } } } @@ -188,7 +195,7 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) /// public static IntPtr tp_hash(IntPtr ob) { - MethodBinding self = (MethodBinding)GetManagedObject(ob); + var self = (MethodBinding)GetManagedObject(ob); long x = 0; long y = 0; @@ -222,21 +229,21 @@ public static IntPtr tp_hash(IntPtr ob) /// public static IntPtr tp_repr(IntPtr ob) { - MethodBinding self = (MethodBinding)GetManagedObject(ob); - string type = (self.target == IntPtr.Zero) ? "unbound" : "bound"; - string s = String.Format("<{0} method '{1}'>", type, self.m.name); + var self = (MethodBinding)GetManagedObject(ob); + string type = self.target == IntPtr.Zero ? "unbound" : "bound"; + string s = string.Format("<{0} method '{1}'>", type, self.m.name); return Runtime.PyString_FromStringAndSize(s, s.Length); } /// /// MethodBinding dealloc implementation. /// - public static new void tp_dealloc(IntPtr ob) + public new static void tp_dealloc(IntPtr ob) { - MethodBinding self = (MethodBinding)GetManagedObject(ob); + var self = (MethodBinding)GetManagedObject(ob); Runtime.XDecref(self.target); Runtime.XDecref(self.targetType); - ExtensionType.FinalizeObject(self); + FinalizeObject(self); } } } diff --git a/src/runtime/methodobject.cs b/src/runtime/methodobject.cs index d30188d44..d2d821eb5 100644 --- a/src/runtime/methodobject.cs +++ b/src/runtime/methodobject.cs @@ -1,5 +1,4 @@ using System; -using System.Collections; using System.Reflection; namespace Python.Runtime @@ -21,12 +20,12 @@ internal class MethodObject : ExtensionType internal IntPtr doc; internal Type type; - public MethodObject(Type type, string name, MethodInfo[] info) : base() + public MethodObject(Type type, string name, MethodInfo[] info) { _MethodObject(type, name, info); } - public MethodObject(Type type, string name, MethodInfo[] info, bool allow_threads) : base() + public MethodObject(Type type, string name, MethodInfo[] info, bool allow_threads) { _MethodObject(type, name, info); binder.allow_threads = allow_threads; @@ -38,9 +37,8 @@ private void _MethodObject(Type type, string name, MethodInfo[] info) this.name = name; this.info = info; binder = new MethodBinder(); - for (int i = 0; i < info.Length; i++) + foreach (MethodInfo item in info) { - MethodInfo item = (MethodInfo)info[i]; binder.AddMethod(item); if (item.IsStatic) { @@ -51,7 +49,7 @@ private void _MethodObject(Type type, string name, MethodInfo[] info) public virtual IntPtr Invoke(IntPtr inst, IntPtr args, IntPtr kw) { - return this.Invoke(inst, args, kw, null); + return Invoke(inst, args, kw, null); } public virtual IntPtr Invoke(IntPtr target, IntPtr args, IntPtr kw, MethodBase info) @@ -68,21 +66,23 @@ internal IntPtr GetDocString() { return doc; } - string str = ""; + var str = ""; Type marker = typeof(DocStringAttribute); MethodBase[] methods = binder.GetMethods(); foreach (MethodBase method in methods) { if (str.Length > 0) + { str += Environment.NewLine; - Attribute[] attrs = (Attribute[])method.GetCustomAttributes(marker, false); + } + var attrs = (Attribute[])method.GetCustomAttributes(marker, false); if (attrs.Length == 0) { str += method.ToString(); } else { - DocStringAttribute attr = (DocStringAttribute)attrs[0]; + var attr = (DocStringAttribute)attrs[0]; str += attr.DocString; } } @@ -106,7 +106,7 @@ internal IntPtr GetDocString() /// internal bool IsStatic() { - return this.is_static; + return is_static; } /// @@ -114,7 +114,7 @@ internal bool IsStatic() /// public static IntPtr tp_getattro(IntPtr ob, IntPtr key) { - MethodObject self = (MethodObject)GetManagedObject(ob); + var self = (MethodObject)GetManagedObject(ob); if (!Runtime.PyString_Check(key)) { @@ -138,7 +138,7 @@ public static IntPtr tp_getattro(IntPtr ob, IntPtr key) /// public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) { - MethodObject self = (MethodObject)GetManagedObject(ds); + var self = (MethodObject)GetManagedObject(ds); MethodBinding binding; // If the method is accessed through its type (rather than via @@ -166,11 +166,11 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) // this descriptor was defined on then it will be because the base class method // is being called via super(Derived, self).method(...). // In which case create a MethodBinding bound to the base class. - CLRObject obj = GetManagedObject(ob) as CLRObject; + var obj = GetManagedObject(ob) as CLRObject; if (obj != null && obj.inst.GetType() != self.type && obj.inst is IPythonDerivedType - && self.type.IsAssignableFrom(obj.inst.GetType())) + && self.type.IsInstanceOfType(obj.inst)) { ClassBase basecls = ClassManager.GetClass(self.type); binding = new MethodBinding(self, ob, basecls.pyHandle); @@ -186,17 +186,17 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) /// public static IntPtr tp_repr(IntPtr ob) { - MethodObject self = (MethodObject)GetManagedObject(ob); - string s = String.Format("", self.name); + var self = (MethodObject)GetManagedObject(ob); + string s = string.Format("", self.name); return Runtime.PyString_FromStringAndSize(s, s.Length); } /// /// Descriptor dealloc implementation. /// - public static new void tp_dealloc(IntPtr ob) + public new static void tp_dealloc(IntPtr ob) { - MethodObject self = (MethodObject)GetManagedObject(ob); + var self = (MethodObject)GetManagedObject(ob); Runtime.XDecref(self.doc); if (self.unbound != null) { diff --git a/src/runtime/moduleobject.cs b/src/runtime/moduleobject.cs index 3b9ad94a9..c18a2cdf9 100644 --- a/src/runtime/moduleobject.cs +++ b/src/runtime/moduleobject.cs @@ -1,9 +1,7 @@ using System; -using System.Collections.Specialized; -using System.Runtime.InteropServices; using System.Collections.Generic; -using System.Collections; using System.Reflection; +using System.Runtime.InteropServices; namespace Python.Runtime { @@ -18,9 +16,9 @@ internal class ModuleObject : ExtensionType internal IntPtr dict; protected string _namespace; - public ModuleObject(string name) : base() + public ModuleObject(string name) { - if (name == String.Empty) + if (name == string.Empty) { throw new ArgumentException("Name must not be empty!"); } @@ -30,8 +28,8 @@ public ModuleObject(string name) : base() // Use the filename from any of the assemblies just so there's something for // anything that expects __file__ to be set. - string filename = "unknown"; - string docstring = "Namespace containing types from the following assemblies:\n\n"; + var filename = "unknown"; + var docstring = "Namespace containing types from the following assemblies:\n\n"; foreach (Assembly a in AssemblyManager.GetAssemblies(name)) { if (!a.IsDynamic && a.Location != null) @@ -54,7 +52,7 @@ public ModuleObject(string name) : base() Runtime.XDecref(pyfilename); Runtime.XDecref(pydocstring); - Marshal.WriteIntPtr(this.pyHandle, ObjectOffset.DictOffset(this.pyHandle), dict); + Marshal.WriteIntPtr(pyHandle, ObjectOffset.DictOffset(pyHandle), dict); InitializeModuleMembers(); } @@ -69,7 +67,7 @@ public ModuleObject(string name) : base() public ManagedType GetAttribute(string name, bool guess) { ManagedType cached = null; - this.cache.TryGetValue(name, out cached); + cache.TryGetValue(name, out cached); if (cached != null) { return cached; @@ -89,25 +87,23 @@ public ManagedType GetAttribute(string name, bool guess) // return null; //} - string qname = (_namespace == String.Empty) + string qname = _namespace == string.Empty ? name : _namespace + "." + name; // If the fully-qualified name of the requested attribute is // a namespace exported by a currently loaded assembly, return // a new ModuleObject representing that namespace. - if (AssemblyManager.IsValidNamespace(qname)) { m = new ModuleObject(qname); StoreAttribute(name, m); - return (ManagedType)m; + return m; } // Look for a type in the current namespace. Note that this // includes types, delegates, enums, interfaces and structs. // Only public namespace members are exposed to Python. - type = AssemblyManager.LookupType(qname); if (type != null) { @@ -117,7 +113,7 @@ public ManagedType GetAttribute(string name, bool guess) } c = ClassManager.GetClass(type); StoreAttribute(name, c); - return (ManagedType)c; + return c; } // This is a little repetitive, but it ensures that the right @@ -131,7 +127,7 @@ public ManagedType GetAttribute(string name, bool guess) { m = new ModuleObject(qname); StoreAttribute(name, m); - return (ManagedType)m; + return m; } type = AssemblyManager.LookupType(qname); @@ -143,7 +139,7 @@ public ManagedType GetAttribute(string name, bool guess) } c = ClassManager.GetClass(type); StoreAttribute(name, c); - return (ManagedType)c; + return c; } } @@ -154,7 +150,6 @@ public ManagedType GetAttribute(string name, bool guess) // future assembly load could contribute a non-generic type to // the current namespace with the given basename, but unlikely // enough to complicate the implementation for now. - if (guess) { string gname = GenericUtil.GenericNameForBaseName(_namespace, name); @@ -193,10 +188,10 @@ public void LoadNames() ManagedType m = null; foreach (string name in AssemblyManager.GetNames(_namespace)) { - this.cache.TryGetValue(name, out m); + cache.TryGetValue(name, out m); if (m == null) { - ManagedType attr = this.GetAttribute(name, true); + ManagedType attr = GetAttribute(name, true); } } } @@ -209,38 +204,36 @@ internal void InitializeModuleMembers() Type funcmarker = typeof(ModuleFunctionAttribute); Type propmarker = typeof(ModulePropertyAttribute); Type ftmarker = typeof(ForbidPythonThreadsAttribute); - Type type = this.GetType(); + Type type = GetType(); BindingFlags flags = BindingFlags.Public | BindingFlags.Static; while (type != null) { MethodInfo[] methods = type.GetMethods(flags); - for (int i = 0; i < methods.Length; i++) + foreach (MethodInfo method in methods) { - MethodInfo method = methods[i]; object[] attrs = method.GetCustomAttributes(funcmarker, false); object[] forbid = method.GetCustomAttributes(ftmarker, false); - bool allow_threads = (forbid.Length == 0); + bool allow_threads = forbid.Length == 0; if (attrs.Length > 0) { string name = method.Name; - MethodInfo[] mi = new MethodInfo[1]; + var mi = new MethodInfo[1]; mi[0] = method; - ModuleFunctionObject m = new ModuleFunctionObject(type, name, mi, allow_threads); + var m = new ModuleFunctionObject(type, name, mi, allow_threads); StoreAttribute(name, m); } } PropertyInfo[] properties = type.GetProperties(); - for (int i = 0; i < properties.Length; i++) + foreach (PropertyInfo property in properties) { - PropertyInfo property = properties[i]; object[] attrs = property.GetCustomAttributes(propmarker, false); if (attrs.Length > 0) { string name = property.Name; - ModulePropertyObject p = new ModulePropertyObject(property); + var p = new ModulePropertyObject(property); StoreAttribute(name, p); } } @@ -257,7 +250,7 @@ internal void InitializeModuleMembers() /// public static IntPtr tp_getattro(IntPtr ob, IntPtr key) { - ModuleObject self = (ModuleObject)GetManagedObject(ob); + var self = (ModuleObject)GetManagedObject(ob); if (!Runtime.PyString_Check(key)) { @@ -296,9 +289,8 @@ public static IntPtr tp_getattro(IntPtr ob, IntPtr key) /// public static IntPtr tp_repr(IntPtr ob) { - ModuleObject self = (ModuleObject)GetManagedObject(ob); - string s = String.Format("", self.moduleName); - return Runtime.PyString_FromString(s); + var self = (ModuleObject)GetManagedObject(ob); + return Runtime.PyString_FromString($""); } } @@ -318,7 +310,7 @@ internal class CLRModule : ModuleObject public CLRModule() : base("clr") { - _namespace = String.Empty; + _namespace = string.Empty; // This hackery is required in order to allow a plain Python to // import the managed runtime via the CLR bootstrapper module. @@ -357,13 +349,13 @@ internal void InitializePreload() } } - [ModuleFunctionAttribute()] + [ModuleFunctionAttribute] public static bool getPreload() { return preload; } - [ModuleFunctionAttribute()] + [ModuleFunctionAttribute] public static void setPreload(bool preloadFlag) { preload = preloadFlag; @@ -383,8 +375,8 @@ public static bool SuppressOverloads set { _SuppressOverloads = value; } } - [ModuleFunctionAttribute()] - [ForbidPythonThreadsAttribute()] + [ModuleFunctionAttribute] + [ForbidPythonThreadsAttribute] public static Assembly AddReference(string name) { AssemblyManager.UpdatePath(); @@ -404,37 +396,40 @@ public static Assembly AddReference(string name) } if (assembly == null) { - string msg = String.Format("Unable to find assembly '{0}'.", name); - throw new System.IO.FileNotFoundException(msg); + throw new System.IO.FileNotFoundException($"Unable to find assembly '{name}'."); } return assembly; } - [ModuleFunctionAttribute()] - [ForbidPythonThreadsAttribute()] + [ModuleFunctionAttribute] + [ForbidPythonThreadsAttribute] public static string FindAssembly(string name) { AssemblyManager.UpdatePath(); return AssemblyManager.FindAssembly(name); } - [ModuleFunctionAttribute()] - public static String[] ListAssemblies(bool verbose) + [ModuleFunctionAttribute] + public static string[] ListAssemblies(bool verbose) { AssemblyName[] assnames = AssemblyManager.ListAssemblies(); - String[] names = new String[assnames.Length]; - for (int i = 0; i < assnames.Length; i++) + var names = new string[assnames.Length]; + for (var i = 0; i < assnames.Length; i++) { if (verbose) + { names[i] = assnames[i].FullName; + } else + { names[i] = assnames[i].Name; + } } return names; } - [ModuleFunctionAttribute()] + [ModuleFunctionAttribute] public static int _AtExit() { return Runtime.AtExit(); diff --git a/src/runtime/nativecall.cs b/src/runtime/nativecall.cs index f49f08e7b..e81b34dde 100644 --- a/src/runtime/nativecall.cs +++ b/src/runtime/nativecall.cs @@ -1,9 +1,8 @@ using System; -using System.Threading; -using System.Runtime.InteropServices; -using System.Collections; using System.Reflection; using System.Reflection.Emit; +using System.Runtime.InteropServices; +using System.Threading; namespace Python.Runtime { @@ -38,8 +37,7 @@ static NativeCall() // interface (defined below) and generate the required thunk // code based on the method signatures. - var aname = new AssemblyName(); - aname.Name = "e__NativeCall_Assembly"; + var aname = new AssemblyName { Name = "e__NativeCall_Assembly" }; var aa = AssemblyBuilderAccess.Run; aBuilder = Thread.GetDomain().DefineDynamicAssembly(aname, aa); diff --git a/src/runtime/pynumber.cs b/src/runtime/pynumber.cs index 371d9f4f6..4f7373a8c 100644 --- a/src/runtime/pynumber.cs +++ b/src/runtime/pynumber.cs @@ -9,6 +9,9 @@ namespace Python.Runtime /// PY3: https://docs.python.org/3/c-api/number.html /// for details. /// + /// + /// TODO: add all of the PyNumber_XXX methods. + /// public class PyNumber : PyObject { protected PyNumber(IntPtr ptr) : base(ptr) @@ -30,8 +33,5 @@ public static bool IsNumberType(PyObject value) { return Runtime.PyNumber_Check(value.obj); } - - - // TODO: add all of the PyNumber_XXX methods. } } diff --git a/src/runtime/pyobject.cs b/src/runtime/pyobject.cs index ddc0e4c4c..837c2d312 100644 --- a/src/runtime/pyobject.cs +++ b/src/runtime/pyobject.cs @@ -1,7 +1,7 @@ using System; +using System.Collections; using System.Dynamic; using System.Linq.Expressions; -using System.Collections; namespace Python.Runtime { @@ -89,8 +89,8 @@ public static PyObject FromManagedObject(object ob) /// public object AsManagedObject(Type t) { - Object result; - if (!Converter.ToManaged(this.obj, t, out result, false)) + object result; + if (!Converter.ToManaged(obj, t, out result, false)) { throw new InvalidCastException("cannot convert object to target type"); } @@ -166,7 +166,7 @@ public bool TypeCheck(PyObject typeOrClass) /// public bool HasAttr(string name) { - return (Runtime.PyObject_HasAttrString(obj, name) != 0); + return Runtime.PyObject_HasAttrString(obj, name) != 0; } @@ -179,7 +179,7 @@ public bool HasAttr(string name) /// public bool HasAttr(PyObject name) { - return (Runtime.PyObject_HasAttr(obj, name.obj) != 0); + return Runtime.PyObject_HasAttr(obj, name.obj) != 0; } @@ -358,7 +358,7 @@ public virtual PyObject GetItem(PyObject key) /// public virtual PyObject GetItem(string key) { - using (PyString pyKey = new PyString(key)) + using (var pyKey = new PyString(key)) { return GetItem(pyKey); } @@ -375,9 +375,9 @@ public virtual PyObject GetItem(string key) /// public virtual PyObject GetItem(int index) { - using (PyInt key = new PyInt(index)) + using (var key = new PyInt(index)) { - return GetItem((PyObject)key); + return GetItem(key); } } @@ -410,7 +410,7 @@ public virtual void SetItem(PyObject key, PyObject value) /// public virtual void SetItem(string key, PyObject value) { - using (PyString pyKey = new PyString(key)) + using (var pyKey = new PyString(key)) { SetItem(pyKey, value); } @@ -427,7 +427,7 @@ public virtual void SetItem(string key, PyObject value) /// public virtual void SetItem(int index, PyObject value) { - using (PyInt pyindex = new PyInt(index)) + using (var pyindex = new PyInt(index)) { SetItem(pyindex, value); } @@ -462,7 +462,7 @@ public virtual void DelItem(PyObject key) /// public virtual void DelItem(string key) { - using (PyString pyKey = new PyString(key)) + using (var pyKey = new PyString(key)) { DelItem(pyKey); } @@ -479,7 +479,7 @@ public virtual void DelItem(string key) /// public virtual void DelItem(int index) { - using (PyInt pyindex = new PyInt(index)) + using (var pyindex = new PyInt(index)) { DelItem(pyindex); } @@ -588,7 +588,7 @@ public IEnumerator GetEnumerator() /// public PyObject Invoke(params PyObject[] args) { - PyTuple t = new PyTuple(args); + var t = new PyTuple(args); IntPtr r = Runtime.PyObject_Call(obj, t.obj, IntPtr.Zero); t.Dispose(); if (r == IntPtr.Zero) @@ -626,7 +626,7 @@ public PyObject Invoke(PyTuple args) /// public PyObject Invoke(PyObject[] args, PyDict kw) { - PyTuple t = new PyTuple(args); + var t = new PyTuple(args); IntPtr r = Runtime.PyObject_Call(obj, t.obj, kw != null ? kw.obj : IntPtr.Zero); t.Dispose(); if (r == IntPtr.Zero) @@ -736,7 +736,7 @@ public bool IsInstance(PyObject typeOrClass) Runtime.PyErr_Clear(); return false; } - return (r != 0); + return r != 0; } @@ -755,7 +755,7 @@ public bool IsSubclass(PyObject typeOrClass) Runtime.PyErr_Clear(); return false; } - return (r != 0); + return r != 0; } @@ -768,7 +768,7 @@ public bool IsSubclass(PyObject typeOrClass) /// public bool IsCallable() { - return (Runtime.PyCallable_Check(obj) != 0); + return Runtime.PyCallable_Check(obj) != 0; } @@ -794,7 +794,7 @@ public bool IsIterable() /// public bool IsTrue() { - return (Runtime.PyObject_IsTrue(obj) != 0); + return Runtime.PyObject_IsTrue(obj) != 0; } @@ -870,7 +870,7 @@ public override bool Equals(object o) { throw new PythonException(); } - return (r == 0); + return r == 0; } @@ -914,7 +914,7 @@ private void GetArgs(object[] inargs, out PyTuple args, out PyDict kwargs) int arg_count; for (arg_count = 0; arg_count < inargs.Length && !(inargs[arg_count] is Py.KeywordArguments); ++arg_count) ; IntPtr argtuple = Runtime.PyTuple_New(arg_count); - for (int i = 0; i < arg_count; i++) + for (var i = 0; i < arg_count; i++) { IntPtr ptr; if (inargs[i] is PyObject) @@ -927,18 +927,26 @@ private void GetArgs(object[] inargs, out PyTuple args, out PyDict kwargs) ptr = Converter.ToPython(inargs[i], inargs[i]?.GetType()); } if (Runtime.PyTuple_SetItem(argtuple, i, ptr) < 0) + { throw new PythonException(); + } } args = new PyTuple(argtuple); kwargs = null; for (int i = arg_count; i < inargs.Length; i++) { if (!(inargs[i] is Py.KeywordArguments)) + { throw new ArgumentException("Keyword arguments must come after normal arguments."); + } if (kwargs == null) + { kwargs = (Py.KeywordArguments)inargs[i]; + } else + { kwargs.Update((Py.KeywordArguments)inargs[i]); + } } } @@ -956,9 +964,13 @@ public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, o finally { if (null != pyargs) + { pyargs.Dispose(); + } if (null != kwargs) + { kwargs.Dispose(); + } } return true; } @@ -980,9 +992,13 @@ public override bool TryInvoke(InvokeBinder binder, object[] args, out object re finally { if (null != pyargs) + { pyargs.Dispose(); + } if (null != kwargs) + { kwargs.Dispose(); + } } return true; } @@ -995,11 +1011,13 @@ public override bool TryConvert(ConvertBinder binder, out object result) return Converter.ToManaged(this.obj, binder.Type, out result, false); } - public override bool TryBinaryOperation(BinaryOperationBinder binder, Object arg, out Object result) + public override bool TryBinaryOperation(BinaryOperationBinder binder, object arg, out object result) { IntPtr res; if (!(arg is PyObject)) + { arg = arg.ToPython(); + } switch (binder.Operation) { @@ -1104,7 +1122,7 @@ private static object CheckNone(PyObject pyObj) return pyObj; } - public override bool TryUnaryOperation(UnaryOperationBinder binder, out Object result) + public override bool TryUnaryOperation(UnaryOperationBinder binder, out object result) { int r; IntPtr res; diff --git a/src/runtime/pystring.cs b/src/runtime/pystring.cs index 3bd99b87c..624de80eb 100644 --- a/src/runtime/pystring.cs +++ b/src/runtime/pystring.cs @@ -3,7 +3,7 @@ namespace Python.Runtime { /// - /// Represents a Python (ansi) string object. See the documentation at + /// Represents a Python (ANSI) string object. See the documentation at /// PY2: https://docs.python.org/2/c-api/string.html /// PY3: No Equivalent /// for details. diff --git a/src/runtime/typemanager.cs b/src/runtime/typemanager.cs index 49c931183..930030a71 100644 --- a/src/runtime/typemanager.cs +++ b/src/runtime/typemanager.cs @@ -1,8 +1,8 @@ using System; -using System.Runtime.InteropServices; -using System.Collections.Generic; using System.Collections; +using System.Collections.Generic; using System.Reflection; +using System.Runtime.InteropServices; namespace Python.Runtime { diff --git a/src/runtime/typemethod.cs b/src/runtime/typemethod.cs index 946c769b2..4da92613c 100644 --- a/src/runtime/typemethod.cs +++ b/src/runtime/typemethod.cs @@ -1,5 +1,4 @@ using System; -using System.Collections; using System.Reflection; namespace Python.Runtime From 073d7e8d62f70263f8222391cedc036151c84b64 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 3 Feb 2017 15:18:55 -0700 Subject: [PATCH 073/324] Update CHANGELOG --- CHANGELOG.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b547712fa..36f3ecfeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,15 +10,18 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ### Added - Code Coverage (#345) -- Add `pysetargv` (#347) +- Added `pysetargv` (#347) +- Added XML Documentation (#349) +- Added PY3 settings to configuration-manager (#346) ### Changed - Refactored `setup.py` (#337) -- Upgraded NUnit framework to 3.5 (#341) +- Upgraded NUnit framework to 2.6.4 (#353) - Completed refactor of Build Directives on `Runtime.cs` (#339) - Refactor tests and removed dependency on `six` (#329) - Unfroze Mono version on Travis (#345) +- Enabled Embedded tests on Appveyor (#353) ### Fixed From eb9465a5121bde9927f57468b89da44c04c4abb0 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 3 Feb 2017 17:47:55 -0700 Subject: [PATCH 074/324] Clarify pynetinit.c, runtime build directives pynetinit.c: Clarifiy its intent is for PY3 runtime.cs Remove unnecessary check for System.Text Simplifies import section --- src/monoclr/pynetinit.c | 4 ++-- src/runtime/runtime.cs | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/monoclr/pynetinit.c b/src/monoclr/pynetinit.c index ed09d45d7..8b49ddae3 100644 --- a/src/monoclr/pynetinit.c +++ b/src/monoclr/pynetinit.c @@ -135,7 +135,7 @@ void main_thread_handler(gpointer user_data) int ii = 0; for (ii = 0; ii < PyList_Size(syspath); ++ii) { -#if PY_MAJOR_VERSION > 2 +#if PY_MAJOR_VERSION >= 3 Py_ssize_t wlen; wchar_t *wstr = PyUnicode_AsWideCharString(PyList_GetItem(syspath, ii), &wlen); char *pydir = (char*)malloc(wlen + 1); @@ -150,7 +150,7 @@ void main_thread_handler(gpointer user_data) strncpy(curdir, strlen(pydir) > 0 ? pydir : ".", 1024); strncat(curdir, slash, 1024); -#if PY_MAJOR_VERSION > 2 +#if PY_MAJOR_VERSION >= 3 free(pydir); #endif diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 3757ce6aa..9debe766b 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1,11 +1,10 @@ using System; using System.Runtime.InteropServices; using System.Security; -#if UCS4 using System.Text; + +#if UCS4 using Mono.Unix; -#elif UCS2 && PYTHON3 -using System.Text; #endif namespace Python.Runtime From 3dde7849d7d6aa0fc5f4f57c1e47ab9ce349ff08 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 3 Feb 2017 17:48:27 -0700 Subject: [PATCH 075/324] Whitespace converter.cs --- src/runtime/converter.cs | 41 ++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index 5e292e82d..52637c3d5 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -85,7 +85,8 @@ internal static IntPtr GetPythonTypeByAlias(Type op) #if PYTHON3 else if ((op == int16Type) || (op == int32Type) || - (op == int64Type)) { + (op == int64Type)) + { return Runtime.PyIntType; } #endif @@ -465,29 +466,29 @@ static bool ToPrimitive(IntPtr value, Type obType, out Object result, bool setEr #elif PYTHON3 // When using Python3 always use the PyLong API { #endif - op = Runtime.PyNumber_Long(value); - if (op == IntPtr.Zero) - { - Exceptions.Clear(); - if (Exceptions.ExceptionMatches(overflow)) + op = Runtime.PyNumber_Long(value); + if (op == IntPtr.Zero) + { + Exceptions.Clear(); + if (Exceptions.ExceptionMatches(overflow)) + { + goto overflow; + } + goto type_error; + } + long ll = (long)Runtime.PyLong_AsLongLong(op); + Runtime.XDecref(op); + if ((ll == -1) && Exceptions.ErrorOccurred()) { goto overflow; } - goto type_error; - } - long ll = (long)Runtime.PyLong_AsLongLong(op); - Runtime.XDecref(op); - if ((ll == -1) && Exceptions.ErrorOccurred()) - { - goto overflow; - } - if (ll > Int32.MaxValue || ll < Int32.MinValue) - { - goto overflow; + if (ll > Int32.MaxValue || ll < Int32.MinValue) + { + goto overflow; + } + result = (int)ll; + return true; } - result = (int)ll; - return true; - } case TypeCode.Boolean: result = (Runtime.PyObject_IsTrue(value) != 0); From de3d2ef3452867498e69840117c47c8ec526d019 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 3 Feb 2017 19:30:00 -0700 Subject: [PATCH 076/324] Propercase AssemblyInfo --- src/clrmodule/clrmodule.csproj | 2 +- src/console/{assemblyinfo.cs => AssemblyInfo.cs} | 0 src/console/Console.csproj | 2 +- src/runtime/{assemblyinfo.cs => AssemblyInfo.cs} | 0 src/runtime/Python.Runtime.csproj | 2 +- 5 files changed, 3 insertions(+), 3 deletions(-) rename src/console/{assemblyinfo.cs => AssemblyInfo.cs} (100%) rename src/runtime/{assemblyinfo.cs => AssemblyInfo.cs} (100%) diff --git a/src/clrmodule/clrmodule.csproj b/src/clrmodule/clrmodule.csproj index 8939d5ad0..c3d6ec7dc 100644 --- a/src/clrmodule/clrmodule.csproj +++ b/src/clrmodule/clrmodule.csproj @@ -151,8 +151,8 @@ - + diff --git a/src/console/assemblyinfo.cs b/src/console/AssemblyInfo.cs similarity index 100% rename from src/console/assemblyinfo.cs rename to src/console/AssemblyInfo.cs diff --git a/src/console/Console.csproj b/src/console/Console.csproj index 49fd402dc..ed591af21 100644 --- a/src/console/Console.csproj +++ b/src/console/Console.csproj @@ -161,7 +161,7 @@ - + diff --git a/src/runtime/assemblyinfo.cs b/src/runtime/AssemblyInfo.cs similarity index 100% rename from src/runtime/assemblyinfo.cs rename to src/runtime/AssemblyInfo.cs diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index 4ddd312b1..f630ab25d 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -169,8 +169,8 @@ + - From edada03ab51e02f6fc491232204c1b4229a073a5 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 3 Feb 2017 21:11:09 -0700 Subject: [PATCH 077/324] Refactor nativemethods --- src/runtime/runtime.cs | 68 ++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 39 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 9debe766b..8fe435428 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -9,30 +9,42 @@ namespace Python.Runtime { - [SuppressUnmanagedCodeSecurityAttribute()] + [SuppressUnmanagedCodeSecurity()] static class NativeMethods { #if MONO_LINUX || MONO_OSX - static public IntPtr LoadLibrary(string fileName) + private static int RTLD_NOW = 0x2; + private static int RTLD_SHARED = 0x20; +#if MONO_OSX + private static IntPtr RTLD_DEFAULT = new IntPtr(-2); + private const string NativeDll = "__Internal"; +#elif MONO_LINUX + private static IntPtr RTLD_DEFAULT = IntPtr.Zero; + private const string NativeDll = "libdl.so"; +#endif + + public static IntPtr LoadLibrary(string fileName) { return dlopen(fileName, RTLD_NOW | RTLD_SHARED); } - static public void FreeLibrary(IntPtr handle) + public static void FreeLibrary(IntPtr handle) { dlclose(handle); } - static public IntPtr GetProcAddress(IntPtr dllHandle, string name) + public static IntPtr GetProcAddress(IntPtr dllHandle, string name) { // look in the exe if dllHandle is NULL - if (IntPtr.Zero == dllHandle) + if (dllHandle == IntPtr.Zero) + { dllHandle = RTLD_DEFAULT; + } // clear previous errors if any dlerror(); - var res = dlsym(dllHandle, name); - var errPtr = dlerror(); + IntPtr res = dlsym(dllHandle, name); + IntPtr errPtr = dlerror(); if (errPtr != IntPtr.Zero) { throw new Exception("dlsym: " + Marshal.PtrToStringAnsi(errPtr)); @@ -40,49 +52,27 @@ static public IntPtr GetProcAddress(IntPtr dllHandle, string name) return res; } -#if MONO_OSX - static int RTLD_NOW = 0x2; - static int RTLD_SHARED = 0x20; - static IntPtr RTLD_DEFAULT = new IntPtr(-2); - - [DllImport("__Internal")] + [DllImport(NativeDll)] private static extern IntPtr dlopen(String fileName, int flags); - [DllImport("__Internal")] + [DllImport(NativeDll)] private static extern IntPtr dlsym(IntPtr handle, String symbol); - [DllImport("__Internal")] + [DllImport(NativeDll)] private static extern int dlclose(IntPtr handle); - [DllImport("__Internal")] + [DllImport(NativeDll)] private static extern IntPtr dlerror(); -#elif MONO_LINUX - static int RTLD_NOW = 0x2; - static int RTLD_SHARED = 0x20; - static IntPtr RTLD_DEFAULT = IntPtr.Zero; - - [DllImport("libdl.so")] - private static extern IntPtr dlopen(String fileName, int flags); - - [DllImport("libdl.so")] - private static extern IntPtr dlsym(IntPtr handle, String symbol); - - [DllImport("libdl.so")] - private static extern int dlclose(IntPtr handle); - - [DllImport("libdl.so")] - private static extern IntPtr dlerror(); -#endif - #else // Windows + private const string NativeDll = "kernel32.dll"; - [DllImport("kernel32.dll")] + [DllImport(NativeDll)] public static extern IntPtr LoadLibrary(string dllToLoad); - [DllImport("kernel32.dll")] + [DllImport(NativeDll)] public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName); - [DllImport("kernel32.dll")] + [DllImport(NativeDll)] public static extern bool FreeLibrary(IntPtr hModule); #endif } @@ -189,12 +179,12 @@ internal static void Initialize() { is32bit = IntPtr.Size == 4; - if (0 == Runtime.Py_IsInitialized()) + if (Runtime.Py_IsInitialized() == 0) { Runtime.Py_Initialize(); } - if (0 == Runtime.PyEval_ThreadsInitialized()) + if (Runtime.PyEval_ThreadsInitialized() == 0) { Runtime.PyEval_InitThreads(); } From d98e2434170d0c8b94d69fcdbba457af5aa5a08b Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 3 Feb 2017 16:07:06 -0700 Subject: [PATCH 078/324] Rename `is32bit` to `Is32Bit` for naming consistency --- src/runtime/converter.cs | 2 +- src/runtime/runtime.cs | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index 52637c3d5..0399a42d6 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -437,7 +437,7 @@ static bool ToPrimitive(IntPtr value, Type obType, out Object result, bool setEr case TypeCode.Int32: #if PYTHON2 // Trickery to support 64-bit platforms. - if (Runtime.is32bit) + if (Runtime.Is32Bit) { op = Runtime.PyNumber_Int(value); diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 8fe435428..509192c26 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -170,14 +170,14 @@ public class Runtime internal static Object IsFinalizingLock = new Object(); internal static bool IsFinalizing = false; - internal static bool is32bit; + internal static bool Is32Bit; /// /// Initialize the runtime... /// internal static void Initialize() { - is32bit = IntPtr.Size == 4; + Is32Bit = IntPtr.Size == 4; if (Runtime.Py_IsInitialized() == 0) { @@ -501,7 +501,7 @@ internal unsafe static void XIncref(IntPtr op) void* p = (void*)op; if ((void*)0 != p) { - if (is32bit) + if (Is32Bit) { (*(int*)p)++; } @@ -524,7 +524,7 @@ internal static unsafe void XDecref(IntPtr op) void* p = (void*)op; if ((void*)0 != p) { - if (is32bit) + if (Is32Bit) { --(*(int*)p); } @@ -535,11 +535,11 @@ internal static unsafe void XDecref(IntPtr op) if ((*(int*)p) == 0) { // PyObject_HEAD: struct _typeobject *ob_type - void* t = is32bit + void* t = Is32Bit ? (void*)(*((uint*)p + 1)) : (void*)(*((ulong*)p + 1)); // PyTypeObject: destructor tp_dealloc - void* f = is32bit + void* f = Is32Bit ? (void*)(*((uint*)t + 6)) : (void*)(*((ulong*)t + 6)); if ((void*)0 == f) @@ -558,7 +558,7 @@ internal unsafe static long Refcount(IntPtr op) void* p = (void*)op; if ((void*)0 != p) { - if (is32bit) + if (Is32Bit) { return (*(int*)p); } @@ -887,7 +887,7 @@ internal unsafe static IntPtr #else int n = 1; #endif - if (is32bit) + if (Is32Bit) { return new IntPtr((void*)(*((uint*)p + n))); } From ea77ab0ab55fead179fa3a34776a35770152c1a1 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 3 Feb 2017 16:45:56 -0700 Subject: [PATCH 079/324] Replace UCS2/UCS4 build directive with Runtime.UCS --- src/runtime/converter.cs | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index 0399a42d6..f7cbf27be 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -613,17 +613,20 @@ static bool ToPrimitive(IntPtr value, Type obType, out Object result, bool setEr if (Runtime.PyUnicode_GetSize(value) == 1) { op = Runtime.PyUnicode_AS_UNICODE(value); -#if UCS2 - // 2011-01-02: Marshal as character array because the cast - // result = (char)Marshal.ReadInt16(op); throws an OverflowException - // on negative numbers with Check Overflow option set on the project - Char[] buff = new Char[1]; - Marshal.Copy(op, buff, 0, 1); - result = buff[0]; -#elif UCS4 - // XXX this is probably NOT correct? - result = (char)Marshal.ReadInt32(op); -#endif + if (Runtime.UCS == 2) // Don't trust linter, statement not always true. + { + // 2011-01-02: Marshal as character array because the cast + // result = (char)Marshal.ReadInt16(op); throws an OverflowException + // on negative numbers with Check Overflow option set on the project + Char[] buff = new Char[1]; + Marshal.Copy(op, buff, 0, 1); + result = buff[0]; + } + else // UCS4 + { + // XXX this is probably NOT correct? + result = (char)Marshal.ReadInt32(op); + } return true; } goto type_error; From 587f318136427b9174820fec8418f3ae4f9dcfae Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 3 Feb 2017 17:06:20 -0700 Subject: [PATCH 080/324] Add IsPython2 and IsPython3 --- src/runtime/converter.cs | 20 ++++++++------------ src/runtime/exceptions.cs | 14 +++++--------- src/runtime/importhook.cs | 20 +++++++++++++------- src/runtime/runtime.cs | 24 +++++++++++++++++------- 4 files changed, 43 insertions(+), 35 deletions(-) diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index f7cbf27be..392e02ae8 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -82,14 +82,14 @@ internal static IntPtr GetPythonTypeByAlias(Type op) { return Runtime.PyUnicodeType; } -#if PYTHON3 - else if ((op == int16Type) || - (op == int32Type) || - (op == int64Type)) + + else if (Runtime.IsPython3 && ((op == int16Type) || + (op == int32Type) || + (op == int64Type))) { return Runtime.PyIntType; } -#endif + else if ((op == int16Type) || (op == int32Type)) { @@ -435,9 +435,8 @@ static bool ToPrimitive(IntPtr value, Type obType, out Object result, bool setEr return true; case TypeCode.Int32: -#if PYTHON2 // Trickery to support 64-bit platforms. - - if (Runtime.Is32Bit) + // Trickery to support 64-bit platforms. + if (Runtime.IsPython2 && Runtime.Is32Bit) { op = Runtime.PyNumber_Int(value); @@ -461,11 +460,8 @@ static bool ToPrimitive(IntPtr value, Type obType, out Object result, bool setEr result = ival; return true; } - else + else // Python3 always use PyLong API { -#elif PYTHON3 // When using Python3 always use the PyLong API - { -#endif op = Runtime.PyNumber_Long(value); if (op == IntPtr.Zero) { diff --git a/src/runtime/exceptions.cs b/src/runtime/exceptions.cs index dbdd9a67b..01a8ab585 100644 --- a/src/runtime/exceptions.cs +++ b/src/runtime/exceptions.cs @@ -81,17 +81,14 @@ private Exceptions() /// internal static void Initialize() { -#if PYTHON3 - exceptions_module = Runtime.PyImport_ImportModule("builtins"); -#elif PYTHON2 - exceptions_module = Runtime.PyImport_ImportModule("exceptions"); -#endif + string exceptionsModuleName = Runtime.IsPython3 ? "builtins" : "exceptions"; + exceptions_module = Runtime.PyImport_ImportModule(exceptionsModuleName); + Exceptions.ErrorCheck(exceptions_module); warnings_module = Runtime.PyImport_ImportModule("warnings"); Exceptions.ErrorCheck(warnings_module); Type type = typeof(Exceptions); - foreach (FieldInfo fi in type.GetFields(BindingFlags.Public | - BindingFlags.Static)) + foreach (FieldInfo fi in type.GetFields(BindingFlags.Public | BindingFlags.Static)) { IntPtr op = Runtime.PyObject_GetAttrString(exceptions_module, fi.Name); if (op != IntPtr.Zero) @@ -116,8 +113,7 @@ internal static void Shutdown() if (Runtime.Py_IsInitialized() != 0) { Type type = typeof(Exceptions); - foreach (FieldInfo fi in type.GetFields(BindingFlags.Public | - BindingFlags.Static)) + foreach (FieldInfo fi in type.GetFields(BindingFlags.Public | BindingFlags.Static)) { var op = (IntPtr)fi.GetValue(type); if (op != IntPtr.Zero) diff --git a/src/runtime/importhook.cs b/src/runtime/importhook.cs index df3877c29..bb70a6167 100644 --- a/src/runtime/importhook.cs +++ b/src/runtime/importhook.cs @@ -35,11 +35,11 @@ internal static void Initialize() // but it provides the most "Pythonic" way of dealing with CLR // modules (Python doesn't provide a way to emulate packages). IntPtr dict = Runtime.PyImport_GetModuleDict(); -#if PYTHON3 - IntPtr mod = Runtime.PyImport_ImportModule("builtins"); -#elif PYTHON2 - IntPtr mod = Runtime.PyDict_GetItemString(dict, "__builtin__"); -#endif + + IntPtr mod = Runtime.IsPython3 + ? Runtime.PyImport_ImportModule("builtins") + : Runtime.PyDict_GetItemString(dict, "__builtin__"); + py_import = Runtime.PyObject_GetAttrString(mod, "__import__"); hook = new MethodWrapper(typeof(ImportHook), "__import__", "TernaryFunc"); Runtime.PyObject_SetAttrString(mod, "__import__", hook.ptr); @@ -86,7 +86,14 @@ internal static void Shutdown() public static IntPtr GetCLRModule(IntPtr? fromList = null) { root.InitializePreload(); -#if PYTHON3 + + if (Runtime.IsPython2) + { + Runtime.XIncref(py_clr_module); + return py_clr_module; + } + + // Python 3 // update the module dictionary with the contents of the root dictionary root.LoadNames(); IntPtr py_mod_dict = Runtime.PyModule_GetDict(py_clr_module); @@ -135,7 +142,6 @@ public static IntPtr GetCLRModule(IntPtr? fromList = null) } } } -#endif Runtime.XIncref(py_clr_module); return py_clr_module; } diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 509192c26..c6f3551df 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -171,6 +171,8 @@ public class Runtime internal static bool IsFinalizing = false; internal static bool Is32Bit; + internal static bool IsPython2; + internal static bool IsPython3; /// /// Initialize the runtime... @@ -178,6 +180,8 @@ public class Runtime internal static void Initialize() { Is32Bit = IntPtr.Size == 4; + IsPython2 = pyversionnumber < 30; + IsPython3 = pyversionnumber >= 30; if (Runtime.Py_IsInitialized() == 0) { @@ -189,13 +193,19 @@ internal static void Initialize() Runtime.PyEval_InitThreads(); } -#if PYTHON3 - IntPtr op = Runtime.PyImport_ImportModule("builtins"); - IntPtr dict = Runtime.PyObject_GetAttrString(op, "__dict__"); -#elif PYTHON2 - IntPtr dict = Runtime.PyImport_GetModuleDict(); - IntPtr op = Runtime.PyDict_GetItemString(dict, "__builtin__"); -#endif + IntPtr op; + IntPtr dict; + if (IsPython3) + { + op = Runtime.PyImport_ImportModule("builtins"); + dict = Runtime.PyObject_GetAttrString(op, "__dict__"); + + } + else // Python2 + { + dict = Runtime.PyImport_GetModuleDict(); + op = Runtime.PyDict_GetItemString(dict, "__builtin__"); + } PyNotImplemented = Runtime.PyObject_GetAttrString(op, "NotImplemented"); PyBaseObjectType = Runtime.PyObject_GetAttrString(op, "object"); From b9815e4d300e3993e9d3e325599c6995fc44d748 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 4 Feb 2017 12:03:37 -0700 Subject: [PATCH 081/324] Cleanup runtime config --- Python.Runtime.dll.config | 30 ++++++++++++++---------------- src/clrmodule/packages.config | 1 - 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/Python.Runtime.dll.config b/Python.Runtime.dll.config index 228c1417a..8591f58fe 100644 --- a/Python.Runtime.dll.config +++ b/Python.Runtime.dll.config @@ -1,22 +1,20 @@ - - + - - - + + + + - - - + + + + + diff --git a/src/clrmodule/packages.config b/src/clrmodule/packages.config index 01dd53f14..2a95dc54d 100644 --- a/src/clrmodule/packages.config +++ b/src/clrmodule/packages.config @@ -1,5 +1,4 @@ - From 5844beeb2967a289983bad3de8e7288ae9587883 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 4 Feb 2017 12:10:27 -0700 Subject: [PATCH 082/324] Remove extra properties/Organize properties --- src/clrmodule/clrmodule.csproj | 30 ++++---------- src/console/Console.csproj | 37 ++++------------- src/console/app.config | 7 ---- src/embed_tests/Python.EmbeddingTest.csproj | 30 +++----------- src/runtime/Python.Runtime.csproj | 46 ++++----------------- src/testing/Python.Test.csproj | 29 +++---------- 6 files changed, 35 insertions(+), 144 deletions(-) delete mode 100644 src/console/app.config diff --git a/src/clrmodule/clrmodule.csproj b/src/clrmodule/clrmodule.csproj index c3d6ec7dc..aca9e46cf 100644 --- a/src/clrmodule/clrmodule.csproj +++ b/src/clrmodule/clrmodule.csproj @@ -1,23 +1,24 @@ - + Debug - x86 - 8.0.30703 - 2.0 + AnyCPU {86E834DE-1139-4511-96CC-69636A56E7AC} Library - clrmodule clrmodule + clrmodule + bin\clrmodule.xml + bin\ v4.0 - 512 + + 1591 ..\..\ $(SolutionDir) + true true - bin\ TRACE;DEBUG;PYTHON2 full x86 @@ -25,14 +26,12 @@ true - bin\ TRACE;DEBUG;PYTHON2 full x64 prompt - bin\ PYTHON2 true pdbonly @@ -40,7 +39,6 @@ prompt - bin\ PYTHON2 true pdbonly @@ -49,7 +47,6 @@ true - bin\ TRACE;DEBUG;PYTHON2 full x86 @@ -57,14 +54,12 @@ true - bin\ TRACE;DEBUG;PYTHON2 full x64 prompt - bin\ PYTHON2 true pdbonly @@ -72,7 +67,6 @@ prompt - bin\ PYTHON2 true pdbonly @@ -81,7 +75,6 @@ true - bin\ TRACE;DEBUG;PYTHON3 full x86 @@ -89,14 +82,12 @@ true - bin\ TRACE;DEBUG;PYTHON3 full x64 prompt - bin\ PYTHON3 true pdbonly @@ -104,7 +95,6 @@ prompt - bin\ PYTHON3 true pdbonly @@ -113,7 +103,6 @@ true - bin\ TRACE;DEBUG;PYTHON3 full x86 @@ -121,14 +110,12 @@ true - bin\ TRACE;DEBUG;PYTHON3 full x64 prompt - bin\ PYTHON3 true pdbonly @@ -136,7 +123,6 @@ prompt - bin\ PYTHON3 true pdbonly diff --git a/src/console/Console.csproj b/src/console/Console.csproj index ed591af21..fa6878246 100644 --- a/src/console/Console.csproj +++ b/src/console/Console.csproj @@ -5,19 +5,20 @@ AnyCPU {E29DCF0A-5114-4A98-B1DD-71264B6EA349} Exe - false nPython Python.Runtime - OnBuildSuccess - python-clear.ico - 10.0.0 - 2.0 + bin\nPython.xml + bin\ + v4.0 + + 1591 ..\..\ $(SolutionDir) + + python-clear.ico true - bin\ DEBUG;TRACE full x86 @@ -25,14 +26,12 @@ true - bin\ DEBUG;TRACE full x64 prompt - bin\ true @@ -41,7 +40,6 @@ prompt - bin\ true @@ -51,7 +49,6 @@ true - bin\ DEBUG;TRACE full x86 @@ -59,14 +56,12 @@ true - bin\ DEBUG;TRACE full x64 prompt - bin\ true @@ -75,7 +70,6 @@ prompt - bin\ true @@ -85,7 +79,6 @@ true - bin\ DEBUG;TRACE full x86 @@ -93,14 +86,12 @@ true - bin\ DEBUG;TRACE full x64 prompt - bin\ true @@ -109,7 +100,6 @@ prompt - bin\ true @@ -119,7 +109,6 @@ true - bin\ DEBUG;TRACE full x86 @@ -127,14 +116,12 @@ true - bin\ DEBUG;TRACE full x64 prompt - bin\ true @@ -143,7 +130,6 @@ prompt - bin\ true @@ -156,9 +142,6 @@ - - 3.5 - @@ -170,9 +153,6 @@ Python.Runtime.dll - - - {097b4ac0-74e9-4c58-bcf8-c69746ec8271} @@ -180,9 +160,6 @@ - - - diff --git a/src/console/app.config b/src/console/app.config deleted file mode 100644 index e7368c65b..000000000 --- a/src/console/app.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index c9586cf4a..a274177f8 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -5,17 +5,20 @@ AnyCPU {4165C59D-2822-499F-A6DB-EACA4C331EB5} Library - false Python.EmbeddingTest Python.EmbeddingTest - OnBuildSuccess + bin\Python.EmbeddingTest.xml + bin\ + v4.0 + + 1591 ..\..\ $(SolutionDir) + true true - bin\ DEBUG;TRACE full x86 @@ -23,14 +26,12 @@ true - bin\ DEBUG;TRACE full x64 prompt - bin\ true @@ -39,7 +40,6 @@ prompt - bin\ true @@ -49,7 +49,6 @@ true - bin\ DEBUG;TRACE full x86 @@ -57,14 +56,12 @@ true - bin\ DEBUG;TRACE full x64 prompt - bin\ true @@ -73,7 +70,6 @@ prompt - bin\ true @@ -83,7 +79,6 @@ true - bin\ DEBUG;TRACE full x86 @@ -91,14 +86,12 @@ true - bin\ DEBUG;TRACE full x64 prompt - bin\ true @@ -107,7 +100,6 @@ prompt - bin\ true @@ -117,7 +109,6 @@ true - bin\ DEBUG;TRACE full x86 @@ -125,14 +116,12 @@ true - bin\ DEBUG;TRACE full x64 prompt - bin\ true @@ -141,7 +130,6 @@ prompt - bin\ true @@ -154,9 +142,6 @@ ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll - - 3.5 - @@ -179,9 +164,6 @@ - - - $(TargetPath) $(TargetDir)$(TargetName).pdb diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index f630ab25d..9afa57f41 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -2,147 +2,122 @@ Debug - x86 + AnyCPU {097B4AC0-74E9-4C58-BCF8-C69746EC8271} Library - false Python.Runtime Python.Runtime + bin\Python.Runtime.xml + bin\ + v4.0 + + 1591 ..\..\ $(SolutionDir) + + true + true - bin\ PYTHON2;PYTHON27;UCS4 - true true pdbonly x86 - bin\ PYTHON2;PYTHON27;UCS4 - true true pdbonly x64 - bin\ PYTHON2;PYTHON27;UCS2 - true true pdbonly x86 - bin\ PYTHON2;PYTHON27;UCS2 - true true pdbonly x64 true - bin\ TRACE;DEBUG;PYTHON2;PYTHON27;UCS4 - true false full x86 true - bin\ TRACE;DEBUG;PYTHON2;PYTHON27;UCS4 - true false full x64 true - bin\ TRACE;DEBUG;PYTHON2;PYTHON27;UCS2 - true false full x86 true - bin\ TRACE;DEBUG;PYTHON2;PYTHON27;UCS2 - true false full x64 - bin\ PYTHON3;PYTHON36;UCS4 - true true pdbonly x86 - bin\ PYTHON3;PYTHON36;UCS4 - true true pdbonly x64 - bin\ PYTHON3;PYTHON36;UCS2 - true true pdbonly x86 - bin\ PYTHON3;PYTHON36;UCS2 - true true pdbonly x64 true - bin\ TRACE;DEBUG;PYTHON3;PYTHON36;UCS4 - true false full x86 true - bin\ TRACE;DEBUG;PYTHON3;PYTHON36;UCS4 - true false full x64 true - bin\ TRACE;DEBUG;PYTHON3;PYTHON36;UCS2 - true false full x86 true - bin\ TRACE;DEBUG;PYTHON3;PYTHON36;UCS2 - true false full x64 @@ -249,9 +224,6 @@ - - - $(TargetPath) $(TargetDir)$(TargetName).pdb diff --git a/src/testing/Python.Test.csproj b/src/testing/Python.Test.csproj index 3201cd635..1aa04ab30 100644 --- a/src/testing/Python.Test.csproj +++ b/src/testing/Python.Test.csproj @@ -5,18 +5,20 @@ AnyCPU {6F401A34-273B-450F-9A4C-13550BE0767B} Library - false Python.Test Python.Test - OnBuildSuccess + bin\Python.Test.xml + bin\ v4.0 + 1591 ..\..\ $(SolutionDir) + + true true - bin\ DEBUG;TRACE full x86 @@ -24,14 +26,12 @@ true - bin\ DEBUG;TRACE full x64 prompt - bin\ true @@ -40,7 +40,6 @@ prompt - bin\ true @@ -50,7 +49,6 @@ true - bin\ DEBUG;TRACE full x86 @@ -58,14 +56,12 @@ true - bin\ DEBUG;TRACE full x64 prompt - bin\ true @@ -74,7 +70,6 @@ prompt - bin\ true @@ -84,7 +79,6 @@ true - bin\ DEBUG;TRACE full x86 @@ -92,14 +86,12 @@ true - bin\ DEBUG;TRACE full x64 prompt - bin\ true @@ -108,7 +100,6 @@ prompt - bin\ true @@ -118,7 +109,6 @@ true - bin\ DEBUG;TRACE full x86 @@ -126,14 +116,12 @@ true - bin\ DEBUG;TRACE full x64 prompt - bin\ true @@ -142,7 +130,6 @@ prompt - bin\ true @@ -175,9 +162,6 @@ - - 3.5 - @@ -186,9 +170,6 @@ - - - $(SolutionDir) $(TargetPath) From 15cd373341c4ae849602df57293b8d07f34c9908 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 4 Feb 2017 13:40:20 -0700 Subject: [PATCH 083/324] Refactor property conditions --- src/clrmodule/clrmodule.csproj | 90 ++++--------------- src/console/Console.csproj | 98 ++++----------------- src/embed_tests/Python.EmbeddingTest.csproj | 98 ++++----------------- src/runtime/Python.Runtime.csproj | 76 +++------------- src/testing/Python.Test.csproj | 98 ++++----------------- 5 files changed, 75 insertions(+), 385 deletions(-) diff --git a/src/clrmodule/clrmodule.csproj b/src/clrmodule/clrmodule.csproj index aca9e46cf..9a9cf22f5 100644 --- a/src/clrmodule/clrmodule.csproj +++ b/src/clrmodule/clrmodule.csproj @@ -17,116 +17,58 @@ true - - true - TRACE;DEBUG;PYTHON2 - full + x86 - prompt - - true - TRACE;DEBUG;PYTHON2 - full + x64 - prompt - - PYTHON2 - true - pdbonly - x86 + + true + PYTHON2;TRACE;DEBUG + full prompt - + PYTHON2 true pdbonly - x64 prompt - + true - TRACE;DEBUG;PYTHON2 + PYTHON2;TRACE;DEBUG full - x86 prompt - - true - TRACE;DEBUG;PYTHON2 - full - x64 - prompt - - + PYTHON2 true pdbonly - x86 - prompt - - - PYTHON2 - true - pdbonly - x64 prompt - + true - TRACE;DEBUG;PYTHON3 + PYTHON3;TRACE;DEBUG full - x86 prompt - - true - TRACE;DEBUG;PYTHON3 - full - x64 - prompt - - + PYTHON3 true pdbonly - x86 - prompt - - - PYTHON3 - true - pdbonly - x64 prompt - + true - TRACE;DEBUG;PYTHON3 + PYTHON3;TRACE;DEBUG full - x86 prompt - - true - TRACE;DEBUG;PYTHON3 - full - x64 - prompt - - + PYTHON3 true pdbonly - x86 - prompt - - - PYTHON3 - true - pdbonly - x64 prompt diff --git a/src/console/Console.csproj b/src/console/Console.csproj index fa6878246..16e541c5c 100644 --- a/src/console/Console.csproj +++ b/src/console/Console.csproj @@ -17,124 +17,58 @@ python-clear.ico - - true - DEBUG;TRACE - full + x86 - prompt - + + x64 + + true DEBUG;TRACE full - x64 prompt - - - + + true pdbonly - x86 - prompt - - - - - true - pdbonly - x64 prompt - + true DEBUG;TRACE full - x86 - prompt - - - true - DEBUG;TRACE - full - x64 prompt - - - + + true pdbonly - x86 - prompt - - - - - true - pdbonly - x64 prompt - + true DEBUG;TRACE full - x86 - prompt - - - true - DEBUG;TRACE - full - x64 prompt - - - + + true pdbonly - x86 - prompt - - - - - true - pdbonly - x64 prompt - + true DEBUG;TRACE full - x86 - prompt - - - true - DEBUG;TRACE - full - x64 prompt - - - + + true pdbonly - x86 - prompt - - - - - true - pdbonly - x64 prompt diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index a274177f8..7b3f80989 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -17,124 +17,58 @@ true - - true - DEBUG;TRACE - full + x86 - prompt - + + x64 + + true DEBUG;TRACE full - x64 prompt - - - + + true pdbonly - x86 - prompt - - - - - true - pdbonly - x64 prompt - + true DEBUG;TRACE full - x86 - prompt - - - true - DEBUG;TRACE - full - x64 prompt - - - + + true pdbonly - x86 - prompt - - - - - true - pdbonly - x64 prompt - + true DEBUG;TRACE full - x86 - prompt - - - true - DEBUG;TRACE - full - x64 prompt - - - + + true pdbonly - x86 - prompt - - - - - true - pdbonly - x64 prompt - + true DEBUG;TRACE full - x86 - prompt - - - true - DEBUG;TRACE - full - x64 prompt - - - + + true pdbonly - x86 - prompt - - - - - true - pdbonly - x64 prompt diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index 9afa57f41..65a1ef527 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -18,109 +18,55 @@ true true - - PYTHON2;PYTHON27;UCS4 - true - pdbonly + x86 - - PYTHON2;PYTHON27;UCS4 - true - pdbonly + x64 - - PYTHON2;PYTHON27;UCS2 + + PYTHON2;PYTHON27;UCS4 true pdbonly - x86 - + PYTHON2;PYTHON27;UCS2 true pdbonly - x64 - + true TRACE;DEBUG;PYTHON2;PYTHON27;UCS4 false full - x86 - - true - TRACE;DEBUG;PYTHON2;PYTHON27;UCS4 - false - full - x64 - - - true - TRACE;DEBUG;PYTHON2;PYTHON27;UCS2 - false - full - x86 - - + true TRACE;DEBUG;PYTHON2;PYTHON27;UCS2 false full - x64 - - - PYTHON3;PYTHON36;UCS4 - true - pdbonly - x86 - + PYTHON3;PYTHON36;UCS4 true pdbonly - x64 - + PYTHON3;PYTHON36;UCS2 true pdbonly - x86 - - PYTHON3;PYTHON36;UCS2 - true - pdbonly - x64 - - + true TRACE;DEBUG;PYTHON3;PYTHON36;UCS4 false full - x86 - - true - TRACE;DEBUG;PYTHON3;PYTHON36;UCS4 - false - full - x64 - - - true - TRACE;DEBUG;PYTHON3;PYTHON36;UCS2 - false - full - x86 - - + true TRACE;DEBUG;PYTHON3;PYTHON36;UCS2 false full - x64 diff --git a/src/testing/Python.Test.csproj b/src/testing/Python.Test.csproj index 1aa04ab30..0a5f94e8c 100644 --- a/src/testing/Python.Test.csproj +++ b/src/testing/Python.Test.csproj @@ -17,124 +17,58 @@ true - - true - DEBUG;TRACE - full + x86 - prompt - + + x64 + + true DEBUG;TRACE full - x64 prompt - - - + + true pdbonly - x86 - prompt - - - - - true - pdbonly - x64 prompt - + true DEBUG;TRACE full - x86 - prompt - - - true - DEBUG;TRACE - full - x64 prompt - - - + + true pdbonly - x86 - prompt - - - - - true - pdbonly - x64 prompt - + true DEBUG;TRACE full - x86 - prompt - - - true - DEBUG;TRACE - full - x64 prompt - - - + + true pdbonly - x86 - prompt - - - - - true - pdbonly - x64 prompt - + true DEBUG;TRACE full - x86 - prompt - - - true - DEBUG;TRACE - full - x64 prompt - - - + + true pdbonly - x86 - prompt - - - - - true - pdbonly - x64 prompt From 24c61e6c9d96b154d1c3e45388ea0fd66b557e28 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 4 Feb 2017 14:09:18 -0700 Subject: [PATCH 084/324] Order Runtime.csproj configuration To make it easier to verify everything is setup correctly Simplified the Mono.Unix include condition --- src/clrmodule/clrmodule.csproj | 9 +---- src/console/Console.csproj | 9 +---- src/embed_tests/Python.EmbeddingTest.csproj | 9 +---- src/runtime/Python.Runtime.csproj | 44 ++++++++------------- src/testing/Python.Test.csproj | 9 +---- 5 files changed, 20 insertions(+), 60 deletions(-) diff --git a/src/clrmodule/clrmodule.csproj b/src/clrmodule/clrmodule.csproj index 9a9cf22f5..435630d0e 100644 --- a/src/clrmodule/clrmodule.csproj +++ b/src/clrmodule/clrmodule.csproj @@ -16,6 +16,7 @@ $(SolutionDir) true + prompt x86 @@ -27,49 +28,41 @@ true PYTHON2;TRACE;DEBUG full - prompt PYTHON2 true pdbonly - prompt true PYTHON2;TRACE;DEBUG full - prompt PYTHON2 true pdbonly - prompt true PYTHON3;TRACE;DEBUG full - prompt PYTHON3 true pdbonly - prompt true PYTHON3;TRACE;DEBUG full - prompt PYTHON3 true pdbonly - prompt diff --git a/src/console/Console.csproj b/src/console/Console.csproj index 16e541c5c..cdee6893b 100644 --- a/src/console/Console.csproj +++ b/src/console/Console.csproj @@ -16,6 +16,7 @@ $(SolutionDir) python-clear.ico + prompt x86 @@ -27,49 +28,41 @@ true DEBUG;TRACE full - prompt true pdbonly - prompt true DEBUG;TRACE full - prompt true pdbonly - prompt true DEBUG;TRACE full - prompt true pdbonly - prompt true DEBUG;TRACE full - prompt true pdbonly - prompt $(PythonManifest) diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index 7b3f80989..743c9dabe 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -16,6 +16,7 @@ $(SolutionDir) true + prompt x86 @@ -27,49 +28,41 @@ true DEBUG;TRACE full - prompt true pdbonly - prompt true DEBUG;TRACE full - prompt true pdbonly - prompt true DEBUG;TRACE full - prompt true pdbonly - prompt true DEBUG;TRACE full - prompt true pdbonly - prompt diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index 65a1ef527..977721708 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -29,25 +29,25 @@ true pdbonly - - PYTHON2;PYTHON27;UCS2 + + PYTHON3;PYTHON36;UCS4 true pdbonly true - TRACE;DEBUG;PYTHON2;PYTHON27;UCS4 + PYTHON2;PYTHON27;UCS4;TRACE;DEBUG false full - + true - TRACE;DEBUG;PYTHON2;PYTHON27;UCS2 + PYTHON3;PYTHON36;UCS4;TRACE;DEBUG false full - - PYTHON3;PYTHON36;UCS4 + + PYTHON2;PYTHON27;UCS2 true pdbonly @@ -56,36 +56,24 @@ true pdbonly - + true - TRACE;DEBUG;PYTHON3;PYTHON36;UCS4 + PYTHON2;PYTHON27;UCS2;TRACE;DEBUG false full true - TRACE;DEBUG;PYTHON3;PYTHON36;UCS2 + PYTHON3;PYTHON36;UCS2;TRACE;DEBUG false full - - - - - False - ..\..\packages\MonoGAC\Mono.Posix\4.0.0.0__0738eb9f132ed756\Mono.Posix.dll - - - - - - - False - ..\..\packages\MonoGAC\Mono.Posix\4.0.0.0__0738eb9f132ed756\Mono.Posix.dll - - - - + + + False + ..\..\packages\MonoGAC\Mono.Posix\4.0.0.0__0738eb9f132ed756\Mono.Posix.dll + + diff --git a/src/testing/Python.Test.csproj b/src/testing/Python.Test.csproj index 0a5f94e8c..5faca36b2 100644 --- a/src/testing/Python.Test.csproj +++ b/src/testing/Python.Test.csproj @@ -16,6 +16,7 @@ $(SolutionDir) true + prompt x86 @@ -27,49 +28,41 @@ true DEBUG;TRACE full - prompt true pdbonly - prompt true DEBUG;TRACE full - prompt true pdbonly - prompt true DEBUG;TRACE full - prompt true pdbonly - prompt true DEBUG;TRACE full - prompt true pdbonly - prompt From 01fe9798dee23370f7dd622d63cbaf2800cc2965 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 4 Feb 2017 21:13:31 -0700 Subject: [PATCH 085/324] Add pylong lost unit test Wasn't being referenced in the project --- src/embed_tests/Python.EmbeddingTest.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index 743c9dabe..48fe2554e 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -78,6 +78,7 @@ + From 2e5fab62722e8292d43a7ff9653cb751be9d4a9b Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 5 Feb 2017 18:01:33 -0700 Subject: [PATCH 086/324] Replace #if DEBUG with conditional attribute --- src/clrmodule/ClrModule.cs | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/clrmodule/ClrModule.cs b/src/clrmodule/ClrModule.cs index eca411b30..9e55f0b31 100644 --- a/src/clrmodule/ClrModule.cs +++ b/src/clrmodule/ClrModule.cs @@ -21,6 +21,7 @@ // calls are made to indicate what's going on during the load... //============================================================================ using System; +using System.Diagnostics; using System.Globalization; using System.IO; using System.Reflection; @@ -37,9 +38,7 @@ public static IntPtr PyInit_clr() public static void initclr() #endif { -#if DEBUG - Console.WriteLine("Attempting to load Python.Runtime using standard binding rules... "); -#endif + debugPrint("Attempting to load 'Python.Runtime' using standard binding rules."); #if USE_PYTHON_RUNTIME_PUBLIC_KEY_TOKEN var pythonRuntimePublicKeyTokenData = new byte[] { 0x50, 0x00, 0xfe, 0xa6, 0xcb, 0xa7, 0x02, 0xdd }; #endif @@ -65,12 +64,11 @@ public static void initclr() try { pythonRuntime = Assembly.Load(pythonRuntimeName); -#if DEBUG - Console.WriteLine("Success!"); -#endif + debugPrint("Success loading 'Python.Runtime' using standard binding rules."); } catch (IOException) { + debugPrint("'Python.Runtime' not found using standard binding rules."); try { // If the above fails for any reason, we fallback to attempting to load "Python.Runtime.dll" @@ -89,16 +87,13 @@ public static void initclr() throw new InvalidOperationException(executingAssembly.Location); } string pythonRuntimeDllPath = Path.Combine(assemblyDirectory, "Python.Runtime.dll"); -#if DEBUG - Console.WriteLine("Attempting to load Python.Runtime from: '{0}'...", pythonRuntimeDllPath); -#endif + debugPrint($"Attempting to load Python.Runtime from: '{pythonRuntimeDllPath}.'"); pythonRuntime = Assembly.LoadFrom(pythonRuntimeDllPath); + debugPrint($"Success loading 'Python.Runtime' from: '{pythonRuntimeDllPath}'."); } catch (InvalidOperationException) { -#if DEBUG - Console.WriteLine("Could not load Python.Runtime"); -#endif + debugPrint("Could not load 'Python.Runtime'."); #if PYTHON3 return IntPtr.Zero; #elif PYTHON2 @@ -117,4 +112,14 @@ public static void initclr() pythonEngineType.InvokeMember("InitExt", BindingFlags.InvokeMethod, null, null, null); #endif } + + /// + /// Substitute for Debug.Writeline(...). Ideally we would use Debug.Writeline + /// but haven't been able to configure the TRACE from within Python. + /// + [Conditional("DEBUG")] + private static void debugPrint(string str) + { + Console.WriteLine(str); + } } From 56aee3503700773479eaf4ebaccc4abfd714e0f9 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 5 Feb 2017 19:44:22 -0700 Subject: [PATCH 087/324] Fix and disable StrongNameSigning It works better if they key is in the right folder and its being referenced when signing. It breaks InternalsVisibleTo though, disabling till have time to look into it. (not that it was actually enabled) --- setup.py | 4 ++-- pythonnet.snk => src/pythonnet.snk | Bin src/runtime/Python.Runtime.csproj | 3 ++- src/testing/Python.Test.csproj | 3 ++- 4 files changed, 6 insertions(+), 4 deletions(-) rename pythonnet.snk => src/pythonnet.snk (100%) diff --git a/setup.py b/setup.py index 3ef19afd7..dc72f3794 100644 --- a/setup.py +++ b/setup.py @@ -104,12 +104,12 @@ def _get_interop_filename(): def _get_source_files(): """Walk project and collect the files needed for ext_module""" - for ext in (".sln", ".snk", ".config"): + for ext in (".sln", ".config"): for path in glob.glob("*" + ext): yield path for root, dirnames, filenames in os.walk("src"): - for ext in (".cs", ".csproj", ".sln", ".snk", ".config", ".il", + for ext in (".cs", ".csproj", ".snk", ".config", ".il", ".py", ".c", ".h", ".ico"): for filename in fnmatch.filter(filenames, "*" + ext): yield os.path.join(root, filename) diff --git a/pythonnet.snk b/src/pythonnet.snk similarity index 100% rename from pythonnet.snk rename to src/pythonnet.snk diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index 977721708..86b6c0ca9 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -16,7 +16,8 @@ $(SolutionDir) true - true + false + ..\pythonnet.snk x86 diff --git a/src/testing/Python.Test.csproj b/src/testing/Python.Test.csproj index 5faca36b2..4b9d4e80c 100644 --- a/src/testing/Python.Test.csproj +++ b/src/testing/Python.Test.csproj @@ -15,7 +15,8 @@ ..\..\ $(SolutionDir) - true + false + ..\pythonnet.snk prompt From 4fe44c4873a6d37c434498f8ec1f0bfef17f59aa Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 6 Feb 2017 11:02:01 -0700 Subject: [PATCH 088/324] Fix debug statement & rename debugprint --- src/clrmodule/ClrModule.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/clrmodule/ClrModule.cs b/src/clrmodule/ClrModule.cs index 9e55f0b31..413b952eb 100644 --- a/src/clrmodule/ClrModule.cs +++ b/src/clrmodule/ClrModule.cs @@ -38,7 +38,7 @@ public static IntPtr PyInit_clr() public static void initclr() #endif { - debugPrint("Attempting to load 'Python.Runtime' using standard binding rules."); + DebugPrint("Attempting to load 'Python.Runtime' using standard binding rules."); #if USE_PYTHON_RUNTIME_PUBLIC_KEY_TOKEN var pythonRuntimePublicKeyTokenData = new byte[] { 0x50, 0x00, 0xfe, 0xa6, 0xcb, 0xa7, 0x02, 0xdd }; #endif @@ -64,11 +64,11 @@ public static void initclr() try { pythonRuntime = Assembly.Load(pythonRuntimeName); - debugPrint("Success loading 'Python.Runtime' using standard binding rules."); + DebugPrint("Success loading 'Python.Runtime' using standard binding rules."); } catch (IOException) { - debugPrint("'Python.Runtime' not found using standard binding rules."); + DebugPrint("'Python.Runtime' not found using standard binding rules."); try { // If the above fails for any reason, we fallback to attempting to load "Python.Runtime.dll" @@ -87,13 +87,13 @@ public static void initclr() throw new InvalidOperationException(executingAssembly.Location); } string pythonRuntimeDllPath = Path.Combine(assemblyDirectory, "Python.Runtime.dll"); - debugPrint($"Attempting to load Python.Runtime from: '{pythonRuntimeDllPath}.'"); + DebugPrint($"Attempting to load Python.Runtime from: '{pythonRuntimeDllPath}'."); pythonRuntime = Assembly.LoadFrom(pythonRuntimeDllPath); - debugPrint($"Success loading 'Python.Runtime' from: '{pythonRuntimeDllPath}'."); + DebugPrint($"Success loading 'Python.Runtime' from: '{pythonRuntimeDllPath}'."); } catch (InvalidOperationException) { - debugPrint("Could not load 'Python.Runtime'."); + DebugPrint("Could not load 'Python.Runtime'."); #if PYTHON3 return IntPtr.Zero; #elif PYTHON2 @@ -118,7 +118,7 @@ public static void initclr() /// but haven't been able to configure the TRACE from within Python. /// [Conditional("DEBUG")] - private static void debugPrint(string str) + private static void DebugPrint(string str) { Console.WriteLine(str); } From a1b913676dc759640a6d80fa935b12105e828584 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 6 Feb 2017 11:05:23 -0700 Subject: [PATCH 089/324] Document nPython/Console usage Closes #358 --- src/console/pythonconsole.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/console/pythonconsole.cs b/src/console/pythonconsole.cs index a696f62f6..c1c960290 100644 --- a/src/console/pythonconsole.cs +++ b/src/console/pythonconsole.cs @@ -5,6 +5,14 @@ namespace Python.Runtime { + /// + /// Example of Embedding Python inside of a .NET program. + /// + /// + /// It has similar functionality to doing `import clr` from within Python, but this does it + /// the other way around; That is, it loads Python inside of .NET program. + /// See https://github.com/pythonnet/pythonnet/issues/358 for more info. + /// public sealed class PythonConsole { private static AssemblyLoader assemblyLoader = new AssemblyLoader(); @@ -41,7 +49,7 @@ public AssemblyLoader() AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { string shortName = args.Name.Split(',')[0]; - string resourceName = string.Format("{0}.dll", shortName); + string resourceName = $"{shortName}.dll"; if (loadedAssemblies.ContainsKey(resourceName)) { @@ -60,7 +68,6 @@ public AssemblyLoader() return assembly; } } - return null; }; } From 4f71a94945fc5642bb66533c090f668210212835 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 6 Feb 2017 11:07:58 -0700 Subject: [PATCH 090/324] Quiet Test Fixture build warnings about unused events. They will be used (or attempted to be used) from Python. --- src/testing/Python.Test.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/testing/Python.Test.csproj b/src/testing/Python.Test.csproj index 4b9d4e80c..be6148f65 100644 --- a/src/testing/Python.Test.csproj +++ b/src/testing/Python.Test.csproj @@ -11,7 +11,7 @@ bin\ v4.0 - 1591 + 1591,0067 ..\..\ $(SolutionDir) From 50e7915fb0dd793f364d3002fcc29d0c2138d9c9 Mon Sep 17 00:00:00 2001 From: dse Date: Sat, 7 Jan 2017 13:36:27 +0400 Subject: [PATCH 091/324] Mono dependency removed from Linux build. --- src/runtime/monosupport.cs | 44 -------------------------------------- src/runtime/runtime.cs | 30 ++++++++++++++++++++------ 2 files changed, 24 insertions(+), 50 deletions(-) delete mode 100644 src/runtime/monosupport.cs diff --git a/src/runtime/monosupport.cs b/src/runtime/monosupport.cs deleted file mode 100644 index fc39f9065..000000000 --- a/src/runtime/monosupport.cs +++ /dev/null @@ -1,44 +0,0 @@ -#if UCS4 -using System; -using System.Runtime.InteropServices; -using System.Text; -using Mono.Unix; - -namespace Python.Runtime -{ - public class Utf32Marshaler : ICustomMarshaler - { - private static Utf32Marshaler instance = new Utf32Marshaler(); - - public static ICustomMarshaler GetInstance(string s) - { - return instance; - } - - public void CleanUpManagedData(object o) - { - } - - public void CleanUpNativeData(IntPtr pNativeData) - { - UnixMarshal.FreeHeap(pNativeData); - } - - public int GetNativeDataSize() - { - return IntPtr.Size; - } - - public IntPtr MarshalManagedToNative(object obj) - { - var s = obj as string; - return s == null ? IntPtr.Zero : UnixMarshal.StringToHeap(s, Encoding.UTF32); - } - - public object MarshalNativeToManaged(IntPtr pNativeData) - { - return UnixMarshal.PtrToString(pNativeData, Encoding.UTF32); - } - } -} -#endif diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index c6f3551df..b5ac02031 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -3,10 +3,6 @@ using System.Security; using System.Text; -#if UCS4 -using Mono.Unix; -#endif - namespace Python.Runtime { [SuppressUnmanagedCodeSecurity()] @@ -1656,10 +1652,32 @@ internal unsafe static extern IntPtr ExactSpelling = true)] internal unsafe static extern IntPtr PyUnicode_FromKindAndString(int kind, - [MarshalAs(UnmanagedType.CustomMarshaler, - MarshalTypeRef = typeof(Utf32Marshaler))] string s, + IntPtr s, int size); + internal static unsafe IntPtr PyUnicode_FromKindAndString(int kind, + string s, + int size) + { + var bufLength = Math.Max(s.Length, size) * 4; + + IntPtr mem = Marshal.AllocHGlobal(bufLength); + try + { + fixed (char* ps = s) + { + Encoding.UTF32.GetBytes(ps, s.Length, (byte*)mem, bufLength); + } + + var result = PyUnicode_FromKindAndString(kind, mem, bufLength); + return result; + } + finally + { + Marshal.FreeHGlobal(mem); + } + } + internal static IntPtr PyUnicode_FromUnicode(string s, int size) { return PyUnicode_FromKindAndString(4, s, size); From 198f6545f5ed4c718fb818679df220e049751f84 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 5 Feb 2017 11:37:37 -0700 Subject: [PATCH 092/324] Remove mono dependency from PY2 as well. --- src/runtime/Python.Runtime.csproj | 1 - src/runtime/runtime.cs | 25 ++++++++++++++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index 86b6c0ca9..01cbcb35f 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -116,7 +116,6 @@ - diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index b5ac02031..25a1ea6c1 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1720,9 +1720,28 @@ internal unsafe static extern IntPtr EntryPoint = "PyUnicodeUCS4_FromUnicode", ExactSpelling = true)] internal unsafe static extern IntPtr - PyUnicode_FromUnicode( - [MarshalAs(UnmanagedType.CustomMarshaler, - MarshalTypeRef = typeof(Utf32Marshaler))] string s, int size); + PyUnicode_FromUnicode(IntPtr s, int size); + + internal static unsafe IntPtr PyUnicode_FromUnicode(string s, int size) + { + var bufLength = Math.Max(s.Length, size) * 4; + + IntPtr mem = Marshal.AllocHGlobal(bufLength); + try + { + fixed (char* ps = s) + { + Encoding.UTF32.GetBytes(ps, s.Length, (byte*)mem, bufLength); + } + + var result = PyUnicode_FromUnicode(mem, bufLength); + return result; + } + finally + { + Marshal.FreeHGlobal(mem); + } + } [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicodeUCS4_GetSize", From d2ba88a10b2a747fc36b502c3a75478909d38df7 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 6 Feb 2017 11:30:25 -0700 Subject: [PATCH 093/324] Replace bufLength with size --- src/runtime/runtime.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 25a1ea6c1..a4bb60815 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1669,7 +1669,7 @@ internal static unsafe IntPtr PyUnicode_FromKindAndString(int kind, Encoding.UTF32.GetBytes(ps, s.Length, (byte*)mem, bufLength); } - var result = PyUnicode_FromKindAndString(kind, mem, bufLength); + var result = PyUnicode_FromKindAndString(kind, mem, size); return result; } finally @@ -1734,7 +1734,7 @@ internal static unsafe IntPtr PyUnicode_FromUnicode(string s, int size) Encoding.UTF32.GetBytes(ps, s.Length, (byte*)mem, bufLength); } - var result = PyUnicode_FromUnicode(mem, bufLength); + var result = PyUnicode_FromUnicode(mem, size); return result; } finally From 77c7eb60dab88d399de3deb80cf5d7f5bae442ce Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 6 Feb 2017 00:32:37 -0700 Subject: [PATCH 094/324] Remove arch .il files --- setup.py | 2 +- src/runtime/Python.Runtime.csproj | 2 -- src/runtime/x64/clrmodule-platform.il | 3 --- src/runtime/x86/clrmodule-platform.il | 3 --- 4 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 src/runtime/x64/clrmodule-platform.il delete mode 100644 src/runtime/x86/clrmodule-platform.il diff --git a/setup.py b/setup.py index dc72f3794..a7c2910ac 100644 --- a/setup.py +++ b/setup.py @@ -109,7 +109,7 @@ def _get_source_files(): yield path for root, dirnames, filenames in os.walk("src"): - for ext in (".cs", ".csproj", ".snk", ".config", ".il", + for ext in (".cs", ".csproj", ".snk", ".config", ".py", ".c", ".h", ".ico"): for filename in fnmatch.filter(filenames, "*" + ext): yield os.path.join(root, filename) diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index 01cbcb35f..8ccab4988 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -149,8 +149,6 @@ - - diff --git a/src/runtime/x64/clrmodule-platform.il b/src/runtime/x64/clrmodule-platform.il deleted file mode 100644 index bb188df52..000000000 --- a/src/runtime/x64/clrmodule-platform.il +++ /dev/null @@ -1,3 +0,0 @@ - -.vtfixup [1] int64 fromunmanaged at VT_01 -.data VT_01 = int64(0) diff --git a/src/runtime/x86/clrmodule-platform.il b/src/runtime/x86/clrmodule-platform.il deleted file mode 100644 index f4855c5e2..000000000 --- a/src/runtime/x86/clrmodule-platform.il +++ /dev/null @@ -1,3 +0,0 @@ - -.vtfixup [1] int32 fromunmanaged at VT_01 -.data VT_01 = int32(0) From f9d913ed1526b10418bbc37e629e3bb8d413e6bf Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 6 Feb 2017 12:19:15 -0700 Subject: [PATCH 095/324] Update CHANGELOG --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36f3ecfeb..05b8126ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Refactored `setup.py` (#337) - Upgraded NUnit framework to 2.6.4 (#353) - Completed refactor of Build Directives on `Runtime.cs` (#339) -- Refactor tests and removed dependency on `six` (#329) +- Refactor python unittests (#329) - Unfroze Mono version on Travis (#345) - Enabled Embedded tests on Appveyor (#353) @@ -27,6 +27,11 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Fixed crash during Shutdown (#343) +### Removed + +- Removed `six` dependency for unittests (#329) +- Removed `Mono.Unix` dependency for `UCS4` (#360) + ## [2.2.2][] - 2017-01-29 ### Fixed From b4710fc8ac9bbfada9b37407682147ee43f91bdb Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 6 Feb 2017 16:13:32 -0700 Subject: [PATCH 096/324] Remove Mono.Unix reference from project Remove duplicate property in Python.Test --- src/runtime/Python.Runtime.csproj | 6 ------ src/testing/Python.Test.csproj | 1 - 2 files changed, 7 deletions(-) diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index 8ccab4988..f1616dcd6 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -69,12 +69,6 @@ false full - - - False - ..\..\packages\MonoGAC\Mono.Posix\4.0.0.0__0738eb9f132ed756\Mono.Posix.dll - - diff --git a/src/testing/Python.Test.csproj b/src/testing/Python.Test.csproj index be6148f65..4ed9db680 100644 --- a/src/testing/Python.Test.csproj +++ b/src/testing/Python.Test.csproj @@ -99,7 +99,6 @@ - $(SolutionDir) $(TargetPath) $(TargetDir)$(TargetName).pdb From 049a61f5dc563d549541d78ac7d6d1ae53d3035b Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 7 Feb 2017 12:50:39 -0700 Subject: [PATCH 097/324] Clean-up deprWarning --- src/runtime/assemblymanager.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/runtime/assemblymanager.cs b/src/runtime/assemblymanager.cs index 692351f11..60c02cea6 100644 --- a/src/runtime/assemblymanager.cs +++ b/src/runtime/assemblymanager.cs @@ -322,10 +322,10 @@ public static bool LoadImplicit(string name, bool warn = true) // Deprecation warning if (warn && loaded) { - string deprWarning = string.Format( - "\nThe module was found, but not in a referenced namespace.\n" + - "Implicit loading is deprecated. Please use clr.AddReference(\"{0}\").", - Path.GetFileNameWithoutExtension(lastAssembly.Location)); + string location = Path.GetFileNameWithoutExtension(lastAssembly.Location); + string deprWarning = $@" +The module was found, but not in a referenced namespace. +Implicit loading is deprecated. Please use clr.AddReference(""{location}"")."; Exceptions.deprecation(deprWarning); } From d1241f8afd54e05b565fa0c7353c2565309ea95c Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 7 Feb 2017 13:04:21 -0700 Subject: [PATCH 098/324] Clean-up attribute names and paranthesis --- src/runtime/converter.cs | 2 +- src/runtime/interop.cs | 10 +++++----- src/runtime/moduleobject.cs | 20 ++++++++++---------- src/runtime/runtime.cs | 2 +- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index 392e02ae8..97c08bce2 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -10,7 +10,7 @@ namespace Python.Runtime /// /// Performs data conversions between managed types and Python types. /// - [SuppressUnmanagedCodeSecurityAttribute()] + [SuppressUnmanagedCodeSecurity] internal class Converter { private Converter() diff --git a/src/runtime/interop.cs b/src/runtime/interop.cs index 148ca2d2c..dad5cb941 100644 --- a/src/runtime/interop.cs +++ b/src/runtime/interop.cs @@ -12,7 +12,7 @@ namespace Python.Runtime /// runtime. Generally, the definitions here need to be kept up to date /// when moving to new Python versions. /// - [Serializable()] + [Serializable] [AttributeUsage(AttributeTargets.All)] public class DocStringAttribute : Attribute { @@ -30,7 +30,7 @@ public string DocString private string docStr; } - [Serializable()] + [Serializable] [AttributeUsage(AttributeTargets.Method | AttributeTargets.Delegate)] internal class PythonMethodAttribute : Attribute { @@ -39,7 +39,7 @@ public PythonMethodAttribute() } } - [Serializable()] + [Serializable] [AttributeUsage(AttributeTargets.Method | AttributeTargets.Delegate)] internal class ModuleFunctionAttribute : Attribute { @@ -48,7 +48,7 @@ public ModuleFunctionAttribute() } } - [Serializable()] + [Serializable] [AttributeUsage(AttributeTargets.Method | AttributeTargets.Delegate)] internal class ForbidPythonThreadsAttribute : Attribute { @@ -58,7 +58,7 @@ public ForbidPythonThreadsAttribute() } - [Serializable()] + [Serializable] [AttributeUsage(AttributeTargets.Property)] internal class ModulePropertyAttribute : Attribute { diff --git a/src/runtime/moduleobject.cs b/src/runtime/moduleobject.cs index c18a2cdf9..1d8581b1b 100644 --- a/src/runtime/moduleobject.cs +++ b/src/runtime/moduleobject.cs @@ -349,34 +349,34 @@ internal void InitializePreload() } } - [ModuleFunctionAttribute] + [ModuleFunction] public static bool getPreload() { return preload; } - [ModuleFunctionAttribute] + [ModuleFunction] public static void setPreload(bool preloadFlag) { preload = preloadFlag; } - //[ModulePropertyAttribute] + //[ModuleProperty] public static bool SuppressDocs { get { return _SuppressDocs; } set { _SuppressDocs = value; } } - //[ModulePropertyAttribute] + //[ModuleProperty] public static bool SuppressOverloads { get { return _SuppressOverloads; } set { _SuppressOverloads = value; } } - [ModuleFunctionAttribute] - [ForbidPythonThreadsAttribute] + [ModuleFunction] + [ForbidPythonThreads] public static Assembly AddReference(string name) { AssemblyManager.UpdatePath(); @@ -402,15 +402,15 @@ public static Assembly AddReference(string name) return assembly; } - [ModuleFunctionAttribute] - [ForbidPythonThreadsAttribute] + [ModuleFunction] + [ForbidPythonThreads] public static string FindAssembly(string name) { AssemblyManager.UpdatePath(); return AssemblyManager.FindAssembly(name); } - [ModuleFunctionAttribute] + [ModuleFunction] public static string[] ListAssemblies(bool verbose) { AssemblyName[] assnames = AssemblyManager.ListAssemblies(); @@ -429,7 +429,7 @@ public static string[] ListAssemblies(bool verbose) return names; } - [ModuleFunctionAttribute] + [ModuleFunction] public static int _AtExit() { return Runtime.AtExit(); diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index a4bb60815..0d122764f 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -5,7 +5,7 @@ namespace Python.Runtime { - [SuppressUnmanagedCodeSecurity()] + [SuppressUnmanagedCodeSecurity] static class NativeMethods { #if MONO_LINUX || MONO_OSX From 61536f35ed8dd14b39ff78b0430b1a95b891a651 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 7 Feb 2017 13:56:16 -0700 Subject: [PATCH 099/324] Use explicit accessors --- src/console/pythonconsole.cs | 5 +++-- src/embed_tests/pylong.cs | 2 +- src/runtime/assemblymanager.cs | 12 ++++++------ src/runtime/classmanager.cs | 4 ++-- src/runtime/codegenerator.cs | 4 ++-- src/runtime/constructorbinding.cs | 18 +++++++++--------- src/runtime/converter.cs | 30 +++++++++++++++--------------- src/runtime/delegatemanager.cs | 15 ++++++++------- src/runtime/delegateobject.cs | 2 +- src/runtime/eventbinding.cs | 4 ++-- src/runtime/exceptions.cs | 4 ++-- src/runtime/fieldobject.cs | 2 +- src/runtime/genericutil.cs | 2 +- src/runtime/importhook.cs | 14 +++++++------- src/runtime/interfaceobject.cs | 2 +- src/runtime/interop.cs | 4 ++-- src/runtime/iterator.cs | 2 +- src/runtime/metatype.cs | 4 ++-- src/runtime/moduleobject.cs | 2 +- src/runtime/nativecall.cs | 4 ++-- src/runtime/overload.cs | 4 ++-- src/runtime/propertyobject.cs | 6 +++--- src/runtime/runtime.cs | 2 +- src/runtime/typemanager.cs | 4 ++-- src/testing/conversiontest.cs | 2 +- src/testing/propertytest.cs | 18 +++++++++--------- 26 files changed, 87 insertions(+), 85 deletions(-) diff --git a/src/console/pythonconsole.cs b/src/console/pythonconsole.cs index c1c960290..e9bb31e69 100644 --- a/src/console/pythonconsole.cs +++ b/src/console/pythonconsole.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Reflection; using Python.Runtime; @@ -40,7 +41,7 @@ public static int Main(string[] args) // (Python.Runtime.dll is included as a resource) private sealed class AssemblyLoader { - Dictionary loadedAssemblies; + private Dictionary loadedAssemblies; public AssemblyLoader() { @@ -57,7 +58,7 @@ public AssemblyLoader() } // looks for the assembly from the resources and load it - using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) + using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) { if (stream != null) { diff --git a/src/embed_tests/pylong.cs b/src/embed_tests/pylong.cs index 1b5ffdb66..3a7365a61 100644 --- a/src/embed_tests/pylong.cs +++ b/src/embed_tests/pylong.cs @@ -27,7 +27,7 @@ public void TearDown() public void TestToInt64() { long largeNumber = 8L * 1024L * 1024L * 1024L; // 8 GB - PyLong pyLargeNumber = new PyLong(largeNumber); + var pyLargeNumber = new PyLong(largeNumber); Assert.AreEqual(largeNumber, pyLargeNumber.ToInt64()); } } diff --git a/src/runtime/assemblymanager.cs b/src/runtime/assemblymanager.cs index 60c02cea6..c86e7a473 100644 --- a/src/runtime/assemblymanager.cs +++ b/src/runtime/assemblymanager.cs @@ -17,16 +17,16 @@ internal class AssemblyManager { // modified from event handlers below, potentially triggered from different .NET threads // therefore this should be a ConcurrentDictionary - static ConcurrentDictionary> namespaces; - //static Dictionary> generics; - static AssemblyLoadEventHandler lhandler; - static ResolveEventHandler rhandler; + private static ConcurrentDictionary> namespaces; + //private static Dictionary> generics; + private static AssemblyLoadEventHandler lhandler; + private static ResolveEventHandler rhandler; // updated only under GIL? - static Dictionary probed; + private static Dictionary probed; // modified from event handlers below, potentially triggered from different .NET threads - static AssemblyList assemblies; + private static AssemblyList assemblies; internal static List pypath; private AssemblyManager() diff --git a/src/runtime/classmanager.cs b/src/runtime/classmanager.cs index 333f3e7ce..6a9d40ebd 100644 --- a/src/runtime/classmanager.cs +++ b/src/runtime/classmanager.cs @@ -17,8 +17,8 @@ namespace Python.Runtime /// internal class ClassManager { - static Dictionary cache; - static Type dtype; + private static Dictionary cache; + private static Type dtype; private ClassManager() { diff --git a/src/runtime/codegenerator.cs b/src/runtime/codegenerator.cs index 56bed758f..dc466bafb 100644 --- a/src/runtime/codegenerator.cs +++ b/src/runtime/codegenerator.cs @@ -13,8 +13,8 @@ namespace Python.Runtime /// internal class CodeGenerator { - AssemblyBuilder aBuilder; - ModuleBuilder mBuilder; + private AssemblyBuilder aBuilder; + private ModuleBuilder mBuilder; internal CodeGenerator() { diff --git a/src/runtime/constructorbinding.cs b/src/runtime/constructorbinding.cs index 295faaa7e..d17d6ac96 100644 --- a/src/runtime/constructorbinding.cs +++ b/src/runtime/constructorbinding.cs @@ -21,10 +21,10 @@ namespace Python.Runtime /// internal class ConstructorBinding : ExtensionType { - Type type; // The managed Type being wrapped in a ClassObject - IntPtr pyTypeHndl; // The python type tells GetInstHandle which Type to create. - ConstructorBinder ctorBinder; - IntPtr repr; + private Type type; // The managed Type being wrapped in a ClassObject + private IntPtr pyTypeHndl; // The python type tells GetInstHandle which Type to create. + private ConstructorBinder ctorBinder; + private IntPtr repr; public ConstructorBinding(Type type, IntPtr pyTypeHndl, ConstructorBinder ctorBinder) { @@ -165,11 +165,11 @@ public static IntPtr tp_repr(IntPtr ob) /// internal class BoundContructor : ExtensionType { - Type type; // The managed Type being wrapped in a ClassObject - IntPtr pyTypeHndl; // The python type tells GetInstHandle which Type to create. - ConstructorBinder ctorBinder; - ConstructorInfo ctorInfo; - IntPtr repr; + private Type type; // The managed Type being wrapped in a ClassObject + private IntPtr pyTypeHndl; // The python type tells GetInstHandle which Type to create. + private ConstructorBinder ctorBinder; + private ConstructorInfo ctorInfo; + private IntPtr repr; public BoundContructor(Type type, IntPtr pyTypeHndl, ConstructorBinder ctorBinder, ConstructorInfo ci) { diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index 97c08bce2..38fec1256 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -17,18 +17,18 @@ private Converter() { } - static NumberFormatInfo nfi; - static Type objectType; - static Type stringType; - static Type singleType; - static Type doubleType; - static Type decimalType; - static Type int16Type; - static Type int32Type; - static Type int64Type; - static Type flagsType; - static Type boolType; - static Type typeType; + private static NumberFormatInfo nfi; + private static Type objectType; + private static Type stringType; + private static Type singleType; + private static Type doubleType; + private static Type decimalType; + private static Type int16Type; + private static Type int32Type; + private static Type int64Type; + private static Type flagsType; + private static Type boolType; + private static Type typeType; static Converter() { @@ -415,7 +415,7 @@ internal static bool ToManagedValue(IntPtr value, Type obType, /// /// Convert a Python value to an instance of a primitive managed type. /// - static bool ToPrimitive(IntPtr value, Type obType, out Object result, bool setError) + private static bool ToPrimitive(IntPtr value, Type obType, out object result, bool setError) { IntPtr overflow = Exceptions.OverflowError; TypeCode tc = Type.GetTypeCode(obType); @@ -826,7 +826,7 @@ static void SetConversionError(IntPtr value, Type target) /// The Python value must support the Python sequence protocol and the /// items in the sequence must be convertible to the target array type. /// - static bool ToArray(IntPtr value, Type obType, out Object result, bool setError) + private static bool ToArray(IntPtr value, Type obType, out object result, bool setError) { Type elementType = obType.GetElementType(); int size = Runtime.PySequence_Size(value); @@ -875,7 +875,7 @@ static bool ToArray(IntPtr value, Type obType, out Object result, bool setError) /// /// Convert a Python value to a correctly typed managed enum instance. /// - static bool ToEnum(IntPtr value, Type obType, out Object result, bool setError) + private static bool ToEnum(IntPtr value, Type obType, out object result, bool setError) { Type etype = Enum.GetUnderlyingType(obType); result = null; diff --git a/src/runtime/delegatemanager.cs b/src/runtime/delegatemanager.cs index ce17a2e6e..df5eec427 100644 --- a/src/runtime/delegatemanager.cs +++ b/src/runtime/delegatemanager.cs @@ -11,13 +11,13 @@ namespace Python.Runtime /// internal class DelegateManager { - Hashtable cache; - Type basetype; - Type listtype; - Type voidtype; - Type typetype; - Type ptrtype; - CodeGenerator codeGenerator; + private Hashtable cache; + private Type basetype; + private Type listtype; + private Type voidtype; + private Type typetype; + private Type ptrtype; + private CodeGenerator codeGenerator; public DelegateManager() { @@ -180,6 +180,7 @@ A possible alternate strategy would be to create custom subclasses This would be slightly cleaner, but I'm not sure if delegates are too "special" for this to work. It would be more work, so for now the 80/20 rule applies :) */ + public class Dispatcher { public IntPtr target; diff --git a/src/runtime/delegateobject.cs b/src/runtime/delegateobject.cs index bf9ddea16..e1103cbc7 100644 --- a/src/runtime/delegateobject.cs +++ b/src/runtime/delegateobject.cs @@ -10,7 +10,7 @@ namespace Python.Runtime /// internal class DelegateObject : ClassBase { - MethodBinder binder; + private MethodBinder binder; internal DelegateObject(Type tp) : base(tp) { diff --git a/src/runtime/eventbinding.cs b/src/runtime/eventbinding.cs index 552472430..b8b4c82ad 100644 --- a/src/runtime/eventbinding.cs +++ b/src/runtime/eventbinding.cs @@ -7,8 +7,8 @@ namespace Python.Runtime /// internal class EventBinding : ExtensionType { - EventObject e; - IntPtr target; + private EventObject e; + private IntPtr target; public EventBinding(EventObject e, IntPtr target) { diff --git a/src/runtime/exceptions.cs b/src/runtime/exceptions.cs index 01a8ab585..b18cd7d69 100644 --- a/src/runtime/exceptions.cs +++ b/src/runtime/exceptions.cs @@ -171,7 +171,7 @@ internal static void SetArgsAndCause(IntPtr ob) /// Shortcut for (pointer == NULL) -> throw PythonException /// /// Pointer to a Python object - internal unsafe static void ErrorCheck(IntPtr pointer) + internal static unsafe void ErrorCheck(IntPtr pointer) { if (pointer == IntPtr.Zero) { @@ -182,7 +182,7 @@ internal unsafe static void ErrorCheck(IntPtr pointer) /// /// Shortcut for (pointer == NULL or ErrorOccurred()) -> throw PythonException /// - internal unsafe static void ErrorOccurredCheck(IntPtr pointer) + internal static unsafe void ErrorOccurredCheck(IntPtr pointer) { if (pointer == IntPtr.Zero || ErrorOccurred()) { diff --git a/src/runtime/fieldobject.cs b/src/runtime/fieldobject.cs index 6eefb5b0a..96572e5a5 100644 --- a/src/runtime/fieldobject.cs +++ b/src/runtime/fieldobject.cs @@ -8,7 +8,7 @@ namespace Python.Runtime /// internal class FieldObject : ExtensionType { - FieldInfo info; + private FieldInfo info; public FieldObject(FieldInfo info) { diff --git a/src/runtime/genericutil.cs b/src/runtime/genericutil.cs index 57f28cdc0..9772d082f 100644 --- a/src/runtime/genericutil.cs +++ b/src/runtime/genericutil.cs @@ -9,7 +9,7 @@ namespace Python.Runtime /// internal class GenericUtil { - static Dictionary>> mapping; + private static Dictionary>> mapping; private GenericUtil() { diff --git a/src/runtime/importhook.cs b/src/runtime/importhook.cs index bb70a6167..bc9ac5eee 100644 --- a/src/runtime/importhook.cs +++ b/src/runtime/importhook.cs @@ -8,13 +8,13 @@ namespace Python.Runtime /// internal class ImportHook { - static IntPtr py_import; - static CLRModule root; - static MethodWrapper hook; - static IntPtr py_clr_module; + private static IntPtr py_import; + private static CLRModule root; + private static MethodWrapper hook; + private static IntPtr py_clr_module; #if PYTHON3 - static IntPtr module_def = IntPtr.Zero; + private static IntPtr module_def = IntPtr.Zero; internal static void InitializeModuleDef() { @@ -36,8 +36,8 @@ internal static void Initialize() // modules (Python doesn't provide a way to emulate packages). IntPtr dict = Runtime.PyImport_GetModuleDict(); - IntPtr mod = Runtime.IsPython3 - ? Runtime.PyImport_ImportModule("builtins") + IntPtr mod = Runtime.IsPython3 + ? Runtime.PyImport_ImportModule("builtins") : Runtime.PyDict_GetItemString(dict, "__builtin__"); py_import = Runtime.PyObject_GetAttrString(mod, "__import__"); diff --git a/src/runtime/interfaceobject.cs b/src/runtime/interfaceobject.cs index 2085feac8..ce1bc9eb0 100644 --- a/src/runtime/interfaceobject.cs +++ b/src/runtime/interfaceobject.cs @@ -23,7 +23,7 @@ internal InterfaceObject(Type tp) : base(tp) } } - static Type cc_attr; + private static Type cc_attr; static InterfaceObject() { diff --git a/src/runtime/interop.cs b/src/runtime/interop.cs index dad5cb941..966d38f47 100644 --- a/src/runtime/interop.cs +++ b/src/runtime/interop.cs @@ -334,8 +334,8 @@ internal class TypeFlags internal class Interop { - static ArrayList keepAlive; - static Hashtable pmap; + private static ArrayList keepAlive; + private static Hashtable pmap; static Interop() { diff --git a/src/runtime/iterator.cs b/src/runtime/iterator.cs index efa49537c..c7c60ab19 100644 --- a/src/runtime/iterator.cs +++ b/src/runtime/iterator.cs @@ -9,7 +9,7 @@ namespace Python.Runtime /// internal class Iterator : ExtensionType { - IEnumerator iter; + private IEnumerator iter; public Iterator(IEnumerator e) { diff --git a/src/runtime/metatype.cs b/src/runtime/metatype.cs index 64c47b63e..bfb71e26d 100644 --- a/src/runtime/metatype.cs +++ b/src/runtime/metatype.cs @@ -10,7 +10,7 @@ namespace Python.Runtime /// internal class MetaType : ManagedType { - static IntPtr PyCLRMetaType; + private static IntPtr PyCLRMetaType; /// @@ -266,7 +266,7 @@ public static void tp_dealloc(IntPtr tp) NativeCall.Void_Call_1(op, tp); } - static IntPtr DoInstanceCheck(IntPtr tp, IntPtr args, bool checkType) + private static IntPtr DoInstanceCheck(IntPtr tp, IntPtr args, bool checkType) { var cb = GetManagedObject(tp) as ClassBase; diff --git a/src/runtime/moduleobject.cs b/src/runtime/moduleobject.cs index 1d8581b1b..8361f7fc7 100644 --- a/src/runtime/moduleobject.cs +++ b/src/runtime/moduleobject.cs @@ -11,7 +11,7 @@ namespace Python.Runtime /// internal class ModuleObject : ExtensionType { - Dictionary cache; + private Dictionary cache; internal string moduleName; internal IntPtr dict; protected string _namespace; diff --git a/src/runtime/nativecall.cs b/src/runtime/nativecall.cs index e81b34dde..9d1b0f41c 100644 --- a/src/runtime/nativecall.cs +++ b/src/runtime/nativecall.cs @@ -23,8 +23,8 @@ namespace Python.Runtime /// internal class NativeCall { - static AssemblyBuilder aBuilder; - static ModuleBuilder mBuilder; + private static AssemblyBuilder aBuilder; + private static ModuleBuilder mBuilder; public static INativeCall Impl; diff --git a/src/runtime/overload.cs b/src/runtime/overload.cs index e8f51c01d..6b48299e8 100644 --- a/src/runtime/overload.cs +++ b/src/runtime/overload.cs @@ -9,8 +9,8 @@ namespace Python.Runtime /// internal class OverloadMapper : ExtensionType { - MethodObject m; - IntPtr target; + private MethodObject m; + private IntPtr target; public OverloadMapper(MethodObject m, IntPtr target) { diff --git a/src/runtime/propertyobject.cs b/src/runtime/propertyobject.cs index dae47667f..7d758e38e 100644 --- a/src/runtime/propertyobject.cs +++ b/src/runtime/propertyobject.cs @@ -9,9 +9,9 @@ namespace Python.Runtime /// internal class PropertyObject : ExtensionType { - PropertyInfo info; - MethodInfo getter; - MethodInfo setter; + private PropertyInfo info; + private MethodInfo getter; + private MethodInfo setter; [StrongNameIdentityPermission(SecurityAction.Assert)] public PropertyObject(PropertyInfo md) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 0d122764f..22b590657 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -6,7 +6,7 @@ namespace Python.Runtime { [SuppressUnmanagedCodeSecurity] - static class NativeMethods + internal static class NativeMethods { #if MONO_LINUX || MONO_OSX private static int RTLD_NOW = 0x2; diff --git a/src/runtime/typemanager.cs b/src/runtime/typemanager.cs index 930030a71..b3b065cc4 100644 --- a/src/runtime/typemanager.cs +++ b/src/runtime/typemanager.cs @@ -12,8 +12,8 @@ namespace Python.Runtime /// internal class TypeManager { - static BindingFlags tbFlags; - static Dictionary cache; + private static BindingFlags tbFlags; + private static Dictionary cache; static TypeManager() { diff --git a/src/testing/conversiontest.cs b/src/testing/conversiontest.cs index f204a9f85..7179c7607 100644 --- a/src/testing/conversiontest.cs +++ b/src/testing/conversiontest.cs @@ -42,7 +42,7 @@ public interface ISpam public class Spam : ISpam { - string value; + private string value; public Spam(string value) { diff --git a/src/testing/propertytest.cs b/src/testing/propertytest.cs index 999865ef6..f54fd8bb5 100644 --- a/src/testing/propertytest.cs +++ b/src/testing/propertytest.cs @@ -9,7 +9,7 @@ public PropertyTest() { } - int _public_property = 0; + private int _public_property = 0; public int PublicProperty { @@ -17,7 +17,7 @@ public int PublicProperty set { _public_property = value; } } - static int _public_static_property = 0; + private static int _public_static_property = 0; public static int PublicStaticProperty { @@ -25,7 +25,7 @@ public static int PublicStaticProperty set { _public_static_property = value; } } - int _protected_property = 0; + private int _protected_property = 0; protected int ProtectedProperty { @@ -33,7 +33,7 @@ protected int ProtectedProperty set { _protected_property = value; } } - static int _protected_static_property = 0; + private static int _protected_static_property = 0; protected static int ProtectedStaticProperty { @@ -41,7 +41,7 @@ protected static int ProtectedStaticProperty set { _protected_static_property = value; } } - int _internal_property = 0; + private int _internal_property = 0; internal int InternalProperty { @@ -49,7 +49,7 @@ internal int InternalProperty set { _internal_property = value; } } - static int _internal_static_property = 0; + private static int _internal_static_property = 0; internal static int InternalStaticProperty { @@ -57,7 +57,7 @@ internal static int InternalStaticProperty set { _internal_static_property = value; } } - int _private_property = 0; + private int _private_property = 0; private int PrivateProperty { @@ -65,7 +65,7 @@ private int PrivateProperty set { _private_property = value; } } - static int _private_static_property = 0; + private static int _private_static_property = 0; private static int PrivateStaticProperty { @@ -73,7 +73,7 @@ private static int PrivateStaticProperty set { _private_static_property = value; } } - ShortEnum _enum_property = ShortEnum.Zero; + private ShortEnum _enum_property = ShortEnum.Zero; public ShortEnum EnumProperty { From d8cf55ada385ea0528d1490137d88fa6d00c77d6 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 7 Feb 2017 14:14:16 -0700 Subject: [PATCH 100/324] Clean-up code-style Remove redundant parenthesis, enforce brackets, use keywork types. --- src/runtime/classobject.cs | 34 ++++++++++++------------ src/runtime/converter.cs | 52 +++++++++++++++++++------------------ src/runtime/interop.cs | 2 +- src/runtime/moduleobject.cs | 4 +-- src/runtime/pyobject.cs | 13 +++++++++- src/runtime/pythonengine.cs | 42 ++++++++++++++++++++++-------- 6 files changed, 91 insertions(+), 56 deletions(-) diff --git a/src/runtime/classobject.cs b/src/runtime/classobject.cs index 08656aefe..46257c73f 100644 --- a/src/runtime/classobject.cs +++ b/src/runtime/classobject.cs @@ -32,11 +32,13 @@ internal ClassObject(Type tp) : base(tp) internal IntPtr GetDocString() { MethodBase[] methods = binder.GetMethods(); - string str = ""; + var str = ""; foreach (MethodBase t in methods) { if (str.Length > 0) + { str += Environment.NewLine; + } str += t.ToString(); } return Runtime.PyString_FromString(str); @@ -48,7 +50,7 @@ internal IntPtr GetDocString() /// public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) { - ClassObject self = GetManagedObject(tp) as ClassObject; + var self = GetManagedObject(tp) as ClassObject; // Sanity check: this ensures a graceful error if someone does // something intentially wrong like use the managed metatype for @@ -72,7 +74,7 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) } IntPtr op = Runtime.PyTuple_GetItem(args, 0); - Object result; + object result; if (!Converter.ToManaged(op, type, out result, true)) { @@ -94,7 +96,7 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) return IntPtr.Zero; } - Object obj = self.binder.InvokeRaw(IntPtr.Zero, args, kw); + object obj = self.binder.InvokeRaw(IntPtr.Zero, args, kw); if (obj == null) { return IntPtr.Zero; @@ -119,8 +121,8 @@ public override IntPtr type_subscript(IntPtr idx) { return Exceptions.RaiseTypeError("type expected"); } - ClassBase c = GetManagedObject(idx) as ClassBase; - Type t = (c != null) ? c.type : Converter.GetTypeByAlias(idx); + var c = GetManagedObject(idx) as ClassBase; + Type t = c != null ? c.type : Converter.GetTypeByAlias(idx); if (t == null) { return Exceptions.RaiseTypeError("type expected"); @@ -159,7 +161,7 @@ public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) { //ManagedType self = GetManagedObject(ob); IntPtr tp = Runtime.PyObject_TYPE(ob); - ClassBase cls = (ClassBase)GetManagedObject(tp); + var cls = (ClassBase)GetManagedObject(tp); if (cls.indexer == null || !cls.indexer.CanGet) { @@ -171,7 +173,7 @@ public static IntPtr mp_subscript(IntPtr ob, IntPtr idx) // parameters. If so, use it directly, else make a new tuple // with the index arg (method binders expect arg tuples). IntPtr args = idx; - bool free = false; + var free = false; if (!Runtime.PyTuple_Check(idx)) { @@ -205,7 +207,7 @@ public static int mp_ass_subscript(IntPtr ob, IntPtr idx, IntPtr v) { //ManagedType self = GetManagedObject(ob); IntPtr tp = Runtime.PyObject_TYPE(ob); - ClassBase cls = (ClassBase)GetManagedObject(tp); + var cls = (ClassBase)GetManagedObject(tp); if (cls.indexer == null || !cls.indexer.CanSet) { @@ -217,7 +219,7 @@ public static int mp_ass_subscript(IntPtr ob, IntPtr idx, IntPtr v) // parameters. If so, use it directly, else make a new tuple // with the index arg (method binders expect arg tuples). IntPtr args = idx; - bool free = false; + var free = false; if (!Runtime.PyTuple_Check(idx)) { @@ -233,7 +235,7 @@ public static int mp_ass_subscript(IntPtr ob, IntPtr idx, IntPtr v) int numOfDefaultArgs = Runtime.PyTuple_Size(defaultArgs); int temp = i + numOfDefaultArgs; IntPtr real = Runtime.PyTuple_New(temp + 1); - for (int n = 0; n < i; n++) + for (var n = 0; n < i; n++) { IntPtr item = Runtime.PyTuple_GetItem(args, n); Runtime.XIncref(item); @@ -241,7 +243,7 @@ public static int mp_ass_subscript(IntPtr ob, IntPtr idx, IntPtr v) } // Add Default Args if needed - for (int n = 0; n < numOfDefaultArgs; n++) + for (var n = 0; n < numOfDefaultArgs; n++) { IntPtr item = Runtime.PyTuple_GetItem(defaultArgs, n); Runtime.XIncref(item); @@ -288,7 +290,7 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) { //ManagedType self = GetManagedObject(ob); IntPtr tp = Runtime.PyObject_TYPE(ob); - ClassBase cb = (ClassBase)GetManagedObject(tp); + var cb = (ClassBase)GetManagedObject(tp); if (cb.type != typeof(Delegate)) { @@ -296,15 +298,15 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) return IntPtr.Zero; } - CLRObject co = (CLRObject)ManagedType.GetManagedObject(ob); - Delegate d = co.inst as Delegate; + var co = (CLRObject)GetManagedObject(ob); + var d = co.inst as Delegate; BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static; MethodInfo method = d.GetType().GetMethod("Invoke", flags); - MethodBinder binder = new MethodBinder(method); + var binder = new MethodBinder(method); return binder.Invoke(ob, args, kw); } } diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index 38fec1256..fa5d73c86 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -52,8 +52,8 @@ static Converter() /// internal static Type GetTypeByAlias(IntPtr op) { - if ((op == Runtime.PyStringType) || - (op == Runtime.PyUnicodeType)) + if (op == Runtime.PyStringType || + op == Runtime.PyUnicodeType) { return stringType; } @@ -83,15 +83,15 @@ internal static IntPtr GetPythonTypeByAlias(Type op) return Runtime.PyUnicodeType; } - else if (Runtime.IsPython3 && ((op == int16Type) || - (op == int32Type) || - (op == int64Type))) + else if (Runtime.IsPython3 && (op == int16Type || + op == int32Type || + op == int64Type)) { return Runtime.PyIntType; } - else if ((op == int16Type) || - (op == int32Type)) + else if (op == int16Type || + op == int32Type) { return Runtime.PyIntType; } @@ -99,8 +99,8 @@ internal static IntPtr GetPythonTypeByAlias(Type op) { return Runtime.PyLongType; } - else if ((op == doubleType) || - (op == singleType)) + else if (op == doubleType || + op == singleType) { return Runtime.PyFloatType; } @@ -123,7 +123,7 @@ internal static IntPtr ToPython(T value) return ToPython(value, typeof(T)); } - internal static IntPtr ToPython(Object value, Type type) + internal static IntPtr ToPython(object value, Type type) { if (value is PyObject) { @@ -144,7 +144,7 @@ internal static IntPtr ToPython(Object value, Type type) // it the type is a python subclass of a managed type then return the // underlying python object rather than construct a new wrapper object. - IPythonDerivedType pyderived = value as IPythonDerivedType; + var pyderived = value as IPythonDerivedType; if (null != pyderived) { return ClassDerivedObject.ToPython(pyderived); @@ -221,7 +221,9 @@ internal static IntPtr ToPython(Object value, Type type) foreach (object o in (IEnumerable)value) { using (var p = new PyObject(ToPython(o, o?.GetType()))) + { resultlist.Append(p); + } } Runtime.XIncref(resultlist.Handle); return resultlist.Handle; @@ -237,7 +239,7 @@ internal static IntPtr ToPython(Object value, Type type) /// In a few situations, we don't have any advisory type information /// when we want to convert an object to Python. /// - internal static IntPtr ToPythonImplicit(Object value) + internal static IntPtr ToPythonImplicit(object value) { if (value == null) { @@ -266,7 +268,7 @@ internal static bool ToManaged(IntPtr value, Type type, internal static bool ToManagedValue(IntPtr value, Type obType, - out Object result, bool setError) + out object result, bool setError) { if (obType == typeof(PyObject)) { @@ -290,8 +292,8 @@ internal static bool ToManagedValue(IntPtr value, Type obType, result = tmp; return true; } - string err = "value cannot be converted to {0}"; - err = String.Format(err, obType); + var err = "value cannot be converted to {0}"; + err = string.Format(err, obType); Exceptions.SetError(Exceptions.TypeError, err); return false; } @@ -474,7 +476,7 @@ private static bool ToPrimitive(IntPtr value, Type obType, out object result, bo } long ll = (long)Runtime.PyLong_AsLongLong(op); Runtime.XDecref(op); - if ((ll == -1) && Exceptions.ErrorOccurred()) + if (ll == -1 && Exceptions.ErrorOccurred()) { goto overflow; } @@ -487,7 +489,7 @@ private static bool ToPrimitive(IntPtr value, Type obType, out object result, bo } case TypeCode.Boolean: - result = (Runtime.PyObject_IsTrue(value) != 0); + result = Runtime.PyObject_IsTrue(value) != 0; return true; case TypeCode.Byte: @@ -791,9 +793,9 @@ private static bool ToPrimitive(IntPtr value, Type obType, out object result, bo if (setError) { - string format = "'{0}' value cannot be converted to {1}"; + var format = "'{0}' value cannot be converted to {1}"; string tpName = Runtime.PyObject_GetTypeName(value); - string error = String.Format(format, tpName, obType); + string error = string.Format(format, tpName, obType); Exceptions.SetError(Exceptions.TypeError, error); } @@ -803,7 +805,7 @@ private static bool ToPrimitive(IntPtr value, Type obType, out object result, bo if (setError) { - string error = "value too large to convert"; + var error = "value too large to convert"; Exceptions.SetError(Exceptions.OverflowError, error); } @@ -811,12 +813,12 @@ private static bool ToPrimitive(IntPtr value, Type obType, out object result, bo } - static void SetConversionError(IntPtr value, Type target) + private static void SetConversionError(IntPtr value, Type target) { IntPtr ob = Runtime.PyObject_Repr(value); string src = Runtime.GetManagedString(ob); Runtime.XDecref(ob); - string error = String.Format("Cannot convert {0} to {1}", src, target); + string error = string.Format("Cannot convert {0} to {1}", src, target); Exceptions.SetError(Exceptions.TypeError, error); } @@ -844,9 +846,9 @@ private static bool ToArray(IntPtr value, Type obType, out object result, bool s Array items = Array.CreateInstance(elementType, size); // XXX - is there a better way to unwrap this if it is a real array? - for (int i = 0; i < size; i++) + for (var i = 0; i < size; i++) { - Object obj = null; + object obj = null; IntPtr item = Runtime.PySequence_GetItem(value, i); if (item == IntPtr.Zero) { @@ -899,7 +901,7 @@ private static bool ToEnum(IntPtr value, Type obType, out object result, bool se if (setError) { - string error = "invalid enumeration value"; + var error = "invalid enumeration value"; Exceptions.SetError(Exceptions.ValueError, error); } diff --git a/src/runtime/interop.cs b/src/runtime/interop.cs index 966d38f47..14a69591c 100644 --- a/src/runtime/interop.cs +++ b/src/runtime/interop.cs @@ -74,7 +74,7 @@ internal class ObjectOffset static ObjectOffset() { int size = IntPtr.Size; - int n = 0; // Py_TRACE_REFS add two pointers to PyObject_HEAD + var n = 0; // Py_TRACE_REFS add two pointers to PyObject_HEAD #if Py_DEBUG _ob_next = 0; _ob_prev = 1 * size; diff --git a/src/runtime/moduleobject.cs b/src/runtime/moduleobject.cs index 8361f7fc7..b324e6f3a 100644 --- a/src/runtime/moduleobject.cs +++ b/src/runtime/moduleobject.cs @@ -43,7 +43,7 @@ public ModuleObject(string name) IntPtr pyname = Runtime.PyString_FromString(moduleName); IntPtr pyfilename = Runtime.PyString_FromString(filename); IntPtr pydocstring = Runtime.PyString_FromString(docstring); - IntPtr pycls = TypeManager.GetTypeHandle(this.GetType()); + IntPtr pycls = TypeManager.GetTypeHandle(GetType()); Runtime.PyDict_SetItemString(dict, "__name__", pyname); Runtime.PyDict_SetItemString(dict, "__file__", pyfilename); Runtime.PyDict_SetItemString(dict, "__doc__", pydocstring); @@ -318,7 +318,7 @@ public CLRModule() : base("clr") // import requires the module to pass PyModule_Check. :( if (!hacked) { - IntPtr type = this.tpHandle; + IntPtr type = tpHandle; IntPtr mro = Marshal.ReadIntPtr(type, TypeOffset.tp_mro); IntPtr ext = Runtime.ExtendTuple(mro, Runtime.PyModuleType); Marshal.WriteIntPtr(type, TypeOffset.tp_mro, ext); diff --git a/src/runtime/pyobject.cs b/src/runtime/pyobject.cs index 837c2d312..4527e145f 100644 --- a/src/runtime/pyobject.cs +++ b/src/runtime/pyobject.cs @@ -895,7 +895,9 @@ public override bool TryGetMember(GetMemberBinder binder, out object result) return true; } else + { return base.TryGetMember(binder, out result); + } } public override bool TrySetMember(SetMemberBinder binder, object value) @@ -906,13 +908,18 @@ public override bool TrySetMember(SetMemberBinder binder, object value) return true; } else + { return base.TrySetMember(binder, value); + } } private void GetArgs(object[] inargs, out PyTuple args, out PyDict kwargs) { int arg_count; - for (arg_count = 0; arg_count < inargs.Length && !(inargs[arg_count] is Py.KeywordArguments); ++arg_count) ; + for (arg_count = 0; arg_count < inargs.Length && !(inargs[arg_count] is Py.KeywordArguments); ++arg_count) + { + ; + } IntPtr argtuple = Runtime.PyTuple_New(arg_count); for (var i = 0; i < arg_count; i++) { @@ -975,7 +982,9 @@ public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, o return true; } else + { return base.TryInvokeMember(binder, args, out result); + } } public override bool TryInvoke(InvokeBinder binder, object[] args, out object result) @@ -1003,7 +1012,9 @@ public override bool TryInvoke(InvokeBinder binder, object[] args, out object re return true; } else + { return base.TryInvoke(binder, args, out result); + } } public override bool TryConvert(ConvertBinder binder, out object result) diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index c66ae0c47..ae3e135b1 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -162,13 +162,15 @@ public static void Initialize(IEnumerable args) "atexit.register(clr._AtExit)\n"; PyObject r = PythonEngine.RunString(code); if (r != null) + { r.Dispose(); + } // Load the clr.py resource into the clr module IntPtr clr = Python.Runtime.ImportHook.GetCLRModule(); IntPtr clr_dict = Runtime.PyModule_GetDict(clr); - PyDict locals = new PyDict(); + var locals = new PyDict(); try { IntPtr module = Runtime.PyImport_AddModule("clr._extras"); @@ -176,15 +178,17 @@ public static void Initialize(IEnumerable args) IntPtr builtins = Runtime.PyEval_GetBuiltins(); Runtime.PyDict_SetItemString(module_globals, "__builtins__", builtins); - var assembly = Assembly.GetExecutingAssembly(); + Assembly assembly = Assembly.GetExecutingAssembly(); using (Stream stream = assembly.GetManifestResourceStream("clr.py")) - using (StreamReader reader = new StreamReader(stream)) + using (var reader = new StreamReader(stream)) { // add the contents of clr.py to the module string clr_py = reader.ReadToEnd(); PyObject result = RunString(clr_py, module_globals, locals.Handle); if (null == result) + { throw new PythonException(); + } result.Dispose(); } @@ -415,9 +419,9 @@ public static PyObject ModuleFromString(string name, string code) /// public static PyObject RunString( string code, IntPtr? globals = null, IntPtr? locals = null - ) + ) { - bool borrowedGlobals = true; + var borrowedGlobals = true; if (globals == null) { globals = Runtime.PyEval_GetGlobals(); @@ -427,25 +431,25 @@ public static PyObject RunString( Runtime.PyDict_SetItemString( globals.Value, "__builtins__", Runtime.PyEval_GetBuiltins() - ); + ); borrowedGlobals = false; } } - bool borrowedLocals = true; + var borrowedLocals = true; if (locals == null) { locals = Runtime.PyDict_New(); borrowedLocals = false; } - IntPtr flag = (IntPtr)257; /* Py_file_input */ + var flag = (IntPtr)257; /* Py_file_input */ try { IntPtr result = Runtime.PyRun_String( code, flag, globals.Value, locals.Value - ); + ); Py.Throw(); @@ -454,9 +458,13 @@ public static PyObject RunString( finally { if (!borrowedLocals) + { Runtime.XDecref(locals.Value); + } if (!borrowedGlobals) + { Runtime.XDecref(globals.Value); + } } } } @@ -466,7 +474,9 @@ public static class Py public static GILState GIL() { if (!PythonEngine.IsInitialized) + { PythonEngine.Initialize(); + } return new GILState(); } @@ -500,18 +510,28 @@ public static KeywordArguments kw(params object[] kv) { var dict = new KeywordArguments(); if (kv.Length % 2 != 0) + { throw new ArgumentException("Must have an equal number of keys and values"); - for (int i = 0; i < kv.Length; i += 2) + } + for (var i = 0; i < kv.Length; i += 2) { IntPtr value; if (kv[i + 1] is PyObject) + { value = ((PyObject)kv[i + 1]).Handle; + } else + { value = Converter.ToPython(kv[i + 1], kv[i + 1]?.GetType()); + } if (Runtime.PyDict_SetItemString(dict.Handle, (string)kv[i], value) != 0) + { throw new ArgumentException(string.Format("Cannot add key '{0}' to dictionary.", (string)kv[i])); + } if (!(kv[i + 1] is PyObject)) + { Runtime.XDecref(value); + } } return dict; } @@ -549,7 +569,7 @@ public static void SetArgv(IEnumerable argv) { using (GIL()) { - var arr = argv.ToArray(); + string[] arr = argv.ToArray(); Runtime.PySys_SetArgvEx(arr.Length, arr, 0); Py.Throw(); } From 42a6191adb825aef797f902e34854d81081e5296 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 7 Feb 2017 14:16:40 -0700 Subject: [PATCH 101/324] Remove obsoleted & Unenforced PermissionSet See: http://stackoverflow.com/questions/11625447/securityaction-requestminimum-is-obsolete-in-net-4-0 --- src/console/AssemblyInfo.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/console/AssemblyInfo.cs b/src/console/AssemblyInfo.cs index fcdc2b693..17d792c7a 100644 --- a/src/console/AssemblyInfo.cs +++ b/src/console/AssemblyInfo.cs @@ -10,7 +10,6 @@ [assembly: AssemblyDefaultAlias("python.exe")] [assembly: CLSCompliant(true)] [assembly: ComVisible(false)] -[assembly: PermissionSet(SecurityAction.RequestMinimum, Name = "FullTrust")] [assembly: AssemblyDescription("")] [assembly: AssemblyCopyright("MIT License")] [assembly: AssemblyFileVersion("2.0.0.4")] From ca8d1cb49c85e552f0e6660ce261c07ed5e0dcc6 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 7 Feb 2017 17:35:54 -0700 Subject: [PATCH 102/324] Add expire to license shield Github Cache issue https://github.com/github/markup/issues/224 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cb9a0f910..86825386c 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ int32 [codecov shield]: https://img.shields.io/codecov/c/github/pythonnet/pythonnet/master.svg?label=codecov -[license shield]: https://img.shields.io/badge/license-MIT-blue.svg +[license shield]: https://img.shields.io/badge/license-MIT-blue.svg?maxAge=3600 [pypi package version]: https://img.shields.io/pypi/v/pythonnet.svg From d82ca2878368475d81ed7b60d94402e1faae6b91 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 7 Feb 2017 18:36:41 -0700 Subject: [PATCH 103/324] Remove usage of #region It hides away the code in Visual Studio --- src/runtime/pyiter.cs | 4 ---- src/runtime/pythonengine.cs | 4 ---- 2 files changed, 8 deletions(-) diff --git a/src/runtime/pyiter.cs b/src/runtime/pyiter.cs index 3c9b2a238..ee07bcecf 100644 --- a/src/runtime/pyiter.cs +++ b/src/runtime/pyiter.cs @@ -50,8 +50,6 @@ protected override void Dispose(bool disposing) base.Dispose(disposing); } - #region IEnumerator Members - public bool MoveNext() { // dispose of the previous object, if there was one @@ -80,7 +78,5 @@ public object Current { get { return _current; } } - - #endregion } } diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index ae3e135b1..e9fa888a9 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -35,8 +35,6 @@ public void Dispose() Shutdown(); } - #region Properties - public static bool IsInitialized { get { return initialized; } @@ -122,8 +120,6 @@ public static int RunSimpleString(string code) return Runtime.PyRun_SimpleString(code); } - #endregion - public static void Initialize() { Initialize(Enumerable.Empty()); From 75dd5448fc19caa4de32cb224afb89c53139f090 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 7 Feb 2017 15:29:28 -0700 Subject: [PATCH 104/324] Turn on NUNIT exit code --- ci/appveyor_run_tests.ps1 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ci/appveyor_run_tests.ps1 b/ci/appveyor_run_tests.ps1 index 78bae50b9..3bfaf216d 100644 --- a/ci/appveyor_run_tests.ps1 +++ b/ci/appveyor_run_tests.ps1 @@ -26,8 +26,7 @@ if ($NUNIT_STATUS -ne 0) { } # Embedded tests failing due to open issues, pass/fail only on Python exit code -# if ($PYTHON_STATUS -ne 0 -or $NUNIT_STATUS -ne 0) { -if ($PYTHON_STATUS -ne 0) { +if ($PYTHON_STATUS -ne 0 -or $NUNIT_STATUS -ne 0) { Write-Host "Tests failed" -ForegroundColor "Red" $host.SetShouldExit(1) } From c69297e1da11ea09f5f6576578028420771cb3e8 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 7 Feb 2017 18:18:25 -0700 Subject: [PATCH 105/324] Fix GC on PyObject during Finalizing Similar to how `PythonDerivedType` finalizes. Closes #364 Possibly related to #245 --- src/runtime/pyobject.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/pyobject.cs b/src/runtime/pyobject.cs index 4527e145f..3296d81f8 100644 --- a/src/runtime/pyobject.cs +++ b/src/runtime/pyobject.cs @@ -113,7 +113,7 @@ protected virtual void Dispose(bool disposing) { if (!disposed) { - if (Runtime.Py_IsInitialized() > 0) + if (Runtime.Py_IsInitialized() > 0 && !Runtime.IsFinalizing) { IntPtr gs = PythonEngine.AcquireLock(); Runtime.XDecref(obj); From c954442c3f2ae594ca318f298ebd4607ea7fab3d Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 7 Feb 2017 19:11:49 -0700 Subject: [PATCH 106/324] Update CHANGELOG --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05b8126ce..0dcf33d7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Code Coverage (#345) - Added `pysetargv` (#347) - Added XML Documentation (#349) +- Added Embedded tests on Appveyor (#353) - Added PY3 settings to configuration-manager (#346) ### Changed @@ -21,11 +22,11 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Completed refactor of Build Directives on `Runtime.cs` (#339) - Refactor python unittests (#329) - Unfroze Mono version on Travis (#345) -- Enabled Embedded tests on Appveyor (#353) ### Fixed -- Fixed crash during Shutdown (#343) +- Fixed crash during Initialization (#343) +- Fixed crash during Shutdown (#365) ### Removed From 79eeb61362e637e3eb8ec0676c748abd5013370d Mon Sep 17 00:00:00 2001 From: denfromufa Date: Wed, 8 Feb 2017 11:44:03 -0600 Subject: [PATCH 107/324] Add sys.args tests (#301) --- src/embed_tests/pyimport.cs | 14 +++++++++++--- src/tests/PyImportTest/sysargv.py | 5 +++++ src/tests/runtests.py | 3 +++ src/tests/test_sysargv.py | 17 +++++++++++++++++ src/tests/tests.pyproj | 2 ++ 5 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 src/tests/PyImportTest/sysargv.py create mode 100644 src/tests/test_sysargv.py diff --git a/src/embed_tests/pyimport.cs b/src/embed_tests/pyimport.cs index e4ba8d546..dc9d90fe2 100644 --- a/src/embed_tests/pyimport.cs +++ b/src/embed_tests/pyimport.cs @@ -1,9 +1,7 @@ using System; -using System.Reflection; -using System.Collections.Generic; +using System.IO; using NUnit.Framework; using Python.Runtime; -using System.IO; namespace Python.EmbeddingTest { @@ -55,5 +53,15 @@ public void TestDottedName() PyObject module = PythonEngine.ImportModule("PyImportTest.test.one"); Assert.IsNotNull(module, ">>> import PyImportTest.test.one # FAILED"); } + + /// + /// Tests that sys.args is set. If it wasn't exception would be raised. + /// + [Test] + public void TestSysArgsImportException() + { + PyObject module = PythonEngine.ImportModule("PyImportTest.sysargv"); + Assert.IsNotNull(module, ">>> import PyImportTest.sysargv # FAILED"); + } } } diff --git a/src/tests/PyImportTest/sysargv.py b/src/tests/PyImportTest/sysargv.py new file mode 100644 index 000000000..2e1508bff --- /dev/null +++ b/src/tests/PyImportTest/sysargv.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- + +import sys +# if argv is available, as expected, then no exception +num_args = len(sys.argv) diff --git a/src/tests/runtests.py b/src/tests/runtests.py index 9b77f99dd..92d9ecbd0 100644 --- a/src/tests/runtests.py +++ b/src/tests/runtests.py @@ -23,6 +23,9 @@ clr.AddReference("System.Management") test_modules = ( + # has to be first test before other module import clr + 'test_sysargv', + # test_module passes on its own, but not here if # other test modules that import System.Windows.Forms # run first. They must not do module level import/AddReference() diff --git a/src/tests/test_sysargv.py b/src/tests/test_sysargv.py new file mode 100644 index 000000000..eefb4d341 --- /dev/null +++ b/src/tests/test_sysargv.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- + +import unittest +import sys + +class SysArgvTests(unittest.TestCase): + """Test sys.argv state.""" + + def test_sys_argv_state(self): + """Test sys.argv state doesn't change after clr import.""" + argv = sys.argv + import clr + self.assertTrue(argv == sys.argv) + + +def test_suite(): + return unittest.makeSuite(SysArgvTests) diff --git a/src/tests/tests.pyproj b/src/tests/tests.pyproj index cf8f74a4a..5d042249e 100644 --- a/src/tests/tests.pyproj +++ b/src/tests/tests.pyproj @@ -29,12 +29,14 @@ + + From 3995130ab43bd43ea211350317778865813b1520 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 8 Feb 2017 11:09:48 -0700 Subject: [PATCH 108/324] Use NUnit from Nuget to ensure right version. --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index df89014f4..fcb0f265e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,7 +27,6 @@ addons: packages: - mono-devel - ca-certificates-mono - - nunit-console install: - pip install pycparser coverage codecov @@ -36,7 +35,7 @@ install: script: - export PYTHONPATH=`pwd`:$PYTHONPATH - python src/tests/runtests.py - # - nunit-console src/embed_tests/bin/Python.EmbeddingTest.dll + # - mono ./packages/NUnit.Runners*/tools/nunit-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll after_success: # Uncomment if need to geninterop, ie. py37 final From 4919bffd2d861376cf04fa5acdfe9731f114c148 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 8 Feb 2017 19:01:10 -0700 Subject: [PATCH 109/324] Simplify Embedded tests & Add new tests (#369) * Add Tuple tests * Update AppVeyor comments and show when tests start. * Rename InitializeTest to pyinitialize Keep consistent with other test classes. * Simplify embed_tests Since the previous bug involving initialize/finalize have been solved, we can confidently upgrade these test to use simpler format. Also Remove Assert fail messages NUnit already says the name of which test failed. --- ci/appveyor_run_tests.ps1 | 4 +- src/embed_tests/Python.EmbeddingTest.csproj | 3 +- src/embed_tests/pyimport.cs | 30 +++--- .../{InitializeTest.cs => pyinitialize.cs} | 6 +- src/embed_tests/pyiter.cs | 43 +++------ src/embed_tests/pylong.cs | 27 ++---- src/embed_tests/pyobject.cs | 25 +---- src/embed_tests/pythonexception.cs | 7 ++ src/embed_tests/pytuple.cs | 94 +++++++++++++++++++ 9 files changed, 148 insertions(+), 91 deletions(-) rename src/embed_tests/{InitializeTest.cs => pyinitialize.cs} (89%) create mode 100644 src/embed_tests/pytuple.cs diff --git a/ci/appveyor_run_tests.ps1 b/ci/appveyor_run_tests.ps1 index 3bfaf216d..300b2caa0 100644 --- a/ci/appveyor_run_tests.ps1 +++ b/ci/appveyor_run_tests.ps1 @@ -12,6 +12,7 @@ $RUNTIME_DIR = ".\src\runtime\bin\" # Run python tests with C# coverage # why `2>&1 | %{ "$_" }`? see: http://stackoverflow.com/a/20950421/5208670 +Write-Host ("Starting Python tests") -ForegroundColor "Green" .$OPENCOVER -register:user -searchdirs:"$RUNTIME_DIR" -output:py.coverage -target:"$PY" -targetargs:src\tests\runtests.py -returntargetcode 2>&1 | %{ "$_" } $PYTHON_STATUS = $LastExitCode if ($PYTHON_STATUS -ne 0) { @@ -19,13 +20,14 @@ if ($PYTHON_STATUS -ne 0) { } # Run Embedded tests with C# coverage +Write-Host ("Starting embedded tests") -ForegroundColor "Green" .$OPENCOVER -register:user -searchdirs:"$RUNTIME_DIR" -output:cs.coverage -target:"$NUNIT" -targetargs:"$CS_TESTS" -returntargetcode $NUNIT_STATUS = $LastExitCode if ($NUNIT_STATUS -ne 0) { Write-Host "Embedded tests failed" -ForegroundColor "Red" } -# Embedded tests failing due to open issues, pass/fail only on Python exit code +# Set exit code to fail if either Python or Embedded tests failed if ($PYTHON_STATUS -ne 0 -or $NUNIT_STATUS -ne 0) { Write-Host "Tests failed" -ForegroundColor "Red" $host.SetShouldExit(1) diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index 48fe2554e..9cca794b4 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -75,12 +75,13 @@ - + + diff --git a/src/embed_tests/pyimport.cs b/src/embed_tests/pyimport.cs index dc9d90fe2..ebdc5b125 100644 --- a/src/embed_tests/pyimport.cs +++ b/src/embed_tests/pyimport.cs @@ -5,6 +5,18 @@ namespace Python.EmbeddingTest { + /// + /// Test Import unittests and regressions + /// + /// + /// Keeping in old-style SetUp/TearDown due to required SetUp. + /// The required directory structure was added to .\pythonnet\src\tests\ directory: + /// + PyImportTest/ + /// | - __init__.py + /// | + test/ + /// | | - __init__.py + /// | | - one.py + /// [TestFixture] public class PyImportTest { @@ -18,10 +30,8 @@ public void SetUp() /* Append the tests directory to sys.path * using reflection to circumvent the private - * modifiers placed on most Runtime methods. - */ - const string s = @"../../tests"; - + * modifiers placed on most Runtime methods. */ + const string s = "../../tests"; string testPath = Path.Combine(TestContext.CurrentContext.TestDirectory, s); IntPtr str = Runtime.Runtime.PyString_FromString(testPath); @@ -39,19 +49,11 @@ public void TearDown() /// /// Test subdirectory import /// - /// - /// The required directory structure was added to .\pythonnet\src\tests\ directory: - /// + PyImportTest/ - /// | - __init__.py - /// | + test/ - /// | | - __init__.py - /// | | - one.py - /// [Test] public void TestDottedName() { PyObject module = PythonEngine.ImportModule("PyImportTest.test.one"); - Assert.IsNotNull(module, ">>> import PyImportTest.test.one # FAILED"); + Assert.IsNotNull(module); } /// @@ -61,7 +63,7 @@ public void TestDottedName() public void TestSysArgsImportException() { PyObject module = PythonEngine.ImportModule("PyImportTest.sysargv"); - Assert.IsNotNull(module, ">>> import PyImportTest.sysargv # FAILED"); + Assert.IsNotNull(module); } } } diff --git a/src/embed_tests/InitializeTest.cs b/src/embed_tests/pyinitialize.cs similarity index 89% rename from src/embed_tests/InitializeTest.cs rename to src/embed_tests/pyinitialize.cs index 3c5974fb5..71aea58be 100644 --- a/src/embed_tests/InitializeTest.cs +++ b/src/embed_tests/pyinitialize.cs @@ -1,13 +1,9 @@ using NUnit.Framework; using Python.Runtime; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; namespace Python.EmbeddingTest { - public class InitializeTest + public class PyInitializeTest { [Test] public static void LoadSpecificArgs() diff --git a/src/embed_tests/pyiter.cs b/src/embed_tests/pyiter.cs index 1f0c651f8..b110903f6 100644 --- a/src/embed_tests/pyiter.cs +++ b/src/embed_tests/pyiter.cs @@ -1,45 +1,30 @@ -using System; using System.Collections.Generic; using NUnit.Framework; using Python.Runtime; namespace Python.EmbeddingTest { - [TestFixture] public class PyIterTest { - private IntPtr gs; - - [SetUp] - public void SetUp() - { - PythonEngine.Initialize(); - gs = PythonEngine.AcquireLock(); - } - - [TearDown] - public void TearDown() - { - PythonEngine.ReleaseLock(gs); - PythonEngine.Shutdown(); - } - [Test] public void TestOnPyList() { - var list = new PyList(); - list.Append(new PyString("foo")); - list.Append(new PyString("bar")); - list.Append(new PyString("baz")); - var result = new List(); - foreach (PyObject item in list) + using (Py.GIL()) { - result.Add(item.ToString()); + var list = new PyList(); + list.Append(new PyString("foo")); + list.Append(new PyString("bar")); + list.Append(new PyString("baz")); + var result = new List(); + foreach (PyObject item in list) + { + result.Add(item.ToString()); + } + Assert.AreEqual(3, result.Count); + Assert.AreEqual("foo", result[0]); + Assert.AreEqual("bar", result[1]); + Assert.AreEqual("baz", result[2]); } - Assert.AreEqual(3, result.Count); - Assert.AreEqual("foo", result[0]); - Assert.AreEqual("bar", result[1]); - Assert.AreEqual("baz", result[2]); } } } diff --git a/src/embed_tests/pylong.cs b/src/embed_tests/pylong.cs index 3a7365a61..37cf1042d 100644 --- a/src/embed_tests/pylong.cs +++ b/src/embed_tests/pylong.cs @@ -1,34 +1,19 @@ -using System; using NUnit.Framework; using Python.Runtime; namespace Python.EmbeddingTest { - [TestFixture] public class PyLongTest { - private IntPtr gs; - - [SetUp] - public void SetUp() - { - PythonEngine.Initialize(); - gs = PythonEngine.AcquireLock(); - } - - [TearDown] - public void TearDown() - { - PythonEngine.ReleaseLock(gs); - PythonEngine.Shutdown(); - } - [Test] public void TestToInt64() { - long largeNumber = 8L * 1024L * 1024L * 1024L; // 8 GB - var pyLargeNumber = new PyLong(largeNumber); - Assert.AreEqual(largeNumber, pyLargeNumber.ToInt64()); + using (Py.GIL()) + { + long largeNumber = 8L * 1024L * 1024L * 1024L; // 8 GB + var pyLargeNumber = new PyLong(largeNumber); + Assert.AreEqual(largeNumber, pyLargeNumber.ToInt64()); + } } } } diff --git a/src/embed_tests/pyobject.cs b/src/embed_tests/pyobject.cs index c0f18df39..f114d3d9e 100644 --- a/src/embed_tests/pyobject.cs +++ b/src/embed_tests/pyobject.cs @@ -1,33 +1,18 @@ -using System; using NUnit.Framework; using Python.Runtime; namespace Python.EmbeddingTest { - [TestFixture] public class PyObjectTest { - private IntPtr gs; - - [SetUp] - public void SetUp() - { - PythonEngine.Initialize(); - gs = PythonEngine.AcquireLock(); - } - - [TearDown] - public void TearDown() - { - PythonEngine.ReleaseLock(gs); - PythonEngine.Shutdown(); - } - [Test] public void TestUnicode() { - PyObject s = new PyString("foo\u00e9"); - Assert.AreEqual("foo\u00e9", s.ToString()); + using (Py.GIL()) + { + PyObject s = new PyString("foo\u00e9"); + Assert.AreEqual("foo\u00e9", s.ToString()); + } } } } diff --git a/src/embed_tests/pythonexception.cs b/src/embed_tests/pythonexception.cs index aaaf2c61c..0b7771d96 100644 --- a/src/embed_tests/pythonexception.cs +++ b/src/embed_tests/pythonexception.cs @@ -4,6 +4,13 @@ namespace Python.EmbeddingTest { + /// + /// Test Python Exceptions + /// + /// + /// Keeping this in the old-style SetUp/TearDown + /// to ensure that setup still works. + /// [TestFixture] public class PythonExceptionTest { diff --git a/src/embed_tests/pytuple.cs b/src/embed_tests/pytuple.cs new file mode 100644 index 000000000..ea2319d3c --- /dev/null +++ b/src/embed_tests/pytuple.cs @@ -0,0 +1,94 @@ +using NUnit.Framework; +using Python.Runtime; + +namespace Python.EmbeddingTest +{ + public class PyTupleTest + { + [Test] + public void TestPyTupleEmpty() + { + using (Py.GIL()) + { + var t = new PyTuple(); + Assert.AreEqual(0, t.Length()); + } + } + + [Test] + [ExpectedException("Python.Runtime.PythonException")] + public void TestPyTupleInvalidAppend() + { + using (Py.GIL()) + { + PyObject s = new PyString("foo"); + var t = new PyTuple(); + t.Concat(s); + } + } + + [Test] + public void TestPyTupleValidAppend() + { + using (Py.GIL()) + { + var t0 = new PyTuple(); + var t = new PyTuple(); + t.Concat(t0); + Assert.IsNotNull(t); + Assert.IsInstanceOf(typeof(PyTuple), t); + } + } + + [Test] + public void TestPyTupleIsTupleType() + { + using (Py.GIL()) + { + var s = new PyString("foo"); + var t = new PyTuple(); + Assert.IsTrue(PyTuple.IsTupleType(t)); + Assert.IsFalse(PyTuple.IsTupleType(s)); + } + } + + [Test] + public void TestPyTupleStringConvert() + { + using (Py.GIL()) + { + PyObject s = new PyString("foo"); + PyTuple t = PyTuple.AsTuple(s); + Assert.IsNotNull(t); + Assert.IsInstanceOf(typeof(PyTuple), t); + Assert.AreEqual("f", t[0].ToString()); + Assert.AreEqual("o", t[1].ToString()); + Assert.AreEqual("o", t[2].ToString()); + } + } + + [Test] + public void TestPyTupleValidConvert() + { + using (Py.GIL()) + { + var l = new PyList(); + PyTuple t = PyTuple.AsTuple(l); + Assert.IsNotNull(t); + Assert.IsInstanceOf(typeof(PyTuple), t); + } + } + + [Test] + public void TestNewPyTupleFromPyTuple() + { + using (Py.GIL()) + { + var t0 = new PyTuple(); + var t = new PyTuple(t0); + Assert.IsNotNull(t); + Assert.IsInstanceOf(typeof(PyTuple), t); + } + } + } +} From 9cfb4f19fd18ba29d585ec6de04f6be4413b74e6 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 8 Feb 2017 19:05:24 -0700 Subject: [PATCH 110/324] Add e-mail to remove setup.py warnings --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index a7c2910ac..85d5da3d9 100644 --- a/setup.py +++ b/setup.py @@ -373,6 +373,7 @@ def run(self): url='https://pythonnet.github.io/', license='MIT', author="The Python for .Net developers", + email="pythondotnet@python.org", setup_requires=setup_requires, long_description=_get_long_description(), ext_modules=[ From 58bc902b521fcb89a91d6d01b75c063921737bc3 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 8 Feb 2017 19:13:53 -0700 Subject: [PATCH 111/324] Update NUnit syntax Use xUnit2 and nUnit3 friendly syntax --- setup.py | 2 +- src/embed_tests/pyinitialize.cs | 6 +++--- src/embed_tests/pythonexception.cs | 2 +- src/embed_tests/pytuple.cs | 3 +-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/setup.py b/setup.py index 85d5da3d9..f2790ddd3 100644 --- a/setup.py +++ b/setup.py @@ -373,7 +373,7 @@ def run(self): url='https://pythonnet.github.io/', license='MIT', author="The Python for .Net developers", - email="pythondotnet@python.org", + author_email="pythondotnet@python.org", setup_requires=setup_requires, long_description=_get_long_description(), ext_modules=[ diff --git a/src/embed_tests/pyinitialize.cs b/src/embed_tests/pyinitialize.cs index 71aea58be..bfd95aaab 100644 --- a/src/embed_tests/pyinitialize.cs +++ b/src/embed_tests/pyinitialize.cs @@ -12,8 +12,8 @@ public static void LoadSpecificArgs() using (new PythonEngine(args)) using (var argv = new PyList(Runtime.Runtime.PySys_GetObject("argv"))) { - Assert.That(argv[0].ToString() == args[0]); - Assert.That(argv[1].ToString() == args[1]); + Assert.AreEqual(args[0], argv[0].ToString()); + Assert.AreEqual(args[1], argv[1].ToString()); } } @@ -23,7 +23,7 @@ public static void LoadDefaultArgs() using (new PythonEngine()) using (var argv = new PyList(Runtime.Runtime.PySys_GetObject("argv"))) { - Assert.That(argv.Length() != 0); + Assert.AreNotEqual(0, argv.Length()); } } diff --git a/src/embed_tests/pythonexception.cs b/src/embed_tests/pythonexception.cs index 0b7771d96..7811bd37b 100644 --- a/src/embed_tests/pythonexception.cs +++ b/src/embed_tests/pythonexception.cs @@ -47,7 +47,7 @@ public void TestMessage() [Test] public void TestNoError() { - var e = new PythonException(); //There is no PyErr to fetch + var e = new PythonException(); // There is no PyErr to fetch Assert.AreEqual("", e.Message); } } diff --git a/src/embed_tests/pytuple.cs b/src/embed_tests/pytuple.cs index ea2319d3c..18a6ea344 100644 --- a/src/embed_tests/pytuple.cs +++ b/src/embed_tests/pytuple.cs @@ -16,14 +16,13 @@ public void TestPyTupleEmpty() } [Test] - [ExpectedException("Python.Runtime.PythonException")] public void TestPyTupleInvalidAppend() { using (Py.GIL()) { PyObject s = new PyString("foo"); var t = new PyTuple(); - t.Concat(s); + Assert.Throws(() => t.Concat(s)); } } From 310d50d3da15f5ac748c19b58d60cd15ea5ccd89 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 9 Feb 2017 00:52:59 -0700 Subject: [PATCH 112/324] Use string interpolation Removed extra newline at beginning from deprecation warning message --- src/runtime/assemblymanager.cs | 7 +++---- src/runtime/classbase.cs | 3 +-- src/runtime/classderived.cs | 2 +- src/runtime/constructorbinding.cs | 3 +-- src/runtime/converter.cs | 21 +++++++-------------- src/runtime/moduleobject.cs | 3 ++- 6 files changed, 15 insertions(+), 24 deletions(-) diff --git a/src/runtime/assemblymanager.cs b/src/runtime/assemblymanager.cs index c86e7a473..06a4449a2 100644 --- a/src/runtime/assemblymanager.cs +++ b/src/runtime/assemblymanager.cs @@ -1,9 +1,9 @@ using System; using System.Collections; -using System.IO; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; +using System.IO; using System.Reflection; using System.Threading; @@ -323,9 +323,8 @@ public static bool LoadImplicit(string name, bool warn = true) if (warn && loaded) { string location = Path.GetFileNameWithoutExtension(lastAssembly.Location); - string deprWarning = $@" -The module was found, but not in a referenced namespace. -Implicit loading is deprecated. Please use clr.AddReference(""{location}"")."; + string deprWarning = "The module was found, but not in a referenced namespace.\n" + + $"Implicit loading is deprecated. Please use clr.AddReference('{location}')."; Exceptions.deprecation(deprWarning); } diff --git a/src/runtime/classbase.cs b/src/runtime/classbase.cs index e480b309a..4dd3b5364 100644 --- a/src/runtime/classbase.cs +++ b/src/runtime/classbase.cs @@ -199,8 +199,7 @@ public static IntPtr tp_iter(IntPtr ob) if (o == null) { - var message = "iteration over non-sequence"; - return Exceptions.RaiseTypeError(message); + return Exceptions.RaiseTypeError("iteration over non-sequence"); } } diff --git a/src/runtime/classderived.cs b/src/runtime/classderived.cs index 0f8f156e8..c180f9acc 100644 --- a/src/runtime/classderived.cs +++ b/src/runtime/classderived.cs @@ -737,7 +737,7 @@ public static void InvokeMethodVoid(IPythonDerivedType obj, string methodName, s if (origMethodName == null) { - throw new NotImplementedException("Python object does not have a '" + methodName + "' method"); + throw new NotImplementedException($"Python object does not have a '{methodName}' method"); } obj.GetType().InvokeMember(origMethodName, diff --git a/src/runtime/constructorbinding.cs b/src/runtime/constructorbinding.cs index d17d6ac96..e756cd4d2 100644 --- a/src/runtime/constructorbinding.cs +++ b/src/runtime/constructorbinding.cs @@ -104,8 +104,7 @@ public static IntPtr mp_subscript(IntPtr op, IntPtr key) ConstructorInfo ci = self.type.GetConstructor(types); if (ci == null) { - var msg = "No match found for constructor signature"; - return Exceptions.RaiseTypeError(msg); + return Exceptions.RaiseTypeError("No match found for constructor signature"); } var boundCtor = new BoundContructor(self.type, self.pyTypeHndl, self.ctorBinder, ci); diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index fa5d73c86..3a3fa309d 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -1,9 +1,9 @@ using System; +using System.Collections; +using System.Globalization; using System.Reflection; using System.Runtime.InteropServices; -using System.Globalization; using System.Security; -using System.Collections; namespace Python.Runtime { @@ -292,9 +292,7 @@ internal static bool ToManagedValue(IntPtr value, Type obType, result = tmp; return true; } - var err = "value cannot be converted to {0}"; - err = string.Format(err, obType); - Exceptions.SetError(Exceptions.TypeError, err); + Exceptions.SetError(Exceptions.TypeError, $"value cannot be converted to {obType}"); return false; } if (mt is ClassBase) @@ -793,10 +791,8 @@ private static bool ToPrimitive(IntPtr value, Type obType, out object result, bo if (setError) { - var format = "'{0}' value cannot be converted to {1}"; string tpName = Runtime.PyObject_GetTypeName(value); - string error = string.Format(format, tpName, obType); - Exceptions.SetError(Exceptions.TypeError, error); + Exceptions.SetError(Exceptions.TypeError, $"'{tpName}' value cannot be converted to {obType}"); } return false; @@ -805,8 +801,7 @@ private static bool ToPrimitive(IntPtr value, Type obType, out object result, bo if (setError) { - var error = "value too large to convert"; - Exceptions.SetError(Exceptions.OverflowError, error); + Exceptions.SetError(Exceptions.OverflowError, "value too large to convert"); } return false; @@ -818,8 +813,7 @@ private static void SetConversionError(IntPtr value, Type target) IntPtr ob = Runtime.PyObject_Repr(value); string src = Runtime.GetManagedString(ob); Runtime.XDecref(ob); - string error = string.Format("Cannot convert {0} to {1}", src, target); - Exceptions.SetError(Exceptions.TypeError, error); + Exceptions.SetError(Exceptions.TypeError, $"Cannot convert {src} to {target}"); } @@ -901,8 +895,7 @@ private static bool ToEnum(IntPtr value, Type obType, out object result, bool se if (setError) { - var error = "invalid enumeration value"; - Exceptions.SetError(Exceptions.ValueError, error); + Exceptions.SetError(Exceptions.ValueError, "invalid enumeration value"); } return false; diff --git a/src/runtime/moduleobject.cs b/src/runtime/moduleobject.cs index b324e6f3a..258d77bac 100644 --- a/src/runtime/moduleobject.cs +++ b/src/runtime/moduleobject.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Reflection; using System.Runtime.InteropServices; @@ -396,7 +397,7 @@ public static Assembly AddReference(string name) } if (assembly == null) { - throw new System.IO.FileNotFoundException($"Unable to find assembly '{name}'."); + throw new FileNotFoundException($"Unable to find assembly '{name}'."); } return assembly; From a2e8d46ced7d8ec6c6cf54ce7ec09bfe255e35d9 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 9 Feb 2017 14:49:47 -0700 Subject: [PATCH 113/324] Replace PyString_FromStringAndSize usage to PyString_FromString --- src/runtime/fieldobject.cs | 3 +-- src/runtime/methodbinding.cs | 4 ++-- src/runtime/methodobject.cs | 3 +-- src/runtime/modulefunctionobject.cs | 3 +-- src/runtime/propertyobject.cs | 3 +-- src/runtime/pyansistring.cs | 2 +- 6 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/runtime/fieldobject.cs b/src/runtime/fieldobject.cs index 96572e5a5..7c9a466d5 100644 --- a/src/runtime/fieldobject.cs +++ b/src/runtime/fieldobject.cs @@ -136,8 +136,7 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) public static IntPtr tp_repr(IntPtr ob) { var self = (FieldObject)GetManagedObject(ob); - string s = $""; - return Runtime.PyString_FromStringAndSize(s, s.Length); + return Runtime.PyString_FromString($""); } } } diff --git a/src/runtime/methodbinding.cs b/src/runtime/methodbinding.cs index 22b883186..df6632068 100644 --- a/src/runtime/methodbinding.cs +++ b/src/runtime/methodbinding.cs @@ -231,8 +231,8 @@ public static IntPtr tp_repr(IntPtr ob) { var self = (MethodBinding)GetManagedObject(ob); string type = self.target == IntPtr.Zero ? "unbound" : "bound"; - string s = string.Format("<{0} method '{1}'>", type, self.m.name); - return Runtime.PyString_FromStringAndSize(s, s.Length); + string name = self.m.name; + return Runtime.PyString_FromString($"<{type} method '{name}'>"); } /// diff --git a/src/runtime/methodobject.cs b/src/runtime/methodobject.cs index d2d821eb5..8df9c8029 100644 --- a/src/runtime/methodobject.cs +++ b/src/runtime/methodobject.cs @@ -187,8 +187,7 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) public static IntPtr tp_repr(IntPtr ob) { var self = (MethodObject)GetManagedObject(ob); - string s = string.Format("", self.name); - return Runtime.PyString_FromStringAndSize(s, s.Length); + return Runtime.PyString_FromString($""); } /// diff --git a/src/runtime/modulefunctionobject.cs b/src/runtime/modulefunctionobject.cs index aa4c8fb06..8f8692af9 100644 --- a/src/runtime/modulefunctionobject.cs +++ b/src/runtime/modulefunctionobject.cs @@ -33,8 +33,7 @@ public static IntPtr tp_call(IntPtr ob, IntPtr args, IntPtr kw) public new static IntPtr tp_repr(IntPtr ob) { var self = (ModuleFunctionObject)GetManagedObject(ob); - string s = $""; - return Runtime.PyString_FromStringAndSize(s, s.Length); + return Runtime.PyString_FromString($""); } } } diff --git a/src/runtime/propertyobject.cs b/src/runtime/propertyobject.cs index 7d758e38e..f2c97f163 100644 --- a/src/runtime/propertyobject.cs +++ b/src/runtime/propertyobject.cs @@ -158,8 +158,7 @@ public static IntPtr tp_descr_get(IntPtr ds, IntPtr ob, IntPtr tp) public static IntPtr tp_repr(IntPtr ob) { var self = (PropertyObject)GetManagedObject(ob); - string s = $""; - return Runtime.PyString_FromStringAndSize(s, s.Length); + return Runtime.PyString_FromString($""); } } } diff --git a/src/runtime/pyansistring.cs b/src/runtime/pyansistring.cs index 4973d8b2a..4843e5e2c 100644 --- a/src/runtime/pyansistring.cs +++ b/src/runtime/pyansistring.cs @@ -44,7 +44,7 @@ public PyAnsiString(PyObject o) /// public PyAnsiString(string s) { - obj = Runtime.PyString_FromStringAndSize(s, s.Length); + obj = Runtime.PyString_FromString(s); if (obj == IntPtr.Zero) { throw new PythonException(); From 54841da1d2a25bb58526bd58b45a13f312aad20e Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 13 Feb 2017 10:27:57 -0700 Subject: [PATCH 114/324] Fix xml-docs build warnings --- src/runtime/constructorbinding.cs | 9 +++------ src/runtime/exceptions.cs | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/runtime/constructorbinding.cs b/src/runtime/constructorbinding.cs index e756cd4d2..4839f9913 100644 --- a/src/runtime/constructorbinding.cs +++ b/src/runtime/constructorbinding.cs @@ -82,14 +82,11 @@ public static IntPtr tp_descr_get(IntPtr op, IntPtr instance, IntPtr owner) /// /// Implement explicit overload selection using subscript syntax ([]). /// - /// + /// /// ConstructorBinding.GetItem(PyObject *o, PyObject *key) /// Return element of o corresponding to the object key or NULL on failure. /// This is the equivalent of the Python expression o[key]. - /// - /// - /// - /// + /// public static IntPtr mp_subscript(IntPtr op, IntPtr key) { var self = (ConstructorBinding)GetManagedObject(op); @@ -183,7 +180,7 @@ public BoundContructor(Type type, IntPtr pyTypeHndl, ConstructorBinder ctorBinde /// /// BoundContructor.__call__(PyObject *callable_object, PyObject *args, PyObject *kw) /// - /// PyObject *callable_object + /// PyObject *callable_object /// PyObject *args /// PyObject *kw /// A reference to a new instance of the class by invoking the selected ctor(). diff --git a/src/runtime/exceptions.cs b/src/runtime/exceptions.cs index b18cd7d69..21300f500 100644 --- a/src/runtime/exceptions.cs +++ b/src/runtime/exceptions.cs @@ -134,10 +134,10 @@ internal static void Shutdown() /// __getattr__ implementation, and thus dereferencing a NULL /// pointer. /// - /// A CLR exception /// The python object wrapping internal static void SetArgsAndCause(IntPtr ob) { + // e: A CLR Exception Exception e = ExceptionClassObject.ToException(ob); if (e == null) { From a5d325f79d599d1e38b7e62a8e13f15641520738 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 13 Feb 2017 14:46:17 -0700 Subject: [PATCH 115/324] Refactor AppVeyor/Travis embedded test_runner Make it easier to diff and upgrade versions by breaking into multiple lines and using path completion Powershell continuation: http://stackoverflow.com/a/2608186/5208670 Powershell options splatting: http://stackoverflow.com/a/24313253/5208670 --- .travis.yml | 2 +- ci/appveyor_run_tests.ps1 | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index fcb0f265e..fd462ea6a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,7 +35,7 @@ install: script: - export PYTHONPATH=`pwd`:$PYTHONPATH - python src/tests/runtests.py - # - mono ./packages/NUnit.Runners*/tools/nunit-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll + # - mono ./packages/NUnit.*/tools/nunit-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll after_success: # Uncomment if need to geninterop, ie. py37 final diff --git a/ci/appveyor_run_tests.ps1 b/ci/appveyor_run_tests.ps1 index 300b2caa0..18005a047 100644 --- a/ci/appveyor_run_tests.ps1 +++ b/ci/appveyor_run_tests.ps1 @@ -3,7 +3,7 @@ # Executable paths for OpenCover # Note if OpenCover fails, it won't affect the exit codes. $OPENCOVER = Resolve-Path .\packages\OpenCover.*\tools\OpenCover.Console.exe -$NUNIT = Resolve-Path .\packages\NUnit.Runners*\tools\"$env:NUNIT".exe +$NUNIT = Resolve-Path .\packages\NUnit.*\tools\"$env:NUNIT".exe $PY = Get-Command python # Can't use ".\build\*\Python.EmbeddingTest.dll". Missing framework files. @@ -13,15 +13,22 @@ $RUNTIME_DIR = ".\src\runtime\bin\" # Run python tests with C# coverage # why `2>&1 | %{ "$_" }`? see: http://stackoverflow.com/a/20950421/5208670 Write-Host ("Starting Python tests") -ForegroundColor "Green" -.$OPENCOVER -register:user -searchdirs:"$RUNTIME_DIR" -output:py.coverage -target:"$PY" -targetargs:src\tests\runtests.py -returntargetcode 2>&1 | %{ "$_" } +.$OPENCOVER -register:user -searchdirs:"$RUNTIME_DIR" -output:py.coverage ` + -target:"$PY" -targetargs:src\tests\runtests.py ` + -returntargetcode ` + 2>&1 | %{ "$_" } $PYTHON_STATUS = $LastExitCode if ($PYTHON_STATUS -ne 0) { Write-Host "Python tests failed, continuing to embedded tests" -ForegroundColor "Red" } # Run Embedded tests with C# coverage +# Powershell continuation: http://stackoverflow.com/a/2608186/5208670 +# Powershell options splatting: http://stackoverflow.com/a/24313253/5208670 Write-Host ("Starting embedded tests") -ForegroundColor "Green" -.$OPENCOVER -register:user -searchdirs:"$RUNTIME_DIR" -output:cs.coverage -target:"$NUNIT" -targetargs:"$CS_TESTS" -returntargetcode +.$OPENCOVER -register:user -searchdirs:"$RUNTIME_DIR" -output:cs.coverage ` + -target:"$NUNIT" -targetargs:"$CS_TESTS" ` + -returntargetcode $NUNIT_STATUS = $LastExitCode if ($NUNIT_STATUS -ne 0) { Write-Host "Embedded tests failed" -ForegroundColor "Red" From ba7794b616ea810a457cdbd4728077d085105319 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 13 Jan 2017 12:09:52 -0700 Subject: [PATCH 116/324] Add pytest to CI pytest on travis initially required `sudo=required` otherwise failed. Without the sudo flag pytest wasn't being upgraded. Needed to force upgrade. https://github.com/pytest-dev/pytest/issues/2240 --- .travis.yml | 6 ++++-- appveyor.yml | 2 +- ci/appveyor_run_tests.ps1 | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index fd462ea6a..7043d4893 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,6 @@ sudo: false +# language: csharp installs mono/dotnet but has limited python. language: python python: - 2.7 @@ -29,12 +30,13 @@ addons: - ca-certificates-mono install: - - pip install pycparser coverage codecov + - pip install --upgrade pycparser coverage codecov pytest + # setup.py install works too, but need to deal w Python.test then - coverage run setup.py build_ext --inplace script: - export PYTHONPATH=`pwd`:$PYTHONPATH - - python src/tests/runtests.py + - python -m pytest # - mono ./packages/NUnit.*/tools/nunit-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll after_success: diff --git a/appveyor.yml b/appveyor.yml index fd5822ac9..6876bb442 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -48,7 +48,7 @@ init: install: # install for wheels & coverage - - pip install --upgrade pip wheel coverage codecov + - pip install --upgrade pip wheel coverage codecov pytest # Install OpenCover. Can't put on packages.config; not Linux/Mono compatible - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages diff --git a/ci/appveyor_run_tests.ps1 b/ci/appveyor_run_tests.ps1 index 18005a047..974114cdb 100644 --- a/ci/appveyor_run_tests.ps1 +++ b/ci/appveyor_run_tests.ps1 @@ -14,7 +14,7 @@ $RUNTIME_DIR = ".\src\runtime\bin\" # why `2>&1 | %{ "$_" }`? see: http://stackoverflow.com/a/20950421/5208670 Write-Host ("Starting Python tests") -ForegroundColor "Green" .$OPENCOVER -register:user -searchdirs:"$RUNTIME_DIR" -output:py.coverage ` - -target:"$PY" -targetargs:src\tests\runtests.py ` + -target:"$PY" -targetargs:"-m pytest" ` -returntargetcode ` 2>&1 | %{ "$_" } $PYTHON_STATUS = $LastExitCode From 1ea29c71a4b1fec28fc90d9c4deff1305e5d7cdb Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 14 Jan 2017 20:10:27 -0700 Subject: [PATCH 117/324] Convert unittest to pytest Needs local imports to work. Conversion done with unittests2pytests and a couple regex --- src/tests/_compat.py | 2 +- src/tests/{test_suite => }/_missing_import.py | 0 src/tests/conftest.py | 57 + src/tests/leaktest.py | 8 +- src/tests/profile.py | 2 +- src/tests/runtests.py | 62 +- src/tests/stress.py | 4 +- src/tests/stresstest.py | 2 +- src/tests/test_array.py | 2115 +++++++++-------- src/tests/test_callback.py | 27 + src/tests/test_class.py | 391 +-- src/tests/test_compat.py | 438 ++-- src/tests/test_constructors.py | 62 +- src/tests/test_conversion.py | 979 ++++---- src/tests/test_delegate.py | 365 +-- src/tests/test_docstring.py | 37 +- src/tests/test_engine.py | 59 +- src/tests/test_enum.py | 271 ++- src/tests/test_event.py | 789 +++--- src/tests/test_exceptions.py | 523 ++-- src/tests/test_field.py | 541 +++-- src/tests/test_generic.py | 1525 ++++++------ src/tests/test_import.py | 13 + src/tests/test_indexer.py | 802 ++++--- src/tests/test_interface.py | 93 +- src/tests/test_method.py | 1238 +++++----- src/tests/test_module.py | 647 ++--- src/tests/test_property.py | 201 +- src/tests/test_recursive_types.py | 12 + src/tests/test_subclass.py | 223 +- src/tests/test_suite/__init__.py | 15 - src/tests/test_suite/test_callback.py | 33 - src/tests/test_suite/test_import.py | 18 - src/tests/test_suite/test_recursive_types.py | 19 - src/tests/test_sysargv.py | 19 +- src/tests/test_thread.py | 88 +- src/tests/utils.py | 2 +- 37 files changed, 5937 insertions(+), 5745 deletions(-) rename src/tests/{test_suite => }/_missing_import.py (100%) create mode 100644 src/tests/conftest.py create mode 100644 src/tests/test_callback.py create mode 100644 src/tests/test_import.py create mode 100644 src/tests/test_recursive_types.py delete mode 100644 src/tests/test_suite/__init__.py delete mode 100644 src/tests/test_suite/test_callback.py delete mode 100644 src/tests/test_suite/test_import.py delete mode 100644 src/tests/test_suite/test_recursive_types.py diff --git a/src/tests/_compat.py b/src/tests/_compat.py index 3a9d48c7e..178777e4a 100644 --- a/src/tests/_compat.py +++ b/src/tests/_compat.py @@ -33,7 +33,7 @@ unicode = str # from nowhere import Nothing - cmp = lambda a, b: (a > b) - (a < b) # No Py3 equivalent + cmp = lambda a, b: (a > b) - (a < b) # No PY3 equivalent map = map range = range zip = zip diff --git a/src/tests/test_suite/_missing_import.py b/src/tests/_missing_import.py similarity index 100% rename from src/tests/test_suite/_missing_import.py rename to src/tests/_missing_import.py diff --git a/src/tests/conftest.py b/src/tests/conftest.py new file mode 100644 index 000000000..85fff291f --- /dev/null +++ b/src/tests/conftest.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# TODO: move tests one out of src. Pythonnet doesn't run... + +"""Helpers for testing.""" + +import io +import os +import sys + +import pytest +import clr + +sys.path.append('C:/testdir/') +clr.AddReference("Python.Test") +clr.AddReference("System.Collections") +clr.AddReference("System.Data") + +DIR_PATH = os.path.dirname(__file__) +FILES_DIR = os.path.join(DIR_PATH, 'files') + + +@pytest.fixture() +def filepath(): + """Returns full file path for test files.""" + + def make_filepath(filename): + # http://stackoverflow.com/questions/18011902/parameter-to-a-fixture + # Alternate solution is to use paramtrization `inderect=True` + # http://stackoverflow.com/a/33879151 + # Syntax is noisy and requires specific variable names + return os.path.join(FILES_DIR, filename) + + return make_filepath + + +@pytest.fixture() +def load_file(filepath): + """Opens filename with encoding and return its contents.""" + + def make_load_file(filename, encoding='utf-8'): + # http://stackoverflow.com/questions/18011902/parameter-to-a-fixture + # Alternate solution is to use paramtrization `inderect=True` + # http://stackoverflow.com/a/33879151 + # Syntax is noisy and requires specific variable names + # And seems to be limited to only 1 argument. + with io.open(filepath(filename), encoding=encoding) as f: + return f.read().strip() + + return make_load_file + + +@pytest.fixture() +def get_stream(filepath): + def make_stream(filename, encoding='utf-8'): + return io.open(filepath(filename), encoding=encoding) + + return make_stream diff --git a/src/tests/leaktest.py b/src/tests/leaktest.py index 646cb512e..05b76e867 100644 --- a/src/tests/leaktest.py +++ b/src/tests/leaktest.py @@ -10,10 +10,10 @@ import System -from _compat import range -from utils import (CallableHandler, ClassMethodHandler, GenericHandler, - HelloClass, StaticMethodHandler, VarCallableHandler, - VariableArgsHandler, hello_func) +from ._compat import range +from .utils import (CallableHandler, ClassMethodHandler, GenericHandler, + HelloClass, StaticMethodHandler, VarCallableHandler, + VariableArgsHandler, hello_func) class LeakTest(object): diff --git a/src/tests/profile.py b/src/tests/profile.py index f6576ddce..4af3589e8 100644 --- a/src/tests/profile.py +++ b/src/tests/profile.py @@ -14,7 +14,7 @@ import time import runtests -from _compat import range +from ._compat import range def main(): diff --git a/src/tests/runtests.py b/src/tests/runtests.py index 92d9ecbd0..8011d05e6 100644 --- a/src/tests/runtests.py +++ b/src/tests/runtests.py @@ -5,11 +5,10 @@ from __future__ import print_function -import os import sys -import unittest +import pytest -from _compat import input +from ._compat import input try: import System @@ -22,63 +21,16 @@ clr.AddReference("System.Data") clr.AddReference("System.Management") -test_modules = ( - # has to be first test before other module import clr - 'test_sysargv', - + +def main(verbosity=1): # test_module passes on its own, but not here if # other test modules that import System.Windows.Forms # run first. They must not do module level import/AddReference() # of the System.Windows.Forms namespace. - 'test_module', - - 'test_suite', - 'test_event', - 'test_constructors', - 'test_enum', - 'test_method', - 'test_exceptions', - 'test_compat', - 'test_generic', - 'test_conversion', - 'test_class', - 'test_interface', - 'test_field', - 'test_property', - 'test_indexer', - 'test_delegate', - 'test_array', - 'test_thread', - 'test_docstring', - - # FIXME: Has tests that are being skipped. - 'test_engine', - - # FIXME: Has tests that are being skipped. - 'test_subclass', -) - - -def remove_pyc(): - path = os.path.dirname(os.path.abspath(__file__)) - for name in test_modules: - pyc = os.path.join(path, "{0}.pyc".format(name)) - if os.path.isfile(pyc): - os.unlink(pyc) - - -def main(verbosity=1): - remove_pyc() - - suite = unittest.TestSuite() - - for name in test_modules: - module = __import__(name) - suite.addTests((module.test_suite(),)) - result = unittest.TextTestRunner(verbosity=verbosity).run(suite) - if not result.wasSuccessful(): - raise Exception("Tests failed") + # FIXME: test_engine has tests that are being skipped. + # FIXME: test_subclass has tests that are being skipped. + pytest.main() if __name__ == '__main__': diff --git a/src/tests/stress.py b/src/tests/stress.py index 2ffe06958..c6fa8b7e3 100644 --- a/src/tests/stress.py +++ b/src/tests/stress.py @@ -17,8 +17,8 @@ import threading import time -from _compat import range, thread -from utils import dprint +from ._compat import range, thread +from .utils import dprint class StressTest(object): diff --git a/src/tests/stresstest.py b/src/tests/stresstest.py index 947959239..74b863bdc 100644 --- a/src/tests/stresstest.py +++ b/src/tests/stresstest.py @@ -11,7 +11,7 @@ import unittest # import pdb -from _compat import range +from ._compat import range try: import System diff --git a/src/tests/test_array.py b/src/tests/test_array.py index 36f225c82..7ccadddff 100644 --- a/src/tests/test_array.py +++ b/src/tests/test_array.py @@ -1,1306 +1,1339 @@ # -*- coding: utf-8 -*- -import unittest +"""Test support for managed arrays.""" import Python.Test as Test import System +import pytest -from _compat import PY2, UserList, long, range, unichr +from ._compat import PY2, UserList, long, range, unichr -class ArrayTests(unittest.TestCase): - """Test support for managed arrays.""" +def test_public_array(): + """Test public arrays.""" + ob = Test.PublicArrayTest() + items = ob.items - def test_public_array(self): - """Test public arrays.""" - ob = Test.PublicArrayTest() - items = ob.items + assert len(items) == 5 - self.assertTrue(len(items) == 5) + assert items[0] == 0 + assert items[4] == 4 - self.assertTrue(items[0] == 0) - self.assertTrue(items[4] == 4) + items[0] = 8 + assert items[0] == 8 - items[0] = 8 - self.assertTrue(items[0] == 8) + items[4] = 9 + assert items[4] == 9 - items[4] = 9 - self.assertTrue(items[4] == 9) + items[-4] = 0 + assert items[-4] == 0 - items[-4] = 0 - self.assertTrue(items[-4] == 0) + items[-1] = 4 + assert items[-1] == 4 - items[-1] = 4 - self.assertTrue(items[-1] == 4) - def test_protected_array(self): - """Test protected arrays.""" - ob = Test.ProtectedArrayTest() - items = ob.items +def test_protected_array(): + """Test protected arrays.""" + ob = Test.ProtectedArrayTest() + items = ob.items - self.assertTrue(len(items) == 5) + assert len(items) == 5 - self.assertTrue(items[0] == 0) - self.assertTrue(items[4] == 4) + assert items[0] == 0 + assert items[4] == 4 - items[0] = 8 - self.assertTrue(items[0] == 8) + items[0] = 8 + assert items[0] == 8 - items[4] = 9 - self.assertTrue(items[4] == 9) + items[4] = 9 + assert items[4] == 9 - items[-4] = 0 - self.assertTrue(items[-4] == 0) + items[-4] = 0 + assert items[-4] == 0 - items[-1] = 4 - self.assertTrue(items[-1] == 4) + items[-1] = 4 + assert items[-1] == 4 - def test_internal_array(self): - """Test internal arrays.""" - with self.assertRaises(AttributeError): - ob = Test.InternalArrayTest() - _ = ob.items +def test_internal_array(): + """Test internal arrays.""" - def test_private_array(self): - """Test private arrays.""" + with pytest.raises(AttributeError): + ob = Test.InternalArrayTest() + _ = ob.items - with self.assertRaises(AttributeError): - ob = Test.PrivateArrayTest() - _ = ob.items - def test_array_bounds_checking(self): - """Test array bounds checking.""" +def test_private_array(): + """Test private arrays.""" - ob = Test.Int32ArrayTest() - items = ob.items + with pytest.raises(AttributeError): + ob = Test.PrivateArrayTest() + _ = ob.items - self.assertTrue(items[0] == 0) - self.assertTrue(items[1] == 1) - self.assertTrue(items[2] == 2) - self.assertTrue(items[3] == 3) - self.assertTrue(items[4] == 4) - self.assertTrue(items[-5] == 0) - self.assertTrue(items[-4] == 1) - self.assertTrue(items[-3] == 2) - self.assertTrue(items[-2] == 3) - self.assertTrue(items[-1] == 4) +def test_array_bounds_checking(): + """Test array bounds checking.""" - with self.assertRaises(IndexError): - ob = Test.Int32ArrayTest() - _ = ob.items[5] + ob = Test.Int32ArrayTest() + items = ob.items - with self.assertRaises(IndexError): - ob = Test.Int32ArrayTest() - ob.items[5] = 0 + assert items[0] == 0 + assert items[1] == 1 + assert items[2] == 2 + assert items[3] == 3 + assert items[4] == 4 - with self.assertRaises(IndexError): - ob = Test.Int32ArrayTest() - items[-6] + assert items[-5] == 0 + assert items[-4] == 1 + assert items[-3] == 2 + assert items[-2] == 3 + assert items[-1] == 4 - with self.assertRaises(IndexError): - ob = Test.Int32ArrayTest() - items[-6] = 0 + with pytest.raises(IndexError): + ob = Test.Int32ArrayTest() + _ = ob.items[5] - def test_array_contains(self): - """Test array support for __contains__.""" + with pytest.raises(IndexError): + ob = Test.Int32ArrayTest() + ob.items[5] = 0 + + with pytest.raises(IndexError): + ob = Test.Int32ArrayTest() + items[-6] + with pytest.raises(IndexError): ob = Test.Int32ArrayTest() - items = ob.items + items[-6] = 0 - self.assertTrue(0 in items) - self.assertTrue(1 in items) - self.assertTrue(2 in items) - self.assertTrue(3 in items) - self.assertTrue(4 in items) - self.assertFalse(5 in items) # "H:\Python27\Lib\unittest\case.py", line 592, in deprecated_func, - self.assertFalse(-1 in items) # TypeError: int() argument must be a string or a number, not 'NoneType' - self.assertFalse(None in items) # which threw ^ here which is a little odd. - # But when run from runtests.py. Not when this module ran by itself. +def test_array_contains(): + """Test array support for __contains__.""" - def test_boolean_array(self): - """Test boolean arrays.""" - ob = Test.BooleanArrayTest() - items = ob.items + ob = Test.Int32ArrayTest() + items = ob.items - self.assertTrue(len(items) == 5) + assert 0 in items + assert 1 in items + assert 2 in items + assert 3 in items + assert 4 in items - self.assertTrue(items[0] is True) - self.assertTrue(items[1] is False) - self.assertTrue(items[2] is True) - self.assertTrue(items[3] is False) - self.assertTrue(items[4] is True) + assert not (5 in items) # "H:\Python27\Lib\unittest\case.py", line 592, in deprecated_func, + assert not (-1 in items) # TypeError: int() argument must be a string or a number, not 'NoneType' + assert not (None in items) # which threw ^ here which is a little odd. + # But when run from runtests.py. Not when this module ran by itself. - items[0] = False - self.assertTrue(items[0] is False) - items[0] = True - self.assertTrue(items[0] is True) +def test_boolean_array(): + """Test boolean arrays.""" + ob = Test.BooleanArrayTest() + items = ob.items - with self.assertRaises(TypeError): - ob = Test.ByteArrayTest() - _ = ob.items["wrong"] + assert len(items) == 5 - with self.assertRaises(TypeError): - ob = Test.ByteArrayTest() - ob[0] = "wrong" + assert items[0] is True + assert items[1] is False + assert items[2] is True + assert items[3] is False + assert items[4] is True + + items[0] = False + assert items[0] is False + + items[0] = True + assert items[0] is True + + with pytest.raises(TypeError): + ob = Test.ByteArrayTest() + _ = ob.items["wrong"] - def test_byte_array(self): - """Test byte arrays.""" + with pytest.raises(TypeError): ob = Test.ByteArrayTest() - items = ob.items + ob[0] = "wrong" - self.assertTrue(len(items) == 5) - self.assertTrue(items[0] == 0) - self.assertTrue(items[4] == 4) +def test_byte_array(): + """Test byte arrays.""" + ob = Test.ByteArrayTest() + items = ob.items - max_ = 255 - min_ = 0 + assert len(items) == 5 - items[0] = max_ - self.assertTrue(items[0] == max_) + assert items[0] == 0 + assert items[4] == 4 - items[0] = min_ - self.assertTrue(items[0] == min_) + max_ = 255 + min_ = 0 - items[-4] = max_ - self.assertTrue(items[-4] == max_) + items[0] = max_ + assert items[0] == max_ - items[-1] = min_ - self.assertTrue(items[-1] == min_) + items[0] = min_ + assert items[0] == min_ - with self.assertRaises(OverflowError): - ob = Test.ByteArrayTest() - ob.items[0] = max_ + 1 + items[-4] = max_ + assert items[-4] == max_ - with self.assertRaises(OverflowError): - ob = Test.ByteArrayTest() - ob.items[0] = min_ - 1 + items[-1] = min_ + assert items[-1] == min_ + + with pytest.raises(OverflowError): + ob = Test.ByteArrayTest() + ob.items[0] = max_ + 1 + + with pytest.raises(OverflowError): + ob = Test.ByteArrayTest() + ob.items[0] = min_ - 1 + + with pytest.raises(TypeError): + ob = Test.ByteArrayTest() + _ = ob.items["wrong"] + + with pytest.raises(TypeError): + ob = Test.ByteArrayTest() + ob[0] = "wrong" - with self.assertRaises(TypeError): - ob = Test.ByteArrayTest() - _ = ob.items["wrong"] - with self.assertRaises(TypeError): - ob = Test.ByteArrayTest() - ob[0] = "wrong" +def test_sbyte_array(): + """Test sbyte arrays.""" + ob = Test.SByteArrayTest() + items = ob.items - def test_sbyte_array(self): - """Test sbyte arrays.""" + assert len(items) == 5 + + assert items[0] == 0 + assert items[4] == 4 + + max_ = 127 + min_ = -128 + + items[0] = max_ + assert items[0] == max_ + + items[0] = min_ + assert items[0] == min_ + + items[-4] = max_ + assert items[-4] == max_ + + items[-1] = min_ + assert items[-1] == min_ + + with pytest.raises(OverflowError): + ob = Test.SByteArrayTest() + ob.items[0] = max_ + 1 + + with pytest.raises(OverflowError): + ob = Test.SByteArrayTest() + ob.items[0] = min_ - 1 + + with pytest.raises(TypeError): ob = Test.SByteArrayTest() - items = ob.items + _ = ob.items["wrong"] - self.assertTrue(len(items) == 5) + with pytest.raises(TypeError): + ob = Test.SByteArrayTest() + ob[0] = "wrong" - self.assertTrue(items[0] == 0) - self.assertTrue(items[4] == 4) - max_ = 127 - min_ = -128 +def test_char_array(): + """Test char arrays.""" + ob = Test.CharArrayTest() + items = ob.items - items[0] = max_ - self.assertTrue(items[0] == max_) + assert len(items) == 5 - items[0] = min_ - self.assertTrue(items[0] == min_) + assert items[0] == 'a' + assert items[4] == 'e' - items[-4] = max_ - self.assertTrue(items[-4] == max_) + max_ = unichr(65535) + min_ = unichr(0) - items[-1] = min_ - self.assertTrue(items[-1] == min_) + items[0] = max_ + assert items[0] == max_ - with self.assertRaises(OverflowError): - ob = Test.SByteArrayTest() - ob.items[0] = max_ + 1 + items[0] = min_ + assert items[0] == min_ - with self.assertRaises(OverflowError): - ob = Test.SByteArrayTest() - ob.items[0] = min_ - 1 + items[-4] = max_ + assert items[-4] == max_ - with self.assertRaises(TypeError): - ob = Test.SByteArrayTest() - _ = ob.items["wrong"] + items[-1] = min_ + assert items[-1] == min_ - with self.assertRaises(TypeError): - ob = Test.SByteArrayTest() - ob[0] = "wrong" + with pytest.raises(TypeError): + ob = Test.CharArrayTest() + _ = ob.items["wrong"] - def test_char_array(self): - """Test char arrays.""" + with pytest.raises(TypeError): ob = Test.CharArrayTest() - items = ob.items + ob[0] = "wrong" + + +def test_int16_array(): + """Test Int16 arrays.""" + ob = Test.Int16ArrayTest() + items = ob.items + + assert len(items) == 5 - self.assertTrue(len(items) == 5) + assert items[0] == 0 + assert items[4] == 4 - self.assertTrue(items[0] == 'a') - self.assertTrue(items[4] == 'e') + max_ = 32767 + min_ = -32768 - max_ = unichr(65535) - min_ = unichr(0) + items[0] = max_ + assert items[0] == max_ - items[0] = max_ - self.assertTrue(items[0] == max_) + items[0] = min_ + assert items[0] == min_ - items[0] = min_ - self.assertTrue(items[0] == min_) + items[-4] = max_ + assert items[-4] == max_ - items[-4] = max_ - self.assertTrue(items[-4] == max_) + items[-1] = min_ + assert items[-1] == min_ - items[-1] = min_ - self.assertTrue(items[-1] == min_) + with pytest.raises(OverflowError): + ob = Test.Int16ArrayTest() + ob.items[0] = max_ + 1 - with self.assertRaises(TypeError): - ob = Test.CharArrayTest() - _ = ob.items["wrong"] + with pytest.raises(OverflowError): + ob = Test.Int16ArrayTest() + ob.items[0] = min_ - 1 - with self.assertRaises(TypeError): - ob = Test.CharArrayTest() - ob[0] = "wrong" + with pytest.raises(TypeError): + ob = Test.Int16ArrayTest() + _ = ob.items["wrong"] - def test_int16_array(self): - """Test Int16 arrays.""" + with pytest.raises(TypeError): ob = Test.Int16ArrayTest() - items = ob.items + ob[0] = "wrong" - self.assertTrue(len(items) == 5) - self.assertTrue(items[0] == 0) - self.assertTrue(items[4] == 4) +def test_int32_array(): + """Test Int32 arrays.""" + ob = Test.Int32ArrayTest() + items = ob.items - max_ = 32767 - min_ = -32768 + assert len(items) == 5 - items[0] = max_ - self.assertTrue(items[0] == max_) + assert items[0] == 0 + assert items[4] == 4 - items[0] = min_ - self.assertTrue(items[0] == min_) + max_ = 2147483647 + min_ = -2147483648 - items[-4] = max_ - self.assertTrue(items[-4] == max_) + items[0] = max_ + assert items[0] == max_ - items[-1] = min_ - self.assertTrue(items[-1] == min_) + items[0] = min_ + assert items[0] == min_ - with self.assertRaises(OverflowError): - ob = Test.Int16ArrayTest() - ob.items[0] = max_ + 1 + items[-4] = max_ + assert items[-4] == max_ - with self.assertRaises(OverflowError): - ob = Test.Int16ArrayTest() - ob.items[0] = min_ - 1 + items[-1] = min_ + assert items[-1] == min_ - with self.assertRaises(TypeError): - ob = Test.Int16ArrayTest() - _ = ob.items["wrong"] + with pytest.raises(OverflowError): + ob = Test.Int32ArrayTest() + ob.items[0] = max_ + 1 - with self.assertRaises(TypeError): - ob = Test.Int16ArrayTest() - ob[0] = "wrong" + with pytest.raises(OverflowError): + ob = Test.Int32ArrayTest() + ob.items[0] = min_ - 1 - def test_int32_array(self): - """Test Int32 arrays.""" + with pytest.raises(TypeError): ob = Test.Int32ArrayTest() - items = ob.items + _ = ob.items["wrong"] - self.assertTrue(len(items) == 5) + with pytest.raises(TypeError): + ob = Test.Int32ArrayTest() + ob[0] = "wrong" - self.assertTrue(items[0] == 0) - self.assertTrue(items[4] == 4) - max_ = 2147483647 - min_ = -2147483648 +def test_int64_array(): + """Test Int64 arrays.""" + ob = Test.Int64ArrayTest() + items = ob.items - items[0] = max_ - self.assertTrue(items[0] == max_) + assert len(items) == 5 - items[0] = min_ - self.assertTrue(items[0] == min_) + assert items[0] == 0 + assert items[4] == 4 - items[-4] = max_ - self.assertTrue(items[-4] == max_) + max_ = long(9223372036854775807) + min_ = long(-9223372036854775808) - items[-1] = min_ - self.assertTrue(items[-1] == min_) + items[0] = max_ + assert items[0] == max_ - with self.assertRaises(OverflowError): - ob = Test.Int32ArrayTest() - ob.items[0] = max_ + 1 + items[0] = min_ + assert items[0] == min_ - with self.assertRaises(OverflowError): - ob = Test.Int32ArrayTest() - ob.items[0] = min_ - 1 + items[-4] = max_ + assert items[-4] == max_ - with self.assertRaises(TypeError): - ob = Test.Int32ArrayTest() - _ = ob.items["wrong"] + items[-1] = min_ + assert items[-1] == min_ - with self.assertRaises(TypeError): - ob = Test.Int32ArrayTest() - ob[0] = "wrong" + with pytest.raises(OverflowError): + ob = Test.Int64ArrayTest() + ob.items[0] = max_ + 1 - def test_int64_array(self): - """Test Int64 arrays.""" + with pytest.raises(OverflowError): ob = Test.Int64ArrayTest() - items = ob.items + ob.items[0] = min_ - 1 - self.assertTrue(len(items) == 5) + with pytest.raises(TypeError): + ob = Test.Int64ArrayTest() + _ = ob.items["wrong"] - self.assertTrue(items[0] == 0) - self.assertTrue(items[4] == 4) + with pytest.raises(TypeError): + ob = Test.Int64ArrayTest() + ob[0] = "wrong" - max_ = long(9223372036854775807) - min_ = long(-9223372036854775808) - items[0] = max_ - self.assertTrue(items[0] == max_) +def test_uint16_array(): + """Test UInt16 arrays.""" + ob = Test.UInt16ArrayTest() + items = ob.items - items[0] = min_ - self.assertTrue(items[0] == min_) + assert len(items) == 5 - items[-4] = max_ - self.assertTrue(items[-4] == max_) + assert items[0] == 0 + assert items[4] == 4 - items[-1] = min_ - self.assertTrue(items[-1] == min_) + max_ = 65535 + min_ = 0 - with self.assertRaises(OverflowError): - ob = Test.Int64ArrayTest() - ob.items[0] = max_ + 1 + items[0] = max_ + assert items[0] == max_ - with self.assertRaises(OverflowError): - ob = Test.Int64ArrayTest() - ob.items[0] = min_ - 1 + items[0] = min_ + assert items[0] == min_ - with self.assertRaises(TypeError): - ob = Test.Int64ArrayTest() - _ = ob.items["wrong"] + items[-4] = max_ + assert items[-4] == max_ - with self.assertRaises(TypeError): - ob = Test.Int64ArrayTest() - ob[0] = "wrong" + items[-1] = min_ + assert items[-1] == min_ - def test_uint16_array(self): - """Test UInt16 arrays.""" + with pytest.raises(OverflowError): ob = Test.UInt16ArrayTest() - items = ob.items + ob.items[0] = max_ + 1 - self.assertTrue(len(items) == 5) + with pytest.raises(OverflowError): + ob = Test.UInt16ArrayTest() + ob.items[0] = min_ - 1 + + with pytest.raises(TypeError): + ob = Test.UInt16ArrayTest() + _ = ob.items["wrong"] + + with pytest.raises(TypeError): + ob = Test.UInt16ArrayTest() + ob[0] = "wrong" - self.assertTrue(items[0] == 0) - self.assertTrue(items[4] == 4) - max_ = 65535 - min_ = 0 +def test_uint32_array(): + """Test UInt32 arrays.""" + ob = Test.UInt32ArrayTest() + items = ob.items - items[0] = max_ - self.assertTrue(items[0] == max_) + assert len(items) == 5 - items[0] = min_ - self.assertTrue(items[0] == min_) + assert items[0] == 0 + assert items[4] == 4 - items[-4] = max_ - self.assertTrue(items[-4] == max_) + max_ = long(4294967295) + min_ = 0 - items[-1] = min_ - self.assertTrue(items[-1] == min_) + items[0] = max_ + assert items[0] == max_ - with self.assertRaises(OverflowError): - ob = Test.UInt16ArrayTest() - ob.items[0] = max_ + 1 + items[0] = min_ + assert items[0] == min_ - with self.assertRaises(OverflowError): - ob = Test.UInt16ArrayTest() - ob.items[0] = min_ - 1 + items[-4] = max_ + assert items[-4] == max_ - with self.assertRaises(TypeError): - ob = Test.UInt16ArrayTest() - _ = ob.items["wrong"] + items[-1] = min_ + assert items[-1] == min_ - with self.assertRaises(TypeError): - ob = Test.UInt16ArrayTest() - ob[0] = "wrong" + with pytest.raises(OverflowError): + ob = Test.UInt32ArrayTest() + ob.items[0] = max_ + 1 - def test_uint32_array(self): - """Test UInt32 arrays.""" + with pytest.raises(OverflowError): ob = Test.UInt32ArrayTest() - items = ob.items + ob.items[0] = min_ - 1 - self.assertTrue(len(items) == 5) + with pytest.raises(TypeError): + ob = Test.UInt32ArrayTest() + _ = ob.items["wrong"] - self.assertTrue(items[0] == 0) - self.assertTrue(items[4] == 4) + with pytest.raises(TypeError): + ob = Test.UInt32ArrayTest() + ob[0] = "wrong" - max_ = long(4294967295) - min_ = 0 - items[0] = max_ - self.assertTrue(items[0] == max_) +def test_uint64_array(): + """Test UInt64 arrays.""" + ob = Test.UInt64ArrayTest() + items = ob.items - items[0] = min_ - self.assertTrue(items[0] == min_) + assert len(items) == 5 - items[-4] = max_ - self.assertTrue(items[-4] == max_) + assert items[0] == 0 + assert items[4] == 4 - items[-1] = min_ - self.assertTrue(items[-1] == min_) + max_ = long(18446744073709551615) + min_ = 0 - with self.assertRaises(OverflowError): - ob = Test.UInt32ArrayTest() - ob.items[0] = max_ + 1 + items[0] = max_ + assert items[0] == max_ - with self.assertRaises(OverflowError): - ob = Test.UInt32ArrayTest() - ob.items[0] = min_ - 1 + items[0] = min_ + assert items[0] == min_ - with self.assertRaises(TypeError): - ob = Test.UInt32ArrayTest() - _ = ob.items["wrong"] + items[-4] = max_ + assert items[-4] == max_ - with self.assertRaises(TypeError): - ob = Test.UInt32ArrayTest() - ob[0] = "wrong" + items[-1] = min_ + assert items[-1] == min_ - def test_uint64_array(self): - """Test UInt64 arrays.""" + with pytest.raises(OverflowError): ob = Test.UInt64ArrayTest() - items = ob.items + ob.items[0] = max_ + 1 - self.assertTrue(len(items) == 5) + with pytest.raises(OverflowError): + ob = Test.UInt64ArrayTest() + ob.items[0] = min_ - 1 + + with pytest.raises(TypeError): + ob = Test.UInt64ArrayTest() + _ = ob.items["wrong"] + + with pytest.raises(TypeError): + ob = Test.UInt64ArrayTest() + ob[0] = "wrong" - self.assertTrue(items[0] == 0) - self.assertTrue(items[4] == 4) - max_ = long(18446744073709551615) - min_ = 0 +def test_single_array(): + """Test Single arrays.""" + ob = Test.SingleArrayTest() + items = ob.items - items[0] = max_ - self.assertTrue(items[0] == max_) + assert len(items) == 5 - items[0] = min_ - self.assertTrue(items[0] == min_) + assert items[0] == 0.0 + assert items[4] == 4.0 - items[-4] = max_ - self.assertTrue(items[-4] == max_) + max_ = 3.402823e38 + min_ = -3.402823e38 - items[-1] = min_ - self.assertTrue(items[-1] == min_) + items[0] = max_ + assert items[0] == max_ - with self.assertRaises(OverflowError): - ob = Test.UInt64ArrayTest() - ob.items[0] = max_ + 1 + items[0] = min_ + assert items[0] == min_ - with self.assertRaises(OverflowError): - ob = Test.UInt64ArrayTest() - ob.items[0] = min_ - 1 + items[-4] = max_ + assert items[-4] == max_ - with self.assertRaises(TypeError): - ob = Test.UInt64ArrayTest() - _ = ob.items["wrong"] + items[-1] = min_ + assert items[-1] == min_ - with self.assertRaises(TypeError): - ob = Test.UInt64ArrayTest() - ob[0] = "wrong" + with pytest.raises(TypeError): + ob = Test.SingleArrayTest() + _ = ob.items["wrong"] - def test_single_array(self): - """Test Single arrays.""" + with pytest.raises(TypeError): ob = Test.SingleArrayTest() - items = ob.items + ob[0] = "wrong" - self.assertTrue(len(items) == 5) - self.assertTrue(items[0] == 0.0) - self.assertTrue(items[4] == 4.0) +def test_double_array(): + """Test Double arrays.""" + ob = Test.DoubleArrayTest() + items = ob.items - max_ = 3.402823e38 - min_ = -3.402823e38 + assert len(items) == 5 - items[0] = max_ - self.assertTrue(items[0] == max_) + assert items[0] == 0.0 + assert items[4] == 4.0 - items[0] = min_ - self.assertTrue(items[0] == min_) + max_ = 1.7976931348623157e308 + min_ = -1.7976931348623157e308 - items[-4] = max_ - self.assertTrue(items[-4] == max_) + items[0] = max_ + assert items[0] == max_ - items[-1] = min_ - self.assertTrue(items[-1] == min_) + items[0] = min_ + assert items[0] == min_ - with self.assertRaises(TypeError): - ob = Test.SingleArrayTest() - _ = ob.items["wrong"] + items[-4] = max_ + assert items[-4] == max_ - with self.assertRaises(TypeError): - ob = Test.SingleArrayTest() - ob[0] = "wrong" + items[-1] = min_ + assert items[-1] == min_ + + with pytest.raises(TypeError): + ob = Test.DoubleArrayTest() + _ = ob.items["wrong"] - def test_double_array(self): - """Test Double arrays.""" + with pytest.raises(TypeError): ob = Test.DoubleArrayTest() - items = ob.items + ob[0] = "wrong" - self.assertTrue(len(items) == 5) - self.assertTrue(items[0] == 0.0) - self.assertTrue(items[4] == 4.0) +def test_decimal_array(): + """Test Decimal arrays.""" + ob = Test.DecimalArrayTest() + items = ob.items - max_ = 1.7976931348623157e308 - min_ = -1.7976931348623157e308 + from System import Decimal + max_d = Decimal.Parse("79228162514264337593543950335") + min_d = Decimal.Parse("-79228162514264337593543950335") - items[0] = max_ - self.assertTrue(items[0] == max_) + assert len(items) == 5 - items[0] = min_ - self.assertTrue(items[0] == min_) + assert items[0] == Decimal(0) + assert items[4] == Decimal(4) - items[-4] = max_ - self.assertTrue(items[-4] == max_) + items[0] = max_d + assert items[0] == max_d - items[-1] = min_ - self.assertTrue(items[-1] == min_) + items[0] = min_d + assert items[0] == min_d - with self.assertRaises(TypeError): - ob = Test.DoubleArrayTest() - _ = ob.items["wrong"] + items[-4] = max_d + assert items[-4] == max_d - with self.assertRaises(TypeError): - ob = Test.DoubleArrayTest() - ob[0] = "wrong" + items[-1] = min_d + assert items[-1] == min_d - def test_decimal_array(self): - """Test Decimal arrays.""" + with pytest.raises(TypeError): ob = Test.DecimalArrayTest() - items = ob.items + _ = ob.items["wrong"] - from System import Decimal - max_d = Decimal.Parse("79228162514264337593543950335") - min_d = Decimal.Parse("-79228162514264337593543950335") + with pytest.raises(TypeError): + ob = Test.DecimalArrayTest() + ob[0] = "wrong" - self.assertTrue(len(items) == 5) - self.assertTrue(items[0] == Decimal(0)) - self.assertTrue(items[4] == Decimal(4)) +def test_string_array(): + """Test String arrays.""" + ob = Test.StringArrayTest() + items = ob.items - items[0] = max_d - self.assertTrue(items[0] == max_d) + assert len(items) == 5 - items[0] = min_d - self.assertTrue(items[0] == min_d) + assert items[0] == '0' + assert items[4] == '4' - items[-4] = max_d - self.assertTrue(items[-4] == max_d) + items[0] = "spam" + assert items[0] == "spam" - items[-1] = min_d - self.assertTrue(items[-1] == min_d) + items[0] = "eggs" + assert items[0] == "eggs" - with self.assertRaises(TypeError): - ob = Test.DecimalArrayTest() - _ = ob.items["wrong"] + items[-4] = "spam" + assert items[-4] == "spam" - with self.assertRaises(TypeError): - ob = Test.DecimalArrayTest() - ob[0] = "wrong" + items[-1] = "eggs" + assert items[-1] == "eggs" - def test_string_array(self): - """Test String arrays.""" + with pytest.raises(TypeError): ob = Test.StringArrayTest() - items = ob.items + _ = ob.items["wrong"] + + with pytest.raises(TypeError): + ob = Test.Int64ArrayTest() + ob[0] = 0 + - self.assertTrue(len(items) == 5) +def test_enum_array(): + """Test enum arrays.""" + from Python.Test import ShortEnum + ob = Test.EnumArrayTest() + items = ob.items - self.assertTrue(items[0] == '0') - self.assertTrue(items[4] == '4') + assert len(items) == 5 - items[0] = "spam" - self.assertTrue(items[0] == "spam") + assert items[0] == ShortEnum.Zero + assert items[4] == ShortEnum.Four - items[0] = "eggs" - self.assertTrue(items[0] == "eggs") + items[0] = ShortEnum.Four + assert items[0] == ShortEnum.Four - items[-4] = "spam" - self.assertTrue(items[-4] == "spam") + items[0] = ShortEnum.Zero + assert items[0] == ShortEnum.Zero - items[-1] = "eggs" - self.assertTrue(items[-1] == "eggs") + items[-4] = ShortEnum.Four + assert items[-4] == ShortEnum.Four - with self.assertRaises(TypeError): - ob = Test.StringArrayTest() - _ = ob.items["wrong"] + items[-1] = ShortEnum.Zero + assert items[-1] == ShortEnum.Zero - with self.assertRaises(TypeError): - ob = Test.Int64ArrayTest() - ob[0] = 0 + with pytest.raises(ValueError): + ob = Test.EnumArrayTest() + ob.items[0] = 99 + + with pytest.raises(TypeError): + ob = Test.EnumArrayTest() + _ = ob.items["wrong"] - def test_enum_array(self): - """Test enum arrays.""" - from Python.Test import ShortEnum + with pytest.raises(TypeError): ob = Test.EnumArrayTest() - items = ob.items + ob[0] = "wrong" + - self.assertTrue(len(items) == 5) +def test_object_array(): + """Test ob arrays.""" + from Python.Test import Spam + ob = Test.ObjectArrayTest() + items = ob.items - self.assertTrue(items[0] == ShortEnum.Zero) - self.assertTrue(items[4] == ShortEnum.Four) + assert len(items) == 5 - items[0] = ShortEnum.Four - self.assertTrue(items[0] == ShortEnum.Four) + assert items[0].GetValue() == "0" + assert items[4].GetValue() == "4" - items[0] = ShortEnum.Zero - self.assertTrue(items[0] == ShortEnum.Zero) + items[0] = Spam("4") + assert items[0].GetValue() == "4" - items[-4] = ShortEnum.Four - self.assertTrue(items[-4] == ShortEnum.Four) + items[0] = Spam("0") + assert items[0].GetValue() == "0" - items[-1] = ShortEnum.Zero - self.assertTrue(items[-1] == ShortEnum.Zero) + items[-4] = Spam("4") + assert items[-4].GetValue() == "4" - with self.assertRaises(ValueError): - ob = Test.EnumArrayTest() - ob.items[0] = 99 + items[-1] = Spam("0") + assert items[-1].GetValue() == "0" - with self.assertRaises(TypeError): - ob = Test.EnumArrayTest() - _ = ob.items["wrong"] + items[0] = 99 + assert items[0] == 99 - with self.assertRaises(TypeError): - ob = Test.EnumArrayTest() - ob[0] = "wrong" + items[0] = None + assert items[0] is None - def test_object_array(self): - """Test ob arrays.""" - from Python.Test import Spam + with pytest.raises(TypeError): ob = Test.ObjectArrayTest() - items = ob.items + _ = ob.items["wrong"] - self.assertTrue(len(items) == 5) + with pytest.raises(TypeError): + ob = Test.ObjectArrayTest() + ob.items["wrong"] = "wrong" - self.assertTrue(items[0].GetValue() == "0") - self.assertTrue(items[4].GetValue() == "4") - items[0] = Spam("4") - self.assertTrue(items[0].GetValue() == "4") +def test_null_array(): + """Test null arrays.""" + ob = Test.NullArrayTest() + items = ob.items - items[0] = Spam("0") - self.assertTrue(items[0].GetValue() == "0") + assert len(items) == 5 - items[-4] = Spam("4") - self.assertTrue(items[-4].GetValue() == "4") + assert items[0] is None + assert items[4] is None - items[-1] = Spam("0") - self.assertTrue(items[-1].GetValue() == "0") + items[0] = "spam" + assert items[0] == "spam" - items[0] = 99 - self.assertTrue(items[0] == 99) + items[0] = None + assert items[0] is None - items[0] = None - self.assertTrue(items[0] is None) + items[-4] = "spam" + assert items[-4] == "spam" - with self.assertRaises(TypeError): - ob = Test.ObjectArrayTest() - _ = ob.items["wrong"] + items[-1] = None + assert items[-1] is None - with self.assertRaises(TypeError): - ob = Test.ObjectArrayTest() - ob.items["wrong"] = "wrong" + empty = ob.empty + assert len(empty) == 0 - def test_null_array(self): - """Test null arrays.""" + with pytest.raises(TypeError): ob = Test.NullArrayTest() - items = ob.items + _ = ob.items["wrong"] + - self.assertTrue(len(items) == 5) +def test_interface_array(): + """Test interface arrays.""" + from Python.Test import Spam + ob = Test.InterfaceArrayTest() + items = ob.items - self.assertTrue(items[0] is None) - self.assertTrue(items[4] is None) + assert len(items) == 5 - items[0] = "spam" - self.assertTrue(items[0] == "spam") + assert items[0].GetValue() == "0" + assert items[4].GetValue() == "4" - items[0] = None - self.assertTrue(items[0] is None) + items[0] = Spam("4") + assert items[0].GetValue() == "4" - items[-4] = "spam" - self.assertTrue(items[-4] == "spam") + items[0] = Spam("0") + assert items[0].GetValue() == "0" - items[-1] = None - self.assertTrue(items[-1] is None) + items[-4] = Spam("4") + assert items[-4].GetValue() == "4" - empty = ob.empty - self.assertTrue(len(empty) == 0) + items[-1] = Spam("0") + assert items[-1].GetValue() == "0" - with self.assertRaises(TypeError): - ob = Test.NullArrayTest() - _ = ob.items["wrong"] + items[0] = None + assert items[0] is None - def test_interface_array(self): - """Test interface arrays.""" - from Python.Test import Spam + with pytest.raises(TypeError): ob = Test.InterfaceArrayTest() - items = ob.items + ob.items[0] = 99 - self.assertTrue(len(items) == 5) + with pytest.raises(TypeError): + ob = Test.InterfaceArrayTest() + _ = ob.items["wrong"] + + with pytest.raises(TypeError): + ob = Test.InterfaceArrayTest() + ob.items["wrong"] = "wrong" - self.assertTrue(items[0].GetValue() == "0") - self.assertTrue(items[4].GetValue() == "4") - items[0] = Spam("4") - self.assertTrue(items[0].GetValue() == "4") +def test_typed_array(): + """Test typed arrays.""" + from Python.Test import Spam + ob = Test.TypedArrayTest() + items = ob.items - items[0] = Spam("0") - self.assertTrue(items[0].GetValue() == "0") + assert len(items) == 5 - items[-4] = Spam("4") - self.assertTrue(items[-4].GetValue() == "4") + assert items[0].GetValue() == "0" + assert items[4].GetValue() == "4" - items[-1] = Spam("0") - self.assertTrue(items[-1].GetValue() == "0") + items[0] = Spam("4") + assert items[0].GetValue() == "4" - items[0] = None - self.assertTrue(items[0] is None) + items[0] = Spam("0") + assert items[0].GetValue() == "0" - with self.assertRaises(TypeError): - ob = Test.InterfaceArrayTest() - ob.items[0] = 99 + items[-4] = Spam("4") + assert items[-4].GetValue() == "4" - with self.assertRaises(TypeError): - ob = Test.InterfaceArrayTest() - _ = ob.items["wrong"] + items[-1] = Spam("0") + assert items[-1].GetValue() == "0" - with self.assertRaises(TypeError): - ob = Test.InterfaceArrayTest() - ob.items["wrong"] = "wrong" + items[0] = None + assert items[0] is None - def test_typed_array(self): - """Test typed arrays.""" - from Python.Test import Spam + with pytest.raises(TypeError): ob = Test.TypedArrayTest() - items = ob.items + ob.items[0] = 99 - self.assertTrue(len(items) == 5) + with pytest.raises(TypeError): + ob = Test.TypedArrayTest() + _ = ob.items["wrong"] - self.assertTrue(items[0].GetValue() == "0") - self.assertTrue(items[4].GetValue() == "4") + with pytest.raises(TypeError): + ob = Test.TypedArrayTest() + ob.items["wrong"] = "wrong" + + +def test_multi_dimensional_array(): + """Test multi-dimensional arrays.""" + ob = Test.MultiDimensionalArrayTest() + items = ob.items + + assert len(items) == 25 + + assert items[0, 0] == 0 + assert items[0, 1] == 1 + assert items[0, 2] == 2 + assert items[0, 3] == 3 + assert items[0, 4] == 4 + assert items[1, 0] == 5 + assert items[1, 1] == 6 + assert items[1, 2] == 7 + assert items[1, 3] == 8 + assert items[1, 4] == 9 + assert items[2, 0] == 10 + assert items[2, 1] == 11 + assert items[2, 2] == 12 + assert items[2, 3] == 13 + assert items[2, 4] == 14 + assert items[3, 0] == 15 + assert items[3, 1] == 16 + assert items[3, 2] == 17 + assert items[3, 3] == 18 + assert items[3, 4] == 19 + assert items[4, 0] == 20 + assert items[4, 1] == 21 + assert items[4, 2] == 22 + assert items[4, 3] == 23 + assert items[4, 4] == 24 + + max_ = 2147483647 + min_ = -2147483648 + + items[0, 0] = max_ + assert items[0, 0] == max_ + + items[0, 0] = min_ + assert items[0, 0] == min_ + + items[-4, 0] = max_ + assert items[-4, 0] == max_ + + items[-1, -1] = min_ + assert items[-1, -1] == min_ + + with pytest.raises(OverflowError): + ob = Test.MultiDimensionalArrayTest() + ob.items[0, 0] = max_ + 1 - items[0] = Spam("4") - self.assertTrue(items[0].GetValue() == "4") + with pytest.raises(OverflowError): + ob = Test.MultiDimensionalArrayTest() + ob.items[0, 0] = min_ - 1 - items[0] = Spam("0") - self.assertTrue(items[0].GetValue() == "0") + with pytest.raises(TypeError): + ob = Test.MultiDimensionalArrayTest() + _ = ob.items["wrong", 0] + + with pytest.raises(TypeError): + ob = Test.MultiDimensionalArrayTest() + ob[0, 0] = "wrong" - items[-4] = Spam("4") - self.assertTrue(items[-4].GetValue() == "4") - items[-1] = Spam("0") - self.assertTrue(items[-1].GetValue() == "0") +def test_array_iteration(): + """Test array iteration.""" + items = Test.Int32ArrayTest().items - items[0] = None - self.assertTrue(items[0] is None) + for i in items: + assert (i > -1) and (i < 5) - with self.assertRaises(TypeError): - ob = Test.TypedArrayTest() - ob.items[0] = 99 + items = Test.NullArrayTest().items - with self.assertRaises(TypeError): - ob = Test.TypedArrayTest() - _ = ob.items["wrong"] + for i in items: + assert i is None - with self.assertRaises(TypeError): - ob = Test.TypedArrayTest() - ob.items["wrong"] = "wrong" + empty = Test.NullArrayTest().empty + + for i in empty: + raise TypeError('iteration over empty array') + + +def test_tuple_array_conversion(): + """Test conversion of tuples to array arguments.""" + from Python.Test import ArrayConversionTest + from Python.Test import Spam + + items = [] + for i in range(10): + items.append(Spam(str(i))) + items = tuple(items) + + result = ArrayConversionTest.EchoRange(items) + assert result[0].__class__ == Spam + assert len(result) == 10 + + +def test_tuple_nested_array_conversion(): + """Test conversion of tuples to array-of-array arguments.""" + from Python.Test import ArrayConversionTest + from Python.Test import Spam + + items = [] + for i in range(10): + subs = [] + for _ in range(10): + subs.append(Spam(str(i))) + items.append(tuple(subs)) + items = tuple(items) + + result = ArrayConversionTest.EchoRangeAA(items) + + assert len(result) == 10 + assert len(result[0]) == 10 + assert result[0][0].__class__ == Spam + + +def test_list_array_conversion(): + """Test conversion of lists to array arguments.""" + from Python.Test import ArrayConversionTest + from Python.Test import Spam + + items = [] + for i in range(10): + items.append(Spam(str(i))) + + result = ArrayConversionTest.EchoRange(items) + assert result[0].__class__ == Spam + assert len(result) == 10 + + +def test_list_nested_array_conversion(): + """Test conversion of lists to array-of-array arguments.""" + from Python.Test import ArrayConversionTest + from Python.Test import Spam + + items = [] + for i in range(10): + subs = [] + for _ in range(10): + subs.append(Spam(str(i))) + items.append(subs) + + result = ArrayConversionTest.EchoRangeAA(items) + + assert len(result) == 10 + assert len(result[0]) == 10 + assert result[0][0].__class__ == Spam + + +def test_sequence_array_conversion(): + """Test conversion of sequence-like obs to array arguments.""" + from Python.Test import ArrayConversionTest + from Python.Test import Spam + + items = UserList() + for i in range(10): + items.append(Spam(str(i))) + + result = ArrayConversionTest.EchoRange(items) + assert result[0].__class__ == Spam + assert len(result) == 10 + + +def test_sequence_nested_array_conversion(): + """Test conversion of sequences to array-of-array arguments.""" + from Python.Test import ArrayConversionTest + from Python.Test import Spam + + items = UserList() + for i in range(10): + subs = UserList() + for _ in range(10): + subs.append(Spam(str(i))) + items.append(subs) + + result = ArrayConversionTest.EchoRangeAA(items) + + assert len(result) == 10 + assert len(result[0]) == 10 + assert result[0][0].__class__ == Spam + + +def test_tuple_array_conversion_type_checking(): + """Test error handling for tuple conversion to array arguments.""" + from Python.Test import ArrayConversionTest + from Python.Test import Spam + + # This should work, because null / None is a valid value in an + # array of reference types. + + items = [] + for i in range(10): + items.append(Spam(str(i))) + items[1] = None + items = tuple(items) + + result = ArrayConversionTest.EchoRange(items) + + assert result[0].__class__ == Spam + assert result[1] is None + assert len(result) == 10 + + with pytest.raises(TypeError): + temp = list(items) + temp[1] = 1 + _ = ArrayConversionTest.EchoRange(tuple(temp)) + + with pytest.raises(TypeError): + temp = list(items) + temp[1] = "spam" + _ = ArrayConversionTest.EchoRange(tuple(temp)) + + +def test_list_array_conversion_type_checking(): + """Test error handling for list conversion to array arguments.""" + from Python.Test import ArrayConversionTest + from Python.Test import Spam + + # This should work, because null / None is a valid value in an + # array of reference types. + + items = [] + for i in range(10): + items.append(Spam(str(i))) + items[1] = None + + result = ArrayConversionTest.EchoRange(items) + + assert result[0].__class__ == Spam + assert result[1] is None + assert len(result) == 10 + + with pytest.raises(TypeError): + items[1] = 1 + _ = ArrayConversionTest.EchoRange(items) + + with pytest.raises(TypeError): + items[1] = "spam" + _ = ArrayConversionTest.EchoRange(items) + + +def test_sequence_array_conversion_type_checking(): + """Test error handling for sequence conversion to array arguments.""" + from Python.Test import ArrayConversionTest + from Python.Test import Spam + + # This should work, because null / None is a valid value in an + # array of reference types. + + items = UserList() + for i in range(10): + items.append(Spam(str(i))) + items[1] = None + + result = ArrayConversionTest.EchoRange(items) + + assert result[0].__class__ == Spam + assert result[1] is None + assert len(result) == 10 + + with pytest.raises(TypeError): + items[1] = 1 + _ = ArrayConversionTest.EchoRange(items) + + with pytest.raises(TypeError): + items[1] = "spam" + _ = ArrayConversionTest.EchoRange(items) - def test_multi_dimensional_array(self): - """Test multi-dimensional arrays.""" - ob = Test.MultiDimensionalArrayTest() - items = ob.items - - self.assertTrue(len(items) == 25) - - self.assertTrue(items[0, 0] == 0) - self.assertTrue(items[0, 1] == 1) - self.assertTrue(items[0, 2] == 2) - self.assertTrue(items[0, 3] == 3) - self.assertTrue(items[0, 4] == 4) - self.assertTrue(items[1, 0] == 5) - self.assertTrue(items[1, 1] == 6) - self.assertTrue(items[1, 2] == 7) - self.assertTrue(items[1, 3] == 8) - self.assertTrue(items[1, 4] == 9) - self.assertTrue(items[2, 0] == 10) - self.assertTrue(items[2, 1] == 11) - self.assertTrue(items[2, 2] == 12) - self.assertTrue(items[2, 3] == 13) - self.assertTrue(items[2, 4] == 14) - self.assertTrue(items[3, 0] == 15) - self.assertTrue(items[3, 1] == 16) - self.assertTrue(items[3, 2] == 17) - self.assertTrue(items[3, 3] == 18) - self.assertTrue(items[3, 4] == 19) - self.assertTrue(items[4, 0] == 20) - self.assertTrue(items[4, 1] == 21) - self.assertTrue(items[4, 2] == 22) - self.assertTrue(items[4, 3] == 23) - self.assertTrue(items[4, 4] == 24) - - max_ = 2147483647 - min_ = -2147483648 - - items[0, 0] = max_ - self.assertTrue(items[0, 0] == max_) - - items[0, 0] = min_ - self.assertTrue(items[0, 0] == min_) - - items[-4, 0] = max_ - self.assertTrue(items[-4, 0] == max_) - - items[-1, -1] = min_ - self.assertTrue(items[-1, -1] == min_) - - with self.assertRaises(OverflowError): - ob = Test.MultiDimensionalArrayTest() - ob.items[0, 0] = max_ + 1 - - with self.assertRaises(OverflowError): - ob = Test.MultiDimensionalArrayTest() - ob.items[0, 0] = min_ - 1 - - with self.assertRaises(TypeError): - ob = Test.MultiDimensionalArrayTest() - _ = ob.items["wrong", 0] - - with self.assertRaises(TypeError): - ob = Test.MultiDimensionalArrayTest() - ob[0, 0] = "wrong" - - def test_array_iteration(self): - """Test array iteration.""" - items = Test.Int32ArrayTest().items - - for i in items: - self.assertTrue((i > -1) and (i < 5)) - - items = Test.NullArrayTest().items - - for i in items: - self.assertTrue(i is None) - - empty = Test.NullArrayTest().empty - - for i in empty: - raise TypeError('iteration over empty array') - - def test_tuple_array_conversion(self): - """Test conversion of tuples to array arguments.""" - from Python.Test import ArrayConversionTest - from Python.Test import Spam - - items = [] - for i in range(10): - items.append(Spam(str(i))) - items = tuple(items) - - result = ArrayConversionTest.EchoRange(items) - self.assertTrue(result[0].__class__ == Spam) - self.assertTrue(len(result) == 10) - - def test_tuple_nested_array_conversion(self): - """Test conversion of tuples to array-of-array arguments.""" - from Python.Test import ArrayConversionTest - from Python.Test import Spam - - items = [] - for i in range(10): - subs = [] - for _ in range(10): - subs.append(Spam(str(i))) - items.append(tuple(subs)) - items = tuple(items) - - result = ArrayConversionTest.EchoRangeAA(items) - - self.assertTrue(len(result) == 10) - self.assertTrue(len(result[0]) == 10) - self.assertTrue(result[0][0].__class__ == Spam) - - def test_list_array_conversion(self): - """Test conversion of lists to array arguments.""" - from Python.Test import ArrayConversionTest - from Python.Test import Spam - - items = [] - for i in range(10): - items.append(Spam(str(i))) - - result = ArrayConversionTest.EchoRange(items) - self.assertTrue(result[0].__class__ == Spam) - self.assertTrue(len(result) == 10) - - def test_list_nested_array_conversion(self): - """Test conversion of lists to array-of-array arguments.""" - from Python.Test import ArrayConversionTest - from Python.Test import Spam - items = [] - for i in range(10): - subs = [] - for _ in range(10): - subs.append(Spam(str(i))) - items.append(subs) +def test_md_array_conversion(): + """Test passing of multi-dimensional array arguments.""" + from Python.Test import ArrayConversionTest + from Python.Test import Spam + from System import Array - result = ArrayConversionTest.EchoRangeAA(items) + # Currently, the runtime does not support automagic conversion of + # Python sequences to true multi-dimensional arrays (though it + # does support arrays-of-arrays). This test exists mostly as an + # example of how a multi-dimensional array can be created and used + # with managed code from Python. - self.assertTrue(len(result) == 10) - self.assertTrue(len(result[0]) == 10) - self.assertTrue(result[0][0].__class__ == Spam) - - def test_sequence_array_conversion(self): - """Test conversion of sequence-like obs to array arguments.""" - from Python.Test import ArrayConversionTest - from Python.Test import Spam - - items = UserList() - for i in range(10): - items.append(Spam(str(i))) - - result = ArrayConversionTest.EchoRange(items) - self.assertTrue(result[0].__class__ == Spam) - self.assertTrue(len(result) == 10) - - def test_sequence_nested_array_conversion(self): - """Test conversion of sequences to array-of-array arguments.""" - from Python.Test import ArrayConversionTest - from Python.Test import Spam - - items = UserList() - for i in range(10): - subs = UserList() - for _ in range(10): - subs.append(Spam(str(i))) - items.append(subs) - - result = ArrayConversionTest.EchoRangeAA(items) - - self.assertTrue(len(result) == 10) - self.assertTrue(len(result[0]) == 10) - self.assertTrue(result[0][0].__class__ == Spam) - - def test_tuple_array_conversion_type_checking(self): - """Test error handling for tuple conversion to array arguments.""" - from Python.Test import ArrayConversionTest - from Python.Test import Spam - - # This should work, because null / None is a valid value in an - # array of reference types. - - items = [] - for i in range(10): - items.append(Spam(str(i))) - items[1] = None - items = tuple(items) - - result = ArrayConversionTest.EchoRange(items) - - self.assertTrue(result[0].__class__ == Spam) - self.assertTrue(result[1] is None) - self.assertTrue(len(result) == 10) - - with self.assertRaises(TypeError): - temp = list(items) - temp[1] = 1 - _ = ArrayConversionTest.EchoRange(tuple(temp)) - - with self.assertRaises(TypeError): - temp = list(items) - temp[1] = "spam" - _ = ArrayConversionTest.EchoRange(tuple(temp)) - - def test_list_array_conversion_type_checking(self): - """Test error handling for list conversion to array arguments.""" - from Python.Test import ArrayConversionTest - from Python.Test import Spam - - # This should work, because null / None is a valid value in an - # array of reference types. - - items = [] - for i in range(10): - items.append(Spam(str(i))) - items[1] = None - - result = ArrayConversionTest.EchoRange(items) - - self.assertTrue(result[0].__class__ == Spam) - self.assertTrue(result[1] is None) - self.assertTrue(len(result) == 10) - - with self.assertRaises(TypeError): - items[1] = 1 - _ = ArrayConversionTest.EchoRange(items) - - with self.assertRaises(TypeError): - items[1] = "spam" - _ = ArrayConversionTest.EchoRange(items) - - def test_sequence_array_conversion_type_checking(self): - """Test error handling for sequence conversion to array arguments.""" - from Python.Test import ArrayConversionTest - from Python.Test import Spam - - # This should work, because null / None is a valid value in an - # array of reference types. - - items = UserList() - for i in range(10): - items.append(Spam(str(i))) - items[1] = None - - result = ArrayConversionTest.EchoRange(items) - - self.assertTrue(result[0].__class__ == Spam) - self.assertTrue(result[1] is None) - self.assertTrue(len(result) == 10) - - with self.assertRaises(TypeError): - items[1] = 1 - _ = ArrayConversionTest.EchoRange(items) - - with self.assertRaises(TypeError): - items[1] = "spam" - _ = ArrayConversionTest.EchoRange(items) - - def test_md_array_conversion(self): - """Test passing of multi-dimensional array arguments.""" - from Python.Test import ArrayConversionTest - from Python.Test import Spam - from System import Array - - # Currently, the runtime does not support automagic conversion of - # Python sequences to true multi-dimensional arrays (though it - # does support arrays-of-arrays). This test exists mostly as an - # example of how a multi-dimensional array can be created and used - # with managed code from Python. - - items = Array.CreateInstance(Spam, 5, 5) - - for i in range(5): - for n in range(5): - items.SetValue(Spam(str((i, n))), (i, n)) - - result = ArrayConversionTest.EchoRangeMD(items) - - self.assertTrue(len(result) == 25) - self.assertTrue(result[0, 0].__class__ == Spam) - self.assertTrue(result[0, 0].__class__ == Spam) - - def test_boxed_value_type_mutation_result(self): - """Test behavior of boxed value types.""" - - # This test actually exists mostly as documentation of an important - # concern when dealing with value types. Python does not have any - # value type semantics that can be mapped to the CLR, so it is easy - # to accidentally write code like the following which is not really - # mutating value types in-place but changing boxed copies. - - from System.Drawing import Point - from System import Array - - items = Array.CreateInstance(Point, 5) - - for i in range(5): - items[i] = Point(i, i) - - for i in range(5): - # Boxed items, so set_attr will not change the array member. - self.assertTrue(items[i].X == i) - self.assertTrue(items[i].Y == i) - items[i].X = i + 1 - items[i].Y = i + 1 - self.assertTrue(items[i].X == i) - self.assertTrue(items[i].Y == i) - - for i in range(5): - # Demonstrates the workaround that will change the members. - self.assertTrue(items[i].X == i) - self.assertTrue(items[i].Y == i) - item = items[i] - item.X = i + 1 - item.Y = i + 1 - items[i] = item - self.assertTrue(items[i].X == i + 1) - self.assertTrue(items[i].Y == i + 1) - - def test_special_array_creation(self): - """Test using the Array[] syntax for creating arrays.""" - from Python.Test import ISayHello1, InterfaceTest, ShortEnum - from System import Array - inst = InterfaceTest() - - value = Array[System.Boolean]([True, True]) - self.assertTrue(value[0] is True) - self.assertTrue(value[1] is True) - self.assertTrue(value.Length == 2) - - value = Array[bool]([True, True]) - self.assertTrue(value[0] is True) - self.assertTrue(value[1] is True) - self.assertTrue(value.Length == 2) - - value = Array[System.Byte]([0, 255]) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == 255) - self.assertTrue(value.Length == 2) - - value = Array[System.SByte]([0, 127]) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == 127) - self.assertTrue(value.Length == 2) - - value = Array[System.Char]([u'A', u'Z']) - self.assertTrue(value[0] == u'A') - self.assertTrue(value[1] == u'Z') - self.assertTrue(value.Length == 2) - - value = Array[System.Char]([0, 65535]) - self.assertTrue(value[0] == unichr(0)) - self.assertTrue(value[1] == unichr(65535)) - self.assertTrue(value.Length == 2) - - value = Array[System.Int16]([0, 32767]) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == 32767) - self.assertTrue(value.Length == 2) - - value = Array[System.Int32]([0, 2147483647]) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == 2147483647) - self.assertTrue(value.Length == 2) - - value = Array[int]([0, 2147483647]) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == 2147483647) - self.assertTrue(value.Length == 2) - - value = Array[System.Int64]([0, long(9223372036854775807)]) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == long(9223372036854775807)) - self.assertTrue(value.Length == 2) - - # there's no explicit long type in python3, use System.Int64 instead - if PY2: - value = Array[long]([0, long(9223372036854775807)]) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == long(9223372036854775807)) - self.assertTrue(value.Length == 2) - - value = Array[System.UInt16]([0, 65000]) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == 65000) - self.assertTrue(value.Length == 2) - - value = Array[System.UInt32]([0, long(4294967295)]) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == long(4294967295)) - self.assertTrue(value.Length == 2) - - value = Array[System.UInt64]([0, long(18446744073709551615)]) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == long(18446744073709551615)) - self.assertTrue(value.Length == 2) - - value = Array[System.Single]([0.0, 3.402823e38]) - self.assertTrue(value[0] == 0.0) - self.assertTrue(value[1] == 3.402823e38) - self.assertTrue(value.Length == 2) - - value = Array[System.Double]([0.0, 1.7976931348623157e308]) - self.assertTrue(value[0] == 0.0) - self.assertTrue(value[1] == 1.7976931348623157e308) - self.assertTrue(value.Length == 2) - - value = Array[float]([0.0, 1.7976931348623157e308]) - self.assertTrue(value[0] == 0.0) - self.assertTrue(value[1] == 1.7976931348623157e308) - self.assertTrue(value.Length == 2) - - value = Array[System.Decimal]([System.Decimal.Zero, System.Decimal.One]) - self.assertTrue(value[0] == System.Decimal.Zero) - self.assertTrue(value[1] == System.Decimal.One) - self.assertTrue(value.Length == 2) - - value = Array[System.String](["one", "two"]) - self.assertTrue(value[0] == "one") - self.assertTrue(value[1] == "two") - self.assertTrue(value.Length == 2) - - value = Array[str](["one", "two"]) - self.assertTrue(value[0] == "one") - self.assertTrue(value[1] == "two") - self.assertTrue(value.Length == 2) - - value = Array[ShortEnum]([ShortEnum.Zero, ShortEnum.One]) - self.assertTrue(value[0] == ShortEnum.Zero) - self.assertTrue(value[1] == ShortEnum.One) - self.assertTrue(value.Length == 2) - - value = Array[System.Object]([inst, inst]) - self.assertTrue(value[0].__class__ == inst.__class__) - self.assertTrue(value[1].__class__ == inst.__class__) - self.assertTrue(value.Length == 2) - - value = Array[InterfaceTest]([inst, inst]) - self.assertTrue(value[0].__class__ == inst.__class__) - self.assertTrue(value[1].__class__ == inst.__class__) - self.assertTrue(value.Length == 2) - - value = Array[ISayHello1]([inst, inst]) - self.assertTrue(value[0].__class__ == inst.__class__) - self.assertTrue(value[1].__class__ == inst.__class__) - self.assertTrue(value.Length == 2) - - inst = System.Exception("badness") - value = Array[System.Exception]([inst, inst]) - self.assertTrue(value[0].__class__ == inst.__class__) - self.assertTrue(value[1].__class__ == inst.__class__) - self.assertTrue(value.Length == 2) - - def test_array_abuse(self): - """Test array abuse.""" - _class = Test.PublicArrayTest - ob = Test.PublicArrayTest() - - with self.assertRaises(AttributeError): - del _class.__getitem__ - - with self.assertRaises(AttributeError): - del ob.__getitem__ - - with self.assertRaises(AttributeError): - del _class.__setitem__ - - with self.assertRaises(AttributeError): - del ob.__setitem__ - - with self.assertRaises(TypeError): - Test.PublicArrayTest.__getitem__(0, 0) - - with self.assertRaises(TypeError): - Test.PublicArrayTest.__setitem__(0, 0, 0) - - with self.assertRaises(TypeError): - desc = Test.PublicArrayTest.__dict__['__getitem__'] - desc(0, 0) - - with self.assertRaises(TypeError): - desc = Test.PublicArrayTest.__dict__['__setitem__'] - desc(0, 0, 0) - - -def test_suite(): - return unittest.makeSuite(ArrayTests) + items = Array.CreateInstance(Spam, 5, 5) + + for i in range(5): + for n in range(5): + items.SetValue(Spam(str((i, n))), (i, n)) + + result = ArrayConversionTest.EchoRangeMD(items) + + assert len(result) == 25 + assert result[0, 0].__class__ == Spam + assert result[0, 0].__class__ == Spam + + +def test_boxed_value_type_mutation_result(): + """Test behavior of boxed value types.""" + + # This test actually exists mostly as documentation of an important + # concern when dealing with value types. Python does not have any + # value type semantics that can be mapped to the CLR, so it is easy + # to accidentally write code like the following which is not really + # mutating value types in-place but changing boxed copies. + + from System.Drawing import Point + from System import Array + + items = Array.CreateInstance(Point, 5) + + for i in range(5): + items[i] = Point(i, i) + + for i in range(5): + # Boxed items, so set_attr will not change the array member. + assert items[i].X == i + assert items[i].Y == i + items[i].X = i + 1 + items[i].Y = i + 1 + assert items[i].X == i + assert items[i].Y == i + + for i in range(5): + # Demonstrates the workaround that will change the members. + assert items[i].X == i + assert items[i].Y == i + item = items[i] + item.X = i + 1 + item.Y = i + 1 + items[i] = item + assert items[i].X == i + 1 + assert items[i].Y == i + 1 + + +def test_special_array_creation(): + """Test using the Array[] syntax for creating arrays.""" + from Python.Test import ISayHello1, InterfaceTest, ShortEnum + from System import Array + inst = InterfaceTest() + + value = Array[System.Boolean]([True, True]) + assert value[0] is True + assert value[1] is True + assert value.Length == 2 + + value = Array[bool]([True, True]) + assert value[0] is True + assert value[1] is True + assert value.Length == 2 + + value = Array[System.Byte]([0, 255]) + assert value[0] == 0 + assert value[1] == 255 + assert value.Length == 2 + + value = Array[System.SByte]([0, 127]) + assert value[0] == 0 + assert value[1] == 127 + assert value.Length == 2 + + value = Array[System.Char]([u'A', u'Z']) + assert value[0] == u'A' + assert value[1] == u'Z' + assert value.Length == 2 + + value = Array[System.Char]([0, 65535]) + assert value[0] == unichr(0) + assert value[1] == unichr(65535) + assert value.Length == 2 + + value = Array[System.Int16]([0, 32767]) + assert value[0] == 0 + assert value[1] == 32767 + assert value.Length == 2 + + value = Array[System.Int32]([0, 2147483647]) + assert value[0] == 0 + assert value[1] == 2147483647 + assert value.Length == 2 + + value = Array[int]([0, 2147483647]) + assert value[0] == 0 + assert value[1] == 2147483647 + assert value.Length == 2 + + value = Array[System.Int64]([0, long(9223372036854775807)]) + assert value[0] == 0 + assert value[1] == long(9223372036854775807) + assert value.Length == 2 + + # there's no explicit long type in python3, use System.Int64 instead + if PY2: + value = Array[long]([0, long(9223372036854775807)]) + assert value[0] == 0 + assert value[1] == long(9223372036854775807) + assert value.Length == 2 + + value = Array[System.UInt16]([0, 65000]) + assert value[0] == 0 + assert value[1] == 65000 + assert value.Length == 2 + + value = Array[System.UInt32]([0, long(4294967295)]) + assert value[0] == 0 + assert value[1] == long(4294967295) + assert value.Length == 2 + + value = Array[System.UInt64]([0, long(18446744073709551615)]) + assert value[0] == 0 + assert value[1] == long(18446744073709551615) + assert value.Length == 2 + + value = Array[System.Single]([0.0, 3.402823e38]) + assert value[0] == 0.0 + assert value[1] == 3.402823e38 + assert value.Length == 2 + + value = Array[System.Double]([0.0, 1.7976931348623157e308]) + assert value[0] == 0.0 + assert value[1] == 1.7976931348623157e308 + assert value.Length == 2 + + value = Array[float]([0.0, 1.7976931348623157e308]) + assert value[0] == 0.0 + assert value[1] == 1.7976931348623157e308 + assert value.Length == 2 + + value = Array[System.Decimal]([System.Decimal.Zero, System.Decimal.One]) + assert value[0] == System.Decimal.Zero + assert value[1] == System.Decimal.One + assert value.Length == 2 + + value = Array[System.String](["one", "two"]) + assert value[0] == "one" + assert value[1] == "two" + assert value.Length == 2 + + value = Array[str](["one", "two"]) + assert value[0] == "one" + assert value[1] == "two" + assert value.Length == 2 + + value = Array[ShortEnum]([ShortEnum.Zero, ShortEnum.One]) + assert value[0] == ShortEnum.Zero + assert value[1] == ShortEnum.One + assert value.Length == 2 + + value = Array[System.Object]([inst, inst]) + assert value[0].__class__ == inst.__class__ + assert value[1].__class__ == inst.__class__ + assert value.Length == 2 + + value = Array[InterfaceTest]([inst, inst]) + assert value[0].__class__ == inst.__class__ + assert value[1].__class__ == inst.__class__ + assert value.Length == 2 + + value = Array[ISayHello1]([inst, inst]) + assert value[0].__class__ == inst.__class__ + assert value[1].__class__ == inst.__class__ + assert value.Length == 2 + + inst = System.Exception("badness") + value = Array[System.Exception]([inst, inst]) + assert value[0].__class__ == inst.__class__ + assert value[1].__class__ == inst.__class__ + assert value.Length == 2 + + +def test_array_abuse(): + """Test array abuse.""" + _class = Test.PublicArrayTest + ob = Test.PublicArrayTest() + + with pytest.raises(AttributeError): + del _class.__getitem__ + + with pytest.raises(AttributeError): + del ob.__getitem__ + + with pytest.raises(AttributeError): + del _class.__setitem__ + + with pytest.raises(AttributeError): + del ob.__setitem__ + + with pytest.raises(TypeError): + Test.PublicArrayTest.__getitem__(0, 0) + + with pytest.raises(TypeError): + Test.PublicArrayTest.__setitem__(0, 0, 0) + + with pytest.raises(TypeError): + desc = Test.PublicArrayTest.__dict__['__getitem__'] + desc(0, 0) + + with pytest.raises(TypeError): + desc = Test.PublicArrayTest.__dict__['__setitem__'] + desc(0, 0, 0) diff --git a/src/tests/test_callback.py b/src/tests/test_callback.py new file mode 100644 index 000000000..f94a9d52e --- /dev/null +++ b/src/tests/test_callback.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- + +"""Test that callbacks from C# into python work.""" + + +def simpleDefaultArg(arg='test'): + return arg + + +def test_default_for_null(): + """Test that C# can use null for an optional python argument""" + from Python.Test import CallbackTest + + test_instance = CallbackTest() + ret_val = test_instance.Call_simpleDefaultArg_WithNull(__name__) + python_ret_val = simpleDefaultArg(None) + assert ret_val == python_ret_val + + +def test_default_for_none(): + """Test that C# can use no argument for an optional python argument""" + from Python.Test import CallbackTest + + test_instance = CallbackTest() + ret_val = test_instance.Call_simpleDefaultArg_WithEmptyArgs(__name__) + python_ret_val = simpleDefaultArg() + assert ret_val == python_ret_val diff --git a/src/tests/test_class.py b/src/tests/test_class.py index bf3b6f143..68773508b 100644 --- a/src/tests/test_class.py +++ b/src/tests/test_class.py @@ -1,130 +1,138 @@ # -*- coding: utf-8 -*- # TODO: Add tests for ClassicClass, NewStyleClass? -import unittest +"""Test CLR class support.""" import Python.Test as Test import System +import pytest -from _compat import DictProxyType, range +from ._compat import DictProxyType, range -class ClassTests(unittest.TestCase): - """Test CLR class support.""" +def test_basic_reference_type(): + """Test usage of CLR defined reference types.""" + assert System.String.Empty == "" - def test_basic_reference_type(self): - """Test usage of CLR defined reference types.""" - self.assertEquals(System.String.Empty, "") - def test_basic_value_type(self): - """Test usage of CLR defined value types.""" - self.assertEquals(System.Int32.MaxValue, 2147483647) +def test_basic_value_type(): + """Test usage of CLR defined value types.""" + assert System.Int32.MaxValue == 2147483647 - def test_class_standard_attrs(self): - """Test standard class attributes.""" - from Python.Test import ClassTest - self.assertTrue(ClassTest.__name__ == 'ClassTest') - self.assertTrue(ClassTest.__module__ == 'Python.Test') - self.assertTrue(isinstance(ClassTest.__dict__, DictProxyType)) - self.assertTrue(len(ClassTest.__doc__) > 0) +def test_class_standard_attrs(): + """Test standard class attributes.""" + from Python.Test import ClassTest - def test_class_docstrings(self): - """Test standard class docstring generation""" - from Python.Test import ClassTest + assert ClassTest.__name__ == 'ClassTest' + assert ClassTest.__module__ == 'Python.Test' + assert isinstance(ClassTest.__dict__, DictProxyType) + assert len(ClassTest.__doc__) > 0 - value = 'Void .ctor()' - self.assertTrue(ClassTest.__doc__ == value) - def test_class_default_str(self): - """Test the default __str__ implementation for managed objects.""" - s = System.String("this is a test") - self.assertTrue(str(s) == "this is a test") +def test_class_docstrings(): + """Test standard class docstring generation""" + from Python.Test import ClassTest - def test_class_default_repr(self): - """Test the default __repr__ implementation for managed objects.""" - s = System.String("this is a test") - self.assertTrue(repr(s).startswith(" -1) and (item < 10) + + dict_ = ClassTest.GetHashtable() + + for item in dict_: + cname = item.__class__.__name__ + assert cname.endswith('DictionaryEntry') + - for item in list_: - self.assertTrue((item > -1) and (item < 10)) +def test_ienumerator_iteration(): + """Test iteration over objects supporting IEnumerator.""" + from Python.Test import ClassTest - dict_ = ClassTest.GetHashtable() + chars = ClassTest.GetEnumerator() - for item in dict_: - cname = item.__class__.__name__ - self.assertTrue(cname.endswith('DictionaryEntry')) + for item in chars: + assert item in 'test string' - def test_ienumerator_iteration(self): - """Test iteration over objects supporting IEnumerator.""" - from Python.Test import ClassTest - chars = ClassTest.GetEnumerator() +def test_override_get_item(): + """Test managed subclass overriding __getitem__.""" + from System.Collections import Hashtable - for item in chars: - self.assertTrue(item in 'test string') + class MyTable(Hashtable): + def __getitem__(self, key): + value = Hashtable.__getitem__(self, key) + return 'my ' + str(value) - def test_override_get_item(self): - """Test managed subclass overriding __getitem__.""" - from System.Collections import Hashtable + table = MyTable() + table['one'] = 'one' + table['two'] = 'two' + table['three'] = 'three' - class MyTable(Hashtable): - def __getitem__(self, key): - value = Hashtable.__getitem__(self, key) - return 'my ' + str(value) + assert table['one'] == 'my one' + assert table['two'] == 'my two' + assert table['three'] == 'my three' - table = MyTable() - table['one'] = 'one' - table['two'] = 'two' - table['three'] = 'three' + assert table.Count == 3 - self.assertTrue(table['one'] == 'my one') - self.assertTrue(table['two'] == 'my two') - self.assertTrue(table['three'] == 'my three') - self.assertTrue(table.Count == 3) +def test_override_set_item(): + """Test managed subclass overriding __setitem__.""" + from System.Collections import Hashtable - def test_override_set_item(self): - """Test managed subclass overriding __setitem__.""" - from System.Collections import Hashtable + class MyTable(Hashtable): + def __setitem__(self, key, value): + value = 'my ' + str(value) + Hashtable.__setitem__(self, key, value) - class MyTable(Hashtable): - def __setitem__(self, key, value): - value = 'my ' + str(value) - Hashtable.__setitem__(self, key, value) + table = MyTable() + table['one'] = 'one' + table['two'] = 'two' + table['three'] = 'three' - table = MyTable() - table['one'] = 'one' - table['two'] = 'two' - table['three'] = 'three' + assert table['one'] == 'my one' + assert table['two'] == 'my two' + assert table['three'] == 'my three' - self.assertTrue(table['one'] == 'my one') - self.assertTrue(table['two'] == 'my two') - self.assertTrue(table['three'] == 'my three') + assert table.Count == 3 - self.assertTrue(table.Count == 3) - def test_add_and_remove_class_attribute(self): - from System import TimeSpan +def test_add_and_remove_class_attribute(): + from System import TimeSpan - for _ in range(100): - TimeSpan.new_method = lambda self_: self_.TotalMinutes - ts = TimeSpan.FromHours(1) - self.assertTrue(ts.new_method() == 60) - del TimeSpan.new_method - self.assertFalse(hasattr(ts, "new_method")) + for _ in range(100): + TimeSpan.new_method = lambda self_: self_.TotalMinutes + ts = TimeSpan.FromHours(1) + assert ts.new_method() == 60 + del TimeSpan.new_method + assert not hasattr(ts, "new_method") - def test_comparisons(self): - from System import DateTimeOffset - from Python.Test import ClassTest - d1 = DateTimeOffset.Parse("2016-11-14") - d2 = DateTimeOffset.Parse("2016-11-15") +def test_comparisons(): + from System import DateTimeOffset + from Python.Test import ClassTest - self.assertEqual(d1 == d2, False) - self.assertEqual(d1 != d2, True) + d1 = DateTimeOffset.Parse("2016-11-14") + d2 = DateTimeOffset.Parse("2016-11-15") - self.assertEqual(d1 < d2, True) - self.assertEqual(d1 <= d2, True) - self.assertEqual(d1 >= d2, False) - self.assertEqual(d1 > d2, False) + assert (d1 == d2) == False + assert (d1 != d2) == True - self.assertEqual(d1 == d1, True) - self.assertEqual(d1 != d1, False) + assert (d1 < d2) == True + assert (d1 <= d2) == True + assert (d1 >= d2) == False + assert (d1 > d2) == False - self.assertEqual(d1 < d1, False) - self.assertEqual(d1 <= d1, True) - self.assertEqual(d1 >= d1, True) - self.assertEqual(d1 > d1, False) + assert (d1 == d1) == True + assert (d1 != d1) == False - self.assertEqual(d2 == d1, False) - self.assertEqual(d2 != d1, True) + assert (d1 < d1) == False + assert (d1 <= d1) == True + assert (d1 >= d1) == True + assert (d1 > d1) == False - self.assertEqual(d2 < d1, False) - self.assertEqual(d2 <= d1, False) - self.assertEqual(d2 >= d1, True) - self.assertEqual(d2 > d1, True) + assert (d2 == d1) == False + assert (d2 != d1) == True - with self.assertRaises(TypeError): - d1 < None + assert (d2 < d1) == False + assert (d2 <= d1) == False + assert (d2 >= d1) == True + assert (d2 > d1) == True - with self.assertRaises(TypeError): - d1 < System.Guid() + with pytest.raises(TypeError): + d1 < None - # ClassTest does not implement IComparable - c1 = ClassTest() - c2 = ClassTest() - with self.assertRaises(TypeError): - c1 < c2 + with pytest.raises(TypeError): + d1 < System.Guid() - def test_self_callback(self): - """Test calling back and forth between this and a c# baseclass.""" + # ClassTest does not implement IComparable + c1 = ClassTest() + c2 = ClassTest() + with pytest.raises(TypeError): + c1 < c2 - class CallbackUser(Test.SelfCallbackTest): - def DoCallback(self): - self.PyCallbackWasCalled = False - self.SameReference = False - return self.Callback(self) - def PyCallback(self, self2): - self.PyCallbackWasCalled = True - self.SameReference = self == self2 +def test_self_callback(): + """Test calling back and forth between this and a c# baseclass.""" - testobj = CallbackUser() - testobj.DoCallback() - self.assertTrue(testobj.PyCallbackWasCalled) - self.assertTrue(testobj.SameReference) + class CallbackUser(Test.SelfCallbackTest): + def DoCallback(self): + self.PyCallbackWasCalled = False + self.SameReference = False + return self.Callback(self) + def PyCallback(self, self2): + self.PyCallbackWasCalled = True + self.SameReference = self == self2 -def test_suite(): - return unittest.makeSuite(ClassTests) + testobj = CallbackUser() + testobj.DoCallback() + assert testobj.PyCallbackWasCalled + assert testobj.SameReference diff --git a/src/tests/test_compat.py b/src/tests/test_compat.py index cea51ca49..81e7f8143 100644 --- a/src/tests/test_compat.py +++ b/src/tests/test_compat.py @@ -1,233 +1,243 @@ # -*- coding: utf-8 -*- # TODO: Complete removal of methods below. Similar to test_module +"""Backward-compatibility tests for deprecated features.""" + import types -import unittest -from _compat import ClassType, PY2, PY3, range -from utils import is_clr_class, is_clr_module, is_clr_root_module +import pytest +from ._compat import ClassType, PY2, PY3, range +from .utils import is_clr_class, is_clr_module, is_clr_root_module -class CompatibilityTests(unittest.TestCase): - """Backward-compatibility tests for deprecated features.""" - # Tests for old-style CLR-prefixed module naming. +# Tests for old-style CLR-prefixed module naming. +def test_simple_import(): + """Test simple import.""" + import CLR + assert is_clr_root_module(CLR) + assert CLR.__name__ == 'clr' - def test_simple_import(self): - """Test simple import.""" - import CLR - self.assertTrue(is_clr_root_module(CLR)) - self.assertTrue(CLR.__name__ == 'clr') - - import sys - self.assertTrue(isinstance(sys, types.ModuleType)) - self.assertTrue(sys.__name__ == 'sys') - - if PY3: - import http.client - self.assertTrue(isinstance(http.client, types.ModuleType)) - self.assertTrue(http.client.__name__ == 'http.client') - - elif PY2: - import httplib - self.assertTrue(isinstance(httplib, types.ModuleType)) - self.assertTrue(httplib.__name__ == 'httplib') - - def test_simple_import_with_alias(self): - """Test simple import with aliasing.""" - import CLR as myCLR - self.assertTrue(is_clr_root_module(myCLR)) - self.assertTrue(myCLR.__name__ == 'clr') - - import sys as mySys - self.assertTrue(isinstance(mySys, types.ModuleType)) - self.assertTrue(mySys.__name__ == 'sys') - - if PY3: - import http.client as myHttplib - self.assertTrue(isinstance(myHttplib, types.ModuleType)) - self.assertTrue(myHttplib.__name__ == 'http.client') - - elif PY2: - import httplib as myHttplib - self.assertTrue(isinstance(myHttplib, types.ModuleType)) - self.assertTrue(myHttplib.__name__ == 'httplib') - - def test_dotted_name_import(self): - """Test dotted-name import.""" - import CLR.System - self.assertTrue(is_clr_module(CLR.System)) - self.assertTrue(CLR.System.__name__ == 'System') - - import System - self.assertTrue(is_clr_module(System)) - self.assertTrue(System.__name__ == 'System') - - self.assertTrue(System is CLR.System) - - import xml.dom - self.assertTrue(isinstance(xml.dom, types.ModuleType)) - self.assertTrue(xml.dom.__name__ == 'xml.dom') - - def test_dotted_name_import_with_alias(self): - """Test dotted-name import with aliasing.""" - import CLR.System as myCLRSystem - self.assertTrue(is_clr_module(myCLRSystem)) - self.assertTrue(myCLRSystem.__name__ == 'System') - - import System as mySystem - self.assertTrue(is_clr_module(mySystem)) - self.assertTrue(mySystem.__name__ == 'System') - - self.assertTrue(mySystem is myCLRSystem) - - import xml.dom as myDom - self.assertTrue(isinstance(myDom, types.ModuleType)) - self.assertTrue(myDom.__name__ == 'xml.dom') - - def test_simple_import_from(self): - """Test simple 'import from'.""" - from CLR import System - self.assertTrue(is_clr_module(System)) - self.assertTrue(System.__name__ == 'System') - - from xml import dom - self.assertTrue(isinstance(dom, types.ModuleType)) - self.assertTrue(dom.__name__ == 'xml.dom') - - def test_simple_import_from_with_alias(self): - """Test simple 'import from' with aliasing.""" - from CLR import System as mySystem - self.assertTrue(is_clr_module(mySystem)) - self.assertTrue(mySystem.__name__ == 'System') - - from xml import dom as myDom - self.assertTrue(isinstance(myDom, types.ModuleType)) - self.assertTrue(myDom.__name__ == 'xml.dom') - - def test_dotted_name_import_from(self): - """Test dotted-name 'import from'.""" - from CLR.System import Xml - self.assertTrue(is_clr_module(Xml)) - self.assertTrue(Xml.__name__ == 'System.Xml') - - from CLR.System.Xml import XmlDocument - self.assertTrue(is_clr_class(XmlDocument)) - self.assertTrue(XmlDocument.__name__ == 'XmlDocument') - - from xml.dom import pulldom - self.assertTrue(isinstance(pulldom, types.ModuleType)) - self.assertTrue(pulldom.__name__ == 'xml.dom.pulldom') - - from xml.dom.pulldom import PullDOM - self.assertTrue(isinstance(PullDOM, ClassType)) - self.assertTrue(PullDOM.__name__ == 'PullDOM') - - def test_dotted_name_import_from_with_alias(self): - """Test dotted-name 'import from' with aliasing.""" - from CLR.System import Xml as myXml - self.assertTrue(is_clr_module(myXml)) - self.assertTrue(myXml.__name__ == 'System.Xml') - - from CLR.System.Xml import XmlDocument as myXmlDocument - self.assertTrue(is_clr_class(myXmlDocument)) - self.assertTrue(myXmlDocument.__name__ == 'XmlDocument') - - from xml.dom import pulldom as myPulldom - self.assertTrue(isinstance(myPulldom, types.ModuleType)) - self.assertTrue(myPulldom.__name__ == 'xml.dom.pulldom') - - from xml.dom.pulldom import PullDOM as myPullDOM - self.assertTrue(isinstance(myPullDOM, ClassType)) - self.assertTrue(myPullDOM.__name__ == 'PullDOM') - - def test_from_module_import_star(self): - """Test from module import * behavior.""" - count = len(locals().keys()) - m = __import__('CLR.System.Management', globals(), locals(), ['*']) - self.assertTrue(m.__name__ == 'System.Management') - self.assertTrue(is_clr_module(m)) - self.assertTrue(len(locals().keys()) > count + 1) - - m2 = __import__('System.Management', globals(), locals(), ['*']) - self.assertTrue(m2.__name__ == 'System.Management') - self.assertTrue(is_clr_module(m2)) - self.assertTrue(len(locals().keys()) > count + 1) - - self.assertTrue(m is m2) - - def test_explicit_assembly_load(self): - """Test explicit assembly loading using standard CLR tools.""" - from CLR.System.Reflection import Assembly - from CLR import System - import sys - - assembly = Assembly.LoadWithPartialName('System.Data') - self.assertTrue(assembly is not None) - - import CLR.System.Data - self.assertTrue('System.Data' in sys.modules) - - assembly = Assembly.LoadWithPartialName('SpamSpamSpamSpamEggsAndSpam') - self.assertTrue(assembly is None) - - def test_implicit_load_already_valid_namespace(self): - """Test implicit assembly load over an already valid namespace.""" - # In this case, the mscorlib assembly (loaded by default) defines - # a number of types in the System namespace. There is also a System - # assembly, which is _not_ loaded by default, which also contains - # types in the System namespace. The desired behavior is for the - # Python runtime to "do the right thing", allowing types from both - # assemblies to be found in the CLR.System module implicitly. - import CLR.System - self.assertTrue(is_clr_class(CLR.System.UriBuilder)) - - def test_import_non_existant_module(self): - """Test import failure for a non-existent module.""" - with self.assertRaises(ImportError): - import System.SpamSpamSpam - - with self.assertRaises(ImportError): - import CLR.System.SpamSpamSpam - - def test_lookup_no_namespace_type(self): - """Test lookup of types without a qualified namespace.""" - import CLR.Python.Test - import CLR - self.assertTrue(is_clr_class(CLR.NoNamespaceType)) + import sys + assert isinstance(sys, types.ModuleType) + assert sys.__name__ == 'sys' + + if PY3: + import http.client + assert isinstance(http.client, types.ModuleType) + assert http.client.__name__ == 'http.client' + + elif PY2: + import httplib + assert isinstance(httplib, types.ModuleType) + assert httplib.__name__ == 'httplib' + + +def test_simple_import_with_alias(): + """Test simple import with aliasing.""" + import CLR as myCLR + assert is_clr_root_module(myCLR) + assert myCLR.__name__ == 'clr' + + import sys as mySys + assert isinstance(mySys, types.ModuleType) + assert mySys.__name__ == 'sys' + + if PY3: + import http.client as myHttplib + assert isinstance(myHttplib, types.ModuleType) + assert myHttplib.__name__ == 'http.client' + + elif PY2: + import httplib as myHttplib + assert isinstance(myHttplib, types.ModuleType) + assert myHttplib.__name__ == 'httplib' + + +def test_dotted_name_import(): + """Test dotted-name import.""" + import CLR.System + assert is_clr_module(CLR.System) + assert CLR.System.__name__ == 'System' + + import System + assert is_clr_module(System) + assert System.__name__ == 'System' + + assert System is CLR.System + + import xml.dom + assert isinstance(xml.dom, types.ModuleType) + assert xml.dom.__name__ == 'xml.dom' + + +def test_dotted_name_import_with_alias(): + """Test dotted-name import with aliasing.""" + import CLR.System as myCLRSystem + assert is_clr_module(myCLRSystem) + assert myCLRSystem.__name__ == 'System' + + import System as mySystem + assert is_clr_module(mySystem) + assert mySystem.__name__ == 'System' + + assert mySystem is myCLRSystem + + import xml.dom as myDom + assert isinstance(myDom, types.ModuleType) + assert myDom.__name__ == 'xml.dom' + + +def test_simple_import_from(): + """Test simple 'import from'.""" + from CLR import System + assert is_clr_module(System) + assert System.__name__ == 'System' + + from xml import dom + assert isinstance(dom, types.ModuleType) + assert dom.__name__ == 'xml.dom' + + +def test_simple_import_from_with_alias(): + """Test simple 'import from' with aliasing.""" + from CLR import System as mySystem + assert is_clr_module(mySystem) + assert mySystem.__name__ == 'System' + + from xml import dom as myDom + assert isinstance(myDom, types.ModuleType) + assert myDom.__name__ == 'xml.dom' + + +def test_dotted_name_import_from(): + """Test dotted-name 'import from'.""" + from CLR.System import Xml + assert is_clr_module(Xml) + assert Xml.__name__ == 'System.Xml' - def test_module_lookup_recursion(self): - """Test for recursive lookup handling.""" - with self.assertRaises(ImportError): - from CLR import CLR + from CLR.System.Xml import XmlDocument + assert is_clr_class(XmlDocument) + assert XmlDocument.__name__ == 'XmlDocument' - with self.assertRaises(AttributeError): - import CLR - _ = CLR.CLR + from xml.dom import pulldom + assert isinstance(pulldom, types.ModuleType) + assert pulldom.__name__ == 'xml.dom.pulldom' - def test_module_get_attr(self): - """Test module getattr behavior.""" - import CLR.System as System + from xml.dom.pulldom import PullDOM + assert isinstance(PullDOM, ClassType) + assert PullDOM.__name__ == 'PullDOM' - int_type = System.Int32 - self.assertTrue(is_clr_class(int_type)) - module = System.Xml - self.assertTrue(is_clr_module(module)) +def test_dotted_name_import_from_with_alias(): + """Test dotted-name 'import from' with aliasing.""" + from CLR.System import Xml as myXml + assert is_clr_module(myXml) + assert myXml.__name__ == 'System.Xml' - with self.assertRaises(AttributeError): - _ = System.Spam + from CLR.System.Xml import XmlDocument as myXmlDocument + assert is_clr_class(myXmlDocument) + assert myXmlDocument.__name__ == 'XmlDocument' - with self.assertRaises(TypeError): - _ = getattr(System, 1) + from xml.dom import pulldom as myPulldom + assert isinstance(myPulldom, types.ModuleType) + assert myPulldom.__name__ == 'xml.dom.pulldom' - def test_multiple_imports(self): - # import CLR did raise a Seg Fault once - # test if the Exceptions.warn() method still causes it - for _ in range(100): - import CLR - _ = CLR + from xml.dom.pulldom import PullDOM as myPullDOM + assert isinstance(myPullDOM, ClassType) + assert myPullDOM.__name__ == 'PullDOM' -def test_suite(): - return unittest.makeSuite(CompatibilityTests) +def test_from_module_import_star(): + """Test from module import * behavior.""" + count = len(locals().keys()) + m = __import__('CLR.System.Management', globals(), locals(), ['*']) + assert m.__name__ == 'System.Management' + assert is_clr_module(m) + assert len(locals().keys()) > count + 1 + + m2 = __import__('System.Management', globals(), locals(), ['*']) + assert m2.__name__ == 'System.Management' + assert is_clr_module(m2) + assert len(locals().keys()) > count + 1 + + assert m is m2 + + +def test_explicit_assembly_load(): + """Test explicit assembly loading using standard CLR tools.""" + from CLR.System.Reflection import Assembly + from CLR import System + import sys + + assembly = Assembly.LoadWithPartialName('System.Data') + assert assembly is not None + + import CLR.System.Data + assert 'System.Data' in sys.modules + + assembly = Assembly.LoadWithPartialName('SpamSpamSpamSpamEggsAndSpam') + assert assembly is None + + +def test_implicit_load_already_valid_namespace(): + """Test implicit assembly load over an already valid namespace.""" + # In this case, the mscorlib assembly (loaded by default) defines + # a number of types in the System namespace. There is also a System + # assembly, which is _not_ loaded by default, which also contains + # types in the System namespace. The desired behavior is for the + # Python runtime to "do the right thing", allowing types from both + # assemblies to be found in the CLR.System module implicitly. + import CLR.System + assert is_clr_class(CLR.System.UriBuilder) + + +def test_import_non_existant_module(): + """Test import failure for a non-existent module.""" + with pytest.raises(ImportError): + import System.SpamSpamSpam + + with pytest.raises(ImportError): + import CLR.System.SpamSpamSpam + + +def test_lookup_no_namespace_type(): + """Test lookup of types without a qualified namespace.""" + import CLR.Python.Test + import CLR + assert is_clr_class(CLR.NoNamespaceType) + + +def test_module_lookup_recursion(): + """Test for recursive lookup handling.""" + with pytest.raises(ImportError): + from CLR import CLR + + with pytest.raises(AttributeError): + import CLR + _ = CLR.CLR + + +def test_module_get_attr(): + """Test module getattr behavior.""" + import CLR.System as System + + int_type = System.Int32 + assert is_clr_class(int_type) + + module = System.Xml + assert is_clr_module(module) + + with pytest.raises(AttributeError): + _ = System.Spam + + with pytest.raises(TypeError): + _ = getattr(System, 1) + + +def test_multiple_imports(): + # import CLR did raise a Seg Fault once + # test if the Exceptions.warn() method still causes it + for _ in range(100): + import CLR + _ = CLR diff --git a/src/tests/test_constructors.py b/src/tests/test_constructors.py index 0039f9bf3..5e5489630 100644 --- a/src/tests/test_constructors.py +++ b/src/tests/test_constructors.py @@ -1,50 +1,46 @@ # -*- coding: utf-8 -*- -import unittest +"""Test CLR class constructor support.""" import System -class ConstructorTests(unittest.TestCase): - """Test CLR class constructor support.""" +def test_enum_constructor(): + """Test enum constructor args""" + from System import TypeCode + from Python.Test import EnumConstructorTest - def test_enum_constructor(self): - """Test enum constructor args""" - from System import TypeCode - from Python.Test import EnumConstructorTest + ob = EnumConstructorTest(TypeCode.Int32) + assert ob.value == TypeCode.Int32 - ob = EnumConstructorTest(TypeCode.Int32) - self.assertTrue(ob.value == TypeCode.Int32) - def test_flags_constructor(self): - """Test flags constructor args""" - from Python.Test import FlagsConstructorTest - from System.IO import FileAccess +def test_flags_constructor(): + """Test flags constructor args""" + from Python.Test import FlagsConstructorTest + from System.IO import FileAccess - flags = FileAccess.Read | FileAccess.Write - ob = FlagsConstructorTest(flags) - self.assertTrue(ob.value == flags) + flags = FileAccess.Read | FileAccess.Write + ob = FlagsConstructorTest(flags) + assert ob.value == flags - def test_struct_constructor(self): - """Test struct constructor args""" - from System import Guid - from Python.Test import StructConstructorTest - guid = Guid.NewGuid() - ob = StructConstructorTest(guid) - self.assertTrue(ob.value == guid) +def test_struct_constructor(): + """Test struct constructor args""" + from System import Guid + from Python.Test import StructConstructorTest - def test_subclass_constructor(self): - """Test subclass constructor args""" - from Python.Test import SubclassConstructorTest + guid = Guid.NewGuid() + ob = StructConstructorTest(guid) + assert ob.value == guid - class Sub(System.Exception): - pass - instance = Sub() - ob = SubclassConstructorTest(instance) - self.assertTrue(isinstance(ob.value, System.Exception)) +def test_subclass_constructor(): + """Test subclass constructor args""" + from Python.Test import SubclassConstructorTest + class Sub(System.Exception): + pass -def test_suite(): - return unittest.makeSuite(ConstructorTests) + instance = Sub() + ob = SubclassConstructorTest(instance) + assert isinstance(ob.value, System.Exception) diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index 0d0cd4008..ac263ef5d 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -1,684 +1,699 @@ # -*- coding: utf-8 -*- -import unittest +"""Test CLR <-> Python type conversions.""" import System +import pytest from Python.Test import ConversionTest -from _compat import indexbytes, long, unichr +from ._compat import indexbytes, long, unichr -class ConversionTests(unittest.TestCase): - """Test CLR <-> Python type conversions.""" +def test_bool_conversion(): + """Test bool conversion.""" + ob = ConversionTest() + assert ob.BooleanField is False + assert ob.BooleanField is False + assert ob.BooleanField == 0 - def test_bool_conversion(self): - """Test bool conversion.""" - ob = ConversionTest() - self.assertTrue(ob.BooleanField is False) - self.assertTrue(ob.BooleanField is False) - self.assertTrue(ob.BooleanField == 0) - - ob.BooleanField = True - self.assertTrue(ob.BooleanField is True) - self.assertTrue(ob.BooleanField is True) - self.assertTrue(ob.BooleanField == 1) - - ob.BooleanField = False - self.assertTrue(ob.BooleanField is False) - self.assertTrue(ob.BooleanField is False) - self.assertTrue(ob.BooleanField == 0) - - ob.BooleanField = 1 - self.assertTrue(ob.BooleanField is True) - self.assertTrue(ob.BooleanField is True) - self.assertTrue(ob.BooleanField == 1) - - ob.BooleanField = 0 - self.assertTrue(ob.BooleanField is False) - self.assertTrue(ob.BooleanField is False) - self.assertTrue(ob.BooleanField == 0) - - ob.BooleanField = System.Boolean(None) - self.assertTrue(ob.BooleanField is False) - self.assertTrue(ob.BooleanField is False) - self.assertTrue(ob.BooleanField == 0) - - ob.BooleanField = System.Boolean('') - self.assertTrue(ob.BooleanField is False) - self.assertTrue(ob.BooleanField is False) - self.assertTrue(ob.BooleanField == 0) - - ob.BooleanField = System.Boolean(0) - self.assertTrue(ob.BooleanField is False) - self.assertTrue(ob.BooleanField is False) - self.assertTrue(ob.BooleanField == 0) - - ob.BooleanField = System.Boolean(1) - self.assertTrue(ob.BooleanField is True) - self.assertTrue(ob.BooleanField is True) - self.assertTrue(ob.BooleanField == 1) - - ob.BooleanField = System.Boolean('a') - self.assertTrue(ob.BooleanField is True) - self.assertTrue(ob.BooleanField is True) - self.assertTrue(ob.BooleanField == 1) - - def test_sbyte_conversion(self): - """Test sbyte conversion.""" - self.assertTrue(System.SByte.MaxValue == 127) - self.assertTrue(System.SByte.MinValue == -128) + ob.BooleanField = True + assert ob.BooleanField is True + assert ob.BooleanField is True + assert ob.BooleanField == 1 - ob = ConversionTest() - self.assertTrue(ob.SByteField == 0) + ob.BooleanField = False + assert ob.BooleanField is False + assert ob.BooleanField is False + assert ob.BooleanField == 0 - ob.SByteField = 127 - self.assertTrue(ob.SByteField == 127) + ob.BooleanField = 1 + assert ob.BooleanField is True + assert ob.BooleanField is True + assert ob.BooleanField == 1 - ob.SByteField = -128 - self.assertTrue(ob.SByteField == -128) + ob.BooleanField = 0 + assert ob.BooleanField is False + assert ob.BooleanField is False + assert ob.BooleanField == 0 - ob.SByteField = System.SByte(127) - self.assertTrue(ob.SByteField == 127) + ob.BooleanField = System.Boolean(None) + assert ob.BooleanField is False + assert ob.BooleanField is False + assert ob.BooleanField == 0 - ob.SByteField = System.SByte(-128) - self.assertTrue(ob.SByteField == -128) + ob.BooleanField = System.Boolean('') + assert ob.BooleanField is False + assert ob.BooleanField is False + assert ob.BooleanField == 0 - with self.assertRaises(TypeError): - ConversionTest().SByteField = "spam" + ob.BooleanField = System.Boolean(0) + assert ob.BooleanField is False + assert ob.BooleanField is False + assert ob.BooleanField == 0 - with self.assertRaises(TypeError): - ConversionTest().SByteField = None + ob.BooleanField = System.Boolean(1) + assert ob.BooleanField is True + assert ob.BooleanField is True + assert ob.BooleanField == 1 - with self.assertRaises(OverflowError): - ConversionTest().SByteField = 128 + ob.BooleanField = System.Boolean('a') + assert ob.BooleanField is True + assert ob.BooleanField is True + assert ob.BooleanField == 1 - with self.assertRaises(OverflowError): - ConversionTest().SByteField = -129 - with self.assertRaises(OverflowError): - _ = System.SByte(128) +def test_sbyte_conversion(): + """Test sbyte conversion.""" + assert System.SByte.MaxValue == 127 + assert System.SByte.MinValue == -128 - with self.assertRaises(OverflowError): - _ = System.SByte(-129) + ob = ConversionTest() + assert ob.SByteField == 0 - def test_byte_conversion(self): - """Test byte conversion.""" - self.assertTrue(System.Byte.MaxValue == 255) - self.assertTrue(System.Byte.MinValue == 0) + ob.SByteField = 127 + assert ob.SByteField == 127 - ob = ConversionTest() - self.assertTrue(ob.ByteField == 0) + ob.SByteField = -128 + assert ob.SByteField == -128 - ob.ByteField = 255 - self.assertTrue(ob.ByteField == 255) + ob.SByteField = System.SByte(127) + assert ob.SByteField == 127 - ob.ByteField = 0 - self.assertTrue(ob.ByteField == 0) + ob.SByteField = System.SByte(-128) + assert ob.SByteField == -128 - ob.ByteField = System.Byte(255) - self.assertTrue(ob.ByteField == 255) + with pytest.raises(TypeError): + ConversionTest().SByteField = "spam" - ob.ByteField = System.Byte(0) - self.assertTrue(ob.ByteField == 0) + with pytest.raises(TypeError): + ConversionTest().SByteField = None - with self.assertRaises(TypeError): - ConversionTest().ByteField = "spam" + with pytest.raises(OverflowError): + ConversionTest().SByteField = 128 - with self.assertRaises(TypeError): - ConversionTest().ByteField = None + with pytest.raises(OverflowError): + ConversionTest().SByteField = -129 - with self.assertRaises(OverflowError): - ConversionTest().ByteField = 256 + with pytest.raises(OverflowError): + _ = System.SByte(128) - with self.assertRaises(OverflowError): - ConversionTest().ByteField = -1 + with pytest.raises(OverflowError): + _ = System.SByte(-129) - with self.assertRaises(OverflowError): - _ = System.Byte(256) - with self.assertRaises(OverflowError): - _ = System.Byte(-1) +def test_byte_conversion(): + """Test byte conversion.""" + assert System.Byte.MaxValue == 255 + assert System.Byte.MinValue == 0 - def test_char_conversion(self): - """Test char conversion.""" - self.assertTrue(System.Char.MaxValue == unichr(65535)) - self.assertTrue(System.Char.MinValue == unichr(0)) + ob = ConversionTest() + assert ob.ByteField == 0 - ob = ConversionTest() - self.assertTrue(ob.CharField == u'A') + ob.ByteField = 255 + assert ob.ByteField == 255 - ob.CharField = 'B' - self.assertTrue(ob.CharField == u'B') + ob.ByteField = 0 + assert ob.ByteField == 0 - ob.CharField = u'B' - self.assertTrue(ob.CharField == u'B') + ob.ByteField = System.Byte(255) + assert ob.ByteField == 255 - ob.CharField = 67 - self.assertTrue(ob.CharField == u'C') + ob.ByteField = System.Byte(0) + assert ob.ByteField == 0 - with self.assertRaises(OverflowError): - ConversionTest().CharField = 65536 + with pytest.raises(TypeError): + ConversionTest().ByteField = "spam" - with self.assertRaises(OverflowError): - ConversionTest().CharField = -1 + with pytest.raises(TypeError): + ConversionTest().ByteField = None - with self.assertRaises(TypeError): - ConversionTest().CharField = None + with pytest.raises(OverflowError): + ConversionTest().ByteField = 256 - def test_int16_conversion(self): - """Test int16 conversion.""" - self.assertTrue(System.Int16.MaxValue == 32767) - self.assertTrue(System.Int16.MinValue == -32768) + with pytest.raises(OverflowError): + ConversionTest().ByteField = -1 - ob = ConversionTest() - self.assertTrue(ob.Int16Field == 0) + with pytest.raises(OverflowError): + _ = System.Byte(256) - ob.Int16Field = 32767 - self.assertTrue(ob.Int16Field == 32767) + with pytest.raises(OverflowError): + _ = System.Byte(-1) - ob.Int16Field = -32768 - self.assertTrue(ob.Int16Field == -32768) - ob.Int16Field = System.Int16(32767) - self.assertTrue(ob.Int16Field == 32767) +def test_char_conversion(): + """Test char conversion.""" + assert System.Char.MaxValue == unichr(65535) + assert System.Char.MinValue == unichr(0) - ob.Int16Field = System.Int16(-32768) - self.assertTrue(ob.Int16Field == -32768) + ob = ConversionTest() + assert ob.CharField == u'A' - with self.assertRaises(TypeError): - ConversionTest().Int16Field = "spam" + ob.CharField = 'B' + assert ob.CharField == u'B' - with self.assertRaises(TypeError): - ConversionTest().Int16Field = None + ob.CharField = u'B' + assert ob.CharField == u'B' - with self.assertRaises(OverflowError): - ConversionTest().Int16Field = 32768 + ob.CharField = 67 + assert ob.CharField == u'C' - with self.assertRaises(OverflowError): - ConversionTest().Int16Field = -32769 + with pytest.raises(OverflowError): + ConversionTest().CharField = 65536 - with self.assertRaises(OverflowError): - _ = System.Int16(32768) + with pytest.raises(OverflowError): + ConversionTest().CharField = -1 - with self.assertRaises(OverflowError): - _ = System.Int16(-32769) + with pytest.raises(TypeError): + ConversionTest().CharField = None - def test_int32_conversion(self): - """Test int32 conversion.""" - self.assertTrue(System.Int32.MaxValue == 2147483647) - self.assertTrue(System.Int32.MinValue == -2147483648) - ob = ConversionTest() - self.assertTrue(ob.Int32Field == 0) +def test_int16_conversion(): + """Test int16 conversion.""" + assert System.Int16.MaxValue == 32767 + assert System.Int16.MinValue == -32768 - ob.Int32Field = 2147483647 - self.assertTrue(ob.Int32Field == 2147483647) + ob = ConversionTest() + assert ob.Int16Field == 0 - ob.Int32Field = -2147483648 - self.assertTrue(ob.Int32Field == -2147483648) + ob.Int16Field = 32767 + assert ob.Int16Field == 32767 - ob.Int32Field = System.Int32(2147483647) - self.assertTrue(ob.Int32Field == 2147483647) + ob.Int16Field = -32768 + assert ob.Int16Field == -32768 - ob.Int32Field = System.Int32(-2147483648) - self.assertTrue(ob.Int32Field == -2147483648) + ob.Int16Field = System.Int16(32767) + assert ob.Int16Field == 32767 - with self.assertRaises(TypeError): - ConversionTest().Int32Field = "spam" + ob.Int16Field = System.Int16(-32768) + assert ob.Int16Field == -32768 - with self.assertRaises(TypeError): - ConversionTest().Int32Field = None + with pytest.raises(TypeError): + ConversionTest().Int16Field = "spam" - with self.assertRaises(OverflowError): - ConversionTest().Int32Field = 2147483648 + with pytest.raises(TypeError): + ConversionTest().Int16Field = None - with self.assertRaises(OverflowError): - ConversionTest().Int32Field = -2147483649 + with pytest.raises(OverflowError): + ConversionTest().Int16Field = 32768 - with self.assertRaises(OverflowError): - _ = System.Int32(2147483648) + with pytest.raises(OverflowError): + ConversionTest().Int16Field = -32769 - with self.assertRaises(OverflowError): - _ = System.Int32(-2147483649) + with pytest.raises(OverflowError): + _ = System.Int16(32768) - def test_int64_conversion(self): - """Test int64 conversion.""" - self.assertTrue(System.Int64.MaxValue == long(9223372036854775807)) - self.assertTrue(System.Int64.MinValue == long(-9223372036854775808)) + with pytest.raises(OverflowError): + _ = System.Int16(-32769) - ob = ConversionTest() - self.assertTrue(ob.Int64Field == 0) - ob.Int64Field = long(9223372036854775807) - self.assertTrue(ob.Int64Field == long(9223372036854775807)) +def test_int32_conversion(): + """Test int32 conversion.""" + assert System.Int32.MaxValue == 2147483647 + assert System.Int32.MinValue == -2147483648 - ob.Int64Field = long(-9223372036854775808) - self.assertTrue(ob.Int64Field == long(-9223372036854775808)) + ob = ConversionTest() + assert ob.Int32Field == 0 - ob.Int64Field = System.Int64(long(9223372036854775807)) - self.assertTrue(ob.Int64Field == long(9223372036854775807)) + ob.Int32Field = 2147483647 + assert ob.Int32Field == 2147483647 - ob.Int64Field = System.Int64(long(-9223372036854775808)) - self.assertTrue(ob.Int64Field == long(-9223372036854775808)) + ob.Int32Field = -2147483648 + assert ob.Int32Field == -2147483648 - with self.assertRaises(TypeError): - ConversionTest().Int64Field = "spam" + ob.Int32Field = System.Int32(2147483647) + assert ob.Int32Field == 2147483647 - with self.assertRaises(TypeError): - ConversionTest().Int64Field = None + ob.Int32Field = System.Int32(-2147483648) + assert ob.Int32Field == -2147483648 - with self.assertRaises(OverflowError): - ConversionTest().Int64Field = long(9223372036854775808) + with pytest.raises(TypeError): + ConversionTest().Int32Field = "spam" - with self.assertRaises(OverflowError): - ConversionTest().Int64Field = long(-9223372036854775809) + with pytest.raises(TypeError): + ConversionTest().Int32Field = None - with self.assertRaises(OverflowError): - _ = System.Int64(long(9223372036854775808)) + with pytest.raises(OverflowError): + ConversionTest().Int32Field = 2147483648 - with self.assertRaises(OverflowError): - _ = System.Int64(long(-9223372036854775809)) + with pytest.raises(OverflowError): + ConversionTest().Int32Field = -2147483649 - def test_uint16_conversion(self): - """Test uint16 conversion.""" - self.assertTrue(System.UInt16.MaxValue == 65535) - self.assertTrue(System.UInt16.MinValue == 0) + with pytest.raises(OverflowError): + _ = System.Int32(2147483648) - ob = ConversionTest() - self.assertTrue(ob.UInt16Field == 0) + with pytest.raises(OverflowError): + _ = System.Int32(-2147483649) - ob.UInt16Field = 65535 - self.assertTrue(ob.UInt16Field == 65535) - ob.UInt16Field = -0 - self.assertTrue(ob.UInt16Field == 0) +def test_int64_conversion(): + """Test int64 conversion.""" + assert System.Int64.MaxValue == long(9223372036854775807) + assert System.Int64.MinValue == long(-9223372036854775808) - ob.UInt16Field = System.UInt16(65535) - self.assertTrue(ob.UInt16Field == 65535) + ob = ConversionTest() + assert ob.Int64Field == 0 - ob.UInt16Field = System.UInt16(0) - self.assertTrue(ob.UInt16Field == 0) + ob.Int64Field = long(9223372036854775807) + assert ob.Int64Field == long(9223372036854775807) - with self.assertRaises(TypeError): - ConversionTest().UInt16Field = "spam" + ob.Int64Field = long(-9223372036854775808) + assert ob.Int64Field == long(-9223372036854775808) - with self.assertRaises(TypeError): - ConversionTest().UInt16Field = None + ob.Int64Field = System.Int64(long(9223372036854775807)) + assert ob.Int64Field == long(9223372036854775807) - with self.assertRaises(OverflowError): - ConversionTest().UInt16Field = 65536 + ob.Int64Field = System.Int64(long(-9223372036854775808)) + assert ob.Int64Field == long(-9223372036854775808) - with self.assertRaises(OverflowError): - ConversionTest().UInt16Field = -1 + with pytest.raises(TypeError): + ConversionTest().Int64Field = "spam" - with self.assertRaises(OverflowError): - _ = System.UInt16(65536) + with pytest.raises(TypeError): + ConversionTest().Int64Field = None - with self.assertRaises(OverflowError): - _ = System.UInt16(-1) + with pytest.raises(OverflowError): + ConversionTest().Int64Field = long(9223372036854775808) - def test_uint32_conversion(self): - """Test uint32 conversion.""" - self.assertTrue(System.UInt32.MaxValue == long(4294967295)) - self.assertTrue(System.UInt32.MinValue == 0) + with pytest.raises(OverflowError): + ConversionTest().Int64Field = long(-9223372036854775809) - ob = ConversionTest() - self.assertTrue(ob.UInt32Field == 0) + with pytest.raises(OverflowError): + _ = System.Int64(long(9223372036854775808)) - ob.UInt32Field = long(4294967295) - self.assertTrue(ob.UInt32Field == long(4294967295)) + with pytest.raises(OverflowError): + _ = System.Int64(long(-9223372036854775809)) - ob.UInt32Field = -0 - self.assertTrue(ob.UInt32Field == 0) - ob.UInt32Field = System.UInt32(long(4294967295)) - self.assertTrue(ob.UInt32Field == long(4294967295)) +def test_uint16_conversion(): + """Test uint16 conversion.""" + assert System.UInt16.MaxValue == 65535 + assert System.UInt16.MinValue == 0 - ob.UInt32Field = System.UInt32(0) - self.assertTrue(ob.UInt32Field == 0) + ob = ConversionTest() + assert ob.UInt16Field == 0 - with self.assertRaises(TypeError): - ConversionTest().UInt32Field = "spam" + ob.UInt16Field = 65535 + assert ob.UInt16Field == 65535 - with self.assertRaises(TypeError): - ConversionTest().UInt32Field = None + ob.UInt16Field = -0 + assert ob.UInt16Field == 0 - with self.assertRaises(OverflowError): - ConversionTest().UInt32Field = long(4294967296) + ob.UInt16Field = System.UInt16(65535) + assert ob.UInt16Field == 65535 - with self.assertRaises(OverflowError): - ConversionTest().UInt32Field = -1 + ob.UInt16Field = System.UInt16(0) + assert ob.UInt16Field == 0 - with self.assertRaises(OverflowError): - _ = System.UInt32(long(4294967296)) + with pytest.raises(TypeError): + ConversionTest().UInt16Field = "spam" - with self.assertRaises(OverflowError): - _ = System.UInt32(-1) + with pytest.raises(TypeError): + ConversionTest().UInt16Field = None - def test_uint64_conversion(self): - """Test uint64 conversion.""" - self.assertTrue(System.UInt64.MaxValue == long(18446744073709551615)) - self.assertTrue(System.UInt64.MinValue == 0) + with pytest.raises(OverflowError): + ConversionTest().UInt16Field = 65536 - ob = ConversionTest() - self.assertTrue(ob.UInt64Field == 0) + with pytest.raises(OverflowError): + ConversionTest().UInt16Field = -1 - ob.UInt64Field = long(18446744073709551615) - self.assertTrue(ob.UInt64Field == long(18446744073709551615)) + with pytest.raises(OverflowError): + _ = System.UInt16(65536) - ob.UInt64Field = -0 - self.assertTrue(ob.UInt64Field == 0) + with pytest.raises(OverflowError): + _ = System.UInt16(-1) - ob.UInt64Field = System.UInt64(long(18446744073709551615)) - self.assertTrue(ob.UInt64Field == long(18446744073709551615)) - ob.UInt64Field = System.UInt64(0) - self.assertTrue(ob.UInt64Field == 0) +def test_uint32_conversion(): + """Test uint32 conversion.""" + assert System.UInt32.MaxValue == long(4294967295) + assert System.UInt32.MinValue == 0 - with self.assertRaises(TypeError): - ConversionTest().UInt64Field = "spam" + ob = ConversionTest() + assert ob.UInt32Field == 0 - with self.assertRaises(TypeError): - ConversionTest().UInt64Field = None + ob.UInt32Field = long(4294967295) + assert ob.UInt32Field == long(4294967295) - with self.assertRaises(OverflowError): - ConversionTest().UInt64Field = long(18446744073709551616) + ob.UInt32Field = -0 + assert ob.UInt32Field == 0 - with self.assertRaises(OverflowError): - ConversionTest().UInt64Field = -1 + ob.UInt32Field = System.UInt32(long(4294967295)) + assert ob.UInt32Field == long(4294967295) - with self.assertRaises(OverflowError): - _ = System.UInt64(long(18446744073709551616)) + ob.UInt32Field = System.UInt32(0) + assert ob.UInt32Field == 0 - with self.assertRaises(OverflowError): - _ = System.UInt64(-1) + with pytest.raises(TypeError): + ConversionTest().UInt32Field = "spam" - def test_single_conversion(self): - """Test single conversion.""" - self.assertTrue(System.Single.MaxValue == 3.402823e38) - self.assertTrue(System.Single.MinValue == -3.402823e38) + with pytest.raises(TypeError): + ConversionTest().UInt32Field = None - ob = ConversionTest() - self.assertTrue(ob.SingleField == 0.0) + with pytest.raises(OverflowError): + ConversionTest().UInt32Field = long(4294967296) - ob.SingleField = 3.402823e38 - self.assertTrue(ob.SingleField == 3.402823e38) + with pytest.raises(OverflowError): + ConversionTest().UInt32Field = -1 - ob.SingleField = -3.402823e38 - self.assertTrue(ob.SingleField == -3.402823e38) + with pytest.raises(OverflowError): + _ = System.UInt32(long(4294967296)) - ob.SingleField = System.Single(3.402823e38) - self.assertTrue(ob.SingleField == 3.402823e38) + with pytest.raises(OverflowError): + _ = System.UInt32(-1) - ob.SingleField = System.Single(-3.402823e38) - self.assertTrue(ob.SingleField == -3.402823e38) - with self.assertRaises(TypeError): - ConversionTest().SingleField = "spam" +def test_uint64_conversion(): + """Test uint64 conversion.""" + assert System.UInt64.MaxValue == long(18446744073709551615) + assert System.UInt64.MinValue == 0 - with self.assertRaises(TypeError): - ConversionTest().SingleField = None + ob = ConversionTest() + assert ob.UInt64Field == 0 - with self.assertRaises(OverflowError): - ConversionTest().SingleField = 3.402824e38 + ob.UInt64Field = long(18446744073709551615) + assert ob.UInt64Field == long(18446744073709551615) - with self.assertRaises(OverflowError): - ConversionTest().SingleField = -3.402824e38 + ob.UInt64Field = -0 + assert ob.UInt64Field == 0 - with self.assertRaises(OverflowError): - _ = System.Single(3.402824e38) + ob.UInt64Field = System.UInt64(long(18446744073709551615)) + assert ob.UInt64Field == long(18446744073709551615) - with self.assertRaises(OverflowError): - _ = System.Single(-3.402824e38) + ob.UInt64Field = System.UInt64(0) + assert ob.UInt64Field == 0 - def test_double_conversion(self): - """Test double conversion.""" - self.assertTrue(System.Double.MaxValue == 1.7976931348623157e308) - self.assertTrue(System.Double.MinValue == -1.7976931348623157e308) + with pytest.raises(TypeError): + ConversionTest().UInt64Field = "spam" - ob = ConversionTest() - self.assertTrue(ob.DoubleField == 0.0) + with pytest.raises(TypeError): + ConversionTest().UInt64Field = None - ob.DoubleField = 1.7976931348623157e308 - self.assertTrue(ob.DoubleField == 1.7976931348623157e308) + with pytest.raises(OverflowError): + ConversionTest().UInt64Field = long(18446744073709551616) - ob.DoubleField = -1.7976931348623157e308 - self.assertTrue(ob.DoubleField == -1.7976931348623157e308) + with pytest.raises(OverflowError): + ConversionTest().UInt64Field = -1 - ob.DoubleField = System.Double(1.7976931348623157e308) - self.assertTrue(ob.DoubleField == 1.7976931348623157e308) + with pytest.raises(OverflowError): + _ = System.UInt64(long(18446744073709551616)) - ob.DoubleField = System.Double(-1.7976931348623157e308) - self.assertTrue(ob.DoubleField == -1.7976931348623157e308) + with pytest.raises(OverflowError): + _ = System.UInt64(-1) - with self.assertRaises(TypeError): - ConversionTest().DoubleField = "spam" - with self.assertRaises(TypeError): - ConversionTest().DoubleField = None +def test_single_conversion(): + """Test single conversion.""" + assert System.Single.MaxValue == 3.402823e38 + assert System.Single.MinValue == -3.402823e38 - with self.assertRaises(OverflowError): - ConversionTest().DoubleField = 1.7976931348623159e308 + ob = ConversionTest() + assert ob.SingleField == 0.0 - with self.assertRaises(OverflowError): - ConversionTest().DoubleField = -1.7976931348623159e308 + ob.SingleField = 3.402823e38 + assert ob.SingleField == 3.402823e38 - with self.assertRaises(OverflowError): - _ = System.Double(1.7976931348623159e308) + ob.SingleField = -3.402823e38 + assert ob.SingleField == -3.402823e38 - with self.assertRaises(OverflowError): - _ = System.Double(-1.7976931348623159e308) + ob.SingleField = System.Single(3.402823e38) + assert ob.SingleField == 3.402823e38 - def test_decimal_conversion(self): - """Test decimal conversion.""" - from System import Decimal + ob.SingleField = System.Single(-3.402823e38) + assert ob.SingleField == -3.402823e38 - max_d = Decimal.Parse("79228162514264337593543950335") - min_d = Decimal.Parse("-79228162514264337593543950335") + with pytest.raises(TypeError): + ConversionTest().SingleField = "spam" - self.assertTrue(Decimal.ToInt64(Decimal(10)) == long(10)) + with pytest.raises(TypeError): + ConversionTest().SingleField = None - ob = ConversionTest() - self.assertTrue(ob.DecimalField == Decimal(0)) + with pytest.raises(OverflowError): + ConversionTest().SingleField = 3.402824e38 - ob.DecimalField = Decimal(10) - self.assertTrue(ob.DecimalField == Decimal(10)) + with pytest.raises(OverflowError): + ConversionTest().SingleField = -3.402824e38 - ob.DecimalField = Decimal.One - self.assertTrue(ob.DecimalField == Decimal.One) + with pytest.raises(OverflowError): + _ = System.Single(3.402824e38) - ob.DecimalField = Decimal.Zero - self.assertTrue(ob.DecimalField == Decimal.Zero) + with pytest.raises(OverflowError): + _ = System.Single(-3.402824e38) - ob.DecimalField = max_d - self.assertTrue(ob.DecimalField == max_d) - ob.DecimalField = min_d - self.assertTrue(ob.DecimalField == min_d) +def test_double_conversion(): + """Test double conversion.""" + assert System.Double.MaxValue == 1.7976931348623157e308 + assert System.Double.MinValue == -1.7976931348623157e308 - with self.assertRaises(TypeError): - ConversionTest().DecimalField = None + ob = ConversionTest() + assert ob.DoubleField == 0.0 - with self.assertRaises(TypeError): - ConversionTest().DecimalField = "spam" + ob.DoubleField = 1.7976931348623157e308 + assert ob.DoubleField == 1.7976931348623157e308 - with self.assertRaises(TypeError): - ConversionTest().DecimalField = 1 + ob.DoubleField = -1.7976931348623157e308 + assert ob.DoubleField == -1.7976931348623157e308 - def test_string_conversion(self): - """Test string / unicode conversion.""" - ob = ConversionTest() + ob.DoubleField = System.Double(1.7976931348623157e308) + assert ob.DoubleField == 1.7976931348623157e308 - self.assertTrue(ob.StringField == "spam") - self.assertTrue(ob.StringField == u"spam") + ob.DoubleField = System.Double(-1.7976931348623157e308) + assert ob.DoubleField == -1.7976931348623157e308 - ob.StringField = "eggs" - self.assertTrue(ob.StringField == "eggs") - self.assertTrue(ob.StringField == u"eggs") + with pytest.raises(TypeError): + ConversionTest().DoubleField = "spam" - ob.StringField = u"spam" - self.assertTrue(ob.StringField == "spam") - self.assertTrue(ob.StringField == u"spam") + with pytest.raises(TypeError): + ConversionTest().DoubleField = None - ob.StringField = u'\uffff\uffff' - self.assertTrue(ob.StringField == u'\uffff\uffff') + with pytest.raises(OverflowError): + ConversionTest().DoubleField = 1.7976931348623159e308 - ob.StringField = System.String("spam") - self.assertTrue(ob.StringField == "spam") - self.assertTrue(ob.StringField == u"spam") + with pytest.raises(OverflowError): + ConversionTest().DoubleField = -1.7976931348623159e308 - ob.StringField = System.String(u'\uffff\uffff') - self.assertTrue(ob.StringField == u'\uffff\uffff') + with pytest.raises(OverflowError): + _ = System.Double(1.7976931348623159e308) - ob.StringField = None - self.assertTrue(ob.StringField is None) + with pytest.raises(OverflowError): + _ = System.Double(-1.7976931348623159e308) - with self.assertRaises(TypeError): - ConversionTest().StringField = 1 - def test_interface_conversion(self): - """Test interface conversion.""" - from Python.Test import Spam, ISpam +def test_decimal_conversion(): + """Test decimal conversion.""" + from System import Decimal - ob = ConversionTest() + max_d = Decimal.Parse("79228162514264337593543950335") + min_d = Decimal.Parse("-79228162514264337593543950335") - self.assertTrue(ISpam(ob.SpamField).GetValue() == "spam") - self.assertTrue(ob.SpamField.GetValue() == "spam") + assert Decimal.ToInt64(Decimal(10)) == long(10) - ob.SpamField = Spam("eggs") - self.assertTrue(ISpam(ob.SpamField).GetValue() == "eggs") - self.assertTrue(ob.SpamField.GetValue() == "eggs") + ob = ConversionTest() + assert ob.DecimalField == Decimal(0) - # need to test spam subclass here. + ob.DecimalField = Decimal(10) + assert ob.DecimalField == Decimal(10) - ob.SpamField = None - self.assertTrue(ob.SpamField is None) + ob.DecimalField = Decimal.One + assert ob.DecimalField == Decimal.One - with self.assertRaises(TypeError): - ob = ConversionTest() - ob.SpamField = System.String("bad") + ob.DecimalField = Decimal.Zero + assert ob.DecimalField == Decimal.Zero - with self.assertRaises(TypeError): - ob = ConversionTest() - ob.SpamField = System.Int32(1) + ob.DecimalField = max_d + assert ob.DecimalField == max_d - def test_object_conversion(self): - """Test ob conversion.""" - from Python.Test import Spam + ob.DecimalField = min_d + assert ob.DecimalField == min_d - ob = ConversionTest() - self.assertTrue(ob.ObjectField is None) + with pytest.raises(TypeError): + ConversionTest().DecimalField = None - ob.ObjectField = Spam("eggs") - self.assertTrue(ob.ObjectField.__class__.__name__ == "Spam") - self.assertTrue(ob.ObjectField.GetValue() == "eggs") + with pytest.raises(TypeError): + ConversionTest().DecimalField = "spam" - ob.ObjectField = None - self.assertTrue(ob.ObjectField is None) + with pytest.raises(TypeError): + ConversionTest().DecimalField = 1 - ob.ObjectField = System.String("spam") - self.assertTrue(ob.ObjectField == "spam") - ob.ObjectField = System.Int32(1) - self.assertTrue(ob.ObjectField == 1) +def test_string_conversion(): + """Test string / unicode conversion.""" + ob = ConversionTest() - # need to test subclass here + assert ob.StringField == "spam" + assert ob.StringField == u"spam" - with self.assertRaises(TypeError): - ob = ConversionTest() - ob.ObjectField = self + ob.StringField = "eggs" + assert ob.StringField == "eggs" + assert ob.StringField == u"eggs" - def test_enum_conversion(self): - """Test enum conversion.""" - from Python.Test import ShortEnum + ob.StringField = u"spam" + assert ob.StringField == "spam" + assert ob.StringField == u"spam" - ob = ConversionTest() - self.assertTrue(ob.EnumField == ShortEnum.Zero) + ob.StringField = u'\uffff\uffff' + assert ob.StringField == u'\uffff\uffff' + + ob.StringField = System.String("spam") + assert ob.StringField == "spam" + assert ob.StringField == u"spam" - ob.EnumField = ShortEnum.One - self.assertTrue(ob.EnumField == ShortEnum.One) + ob.StringField = System.String(u'\uffff\uffff') + assert ob.StringField == u'\uffff\uffff' - ob.EnumField = 0 - self.assertTrue(ob.EnumField == ShortEnum.Zero) - self.assertTrue(ob.EnumField == 0) + ob.StringField = None + assert ob.StringField is None - ob.EnumField = 1 - self.assertTrue(ob.EnumField == ShortEnum.One) - self.assertTrue(ob.EnumField == 1) + with pytest.raises(TypeError): + ConversionTest().StringField = 1 - with self.assertRaises(ValueError): - ob = ConversionTest() - ob.EnumField = 10 - with self.assertRaises(ValueError): - ob = ConversionTest() - ob.EnumField = 255 +def test_interface_conversion(): + """Test interface conversion.""" + from Python.Test import Spam, ISpam - with self.assertRaises(OverflowError): - ob = ConversionTest() - ob.EnumField = 1000000 + ob = ConversionTest() - with self.assertRaises(TypeError): - ob = ConversionTest() - ob.EnumField = "spam" + assert ISpam(ob.SpamField).GetValue() == "spam" + assert ob.SpamField.GetValue() == "spam" - def test_null_conversion(self): - """Test null conversion.""" + ob.SpamField = Spam("eggs") + assert ISpam(ob.SpamField).GetValue() == "eggs" + assert ob.SpamField.GetValue() == "eggs" + + # need to test spam subclass here. + + ob.SpamField = None + assert ob.SpamField is None + + with pytest.raises(TypeError): ob = ConversionTest() + ob.SpamField = System.String("bad") + + with pytest.raises(TypeError): + ob = ConversionTest() + ob.SpamField = System.Int32(1) + - ob.StringField = None - self.assertTrue(ob.StringField is None) +def test_object_conversion(): + """Test ob conversion.""" + from Python.Test import Spam - ob.ObjectField = None - self.assertTrue(ob.ObjectField is None) + ob = ConversionTest() + assert ob.ObjectField is None - ob.SpamField = None - self.assertTrue(ob.SpamField is None) + ob.ObjectField = Spam("eggs") + assert ob.ObjectField.__class__.__name__ == "Spam" + assert ob.ObjectField.GetValue() == "eggs" - # Primitive types and enums should not be set to null. + ob.ObjectField = None + assert ob.ObjectField is None - with self.assertRaises(TypeError): - ConversionTest().Int32Field = None + ob.ObjectField = System.String("spam") + assert ob.ObjectField == "spam" - with self.assertRaises(TypeError): - ConversionTest().EnumField = None + ob.ObjectField = System.Int32(1) + assert ob.ObjectField == 1 - def test_byte_array_conversion(self): - """Test byte array conversion.""" + # need to test subclass here + + with pytest.raises(TypeError): + class Foo(object): + pass ob = ConversionTest() + ob.ObjectField = Foo + + +def test_enum_conversion(): + """Test enum conversion.""" + from Python.Test import ShortEnum + + ob = ConversionTest() + assert ob.EnumField == ShortEnum.Zero + + ob.EnumField = ShortEnum.One + assert ob.EnumField == ShortEnum.One + + ob.EnumField = 0 + assert ob.EnumField == ShortEnum.Zero + assert ob.EnumField == 0 - self.assertTrue(ob.ByteArrayField is None) + ob.EnumField = 1 + assert ob.EnumField == ShortEnum.One + assert ob.EnumField == 1 - ob.ByteArrayField = [0, 1, 2, 3, 4] - array = ob.ByteArrayField - self.assertTrue(len(array) == 5) - self.assertTrue(array[0] == 0) - self.assertTrue(array[4] == 4) + with pytest.raises(ValueError): + ob = ConversionTest() + ob.EnumField = 10 + + with pytest.raises(ValueError): + ob = ConversionTest() + ob.EnumField = 255 - value = b"testing" - ob.ByteArrayField = value - array = ob.ByteArrayField - for i, _ in enumerate(value): - self.assertTrue(array[i] == indexbytes(value, i)) + with pytest.raises(OverflowError): + ob = ConversionTest() + ob.EnumField = 1000000 - def test_sbyte_array_conversion(self): - """Test sbyte array conversion.""" + with pytest.raises(TypeError): ob = ConversionTest() + ob.EnumField = "spam" + + +def test_null_conversion(): + """Test null conversion.""" + ob = ConversionTest() + + ob.StringField = None + assert ob.StringField is None + + ob.ObjectField = None + assert ob.ObjectField is None + + ob.SpamField = None + assert ob.SpamField is None + + # Primitive types and enums should not be set to null. + + with pytest.raises(TypeError): + ConversionTest().Int32Field = None + + with pytest.raises(TypeError): + ConversionTest().EnumField = None + + +def test_byte_array_conversion(): + """Test byte array conversion.""" + ob = ConversionTest() + + assert ob.ByteArrayField is None + + ob.ByteArrayField = [0, 1, 2, 3, 4] + array = ob.ByteArrayField + assert len(array) == 5 + assert array[0] == 0 + assert array[4] == 4 + + value = b"testing" + ob.ByteArrayField = value + array = ob.ByteArrayField + for i, _ in enumerate(value): + assert array[i] == indexbytes(value, i) - self.assertTrue(ob.SByteArrayField is None) - ob.SByteArrayField = [0, 1, 2, 3, 4] - array = ob.SByteArrayField - self.assertTrue(len(array) == 5) - self.assertTrue(array[0] == 0) - self.assertTrue(array[4] == 4) +def test_sbyte_array_conversion(): + """Test sbyte array conversion.""" + ob = ConversionTest() - value = b"testing" - ob.SByteArrayField = value - array = ob.SByteArrayField - for i, _ in enumerate(value): - self.assertTrue(array[i] == indexbytes(value, i)) + assert ob.SByteArrayField is None + ob.SByteArrayField = [0, 1, 2, 3, 4] + array = ob.SByteArrayField + assert len(array) == 5 + assert array[0] == 0 + assert array[4] == 4 -def test_suite(): - return unittest.makeSuite(ConversionTests) + value = b"testing" + ob.SByteArrayField = value + array = ob.SByteArrayField + for i, _ in enumerate(value): + assert array[i] == indexbytes(value, i) diff --git a/src/tests/test_delegate.py b/src/tests/test_delegate.py index 4963a09b8..33aca43b3 100644 --- a/src/tests/test_delegate.py +++ b/src/tests/test_delegate.py @@ -1,258 +1,269 @@ # -*- coding: utf-8 -*- # TODO: Add test for ObjectDelegate -import unittest +"""Test CLR delegate support.""" import Python.Test as Test import System +import pytest from Python.Test import DelegateTest, StringDelegate -from _compat import DictProxyType -from utils import HelloClass, hello_func, MultipleHandler +from ._compat import DictProxyType +from .utils import HelloClass, hello_func, MultipleHandler -class DelegateTests(unittest.TestCase): - """Test CLR delegate support.""" +def test_delegate_standard_attrs(): + """Test standard delegate attributes.""" + from Python.Test import PublicDelegate - def test_delegate_standard_attrs(self): - """Test standard delegate attributes.""" - from Python.Test import PublicDelegate + assert PublicDelegate.__name__ == 'PublicDelegate' + assert PublicDelegate.__module__ == 'Python.Test' + assert isinstance(PublicDelegate.__dict__, DictProxyType) + assert PublicDelegate.__doc__ is None - self.assertTrue(PublicDelegate.__name__ == 'PublicDelegate') - self.assertTrue(PublicDelegate.__module__ == 'Python.Test') - self.assertTrue(isinstance(PublicDelegate.__dict__, DictProxyType)) - self.assertTrue(PublicDelegate.__doc__ is None) - def test_global_delegate_visibility(self): - """Test visibility of module-level delegates.""" - from Python.Test import PublicDelegate +def test_global_delegate_visibility(): + """Test visibility of module-level delegates.""" + from Python.Test import PublicDelegate - self.assertTrue(PublicDelegate.__name__ == 'PublicDelegate') - self.assertTrue(Test.PublicDelegate.__name__ == 'PublicDelegate') + assert PublicDelegate.__name__ == 'PublicDelegate' + assert Test.PublicDelegate.__name__ == 'PublicDelegate' - with self.assertRaises(ImportError): - from Python.Test import InternalDelegate - _ = InternalDelegate + with pytest.raises(ImportError): + from Python.Test import InternalDelegate + _ = InternalDelegate - with self.assertRaises(AttributeError): - _ = Test.InternalDelegate + with pytest.raises(AttributeError): + _ = Test.InternalDelegate - def test_nested_delegate_visibility(self): - """Test visibility of nested delegates.""" - ob = DelegateTest.PublicDelegate - self.assertTrue(ob.__name__ == 'PublicDelegate') - ob = DelegateTest.ProtectedDelegate - self.assertTrue(ob.__name__ == 'ProtectedDelegate') +def test_nested_delegate_visibility(): + """Test visibility of nested delegates.""" + ob = DelegateTest.PublicDelegate + assert ob.__name__ == 'PublicDelegate' - with self.assertRaises(AttributeError): - _ = DelegateTest.InternalDelegate + ob = DelegateTest.ProtectedDelegate + assert ob.__name__ == 'ProtectedDelegate' - with self.assertRaises(AttributeError): - _ = DelegateTest.PrivateDelegate + with pytest.raises(AttributeError): + _ = DelegateTest.InternalDelegate - def test_delegate_from_function(self): - """Test delegate implemented with a Python function.""" + with pytest.raises(AttributeError): + _ = DelegateTest.PrivateDelegate - d = StringDelegate(hello_func) - ob = DelegateTest() - self.assertTrue(ob.CallStringDelegate(d) == "hello") - self.assertTrue(d() == "hello") +def test_delegate_from_function(): + """Test delegate implemented with a Python function.""" - ob.stringDelegate = d - self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") - self.assertTrue(ob.stringDelegate() == "hello") + d = StringDelegate(hello_func) + ob = DelegateTest() - def test_delegate_from_method(self): - """Test delegate implemented with a Python instance method.""" + assert ob.CallStringDelegate(d) == "hello" + assert d() == "hello" - inst = HelloClass() - d = StringDelegate(inst.hello) - ob = DelegateTest() + ob.stringDelegate = d + assert ob.CallStringDelegate(ob.stringDelegate) == "hello" + assert ob.stringDelegate() == "hello" - self.assertTrue(ob.CallStringDelegate(d) == "hello") - self.assertTrue(d() == "hello") - ob.stringDelegate = d - self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") - self.assertTrue(ob.stringDelegate() == "hello") +def test_delegate_from_method(): + """Test delegate implemented with a Python instance method.""" - def test_delegate_from_unbound_method(self): - """Test failure mode for unbound methods.""" + inst = HelloClass() + d = StringDelegate(inst.hello) + ob = DelegateTest() - with self.assertRaises(TypeError): - d = StringDelegate(HelloClass.hello) - d() + assert ob.CallStringDelegate(d) == "hello" + assert d() == "hello" - def test_delegate_from_static_method(self): - """Test delegate implemented with a Python static method.""" + ob.stringDelegate = d + assert ob.CallStringDelegate(ob.stringDelegate) == "hello" + assert ob.stringDelegate() == "hello" - d = StringDelegate(HelloClass.s_hello) - ob = DelegateTest() - self.assertTrue(ob.CallStringDelegate(d) == "hello") - self.assertTrue(d() == "hello") +def test_delegate_from_unbound_method(): + """Test failure mode for unbound methods.""" - ob.stringDelegate = d - self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") - self.assertTrue(ob.stringDelegate() == "hello") + with pytest.raises(TypeError): + d = StringDelegate(HelloClass.hello) + d() - inst = HelloClass() - d = StringDelegate(inst.s_hello) - ob = DelegateTest() - self.assertTrue(ob.CallStringDelegate(d) == "hello") - self.assertTrue(d() == "hello") +def test_delegate_from_static_method(): + """Test delegate implemented with a Python static method.""" - ob.stringDelegate = d - self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") - self.assertTrue(ob.stringDelegate() == "hello") + d = StringDelegate(HelloClass.s_hello) + ob = DelegateTest() - def test_delegate_from_class_method(self): - """Test delegate implemented with a Python class method.""" + assert ob.CallStringDelegate(d) == "hello" + assert d() == "hello" - d = StringDelegate(HelloClass.c_hello) - ob = DelegateTest() + ob.stringDelegate = d + assert ob.CallStringDelegate(ob.stringDelegate) == "hello" + assert ob.stringDelegate() == "hello" - self.assertTrue(ob.CallStringDelegate(d) == "hello") - self.assertTrue(d() == "hello") + inst = HelloClass() + d = StringDelegate(inst.s_hello) + ob = DelegateTest() - ob.stringDelegate = d - self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") - self.assertTrue(ob.stringDelegate() == "hello") + assert ob.CallStringDelegate(d) == "hello" + assert d() == "hello" - inst = HelloClass() - d = StringDelegate(inst.c_hello) - ob = DelegateTest() + ob.stringDelegate = d + assert ob.CallStringDelegate(ob.stringDelegate) == "hello" + assert ob.stringDelegate() == "hello" - self.assertTrue(ob.CallStringDelegate(d) == "hello") - self.assertTrue(d() == "hello") - ob.stringDelegate = d - self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") - self.assertTrue(ob.stringDelegate() == "hello") +def test_delegate_from_class_method(): + """Test delegate implemented with a Python class method.""" - def test_delegate_from_callable(self): - """Test delegate implemented with a Python callable object.""" + d = StringDelegate(HelloClass.c_hello) + ob = DelegateTest() - inst = HelloClass() - d = StringDelegate(inst) - ob = DelegateTest() + assert ob.CallStringDelegate(d) == "hello" + assert d() == "hello" - self.assertTrue(ob.CallStringDelegate(d) == "hello") - self.assertTrue(d() == "hello") + ob.stringDelegate = d + assert ob.CallStringDelegate(ob.stringDelegate) == "hello" + assert ob.stringDelegate() == "hello" - ob.stringDelegate = d - self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") - self.assertTrue(ob.stringDelegate() == "hello") + inst = HelloClass() + d = StringDelegate(inst.c_hello) + ob = DelegateTest() - def test_delegate_from_managed_instance_method(self): - """Test delegate implemented with a managed instance method.""" - ob = DelegateTest() - d = StringDelegate(ob.SayHello) + assert ob.CallStringDelegate(d) == "hello" + assert d() == "hello" - self.assertTrue(ob.CallStringDelegate(d) == "hello") - self.assertTrue(d() == "hello") + ob.stringDelegate = d + assert ob.CallStringDelegate(ob.stringDelegate) == "hello" + assert ob.stringDelegate() == "hello" - ob.stringDelegate = d - self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") - self.assertTrue(ob.stringDelegate() == "hello") - def test_delegate_from_managed_static_method(self): - """Test delegate implemented with a managed static method.""" - d = StringDelegate(DelegateTest.StaticSayHello) - ob = DelegateTest() +def test_delegate_from_callable(): + """Test delegate implemented with a Python callable object.""" - self.assertTrue(ob.CallStringDelegate(d) == "hello") - self.assertTrue(d() == "hello") + inst = HelloClass() + d = StringDelegate(inst) + ob = DelegateTest() - ob.stringDelegate = d - self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") - self.assertTrue(ob.stringDelegate() == "hello") + assert ob.CallStringDelegate(d) == "hello" + assert d() == "hello" - def test_delegate_from_delegate(self): - """Test delegate implemented with another delegate.""" - d1 = StringDelegate(hello_func) - d2 = StringDelegate(d1) - ob = DelegateTest() + ob.stringDelegate = d + assert ob.CallStringDelegate(ob.stringDelegate) == "hello" + assert ob.stringDelegate() == "hello" - self.assertTrue(ob.CallStringDelegate(d2) == "hello") - self.assertTrue(d2() == "hello") - ob.stringDelegate = d2 - self.assertTrue(ob.CallStringDelegate(ob.stringDelegate) == "hello") - self.assertTrue(ob.stringDelegate() == "hello") +def test_delegate_from_managed_instance_method(): + """Test delegate implemented with a managed instance method.""" + ob = DelegateTest() + d = StringDelegate(ob.SayHello) - def test_delegate_with_invalid_args(self): - """Test delegate instantiation with invalid (non-callable) args.""" + assert ob.CallStringDelegate(d) == "hello" + assert d() == "hello" - with self.assertRaises(TypeError): - _ = StringDelegate(None) + ob.stringDelegate = d + assert ob.CallStringDelegate(ob.stringDelegate) == "hello" + assert ob.stringDelegate() == "hello" - with self.assertRaises(TypeError): - _ = StringDelegate("spam") - with self.assertRaises(TypeError): - _ = StringDelegate(1) +def test_delegate_from_managed_static_method(): + """Test delegate implemented with a managed static method.""" + d = StringDelegate(DelegateTest.StaticSayHello) + ob = DelegateTest() - def test_multicast_delegate(self): - """Test multicast delegates.""" + assert ob.CallStringDelegate(d) == "hello" + assert d() == "hello" - inst = MultipleHandler() - d1 = StringDelegate(inst.count) - d2 = StringDelegate(inst.count) + ob.stringDelegate = d + assert ob.CallStringDelegate(ob.stringDelegate) == "hello" + assert ob.stringDelegate() == "hello" - md = System.Delegate.Combine(d1, d2) - ob = DelegateTest() - self.assertTrue(ob.CallStringDelegate(md) == "ok") - self.assertTrue(inst.value == 2) +def test_delegate_from_delegate(): + """Test delegate implemented with another delegate.""" + d1 = StringDelegate(hello_func) + d2 = StringDelegate(d1) + ob = DelegateTest() - self.assertTrue(md() == "ok") - self.assertTrue(inst.value == 4) + assert ob.CallStringDelegate(d2) == "hello" + assert d2() == "hello" - def test_subclass_delegate_fails(self): - """Test that subclassing of a delegate type fails.""" - from Python.Test import PublicDelegate + ob.stringDelegate = d2 + assert ob.CallStringDelegate(ob.stringDelegate) == "hello" + assert ob.stringDelegate() == "hello" - with self.assertRaises(TypeError): - class Boom(PublicDelegate): - pass - _ = Boom - def test_delegate_equality(self): - """Test delegate equality.""" +def test_delegate_with_invalid_args(): + """Test delegate instantiation with invalid (non-callable) args.""" - d = StringDelegate(hello_func) - ob = DelegateTest() - ob.stringDelegate = d - self.assertTrue(ob.stringDelegate == d) + with pytest.raises(TypeError): + _ = StringDelegate(None) - def test_bool_delegate(self): - """Test boolean delegate.""" - from Python.Test import BoolDelegate + with pytest.raises(TypeError): + _ = StringDelegate("spam") - def always_so_negative(): - return 0 + with pytest.raises(TypeError): + _ = StringDelegate(1) - d = BoolDelegate(always_so_negative) - ob = DelegateTest() - ob.CallBoolDelegate(d) - self.assertTrue(not d()) - self.assertTrue(not ob.CallBoolDelegate(d)) +def test_multicast_delegate(): + """Test multicast delegates.""" - # test async delegates + inst = MultipleHandler() + d1 = StringDelegate(inst.count) + d2 = StringDelegate(inst.count) - # test multicast delegates + md = System.Delegate.Combine(d1, d2) + ob = DelegateTest() - # test explicit op_ + assert ob.CallStringDelegate(md) == "ok" + assert inst.value == 2 - # test sig mismatch, both on managed and Python side + assert md() == "ok" + assert inst.value == 4 - # test return wrong type +def test_subclass_delegate_fails(): + """Test that subclassing of a delegate type fails.""" + from Python.Test import PublicDelegate -def test_suite(): - return unittest.makeSuite(DelegateTests) + with pytest.raises(TypeError): + class Boom(PublicDelegate): + pass + + _ = Boom + + +def test_delegate_equality(): + """Test delegate equality.""" + + d = StringDelegate(hello_func) + ob = DelegateTest() + ob.stringDelegate = d + assert ob.stringDelegate == d + + +def test_bool_delegate(): + """Test boolean delegate.""" + from Python.Test import BoolDelegate + + def always_so_negative(): + return 0 + + d = BoolDelegate(always_so_negative) + ob = DelegateTest() + ob.CallBoolDelegate(d) + + assert not d() + assert not ob.CallBoolDelegate(d) + + # test async delegates + + # test multicast delegates + + # test explicit op_ + + # test sig mismatch, both on managed and Python side + + # test return wrong type diff --git a/src/tests/test_docstring.py b/src/tests/test_docstring.py index f2bc3302b..640a61915 100644 --- a/src/tests/test_docstring.py +++ b/src/tests/test_docstring.py @@ -1,32 +1,27 @@ # -*- coding: utf-8 -*- -import unittest +"""Test doc strings support.""" -class DocStringTests(unittest.TestCase): - """Test doc strings support.""" +def test_doc_with_ctor(): + from Python.Test import DocWithCtorTest - def test_doc_with_ctor(self): - from Python.Test import DocWithCtorTest + assert DocWithCtorTest.__doc__ == 'DocWithCtorTest Class' + assert DocWithCtorTest.TestMethod.__doc__ == 'DocWithCtorTest TestMethod' + assert DocWithCtorTest.StaticTestMethod.__doc__ == 'DocWithCtorTest StaticTestMethod' - self.assertEqual(DocWithCtorTest.__doc__, 'DocWithCtorTest Class') - self.assertEqual(DocWithCtorTest.TestMethod.__doc__, 'DocWithCtorTest TestMethod') - self.assertEqual(DocWithCtorTest.StaticTestMethod.__doc__, 'DocWithCtorTest StaticTestMethod') - def test_doc_with_ctor_no_doc(self): - from Python.Test import DocWithCtorNoDocTest +def test_doc_with_ctor_no_doc(): + from Python.Test import DocWithCtorNoDocTest - self.assertEqual(DocWithCtorNoDocTest.__doc__, 'Void .ctor(Boolean)') - self.assertEqual(DocWithCtorNoDocTest.TestMethod.__doc__, 'Void TestMethod(Double, Int32)') - self.assertEqual(DocWithCtorNoDocTest.StaticTestMethod.__doc__, 'Void StaticTestMethod(Double, Int32)') + assert DocWithCtorNoDocTest.__doc__ == 'Void .ctor(Boolean)' + assert DocWithCtorNoDocTest.TestMethod.__doc__ == 'Void TestMethod(Double, Int32)' + assert DocWithCtorNoDocTest.StaticTestMethod.__doc__ == 'Void StaticTestMethod(Double, Int32)' - def test_doc_without_ctor(self): - from Python.Test import DocWithoutCtorTest - self.assertEqual(DocWithoutCtorTest.__doc__, 'DocWithoutCtorTest Class') - self.assertEqual(DocWithoutCtorTest.TestMethod.__doc__, 'DocWithoutCtorTest TestMethod') - self.assertEqual(DocWithoutCtorTest.StaticTestMethod.__doc__, 'DocWithoutCtorTest StaticTestMethod') +def test_doc_without_ctor(): + from Python.Test import DocWithoutCtorTest - -def test_suite(): - return unittest.makeSuite(DocStringTests) + assert DocWithoutCtorTest.__doc__ == 'DocWithoutCtorTest Class' + assert DocWithoutCtorTest.TestMethod.__doc__ == 'DocWithoutCtorTest TestMethod' + assert DocWithoutCtorTest.StaticTestMethod.__doc__ == 'DocWithoutCtorTest StaticTestMethod' diff --git a/src/tests/test_engine.py b/src/tests/test_engine.py index b605a3796..cca08a4d2 100644 --- a/src/tests/test_engine.py +++ b/src/tests/test_engine.py @@ -1,46 +1,43 @@ # -*- coding: utf-8 -*- +"""Test PythonEngine embedding APIs.""" + import sys -import unittest import System +import pytest from Python.Runtime import PythonEngine -class EngineTests(unittest.TestCase): - """Test PythonEngine embedding APIs.""" - - def test_multiple_calls_to_initialize(self): - """Test that multiple initialize calls are harmless.""" - try: - PythonEngine.Initialize() - PythonEngine.Initialize() - PythonEngine.Initialize() - except BaseException: - self.fail("Initialize() raise an exception.") +def test_multiple_calls_to_initialize(): + """Test that multiple initialize calls are harmless.""" + try: + PythonEngine.Initialize() + PythonEngine.Initialize() + PythonEngine.Initialize() + except BaseException: + self.fail("Initialize() raise an exception.") - @unittest.skip(reason="FIXME: test crashes") - def test_import_module(self): - """Test module import.""" - m = PythonEngine.ImportModule("sys") - n = m.GetAttr("__name__") - self.assertTrue(n.AsManagedObject(System.String) == "sys") - @unittest.skip(reason="FIXME: test freezes") - def test_run_string(self): - """Test the RunString method.""" - PythonEngine.AcquireLock() +@pytest.mark.skip(reason="FIXME: test crashes") +def test_import_module(): + """Test module import.""" + m = PythonEngine.ImportModule("sys") + n = m.GetAttr("__name__") + assert n.AsManagedObject(System.String) == "sys" - code = "import sys; sys.singleline_worked = 1" - PythonEngine.RunString(code) - self.assertTrue(sys.singleline_worked == 1) - code = "import sys\nsys.multiline_worked = 1" - PythonEngine.RunString(code) - self.assertTrue(sys.multiline_worked == 1) +@pytest.mark.skip(reason="FIXME: test freezes") +def test_run_string(): + """Test the RunString method.""" + PythonEngine.AcquireLock() - PythonEngine.ReleaseLock() + code = "import sys; sys.singleline_worked = 1" + PythonEngine.RunString(code) + assert sys.singleline_worked == 1 + code = "import sys\nsys.multiline_worked = 1" + PythonEngine.RunString(code) + assert sys.multiline_worked == 1 -def test_suite(): - return unittest.makeSuite(EngineTests) + PythonEngine.ReleaseLock() diff --git a/src/tests/test_enum.py b/src/tests/test_enum.py index e7147e69c..b31ce4ec5 100644 --- a/src/tests/test_enum.py +++ b/src/tests/test_enum.py @@ -1,136 +1,145 @@ # -*- coding: utf-8 -*- -import unittest +"""Test clr enum support.""" +import pytest import Python.Test as Test -from _compat import DictProxyType, long - - -class EnumTests(unittest.TestCase): - """Test CLR enum support.""" - - def test_enum_standard_attrs(self): - """Test standard enum attributes.""" - from System import DayOfWeek - - self.assertTrue(DayOfWeek.__name__ == 'DayOfWeek') - self.assertTrue(DayOfWeek.__module__ == 'System') - self.assertTrue(isinstance(DayOfWeek.__dict__, DictProxyType)) - self.assertTrue(DayOfWeek.__doc__ is None) - - def test_enum_get_member(self): - """Test access to enum members.""" - from System import DayOfWeek - - self.assertTrue(DayOfWeek.Sunday == 0) - self.assertTrue(DayOfWeek.Monday == 1) - self.assertTrue(DayOfWeek.Tuesday == 2) - self.assertTrue(DayOfWeek.Wednesday == 3) - self.assertTrue(DayOfWeek.Thursday == 4) - self.assertTrue(DayOfWeek.Friday == 5) - self.assertTrue(DayOfWeek.Saturday == 6) - - def test_byte_enum(self): - """Test byte enum.""" - self.assertTrue(Test.ByteEnum.Zero == 0) - self.assertTrue(Test.ByteEnum.One == 1) - self.assertTrue(Test.ByteEnum.Two == 2) - - def test_sbyte_enum(self): - """Test sbyte enum.""" - self.assertTrue(Test.SByteEnum.Zero == 0) - self.assertTrue(Test.SByteEnum.One == 1) - self.assertTrue(Test.SByteEnum.Two == 2) - - def test_short_enum(self): - """Test short enum.""" - self.assertTrue(Test.ShortEnum.Zero == 0) - self.assertTrue(Test.ShortEnum.One == 1) - self.assertTrue(Test.ShortEnum.Two == 2) - - def test_ushort_enum(self): - """Test ushort enum.""" - self.assertTrue(Test.UShortEnum.Zero == 0) - self.assertTrue(Test.UShortEnum.One == 1) - self.assertTrue(Test.UShortEnum.Two == 2) - - def test_int_enum(self): - """Test int enum.""" - self.assertTrue(Test.IntEnum.Zero == 0) - self.assertTrue(Test.IntEnum.One == 1) - self.assertTrue(Test.IntEnum.Two == 2) - - def test_uint_enum(self): - """Test uint enum.""" - self.assertTrue(Test.UIntEnum.Zero == long(0)) - self.assertTrue(Test.UIntEnum.One == long(1)) - self.assertTrue(Test.UIntEnum.Two == long(2)) - - def test_long_enum(self): - """Test long enum.""" - self.assertTrue(Test.LongEnum.Zero == long(0)) - self.assertTrue(Test.LongEnum.One == long(1)) - self.assertTrue(Test.LongEnum.Two == long(2)) - - def test_ulong_enum(self): - """Test ulong enum.""" - self.assertTrue(Test.ULongEnum.Zero == long(0)) - self.assertTrue(Test.ULongEnum.One == long(1)) - self.assertTrue(Test.ULongEnum.Two == long(2)) - - def test_instantiate_enum_fails(self): - """Test that instantiation of an enum class fails.""" - from System import DayOfWeek - - with self.assertRaises(TypeError): - _ = DayOfWeek() - - def test_subclass_enum_fails(self): - """Test that subclassing of an enumeration fails.""" - from System import DayOfWeek - - with self.assertRaises(TypeError): - class Boom(DayOfWeek): - pass - _ = Boom - - def test_enum_set_member_fails(self): - """Test that setattr operations on enumerations fail.""" - from System import DayOfWeek - - with self.assertRaises(TypeError): - DayOfWeek.Sunday = 13 - - with self.assertRaises(TypeError): - del DayOfWeek.Sunday - - def test_enum_with_flags_attr_conversion(self): - """Test enumeration conversion with FlagsAttribute set.""" - # This works because the FlagsField enum has FlagsAttribute. - Test.FieldTest().FlagsField = 99 - - # This should fail because our test enum doesn't have it. - with self.assertRaises(ValueError): - Test.FieldTest().EnumField = 99 - - def test_enum_conversion(self): - """Test enumeration conversion.""" - ob = Test.FieldTest() - self.assertTrue(ob.EnumField == 0) - - ob.EnumField = Test.ShortEnum.One - self.assertTrue(ob.EnumField == 1) - - with self.assertRaises(ValueError): - Test.FieldTest().EnumField = 20 - - with self.assertRaises(OverflowError): - Test.FieldTest().EnumField = 100000 - - with self.assertRaises(TypeError): - Test.FieldTest().EnumField = "str" - - -def test_suite(): - return unittest.makeSuite(EnumTests) +from ._compat import DictProxyType, long + + +def test_enum_standard_attrs(): + """Test standard enum attributes.""" + from System import DayOfWeek + + assert DayOfWeek.__name__ == 'DayOfWeek' + assert DayOfWeek.__module__ == 'System' + assert isinstance(DayOfWeek.__dict__, DictProxyType) + assert DayOfWeek.__doc__ is None + + +def test_enum_get_member(): + """Test access to enum members.""" + from System import DayOfWeek + + assert DayOfWeek.Sunday == 0 + assert DayOfWeek.Monday == 1 + assert DayOfWeek.Tuesday == 2 + assert DayOfWeek.Wednesday == 3 + assert DayOfWeek.Thursday == 4 + assert DayOfWeek.Friday == 5 + assert DayOfWeek.Saturday == 6 + + +def test_byte_enum(): + """Test byte enum.""" + assert Test.ByteEnum.Zero == 0 + assert Test.ByteEnum.One == 1 + assert Test.ByteEnum.Two == 2 + + +def test_sbyte_enum(): + """Test sbyte enum.""" + assert Test.SByteEnum.Zero == 0 + assert Test.SByteEnum.One == 1 + assert Test.SByteEnum.Two == 2 + + +def test_short_enum(): + """Test short enum.""" + assert Test.ShortEnum.Zero == 0 + assert Test.ShortEnum.One == 1 + assert Test.ShortEnum.Two == 2 + + +def test_ushort_enum(): + """Test ushort enum.""" + assert Test.UShortEnum.Zero == 0 + assert Test.UShortEnum.One == 1 + assert Test.UShortEnum.Two == 2 + + +def test_int_enum(): + """Test int enum.""" + assert Test.IntEnum.Zero == 0 + assert Test.IntEnum.One == 1 + assert Test.IntEnum.Two == 2 + + +def test_uint_enum(): + """Test uint enum.""" + assert Test.UIntEnum.Zero == long(0) + assert Test.UIntEnum.One == long(1) + assert Test.UIntEnum.Two == long(2) + + +def test_long_enum(): + """Test long enum.""" + assert Test.LongEnum.Zero == long(0) + assert Test.LongEnum.One == long(1) + assert Test.LongEnum.Two == long(2) + + +def test_ulong_enum(): + """Test ulong enum.""" + assert Test.ULongEnum.Zero == long(0) + assert Test.ULongEnum.One == long(1) + assert Test.ULongEnum.Two == long(2) + + +def test_instantiate_enum_fails(): + """Test that instantiation of an enum class fails.""" + from System import DayOfWeek + + with pytest.raises(TypeError): + _ = DayOfWeek() + + +def test_subclass_enum_fails(): + """Test that subclassing of an enumeration fails.""" + from System import DayOfWeek + + with pytest.raises(TypeError): + class Boom(DayOfWeek): + pass + + _ = Boom + + +def test_enum_set_member_fails(): + """Test that setattr operations on enumerations fail.""" + from System import DayOfWeek + + with pytest.raises(TypeError): + DayOfWeek.Sunday = 13 + + with pytest.raises(TypeError): + del DayOfWeek.Sunday + + +def test_enum_with_flags_attr_conversion(): + """Test enumeration conversion with FlagsAttribute set.""" + # This works because the FlagsField enum has FlagsAttribute. + Test.FieldTest().FlagsField = 99 + + # This should fail because our test enum doesn't have it. + with pytest.raises(ValueError): + Test.FieldTest().EnumField = 99 + + +def test_enum_conversion(): + """Test enumeration conversion.""" + ob = Test.FieldTest() + assert ob.EnumField == 0 + + ob.EnumField = Test.ShortEnum.One + assert ob.EnumField == 1 + + with pytest.raises(ValueError): + Test.FieldTest().EnumField = 20 + + with pytest.raises(OverflowError): + Test.FieldTest().EnumField = 100000 + + with pytest.raises(TypeError): + Test.FieldTest().EnumField = "str" diff --git a/src/tests/test_event.py b/src/tests/test_event.py index 047af47f3..624b83d44 100644 --- a/src/tests/test_event.py +++ b/src/tests/test_event.py @@ -1,563 +1,584 @@ # -*- coding: utf-8 -*- -import unittest +"""Test CLR event support.""" +import pytest from Python.Test import EventTest, EventArgsTest -from _compat import range -from utils import (CallableHandler, ClassMethodHandler, GenericHandler, - MultipleHandler, StaticMethodHandler, VarCallableHandler, - VariableArgsHandler) +from ._compat import range +from .utils import (CallableHandler, ClassMethodHandler, GenericHandler, + MultipleHandler, StaticMethodHandler, VarCallableHandler, + VariableArgsHandler) -class EventTests(unittest.TestCase): - """Test CLR event support.""" +def test_public_instance_event(): + """Test public instance events.""" + ob = EventTest() - def test_public_instance_event(self): - """Test public instance events.""" - ob = EventTest() + handler = GenericHandler() + assert handler.value is None - handler = GenericHandler() - self.assertTrue(handler.value is None) + ob.PublicEvent += handler.handler - ob.PublicEvent += handler.handler + ob.OnPublicEvent(EventArgsTest(10)) + assert handler.value == 10 - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 10) + ob.PublicEvent -= handler.handler - ob.PublicEvent -= handler.handler - def test_public_static_event(self): - """Test public static events.""" - handler = GenericHandler() - self.assertTrue(handler.value is None) +def test_public_static_event(): + """Test public static events.""" + handler = GenericHandler() + assert handler.value is None - EventTest.PublicStaticEvent += handler.handler + EventTest.PublicStaticEvent += handler.handler - EventTest.OnPublicStaticEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 10) + EventTest.OnPublicStaticEvent(EventArgsTest(10)) + assert handler.value == 10 - def test_protected_instance_event(self): - """Test protected instance events.""" - ob = EventTest() - handler = GenericHandler() - self.assertTrue(handler.value is None) +def test_protected_instance_event(): + """Test protected instance events.""" + ob = EventTest() - ob.ProtectedEvent += handler.handler + handler = GenericHandler() + assert handler.value is None - ob.OnProtectedEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 10) + ob.ProtectedEvent += handler.handler - ob.ProtectedEvent -= handler.handler + ob.OnProtectedEvent(EventArgsTest(10)) + assert handler.value == 10 - def test_protected_static_event(self): - """Test protected static events.""" - handler = GenericHandler() - self.assertTrue(handler.value is None) + ob.ProtectedEvent -= handler.handler - EventTest.ProtectedStaticEvent += handler.handler - EventTest.OnProtectedStaticEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 10) +def test_protected_static_event(): + """Test protected static events.""" + handler = GenericHandler() + assert handler.value is None - EventTest.ProtectedStaticEvent -= handler.handler + EventTest.ProtectedStaticEvent += handler.handler - def test_internal_events(self): - """Test internal events.""" + EventTest.OnProtectedStaticEvent(EventArgsTest(10)) + assert handler.value == 10 - with self.assertRaises(AttributeError): - _ = EventTest().InternalEvent + EventTest.ProtectedStaticEvent -= handler.handler - with self.assertRaises(AttributeError): - _ = EventTest().InternalStaticEvent - with self.assertRaises(AttributeError): - _ = EventTest.InternalStaticEvent +def test_internal_events(): + """Test internal events.""" - def test_private_events(self): - """Test private events.""" + with pytest.raises(AttributeError): + _ = EventTest().InternalEvent - with self.assertRaises(AttributeError): - _ = EventTest().PrivateEvent + with pytest.raises(AttributeError): + _ = EventTest().InternalStaticEvent - with self.assertRaises(AttributeError): - _ = EventTest().PrivateStaticEvent + with pytest.raises(AttributeError): + _ = EventTest.InternalStaticEvent - with self.assertRaises(AttributeError): - _ = EventTest.PrivateStaticEvent - def test_multicast_event(self): - """Test multicast events.""" - ob = EventTest() +def test_private_events(): + """Test private events.""" - handler1 = GenericHandler() - handler2 = GenericHandler() - handler3 = GenericHandler() + with pytest.raises(AttributeError): + _ = EventTest().PrivateEvent - ob.PublicEvent += handler1.handler - ob.PublicEvent += handler2.handler - ob.PublicEvent += handler3.handler + with pytest.raises(AttributeError): + _ = EventTest().PrivateStaticEvent - ob.OnPublicEvent(EventArgsTest(10)) + with pytest.raises(AttributeError): + _ = EventTest.PrivateStaticEvent - self.assertTrue(handler1.value == 10) - self.assertTrue(handler2.value == 10) - self.assertTrue(handler3.value == 10) - ob.OnPublicEvent(EventArgsTest(20)) +def test_multicast_event(): + """Test multicast events.""" + ob = EventTest() - self.assertTrue(handler1.value == 20) - self.assertTrue(handler2.value == 20) - self.assertTrue(handler3.value == 20) + handler1 = GenericHandler() + handler2 = GenericHandler() + handler3 = GenericHandler() - ob.PublicEvent -= handler1.handler - ob.PublicEvent -= handler2.handler - ob.PublicEvent -= handler3.handler + ob.PublicEvent += handler1.handler + ob.PublicEvent += handler2.handler + ob.PublicEvent += handler3.handler - def test_instance_method_handler(self): - """Test instance method handlers.""" - ob = EventTest() - handler = GenericHandler() + ob.OnPublicEvent(EventArgsTest(10)) - ob.PublicEvent += handler.handler - self.assertTrue(handler.value is None) + assert handler1.value == 10 + assert handler2.value == 10 + assert handler3.value == 10 - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 10) + ob.OnPublicEvent(EventArgsTest(20)) - ob.PublicEvent -= handler.handler - self.assertTrue(handler.value == 10) + assert handler1.value == 20 + assert handler2.value == 20 + assert handler3.value == 20 - ob.OnPublicEvent(EventArgsTest(20)) - self.assertTrue(handler.value == 10) + ob.PublicEvent -= handler1.handler + ob.PublicEvent -= handler2.handler + ob.PublicEvent -= handler3.handler - def test_var_args_instance_method_handler(self): - """Test vararg instance method handlers.""" - ob = EventTest() - handler = VariableArgsHandler() - ob.PublicEvent += handler.handler - self.assertTrue(handler.value is None) +def test_instance_method_handler(): + """Test instance method handlers.""" + ob = EventTest() + handler = GenericHandler() - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 10) + ob.PublicEvent += handler.handler + assert handler.value is None - ob.PublicEvent -= handler.handler - self.assertTrue(handler.value == 10) + ob.OnPublicEvent(EventArgsTest(10)) + assert handler.value == 10 - ob.OnPublicEvent(EventArgsTest(20)) - self.assertTrue(handler.value == 10) + ob.PublicEvent -= handler.handler + assert handler.value == 10 - def test_callableob_handler(self): - """Test callable ob handlers.""" - ob = EventTest() - handler = CallableHandler() + ob.OnPublicEvent(EventArgsTest(20)) + assert handler.value == 10 - ob.PublicEvent += handler - self.assertTrue(handler.value is None) - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 10) +def test_var_args_instance_method_handler(): + """Test vararg instance method handlers.""" + ob = EventTest() + handler = VariableArgsHandler() - ob.PublicEvent -= handler - self.assertTrue(handler.value == 10) + ob.PublicEvent += handler.handler + assert handler.value is None - ob.OnPublicEvent(EventArgsTest(20)) - self.assertTrue(handler.value == 10) + ob.OnPublicEvent(EventArgsTest(10)) + assert handler.value == 10 - def test_var_args_callable_handler(self): - """Test varargs callable handlers.""" - ob = EventTest() - handler = VarCallableHandler() + ob.PublicEvent -= handler.handler + assert handler.value == 10 - ob.PublicEvent += handler - self.assertTrue(handler.value is None) + ob.OnPublicEvent(EventArgsTest(20)) + assert handler.value == 10 - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 10) - ob.PublicEvent -= handler - self.assertTrue(handler.value == 10) +def test_callableob_handler(): + """Test callable ob handlers.""" + ob = EventTest() + handler = CallableHandler() - ob.OnPublicEvent(EventArgsTest(20)) - self.assertTrue(handler.value == 10) + ob.PublicEvent += handler + assert handler.value is None - def test_static_method_handler(self): - """Test static method handlers.""" - ob = EventTest() - handler = StaticMethodHandler() - StaticMethodHandler.value = None + ob.OnPublicEvent(EventArgsTest(10)) + assert handler.value == 10 - ob.PublicEvent += handler.handler - self.assertTrue(handler.value is None) + ob.PublicEvent -= handler + assert handler.value == 10 - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 10) + ob.OnPublicEvent(EventArgsTest(20)) + assert handler.value == 10 - ob.PublicEvent -= handler.handler - self.assertTrue(handler.value == 10) - ob.OnPublicEvent(EventArgsTest(20)) - self.assertTrue(handler.value == 10) +def test_var_args_callable_handler(): + """Test varargs callable handlers.""" + ob = EventTest() + handler = VarCallableHandler() - def test_class_method_handler(self): - """Test class method handlers.""" - ob = EventTest() - handler = ClassMethodHandler() - ClassMethodHandler.value = None + ob.PublicEvent += handler + assert handler.value is None - ob.PublicEvent += handler.handler - self.assertTrue(handler.value is None) + ob.OnPublicEvent(EventArgsTest(10)) + assert handler.value == 10 - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 10) + ob.PublicEvent -= handler + assert handler.value == 10 - ob.PublicEvent -= handler.handler - self.assertTrue(handler.value == 10) + ob.OnPublicEvent(EventArgsTest(20)) + assert handler.value == 10 - ob.OnPublicEvent(EventArgsTest(20)) - self.assertTrue(handler.value == 10) - def test_managed_instance_method_handler(self): - """Test managed instance method handlers.""" - ob = EventTest() +def test_static_method_handler(): + """Test static method handlers.""" + ob = EventTest() + handler = StaticMethodHandler() + StaticMethodHandler.value = None - ob.PublicEvent += ob.GenericHandler - self.assertTrue(ob.value == 0) + ob.PublicEvent += handler.handler + assert handler.value is None - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(ob.value == 10) + ob.OnPublicEvent(EventArgsTest(10)) + assert handler.value == 10 - ob.PublicEvent -= ob.GenericHandler - self.assertTrue(ob.value == 10) + ob.PublicEvent -= handler.handler + assert handler.value == 10 - ob.OnPublicEvent(EventArgsTest(20)) - self.assertTrue(ob.value == 10) + ob.OnPublicEvent(EventArgsTest(20)) + assert handler.value == 10 - def test_managed_static_method_handler(self): - """Test managed static method handlers.""" - ob = EventTest() - EventTest.s_value = 0 - ob.PublicEvent += ob.StaticHandler - self.assertTrue(EventTest.s_value == 0) +def test_class_method_handler(): + """Test class method handlers.""" + ob = EventTest() + handler = ClassMethodHandler() + ClassMethodHandler.value = None - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(EventTest.s_value == 10) + ob.PublicEvent += handler.handler + assert handler.value is None - ob.PublicEvent -= ob.StaticHandler - self.assertTrue(EventTest.s_value == 10) + ob.OnPublicEvent(EventArgsTest(10)) + assert handler.value == 10 - ob.OnPublicEvent(EventArgsTest(20)) - self.assertTrue(EventTest.s_value == 10) + ob.PublicEvent -= handler.handler + assert handler.value == 10 - def test_unbound_method_handler(self): - """Test failure mode for unbound method handlers.""" - ob = EventTest() - ob.PublicEvent += GenericHandler.handler + ob.OnPublicEvent(EventArgsTest(20)) + assert handler.value == 10 - with self.assertRaises(TypeError): - ob.OnPublicEvent(EventArgsTest(10)) - ob.PublicEvent -= GenericHandler.handler +def test_managed_instance_method_handler(): + """Test managed instance method handlers.""" + ob = EventTest() - def test_function_handler(self): - """Test function handlers.""" - ob = EventTest() - dict_ = {'value': None} + ob.PublicEvent += ob.GenericHandler + assert ob.value == 0 + + ob.OnPublicEvent(EventArgsTest(10)) + assert ob.value == 10 - def handler(sender, args, dict_=dict_): - dict_['value'] = args.value + ob.PublicEvent -= ob.GenericHandler + assert ob.value == 10 - ob.PublicEvent += handler - self.assertTrue(dict_['value'] is None) + ob.OnPublicEvent(EventArgsTest(20)) + assert ob.value == 10 + +def test_managed_static_method_handler(): + """Test managed static method handlers.""" + ob = EventTest() + EventTest.s_value = 0 + + ob.PublicEvent += ob.StaticHandler + assert EventTest.s_value == 0 + + ob.OnPublicEvent(EventArgsTest(10)) + assert EventTest.s_value == 10 + + ob.PublicEvent -= ob.StaticHandler + assert EventTest.s_value == 10 + + ob.OnPublicEvent(EventArgsTest(20)) + assert EventTest.s_value == 10 + + +def test_unbound_method_handler(): + """Test failure mode for unbound method handlers.""" + ob = EventTest() + ob.PublicEvent += GenericHandler.handler + + with pytest.raises(TypeError): ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(dict_['value'] == 10) - ob.PublicEvent -= handler - self.assertTrue(dict_['value'] == 10) + ob.PublicEvent -= GenericHandler.handler + - ob.OnPublicEvent(EventArgsTest(20)) - self.assertTrue(dict_['value'] == 10) +def test_function_handler(): + """Test function handlers.""" + ob = EventTest() + dict_ = {'value': None} - def test_add_non_callable_handler(self): - """Test handling of attempts to add non-callable handlers.""" + def handler(sender, args, dict_=dict_): + dict_['value'] = args.value - with self.assertRaises(TypeError): - ob = EventTest() - ob.PublicEvent += 10 + ob.PublicEvent += handler + assert dict_['value'] is None - with self.assertRaises(TypeError): - ob = EventTest() - ob.PublicEvent += "spam" + ob.OnPublicEvent(EventArgsTest(10)) + assert dict_['value'] == 10 - with self.assertRaises(TypeError): - class Spam(object): - pass + ob.PublicEvent -= handler + assert dict_['value'] == 10 - ob = EventTest() - ob.PublicEvent += Spam() + ob.OnPublicEvent(EventArgsTest(20)) + assert dict_['value'] == 10 - def test_remove_multiple_handlers(self): - """Test removing multiple instances of the same handler.""" + +def test_add_non_callable_handler(): + """Test handling of attempts to add non-callable handlers.""" + + with pytest.raises(TypeError): ob = EventTest() - handler = MultipleHandler() + ob.PublicEvent += 10 - h1 = handler.handler - ob.PublicEvent += h1 + with pytest.raises(TypeError): + ob = EventTest() + ob.PublicEvent += "spam" - h2 = handler.handler - ob.PublicEvent += h2 + with pytest.raises(TypeError): + class Spam(object): + pass - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 20) + ob = EventTest() + ob.PublicEvent += Spam() - ob.PublicEvent -= h1 - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 30) +def test_remove_multiple_handlers(): + """Test removing multiple instances of the same handler.""" + ob = EventTest() + handler = MultipleHandler() - ob.PublicEvent -= h2 + h1 = handler.handler + ob.PublicEvent += h1 - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 30) + h2 = handler.handler + ob.PublicEvent += h2 - # try again, removing in a different order. + ob.OnPublicEvent(EventArgsTest(10)) + assert handler.value == 20 - ob = EventTest() - handler = MultipleHandler() + ob.PublicEvent -= h1 - h1 = handler.handler - ob.PublicEvent += h1 + ob.OnPublicEvent(EventArgsTest(10)) + assert handler.value == 30 - h2 = handler.handler - ob.PublicEvent += h2 + ob.PublicEvent -= h2 - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 20) + ob.OnPublicEvent(EventArgsTest(10)) + assert handler.value == 30 - ob.PublicEvent -= h2 + # try again, removing in a different order. - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 30) + ob = EventTest() + handler = MultipleHandler() - ob.PublicEvent -= h1 + h1 = handler.handler + ob.PublicEvent += h1 - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 30) + h2 = handler.handler + ob.PublicEvent += h2 - def test_remove_multiple_static_handlers(self): - """Test removing multiple instances of a static handler.""" - ob = EventTest() - handler = MultipleHandler() + ob.OnPublicEvent(EventArgsTest(10)) + assert handler.value == 20 - h1 = handler.handler - ob.PublicStaticEvent += h1 + ob.PublicEvent -= h2 - h2 = handler.handler - ob.PublicStaticEvent += h2 + ob.OnPublicEvent(EventArgsTest(10)) + assert handler.value == 30 - ob.OnPublicStaticEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 20) + ob.PublicEvent -= h1 - ob.PublicStaticEvent -= h1 + ob.OnPublicEvent(EventArgsTest(10)) + assert handler.value == 30 - ob.OnPublicStaticEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 30) - ob.PublicStaticEvent -= h2 +def test_remove_multiple_static_handlers(): + """Test removing multiple instances of a static handler.""" + ob = EventTest() + handler = MultipleHandler() - ob.OnPublicStaticEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 30) + h1 = handler.handler + ob.PublicStaticEvent += h1 - # try again, removing in a different order. + h2 = handler.handler + ob.PublicStaticEvent += h2 - ob = EventTest() - handler = MultipleHandler() + ob.OnPublicStaticEvent(EventArgsTest(10)) + assert handler.value == 20 - h1 = handler.handler - ob.PublicStaticEvent += h1 + ob.PublicStaticEvent -= h1 - h2 = handler.handler - ob.PublicStaticEvent += h2 + ob.OnPublicStaticEvent(EventArgsTest(10)) + assert handler.value == 30 - ob.OnPublicStaticEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 20) + ob.PublicStaticEvent -= h2 - ob.PublicStaticEvent -= h2 + ob.OnPublicStaticEvent(EventArgsTest(10)) + assert handler.value == 30 - ob.OnPublicStaticEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 30) + # try again, removing in a different order. - ob.PublicStaticEvent -= h1 + ob = EventTest() + handler = MultipleHandler() - ob.OnPublicStaticEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 30) + h1 = handler.handler + ob.PublicStaticEvent += h1 - def test_random_multiple_handlers(self): - """Test random subscribe / unsubscribe of the same handlers.""" - import random - ob = EventTest() - handler = MultipleHandler() - handler2 = MultipleHandler() + h2 = handler.handler + ob.PublicStaticEvent += h2 - ob.PublicEvent += handler2.handler - ob.PublicEvent += handler2.handler + ob.OnPublicStaticEvent(EventArgsTest(10)) + assert handler.value == 20 - handlers = [] - for _ in range(30): - method = handler.handler - ob.PublicEvent += method - handlers.append(method) + ob.PublicStaticEvent -= h2 - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 300) - self.assertTrue(handler2.value == 20) - handler.value = 0 - handler2.value = 0 - - for i in range(30): - item = random.choice(handlers) - handlers.remove(item) - ob.PublicEvent -= item - handler.value = 0 - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler.value == (len(handlers) * 10)) - self.assertTrue(handler2.value == ((i + 1) * 20)) - - handler2.value = 0 - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler2.value == 20) + ob.OnPublicStaticEvent(EventArgsTest(10)) + assert handler.value == 30 - ob.PublicEvent -= handler2.handler + ob.PublicStaticEvent -= h1 - handler2.value = 0 - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler2.value == 10) + ob.OnPublicStaticEvent(EventArgsTest(10)) + assert handler.value == 30 + + +def test_random_multiple_handlers(): + """Test random subscribe / unsubscribe of the same handlers.""" + import random + ob = EventTest() + handler = MultipleHandler() + handler2 = MultipleHandler() + + ob.PublicEvent += handler2.handler + ob.PublicEvent += handler2.handler - ob.PublicEvent -= handler2.handler + handlers = [] + for _ in range(30): + method = handler.handler + ob.PublicEvent += method + handlers.append(method) - handler2.value = 0 + ob.OnPublicEvent(EventArgsTest(10)) + assert handler.value == 300 + assert handler2.value == 20 + handler.value = 0 + handler2.value = 0 + + for i in range(30): + item = random.choice(handlers) + handlers.remove(item) + ob.PublicEvent -= item + handler.value = 0 ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler2.value == 0) + assert handler.value == (len(handlers) * 10) + assert handler2.value == ((i + 1) * 20) - def test_remove_internal_call_handler(self): - """Test remove on an event sink implemented w/internalcall.""" - ob = EventTest() + handler2.value = 0 + ob.OnPublicEvent(EventArgsTest(10)) + assert handler2.value == 20 - def h(sender, args): - pass + ob.PublicEvent -= handler2.handler - ob.PublicEvent += h - ob.PublicEvent -= h + handler2.value = 0 + ob.OnPublicEvent(EventArgsTest(10)) + assert handler2.value == 10 - def test_remove_unknown_handler(self): - """Test removing an event handler that was never added.""" + ob.PublicEvent -= handler2.handler - with self.assertRaises(ValueError): - ob = EventTest() - handler = GenericHandler() + handler2.value = 0 + ob.OnPublicEvent(EventArgsTest(10)) + assert handler2.value == 0 - ob.PublicEvent -= handler.handler - def test_handler_callback_failure(self): - """Test failure mode for inappropriate handlers.""" +def test_remove_internal_call_handler(): + """Test remove on an event sink implemented w/internalcall.""" + ob = EventTest() - class BadHandler(object): - def handler(self, one): - return 'too many' + def h(sender, args): + pass + + ob.PublicEvent += h + ob.PublicEvent -= h - ob = EventTest() - handler = BadHandler() - with self.assertRaises(TypeError): - ob.PublicEvent += handler.handler - ob.OnPublicEvent(EventArgsTest(10)) +def test_remove_unknown_handler(): + """Test removing an event handler that was never added.""" + + with pytest.raises(ValueError): + ob = EventTest() + handler = GenericHandler() ob.PublicEvent -= handler.handler - class BadHandler(object): - def handler(self, one, two, three, four, five): - return 'not enough' - ob = EventTest() - handler = BadHandler() +def test_handler_callback_failure(): + """Test failure mode for inappropriate handlers.""" - with self.assertRaises(TypeError): - ob.PublicEvent += handler.handler - ob.OnPublicEvent(EventArgsTest(10)) + class BadHandler(object): + def handler(self, one): + return 'too many' - ob.PublicEvent -= handler.handler + ob = EventTest() + handler = BadHandler() - def test_incorrect_invokation(self): - """Test incorrect invocation of events.""" - ob = EventTest() + with pytest.raises(TypeError): + ob.PublicEvent += handler.handler + ob.OnPublicEvent(EventArgsTest(10)) - handler = GenericHandler() + ob.PublicEvent -= handler.handler + + class BadHandler(object): + def handler(self, one, two, three, four, five): + return 'not enough' + + ob = EventTest() + handler = BadHandler() + + with pytest.raises(TypeError): ob.PublicEvent += handler.handler + ob.OnPublicEvent(EventArgsTest(10)) - with self.assertRaises(TypeError): - ob.OnPublicEvent() + ob.PublicEvent -= handler.handler - with self.assertRaises(TypeError): - ob.OnPublicEvent(32) - ob.PublicEvent -= handler.handler +def test_incorrect_invokation(): + """Test incorrect invocation of events.""" + ob = EventTest() - def test_explicit_cls_event_registration(self): - """Test explicit CLS event registration.""" - from Python.Test import EventHandlerTest + handler = GenericHandler() + ob.PublicEvent += handler.handler - ob = EventTest() - handler = GenericHandler() + with pytest.raises(TypeError): + ob.OnPublicEvent() - delegate = EventHandlerTest(handler.handler) - ob.add_PublicEvent(delegate) - self.assertTrue(handler.value is None) + with pytest.raises(TypeError): + ob.OnPublicEvent(32) - ob.OnPublicEvent(EventArgsTest(10)) - self.assertTrue(handler.value == 10) + ob.PublicEvent -= handler.handler + + +def test_explicit_cls_event_registration(): + """Test explicit CLS event registration.""" + from Python.Test import EventHandlerTest - ob.remove_PublicEvent(delegate) - self.assertTrue(handler.value == 10) + ob = EventTest() + handler = GenericHandler() - ob.OnPublicEvent(EventArgsTest(20)) - self.assertTrue(handler.value == 10) + delegate = EventHandlerTest(handler.handler) + ob.add_PublicEvent(delegate) + assert handler.value is None - def test_implicit_cls_event_registration(self): - """Test implicit CLS event registration.""" + ob.OnPublicEvent(EventArgsTest(10)) + assert handler.value == 10 - with self.assertRaises(TypeError): - ob = EventTest() - handler = GenericHandler() - ob.add_PublicEvent(handler.handler) + ob.remove_PublicEvent(delegate) + assert handler.value == 10 - def test_event_descriptor_abuse(self): - """Test event descriptor abuse.""" + ob.OnPublicEvent(EventArgsTest(20)) + assert handler.value == 10 - with self.assertRaises(TypeError): - del EventTest.PublicEvent - with self.assertRaises(TypeError): - del EventTest.__dict__['PublicEvent'] +def test_implicit_cls_event_registration(): + """Test implicit CLS event registration.""" + + with pytest.raises(TypeError): + ob = EventTest() + handler = GenericHandler() + ob.add_PublicEvent(handler.handler) - desc = EventTest.__dict__['PublicEvent'] - with self.assertRaises(TypeError): - desc.__get__(0, 0) +def test_event_descriptor_abuse(): + """Test event descriptor abuse.""" - with self.assertRaises(TypeError): - desc.__set__(0, 0) + with pytest.raises(TypeError): + del EventTest.PublicEvent - with self.assertRaises(TypeError): - ob = EventTest() - ob.PublicEvent = 0 + with pytest.raises(TypeError): + del EventTest.__dict__['PublicEvent'] - with self.assertRaises(TypeError): - EventTest.PublicStaticEvent = 0 + desc = EventTest.__dict__['PublicEvent'] + with pytest.raises(TypeError): + desc.__get__(0, 0) + + with pytest.raises(TypeError): + desc.__set__(0, 0) + + with pytest.raises(TypeError): + ob = EventTest() + ob.PublicEvent = 0 -def test_suite(): - return unittest.makeSuite(EventTests) + with pytest.raises(TypeError): + EventTest.PublicStaticEvent = 0 diff --git a/src/tests/test_exceptions.py b/src/tests/test_exceptions.py index 2fb55589c..f47209f6d 100644 --- a/src/tests/test_exceptions.py +++ b/src/tests/test_exceptions.py @@ -1,328 +1,347 @@ # -*- coding: utf-8 -*- +"""Test exception support.""" + import sys -import unittest import System +import pytest + +from ._compat import PY2, PY3, pickle, text_type + + +def test_unified_exception_semantics(): + """Test unified exception semantics.""" + e = System.Exception('Something bad happened') + assert isinstance(e, Exception) + assert isinstance(e, System.Exception) + + +def test_standard_exception_attributes(): + """Test accessing standard exception attributes.""" + from System import OverflowException + from Python.Test import ExceptionTest + + e = ExceptionTest.GetExplicitException() + assert isinstance(e, OverflowException) + + assert e.Message == 'error' + + e.Source = 'Test Suite' + assert e.Source == 'Test Suite' + + v = e.ToString() + assert len(v) > 0 + + +def test_extended_exception_attributes(): + """Test accessing extended exception attributes.""" + from Python.Test import ExceptionTest, ExtendedException + from System import OverflowException + + e = ExceptionTest.GetExtendedException() + assert isinstance(e, ExtendedException) + assert isinstance(e, OverflowException) + assert isinstance(e, System.Exception) + + assert e.Message == 'error' + + e.Source = 'Test Suite' + assert e.Source == 'Test Suite' + + v = e.ToString() + assert len(v) > 0 + + assert e.ExtraProperty == 'extra' + e.ExtraProperty = 'changed' + assert e.ExtraProperty == 'changed' + + assert e.GetExtraInfo() == 'changed' + + +def test_raise_class_exception(): + """Test class exception propagation.""" + from System import NullReferenceException + + with pytest.raises(NullReferenceException) as cm: + raise NullReferenceException + + exc = cm.value + assert isinstance(exc, NullReferenceException) + + +def test_exc_info(): + """Test class exception propagation. + Behavior of exc_info changed in Py3. Refactoring its test""" + from System import NullReferenceException + try: + raise NullReferenceException("message") + except Exception as exc: + type_, value, tb = sys.exc_info() + assert type_ is NullReferenceException + assert value.Message == "message" + assert exc.Message == "message" + # FIXME: Lower-case message isn't implemented + # self.assertTrue(exc.message == "message") + assert value is exc + + +def test_raise_class_exception_with_value(): + """Test class exception propagation with associated value.""" + from System import NullReferenceException + + with pytest.raises(NullReferenceException) as cm: + raise NullReferenceException('Aiiieee!') + + exc = cm.value + assert isinstance(exc, NullReferenceException) + assert exc.Message == 'Aiiieee!' + + +def test_raise_instance_exception(): + """Test instance exception propagation.""" + from System import NullReferenceException + + with pytest.raises(NullReferenceException) as cm: + raise NullReferenceException() + + exc = cm.value + assert isinstance(exc, NullReferenceException) + assert len(exc.Message) > 0 + + +def test_raise_instance_exception_with_args(): + """Test instance exception propagation with args.""" + from System import NullReferenceException -from _compat import PY2, PY3, pickle, text_type + with pytest.raises(NullReferenceException) as cm: + raise NullReferenceException("Aiiieee!") + exc = cm.value + assert isinstance(exc, NullReferenceException) + assert exc.Message == 'Aiiieee!' -class ExceptionTests(unittest.TestCase): - """Test exception support.""" - def test_unified_exception_semantics(self): - """Test unified exception semantics.""" - e = System.Exception('Something bad happened') - self.assertTrue(isinstance(e, Exception)) - self.assertTrue(isinstance(e, System.Exception)) +def test_managed_exception_propagation(): + """Test propagation of exceptions raised in managed code.""" + from System import Decimal, OverflowException - def test_standard_exception_attributes(self): - """Test accessing standard exception attributes.""" - from System import OverflowException - from Python.Test import ExceptionTest + with pytest.raises(OverflowException): + Decimal.ToInt64(Decimal.MaxValue) - e = ExceptionTest.GetExplicitException() - self.assertTrue(isinstance(e, OverflowException)) - self.assertTrue(e.Message == 'error') +def test_managed_exception_conversion(): + """Test conversion of managed exceptions.""" + from System import OverflowException + from Python.Test import ExceptionTest - e.Source = 'Test Suite' - self.assertTrue(e.Source == 'Test Suite') + e = ExceptionTest.GetBaseException() + assert isinstance(e, System.Exception) - v = e.ToString() - self.assertTrue(len(v) > 0) + e = ExceptionTest.GetExplicitException() + assert isinstance(e, OverflowException) + assert isinstance(e, System.Exception) - def test_extended_exception_attributes(self): - """Test accessing extended exception attributes.""" - from Python.Test import ExceptionTest, ExtendedException - from System import OverflowException + e = ExceptionTest.GetWidenedException() + assert isinstance(e, OverflowException) + assert isinstance(e, System.Exception) - e = ExceptionTest.GetExtendedException() - self.assertTrue(isinstance(e, ExtendedException)) - self.assertTrue(isinstance(e, OverflowException)) - self.assertTrue(isinstance(e, System.Exception)) + v = ExceptionTest.SetBaseException(System.Exception('error')) + assert v - self.assertTrue(e.Message == 'error') + v = ExceptionTest.SetExplicitException(OverflowException('error')) + assert v - e.Source = 'Test Suite' - self.assertTrue(e.Source == 'Test Suite') + v = ExceptionTest.SetWidenedException(OverflowException('error')) + assert v - v = e.ToString() - self.assertTrue(len(v) > 0) - self.assertTrue(e.ExtraProperty == 'extra') - e.ExtraProperty = 'changed' - self.assertTrue(e.ExtraProperty == 'changed') +def test_catch_exception_from_managed_method(): + """Test catching an exception from a managed method.""" + from Python.Test import ExceptionTest + from System import OverflowException - self.assertTrue(e.GetExtraInfo() == 'changed') + with pytest.raises(OverflowException) as cm: + ExceptionTest().ThrowException() - def test_raise_class_exception(self): - """Test class exception propagation.""" - from System import NullReferenceException + e = cm.value + assert isinstance(e, OverflowException) - with self.assertRaises(NullReferenceException) as cm: - raise NullReferenceException - exc = cm.exception - self.assertTrue(isinstance(exc, NullReferenceException)) +def test_catch_exception_from_managed_property(): + """Test catching an exception from a managed property.""" + from Python.Test import ExceptionTest + from System import OverflowException - def test_exc_info(self): - """Test class exception propagation. - Behavior of exc_info changed in Py3. Refactoring its test""" - from System import NullReferenceException - try: - raise NullReferenceException("message") - except Exception as exc: - type_, value, tb = sys.exc_info() - self.assertTrue(type_ is NullReferenceException) - self.assertTrue(value.Message == "message") - self.assertTrue(exc.Message == "message") - # FIXME: Lower-case message isn't implemented - # self.assertTrue(exc.message == "message") - self.assertTrue(value is exc) + with pytest.raises(OverflowException) as cm: + _ = ExceptionTest().ThrowProperty - def test_raise_class_exception_with_value(self): - """Test class exception propagation with associated value.""" - from System import NullReferenceException + e = cm.value + assert isinstance(e, OverflowException) - with self.assertRaises(NullReferenceException) as cm: - raise NullReferenceException('Aiiieee!') + with pytest.raises(OverflowException) as cm: + ExceptionTest().ThrowProperty = 1 - exc = cm.exception - self.assertTrue(isinstance(exc, NullReferenceException)) - self.assertTrue(exc.Message == 'Aiiieee!') + e = cm.value + assert isinstance(e, OverflowException) - def test_raise_instance_exception(self): - """Test instance exception propagation.""" - from System import NullReferenceException - with self.assertRaises(NullReferenceException) as cm: - raise NullReferenceException() +def test_catch_exception_managed_class(): + """Test catching the managed class of an exception.""" + from System import OverflowException - exc = cm.exception - self.assertTrue(isinstance(exc, NullReferenceException)) - self.assertTrue(len(exc.Message) > 0) + with pytest.raises(OverflowException): + raise OverflowException('overflow') - def test_raise_instance_exception_with_args(self): - """Test instance exception propagation with args.""" - from System import NullReferenceException - with self.assertRaises(NullReferenceException) as cm: - raise NullReferenceException("Aiiieee!") +def test_catch_exception_python_class(): + """Test catching the python class of an exception.""" + from System import OverflowException - exc = cm.exception - self.assertTrue(isinstance(exc, NullReferenceException)) - self.assertTrue(exc.Message == 'Aiiieee!') + with pytest.raises(Exception): + raise OverflowException('overflow') - def test_managed_exception_propagation(self): - """Test propagation of exceptions raised in managed code.""" - from System import Decimal, OverflowException - with self.assertRaises(OverflowException): - Decimal.ToInt64(Decimal.MaxValue) +def test_catch_exception_base_class(): + """Test catching the base of an exception.""" + from System import OverflowException, ArithmeticException - def test_managed_exception_conversion(self): - """Test conversion of managed exceptions.""" - from System import OverflowException - from Python.Test import ExceptionTest + with pytest.raises(ArithmeticException): + raise OverflowException('overflow') - e = ExceptionTest.GetBaseException() - self.assertTrue(isinstance(e, System.Exception)) - e = ExceptionTest.GetExplicitException() - self.assertTrue(isinstance(e, OverflowException)) - self.assertTrue(isinstance(e, System.Exception)) +def test_catch_exception_nested_base_class(): + """Test catching the nested base of an exception.""" + from System import OverflowException, SystemException - e = ExceptionTest.GetWidenedException() - self.assertTrue(isinstance(e, OverflowException)) - self.assertTrue(isinstance(e, System.Exception)) + with pytest.raises(SystemException): + raise OverflowException('overflow') - v = ExceptionTest.SetBaseException(System.Exception('error')) - self.assertTrue(v) - v = ExceptionTest.SetExplicitException(OverflowException('error')) - self.assertTrue(v) +def test_catch_exception_with_assignment(): + """Test catching an exception with assignment.""" + from System import OverflowException - v = ExceptionTest.SetWidenedException(OverflowException('error')) - self.assertTrue(v) + with pytest.raises(OverflowException) as cm: + raise OverflowException('overflow') - def test_catch_exception_from_managed_method(self): - """Test catching an exception from a managed method.""" - from Python.Test import ExceptionTest - from System import OverflowException + e = cm.value + assert isinstance(e, OverflowException) - with self.assertRaises(OverflowException) as cm: - ExceptionTest().ThrowException() - e = cm.exception - self.assertTrue(isinstance(e, OverflowException)) +def test_catch_exception_unqualified(): + """Test catching an unqualified exception.""" + from System import OverflowException - def test_catch_exception_from_managed_property(self): - """Test catching an exception from a managed property.""" - from Python.Test import ExceptionTest - from System import OverflowException + try: + raise OverflowException('overflow') + except: + pass + else: + self.fail("failed to catch unqualified exception") - with self.assertRaises(OverflowException) as cm: - _ = ExceptionTest().ThrowProperty - e = cm.exception - self.assertTrue(isinstance(e, OverflowException)) +def test_catch_baseexception(): + """Test catching an unqualified exception with BaseException.""" + from System import OverflowException - with self.assertRaises(OverflowException) as cm: - ExceptionTest().ThrowProperty = 1 + with pytest.raises(BaseException): + raise OverflowException('overflow') - e = cm.exception - self.assertTrue(isinstance(e, OverflowException)) - def test_catch_exception_managed_class(self): - """Test catching the managed class of an exception.""" - from System import OverflowException +def test_apparent_module_of_exception(): + """Test the apparent module of an exception.""" + from System import OverflowException - with self.assertRaises(OverflowException): - raise OverflowException('overflow') + assert System.Exception.__module__ == 'System' + assert OverflowException.__module__ == 'System' - def test_catch_exception_python_class(self): - """Test catching the python class of an exception.""" - from System import OverflowException - with self.assertRaises(Exception): - raise OverflowException('overflow') +def test_str_of_exception(): + """Test the str() representation of an exception.""" + from System import NullReferenceException, Convert, FormatException - def test_catch_exception_base_class(self): - """Test catching the base of an exception.""" - from System import OverflowException, ArithmeticException + e = NullReferenceException('') + assert str(e) == '' - with self.assertRaises(ArithmeticException): - raise OverflowException('overflow') + e = NullReferenceException('Something bad happened') + assert str(e).startswith('Something bad happened') - def test_catch_exception_nested_base_class(self): - """Test catching the nested base of an exception.""" - from System import OverflowException, SystemException + with pytest.raises(FormatException) as cm: + Convert.ToDateTime('this will fail') - with self.assertRaises(SystemException): - raise OverflowException('overflow') + e = cm.value + # fix for international installation + msg = text_type(e).encode("utf8") + fnd = text_type('System.Convert.ToDateTime').encode("utf8") + assert msg.find(fnd) > -1, msg - def test_catch_exception_with_assignment(self): - """Test catching an exception with assignment.""" - from System import OverflowException - with self.assertRaises(OverflowException) as cm: - raise OverflowException('overflow') +def test_python_compat_of_managed_exceptions(): + """Test managed exceptions compatible with Python's implementation""" + from System import OverflowException + msg = "Simple message" - e = cm.exception - self.assertTrue(isinstance(e, OverflowException)) + e = OverflowException(msg) + assert str(e) == msg + assert text_type(e) == msg - def test_catch_exception_unqualified(self): - """Test catching an unqualified exception.""" - from System import OverflowException + assert e.args == (msg,) + assert isinstance(e.args, tuple) + if PY3: + assert repr(e) == "OverflowException('Simple message',)" + elif PY2: + assert repr(e) == "OverflowException(u'Simple message',)" - try: - raise OverflowException('overflow') - except: - pass - else: - self.fail("failed to catch unqualified exception") - def test_catch_baseexception(self): - """Test catching an unqualified exception with BaseException.""" - from System import OverflowException +def test_exception_is_instance_of_system_object(): + """Test behavior of isinstance(, System.Object).""" + # This is an anti-test, in that this is a caveat of the current + # implementation. Because exceptions are not allowed to be new-style + # classes, we wrap managed exceptions in a general-purpose old-style + # class that delegates to the wrapped object. This makes _almost_ + # everything work as expected, except that an isinstance check against + # CLR.System.Object will fail for a managed exception (because a new + # style class cannot appear in the __bases__ of an old-style class + # without causing a crash in the CPython interpreter). This test is + # here mainly to remind me to update the caveat in the documentation + # one day when when exceptions can be new-style classes. - with self.assertRaises(BaseException): - raise OverflowException('overflow') + # This behavior is now over-shadowed by the implementation of + # __instancecheck__ (i.e., overloading isinstance), so for all Python + # version >= 2.6 we expect isinstance(, Object) to + # be true, even though it does not really subclass Object. + from System import OverflowException, Object - def test_apparent_module_of_exception(self): - """Test the apparent module of an exception.""" - from System import OverflowException + o = OverflowException('error') - self.assertTrue(System.Exception.__module__ == 'System') - self.assertTrue(OverflowException.__module__ == 'System') + if sys.version_info >= (2, 6): + assert isinstance(o, Object) + else: + assert not isinstance(o, Object) - def test_str_of_exception(self): - """Test the str() representation of an exception.""" - from System import NullReferenceException, Convert, FormatException - e = NullReferenceException('') - self.assertEqual(str(e), '') +def test_pickling_exceptions(): + exc = System.Exception("test") + dumped = pickle.dumps(exc) + loaded = pickle.loads(dumped) - e = NullReferenceException('Something bad happened') - self.assertTrue(str(e).startswith('Something bad happened')) + assert exc.args == loaded.args - with self.assertRaises(FormatException) as cm: - Convert.ToDateTime('this will fail') - e = cm.exception - # fix for international installation - msg = text_type(e).encode("utf8") - fnd = text_type('System.Convert.ToDateTime').encode("utf8") - self.assertTrue(msg.find(fnd) > -1, msg) +@pytest.mark.skipif(PY2, reason="__cause__ isn't implemented in PY2") +def test_chained_exceptions(): + from Python.Test import ExceptionTest - def test_python_compat_of_managed_exceptions(self): - """Test managed exceptions compatible with Python's implementation""" - from System import OverflowException - msg = "Simple message" + with pytest.raises(Exception) as cm: + ExceptionTest.ThrowChainedExceptions() - e = OverflowException(msg) - self.assertEqual(str(e), msg) - self.assertEqual(text_type(e), msg) + exc = cm.value - self.assertEqual(e.args, (msg,)) - self.assertTrue(isinstance(e.args, tuple)) - if PY3: - self.assertEqual(repr(e), "OverflowException('Simple message',)") - elif PY2: - self.assertEqual(repr(e), "OverflowException(u'Simple message',)") - - def test_exception_is_instance_of_system_object(self): - """Test behavior of isinstance(, System.Object).""" - # This is an anti-test, in that this is a caveat of the current - # implementation. Because exceptions are not allowed to be new-style - # classes, we wrap managed exceptions in a general-purpose old-style - # class that delegates to the wrapped object. This makes _almost_ - # everything work as expected, except that an isinstance check against - # CLR.System.Object will fail for a managed exception (because a new - # style class cannot appear in the __bases__ of an old-style class - # without causing a crash in the CPython interpreter). This test is - # here mainly to remind me to update the caveat in the documentation - # one day when when exceptions can be new-style classes. - - # This behavior is now over-shadowed by the implementation of - # __instancecheck__ (i.e., overloading isinstance), so for all Python - # version >= 2.6 we expect isinstance(, Object) to - # be true, even though it does not really subclass Object. - from System import OverflowException, Object - - o = OverflowException('error') - - if sys.version_info >= (2, 6): - self.assertTrue(isinstance(o, Object)) - else: - self.assertFalse(isinstance(o, Object)) - - def test_pickling_exceptions(self): - exc = System.Exception("test") - dumped = pickle.dumps(exc) - loaded = pickle.loads(dumped) - - self.assertEqual(exc.args, loaded.args) - - @unittest.skipIf(PY2, "__cause__ isn't implemented in PY2") - def test_chained_exceptions(self): - from Python.Test import ExceptionTest - - with self.assertRaises(Exception) as cm: - ExceptionTest.ThrowChainedExceptions() - - exc = cm.exception - - msgs = ("Outer exception", - "Inner exception", - "Innermost exception",) - for msg in msgs: - self.assertEqual(exc.Message, msg) - self.assertEqual(exc.__cause__, exc.InnerException) - exc = exc.__cause__ - - -def test_suite(): - return unittest.makeSuite(ExceptionTests) + msgs = ("Outer exception", + "Inner exception", + "Innermost exception",) + for msg in msgs: + assert exc.Message == msg + assert exc.__cause__ == exc.InnerException + exc = exc.__cause__ diff --git a/src/tests/test_field.py b/src/tests/test_field.py index b1d596fea..d187de5d2 100644 --- a/src/tests/test_field.py +++ b/src/tests/test_field.py @@ -1,369 +1,392 @@ # -*- coding: utf-8 -*- -import unittest +"""Test CLR field support.""" import System +import pytest from Python.Test import FieldTest -class FieldTests(unittest.TestCase): - """Test CLR field support.""" +def test_public_instance_field(): + """Test public instance fields.""" + ob = FieldTest() + assert ob.PublicField == 0 - def test_public_instance_field(self): - """Test public instance fields.""" - ob = FieldTest() - self.assertTrue(ob.PublicField == 0) + ob.PublicField = 1 + assert ob.PublicField == 1 - ob.PublicField = 1 - self.assertTrue(ob.PublicField == 1) + with pytest.raises(TypeError): + del FieldTest().PublicField - with self.assertRaises(TypeError): - del FieldTest().PublicField - def test_public_static_field(self): - """Test public static fields.""" - ob = FieldTest() - self.assertTrue(FieldTest.PublicStaticField == 0) +def test_public_static_field(): + """Test public static fields.""" + ob = FieldTest() + assert FieldTest.PublicStaticField == 0 - FieldTest.PublicStaticField = 1 - self.assertTrue(FieldTest.PublicStaticField == 1) + FieldTest.PublicStaticField = 1 + assert FieldTest.PublicStaticField == 1 - self.assertTrue(ob.PublicStaticField == 1) - ob.PublicStaticField = 0 - self.assertTrue(ob.PublicStaticField == 0) + assert ob.PublicStaticField == 1 + ob.PublicStaticField = 0 + assert ob.PublicStaticField == 0 - with self.assertRaises(TypeError): - del FieldTest.PublicStaticField + with pytest.raises(TypeError): + del FieldTest.PublicStaticField - with self.assertRaises(TypeError): - del FieldTest().PublicStaticField + with pytest.raises(TypeError): + del FieldTest().PublicStaticField - def test_protected_instance_field(self): - """Test protected instance fields.""" - ob = FieldTest() - self.assertTrue(ob.ProtectedField == 0) - ob.ProtectedField = 1 - self.assertTrue(ob.ProtectedField == 1) +def test_protected_instance_field(): + """Test protected instance fields.""" + ob = FieldTest() + assert ob.ProtectedField == 0 - with self.assertRaises(TypeError): - del FieldTest().ProtectedField + ob.ProtectedField = 1 + assert ob.ProtectedField == 1 - def test_protected_static_field(self): - """Test protected static fields.""" - ob = FieldTest() - self.assertTrue(FieldTest.ProtectedStaticField == 0) + with pytest.raises(TypeError): + del FieldTest().ProtectedField - FieldTest.ProtectedStaticField = 1 - self.assertTrue(FieldTest.ProtectedStaticField == 1) - self.assertTrue(ob.ProtectedStaticField == 1) - ob.ProtectedStaticField = 0 - self.assertTrue(ob.ProtectedStaticField == 0) +def test_protected_static_field(): + """Test protected static fields.""" + ob = FieldTest() + assert FieldTest.ProtectedStaticField == 0 - with self.assertRaises(TypeError): - del FieldTest.ProtectedStaticField + FieldTest.ProtectedStaticField = 1 + assert FieldTest.ProtectedStaticField == 1 - with self.assertRaises(TypeError): - del FieldTest().ProtectedStaticField + assert ob.ProtectedStaticField == 1 + ob.ProtectedStaticField = 0 + assert ob.ProtectedStaticField == 0 - def test_read_only_instance_field(self): - """Test readonly instance fields.""" - self.assertTrue(FieldTest().ReadOnlyField == 0) + with pytest.raises(TypeError): + del FieldTest.ProtectedStaticField - with self.assertRaises(TypeError): - FieldTest().ReadOnlyField = 1 + with pytest.raises(TypeError): + del FieldTest().ProtectedStaticField - with self.assertRaises(TypeError): - del FieldTest().ReadOnlyField - def test_read_only_static_field(self): - """Test readonly static fields.""" - ob = FieldTest() +def test_read_only_instance_field(): + """Test readonly instance fields.""" + assert FieldTest().ReadOnlyField == 0 - self.assertTrue(FieldTest.ReadOnlyStaticField == 0) - self.assertTrue(ob.ReadOnlyStaticField == 0) + with pytest.raises(TypeError): + FieldTest().ReadOnlyField = 1 - with self.assertRaises(TypeError): - FieldTest.ReadOnlyStaticField = 1 + with pytest.raises(TypeError): + del FieldTest().ReadOnlyField - with self.assertRaises(TypeError): - FieldTest().ReadOnlyStaticField = 1 - with self.assertRaises(TypeError): - del FieldTest.ReadOnlyStaticField +def test_read_only_static_field(): + """Test readonly static fields.""" + ob = FieldTest() - with self.assertRaises(TypeError): - del FieldTest().ReadOnlyStaticField + assert FieldTest.ReadOnlyStaticField == 0 + assert ob.ReadOnlyStaticField == 0 - def test_constant_field(self): - """Test const fields.""" - ob = FieldTest() + with pytest.raises(TypeError): + FieldTest.ReadOnlyStaticField = 1 - self.assertTrue(FieldTest.ConstField == 0) - self.assertTrue(ob.ConstField == 0) + with pytest.raises(TypeError): + FieldTest().ReadOnlyStaticField = 1 - with self.assertRaises(TypeError): - FieldTest().ConstField = 1 + with pytest.raises(TypeError): + del FieldTest.ReadOnlyStaticField - with self.assertRaises(TypeError): - FieldTest.ConstField = 1 + with pytest.raises(TypeError): + del FieldTest().ReadOnlyStaticField - with self.assertRaises(TypeError): - del FieldTest().ConstField - with self.assertRaises(TypeError): - del FieldTest.ConstField +def test_constant_field(): + """Test const fields.""" + ob = FieldTest() - def test_internal_field(self): - """Test internal fields.""" + assert FieldTest.ConstField == 0 + assert ob.ConstField == 0 - with self.assertRaises(AttributeError): - _ = FieldTest().InternalField + with pytest.raises(TypeError): + FieldTest().ConstField = 1 - with self.assertRaises(AttributeError): - _ = FieldTest().InternalStaticField + with pytest.raises(TypeError): + FieldTest.ConstField = 1 - with self.assertRaises(AttributeError): - _ = FieldTest.InternalStaticField + with pytest.raises(TypeError): + del FieldTest().ConstField - def test_private_field(self): - """Test private fields.""" + with pytest.raises(TypeError): + del FieldTest.ConstField - with self.assertRaises(AttributeError): - _ = FieldTest().PrivateField - with self.assertRaises(AttributeError): - _ = FieldTest().PrivateStaticField +def test_internal_field(): + """Test internal fields.""" - with self.assertRaises(AttributeError): - _ = FieldTest.PrivateStaticField + with pytest.raises(AttributeError): + _ = FieldTest().InternalField - def test_field_descriptor_get_set(self): - """Test field descriptor get / set.""" + with pytest.raises(AttributeError): + _ = FieldTest().InternalStaticField - # This test ensures that setting an attribute implemented with - # a descriptor actually goes through the descriptor (rather than - # silently replacing the descriptor in the instance or type dict. + with pytest.raises(AttributeError): + _ = FieldTest.InternalStaticField - ob = FieldTest() - self.assertTrue(FieldTest.PublicStaticField == 0) - self.assertTrue(ob.PublicStaticField == 0) +def test_private_field(): + """Test private fields.""" - descriptor = FieldTest.__dict__['PublicStaticField'] - self.assertTrue(type(descriptor) != int) + with pytest.raises(AttributeError): + _ = FieldTest().PrivateField - ob.PublicStaticField = 0 - descriptor = FieldTest.__dict__['PublicStaticField'] - self.assertTrue(type(descriptor) != int) + with pytest.raises(AttributeError): + _ = FieldTest().PrivateStaticField - FieldTest.PublicStaticField = 0 - descriptor = FieldTest.__dict__['PublicStaticField'] - self.assertTrue(type(descriptor) != int) + with pytest.raises(AttributeError): + _ = FieldTest.PrivateStaticField - def test_field_descriptor_wrong_type(self): - """Test setting a field using a value of the wrong type.""" - with self.assertRaises(TypeError): - FieldTest().PublicField = "spam" +def test_field_descriptor_get_set(): + """Test field descriptor get / set.""" - def test_field_descriptor_abuse(self): - """Test field descriptor abuse.""" - desc = FieldTest.__dict__['PublicField'] + # This test ensures that setting an attribute implemented with + # a descriptor actually goes through the descriptor (rather than + # silently replacing the descriptor in the instance or type dict. - with self.assertRaises(TypeError): - desc.__get__(0, 0) + ob = FieldTest() - with self.assertRaises(TypeError): - desc.__set__(0, 0) + assert FieldTest.PublicStaticField == 0 + assert ob.PublicStaticField == 0 - def test_boolean_field(self): - """Test boolean fields.""" - # change this to true / false later for Python 2.3? - ob = FieldTest() - self.assertTrue(ob.BooleanField is False) + descriptor = FieldTest.__dict__['PublicStaticField'] + assert type(descriptor) != int - ob.BooleanField = True - self.assertTrue(ob.BooleanField is True) + ob.PublicStaticField = 0 + descriptor = FieldTest.__dict__['PublicStaticField'] + assert type(descriptor) != int - ob.BooleanField = False - self.assertTrue(ob.BooleanField is False) + FieldTest.PublicStaticField = 0 + descriptor = FieldTest.__dict__['PublicStaticField'] + assert type(descriptor) != int - ob.BooleanField = 1 - self.assertTrue(ob.BooleanField is True) - ob.BooleanField = 0 - self.assertTrue(ob.BooleanField is False) +def test_field_descriptor_wrong_type(): + """Test setting a field using a value of the wrong type.""" - def test_sbyte_field(self): - """Test sbyte fields.""" - ob = FieldTest() - self.assertTrue(ob.SByteField == 0) + with pytest.raises(TypeError): + FieldTest().PublicField = "spam" - ob.SByteField = 1 - self.assertTrue(ob.SByteField == 1) - def test_byte_field(self): - """Test byte fields.""" - ob = FieldTest() - self.assertTrue(ob.ByteField == 0) +def test_field_descriptor_abuse(): + """Test field descriptor abuse.""" + desc = FieldTest.__dict__['PublicField'] - ob.ByteField = 1 - self.assertTrue(ob.ByteField == 1) + with pytest.raises(TypeError): + desc.__get__(0, 0) - def test_char_field(self): - """Test char fields.""" - ob = FieldTest() - self.assertTrue(ob.CharField == u'A') - self.assertTrue(ob.CharField == 'A') + with pytest.raises(TypeError): + desc.__set__(0, 0) - ob.CharField = 'B' - self.assertTrue(ob.CharField == u'B') - self.assertTrue(ob.CharField == 'B') - ob.CharField = u'C' - self.assertTrue(ob.CharField == u'C') - self.assertTrue(ob.CharField == 'C') +def test_boolean_field(): + """Test boolean fields.""" + # change this to true / false later for Python 2.3? + ob = FieldTest() + assert ob.BooleanField is False - def test_int16_field(self): - """Test int16 fields.""" - ob = FieldTest() - self.assertTrue(ob.Int16Field == 0) + ob.BooleanField = True + assert ob.BooleanField is True - ob.Int16Field = 1 - self.assertTrue(ob.Int16Field == 1) + ob.BooleanField = False + assert ob.BooleanField is False - def test_int32_field(self): - """Test int32 fields.""" - ob = FieldTest() - self.assertTrue(ob.Int32Field == 0) + ob.BooleanField = 1 + assert ob.BooleanField is True - ob.Int32Field = 1 - self.assertTrue(ob.Int32Field == 1) + ob.BooleanField = 0 + assert ob.BooleanField is False - def test_int64_field(self): - """Test int64 fields.""" - ob = FieldTest() - self.assertTrue(ob.Int64Field == 0) - ob.Int64Field = 1 - self.assertTrue(ob.Int64Field == 1) +def test_sbyte_field(): + """Test sbyte fields.""" + ob = FieldTest() + assert ob.SByteField == 0 - def test_uint16_field(self): - """Test uint16 fields.""" - ob = FieldTest() - self.assertTrue(ob.UInt16Field == 0) + ob.SByteField = 1 + assert ob.SByteField == 1 - ob.UInt16Field = 1 - self.assertTrue(ob.UInt16Field == 1) - def test_uint32_field(self): - """Test uint32 fields.""" - ob = FieldTest() - self.assertTrue(ob.UInt32Field == 0) +def test_byte_field(): + """Test byte fields.""" + ob = FieldTest() + assert ob.ByteField == 0 - ob.UInt32Field = 1 - self.assertTrue(ob.UInt32Field == 1) + ob.ByteField = 1 + assert ob.ByteField == 1 - def test_uint64_field(self): - """Test uint64 fields.""" - ob = FieldTest() - self.assertTrue(ob.UInt64Field == 0) - ob.UInt64Field = 1 - self.assertTrue(ob.UInt64Field == 1) +def test_char_field(): + """Test char fields.""" + ob = FieldTest() + assert ob.CharField == u'A' + assert ob.CharField == 'A' - def test_single_field(self): - """Test single fields.""" - ob = FieldTest() - self.assertTrue(ob.SingleField == 0.0) + ob.CharField = 'B' + assert ob.CharField == u'B' + assert ob.CharField == 'B' - ob.SingleField = 1.1 - self.assertTrue(ob.SingleField == 1.1) + ob.CharField = u'C' + assert ob.CharField == u'C' + assert ob.CharField == 'C' - def test_double_field(self): - """Test double fields.""" - ob = FieldTest() - self.assertTrue(ob.DoubleField == 0.0) - ob.DoubleField = 1.1 - self.assertTrue(ob.DoubleField == 1.1) +def test_int16_field(): + """Test int16 fields.""" + ob = FieldTest() + assert ob.Int16Field == 0 - def test_decimal_field(self): - """Test decimal fields.""" - ob = FieldTest() - self.assertTrue(ob.DecimalField == System.Decimal(0)) + ob.Int16Field = 1 + assert ob.Int16Field == 1 - ob.DecimalField = System.Decimal(1) - self.assertTrue(ob.DecimalField == System.Decimal(1)) - def test_string_field(self): - """Test string fields.""" - ob = FieldTest() - self.assertTrue(ob.StringField == "spam") +def test_int32_field(): + """Test int32 fields.""" + ob = FieldTest() + assert ob.Int32Field == 0 - ob.StringField = "eggs" - self.assertTrue(ob.StringField == "eggs") + ob.Int32Field = 1 + assert ob.Int32Field == 1 - def test_interface_field(self): - """Test interface fields.""" - from Python.Test import Spam, ISpam - ob = FieldTest() +def test_int64_field(): + """Test int64 fields.""" + ob = FieldTest() + assert ob.Int64Field == 0 - self.assertTrue(ISpam(ob.SpamField).GetValue() == "spam") - self.assertTrue(ob.SpamField.GetValue() == "spam") + ob.Int64Field = 1 + assert ob.Int64Field == 1 - ob.SpamField = Spam("eggs") - self.assertTrue(ISpam(ob.SpamField).GetValue() == "eggs") - self.assertTrue(ob.SpamField.GetValue() == "eggs") - def test_object_field(self): - """Test ob fields.""" - ob = FieldTest() - self.assertTrue(ob.ObjectField is None) +def test_uint16_field(): + """Test uint16 fields.""" + ob = FieldTest() + assert ob.UInt16Field == 0 - ob.ObjectField = System.String("spam") - self.assertTrue(ob.ObjectField == "spam") + ob.UInt16Field = 1 + assert ob.UInt16Field == 1 - ob.ObjectField = System.Int32(1) - self.assertTrue(ob.ObjectField == 1) - ob.ObjectField = None - self.assertTrue(ob.ObjectField is None) +def test_uint32_field(): + """Test uint32 fields.""" + ob = FieldTest() + assert ob.UInt32Field == 0 - def test_enum_field(self): - """Test enum fields.""" - from Python.Test import ShortEnum + ob.UInt32Field = 1 + assert ob.UInt32Field == 1 - ob = FieldTest() - self.assertTrue(ob.EnumField == ShortEnum.Zero) - ob.EnumField = ShortEnum.One - self.assertTrue(ob.EnumField == ShortEnum.One) +def test_uint64_field(): + """Test uint64 fields.""" + ob = FieldTest() + assert ob.UInt64Field == 0 - def test_nullable_field(self): - """Test nullable fields.""" - ob = FieldTest() + ob.UInt64Field = 1 + assert ob.UInt64Field == 1 - ob.StringField = None - self.assertTrue(ob.StringField is None) - ob.ObjectField = None - self.assertTrue(ob.ObjectField is None) +def test_single_field(): + """Test single fields.""" + ob = FieldTest() + assert ob.SingleField == 0.0 - ob.SpamField = None - self.assertTrue(ob.SpamField is None) + ob.SingleField = 1.1 + assert ob.SingleField == 1.1 - # Primitive types and enums should not be set to null. - with self.assertRaises(TypeError): - FieldTest().Int32Field = None +def test_double_field(): + """Test double fields.""" + ob = FieldTest() + assert ob.DoubleField == 0.0 - with self.assertRaises(TypeError): - FieldTest().EnumField = None + ob.DoubleField = 1.1 + assert ob.DoubleField == 1.1 -def test_suite(): - return unittest.makeSuite(FieldTests) +def test_decimal_field(): + """Test decimal fields.""" + ob = FieldTest() + assert ob.DecimalField == System.Decimal(0) + + ob.DecimalField = System.Decimal(1) + assert ob.DecimalField == System.Decimal(1) + + +def test_string_field(): + """Test string fields.""" + ob = FieldTest() + assert ob.StringField == "spam" + + ob.StringField = "eggs" + assert ob.StringField == "eggs" + + +def test_interface_field(): + """Test interface fields.""" + from Python.Test import Spam, ISpam + + ob = FieldTest() + + assert ISpam(ob.SpamField).GetValue() == "spam" + assert ob.SpamField.GetValue() == "spam" + + ob.SpamField = Spam("eggs") + assert ISpam(ob.SpamField).GetValue() == "eggs" + assert ob.SpamField.GetValue() == "eggs" + + +def test_object_field(): + """Test ob fields.""" + ob = FieldTest() + assert ob.ObjectField is None + + ob.ObjectField = System.String("spam") + assert ob.ObjectField == "spam" + + ob.ObjectField = System.Int32(1) + assert ob.ObjectField == 1 + + ob.ObjectField = None + assert ob.ObjectField is None + + +def test_enum_field(): + """Test enum fields.""" + from Python.Test import ShortEnum + + ob = FieldTest() + assert ob.EnumField == ShortEnum.Zero + + ob.EnumField = ShortEnum.One + assert ob.EnumField == ShortEnum.One + + +def test_nullable_field(): + """Test nullable fields.""" + ob = FieldTest() + + ob.StringField = None + assert ob.StringField is None + + ob.ObjectField = None + assert ob.ObjectField is None + + ob.SpamField = None + assert ob.SpamField is None + + # Primitive types and enums should not be set to null. + + with pytest.raises(TypeError): + FieldTest().Int32Field = None + + with pytest.raises(TypeError): + FieldTest().EnumField = None diff --git a/src/tests/test_generic.py b/src/tests/test_generic.py index 8d5ea4c4c..69cd4ee7f 100644 --- a/src/tests/test_generic.py +++ b/src/tests/test_generic.py @@ -1,767 +1,778 @@ # -*- coding: utf-8 -*- +"""Test CLR generics support.""" + import clr -import unittest import System +import pytest + +from ._compat import PY2, long, unicode, unichr, zip + + +def assert_generic_wrapper_by_type(ptype, value): + """Test Helper""" + from Python.Test import GenericWrapper + import System + + inst = GenericWrapper[ptype](value) + assert inst.value == value + + atype = System.Array[ptype] + items = atype([value, value, value]) + inst = GenericWrapper[atype](items) + assert len(inst.value) == 3 + assert inst.value[0] == value + assert inst.value[1] == value + + +def assert_generic_method_by_type(ptype, value, test_type=0): + """Test Helper""" + from Python.Test import GenericMethodTest, GenericStaticMethodTest + import System + + itype = GenericMethodTest[System.Type] + stype = GenericStaticMethodTest[System.Type] + + # Explicit selection (static method) + result = stype.Overloaded[ptype](value) + if test_type: + assert result.__class__ == value.__class__ + else: + assert result == value + + # Type inference (static method) + result = stype.Overloaded(value) + assert result == value + if test_type: + assert result.__class__ == value.__class__ + else: + assert result == value + + # Explicit selection (instance method) + result = itype().Overloaded[ptype](value) + assert result == value + if test_type: + assert result.__class__ == value.__class__ + else: + assert result == value + + # Type inference (instance method) + result = itype().Overloaded(value) + assert result == value + if test_type: + assert result.__class__ == value.__class__ + else: + assert result == value + + atype = System.Array[ptype] + items = atype([value, value, value]) + + # Explicit selection (static method) + result = stype.Overloaded[atype](items) + if test_type: + assert len(result) == 3 + assert result[0].__class__ == value.__class__ + assert result[1].__class__ == value.__class__ + else: + assert len(result) == 3 + assert result[0] == value + assert result[1] == value + + # Type inference (static method) + result = stype.Overloaded(items) + if test_type: + assert len(result) == 3 + assert result[0].__class__ == value.__class__ + assert result[1].__class__ == value.__class__ + else: + assert len(result) == 3 + assert result[0] == value + assert result[1] == value + + # Explicit selection (instance method) + result = itype().Overloaded[atype](items) + if test_type: + assert len(result) == 3 + assert result[0].__class__ == value.__class__ + assert result[1].__class__ == value.__class__ + else: + assert len(result) == 3 + assert result[0] == value + assert result[1] == value + + # Type inference (instance method) + result = itype().Overloaded(items) + if test_type: + assert len(result) == 3 + assert result[0].__class__ == value.__class__ + assert result[1].__class__ == value.__class__ + else: + assert len(result) == 3 + assert result[0] == value + assert result[1] == value + + +def test_python_type_aliasing(): + """Test python type alias support with generics.""" + from System.Collections.Generic import Dictionary + + dict_ = Dictionary[str, str]() + assert dict_.Count == 0 + dict_.Add("one", "one") + assert dict_["one"] == "one" + + dict_ = Dictionary[System.String, System.String]() + assert dict_.Count == 0 + dict_.Add("one", "one") + assert dict_["one"] == "one" + + dict_ = Dictionary[int, int]() + assert dict_.Count == 0 + dict_.Add(1, 1) + assert dict_[1] == 1 + + dict_ = Dictionary[System.Int32, System.Int32]() + assert dict_.Count == 0 + dict_.Add(1, 1) + assert dict_[1] == 1 + + dict_ = Dictionary[long, long]() + assert dict_.Count == 0 + dict_.Add(long(1), long(1)) + assert dict_[long(1)] == long(1) + + dict_ = Dictionary[System.Int64, System.Int64]() + assert dict_.Count == 0 + dict_.Add(long(1), long(1)) + assert dict_[long(1)] == long(1) + + dict_ = Dictionary[float, float]() + assert dict_.Count == 0 + dict_.Add(1.5, 1.5) + assert dict_[1.5] == 1.5 + + dict_ = Dictionary[System.Double, System.Double]() + assert dict_.Count == 0 + dict_.Add(1.5, 1.5) + assert dict_[1.5] == 1.5 + + dict_ = Dictionary[bool, bool]() + assert dict_.Count == 0 + dict_.Add(True, False) + assert dict_[True] is False + + dict_ = Dictionary[System.Boolean, System.Boolean]() + assert dict_.Count == 0 + dict_.Add(True, False) + assert dict_[True] is False + + +def test_generic_reference_type(): + """Test usage of generic reference type definitions.""" + from Python.Test import GenericTypeDefinition + + inst = GenericTypeDefinition[System.String, System.Int32]("one", 2) + assert inst.value1 == "one" + assert inst.value2 == 2 + + +def test_generic_value_type(): + """Test usage of generic value type definitions.""" + inst = System.Nullable[System.Int32](10) + assert inst.HasValue + assert inst.Value == 10 + + +def test_generic_interface(): + # TODO NotImplemented + pass + + +def test_generic_delegate(): + # TODO NotImplemented + pass + + +def test_open_generic_type(): + """Test behavior of reflected open constructed generic types.""" + from Python.Test import DerivedFromOpenGeneric + + open_generic_type = DerivedFromOpenGeneric.__bases__[0] + + with pytest.raises(TypeError): + _ = open_generic_type() + + with pytest.raises(TypeError): + _ = open_generic_type[System.String] + + +def test_derived_from_open_generic_type(): + """Test a generic type derived from an open generic type.""" + from Python.Test import DerivedFromOpenGeneric + + type_ = DerivedFromOpenGeneric[System.String, System.String] + inst = type_(1, 'two', 'three') + + assert inst.value1 == 1 + assert inst.value2 == 'two' + assert inst.value3 == 'three' + + +def test_generic_type_name_resolution(): + """Test the ability to disambiguate generic type names.""" + from Python.Test import GenericNameTest1, GenericNameTest2 + + # If both a non-generic and generic type exist for a name, the + # unadorned name always resolves to the non-generic type. + _class = GenericNameTest1 + assert _class().value == 0 + assert _class.value == 0 + + # If no non-generic type exists for a name, the unadorned name + # cannot be instantiated. It can only be used to bind a generic. + + with pytest.raises(TypeError): + _ = GenericNameTest2() + + _class = GenericNameTest2[int] + assert _class().value == 1 + assert _class.value == 1 + + _class = GenericNameTest2[int, int] + assert _class().value == 2 + assert _class.value == 2 + + +def test_generic_type_binding(): + """Test argument conversion / binding for generic methods.""" + from Python.Test import InterfaceTest, ISayHello1, ShortEnum + import System + + assert_generic_wrapper_by_type(System.Boolean, True) + assert_generic_wrapper_by_type(bool, True) + assert_generic_wrapper_by_type(System.Byte, 255) + assert_generic_wrapper_by_type(System.SByte, 127) + assert_generic_wrapper_by_type(System.Char, u'A') + assert_generic_wrapper_by_type(System.Int16, 32767) + assert_generic_wrapper_by_type(System.Int32, 2147483647) + assert_generic_wrapper_by_type(int, 2147483647) + assert_generic_wrapper_by_type(System.Int64, long(9223372036854775807)) + # Python 3 has no explicit long type, use System.Int64 instead + if PY2: + assert_generic_wrapper_by_type(long, long(9223372036854775807)) + assert_generic_wrapper_by_type(System.UInt16, 65000) + assert_generic_wrapper_by_type(System.UInt32, long(4294967295)) + assert_generic_wrapper_by_type(System.UInt64, long(18446744073709551615)) + assert_generic_wrapper_by_type(System.Single, 3.402823e38) + assert_generic_wrapper_by_type(System.Double, 1.7976931348623157e308) + assert_generic_wrapper_by_type(float, 1.7976931348623157e308) + assert_generic_wrapper_by_type(System.Decimal, System.Decimal.One) + assert_generic_wrapper_by_type(System.String, "test") + assert_generic_wrapper_by_type(unicode, "test") + assert_generic_wrapper_by_type(str, "test") + assert_generic_wrapper_by_type(ShortEnum, ShortEnum.Zero) + assert_generic_wrapper_by_type(System.Object, InterfaceTest()) + assert_generic_wrapper_by_type(InterfaceTest, InterfaceTest()) + assert_generic_wrapper_by_type(ISayHello1, InterfaceTest()) + + +def test_generic_method_binding(): + from Python.Test import GenericMethodTest, GenericStaticMethodTest + from System import InvalidOperationException + + # Can invoke a static member on a closed generic type. + value = GenericStaticMethodTest[str].Overloaded() + assert value == 1 + + with pytest.raises(InvalidOperationException): + # Cannot invoke a static member on an open type. + GenericStaticMethodTest.Overloaded() + + # Can invoke an instance member on a closed generic type. + value = GenericMethodTest[str]().Overloaded() + assert value == 1 + + with pytest.raises(TypeError): + # Cannot invoke an instance member on an open type, + # because the open type cannot be instantiated. + GenericMethodTest().Overloaded() + + +def test_generic_method_type_handling(): + """Test argument conversion / binding for generic methods.""" + from Python.Test import InterfaceTest, ISayHello1, ShortEnum + import System + + # FIXME: The value doesn't fit into Int64 and PythonNet doesn't + # recognize it as UInt64 for unknown reasons. + # assert_generic_method_by_type(System.UInt64, 18446744073709551615L) + assert_generic_method_by_type(System.Boolean, True) + assert_generic_method_by_type(bool, True) + assert_generic_method_by_type(System.Byte, 255) + assert_generic_method_by_type(System.SByte, 127) + assert_generic_method_by_type(System.Char, u'A') + assert_generic_method_by_type(System.Int16, 32767) + assert_generic_method_by_type(System.Int32, 2147483647) + assert_generic_method_by_type(int, 2147483647) + # Python 3 has no explicit long type, use System.Int64 instead + if PY2: + assert_generic_method_by_type(System.Int64, long(9223372036854775807)) + assert_generic_method_by_type(long, long(9223372036854775807)) + assert_generic_method_by_type(System.UInt32, long(4294967295)) + assert_generic_method_by_type(System.Int64, long(1844674407370955161)) + assert_generic_method_by_type(System.UInt16, 65000) + assert_generic_method_by_type(System.Single, 3.402823e38) + assert_generic_method_by_type(System.Double, 1.7976931348623157e308) + assert_generic_method_by_type(float, 1.7976931348623157e308) + assert_generic_method_by_type(System.Decimal, System.Decimal.One) + assert_generic_method_by_type(System.String, "test") + assert_generic_method_by_type(unicode, "test") + assert_generic_method_by_type(str, "test") + assert_generic_method_by_type(ShortEnum, ShortEnum.Zero) + assert_generic_method_by_type(System.Object, InterfaceTest()) + assert_generic_method_by_type(InterfaceTest, InterfaceTest(), 1) + assert_generic_method_by_type(ISayHello1, InterfaceTest(), 1) + + +def test_correct_overload_selection(): + """Test correct overloading selection for common types.""" + from System import (String, Double, Single, + Int16, Int32, Int64) + from System import Math + + substr = String("substring") + assert substr.Substring(2) == substr.Substring.__overloads__[Int32]( + Int32(2)) + assert substr.Substring(2, 3) == substr.Substring.__overloads__[Int32, Int32]( + Int32(2), Int32(3)) + + for atype, value1, value2 in zip([Double, Single, Int16, Int32, Int64], + [1.0, 1.0, 1, 1, 1], + [2.0, 0.5, 2, 0, -1]): + assert Math.Abs(atype(value1)) == Math.Abs.__overloads__[atype](atype(value1)) + assert Math.Abs(value1) == Math.Abs.__overloads__[atype](atype(value1)) + assert Math.Max(atype(value1), + atype(value2)) == Math.Max.__overloads__[atype, atype]( + atype(value1), atype(value2)) + if PY2 and atype is Int64: + value2 = long(value2) + assert Math.Max(atype(value1), + value2) == Math.Max.__overloads__[atype, atype]( + atype(value1), atype(value2)) + + clr.AddReference("System.Runtime.InteropServices") + from System.Runtime.InteropServices import GCHandle, GCHandleType + from System import Array, Byte + cs_array = Array.CreateInstance(Byte, 1000) + handler = GCHandle.Alloc(cs_array, GCHandleType.Pinned) + + +def test_generic_method_overload_selection(): + """Test explicit overload selection with generic methods.""" + from Python.Test import GenericMethodTest, GenericStaticMethodTest + + type = GenericStaticMethodTest[str] + inst = GenericMethodTest[str]() + + # public static int Overloaded() + value = type.Overloaded() + assert value == 1 + + # public int Overloaded() + value = inst.Overloaded() + assert value == 1 + + # public static T Overloaded(T arg) (inferred) + value = type.Overloaded("test") + assert value == "test" + + # public T Overloaded(T arg) (inferred) + value = inst.Overloaded("test") + assert value == "test" + + # public static T Overloaded(T arg) (explicit) + value = type.Overloaded[str]("test") + assert value == "test" + + # public T Overloaded(T arg) (explicit) + value = inst.Overloaded[str]("test") + assert value == "test" + + # public static Q Overloaded(Q arg) + value = type.Overloaded[float](2.2) + assert value == 2.2 + + # public Q Overloaded(Q arg) + value = inst.Overloaded[float](2.2) + assert value == 2.2 + + # public static Q Overloaded(Q arg) + value = type.Overloaded[bool](True) + assert value is True + + # public Q Overloaded(Q arg) + value = inst.Overloaded[bool](True) + assert value is True + + # public static U Overloaded(Q arg1, U arg2) + value = type.Overloaded[bool, str](True, "true") + assert value == "true" + + # public U Overloaded(Q arg1, U arg2) + value = inst.Overloaded[bool, str](True, "true") + assert value == "true" + + # public static U Overloaded(Q arg1, U arg2) + value = type.Overloaded[str, bool]("true", True) + assert value is True + + # public U Overloaded(Q arg1, U arg2) + value = inst.Overloaded[str, bool]("true", True) + assert value is True + + # public static string Overloaded(int arg1, int arg2, string arg3) + value = type.Overloaded[str](123, 456, "success") + assert value == "success" + + # public string Overloaded(int arg1, int arg2, string arg3) + value = inst.Overloaded[str](123, 456, "success") + assert value == "success" + + with pytest.raises(TypeError): + _ = type.Overloaded[str, bool, int]("true", True, 1) + + with pytest.raises(TypeError): + _ = inst.Overloaded[str, bool, int]("true", True, 1) + + +def test_method_overload_selection_with_generic_types(): + """Check method overload selection using generic types.""" + from Python.Test import ISayHello1, InterfaceTest, ShortEnum + from Python.Test import MethodTest, GenericWrapper + + inst = InterfaceTest() + + vtype = GenericWrapper[System.Boolean] + input_ = vtype(True) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value is True + + vtype = GenericWrapper[bool] + input_ = vtype(True) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value is True + + vtype = GenericWrapper[System.Byte] + input_ = vtype(255) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == 255 -from _compat import PY2, long, unicode, unichr, zip - - -class GenericTests(unittest.TestCase): - """Test CLR generics support.""" - - def _assert_generic_wrapper_by_type(self, ptype, value): - """Test Helper""" - from Python.Test import GenericWrapper - import System - - inst = GenericWrapper[ptype](value) - self.assertTrue(inst.value == value) - - atype = System.Array[ptype] - items = atype([value, value, value]) - inst = GenericWrapper[atype](items) - self.assertTrue(len(inst.value) == 3) - self.assertTrue(inst.value[0] == value) - self.assertTrue(inst.value[1] == value) - - def _assert_generic_method_by_type(self, ptype, value, test_type=0): - """Test Helper""" - from Python.Test import GenericMethodTest, GenericStaticMethodTest - import System - - itype = GenericMethodTest[System.Type] - stype = GenericStaticMethodTest[System.Type] - - # Explicit selection (static method) - result = stype.Overloaded[ptype](value) - if test_type: - self.assertTrue(result.__class__ == value.__class__) - else: - self.assertTrue(result == value) - - # Type inference (static method) - result = stype.Overloaded(value) - self.assertTrue(result == value) - if test_type: - self.assertTrue(result.__class__ == value.__class__) - else: - self.assertTrue(result == value) - - # Explicit selection (instance method) - result = itype().Overloaded[ptype](value) - self.assertTrue(result == value) - if test_type: - self.assertTrue(result.__class__ == value.__class__) - else: - self.assertTrue(result == value) - - # Type inference (instance method) - result = itype().Overloaded(value) - self.assertTrue(result == value) - if test_type: - self.assertTrue(result.__class__ == value.__class__) - else: - self.assertTrue(result == value) - - atype = System.Array[ptype] - items = atype([value, value, value]) - - # Explicit selection (static method) - result = stype.Overloaded[atype](items) - if test_type: - self.assertTrue(len(result) == 3) - self.assertTrue(result[0].__class__ == value.__class__) - self.assertTrue(result[1].__class__ == value.__class__) - else: - self.assertTrue(len(result) == 3) - self.assertTrue(result[0] == value) - self.assertTrue(result[1] == value) - - # Type inference (static method) - result = stype.Overloaded(items) - if test_type: - self.assertTrue(len(result) == 3) - self.assertTrue(result[0].__class__ == value.__class__) - self.assertTrue(result[1].__class__ == value.__class__) - else: - self.assertTrue(len(result) == 3) - self.assertTrue(result[0] == value) - self.assertTrue(result[1] == value) - - # Explicit selection (instance method) - result = itype().Overloaded[atype](items) - if test_type: - self.assertTrue(len(result) == 3) - self.assertTrue(result[0].__class__ == value.__class__) - self.assertTrue(result[1].__class__ == value.__class__) - else: - self.assertTrue(len(result) == 3) - self.assertTrue(result[0] == value) - self.assertTrue(result[1] == value) - - # Type inference (instance method) - result = itype().Overloaded(items) - if test_type: - self.assertTrue(len(result) == 3) - self.assertTrue(result[0].__class__ == value.__class__) - self.assertTrue(result[1].__class__ == value.__class__) - else: - self.assertTrue(len(result) == 3) - self.assertTrue(result[0] == value) - self.assertTrue(result[1] == value) - - def test_python_type_aliasing(self): - """Test python type alias support with generics.""" - from System.Collections.Generic import Dictionary - - dict_ = Dictionary[str, str]() - self.assertEquals(dict_.Count, 0) - dict_.Add("one", "one") - self.assertTrue(dict_["one"] == "one") - - dict_ = Dictionary[System.String, System.String]() - self.assertEquals(dict_.Count, 0) - dict_.Add("one", "one") - self.assertTrue(dict_["one"] == "one") - - dict_ = Dictionary[int, int]() - self.assertEquals(dict_.Count, 0) - dict_.Add(1, 1) - self.assertTrue(dict_[1] == 1) - - dict_ = Dictionary[System.Int32, System.Int32]() - self.assertEquals(dict_.Count, 0) - dict_.Add(1, 1) - self.assertTrue(dict_[1] == 1) - - dict_ = Dictionary[long, long]() - self.assertEquals(dict_.Count, 0) - dict_.Add(long(1), long(1)) - self.assertTrue(dict_[long(1)] == long(1)) - - dict_ = Dictionary[System.Int64, System.Int64]() - self.assertEquals(dict_.Count, 0) - dict_.Add(long(1), long(1)) - self.assertTrue(dict_[long(1)] == long(1)) - - dict_ = Dictionary[float, float]() - self.assertEquals(dict_.Count, 0) - dict_.Add(1.5, 1.5) - self.assertTrue(dict_[1.5] == 1.5) - - dict_ = Dictionary[System.Double, System.Double]() - self.assertEquals(dict_.Count, 0) - dict_.Add(1.5, 1.5) - self.assertTrue(dict_[1.5] == 1.5) - - dict_ = Dictionary[bool, bool]() - self.assertEquals(dict_.Count, 0) - dict_.Add(True, False) - self.assertTrue(dict_[True] is False) - - dict_ = Dictionary[System.Boolean, System.Boolean]() - self.assertEquals(dict_.Count, 0) - dict_.Add(True, False) - self.assertTrue(dict_[True] is False) - - def test_generic_reference_type(self): - """Test usage of generic reference type definitions.""" - from Python.Test import GenericTypeDefinition - - inst = GenericTypeDefinition[System.String, System.Int32]("one", 2) - self.assertTrue(inst.value1 == "one") - self.assertTrue(inst.value2 == 2) - - def test_generic_value_type(self): - """Test usage of generic value type definitions.""" - inst = System.Nullable[System.Int32](10) - self.assertTrue(inst.HasValue) - self.assertTrue(inst.Value == 10) - - def test_generic_interface(self): - # TODO NotImplemented - pass - - def test_generic_delegate(self): - # TODO NotImplemented - pass - - def test_open_generic_type(self): - """Test behavior of reflected open constructed generic types.""" - from Python.Test import DerivedFromOpenGeneric - - open_generic_type = DerivedFromOpenGeneric.__bases__[0] - - with self.assertRaises(TypeError): - _ = open_generic_type() - - with self.assertRaises(TypeError): - _ = open_generic_type[System.String] - - def test_derived_from_open_generic_type(self): - """Test a generic type derived from an open generic type.""" - from Python.Test import DerivedFromOpenGeneric - - type_ = DerivedFromOpenGeneric[System.String, System.String] - inst = type_(1, 'two', 'three') - - self.assertTrue(inst.value1 == 1) - self.assertTrue(inst.value2 == 'two') - self.assertTrue(inst.value3 == 'three') - - def test_generic_type_name_resolution(self): - """Test the ability to disambiguate generic type names.""" - from Python.Test import GenericNameTest1, GenericNameTest2 - - # If both a non-generic and generic type exist for a name, the - # unadorned name always resolves to the non-generic type. - _class = GenericNameTest1 - self.assertTrue(_class().value == 0) - self.assertTrue(_class.value == 0) - - # If no non-generic type exists for a name, the unadorned name - # cannot be instantiated. It can only be used to bind a generic. - - with self.assertRaises(TypeError): - _ = GenericNameTest2() - - _class = GenericNameTest2[int] - self.assertTrue(_class().value == 1) - self.assertTrue(_class.value == 1) - - _class = GenericNameTest2[int, int] - self.assertTrue(_class().value == 2) - self.assertTrue(_class.value == 2) - - def test_generic_type_binding(self): - """Test argument conversion / binding for generic methods.""" - from Python.Test import InterfaceTest, ISayHello1, ShortEnum - import System - - self._assert_generic_wrapper_by_type(System.Boolean, True) - self._assert_generic_wrapper_by_type(bool, True) - self._assert_generic_wrapper_by_type(System.Byte, 255) - self._assert_generic_wrapper_by_type(System.SByte, 127) - self._assert_generic_wrapper_by_type(System.Char, u'A') - self._assert_generic_wrapper_by_type(System.Int16, 32767) - self._assert_generic_wrapper_by_type(System.Int32, 2147483647) - self._assert_generic_wrapper_by_type(int, 2147483647) - self._assert_generic_wrapper_by_type(System.Int64, long(9223372036854775807)) - # Python 3 has no explicit long type, use System.Int64 instead - if PY2: - self._assert_generic_wrapper_by_type(long, long(9223372036854775807)) - self._assert_generic_wrapper_by_type(System.UInt16, 65000) - self._assert_generic_wrapper_by_type(System.UInt32, long(4294967295)) - self._assert_generic_wrapper_by_type(System.UInt64, long(18446744073709551615)) - self._assert_generic_wrapper_by_type(System.Single, 3.402823e38) - self._assert_generic_wrapper_by_type(System.Double, 1.7976931348623157e308) - self._assert_generic_wrapper_by_type(float, 1.7976931348623157e308) - self._assert_generic_wrapper_by_type(System.Decimal, System.Decimal.One) - self._assert_generic_wrapper_by_type(System.String, "test") - self._assert_generic_wrapper_by_type(unicode, "test") - self._assert_generic_wrapper_by_type(str, "test") - self._assert_generic_wrapper_by_type(ShortEnum, ShortEnum.Zero) - self._assert_generic_wrapper_by_type(System.Object, InterfaceTest()) - self._assert_generic_wrapper_by_type(InterfaceTest, InterfaceTest()) - self._assert_generic_wrapper_by_type(ISayHello1, InterfaceTest()) - - def test_generic_method_binding(self): - from Python.Test import GenericMethodTest, GenericStaticMethodTest - from System import InvalidOperationException - - # Can invoke a static member on a closed generic type. - value = GenericStaticMethodTest[str].Overloaded() - self.assertTrue(value == 1) - - with self.assertRaises(InvalidOperationException): - # Cannot invoke a static member on an open type. - GenericStaticMethodTest.Overloaded() - - # Can invoke an instance member on a closed generic type. - value = GenericMethodTest[str]().Overloaded() - self.assertTrue(value == 1) - - with self.assertRaises(TypeError): - # Cannot invoke an instance member on an open type, - # because the open type cannot be instantiated. - GenericMethodTest().Overloaded() - - def test_generic_method_type_handling(self): - """Test argument conversion / binding for generic methods.""" - from Python.Test import InterfaceTest, ISayHello1, ShortEnum - import System - - # FIXME: The value doesn't fit into Int64 and PythonNet doesn't - # recognize it as UInt64 for unknown reasons. - # self._assert_generic_method_by_type(System.UInt64, 18446744073709551615L) - self._assert_generic_method_by_type(System.Boolean, True) - self._assert_generic_method_by_type(bool, True) - self._assert_generic_method_by_type(System.Byte, 255) - self._assert_generic_method_by_type(System.SByte, 127) - self._assert_generic_method_by_type(System.Char, u'A') - self._assert_generic_method_by_type(System.Int16, 32767) - self._assert_generic_method_by_type(System.Int32, 2147483647) - self._assert_generic_method_by_type(int, 2147483647) - # Python 3 has no explicit long type, use System.Int64 instead - if PY2: - self._assert_generic_method_by_type(System.Int64, long(9223372036854775807)) - self._assert_generic_method_by_type(long, long(9223372036854775807)) - self._assert_generic_method_by_type(System.UInt32, long(4294967295)) - self._assert_generic_method_by_type(System.Int64, long(1844674407370955161)) - self._assert_generic_method_by_type(System.UInt16, 65000) - self._assert_generic_method_by_type(System.Single, 3.402823e38) - self._assert_generic_method_by_type(System.Double, 1.7976931348623157e308) - self._assert_generic_method_by_type(float, 1.7976931348623157e308) - self._assert_generic_method_by_type(System.Decimal, System.Decimal.One) - self._assert_generic_method_by_type(System.String, "test") - self._assert_generic_method_by_type(unicode, "test") - self._assert_generic_method_by_type(str, "test") - self._assert_generic_method_by_type(ShortEnum, ShortEnum.Zero) - self._assert_generic_method_by_type(System.Object, InterfaceTest()) - self._assert_generic_method_by_type(InterfaceTest, InterfaceTest(), 1) - self._assert_generic_method_by_type(ISayHello1, InterfaceTest(), 1) - - def test_correct_overload_selection(self): - """Test correct overloading selection for common types.""" - from System import (String, Double, Single, - Int16, Int32, Int64) - from System import Math - - substr = String("substring") - self.assertTrue(substr.Substring(2) == substr.Substring.__overloads__[Int32]( - Int32(2))) - self.assertTrue(substr.Substring(2, 3) == substr.Substring.__overloads__[Int32, Int32]( - Int32(2), Int32(3))) - - for atype, value1, value2 in zip([Double, Single, Int16, Int32, Int64], - [1.0, 1.0, 1, 1, 1], - [2.0, 0.5, 2, 0, -1]): - self.assertTrue(Math.Abs(atype(value1)) == Math.Abs.__overloads__[atype](atype(value1))) - self.assertTrue(Math.Abs(value1) == Math.Abs.__overloads__[atype](atype(value1))) - self.assertTrue( - Math.Max(atype(value1), - atype(value2)) == Math.Max.__overloads__[atype, atype]( - atype(value1), atype(value2))) - if PY2 and atype is Int64: - value2 = long(value2) - self.assertTrue( - Math.Max(atype(value1), - value2) == Math.Max.__overloads__[atype, atype]( - atype(value1), atype(value2))) - - clr.AddReference("System.Runtime.InteropServices") - from System.Runtime.InteropServices import GCHandle, GCHandleType - from System import Array, Byte - cs_array = Array.CreateInstance(Byte, 1000) - handler = GCHandle.Alloc(cs_array, GCHandleType.Pinned) - - def test_generic_method_overload_selection(self): - """Test explicit overload selection with generic methods.""" - from Python.Test import GenericMethodTest, GenericStaticMethodTest - - type = GenericStaticMethodTest[str] - inst = GenericMethodTest[str]() - - # public static int Overloaded() - value = type.Overloaded() - self.assertTrue(value == 1) - - # public int Overloaded() - value = inst.Overloaded() - self.assertTrue(value == 1) - - # public static T Overloaded(T arg) (inferred) - value = type.Overloaded("test") - self.assertTrue(value == "test") - - # public T Overloaded(T arg) (inferred) - value = inst.Overloaded("test") - self.assertTrue(value == "test") - - # public static T Overloaded(T arg) (explicit) - value = type.Overloaded[str]("test") - self.assertTrue(value == "test") - - # public T Overloaded(T arg) (explicit) - value = inst.Overloaded[str]("test") - self.assertTrue(value == "test") - - # public static Q Overloaded(Q arg) - value = type.Overloaded[float](2.2) - self.assertTrue(value == 2.2) - - # public Q Overloaded(Q arg) - value = inst.Overloaded[float](2.2) - self.assertTrue(value == 2.2) - - # public static Q Overloaded(Q arg) - value = type.Overloaded[bool](True) - self.assertTrue(value is True) - - # public Q Overloaded(Q arg) - value = inst.Overloaded[bool](True) - self.assertTrue(value is True) - - # public static U Overloaded(Q arg1, U arg2) - value = type.Overloaded[bool, str](True, "true") - self.assertTrue(value == "true") - - # public U Overloaded(Q arg1, U arg2) - value = inst.Overloaded[bool, str](True, "true") - self.assertTrue(value == "true") - - # public static U Overloaded(Q arg1, U arg2) - value = type.Overloaded[str, bool]("true", True) - self.assertTrue(value is True) - - # public U Overloaded(Q arg1, U arg2) - value = inst.Overloaded[str, bool]("true", True) - self.assertTrue(value is True) - - # public static string Overloaded(int arg1, int arg2, string arg3) - value = type.Overloaded[str](123, 456, "success") - self.assertTrue(value == "success") - - # public string Overloaded(int arg1, int arg2, string arg3) - value = inst.Overloaded[str](123, 456, "success") - self.assertTrue(value == "success") - - with self.assertRaises(TypeError): - _ = type.Overloaded[str, bool, int]("true", True, 1) - - with self.assertRaises(TypeError): - _ = inst.Overloaded[str, bool, int]("true", True, 1) - - def test_method_overload_selection_with_generic_types(self): - """Check method overload selection using generic types.""" - from Python.Test import ISayHello1, InterfaceTest, ShortEnum - from Python.Test import MethodTest, GenericWrapper - - inst = InterfaceTest() - - vtype = GenericWrapper[System.Boolean] - input_ = vtype(True) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value is True) - - vtype = GenericWrapper[bool] - input_ = vtype(True) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value is True) - - vtype = GenericWrapper[System.Byte] - input_ = vtype(255) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == 255) - - vtype = GenericWrapper[System.SByte] - input_ = vtype(127) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == 127) - - vtype = GenericWrapper[System.Char] - input_ = vtype(u'A') - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == u'A') - - vtype = GenericWrapper[System.Char] - input_ = vtype(65535) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == unichr(65535)) - - vtype = GenericWrapper[System.Int16] - input_ = vtype(32767) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == 32767) - - vtype = GenericWrapper[System.Int32] - input_ = vtype(2147483647) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == 2147483647) - - vtype = GenericWrapper[int] - input_ = vtype(2147483647) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == 2147483647) - - vtype = GenericWrapper[System.Int64] + vtype = GenericWrapper[System.SByte] + input_ = vtype(127) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == 127 + + vtype = GenericWrapper[System.Char] + input_ = vtype(u'A') + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == u'A' + + vtype = GenericWrapper[System.Char] + input_ = vtype(65535) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == unichr(65535) + + vtype = GenericWrapper[System.Int16] + input_ = vtype(32767) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == 32767 + + vtype = GenericWrapper[System.Int32] + input_ = vtype(2147483647) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == 2147483647 + + vtype = GenericWrapper[int] + input_ = vtype(2147483647) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == 2147483647 + + vtype = GenericWrapper[System.Int64] + input_ = vtype(long(9223372036854775807)) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == long(9223372036854775807) + + # Python 3 has no explicit long type, use System.Int64 instead + if PY2: + vtype = GenericWrapper[long] input_ = vtype(long(9223372036854775807)) value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == long(9223372036854775807)) - - # Python 3 has no explicit long type, use System.Int64 instead - if PY2: - vtype = GenericWrapper[long] - input_ = vtype(long(9223372036854775807)) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == long(9223372036854775807)) - - vtype = GenericWrapper[System.UInt16] - input_ = vtype(65000) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == 65000) - - vtype = GenericWrapper[System.UInt32] - input_ = vtype(long(4294967295)) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == long(4294967295)) - - vtype = GenericWrapper[System.UInt64] - input_ = vtype(long(18446744073709551615)) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == long(18446744073709551615)) - - vtype = GenericWrapper[System.Single] - input_ = vtype(3.402823e38) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == 3.402823e38) - - vtype = GenericWrapper[System.Double] - input_ = vtype(1.7976931348623157e308) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == 1.7976931348623157e308) - - vtype = GenericWrapper[float] - input_ = vtype(1.7976931348623157e308) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == 1.7976931348623157e308) - - vtype = GenericWrapper[System.Decimal] - input_ = vtype(System.Decimal.One) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == System.Decimal.One) - - vtype = GenericWrapper[System.String] - input_ = vtype("spam") - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == "spam") - - vtype = GenericWrapper[str] - input_ = vtype("spam") - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == "spam") - - vtype = GenericWrapper[ShortEnum] - input_ = vtype(ShortEnum.Zero) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value == ShortEnum.Zero) - - vtype = GenericWrapper[System.Object] - input_ = vtype(inst) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value.__class__ == inst.__class__) - - vtype = GenericWrapper[InterfaceTest] - input_ = vtype(inst) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value.__class__ == inst.__class__) - - vtype = GenericWrapper[ISayHello1] - input_ = vtype(inst) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value.value.__class__ == inst.__class__) - - vtype = System.Array[GenericWrapper[int]] - input_ = vtype([GenericWrapper[int](0), GenericWrapper[int](1)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == 0) - self.assertTrue(value[1].value == 1) - - def test_overload_selection_with_arrays_of_generic_types(self): - """Check overload selection using arrays of generic types.""" - from Python.Test import ISayHello1, InterfaceTest, ShortEnum - from Python.Test import MethodTest, GenericWrapper - - inst = InterfaceTest() - - gtype = GenericWrapper[System.Boolean] - vtype = System.Array[gtype] - input_ = vtype([gtype(True), gtype(True)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value is True) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[bool] - vtype = System.Array[gtype] - input_ = vtype([gtype(True), gtype(True)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value is True) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[System.Byte] - vtype = System.Array[gtype] - input_ = vtype([gtype(255), gtype(255)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == 255) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[System.SByte] - vtype = System.Array[gtype] - input_ = vtype([gtype(127), gtype(127)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == 127) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[System.Char] - vtype = System.Array[gtype] - input_ = vtype([gtype(u'A'), gtype(u'A')]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == u'A') - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[System.Char] - vtype = System.Array[gtype] - input_ = vtype([gtype(65535), gtype(65535)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == unichr(65535)) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[System.Int16] - vtype = System.Array[gtype] - input_ = vtype([gtype(32767), gtype(32767)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == 32767) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[System.Int32] - vtype = System.Array[gtype] - input_ = vtype([gtype(2147483647), gtype(2147483647)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == 2147483647) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[int] - vtype = System.Array[gtype] - input_ = vtype([gtype(2147483647), gtype(2147483647)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == 2147483647) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[System.Int64] + assert value.value == long(9223372036854775807) + + vtype = GenericWrapper[System.UInt16] + input_ = vtype(65000) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == 65000 + + vtype = GenericWrapper[System.UInt32] + input_ = vtype(long(4294967295)) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == long(4294967295) + + vtype = GenericWrapper[System.UInt64] + input_ = vtype(long(18446744073709551615)) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == long(18446744073709551615) + + vtype = GenericWrapper[System.Single] + input_ = vtype(3.402823e38) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == 3.402823e38 + + vtype = GenericWrapper[System.Double] + input_ = vtype(1.7976931348623157e308) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == 1.7976931348623157e308 + + vtype = GenericWrapper[float] + input_ = vtype(1.7976931348623157e308) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == 1.7976931348623157e308 + + vtype = GenericWrapper[System.Decimal] + input_ = vtype(System.Decimal.One) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == System.Decimal.One + + vtype = GenericWrapper[System.String] + input_ = vtype("spam") + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == "spam" + + vtype = GenericWrapper[str] + input_ = vtype("spam") + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == "spam" + + vtype = GenericWrapper[ShortEnum] + input_ = vtype(ShortEnum.Zero) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value == ShortEnum.Zero + + vtype = GenericWrapper[System.Object] + input_ = vtype(inst) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value.__class__ == inst.__class__ + + vtype = GenericWrapper[InterfaceTest] + input_ = vtype(inst) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value.__class__ == inst.__class__ + + vtype = GenericWrapper[ISayHello1] + input_ = vtype(inst) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value.value.__class__ == inst.__class__ + + vtype = System.Array[GenericWrapper[int]] + input_ = vtype([GenericWrapper[int](0), GenericWrapper[int](1)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == 0 + assert value[1].value == 1 + + +def test_overload_selection_with_arrays_of_generic_types(): + """Check overload selection using arrays of generic types.""" + from Python.Test import ISayHello1, InterfaceTest, ShortEnum + from Python.Test import MethodTest, GenericWrapper + + inst = InterfaceTest() + + gtype = GenericWrapper[System.Boolean] + vtype = System.Array[gtype] + input_ = vtype([gtype(True), gtype(True)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value is True + assert value.Length == 2 + + gtype = GenericWrapper[bool] + vtype = System.Array[gtype] + input_ = vtype([gtype(True), gtype(True)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value is True + assert value.Length == 2 + + gtype = GenericWrapper[System.Byte] + vtype = System.Array[gtype] + input_ = vtype([gtype(255), gtype(255)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == 255 + assert value.Length == 2 + + gtype = GenericWrapper[System.SByte] + vtype = System.Array[gtype] + input_ = vtype([gtype(127), gtype(127)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == 127 + assert value.Length == 2 + + gtype = GenericWrapper[System.Char] + vtype = System.Array[gtype] + input_ = vtype([gtype(u'A'), gtype(u'A')]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == u'A' + assert value.Length == 2 + + gtype = GenericWrapper[System.Char] + vtype = System.Array[gtype] + input_ = vtype([gtype(65535), gtype(65535)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == unichr(65535) + assert value.Length == 2 + + gtype = GenericWrapper[System.Int16] + vtype = System.Array[gtype] + input_ = vtype([gtype(32767), gtype(32767)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == 32767 + assert value.Length == 2 + + gtype = GenericWrapper[System.Int32] + vtype = System.Array[gtype] + input_ = vtype([gtype(2147483647), gtype(2147483647)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == 2147483647 + assert value.Length == 2 + + gtype = GenericWrapper[int] + vtype = System.Array[gtype] + input_ = vtype([gtype(2147483647), gtype(2147483647)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == 2147483647 + assert value.Length == 2 + + gtype = GenericWrapper[System.Int64] + vtype = System.Array[gtype] + input_ = vtype([gtype(long(9223372036854775807)), + gtype(long(9223372036854775807))]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == long(9223372036854775807) + assert value.Length == 2 + + # Python 3 has no explicit long type, use System.Int64 instead + if PY2: + gtype = GenericWrapper[long] vtype = System.Array[gtype] input_ = vtype([gtype(long(9223372036854775807)), - gtype(long(9223372036854775807))]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == long(9223372036854775807)) - self.assertTrue(value.Length == 2) - - # Python 3 has no explicit long type, use System.Int64 instead - if PY2: - gtype = GenericWrapper[long] - vtype = System.Array[gtype] - input_ = vtype([gtype(long(9223372036854775807)), - gtype(long(9223372036854775807))]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == long(9223372036854775807)) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[System.UInt16] - vtype = System.Array[gtype] - input_ = vtype([gtype(65000), gtype(65000)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == 65000) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[System.UInt32] - vtype = System.Array[gtype] - input_ = vtype([gtype(long(4294967295)), gtype(long(4294967295))]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == long(4294967295)) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[System.UInt64] - vtype = System.Array[gtype] - input_ = vtype([gtype(long(18446744073709551615)), - gtype(long(18446744073709551615))]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == long(18446744073709551615)) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[System.Single] - vtype = System.Array[gtype] - input_ = vtype([gtype(3.402823e38), gtype(3.402823e38)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == 3.402823e38) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[System.Double] - vtype = System.Array[gtype] - input_ = vtype([gtype(1.7976931348623157e308), - gtype(1.7976931348623157e308)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == 1.7976931348623157e308) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[float] - vtype = System.Array[gtype] - input_ = vtype([gtype(1.7976931348623157e308), - gtype(1.7976931348623157e308)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == 1.7976931348623157e308) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[System.Decimal] - vtype = System.Array[gtype] - input_ = vtype([gtype(System.Decimal.One), - gtype(System.Decimal.One)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == System.Decimal.One) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[System.String] - vtype = System.Array[gtype] - input_ = vtype([gtype("spam"), gtype("spam")]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == "spam") - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[str] - vtype = System.Array[gtype] - input_ = vtype([gtype("spam"), gtype("spam")]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == "spam") - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[ShortEnum] - vtype = System.Array[gtype] - input_ = vtype([gtype(ShortEnum.Zero), gtype(ShortEnum.Zero)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value == ShortEnum.Zero) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[System.Object] - vtype = System.Array[gtype] - input_ = vtype([gtype(inst), gtype(inst)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value.__class__ == inst.__class__) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[InterfaceTest] - vtype = System.Array[gtype] - input_ = vtype([gtype(inst), gtype(inst)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value.__class__ == inst.__class__) - self.assertTrue(value.Length == 2) - - gtype = GenericWrapper[ISayHello1] - vtype = System.Array[gtype] - input_ = vtype([gtype(inst), gtype(inst)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].value.__class__ == inst.__class__) - self.assertTrue(value.Length == 2) - - def test_generic_overload_selection_magic_name_only(self): - """Test using only __overloads__ to select on type & sig""" - # TODO NotImplemented - pass - - def test_nested_generic_class(self): - """Check nested generic classes.""" - # TODO NotImplemented - pass - - -def test_suite(): - return unittest.makeSuite(GenericTests) + gtype(long(9223372036854775807))]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == long(9223372036854775807) + assert value.Length == 2 + + gtype = GenericWrapper[System.UInt16] + vtype = System.Array[gtype] + input_ = vtype([gtype(65000), gtype(65000)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == 65000 + assert value.Length == 2 + + gtype = GenericWrapper[System.UInt32] + vtype = System.Array[gtype] + input_ = vtype([gtype(long(4294967295)), gtype(long(4294967295))]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == long(4294967295) + assert value.Length == 2 + + gtype = GenericWrapper[System.UInt64] + vtype = System.Array[gtype] + input_ = vtype([gtype(long(18446744073709551615)), + gtype(long(18446744073709551615))]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == long(18446744073709551615) + assert value.Length == 2 + + gtype = GenericWrapper[System.Single] + vtype = System.Array[gtype] + input_ = vtype([gtype(3.402823e38), gtype(3.402823e38)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == 3.402823e38 + assert value.Length == 2 + + gtype = GenericWrapper[System.Double] + vtype = System.Array[gtype] + input_ = vtype([gtype(1.7976931348623157e308), + gtype(1.7976931348623157e308)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == 1.7976931348623157e308 + assert value.Length == 2 + + gtype = GenericWrapper[float] + vtype = System.Array[gtype] + input_ = vtype([gtype(1.7976931348623157e308), + gtype(1.7976931348623157e308)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == 1.7976931348623157e308 + assert value.Length == 2 + + gtype = GenericWrapper[System.Decimal] + vtype = System.Array[gtype] + input_ = vtype([gtype(System.Decimal.One), + gtype(System.Decimal.One)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == System.Decimal.One + assert value.Length == 2 + + gtype = GenericWrapper[System.String] + vtype = System.Array[gtype] + input_ = vtype([gtype("spam"), gtype("spam")]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == "spam" + assert value.Length == 2 + + gtype = GenericWrapper[str] + vtype = System.Array[gtype] + input_ = vtype([gtype("spam"), gtype("spam")]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == "spam" + assert value.Length == 2 + + gtype = GenericWrapper[ShortEnum] + vtype = System.Array[gtype] + input_ = vtype([gtype(ShortEnum.Zero), gtype(ShortEnum.Zero)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value == ShortEnum.Zero + assert value.Length == 2 + + gtype = GenericWrapper[System.Object] + vtype = System.Array[gtype] + input_ = vtype([gtype(inst), gtype(inst)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value.__class__ == inst.__class__ + assert value.Length == 2 + + gtype = GenericWrapper[InterfaceTest] + vtype = System.Array[gtype] + input_ = vtype([gtype(inst), gtype(inst)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value.__class__ == inst.__class__ + assert value.Length == 2 + + gtype = GenericWrapper[ISayHello1] + vtype = System.Array[gtype] + input_ = vtype([gtype(inst), gtype(inst)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].value.__class__ == inst.__class__ + assert value.Length == 2 + + +def test_generic_overload_selection_magic_name_only(): + """Test using only __overloads__ to select on type & sig""" + # TODO NotImplemented + pass + + +def test_nested_generic_class(): + """Check nested generic classes.""" + # TODO NotImplemented + pass diff --git a/src/tests/test_import.py b/src/tests/test_import.py new file mode 100644 index 000000000..42cafc4df --- /dev/null +++ b/src/tests/test_import.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- + +"""Test the import statement.""" + +import pytest + + +def test_relative_missing_import(): + """Test that a relative missing import doesn't crash. + Some modules use this to check if a package is installed. + Relative import in the site-packages folder""" + with pytest.raises(ImportError): + from . import _missing_import diff --git a/src/tests/test_indexer.py b/src/tests/test_indexer.py index 422f7282e..6f18550d9 100644 --- a/src/tests/test_indexer.py +++ b/src/tests/test_indexer.py @@ -1,577 +1,599 @@ # -*- coding: utf-8 -*- -import unittest +"""Test support for indexer properties.""" import Python.Test as Test +import pytest -from _compat import long, unichr +from ._compat import long, unichr -class IndexerTests(unittest.TestCase): - """Test support for indexer properties.""" +def test_public_indexer(): + """Test public indexers.""" + ob = Test.PublicIndexerTest() - def test_public_indexer(self): - """Test public indexers.""" - ob = Test.PublicIndexerTest() + ob[0] = "zero" + assert ob[0] == "zero" - ob[0] = "zero" - self.assertTrue(ob[0] == "zero") + ob[1] = "one" + assert ob[1] == "one" + + assert ob[10] is None + + +def test_protected_indexer(): + """Test protected indexers.""" + ob = Test.ProtectedIndexerTest() + + ob[0] = "zero" + assert ob[0] == "zero" + + ob[1] = "one" + assert ob[1] == "one" - ob[1] = "one" - self.assertTrue(ob[1] == "one") + assert ob[10] is None - self.assertTrue(ob[10] is None) - def test_protected_indexer(self): - """Test protected indexers.""" - ob = Test.ProtectedIndexerTest() +def test_internal_indexer(): + """Test internal indexers.""" + ob = Test.InternalIndexerTest() + with pytest.raises(TypeError): ob[0] = "zero" - self.assertTrue(ob[0] == "zero") - ob[1] = "one" - self.assertTrue(ob[1] == "one") + with pytest.raises(TypeError): + Test.InternalIndexerTest.__getitem__(ob, 0) - self.assertTrue(ob[10] is None) + with pytest.raises(TypeError): + ob.__getitem__(0) - def test_internal_indexer(self): - """Test internal indexers.""" - ob = Test.InternalIndexerTest() - with self.assertRaises(TypeError): - ob[0] = "zero" +def test_private_indexer(): + """Test private indexers.""" + ob = Test.PrivateIndexerTest() + + with pytest.raises(TypeError): + ob[0] = "zero" + + with pytest.raises(TypeError): + Test.PrivateIndexerTest.__getitem__(ob, 0) + + with pytest.raises(TypeError): + ob.__getitem__(0) - with self.assertRaises(TypeError): - Test.InternalIndexerTest.__getitem__(ob, 0) - with self.assertRaises(TypeError): - ob.__getitem__(0) +def test_boolean_indexer(): + """Test boolean indexers.""" + ob = Test.BooleanIndexerTest() - def test_private_indexer(self): - """Test private indexers.""" - ob = Test.PrivateIndexerTest() + assert ob[True] is None + assert ob[1] is None - with self.assertRaises(TypeError): - ob[0] = "zero" + ob[0] = "false" + assert ob[0] == "false" - with self.assertRaises(TypeError): - Test.PrivateIndexerTest.__getitem__(ob, 0) + ob[1] = "true" + assert ob[1] == "true" - with self.assertRaises(TypeError): - ob.__getitem__(0) + ob[False] = "false" + assert ob[False] == "false" - def test_boolean_indexer(self): - """Test boolean indexers.""" - ob = Test.BooleanIndexerTest() + ob[True] = "true" + assert ob[True] == "true" - self.assertTrue(ob[True] is None) - self.assertTrue(ob[1] is None) - ob[0] = "false" - self.assertTrue(ob[0] == "false") +def test_byte_indexer(): + """Test byte indexers.""" + ob = Test.ByteIndexerTest() + max_ = 255 + min_ = 0 - ob[1] = "true" - self.assertTrue(ob[1] == "true") + assert ob[max_] is None - ob[False] = "false" - self.assertTrue(ob[False] == "false") + ob[max_] = str(max_) + assert ob[max_] == str(max_) - ob[True] = "true" - self.assertTrue(ob[True] == "true") + ob[min_] = str(min_) + assert ob[min_] == str(min_) - def test_byte_indexer(self): - """Test byte indexers.""" + with pytest.raises(TypeError): ob = Test.ByteIndexerTest() - max_ = 255 - min_ = 0 + ob["wrong"] + + with pytest.raises(TypeError): + ob = Test.ByteIndexerTest() + ob["wrong"] = "wrong" - self.assertTrue(ob[max_] is None) - ob[max_] = str(max_) - self.assertTrue(ob[max_] == str(max_)) +def test_sbyte_indexer(): + """Test sbyte indexers.""" + ob = Test.SByteIndexerTest() + max_ = 127 + min_ = -128 - ob[min_] = str(min_) - self.assertTrue(ob[min_] == str(min_)) + assert ob[max_] is None - with self.assertRaises(TypeError): - ob = Test.ByteIndexerTest() - ob["wrong"] + ob[max_] = str(max_) + assert ob[max_] == str(max_) - with self.assertRaises(TypeError): - ob = Test.ByteIndexerTest() - ob["wrong"] = "wrong" + ob[min_] = str(min_) + assert ob[min_] == str(min_) - def test_sbyte_indexer(self): - """Test sbyte indexers.""" + with pytest.raises(TypeError): ob = Test.SByteIndexerTest() - max_ = 127 - min_ = -128 + ob["wrong"] - self.assertTrue(ob[max_] is None) + with pytest.raises(TypeError): + ob = Test.SByteIndexerTest() + ob["wrong"] = "wrong" - ob[max_] = str(max_) - self.assertTrue(ob[max_] == str(max_)) - ob[min_] = str(min_) - self.assertTrue(ob[min_] == str(min_)) +def test_char_indexer(): + """Test char indexers.""" + ob = Test.CharIndexerTest() + max_ = unichr(65535) + min_ = unichr(0) - with self.assertRaises(TypeError): - ob = Test.SByteIndexerTest() - ob["wrong"] + assert ob[max_] is None - with self.assertRaises(TypeError): - ob = Test.SByteIndexerTest() - ob["wrong"] = "wrong" + ob[max_] = "max_" + assert ob[max_] == "max_" - def test_char_indexer(self): - """Test char indexers.""" + ob[min_] = "min_" + assert ob[min_] == "min_" + + with pytest.raises(TypeError): + ob = Test.CharIndexerTest() + ob["wrong"] + + with pytest.raises(TypeError): ob = Test.CharIndexerTest() - max_ = unichr(65535) - min_ = unichr(0) + ob["wrong"] = "wrong" - self.assertTrue(ob[max_] is None) - ob[max_] = "max_" - self.assertTrue(ob[max_] == "max_") +def test_int16_indexer(): + """Test Int16 indexers.""" + ob = Test.Int16IndexerTest() + max_ = 32767 + min_ = -32768 - ob[min_] = "min_" - self.assertTrue(ob[min_] == "min_") + assert ob[max_] is None - with self.assertRaises(TypeError): - ob = Test.CharIndexerTest() - ob["wrong"] + ob[max_] = str(max_) + assert ob[max_] == str(max_) - with self.assertRaises(TypeError): - ob = Test.CharIndexerTest() - ob["wrong"] = "wrong" + ob[min_] = str(min_) + assert ob[min_] == str(min_) - def test_int16_indexer(self): - """Test Int16 indexers.""" + with pytest.raises(TypeError): ob = Test.Int16IndexerTest() - max_ = 32767 - min_ = -32768 + ob["wrong"] - self.assertTrue(ob[max_] is None) + with pytest.raises(TypeError): + ob = Test.Int16IndexerTest() + ob["wrong"] = "wrong" - ob[max_] = str(max_) - self.assertTrue(ob[max_] == str(max_)) - ob[min_] = str(min_) - self.assertTrue(ob[min_] == str(min_)) +def test_int32_indexer(): + """Test Int32 indexers.""" + ob = Test.Int32IndexerTest() + max_ = 2147483647 + min_ = -2147483648 - with self.assertRaises(TypeError): - ob = Test.Int16IndexerTest() - ob["wrong"] + assert ob[max_] is None - with self.assertRaises(TypeError): - ob = Test.Int16IndexerTest() - ob["wrong"] = "wrong" + ob[max_] = str(max_) + assert ob[max_] == str(max_) + + ob[min_] = str(min_) + assert ob[min_] == str(min_) + + with pytest.raises(TypeError): + ob = Test.Int32IndexerTest() + ob["wrong"] - def test_int32_indexer(self): - """Test Int32 indexers.""" + with pytest.raises(TypeError): ob = Test.Int32IndexerTest() - max_ = 2147483647 - min_ = -2147483648 + ob["wrong"] = "wrong" - self.assertTrue(ob[max_] is None) - ob[max_] = str(max_) - self.assertTrue(ob[max_] == str(max_)) +def test_int64_indexer(): + """Test Int64 indexers.""" + ob = Test.Int64IndexerTest() + max_ = long(9223372036854775807) + min_ = long(-9223372036854775808) - ob[min_] = str(min_) - self.assertTrue(ob[min_] == str(min_)) + assert ob[max_] is None - with self.assertRaises(TypeError): - ob = Test.Int32IndexerTest() - ob["wrong"] + ob[max_] = str(max_) + assert ob[max_] == str(max_) - with self.assertRaises(TypeError): - ob = Test.Int32IndexerTest() - ob["wrong"] = "wrong" + ob[min_] = str(min_) + assert ob[min_] == str(min_) - def test_int64_indexer(self): - """Test Int64 indexers.""" + with pytest.raises(TypeError): ob = Test.Int64IndexerTest() - max_ = long(9223372036854775807) - min_ = long(-9223372036854775808) + ob["wrong"] - self.assertTrue(ob[max_] is None) + with pytest.raises(TypeError): + ob = Test.Int64IndexerTest() + ob["wrong"] = "wrong" + + +def test_uint16_indexer(): + """Test UInt16 indexers.""" + ob = Test.UInt16IndexerTest() + max_ = 65535 + min_ = 0 - ob[max_] = str(max_) - self.assertTrue(ob[max_] == str(max_)) + assert ob[max_] is None - ob[min_] = str(min_) - self.assertTrue(ob[min_] == str(min_)) + ob[max_] = str(max_) + assert ob[max_] == str(max_) - with self.assertRaises(TypeError): - ob = Test.Int64IndexerTest() - ob["wrong"] + ob[min_] = str(min_) + assert ob[min_] == str(min_) - with self.assertRaises(TypeError): - ob = Test.Int64IndexerTest() - ob["wrong"] = "wrong" + with pytest.raises(TypeError): + ob = Test.UInt16IndexerTest() + ob["wrong"] - def test_uint16_indexer(self): - """Test UInt16 indexers.""" + with pytest.raises(TypeError): ob = Test.UInt16IndexerTest() - max_ = 65535 - min_ = 0 + ob["wrong"] = "wrong" + - self.assertTrue(ob[max_] is None) +def test_uint32_indexer(): + """Test UInt32 indexers.""" + ob = Test.UInt32IndexerTest() + max_ = long(4294967295) + min_ = 0 - ob[max_] = str(max_) - self.assertTrue(ob[max_] == str(max_)) + assert ob[max_] is None - ob[min_] = str(min_) - self.assertTrue(ob[min_] == str(min_)) + ob[max_] = str(max_) + assert ob[max_] == str(max_) - with self.assertRaises(TypeError): - ob = Test.UInt16IndexerTest() - ob["wrong"] + ob[min_] = str(min_) + assert ob[min_] == str(min_) - with self.assertRaises(TypeError): - ob = Test.UInt16IndexerTest() - ob["wrong"] = "wrong" + with pytest.raises(TypeError): + ob = Test.UInt32IndexerTest() + ob["wrong"] - def test_uint32_indexer(self): - """Test UInt32 indexers.""" + with pytest.raises(TypeError): ob = Test.UInt32IndexerTest() - max_ = long(4294967295) - min_ = 0 + ob["wrong"] = "wrong" - self.assertTrue(ob[max_] is None) - ob[max_] = str(max_) - self.assertTrue(ob[max_] == str(max_)) +def test_uint64_indexer(): + """Test UInt64 indexers.""" + ob = Test.UInt64IndexerTest() + max_ = long(18446744073709551615) + min_ = 0 - ob[min_] = str(min_) - self.assertTrue(ob[min_] == str(min_)) + assert ob[max_] is None - with self.assertRaises(TypeError): - ob = Test.UInt32IndexerTest() - ob["wrong"] + ob[max_] = str(max_) + assert ob[max_] == str(max_) - with self.assertRaises(TypeError): - ob = Test.UInt32IndexerTest() - ob["wrong"] = "wrong" + ob[min_] = str(min_) + assert ob[min_] == str(min_) - def test_uint64_indexer(self): - """Test UInt64 indexers.""" + with pytest.raises(TypeError): ob = Test.UInt64IndexerTest() - max_ = long(18446744073709551615) - min_ = 0 + ob["wrong"] + + with pytest.raises(TypeError): + ob = Test.UInt64IndexerTest() + ob["wrong"] = "wrong" - self.assertTrue(ob[max_] is None) - ob[max_] = str(max_) - self.assertTrue(ob[max_] == str(max_)) +def test_single_indexer(): + """Test Single indexers.""" + ob = Test.SingleIndexerTest() + max_ = 3.402823e38 + min_ = -3.402823e38 - ob[min_] = str(min_) - self.assertTrue(ob[min_] == str(min_)) + assert ob[max_] is None - with self.assertRaises(TypeError): - ob = Test.UInt64IndexerTest() - ob["wrong"] + ob[max_] = "max_" + assert ob[max_] == "max_" - with self.assertRaises(TypeError): - ob = Test.UInt64IndexerTest() - ob["wrong"] = "wrong" + ob[min_] = "min_" + assert ob[min_] == "min_" + + with pytest.raises(TypeError): + ob = Test.SingleIndexerTest() + ob["wrong"] - def test_single_indexer(self): - """Test Single indexers.""" + with pytest.raises(TypeError): ob = Test.SingleIndexerTest() - max_ = 3.402823e38 - min_ = -3.402823e38 + ob["wrong"] = "wrong" - self.assertTrue(ob[max_] is None) - ob[max_] = "max_" - self.assertTrue(ob[max_] == "max_") +def test_double_indexer(): + """Test Double indexers.""" + ob = Test.DoubleIndexerTest() + max_ = 1.7976931348623157e308 + min_ = -1.7976931348623157e308 - ob[min_] = "min_" - self.assertTrue(ob[min_] == "min_") + assert ob[max_] is None - with self.assertRaises(TypeError): - ob = Test.SingleIndexerTest() - ob["wrong"] + ob[max_] = "max_" + assert ob[max_] == "max_" - with self.assertRaises(TypeError): - ob = Test.SingleIndexerTest() - ob["wrong"] = "wrong" + ob[min_] = "min_" + assert ob[min_] == "min_" - def test_double_indexer(self): - """Test Double indexers.""" + with pytest.raises(TypeError): ob = Test.DoubleIndexerTest() - max_ = 1.7976931348623157e308 - min_ = -1.7976931348623157e308 + ob["wrong"] + + with pytest.raises(TypeError): + ob = Test.DoubleIndexerTest() + ob["wrong"] = "wrong" + - self.assertTrue(ob[max_] is None) +def test_decimal_indexer(): + """Test Decimal indexers.""" + ob = Test.DecimalIndexerTest() - ob[max_] = "max_" - self.assertTrue(ob[max_] == "max_") + from System import Decimal + max_d = Decimal.Parse("79228162514264337593543950335") + min_d = Decimal.Parse("-79228162514264337593543950335") - ob[min_] = "min_" - self.assertTrue(ob[min_] == "min_") + assert ob[max_d] is None - with self.assertRaises(TypeError): - ob = Test.DoubleIndexerTest() - ob["wrong"] + ob[max_d] = "max_" + assert ob[max_d] == "max_" - with self.assertRaises(TypeError): - ob = Test.DoubleIndexerTest() - ob["wrong"] = "wrong" + ob[min_d] = "min_" + assert ob[min_d] == "min_" - def test_decimal_indexer(self): - """Test Decimal indexers.""" + with pytest.raises(TypeError): ob = Test.DecimalIndexerTest() + ob["wrong"] + + with pytest.raises(TypeError): + ob = Test.DecimalIndexerTest() + ob["wrong"] = "wrong" - from System import Decimal - max_d = Decimal.Parse("79228162514264337593543950335") - min_d = Decimal.Parse("-79228162514264337593543950335") - self.assertTrue(ob[max_d] is None) +def test_string_indexer(): + """Test String indexers.""" + ob = Test.StringIndexerTest() - ob[max_d] = "max_" - self.assertTrue(ob[max_d] == "max_") + assert ob["spam"] is None + assert ob[u"spam"] is None - ob[min_d] = "min_" - self.assertTrue(ob[min_d] == "min_") + ob["spam"] = "spam" + assert ob["spam"] == "spam" + assert ob["spam"] == u"spam" + assert ob[u"spam"] == "spam" + assert ob[u"spam"] == u"spam" - with self.assertRaises(TypeError): - ob = Test.DecimalIndexerTest() - ob["wrong"] + ob[u"eggs"] = u"eggs" + assert ob["eggs"] == "eggs" + assert ob["eggs"] == u"eggs" + assert ob[u"eggs"] == "eggs" + assert ob[u"eggs"] == u"eggs" - with self.assertRaises(TypeError): - ob = Test.DecimalIndexerTest() - ob["wrong"] = "wrong" + with pytest.raises(TypeError): + ob = Test.StringIndexerTest() + ob[1] - def test_string_indexer(self): - """Test String indexers.""" + with pytest.raises(TypeError): ob = Test.StringIndexerTest() + ob[1] = "wrong" + + +def test_enum_indexer(): + """Test enum indexers.""" + ob = Test.EnumIndexerTest() + + key = Test.ShortEnum.One - self.assertTrue(ob["spam"] is None) - self.assertTrue(ob[u"spam"] is None) + assert ob[key] is None - ob["spam"] = "spam" - self.assertTrue(ob["spam"] == "spam") - self.assertTrue(ob["spam"] == u"spam") - self.assertTrue(ob[u"spam"] == "spam") - self.assertTrue(ob[u"spam"] == u"spam") + ob[key] = "spam" + assert ob[key] == "spam" - ob[u"eggs"] = u"eggs" - self.assertTrue(ob["eggs"] == "eggs") - self.assertTrue(ob["eggs"] == u"eggs") - self.assertTrue(ob[u"eggs"] == "eggs") - self.assertTrue(ob[u"eggs"] == u"eggs") + ob[key] = "eggs" + assert ob[key] == "eggs" - with self.assertRaises(TypeError): - ob = Test.StringIndexerTest() - ob[1] + ob[1] = "spam" + assert ob[1] == "spam" - with self.assertRaises(TypeError): - ob = Test.StringIndexerTest() - ob[1] = "wrong" + with pytest.raises(TypeError): + ob = Test.EnumIndexerTest() + ob["wrong"] - def test_enum_indexer(self): - """Test enum indexers.""" + with pytest.raises(TypeError): ob = Test.EnumIndexerTest() + ob["wrong"] = "wrong" - key = Test.ShortEnum.One - self.assertTrue(ob[key] is None) +def test_object_indexer(): + """Test ob indexers.""" + ob = Test.ObjectIndexerTest() - ob[key] = "spam" - self.assertTrue(ob[key] == "spam") + from Python.Test import Spam + spam = Spam("spam") - ob[key] = "eggs" - self.assertTrue(ob[key] == "eggs") + assert ob[spam] is None + assert ob["spam"] is None + assert ob[1] is None + assert ob[None] is None - ob[1] = "spam" - self.assertTrue(ob[1] == "spam") + ob[spam] = "spam" + assert ob[spam] == "spam" - with self.assertRaises(TypeError): - ob = Test.EnumIndexerTest() - ob["wrong"] + ob["spam"] = "eggs" + assert ob["spam"] == "eggs" - with self.assertRaises(TypeError): - ob = Test.EnumIndexerTest() - ob["wrong"] = "wrong" + ob[1] = "one" + assert ob[1] == "one" - def test_object_indexer(self): - """Test ob indexers.""" - ob = Test.ObjectIndexerTest() + ob[long(1)] = "long" + assert ob[long(1)] == "long" - from Python.Test import Spam - spam = Spam("spam") + with pytest.raises(TypeError): + class Eggs(object): + pass - self.assertTrue(ob[spam] is None) - self.assertTrue(ob["spam"] is None) - self.assertTrue(ob[1] is None) - self.assertTrue(ob[None] is None) + key = Eggs() + ob = Test.ObjectIndexerTest() + ob[key] = "wrong" - ob[spam] = "spam" - self.assertTrue(ob[spam] == "spam") - ob["spam"] = "eggs" - self.assertTrue(ob["spam"] == "eggs") +def test_interface_indexer(): + """Test interface indexers.""" + ob = Test.InterfaceIndexerTest() - ob[1] = "one" - self.assertTrue(ob[1] == "one") + from Python.Test import Spam + spam = Spam("spam") - ob[long(1)] = "long" - self.assertTrue(ob[long(1)] == "long") + assert ob[spam] is None - with self.assertRaises(TypeError): - class Eggs(object): - pass + ob[spam] = "spam" + assert ob[spam] == "spam" - key = Eggs() - ob = Test.ObjectIndexerTest() - ob[key] = "wrong" + ob[spam] = "eggs" + assert ob[spam] == "eggs" - def test_interface_indexer(self): - """Test interface indexers.""" + with pytest.raises(TypeError): ob = Test.InterfaceIndexerTest() + ob["wrong"] - from Python.Test import Spam - spam = Spam("spam") + with pytest.raises(TypeError): + ob = Test.InterfaceIndexerTest() + ob["wrong"] = "wrong" - self.assertTrue(ob[spam] is None) - ob[spam] = "spam" - self.assertTrue(ob[spam] == "spam") +def test_typed_indexer(): + """Test typed indexers.""" + ob = Test.TypedIndexerTest() - ob[spam] = "eggs" - self.assertTrue(ob[spam] == "eggs") + from Python.Test import Spam + spam = Spam("spam") - with self.assertRaises(TypeError): - ob = Test.InterfaceIndexerTest() - ob["wrong"] + assert ob[spam] is None - with self.assertRaises(TypeError): - ob = Test.InterfaceIndexerTest() - ob["wrong"] = "wrong" + ob[spam] = "spam" + assert ob[spam] == "spam" - def test_typed_indexer(self): - """Test typed indexers.""" + ob[spam] = "eggs" + assert ob[spam] == "eggs" + + with pytest.raises(TypeError): ob = Test.TypedIndexerTest() + ob["wrong"] - from Python.Test import Spam - spam = Spam("spam") + with pytest.raises(TypeError): + ob = Test.TypedIndexerTest() + ob["wrong"] = "wrong" - self.assertTrue(ob[spam] is None) - ob[spam] = "spam" - self.assertTrue(ob[spam] == "spam") +def test_multi_arg_indexer(): + """Test indexers that take multiple index arguments.""" + ob = Test.MultiArgIndexerTest() - ob[spam] = "eggs" - self.assertTrue(ob[spam] == "eggs") + ob[0, 1] = "zero one" + assert ob[0, 1] == "zero one" - with self.assertRaises(TypeError): - ob = Test.TypedIndexerTest() - ob["wrong"] + ob[1, 9] = "one nine" + assert ob[1, 9] == "one nine" - with self.assertRaises(TypeError): - ob = Test.TypedIndexerTest() - ob["wrong"] = "wrong" + assert ob[10, 50] is None - def test_multi_arg_indexer(self): - """Test indexers that take multiple index arguments.""" + with pytest.raises(TypeError): ob = Test.MultiArgIndexerTest() + _ = ob[0, "one"] - ob[0, 1] = "zero one" - self.assertTrue(ob[0, 1] == "zero one") + with pytest.raises(TypeError): + ob = Test.MultiArgIndexerTest() + ob[0, "one"] = "wrong" - ob[1, 9] = "one nine" - self.assertTrue(ob[1, 9] == "one nine") - self.assertTrue(ob[10, 50] is None) +def test_multi_type_indexer(): + """Test indexers that take multiple indices of different types.""" + ob = Test.MultiTypeIndexerTest() + spam = Test.Spam("spam") - with self.assertRaises(TypeError): - ob = Test.MultiArgIndexerTest() - _ = ob[0, "one"] + ob[0, "one", spam] = "zero one spam" + assert ob[0, "one", spam] == "zero one spam" - with self.assertRaises(TypeError): - ob = Test.MultiArgIndexerTest() - ob[0, "one"] = "wrong" + ob[1, "nine", spam] = "one nine spam" + assert ob[1, "nine", spam] == "one nine spam" - def test_multi_type_indexer(self): - """Test indexers that take multiple indices of different types.""" + with pytest.raises(TypeError): ob = Test.MultiTypeIndexerTest() - spam = Test.Spam("spam") + _ = ob[0, 1, spam] - ob[0, "one", spam] = "zero one spam" - self.assertTrue(ob[0, "one", spam] == "zero one spam") - - ob[1, "nine", spam] = "one nine spam" - self.assertTrue(ob[1, "nine", spam] == "one nine spam") + with pytest.raises(TypeError): + ob = Test.MultiTypeIndexerTest() + ob[0, 1, spam] = "wrong" - with self.assertRaises(TypeError): - ob = Test.MultiTypeIndexerTest() - _ = ob[0, 1, spam] - with self.assertRaises(TypeError): - ob = Test.MultiTypeIndexerTest() - ob[0, 1, spam] = "wrong" +def test_multi_default_key_indexer(): + """Test indexers that take multiple indices with a default + key arguments.""" + # default argument is 2 in the MultiDefaultKeyIndexerTest object + ob = Test.MultiDefaultKeyIndexerTest() + ob[0, 2] = "zero one spam" + assert ob[0] == "zero one spam" - def test_multi_default_key_indexer(self): - """Test indexers that take multiple indices with a default - key arguments.""" - # default argument is 2 in the MultiDefaultKeyIndexerTest object - ob = Test.MultiDefaultKeyIndexerTest() - ob[0, 2] = "zero one spam" - self.assertTrue(ob[0] == "zero one spam") + ob[1] = "one nine spam" + assert ob[1, 2] == "one nine spam" - ob[1] = "one nine spam" - self.assertTrue(ob[1, 2] == "one nine spam") - def test_indexer_wrong_key_type(self): - """Test calling an indexer using a key of the wrong type.""" +def test_indexer_wrong_key_type(): + """Test calling an indexer using a key of the wrong type.""" - with self.assertRaises(TypeError): - ob = Test.PublicIndexerTest() - _ = ob["wrong"] + with pytest.raises(TypeError): + ob = Test.PublicIndexerTest() + _ = ob["wrong"] - with self.assertRaises(TypeError): - ob = Test.PublicIndexerTest() - ob["wrong"] = "spam" + with pytest.raises(TypeError): + ob = Test.PublicIndexerTest() + ob["wrong"] = "spam" - def test_indexer_wrong_value_type(self): - """Test calling an indexer using a value of the wrong type.""" - with self.assertRaises(TypeError): - ob = Test.PublicIndexerTest() - ob[1] = 9993.9 +def test_indexer_wrong_value_type(): + """Test calling an indexer using a value of the wrong type.""" - def test_unbound_indexer(self): - """Test calling an unbound indexer.""" + with pytest.raises(TypeError): ob = Test.PublicIndexerTest() + ob[1] = 9993.9 - Test.PublicIndexerTest.__setitem__(ob, 0, "zero") - self.assertTrue(ob[0] == "zero") - Test.PublicIndexerTest.__setitem__(ob, 1, "one") - self.assertTrue(ob[1] == "one") +def test_unbound_indexer(): + """Test calling an unbound indexer.""" + ob = Test.PublicIndexerTest() - self.assertTrue(ob[10] is None) + Test.PublicIndexerTest.__setitem__(ob, 0, "zero") + assert ob[0] == "zero" - def test_indexer_abuse(self): - """Test indexer abuse.""" - _class = Test.PublicIndexerTest - ob = Test.PublicIndexerTest() + Test.PublicIndexerTest.__setitem__(ob, 1, "one") + assert ob[1] == "one" + + assert ob[10] is None - with self.assertRaises(AttributeError): - del _class.__getitem__ - with self.assertRaises(AttributeError): - del ob.__getitem__ +def test_indexer_abuse(): + """Test indexer abuse.""" + _class = Test.PublicIndexerTest + ob = Test.PublicIndexerTest() - with self.assertRaises(AttributeError): - del _class.__setitem__ + with pytest.raises(AttributeError): + del _class.__getitem__ - with self.assertRaises(AttributeError): - del ob.__setitem__ + with pytest.raises(AttributeError): + del ob.__getitem__ + with pytest.raises(AttributeError): + del _class.__setitem__ -def test_suite(): - return unittest.makeSuite(IndexerTests) + with pytest.raises(AttributeError): + del ob.__setitem__ diff --git a/src/tests/test_interface.py b/src/tests/test_interface.py index 1fac36eb8..997f17264 100644 --- a/src/tests/test_interface.py +++ b/src/tests/test_interface.py @@ -1,72 +1,69 @@ # -*- coding: utf-8 -*- -import unittest +"""Test CLR interface support.""" import Python.Test as Test +import pytest -from _compat import DictProxyType +from ._compat import DictProxyType -class InterfaceTests(unittest.TestCase): - """Test CLR interface support.""" +def test_interface_standard_attrs(): + """Test standard class attributes.""" + from Python.Test import IPublicInterface - def test_interface_standard_attrs(self): - """Test standard class attributes.""" - from Python.Test import IPublicInterface + assert IPublicInterface.__name__ == 'IPublicInterface' + assert IPublicInterface.__module__ == 'Python.Test' + assert isinstance(IPublicInterface.__dict__, DictProxyType) - self.assertTrue(IPublicInterface.__name__ == 'IPublicInterface') - self.assertTrue(IPublicInterface.__module__ == 'Python.Test') - self.assertTrue(isinstance(IPublicInterface.__dict__, DictProxyType)) - def test_global_interface_visibility(self): - """Test visibility of module-level interfaces.""" - from Python.Test import IPublicInterface +def test_global_interface_visibility(): + """Test visibility of module-level interfaces.""" + from Python.Test import IPublicInterface - self.assertTrue(IPublicInterface.__name__ == 'IPublicInterface') + assert IPublicInterface.__name__ == 'IPublicInterface' - with self.assertRaises(ImportError): - from Python.Test import IInternalInterface - _ = IInternalInterface + with pytest.raises(ImportError): + from Python.Test import IInternalInterface + _ = IInternalInterface - with self.assertRaises(AttributeError): - _ = Test.IInternalInterface + with pytest.raises(AttributeError): + _ = Test.IInternalInterface - def test_nested_interface_visibility(self): - """Test visibility of nested interfaces.""" - from Python.Test import InterfaceTest - ob = InterfaceTest.IPublic - self.assertTrue(ob.__name__ == 'IPublic') +def test_nested_interface_visibility(): + """Test visibility of nested interfaces.""" + from Python.Test import InterfaceTest - ob = InterfaceTest.IProtected - self.assertTrue(ob.__name__ == 'IProtected') + ob = InterfaceTest.IPublic + assert ob.__name__ == 'IPublic' - with self.assertRaises(AttributeError): - _ = InterfaceTest.IInternal + ob = InterfaceTest.IProtected + assert ob.__name__ == 'IProtected' - with self.assertRaises(AttributeError): - _ = InterfaceTest.IPrivate + with pytest.raises(AttributeError): + _ = InterfaceTest.IInternal - def test_explicit_cast_to_interface(self): - """Test explicit cast to an interface.""" - from Python.Test import InterfaceTest + with pytest.raises(AttributeError): + _ = InterfaceTest.IPrivate - ob = InterfaceTest() - self.assertTrue(type(ob).__name__ == 'InterfaceTest') - self.assertTrue(hasattr(ob, 'HelloProperty')) - i1 = Test.ISayHello1(ob) - self.assertTrue(type(i1).__name__ == 'ISayHello1') - self.assertTrue(hasattr(i1, 'SayHello')) - self.assertTrue(i1.SayHello() == 'hello 1') - self.assertFalse(hasattr(i1, 'HelloProperty')) +def test_explicit_cast_to_interface(): + """Test explicit cast to an interface.""" + from Python.Test import InterfaceTest - i2 = Test.ISayHello2(ob) - self.assertTrue(type(i2).__name__ == 'ISayHello2') - self.assertTrue(i2.SayHello() == 'hello 2') - self.assertTrue(hasattr(i2, 'SayHello')) - self.assertFalse(hasattr(i2, 'HelloProperty')) + ob = InterfaceTest() + assert type(ob).__name__ == 'InterfaceTest' + assert hasattr(ob, 'HelloProperty') + i1 = Test.ISayHello1(ob) + assert type(i1).__name__ == 'ISayHello1' + assert hasattr(i1, 'SayHello') + assert i1.SayHello() == 'hello 1' + assert not hasattr(i1, 'HelloProperty') -def test_suite(): - return unittest.makeSuite(InterfaceTests) + i2 = Test.ISayHello2(ob) + assert type(i2).__name__ == 'ISayHello2' + assert i2.SayHello() == 'hello 2' + assert hasattr(i2, 'SayHello') + assert not hasattr(i2, 'HelloProperty') diff --git a/src/tests/test_method.py b/src/tests/test_method.py index 6c4454004..f8b2acf09 100644 --- a/src/tests/test_method.py +++ b/src/tests/test_method.py @@ -1,713 +1,745 @@ # -*- coding: utf-8 -*- -import unittest +"""Test CLR method support.""" import System +import pytest from Python.Test import MethodTest -from _compat import PY2, long, unichr +from ._compat import PY2, long, unichr -class MethodTests(unittest.TestCase): - """Test CLR method support.""" +def test_instance_method_descriptor(): + """Test instance method descriptor behavior.""" - def test_instance_method_descriptor(self): - """Test instance method descriptor behavior.""" + with pytest.raises(AttributeError): + MethodTest().PublicMethod = 0 - with self.assertRaises(AttributeError): - MethodTest().PublicMethod = 0 + with pytest.raises(AttributeError): + MethodTest.PublicMethod = 0 - with self.assertRaises(AttributeError): - MethodTest.PublicMethod = 0 + with pytest.raises(AttributeError): + del MethodTest().PublicMethod - with self.assertRaises(AttributeError): - del MethodTest().PublicMethod + with pytest.raises(AttributeError): + del MethodTest.PublicMethod - with self.assertRaises(AttributeError): - del MethodTest.PublicMethod - def test_static_method_descriptor(self): - """Test static method descriptor behavior.""" +def test_static_method_descriptor(): + """Test static method descriptor behavior.""" - with self.assertRaises(AttributeError): - MethodTest().PublicStaticMethod = 0 + with pytest.raises(AttributeError): + MethodTest().PublicStaticMethod = 0 - with self.assertRaises(AttributeError): - MethodTest.PublicStaticMethod = 0 + with pytest.raises(AttributeError): + MethodTest.PublicStaticMethod = 0 - with self.assertRaises(AttributeError): - del MethodTest().PublicStaticMethod + with pytest.raises(AttributeError): + del MethodTest().PublicStaticMethod - with self.assertRaises(AttributeError): - del MethodTest.PublicStaticMethod + with pytest.raises(AttributeError): + del MethodTest.PublicStaticMethod - def test_public_instance_method(self): - """Test public instance method visibility.""" - ob = MethodTest() - self.assertTrue(ob.PublicMethod() == "public") - def test_public_static_method(self): - """Test public static method visibility.""" - ob = MethodTest() - self.assertTrue(MethodTest.PublicStaticMethod() == "public static") - self.assertTrue(ob.PublicStaticMethod() == "public static") +def test_public_instance_method(): + """Test public instance method visibility.""" + ob = MethodTest() + assert ob.PublicMethod() == "public" - def test_protected_instance_method(self): - """Test protected instance method visibility.""" - ob = MethodTest() - self.assertTrue(ob.ProtectedMethod() == "protected") - def test_protected_static_method(self): - """Test protected static method visibility.""" - ob = MethodTest() - result = "protected static" - self.assertTrue(MethodTest.ProtectedStaticMethod() == result) - self.assertTrue(ob.ProtectedStaticMethod() == result) +def test_public_static_method(): + """Test public static method visibility.""" + ob = MethodTest() + assert MethodTest.PublicStaticMethod() == "public static" + assert ob.PublicStaticMethod() == "public static" - def test_internal_method(self): - """Test internal method visibility.""" - with self.assertRaises(AttributeError): - _ = MethodTest().InternalMethod +def test_protected_instance_method(): + """Test protected instance method visibility.""" + ob = MethodTest() + assert ob.ProtectedMethod() == "protected" - with self.assertRaises(AttributeError): - _ = MethodTest.InternalMethod - with self.assertRaises(AttributeError): - _ = MethodTest().InternalStaticMethod +def test_protected_static_method(): + """Test protected static method visibility.""" + ob = MethodTest() + result = "protected static" + assert MethodTest.ProtectedStaticMethod() == result + assert ob.ProtectedStaticMethod() == result - with self.assertRaises(AttributeError): - _ = MethodTest.InternalStaticMethod - def test_private_method(self): - """Test private method visibility.""" +def test_internal_method(): + """Test internal method visibility.""" - with self.assertRaises(AttributeError): - _ = MethodTest().PrivateMethod + with pytest.raises(AttributeError): + _ = MethodTest().InternalMethod - with self.assertRaises(AttributeError): - _ = MethodTest.PrivateMethod + with pytest.raises(AttributeError): + _ = MethodTest.InternalMethod - with self.assertRaises(AttributeError): - _ = MethodTest().PrivateStaticMethod + with pytest.raises(AttributeError): + _ = MethodTest().InternalStaticMethod - with self.assertRaises(AttributeError): - _ = MethodTest.PrivateStaticMethod + with pytest.raises(AttributeError): + _ = MethodTest.InternalStaticMethod - def test_unbound_managed_method_call(self): - """Test calling unbound managed methods.""" - from Python.Test import MethodTestSub - ob = MethodTest() - self.assertTrue(MethodTest.PublicMethod(ob) == "public") +def test_private_method(): + """Test private method visibility.""" - with self.assertRaises(TypeError): - MethodTest.PublicMethod() + with pytest.raises(AttributeError): + _ = MethodTest().PrivateMethod - ob = MethodTestSub() - self.assertTrue(MethodTestSub.PublicMethod(ob) == "public") - self.assertTrue(MethodTestSub.PublicMethod(ob, "echo") == "echo") + with pytest.raises(AttributeError): + _ = MethodTest.PrivateMethod - with self.assertRaises(TypeError): - MethodTestSub.PublicMethod("echo") + with pytest.raises(AttributeError): + _ = MethodTest().PrivateStaticMethod - def test_overloaded_method_inheritance(self): - """Test that overloads are inherited properly.""" - from Python.Test import MethodTestSub + with pytest.raises(AttributeError): + _ = MethodTest.PrivateStaticMethod - ob = MethodTest() - self.assertTrue(ob.PublicMethod() == "public") - with self.assertRaises(TypeError): - ob = MethodTest() - ob.PublicMethod("echo") +def test_unbound_managed_method_call(): + """Test calling unbound managed methods.""" + from Python.Test import MethodTestSub - ob = MethodTestSub() - self.assertTrue(ob.PublicMethod() == "public") + ob = MethodTest() + assert MethodTest.PublicMethod(ob) == "public" - self.assertTrue(ob.PublicMethod("echo") == "echo") + with pytest.raises(TypeError): + MethodTest.PublicMethod() - def test_method_descriptor_abuse(self): - """Test method descriptor abuse.""" - desc = MethodTest.__dict__['PublicMethod'] + ob = MethodTestSub() + assert MethodTestSub.PublicMethod(ob) == "public" + assert MethodTestSub.PublicMethod(ob, "echo") == "echo" - with self.assertRaises(TypeError): - desc.__get__(0, 0) + with pytest.raises(TypeError): + MethodTestSub.PublicMethod("echo") - with self.assertRaises(AttributeError): - desc.__set__(0, 0) - def test_method_docstrings(self): - """Test standard method docstring generation""" - method = MethodTest.GetType - value = 'System.Type GetType()' - self.assertTrue(method.__doc__ == value) +def test_overloaded_method_inheritance(): + """Test that overloads are inherited properly.""" + from Python.Test import MethodTestSub - # ====================================================================== - # Tests of specific argument and result conversion scenarios - # ====================================================================== - - def test_method_call_enum_conversion(self): - """Test enum conversion in method call.""" - from System import TypeCode + ob = MethodTest() + assert ob.PublicMethod() == "public" + with pytest.raises(TypeError): ob = MethodTest() - r = ob.TestEnumConversion(TypeCode.Int32) - self.assertTrue(r == TypeCode.Int32) + ob.PublicMethod("echo") - def test_method_call_flags_conversion(self): - """Test flags conversion in method call.""" - from System.IO import FileAccess + ob = MethodTestSub() + assert ob.PublicMethod() == "public" - ob = MethodTest() - flags = FileAccess.Read | FileAccess.Write - r = ob.TestFlagsConversion(flags) - self.assertTrue(r == flags) + assert ob.PublicMethod("echo") == "echo" - def test_method_call_struct_conversion(self): - """Test struct conversion in method call.""" - from System import Guid - ob = MethodTest() - guid = Guid.NewGuid() - temp = guid.ToString() - r = ob.TestStructConversion(guid) - self.assertTrue(r.ToString() == temp) +def test_method_descriptor_abuse(): + """Test method descriptor abuse.""" + desc = MethodTest.__dict__['PublicMethod'] - def test_subclass_instance_conversion(self): - """Test subclass instance conversion in method call.""" + with pytest.raises(TypeError): + desc.__get__(0, 0) - class TestSubException(System.Exception): - pass + with pytest.raises(AttributeError): + desc.__set__(0, 0) - ob = MethodTest() - instance = TestSubException() - result = ob.TestSubclassConversion(instance) - self.assertTrue(isinstance(result, System.Exception)) - def test_null_array_conversion(self): - """Test null array conversion in method call.""" - ob = MethodTest() - r = ob.TestNullArrayConversion(None) - self.assertTrue(r is None) - - def test_string_params_args(self): - """Test use of string params.""" - result = MethodTest.TestStringParamsArg('one', 'two', 'three') - self.assertEqual(result.Length, 3) - self.assertEqual(len(result), 3, result) - self.assertTrue(result[0] == 'one') - self.assertTrue(result[1] == 'two') - self.assertTrue(result[2] == 'three') - - result = MethodTest.TestStringParamsArg(['one', 'two', 'three']) - self.assertTrue(len(result) == 3) - self.assertTrue(result[0] == 'one') - self.assertTrue(result[1] == 'two') - self.assertTrue(result[2] == 'three') - - def test_object_params_args(self): - """Test use of object params.""" - result = MethodTest.TestObjectParamsArg('one', 'two', 'three') - self.assertEqual(len(result), 3, result) - self.assertTrue(result[0] == 'one') - self.assertTrue(result[1] == 'two') - self.assertTrue(result[2] == 'three') - - result = MethodTest.TestObjectParamsArg(['one', 'two', 'three']) - self.assertEqual(len(result), 3, result) - self.assertTrue(result[0] == 'one') - self.assertTrue(result[1] == 'two') - self.assertTrue(result[2] == 'three') - - def test_value_params_args(self): - """Test use of value type params.""" - result = MethodTest.TestValueParamsArg(1, 2, 3) - self.assertEqual(len(result), 3) - self.assertTrue(result[0] == 1) - self.assertTrue(result[1] == 2) - self.assertTrue(result[2] == 3) - - result = MethodTest.TestValueParamsArg([1, 2, 3]) - self.assertEqual(len(result), 3) - self.assertTrue(result[0] == 1) - self.assertTrue(result[1] == 2) - self.assertTrue(result[2] == 3) - - def test_non_params_array_in_last_place(self): - """Test overload resolution with of non-"params" array as - last parameter.""" - result = MethodTest.TestNonParamsArrayInLastPlace(1, 2, 3) - self.assertTrue(result) - - def test_string_out_params(self): - """Test use of string out-parameters.""" - result = MethodTest.TestStringOutParams("hi", "there") - self.assertTrue(isinstance(result, tuple)) - self.assertEqual(len(result), 2) - self.assertTrue(result[0] is True) - self.assertTrue(result[1] == "output string") - - result = MethodTest.TestStringOutParams("hi", None) - self.assertTrue(isinstance(result, tuple)) - self.assertEqual(len(result), 2) - self.assertTrue(result[0] is True) - self.assertTrue(result[1] == "output string") - - def test_string_ref_params(self): - """Test use of string byref parameters.""" - result = MethodTest.TestStringRefParams("hi", "there") - self.assertTrue(isinstance(result, tuple)) - self.assertEqual(len(result), 2) - self.assertTrue(result[0] is True) - self.assertTrue(result[1] == "output string") - - result = MethodTest.TestStringRefParams("hi", None) - self.assertTrue(isinstance(result, tuple)) - self.assertEqual(len(result), 2) - self.assertTrue(result[0] is True) - self.assertTrue(result[1] == "output string") - - def test_value_out_params(self): - """Test use of value type out-parameters.""" - result = MethodTest.TestValueOutParams("hi", 1) - self.assertTrue(isinstance(result, tuple)) - self.assertEqual(len(result), 2) - self.assertTrue(result[0] is True) - self.assertTrue(result[1] == 42) - - # None cannot be converted to a value type like int, long, etc. - with self.assertRaises(TypeError): - MethodTest.TestValueOutParams("hi", None) - - def test_value_ref_params(self): - """Test use of value type byref parameters.""" - result = MethodTest.TestValueRefParams("hi", 1) - self.assertTrue(isinstance(result, tuple)) - self.assertEqual(len(result), 2) - self.assertTrue(result[0] is True) - self.assertTrue(result[1] == 42) - - # None cannot be converted to a value type like int, long, etc. - with self.assertRaises(TypeError): - MethodTest.TestValueRefParams("hi", None) - - def test_object_out_params(self): - """Test use of object out-parameters.""" - result = MethodTest.TestObjectOutParams("hi", MethodTest()) - self.assertTrue(isinstance(result, tuple)) - self.assertTrue(len(result) == 2) - self.assertTrue(result[0] is True) - self.assertTrue(isinstance(result[1], System.Exception)) - - result = MethodTest.TestObjectOutParams("hi", None) - self.assertTrue(isinstance(result, tuple)) - self.assertEqual(len(result), 2) - self.assertTrue(result[0] is True) - self.assertTrue(isinstance(result[1], System.Exception)) - - def test_object_ref_params(self): - """Test use of object byref parameters.""" - result = MethodTest.TestObjectRefParams("hi", MethodTest()) - self.assertTrue(isinstance(result, tuple)) - self.assertEqual(len(result), 2) - self.assertTrue(result[0] is True) - self.assertTrue(isinstance(result[1], System.Exception)) - - result = MethodTest.TestObjectRefParams("hi", None) - self.assertTrue(isinstance(result, tuple)) - self.assertEqual(len(result), 2) - self.assertTrue(result[0] is True) - self.assertTrue(isinstance(result[1], System.Exception)) - - def test_struct_out_params(self): - """Test use of struct out-parameters.""" - result = MethodTest.TestStructOutParams("hi", System.Guid.NewGuid()) - self.assertTrue(isinstance(result, tuple)) - self.assertEqual(len(result), 2) - self.assertTrue(result[0] is True) - self.assertTrue(isinstance(result[1], System.Guid)) - - # None cannot be converted to a value type like a struct - with self.assertRaises(TypeError): - MethodTest.TestValueRefParams("hi", None) - - def test_struct_ref_params(self): - """Test use of struct byref parameters.""" - result = MethodTest.TestStructRefParams("hi", System.Guid.NewGuid()) - self.assertTrue(isinstance(result, tuple)) - self.assertTrue(len(result) == 2) - self.assertTrue(result[0] is True) - self.assertTrue(isinstance(result[1], System.Guid)) - - # None cannot be converted to a value type like a struct - with self.assertRaises(TypeError): - MethodTest.TestValueRefParams("hi", None) - - def test_void_single_out_param(self): - """Test void method with single out-parameter.""" - result = MethodTest.TestVoidSingleOutParam(9) - self.assertTrue(result == 42) - - # None cannot be converted to a value type - with self.assertRaises(TypeError): - MethodTest.TestVoidSingleOutParam(None) - - def test_void_single_ref_param(self): - """Test void method with single ref-parameter.""" - result = MethodTest.TestVoidSingleRefParam(9) - self.assertTrue(result == 42) - - # None cannot be converted to a value type - with self.assertRaises(TypeError): - MethodTest.TestVoidSingleRefParam(None) - - def test_single_default_param(self): - """Test void method with single ref-parameter.""" - result = MethodTest.TestSingleDefaultParam() - self.assertTrue(result == 5) - - def test_one_arg_and_two_default_param(self): - """Test void method with single ref-parameter.""" - result = MethodTest.TestOneArgAndTwoDefaultParam(11) - self.assertTrue(result == 22) - - result = MethodTest.TestOneArgAndTwoDefaultParam(15) - self.assertTrue(result == 26) - - result = MethodTest.TestOneArgAndTwoDefaultParam(20) - self.assertTrue(result == 31) - - def test_two_default_param(self): - """Test void method with single ref-parameter.""" - result = MethodTest.TestTwoDefaultParam() - self.assertTrue(result == 11) - - def test_explicit_selection_with_out_modifier(self): - """Check explicit overload selection with out modifiers.""" - refstr = System.String("").GetType().MakeByRefType() - result = MethodTest.TestStringOutParams.__overloads__[str, refstr]( - "hi", "there") - self.assertTrue(isinstance(result, tuple)) - self.assertTrue(len(result) == 2) - self.assertTrue(result[0] is True) - self.assertTrue(result[1] == "output string") - - result = MethodTest.TestStringOutParams.__overloads__[str, refstr]( - "hi", None) - self.assertTrue(isinstance(result, tuple)) - self.assertTrue(len(result) == 2) - self.assertTrue(result[0] is True) - self.assertTrue(result[1] == "output string") - - def test_explicit_selection_with_ref_modifier(self): - """Check explicit overload selection with ref modifiers.""" - refstr = System.String("").GetType().MakeByRefType() - result = MethodTest.TestStringRefParams.__overloads__[str, refstr]( - "hi", "there") - self.assertTrue(isinstance(result, tuple)) - self.assertTrue(len(result) == 2) - self.assertTrue(result[0] is True) - self.assertTrue(result[1] == "output string") - - result = MethodTest.TestStringRefParams.__overloads__[str, refstr]( - "hi", None) - self.assertTrue(isinstance(result, tuple)) - self.assertTrue(len(result) == 2) - self.assertTrue(result[0] is True) - self.assertTrue(result[1] == "output string") - - def test_explicit_overload_selection(self): - """Check explicit overload selection using [] syntax.""" - from Python.Test import ISayHello1, InterfaceTest, ShortEnum - from System import Array - - inst = InterfaceTest() - - value = MethodTest.Overloaded.__overloads__[System.Boolean](True) - self.assertTrue(value is True) - - value = MethodTest.Overloaded.__overloads__[bool](True) - self.assertTrue(value is True) - - value = MethodTest.Overloaded.__overloads__[System.Byte](255) - self.assertTrue(value == 255) - - value = MethodTest.Overloaded.__overloads__[System.SByte](127) - self.assertTrue(value == 127) - - value = MethodTest.Overloaded.__overloads__[System.Char](u'A') - self.assertTrue(value == u'A') - - value = MethodTest.Overloaded.__overloads__[System.Char](65535) - self.assertTrue(value == unichr(65535)) - - value = MethodTest.Overloaded.__overloads__[System.Int16](32767) - self.assertTrue(value == 32767) - - value = MethodTest.Overloaded.__overloads__[System.Int32](2147483647) - self.assertTrue(value == 2147483647) - - value = MethodTest.Overloaded.__overloads__[int](2147483647) - self.assertTrue(value == 2147483647) - - value = MethodTest.Overloaded.__overloads__[System.Int64]( - long(9223372036854775807)) - self.assertTrue(value == long(9223372036854775807)) +def test_method_docstrings(): + """Test standard method docstring generation""" + method = MethodTest.GetType + value = 'System.Type GetType()' + assert method.__doc__ == value - # Python 3 has no explicit long type, use System.Int64 instead - if PY2: - value = MethodTest.Overloaded.__overloads__[long]( - long(9223372036854775807)) - self.assertTrue(value == long(9223372036854775807)) - value = MethodTest.Overloaded.__overloads__[System.UInt16](65000) - self.assertTrue(value == 65000) +# ====================================================================== +# Tests of specific argument and result conversion scenarios +# ====================================================================== +def test_method_call_enum_conversion(): + """Test enum conversion in method call.""" + from System import TypeCode - value = MethodTest.Overloaded.__overloads__[System.UInt32]( - long(4294967295)) - self.assertTrue(value == long(4294967295)) + ob = MethodTest() + r = ob.TestEnumConversion(TypeCode.Int32) + assert r == TypeCode.Int32 - value = MethodTest.Overloaded.__overloads__[System.UInt64]( - long(18446744073709551615)) - self.assertTrue(value == long(18446744073709551615)) - value = MethodTest.Overloaded.__overloads__[System.Single](3.402823e38) - self.assertTrue(value == 3.402823e38) +def test_method_call_flags_conversion(): + """Test flags conversion in method call.""" + from System.IO import FileAccess - value = MethodTest.Overloaded.__overloads__[System.Double]( - 1.7976931348623157e308) - self.assertTrue(value == 1.7976931348623157e308) + ob = MethodTest() + flags = FileAccess.Read | FileAccess.Write + r = ob.TestFlagsConversion(flags) + assert r == flags - value = MethodTest.Overloaded.__overloads__[float]( - 1.7976931348623157e308) - self.assertTrue(value == 1.7976931348623157e308) - value = MethodTest.Overloaded.__overloads__[System.Decimal]( - System.Decimal.One) - self.assertTrue(value == System.Decimal.One) +def test_method_call_struct_conversion(): + """Test struct conversion in method call.""" + from System import Guid - value = MethodTest.Overloaded.__overloads__[System.String]("spam") - self.assertTrue(value == "spam") + ob = MethodTest() + guid = Guid.NewGuid() + temp = guid.ToString() + r = ob.TestStructConversion(guid) + assert r.ToString() == temp - value = MethodTest.Overloaded.__overloads__[str]("spam") - self.assertTrue(value == "spam") - value = MethodTest.Overloaded.__overloads__[ShortEnum](ShortEnum.Zero) - self.assertTrue(value == ShortEnum.Zero) +def test_subclass_instance_conversion(): + """Test subclass instance conversion in method call.""" - value = MethodTest.Overloaded.__overloads__[System.Object](inst) - self.assertTrue(value.__class__ == inst.__class__) + class TestSubException(System.Exception): + pass - value = MethodTest.Overloaded.__overloads__[InterfaceTest](inst) - self.assertTrue(value.__class__ == inst.__class__) + ob = MethodTest() + instance = TestSubException() + result = ob.TestSubclassConversion(instance) + assert isinstance(result, System.Exception) - value = MethodTest.Overloaded.__overloads__[ISayHello1](inst) - self.assertTrue(value.__class__ == inst.__class__) - atype = Array[System.Object] - value = MethodTest.Overloaded.__overloads__[str, int, atype]( - "one", 1, atype([1, 2, 3])) - self.assertTrue(value == 3) +def test_null_array_conversion(): + """Test null array conversion in method call.""" + ob = MethodTest() + r = ob.TestNullArrayConversion(None) + assert r is None - value = MethodTest.Overloaded.__overloads__[str, int]("one", 1) - self.assertTrue(value == 1) - value = MethodTest.Overloaded.__overloads__[int, str](1, "one") - self.assertTrue(value == 1) +def test_string_params_args(): + """Test use of string params.""" + result = MethodTest.TestStringParamsArg('one', 'two', 'three') + assert result.Length == 3 + assert len(result) == 3, result + assert result[0] == 'one' + assert result[1] == 'two' + assert result[2] == 'three' - def test_overload_selection_with_array_types(self): - """Check overload selection using array types.""" - from Python.Test import ISayHello1, InterfaceTest, ShortEnum - from System import Array + result = MethodTest.TestStringParamsArg(['one', 'two', 'three']) + assert len(result) == 3 + assert result[0] == 'one' + assert result[1] == 'two' + assert result[2] == 'three' - inst = InterfaceTest() - vtype = Array[System.Boolean] - input_ = vtype([True, True]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] is True) - self.assertTrue(value[1] is True) +def test_object_params_args(): + """Test use of object params.""" + result = MethodTest.TestObjectParamsArg('one', 'two', 'three') + assert len(result) == 3, result + assert result[0] == 'one' + assert result[1] == 'two' + assert result[2] == 'three' - vtype = Array[bool] - input_ = vtype([True, True]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] is True) - self.assertTrue(value[1] is True) + result = MethodTest.TestObjectParamsArg(['one', 'two', 'three']) + assert len(result) == 3, result + assert result[0] == 'one' + assert result[1] == 'two' + assert result[2] == 'three' + + +def test_value_params_args(): + """Test use of value type params.""" + result = MethodTest.TestValueParamsArg(1, 2, 3) + assert len(result) == 3 + assert result[0] == 1 + assert result[1] == 2 + assert result[2] == 3 + + result = MethodTest.TestValueParamsArg([1, 2, 3]) + assert len(result) == 3 + assert result[0] == 1 + assert result[1] == 2 + assert result[2] == 3 + + +def test_non_params_array_in_last_place(): + """Test overload resolution with of non-"params" array as + last parameter.""" + result = MethodTest.TestNonParamsArrayInLastPlace(1, 2, 3) + assert result + + +def test_string_out_params(): + """Test use of string out-parameters.""" + result = MethodTest.TestStringOutParams("hi", "there") + assert isinstance(result, tuple) + assert len(result) == 2 + assert result[0] is True + assert result[1] == "output string" + + result = MethodTest.TestStringOutParams("hi", None) + assert isinstance(result, tuple) + assert len(result) == 2 + assert result[0] is True + assert result[1] == "output string" + + +def test_string_ref_params(): + """Test use of string byref parameters.""" + result = MethodTest.TestStringRefParams("hi", "there") + assert isinstance(result, tuple) + assert len(result) == 2 + assert result[0] is True + assert result[1] == "output string" + + result = MethodTest.TestStringRefParams("hi", None) + assert isinstance(result, tuple) + assert len(result) == 2 + assert result[0] is True + assert result[1] == "output string" + + +def test_value_out_params(): + """Test use of value type out-parameters.""" + result = MethodTest.TestValueOutParams("hi", 1) + assert isinstance(result, tuple) + assert len(result) == 2 + assert result[0] is True + assert result[1] == 42 + + # None cannot be converted to a value type like int, long, etc. + with pytest.raises(TypeError): + MethodTest.TestValueOutParams("hi", None) + + +def test_value_ref_params(): + """Test use of value type byref parameters.""" + result = MethodTest.TestValueRefParams("hi", 1) + assert isinstance(result, tuple) + assert len(result) == 2 + assert result[0] is True + assert result[1] == 42 + + # None cannot be converted to a value type like int, long, etc. + with pytest.raises(TypeError): + MethodTest.TestValueRefParams("hi", None) + + +def test_object_out_params(): + """Test use of object out-parameters.""" + result = MethodTest.TestObjectOutParams("hi", MethodTest()) + assert isinstance(result, tuple) + assert len(result) == 2 + assert result[0] is True + assert isinstance(result[1], System.Exception) + + result = MethodTest.TestObjectOutParams("hi", None) + assert isinstance(result, tuple) + assert len(result) == 2 + assert result[0] is True + assert isinstance(result[1], System.Exception) + + +def test_object_ref_params(): + """Test use of object byref parameters.""" + result = MethodTest.TestObjectRefParams("hi", MethodTest()) + assert isinstance(result, tuple) + assert len(result) == 2 + assert result[0] is True + assert isinstance(result[1], System.Exception) + + result = MethodTest.TestObjectRefParams("hi", None) + assert isinstance(result, tuple) + assert len(result) == 2 + assert result[0] is True + assert isinstance(result[1], System.Exception) + + +def test_struct_out_params(): + """Test use of struct out-parameters.""" + result = MethodTest.TestStructOutParams("hi", System.Guid.NewGuid()) + assert isinstance(result, tuple) + assert len(result) == 2 + assert result[0] is True + assert isinstance(result[1], System.Guid) + + # None cannot be converted to a value type like a struct + with pytest.raises(TypeError): + MethodTest.TestValueRefParams("hi", None) + + +def test_struct_ref_params(): + """Test use of struct byref parameters.""" + result = MethodTest.TestStructRefParams("hi", System.Guid.NewGuid()) + assert isinstance(result, tuple) + assert len(result) == 2 + assert result[0] is True + assert isinstance(result[1], System.Guid) + + # None cannot be converted to a value type like a struct + with pytest.raises(TypeError): + MethodTest.TestValueRefParams("hi", None) + + +def test_void_single_out_param(): + """Test void method with single out-parameter.""" + result = MethodTest.TestVoidSingleOutParam(9) + assert result == 42 + + # None cannot be converted to a value type + with pytest.raises(TypeError): + MethodTest.TestVoidSingleOutParam(None) - vtype = Array[System.Byte] - input_ = vtype([0, 255]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == 255) - vtype = Array[System.SByte] - input_ = vtype([0, 127]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == 127) +def test_void_single_ref_param(): + """Test void method with single ref-parameter.""" + result = MethodTest.TestVoidSingleRefParam(9) + assert result == 42 - vtype = Array[System.Char] - input_ = vtype([u'A', u'Z']) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == u'A') - self.assertTrue(value[1] == u'Z') + # None cannot be converted to a value type + with pytest.raises(TypeError): + MethodTest.TestVoidSingleRefParam(None) - vtype = Array[System.Char] - input_ = vtype([0, 65535]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == unichr(0)) - self.assertTrue(value[1] == unichr(65535)) - vtype = Array[System.Int16] - input_ = vtype([0, 32767]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == 32767) +def test_single_default_param(): + """Test void method with single ref-parameter.""" + result = MethodTest.TestSingleDefaultParam() + assert result == 5 - vtype = Array[System.Int32] - input_ = vtype([0, 2147483647]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == 2147483647) - vtype = Array[int] - input_ = vtype([0, 2147483647]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == 2147483647) +def test_one_arg_and_two_default_param(): + """Test void method with single ref-parameter.""" + result = MethodTest.TestOneArgAndTwoDefaultParam(11) + assert result == 22 - vtype = Array[System.Int64] - input_ = vtype([0, long(9223372036854775807)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == long(9223372036854775807)) - - # Python 3 has no explicit long type, use System.Int64 instead - if PY2: - vtype = Array[long] - input_ = vtype([0, long(9223372036854775807)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == long(9223372036854775807)) - - vtype = Array[System.UInt16] - input_ = vtype([0, 65000]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == 65000) + result = MethodTest.TestOneArgAndTwoDefaultParam(15) + assert result == 26 - vtype = Array[System.UInt32] - input_ = vtype([0, long(4294967295)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == long(4294967295)) + result = MethodTest.TestOneArgAndTwoDefaultParam(20) + assert result == 31 - vtype = Array[System.UInt64] - input_ = vtype([0, long(18446744073709551615)]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == 0) - self.assertTrue(value[1] == long(18446744073709551615)) - vtype = Array[System.Single] - input_ = vtype([0.0, 3.402823e38]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == 0.0) - self.assertTrue(value[1] == 3.402823e38) +def test_two_default_param(): + """Test void method with single ref-parameter.""" + result = MethodTest.TestTwoDefaultParam() + assert result == 11 - vtype = Array[System.Double] - input_ = vtype([0.0, 1.7976931348623157e308]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == 0.0) - self.assertTrue(value[1] == 1.7976931348623157e308) - vtype = Array[float] - input_ = vtype([0.0, 1.7976931348623157e308]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == 0.0) - self.assertTrue(value[1] == 1.7976931348623157e308) +def test_explicit_selection_with_out_modifier(): + """Check explicit overload selection with out modifiers.""" + refstr = System.String("").GetType().MakeByRefType() + result = MethodTest.TestStringOutParams.__overloads__[str, refstr]( + "hi", "there") + assert isinstance(result, tuple) + assert len(result) == 2 + assert result[0] is True + assert result[1] == "output string" - vtype = Array[System.Decimal] - input_ = vtype([System.Decimal.Zero, System.Decimal.One]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == System.Decimal.Zero) - self.assertTrue(value[1] == System.Decimal.One) + result = MethodTest.TestStringOutParams.__overloads__[str, refstr]( + "hi", None) + assert isinstance(result, tuple) + assert len(result) == 2 + assert result[0] is True + assert result[1] == "output string" - vtype = Array[System.String] - input_ = vtype(["one", "two"]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == "one") - self.assertTrue(value[1] == "two") - vtype = Array[str] - input_ = vtype(["one", "two"]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == "one") - self.assertTrue(value[1] == "two") +def test_explicit_selection_with_ref_modifier(): + """Check explicit overload selection with ref modifiers.""" + refstr = System.String("").GetType().MakeByRefType() + result = MethodTest.TestStringRefParams.__overloads__[str, refstr]( + "hi", "there") + assert isinstance(result, tuple) + assert len(result) == 2 + assert result[0] is True + assert result[1] == "output string" - vtype = Array[ShortEnum] - input_ = vtype([ShortEnum.Zero, ShortEnum.One]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0] == ShortEnum.Zero) - self.assertTrue(value[1] == ShortEnum.One) + result = MethodTest.TestStringRefParams.__overloads__[str, refstr]( + "hi", None) + assert isinstance(result, tuple) + assert len(result) == 2 + assert result[0] is True + assert result[1] == "output string" - vtype = Array[System.Object] - input_ = vtype([inst, inst]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].__class__ == inst.__class__) - self.assertTrue(value[1].__class__ == inst.__class__) - vtype = Array[InterfaceTest] - input_ = vtype([inst, inst]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].__class__ == inst.__class__) - self.assertTrue(value[1].__class__ == inst.__class__) +def test_explicit_overload_selection(): + """Check explicit overload selection using [] syntax.""" + from Python.Test import ISayHello1, InterfaceTest, ShortEnum + from System import Array - vtype = Array[ISayHello1] - input_ = vtype([inst, inst]) - value = MethodTest.Overloaded.__overloads__[vtype](input_) - self.assertTrue(value[0].__class__ == inst.__class__) - self.assertTrue(value[1].__class__ == inst.__class__) + inst = InterfaceTest() + + value = MethodTest.Overloaded.__overloads__[System.Boolean](True) + assert value is True - def test_explicit_overload_selection_failure(self): - """Check that overload selection fails correctly.""" + value = MethodTest.Overloaded.__overloads__[bool](True) + assert value is True - with self.assertRaises(TypeError): - _ = MethodTest.Overloaded.__overloads__[System.Type](True) + value = MethodTest.Overloaded.__overloads__[System.Byte](255) + assert value == 255 - with self.assertRaises(TypeError): - _ = MethodTest.Overloaded.__overloads__[int, int](1, 1) + value = MethodTest.Overloaded.__overloads__[System.SByte](127) + assert value == 127 - with self.assertRaises(TypeError): - _ = MethodTest.Overloaded.__overloads__[str, int, int]("", 1, 1) + value = MethodTest.Overloaded.__overloads__[System.Char](u'A') + assert value == u'A' - with self.assertRaises(TypeError): - _ = MethodTest.Overloaded.__overloads__[int, long](1) + value = MethodTest.Overloaded.__overloads__[System.Char](65535) + assert value == unichr(65535) - def test_we_can_bind_to_encoding_get_string(self): - """Check that we can bind to the Encoding.GetString method - with variables.""" - from System.Text import Encoding - from System.IO import MemoryStream + value = MethodTest.Overloaded.__overloads__[System.Int16](32767) + assert value == 32767 - my_bytes = Encoding.UTF8.GetBytes('Some testing string') - stream = MemoryStream() - stream.Write(my_bytes, 0, my_bytes.Length) - stream.Position = 0 + value = MethodTest.Overloaded.__overloads__[System.Int32](2147483647) + assert value == 2147483647 - buff = System.Array.CreateInstance(System.Byte, 3) - buff.Initialize() - data = [] - read = 1 + value = MethodTest.Overloaded.__overloads__[int](2147483647) + assert value == 2147483647 - while read > 0: - read, _ = stream.Read(buff, 0, buff.Length) - temp = Encoding.UTF8.GetString(buff, 0, read) - data.append(temp) + value = MethodTest.Overloaded.__overloads__[System.Int64]( + long(9223372036854775807)) + assert value == long(9223372036854775807) - data = ''.join(data) - self.assertEqual(data, 'Some testing string') + # Python 3 has no explicit long type, use System.Int64 instead + if PY2: + value = MethodTest.Overloaded.__overloads__[long]( + long(9223372036854775807)) + assert value == long(9223372036854775807) + + value = MethodTest.Overloaded.__overloads__[System.UInt16](65000) + assert value == 65000 + + value = MethodTest.Overloaded.__overloads__[System.UInt32]( + long(4294967295)) + assert value == long(4294967295) + value = MethodTest.Overloaded.__overloads__[System.UInt64]( + long(18446744073709551615)) + assert value == long(18446744073709551615) -def test_suite(): - return unittest.makeSuite(MethodTests) + value = MethodTest.Overloaded.__overloads__[System.Single](3.402823e38) + assert value == 3.402823e38 + + value = MethodTest.Overloaded.__overloads__[System.Double]( + 1.7976931348623157e308) + assert value == 1.7976931348623157e308 + + value = MethodTest.Overloaded.__overloads__[float]( + 1.7976931348623157e308) + assert value == 1.7976931348623157e308 + + value = MethodTest.Overloaded.__overloads__[System.Decimal]( + System.Decimal.One) + assert value == System.Decimal.One + + value = MethodTest.Overloaded.__overloads__[System.String]("spam") + assert value == "spam" + + value = MethodTest.Overloaded.__overloads__[str]("spam") + assert value == "spam" + + value = MethodTest.Overloaded.__overloads__[ShortEnum](ShortEnum.Zero) + assert value == ShortEnum.Zero + + value = MethodTest.Overloaded.__overloads__[System.Object](inst) + assert value.__class__ == inst.__class__ + + value = MethodTest.Overloaded.__overloads__[InterfaceTest](inst) + assert value.__class__ == inst.__class__ + + value = MethodTest.Overloaded.__overloads__[ISayHello1](inst) + assert value.__class__ == inst.__class__ + + atype = Array[System.Object] + value = MethodTest.Overloaded.__overloads__[str, int, atype]( + "one", 1, atype([1, 2, 3])) + assert value == 3 + + value = MethodTest.Overloaded.__overloads__[str, int]("one", 1) + assert value == 1 + + value = MethodTest.Overloaded.__overloads__[int, str](1, "one") + assert value == 1 + + +def test_overload_selection_with_array_types(): + """Check overload selection using array types.""" + from Python.Test import ISayHello1, InterfaceTest, ShortEnum + from System import Array + + inst = InterfaceTest() + + vtype = Array[System.Boolean] + input_ = vtype([True, True]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] is True + assert value[1] is True + + vtype = Array[bool] + input_ = vtype([True, True]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] is True + assert value[1] is True + + vtype = Array[System.Byte] + input_ = vtype([0, 255]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == 0 + assert value[1] == 255 + + vtype = Array[System.SByte] + input_ = vtype([0, 127]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == 0 + assert value[1] == 127 + + vtype = Array[System.Char] + input_ = vtype([u'A', u'Z']) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == u'A' + assert value[1] == u'Z' + + vtype = Array[System.Char] + input_ = vtype([0, 65535]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == unichr(0) + assert value[1] == unichr(65535) + + vtype = Array[System.Int16] + input_ = vtype([0, 32767]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == 0 + assert value[1] == 32767 + + vtype = Array[System.Int32] + input_ = vtype([0, 2147483647]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == 0 + assert value[1] == 2147483647 + + vtype = Array[int] + input_ = vtype([0, 2147483647]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == 0 + assert value[1] == 2147483647 + + vtype = Array[System.Int64] + input_ = vtype([0, long(9223372036854775807)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == 0 + assert value[1] == long(9223372036854775807) + + # Python 3 has no explicit long type, use System.Int64 instead + if PY2: + vtype = Array[long] + input_ = vtype([0, long(9223372036854775807)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == 0 + assert value[1] == long(9223372036854775807) + + vtype = Array[System.UInt16] + input_ = vtype([0, 65000]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == 0 + assert value[1] == 65000 + + vtype = Array[System.UInt32] + input_ = vtype([0, long(4294967295)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == 0 + assert value[1] == long(4294967295) + + vtype = Array[System.UInt64] + input_ = vtype([0, long(18446744073709551615)]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == 0 + assert value[1] == long(18446744073709551615) + + vtype = Array[System.Single] + input_ = vtype([0.0, 3.402823e38]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == 0.0 + assert value[1] == 3.402823e38 + + vtype = Array[System.Double] + input_ = vtype([0.0, 1.7976931348623157e308]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == 0.0 + assert value[1] == 1.7976931348623157e308 + + vtype = Array[float] + input_ = vtype([0.0, 1.7976931348623157e308]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == 0.0 + assert value[1] == 1.7976931348623157e308 + + vtype = Array[System.Decimal] + input_ = vtype([System.Decimal.Zero, System.Decimal.One]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == System.Decimal.Zero + assert value[1] == System.Decimal.One + + vtype = Array[System.String] + input_ = vtype(["one", "two"]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == "one" + assert value[1] == "two" + + vtype = Array[str] + input_ = vtype(["one", "two"]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == "one" + assert value[1] == "two" + + vtype = Array[ShortEnum] + input_ = vtype([ShortEnum.Zero, ShortEnum.One]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0] == ShortEnum.Zero + assert value[1] == ShortEnum.One + + vtype = Array[System.Object] + input_ = vtype([inst, inst]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].__class__ == inst.__class__ + assert value[1].__class__ == inst.__class__ + + vtype = Array[InterfaceTest] + input_ = vtype([inst, inst]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].__class__ == inst.__class__ + assert value[1].__class__ == inst.__class__ + + vtype = Array[ISayHello1] + input_ = vtype([inst, inst]) + value = MethodTest.Overloaded.__overloads__[vtype](input_) + assert value[0].__class__ == inst.__class__ + assert value[1].__class__ == inst.__class__ + + +def test_explicit_overload_selection_failure(): + """Check that overload selection fails correctly.""" + + with pytest.raises(TypeError): + _ = MethodTest.Overloaded.__overloads__[System.Type](True) + + with pytest.raises(TypeError): + _ = MethodTest.Overloaded.__overloads__[int, int](1, 1) + + with pytest.raises(TypeError): + _ = MethodTest.Overloaded.__overloads__[str, int, int]("", 1, 1) + + with pytest.raises(TypeError): + _ = MethodTest.Overloaded.__overloads__[int, long](1) + + +def test_we_can_bind_to_encoding_get_string(): + """Check that we can bind to the Encoding.GetString method + with variables.""" + from System.Text import Encoding + from System.IO import MemoryStream + + my_bytes = Encoding.UTF8.GetBytes('Some testing string') + stream = MemoryStream() + stream.Write(my_bytes, 0, my_bytes.Length) + stream.Position = 0 + + buff = System.Array.CreateInstance(System.Byte, 3) + buff.Initialize() + data = [] + read = 1 + + while read > 0: + read, _ = stream.Read(buff, 0, buff.Length) + temp = Encoding.UTF8.GetString(buff, 0, read) + data.append(temp) + + data = ''.join(data) + assert data == 'Some testing string' diff --git a/src/tests/test_module.py b/src/tests/test_module.py index 5ee8e6fc2..2255ea411 100644 --- a/src/tests/test_module.py +++ b/src/tests/test_module.py @@ -1,348 +1,369 @@ # -*- coding: utf-8 -*- +"""Test CLR modules and the CLR import hook.""" + import clr import time import types -import unittest import warnings from fnmatch import fnmatch -from _compat import ClassType, PY2, PY3, range -from utils import is_clr_class, is_clr_module, is_clr_root_module +import pytest + +from ._compat import ClassType, PY2, PY3, range +from .utils import is_clr_class, is_clr_module, is_clr_root_module # testImplicitAssemblyLoad() passes on deprecation warning; perfect! # # clr.AddReference('System.Windows.Forms') -class ModuleTests(unittest.TestCase): - """Test CLR modules and the CLR import hook.""" +def test_import_hook_works(): + """Test that the import hook works correctly both using the + included runtime and an external runtime. This must be + the first test run in the unit tests!""" + from System import String - def test_import_hook_works(self): - """Test that the import hook works correctly both using the - included runtime and an external runtime. This must be - the first test run in the unit tests!""" - from System import String - def test_import_clr(self): - import clr - self.assertTrue(is_clr_root_module(clr)) +def test_import_clr(): + import clr + assert is_clr_root_module(clr) - def test_version_clr(self): - import clr - self.assertTrue(clr.__version__ >= "2.2.0") - def test_preload_var(self): - import clr - self.assertTrue(clr.getPreload() is False, clr.getPreload()) +def test_version_clr(): + import clr + assert clr.__version__ >= "2.2.0" + + +def test_preload_var(): + import clr + assert clr.getPreload() is False, clr.getPreload() + clr.setPreload(False) + assert clr.getPreload() is False, clr.getPreload() + try: + clr.setPreload(True) + assert clr.getPreload() is True, clr.getPreload() + clr.setPreload(0) + assert clr.getPreload() is False, clr.getPreload() + clr.setPreload(1) + assert clr.getPreload() is True, clr.getPreload() + + import System.Configuration + content = dir(System.Configuration) + assert len(content) > 10, content + finally: clr.setPreload(False) - self.assertTrue(clr.getPreload() is False, clr.getPreload()) - try: - clr.setPreload(True) - self.assertTrue(clr.getPreload() is True, clr.getPreload()) - clr.setPreload(0) - self.assertTrue(clr.getPreload() is False, clr.getPreload()) - clr.setPreload(1) - self.assertTrue(clr.getPreload() is True, clr.getPreload()) - - import System.Configuration - content = dir(System.Configuration) - self.assertTrue(len(content) > 10, content) - finally: - clr.setPreload(False) - - def test_module_interface(self): - """Test the interface exposed by CLR module objects.""" - import System - self.assertEquals(type(System.__dict__), type({})) - self.assertEquals(System.__name__, 'System') - # the filename can be any module from the System namespace - # (eg System.Data.dll or System.dll, but also mscorlib.dll) - system_file = System.__file__ - self.assertTrue(fnmatch(system_file, "*System*.dll") or fnmatch(system_file, "*mscorlib.dll"), - "unexpected System.__file__: " + system_file) - self.assertTrue(System.__doc__.startswith("Namespace containing types from the following assemblies:")) - self.assertTrue(is_clr_class(System.String)) - self.assertTrue(is_clr_class(System.Int32)) - - def test_simple_import(self): - """Test simple import.""" - import System - self.assertTrue(is_clr_module(System)) - self.assertTrue(System.__name__ == 'System') - - import sys - self.assertTrue(isinstance(sys, types.ModuleType)) - self.assertTrue(sys.__name__ == 'sys') - - if PY3: - import http.client as httplib - self.assertTrue(isinstance(httplib, types.ModuleType)) - self.assertTrue(httplib.__name__ == 'http.client') - elif PY2: - import httplib - self.assertTrue(isinstance(httplib, types.ModuleType)) - self.assertTrue(httplib.__name__ == 'httplib') - - def test_simple_import_with_alias(self): - """Test simple import with aliasing.""" - import System as mySystem - self.assertTrue(is_clr_module(mySystem)) - self.assertTrue(mySystem.__name__ == 'System') - - import sys as mySys - self.assertTrue(isinstance(mySys, types.ModuleType)) - self.assertTrue(mySys.__name__ == 'sys') - - if PY3: - import http.client as myHttplib - self.assertTrue(isinstance(myHttplib, types.ModuleType)) - self.assertTrue(myHttplib.__name__ == 'http.client') - elif PY2: - import httplib as myHttplib - self.assertTrue(isinstance(myHttplib, types.ModuleType)) - self.assertTrue(myHttplib.__name__ == 'httplib') - - def test_dotted_name_import(self): - """Test dotted-name import.""" - import System.Reflection - self.assertTrue(is_clr_module(System.Reflection)) - self.assertTrue(System.Reflection.__name__ == 'System.Reflection') - - import xml.dom - self.assertTrue(isinstance(xml.dom, types.ModuleType)) - self.assertTrue(xml.dom.__name__ == 'xml.dom') - - def test_multiple_dotted_name_import(self): - """Test an import bug with multiple dotted imports.""" - import System.Data - self.assertTrue(is_clr_module(System.Data)) - self.assertTrue(System.Data.__name__ == 'System.Data') - import System.Data - self.assertTrue(is_clr_module(System.Data)) - self.assertTrue(System.Data.__name__ == 'System.Data') - - def test_dotted_name_import_with_alias(self): - """Test dotted-name import with aliasing.""" - import System.Reflection as SysRef - self.assertTrue(is_clr_module(SysRef)) - self.assertTrue(SysRef.__name__ == 'System.Reflection') - - import xml.dom as myDom - self.assertTrue(isinstance(myDom, types.ModuleType)) - self.assertTrue(myDom.__name__ == 'xml.dom') - - def test_simple_import_from(self): - """Test simple 'import from'.""" - from System import Reflection - self.assertTrue(is_clr_module(Reflection)) - self.assertTrue(Reflection.__name__ == 'System.Reflection') - - from xml import dom - self.assertTrue(isinstance(dom, types.ModuleType)) - self.assertTrue(dom.__name__ == 'xml.dom') - - def test_simple_import_from_with_alias(self): - """Test simple 'import from' with aliasing.""" - from System import Collections as Coll - self.assertTrue(is_clr_module(Coll)) - self.assertTrue(Coll.__name__ == 'System.Collections') - - from xml import dom as myDom - self.assertTrue(isinstance(myDom, types.ModuleType)) - self.assertTrue(myDom.__name__ == 'xml.dom') - - def test_dotted_name_import_from(self): - """Test dotted-name 'import from'.""" - from System.Collections import Specialized - self.assertTrue(is_clr_module(Specialized)) - self.assertTrue( - Specialized.__name__ == 'System.Collections.Specialized') - - from System.Collections.Specialized import StringCollection - self.assertTrue(is_clr_class(StringCollection)) - self.assertTrue(StringCollection.__name__ == 'StringCollection') - - from xml.dom import pulldom - self.assertTrue(isinstance(pulldom, types.ModuleType)) - self.assertTrue(pulldom.__name__ == 'xml.dom.pulldom') - - from xml.dom.pulldom import PullDOM - self.assertTrue(isinstance(PullDOM, ClassType)) - self.assertTrue(PullDOM.__name__ == 'PullDOM') - - def test_dotted_name_import_from_with_alias(self): - """Test dotted-name 'import from' with aliasing.""" - from System.Collections import Specialized as Spec - self.assertTrue(is_clr_module(Spec)) - self.assertTrue(Spec.__name__ == 'System.Collections.Specialized') - - from System.Collections.Specialized import StringCollection as SC - self.assertTrue(is_clr_class(SC)) - self.assertTrue(SC.__name__ == 'StringCollection') - - from xml.dom import pulldom as myPulldom - self.assertTrue(isinstance(myPulldom, types.ModuleType)) - self.assertTrue(myPulldom.__name__ == 'xml.dom.pulldom') - - from xml.dom.pulldom import PullDOM as myPullDOM - self.assertTrue(isinstance(myPullDOM, ClassType)) - self.assertTrue(myPullDOM.__name__ == 'PullDOM') - - def test_from_module_import_star(self): - """Test from module import * behavior.""" - count = len(locals().keys()) - m = __import__('System.Xml', globals(), locals(), ['*']) - self.assertTrue(m.__name__ == 'System.Xml') - self.assertTrue(is_clr_module(m)) - self.assertTrue(len(locals().keys()) > count + 1) - - def test_implicit_assembly_load(self): - """Test implicit assembly loading via import.""" - with warnings.catch_warnings(record=True) as w: - warnings.simplefilter("always") - - # should trigger a DeprecationWarning as Microsoft.Build hasn't - # been added as a reference yet (and should exist for mono) - import Microsoft.Build - - self.assertEqual(len(w), 1) - self.assertTrue(isinstance(w[0].message, DeprecationWarning)) - - with warnings.catch_warnings(record=True) as w: - clr.AddReference("System.Windows.Forms") - import System.Windows.Forms as Forms - self.assertTrue(is_clr_module(Forms)) - self.assertTrue(Forms.__name__ == 'System.Windows.Forms') - from System.Windows.Forms import Form - self.assertTrue(is_clr_class(Form)) - self.assertTrue(Form.__name__ == 'Form') - self.assertEqual(len(w), 0) - - def test_explicit_assembly_load(self): - """Test explicit assembly loading using standard CLR tools.""" - from System.Reflection import Assembly - import System, sys - - assembly = Assembly.LoadWithPartialName('System.Data') - self.assertTrue(assembly is not None) - - import System.Data - self.assertTrue('System.Data' in sys.modules) - - assembly = Assembly.LoadWithPartialName('SpamSpamSpamSpamEggsAndSpam') - self.assertTrue(assembly is None) - - def test_implicit_load_already_valid_namespace(self): - """Test implicit assembly load over an already valid namespace.""" - # In this case, the mscorlib assembly (loaded by default) defines - # a number of types in the System namespace. There is also a System - # assembly, which is _not_ loaded by default, which also contains - # types in the System namespace. The desired behavior is for the - # Python runtime to "do the right thing", allowing types from both - # assemblies to be found in the System module implicitly. - import System - self.assertTrue(is_clr_class(System.UriBuilder)) - def test_import_non_existant_module(self): - """Test import failure for a non-existent module.""" - with self.assertRaises(ImportError): - import System.SpamSpamSpam - def test_lookup_no_namespace_type(self): - """Test lookup of types without a qualified namespace.""" - import Python.Test - import clr - self.assertTrue(is_clr_class(clr.NoNamespaceType)) +def test_module_interface(): + """Test the interface exposed by CLR module objects.""" + import System + assert type(System.__dict__) == type({}) + assert System.__name__ == 'System' + # the filename can be any module from the System namespace + # (eg System.Data.dll or System.dll, but also mscorlib.dll) + system_file = System.__file__ + assert fnmatch(system_file, "*System*.dll") or fnmatch(system_file, "*mscorlib.dll"), \ + "unexpected System.__file__: " + system_file + assert System.__doc__.startswith("Namespace containing types from the following assemblies:") + assert is_clr_class(System.String) + assert is_clr_class(System.Int32) + + +def test_simple_import(): + """Test simple import.""" + import System + assert is_clr_module(System) + assert System.__name__ == 'System' + + import sys + assert isinstance(sys, types.ModuleType) + assert sys.__name__ == 'sys' + + if PY3: + import http.client as httplib + assert isinstance(httplib, types.ModuleType) + assert httplib.__name__ == 'http.client' + elif PY2: + import httplib + assert isinstance(httplib, types.ModuleType) + assert httplib.__name__ == 'httplib' + + +def test_simple_import_with_alias(): + """Test simple import with aliasing.""" + import System as mySystem + assert is_clr_module(mySystem) + assert mySystem.__name__ == 'System' + + import sys as mySys + assert isinstance(mySys, types.ModuleType) + assert mySys.__name__ == 'sys' + + if PY3: + import http.client as myHttplib + assert isinstance(myHttplib, types.ModuleType) + assert myHttplib.__name__ == 'http.client' + elif PY2: + import httplib as myHttplib + assert isinstance(myHttplib, types.ModuleType) + assert myHttplib.__name__ == 'httplib' + + +def test_dotted_name_import(): + """Test dotted-name import.""" + import System.Reflection + assert is_clr_module(System.Reflection) + assert System.Reflection.__name__ == 'System.Reflection' + + import xml.dom + assert isinstance(xml.dom, types.ModuleType) + assert xml.dom.__name__ == 'xml.dom' + + +def test_multiple_dotted_name_import(): + """Test an import bug with multiple dotted imports.""" + import System.Data + assert is_clr_module(System.Data) + assert System.Data.__name__ == 'System.Data' + import System.Data + assert is_clr_module(System.Data) + assert System.Data.__name__ == 'System.Data' + + +def test_dotted_name_import_with_alias(): + """Test dotted-name import with aliasing.""" + import System.Reflection as SysRef + assert is_clr_module(SysRef) + assert SysRef.__name__ == 'System.Reflection' + + import xml.dom as myDom + assert isinstance(myDom, types.ModuleType) + assert myDom.__name__ == 'xml.dom' + + +def test_simple_import_from(): + """Test simple 'import from'.""" + from System import Reflection + assert is_clr_module(Reflection) + assert Reflection.__name__ == 'System.Reflection' + + from xml import dom + assert isinstance(dom, types.ModuleType) + assert dom.__name__ == 'xml.dom' + + +def test_simple_import_from_with_alias(): + """Test simple 'import from' with aliasing.""" + from System import Collections as Coll + assert is_clr_module(Coll) + assert Coll.__name__ == 'System.Collections' + + from xml import dom as myDom + assert isinstance(myDom, types.ModuleType) + assert myDom.__name__ == 'xml.dom' + + +def test_dotted_name_import_from(): + """Test dotted-name 'import from'.""" + from System.Collections import Specialized + assert is_clr_module(Specialized) + assert Specialized.__name__ == 'System.Collections.Specialized' + + from System.Collections.Specialized import StringCollection + assert is_clr_class(StringCollection) + assert StringCollection.__name__ == 'StringCollection' + + from xml.dom import pulldom + assert isinstance(pulldom, types.ModuleType) + assert pulldom.__name__ == 'xml.dom.pulldom' + + from xml.dom.pulldom import PullDOM + assert isinstance(PullDOM, ClassType) + assert PullDOM.__name__ == 'PullDOM' + + +def test_dotted_name_import_from_with_alias(): + """Test dotted-name 'import from' with aliasing.""" + from System.Collections import Specialized as Spec + assert is_clr_module(Spec) + assert Spec.__name__ == 'System.Collections.Specialized' + + from System.Collections.Specialized import StringCollection as SC + assert is_clr_class(SC) + assert SC.__name__ == 'StringCollection' + + from xml.dom import pulldom as myPulldom + assert isinstance(myPulldom, types.ModuleType) + assert myPulldom.__name__ == 'xml.dom.pulldom' + + from xml.dom.pulldom import PullDOM as myPullDOM + assert isinstance(myPullDOM, ClassType) + assert myPullDOM.__name__ == 'PullDOM' + + +def test_from_module_import_star(): + """Test from module import * behavior.""" + count = len(locals().keys()) + m = __import__('System.Xml', globals(), locals(), ['*']) + assert m.__name__ == 'System.Xml' + assert is_clr_module(m) + assert len(locals().keys()) > count + 1 + + +def test_implicit_assembly_load(): + """Test implicit assembly loading via import.""" + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + + # should trigger a DeprecationWarning as Microsoft.Build hasn't + # been added as a reference yet (and should exist for mono) + import Microsoft.Build + + assert len(w) == 1 + assert isinstance(w[0].message, DeprecationWarning) + + with warnings.catch_warnings(record=True) as w: + clr.AddReference("System.Windows.Forms") + import System.Windows.Forms as Forms + assert is_clr_module(Forms) + assert Forms.__name__ == 'System.Windows.Forms' + from System.Windows.Forms import Form + assert is_clr_class(Form) + assert Form.__name__ == 'Form' + assert len(w) == 0 - def test_module_lookup_recursion(self): - """Test for recursive lookup handling.""" - with self.assertRaises(ImportError): - from System import System +def test_explicit_assembly_load(): + """Test explicit assembly loading using standard CLR tools.""" + from System.Reflection import Assembly + import System, sys - with self.assertRaises(AttributeError): - import System - _ = System.System + assembly = Assembly.LoadWithPartialName('System.Data') + assert assembly is not None - def test_module_get_attr(self): - """Test module getattr behavior.""" + import System.Data + assert 'System.Data' in sys.modules + + assembly = Assembly.LoadWithPartialName('SpamSpamSpamSpamEggsAndSpam') + assert assembly is None + + +def test_implicit_load_already_valid_namespace(): + """Test implicit assembly load over an already valid namespace.""" + # In this case, the mscorlib assembly (loaded by default) defines + # a number of types in the System namespace. There is also a System + # assembly, which is _not_ loaded by default, which also contains + # types in the System namespace. The desired behavior is for the + # Python runtime to "do the right thing", allowing types from both + # assemblies to be found in the System module implicitly. + import System + assert is_clr_class(System.UriBuilder) + + +def test_import_non_existant_module(): + """Test import failure for a non-existent module.""" + with pytest.raises(ImportError): + import System.SpamSpamSpam + + +def test_lookup_no_namespace_type(): + """Test lookup of types without a qualified namespace.""" + import Python.Test + import clr + assert is_clr_class(clr.NoNamespaceType) + + +def test_module_lookup_recursion(): + """Test for recursive lookup handling.""" + + with pytest.raises(ImportError): + from System import System + + with pytest.raises(AttributeError): import System + _ = System.System + - int_type = System.Int32 - self.assertTrue(is_clr_class(int_type)) +def test_module_get_attr(): + """Test module getattr behavior.""" + import System - module = System.Xml - self.assertTrue(is_clr_module(module)) + int_type = System.Int32 + assert is_clr_class(int_type) - with self.assertRaises(AttributeError): - _ = System.Spam + module = System.Xml + assert is_clr_module(module) - with self.assertRaises(TypeError): - _ = getattr(System, 1) + with pytest.raises(AttributeError): + _ = System.Spam - def test_module_attr_abuse(self): - """Test handling of attempts to set module attributes.""" + with pytest.raises(TypeError): + _ = getattr(System, 1) - # It would be safer to use a dict-proxy as the __dict__ for CLR - # modules, but as of Python 2.3 some parts of the CPython runtime - # like dir() will fail if a module dict is not a real dictionary. - def test(): - import System - System.__dict__['foo'] = 0 - return 1 +def test_module_attr_abuse(): + """Test handling of attempts to set module attributes.""" - self.assertTrue(test()) + # It would be safer to use a dict-proxy as the __dict__ for CLR + # modules, but as of Python 2.3 some parts of the CPython runtime + # like dir() will fail if a module dict is not a real dictionary. - def test_module_type_abuse(self): - """Test handling of attempts to break the module type.""" + def test(): import System - mtype = type(System) - - with self.assertRaises(TypeError): - mtype.__getattribute__(0, 'spam') - - with self.assertRaises(TypeError): - mtype.__setattr__(0, 'spam', 1) - - with self.assertRaises(TypeError): - mtype.__repr__(0) - - def test_clr_list_assemblies(self): - from clr import ListAssemblies - verbose = list(ListAssemblies(True)) - short = list(ListAssemblies(False)) - self.assertTrue(u'mscorlib' in short) - self.assertTrue(u'System' in short) - self.assertTrue(u'Culture=' in verbose[0]) - self.assertTrue(u'Version=' in verbose[0]) - - def test_clr_add_reference(self): - from clr import AddReference - from System.IO import FileNotFoundException - for name in ("System", "Python.Runtime"): - assy = AddReference(name) - assy_name = assy.GetName().Name - self.assertEqual(assy_name, name) - - with self.assertRaises(FileNotFoundException): - AddReference("somethingtotallysilly") - - def test_assembly_load_thread_safety(self): - from Python.Test import ModuleTest - # spin up .NET thread which loads assemblies and triggers AppDomain.AssemblyLoad event - ModuleTest.RunThreads() - time.sleep(1e-5) - for _ in range(1, 100): - # call import clr, which in AssemblyManager.GetNames iterates through the loaded types - import clr - # import some .NET types - from System import DateTime - from System import Guid - from System.Collections.Generic import Dictionary - _ = Dictionary[Guid, DateTime]() - ModuleTest.JoinThreads() - - -def test_suite(): - return unittest.makeSuite(ModuleTests) + System.__dict__['foo'] = 0 + return 1 + + assert test() + + +def test_module_type_abuse(): + """Test handling of attempts to break the module type.""" + import System + mtype = type(System) + + with pytest.raises(TypeError): + mtype.__getattribute__(0, 'spam') + + with pytest.raises(TypeError): + mtype.__setattr__(0, 'spam', 1) + + with pytest.raises(TypeError): + mtype.__repr__(0) + + +def test_clr_list_assemblies(): + from clr import ListAssemblies + verbose = list(ListAssemblies(True)) + short = list(ListAssemblies(False)) + assert u'mscorlib' in short + assert u'System' in short + assert u'Culture=' in verbose[0] + assert u'Version=' in verbose[0] + + +def test_clr_add_reference(): + from clr import AddReference + from System.IO import FileNotFoundException + for name in ("System", "Python.Runtime"): + assy = AddReference(name) + assy_name = assy.GetName().Name + assert assy_name == name + + with pytest.raises(FileNotFoundException): + AddReference("somethingtotallysilly") + + +def test_assembly_load_thread_safety(): + from Python.Test import ModuleTest + # spin up .NET thread which loads assemblies and triggers AppDomain.AssemblyLoad event + ModuleTest.RunThreads() + time.sleep(1e-5) + for _ in range(1, 100): + # call import clr, which in AssemblyManager.GetNames iterates through the loaded types + import clr + # import some .NET types + from System import DateTime + from System import Guid + from System.Collections.Generic import Dictionary + _ = Dictionary[Guid, DateTime]() + ModuleTest.JoinThreads() diff --git a/src/tests/test_property.py b/src/tests/test_property.py index 8fb37768a..4dc8ea111 100644 --- a/src/tests/test_property.py +++ b/src/tests/test_property.py @@ -1,145 +1,148 @@ # -*- coding: utf-8 -*- -import unittest +"""Test CLR property support.""" +import pytest from Python.Test import PropertyTest -class PropertyTests(unittest.TestCase): - """Test CLR property support.""" +def test_public_instance_property(): + """Test public instance properties.""" + ob = PropertyTest() - def test_public_instance_property(self): - """Test public instance properties.""" - ob = PropertyTest() + assert ob.PublicProperty == 0 + ob.PublicProperty = 1 + assert ob.PublicProperty == 1 - self.assertTrue(ob.PublicProperty == 0) - ob.PublicProperty = 1 - self.assertTrue(ob.PublicProperty == 1) + with pytest.raises(TypeError): + del PropertyTest().PublicProperty - with self.assertRaises(TypeError): - del PropertyTest().PublicProperty - def test_public_static_property(self): - """Test public static properties.""" - ob = PropertyTest() +def test_public_static_property(): + """Test public static properties.""" + ob = PropertyTest() - self.assertTrue(PropertyTest.PublicStaticProperty == 0) - PropertyTest.PublicStaticProperty = 1 - self.assertTrue(PropertyTest.PublicStaticProperty == 1) + assert PropertyTest.PublicStaticProperty == 0 + PropertyTest.PublicStaticProperty = 1 + assert PropertyTest.PublicStaticProperty == 1 - self.assertTrue(ob.PublicStaticProperty == 1) - ob.PublicStaticProperty = 0 - self.assertTrue(ob.PublicStaticProperty == 0) + assert ob.PublicStaticProperty == 1 + ob.PublicStaticProperty = 0 + assert ob.PublicStaticProperty == 0 - with self.assertRaises(TypeError): - del PropertyTest.PublicStaticProperty + with pytest.raises(TypeError): + del PropertyTest.PublicStaticProperty - with self.assertRaises(TypeError): - del PropertyTest().PublicStaticProperty + with pytest.raises(TypeError): + del PropertyTest().PublicStaticProperty - def test_protected_instance_property(self): - """Test protected instance properties.""" - ob = PropertyTest() - self.assertTrue(ob.ProtectedProperty == 0) - ob.ProtectedProperty = 1 - self.assertTrue(ob.ProtectedProperty == 1) +def test_protected_instance_property(): + """Test protected instance properties.""" + ob = PropertyTest() - with self.assertRaises(TypeError): - del PropertyTest().ProtectedProperty + assert ob.ProtectedProperty == 0 + ob.ProtectedProperty = 1 + assert ob.ProtectedProperty == 1 - def test_protected_static_property(self): - """Test protected static properties.""" - ob = PropertyTest() + with pytest.raises(TypeError): + del PropertyTest().ProtectedProperty - self.assertTrue(PropertyTest.ProtectedStaticProperty == 0) - PropertyTest.ProtectedStaticProperty = 1 - self.assertTrue(PropertyTest.ProtectedStaticProperty == 1) - self.assertTrue(ob.ProtectedStaticProperty == 1) - ob.ProtectedStaticProperty = 0 - self.assertTrue(ob.ProtectedStaticProperty == 0) +def test_protected_static_property(): + """Test protected static properties.""" + ob = PropertyTest() - with self.assertRaises(TypeError): - del PropertyTest.ProtectedStaticProperty + assert PropertyTest.ProtectedStaticProperty == 0 + PropertyTest.ProtectedStaticProperty = 1 + assert PropertyTest.ProtectedStaticProperty == 1 - with self.assertRaises(TypeError): - del PropertyTest().ProtectedStaticProperty + assert ob.ProtectedStaticProperty == 1 + ob.ProtectedStaticProperty = 0 + assert ob.ProtectedStaticProperty == 0 - def test_internal_property(self): - """Test internal properties.""" + with pytest.raises(TypeError): + del PropertyTest.ProtectedStaticProperty - with self.assertRaises(AttributeError): - _ = PropertyTest().InternalProperty + with pytest.raises(TypeError): + del PropertyTest().ProtectedStaticProperty - with self.assertRaises(AttributeError): - _ = PropertyTest().InternalStaticProperty - with self.assertRaises(AttributeError): - _ = PropertyTest.InternalStaticProperty +def test_internal_property(): + """Test internal properties.""" - def test_private_property(self): - """Test private properties.""" + with pytest.raises(AttributeError): + _ = PropertyTest().InternalProperty - with self.assertRaises(AttributeError): - _ = PropertyTest().PrivateProperty + with pytest.raises(AttributeError): + _ = PropertyTest().InternalStaticProperty - with self.assertRaises(AttributeError): - _ = PropertyTest().PrivateStaticProperty + with pytest.raises(AttributeError): + _ = PropertyTest.InternalStaticProperty - with self.assertRaises(AttributeError): - _ = PropertyTest.PrivateStaticProperty - def test_property_descriptor_get_set(self): - """Test property descriptor get / set.""" +def test_private_property(): + """Test private properties.""" - # This test ensures that setting an attribute implemented with - # a descriptor actually goes through the descriptor (rather than - # silently replacing the descriptor in the instance or type dict. + with pytest.raises(AttributeError): + _ = PropertyTest().PrivateProperty - ob = PropertyTest() + with pytest.raises(AttributeError): + _ = PropertyTest().PrivateStaticProperty + + with pytest.raises(AttributeError): + _ = PropertyTest.PrivateStaticProperty - self.assertTrue(PropertyTest.PublicStaticProperty == 0) - self.assertTrue(ob.PublicStaticProperty == 0) - descriptor = PropertyTest.__dict__['PublicStaticProperty'] - self.assertTrue(type(descriptor) != int) +def test_property_descriptor_get_set(): + """Test property descriptor get / set.""" - ob.PublicStaticProperty = 0 - descriptor = PropertyTest.__dict__['PublicStaticProperty'] - self.assertTrue(type(descriptor) != int) + # This test ensures that setting an attribute implemented with + # a descriptor actually goes through the descriptor (rather than + # silently replacing the descriptor in the instance or type dict. - PropertyTest.PublicStaticProperty = 0 - descriptor = PropertyTest.__dict__['PublicStaticProperty'] - self.assertTrue(type(descriptor) != int) + ob = PropertyTest() - def test_property_descriptor_wrong_type(self): - """Test setting a property using a value of the wrong type.""" + assert PropertyTest.PublicStaticProperty == 0 + assert ob.PublicStaticProperty == 0 - with self.assertRaises(TypeError): - ob = PropertyTest() - ob.PublicProperty = "spam" + descriptor = PropertyTest.__dict__['PublicStaticProperty'] + assert type(descriptor) != int + + ob.PublicStaticProperty = 0 + descriptor = PropertyTest.__dict__['PublicStaticProperty'] + assert type(descriptor) != int + + PropertyTest.PublicStaticProperty = 0 + descriptor = PropertyTest.__dict__['PublicStaticProperty'] + assert type(descriptor) != int + + +def test_property_descriptor_wrong_type(): + """Test setting a property using a value of the wrong type.""" + + with pytest.raises(TypeError): + ob = PropertyTest() + ob.PublicProperty = "spam" - def test_property_descriptor_abuse(self): - """Test property descriptor abuse.""" - desc = PropertyTest.__dict__['PublicProperty'] - with self.assertRaises(TypeError): - desc.__get__(0, 0) +def test_property_descriptor_abuse(): + """Test property descriptor abuse.""" + desc = PropertyTest.__dict__['PublicProperty'] - with self.assertRaises(TypeError): - desc.__set__(0, 0) + with pytest.raises(TypeError): + desc.__get__(0, 0) - def test_interface_property(self): - """Test properties of interfaces. Added after a bug report - that an IsAbstract check was inappropriate and prevented - use of properties when only the interface is known.""" - from System.Collections import Hashtable, ICollection + with pytest.raises(TypeError): + desc.__set__(0, 0) - mapping = Hashtable() - coll = ICollection(mapping) - self.assertTrue(coll.Count == 0) +def test_interface_property(): + """Test properties of interfaces. Added after a bug report + that an IsAbstract check was inappropriate and prevented + use of properties when only the interface is known.""" + from System.Collections import Hashtable, ICollection -def test_suite(): - return unittest.makeSuite(PropertyTests) + mapping = Hashtable() + coll = ICollection(mapping) + assert coll.Count == 0 diff --git a/src/tests/test_recursive_types.py b/src/tests/test_recursive_types.py new file mode 100644 index 000000000..ca4b871cf --- /dev/null +++ b/src/tests/test_recursive_types.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- + +"""Test if interop with recursive type inheritance works.""" + + +def test_recursive_type_creation(): + """Test that a recursive types don't crash with a + StackOverflowException""" + from Python.Test import RecursiveInheritance + + test_instance = RecursiveInheritance.SubClass() + test_instance.SomeMethod() diff --git a/src/tests/test_subclass.py b/src/tests/test_subclass.py index 34ec86d9a..8e862a56d 100644 --- a/src/tests/test_subclass.py +++ b/src/tests/test_subclass.py @@ -4,14 +4,15 @@ # both Linux and Windows # TODO: Remove delay of class creations. Adding SetUp/TearDown may help -import unittest +"""Test sub-classing managed types""" import System +import pytest from Python.Test import (IInterfaceTest, SubClassTest, EventArgsTest, FunctionsTest) from System.Collections.Generic import List -from _compat import range +from ._compat import range def interface_test_class_fixture(): @@ -84,113 +85,111 @@ def OnTestEvent(self, value): return DerivedEventTest -class SubClassTests(unittest.TestCase): - """Test sub-classing managed types""" - - @unittest.skip(reason="FIXME: test randomly pass/fails") - def test_base_class(self): - """Test base class managed type""" - ob = SubClassTest() - self.assertEqual(ob.foo(), "foo") - self.assertEqual(FunctionsTest.test_foo(ob), "foo") - self.assertEqual(ob.bar("bar", 2), "bar") - self.assertEqual(FunctionsTest.test_bar(ob, "bar", 2), "bar") - self.assertEqual(ob.not_overriden(), "not_overriden") - self.assertEqual(list(ob.return_list()), ["a", "b", "c"]) - self.assertEqual(list(SubClassTest.test_list(ob)), ["a", "b", "c"]) - - @unittest.skip(reason="FIXME: test randomly pass/fails") - def test_interface(self): - """Test python classes can derive from C# interfaces""" - InterfaceTestClass = interface_test_class_fixture() - ob = InterfaceTestClass() - self.assertEqual(ob.foo(), "InterfaceTestClass") - self.assertEqual(FunctionsTest.test_foo(ob), "InterfaceTestClass") - self.assertEqual(ob.bar("bar", 2), "bar/bar") - self.assertEqual(FunctionsTest.test_bar(ob, "bar", 2), "bar/bar") - - x = FunctionsTest.pass_through(ob) - self.assertEqual(id(x), id(ob)) - - @unittest.skip(reason="FIXME: test randomly pass/fails") - def test_derived_class(self): - """Test python class derived from managed type""" - DerivedClass = derived_class_fixture() - ob = DerivedClass() - self.assertEqual(ob.foo(), "DerivedClass") - self.assertEqual(ob.base_foo(), "foo") - self.assertEqual(ob.super_foo(), "foo") - self.assertEqual(FunctionsTest.test_foo(ob), "DerivedClass") - self.assertEqual(ob.bar("bar", 2), "bar_bar") - self.assertEqual(FunctionsTest.test_bar(ob, "bar", 2), "bar_bar") - self.assertEqual(ob.not_overriden(), "not_overriden") - self.assertEqual(list(ob.return_list()), ["A", "B", "C"]) - self.assertEqual(list(SubClassTest.test_list(ob)), ["A", "B", "C"]) - - x = FunctionsTest.pass_through(ob) - self.assertEqual(id(x), id(ob)) - - @unittest.skip(reason="FIXME: test randomly pass/fails") - def test_create_instance(self): - """Test derived instances can be created from managed code""" - DerivedClass = derived_class_fixture() - ob = FunctionsTest.create_instance(DerivedClass) - self.assertEqual(ob.foo(), "DerivedClass") - self.assertEqual(FunctionsTest.test_foo(ob), "DerivedClass") - self.assertEqual(ob.bar("bar", 2), "bar_bar") - self.assertEqual(FunctionsTest.test_bar(ob, "bar", 2), "bar_bar") - self.assertEqual(ob.not_overriden(), "not_overriden") - - x = FunctionsTest.pass_through(ob) - self.assertEqual(id(x), id(ob)) - - InterfaceTestClass = interface_test_class_fixture() - ob2 = FunctionsTest.create_instance(InterfaceTestClass) - self.assertEqual(ob2.foo(), "InterfaceTestClass") - self.assertEqual(FunctionsTest.test_foo(ob2), "InterfaceTestClass") - self.assertEqual(ob2.bar("bar", 2), "bar/bar") - self.assertEqual(FunctionsTest.test_bar(ob2, "bar", 2), "bar/bar") - - y = FunctionsTest.pass_through(ob2) - self.assertEqual(id(y), id(ob2)) - - @unittest.skip(reason="FIXME: test randomly pass/fails") - def test_events(self): - class EventHandler(object): - def handler(self, x, args): - self.value = args.value - - event_handler = EventHandler() - - x = SubClassTest() - x.TestEvent += event_handler.handler - self.assertEqual(FunctionsTest.test_event(x, 1), 1) - self.assertEqual(event_handler.value, 1) - - InterfaceTestClass = interface_test_class_fixture() - i = InterfaceTestClass() - with self.assertRaises(System.NotImplementedException): - FunctionsTest.test_event(i, 2) - - DerivedEventTest = derived_event_test_class_fixture() - d = DerivedEventTest() - d.add_TestEvent(event_handler.handler) - self.assertEqual(FunctionsTest.test_event(d, 3), 3) - self.assertEqual(event_handler.value, 3) - self.assertEqual(len(d.event_handlers), 1) - - def test_isinstance(self): - a = [str(x) for x in range(0, 1000)] - b = [System.String(x) for x in a] - - for x in a: - self.assertFalse(isinstance(x, System.Object)) - self.assertFalse(isinstance(x, System.String)) - - for x in b: - self.assertTrue(isinstance(x, System.Object)) - self.assertTrue(isinstance(x, System.String)) - - -def test_suite(): - return unittest.makeSuite(SubClassTests) +@pytest.mark.skip(reason="FIXME: test randomly pass/fails") +def test_base_class(): + """Test base class managed type""" + ob = SubClassTest() + assert ob.foo() == "foo" + assert FunctionsTest.test_foo(ob) == "foo" + assert ob.bar("bar", 2) == "bar" + assert FunctionsTest.test_bar(ob, "bar", 2) == "bar" + assert ob.not_overriden() == "not_overriden" + assert list(ob.return_list()) == ["a", "b", "c"] + assert list(SubClassTest.test_list(ob)) == ["a", "b", "c"] + + +@pytest.mark.skip(reason="FIXME: test randomly pass/fails") +def test_interface(): + """Test python classes can derive from C# interfaces""" + InterfaceTestClass = interface_test_class_fixture() + ob = InterfaceTestClass() + assert ob.foo() == "InterfaceTestClass" + assert FunctionsTest.test_foo(ob) == "InterfaceTestClass" + assert ob.bar("bar", 2) == "bar/bar" + assert FunctionsTest.test_bar(ob, "bar", 2) == "bar/bar" + + x = FunctionsTest.pass_through(ob) + assert id(x) == id(ob) + + +@pytest.mark.skip(reason="FIXME: test randomly pass/fails") +def test_derived_class(): + """Test python class derived from managed type""" + DerivedClass = derived_class_fixture() + ob = DerivedClass() + assert ob.foo() == "DerivedClass" + assert ob.base_foo() == "foo" + assert ob.super_foo() == "foo" + assert FunctionsTest.test_foo(ob) == "DerivedClass" + assert ob.bar("bar", 2) == "bar_bar" + assert FunctionsTest.test_bar(ob, "bar", 2) == "bar_bar" + assert ob.not_overriden() == "not_overriden" + assert list(ob.return_list()) == ["A", "B", "C"] + assert list(SubClassTest.test_list(ob)) == ["A", "B", "C"] + + x = FunctionsTest.pass_through(ob) + assert id(x) == id(ob) + + +@pytest.mark.skip(reason="FIXME: test randomly pass/fails") +def test_create_instance(): + """Test derived instances can be created from managed code""" + DerivedClass = derived_class_fixture() + ob = FunctionsTest.create_instance(DerivedClass) + assert ob.foo() == "DerivedClass" + assert FunctionsTest.test_foo(ob) == "DerivedClass" + assert ob.bar("bar", 2) == "bar_bar" + assert FunctionsTest.test_bar(ob, "bar", 2) == "bar_bar" + assert ob.not_overriden() == "not_overriden" + + x = FunctionsTest.pass_through(ob) + assert id(x) == id(ob) + + InterfaceTestClass = interface_test_class_fixture() + ob2 = FunctionsTest.create_instance(InterfaceTestClass) + assert ob2.foo() == "InterfaceTestClass" + assert FunctionsTest.test_foo(ob2) == "InterfaceTestClass" + assert ob2.bar("bar", 2) == "bar/bar" + assert FunctionsTest.test_bar(ob2, "bar", 2) == "bar/bar" + + y = FunctionsTest.pass_through(ob2) + assert id(y) == id(ob2) + + +@pytest.mark.skip(reason="FIXME: test randomly pass/fails") +def test_events(): + class EventHandler(object): + def handler(self, x, args): + self.value = args.value + + event_handler = EventHandler() + + x = SubClassTest() + x.TestEvent += event_handler.handler + assert FunctionsTest.test_event(x, 1) == 1 + assert event_handler.value == 1 + + InterfaceTestClass = interface_test_class_fixture() + i = InterfaceTestClass() + with pytest.raises(System.NotImplementedException): + FunctionsTest.test_event(i, 2) + + DerivedEventTest = derived_event_test_class_fixture() + d = DerivedEventTest() + d.add_TestEvent(event_handler.handler) + assert FunctionsTest.test_event(d, 3) == 3 + assert event_handler.value == 3 + assert len(d.event_handlers) == 1 + + +def test_isinstance_check(): + a = [str(x) for x in range(0, 1000)] + b = [System.String(x) for x in a] + + for x in a: + assert not isinstance(x, System.Object) + assert not isinstance(x, System.String) + + for x in b: + assert isinstance(x, System.Object) + assert isinstance(x, System.String) diff --git a/src/tests/test_suite/__init__.py b/src/tests/test_suite/__init__.py deleted file mode 100644 index ecc1c858f..000000000 --- a/src/tests/test_suite/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- - -import unittest - -from .test_callback import test_suite as callback_tests -from .test_import import test_suite as import_tests -from .test_recursive_types import test_suite as recursive_types_tests - - -def test_suite(): - suite = unittest.TestSuite() - suite.addTests((import_tests(),)) - suite.addTests((callback_tests(),)) - suite.addTests((recursive_types_tests(),)) - return suite diff --git a/src/tests/test_suite/test_callback.py b/src/tests/test_suite/test_callback.py deleted file mode 100644 index 2cb234442..000000000 --- a/src/tests/test_suite/test_callback.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- - -import unittest - - -def simpleDefaultArg(arg='test'): - return arg - - -class CallbackTests(unittest.TestCase): - """Test that callbacks from C# into python work.""" - - def test_default_for_null(self): - """Test that C# can use null for an optional python argument""" - from Python.Test import CallbackTest - - test_instance = CallbackTest() - ret_val = test_instance.Call_simpleDefaultArg_WithNull(__name__) - python_ret_val = simpleDefaultArg(None) - self.assertEquals(ret_val, python_ret_val) - - def test_default_for_none(self): - """Test that C# can use no argument for an optional python argument""" - from Python.Test import CallbackTest - - test_instance = CallbackTest() - ret_val = test_instance.Call_simpleDefaultArg_WithEmptyArgs(__name__) - python_ret_val = simpleDefaultArg() - self.assertEquals(ret_val, python_ret_val) - - -def test_suite(): - return unittest.makeSuite(CallbackTests) diff --git a/src/tests/test_suite/test_import.py b/src/tests/test_suite/test_import.py deleted file mode 100644 index 9bae9ca5f..000000000 --- a/src/tests/test_suite/test_import.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- - -import unittest - - -class ImportTests(unittest.TestCase): - """Test the import statement.""" - - def test_relative_missing_import(self): - """Test that a relative missing import doesn't crash. - Some modules use this to check if a package is installed. - Relative import in the site-packages folder""" - with self.assertRaises(ImportError): - from . import _missing_import - - -def test_suite(): - return unittest.makeSuite(ImportTests) diff --git a/src/tests/test_suite/test_recursive_types.py b/src/tests/test_suite/test_recursive_types.py deleted file mode 100644 index a213937a5..000000000 --- a/src/tests/test_suite/test_recursive_types.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- - -import unittest - - -class RecursiveTypesTests(unittest.TestCase): - """Test if interop with recursive type inheritance works.""" - - def test_recursive_type_creation(self): - """Test that a recursive types don't crash with a - StackOverflowException""" - from Python.Test import RecursiveInheritance - - test_instance = RecursiveInheritance.SubClass() - test_instance.SomeMethod() - - -def test_suite(): - return unittest.makeSuite(RecursiveTypesTests) diff --git a/src/tests/test_sysargv.py b/src/tests/test_sysargv.py index eefb4d341..2649bf885 100644 --- a/src/tests/test_sysargv.py +++ b/src/tests/test_sysargv.py @@ -1,17 +1,12 @@ # -*- coding: utf-8 -*- -import unittest -import sys - -class SysArgvTests(unittest.TestCase): - """Test sys.argv state.""" +"""Test sys.argv state.""" - def test_sys_argv_state(self): - """Test sys.argv state doesn't change after clr import.""" - argv = sys.argv - import clr - self.assertTrue(argv == sys.argv) +import sys -def test_suite(): - return unittest.makeSuite(SysArgvTests) +def test_sys_argv_state(): + """Test sys.argv state doesn't change after clr import.""" + argv = sys.argv + import clr + assert argv == sys.argv diff --git a/src/tests/test_thread.py b/src/tests/test_thread.py index 623be60a0..c62c15939 100644 --- a/src/tests/test_thread.py +++ b/src/tests/test_thread.py @@ -1,62 +1,58 @@ # -*- coding: utf-8 -*- +"""Test CLR bridge threading and GIL handling.""" + import threading import time -import unittest - -from _compat import range, thread -from utils import dprint - -class ThreadTests(unittest.TestCase): - """Test CLR bridge threading and GIL handling.""" +from ._compat import range, thread +from .utils import dprint - def test_simple_callback_to_python(self): - """Test a call to managed code that then calls back into Python.""" - from Python.Test import ThreadTest - dprint("thread %s SimpleCallBack" % thread.get_ident()) - result = ThreadTest.CallEchoString("spam") - self.assertTrue(result == "spam") - dprint("thread %s SimpleCallBack ret" % thread.get_ident()) +def test_simple_callback_to_python(): + """Test a call to managed code that then calls back into Python.""" + from Python.Test import ThreadTest - def test_double_callback_to_python(self): - """Test a call to managed code that then calls back into Python - that then calls managed code that then calls Python again.""" - from Python.Test import ThreadTest + dprint("thread %s SimpleCallBack" % thread.get_ident()) + result = ThreadTest.CallEchoString("spam") + assert result == "spam" + dprint("thread %s SimpleCallBack ret" % thread.get_ident()) - dprint("thread %s DoubleCallBack" % thread.get_ident()) - result = ThreadTest.CallEchoString2("spam") - self.assertTrue(result == "spam") - dprint("thread %s DoubleCallBack ret" % thread.get_ident()) - def test_python_thread_calls_to_clr(self): - """Test calls by Python-spawned threads into managed code.""" - # This test is very likely to hang if something is wrong ;) - import System +def test_double_callback_to_python(): + """Test a call to managed code that then calls back into Python + that then calls managed code that then calls Python again.""" + from Python.Test import ThreadTest - done = [] + dprint("thread %s DoubleCallBack" % thread.get_ident()) + result = ThreadTest.CallEchoString2("spam") + assert result == "spam" + dprint("thread %s DoubleCallBack ret" % thread.get_ident()) - def run_thread(): - for i in range(10): - time.sleep(0.1) - dprint("thread %s %d" % (thread.get_ident(), i)) - mstr = System.String("thread %s %d" % (thread.get_ident(), i)) - dprint(mstr.ToString()) - done.append(None) - dprint("thread %s %d done" % (thread.get_ident(), i)) - def start_threads(count): - for _ in range(count): - thread_ = threading.Thread(target=run_thread) - thread_.start() +def test_python_thread_calls_to_clr(): + """Test calls by Python-spawned threads into managed code.""" + # This test is very likely to hang if something is wrong ;) + import System - start_threads(5) + done = [] - while len(done) < 50: - dprint(len(done)) + def run_thread(): + for i in range(10): time.sleep(0.1) - - -def test_suite(): - return unittest.makeSuite(ThreadTests) + dprint("thread %s %d" % (thread.get_ident(), i)) + mstr = System.String("thread %s %d" % (thread.get_ident(), i)) + dprint(mstr.ToString()) + done.append(None) + dprint("thread %s %d done" % (thread.get_ident(), i)) + + def start_threads(count): + for _ in range(count): + thread_ = threading.Thread(target=run_thread) + thread_.start() + + start_threads(5) + + while len(done) < 50: + dprint(len(done)) + time.sleep(0.1) diff --git a/src/tests/utils.py b/src/tests/utils.py index 6729d7b30..cacb015ec 100644 --- a/src/tests/utils.py +++ b/src/tests/utils.py @@ -7,7 +7,7 @@ from __future__ import print_function -from _compat import PY2, PY3 +from ._compat import PY2, PY3 def dprint(msg): From 104ef716fc6eea46a5830e1e1317ad5c8a336273 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 23 Jan 2017 05:42:26 -0700 Subject: [PATCH 118/324] Add setup.cfg Control settings for some add-ons like pytest --- setup.cfg | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 setup.cfg diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 000000000..4930652bb --- /dev/null +++ b/setup.cfg @@ -0,0 +1,7 @@ +[tool:pytest] +xfail_strict = True + +[check-manifest] +ignore = + .github + .github/* From 76aa7311c442adeac1f84300b6d3e41fc59c4bf6 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 28 Jan 2017 22:23:46 -0700 Subject: [PATCH 119/324] Simpler tox --- tox.ini | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/tox.ini b/tox.ini index 1cc666ae3..ef15d5099 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,4 @@ [tox] -skipsdist=True skip_missing_interpreters=True envlist = py27 @@ -7,32 +6,19 @@ envlist = py34 py35 py36 + py37 check [testenv] -recreate=True -basepython = - py27: {env:TOXPYTHON:python2.7} - py33: {env:TOXPYTHON:python3.3} - py34: {env:TOXPYTHON:python3.4} - py35: {env:TOXPYTHON:python3.5} - py36: {env:TOXPYTHON:python3.6} - check: python3.5 -setenv = - PYTHONUNBUFFERED=True - DISTUTILS_DEBUG= -passenv = - * +deps = + pytest commands = - python --version - python -c "import struct; print('ARCH: %d' % (struct.calcsize('P') * 8))" - python -c "import ctypes; print('UCS%d' % ctypes.sizeof(ctypes.c_wchar))" - python setup.py bdist_wheel - pip install --no-index --find-links=dist/ pythonnet - {posargs:python src\tests\runtests.py} + {posargs:py.test} [testenv:check] ignore_errors=True +skip_install=True +basepython=python3.5 deps = check-manifest flake8 From adc927f8bee500c43e961f4e071d4cf76542bead Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 8 Feb 2017 14:37:45 -0700 Subject: [PATCH 120/324] Upgrade NUnit to 3.6 --- .travis.yml | 2 +- appveyor.yml | 4 ++-- src/embed_tests/Python.EmbeddingTest.csproj | 4 ++-- src/embed_tests/packages.config | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7043d4893..1bd377871 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,7 +37,7 @@ install: script: - export PYTHONPATH=`pwd`:$PYTHONPATH - python -m pytest - # - mono ./packages/NUnit.*/tools/nunit-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll + # - mono ./packages/NUnit.*/tools/nunit3-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll after_success: # Uncomment if need to geninterop, ie. py37 final diff --git a/appveyor.yml b/appveyor.yml index 6876bb442..c80fdd541 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -10,7 +10,7 @@ environment: PYTHONUNBUFFERED: True PYTHONWARNINGS: 'ignore:::wheel.pep425tags:' PYTHONPATH: C:\testdir - NUNIT: nunit-console + NUNIT: nunit3-console CONDA_BLD: C:\conda CONDA_BLD_VERSION: 3.5 @@ -35,7 +35,7 @@ init: - set CONDA_BLD_ARCH=%PLATFORM:x=% - set PYTHON=C:\PYTHON%PYTHON_VERSION:.=% - if %PLATFORM%==x86 (set CONDA_BLD_ARCH=32) - - if %PLATFORM%==x86 (set NUNIT=%NUNIT%-x86) + # - if %PLATFORM%==x86 (set NUNIT=%NUNIT%-x86) - if %PLATFORM%==x64 (set PYTHON=%PYTHON%-x64) # Prepend newly installed Python to the PATH of this build diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index 9cca794b4..a2e92ed19 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -65,8 +65,8 @@ pdbonly - - ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll + + ..\..\packages\NUnit.3.6.0\lib\net40\nunit.framework.dll diff --git a/src/embed_tests/packages.config b/src/embed_tests/packages.config index 33152fe85..4cb01d3be 100644 --- a/src/embed_tests/packages.config +++ b/src/embed_tests/packages.config @@ -1,5 +1,5 @@ - - + + From 5f86154b1acc2c4e051310284f6ffbce428d4122 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 13 Feb 2017 11:14:38 -0700 Subject: [PATCH 121/324] Fix coverage w NUnit3; add OpenCover filter NUnit3/OpenCover behavior changed. Filter removes coverage from Embedded test files by focusing only on types of Python.Runtime.* --- ci/appveyor_run_tests.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/appveyor_run_tests.ps1 b/ci/appveyor_run_tests.ps1 index 974114cdb..fbfc773a5 100644 --- a/ci/appveyor_run_tests.ps1 +++ b/ci/appveyor_run_tests.ps1 @@ -28,6 +28,7 @@ if ($PYTHON_STATUS -ne 0) { Write-Host ("Starting embedded tests") -ForegroundColor "Green" .$OPENCOVER -register:user -searchdirs:"$RUNTIME_DIR" -output:cs.coverage ` -target:"$NUNIT" -targetargs:"$CS_TESTS" ` + -filter:"+[*]Python.Runtime*" ` -returntargetcode $NUNIT_STATUS = $LastExitCode if ($NUNIT_STATUS -ne 0) { From a343b34dd3d8e5622b15523e54e0c8d01a59215e Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 14 Feb 2017 04:54:32 -0700 Subject: [PATCH 122/324] Remove check-manifest --- setup.cfg | 5 ----- tox.ini | 1 - 2 files changed, 6 deletions(-) diff --git a/setup.cfg b/setup.cfg index 4930652bb..5ee7224f7 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,7 +1,2 @@ [tool:pytest] xfail_strict = True - -[check-manifest] -ignore = - .github - .github/* diff --git a/tox.ini b/tox.ini index ef15d5099..3c9be5c63 100644 --- a/tox.ini +++ b/tox.ini @@ -23,6 +23,5 @@ deps = check-manifest flake8 commands = - check-manifest {toxinidir} flake8 src setup.py python setup.py check --strict --metadata From ce40fb1a72e1e10ec8428bdd55bab7c08e2866ca Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 14 Feb 2017 04:55:41 -0700 Subject: [PATCH 123/324] Add overload tests from #131 --- src/tests/test_method.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/tests/test_method.py b/src/tests/test_method.py index f8b2acf09..e29986969 100644 --- a/src/tests/test_method.py +++ b/src/tests/test_method.py @@ -743,3 +743,29 @@ def test_we_can_bind_to_encoding_get_string(): data = ''.join(data) assert data == 'Some testing string' + + +def test_wrong_overload(): + """Test regression in which implicit conversion caused the wrong types + to be used. See #131 for issue. Fixed by #137, #151""" + + # Used to return `50L` + res = System.Math.Abs(50.5) + assert res == 50.5 + assert type(res) == float + + res = System.Math.Abs(-50.5) + assert res == 50.5 + assert type(res) == float + + res = System.Math.Max(50.5, 50.1) + assert res == 50.5 + assert type(res) == float + + res = System.Math.Max(System.Double(10.5), System.Double(50.5)) + assert res == 50.5 + assert type(res) == float # Should it return a System.Double? + + res = System.Math.Max(System.Double(50.5), 50.1) + assert res == 50.5 + assert type(res) == float From 8add8d1e29b84339a8fb72cf60a29ffdc8ea5cee Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 14 Feb 2017 07:57:57 -0700 Subject: [PATCH 124/324] Refactor converter.cs & methodbind*.cs (#375) --- src/runtime/converter.cs | 85 ++++++++++++++----------------- src/runtime/methodbinder.cs | 99 ++++++++++++++++-------------------- src/runtime/methodbinding.cs | 30 +++++------ 3 files changed, 97 insertions(+), 117 deletions(-) diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index 3a3fa309d..aeaf2d871 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -52,62 +52,53 @@ static Converter() /// internal static Type GetTypeByAlias(IntPtr op) { - if (op == Runtime.PyStringType || - op == Runtime.PyUnicodeType) - { + if (op == Runtime.PyStringType) return stringType; - } - else if (op == Runtime.PyIntType) - { + + if (op == Runtime.PyUnicodeType) + return stringType; + + if (op == Runtime.PyIntType) return int32Type; - } - else if (op == Runtime.PyLongType) - { + + if (op == Runtime.PyLongType) return int64Type; - } - else if (op == Runtime.PyFloatType) - { + + if (op == Runtime.PyFloatType) return doubleType; - } - else if (op == Runtime.PyBoolType) - { + + if (op == Runtime.PyBoolType) return boolType; - } + return null; } internal static IntPtr GetPythonTypeByAlias(Type op) { if (op == stringType) - { return Runtime.PyUnicodeType; - } - else if (Runtime.IsPython3 && (op == int16Type || - op == int32Type || - op == int64Type)) - { + if (op == int16Type) return Runtime.PyIntType; - } - else if (op == int16Type || - op == int32Type) - { + if (op == int32Type) return Runtime.PyIntType; - } - else if (op == int64Type) - { + + if (op == int64Type && Runtime.IsPython2) return Runtime.PyLongType; - } - else if (op == doubleType || - op == singleType) - { + + if (op == int64Type) + return Runtime.PyIntType; + + if (op == doubleType) return Runtime.PyFloatType; - } - else if (op == boolType) - { + + if (op == singleType) + return Runtime.PyFloatType; + + if (op == boolType) return Runtime.PyBoolType; - } + return IntPtr.Zero; } @@ -329,27 +320,27 @@ internal static bool ToManagedValue(IntPtr value, Type obType, return ToPrimitive(value, stringType, out result, setError); } - else if (Runtime.PyBool_Check(value)) + if (Runtime.PyBool_Check(value)) { return ToPrimitive(value, boolType, out result, setError); } - else if (Runtime.PyInt_Check(value)) + if (Runtime.PyInt_Check(value)) { return ToPrimitive(value, int32Type, out result, setError); } - else if (Runtime.PyLong_Check(value)) + if (Runtime.PyLong_Check(value)) { return ToPrimitive(value, int64Type, out result, setError); } - else if (Runtime.PyFloat_Check(value)) + if (Runtime.PyFloat_Check(value)) { return ToPrimitive(value, doubleType, out result, setError); } - else if (Runtime.PySequence_Check(value)) + if (Runtime.PySequence_Check(value)) { return ToArray(value, typeof(object[]), out result, setError); } @@ -371,31 +362,31 @@ internal static bool ToManagedValue(IntPtr value, Type obType, return true; } - else if (value == Runtime.PyBoolType) + if (value == Runtime.PyBoolType) { result = boolType; return true; } - else if (value == Runtime.PyIntType) + if (value == Runtime.PyIntType) { result = int32Type; return true; } - else if (value == Runtime.PyLongType) + if (value == Runtime.PyLongType) { result = int64Type; return true; } - else if (value == Runtime.PyFloatType) + if (value == Runtime.PyFloatType) { result = doubleType; return true; } - else if (value == Runtime.PyListType || value == Runtime.PyTupleType) + if (value == Runtime.PyListType || value == Runtime.PyTupleType) { result = typeof(object[]); return true; diff --git a/src/runtime/methodbinder.cs b/src/runtime/methodbinder.cs index 86a76dd82..1417c21c5 100644 --- a/src/runtime/methodbinder.cs +++ b/src/runtime/methodbinder.cs @@ -170,6 +170,9 @@ internal MethodBase[] GetMethods() /// Precedence algorithm largely lifted from jython - the concerns are /// generally the same so we'll start w/this and tweak as necessary. /// + /// + /// TODO: Add link to specific Jython Section/Code/File + /// internal static int GetPrecedence(MethodBase mi) { ParameterInfo[] pi = mi.GetParameters(); @@ -198,61 +201,49 @@ internal static int ArgPrecedence(Type t) TypeCode tc = Type.GetTypeCode(t); // TODO: Clean up - if (tc == TypeCode.Object) + switch (tc) { - return 1; - } - if (tc == TypeCode.UInt64) - { - return 10; - } - if (tc == TypeCode.UInt32) - { - return 11; - } - if (tc == TypeCode.UInt16) - { - return 12; - } - if (tc == TypeCode.Int64) - { - return 13; - } - if (tc == TypeCode.Int32) - { - return 14; - } - if (tc == TypeCode.Int16) - { - return 15; - } - if (tc == TypeCode.Char) - { - return 16; - } - if (tc == TypeCode.SByte) - { - return 17; - } - if (tc == TypeCode.Byte) - { - return 18; - } - if (tc == TypeCode.Single) - { - return 20; - } - if (tc == TypeCode.Double) - { - return 21; - } - if (tc == TypeCode.String) - { - return 30; - } - if (tc == TypeCode.Boolean) - { - return 40; + case TypeCode.Object: + return 1; + + case TypeCode.UInt64: + return 10; + + case TypeCode.UInt32: + return 11; + + case TypeCode.UInt16: + return 12; + + case TypeCode.Int64: + return 13; + + case TypeCode.Int32: + return 14; + + case TypeCode.Int16: + return 15; + + case TypeCode.Char: + return 16; + + case TypeCode.SByte: + return 17; + + case TypeCode.Byte: + return 18; + + case TypeCode.Single: + return 20; + + case TypeCode.Double: + return 21; + + case TypeCode.String: + return 30; + + case TypeCode.Boolean: + return 40; } if (t.IsArray) diff --git a/src/runtime/methodbinding.cs b/src/runtime/methodbinding.cs index df6632068..07090a92c 100644 --- a/src/runtime/methodbinding.cs +++ b/src/runtime/methodbinding.cs @@ -55,8 +55,7 @@ public static IntPtr mp_subscript(IntPtr tp, IntPtr idx) return Exceptions.RaiseTypeError("No match found for given type params"); } - var mb = new MethodBinding(self.m, self.target); - mb.info = mi; + var mb = new MethodBinding(self.m, self.target) { info = mi }; Runtime.XIncref(mb.pyHandle); return mb.pyHandle; } @@ -76,22 +75,21 @@ public static IntPtr tp_getattro(IntPtr ob, IntPtr key) } string name = Runtime.GetManagedString(key); - if (name == "__doc__") + switch (name) { - IntPtr doc = self.m.GetDocString(); - Runtime.XIncref(doc); - return doc; + case "__doc__": + IntPtr doc = self.m.GetDocString(); + Runtime.XIncref(doc); + return doc; + // FIXME: deprecate __overloads__ soon... + case "__overloads__": + case "Overloads": + var om = new OverloadMapper(self.m, self.target); + Runtime.XIncref(om.pyHandle); + return om.pyHandle; + default: + return Runtime.PyObject_GenericGetAttr(ob, key); } - - // FIXME: deprecate __overloads__ soon... - if (name == "__overloads__" || name == "Overloads") - { - var om = new OverloadMapper(self.m, self.target); - Runtime.XIncref(om.pyHandle); - return om.pyHandle; - } - - return Runtime.PyObject_GenericGetAttr(ob, key); } From a019017bd2dec6871fe78c69b12ebf10c75a79f4 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 13 Feb 2017 22:14:35 -0700 Subject: [PATCH 125/324] Cleanup/Comment Python.Runtime.dll.config & travis We don't need the `*.dll` variant since we don't call for those in `runtime.cs` Enable embedded tests on travis --- .travis.yml | 5 ++++- Python.Runtime.dll.config | 9 ++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1bd377871..cf236ccfe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,9 +35,12 @@ install: - coverage run setup.py build_ext --inplace script: + # Set-up and run python tests - export PYTHONPATH=`pwd`:$PYTHONPATH - python -m pytest - # - mono ./packages/NUnit.*/tools/nunit3-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll + + # Run embedded tests + - mono ./packages/NUnit.*/tools/nunit3-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll after_success: # Uncomment if need to geninterop, ie. py37 final diff --git a/Python.Runtime.dll.config b/Python.Runtime.dll.config index 8591f58fe..b820676cf 100644 --- a/Python.Runtime.dll.config +++ b/Python.Runtime.dll.config @@ -4,17 +4,12 @@ Keep this file next to Python.Runtime.dll For more information read: http://www.mono-project.com/Config - http://www.mono-project.com/Config_DllMap --> + http://www.mono-project.com/docs/advanced/pinvoke/dllmap --> + - - - - - - From 5ad3408c77acf851f72bd73931c3f420a17cdc24 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 14 Feb 2017 03:35:23 -0700 Subject: [PATCH 126/324] Add LD_LIBRARY_PATH to travis env Find dlls for embedded tests on PY3 --- .travis.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.travis.yml b/.travis.yml index cf236ccfe..3f32f1e7e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,6 +39,14 @@ script: - export PYTHONPATH=`pwd`:$PYTHONPATH - python -m pytest + # Set-up dll path for embedded tests + - export LD_LIBRARY_PATH=/opt/python/2.7.9/lib:$LD_LIBRARY_PATH + - export LD_LIBRARY_PATH=/opt/python/3.3.5/lib:$LD_LIBRARY_PATH + - export LD_LIBRARY_PATH=/opt/python/3.4.2/lib:$LD_LIBRARY_PATH + - export LD_LIBRARY_PATH=/opt/python/3.5.2/lib:$LD_LIBRARY_PATH + - export LD_LIBRARY_PATH=/opt/python/3.6.0/lib:$LD_LIBRARY_PATH + - export LD_LIBRARY_PATH=/opt/python/3.7.0/lib:$LD_LIBRARY_PATH + - echo $LD_LIBRARY_PATH # Run embedded tests - mono ./packages/NUnit.*/tools/nunit3-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll From 31f0b30147060a6f5ed7964bf2c6aa9b1a2c9277 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 14 Feb 2017 03:50:48 -0700 Subject: [PATCH 127/324] Find dll for PY2 travis embedded tests Copy Python.Runtime.dll.config to embedded tests bin output --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 3f32f1e7e..21b766eb3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,6 +47,7 @@ script: - export LD_LIBRARY_PATH=/opt/python/3.6.0/lib:$LD_LIBRARY_PATH - export LD_LIBRARY_PATH=/opt/python/3.7.0/lib:$LD_LIBRARY_PATH - echo $LD_LIBRARY_PATH + - cp Python.Runtime.dll.config src/embed_tests/bin/Python.Runtime.dll.config # Run embedded tests - mono ./packages/NUnit.*/tools/nunit3-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll From fcd1cd2ffeed3e658c6444f04d223b18f71d62d8 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 14 Feb 2017 12:23:51 -0700 Subject: [PATCH 128/324] Generalize LD_LIBRARY_PATH Avoid having to manually update python/travis versions --- .travis.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 21b766eb3..f9c99b5f7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,12 +40,9 @@ script: - python -m pytest # Set-up dll path for embedded tests - - export LD_LIBRARY_PATH=/opt/python/2.7.9/lib:$LD_LIBRARY_PATH - - export LD_LIBRARY_PATH=/opt/python/3.3.5/lib:$LD_LIBRARY_PATH - - export LD_LIBRARY_PATH=/opt/python/3.4.2/lib:$LD_LIBRARY_PATH - - export LD_LIBRARY_PATH=/opt/python/3.5.2/lib:$LD_LIBRARY_PATH - - export LD_LIBRARY_PATH=/opt/python/3.6.0/lib:$LD_LIBRARY_PATH - - export LD_LIBRARY_PATH=/opt/python/3.7.0/lib:$LD_LIBRARY_PATH + - OUTPUT=$(python --version 2>&1) + - PY_VER=${OUTPUT:7:9} + - export LD_LIBRARY_PATH=/opt/python/$PY_VER/lib:$LD_LIBRARY_PATH - echo $LD_LIBRARY_PATH - cp Python.Runtime.dll.config src/embed_tests/bin/Python.Runtime.dll.config # Run embedded tests From 6afc9e684856fca988c6d5260ee2d6de3735b7cf Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 14 Feb 2017 16:33:16 -0700 Subject: [PATCH 129/324] Add GetPrecedence reference --- src/runtime/methodbinder.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/runtime/methodbinder.cs b/src/runtime/methodbinder.cs index 1417c21c5..b3df8448f 100644 --- a/src/runtime/methodbinder.cs +++ b/src/runtime/methodbinder.cs @@ -167,11 +167,12 @@ internal MethodBase[] GetMethods() } /// - /// Precedence algorithm largely lifted from jython - the concerns are - /// generally the same so we'll start w/this and tweak as necessary. + /// Precedence algorithm largely lifted from Jython - the concerns are + /// generally the same so we'll start with this and tweak as necessary. /// /// - /// TODO: Add link to specific Jython Section/Code/File + /// Based from Jython `org.python.core.ReflectedArgs.precedence` + /// See: https://github.com/jythontools/jython/blob/master/src/org/python/core/ReflectedArgs.java#L192 /// internal static int GetPrecedence(MethodBase mi) { @@ -328,7 +329,7 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth else if (pynargs > clrnargs && clrnargs > 0 && Attribute.IsDefined(pi[clrnargs - 1], typeof(ParamArrayAttribute))) { - // This is a spam(params object[] egg) style method + // This is a `foo(params object[] bar)` style method match = true; arrayStart = clrnargs - 1; } From 8f30a39a2b53f664e814a470972724c7ccb75567 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 14 Feb 2017 21:21:32 -0700 Subject: [PATCH 130/324] Use builtin miniconda --- appveyor.yml | 9 +--- ci/appveyor_build_recipe.ps1 | 21 ++++++-- ci/install_miniconda.ps1 | 95 ------------------------------------ ci/run_with_env.cmd | 85 -------------------------------- 4 files changed, 20 insertions(+), 190 deletions(-) delete mode 100644 ci/install_miniconda.ps1 delete mode 100644 ci/run_with_env.cmd diff --git a/appveyor.yml b/appveyor.yml index c80fdd541..080aa3807 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -11,13 +11,7 @@ environment: PYTHONWARNINGS: 'ignore:::wheel.pep425tags:' PYTHONPATH: C:\testdir NUNIT: nunit3-console - CONDA_BLD: C:\conda - CONDA_BLD_VERSION: 3.5 - - # SDK v7.0 MSVC Express 2008's SetEnv.cmd script will fail if the - # /E:ON and /V:ON options are not enabled in the batch script interpreter - # See: http://stackoverflow.com/a/13751649/163740 - CMD_IN_ENV: 'cmd /E:ON /V:ON /C .\ci\run_with_env.cmd' + CONDA_BLD: C:\miniconda35 matrix: - PYTHON_VERSION: 2.7 @@ -37,6 +31,7 @@ init: - if %PLATFORM%==x86 (set CONDA_BLD_ARCH=32) # - if %PLATFORM%==x86 (set NUNIT=%NUNIT%-x86) - if %PLATFORM%==x64 (set PYTHON=%PYTHON%-x64) + - if %PLATFORM%==x64 (set CONDA_BLD=%CONDA_BLD%-x64) # Prepend newly installed Python to the PATH of this build - set PATH=%PYTHON%;%PYTHON%\Scripts;%PATH% diff --git a/ci/appveyor_build_recipe.ps1 b/ci/appveyor_build_recipe.ps1 index 0c885d88d..cd11f57b9 100644 --- a/ci/appveyor_build_recipe.ps1 +++ b/ci/appveyor_build_recipe.ps1 @@ -1,6 +1,21 @@ if ($env:APPVEYOR_PULL_REQUEST_NUMBER) { - Invoke-Expression .\ci\install_miniconda.ps1 - &"$env:CONDA_BLD\Scripts\conda" build conda.recipe --dirty -q - $CONDA_PKG=(&"$env:CONDA_BLD\Scripts\conda" build conda.recipe --output -q) + # Update PATH, and keep a copy to restore at end of this PowerShell script + $old_path = $env:path + $env:path = "$env:CONDA_BLD;$env:CONDA_BLD\Scripts;" + $env:path + + Write-Host "Starting Conda Update/Install" -ForegroundColor "Green" + conda update conda -q -y + conda install conda-build jinja2 anaconda-client -q -y + + Write-Host "Starting Conda Recipe build" -ForegroundColor "Green" + conda build conda.recipe -q --dirty + + $CONDA_PKG=(conda build conda.recipe -q --output) Copy-Item $CONDA_PKG "$env:APPVEYOR_BUILD_FOLDER\dist\" + Write-Host "Completed Conda Recipe build" -ForegroundColor "Green" + + # Restore PATH back to original + $env:path = $old_path +} else { + Write-Host "Skipping Conda Recipe build" -ForegroundColor "Green" } diff --git a/ci/install_miniconda.ps1 b/ci/install_miniconda.ps1 deleted file mode 100644 index 5c87ca894..000000000 --- a/ci/install_miniconda.ps1 +++ /dev/null @@ -1,95 +0,0 @@ -# Sample script to install Miniconda under Windows -# Authors: Olivier Grisel, Jonathan Helmus and Kyle Kastner, Robert McGibbon -# License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/ - -$MINICONDA_URL = "http://repo.continuum.io/miniconda/" - - -function DownloadMiniconda($python_version, $platform_suffix) { - $webclient = New-Object System.Net.WebClient - $filename = "Miniconda3-latest-Windows-" + $platform_suffix + ".exe" - $url = $MINICONDA_URL + $filename - - $basedir = $pwd.Path + "\" - $filepath = $basedir + $filename - if (Test-Path $filename) { - Write-Host "Reusing" $filepath - return $filepath - } - - # Download and retry up to 3 times in case of network transient errors. - Write-Host "Downloading" $filename "from" $url - $retry_attempts = 2 - for ($i=0; $i -lt $retry_attempts; $i++) { - try { - $webclient.DownloadFile($url, $filepath) - break - } - catch [Exception] { - Start-Sleep 1 - } - } - - if (Test-Path $filepath) { - Write-Host "File saved at" $filepath - } else { - # Retry once to get the error message if any at the last try - $webclient.DownloadFile($url, $filepath) - } - return $filepath -} - - -function InstallMiniconda($python_version, $architecture, $python_home) { - Write-Host "Installing Python $python_version $architecture bit to $python_home" - if (Test-Path $python_home) { - Write-Host "$python_home already exists, skipping." - } - if ($architecture -match "32") { - $platform_suffix = "x86" - } else { - $platform_suffix = "x86_64" - } - - $filepath = DownloadMiniconda $python_version $platform_suffix - Write-Host "Installing $filepath to $python_home" - $install_log = $python_home + ".log" - $args = "/S /D=$python_home" - Write-Host $filepath $args - Start-Process -FilePath $filepath -ArgumentList $args -Wait -Passthru - if (Test-Path $python_home) { - Write-Host "Python $python_version $architecture bit installation complete" - } else { - Write-Host "Failed to install Python in $python_home" - Get-Content -Path $install_log - Exit 1 - } -} - - -function InstallCondaPackages($python_home, $spec) { - $conda_path = $python_home + "\Scripts\conda.exe" - $args = "install --yes " + $spec - Write-Host ("conda " + $args) -ForegroundColor "Green" - Start-Process -FilePath "$conda_path" -ArgumentList $args -Wait -Passthru -} - - -function UpdateConda($python_home) { - $conda_path = $python_home + "\Scripts\conda.exe" - Write-Host "Updating conda..." -ForegroundColor "Green" - $args = "update --yes conda" - Write-Host $conda_path $args - Start-Process -FilePath "$conda_path" -ArgumentList $args -Wait -Passthru -} - - -function main() { - Write-Host "Starting install_miniconda.ps1" -ForegroundColor "Green" - InstallMiniconda $env:CONDA_BLD_VERSION $env:CONDA_BLD_ARCH $env:CONDA_BLD - UpdateConda $env:CONDA_BLD - InstallCondaPackages $env:CONDA_BLD "conda-build jinja2 anaconda-client" - Write-Host "Completed install_miniconda.ps1" -ForegroundColor "Green" -} - -main diff --git a/ci/run_with_env.cmd b/ci/run_with_env.cmd deleted file mode 100644 index c88489f2c..000000000 --- a/ci/run_with_env.cmd +++ /dev/null @@ -1,85 +0,0 @@ -:: EXPECTED ENV VARS: PYTHON_ARCH (either x86 or x64) -:: CONDA_PY (either 27, 33, 35 etc. - only major version is extracted) -:: -:: -:: To build extensions for 64 bit Python 3, we need to configure environment -:: variables to use the MSVC 2010 C++ compilers from GRMSDKX_EN_DVD.iso of: -:: MS Windows SDK for Windows 7 and .NET Framework 4 (SDK v7.1) -:: -:: To build extensions for 64 bit Python 2, we need to configure environment -:: variables to use the MSVC 2008 C++ compilers from GRMSDKX_EN_DVD.iso of: -:: MS Windows SDK for Windows 7 and .NET Framework 3.5 (SDK v7.0) -:: -:: 32 bit builds, and 64-bit builds for 3.5 and beyond, do not require specific -:: environment configurations. -:: -:: Note: this script needs to be run with the /E:ON and /V:ON flags for the -:: cmd interpreter, at least for (SDK v7.0) -:: -:: More details at: -:: https://github.com/cython/cython/wiki/64BitCythonExtensionsOnWindows -:: http://stackoverflow.com/a/13751649/163740 -:: -:: Author: Phil Elson -:: Original Author: Olivier Grisel (https://github.com/ogrisel/python-appveyor-demo) -:: License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/ -:: -:: Notes about batch files for Python people: -:: -:: Quotes in values are literally part of the values: -:: SET FOO="bar" -:: FOO is now five characters long: " b a r " -:: If you don't want quotes, don't include them on the right-hand side. -:: -:: The CALL lines at the end of this file look redundant, but if you move them -:: outside of the IF clauses, they do not run properly in the SET_SDK_64==Y -:: case, I don't know why. -:: originally from https://github.com/pelson/Obvious-CI/blob/master/scripts/obvci_appveyor_python_build_env.cmd -:: https://github.com/alimanfoo/zarr/blob/master/build.cmd -:: https://github.com/cython/cython/blob/master/appveyor/run_with_env.cmd -:: https://github.com/cjrh/easycython/blob/master/appveyor/setup_build_env.cmd -@ECHO OFF - -SET COMMAND_TO_RUN=%* -SET WIN_SDK_ROOT=C:\Program Files\Microsoft SDKs\Windows - -:: CONDA_PY style, such as 27, 34 etc. -SET MAJOR_PYTHON_VERSION=%CONDA_PY:~0,1% -SET MINOR_PYTHON_VERSION=%CONDA_PY:~1,1% - -:: Based on the Python version, determine what SDK version to use, and whether -:: to set the SDK for 64-bit. -IF %MAJOR_PYTHON_VERSION% == 2 ( - SET WINDOWS_SDK_VERSION="v7.0" - SET SET_SDK_64=Y -) ELSE IF %MAJOR_PYTHON_VERSION% == 3 ( - SET WINDOWS_SDK_VERSION="v7.1" - IF %MINOR_PYTHON_VERSION% LEQ 4 ( - SET SET_SDK_64=Y - ) ELSE ( - SET SET_SDK_64=N - ) -) ELSE ( - ECHO Unsupported Python version: "%MAJOR_PYTHON_VERSION%" - EXIT /B 1 -) - -IF "%PYTHON_ARCH%"=="64" ( - IF %SET_SDK_64% == Y ( - ECHO Configuring Windows SDK %WINDOWS_SDK_VERSION% for Python %MAJOR_PYTHON_VERSION% on a 64 bit architecture - SET DISTUTILS_USE_SDK=1 - SET MSSdk=1 - "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Setup\WindowsSdkVer.exe" -q -version:%WINDOWS_SDK_VERSION% - "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Bin\SetEnv.cmd" /x64 /release - ECHO Executing: %COMMAND_TO_RUN% - call %COMMAND_TO_RUN% || EXIT /B 1 - ) ELSE ( - ECHO Using default MSVC build environment for 64 bit architecture - ECHO Executing: %COMMAND_TO_RUN% - call %COMMAND_TO_RUN% || EXIT /B 1 - ) -) ELSE ( - ECHO Using default MSVC build environment for 32 bit architecture - ECHO Executing: %COMMAND_TO_RUN% - call %COMMAND_TO_RUN% || EXIT /B 1 -) From 1bd8636089e762d30446beb0ecde8cdabedc564f Mon Sep 17 00:00:00 2001 From: denfromufa Date: Wed, 15 Feb 2017 13:29:11 -0600 Subject: [PATCH 131/324] Update version (#379) * Update setup.py * Update clr.py --- setup.py | 2 +- src/runtime/resources/clr.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index f2790ddd3..37a936584 100644 --- a/setup.py +++ b/setup.py @@ -368,7 +368,7 @@ def run(self): setup( name="pythonnet", - version="2.2.2", + version="2.3.0.dev1", description=".Net and Mono integration for Python", url='https://pythonnet.github.io/', license='MIT', diff --git a/src/runtime/resources/clr.py b/src/runtime/resources/clr.py index c329b1f6d..ccd17889f 100644 --- a/src/runtime/resources/clr.py +++ b/src/runtime/resources/clr.py @@ -2,7 +2,7 @@ Code in this module gets loaded into the main clr module. """ -__version__ = "2.2.2" +__version__ = "2.3.0.dev1" class clrproperty(object): From 08c2d646d588539c27b6c9e4af3cddfbc3f97ce9 Mon Sep 17 00:00:00 2001 From: denfromufa Date: Thu, 16 Feb 2017 03:15:26 -0600 Subject: [PATCH 132/324] StackOverflow/Slack shields (#384) Add StackExchange and Slack shields Shields got too long for a single line, had to break them up into two lines. One for build/quality status, the other for social/info. Add regression number to disabled code. --- README.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 86825386c..c66e8eef8 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,12 @@ [![appveyor shield][]](https://ci.appveyor.com/project/pythonnet/pythonnet/branch/master) [![travis shield][]](https://travis-ci.org/pythonnet/pythonnet) [![codecov shield][]](https://codecov.io/github/pythonnet/pythonnet) + [![license shield][]](./LICENSE) [![pypi package version][]](https://pypi.python.org/pypi/pythonnet) [![python supported shield][]](https://pypi.python.org/pypi/pythonnet) +[![stackexchange shield][]](http://stackoverflow.com/questions/tagged/python.net) +[![slack][]](https://pythonnet.slack.com) Python for .NET is a package that gives Python programmers nearly seamless integration with the .NET Common Language Runtime (CLR) and @@ -35,14 +38,14 @@ from System.Windows.Forms import Form ## Embedding Python in .NET - All calls to python should be inside - a `using (Py.GIL()) {/_ Your code here _/}` block. + a `using (Py.GIL()) {/* Your code here */}` block. - Import python modules using `dynamic mod = Py.Import("mod")`, then you can call functions as normal, eg `mod.func(args)`. - Use `mod.func(args, Py.kw("keywordargname", keywordargvalue))` to apply keyword arguments. - All python objects should be declared as `dynamic` type. - Mathematical operations involving python and literal/managed types must - have the python object first, eg `np.pi_2` works, `2_np.pi` doesn't. + have the python object first, eg. `np.pi_2` works, `2_np.pi` doesn't. ### Example @@ -57,7 +60,7 @@ static void Main(string[] args) Console.WriteLine(sin(5)); double c = np.cos(5) + sin(5); Console.WriteLine(c); - /* this block is temporarily disabled due to regression + /* this block is temporarily disabled due to regression #249 dynamic a = np.array(new List { 1, 2, 3 }); dynamic b = np.array(new List { 6, 5, 4 }, Py.kw("dtype", np.int32)); Console.WriteLine(a.dtype); @@ -81,7 +84,7 @@ int32 [appveyor shield]: https://img.shields.io/appveyor/ci/pythonnet/pythonnet/master.svg?label=AppVeyor -[codecov shield]: https://img.shields.io/codecov/c/github/pythonnet/pythonnet/master.svg?label=codecov +[codecov shield]: https://img.shields.io/codecov/c/github/pythonnet/pythonnet/master.svg?label=Codecov [license shield]: https://img.shields.io/badge/license-MIT-blue.svg?maxAge=3600 @@ -89,4 +92,8 @@ int32 [python supported shield]: https://img.shields.io/pypi/pyversions/pythonnet.svg +[slack]: https://img.shields.io/badge/chat-slack-color.svg?style=social + +[stackexchange shield]: https://img.shields.io/badge/StackOverflow-python.net-blue.svg + [travis shield]: https://img.shields.io/travis/pythonnet/pythonnet/master.svg?label=Travis From 0f00e3a995d1d00d863ce9c170f8809722bcf1c9 Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Thu, 16 Feb 2017 14:02:45 +0100 Subject: [PATCH 133/324] Slack integration for Travis and Appveyor (#386) * Add Slack integration for Travis * Use encrypted string for Travis. * Add hook for Appveyor. --- .travis.yml | 2 ++ appveyor.yml | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/.travis.yml b/.travis.yml index 5b56cf4a6..1cb2d3fb4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -57,3 +57,5 @@ after_success: notifications: email: false + slack: + secure: "UiQdSK1/uNnHl8/gQgfLj/F5JGxtJuaT3QYtKNcw3Ddpr3FX8tfXJ/RjsCsSlRQzDm7AdBAeMzcBQmvH4iRIV2y7qVywLyru5MPiwY4ZjMN6fJK/zaaxetOct9fasIBYzHguNPDAtiBGFh2iK1H1MXTY8rkmU3WZvl18b8EsrP0=" diff --git a/appveyor.yml b/appveyor.yml index 080aa3807..35fb2c5cc 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -68,3 +68,8 @@ on_finish: artifacts: - path: dist\* + +notifications: + - provider: Slack + incoming_webhook: + secure: 2S/t6rGHdbwoxehnvn5KgfsHrBFEtwnPD7M5olGErmz70oWFVpqoWd/EvDwh7rKZGdOTjDmpwcukc2xi5VRaGHbBAqFYS3tAdgAMrcaTNWs= From 4ecde5b0f5e5482559c1cde663b68f4e67ee54f7 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 16 Feb 2017 02:54:28 -0700 Subject: [PATCH 134/324] Simplify LD_LIBRARY_PATH on Travis Based from: http://stackoverflow.com/a/24115039/5208670 Moved to own section to separate as a prep-enviroment step --- .travis.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1cb2d3fb4..dabc5c338 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ sudo: false -# language: csharp installs mono/dotnet but has limited python. language: python python: - 2.7 @@ -29,6 +28,11 @@ addons: - mono-devel - ca-certificates-mono +before_install: + # Set-up dll path for embedded tests + - PY_LIBDIR=$(python -c 'import sysconfig; print(sysconfig.get_config_var("LIBDIR"))') + - export LD_LIBRARY_PATH=$PY_LIBDIR:$LD_LIBRARY_PATH + install: - pip install --upgrade pycparser coverage codecov pytest # setup.py install works too, but need to deal w Python.test then @@ -39,11 +43,6 @@ script: - export PYTHONPATH=`pwd`:$PYTHONPATH - python -m pytest - # Set-up dll path for embedded tests - - OUTPUT=$(python --version 2>&1) - - PY_VER=${OUTPUT:7:9} - - export LD_LIBRARY_PATH=/opt/python/$PY_VER/lib:$LD_LIBRARY_PATH - - echo $LD_LIBRARY_PATH - cp Python.Runtime.dll.config src/embed_tests/bin/Python.Runtime.dll.config # Run embedded tests # - mono ./packages/NUnit.*/tools/nunit3-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll From c64e34e3a1b47e8ec36afbc1fa5f6ab2f2ecadb9 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 16 Feb 2017 03:01:00 -0700 Subject: [PATCH 135/324] Rename NUnit vars to generic names Makes it easier to switch test-runners in the future. Note the if section is being skipped for NUnit3, but leaving it in case needed to rollback to NUnit2, or upgrade to XUnit --- appveyor.yml | 2 -- ci/appveyor_run_tests.ps1 | 20 ++++++++++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 35fb2c5cc..facdacff1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -10,7 +10,6 @@ environment: PYTHONUNBUFFERED: True PYTHONWARNINGS: 'ignore:::wheel.pep425tags:' PYTHONPATH: C:\testdir - NUNIT: nunit3-console CONDA_BLD: C:\miniconda35 matrix: @@ -29,7 +28,6 @@ init: - set CONDA_BLD_ARCH=%PLATFORM:x=% - set PYTHON=C:\PYTHON%PYTHON_VERSION:.=% - if %PLATFORM%==x86 (set CONDA_BLD_ARCH=32) - # - if %PLATFORM%==x86 (set NUNIT=%NUNIT%-x86) - if %PLATFORM%==x64 (set PYTHON=%PYTHON%-x64) - if %PLATFORM%==x64 (set CONDA_BLD=%CONDA_BLD%-x64) diff --git a/ci/appveyor_run_tests.ps1 b/ci/appveyor_run_tests.ps1 index fbfc773a5..194056c75 100644 --- a/ci/appveyor_run_tests.ps1 +++ b/ci/appveyor_run_tests.ps1 @@ -1,9 +1,17 @@ -# Script to simplify appveyor configuration and resolve path to tools +# Script to simplify AppVeyor configuration and resolve path to tools + +# Test Runner framework being used for embedded tests +$CS_RUNNER = "nunit3-console" + +# Needed for ARCH specific runners(NUnit2/XUnit3). Skip for NUnit3 +if ($FALSE -and $env:PLATFORM -eq "x86"){ + $CS_RUNNER = $CS_RUNNER + "-x86" +} # Executable paths for OpenCover # Note if OpenCover fails, it won't affect the exit codes. $OPENCOVER = Resolve-Path .\packages\OpenCover.*\tools\OpenCover.Console.exe -$NUNIT = Resolve-Path .\packages\NUnit.*\tools\"$env:NUNIT".exe +$CS_RUNNER = Resolve-Path .\packages\NUnit.*\tools\"$CS_RUNNER".exe $PY = Get-Command python # Can't use ".\build\*\Python.EmbeddingTest.dll". Missing framework files. @@ -27,16 +35,16 @@ if ($PYTHON_STATUS -ne 0) { # Powershell options splatting: http://stackoverflow.com/a/24313253/5208670 Write-Host ("Starting embedded tests") -ForegroundColor "Green" .$OPENCOVER -register:user -searchdirs:"$RUNTIME_DIR" -output:cs.coverage ` - -target:"$NUNIT" -targetargs:"$CS_TESTS" ` + -target:"$CS_RUNNER" -targetargs:"$CS_TESTS" ` -filter:"+[*]Python.Runtime*" ` -returntargetcode -$NUNIT_STATUS = $LastExitCode -if ($NUNIT_STATUS -ne 0) { +$CS_STATUS = $LastExitCode +if ($CS_STATUS -ne 0) { Write-Host "Embedded tests failed" -ForegroundColor "Red" } # Set exit code to fail if either Python or Embedded tests failed -if ($PYTHON_STATUS -ne 0 -or $NUNIT_STATUS -ne 0) { +if ($PYTHON_STATUS -ne 0 -or $CS_STATUS -ne 0) { Write-Host "Tests failed" -ForegroundColor "Red" $host.SetShouldExit(1) } From 1d7e784b0b7b493dfd05d055479f4dd8fc870c06 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 16 Feb 2017 03:04:51 -0700 Subject: [PATCH 136/324] Remove python test STDERR redirect Pytest doesn't need stderr redirect. It behaves --- ci/appveyor_run_tests.ps1 | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ci/appveyor_run_tests.ps1 b/ci/appveyor_run_tests.ps1 index 194056c75..4245d1577 100644 --- a/ci/appveyor_run_tests.ps1 +++ b/ci/appveyor_run_tests.ps1 @@ -19,20 +19,16 @@ $CS_TESTS = ".\src\embed_tests\bin\Python.EmbeddingTest.dll" $RUNTIME_DIR = ".\src\runtime\bin\" # Run python tests with C# coverage -# why `2>&1 | %{ "$_" }`? see: http://stackoverflow.com/a/20950421/5208670 Write-Host ("Starting Python tests") -ForegroundColor "Green" .$OPENCOVER -register:user -searchdirs:"$RUNTIME_DIR" -output:py.coverage ` -target:"$PY" -targetargs:"-m pytest" ` - -returntargetcode ` - 2>&1 | %{ "$_" } + -returntargetcode $PYTHON_STATUS = $LastExitCode if ($PYTHON_STATUS -ne 0) { Write-Host "Python tests failed, continuing to embedded tests" -ForegroundColor "Red" } # Run Embedded tests with C# coverage -# Powershell continuation: http://stackoverflow.com/a/2608186/5208670 -# Powershell options splatting: http://stackoverflow.com/a/24313253/5208670 Write-Host ("Starting embedded tests") -ForegroundColor "Green" .$OPENCOVER -register:user -searchdirs:"$RUNTIME_DIR" -output:cs.coverage ` -target:"$CS_RUNNER" -targetargs:"$CS_TESTS" ` From 433dc33edc2872daefb2fda0e3d4fe1b55d5858c Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 16 Feb 2017 03:10:16 -0700 Subject: [PATCH 137/324] Clean-up AppVeyor build recipe Conda automatically updates when doing install. To disable its autoupdate add conda config --set auto_update_conda False --- ci/appveyor_build_recipe.ps1 | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/ci/appveyor_build_recipe.ps1 b/ci/appveyor_build_recipe.ps1 index cd11f57b9..f36702f40 100644 --- a/ci/appveyor_build_recipe.ps1 +++ b/ci/appveyor_build_recipe.ps1 @@ -1,21 +1,24 @@ +# Build `conda.recipe` only if this is a Pull_Request. Saves time for CI. + if ($env:APPVEYOR_PULL_REQUEST_NUMBER) { # Update PATH, and keep a copy to restore at end of this PowerShell script $old_path = $env:path $env:path = "$env:CONDA_BLD;$env:CONDA_BLD\Scripts;" + $env:path - Write-Host "Starting Conda Update/Install" -ForegroundColor "Green" - conda update conda -q -y - conda install conda-build jinja2 anaconda-client -q -y + Write-Host "Starting conda install" -ForegroundColor "Green" + conda config --set always_yes True + conda config --set changeps1 False + conda install conda-build jinja2 anaconda-client --quiet - Write-Host "Starting Conda Recipe build" -ForegroundColor "Green" - conda build conda.recipe -q --dirty + Write-Host "Starting conda build recipe" -ForegroundColor "Green" + conda build conda.recipe --dirty --quiet - $CONDA_PKG=(conda build conda.recipe -q --output) - Copy-Item $CONDA_PKG "$env:APPVEYOR_BUILD_FOLDER\dist\" - Write-Host "Completed Conda Recipe build" -ForegroundColor "Green" + $CONDA_PKG=(conda build conda.recipe --output) + Copy-Item $CONDA_PKG .\dist\ + Write-Host "Completed conda build recipe" -ForegroundColor "Green" # Restore PATH back to original $env:path = $old_path } else { - Write-Host "Skipping Conda Recipe build" -ForegroundColor "Green" + Write-Host "Skipping conda build recipe" -ForegroundColor "Green" } From d319f4ebaedc163ec21a39ca124c51ccbf453afb Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 16 Feb 2017 03:12:02 -0700 Subject: [PATCH 138/324] Add requirements.txt and pytest options Pytest options provide summary for skipped/xfailed tests and adds color on appveyor --- .travis.yml | 4 ++-- appveyor.yml | 5 ++--- requirements.txt | 11 +++++++++++ setup.cfg | 4 ++++ 4 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 requirements.txt diff --git a/.travis.yml b/.travis.yml index dabc5c338..cedd01bf1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,8 +34,8 @@ before_install: - export LD_LIBRARY_PATH=$PY_LIBDIR:$LD_LIBRARY_PATH install: - - pip install --upgrade pycparser coverage codecov pytest - # setup.py install works too, but need to deal w Python.test then + - pip install --upgrade -r requirements.txt + # `setup.py install` works too, but need to deal with `Python.Test` PATH - coverage run setup.py build_ext --inplace script: diff --git a/appveyor.yml b/appveyor.yml index facdacff1..490c4b280 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -40,10 +40,9 @@ init: - python -c "import ctypes; print(ctypes.sizeof(ctypes.c_wchar))" install: - # install for wheels & coverage - - pip install --upgrade pip wheel coverage codecov pytest + - pip install --upgrade -r requirements.txt - # Install OpenCover. Can't put on packages.config; not Linux/Mono compatible + # Install OpenCover. Can't put on `packages.config`, not Mono compatible - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages build_script: diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..19c3693a1 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,11 @@ +# Requirements for both Travis and AppVeyor +pytest +coverage + +# Platform specific requirements +pip; sys_platform == 'win32' +wheel; sys_platform == 'win32' +pycparser; sys_platform != 'win32' + +# Coverage upload +codecov diff --git a/setup.cfg b/setup.cfg index 5ee7224f7..f05de8217 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,2 +1,6 @@ +# Don't combine `.bumpversion.cfg` with `setup.cfg`. Messes up formatting. + [tool:pytest] xfail_strict = True +# -r fsxX: show extra summary info for: (f)ailed, (s)kip, (x)failed, (X)passed +addopts = -r fsxX --color=yes From 5ead8ef214083ad2b958b66271939261f80ea275 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 16 Feb 2017 03:15:18 -0700 Subject: [PATCH 139/324] Quiet sdist output & update comments on AppVeyor --- appveyor.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 490c4b280..83a2b0da6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -20,7 +20,7 @@ environment: - PYTHON_VERSION: 3.6 init: - # Prepare environment + # Prepare Environment - mkdir C:\testdir # Set environment variables depending based on build cfg @@ -46,17 +46,16 @@ install: - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages build_script: - # build clean sdist & wheel with coverage of setup.py, install local wheel - - coverage run setup.py sdist bdist_wheel + # Create clean `sdist`. Only used for releases + - python setup.py --quiet sdist + # Build `wheel` with coverage of `setup.py` + - coverage run setup.py bdist_wheel test_script: - pip install --no-index --find-links=.\dist\ pythonnet - ps: Copy-Item (Resolve-Path .\build\*\Python.Test.dll) C:\testdir - # Test runner - ps: .\ci\appveyor_run_tests.ps1 - - # Build conda-recipe on Pull Requests - ps: .\ci\appveyor_build_recipe.ps1 on_finish: From da940f53920e3606302e92ad7dc57c06668dfbe2 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 16 Feb 2017 03:32:25 -0700 Subject: [PATCH 140/324] Add pytest header info & remove unused fixtures Fixtures came from a different project and I forgot to delete them. Add custom header to gather environment info with test results. Remove testdir from pythonpath. pytest handles this on conftest.py --- appveyor.yml | 6 ----- src/tests/conftest.py | 58 ++++++++++++------------------------------- 2 files changed, 16 insertions(+), 48 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 83a2b0da6..df1fe52c4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -9,7 +9,6 @@ environment: global: PYTHONUNBUFFERED: True PYTHONWARNINGS: 'ignore:::wheel.pep425tags:' - PYTHONPATH: C:\testdir CONDA_BLD: C:\miniconda35 matrix: @@ -34,11 +33,6 @@ init: # Prepend newly installed Python to the PATH of this build - set PATH=%PYTHON%;%PYTHON%\Scripts;%PATH% - # Check that we have the expected version, architecture for Python - - python --version - - python -c "import struct; print(struct.calcsize('P') * 8)" - - python -c "import ctypes; print(ctypes.sizeof(ctypes.c_wchar))" - install: - pip install --upgrade -r requirements.txt diff --git a/src/tests/conftest.py b/src/tests/conftest.py index 85fff291f..7e86f87ae 100644 --- a/src/tests/conftest.py +++ b/src/tests/conftest.py @@ -1,57 +1,31 @@ # -*- coding: utf-8 -*- -# TODO: move tests one out of src. Pythonnet doesn't run... +# TODO: move tests one out of src to project root. +# TODO: travis has numpy on their workers. Maybe add tests? """Helpers for testing.""" -import io -import os +import ctypes import sys +import sysconfig -import pytest import clr +# Add path for Python.Test & Add References sys.path.append('C:/testdir/') clr.AddReference("Python.Test") clr.AddReference("System.Collections") clr.AddReference("System.Data") -DIR_PATH = os.path.dirname(__file__) -FILES_DIR = os.path.join(DIR_PATH, 'files') +def pytest_report_header(config): + """Generate extra report headers""" + # FIXME: https://github.com/pytest-dev/pytest/issues/2257 + is_64bits = sys.maxsize > 2**32 + arch = "x64" if is_64bits else "x86" + ucs = ctypes.sizeof(ctypes.c_wchar) + libdir = sysconfig.get_config_var("LIBDIR") + shared = bool(sysconfig.get_config_var("Py_ENABLE_SHARED")) -@pytest.fixture() -def filepath(): - """Returns full file path for test files.""" - - def make_filepath(filename): - # http://stackoverflow.com/questions/18011902/parameter-to-a-fixture - # Alternate solution is to use paramtrization `inderect=True` - # http://stackoverflow.com/a/33879151 - # Syntax is noisy and requires specific variable names - return os.path.join(FILES_DIR, filename) - - return make_filepath - - -@pytest.fixture() -def load_file(filepath): - """Opens filename with encoding and return its contents.""" - - def make_load_file(filename, encoding='utf-8'): - # http://stackoverflow.com/questions/18011902/parameter-to-a-fixture - # Alternate solution is to use paramtrization `inderect=True` - # http://stackoverflow.com/a/33879151 - # Syntax is noisy and requires specific variable names - # And seems to be limited to only 1 argument. - with io.open(filepath(filename), encoding=encoding) as f: - return f.read().strip() - - return make_load_file - - -@pytest.fixture() -def get_stream(filepath): - def make_stream(filename, encoding='utf-8'): - return io.open(filepath(filename), encoding=encoding) - - return make_stream + header = ("Arch: {arch}, UCS: {ucs}, LIBDIR: {libdir}, " + "Py_ENABLE_SHARED: {shared}".format(**locals())) + return header From 99e04c525f9eb26e478036c0f426f654d468cc36 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 16 Feb 2017 04:44:48 -0700 Subject: [PATCH 141/324] Move Conda env to PowerShell recipe script PY_VER removes the `.` it is used on appveyor_build_recipe.ps1 --- appveyor.yml | 12 ++++-------- ci/appveyor_build_recipe.ps1 | 11 +++++++++++ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index df1fe52c4..1b15f0925 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -9,7 +9,6 @@ environment: global: PYTHONUNBUFFERED: True PYTHONWARNINGS: 'ignore:::wheel.pep425tags:' - CONDA_BLD: C:\miniconda35 matrix: - PYTHON_VERSION: 2.7 @@ -22,15 +21,12 @@ init: # Prepare Environment - mkdir C:\testdir - # Set environment variables depending based on build cfg - - set CONDA_PY=%PYTHON_VERSION:.=% - - set CONDA_BLD_ARCH=%PLATFORM:x=% - - set PYTHON=C:\PYTHON%PYTHON_VERSION:.=% - - if %PLATFORM%==x86 (set CONDA_BLD_ARCH=32) + # Update Environment Variables based on matrix/platform + - set PY_VER=%PYTHON_VERSION:.=% + - set PYTHON=C:\PYTHON%PY_VER% - if %PLATFORM%==x64 (set PYTHON=%PYTHON%-x64) - - if %PLATFORM%==x64 (set CONDA_BLD=%CONDA_BLD%-x64) - # Prepend newly installed Python to the PATH of this build + # Put desired Python version first in PATH - set PATH=%PYTHON%;%PYTHON%\Scripts;%PATH% install: diff --git a/ci/appveyor_build_recipe.ps1 b/ci/appveyor_build_recipe.ps1 index f36702f40..00d28ce88 100644 --- a/ci/appveyor_build_recipe.ps1 +++ b/ci/appveyor_build_recipe.ps1 @@ -1,5 +1,16 @@ # Build `conda.recipe` only if this is a Pull_Request. Saves time for CI. +$env:CONDA_PY = "$env:PY_VER" +# Use pre-installed miniconda. Note that location differs if 64bit +$env:CONDA_BLD = "C:\miniconda35" + +if ($env:PLATFORM -eq "x86"){ + $env:CONDA_BLD_ARCH=32 +} else { + $env:CONDA_BLD_ARCH=64 + $env:CONDA_BLD = "$env:CONDA_BLD" + "-x64" +} + if ($env:APPVEYOR_PULL_REQUEST_NUMBER) { # Update PATH, and keep a copy to restore at end of this PowerShell script $old_path = $env:path From d77f933489c295407b32de332d70fbde1ccfe2a8 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 16 Feb 2017 06:19:47 -0700 Subject: [PATCH 142/324] Use Codecov report flags Upgrade to Codecov v2.0.6, didn't get released to PyPi. --- .travis.yml | 6 ++++-- appveyor.yml | 7 +++++-- requirements.txt | 3 ++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index cedd01bf1..375920fb6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,6 +18,7 @@ env: - LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so - SEGFAULT_SIGNALS=all - PYTHONUNBUFFERED=True + - CODECOV_ENV=TRAVIS_PYTHON_VERSION addons: apt: @@ -51,8 +52,9 @@ after_success: # Uncomment if need to geninterop, ie. py37 final # - python tools/geninterop/geninterop.py - # Waiting on mono-cov support or SharpCover - - codecov + # Waiting on mono-coverage, SharpCover or xr.Baboon + - coverage xml -i + - codecov --file coverage.xml --flags Setup_Linux notifications: email: false diff --git a/appveyor.yml b/appveyor.yml index 1b15f0925..6c26b646f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -9,6 +9,7 @@ environment: global: PYTHONUNBUFFERED: True PYTHONWARNINGS: 'ignore:::wheel.pep425tags:' + CODECOV_ENV: PYTHON_VERSION, PLATFORM matrix: - PYTHON_VERSION: 2.7 @@ -49,8 +50,10 @@ test_script: - ps: .\ci\appveyor_build_recipe.ps1 on_finish: - # Upload coverage - - codecov + - coverage xml -i + - codecov --file coverage.xml --flags Setup_Windows + - codecov --file py.coverage --flags Python_Tests + - codecov --file cs.coverage --flags Embedded_Tests artifacts: - path: dist\* diff --git a/requirements.txt b/requirements.txt index 19c3693a1..bcceedf25 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,4 +8,5 @@ wheel; sys_platform == 'win32' pycparser; sys_platform != 'win32' # Coverage upload -codecov +# codecov v2.0.6 isn't on PyPi +https://github.com/codecov/codecov-python/tarball/v2.0.6 From df59d0f9200a4adf6840a6e2faac528ac480f039 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 16 Feb 2017 19:36:10 -0700 Subject: [PATCH 143/324] Clean-up CI configs --- .travis.yml | 10 +++++----- appveyor.yml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 375920fb6..13eea9516 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,6 +30,9 @@ addons: - ca-certificates-mono before_install: + # Set-up location where `Python.Test.dll` will be output + - export PYTHONPATH=`pwd`:$PYTHONPATH + # Set-up dll path for embedded tests - PY_LIBDIR=$(python -c 'import sysconfig; print(sysconfig.get_config_var("LIBDIR"))') - export LD_LIBRARY_PATH=$PY_LIBDIR:$LD_LIBRARY_PATH @@ -40,15 +43,12 @@ install: - coverage run setup.py build_ext --inplace script: - # Set-up and run python tests - - export PYTHONPATH=`pwd`:$PYTHONPATH - python -m pytest - - cp Python.Runtime.dll.config src/embed_tests/bin/Python.Runtime.dll.config - # Run embedded tests + - cp Python.Runtime.dll.config src/embed_tests/bin/ # - mono ./packages/NUnit.*/tools/nunit3-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll -after_success: +after_script: # Uncomment if need to geninterop, ie. py37 final # - python tools/geninterop/geninterop.py diff --git a/appveyor.yml b/appveyor.yml index 6c26b646f..a839e2eea 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -44,7 +44,7 @@ build_script: test_script: - pip install --no-index --find-links=.\dist\ pythonnet - - ps: Copy-Item (Resolve-Path .\build\*\Python.Test.dll) C:\testdir + - ps: Copy-Item .\src\testing\bin\Python.Test.dll C:\testdir\ - ps: .\ci\appveyor_run_tests.ps1 - ps: .\ci\appveyor_build_recipe.ps1 From 94c266ee60d7d91db3f274342b92104e6888515f Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 16 Feb 2017 20:08:00 -0700 Subject: [PATCH 144/324] Update CHANGELOG --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0dcf33d7e..9161b3977 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Added XML Documentation (#349) - Added Embedded tests on Appveyor (#353) - Added PY3 settings to configuration-manager (#346) +- Added `Slack` chat (#384)(#383)(#386) ### Changed @@ -22,11 +23,14 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Completed refactor of Build Directives on `Runtime.cs` (#339) - Refactor python unittests (#329) - Unfroze Mono version on Travis (#345) +- Changed `unittests` to `pytest` (#368) +- Upgraded NUnit framework from 2.6.4 to 3.6.0 (#371) ### Fixed - Fixed crash during Initialization (#343) - Fixed crash during Shutdown (#365) +- Fixed multiple build warnings ### Removed From 1d583c7e18ab7496314b59148ab79a5a5dd22fa5 Mon Sep 17 00:00:00 2001 From: yagweb Date: Fri, 17 Feb 2017 14:07:28 +0800 Subject: [PATCH 145/324] Pass arbitrary .NET object as value of an attr of PyObject by dyn type(#373) --- AUTHORS.md | 1 + CHANGELOG.md | 2 + src/embed_tests/Python.EmbeddingTest.csproj | 2 + src/embed_tests/dynamic.cs | 122 ++++++++++++++++++++ src/runtime/pyobject.cs | 32 ++--- 5 files changed, 144 insertions(+), 15 deletions(-) create mode 100644 src/embed_tests/dynamic.cs diff --git a/AUTHORS.md b/AUTHORS.md index 2a2110f26..64511275b 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -29,6 +29,7 @@ - Sean Freitag ([@cowboygneox](https://github.com/cowboygneox)) - Serge Weinstock ([@sweinst](https://github.com/sweinst)) - Virgil Dupras ([@hsoft](https://github.com/hsoft)) +- Wenguang Yang ([@yagweb](https://github.com/yagweb)) - Xavier Dupré ([@sdpython](https://github.com/sdpython)) - Zane Purvis ([@zanedp](https://github.com/zanedp)) - ([@ArvidJB](https://github.com/ArvidJB)) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9161b3977..e55ed6245 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Added Embedded tests on Appveyor (#353) - Added PY3 settings to configuration-manager (#346) - Added `Slack` chat (#384)(#383)(#386) +- Added function of passing an arbitrary .NET object as the value + of an attribute of PyObject (#370)(#373) ### Changed diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index a2e92ed19..ef011d044 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -65,6 +65,7 @@ pdbonly + ..\..\packages\NUnit.3.6.0\lib\net40\nunit.framework.dll @@ -76,6 +77,7 @@ + diff --git a/src/embed_tests/dynamic.cs b/src/embed_tests/dynamic.cs new file mode 100644 index 000000000..c70fe203c --- /dev/null +++ b/src/embed_tests/dynamic.cs @@ -0,0 +1,122 @@ +using System; +using System.Text; +using NUnit.Framework; +using Python.Runtime; + +namespace Python.EmbeddingTest +{ + [TestFixture] + public class dynamicTest + { + private Py.GILState gil; + + [SetUp] + public void SetUp() + { + gil = Py.GIL(); + } + + [TearDown] + public void TearDown() + { + gil.Dispose(); + } + + /// + /// Set the attribute of a pyobject with a .NET object. + /// + [Test] + public void AssignObject() + { + StringBuilder stream = new StringBuilder(); + dynamic sys = Py.Import("sys"); + sys.testattr = stream; + // Check whether there are the same object. + var _stream = sys.testattr.AsManagedObject(typeof(StringBuilder)); + Assert.AreEqual(_stream, stream); + + PythonEngine.RunSimpleString( + "import sys\n" + + "sys.testattr.Append('Hello!')\n"); + Assert.AreEqual(stream.ToString(), "Hello!"); + } + + /// + /// Set the attribute of a pyobject to null. + /// + [Test] + public void AssignNone() + { + dynamic sys = Py.Import("sys"); + sys.testattr = new StringBuilder(); + Assert.IsNotNull(sys.testattr); + + sys.testattr = null; + Assert.IsNull(sys.testattr); + } + + /// + /// Check whether we can get the attr of a python object when the + /// value of attr is a PyObject. + /// + [Test] + public void AssignPyObject() + { + dynamic sys = Py.Import("sys"); + dynamic io = Py.Import("io"); + sys.testattr = io.StringIO(); + dynamic bb = sys.testattr; //Get the PyObject + bb.write("Hello!"); + Assert.AreEqual(bb.getvalue().ToString(), "Hello!"); + } + + /// + /// Pass the .NET object in Python side. + /// + [Test] + public void PassObjectInPython() + { + StringBuilder stream = new StringBuilder(); + dynamic sys = Py.Import("sys"); + sys.testattr1 = stream; + + //Pass the .NET object in Python side + PythonEngine.RunSimpleString( + "import sys\n" + + "sys.testattr2 = sys.testattr1\n" + ); + + //Compare in Python + PythonEngine.RunSimpleString( + "import sys\n" + + "sys.testattr3 = sys.testattr1 is sys.testattr2\n" + ); + Assert.AreEqual(sys.testattr3.ToString(), "True"); + + //Compare in .NET + Assert.AreEqual(sys.testattr1, sys.testattr2); + } + + /// + /// Pass the PyObject in .NET side + /// + [Test] + public void PassPyObjectInNet() + { + StringBuilder stream = new StringBuilder(); + dynamic sys = Py.Import("sys"); + sys.testattr1 = stream; + sys.testattr2 = sys.testattr1; + + //Compare in Python + PyObject res = PythonEngine.RunString( + "import sys\n" + + "sys.testattr3 = sys.testattr1 is sys.testattr2\n" + ); + Assert.AreEqual(sys.testattr3.ToString(), "True"); + + //Compare in .NET + Assert.AreEqual(sys.testattr1, sys.testattr2); + } + } +} diff --git a/src/runtime/pyobject.cs b/src/runtime/pyobject.cs index 3296d81f8..47f413409 100644 --- a/src/runtime/pyobject.cs +++ b/src/runtime/pyobject.cs @@ -887,30 +887,32 @@ public override int GetHashCode() return Runtime.PyObject_Hash(obj).ToInt32(); } - public override bool TryGetMember(GetMemberBinder binder, out object result) + + public long Refcount { - if (this.HasAttr(binder.Name)) - { - result = CheckNone(this.GetAttr(binder.Name)); - return true; - } - else + get { - return base.TryGetMember(binder, out result); + return Runtime.Refcount(obj); } } + + public override bool TryGetMember(GetMemberBinder binder, out object result) + { + result = CheckNone(this.GetAttr(binder.Name)); + return true; + } + public override bool TrySetMember(SetMemberBinder binder, object value) { - if (this.HasAttr(binder.Name)) - { - this.SetAttr(binder.Name, (PyObject)value); - return true; - } - else + IntPtr ptr = Converter.ToPython(value, value?.GetType()); + int r = Runtime.PyObject_SetAttrString(obj, binder.Name, ptr); + if (r < 0) { - return base.TrySetMember(binder, value); + throw new PythonException(); } + Runtime.XDecref(ptr); + return true; } private void GetArgs(object[] inargs, out PyTuple args, out PyDict kwargs) From 2cb6742f48aa66ece98b0d9b10df0b7f057ebf19 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 17 Feb 2017 09:01:52 -0700 Subject: [PATCH 146/324] Add Coverity badge --- .gitignore | 3 +++ CHANGELOG.md | 1 + README.md | 3 +++ 3 files changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index 968a5c66a..6f813dcb0 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,6 @@ _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm + +# Coverity +cov-int/ diff --git a/CHANGELOG.md b/CHANGELOG.md index e55ed6245..183692345 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Added `Slack` chat (#384)(#383)(#386) - Added function of passing an arbitrary .NET object as the value of an attribute of PyObject (#370)(#373) +- Added Coverity (#390) ### Changed diff --git a/README.md b/README.md index c66e8eef8..6a721e70f 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ [![appveyor shield][]](https://ci.appveyor.com/project/pythonnet/pythonnet/branch/master) [![travis shield][]](https://travis-ci.org/pythonnet/pythonnet) [![codecov shield][]](https://codecov.io/github/pythonnet/pythonnet) +[![coverity shield][]](https://scan.coverity.com/projects/pythonnet) [![license shield][]](./LICENSE) [![pypi package version][]](https://pypi.python.org/pypi/pythonnet) @@ -86,6 +87,8 @@ int32 [codecov shield]: https://img.shields.io/codecov/c/github/pythonnet/pythonnet/master.svg?label=Codecov +[coverity shield]: https://img.shields.io/coverity/scan/7830.svg + [license shield]: https://img.shields.io/badge/license-MIT-blue.svg?maxAge=3600 [pypi package version]: https://img.shields.io/pypi/v/pythonnet.svg From 3212cfe5cfcb806203d034936026924e88cd0a3c Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 20 Feb 2017 15:44:26 -0700 Subject: [PATCH 147/324] Clean-up CHANGELOG --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 183692345..546caf842 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Added `Slack` chat (#384)(#383)(#386) - Added function of passing an arbitrary .NET object as the value of an attribute of PyObject (#370)(#373) -- Added Coverity (#390) +- Added `Coverity scan` (#390) ### Changed @@ -48,7 +48,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ## [2.2.1][] - 2017-01-26 -`v2.2.0` had a release issue on pypi. Bumped to `v2.2.1` +- `v2.2.0` had a release issue on pypi. Bumped to `v2.2.1` ### Added @@ -114,7 +114,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ## [2.0.0][] - 2015-06-26 - Release +- Release ## 2.0.0-alpha.2 From f6d176ce43e1d3d15e55f35911da91b656293f1e Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 20 Feb 2017 19:11:47 -0700 Subject: [PATCH 148/324] Standardize Python.Test fixture location Ensures that Python.Test is output to same location on both Linux and Windows as part of build. .gitkeep to be ensure folder is part of version control. Can be removed if any file is added to it. --- .travis.yml | 6 +----- appveyor.yml | 5 ----- src/testing/Python.Test.csproj | 2 +- src/tests/conftest.py | 9 +++++++-- src/tests/fixtures/.gitkeep | 0 5 files changed, 9 insertions(+), 13 deletions(-) create mode 100644 src/tests/fixtures/.gitkeep diff --git a/.travis.yml b/.travis.yml index 13eea9516..bd3b9fdf7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,17 +30,13 @@ addons: - ca-certificates-mono before_install: - # Set-up location where `Python.Test.dll` will be output - - export PYTHONPATH=`pwd`:$PYTHONPATH - # Set-up dll path for embedded tests - PY_LIBDIR=$(python -c 'import sysconfig; print(sysconfig.get_config_var("LIBDIR"))') - export LD_LIBRARY_PATH=$PY_LIBDIR:$LD_LIBRARY_PATH install: - pip install --upgrade -r requirements.txt - # `setup.py install` works too, but need to deal with `Python.Test` PATH - - coverage run setup.py build_ext --inplace + - coverage run setup.py install script: - python -m pytest diff --git a/appveyor.yml b/appveyor.yml index a839e2eea..9fb2bb15f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -19,9 +19,6 @@ environment: - PYTHON_VERSION: 3.6 init: - # Prepare Environment - - mkdir C:\testdir - # Update Environment Variables based on matrix/platform - set PY_VER=%PYTHON_VERSION:.=% - set PYTHON=C:\PYTHON%PY_VER% @@ -44,8 +41,6 @@ build_script: test_script: - pip install --no-index --find-links=.\dist\ pythonnet - - ps: Copy-Item .\src\testing\bin\Python.Test.dll C:\testdir\ - - ps: .\ci\appveyor_run_tests.ps1 - ps: .\ci\appveyor_build_recipe.ps1 diff --git a/src/testing/Python.Test.csproj b/src/testing/Python.Test.csproj index 4ed9db680..f135ff9c5 100644 --- a/src/testing/Python.Test.csproj +++ b/src/testing/Python.Test.csproj @@ -103,7 +103,7 @@ $(TargetDir)$(TargetName).pdb - + diff --git a/src/tests/conftest.py b/src/tests/conftest.py index 7e86f87ae..534334491 100644 --- a/src/tests/conftest.py +++ b/src/tests/conftest.py @@ -5,13 +5,18 @@ """Helpers for testing.""" import ctypes +import os import sys import sysconfig import clr -# Add path for Python.Test & Add References -sys.path.append('C:/testdir/') +# Add path for `Python.Test` +cwd = os.path.dirname(__file__) +fixtures = os.path.join(cwd, 'fixtures') +sys.path.append(fixtures) + +# Add References for tests clr.AddReference("Python.Test") clr.AddReference("System.Collections") clr.AddReference("System.Data") diff --git a/src/tests/fixtures/.gitkeep b/src/tests/fixtures/.gitkeep new file mode 100644 index 000000000..e69de29bb From c0fb3f274328b35da8af4cd231986cbfe623f7b0 Mon Sep 17 00:00:00 2001 From: yagweb Date: Tue, 21 Feb 2017 20:44:28 +0800 Subject: [PATCH 149/324] Add unittest for Overflow/across AppDomains Exceptions reproduction (#393) First exception shows issue from #376 --- src/embed_tests/pyinitialize.cs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/embed_tests/pyinitialize.cs b/src/embed_tests/pyinitialize.cs index bfd95aaab..ba2578266 100644 --- a/src/embed_tests/pyinitialize.cs +++ b/src/embed_tests/pyinitialize.cs @@ -36,5 +36,33 @@ public static void StartAndStopTwice() PythonEngine.Initialize(); PythonEngine.Shutdown(); } + + [Test] + [Ignore("System.OverflowException : Arithmetic operation resulted in an overflow")] + //[Ignore("System.ArgumentException : Cannot pass a GCHandle across AppDomains")] + public void ReInitialize() + { + string code = "from System import Int32\n"; + PythonEngine.Initialize(); + using (Py.GIL()) + { + //import any class or struct from .NET + PythonEngine.RunSimpleString(code); + } + PythonEngine.Shutdown(); + + PythonEngine.Initialize(); + using (Py.GIL()) + { + //Import a class/struct from .NET + //This class/struct must be imported during the first initialization. + PythonEngine.RunSimpleString(code); + //Create an instance of the class/struct + //System.OverflowException Exception will be raised here. + //If replacing int with Int64, OverflowException will be replaced with AppDomain exception. + PythonEngine.RunSimpleString("Int32(1)"); + } + PythonEngine.Shutdown(); + } } } From 2871d1be4ebaa2a919073ca1191084c658da8d91 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 21 Feb 2017 06:58:13 -0700 Subject: [PATCH 150/324] Re-order Initialize tests --- src/embed_tests/pyinitialize.cs | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/embed_tests/pyinitialize.cs b/src/embed_tests/pyinitialize.cs index ba2578266..6a766ce1d 100644 --- a/src/embed_tests/pyinitialize.cs +++ b/src/embed_tests/pyinitialize.cs @@ -5,16 +5,18 @@ namespace Python.EmbeddingTest { public class PyInitializeTest { + /// + /// Tests issue with multiple simple Initialize/Shutdowns. + /// Fixed by #343 + /// [Test] - public static void LoadSpecificArgs() + public static void StartAndStopTwice() { - var args = new[] { "test1", "test2" }; - using (new PythonEngine(args)) - using (var argv = new PyList(Runtime.Runtime.PySys_GetObject("argv"))) - { - Assert.AreEqual(args[0], argv[0].ToString()); - Assert.AreEqual(args[1], argv[1].ToString()); - } + PythonEngine.Initialize(); + PythonEngine.Shutdown(); + + PythonEngine.Initialize(); + PythonEngine.Shutdown(); } [Test] @@ -28,13 +30,15 @@ public static void LoadDefaultArgs() } [Test] - public static void StartAndStopTwice() + public static void LoadSpecificArgs() { - PythonEngine.Initialize(); - PythonEngine.Shutdown(); - - PythonEngine.Initialize(); - PythonEngine.Shutdown(); + var args = new[] { "test1", "test2" }; + using (new PythonEngine(args)) + using (var argv = new PyList(Runtime.Runtime.PySys_GetObject("argv"))) + { + Assert.AreEqual(args[0], argv[0].ToString()); + Assert.AreEqual(args[1], argv[1].ToString()); + } } [Test] From bd1a27eb98268af0a06bc51df3553df0191fc356 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 21 Feb 2017 07:00:22 -0700 Subject: [PATCH 151/324] Add documentation and ref to ReInitialize test --- src/embed_tests/pyinitialize.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/embed_tests/pyinitialize.cs b/src/embed_tests/pyinitialize.cs index 6a766ce1d..8a172fe3e 100644 --- a/src/embed_tests/pyinitialize.cs +++ b/src/embed_tests/pyinitialize.cs @@ -41,8 +41,13 @@ public static void LoadSpecificArgs() } } + /// + /// Failing test demonstrating current issue with OverflowException (#376) + /// and ArgumentException issue after that one is fixed. + /// More complex version of StartAndStopTwice test + /// [Test] - [Ignore("System.OverflowException : Arithmetic operation resulted in an overflow")] + [Ignore("GH#376: System.OverflowException : Arithmetic operation resulted in an overflow")] //[Ignore("System.ArgumentException : Cannot pass a GCHandle across AppDomains")] public void ReInitialize() { From 38af8d15390f0fe2fbff6faceb806420d101c863 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 21 Feb 2017 07:06:21 -0700 Subject: [PATCH 152/324] Split and re-order TestPyTupleIsTupleType test --- src/embed_tests/pytuple.cs | 39 ++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/embed_tests/pytuple.cs b/src/embed_tests/pytuple.cs index 18a6ea344..e555d4dfa 100644 --- a/src/embed_tests/pytuple.cs +++ b/src/embed_tests/pytuple.cs @@ -5,6 +5,33 @@ namespace Python.EmbeddingTest { public class PyTupleTest { + /// + /// Test IsTupleType without having to Initialize a tuple. + /// PyTuple constructor use IsTupleType. This decouples the tests. + /// + [Test] + public void TestStringIsTupleType() + { + using (Py.GIL()) + { + var s = new PyString("foo"); + Assert.IsFalse(PyTuple.IsTupleType(s)); + } + } + + /// + /// Test IsTupleType with Tuple. + /// + [Test] + public void TestPyTupleIsTupleType() + { + using (Py.GIL()) + { + var t = new PyTuple(); + Assert.IsTrue(PyTuple.IsTupleType(t)); + } + } + [Test] public void TestPyTupleEmpty() { @@ -39,18 +66,6 @@ public void TestPyTupleValidAppend() } } - [Test] - public void TestPyTupleIsTupleType() - { - using (Py.GIL()) - { - var s = new PyString("foo"); - var t = new PyTuple(); - Assert.IsTrue(PyTuple.IsTupleType(t)); - Assert.IsFalse(PyTuple.IsTupleType(s)); - } - } - [Test] public void TestPyTupleStringConvert() { From e75d1c277f54cd272632b82d05d84a69f1bb05fd Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 21 Feb 2017 07:17:30 -0700 Subject: [PATCH 153/324] Skip PyTuple test with AppDomain issue This skip removes the issue from all PY3 on Travis/AppVeyor. PY27 still has issue randomly on both Travis/AppVeyor x86, x64,. --- src/embed_tests/pytuple.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/embed_tests/pytuple.cs b/src/embed_tests/pytuple.cs index e555d4dfa..ef8aaadca 100644 --- a/src/embed_tests/pytuple.cs +++ b/src/embed_tests/pytuple.cs @@ -42,7 +42,15 @@ public void TestPyTupleEmpty() } } + /// + /// FIXME: Unable to unload AppDomain, Unload thread timed out. + /// Seen on Travis/AppVeyor on both PY2 and PY3. Causes Embedded_Tests + /// to hang after they are finished for ~40 seconds until nunit3 forces + /// a timeout on unloading tests. Doesn't fail the tests though but + /// greatly slows down CI. nunit2 silently has this issue. + /// [Test] + [Ignore("GH#397: Travis/AppVeyor: Unable to unload AppDomain, Unload thread timed out")] public void TestPyTupleInvalidAppend() { using (Py.GIL()) @@ -93,6 +101,9 @@ public void TestPyTupleValidConvert() } } + /// + /// FIXME: Possible source of intermittent AppVeyor PY27: Unable to unload AppDomain. + /// [Test] public void TestNewPyTupleFromPyTuple() { From e7c94dfd774699a9cfe4a3360f1139051ac4097f Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 21 Feb 2017 07:26:33 -0700 Subject: [PATCH 154/324] Clean-up embedded tests Clean-up embedded tests comments and variable types Remove TestFixture attribute. Optional since NUnit 2.5 https://nunit.org/index.php?p=testFixture&r=2.6.4 --- src/embed_tests/dynamic.cs | 23 +++++++++++------------ src/embed_tests/pyimport.cs | 1 - src/embed_tests/pyinitialize.cs | 15 ++++++++------- src/embed_tests/pyiter.cs | 1 + src/embed_tests/pylong.cs | 1 + src/embed_tests/pyobject.cs | 1 + src/embed_tests/pythonexception.cs | 1 - src/embed_tests/pytuple.cs | 1 + 8 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/embed_tests/dynamic.cs b/src/embed_tests/dynamic.cs index c70fe203c..25d70f2c5 100644 --- a/src/embed_tests/dynamic.cs +++ b/src/embed_tests/dynamic.cs @@ -5,7 +5,6 @@ namespace Python.EmbeddingTest { - [TestFixture] public class dynamicTest { private Py.GILState gil; @@ -23,16 +22,16 @@ public void TearDown() } /// - /// Set the attribute of a pyobject with a .NET object. + /// Set the attribute of a PyObject with a .NET object. /// [Test] public void AssignObject() { - StringBuilder stream = new StringBuilder(); + var stream = new StringBuilder(); dynamic sys = Py.Import("sys"); sys.testattr = stream; // Check whether there are the same object. - var _stream = sys.testattr.AsManagedObject(typeof(StringBuilder)); + dynamic _stream = sys.testattr.AsManagedObject(typeof(StringBuilder)); Assert.AreEqual(_stream, stream); PythonEngine.RunSimpleString( @@ -42,7 +41,7 @@ public void AssignObject() } /// - /// Set the attribute of a pyobject to null. + /// Set the attribute of a PyObject to null. /// [Test] public void AssignNone() @@ -76,24 +75,24 @@ public void AssignPyObject() [Test] public void PassObjectInPython() { - StringBuilder stream = new StringBuilder(); + var stream = new StringBuilder(); dynamic sys = Py.Import("sys"); sys.testattr1 = stream; - //Pass the .NET object in Python side + // Pass the .NET object in Python side PythonEngine.RunSimpleString( "import sys\n" + "sys.testattr2 = sys.testattr1\n" ); - //Compare in Python + // Compare in Python PythonEngine.RunSimpleString( "import sys\n" + "sys.testattr3 = sys.testattr1 is sys.testattr2\n" ); Assert.AreEqual(sys.testattr3.ToString(), "True"); - //Compare in .NET + // Compare in .NET Assert.AreEqual(sys.testattr1, sys.testattr2); } @@ -103,19 +102,19 @@ public void PassObjectInPython() [Test] public void PassPyObjectInNet() { - StringBuilder stream = new StringBuilder(); + var stream = new StringBuilder(); dynamic sys = Py.Import("sys"); sys.testattr1 = stream; sys.testattr2 = sys.testattr1; - //Compare in Python + // Compare in Python PyObject res = PythonEngine.RunString( "import sys\n" + "sys.testattr3 = sys.testattr1 is sys.testattr2\n" ); Assert.AreEqual(sys.testattr3.ToString(), "True"); - //Compare in .NET + // Compare in .NET Assert.AreEqual(sys.testattr1, sys.testattr2); } } diff --git a/src/embed_tests/pyimport.cs b/src/embed_tests/pyimport.cs index ebdc5b125..7751d37ce 100644 --- a/src/embed_tests/pyimport.cs +++ b/src/embed_tests/pyimport.cs @@ -17,7 +17,6 @@ namespace Python.EmbeddingTest /// | | - __init__.py /// | | - one.py /// - [TestFixture] public class PyImportTest { private IntPtr gs; diff --git a/src/embed_tests/pyinitialize.cs b/src/embed_tests/pyinitialize.cs index 8a172fe3e..2f9aae2c7 100644 --- a/src/embed_tests/pyinitialize.cs +++ b/src/embed_tests/pyinitialize.cs @@ -1,3 +1,4 @@ +using System; using NUnit.Framework; using Python.Runtime; @@ -51,11 +52,11 @@ public static void LoadSpecificArgs() //[Ignore("System.ArgumentException : Cannot pass a GCHandle across AppDomains")] public void ReInitialize() { - string code = "from System import Int32\n"; + var code = "from System import Int32\n"; PythonEngine.Initialize(); using (Py.GIL()) { - //import any class or struct from .NET + // Import any class or struct from .NET PythonEngine.RunSimpleString(code); } PythonEngine.Shutdown(); @@ -63,12 +64,12 @@ public void ReInitialize() PythonEngine.Initialize(); using (Py.GIL()) { - //Import a class/struct from .NET - //This class/struct must be imported during the first initialization. + // Import a class/struct from .NET + // This class/struct must be imported during the first initialization. PythonEngine.RunSimpleString(code); - //Create an instance of the class/struct - //System.OverflowException Exception will be raised here. - //If replacing int with Int64, OverflowException will be replaced with AppDomain exception. + // Create an instance of the class/struct + // System.OverflowException Exception will be raised here. + // If replacing int with Int64, OverflowException will be replaced with AppDomain exception. PythonEngine.RunSimpleString("Int32(1)"); } PythonEngine.Shutdown(); diff --git a/src/embed_tests/pyiter.cs b/src/embed_tests/pyiter.cs index b110903f6..b896ab4c9 100644 --- a/src/embed_tests/pyiter.cs +++ b/src/embed_tests/pyiter.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using NUnit.Framework; using Python.Runtime; diff --git a/src/embed_tests/pylong.cs b/src/embed_tests/pylong.cs index 37cf1042d..0c57a0a74 100644 --- a/src/embed_tests/pylong.cs +++ b/src/embed_tests/pylong.cs @@ -1,3 +1,4 @@ +using System; using NUnit.Framework; using Python.Runtime; diff --git a/src/embed_tests/pyobject.cs b/src/embed_tests/pyobject.cs index f114d3d9e..be35ed3ca 100644 --- a/src/embed_tests/pyobject.cs +++ b/src/embed_tests/pyobject.cs @@ -1,3 +1,4 @@ +using System; using NUnit.Framework; using Python.Runtime; diff --git a/src/embed_tests/pythonexception.cs b/src/embed_tests/pythonexception.cs index 7811bd37b..2a0021648 100644 --- a/src/embed_tests/pythonexception.cs +++ b/src/embed_tests/pythonexception.cs @@ -11,7 +11,6 @@ namespace Python.EmbeddingTest /// Keeping this in the old-style SetUp/TearDown /// to ensure that setup still works. /// - [TestFixture] public class PythonExceptionTest { private IntPtr gs; diff --git a/src/embed_tests/pytuple.cs b/src/embed_tests/pytuple.cs index ef8aaadca..ef72d2ea9 100644 --- a/src/embed_tests/pytuple.cs +++ b/src/embed_tests/pytuple.cs @@ -1,3 +1,4 @@ +using System; using NUnit.Framework; using Python.Runtime; From c99c5f21656c7c257c2e18395eaeddbc3b85d107 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 21 Feb 2017 07:53:39 -0700 Subject: [PATCH 155/324] Fix conda build log stderr->stdout Recent conda-build update added a new log output to log:info. Powershell interprets this as an ERROR since its on STDERR. Prevent accidental auto-update & display INFO before building. Would have made debugging this psudo-error easier. --- ci/appveyor_build_recipe.ps1 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ci/appveyor_build_recipe.ps1 b/ci/appveyor_build_recipe.ps1 index 00d28ce88..c767091f3 100644 --- a/ci/appveyor_build_recipe.ps1 +++ b/ci/appveyor_build_recipe.ps1 @@ -19,10 +19,14 @@ if ($env:APPVEYOR_PULL_REQUEST_NUMBER) { Write-Host "Starting conda install" -ForegroundColor "Green" conda config --set always_yes True conda config --set changeps1 False + conda config --set auto_update_conda False conda install conda-build jinja2 anaconda-client --quiet + conda info + # why `2>&1 | %{ "$_" }`? Redirect STDERR to STDOUT + # see: http://stackoverflow.com/a/20950421/5208670 Write-Host "Starting conda build recipe" -ForegroundColor "Green" - conda build conda.recipe --dirty --quiet + conda build conda.recipe --quiet 2>&1 | %{ "$_" } $CONDA_PKG=(conda build conda.recipe --output) Copy-Item $CONDA_PKG .\dist\ From 5e27c67f0119d769f4deb19d9da46bd627126d8e Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 21 Feb 2017 09:45:41 -0700 Subject: [PATCH 156/324] Quiet AppVeyor pip/nuget installs Reduce verbosity to make relevant information easier to find. Errors and Warnings are still displayed. Travis doesn't need this since they have log folding. --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 9fb2bb15f..e973ac581 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,10 +28,10 @@ init: - set PATH=%PYTHON%;%PYTHON%\Scripts;%PATH% install: - - pip install --upgrade -r requirements.txt + - pip install --upgrade -r requirements.txt --quiet # Install OpenCover. Can't put on `packages.config`, not Mono compatible - - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages + - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages -Verbosity quiet build_script: # Create clean `sdist`. Only used for releases From cbafe1ed8b6438a41726740fa0174225c3c121ea Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 21 Feb 2017 12:04:40 -0700 Subject: [PATCH 157/324] Allow private env:var to force conda build To trigger conda build, just add/update private env:vars FORCE_CONDA_BUILD on link below. Easier to debug and no need to edit appveyor yml/ps1 https://ci.appveyor.com/project/USER_NAME/pythonnet/settings/environment --- ci/appveyor_build_recipe.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/appveyor_build_recipe.ps1 b/ci/appveyor_build_recipe.ps1 index c767091f3..278e292b0 100644 --- a/ci/appveyor_build_recipe.ps1 +++ b/ci/appveyor_build_recipe.ps1 @@ -11,7 +11,7 @@ if ($env:PLATFORM -eq "x86"){ $env:CONDA_BLD = "$env:CONDA_BLD" + "-x64" } -if ($env:APPVEYOR_PULL_REQUEST_NUMBER) { +if ($env:APPVEYOR_PULL_REQUEST_NUMBER -or $env:FORCE_CONDA_BUILD -eq "True") { # Update PATH, and keep a copy to restore at end of this PowerShell script $old_path = $env:path $env:path = "$env:CONDA_BLD;$env:CONDA_BLD\Scripts;" + $env:path From e753b722577510d0de34b3c29d2adf37b6586d2b Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 21 Feb 2017 12:22:37 -0700 Subject: [PATCH 158/324] Update AUTHORS Add names to a few more contributors --- AUTHORS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/AUTHORS.md b/AUTHORS.md index 64511275b..09358586e 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -12,11 +12,14 @@ ## Contributors +- Arvid JB ([@ArvidJB](https://github.com/ArvidJB)) - Bradley Friedman ([@leith-bartrich](https://github.com/leith-bartrich)) - Christian Heimes ([@tiran](https://github.com/tiran)) - Christoph Gohlke ([@cgohlke](https://github.com/cgohlke)) +- Daniel Fernandez ([@fdanny](https://github.com/fdanny)) - Daniel Santana ([@dgsantana](https://github.com/dgsantana)) - David Lechner ([@dlech](https://github.com/dlech)) +- Dmitriy Se ([@dmitriyse](https://github.com/dmitriyse)) - He-chien Tsai ([@t3476](https://github.com/t3476)) - Jeff Reback ([@jreback](https://github.com/jreback)) - Joe Frayne ([@jfrayne](https://github.com/jfrayne)) @@ -32,10 +35,7 @@ - Wenguang Yang ([@yagweb](https://github.com/yagweb)) - Xavier Dupré ([@sdpython](https://github.com/sdpython)) - Zane Purvis ([@zanedp](https://github.com/zanedp)) -- ([@ArvidJB](https://github.com/ArvidJB)) - ([@bltribble](https://github.com/bltribble)) -- ([@dmitriyse](https://github.com/dmitriyse)) -- ([@fdanny](https://github.com/fdanny)) - ([@omnicognate](https://github.com/omnicognate)) - ([@rico-chet](https://github.com/rico-chet)) - ([@rmadsen-ks](https://github.com/rmadsen-ks)) From 3c693714541b5aee5209a0192fb24c29b0e740fb Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 21 Feb 2017 13:39:22 -0700 Subject: [PATCH 159/324] Rename TearDown to Dispose Easier for future possible migration to other frameworks --- src/embed_tests/dynamic.cs | 2 +- src/embed_tests/pyimport.cs | 2 +- src/embed_tests/pythonexception.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/embed_tests/dynamic.cs b/src/embed_tests/dynamic.cs index 25d70f2c5..8338d68f6 100644 --- a/src/embed_tests/dynamic.cs +++ b/src/embed_tests/dynamic.cs @@ -16,7 +16,7 @@ public void SetUp() } [TearDown] - public void TearDown() + public void Dispose() { gil.Dispose(); } diff --git a/src/embed_tests/pyimport.cs b/src/embed_tests/pyimport.cs index 7751d37ce..43bea1427 100644 --- a/src/embed_tests/pyimport.cs +++ b/src/embed_tests/pyimport.cs @@ -39,7 +39,7 @@ public void SetUp() } [TearDown] - public void TearDown() + public void Dispose() { PythonEngine.ReleaseLock(gs); PythonEngine.Shutdown(); diff --git a/src/embed_tests/pythonexception.cs b/src/embed_tests/pythonexception.cs index 2a0021648..bdae9db9e 100644 --- a/src/embed_tests/pythonexception.cs +++ b/src/embed_tests/pythonexception.cs @@ -23,7 +23,7 @@ public void SetUp() } [TearDown] - public void TearDown() + public void Dispose() { PythonEngine.ReleaseLock(gs); PythonEngine.Shutdown(); From a9e2fe78f353211b3114377b7fbd3637b0fe59ca Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 21 Feb 2017 13:45:49 -0700 Subject: [PATCH 160/324] Relocate Embedded tests fixtures Each test type should contain its own fixtures. Reduces weird dependency of each testing framework --- src/{tests => embed_tests/fixtures}/PyImportTest/__init__.py | 0 src/{tests => embed_tests/fixtures}/PyImportTest/sysargv.py | 0 .../fixtures}/PyImportTest/test/__init__.py | 0 src/{tests => embed_tests/fixtures}/PyImportTest/test/one.py | 0 src/embed_tests/pyimport.cs | 4 ++-- 5 files changed, 2 insertions(+), 2 deletions(-) rename src/{tests => embed_tests/fixtures}/PyImportTest/__init__.py (100%) rename src/{tests => embed_tests/fixtures}/PyImportTest/sysargv.py (100%) rename src/{tests => embed_tests/fixtures}/PyImportTest/test/__init__.py (100%) rename src/{tests => embed_tests/fixtures}/PyImportTest/test/one.py (100%) diff --git a/src/tests/PyImportTest/__init__.py b/src/embed_tests/fixtures/PyImportTest/__init__.py similarity index 100% rename from src/tests/PyImportTest/__init__.py rename to src/embed_tests/fixtures/PyImportTest/__init__.py diff --git a/src/tests/PyImportTest/sysargv.py b/src/embed_tests/fixtures/PyImportTest/sysargv.py similarity index 100% rename from src/tests/PyImportTest/sysargv.py rename to src/embed_tests/fixtures/PyImportTest/sysargv.py diff --git a/src/tests/PyImportTest/test/__init__.py b/src/embed_tests/fixtures/PyImportTest/test/__init__.py similarity index 100% rename from src/tests/PyImportTest/test/__init__.py rename to src/embed_tests/fixtures/PyImportTest/test/__init__.py diff --git a/src/tests/PyImportTest/test/one.py b/src/embed_tests/fixtures/PyImportTest/test/one.py similarity index 100% rename from src/tests/PyImportTest/test/one.py rename to src/embed_tests/fixtures/PyImportTest/test/one.py diff --git a/src/embed_tests/pyimport.cs b/src/embed_tests/pyimport.cs index 43bea1427..17547d69a 100644 --- a/src/embed_tests/pyimport.cs +++ b/src/embed_tests/pyimport.cs @@ -10,7 +10,7 @@ namespace Python.EmbeddingTest /// /// /// Keeping in old-style SetUp/TearDown due to required SetUp. - /// The required directory structure was added to .\pythonnet\src\tests\ directory: + /// The required directory structure was added to .\pythonnet\src\embed_tests\fixtures\ directory: /// + PyImportTest/ /// | - __init__.py /// | + test/ @@ -30,7 +30,7 @@ public void SetUp() /* Append the tests directory to sys.path * using reflection to circumvent the private * modifiers placed on most Runtime methods. */ - const string s = "../../tests"; + const string s = "../fixtures"; string testPath = Path.Combine(TestContext.CurrentContext.TestDirectory, s); IntPtr str = Runtime.Runtime.PyString_FromString(testPath); From 02a8a348e8249a74601d30fa26b46631279cc8fe Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 21 Feb 2017 17:31:31 -0700 Subject: [PATCH 161/324] Update LICENSE year & include in recipe --- LICENSE | 2 +- conda.recipe/meta.yaml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 0535829ff..e344a0795 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017 the contributors of the "Python for .NET" project +Copyright (c) 2006-2017 the contributors of the "Python for .NET" project Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml index da62edc90..32bc544f6 100644 --- a/conda.recipe/meta.yaml +++ b/conda.recipe/meta.yaml @@ -26,3 +26,4 @@ test: about: home: https://github.com/pythonnet/pythonnet license: MIT + license_file: LICENSE From 0e5e58edd0cf0d36660e909662dcca5486161851 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 21 Feb 2017 15:36:54 -0700 Subject: [PATCH 162/324] Update conda-recipe version Get it from recipe file instead of git-tag. --- conda.recipe/meta.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml index 32bc544f6..eaa8747b2 100644 --- a/conda.recipe/meta.yaml +++ b/conda.recipe/meta.yaml @@ -1,6 +1,6 @@ package: name: pythonnet - version: {{ environ.get('GIT_DESCRIBE_TAG', '').replace('-dev', '.dev') }} + version: "2.3.0.dev1" build: skip: True # [not win] From 928717d3a1fc3fdee49eee5a0cd07780a35bd647 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 21 Feb 2017 17:10:32 -0700 Subject: [PATCH 163/324] Add SharedAssemblyInfo & Update Assembly version Reset version back down to v2.x from v4.0.0.2 See link below for Semanctic Versioning & .NET https://codingforsmarties.wordpress.com/2016/01/21/how-to-version-assemblies-destined-for-nuget/ --- src/SharedAssemblyInfo.cs | 28 +++++++++++++++++ src/clrmodule/AssemblyInfo.cs | 39 ------------------------ src/clrmodule/ClrModule.cs | 3 +- src/clrmodule/Properties/AssemblyInfo.cs | 11 +++++++ src/clrmodule/clrmodule.csproj | 6 +++- src/console/AssemblyInfo.cs | 16 ---------- src/console/Console.csproj | 6 +++- src/console/Properties/AssemblyInfo.cs | 8 +++++ src/runtime/AssemblyInfo.cs | 15 --------- src/runtime/Properties/AssemblyInfo.cs | 11 +++++++ src/runtime/Python.Runtime.csproj | 6 +++- 11 files changed, 75 insertions(+), 74 deletions(-) create mode 100644 src/SharedAssemblyInfo.cs delete mode 100644 src/clrmodule/AssemblyInfo.cs create mode 100644 src/clrmodule/Properties/AssemblyInfo.cs delete mode 100644 src/console/AssemblyInfo.cs create mode 100644 src/console/Properties/AssemblyInfo.cs delete mode 100644 src/runtime/AssemblyInfo.cs create mode 100644 src/runtime/Properties/AssemblyInfo.cs diff --git a/src/SharedAssemblyInfo.cs b/src/SharedAssemblyInfo.cs new file mode 100644 index 000000000..24ba26862 --- /dev/null +++ b/src/SharedAssemblyInfo.cs @@ -0,0 +1,28 @@ +using System; +using System.Reflection; +using System.Resources; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("pythonnet")] +[assembly: AssemblyProduct("Python for .NET")] +[assembly: AssemblyCopyright("Copyright (c) 2006-2017 the contributors of the 'Python for .NET' project")] +[assembly: AssemblyTrademark("")] + +[assembly: AssemblyCulture("")] +[assembly: NeutralResourcesLanguage("")] + +[assembly: CLSCompliant(true)] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// Version Information. Keeping it simple. May need to revisit for Nuget +// See: https://codingforsmarties.wordpress.com/2016/01/21/how-to-version-assemblies-destined-for-nuget/ +// AssemblyVersion can only be numeric +[assembly: AssemblyVersion("2.3.0")] diff --git a/src/clrmodule/AssemblyInfo.cs b/src/clrmodule/AssemblyInfo.cs deleted file mode 100644 index 669183255..000000000 --- a/src/clrmodule/AssemblyInfo.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. - -[assembly: AssemblyTitle("clrmodule")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("clrmodule")] -[assembly: AssemblyCopyright("Copyright © 2013")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. - -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM - -[assembly: Guid("ae10d6a4-55c2-482f-9716-9988e6c169e3")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] - -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/clrmodule/ClrModule.cs b/src/clrmodule/ClrModule.cs index 413b952eb..d24376a1f 100644 --- a/src/clrmodule/ClrModule.cs +++ b/src/clrmodule/ClrModule.cs @@ -52,7 +52,8 @@ public static void initclr() var pythonRuntimeName = new AssemblyName("Python.Runtime") { #if USE_PYTHON_RUNTIME_VERSION - Version = new Version("4.0.0.1"), + // Has no effect until SNK works. Keep updated anyways. + Version = new Version("2.3.0"), #endif CultureInfo = CultureInfo.InvariantCulture }; diff --git a/src/clrmodule/Properties/AssemblyInfo.cs b/src/clrmodule/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..939f4171f --- /dev/null +++ b/src/clrmodule/Properties/AssemblyInfo.cs @@ -0,0 +1,11 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("clrmodule")] +[assembly: AssemblyDescription("")] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("ae10d6a4-55c2-482f-9716-9988e6c169e3")] diff --git a/src/clrmodule/clrmodule.csproj b/src/clrmodule/clrmodule.csproj index 435630d0e..6f44789d7 100644 --- a/src/clrmodule/clrmodule.csproj +++ b/src/clrmodule/clrmodule.csproj @@ -14,6 +14,7 @@ 1591 ..\..\ $(SolutionDir) + Properties true prompt @@ -72,7 +73,10 @@ - + + + Properties\SharedAssemblyInfo.cs + diff --git a/src/console/AssemblyInfo.cs b/src/console/AssemblyInfo.cs deleted file mode 100644 index 17d792c7a..000000000 --- a/src/console/AssemblyInfo.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Reflection; -using System.Resources; -using System.Runtime.InteropServices; -using System.Security.Permissions; - -[assembly: AssemblyProduct("Python for .NET")] -[assembly: AssemblyVersion("2.4.2.7")] -[assembly: AssemblyTitle("Python Console")] -[assembly: AssemblyDefaultAlias("python.exe")] -[assembly: CLSCompliant(true)] -[assembly: ComVisible(false)] -[assembly: AssemblyDescription("")] -[assembly: AssemblyCopyright("MIT License")] -[assembly: AssemblyFileVersion("2.0.0.4")] -[assembly: NeutralResourcesLanguage("en")] diff --git a/src/console/Console.csproj b/src/console/Console.csproj index cdee6893b..9fe44830c 100644 --- a/src/console/Console.csproj +++ b/src/console/Console.csproj @@ -14,6 +14,7 @@ 1591 ..\..\ $(SolutionDir) + Properties python-clear.ico prompt @@ -71,7 +72,10 @@ - + + + Properties\SharedAssemblyInfo.cs + diff --git a/src/console/Properties/AssemblyInfo.cs b/src/console/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..081ae0c94 --- /dev/null +++ b/src/console/Properties/AssemblyInfo.cs @@ -0,0 +1,8 @@ +using System.Reflection; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Python Console")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyDefaultAlias("python.exe")] diff --git a/src/runtime/AssemblyInfo.cs b/src/runtime/AssemblyInfo.cs deleted file mode 100644 index a357b81d9..000000000 --- a/src/runtime/AssemblyInfo.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -[assembly: AssemblyProduct("Python for .NET")] -[assembly: AssemblyVersion("4.0.0.1")] -[assembly: AssemblyDefaultAlias("Python.Runtime.dll")] -[assembly: CLSCompliant(true)] -[assembly: ComVisible(false)] -[assembly: AssemblyCopyright("MIT License")] -[assembly: AssemblyFileVersion("2.0.0.2")] -[assembly: NeutralResourcesLanguage("en")] -[assembly: InternalsVisibleTo("Python.EmbeddingTest")] diff --git a/src/runtime/Properties/AssemblyInfo.cs b/src/runtime/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..a5d33c7ab --- /dev/null +++ b/src/runtime/Properties/AssemblyInfo.cs @@ -0,0 +1,11 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Python for .NET")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyDefaultAlias("Python.Runtime.dll")] + +[assembly: InternalsVisibleTo("Python.EmbeddingTest")] diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index f1616dcd6..fd2281d58 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -14,6 +14,7 @@ 1591 ..\..\ $(SolutionDir) + Properties true false @@ -73,7 +74,10 @@ - + + + Properties\SharedAssemblyInfo.cs + From 5a7d297837a100da4674fd6306cd708d215b2d8c Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 21 Feb 2017 20:09:31 -0700 Subject: [PATCH 164/324] Add .bumpversion Configuration based from gh:bumpversion:issues:77#issuecomment-130696156 Usage: bumpversion major -> increases major and adds `dev` if not present bumpversion minor -> increases minor and adds `dev` if not present bumpversion release -> drop the `dev` portion --- .bumpversion.cfg | 29 +++++++++++++++++++++++++++++ .editorconfig | 5 +++++ setup.cfg | 4 ++++ 3 files changed, 38 insertions(+) create mode 100644 .bumpversion.cfg diff --git a/.bumpversion.cfg b/.bumpversion.cfg new file mode 100644 index 000000000..f79dfb480 --- /dev/null +++ b/.bumpversion.cfg @@ -0,0 +1,29 @@ +[bumpversion] +current_version = 2.3.0.dev1 +parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\.(?P[a-z]+)(?P\d+))? +serialize = + {major}.{minor}.{patch}.{release}{dev} + {major}.{minor}.{patch} + +[bumpversion:part:release] +optional_value = dummy +values = + dev + dummy + +[bumpversion:part:dev] + +[bumpversion:file:setup.py] + +[bumpversion:file:conda.recipe/meta.yaml] + +[bumpversion:file:src/runtime/resources/clr.py] + +[bumpversion:file:src/SharedAssemblyInfo.cs] +serialize = + {major}.{minor}.{patch} + +[bumpversion:file:src/clrmodule/ClrModule.cs] +serialize = + {major}.{minor}.{patch} + diff --git a/.editorconfig b/.editorconfig index ff0b3c71d..25636a549 100644 --- a/.editorconfig +++ b/.editorconfig @@ -22,3 +22,8 @@ indent_size = 2 # Solution [*.sln] indent_style = tab + +# bumpversion reformats itself after every bump +[.bumpversion.cfg] +trim_trailing_whitespace = false +indent_style = tab diff --git a/setup.cfg b/setup.cfg index f05de8217..d1a72ff31 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,4 +1,8 @@ +# [bumpversion] comments. bumpversion deleted all comments on its file. # Don't combine `.bumpversion.cfg` with `setup.cfg`. Messes up formatting. +# Don't use `first_value = 1`. It will break `release` bump +# Keep `optional = dummy` needed to bump to release. +# See: https://github.com/peritus/bumpversion/issues/59 [tool:pytest] xfail_strict = True From b7a3c7ea18fa49d2977ed142e559e96f6ae6af55 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 18 Apr 2016 12:56:47 -0700 Subject: [PATCH 165/324] Add object overload test --- src/testing/methodtest.cs | 15 +++++++++++++++ src/tests/test_method.py | 22 ++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/testing/methodtest.cs b/src/testing/methodtest.cs index 7634c4839..76546f0d3 100644 --- a/src/testing/methodtest.cs +++ b/src/testing/methodtest.cs @@ -116,6 +116,21 @@ public static int[] TestOverloadedParams(int v, int[] args) return args; } + public static string TestOverloadedNoObject(int i) + { + return "Got int"; + } + + public static string TestOverloadedObject(int i) + { + return "Got int"; + } + + public static string TestOverloadedObject(object o) + { + return "Got object"; + } + public static bool TestStringOutParams(string s, out string s1) { s1 = "output string"; diff --git a/src/tests/test_method.py b/src/tests/test_method.py index e29986969..41171df82 100644 --- a/src/tests/test_method.py +++ b/src/tests/test_method.py @@ -769,3 +769,25 @@ def test_wrong_overload(): res = System.Math.Max(System.Double(50.5), 50.1) assert res == 50.5 assert type(res) == float + + +def test_no_object_in_param(): + """Test that fix for #203 doesn't break behavior w/ no object overload""" + + res = MethodTest.TestOverloadedNoObject(5) + assert res == "Got int" + + with pytest.raises(TypeError): + MethodTest.TestOverloadedNoObject("test") + + +@pytest.mark.xfail(reason="Needs fixing. #203") +def test_object_in_param(): + """Test regression introduced by #151 in which Object method overloads + aren't being used. See #203 for issue.""" + + res = MethodTest.TestOverloadedObject(5) + assert res == "Got int" + + res = MethodTest.TestOverloadedObject("test") + assert res == "Got object" From 2cabc9f623dac83d83f0798102510670299fbbaf Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 22 May 2016 12:19:10 -0700 Subject: [PATCH 166/324] Add object type to methodbind --- src/runtime/methodbinder.cs | 2 +- src/tests/test_method.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/runtime/methodbinder.cs b/src/runtime/methodbinder.cs index b3df8448f..f0c58f34f 100644 --- a/src/runtime/methodbinder.cs +++ b/src/runtime/methodbinder.cs @@ -375,7 +375,7 @@ internal Binding Bind(IntPtr inst, IntPtr args, IntPtr kw, MethodBase info, Meth if (clrtype != null) { var typematch = false; - if (pi[n].ParameterType != clrtype) + if ((pi[n].ParameterType != typeof(object)) && (pi[n].ParameterType != clrtype)) { IntPtr pytype = Converter.GetPythonTypeByAlias(pi[n].ParameterType); pyoptype = Runtime.PyObject_Type(op); diff --git a/src/tests/test_method.py b/src/tests/test_method.py index 41171df82..2c59fedac 100644 --- a/src/tests/test_method.py +++ b/src/tests/test_method.py @@ -781,7 +781,6 @@ def test_no_object_in_param(): MethodTest.TestOverloadedNoObject("test") -@pytest.mark.xfail(reason="Needs fixing. #203") def test_object_in_param(): """Test regression introduced by #151 in which Object method overloads aren't being used. See #203 for issue.""" From 4071aa3c37ac45bb6fe40d23558f68922f9b7f3e Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 14 Feb 2017 23:26:49 -0700 Subject: [PATCH 167/324] Add more object overload method tests --- src/testing/methodtest.cs | 50 +++++++++++++++++++++++++++++++++++++++ src/tests/test_method.py | 29 +++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/src/testing/methodtest.cs b/src/testing/methodtest.cs index 76546f0d3..e76348ab4 100644 --- a/src/testing/methodtest.cs +++ b/src/testing/methodtest.cs @@ -131,6 +131,56 @@ public static string TestOverloadedObject(object o) return "Got object"; } + public static string TestOverloadedObjectTwo(int a, int b) + { + return "Got int-int"; + } + + public static string TestOverloadedObjectTwo(string a, string b) + { + return "Got string-string"; + } + + public static string TestOverloadedObjectTwo(string a, int b) + { + return "Got string-int"; + } + + public static string TestOverloadedObjectTwo(string a, object b) + { + return "Got string-object"; + } + + public static string TestOverloadedObjectTwo(int a, object b) + { + return "Got int-object"; + } + + public static string TestOverloadedObjectTwo(object a, int b) + { + return "Got object-int"; + } + + public static string TestOverloadedObjectTwo(object a, object b) + { + return "Got object-object"; + } + + public static string TestOverloadedObjectTwo(int a, string b) + { + return "Got int-string"; + } + + public static string TestOverloadedObjectThree(object a, int b) + { + return "Got object-int"; + } + + public static string TestOverloadedObjectThree(int a, object b) + { + return "Got int-object"; + } + public static bool TestStringOutParams(string s, out string s1) { s1 = "output string"; diff --git a/src/tests/test_method.py b/src/tests/test_method.py index 2c59fedac..12c8cb13e 100644 --- a/src/tests/test_method.py +++ b/src/tests/test_method.py @@ -790,3 +790,32 @@ def test_object_in_param(): res = MethodTest.TestOverloadedObject("test") assert res == "Got object" + + +def test_object_in_multiparam(): + """Test method with object multiparams behaves""" + + res = MethodTest.TestOverloadedObjectTwo(5, 5) + assert res == "Got int-int" + + res = MethodTest.TestOverloadedObjectTwo(5, "foo") + assert res == "Got int-string" + + res = MethodTest.TestOverloadedObjectTwo("foo", 7.24) + assert res == "Got string-object" + + res = MethodTest.TestOverloadedObjectTwo("foo", "bar") + assert res == "Got string-string" + + res = MethodTest.TestOverloadedObjectTwo("foo", 5) + assert res == "Got string-int" + + res = MethodTest.TestOverloadedObjectTwo(7.24, 7.24) + assert res == "Got object-object" + + +def test_object_in_multiparam_exception(): + """Test method with object multiparams behaves""" + + with pytest.raises(TypeError): + MethodTest.TestOverloadedObjectThree("foo", "bar") From 9e3193b9726a8ba53fbfcb9cd228180dc8458ca9 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 22 Feb 2017 07:35:31 -0700 Subject: [PATCH 168/324] Update CHANGELOG --- CHANGELOG.md | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 546caf842..b68bc38a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,35 +9,45 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ### Added -- Code Coverage (#345) -- Added `pysetargv` (#347) +- Added Code Coverage (#345) +- Added `PySys_SetArgvEx` (#347) - Added XML Documentation (#349) -- Added Embedded tests on Appveyor (#353) -- Added PY3 settings to configuration-manager (#346) -- Added `Slack` chat (#384)(#383)(#386) +- Added `Embedded_Tests` on AppVeyor (#353) +- Added PY3 settings to solution configuration-manager (#346) +- Added `Slack` (#384)(#383)(#386) - Added function of passing an arbitrary .NET object as the value - of an attribute of PyObject (#370)(#373) + of an attribute of `PyObject` (#370)(#373) - Added `Coverity scan` (#390) +- Added `bumpversion` for version control (#319)(#398) +- Added `tox` for local testing (#345) +- Added `requirements.txt` ### Changed -- Refactored `setup.py` (#337) -- Upgraded NUnit framework to 2.6.4 (#353) -- Completed refactor of Build Directives on `Runtime.cs` (#339) -- Refactor python unittests (#329) -- Unfroze Mono version on Travis (#345) +- Refactored python `unittests` (#329) +- Refactored python `setup.py` (#337) +- Refactored remaining of Build Directives on `runtime.cs` (#339) +- Refactored `Embedded_Tests` to make easier to write tests (#369) - Changed `unittests` to `pytest` (#368) -- Upgraded NUnit framework from 2.6.4 to 3.6.0 (#371) +- Upgraded NUnit framework from `2.6.3` to `3.5.0` (#341) +- Downgraded NUnit framework from `3.5.0` to `2.6.4` (#353) +- Upgraded NUnit framework from `2.6.4` to `3.6.0` (#371) +- Unfroze Mono version on Travis (#345) +- Changed `conda.recipe` build to only pull-requests (#345) ### Fixed -- Fixed crash during Initialization (#343) +- Fixed crash during Initialization (#262)(#343) - Fixed crash during Shutdown (#365) - Fixed multiple build warnings +- Fixed method signature match for Object Type (#203)(#377) +- Fixed outdated version number in AssemblyInfo (#398) +- Fixed wrong version number in `conda.recipe` (#398) +- Fixed fixture location for Python tests and `Embedded_Tests` ### Removed -- Removed `six` dependency for unittests (#329) +- Removed `six` dependency for `unittests` (#329) - Removed `Mono.Unix` dependency for `UCS4` (#360) ## [2.2.2][] - 2017-01-29 From b21fab95a6000b3848e4ca7556f62cc3b68753d0 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 21 Feb 2017 09:10:18 -0700 Subject: [PATCH 169/324] Enable embedded_tests to Travis w. conditional filters Add conditional class skip to pytuple for Travis/PY27 Add individual filters to other tests as needed https://www.amido.com/code/conditional-ignore-nunit-and-the-ability-to-conditionally-ignore-a-test/ http://stackoverflow.com/a/16075029/5208670 --- .travis.yml | 2 +- src/embed_tests/dynamic.cs | 17 ++++++++++++++++- src/embed_tests/pyinitialize.cs | 5 +++++ src/embed_tests/pytuple.cs | 28 ++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index bd3b9fdf7..95e13b574 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,7 +42,7 @@ script: - python -m pytest - cp Python.Runtime.dll.config src/embed_tests/bin/ - # - mono ./packages/NUnit.*/tools/nunit3-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll + - mono ./packages/NUnit.*/tools/nunit3-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll after_script: # Uncomment if need to geninterop, ie. py37 final diff --git a/src/embed_tests/dynamic.cs b/src/embed_tests/dynamic.cs index 8338d68f6..4130323fd 100644 --- a/src/embed_tests/dynamic.cs +++ b/src/embed_tests/dynamic.cs @@ -58,13 +58,25 @@ public void AssignNone() /// Check whether we can get the attr of a python object when the /// value of attr is a PyObject. /// + /// + /// FIXME: Issue on Travis PY27: Error : Python.EmbeddingTest.dynamicTest.AssignPyObject + /// Python.Runtime.PythonException : ImportError : /home/travis/virtualenv/python2.7.9/lib/python2.7/lib-dynload/_io.so: undefined symbol: _PyLong_AsInt + /// [Test] public void AssignPyObject() { + if (Environment.GetEnvironmentVariable("TRAVIS") == "true" && + Environment.GetEnvironmentVariable("TRAVIS_PYTHON_VERSION") == "2.7") + { + // Most recently threw `auto-releasing thread-state, but no thread-state for this thread` + // instead of the error below. Maybe had bad mapping to library? + Assert.Ignore("Fails on Travis/PY27: ImportError: ... undefined symbol: _PyLong_AsInt"); + } + dynamic sys = Py.Import("sys"); dynamic io = Py.Import("io"); sys.testattr = io.StringIO(); - dynamic bb = sys.testattr; //Get the PyObject + dynamic bb = sys.testattr; // Get the PyObject bb.write("Hello!"); Assert.AreEqual(bb.getvalue().ToString(), "Hello!"); } @@ -72,6 +84,9 @@ public void AssignPyObject() /// /// Pass the .NET object in Python side. /// + /// + /// FIXME: Possible source of intermittent Travis PY27: Unable to unload AppDomain. + /// [Test] public void PassObjectInPython() { diff --git a/src/embed_tests/pyinitialize.cs b/src/embed_tests/pyinitialize.cs index 2f9aae2c7..2bfbd1a41 100644 --- a/src/embed_tests/pyinitialize.cs +++ b/src/embed_tests/pyinitialize.cs @@ -33,6 +33,11 @@ public static void LoadDefaultArgs() [Test] public static void LoadSpecificArgs() { + if (Environment.GetEnvironmentVariable("TRAVIS") == "true" && + Environment.GetEnvironmentVariable("TRAVIS_PYTHON_VERSION") != "2.7") + { + Assert.Ignore("FIXME: Fails on Travis/PY3+: Fatal Python error: no mem for sys.argv"); + } var args = new[] { "test1", "test2" }; using (new PythonEngine(args)) using (var argv = new PyList(Runtime.Runtime.PySys_GetObject("argv"))) diff --git a/src/embed_tests/pytuple.cs b/src/embed_tests/pytuple.cs index ef72d2ea9..88910147c 100644 --- a/src/embed_tests/pytuple.cs +++ b/src/embed_tests/pytuple.cs @@ -6,10 +6,37 @@ namespace Python.EmbeddingTest { public class PyTupleTest { + /// + /// Tests set-up. Being used to skip class on Travis/PY27 + /// + /// + /// FIXME: Fails on Travis/PY27: All tests below (unless otherwise stated) + /// Fatal Python error: auto-releasing thread-state, but no thread-state for this thread + /// Stacktrace: + /// at (wrapper managed-to-native) Python.Runtime.Runtime.PyGILState_Release (intptr) + /// at Python.Runtime.PythonEngine.ReleaseLock (intptr) + /// at Python.Runtime.PythonException.Dispose () + /// at Python.Runtime.PythonException.Finalize () + /// at (wrapper runtime-invoke) object.runtime_invoke_virtual_void__this__ (object,intptr,intptr,intptr) + /// + [SetUp] + public void SetUp() + { + if (Environment.GetEnvironmentVariable("TRAVIS") == "true" && + Environment.GetEnvironmentVariable("TRAVIS_PYTHON_VERSION") == "2.7") + { + Assert.Ignore("Fails on Travis/PY27: Fatal Python error: auto-releasing thread-state, but no thread-state for this thread"); + } + } + /// /// Test IsTupleType without having to Initialize a tuple. /// PyTuple constructor use IsTupleType. This decouples the tests. /// + /// + /// Travis PY27 intermittently fails this test. Indicates issue is + /// most likely with PyTuple.IsTupleType + /// [Test] public void TestStringIsTupleType() { @@ -104,6 +131,7 @@ public void TestPyTupleValidConvert() /// /// FIXME: Possible source of intermittent AppVeyor PY27: Unable to unload AppDomain. + /// FIXME: Intermittent Issue on Travis PY33: Fatal Python error: PyMUTEX_LOCK(gil_mutex) failed. Seen twice. /// [Test] public void TestNewPyTupleFromPyTuple() From 3cb531a5710764b3567d003a446eb62693dbd0a7 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 22 Feb 2017 10:02:13 -0700 Subject: [PATCH 170/324] Split blank DefineConstants on `*.csproj` Visual Studio by default wants to split these. Any time the csproj is update (new test for example) it splits them. Splitting them now to not worry about them when reviewing pull_requests. --- src/console/Console.csproj | 12 ++++++++---- src/embed_tests/Python.EmbeddingTest.csproj | 12 ++++++++---- src/runtime/runtime.cs | 1 - src/testing/Python.Test.csproj | 12 ++++++++---- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/console/Console.csproj b/src/console/Console.csproj index 9fe44830c..138c129f8 100644 --- a/src/console/Console.csproj +++ b/src/console/Console.csproj @@ -31,7 +31,8 @@ full - + + true pdbonly @@ -41,7 +42,8 @@ full - + + true pdbonly @@ -51,7 +53,8 @@ full - + + true pdbonly @@ -61,7 +64,8 @@ full - + + true pdbonly diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index ef011d044..1b015136d 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -30,7 +30,8 @@ full - + + true pdbonly @@ -40,7 +41,8 @@ full - + + true pdbonly @@ -50,7 +52,8 @@ full - + + true pdbonly @@ -60,7 +63,8 @@ full - + + true pdbonly diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 22b590657..fff628e29 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -195,7 +195,6 @@ internal static void Initialize() { op = Runtime.PyImport_ImportModule("builtins"); dict = Runtime.PyObject_GetAttrString(op, "__dict__"); - } else // Python2 { diff --git a/src/testing/Python.Test.csproj b/src/testing/Python.Test.csproj index f135ff9c5..d433e089a 100644 --- a/src/testing/Python.Test.csproj +++ b/src/testing/Python.Test.csproj @@ -31,7 +31,8 @@ full - + + true pdbonly @@ -41,7 +42,8 @@ full - + + true pdbonly @@ -51,7 +53,8 @@ full - + + true pdbonly @@ -61,7 +64,8 @@ full - + + true pdbonly From d86880a81ee5e52eeb855cf93b452167c4aa5ddf Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 22 Feb 2017 10:02:53 -0700 Subject: [PATCH 171/324] Update CHANGELOG --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b68bc38a0..369b16005 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,8 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Added Code Coverage (#345) - Added `PySys_SetArgvEx` (#347) - Added XML Documentation (#349) -- Added `Embedded_Tests` on AppVeyor (#353) +- Added `Embedded_Tests` on AppVeyor (#224)(#353) +- Added `Embedded_Tests` on Travis (#224)(#391) - Added PY3 settings to solution configuration-manager (#346) - Added `Slack` (#384)(#383)(#386) - Added function of passing an arbitrary .NET object as the value From edc7621c496d00f863bd7583c1a41aba3b71338f Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 23 Feb 2017 07:55:15 -0700 Subject: [PATCH 172/324] Fix PythonException GC (#400) Since PythonException doesn't inherit from PyObject, need to reapply the same fix as from gh:365. Seen mostly on PY27/Travis on PyTuple tests. Enable PyTuple tests for PY27/Travis --- src/embed_tests/pytuple.cs | 23 ----------------------- src/runtime/pythonexception.cs | 2 +- 2 files changed, 1 insertion(+), 24 deletions(-) diff --git a/src/embed_tests/pytuple.cs b/src/embed_tests/pytuple.cs index 88910147c..03c450694 100644 --- a/src/embed_tests/pytuple.cs +++ b/src/embed_tests/pytuple.cs @@ -6,29 +6,6 @@ namespace Python.EmbeddingTest { public class PyTupleTest { - /// - /// Tests set-up. Being used to skip class on Travis/PY27 - /// - /// - /// FIXME: Fails on Travis/PY27: All tests below (unless otherwise stated) - /// Fatal Python error: auto-releasing thread-state, but no thread-state for this thread - /// Stacktrace: - /// at (wrapper managed-to-native) Python.Runtime.Runtime.PyGILState_Release (intptr) - /// at Python.Runtime.PythonEngine.ReleaseLock (intptr) - /// at Python.Runtime.PythonException.Dispose () - /// at Python.Runtime.PythonException.Finalize () - /// at (wrapper runtime-invoke) object.runtime_invoke_virtual_void__this__ (object,intptr,intptr,intptr) - /// - [SetUp] - public void SetUp() - { - if (Environment.GetEnvironmentVariable("TRAVIS") == "true" && - Environment.GetEnvironmentVariable("TRAVIS_PYTHON_VERSION") == "2.7") - { - Assert.Ignore("Fails on Travis/PY27: Fatal Python error: auto-releasing thread-state, but no thread-state for this thread"); - } - } - /// /// Test IsTupleType without having to Initialize a tuple. /// PyTuple constructor use IsTupleType. This decouples the tests. diff --git a/src/runtime/pythonexception.cs b/src/runtime/pythonexception.cs index 8e2f992f4..58b33f0f3 100644 --- a/src/runtime/pythonexception.cs +++ b/src/runtime/pythonexception.cs @@ -140,7 +140,7 @@ public void Dispose() { if (!disposed) { - if (Runtime.Py_IsInitialized() > 0) + if (Runtime.Py_IsInitialized() > 0 && !Runtime.IsFinalizing) { IntPtr gs = PythonEngine.AcquireLock(); Runtime.XDecref(_pyType); From ea44eef9b4fbc4d0ab9ba4f7f31af16c7e9b44e4 Mon Sep 17 00:00:00 2001 From: yag Date: Fri, 17 Feb 2017 15:47:55 +0800 Subject: [PATCH 173/324] Add Eval(...) and Exec(...) --- src/embed_tests/Python.EmbeddingTest.csproj | 1 + src/embed_tests/pyrunstring.cs | 61 ++++++++++++++++++++ src/runtime/pythonengine.cs | 64 +++++++++++++++------ 3 files changed, 107 insertions(+), 19 deletions(-) create mode 100644 src/embed_tests/pyrunstring.cs diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index 1b015136d..f943ca787 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -86,6 +86,7 @@ + diff --git a/src/embed_tests/pyrunstring.cs b/src/embed_tests/pyrunstring.cs new file mode 100644 index 000000000..29fef522a --- /dev/null +++ b/src/embed_tests/pyrunstring.cs @@ -0,0 +1,61 @@ +using System; +using NUnit.Framework; +using Python.Runtime; + +namespace Python.EmbeddingTest +{ + public class RunStringTest + { + private Py.GILState gil; + + [SetUp] + public void SetUp() + { + gil = Py.GIL(); + } + + [TearDown] + public void Dispose() + { + gil.Dispose(); + } + + [Test] + public void TestRunSimpleString() + { + int aa = PythonEngine.RunSimpleString("import sys"); + Assert.AreEqual(aa, 0); + + int bb = PythonEngine.RunSimpleString("import 1234"); + Assert.AreEqual(bb, -1); + } + + [Test] + public void TestEval() + { + dynamic sys = Py.Import("sys"); + sys.attr1 = 100; + var locals = new PyDict(); + locals.SetItem("sys", sys); + locals.SetItem("a", new PyInt(10)); + + object b = PythonEngine.Eval("sys.attr1 + a + 1", null, locals.Handle) + .AsManagedObject(typeof(Int32)); + Assert.AreEqual(b, 111); + } + + [Test] + public void TestExec() + { + dynamic sys = Py.Import("sys"); + sys.attr1 = 100; + var locals = new PyDict(); + locals.SetItem("sys", sys); + locals.SetItem("a", new PyInt(10)); + + PythonEngine.Exec("c = sys.attr1 + a + 1", null, locals.Handle); + object c = locals.GetItem("c").AsManagedObject(typeof(Int32)); + Assert.AreEqual(c, 111); + } + } +} diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index e9fa888a9..1728422af 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -156,11 +156,7 @@ public static void Initialize(IEnumerable args) string code = "import atexit, clr\n" + "atexit.register(clr._AtExit)\n"; - PyObject r = PythonEngine.RunString(code); - if (r != null) - { - r.Dispose(); - } + PythonEngine.Exec(code); // Load the clr.py resource into the clr module IntPtr clr = Python.Runtime.ImportHook.GetCLRModule(); @@ -180,12 +176,7 @@ public static void Initialize(IEnumerable args) { // add the contents of clr.py to the module string clr_py = reader.ReadToEnd(); - PyObject result = RunString(clr_py, module_globals, locals.Handle); - if (null == result) - { - throw new PythonException(); - } - result.Dispose(); + Exec(clr_py, module_globals, locals.Handle); } // add the imported module to the clr module, and copy the API functions @@ -253,11 +244,7 @@ public static void InitExt() " exec(line)\n" + " break\n"; - PyObject r = PythonEngine.RunString(code); - if (r != null) - { - r.Dispose(); - } + PythonEngine.Exec(code); } catch (PythonException e) { @@ -405,6 +392,38 @@ public static PyObject ModuleFromString(string name, string code) } + /// + /// Eval Method + /// + /// + /// Evaluate a Python expression and returns the result. + /// It's a subset of Python eval function. + /// + public static PyObject Eval(string code, IntPtr? globals = null, IntPtr? locals = null) + { + PyObject result = RunString(code, globals, locals, RunFlagType.Eval); + return result; + } + + + /// + /// Exec Method + /// + /// + /// Run a string containing Python code. + /// It's a subset of Python exec function. + /// + public static void Exec(string code, IntPtr? globals = null, IntPtr? locals = null) + { + PyObject result = RunString(code, globals, locals, RunFlagType.File); + if (result.obj != Runtime.PyNone) + { + throw new PythonException(); + } + result.Dispose(); + } + + /// /// RunString Method /// @@ -413,8 +432,8 @@ public static PyObject ModuleFromString(string name, string code) /// executing the code string as a PyObject instance, or null if /// an exception was raised. /// - public static PyObject RunString( - string code, IntPtr? globals = null, IntPtr? locals = null + internal static PyObject RunString( + string code, IntPtr? globals = null, IntPtr? locals = null, RunFlagType _flag = RunFlagType.File ) { var borrowedGlobals = true; @@ -439,7 +458,7 @@ public static PyObject RunString( borrowedLocals = false; } - var flag = (IntPtr)257; /* Py_file_input */ + var flag = (IntPtr)_flag; try { @@ -465,6 +484,13 @@ public static PyObject RunString( } } + public enum RunFlagType + { + Single = 256, + File = 257, /* Py_file_input */ + Eval = 258 + } + public static class Py { public static GILState GIL() From 2dfff9f21601afe742477fda4c3df1040925c91a Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 23 Feb 2017 14:25:56 -0700 Subject: [PATCH 174/324] Keep RunString Public. Fix Assert.AreEqual order - Deprecation/Removal should be a separate issue/pr - In NUnit/XUnit, expected is the first argument, actual is second. Opposite to how Python does it --- src/embed_tests/pyrunstring.cs | 12 ++++++------ src/runtime/pythonengine.cs | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/embed_tests/pyrunstring.cs b/src/embed_tests/pyrunstring.cs index 29fef522a..b17bb87f8 100644 --- a/src/embed_tests/pyrunstring.cs +++ b/src/embed_tests/pyrunstring.cs @@ -24,10 +24,10 @@ public void Dispose() public void TestRunSimpleString() { int aa = PythonEngine.RunSimpleString("import sys"); - Assert.AreEqual(aa, 0); + Assert.AreEqual(0, aa); int bb = PythonEngine.RunSimpleString("import 1234"); - Assert.AreEqual(bb, -1); + Assert.AreEqual(-1, bb); } [Test] @@ -40,8 +40,8 @@ public void TestEval() locals.SetItem("a", new PyInt(10)); object b = PythonEngine.Eval("sys.attr1 + a + 1", null, locals.Handle) - .AsManagedObject(typeof(Int32)); - Assert.AreEqual(b, 111); + .AsManagedObject(typeof(int)); + Assert.AreEqual(111, b); } [Test] @@ -54,8 +54,8 @@ public void TestExec() locals.SetItem("a", new PyInt(10)); PythonEngine.Exec("c = sys.attr1 + a + 1", null, locals.Handle); - object c = locals.GetItem("c").AsManagedObject(typeof(Int32)); - Assert.AreEqual(c, 111); + object c = locals.GetItem("c").AsManagedObject(typeof(int)); + Assert.AreEqual(111, c); } } } diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index 1728422af..accd349c5 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -432,7 +432,7 @@ public static void Exec(string code, IntPtr? globals = null, IntPtr? locals = nu /// executing the code string as a PyObject instance, or null if /// an exception was raised. /// - internal static PyObject RunString( + public static PyObject RunString( string code, IntPtr? globals = null, IntPtr? locals = null, RunFlagType _flag = RunFlagType.File ) { From e8c22947dd61cb409ee87770ffcd9c09228324e4 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 23 Feb 2017 17:08:13 -0700 Subject: [PATCH 175/324] Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 369b16005..5d2d05bc4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Added `bumpversion` for version control (#319)(#398) - Added `tox` for local testing (#345) - Added `requirements.txt` +- Added to `PythonEngine` methods `Eval` and `Exec` (#389) ### Changed @@ -45,6 +46,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Fixed outdated version number in AssemblyInfo (#398) - Fixed wrong version number in `conda.recipe` (#398) - Fixed fixture location for Python tests and `Embedded_Tests` +- Fixed `PythonException` crash during Shutdown (#400) ### Removed From 2b6f8151ca0ccb35d10a85b5a09a0d53ba531fba Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 23 Feb 2017 22:24:42 -0700 Subject: [PATCH 176/324] Clarify MashalAs on runtime.cs - Shorten MarshalAsAttribute name - Put MashalAs'ed argument on own-line - Flip IF comparison --- src/runtime/runtime.cs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index fff628e29..55df701d2 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -290,13 +290,13 @@ internal static void Initialize() #if PYTHON3 IntPtr dll = IntPtr.Zero; - if ("__Internal" != Runtime.dll) + if (Runtime.dll != "__Internal") { NativeMethods.LoadLibrary(Runtime.dll); } _PyObject_NextNotImplemented = NativeMethods.GetProcAddress(dll, "_PyObject_NextNotImplemented"); #if !(MONO_LINUX || MONO_OSX) - if (IntPtr.Zero != dll) + if (dll != IntPtr.Zero) { NativeMethods.FreeLibrary(dll); } @@ -665,7 +665,10 @@ internal unsafe static extern IntPtr [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] public unsafe static extern int - Py_Main(int argc, [MarshalAsAttribute(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] argv); + Py_Main( + int argc, + [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] argv + ); #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] @@ -739,7 +742,7 @@ internal unsafe static extern string [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern void - Py_SetProgramName([MarshalAsAttribute(UnmanagedType.LPWStr)] string name); + Py_SetProgramName([MarshalAs(UnmanagedType.LPWStr)] string name); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] @@ -750,7 +753,7 @@ internal unsafe static extern string [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern void - Py_SetPythonHome([MarshalAsAttribute(UnmanagedType.LPWStr)] string home); + Py_SetPythonHome([MarshalAs(UnmanagedType.LPWStr)] string home); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] @@ -761,7 +764,7 @@ internal unsafe static extern string [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] internal unsafe static extern void - Py_SetPath([MarshalAsAttribute(UnmanagedType.LPWStr)] string home); + Py_SetPath([MarshalAs(UnmanagedType.LPWStr)] string home); #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] @@ -2081,7 +2084,7 @@ internal unsafe static extern IntPtr internal unsafe static extern void PySys_SetArgvEx( int argc, - [MarshalAsAttribute(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] argv, + [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] argv, int updatepath ); #elif PYTHON2 From ecd7e601558cd1f6cbfa9139b67caf443f817295 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 23 Feb 2017 22:56:34 -0700 Subject: [PATCH 177/324] Fix runtime Initialize dll nameclash Looks like dllLocal never changes from IntPtr.Zero --- src/runtime/runtime.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 55df701d2..b9ca4dfc7 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -289,16 +289,16 @@ internal static void Initialize() Error = new IntPtr(-1); #if PYTHON3 - IntPtr dll = IntPtr.Zero; + IntPtr dllLocal = IntPtr.Zero; if (Runtime.dll != "__Internal") { NativeMethods.LoadLibrary(Runtime.dll); } - _PyObject_NextNotImplemented = NativeMethods.GetProcAddress(dll, "_PyObject_NextNotImplemented"); + _PyObject_NextNotImplemented = NativeMethods.GetProcAddress(dllLocal, "_PyObject_NextNotImplemented"); #if !(MONO_LINUX || MONO_OSX) - if (dll != IntPtr.Zero) + if (dllLocal != IntPtr.Zero) { - NativeMethods.FreeLibrary(dll); + NativeMethods.FreeLibrary(dllLocal); } #endif #endif From 012b488af1a5f73bd7086923cbb9a437a30a5886 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 24 Feb 2017 01:09:25 -0700 Subject: [PATCH 178/324] Update test_sysargv Previous version didn't test correctly --- src/tests/_compat.py | 9 +++++++++ src/tests/conftest.py | 16 ++++++++++++++-- src/tests/fixtures/argv-fixture.py | 12 ++++++++++++ src/tests/test_sysargv.py | 19 ++++++++++++++----- 4 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 src/tests/fixtures/argv-fixture.py diff --git a/src/tests/_compat.py b/src/tests/_compat.py index 178777e4a..3751ca013 100644 --- a/src/tests/_compat.py +++ b/src/tests/_compat.py @@ -6,6 +6,7 @@ """ import operator +import subprocess import sys import types @@ -63,3 +64,11 @@ map = imap range = xrange zip = izip + + +def check_output(*args, **kwargs): + """Check output wrapper for PY2/PY3 compatibility""" + output = subprocess.check_output(*args, **kwargs) + if PY2: + return output + return output.decode("ascii") diff --git a/src/tests/conftest.py b/src/tests/conftest.py index 534334491..a93326c51 100644 --- a/src/tests/conftest.py +++ b/src/tests/conftest.py @@ -9,12 +9,13 @@ import sys import sysconfig +import pytest import clr # Add path for `Python.Test` cwd = os.path.dirname(__file__) -fixtures = os.path.join(cwd, 'fixtures') -sys.path.append(fixtures) +fixtures_path = os.path.join(cwd, "fixtures") +sys.path.append(fixtures_path) # Add References for tests clr.AddReference("Python.Test") @@ -34,3 +35,14 @@ def pytest_report_header(config): header = ("Arch: {arch}, UCS: {ucs}, LIBDIR: {libdir}, " "Py_ENABLE_SHARED: {shared}".format(**locals())) return header + + +@pytest.fixture() +def filepath(): + """Returns full filepath for file in `fixtures` directory.""" + + def make_filepath(filename): + # http://stackoverflow.com/questions/18011902/parameter-to-a-fixture + return os.path.join(fixtures_path, filename) + + return make_filepath diff --git a/src/tests/fixtures/argv-fixture.py b/src/tests/fixtures/argv-fixture.py new file mode 100644 index 000000000..d56dea4e0 --- /dev/null +++ b/src/tests/fixtures/argv-fixture.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- + +"""Helper script to test argv. +Ensures that argv isn't modified after importing clr. +For more details see GH#404 - argv not found""" + +from __future__ import print_function + +import sys +import clr + +print(sys.argv) diff --git a/src/tests/test_sysargv.py b/src/tests/test_sysargv.py index 2649bf885..2c381070b 100644 --- a/src/tests/test_sysargv.py +++ b/src/tests/test_sysargv.py @@ -4,9 +4,18 @@ import sys +import pytest -def test_sys_argv_state(): - """Test sys.argv state doesn't change after clr import.""" - argv = sys.argv - import clr - assert argv == sys.argv +from ._compat import check_output + + +@pytest.mark.xfail(reason="argv being reset on import clr. See gh#404") +def test_sys_argv_state(filepath): + """Test sys.argv state doesn't change after clr import. + To better control the arguments being passed, test on a fresh python + instance with specific arguments""" + + script = filepath("argv-fixture.py") + out = check_output([sys.executable, script, "foo", "bar"]) + assert "foo" in out + assert "bar" in out From faf5faf81e9a0151c4b004fb2ad0697f628ed077 Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Fri, 24 Feb 2017 15:18:18 +0100 Subject: [PATCH 179/324] Fix the issue of sys.argv being cleared on import clr. Closes #404. --- src/runtime/pythonengine.cs | 14 ++++++++++---- src/tests/test_sysargv.py | 3 --- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index accd349c5..3a227479a 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -122,7 +122,12 @@ public static int RunSimpleString(string code) public static void Initialize() { - Initialize(Enumerable.Empty()); + Initialize(setSysArgv: true); + } + + public static void Initialize(bool setSysArgv = true) + { + Initialize(Enumerable.Empty(), setSysArgv: setSysArgv); } /// @@ -134,7 +139,7 @@ public static void Initialize() /// first call. It is *not* necessary to hold the Python global /// interpreter lock (GIL) to call this method. /// - public static void Initialize(IEnumerable args) + public static void Initialize(IEnumerable args, bool setSysArgv = true) { if (!initialized) { @@ -148,7 +153,8 @@ public static void Initialize(IEnumerable args) initialized = true; Exceptions.Clear(); - Py.SetArgv(args); + if (setSysArgv) + Py.SetArgv(args); // register the atexit callback (this doesn't use Py_AtExit as the C atexit // callbacks are called after python is fully finalized but the python ones @@ -213,7 +219,7 @@ public static void InitExt() { try { - Initialize(); + Initialize(setSysArgv: false); // Trickery - when the import hook is installed into an already // running Python, the standard import machinery is still in diff --git a/src/tests/test_sysargv.py b/src/tests/test_sysargv.py index 2c381070b..d86aa1c1d 100644 --- a/src/tests/test_sysargv.py +++ b/src/tests/test_sysargv.py @@ -4,12 +4,9 @@ import sys -import pytest - from ._compat import check_output -@pytest.mark.xfail(reason="argv being reset on import clr. See gh#404") def test_sys_argv_state(filepath): """Test sys.argv state doesn't change after clr import. To better control the arguments being passed, test on a fresh python From c5c8e579d212a7e3ce72f791a5dac731f79b5788 Mon Sep 17 00:00:00 2001 From: denfromufa Date: Fri, 24 Feb 2017 15:15:40 -0600 Subject: [PATCH 180/324] improve tests.pyproj for intellisense and running tests (#395) * Update tests.pyproj * Update folder structure After pytest folders were flatten. Add code in fixture Upstream PyImportTest was moved to within Embedded Tests Add pyproj to editorconfig --- .editorconfig | 2 +- src/tests/tests.pyproj | 23 ++++++++++------------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/.editorconfig b/.editorconfig index 25636a549..2e7c58ffe 100644 --- a/.editorconfig +++ b/.editorconfig @@ -16,7 +16,7 @@ trim_trailing_whitespace = true indent_size = 2 # Xml project files -[*.{csproj,config,build,config}] +[*.{csproj,pyproj,config}] indent_size = 2 # Solution diff --git a/src/tests/tests.pyproj b/src/tests/tests.pyproj index 5d042249e..cefa0d05e 100644 --- a/src/tests/tests.pyproj +++ b/src/tests/tests.pyproj @@ -6,7 +6,7 @@ {250c535c-c060-4f0c-bd80-41f2bf373565} runtests.py - + ..\..\ . . {888888a0-9f3d-457c-b088-3a5042f75d52} @@ -27,17 +27,17 @@ $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Python Tools\Microsoft.PythonTools.targets + + + - - - - + @@ -50,23 +50,20 @@ + + - - - - - + + - - - + From db6c1b2f2d2542b12d6c7211fd1f1a5790320e23 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 24 Feb 2017 14:28:12 -0700 Subject: [PATCH 181/324] Add case-sensitivity tests closes #81 --- src/testing/methodtest.cs | 10 ++++++++++ src/tests/test_method.py | 13 +++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/testing/methodtest.cs b/src/testing/methodtest.cs index e76348ab4..83dc907c0 100644 --- a/src/testing/methodtest.cs +++ b/src/testing/methodtest.cs @@ -641,6 +641,16 @@ public static int Overloaded(int i, string s) { return i; } + + public static string CaseSensitive() + { + return "CaseSensitive"; + } + + public static string Casesensitive() + { + return "Casesensitive"; + } } diff --git a/src/tests/test_method.py b/src/tests/test_method.py index 12c8cb13e..ad182678d 100644 --- a/src/tests/test_method.py +++ b/src/tests/test_method.py @@ -819,3 +819,16 @@ def test_object_in_multiparam_exception(): with pytest.raises(TypeError): MethodTest.TestOverloadedObjectThree("foo", "bar") + + +def test_case_sensitive(): + """Test that case-sensitivity is respected. GH#81""" + + res = MethodTest.CaseSensitive() + assert res == "CaseSensitive" + + res = MethodTest.Casesensitive() + assert res == "Casesensitive" + + with pytest.raises(AttributeError): + MethodTest.casesensitive() From 30be9c9fb39e759031a4060775a98a38928ef92b Mon Sep 17 00:00:00 2001 From: fractus Date: Fri, 24 Feb 2017 23:26:14 +0000 Subject: [PATCH 182/324] Added branching for ldd command in OSX (#406) --- setup.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/setup.py b/setup.py index 37a936584..5e6813518 100644 --- a/setup.py +++ b/setup.py @@ -162,16 +162,15 @@ def build_extension(self, ext): defines.extend(["DEBUG", "TRACE"]) if sys.platform != "win32" and DEVTOOLS == "Mono": - if sys.platform == "darwin": - defines.append("MONO_OSX") - else: - defines.append("MONO_LINUX") + on_darwin = sys.platform == "darwin" + defines.append("MONO_OSX" if on_darwin else "MONO_LINUX") # Check if --enable-shared was set when Python was built enable_shared = sysconfig.get_config_var("Py_ENABLE_SHARED") if enable_shared: # Double-check if libpython is linked dynamically with python - lddout = _check_output(["ldd", sys.executable]) + ldd_cmd = ["otool", "-L"] if on_darwin else ["ldd"] + lddout = _check_output(ldd_cmd + [sys.executable]) if 'libpython' not in lddout: enable_shared = False From b4ed645d343ef302513b17796cdd8791c4255128 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 25 Feb 2017 08:46:51 -0700 Subject: [PATCH 183/324] Minor style clean-up runtime/pythonengine Add missing brackets Organize using/remove unused Align arguments --- src/runtime/pythonengine.cs | 7 ++++--- src/runtime/runtime.cs | 9 ++++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index 3a227479a..57f6d5074 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -1,9 +1,8 @@ using System; -using System.IO; -using System.Threading; -using System.Reflection; using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Reflection; namespace Python.Runtime { @@ -154,7 +153,9 @@ public static void Initialize(IEnumerable args, bool setSysArgv = true) Exceptions.Clear(); if (setSysArgv) + { Py.SetArgv(args); + } // register the atexit callback (this doesn't use Py_AtExit as the C atexit // callbacks are called after python is fully finalized but the python ones diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index b9ca4dfc7..d0960222c 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1653,11 +1653,14 @@ internal unsafe static extern IntPtr EntryPoint = "PyUnicode_FromKindAndData", ExactSpelling = true)] internal unsafe static extern IntPtr - PyUnicode_FromKindAndString(int kind, + PyUnicode_FromKindAndString( + int kind, IntPtr s, - int size); + int size + ); - internal static unsafe IntPtr PyUnicode_FromKindAndString(int kind, + internal static unsafe IntPtr PyUnicode_FromKindAndString( + int kind, string s, int size) { From 8ff338a0783bbe0f26a2196cea736849ea7c146c Mon Sep 17 00:00:00 2001 From: dse Date: Tue, 21 Feb 2017 22:24:49 -0700 Subject: [PATCH 184/324] Fix Py_Main/PySys_SetArgvEx(...) UCS4/PY3 no mem Based on @dmitriyse work on: https://github.com/dmitriyse/pythonnet/commit/8a70f09cb8faa9461d13480fb9ee2ee60b5b9acc --- src/embed_tests/pyinitialize.cs | 5 --- src/runtime/runtime.cs | 69 ++++++++++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 7 deletions(-) diff --git a/src/embed_tests/pyinitialize.cs b/src/embed_tests/pyinitialize.cs index 2bfbd1a41..2f9aae2c7 100644 --- a/src/embed_tests/pyinitialize.cs +++ b/src/embed_tests/pyinitialize.cs @@ -33,11 +33,6 @@ public static void LoadDefaultArgs() [Test] public static void LoadSpecificArgs() { - if (Environment.GetEnvironmentVariable("TRAVIS") == "true" && - Environment.GetEnvironmentVariable("TRAVIS_PYTHON_VERSION") != "2.7") - { - Assert.Ignore("FIXME: Fails on Travis/PY3+: Fatal Python error: no mem for sys.argv"); - } var args = new[] { "test1", "test2" }; using (new PythonEngine(args)) using (var argv = new PyList(Runtime.Runtime.PySys_GetObject("argv"))) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index d0960222c..3f30f86ce 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -667,8 +667,41 @@ internal unsafe static extern IntPtr public unsafe static extern int Py_Main( int argc, - [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] argv + [MarshalAs(UnmanagedType.SysUInt)] IntPtr lplpargv ); + + public static int Py_Main(int argc, string[] argv) + { + // Totally ignoring argc. + argc = argv.Length; + + var allStringsLength = 0; + foreach (string x in argv) + { + allStringsLength += x.Length + 1; + } + int requiredSize = IntPtr.Size * argc + allStringsLength * UCS; + IntPtr mem = Marshal.AllocHGlobal(requiredSize); + try + { + // Preparing array of pointers to UTF32 strings. + IntPtr curStrPtr = mem + argc * IntPtr.Size; + for (var i = 0; i < argv.Length; i++) + { + // Unicode or UTF8 work + Encoding enc = UCS == 2 ? Encoding.Unicode : Encoding.UTF32; + byte[] zstr = enc.GetBytes(argv[i] + "\0"); + Marshal.Copy(zstr, 0, curStrPtr, zstr.Length); + Marshal.WriteIntPtr(mem + IntPtr.Size * i, curStrPtr); + curStrPtr += zstr.Length; + } + return Py_Main(argc, mem); + } + finally + { + Marshal.FreeHGlobal(mem); + } + } #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] @@ -2087,9 +2120,41 @@ internal unsafe static extern IntPtr internal unsafe static extern void PySys_SetArgvEx( int argc, - [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] argv, + [MarshalAs(UnmanagedType.SysUInt)] IntPtr lplpargv, int updatepath ); + + internal static void PySys_SetArgvEx(int argc, string[] argv, int updatepath) + { + // Totally ignoring argc. + argc = argv.Length; + + var allStringsLength = 0; + foreach (string x in argv) + { + allStringsLength += x.Length + 1; + } + int requiredSize = IntPtr.Size * argc + allStringsLength * UCS; + IntPtr mem = Marshal.AllocHGlobal(requiredSize); + try + { + // Preparing array of pointers to UTF32 strings. + IntPtr curStrPtr = mem + argc * IntPtr.Size; + for (var i = 0; i < argv.Length; i++) + { + Encoding enc = UCS == 2 ? Encoding.Unicode : Encoding.UTF32; + byte[] zstr = enc.GetBytes(argv[i] + "\0"); + Marshal.Copy(zstr, 0, curStrPtr, zstr.Length); + Marshal.WriteIntPtr(mem + IntPtr.Size * i, curStrPtr); + curStrPtr += zstr.Length; + } + PySys_SetArgvEx(argc, mem, updatepath); + } + finally + { + Marshal.FreeHGlobal(mem); + } + } #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] From 9b7089209f7466a8aebe23c981186bc5a69867a4 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 24 Feb 2017 17:03:57 -0700 Subject: [PATCH 185/324] Update CHANGELOG, remove extra MarshalAs --- CHANGELOG.md | 1 + src/runtime/runtime.cs | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d2d05bc4..6b9e3d8fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Fixed wrong version number in `conda.recipe` (#398) - Fixed fixture location for Python tests and `Embedded_Tests` - Fixed `PythonException` crash during Shutdown (#400) +- Fixed `Py_Main` & `PySys_SetArgvEx` no mem error on `UCS4/PY3` (#399) ### Removed diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 3f30f86ce..6398d3345 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -667,7 +667,7 @@ internal unsafe static extern IntPtr public unsafe static extern int Py_Main( int argc, - [MarshalAs(UnmanagedType.SysUInt)] IntPtr lplpargv + IntPtr lplpargv ); public static int Py_Main(int argc, string[] argv) @@ -2120,7 +2120,7 @@ internal unsafe static extern IntPtr internal unsafe static extern void PySys_SetArgvEx( int argc, - [MarshalAs(UnmanagedType.SysUInt)] IntPtr lplpargv, + IntPtr lplpargv, int updatepath ); From 9e854897bbd518220abb1bd41939c0aba84e98a3 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 25 Feb 2017 18:47:38 -0700 Subject: [PATCH 186/324] Move PythonBuildDir when not defined Keep root of solution clean and out of the way from being imported because its on the `cwd`. --- src/clrmodule/clrmodule.csproj | 2 +- src/console/Console.csproj | 2 +- src/embed_tests/Python.EmbeddingTest.csproj | 2 +- src/runtime/Python.Runtime.csproj | 2 +- src/testing/Python.Test.csproj | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/clrmodule/clrmodule.csproj b/src/clrmodule/clrmodule.csproj index 6f44789d7..a86822118 100644 --- a/src/clrmodule/clrmodule.csproj +++ b/src/clrmodule/clrmodule.csproj @@ -13,7 +13,7 @@ 1591 ..\..\ - $(SolutionDir) + $(SolutionDir)\bin\ Properties true diff --git a/src/console/Console.csproj b/src/console/Console.csproj index 138c129f8..1c2881046 100644 --- a/src/console/Console.csproj +++ b/src/console/Console.csproj @@ -13,7 +13,7 @@ 1591 ..\..\ - $(SolutionDir) + $(SolutionDir)\bin\ Properties python-clear.ico diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index f943ca787..d3c25bf24 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -13,7 +13,7 @@ 1591 ..\..\ - $(SolutionDir) + $(SolutionDir)\bin\ true prompt diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index fd2281d58..c32bd5dec 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -13,7 +13,7 @@ 1591 ..\..\ - $(SolutionDir) + $(SolutionDir)\bin\ Properties true diff --git a/src/testing/Python.Test.csproj b/src/testing/Python.Test.csproj index d433e089a..2a2f9ff54 100644 --- a/src/testing/Python.Test.csproj +++ b/src/testing/Python.Test.csproj @@ -13,7 +13,7 @@ 1591,0067 ..\..\ - $(SolutionDir) + $(SolutionDir)\bin\ false ..\pythonnet.snk From f2519f7a826534a884327cf59915961c6825ec72 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 25 Feb 2017 18:49:46 -0700 Subject: [PATCH 187/324] Update ARCH check Use sys for x86/x64 check --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 5e6813518..30168dfde 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,6 @@ import fnmatch import glob import os -import platform import subprocess import sys import sysconfig @@ -24,8 +23,9 @@ CONFIG = "Release" # Release or Debug VERBOSITY = "minimal" # quiet, minimal, normal, detailed, diagnostic +is_64bits = sys.maxsize > 2**32 DEVTOOLS = "MsDev" if sys.platform == "win32" else "Mono" -ARCH = "x64" if platform.architecture()[0] == "64bit" else "x86" +ARCH = "x64" if is_64bits else "x86" PY_MAJOR = sys.version_info[0] PY_MINOR = sys.version_info[1] From cef6153170351691bfebc7a3de635032e03cfe0d Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 26 Feb 2017 18:01:04 -0700 Subject: [PATCH 188/324] Enable TestPyTupleInvalidAppend test `AppDomain unload` was solved by #400. Closes #397. Possibly also solved #245. --- CHANGELOG.md | 1 + src/embed_tests/dynamic.cs | 5 ----- src/embed_tests/pytuple.cs | 21 +++++++-------------- src/runtime/pythonexception.cs | 2 ++ 4 files changed, 10 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b9e3d8fa..6ec2a0fb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Fixed wrong version number in `conda.recipe` (#398) - Fixed fixture location for Python tests and `Embedded_Tests` - Fixed `PythonException` crash during Shutdown (#400) +- Fixed `AppDomain` unload during GC (#397)(#400) - Fixed `Py_Main` & `PySys_SetArgvEx` no mem error on `UCS4/PY3` (#399) ### Removed diff --git a/src/embed_tests/dynamic.cs b/src/embed_tests/dynamic.cs index 4130323fd..73277c454 100644 --- a/src/embed_tests/dynamic.cs +++ b/src/embed_tests/dynamic.cs @@ -68,8 +68,6 @@ public void AssignPyObject() if (Environment.GetEnvironmentVariable("TRAVIS") == "true" && Environment.GetEnvironmentVariable("TRAVIS_PYTHON_VERSION") == "2.7") { - // Most recently threw `auto-releasing thread-state, but no thread-state for this thread` - // instead of the error below. Maybe had bad mapping to library? Assert.Ignore("Fails on Travis/PY27: ImportError: ... undefined symbol: _PyLong_AsInt"); } @@ -84,9 +82,6 @@ public void AssignPyObject() /// /// Pass the .NET object in Python side. /// - /// - /// FIXME: Possible source of intermittent Travis PY27: Unable to unload AppDomain. - /// [Test] public void PassObjectInPython() { diff --git a/src/embed_tests/pytuple.cs b/src/embed_tests/pytuple.cs index 03c450694..ade4375c0 100644 --- a/src/embed_tests/pytuple.cs +++ b/src/embed_tests/pytuple.cs @@ -10,10 +10,6 @@ public class PyTupleTest /// Test IsTupleType without having to Initialize a tuple. /// PyTuple constructor use IsTupleType. This decouples the tests. /// - /// - /// Travis PY27 intermittently fails this test. Indicates issue is - /// most likely with PyTuple.IsTupleType - /// [Test] public void TestStringIsTupleType() { @@ -47,15 +43,16 @@ public void TestPyTupleEmpty() } } + /// + /// Test PyTuple.Concat(...) doesn't let invalid appends happen + /// and throws and exception. + /// /// - /// FIXME: Unable to unload AppDomain, Unload thread timed out. - /// Seen on Travis/AppVeyor on both PY2 and PY3. Causes Embedded_Tests - /// to hang after they are finished for ~40 seconds until nunit3 forces - /// a timeout on unloading tests. Doesn't fail the tests though but - /// greatly slows down CI. nunit2 silently has this issue. + /// Test has second purpose. Currently it generated an Exception + /// that the GC failed to remove often and caused AppDomain unload + /// errors at the end of tests. See GH#397 for more info. /// [Test] - [Ignore("GH#397: Travis/AppVeyor: Unable to unload AppDomain, Unload thread timed out")] public void TestPyTupleInvalidAppend() { using (Py.GIL()) @@ -106,10 +103,6 @@ public void TestPyTupleValidConvert() } } - /// - /// FIXME: Possible source of intermittent AppVeyor PY27: Unable to unload AppDomain. - /// FIXME: Intermittent Issue on Travis PY33: Fatal Python error: PyMUTEX_LOCK(gil_mutex) failed. Seen twice. - /// [Test] public void TestNewPyTupleFromPyTuple() { diff --git a/src/runtime/pythonexception.cs b/src/runtime/pythonexception.cs index 58b33f0f3..4fe07f3cf 100644 --- a/src/runtime/pythonexception.cs +++ b/src/runtime/pythonexception.cs @@ -135,6 +135,8 @@ public override string StackTrace /// /// The Dispose method provides a way to explicitly release the /// Python objects represented by a PythonException. + /// If object not properly disposed can cause AppDomain unload issue. + /// See GH#397 and GH#400. /// public void Dispose() { From 5070db0dfdd69345b8e62b8c47af34e16c509a1d Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 26 Feb 2017 18:38:00 -0700 Subject: [PATCH 189/324] Add tests/refactor existing --- src/embed_tests/dynamic.cs | 2 +- src/embed_tests/pythonexception.cs | 14 +++++----- src/embed_tests/pytuple.cs | 42 +++++++++++++++++++++++++++++- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/embed_tests/dynamic.cs b/src/embed_tests/dynamic.cs index 73277c454..bfdc8fcc2 100644 --- a/src/embed_tests/dynamic.cs +++ b/src/embed_tests/dynamic.cs @@ -5,7 +5,7 @@ namespace Python.EmbeddingTest { - public class dynamicTest + public class DynamicTest { private Py.GILState gil; diff --git a/src/embed_tests/pythonexception.cs b/src/embed_tests/pythonexception.cs index bdae9db9e..0323567d0 100644 --- a/src/embed_tests/pythonexception.cs +++ b/src/embed_tests/pythonexception.cs @@ -33,14 +33,12 @@ public void Dispose() public void TestMessage() { var list = new PyList(); - try - { - PyObject junk = list[0]; - } - catch (PythonException e) - { - Assert.AreEqual("IndexError : list index out of range", e.Message); - } + PyObject foo = null; + + var ex = Assert.Throws(() => foo = list[0]); + + Assert.AreEqual("IndexError : list index out of range", ex.Message); + Assert.IsNull(foo); } [Test] diff --git a/src/embed_tests/pytuple.cs b/src/embed_tests/pytuple.cs index ade4375c0..541e13210 100644 --- a/src/embed_tests/pytuple.cs +++ b/src/embed_tests/pytuple.cs @@ -43,6 +43,21 @@ public void TestPyTupleEmpty() } } + [Test] + public void TestPyTupleBadCtor() + { + using (Py.GIL()) + { + var i = new PyInt(5); + PyTuple t = null; + + var ex = Assert.Throws(() => t = new PyTuple(i)); + + Assert.AreEqual("object is not a tuple", ex.Message); + Assert.IsNull(t); + } + } + /// /// Test PyTuple.Concat(...) doesn't let invalid appends happen /// and throws and exception. @@ -51,6 +66,8 @@ public void TestPyTupleEmpty() /// Test has second purpose. Currently it generated an Exception /// that the GC failed to remove often and caused AppDomain unload /// errors at the end of tests. See GH#397 for more info. + /// + /// Curious, on PY27 it gets a Unicode on the ex.Message. On PY3+ its string. /// [Test] public void TestPyTupleInvalidAppend() @@ -59,7 +76,12 @@ public void TestPyTupleInvalidAppend() { PyObject s = new PyString("foo"); var t = new PyTuple(); - Assert.Throws(() => t.Concat(s)); + + var ex = Assert.Throws(() => t.Concat(s)); + + StringAssert.StartsWith("TypeError : can only concatenate tuple", ex.Message); + Assert.AreEqual(0, t.Length()); + Assert.IsEmpty(t); } } @@ -114,5 +136,23 @@ public void TestNewPyTupleFromPyTuple() Assert.IsInstanceOf(typeof(PyTuple), t); } } + + /// + /// TODO: Should this throw ArgumentError instead? + /// + [Test] + public void TestInvalidAsTuple() + { + using (Py.GIL()) + { + var i = new PyInt(5); + PyTuple t = null; + + var ex = Assert.Throws(() => t = PyTuple.AsTuple(i)); + + Assert.AreEqual("TypeError : 'int' object is not iterable", ex.Message); + Assert.IsNull(t); + } + } } } From 7dba6178186938db115519a11a46c1d51b0fab0c Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 26 Feb 2017 22:45:06 -0700 Subject: [PATCH 190/324] Set language version to 6 Prevent accidental introduction of csharp 7 features. --- src/clrmodule/clrmodule.csproj | 2 +- src/console/Console.csproj | 2 +- src/embed_tests/Python.EmbeddingTest.csproj | 2 +- src/runtime/Python.Runtime.csproj | 2 +- src/testing/Python.Test.csproj | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/clrmodule/clrmodule.csproj b/src/clrmodule/clrmodule.csproj index a86822118..6e5ff4966 100644 --- a/src/clrmodule/clrmodule.csproj +++ b/src/clrmodule/clrmodule.csproj @@ -15,7 +15,7 @@ ..\..\ $(SolutionDir)\bin\ Properties - + 6 true prompt diff --git a/src/console/Console.csproj b/src/console/Console.csproj index 1c2881046..ea88b6356 100644 --- a/src/console/Console.csproj +++ b/src/console/Console.csproj @@ -15,7 +15,7 @@ ..\..\ $(SolutionDir)\bin\ Properties - + 6 python-clear.ico prompt diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index d3c25bf24..b48c909a0 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -14,7 +14,7 @@ 1591 ..\..\ $(SolutionDir)\bin\ - + 6 true prompt diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index c32bd5dec..3dbad5f75 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -15,7 +15,7 @@ ..\..\ $(SolutionDir)\bin\ Properties - + 6 true false ..\pythonnet.snk diff --git a/src/testing/Python.Test.csproj b/src/testing/Python.Test.csproj index 2a2f9ff54..ce8dca10d 100644 --- a/src/testing/Python.Test.csproj +++ b/src/testing/Python.Test.csproj @@ -14,7 +14,7 @@ 1591,0067 ..\..\ $(SolutionDir)\bin\ - + 6 false ..\pythonnet.snk prompt From 6667669e71bf638b0dbda8ef1ffcc71befe060b0 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 24 Feb 2017 18:18:04 -0700 Subject: [PATCH 191/324] Add ICustomMarshaler StrMarshaler Useful resources https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.icustommarshaler(v=vs.110).aspx https://limbioliong.wordpress.com/2013/11/03/understanding-custom-marshaling-part-1/ https://github.com/mono/mono/blob/master/mcs/class/Mono.Posix/Mono.Unix/UnixMarshal.cs http://stackoverflow.com/a/33514037/5208670 --- src/runtime/CustomMarshaler.cs | 80 +++++++++++++++++++++++++++++++ src/runtime/Python.Runtime.csproj | 1 + src/runtime/debughelper.cs | 22 +++++++++ src/runtime/runtime.cs | 52 ++------------------ 4 files changed, 108 insertions(+), 47 deletions(-) create mode 100644 src/runtime/CustomMarshaler.cs diff --git a/src/runtime/CustomMarshaler.cs b/src/runtime/CustomMarshaler.cs new file mode 100644 index 000000000..bb3a4946b --- /dev/null +++ b/src/runtime/CustomMarshaler.cs @@ -0,0 +1,80 @@ +using System; +using System.Runtime.InteropServices; +using System.Text; + +namespace Python.Runtime +{ + /// + /// Abstract class defining boiler plate methods that + /// Custom Marshalers will use. + /// + public abstract class MarshalerBase : ICustomMarshaler + { + public object MarshalNativeToManaged(IntPtr pNativeData) + { + throw new NotImplementedException(); + } + + public abstract IntPtr MarshalManagedToNative(object managedObj); + + public void CleanUpNativeData(IntPtr pNativeData) + { + Marshal.FreeHGlobal(pNativeData); + } + + public void CleanUpManagedData(object managedObj) + { + // Let GC deal with it + } + + public int GetNativeDataSize() + { + return IntPtr.Size; + } + } + + + /// + /// Custom Marshaler to deal with Managed String to Native + /// conversion differences on UCS2/UCS4. + /// + public class StrMarshaler : MarshalerBase + { + private static readonly MarshalerBase Instance = new StrMarshaler(); + + public override IntPtr MarshalManagedToNative(object managedObj) + { + Encoding encoding = Runtime.UCS == 2 ? Encoding.Unicode : Encoding.UTF32; + var s = managedObj as string; + + if (s == null) + { + return IntPtr.Zero; + } + + int minByteCount = encoding.GetMaxByteCount(1); + char[] cStr = s.ToCharArray(0, s.Length); + byte[] bStr = new byte[encoding.GetByteCount(cStr) + minByteCount]; + encoding.GetBytes(cStr, 0, cStr.Length, bStr, 0); + DebugUtil.PrintHexBytes(bStr); + + IntPtr mem = Marshal.AllocHGlobal(bStr.Length); + try + { + Marshal.Copy(bStr, 0, mem, bStr.Length); + } + catch (Exception) + { + Marshal.FreeHGlobal(mem); + throw; + } + + return mem; + } + + public static ICustomMarshaler GetInstance(string cookie) + { + return Instance; + } + } +} diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index 3dbad5f75..8580b7f61 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -89,6 +89,7 @@ + diff --git a/src/runtime/debughelper.cs b/src/runtime/debughelper.cs index 777a61e35..2a91a74b4 100644 --- a/src/runtime/debughelper.cs +++ b/src/runtime/debughelper.cs @@ -115,5 +115,27 @@ internal static void debug(string msg) Console.WriteLine("thread {0} : {1}", tid, caller); Console.WriteLine(" {0}", msg); } + + /// + /// Helper function to inspect/compare managed to native conversions. + /// Especially useful when debugging CustomMarshaler. + /// + /// + [Conditional("DEBUG")] + public static void PrintHexBytes(byte[] bytes) + { + if ((bytes == null) || (bytes.Length == 0)) + { + Console.WriteLine(""); + } + else + { + foreach (byte t in bytes) + { + Console.Write("{0:X2} ", t); + } + Console.WriteLine(); + } + } } } diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 6398d3345..50e09dd95 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1688,34 +1688,10 @@ internal unsafe static extern IntPtr internal unsafe static extern IntPtr PyUnicode_FromKindAndString( int kind, - IntPtr s, + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrMarshaler))] string s, int size ); - internal static unsafe IntPtr PyUnicode_FromKindAndString( - int kind, - string s, - int size) - { - var bufLength = Math.Max(s.Length, size) * 4; - - IntPtr mem = Marshal.AllocHGlobal(bufLength); - try - { - fixed (char* ps = s) - { - Encoding.UTF32.GetBytes(ps, s.Length, (byte*)mem, bufLength); - } - - var result = PyUnicode_FromKindAndString(kind, mem, size); - return result; - } - finally - { - Marshal.FreeHGlobal(mem); - } - } - internal static IntPtr PyUnicode_FromUnicode(string s, int size) { return PyUnicode_FromKindAndString(4, s, size); @@ -1758,28 +1734,10 @@ internal unsafe static extern IntPtr EntryPoint = "PyUnicodeUCS4_FromUnicode", ExactSpelling = true)] internal unsafe static extern IntPtr - PyUnicode_FromUnicode(IntPtr s, int size); - - internal static unsafe IntPtr PyUnicode_FromUnicode(string s, int size) - { - var bufLength = Math.Max(s.Length, size) * 4; - - IntPtr mem = Marshal.AllocHGlobal(bufLength); - try - { - fixed (char* ps = s) - { - Encoding.UTF32.GetBytes(ps, s.Length, (byte*)mem, bufLength); - } - - var result = PyUnicode_FromUnicode(mem, size); - return result; - } - finally - { - Marshal.FreeHGlobal(mem); - } - } + PyUnicode_FromUnicode( + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrMarshaler))] string s, + int size + ); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicodeUCS4_GetSize", From d01f25fffd94458aed7e1f6ef3a2d79dde12525d Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 25 Feb 2017 02:15:13 -0700 Subject: [PATCH 192/324] Add ICustomMarshaler StrArrayMarshaler --- src/runtime/CustomMarshaler.cs | 54 ++++++++++++++++++++++++++ src/runtime/runtime.cs | 69 +--------------------------------- 2 files changed, 56 insertions(+), 67 deletions(-) diff --git a/src/runtime/CustomMarshaler.cs b/src/runtime/CustomMarshaler.cs index bb3a4946b..f776cb1e3 100644 --- a/src/runtime/CustomMarshaler.cs +++ b/src/runtime/CustomMarshaler.cs @@ -77,4 +77,58 @@ public static ICustomMarshaler GetInstance(string cookie) return Instance; } } + + + /// + /// Custom Marshaler to deal with Managed String Arrays to Native + /// conversion differences on UCS2/UCS4. + /// + public class StrArrayMarshaler : MarshalerBase + { + private static readonly MarshalerBase Instance = new StrArrayMarshaler(); + + public override IntPtr MarshalManagedToNative(object managedObj) + { + var argv = managedObj as string[]; + + if (argv == null) + { + return IntPtr.Zero; + } + + var totalStrLength = 0; + foreach (string arg in argv) + { + totalStrLength += arg.Length + 1; + } + int memSize = argv.Length * IntPtr.Size + totalStrLength * Runtime.UCS; + + IntPtr mem = Marshal.AllocHGlobal(memSize); + try + { + // Preparing array of pointers to strings + IntPtr curStrPtr = mem + argv.Length * IntPtr.Size; + for (var i = 0; i < argv.Length; i++) + { + Encoding encoding = Runtime.UCS == 2 ? Encoding.Unicode : Encoding.UTF32; + byte[] bStr = encoding.GetBytes(argv[i] + "\0"); + Marshal.Copy(bStr, 0, curStrPtr, bStr.Length); + Marshal.WriteIntPtr(mem + i * IntPtr.Size, curStrPtr); + curStrPtr += bStr.Length; + } + } + catch (Exception) + { + Marshal.FreeHGlobal(mem); + throw; + } + + return mem; + } + + public static ICustomMarshaler GetInstance(string cookie) + { + return Instance; + } + } } diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 50e09dd95..3d5eda0fe 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -667,41 +667,8 @@ internal unsafe static extern IntPtr public unsafe static extern int Py_Main( int argc, - IntPtr lplpargv + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrArrayMarshaler))] string[] argv ); - - public static int Py_Main(int argc, string[] argv) - { - // Totally ignoring argc. - argc = argv.Length; - - var allStringsLength = 0; - foreach (string x in argv) - { - allStringsLength += x.Length + 1; - } - int requiredSize = IntPtr.Size * argc + allStringsLength * UCS; - IntPtr mem = Marshal.AllocHGlobal(requiredSize); - try - { - // Preparing array of pointers to UTF32 strings. - IntPtr curStrPtr = mem + argc * IntPtr.Size; - for (var i = 0; i < argv.Length; i++) - { - // Unicode or UTF8 work - Encoding enc = UCS == 2 ? Encoding.Unicode : Encoding.UTF32; - byte[] zstr = enc.GetBytes(argv[i] + "\0"); - Marshal.Copy(zstr, 0, curStrPtr, zstr.Length); - Marshal.WriteIntPtr(mem + IntPtr.Size * i, curStrPtr); - curStrPtr += zstr.Length; - } - return Py_Main(argc, mem); - } - finally - { - Marshal.FreeHGlobal(mem); - } - } #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] @@ -2078,41 +2045,9 @@ internal unsafe static extern IntPtr internal unsafe static extern void PySys_SetArgvEx( int argc, - IntPtr lplpargv, + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrArrayMarshaler))] string[] argv, int updatepath ); - - internal static void PySys_SetArgvEx(int argc, string[] argv, int updatepath) - { - // Totally ignoring argc. - argc = argv.Length; - - var allStringsLength = 0; - foreach (string x in argv) - { - allStringsLength += x.Length + 1; - } - int requiredSize = IntPtr.Size * argc + allStringsLength * UCS; - IntPtr mem = Marshal.AllocHGlobal(requiredSize); - try - { - // Preparing array of pointers to UTF32 strings. - IntPtr curStrPtr = mem + argc * IntPtr.Size; - for (var i = 0; i < argv.Length; i++) - { - Encoding enc = UCS == 2 ? Encoding.Unicode : Encoding.UTF32; - byte[] zstr = enc.GetBytes(argv[i] + "\0"); - Marshal.Copy(zstr, 0, curStrPtr, zstr.Length); - Marshal.WriteIntPtr(mem + IntPtr.Size * i, curStrPtr); - curStrPtr += zstr.Length; - } - PySys_SetArgvEx(argc, mem, updatepath); - } - finally - { - Marshal.FreeHGlobal(mem); - } - } #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Ansi)] From 74440a6b90beaaa32a2df8bc6b3660ce5edafbcb Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 25 Feb 2017 10:05:16 -0700 Subject: [PATCH 193/324] Refactor Marshals --- src/runtime/CustomMarshaler.cs | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/runtime/CustomMarshaler.cs b/src/runtime/CustomMarshaler.cs index f776cb1e3..1004122cd 100644 --- a/src/runtime/CustomMarshaler.cs +++ b/src/runtime/CustomMarshaler.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using System.Runtime.InteropServices; using System.Text; @@ -41,10 +42,10 @@ public int GetNativeDataSize() public class StrMarshaler : MarshalerBase { private static readonly MarshalerBase Instance = new StrMarshaler(); + private static readonly Encoding PyEncoding = Runtime.UCS == 2 ? Encoding.Unicode : Encoding.UTF32; public override IntPtr MarshalManagedToNative(object managedObj) { - Encoding encoding = Runtime.UCS == 2 ? Encoding.Unicode : Encoding.UTF32; var s = managedObj as string; if (s == null) @@ -52,12 +53,7 @@ public override IntPtr MarshalManagedToNative(object managedObj) return IntPtr.Zero; } - int minByteCount = encoding.GetMaxByteCount(1); - char[] cStr = s.ToCharArray(0, s.Length); - byte[] bStr = new byte[encoding.GetByteCount(cStr) + minByteCount]; - encoding.GetBytes(cStr, 0, cStr.Length, bStr, 0); - DebugUtil.PrintHexBytes(bStr); - + byte[] bStr = PyEncoding.GetBytes(s + "\0"); IntPtr mem = Marshal.AllocHGlobal(bStr.Length); try { @@ -86,6 +82,7 @@ public static ICustomMarshaler GetInstance(string cookie) public class StrArrayMarshaler : MarshalerBase { private static readonly MarshalerBase Instance = new StrArrayMarshaler(); + private static readonly Encoding PyEncoding = Runtime.UCS == 2 ? Encoding.Unicode : Encoding.UTF32; public override IntPtr MarshalManagedToNative(object managedObj) { @@ -96,11 +93,7 @@ public override IntPtr MarshalManagedToNative(object managedObj) return IntPtr.Zero; } - var totalStrLength = 0; - foreach (string arg in argv) - { - totalStrLength += arg.Length + 1; - } + int totalStrLength = argv.Sum(arg => arg.Length + 1); int memSize = argv.Length * IntPtr.Size + totalStrLength * Runtime.UCS; IntPtr mem = Marshal.AllocHGlobal(memSize); @@ -110,8 +103,7 @@ public override IntPtr MarshalManagedToNative(object managedObj) IntPtr curStrPtr = mem + argv.Length * IntPtr.Size; for (var i = 0; i < argv.Length; i++) { - Encoding encoding = Runtime.UCS == 2 ? Encoding.Unicode : Encoding.UTF32; - byte[] bStr = encoding.GetBytes(argv[i] + "\0"); + byte[] bStr = PyEncoding.GetBytes(argv[i] + "\0"); Marshal.Copy(bStr, 0, curStrPtr, bStr.Length); Marshal.WriteIntPtr(mem + i * IntPtr.Size, curStrPtr); curStrPtr += bStr.Length; From e487076d90ac86f15150c1b41113565364fb7850 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 25 Feb 2017 12:58:27 -0700 Subject: [PATCH 194/324] Add ICustomMarshaler Utf8Marshaler Refactor PyString_FromStringAndSize Link explains why `MarshalAs(UnmanagedType.LPWStr)` or `CharSet.Unicode` don't work http://stackoverflow.com/a/25128147/5208670 --- src/runtime/CustomMarshaler.cs | 45 ++++++++++++++++++++++++++++++++++ src/runtime/runtime.cs | 23 +++++------------ 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/src/runtime/CustomMarshaler.cs b/src/runtime/CustomMarshaler.cs index 1004122cd..a4947a909 100644 --- a/src/runtime/CustomMarshaler.cs +++ b/src/runtime/CustomMarshaler.cs @@ -123,4 +123,49 @@ public static ICustomMarshaler GetInstance(string cookie) return Instance; } } + + + /// + /// Custom Marshaler to deal with Managed String to Native + /// conversion on UTF-8. Use on functions that expect UTF-8 encoded + /// strings like `PyUnicode_FromStringAndSize` + /// + /// + /// If instead we used `MarshalAs(UnmanagedType.LPWStr)` the output to + /// `foo` would be `f\x00o\x00o\x00`. + /// + public class Utf8Marshaler : MarshalerBase + { + private static readonly MarshalerBase Instance = new Utf8Marshaler(); + private static readonly Encoding PyEncoding = Encoding.UTF8; + + public override IntPtr MarshalManagedToNative(object managedObj) + { + var s = managedObj as string; + + if (s == null) + { + return IntPtr.Zero; + } + + byte[] bStr = PyEncoding.GetBytes(s + "\0"); + IntPtr mem = Marshal.AllocHGlobal(bStr.Length); + try + { + Marshal.Copy(bStr, 0, mem, bStr.Length); + } + catch (Exception) + { + Marshal.FreeHGlobal(mem); + throw; + } + + return mem; + } + + public static ICustomMarshaler GetInstance(string cookie) + { + return Instance; + } + } } diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 3d5eda0fe..50c31ddb4 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1508,23 +1508,12 @@ internal static IntPtr PyBytes_AS_STRING(IntPtr ob) return ob + BytesOffset.ob_sval; } - internal static IntPtr PyString_FromStringAndSize(string value, int length) - { - // copy the string into an unmanaged UTF-8 buffer - int len = Encoding.UTF8.GetByteCount(value); - byte[] buffer = new byte[len + 1]; - Encoding.UTF8.GetBytes(value, 0, value.Length, buffer, 0); - IntPtr nativeUtf8 = Marshal.AllocHGlobal(buffer.Length); - try - { - Marshal.Copy(buffer, 0, nativeUtf8, buffer.Length); - return PyUnicode_FromStringAndSize(nativeUtf8, length); - } - finally - { - Marshal.FreeHGlobal(nativeUtf8); - } - } + [DllImport(Runtime.dll, EntryPoint = "PyUnicode_FromStringAndSize")] + internal static extern IntPtr + PyString_FromStringAndSize( + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Utf8Marshaler))] string value, + int size + ); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Unicode)] From ccd4521298e87c53d1217670acbc3963371020a3 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 25 Feb 2017 19:57:52 -0700 Subject: [PATCH 195/324] Match PyUnicode_AsUnicode signature in UCS2/UCS4 --- src/runtime/runtime.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 50c31ddb4..13549b581 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1572,7 +1572,7 @@ internal unsafe static extern int [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Unicode)] - internal unsafe static extern char* + internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, @@ -1613,7 +1613,7 @@ internal unsafe static extern int [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicodeUCS2_AsUnicode", ExactSpelling = true)] - internal unsafe static extern char* + internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, @@ -1749,9 +1749,9 @@ internal unsafe static string GetManagedString(IntPtr op) Marshal.Copy(p, buffer, 0, size); return Encoding.UTF32.GetString(buffer, 0, size); #elif UCS2 - char* p = Runtime.PyUnicode_AsUnicode(op); - int size = Runtime.PyUnicode_GetSize(op); - return new String(p, 0, size); + IntPtr p = Runtime.PyUnicode_AsUnicode(op); + int length = Runtime.PyUnicode_GetSize(op); + return Marshal.PtrToStringUni(p, length); #endif } From 07f87de2ae0456d7e5c09333a09ab6bbbc11cf1f Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 25 Feb 2017 23:09:48 -0700 Subject: [PATCH 196/324] Refactor GetManagedString --- src/runtime/runtime.cs | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 13549b581..a9dcdd81e 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1725,7 +1725,20 @@ internal static IntPtr PyUnicode_FromString(string s) return PyUnicode_FromUnicode(s, (s.Length)); } - internal unsafe static string GetManagedString(IntPtr op) + /// + /// Function to access the internal PyUnicode/PyString object and + /// convert it to a managed string with the correct encoding. + /// + /// + /// We can't easily do this through through the CustomMarshaler's on + /// the returns because will have access to the IntPtr but not size. + /// + /// For PyUnicodeType, we can't convert with Marshal.PtrToStringUni + /// since it only works for UCS2. + /// + /// PyStringType or PyUnicodeType object to convert + /// Managed String + internal static string GetManagedString(IntPtr op) { IntPtr type = PyObject_TYPE(op); @@ -1741,18 +1754,15 @@ internal unsafe static string GetManagedString(IntPtr op) if (type == Runtime.PyUnicodeType) { -#if UCS4 - IntPtr p = Runtime.PyUnicode_AsUnicode(op); - int length = Runtime.PyUnicode_GetSize(op); - int size = length * 4; - byte[] buffer = new byte[size]; + Encoding encoding = UCS == 2 ? Encoding.Unicode : Encoding.UTF32; + + IntPtr p = PyUnicode_AsUnicode(op); + int length = PyUnicode_GetSize(op); + + int size = length * UCS; + var buffer = new byte[size]; Marshal.Copy(p, buffer, 0, size); - return Encoding.UTF32.GetString(buffer, 0, size); -#elif UCS2 - IntPtr p = Runtime.PyUnicode_AsUnicode(op); - int length = Runtime.PyUnicode_GetSize(op); - return Marshal.PtrToStringUni(p, length); -#endif + return encoding.GetString(buffer, 0, size); } return null; From edafdf2db546908e4cc60f55656a0125e25bac4f Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 26 Feb 2017 00:18:37 -0700 Subject: [PATCH 197/324] Remove internal PyUnicode_AS_UNICODE Its redundant with PyUnicode_AsUnicode now that the signature is fixed between UCS2/UCS4. Apply char conversion that work on both UCS2/UCS4 --- src/runtime/converter.cs | 19 ++++--------------- src/runtime/runtime.cs | 24 ------------------------ 2 files changed, 4 insertions(+), 39 deletions(-) diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index aeaf2d871..8b58e5e9a 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -599,21 +599,10 @@ private static bool ToPrimitive(IntPtr value, Type obType, out object result, bo { if (Runtime.PyUnicode_GetSize(value) == 1) { - op = Runtime.PyUnicode_AS_UNICODE(value); - if (Runtime.UCS == 2) // Don't trust linter, statement not always true. - { - // 2011-01-02: Marshal as character array because the cast - // result = (char)Marshal.ReadInt16(op); throws an OverflowException - // on negative numbers with Check Overflow option set on the project - Char[] buff = new Char[1]; - Marshal.Copy(op, buff, 0, 1); - result = buff[0]; - } - else // UCS4 - { - // XXX this is probably NOT correct? - result = (char)Marshal.ReadInt32(op); - } + op = Runtime.PyUnicode_AsUnicode(value); + Char[] buff = new Char[1]; + Marshal.Copy(op, buff, 0, 1); + result = buff[0]; return true; } goto type_error; diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index a9dcdd81e..9558a5ac3 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1575,12 +1575,6 @@ internal unsafe static extern int internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicode_AsUnicode", - ExactSpelling = true, CharSet = CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_AS_UNICODE(IntPtr op); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr @@ -1616,12 +1610,6 @@ internal unsafe static extern int internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS2_AsUnicode", - ExactSpelling = true, CharSet = CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_AS_UNICODE(IntPtr op); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicodeUCS2_FromOrdinal", ExactSpelling = true, CharSet = CharSet.Unicode)] @@ -1663,12 +1651,6 @@ internal unsafe static extern int internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicode_AsUnicode", - ExactSpelling = true, CharSet = CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_AS_UNICODE(IntPtr op); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr @@ -1707,12 +1689,6 @@ internal unsafe static extern int internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS4_AsUnicode", - ExactSpelling = true, CharSet = CharSet.Unicode)] - internal unsafe static extern IntPtr - PyUnicode_AS_UNICODE(IntPtr op); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicodeUCS4_FromOrdinal", ExactSpelling = true, CharSet = CharSet.Unicode)] From 78939c599eecdeccad0384feb4f584fd36171024 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 26 Feb 2017 10:30:06 -0700 Subject: [PATCH 198/324] Refactor Encoding check This won't change during runtime. --- src/runtime/CustomMarshaler.cs | 4 ++-- src/runtime/runtime.cs | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/runtime/CustomMarshaler.cs b/src/runtime/CustomMarshaler.cs index a4947a909..475fa05eb 100644 --- a/src/runtime/CustomMarshaler.cs +++ b/src/runtime/CustomMarshaler.cs @@ -42,7 +42,7 @@ public int GetNativeDataSize() public class StrMarshaler : MarshalerBase { private static readonly MarshalerBase Instance = new StrMarshaler(); - private static readonly Encoding PyEncoding = Runtime.UCS == 2 ? Encoding.Unicode : Encoding.UTF32; + private static readonly Encoding PyEncoding = Runtime.PyEncoding; public override IntPtr MarshalManagedToNative(object managedObj) { @@ -82,7 +82,7 @@ public static ICustomMarshaler GetInstance(string cookie) public class StrArrayMarshaler : MarshalerBase { private static readonly MarshalerBase Instance = new StrArrayMarshaler(); - private static readonly Encoding PyEncoding = Runtime.UCS == 2 ? Encoding.Unicode : Encoding.UTF32; + private static readonly Encoding PyEncoding = Runtime.PyEncoding; public override IntPtr MarshalManagedToNative(object managedObj) { diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 9558a5ac3..337b82fbf 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -170,6 +170,11 @@ public class Runtime internal static bool IsPython2; internal static bool IsPython3; + /// + /// Encoding to use to convert Unicode to/from Managed to Native + /// + internal static readonly Encoding PyEncoding = UCS == 2 ? Encoding.Unicode : Encoding.UTF32; + /// /// Initialize the runtime... /// @@ -1730,15 +1735,13 @@ internal static string GetManagedString(IntPtr op) if (type == Runtime.PyUnicodeType) { - Encoding encoding = UCS == 2 ? Encoding.Unicode : Encoding.UTF32; - IntPtr p = PyUnicode_AsUnicode(op); int length = PyUnicode_GetSize(op); int size = length * UCS; var buffer = new byte[size]; Marshal.Copy(p, buffer, 0, size); - return encoding.GetString(buffer, 0, size); + return PyEncoding.GetString(buffer, 0, size); } return null; From 7114393da7ec716468b5f4cea9ac1b9099043287 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 23 Feb 2017 21:26:43 -0700 Subject: [PATCH 199/324] Remove ExactSpelling Not needed as Python doesn't define character specific functions https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.exactspelling(v=vs.110).aspx --- src/runtime/runtime.cs | 516 ++++++++++++++++++++--------------------- 1 file changed, 255 insertions(+), 261 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 337b82fbf..ff8a6caa3 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -584,91 +584,91 @@ internal unsafe static long Refcount(IntPtr op) // Py_IncRef and Py_DecRef are taking care of the extra payload // in Py_DEBUG builds of Python like _Py_RefTotal [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] private unsafe static extern void Py_IncRef(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] private unsafe static extern void Py_DecRef(IntPtr ob); #endif [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void Py_Initialize(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int Py_IsInitialized(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void Py_Finalize(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr Py_NewInterpreter(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void Py_EndInterpreter(IntPtr threadState); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyThreadState_New(IntPtr istate); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyThreadState_Get(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyThread_get_key_value(IntPtr key); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyThread_get_thread_ident(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyThread_set_key_value(IntPtr key, IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyThreadState_Swap(IntPtr key); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyGILState_Ensure(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyGILState_Release(IntPtr gs); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyGILState_GetThisThreadState(); #if PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] public unsafe static extern int Py_Main( int argc, @@ -676,204 +676,204 @@ public unsafe static extern int ); #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] public unsafe static extern int Py_Main(int argc, string[] argv); #endif [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyEval_InitThreads(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyEval_ThreadsInitialized(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyEval_AcquireLock(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyEval_ReleaseLock(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyEval_AcquireThread(IntPtr tstate); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyEval_ReleaseThread(IntPtr tstate); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyEval_SaveThread(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyEval_RestoreThread(IntPtr tstate); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyEval_GetBuiltins(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyEval_GetGlobals(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyEval_GetLocals(); #if PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] [return: MarshalAs(UnmanagedType.LPWStr)] internal unsafe static extern string Py_GetProgramName(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void Py_SetProgramName([MarshalAs(UnmanagedType.LPWStr)] string name); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] [return: MarshalAs(UnmanagedType.LPWStr)] internal unsafe static extern string Py_GetPythonHome(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void Py_SetPythonHome([MarshalAs(UnmanagedType.LPWStr)] string home); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] [return: MarshalAs(UnmanagedType.LPWStr)] internal unsafe static extern string Py_GetPath(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void Py_SetPath([MarshalAs(UnmanagedType.LPWStr)] string home); #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern string Py_GetProgramName(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void Py_SetProgramName(string name); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern string Py_GetPythonHome(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void Py_SetPythonHome(string home); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern string Py_GetPath(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void Py_SetPath(string home); #endif [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern string Py_GetVersion(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern string Py_GetPlatform(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern string Py_GetCopyright(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern string Py_GetCompiler(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern string Py_GetBuildInfo(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyRun_SimpleString(string code); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyRun_String(string code, IntPtr st, IntPtr globals, IntPtr locals); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr Py_CompileString(string code, string file, IntPtr tok); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyImport_ExecCodeModule(string name, IntPtr code); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyCFunction_NewEx(IntPtr ml, IntPtr self, IntPtr mod); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyCFunction_Call(IntPtr func, IntPtr args, IntPtr kw); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyClass_New(IntPtr bases, IntPtr dict, IntPtr name); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyInstance_New(IntPtr cls, IntPtr args, IntPtr kw); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyInstance_NewRaw(IntPtr cls, IntPtr dict); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyMethod_New(IntPtr func, IntPtr self, IntPtr cls); @@ -931,68 +931,68 @@ internal static string PyObject_GetTypeName(IntPtr op) } [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyObject_HasAttrString(IntPtr pointer, string name); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyObject_GetAttrString(IntPtr pointer, string name); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyObject_SetAttrString(IntPtr pointer, string name, IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyObject_HasAttr(IntPtr pointer, IntPtr name); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyObject_GetAttr(IntPtr pointer, IntPtr name); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyObject_SetAttr(IntPtr pointer, IntPtr name, IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyObject_GetItem(IntPtr pointer, IntPtr key); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyObject_SetItem(IntPtr pointer, IntPtr key, IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyObject_DelItem(IntPtr pointer, IntPtr key); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyObject_GetIter(IntPtr op); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyObject_Call(IntPtr pointer, IntPtr args, IntPtr kw); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyObject_CallObject(IntPtr pointer, IntPtr args); #if PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyObject_RichCompareBool(IntPtr value1, IntPtr value2, int opid); @@ -1022,72 +1022,72 @@ internal static int PyObject_Compare(IntPtr value1, IntPtr value2) } #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyObject_Compare(IntPtr value1, IntPtr value2); #endif [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyObject_IsInstance(IntPtr ob, IntPtr type); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyObject_IsSubclass(IntPtr ob, IntPtr type); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyCallable_Check(IntPtr pointer); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyObject_IsTrue(IntPtr pointer); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyObject_Not(IntPtr pointer); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyObject_Size(IntPtr pointer); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyObject_Hash(IntPtr op); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyObject_Repr(IntPtr pointer); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyObject_Str(IntPtr pointer); #if PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyObject_Str", - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyObject_Unicode(IntPtr pointer); #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyObject_Unicode(IntPtr pointer); #endif [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyObject_Dir(IntPtr pointer); @@ -1099,30 +1099,30 @@ internal unsafe static extern IntPtr #if PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyNumber_Long", - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_Int(IntPtr ob); #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_Int(IntPtr ob); #endif [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_Long(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_Float(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern bool PyNumber_Check(IntPtr ob); @@ -1152,46 +1152,46 @@ internal static IntPtr PyInt_FromInt64(long value) #if PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyLong_FromLong", - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] private unsafe static extern IntPtr PyInt_FromLong(IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyLong_AsLong", - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyInt_AsLong(IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyLong_FromString", - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyInt_FromString(string value, IntPtr end, int radix); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyLong_GetMax", - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyInt_GetMax(); #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] private unsafe static extern IntPtr PyInt_FromLong(IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyInt_AsLong(IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyInt_FromString(string value, IntPtr end, int radix); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyInt_GetMax(); #endif @@ -1202,52 +1202,52 @@ internal static bool PyLong_Check(IntPtr ob) } [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyLong_FromLong(long value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyLong_FromUnsignedLong(uint value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyLong_FromDouble(double value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyLong_FromLongLong(long value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyLong_FromUnsignedLongLong(ulong value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyLong_FromString(string value, IntPtr end, int radix); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyLong_AsLong(IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern uint PyLong_AsUnsignedLong(IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern long PyLong_AsLongLong(IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern ulong PyLong_AsUnsignedLongLong(IntPtr value); @@ -1258,142 +1258,142 @@ internal static bool PyFloat_Check(IntPtr ob) } [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyFloat_FromDouble(double value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyFloat_FromString(IntPtr value, IntPtr junk); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern double PyFloat_AsDouble(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_Add(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_Subtract(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_Multiply(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_Divide(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_And(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_Xor(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_Or(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_Lshift(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_Rshift(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_Power(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_Remainder(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_InPlaceAdd(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_InPlaceSubtract(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_InPlaceMultiply(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_InPlaceDivide(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_InPlaceAnd(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_InPlaceXor(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_InPlaceOr(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_InPlaceLshift(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_InPlaceRshift(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_InPlacePower(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_InPlaceRemainder(IntPtr o1, IntPtr o2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_Negative(IntPtr o1); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_Positive(IntPtr o1); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyNumber_Invert(IntPtr o1); @@ -1402,77 +1402,77 @@ internal unsafe static extern IntPtr //==================================================================== [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern bool PySequence_Check(IntPtr pointer); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PySequence_GetItem(IntPtr pointer, int index); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PySequence_SetItem(IntPtr pointer, int index, IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PySequence_DelItem(IntPtr pointer, int index); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PySequence_GetSlice(IntPtr pointer, int i1, int i2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PySequence_SetSlice(IntPtr pointer, int i1, int i2, IntPtr v); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PySequence_DelSlice(IntPtr pointer, int i1, int i2); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PySequence_Size(IntPtr pointer); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PySequence_Contains(IntPtr pointer, IntPtr item); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PySequence_Concat(IntPtr pointer, IntPtr other); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PySequence_Repeat(IntPtr pointer, int count); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PySequence_Index(IntPtr pointer, IntPtr item); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PySequence_Count(IntPtr pointer, IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PySequence_Tuple(IntPtr pointer); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PySequence_List(IntPtr pointer); @@ -1499,12 +1499,12 @@ internal static IntPtr PyString_FromString(string value) #if PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyBytes_FromString(string op); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyBytes_Size(IntPtr op); @@ -1521,23 +1521,23 @@ int size ); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Unicode)] + CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromStringAndSize(IntPtr value, int size); #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyString_FromStringAndSize(string value, int size); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyString_AsString", - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyString_AS_STRING(IntPtr op); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyString_Size(IntPtr pointer); #endif @@ -1549,18 +1549,17 @@ internal static bool PyUnicode_Check(IntPtr ob) #if UCS2 && PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Unicode)] + CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromObject(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Unicode)] + CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicode_FromKindAndData", - ExactSpelling = true, CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromKindAndString(int kind, string s, int size); @@ -1571,69 +1570,67 @@ internal static IntPtr PyUnicode_FromUnicode(string s, int size) } [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Unicode)] + CharSet = CharSet.Unicode)] internal unsafe static extern int PyUnicode_GetSize(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Unicode)] + CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Unicode)] + CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS2 && PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicodeUCS2_FromObject", - ExactSpelling = true, CharSet = CharSet.Unicode)] + CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromObject(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicodeUCS2_FromEncodedObject", - ExactSpelling = true, CharSet = CharSet.Unicode)] + CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicodeUCS2_FromUnicode", - ExactSpelling = true, CharSet = CharSet.Unicode)] + CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromUnicode(string s, int size); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicodeUCS2_GetSize", - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyUnicode_GetSize(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS2_AsUnicode", - ExactSpelling = true)] + EntryPoint = "PyUnicodeUCS2_AsUnicode")] internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicodeUCS2_FromOrdinal", - ExactSpelling = true, CharSet = CharSet.Unicode)] + CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS4 && PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Unicode)] + CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromObject(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Unicode)] + CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicode_FromKindAndData", - ExactSpelling = true)] + EntryPoint = "PyUnicode_FromKindAndData")] internal unsafe static extern IntPtr PyUnicode_FromKindAndString( int kind, @@ -1647,35 +1644,33 @@ internal static IntPtr PyUnicode_FromUnicode(string s, int size) } [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyUnicode_GetSize(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Unicode)] + CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS4 && PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicodeUCS4_FromObject", - ExactSpelling = true, CharSet = CharSet.Unicode)] + CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromObject(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicodeUCS4_FromEncodedObject", - ExactSpelling = true, CharSet = CharSet.Unicode)] + CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS4_FromUnicode", - ExactSpelling = true)] + EntryPoint = "PyUnicodeUCS4_FromUnicode")] internal unsafe static extern IntPtr PyUnicode_FromUnicode( [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrMarshaler))] string s, @@ -1684,19 +1679,18 @@ int size [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicodeUCS4_GetSize", - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyUnicode_GetSize(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS4_AsUnicode", - ExactSpelling = true)] + EntryPoint = "PyUnicodeUCS4_AsUnicode")] internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicodeUCS4_FromOrdinal", - ExactSpelling = true, CharSet = CharSet.Unicode)] + CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); #endif @@ -1757,82 +1751,82 @@ internal static bool PyDict_Check(IntPtr ob) } [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyDict_New(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyDictProxy_New(IntPtr dict); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyDict_GetItem(IntPtr pointer, IntPtr key); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyDict_GetItemString(IntPtr pointer, string key); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyDict_SetItem(IntPtr pointer, IntPtr key, IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyDict_SetItemString(IntPtr pointer, string key, IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyDict_DelItem(IntPtr pointer, IntPtr key); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyDict_DelItemString(IntPtr pointer, string key); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyMapping_HasKey(IntPtr pointer, IntPtr key); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyDict_Keys(IntPtr pointer); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyDict_Values(IntPtr pointer); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyDict_Items(IntPtr pointer); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyDict_Copy(IntPtr pointer); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyDict_Update(IntPtr pointer, IntPtr other); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyDict_Clear(IntPtr pointer); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyDict_Size(IntPtr pointer); @@ -1847,57 +1841,57 @@ internal static bool PyList_Check(IntPtr ob) } [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyList_New(int size); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyList_AsTuple(IntPtr pointer); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyList_GetItem(IntPtr pointer, int index); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyList_SetItem(IntPtr pointer, int index, IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyList_Insert(IntPtr pointer, int index, IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyList_Append(IntPtr pointer, IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyList_Reverse(IntPtr pointer); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyList_Sort(IntPtr pointer); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyList_GetSlice(IntPtr pointer, int start, int end); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyList_SetSlice(IntPtr pointer, int start, int end, IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyList_Size(IntPtr pointer); @@ -1912,27 +1906,27 @@ internal static bool PyTuple_Check(IntPtr ob) } [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyTuple_New(int size); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyTuple_GetItem(IntPtr pointer, int index); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyTuple_SetItem(IntPtr pointer, int index, IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyTuple_GetSlice(IntPtr pointer, int start, int end); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyTuple_Size(IntPtr pointer); @@ -1943,7 +1937,7 @@ internal unsafe static extern int #if PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern bool PyIter_Check(IntPtr pointer); #elif PYTHON3 @@ -1957,7 +1951,7 @@ internal static bool #endif [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyIter_Next(IntPtr pointer); @@ -1966,60 +1960,60 @@ internal unsafe static extern IntPtr //==================================================================== [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyModule_New(string name); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern string PyModule_GetName(IntPtr module); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyModule_GetDict(IntPtr module); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern string PyModule_GetFilename(IntPtr module); #if PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyModule_Create2(IntPtr module, int apiver); #endif [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyImport_Import(IntPtr name); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyImport_ImportModule(string name); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyImport_ReloadModule(IntPtr module); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyImport_AddModule(string name); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyImport_GetModuleDict(); #if PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PySys_SetArgvEx( int argc, @@ -2028,7 +2022,7 @@ int updatepath ); #elif PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PySys_SetArgvEx( int argc, @@ -2038,12 +2032,12 @@ int updatepath #endif [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PySys_GetObject(string name); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PySys_SetObject(string name, IntPtr ob); @@ -2058,12 +2052,12 @@ internal static bool PyType_Check(IntPtr ob) } [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyType_Modified(IntPtr type); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern bool PyType_IsSubtype(IntPtr t1, IntPtr t2); @@ -2074,57 +2068,57 @@ internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) } [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyType_GenericNew(IntPtr type, IntPtr args, IntPtr kw); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyType_GenericAlloc(IntPtr type, int n); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyType_Ready(IntPtr type); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr _PyType_Lookup(IntPtr type, IntPtr name); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyObject_GenericGetAttr(IntPtr obj, IntPtr name); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyObject_GenericSetAttr(IntPtr obj, IntPtr name, IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr _PyObject_GetDictPtr(IntPtr obj); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyObject_GC_New(IntPtr tp); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyObject_GC_Del(IntPtr tp); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyObject_GC_Track(IntPtr tp); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyObject_GC_UnTrack(IntPtr tp); @@ -2134,17 +2128,17 @@ internal unsafe static extern void //==================================================================== [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyMem_Malloc(int size); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyMem_Realloc(IntPtr ptr, int size); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyMem_Free(IntPtr ptr); @@ -2154,62 +2148,62 @@ internal unsafe static extern void //==================================================================== [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyErr_SetString(IntPtr ob, string message); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyErr_SetObject(IntPtr ob, IntPtr message); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyErr_SetFromErrno(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyErr_SetNone(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyErr_ExceptionMatches(IntPtr exception); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyErr_GivenExceptionMatches(IntPtr ob, IntPtr val); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyErr_NormalizeException(IntPtr ob, IntPtr val, IntPtr tb); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern int PyErr_Occurred(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyErr_Fetch(ref IntPtr ob, ref IntPtr val, ref IntPtr tb); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyErr_Restore(IntPtr ob, IntPtr val, IntPtr tb); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyErr_Clear(); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern void PyErr_Print(); @@ -2219,12 +2213,12 @@ internal unsafe static extern void //==================================================================== [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyMethod_Self(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - ExactSpelling = true, CharSet = CharSet.Ansi)] + CharSet = CharSet.Ansi)] internal unsafe static extern IntPtr PyMethod_Function(IntPtr ob); } From 1fef331652c9e7831def9b9d93e25b432ec0490a Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 23 Feb 2017 21:34:46 -0700 Subject: [PATCH 200/324] Remove CharSet.Ansi Its default charset used https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.charset(v=vs.110).aspx#Anchor_1 --- src/runtime/runtime.cs | 702 ++++++++++++++--------------------------- 1 file changed, 234 insertions(+), 468 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index ff8a6caa3..019b2bd2f 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -583,297 +583,241 @@ internal unsafe static long Refcount(IntPtr op) #if Py_DEBUG // Py_IncRef and Py_DecRef are taking care of the extra payload // in Py_DEBUG builds of Python like _Py_RefTotal - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] private unsafe static extern void Py_IncRef(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] private unsafe static extern void Py_DecRef(IntPtr ob); #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void Py_Initialize(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int Py_IsInitialized(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void Py_Finalize(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr Py_NewInterpreter(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void Py_EndInterpreter(IntPtr threadState); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyThreadState_New(IntPtr istate); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyThreadState_Get(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyThread_get_key_value(IntPtr key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyThread_get_thread_ident(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyThread_set_key_value(IntPtr key, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyThreadState_Swap(IntPtr key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyGILState_Ensure(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyGILState_Release(IntPtr gs); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyGILState_GetThisThreadState(); #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] public unsafe static extern int Py_Main( int argc, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrArrayMarshaler))] string[] argv ); #elif PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] public unsafe static extern int Py_Main(int argc, string[] argv); #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyEval_InitThreads(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyEval_ThreadsInitialized(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyEval_AcquireLock(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyEval_ReleaseLock(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyEval_AcquireThread(IntPtr tstate); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyEval_ReleaseThread(IntPtr tstate); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyEval_SaveThread(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyEval_RestoreThread(IntPtr tstate); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyEval_GetBuiltins(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyEval_GetGlobals(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyEval_GetLocals(); #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] [return: MarshalAs(UnmanagedType.LPWStr)] internal unsafe static extern string Py_GetProgramName(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void Py_SetProgramName([MarshalAs(UnmanagedType.LPWStr)] string name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] [return: MarshalAs(UnmanagedType.LPWStr)] internal unsafe static extern string Py_GetPythonHome(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void Py_SetPythonHome([MarshalAs(UnmanagedType.LPWStr)] string home); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] [return: MarshalAs(UnmanagedType.LPWStr)] internal unsafe static extern string Py_GetPath(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void Py_SetPath([MarshalAs(UnmanagedType.LPWStr)] string home); #elif PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern string Py_GetProgramName(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void Py_SetProgramName(string name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern string Py_GetPythonHome(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void Py_SetPythonHome(string home); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern string Py_GetPath(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void Py_SetPath(string home); #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern string Py_GetVersion(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern string Py_GetPlatform(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern string Py_GetCopyright(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern string Py_GetCompiler(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern string Py_GetBuildInfo(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyRun_SimpleString(string code); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyRun_String(string code, IntPtr st, IntPtr globals, IntPtr locals); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr Py_CompileString(string code, string file, IntPtr tok); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyImport_ExecCodeModule(string name, IntPtr code); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyCFunction_NewEx(IntPtr ml, IntPtr self, IntPtr mod); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyCFunction_Call(IntPtr func, IntPtr args, IntPtr kw); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyClass_New(IntPtr bases, IntPtr dict, IntPtr name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyInstance_New(IntPtr cls, IntPtr args, IntPtr kw); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyInstance_NewRaw(IntPtr cls, IntPtr dict); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyMethod_New(IntPtr func, IntPtr self, IntPtr cls); @@ -930,69 +874,56 @@ internal static string PyObject_GetTypeName(IntPtr op) return Marshal.PtrToStringAnsi(ppName); } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyObject_HasAttrString(IntPtr pointer, string name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyObject_GetAttrString(IntPtr pointer, string name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyObject_SetAttrString(IntPtr pointer, string name, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyObject_HasAttr(IntPtr pointer, IntPtr name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyObject_GetAttr(IntPtr pointer, IntPtr name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyObject_SetAttr(IntPtr pointer, IntPtr name, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyObject_GetItem(IntPtr pointer, IntPtr key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyObject_SetItem(IntPtr pointer, IntPtr key, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyObject_DelItem(IntPtr pointer, IntPtr key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyObject_GetIter(IntPtr op); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyObject_Call(IntPtr pointer, IntPtr args, IntPtr kw); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyObject_CallObject(IntPtr pointer, IntPtr args); #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyObject_RichCompareBool(IntPtr value1, IntPtr value2, int opid); @@ -1021,73 +952,60 @@ internal static int PyObject_Compare(IntPtr value1, IntPtr value2) return -1; } #elif PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyObject_Compare(IntPtr value1, IntPtr value2); #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyObject_IsInstance(IntPtr ob, IntPtr type); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyObject_IsSubclass(IntPtr ob, IntPtr type); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyCallable_Check(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyObject_IsTrue(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyObject_Not(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyObject_Size(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyObject_Hash(IntPtr op); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyObject_Repr(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyObject_Str(IntPtr pointer); #if PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyObject_Str", - CharSet = CharSet.Ansi)] + EntryPoint = "PyObject_Str")] internal unsafe static extern IntPtr PyObject_Unicode(IntPtr pointer); #elif PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyObject_Unicode(IntPtr pointer); #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyObject_Dir(IntPtr pointer); @@ -1098,31 +1016,26 @@ internal unsafe static extern IntPtr #if PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyNumber_Long", - CharSet = CharSet.Ansi)] + EntryPoint = "PyNumber_Long")] internal unsafe static extern IntPtr PyNumber_Int(IntPtr ob); #elif PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_Int(IntPtr ob); #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_Long(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_Float(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern bool PyNumber_Check(IntPtr ob); @@ -1151,47 +1064,39 @@ internal static IntPtr PyInt_FromInt64(long value) #if PYTHON3 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyLong_FromLong", - CharSet = CharSet.Ansi)] + EntryPoint = "PyLong_FromLong")] private unsafe static extern IntPtr PyInt_FromLong(IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyLong_AsLong", - CharSet = CharSet.Ansi)] + EntryPoint = "PyLong_AsLong")] internal unsafe static extern int PyInt_AsLong(IntPtr value); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyLong_FromString", - CharSet = CharSet.Ansi)] + EntryPoint = "PyLong_FromString")] internal unsafe static extern IntPtr PyInt_FromString(string value, IntPtr end, int radix); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyLong_GetMax", - CharSet = CharSet.Ansi)] + EntryPoint = "PyLong_GetMax")] internal unsafe static extern int PyInt_GetMax(); #elif PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] private unsafe static extern IntPtr PyInt_FromLong(IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyInt_AsLong(IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyInt_FromString(string value, IntPtr end, int radix); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyInt_GetMax(); #endif @@ -1201,53 +1106,43 @@ internal static bool PyLong_Check(IntPtr ob) return PyObject_TYPE(ob) == Runtime.PyLongType; } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyLong_FromLong(long value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyLong_FromUnsignedLong(uint value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyLong_FromDouble(double value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyLong_FromLongLong(long value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyLong_FromUnsignedLongLong(ulong value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyLong_FromString(string value, IntPtr end, int radix); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyLong_AsLong(IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern uint PyLong_AsUnsignedLong(IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern long PyLong_AsLongLong(IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern ulong PyLong_AsUnsignedLongLong(IntPtr value); @@ -1257,143 +1152,115 @@ internal static bool PyFloat_Check(IntPtr ob) return PyObject_TYPE(ob) == Runtime.PyFloatType; } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyFloat_FromDouble(double value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyFloat_FromString(IntPtr value, IntPtr junk); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern double PyFloat_AsDouble(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_Add(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_Subtract(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_Multiply(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_Divide(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_And(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_Xor(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_Or(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_Lshift(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_Rshift(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_Power(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_Remainder(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_InPlaceAdd(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_InPlaceSubtract(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_InPlaceMultiply(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_InPlaceDivide(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_InPlaceAnd(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_InPlaceXor(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_InPlaceOr(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_InPlaceLshift(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_InPlaceRshift(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_InPlacePower(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_InPlaceRemainder(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_Negative(IntPtr o1); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_Positive(IntPtr o1); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyNumber_Invert(IntPtr o1); @@ -1401,78 +1268,63 @@ internal unsafe static extern IntPtr // Python sequence API //==================================================================== - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern bool PySequence_Check(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PySequence_GetItem(IntPtr pointer, int index); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PySequence_SetItem(IntPtr pointer, int index, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PySequence_DelItem(IntPtr pointer, int index); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PySequence_GetSlice(IntPtr pointer, int i1, int i2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PySequence_SetSlice(IntPtr pointer, int i1, int i2, IntPtr v); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PySequence_DelSlice(IntPtr pointer, int i1, int i2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PySequence_Size(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PySequence_Contains(IntPtr pointer, IntPtr item); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PySequence_Concat(IntPtr pointer, IntPtr other); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PySequence_Repeat(IntPtr pointer, int count); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PySequence_Index(IntPtr pointer, IntPtr item); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PySequence_Count(IntPtr pointer, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PySequence_Tuple(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PySequence_List(IntPtr pointer); @@ -1498,13 +1350,11 @@ internal static IntPtr PyString_FromString(string value) } #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyBytes_FromString(string op); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyBytes_Size(IntPtr op); @@ -1525,19 +1375,16 @@ int size internal unsafe static extern IntPtr PyUnicode_FromStringAndSize(IntPtr value, int size); #elif PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyString_FromStringAndSize(string value, int size); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyString_AsString", - CharSet = CharSet.Ansi)] + EntryPoint = "PyString_AsString")] internal unsafe static extern IntPtr PyString_AS_STRING(IntPtr op); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyString_Size(IntPtr pointer); #endif @@ -1603,8 +1450,7 @@ internal unsafe static extern IntPtr PyUnicode_FromUnicode(string s, int size); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS2_GetSize", - CharSet = CharSet.Ansi)] + EntryPoint = "PyUnicodeUCS2_GetSize")] internal unsafe static extern int PyUnicode_GetSize(IntPtr ob); @@ -1643,8 +1489,7 @@ internal static IntPtr PyUnicode_FromUnicode(string s, int size) return PyUnicode_FromKindAndString(4, s, size); } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyUnicode_GetSize(IntPtr ob); @@ -1678,8 +1523,7 @@ int size ); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS4_GetSize", - CharSet = CharSet.Ansi)] + EntryPoint = "PyUnicodeUCS4_GetSize")] internal unsafe static extern int PyUnicode_GetSize(IntPtr ob); @@ -1750,83 +1594,67 @@ internal static bool PyDict_Check(IntPtr ob) return PyObject_TYPE(ob) == Runtime.PyDictType; } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyDict_New(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyDictProxy_New(IntPtr dict); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyDict_GetItem(IntPtr pointer, IntPtr key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyDict_GetItemString(IntPtr pointer, string key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyDict_SetItem(IntPtr pointer, IntPtr key, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyDict_SetItemString(IntPtr pointer, string key, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyDict_DelItem(IntPtr pointer, IntPtr key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyDict_DelItemString(IntPtr pointer, string key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyMapping_HasKey(IntPtr pointer, IntPtr key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyDict_Keys(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyDict_Values(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyDict_Items(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyDict_Copy(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyDict_Update(IntPtr pointer, IntPtr other); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyDict_Clear(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyDict_Size(IntPtr pointer); @@ -1840,58 +1668,47 @@ internal static bool PyList_Check(IntPtr ob) return PyObject_TYPE(ob) == Runtime.PyListType; } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyList_New(int size); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyList_AsTuple(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyList_GetItem(IntPtr pointer, int index); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyList_SetItem(IntPtr pointer, int index, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyList_Insert(IntPtr pointer, int index, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyList_Append(IntPtr pointer, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyList_Reverse(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyList_Sort(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyList_GetSlice(IntPtr pointer, int start, int end); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyList_SetSlice(IntPtr pointer, int start, int end, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyList_Size(IntPtr pointer); @@ -1905,28 +1722,23 @@ internal static bool PyTuple_Check(IntPtr ob) return PyObject_TYPE(ob) == Runtime.PyTupleType; } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyTuple_New(int size); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyTuple_GetItem(IntPtr pointer, int index); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyTuple_SetItem(IntPtr pointer, int index, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyTuple_GetSlice(IntPtr pointer, int start, int end); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyTuple_Size(IntPtr pointer); @@ -1936,8 +1748,7 @@ internal unsafe static extern int //==================================================================== #if PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern bool PyIter_Check(IntPtr pointer); #elif PYTHON3 @@ -1950,8 +1761,7 @@ internal static bool } #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyIter_Next(IntPtr pointer); @@ -1959,61 +1769,50 @@ internal unsafe static extern IntPtr // Python module API //==================================================================== - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyModule_New(string name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern string PyModule_GetName(IntPtr module); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyModule_GetDict(IntPtr module); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern string PyModule_GetFilename(IntPtr module); #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyModule_Create2(IntPtr module, int apiver); #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyImport_Import(IntPtr name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyImport_ImportModule(string name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyImport_ReloadModule(IntPtr module); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyImport_AddModule(string name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyImport_GetModuleDict(); #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PySys_SetArgvEx( int argc, @@ -2021,8 +1820,7 @@ internal unsafe static extern void int updatepath ); #elif PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PySys_SetArgvEx( int argc, @@ -2031,13 +1829,11 @@ int updatepath ); #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PySys_GetObject(string name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PySys_SetObject(string name, IntPtr ob); @@ -2051,13 +1847,11 @@ internal static bool PyType_Check(IntPtr ob) return PyObject_TypeCheck(ob, Runtime.PyTypeType); } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyType_Modified(IntPtr type); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern bool PyType_IsSubtype(IntPtr t1, IntPtr t2); @@ -2067,58 +1861,47 @@ internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) return (t == tp) || PyType_IsSubtype(t, tp); } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyType_GenericNew(IntPtr type, IntPtr args, IntPtr kw); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyType_GenericAlloc(IntPtr type, int n); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyType_Ready(IntPtr type); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr _PyType_Lookup(IntPtr type, IntPtr name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyObject_GenericGetAttr(IntPtr obj, IntPtr name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyObject_GenericSetAttr(IntPtr obj, IntPtr name, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr _PyObject_GetDictPtr(IntPtr obj); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyObject_GC_New(IntPtr tp); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyObject_GC_Del(IntPtr tp); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyObject_GC_Track(IntPtr tp); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyObject_GC_UnTrack(IntPtr tp); @@ -2127,18 +1910,15 @@ internal unsafe static extern void // Python memory API //==================================================================== - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyMem_Malloc(int size); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyMem_Realloc(IntPtr ptr, int size); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyMem_Free(IntPtr ptr); @@ -2147,63 +1927,51 @@ internal unsafe static extern void // Python exception API //==================================================================== - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyErr_SetString(IntPtr ob, string message); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyErr_SetObject(IntPtr ob, IntPtr message); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyErr_SetFromErrno(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyErr_SetNone(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyErr_ExceptionMatches(IntPtr exception); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyErr_GivenExceptionMatches(IntPtr ob, IntPtr val); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyErr_NormalizeException(IntPtr ob, IntPtr val, IntPtr tb); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyErr_Occurred(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyErr_Fetch(ref IntPtr ob, ref IntPtr val, ref IntPtr tb); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyErr_Restore(IntPtr ob, IntPtr val, IntPtr tb); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyErr_Clear(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern void PyErr_Print(); @@ -2212,13 +1980,11 @@ internal unsafe static extern void // Miscellaneous //==================================================================== - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyMethod_Self(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Ansi)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyMethod_Function(IntPtr ob); } From ef7f69f821a72e4e39d93df4bb4cb663771a6c12 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 23 Feb 2017 21:51:01 -0700 Subject: [PATCH 201/324] Remove CharSet.Unicode where not needed CharSet.Unicode is only needed when args are string type. https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.charset(v=vs.110).aspx --- src/runtime/runtime.cs | 45 ++++++++++++++---------------------------- 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 019b2bd2f..75e062ac2 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1370,8 +1370,7 @@ internal static extern IntPtr int size ); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Unicode)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyUnicode_FromStringAndSize(IntPtr value, int size); #elif PYTHON2 @@ -1395,13 +1394,11 @@ internal static bool PyUnicode_Check(IntPtr ob) } #if UCS2 && PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Unicode)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyUnicode_FromObject(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Unicode)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); @@ -1416,30 +1413,25 @@ internal static IntPtr PyUnicode_FromUnicode(string s, int size) return PyUnicode_FromKindAndString(2, s, size); } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Unicode)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern int PyUnicode_GetSize(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Unicode)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Unicode)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS2 && PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS2_FromObject", - CharSet = CharSet.Unicode)] + EntryPoint = "PyUnicodeUCS2_FromObject")] internal unsafe static extern IntPtr PyUnicode_FromObject(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS2_FromEncodedObject", - CharSet = CharSet.Unicode)] + EntryPoint = "PyUnicodeUCS2_FromEncodedObject")] internal unsafe static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); @@ -1460,18 +1452,15 @@ internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS2_FromOrdinal", - CharSet = CharSet.Unicode)] + EntryPoint = "PyUnicodeUCS2_FromOrdinal")] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS4 && PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Unicode)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyUnicode_FromObject(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Unicode)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); @@ -1497,20 +1486,17 @@ internal unsafe static extern int internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - CharSet = CharSet.Unicode)] + [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS4 && PYTHON2 [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS4_FromObject", - CharSet = CharSet.Unicode)] + EntryPoint = "PyUnicodeUCS4_FromObject")] internal unsafe static extern IntPtr PyUnicode_FromObject(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS4_FromEncodedObject", - CharSet = CharSet.Unicode)] + EntryPoint = "PyUnicodeUCS4_FromEncodedObject")] internal unsafe static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); @@ -1533,8 +1519,7 @@ internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS4_FromOrdinal", - CharSet = CharSet.Unicode)] + EntryPoint = "PyUnicodeUCS4_FromOrdinal")] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); #endif From f1aa89bb4620c98b8c6eeeb6431a0ca83add7602 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 23 Feb 2017 23:51:21 -0700 Subject: [PATCH 202/324] Remove CallingConvention --- src/runtime/runtime.cs | 533 ++++++++++++++++++++--------------------- 1 file changed, 256 insertions(+), 277 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 75e062ac2..c642056ab 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -583,241 +583,241 @@ internal unsafe static long Refcount(IntPtr op) #if Py_DEBUG // Py_IncRef and Py_DecRef are taking care of the extra payload // in Py_DEBUG builds of Python like _Py_RefTotal - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] private unsafe static extern void Py_IncRef(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] private unsafe static extern void Py_DecRef(IntPtr ob); #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void Py_Initialize(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int Py_IsInitialized(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void Py_Finalize(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr Py_NewInterpreter(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void Py_EndInterpreter(IntPtr threadState); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyThreadState_New(IntPtr istate); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyThreadState_Get(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyThread_get_key_value(IntPtr key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyThread_get_thread_ident(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyThread_set_key_value(IntPtr key, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyThreadState_Swap(IntPtr key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyGILState_Ensure(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyGILState_Release(IntPtr gs); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyGILState_GetThisThreadState(); #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] public unsafe static extern int Py_Main( int argc, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrArrayMarshaler))] string[] argv ); #elif PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] public unsafe static extern int Py_Main(int argc, string[] argv); #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyEval_InitThreads(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyEval_ThreadsInitialized(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyEval_AcquireLock(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyEval_ReleaseLock(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyEval_AcquireThread(IntPtr tstate); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyEval_ReleaseThread(IntPtr tstate); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyEval_SaveThread(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyEval_RestoreThread(IntPtr tstate); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyEval_GetBuiltins(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyEval_GetGlobals(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyEval_GetLocals(); #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] [return: MarshalAs(UnmanagedType.LPWStr)] internal unsafe static extern string Py_GetProgramName(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void Py_SetProgramName([MarshalAs(UnmanagedType.LPWStr)] string name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] [return: MarshalAs(UnmanagedType.LPWStr)] internal unsafe static extern string Py_GetPythonHome(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void Py_SetPythonHome([MarshalAs(UnmanagedType.LPWStr)] string home); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] [return: MarshalAs(UnmanagedType.LPWStr)] internal unsafe static extern string Py_GetPath(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void Py_SetPath([MarshalAs(UnmanagedType.LPWStr)] string home); #elif PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern string Py_GetProgramName(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void Py_SetProgramName(string name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern string Py_GetPythonHome(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void Py_SetPythonHome(string home); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern string Py_GetPath(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void Py_SetPath(string home); #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern string Py_GetVersion(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern string Py_GetPlatform(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern string Py_GetCopyright(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern string Py_GetCompiler(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern string Py_GetBuildInfo(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyRun_SimpleString(string code); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyRun_String(string code, IntPtr st, IntPtr globals, IntPtr locals); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr Py_CompileString(string code, string file, IntPtr tok); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyImport_ExecCodeModule(string name, IntPtr code); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyCFunction_NewEx(IntPtr ml, IntPtr self, IntPtr mod); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyCFunction_Call(IntPtr func, IntPtr args, IntPtr kw); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyClass_New(IntPtr bases, IntPtr dict, IntPtr name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyInstance_New(IntPtr cls, IntPtr args, IntPtr kw); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyInstance_NewRaw(IntPtr cls, IntPtr dict); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyMethod_New(IntPtr func, IntPtr self, IntPtr cls); @@ -874,56 +874,56 @@ internal static string PyObject_GetTypeName(IntPtr op) return Marshal.PtrToStringAnsi(ppName); } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyObject_HasAttrString(IntPtr pointer, string name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyObject_GetAttrString(IntPtr pointer, string name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyObject_SetAttrString(IntPtr pointer, string name, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyObject_HasAttr(IntPtr pointer, IntPtr name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyObject_GetAttr(IntPtr pointer, IntPtr name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyObject_SetAttr(IntPtr pointer, IntPtr name, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyObject_GetItem(IntPtr pointer, IntPtr key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyObject_SetItem(IntPtr pointer, IntPtr key, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyObject_DelItem(IntPtr pointer, IntPtr key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyObject_GetIter(IntPtr op); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyObject_Call(IntPtr pointer, IntPtr args, IntPtr kw); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyObject_CallObject(IntPtr pointer, IntPtr args); #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyObject_RichCompareBool(IntPtr value1, IntPtr value2, int opid); @@ -952,60 +952,59 @@ internal static int PyObject_Compare(IntPtr value1, IntPtr value2) return -1; } #elif PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyObject_Compare(IntPtr value1, IntPtr value2); #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyObject_IsInstance(IntPtr ob, IntPtr type); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyObject_IsSubclass(IntPtr ob, IntPtr type); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyCallable_Check(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyObject_IsTrue(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyObject_Not(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyObject_Size(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyObject_Hash(IntPtr op); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyObject_Repr(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyObject_Str(IntPtr pointer); #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyObject_Str")] + [DllImport(Runtime.dll, EntryPoint = "PyObject_Str")] internal unsafe static extern IntPtr PyObject_Unicode(IntPtr pointer); #elif PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyObject_Unicode(IntPtr pointer); #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyObject_Dir(IntPtr pointer); @@ -1015,27 +1014,26 @@ internal unsafe static extern IntPtr //==================================================================== #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyNumber_Long")] + [DllImport(Runtime.dll, EntryPoint = "PyNumber_Long")] internal unsafe static extern IntPtr PyNumber_Int(IntPtr ob); #elif PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_Int(IntPtr ob); #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_Long(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_Float(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern bool PyNumber_Check(IntPtr ob); @@ -1063,40 +1061,36 @@ internal static IntPtr PyInt_FromInt64(long value) } #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyLong_FromLong")] + [DllImport(Runtime.dll, EntryPoint = "PyLong_FromLong")] private unsafe static extern IntPtr PyInt_FromLong(IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyLong_AsLong")] + [DllImport(Runtime.dll, EntryPoint = "PyLong_AsLong")] internal unsafe static extern int PyInt_AsLong(IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyLong_FromString")] + [DllImport(Runtime.dll, EntryPoint = "PyLong_FromString")] internal unsafe static extern IntPtr PyInt_FromString(string value, IntPtr end, int radix); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyLong_GetMax")] + [DllImport(Runtime.dll, EntryPoint = "PyLong_GetMax")] internal unsafe static extern int PyInt_GetMax(); #elif PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] private unsafe static extern IntPtr PyInt_FromLong(IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyInt_AsLong(IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyInt_FromString(string value, IntPtr end, int radix); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyInt_GetMax(); #endif @@ -1106,43 +1100,43 @@ internal static bool PyLong_Check(IntPtr ob) return PyObject_TYPE(ob) == Runtime.PyLongType; } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyLong_FromLong(long value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyLong_FromUnsignedLong(uint value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyLong_FromDouble(double value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyLong_FromLongLong(long value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyLong_FromUnsignedLongLong(ulong value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyLong_FromString(string value, IntPtr end, int radix); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyLong_AsLong(IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern uint PyLong_AsUnsignedLong(IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern long PyLong_AsLongLong(IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern ulong PyLong_AsUnsignedLongLong(IntPtr value); @@ -1152,115 +1146,115 @@ internal static bool PyFloat_Check(IntPtr ob) return PyObject_TYPE(ob) == Runtime.PyFloatType; } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyFloat_FromDouble(double value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyFloat_FromString(IntPtr value, IntPtr junk); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern double PyFloat_AsDouble(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_Add(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_Subtract(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_Multiply(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_Divide(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_And(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_Xor(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_Or(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_Lshift(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_Rshift(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_Power(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_Remainder(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_InPlaceAdd(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_InPlaceSubtract(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_InPlaceMultiply(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_InPlaceDivide(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_InPlaceAnd(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_InPlaceXor(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_InPlaceOr(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_InPlaceLshift(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_InPlaceRshift(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_InPlacePower(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_InPlaceRemainder(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_Negative(IntPtr o1); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_Positive(IntPtr o1); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyNumber_Invert(IntPtr o1); @@ -1268,63 +1262,63 @@ internal unsafe static extern IntPtr // Python sequence API //==================================================================== - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern bool PySequence_Check(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PySequence_GetItem(IntPtr pointer, int index); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PySequence_SetItem(IntPtr pointer, int index, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PySequence_DelItem(IntPtr pointer, int index); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PySequence_GetSlice(IntPtr pointer, int i1, int i2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PySequence_SetSlice(IntPtr pointer, int i1, int i2, IntPtr v); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PySequence_DelSlice(IntPtr pointer, int i1, int i2); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PySequence_Size(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PySequence_Contains(IntPtr pointer, IntPtr item); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PySequence_Concat(IntPtr pointer, IntPtr other); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PySequence_Repeat(IntPtr pointer, int count); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PySequence_Index(IntPtr pointer, IntPtr item); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PySequence_Count(IntPtr pointer, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PySequence_Tuple(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PySequence_List(IntPtr pointer); @@ -1350,11 +1344,11 @@ internal static IntPtr PyString_FromString(string value) } #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyBytes_FromString(string op); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyBytes_Size(IntPtr op); @@ -1370,20 +1364,19 @@ internal static extern IntPtr int size ); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyUnicode_FromStringAndSize(IntPtr value, int size); #elif PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyString_FromStringAndSize(string value, int size); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyString_AsString")] + [DllImport(Runtime.dll, EntryPoint = "PyString_AsString")] internal unsafe static extern IntPtr PyString_AS_STRING(IntPtr op); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyString_Size(IntPtr pointer); #endif @@ -1394,16 +1387,15 @@ internal static bool PyUnicode_Check(IntPtr ob) } #if UCS2 && PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyUnicode_FromObject(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicode_FromKindAndData", + [DllImport(Runtime.dll, EntryPoint = "PyUnicode_FromKindAndData", CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromKindAndString(int kind, string s, int size); @@ -1413,59 +1405,52 @@ internal static IntPtr PyUnicode_FromUnicode(string s, int size) return PyUnicode_FromKindAndString(2, s, size); } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyUnicode_GetSize(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS2 && PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS2_FromObject")] + [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS2_FromObject")] internal unsafe static extern IntPtr PyUnicode_FromObject(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS2_FromEncodedObject")] + [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS2_FromEncodedObject")] internal unsafe static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS2_FromUnicode", + [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS2_FromUnicode", CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromUnicode(string s, int size); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS2_GetSize")] + [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS2_GetSize")] internal unsafe static extern int PyUnicode_GetSize(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS2_AsUnicode")] + [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS2_AsUnicode")] internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS2_FromOrdinal")] + [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS2_FromOrdinal")] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS4 && PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyUnicode_FromObject(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicode_FromKindAndData")] + [DllImport(Runtime.dll, EntryPoint = "PyUnicode_FromKindAndData")] internal unsafe static extern IntPtr PyUnicode_FromKindAndString( int kind, @@ -1478,48 +1463,42 @@ internal static IntPtr PyUnicode_FromUnicode(string s, int size) return PyUnicode_FromKindAndString(4, s, size); } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyUnicode_GetSize(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS4 && PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS4_FromObject")] + [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS4_FromObject")] internal unsafe static extern IntPtr PyUnicode_FromObject(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS4_FromEncodedObject")] + [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS4_FromEncodedObject")] internal unsafe static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS4_FromUnicode")] + [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS4_FromUnicode")] internal unsafe static extern IntPtr PyUnicode_FromUnicode( [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrMarshaler))] string s, int size ); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS4_GetSize")] + [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS4_GetSize")] internal unsafe static extern int PyUnicode_GetSize(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS4_AsUnicode")] + [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS4_AsUnicode")] internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl, - EntryPoint = "PyUnicodeUCS4_FromOrdinal")] + [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS4_FromOrdinal")] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); #endif @@ -1579,67 +1558,67 @@ internal static bool PyDict_Check(IntPtr ob) return PyObject_TYPE(ob) == Runtime.PyDictType; } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyDict_New(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyDictProxy_New(IntPtr dict); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyDict_GetItem(IntPtr pointer, IntPtr key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyDict_GetItemString(IntPtr pointer, string key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyDict_SetItem(IntPtr pointer, IntPtr key, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyDict_SetItemString(IntPtr pointer, string key, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyDict_DelItem(IntPtr pointer, IntPtr key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyDict_DelItemString(IntPtr pointer, string key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyMapping_HasKey(IntPtr pointer, IntPtr key); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyDict_Keys(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyDict_Values(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyDict_Items(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyDict_Copy(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyDict_Update(IntPtr pointer, IntPtr other); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyDict_Clear(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyDict_Size(IntPtr pointer); @@ -1653,47 +1632,47 @@ internal static bool PyList_Check(IntPtr ob) return PyObject_TYPE(ob) == Runtime.PyListType; } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyList_New(int size); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyList_AsTuple(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyList_GetItem(IntPtr pointer, int index); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyList_SetItem(IntPtr pointer, int index, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyList_Insert(IntPtr pointer, int index, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyList_Append(IntPtr pointer, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyList_Reverse(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyList_Sort(IntPtr pointer); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyList_GetSlice(IntPtr pointer, int start, int end); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyList_SetSlice(IntPtr pointer, int start, int end, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyList_Size(IntPtr pointer); @@ -1707,23 +1686,23 @@ internal static bool PyTuple_Check(IntPtr ob) return PyObject_TYPE(ob) == Runtime.PyTupleType; } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyTuple_New(int size); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyTuple_GetItem(IntPtr pointer, int index); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyTuple_SetItem(IntPtr pointer, int index, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyTuple_GetSlice(IntPtr pointer, int start, int end); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyTuple_Size(IntPtr pointer); @@ -1733,7 +1712,7 @@ internal unsafe static extern int //==================================================================== #if PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern bool PyIter_Check(IntPtr pointer); #elif PYTHON3 @@ -1746,7 +1725,7 @@ internal static bool } #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyIter_Next(IntPtr pointer); @@ -1754,50 +1733,50 @@ internal unsafe static extern IntPtr // Python module API //==================================================================== - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyModule_New(string name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern string PyModule_GetName(IntPtr module); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyModule_GetDict(IntPtr module); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern string PyModule_GetFilename(IntPtr module); #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyModule_Create2(IntPtr module, int apiver); #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyImport_Import(IntPtr name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyImport_ImportModule(string name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyImport_ReloadModule(IntPtr module); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyImport_AddModule(string name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyImport_GetModuleDict(); #if PYTHON3 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PySys_SetArgvEx( int argc, @@ -1805,7 +1784,7 @@ internal unsafe static extern void int updatepath ); #elif PYTHON2 - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PySys_SetArgvEx( int argc, @@ -1814,11 +1793,11 @@ int updatepath ); #endif - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PySys_GetObject(string name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PySys_SetObject(string name, IntPtr ob); @@ -1832,11 +1811,11 @@ internal static bool PyType_Check(IntPtr ob) return PyObject_TypeCheck(ob, Runtime.PyTypeType); } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyType_Modified(IntPtr type); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern bool PyType_IsSubtype(IntPtr t1, IntPtr t2); @@ -1846,47 +1825,47 @@ internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) return (t == tp) || PyType_IsSubtype(t, tp); } - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyType_GenericNew(IntPtr type, IntPtr args, IntPtr kw); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyType_GenericAlloc(IntPtr type, int n); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyType_Ready(IntPtr type); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr _PyType_Lookup(IntPtr type, IntPtr name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyObject_GenericGetAttr(IntPtr obj, IntPtr name); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyObject_GenericSetAttr(IntPtr obj, IntPtr name, IntPtr value); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr _PyObject_GetDictPtr(IntPtr obj); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyObject_GC_New(IntPtr tp); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyObject_GC_Del(IntPtr tp); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyObject_GC_Track(IntPtr tp); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyObject_GC_UnTrack(IntPtr tp); @@ -1895,15 +1874,15 @@ internal unsafe static extern void // Python memory API //==================================================================== - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyMem_Malloc(int size); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyMem_Realloc(IntPtr ptr, int size); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyMem_Free(IntPtr ptr); @@ -1912,51 +1891,51 @@ internal unsafe static extern void // Python exception API //==================================================================== - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyErr_SetString(IntPtr ob, string message); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyErr_SetObject(IntPtr ob, IntPtr message); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyErr_SetFromErrno(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyErr_SetNone(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyErr_ExceptionMatches(IntPtr exception); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyErr_GivenExceptionMatches(IntPtr ob, IntPtr val); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyErr_NormalizeException(IntPtr ob, IntPtr val, IntPtr tb); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern int PyErr_Occurred(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyErr_Fetch(ref IntPtr ob, ref IntPtr val, ref IntPtr tb); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyErr_Restore(IntPtr ob, IntPtr val, IntPtr tb); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyErr_Clear(); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern void PyErr_Print(); @@ -1965,11 +1944,11 @@ internal unsafe static extern void // Miscellaneous //==================================================================== - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyMethod_Self(IntPtr ob); - [DllImport(Runtime.dll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(Runtime.dll)] internal unsafe static extern IntPtr PyMethod_Function(IntPtr ob); } From 5b3f58afdb893abdfd2c5219b972c65daa5ea4cc Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 26 Feb 2017 15:28:43 -0700 Subject: [PATCH 203/324] Rename Runtime field `dll` to `PythonDll` Add remove full qualification --- src/runtime/runtime.cs | 524 ++++++++++++++++++++--------------------- 1 file changed, 261 insertions(+), 263 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index c642056ab..bef31d758 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -157,9 +157,9 @@ public class Runtime #endif #if PYTHON_WITHOUT_ENABLE_SHARED - public const string dll = "__Internal"; + public const string PythonDll = "__Internal"; #else - public const string dll = dllBase + dllWithPyDebug + dllWithPyMalloc + dllWithWideUnicode; + public const string PythonDll = dllBase + dllWithPyDebug + dllWithPyMalloc + dllWithWideUnicode; #endif // set to true when python is finalizing @@ -295,9 +295,9 @@ internal static void Initialize() #if PYTHON3 IntPtr dllLocal = IntPtr.Zero; - if (Runtime.dll != "__Internal") + if (PythonDll != "__Internal") { - NativeMethods.LoadLibrary(Runtime.dll); + NativeMethods.LoadLibrary(PythonDll); } _PyObject_NextNotImplemented = NativeMethods.GetProcAddress(dllLocal, "_PyObject_NextNotImplemented"); #if !(MONO_LINUX || MONO_OSX) @@ -583,241 +583,241 @@ internal unsafe static long Refcount(IntPtr op) #if Py_DEBUG // Py_IncRef and Py_DecRef are taking care of the extra payload // in Py_DEBUG builds of Python like _Py_RefTotal - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] private unsafe static extern void Py_IncRef(IntPtr ob); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] private unsafe static extern void Py_DecRef(IntPtr ob); #endif - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void Py_Initialize(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int Py_IsInitialized(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void Py_Finalize(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr Py_NewInterpreter(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void Py_EndInterpreter(IntPtr threadState); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyThreadState_New(IntPtr istate); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyThreadState_Get(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyThread_get_key_value(IntPtr key); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyThread_get_thread_ident(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyThread_set_key_value(IntPtr key, IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyThreadState_Swap(IntPtr key); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyGILState_Ensure(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyGILState_Release(IntPtr gs); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyGILState_GetThisThreadState(); #if PYTHON3 - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] public unsafe static extern int Py_Main( int argc, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrArrayMarshaler))] string[] argv ); #elif PYTHON2 - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] public unsafe static extern int Py_Main(int argc, string[] argv); #endif - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyEval_InitThreads(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyEval_ThreadsInitialized(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyEval_AcquireLock(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyEval_ReleaseLock(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyEval_AcquireThread(IntPtr tstate); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyEval_ReleaseThread(IntPtr tstate); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyEval_SaveThread(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyEval_RestoreThread(IntPtr tstate); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyEval_GetBuiltins(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyEval_GetGlobals(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyEval_GetLocals(); #if PYTHON3 - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] [return: MarshalAs(UnmanagedType.LPWStr)] internal unsafe static extern string Py_GetProgramName(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void Py_SetProgramName([MarshalAs(UnmanagedType.LPWStr)] string name); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] [return: MarshalAs(UnmanagedType.LPWStr)] internal unsafe static extern string Py_GetPythonHome(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void Py_SetPythonHome([MarshalAs(UnmanagedType.LPWStr)] string home); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] [return: MarshalAs(UnmanagedType.LPWStr)] internal unsafe static extern string Py_GetPath(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void Py_SetPath([MarshalAs(UnmanagedType.LPWStr)] string home); #elif PYTHON2 - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern string Py_GetProgramName(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void Py_SetProgramName(string name); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern string Py_GetPythonHome(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void Py_SetPythonHome(string home); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern string Py_GetPath(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void Py_SetPath(string home); #endif - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern string Py_GetVersion(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern string Py_GetPlatform(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern string Py_GetCopyright(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern string Py_GetCompiler(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern string Py_GetBuildInfo(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyRun_SimpleString(string code); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyRun_String(string code, IntPtr st, IntPtr globals, IntPtr locals); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr Py_CompileString(string code, string file, IntPtr tok); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyImport_ExecCodeModule(string name, IntPtr code); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyCFunction_NewEx(IntPtr ml, IntPtr self, IntPtr mod); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyCFunction_Call(IntPtr func, IntPtr args, IntPtr kw); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyClass_New(IntPtr bases, IntPtr dict, IntPtr name); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyInstance_New(IntPtr cls, IntPtr args, IntPtr kw); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyInstance_NewRaw(IntPtr cls, IntPtr dict); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyMethod_New(IntPtr func, IntPtr self, IntPtr cls); @@ -874,56 +874,56 @@ internal static string PyObject_GetTypeName(IntPtr op) return Marshal.PtrToStringAnsi(ppName); } - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyObject_HasAttrString(IntPtr pointer, string name); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyObject_GetAttrString(IntPtr pointer, string name); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyObject_SetAttrString(IntPtr pointer, string name, IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyObject_HasAttr(IntPtr pointer, IntPtr name); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyObject_GetAttr(IntPtr pointer, IntPtr name); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyObject_SetAttr(IntPtr pointer, IntPtr name, IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyObject_GetItem(IntPtr pointer, IntPtr key); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyObject_SetItem(IntPtr pointer, IntPtr key, IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyObject_DelItem(IntPtr pointer, IntPtr key); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyObject_GetIter(IntPtr op); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyObject_Call(IntPtr pointer, IntPtr args, IntPtr kw); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyObject_CallObject(IntPtr pointer, IntPtr args); #if PYTHON3 - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyObject_RichCompareBool(IntPtr value1, IntPtr value2, int opid); @@ -952,59 +952,59 @@ internal static int PyObject_Compare(IntPtr value1, IntPtr value2) return -1; } #elif PYTHON2 - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyObject_Compare(IntPtr value1, IntPtr value2); #endif - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyObject_IsInstance(IntPtr ob, IntPtr type); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyObject_IsSubclass(IntPtr ob, IntPtr type); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyCallable_Check(IntPtr pointer); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyObject_IsTrue(IntPtr pointer); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyObject_Not(IntPtr pointer); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyObject_Size(IntPtr pointer); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyObject_Hash(IntPtr op); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyObject_Repr(IntPtr pointer); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyObject_Str(IntPtr pointer); #if PYTHON3 - [DllImport(Runtime.dll, EntryPoint = "PyObject_Str")] + [DllImport(PythonDll, EntryPoint = "PyObject_Str")] internal unsafe static extern IntPtr PyObject_Unicode(IntPtr pointer); #elif PYTHON2 - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyObject_Unicode(IntPtr pointer); #endif - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyObject_Dir(IntPtr pointer); @@ -1014,26 +1014,26 @@ internal unsafe static extern IntPtr //==================================================================== #if PYTHON3 - [DllImport(Runtime.dll, EntryPoint = "PyNumber_Long")] + [DllImport(PythonDll, EntryPoint = "PyNumber_Long")] internal unsafe static extern IntPtr PyNumber_Int(IntPtr ob); #elif PYTHON2 - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_Int(IntPtr ob); #endif - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_Long(IntPtr ob); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_Float(IntPtr ob); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern bool PyNumber_Check(IntPtr ob); @@ -1061,36 +1061,36 @@ internal static IntPtr PyInt_FromInt64(long value) } #if PYTHON3 - [DllImport(Runtime.dll, EntryPoint = "PyLong_FromLong")] + [DllImport(PythonDll, EntryPoint = "PyLong_FromLong")] private unsafe static extern IntPtr PyInt_FromLong(IntPtr value); - [DllImport(Runtime.dll, EntryPoint = "PyLong_AsLong")] + [DllImport(PythonDll, EntryPoint = "PyLong_AsLong")] internal unsafe static extern int PyInt_AsLong(IntPtr value); - [DllImport(Runtime.dll, EntryPoint = "PyLong_FromString")] + [DllImport(PythonDll, EntryPoint = "PyLong_FromString")] internal unsafe static extern IntPtr PyInt_FromString(string value, IntPtr end, int radix); - [DllImport(Runtime.dll, EntryPoint = "PyLong_GetMax")] + [DllImport(PythonDll, EntryPoint = "PyLong_GetMax")] internal unsafe static extern int PyInt_GetMax(); #elif PYTHON2 - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] private unsafe static extern IntPtr PyInt_FromLong(IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyInt_AsLong(IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyInt_FromString(string value, IntPtr end, int radix); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyInt_GetMax(); #endif @@ -1100,43 +1100,43 @@ internal static bool PyLong_Check(IntPtr ob) return PyObject_TYPE(ob) == Runtime.PyLongType; } - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyLong_FromLong(long value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyLong_FromUnsignedLong(uint value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyLong_FromDouble(double value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyLong_FromLongLong(long value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyLong_FromUnsignedLongLong(ulong value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyLong_FromString(string value, IntPtr end, int radix); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyLong_AsLong(IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern uint PyLong_AsUnsignedLong(IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern long PyLong_AsLongLong(IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern ulong PyLong_AsUnsignedLongLong(IntPtr value); @@ -1146,115 +1146,115 @@ internal static bool PyFloat_Check(IntPtr ob) return PyObject_TYPE(ob) == Runtime.PyFloatType; } - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyFloat_FromDouble(double value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyFloat_FromString(IntPtr value, IntPtr junk); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern double PyFloat_AsDouble(IntPtr ob); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_Add(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_Subtract(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_Multiply(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_Divide(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_And(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_Xor(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_Or(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_Lshift(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_Rshift(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_Power(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_Remainder(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_InPlaceAdd(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_InPlaceSubtract(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_InPlaceMultiply(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_InPlaceDivide(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_InPlaceAnd(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_InPlaceXor(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_InPlaceOr(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_InPlaceLshift(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_InPlaceRshift(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_InPlacePower(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_InPlaceRemainder(IntPtr o1, IntPtr o2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_Negative(IntPtr o1); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_Positive(IntPtr o1); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyNumber_Invert(IntPtr o1); @@ -1262,63 +1262,63 @@ internal unsafe static extern IntPtr // Python sequence API //==================================================================== - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern bool PySequence_Check(IntPtr pointer); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PySequence_GetItem(IntPtr pointer, int index); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PySequence_SetItem(IntPtr pointer, int index, IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PySequence_DelItem(IntPtr pointer, int index); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PySequence_GetSlice(IntPtr pointer, int i1, int i2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PySequence_SetSlice(IntPtr pointer, int i1, int i2, IntPtr v); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PySequence_DelSlice(IntPtr pointer, int i1, int i2); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PySequence_Size(IntPtr pointer); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PySequence_Contains(IntPtr pointer, IntPtr item); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PySequence_Concat(IntPtr pointer, IntPtr other); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PySequence_Repeat(IntPtr pointer, int count); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PySequence_Index(IntPtr pointer, IntPtr item); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PySequence_Count(IntPtr pointer, IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PySequence_Tuple(IntPtr pointer); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PySequence_List(IntPtr pointer); @@ -1344,11 +1344,11 @@ internal static IntPtr PyString_FromString(string value) } #if PYTHON3 - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyBytes_FromString(string op); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyBytes_Size(IntPtr op); @@ -1357,26 +1357,26 @@ internal static IntPtr PyBytes_AS_STRING(IntPtr ob) return ob + BytesOffset.ob_sval; } - [DllImport(Runtime.dll, EntryPoint = "PyUnicode_FromStringAndSize")] + [DllImport(PythonDll, EntryPoint = "PyUnicode_FromStringAndSize")] internal static extern IntPtr PyString_FromStringAndSize( [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Utf8Marshaler))] string value, int size ); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyUnicode_FromStringAndSize(IntPtr value, int size); #elif PYTHON2 - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyString_FromStringAndSize(string value, int size); - [DllImport(Runtime.dll, EntryPoint = "PyString_AsString")] + [DllImport(PythonDll, EntryPoint = "PyString_AsString")] internal unsafe static extern IntPtr PyString_AS_STRING(IntPtr op); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyString_Size(IntPtr pointer); #endif @@ -1387,16 +1387,15 @@ internal static bool PyUnicode_Check(IntPtr ob) } #if UCS2 && PYTHON3 - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyUnicode_FromObject(IntPtr ob); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - [DllImport(Runtime.dll, EntryPoint = "PyUnicode_FromKindAndData", - CharSet = CharSet.Unicode)] + [DllImport(PythonDll, EntryPoint = "PyUnicode_FromKindAndData", CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromKindAndString(int kind, string s, int size); @@ -1405,52 +1404,51 @@ internal static IntPtr PyUnicode_FromUnicode(string s, int size) return PyUnicode_FromKindAndString(2, s, size); } - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyUnicode_GetSize(IntPtr ob); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS2 && PYTHON2 - [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS2_FromObject")] + [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_FromObject")] internal unsafe static extern IntPtr PyUnicode_FromObject(IntPtr ob); - [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS2_FromEncodedObject")] + [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_FromEncodedObject")] internal unsafe static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS2_FromUnicode", - CharSet = CharSet.Unicode)] + [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_FromUnicode", CharSet = CharSet.Unicode)] internal unsafe static extern IntPtr PyUnicode_FromUnicode(string s, int size); - [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS2_GetSize")] + [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_GetSize")] internal unsafe static extern int PyUnicode_GetSize(IntPtr ob); - [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS2_AsUnicode")] + [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_AsUnicode")] internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS2_FromOrdinal")] + [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_FromOrdinal")] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS4 && PYTHON3 - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyUnicode_FromObject(IntPtr ob); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - [DllImport(Runtime.dll, EntryPoint = "PyUnicode_FromKindAndData")] + [DllImport(PythonDll, EntryPoint = "PyUnicode_FromKindAndData")] internal unsafe static extern IntPtr PyUnicode_FromKindAndString( int kind, @@ -1463,42 +1461,42 @@ internal static IntPtr PyUnicode_FromUnicode(string s, int size) return PyUnicode_FromKindAndString(4, s, size); } - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyUnicode_GetSize(IntPtr ob); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS4 && PYTHON2 - [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS4_FromObject")] + [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_FromObject")] internal unsafe static extern IntPtr PyUnicode_FromObject(IntPtr ob); - [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS4_FromEncodedObject")] + [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_FromEncodedObject")] internal unsafe static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS4_FromUnicode")] + [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_FromUnicode")] internal unsafe static extern IntPtr PyUnicode_FromUnicode( [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrMarshaler))] string s, int size ); - [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS4_GetSize")] + [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_GetSize")] internal unsafe static extern int PyUnicode_GetSize(IntPtr ob); - [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS4_AsUnicode")] + [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_AsUnicode")] internal unsafe static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(Runtime.dll, EntryPoint = "PyUnicodeUCS4_FromOrdinal")] + [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_FromOrdinal")] internal unsafe static extern IntPtr PyUnicode_FromOrdinal(int c); #endif @@ -1558,67 +1556,67 @@ internal static bool PyDict_Check(IntPtr ob) return PyObject_TYPE(ob) == Runtime.PyDictType; } - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyDict_New(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyDictProxy_New(IntPtr dict); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyDict_GetItem(IntPtr pointer, IntPtr key); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyDict_GetItemString(IntPtr pointer, string key); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyDict_SetItem(IntPtr pointer, IntPtr key, IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyDict_SetItemString(IntPtr pointer, string key, IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyDict_DelItem(IntPtr pointer, IntPtr key); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyDict_DelItemString(IntPtr pointer, string key); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyMapping_HasKey(IntPtr pointer, IntPtr key); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyDict_Keys(IntPtr pointer); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyDict_Values(IntPtr pointer); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyDict_Items(IntPtr pointer); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyDict_Copy(IntPtr pointer); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyDict_Update(IntPtr pointer, IntPtr other); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyDict_Clear(IntPtr pointer); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyDict_Size(IntPtr pointer); @@ -1632,47 +1630,47 @@ internal static bool PyList_Check(IntPtr ob) return PyObject_TYPE(ob) == Runtime.PyListType; } - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyList_New(int size); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyList_AsTuple(IntPtr pointer); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyList_GetItem(IntPtr pointer, int index); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyList_SetItem(IntPtr pointer, int index, IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyList_Insert(IntPtr pointer, int index, IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyList_Append(IntPtr pointer, IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyList_Reverse(IntPtr pointer); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyList_Sort(IntPtr pointer); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyList_GetSlice(IntPtr pointer, int start, int end); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyList_SetSlice(IntPtr pointer, int start, int end, IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyList_Size(IntPtr pointer); @@ -1686,23 +1684,23 @@ internal static bool PyTuple_Check(IntPtr ob) return PyObject_TYPE(ob) == Runtime.PyTupleType; } - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyTuple_New(int size); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyTuple_GetItem(IntPtr pointer, int index); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyTuple_SetItem(IntPtr pointer, int index, IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyTuple_GetSlice(IntPtr pointer, int start, int end); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyTuple_Size(IntPtr pointer); @@ -1712,7 +1710,7 @@ internal unsafe static extern int //==================================================================== #if PYTHON2 - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern bool PyIter_Check(IntPtr pointer); #elif PYTHON3 @@ -1725,7 +1723,7 @@ internal static bool } #endif - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyIter_Next(IntPtr pointer); @@ -1733,50 +1731,50 @@ internal unsafe static extern IntPtr // Python module API //==================================================================== - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyModule_New(string name); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern string PyModule_GetName(IntPtr module); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyModule_GetDict(IntPtr module); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern string PyModule_GetFilename(IntPtr module); #if PYTHON3 - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyModule_Create2(IntPtr module, int apiver); #endif - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyImport_Import(IntPtr name); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyImport_ImportModule(string name); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyImport_ReloadModule(IntPtr module); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyImport_AddModule(string name); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyImport_GetModuleDict(); #if PYTHON3 - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PySys_SetArgvEx( int argc, @@ -1784,7 +1782,7 @@ internal unsafe static extern void int updatepath ); #elif PYTHON2 - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PySys_SetArgvEx( int argc, @@ -1793,11 +1791,11 @@ int updatepath ); #endif - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PySys_GetObject(string name); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PySys_SetObject(string name, IntPtr ob); @@ -1811,11 +1809,11 @@ internal static bool PyType_Check(IntPtr ob) return PyObject_TypeCheck(ob, Runtime.PyTypeType); } - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyType_Modified(IntPtr type); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern bool PyType_IsSubtype(IntPtr t1, IntPtr t2); @@ -1825,47 +1823,47 @@ internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) return (t == tp) || PyType_IsSubtype(t, tp); } - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyType_GenericNew(IntPtr type, IntPtr args, IntPtr kw); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyType_GenericAlloc(IntPtr type, int n); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyType_Ready(IntPtr type); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr _PyType_Lookup(IntPtr type, IntPtr name); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyObject_GenericGetAttr(IntPtr obj, IntPtr name); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyObject_GenericSetAttr(IntPtr obj, IntPtr name, IntPtr value); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr _PyObject_GetDictPtr(IntPtr obj); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyObject_GC_New(IntPtr tp); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyObject_GC_Del(IntPtr tp); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyObject_GC_Track(IntPtr tp); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyObject_GC_UnTrack(IntPtr tp); @@ -1874,15 +1872,15 @@ internal unsafe static extern void // Python memory API //==================================================================== - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyMem_Malloc(int size); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyMem_Realloc(IntPtr ptr, int size); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyMem_Free(IntPtr ptr); @@ -1891,51 +1889,51 @@ internal unsafe static extern void // Python exception API //==================================================================== - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyErr_SetString(IntPtr ob, string message); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyErr_SetObject(IntPtr ob, IntPtr message); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyErr_SetFromErrno(IntPtr ob); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyErr_SetNone(IntPtr ob); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyErr_ExceptionMatches(IntPtr exception); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyErr_GivenExceptionMatches(IntPtr ob, IntPtr val); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyErr_NormalizeException(IntPtr ob, IntPtr val, IntPtr tb); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern int PyErr_Occurred(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyErr_Fetch(ref IntPtr ob, ref IntPtr val, ref IntPtr tb); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyErr_Restore(IntPtr ob, IntPtr val, IntPtr tb); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyErr_Clear(); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern void PyErr_Print(); @@ -1944,11 +1942,11 @@ internal unsafe static extern void // Miscellaneous //==================================================================== - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyMethod_Self(IntPtr ob); - [DllImport(Runtime.dll)] + [DllImport(PythonDll)] internal unsafe static extern IntPtr PyMethod_Function(IntPtr ob); } From c8906911c07b82551aa4c88aae72f66d6fbf9b4f Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 27 Feb 2017 22:05:58 -0700 Subject: [PATCH 204/324] Remove unneeded unsafe keyword --- src/runtime/exceptions.cs | 5 +- src/runtime/runtime.cs | 520 +++++++++++++++++++------------------- 2 files changed, 262 insertions(+), 263 deletions(-) diff --git a/src/runtime/exceptions.cs b/src/runtime/exceptions.cs index 21300f500..9023cfcfa 100644 --- a/src/runtime/exceptions.cs +++ b/src/runtime/exceptions.cs @@ -2,7 +2,6 @@ using System.Reflection; using System.Runtime.InteropServices; - namespace Python.Runtime { /// @@ -171,7 +170,7 @@ internal static void SetArgsAndCause(IntPtr ob) /// Shortcut for (pointer == NULL) -> throw PythonException /// /// Pointer to a Python object - internal static unsafe void ErrorCheck(IntPtr pointer) + internal static void ErrorCheck(IntPtr pointer) { if (pointer == IntPtr.Zero) { @@ -182,7 +181,7 @@ internal static unsafe void ErrorCheck(IntPtr pointer) /// /// Shortcut for (pointer == NULL or ErrorOccurred()) -> throw PythonException /// - internal static unsafe void ErrorOccurredCheck(IntPtr pointer) + internal static void ErrorOccurredCheck(IntPtr pointer) { if (pointer == IntPtr.Zero || ErrorOccurred()) { diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index bef31d758..5287ead92 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -501,7 +501,7 @@ internal static Type[] PythonArgsToTypeArray(IntPtr arg, bool mangleObjects) /// some optimization to avoid managed <--> unmanaged transitions /// (mostly for heavily used methods). /// - internal unsafe static void XIncref(IntPtr op) + internal static unsafe void XIncref(IntPtr op) { #if Py_DEBUG // according to Python doc, Py_IncRef() is Py_XINCREF() @@ -563,7 +563,7 @@ internal static unsafe void XDecref(IntPtr op) #endif } - internal unsafe static long Refcount(IntPtr op) + internal static unsafe long Refcount(IntPtr op) { void* p = (void*)op; if ((void*)0 != p) @@ -584,241 +584,241 @@ internal unsafe static long Refcount(IntPtr op) // Py_IncRef and Py_DecRef are taking care of the extra payload // in Py_DEBUG builds of Python like _Py_RefTotal [DllImport(PythonDll)] - private unsafe static extern void + private static extern void Py_IncRef(IntPtr ob); [DllImport(PythonDll)] - private unsafe static extern void + private static extern void Py_DecRef(IntPtr ob); #endif [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void Py_Initialize(); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int Py_IsInitialized(); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void Py_Finalize(); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr Py_NewInterpreter(); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void Py_EndInterpreter(IntPtr threadState); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyThreadState_New(IntPtr istate); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyThreadState_Get(); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyThread_get_key_value(IntPtr key); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyThread_get_thread_ident(); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyThread_set_key_value(IntPtr key, IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyThreadState_Swap(IntPtr key); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyGILState_Ensure(); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyGILState_Release(IntPtr gs); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyGILState_GetThisThreadState(); #if PYTHON3 [DllImport(PythonDll)] - public unsafe static extern int + public static extern int Py_Main( int argc, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrArrayMarshaler))] string[] argv ); #elif PYTHON2 [DllImport(PythonDll)] - public unsafe static extern int + public static extern int Py_Main(int argc, string[] argv); #endif [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyEval_InitThreads(); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyEval_ThreadsInitialized(); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyEval_AcquireLock(); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyEval_ReleaseLock(); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyEval_AcquireThread(IntPtr tstate); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyEval_ReleaseThread(IntPtr tstate); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyEval_SaveThread(); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyEval_RestoreThread(IntPtr tstate); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyEval_GetBuiltins(); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyEval_GetGlobals(); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyEval_GetLocals(); #if PYTHON3 [DllImport(PythonDll)] [return: MarshalAs(UnmanagedType.LPWStr)] - internal unsafe static extern string + internal static extern string Py_GetProgramName(); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void Py_SetProgramName([MarshalAs(UnmanagedType.LPWStr)] string name); [DllImport(PythonDll)] [return: MarshalAs(UnmanagedType.LPWStr)] - internal unsafe static extern string + internal static extern string Py_GetPythonHome(); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void Py_SetPythonHome([MarshalAs(UnmanagedType.LPWStr)] string home); [DllImport(PythonDll)] [return: MarshalAs(UnmanagedType.LPWStr)] - internal unsafe static extern string + internal static extern string Py_GetPath(); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void Py_SetPath([MarshalAs(UnmanagedType.LPWStr)] string home); #elif PYTHON2 [DllImport(PythonDll)] - internal unsafe static extern string + internal static extern string Py_GetProgramName(); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void Py_SetProgramName(string name); [DllImport(PythonDll)] - internal unsafe static extern string + internal static extern string Py_GetPythonHome(); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void Py_SetPythonHome(string home); [DllImport(PythonDll)] - internal unsafe static extern string + internal static extern string Py_GetPath(); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void Py_SetPath(string home); #endif [DllImport(PythonDll)] - internal unsafe static extern string + internal static extern string Py_GetVersion(); [DllImport(PythonDll)] - internal unsafe static extern string + internal static extern string Py_GetPlatform(); [DllImport(PythonDll)] - internal unsafe static extern string + internal static extern string Py_GetCopyright(); [DllImport(PythonDll)] - internal unsafe static extern string + internal static extern string Py_GetCompiler(); [DllImport(PythonDll)] - internal unsafe static extern string + internal static extern string Py_GetBuildInfo(); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyRun_SimpleString(string code); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyRun_String(string code, IntPtr st, IntPtr globals, IntPtr locals); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr Py_CompileString(string code, string file, IntPtr tok); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyImport_ExecCodeModule(string name, IntPtr code); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyCFunction_NewEx(IntPtr ml, IntPtr self, IntPtr mod); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyCFunction_Call(IntPtr func, IntPtr args, IntPtr kw); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyClass_New(IntPtr bases, IntPtr dict, IntPtr name); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyInstance_New(IntPtr cls, IntPtr args, IntPtr kw); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyInstance_NewRaw(IntPtr cls, IntPtr dict); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyMethod_New(IntPtr func, IntPtr self, IntPtr cls); @@ -831,7 +831,7 @@ internal unsafe static extern IntPtr /// designed to be lean and mean in IL & avoid managed <-> unmanaged /// transitions. Note that this does not incref the type object. /// - internal unsafe static IntPtr + internal static unsafe IntPtr PyObject_TYPE(IntPtr op) { void* p = (void*)op; @@ -859,7 +859,7 @@ internal unsafe static IntPtr /// This version avoids a managed <-> unmanaged transition. This one /// does incref the returned type object. /// - internal unsafe static IntPtr + internal static IntPtr PyObject_Type(IntPtr op) { IntPtr tp = PyObject_TYPE(op); @@ -875,56 +875,56 @@ internal static string PyObject_GetTypeName(IntPtr op) } [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyObject_HasAttrString(IntPtr pointer, string name); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyObject_GetAttrString(IntPtr pointer, string name); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyObject_SetAttrString(IntPtr pointer, string name, IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyObject_HasAttr(IntPtr pointer, IntPtr name); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyObject_GetAttr(IntPtr pointer, IntPtr name); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyObject_SetAttr(IntPtr pointer, IntPtr name, IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyObject_GetItem(IntPtr pointer, IntPtr key); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyObject_SetItem(IntPtr pointer, IntPtr key, IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyObject_DelItem(IntPtr pointer, IntPtr key); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyObject_GetIter(IntPtr op); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyObject_Call(IntPtr pointer, IntPtr args, IntPtr kw); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyObject_CallObject(IntPtr pointer, IntPtr args); #if PYTHON3 [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyObject_RichCompareBool(IntPtr value1, IntPtr value2, int opid); internal static int PyObject_Compare(IntPtr value1, IntPtr value2) @@ -953,59 +953,59 @@ internal static int PyObject_Compare(IntPtr value1, IntPtr value2) } #elif PYTHON2 [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyObject_Compare(IntPtr value1, IntPtr value2); #endif [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyObject_IsInstance(IntPtr ob, IntPtr type); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyObject_IsSubclass(IntPtr ob, IntPtr type); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyCallable_Check(IntPtr pointer); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyObject_IsTrue(IntPtr pointer); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyObject_Not(IntPtr pointer); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyObject_Size(IntPtr pointer); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyObject_Hash(IntPtr op); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyObject_Repr(IntPtr pointer); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyObject_Str(IntPtr pointer); #if PYTHON3 [DllImport(PythonDll, EntryPoint = "PyObject_Str")] - internal unsafe static extern IntPtr + internal static extern IntPtr PyObject_Unicode(IntPtr pointer); #elif PYTHON2 [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyObject_Unicode(IntPtr pointer); #endif [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyObject_Dir(IntPtr pointer); @@ -1015,26 +1015,26 @@ internal unsafe static extern IntPtr #if PYTHON3 [DllImport(PythonDll, EntryPoint = "PyNumber_Long")] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_Int(IntPtr ob); #elif PYTHON2 [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_Int(IntPtr ob); #endif [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_Long(IntPtr ob); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_Float(IntPtr ob); [DllImport(PythonDll)] - internal unsafe static extern bool + internal static extern bool PyNumber_Check(IntPtr ob); @@ -1062,36 +1062,36 @@ internal static IntPtr PyInt_FromInt64(long value) #if PYTHON3 [DllImport(PythonDll, EntryPoint = "PyLong_FromLong")] - private unsafe static extern IntPtr + private static extern IntPtr PyInt_FromLong(IntPtr value); [DllImport(PythonDll, EntryPoint = "PyLong_AsLong")] - internal unsafe static extern int + internal static extern int PyInt_AsLong(IntPtr value); [DllImport(PythonDll, EntryPoint = "PyLong_FromString")] - internal unsafe static extern IntPtr + internal static extern IntPtr PyInt_FromString(string value, IntPtr end, int radix); [DllImport(PythonDll, EntryPoint = "PyLong_GetMax")] - internal unsafe static extern int + internal static extern int PyInt_GetMax(); #elif PYTHON2 [DllImport(PythonDll)] - private unsafe static extern IntPtr + private static extern IntPtr PyInt_FromLong(IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyInt_AsLong(IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyInt_FromString(string value, IntPtr end, int radix); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyInt_GetMax(); #endif @@ -1101,43 +1101,43 @@ internal static bool PyLong_Check(IntPtr ob) } [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyLong_FromLong(long value); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyLong_FromUnsignedLong(uint value); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyLong_FromDouble(double value); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyLong_FromLongLong(long value); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyLong_FromUnsignedLongLong(ulong value); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyLong_FromString(string value, IntPtr end, int radix); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyLong_AsLong(IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern uint + internal static extern uint PyLong_AsUnsignedLong(IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern long + internal static extern long PyLong_AsLongLong(IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern ulong + internal static extern ulong PyLong_AsUnsignedLongLong(IntPtr value); @@ -1147,115 +1147,115 @@ internal static bool PyFloat_Check(IntPtr ob) } [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyFloat_FromDouble(double value); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyFloat_FromString(IntPtr value, IntPtr junk); [DllImport(PythonDll)] - internal unsafe static extern double + internal static extern double PyFloat_AsDouble(IntPtr ob); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_Add(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_Subtract(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_Multiply(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_Divide(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_And(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_Xor(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_Or(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_Lshift(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_Rshift(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_Power(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_Remainder(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_InPlaceAdd(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_InPlaceSubtract(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_InPlaceMultiply(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_InPlaceDivide(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_InPlaceAnd(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_InPlaceXor(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_InPlaceOr(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_InPlaceLshift(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_InPlaceRshift(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_InPlacePower(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_InPlaceRemainder(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_Negative(IntPtr o1); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_Positive(IntPtr o1); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyNumber_Invert(IntPtr o1); //==================================================================== @@ -1263,63 +1263,63 @@ internal unsafe static extern IntPtr //==================================================================== [DllImport(PythonDll)] - internal unsafe static extern bool + internal static extern bool PySequence_Check(IntPtr pointer); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PySequence_GetItem(IntPtr pointer, int index); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PySequence_SetItem(IntPtr pointer, int index, IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PySequence_DelItem(IntPtr pointer, int index); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PySequence_GetSlice(IntPtr pointer, int i1, int i2); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PySequence_SetSlice(IntPtr pointer, int i1, int i2, IntPtr v); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PySequence_DelSlice(IntPtr pointer, int i1, int i2); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PySequence_Size(IntPtr pointer); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PySequence_Contains(IntPtr pointer, IntPtr item); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PySequence_Concat(IntPtr pointer, IntPtr other); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PySequence_Repeat(IntPtr pointer, int count); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PySequence_Index(IntPtr pointer, IntPtr item); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PySequence_Count(IntPtr pointer, IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PySequence_Tuple(IntPtr pointer); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PySequence_List(IntPtr pointer); @@ -1345,11 +1345,11 @@ internal static IntPtr PyString_FromString(string value) #if PYTHON3 [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyBytes_FromString(string op); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyBytes_Size(IntPtr op); internal static IntPtr PyBytes_AS_STRING(IntPtr ob) @@ -1365,19 +1365,19 @@ int size ); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_FromStringAndSize(IntPtr value, int size); #elif PYTHON2 [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyString_FromStringAndSize(string value, int size); [DllImport(PythonDll, EntryPoint = "PyString_AsString")] - internal unsafe static extern IntPtr + internal static extern IntPtr PyString_AS_STRING(IntPtr op); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyString_Size(IntPtr pointer); #endif @@ -1388,15 +1388,15 @@ internal static bool PyUnicode_Check(IntPtr ob) #if UCS2 && PYTHON3 [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_FromObject(IntPtr ob); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); [DllImport(PythonDll, EntryPoint = "PyUnicode_FromKindAndData", CharSet = CharSet.Unicode)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_FromKindAndString(int kind, string s, int size); internal static IntPtr PyUnicode_FromUnicode(string s, int size) @@ -1405,51 +1405,51 @@ internal static IntPtr PyUnicode_FromUnicode(string s, int size) } [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyUnicode_GetSize(IntPtr ob); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS2 && PYTHON2 [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_FromObject")] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_FromObject(IntPtr ob); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_FromEncodedObject")] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_FromUnicode", CharSet = CharSet.Unicode)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_FromUnicode(string s, int size); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_GetSize")] - internal unsafe static extern int + internal static extern int PyUnicode_GetSize(IntPtr ob); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_AsUnicode")] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_FromOrdinal")] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS4 && PYTHON3 [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_FromObject(IntPtr ob); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); [DllImport(PythonDll, EntryPoint = "PyUnicode_FromKindAndData")] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_FromKindAndString( int kind, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrMarshaler))] string s, @@ -1462,42 +1462,42 @@ internal static IntPtr PyUnicode_FromUnicode(string s, int size) } [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyUnicode_GetSize(IntPtr ob); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS4 && PYTHON2 [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_FromObject")] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_FromObject(IntPtr ob); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_FromEncodedObject")] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_FromUnicode")] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_FromUnicode( [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrMarshaler))] string s, int size ); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_GetSize")] - internal unsafe static extern int + internal static extern int PyUnicode_GetSize(IntPtr ob); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_AsUnicode")] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_FromOrdinal")] - internal unsafe static extern IntPtr + internal static extern IntPtr PyUnicode_FromOrdinal(int c); #endif @@ -1557,67 +1557,67 @@ internal static bool PyDict_Check(IntPtr ob) } [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyDict_New(); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyDictProxy_New(IntPtr dict); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyDict_GetItem(IntPtr pointer, IntPtr key); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyDict_GetItemString(IntPtr pointer, string key); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyDict_SetItem(IntPtr pointer, IntPtr key, IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyDict_SetItemString(IntPtr pointer, string key, IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyDict_DelItem(IntPtr pointer, IntPtr key); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyDict_DelItemString(IntPtr pointer, string key); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyMapping_HasKey(IntPtr pointer, IntPtr key); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyDict_Keys(IntPtr pointer); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyDict_Values(IntPtr pointer); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyDict_Items(IntPtr pointer); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyDict_Copy(IntPtr pointer); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyDict_Update(IntPtr pointer, IntPtr other); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyDict_Clear(IntPtr pointer); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyDict_Size(IntPtr pointer); @@ -1631,47 +1631,47 @@ internal static bool PyList_Check(IntPtr ob) } [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyList_New(int size); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyList_AsTuple(IntPtr pointer); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyList_GetItem(IntPtr pointer, int index); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyList_SetItem(IntPtr pointer, int index, IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyList_Insert(IntPtr pointer, int index, IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyList_Append(IntPtr pointer, IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyList_Reverse(IntPtr pointer); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyList_Sort(IntPtr pointer); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyList_GetSlice(IntPtr pointer, int start, int end); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyList_SetSlice(IntPtr pointer, int start, int end, IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyList_Size(IntPtr pointer); @@ -1685,23 +1685,23 @@ internal static bool PyTuple_Check(IntPtr ob) } [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyTuple_New(int size); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyTuple_GetItem(IntPtr pointer, int index); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyTuple_SetItem(IntPtr pointer, int index, IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyTuple_GetSlice(IntPtr pointer, int start, int end); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyTuple_Size(IntPtr pointer); @@ -1711,7 +1711,7 @@ internal unsafe static extern int #if PYTHON2 [DllImport(PythonDll)] - internal unsafe static extern bool + internal static extern bool PyIter_Check(IntPtr pointer); #elif PYTHON3 internal static bool @@ -1724,7 +1724,7 @@ internal static bool #endif [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyIter_Next(IntPtr pointer); //==================================================================== @@ -1732,50 +1732,50 @@ internal unsafe static extern IntPtr //==================================================================== [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyModule_New(string name); [DllImport(PythonDll)] - internal unsafe static extern string + internal static extern string PyModule_GetName(IntPtr module); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyModule_GetDict(IntPtr module); [DllImport(PythonDll)] - internal unsafe static extern string + internal static extern string PyModule_GetFilename(IntPtr module); #if PYTHON3 [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyModule_Create2(IntPtr module, int apiver); #endif [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyImport_Import(IntPtr name); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyImport_ImportModule(string name); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyImport_ReloadModule(IntPtr module); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyImport_AddModule(string name); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyImport_GetModuleDict(); #if PYTHON3 [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PySys_SetArgvEx( int argc, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrArrayMarshaler))] string[] argv, @@ -1783,7 +1783,7 @@ int updatepath ); #elif PYTHON2 [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PySys_SetArgvEx( int argc, string[] argv, @@ -1792,11 +1792,11 @@ int updatepath #endif [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PySys_GetObject(string name); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PySys_SetObject(string name, IntPtr ob); @@ -1810,11 +1810,11 @@ internal static bool PyType_Check(IntPtr ob) } [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyType_Modified(IntPtr type); [DllImport(PythonDll)] - internal unsafe static extern bool + internal static extern bool PyType_IsSubtype(IntPtr t1, IntPtr t2); internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) @@ -1824,47 +1824,47 @@ internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) } [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyType_GenericNew(IntPtr type, IntPtr args, IntPtr kw); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyType_GenericAlloc(IntPtr type, int n); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyType_Ready(IntPtr type); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr _PyType_Lookup(IntPtr type, IntPtr name); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyObject_GenericGetAttr(IntPtr obj, IntPtr name); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyObject_GenericSetAttr(IntPtr obj, IntPtr name, IntPtr value); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr _PyObject_GetDictPtr(IntPtr obj); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyObject_GC_New(IntPtr tp); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyObject_GC_Del(IntPtr tp); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyObject_GC_Track(IntPtr tp); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyObject_GC_UnTrack(IntPtr tp); @@ -1873,15 +1873,15 @@ internal unsafe static extern void //==================================================================== [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyMem_Malloc(int size); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyMem_Realloc(IntPtr ptr, int size); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyMem_Free(IntPtr ptr); @@ -1890,51 +1890,51 @@ internal unsafe static extern void //==================================================================== [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyErr_SetString(IntPtr ob, string message); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyErr_SetObject(IntPtr ob, IntPtr message); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyErr_SetFromErrno(IntPtr ob); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyErr_SetNone(IntPtr ob); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyErr_ExceptionMatches(IntPtr exception); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyErr_GivenExceptionMatches(IntPtr ob, IntPtr val); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyErr_NormalizeException(IntPtr ob, IntPtr val, IntPtr tb); [DllImport(PythonDll)] - internal unsafe static extern int + internal static extern int PyErr_Occurred(); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyErr_Fetch(ref IntPtr ob, ref IntPtr val, ref IntPtr tb); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyErr_Restore(IntPtr ob, IntPtr val, IntPtr tb); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyErr_Clear(); [DllImport(PythonDll)] - internal unsafe static extern void + internal static extern void PyErr_Print(); @@ -1943,11 +1943,11 @@ internal unsafe static extern void //==================================================================== [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyMethod_Self(IntPtr ob); [DllImport(PythonDll)] - internal unsafe static extern IntPtr + internal static extern IntPtr PyMethod_Function(IntPtr ob); } } From 59733ea15c1a4c66ab59d2bed7c5738ecb88c3e3 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 27 Feb 2017 22:59:52 -0700 Subject: [PATCH 205/324] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ec2a0fb3..f4f9a4e29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Added `tox` for local testing (#345) - Added `requirements.txt` - Added to `PythonEngine` methods `Eval` and `Exec` (#389) +- Added implementations of `ICustomMarshal` (#407) ### Changed From 46660fafb62c0b1fecdf4bc9dc592a8a5fcdf2d8 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 27 Feb 2017 23:25:42 -0700 Subject: [PATCH 206/324] Add Runtime.CheckExceptionOccurred(...) Helps refactor exceptions checks --- src/runtime/pytuple.cs | 20 +++++++------------- src/runtime/runtime.cs | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/runtime/pytuple.cs b/src/runtime/pytuple.cs index b3fb95733..45f3d8350 100644 --- a/src/runtime/pytuple.cs +++ b/src/runtime/pytuple.cs @@ -51,10 +51,7 @@ public PyTuple(PyObject o) public PyTuple() { obj = Runtime.PyTuple_New(0); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } @@ -63,6 +60,9 @@ public PyTuple() /// /// /// Creates a new PyTuple from an array of PyObject instances. + /// + /// See caveats about PyTuple_SetItem: + /// https://www.coursehero.com/file/p4j2ogg/important-exceptions-to-this-rule-PyTupleSetItem-and-PyListSetItem-These/ /// public PyTuple(PyObject[] items) { @@ -72,11 +72,8 @@ public PyTuple(PyObject[] items) { IntPtr ptr = items[i].obj; Runtime.XIncref(ptr); - int r = Runtime.PyTuple_SetItem(obj, i, ptr); - if (r < 0) - { - throw new PythonException(); - } + Runtime.PyTuple_SetItem(obj, i, ptr); + Runtime.CheckExceptionOccurred(); } } @@ -104,10 +101,7 @@ public static bool IsTupleType(PyObject value) public static PyTuple AsTuple(PyObject value) { IntPtr op = Runtime.PySequence_Tuple(value.obj); - if (op == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); return new PyTuple(op); } } diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 5287ead92..0b3c429e0 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -384,6 +384,21 @@ internal static int AtExit() internal static IntPtr PyNone; internal static IntPtr Error; + /// + /// Check if any Python Exceptions occurred. + /// If any exist throw new PythonException. + /// + /// + /// Can be used instead of `obj == IntPtr.Zero` for example. + /// + internal static void CheckExceptionOccurred() + { + if (PyErr_Occurred() != 0) + { + throw new PythonException(); + } + } + internal static IntPtr GetBoundArgTuple(IntPtr obj, IntPtr args) { if (Runtime.PyObject_TYPE(args) != Runtime.PyTupleType) From 4616921fa693e396664f21ca3132358e0c06fe96 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 27 Feb 2017 23:27:02 -0700 Subject: [PATCH 207/324] Replace Py.Throw with Runtime.CheckExceptionOccurred --- src/runtime/pythonengine.cs | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index 57f6d5074..eb6f9fa4d 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -362,7 +362,7 @@ public static void EndAllowThreads(IntPtr ts) public static PyObject ImportModule(string name) { IntPtr op = Runtime.PyImport_ImportModule(name); - Py.Throw(); + Runtime.CheckExceptionOccurred(); return new PyObject(op); } @@ -377,7 +377,7 @@ public static PyObject ImportModule(string name) public static PyObject ReloadModule(PyObject module) { IntPtr op = Runtime.PyImport_ReloadModule(module.Handle); - Py.Throw(); + Runtime.CheckExceptionOccurred(); return new PyObject(op); } @@ -392,9 +392,9 @@ public static PyObject ReloadModule(PyObject module) public static PyObject ModuleFromString(string name, string code) { IntPtr c = Runtime.Py_CompileString(code, "none", (IntPtr)257); - Py.Throw(); + Runtime.CheckExceptionOccurred(); IntPtr m = Runtime.PyImport_ExecCodeModule(name, c); - Py.Throw(); + Runtime.CheckExceptionOccurred(); return new PyObject(m); } @@ -473,7 +473,7 @@ public static PyObject RunString( code, flag, globals.Value, locals.Value ); - Py.Throw(); + Runtime.CheckExceptionOccurred(); return new PyObject(result); } @@ -600,18 +600,7 @@ public static void SetArgv(IEnumerable argv) { string[] arr = argv.ToArray(); Runtime.PySys_SetArgvEx(arr.Length, arr, 0); - Py.Throw(); - } - } - - internal static void Throw() - { - using (GIL()) - { - if (Runtime.PyErr_Occurred() != 0) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } } } From 6095de8c997661a29c9e8ac60ab5605a3639e83f Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 28 Feb 2017 02:43:59 -0700 Subject: [PATCH 208/324] Whitespace clean-up Runtime --- src/runtime/runtime.cs | 846 ++++++++++++++--------------------------- 1 file changed, 292 insertions(+), 554 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 0b3c429e0..5ec66150d 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -163,7 +163,7 @@ public class Runtime #endif // set to true when python is finalizing - internal static Object IsFinalizingLock = new Object(); + internal static object IsFinalizingLock = new object(); internal static bool IsFinalizing = false; internal static bool Is32Bit; @@ -599,242 +599,190 @@ internal static unsafe long Refcount(IntPtr op) // Py_IncRef and Py_DecRef are taking care of the extra payload // in Py_DEBUG builds of Python like _Py_RefTotal [DllImport(PythonDll)] - private static extern void - Py_IncRef(IntPtr ob); + private static extern void Py_IncRef(IntPtr ob); [DllImport(PythonDll)] - private static extern void - Py_DecRef(IntPtr ob); + private static extern void Py_DecRef(IntPtr ob); #endif [DllImport(PythonDll)] - internal static extern void - Py_Initialize(); + internal static extern void Py_Initialize(); [DllImport(PythonDll)] - internal static extern int - Py_IsInitialized(); + internal static extern int Py_IsInitialized(); [DllImport(PythonDll)] - internal static extern void - Py_Finalize(); + internal static extern void Py_Finalize(); [DllImport(PythonDll)] - internal static extern IntPtr - Py_NewInterpreter(); + internal static extern IntPtr Py_NewInterpreter(); [DllImport(PythonDll)] - internal static extern void - Py_EndInterpreter(IntPtr threadState); + internal static extern void Py_EndInterpreter(IntPtr threadState); [DllImport(PythonDll)] - internal static extern IntPtr - PyThreadState_New(IntPtr istate); + internal static extern IntPtr PyThreadState_New(IntPtr istate); [DllImport(PythonDll)] - internal static extern IntPtr - PyThreadState_Get(); + internal static extern IntPtr PyThreadState_Get(); [DllImport(PythonDll)] - internal static extern IntPtr - PyThread_get_key_value(IntPtr key); + internal static extern IntPtr PyThread_get_key_value(IntPtr key); [DllImport(PythonDll)] - internal static extern int - PyThread_get_thread_ident(); + internal static extern int PyThread_get_thread_ident(); [DllImport(PythonDll)] - internal static extern int - PyThread_set_key_value(IntPtr key, IntPtr value); + internal static extern int PyThread_set_key_value(IntPtr key, IntPtr value); [DllImport(PythonDll)] - internal static extern IntPtr - PyThreadState_Swap(IntPtr key); - + internal static extern IntPtr PyThreadState_Swap(IntPtr key); [DllImport(PythonDll)] - internal static extern IntPtr - PyGILState_Ensure(); + internal static extern IntPtr PyGILState_Ensure(); [DllImport(PythonDll)] - internal static extern void - PyGILState_Release(IntPtr gs); + internal static extern void PyGILState_Release(IntPtr gs); [DllImport(PythonDll)] - internal static extern IntPtr - PyGILState_GetThisThreadState(); + internal static extern IntPtr PyGILState_GetThisThreadState(); #if PYTHON3 [DllImport(PythonDll)] - public static extern int - Py_Main( - int argc, - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrArrayMarshaler))] string[] argv - ); + public static extern int Py_Main( + int argc, + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrArrayMarshaler))] string[] argv + ); #elif PYTHON2 [DllImport(PythonDll)] - public static extern int - Py_Main(int argc, string[] argv); + public static extern int Py_Main(int argc, string[] argv); #endif [DllImport(PythonDll)] - internal static extern void - PyEval_InitThreads(); + internal static extern void PyEval_InitThreads(); [DllImport(PythonDll)] - internal static extern int - PyEval_ThreadsInitialized(); + internal static extern int PyEval_ThreadsInitialized(); [DllImport(PythonDll)] - internal static extern void - PyEval_AcquireLock(); + internal static extern void PyEval_AcquireLock(); [DllImport(PythonDll)] - internal static extern void - PyEval_ReleaseLock(); + internal static extern void PyEval_ReleaseLock(); [DllImport(PythonDll)] - internal static extern void - PyEval_AcquireThread(IntPtr tstate); + internal static extern void PyEval_AcquireThread(IntPtr tstate); [DllImport(PythonDll)] - internal static extern void - PyEval_ReleaseThread(IntPtr tstate); + internal static extern void PyEval_ReleaseThread(IntPtr tstate); [DllImport(PythonDll)] - internal static extern IntPtr - PyEval_SaveThread(); + internal static extern IntPtr PyEval_SaveThread(); [DllImport(PythonDll)] - internal static extern void - PyEval_RestoreThread(IntPtr tstate); + internal static extern void PyEval_RestoreThread(IntPtr tstate); [DllImport(PythonDll)] - internal static extern IntPtr - PyEval_GetBuiltins(); + internal static extern IntPtr PyEval_GetBuiltins(); [DllImport(PythonDll)] - internal static extern IntPtr - PyEval_GetGlobals(); + internal static extern IntPtr PyEval_GetGlobals(); [DllImport(PythonDll)] - internal static extern IntPtr - PyEval_GetLocals(); - + internal static extern IntPtr PyEval_GetLocals(); #if PYTHON3 [DllImport(PythonDll)] [return: MarshalAs(UnmanagedType.LPWStr)] - internal static extern string - Py_GetProgramName(); + internal static extern string Py_GetProgramName(); [DllImport(PythonDll)] - internal static extern void - Py_SetProgramName([MarshalAs(UnmanagedType.LPWStr)] string name); + internal static extern void Py_SetProgramName( + [MarshalAs(UnmanagedType.LPWStr)] string name + ); [DllImport(PythonDll)] [return: MarshalAs(UnmanagedType.LPWStr)] - internal static extern string - Py_GetPythonHome(); + internal static extern string Py_GetPythonHome(); [DllImport(PythonDll)] - internal static extern void - Py_SetPythonHome([MarshalAs(UnmanagedType.LPWStr)] string home); + internal static extern void Py_SetPythonHome( + [MarshalAs(UnmanagedType.LPWStr)] string home + ); [DllImport(PythonDll)] [return: MarshalAs(UnmanagedType.LPWStr)] - internal static extern string - Py_GetPath(); + internal static extern string Py_GetPath(); [DllImport(PythonDll)] - internal static extern void - Py_SetPath([MarshalAs(UnmanagedType.LPWStr)] string home); + internal static extern void Py_SetPath( + [MarshalAs(UnmanagedType.LPWStr)] string home + ); #elif PYTHON2 [DllImport(PythonDll)] - internal static extern string - Py_GetProgramName(); + internal static extern string Py_GetProgramName(); [DllImport(PythonDll)] - internal static extern void - Py_SetProgramName(string name); + internal static extern void Py_SetProgramName(string name); [DllImport(PythonDll)] - internal static extern string - Py_GetPythonHome(); + internal static extern string Py_GetPythonHome(); [DllImport(PythonDll)] - internal static extern void - Py_SetPythonHome(string home); + internal static extern void Py_SetPythonHome(string home); [DllImport(PythonDll)] - internal static extern string - Py_GetPath(); + internal static extern string Py_GetPath(); [DllImport(PythonDll)] - internal static extern void - Py_SetPath(string home); + internal static extern void Py_SetPath(string home); #endif [DllImport(PythonDll)] - internal static extern string - Py_GetVersion(); + internal static extern string Py_GetVersion(); [DllImport(PythonDll)] - internal static extern string - Py_GetPlatform(); + internal static extern string Py_GetPlatform(); [DllImport(PythonDll)] - internal static extern string - Py_GetCopyright(); + internal static extern string Py_GetCopyright(); [DllImport(PythonDll)] - internal static extern string - Py_GetCompiler(); + internal static extern string Py_GetCompiler(); [DllImport(PythonDll)] - internal static extern string - Py_GetBuildInfo(); + internal static extern string Py_GetBuildInfo(); [DllImport(PythonDll)] - internal static extern int - PyRun_SimpleString(string code); + internal static extern int PyRun_SimpleString(string code); [DllImport(PythonDll)] - internal static extern IntPtr - PyRun_String(string code, IntPtr st, IntPtr globals, IntPtr locals); + internal static extern IntPtr PyRun_String(string code, IntPtr st, IntPtr globals, IntPtr locals); [DllImport(PythonDll)] - internal static extern IntPtr - Py_CompileString(string code, string file, IntPtr tok); + internal static extern IntPtr Py_CompileString(string code, string file, IntPtr tok); [DllImport(PythonDll)] - internal static extern IntPtr - PyImport_ExecCodeModule(string name, IntPtr code); + internal static extern IntPtr PyImport_ExecCodeModule(string name, IntPtr code); [DllImport(PythonDll)] - internal static extern IntPtr - PyCFunction_NewEx(IntPtr ml, IntPtr self, IntPtr mod); + internal static extern IntPtr PyCFunction_NewEx(IntPtr ml, IntPtr self, IntPtr mod); [DllImport(PythonDll)] - internal static extern IntPtr - PyCFunction_Call(IntPtr func, IntPtr args, IntPtr kw); + internal static extern IntPtr PyCFunction_Call(IntPtr func, IntPtr args, IntPtr kw); [DllImport(PythonDll)] - internal static extern IntPtr - PyClass_New(IntPtr bases, IntPtr dict, IntPtr name); + internal static extern IntPtr PyClass_New(IntPtr bases, IntPtr dict, IntPtr name); [DllImport(PythonDll)] - internal static extern IntPtr - PyInstance_New(IntPtr cls, IntPtr args, IntPtr kw); + internal static extern IntPtr PyInstance_New(IntPtr cls, IntPtr args, IntPtr kw); [DllImport(PythonDll)] - internal static extern IntPtr - PyInstance_NewRaw(IntPtr cls, IntPtr dict); + internal static extern IntPtr PyInstance_NewRaw(IntPtr cls, IntPtr dict); [DllImport(PythonDll)] - internal static extern IntPtr - PyMethod_New(IntPtr func, IntPtr self, IntPtr cls); + internal static extern IntPtr PyMethod_New(IntPtr func, IntPtr self, IntPtr cls); //==================================================================== @@ -846,8 +794,7 @@ internal static extern IntPtr /// designed to be lean and mean in IL & avoid managed <-> unmanaged /// transitions. Note that this does not incref the type object. /// - internal static unsafe IntPtr - PyObject_TYPE(IntPtr op) + internal static unsafe IntPtr PyObject_TYPE(IntPtr op) { void* p = (void*)op; if ((void*)0 == p) @@ -874,8 +821,7 @@ internal static unsafe IntPtr /// This version avoids a managed <-> unmanaged transition. This one /// does incref the returned type object. /// - internal static IntPtr - PyObject_Type(IntPtr op) + internal static IntPtr PyObject_Type(IntPtr op) { IntPtr tp = PyObject_TYPE(op); Runtime.XIncref(tp); @@ -890,57 +836,44 @@ internal static string PyObject_GetTypeName(IntPtr op) } [DllImport(PythonDll)] - internal static extern int - PyObject_HasAttrString(IntPtr pointer, string name); + internal static extern int PyObject_HasAttrString(IntPtr pointer, string name); [DllImport(PythonDll)] - internal static extern IntPtr - PyObject_GetAttrString(IntPtr pointer, string name); + internal static extern IntPtr PyObject_GetAttrString(IntPtr pointer, string name); [DllImport(PythonDll)] - internal static extern int - PyObject_SetAttrString(IntPtr pointer, string name, IntPtr value); + internal static extern int PyObject_SetAttrString(IntPtr pointer, string name, IntPtr value); [DllImport(PythonDll)] - internal static extern int - PyObject_HasAttr(IntPtr pointer, IntPtr name); + internal static extern int PyObject_HasAttr(IntPtr pointer, IntPtr name); [DllImport(PythonDll)] - internal static extern IntPtr - PyObject_GetAttr(IntPtr pointer, IntPtr name); + internal static extern IntPtr PyObject_GetAttr(IntPtr pointer, IntPtr name); [DllImport(PythonDll)] - internal static extern int - PyObject_SetAttr(IntPtr pointer, IntPtr name, IntPtr value); + internal static extern int PyObject_SetAttr(IntPtr pointer, IntPtr name, IntPtr value); [DllImport(PythonDll)] - internal static extern IntPtr - PyObject_GetItem(IntPtr pointer, IntPtr key); + internal static extern IntPtr PyObject_GetItem(IntPtr pointer, IntPtr key); [DllImport(PythonDll)] - internal static extern int - PyObject_SetItem(IntPtr pointer, IntPtr key, IntPtr value); + internal static extern int PyObject_SetItem(IntPtr pointer, IntPtr key, IntPtr value); [DllImport(PythonDll)] - internal static extern int - PyObject_DelItem(IntPtr pointer, IntPtr key); + internal static extern int PyObject_DelItem(IntPtr pointer, IntPtr key); [DllImport(PythonDll)] - internal static extern IntPtr - PyObject_GetIter(IntPtr op); + internal static extern IntPtr PyObject_GetIter(IntPtr op); [DllImport(PythonDll)] - internal static extern IntPtr - PyObject_Call(IntPtr pointer, IntPtr args, IntPtr kw); + internal static extern IntPtr PyObject_Call(IntPtr pointer, IntPtr args, IntPtr kw); [DllImport(PythonDll)] - internal static extern IntPtr - PyObject_CallObject(IntPtr pointer, IntPtr args); + internal static extern IntPtr PyObject_CallObject(IntPtr pointer, IntPtr args); #if PYTHON3 [DllImport(PythonDll)] - internal static extern int - PyObject_RichCompareBool(IntPtr value1, IntPtr value2, int opid); + internal static extern int PyObject_RichCompareBool(IntPtr value1, IntPtr value2, int opid); internal static int PyObject_Compare(IntPtr value1, IntPtr value2) { @@ -968,60 +901,46 @@ internal static int PyObject_Compare(IntPtr value1, IntPtr value2) } #elif PYTHON2 [DllImport(PythonDll)] - internal static extern int - PyObject_Compare(IntPtr value1, IntPtr value2); + internal static extern int PyObject_Compare(IntPtr value1, IntPtr value2); #endif - [DllImport(PythonDll)] - internal static extern int - PyObject_IsInstance(IntPtr ob, IntPtr type); + internal static extern int PyObject_IsInstance(IntPtr ob, IntPtr type); [DllImport(PythonDll)] - internal static extern int - PyObject_IsSubclass(IntPtr ob, IntPtr type); + internal static extern int PyObject_IsSubclass(IntPtr ob, IntPtr type); [DllImport(PythonDll)] - internal static extern int - PyCallable_Check(IntPtr pointer); + internal static extern int PyCallable_Check(IntPtr pointer); [DllImport(PythonDll)] - internal static extern int - PyObject_IsTrue(IntPtr pointer); + internal static extern int PyObject_IsTrue(IntPtr pointer); [DllImport(PythonDll)] - internal static extern int - PyObject_Not(IntPtr pointer); + internal static extern int PyObject_Not(IntPtr pointer); [DllImport(PythonDll)] - internal static extern int - PyObject_Size(IntPtr pointer); + internal static extern int PyObject_Size(IntPtr pointer); [DllImport(PythonDll)] - internal static extern IntPtr - PyObject_Hash(IntPtr op); + internal static extern IntPtr PyObject_Hash(IntPtr op); [DllImport(PythonDll)] - internal static extern IntPtr - PyObject_Repr(IntPtr pointer); + internal static extern IntPtr PyObject_Repr(IntPtr pointer); [DllImport(PythonDll)] - internal static extern IntPtr - PyObject_Str(IntPtr pointer); + internal static extern IntPtr PyObject_Str(IntPtr pointer); #if PYTHON3 [DllImport(PythonDll, EntryPoint = "PyObject_Str")] - internal static extern IntPtr - PyObject_Unicode(IntPtr pointer); + internal static extern IntPtr PyObject_Unicode(IntPtr pointer); #elif PYTHON2 [DllImport(PythonDll)] - internal static extern IntPtr - PyObject_Unicode(IntPtr pointer); + internal static extern IntPtr PyObject_Unicode(IntPtr pointer); #endif [DllImport(PythonDll)] - internal static extern IntPtr - PyObject_Dir(IntPtr pointer); + internal static extern IntPtr PyObject_Dir(IntPtr pointer); //==================================================================== @@ -1030,28 +949,20 @@ internal static extern IntPtr #if PYTHON3 [DllImport(PythonDll, EntryPoint = "PyNumber_Long")] - internal static extern IntPtr - PyNumber_Int(IntPtr ob); + internal static extern IntPtr PyNumber_Int(IntPtr ob); #elif PYTHON2 - [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_Int(IntPtr ob); + internal static extern IntPtr PyNumber_Int(IntPtr ob); #endif [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_Long(IntPtr ob); + internal static extern IntPtr PyNumber_Long(IntPtr ob); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_Float(IntPtr ob); - + internal static extern IntPtr PyNumber_Float(IntPtr ob); [DllImport(PythonDll)] - internal static extern bool - PyNumber_Check(IntPtr ob); - + internal static extern bool PyNumber_Check(IntPtr ob); internal static bool PyInt_Check(IntPtr ob) { @@ -1077,37 +988,28 @@ internal static IntPtr PyInt_FromInt64(long value) #if PYTHON3 [DllImport(PythonDll, EntryPoint = "PyLong_FromLong")] - private static extern IntPtr - PyInt_FromLong(IntPtr value); + private static extern IntPtr PyInt_FromLong(IntPtr value); [DllImport(PythonDll, EntryPoint = "PyLong_AsLong")] - internal static extern int - PyInt_AsLong(IntPtr value); + internal static extern int PyInt_AsLong(IntPtr value); [DllImport(PythonDll, EntryPoint = "PyLong_FromString")] - internal static extern IntPtr - PyInt_FromString(string value, IntPtr end, int radix); + internal static extern IntPtr PyInt_FromString(string value, IntPtr end, int radix); [DllImport(PythonDll, EntryPoint = "PyLong_GetMax")] - internal static extern int - PyInt_GetMax(); + internal static extern int PyInt_GetMax(); #elif PYTHON2 - [DllImport(PythonDll)] - private static extern IntPtr - PyInt_FromLong(IntPtr value); + private static extern IntPtr PyInt_FromLong(IntPtr value); [DllImport(PythonDll)] - internal static extern int - PyInt_AsLong(IntPtr value); + internal static extern int PyInt_AsLong(IntPtr value); [DllImport(PythonDll)] - internal static extern IntPtr - PyInt_FromString(string value, IntPtr end, int radix); + internal static extern IntPtr PyInt_FromString(string value, IntPtr end, int radix); [DllImport(PythonDll)] - internal static extern int - PyInt_GetMax(); + internal static extern int PyInt_GetMax(); #endif internal static bool PyLong_Check(IntPtr ob) @@ -1116,45 +1018,34 @@ internal static bool PyLong_Check(IntPtr ob) } [DllImport(PythonDll)] - internal static extern IntPtr - PyLong_FromLong(long value); + internal static extern IntPtr PyLong_FromLong(long value); [DllImport(PythonDll)] - internal static extern IntPtr - PyLong_FromUnsignedLong(uint value); + internal static extern IntPtr PyLong_FromUnsignedLong(uint value); [DllImport(PythonDll)] - internal static extern IntPtr - PyLong_FromDouble(double value); + internal static extern IntPtr PyLong_FromDouble(double value); [DllImport(PythonDll)] - internal static extern IntPtr - PyLong_FromLongLong(long value); + internal static extern IntPtr PyLong_FromLongLong(long value); [DllImport(PythonDll)] - internal static extern IntPtr - PyLong_FromUnsignedLongLong(ulong value); + internal static extern IntPtr PyLong_FromUnsignedLongLong(ulong value); [DllImport(PythonDll)] - internal static extern IntPtr - PyLong_FromString(string value, IntPtr end, int radix); + internal static extern IntPtr PyLong_FromString(string value, IntPtr end, int radix); [DllImport(PythonDll)] - internal static extern int - PyLong_AsLong(IntPtr value); + internal static extern int PyLong_AsLong(IntPtr value); [DllImport(PythonDll)] - internal static extern uint - PyLong_AsUnsignedLong(IntPtr value); + internal static extern uint PyLong_AsUnsignedLong(IntPtr value); [DllImport(PythonDll)] - internal static extern long - PyLong_AsLongLong(IntPtr value); + internal static extern long PyLong_AsLongLong(IntPtr value); [DllImport(PythonDll)] - internal static extern ulong - PyLong_AsUnsignedLongLong(IntPtr value); - + internal static extern ulong PyLong_AsUnsignedLongLong(IntPtr value); internal static bool PyFloat_Check(IntPtr ob) { @@ -1162,180 +1053,138 @@ internal static bool PyFloat_Check(IntPtr ob) } [DllImport(PythonDll)] - internal static extern IntPtr - PyFloat_FromDouble(double value); + internal static extern IntPtr PyFloat_FromDouble(double value); [DllImport(PythonDll)] - internal static extern IntPtr - PyFloat_FromString(IntPtr value, IntPtr junk); + internal static extern IntPtr PyFloat_FromString(IntPtr value, IntPtr junk); [DllImport(PythonDll)] - internal static extern double - PyFloat_AsDouble(IntPtr ob); + internal static extern double PyFloat_AsDouble(IntPtr ob); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_Add(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_Add(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_Subtract(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_Subtract(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_Multiply(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_Multiply(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_Divide(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_Divide(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_And(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_And(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_Xor(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_Xor(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_Or(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_Or(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_Lshift(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_Lshift(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_Rshift(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_Rshift(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_Power(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_Power(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_Remainder(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_Remainder(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_InPlaceAdd(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_InPlaceAdd(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_InPlaceSubtract(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_InPlaceSubtract(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_InPlaceMultiply(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_InPlaceMultiply(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_InPlaceDivide(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_InPlaceDivide(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_InPlaceAnd(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_InPlaceAnd(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_InPlaceXor(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_InPlaceXor(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_InPlaceOr(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_InPlaceOr(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_InPlaceLshift(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_InPlaceLshift(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_InPlaceRshift(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_InPlaceRshift(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_InPlacePower(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_InPlacePower(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_InPlaceRemainder(IntPtr o1, IntPtr o2); + internal static extern IntPtr PyNumber_InPlaceRemainder(IntPtr o1, IntPtr o2); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_Negative(IntPtr o1); + internal static extern IntPtr PyNumber_Negative(IntPtr o1); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_Positive(IntPtr o1); + internal static extern IntPtr PyNumber_Positive(IntPtr o1); [DllImport(PythonDll)] - internal static extern IntPtr - PyNumber_Invert(IntPtr o1); + internal static extern IntPtr PyNumber_Invert(IntPtr o1); + //==================================================================== // Python sequence API //==================================================================== [DllImport(PythonDll)] - internal static extern bool - PySequence_Check(IntPtr pointer); + internal static extern bool PySequence_Check(IntPtr pointer); [DllImport(PythonDll)] - internal static extern IntPtr - PySequence_GetItem(IntPtr pointer, int index); + internal static extern IntPtr PySequence_GetItem(IntPtr pointer, int index); [DllImport(PythonDll)] - internal static extern int - PySequence_SetItem(IntPtr pointer, int index, IntPtr value); + internal static extern int PySequence_SetItem(IntPtr pointer, int index, IntPtr value); [DllImport(PythonDll)] - internal static extern int - PySequence_DelItem(IntPtr pointer, int index); + internal static extern int PySequence_DelItem(IntPtr pointer, int index); [DllImport(PythonDll)] - internal static extern IntPtr - PySequence_GetSlice(IntPtr pointer, int i1, int i2); + internal static extern IntPtr PySequence_GetSlice(IntPtr pointer, int i1, int i2); [DllImport(PythonDll)] - internal static extern int - PySequence_SetSlice(IntPtr pointer, int i1, int i2, IntPtr v); + internal static extern int PySequence_SetSlice(IntPtr pointer, int i1, int i2, IntPtr v); [DllImport(PythonDll)] - internal static extern int - PySequence_DelSlice(IntPtr pointer, int i1, int i2); + internal static extern int PySequence_DelSlice(IntPtr pointer, int i1, int i2); [DllImport(PythonDll)] - internal static extern int - PySequence_Size(IntPtr pointer); + internal static extern int PySequence_Size(IntPtr pointer); [DllImport(PythonDll)] - internal static extern int - PySequence_Contains(IntPtr pointer, IntPtr item); + internal static extern int PySequence_Contains(IntPtr pointer, IntPtr item); [DllImport(PythonDll)] - internal static extern IntPtr - PySequence_Concat(IntPtr pointer, IntPtr other); + internal static extern IntPtr PySequence_Concat(IntPtr pointer, IntPtr other); [DllImport(PythonDll)] - internal static extern IntPtr - PySequence_Repeat(IntPtr pointer, int count); + internal static extern IntPtr PySequence_Repeat(IntPtr pointer, int count); [DllImport(PythonDll)] - internal static extern int - PySequence_Index(IntPtr pointer, IntPtr item); + internal static extern int PySequence_Index(IntPtr pointer, IntPtr item); [DllImport(PythonDll)] - internal static extern int - PySequence_Count(IntPtr pointer, IntPtr value); + internal static extern int PySequence_Count(IntPtr pointer, IntPtr value); [DllImport(PythonDll)] - internal static extern IntPtr - PySequence_Tuple(IntPtr pointer); + internal static extern IntPtr PySequence_Tuple(IntPtr pointer); [DllImport(PythonDll)] - internal static extern IntPtr - PySequence_List(IntPtr pointer); + internal static extern IntPtr PySequence_List(IntPtr pointer); //==================================================================== @@ -1360,12 +1209,10 @@ internal static IntPtr PyString_FromString(string value) #if PYTHON3 [DllImport(PythonDll)] - internal static extern IntPtr - PyBytes_FromString(string op); + internal static extern IntPtr PyBytes_FromString(string op); [DllImport(PythonDll)] - internal static extern int - PyBytes_Size(IntPtr op); + internal static extern int PyBytes_Size(IntPtr op); internal static IntPtr PyBytes_AS_STRING(IntPtr ob) { @@ -1373,27 +1220,22 @@ internal static IntPtr PyBytes_AS_STRING(IntPtr ob) } [DllImport(PythonDll, EntryPoint = "PyUnicode_FromStringAndSize")] - internal static extern IntPtr - PyString_FromStringAndSize( - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Utf8Marshaler))] string value, - int size - ); + internal static extern IntPtr PyString_FromStringAndSize( + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Utf8Marshaler))] string value, + int size + ); [DllImport(PythonDll)] - internal static extern IntPtr - PyUnicode_FromStringAndSize(IntPtr value, int size); + internal static extern IntPtr PyUnicode_FromStringAndSize(IntPtr value, int size); #elif PYTHON2 [DllImport(PythonDll)] - internal static extern IntPtr - PyString_FromStringAndSize(string value, int size); + internal static extern IntPtr PyString_FromStringAndSize(string value, int size); [DllImport(PythonDll, EntryPoint = "PyString_AsString")] - internal static extern IntPtr - PyString_AS_STRING(IntPtr op); + internal static extern IntPtr PyString_AS_STRING(IntPtr op); [DllImport(PythonDll)] - internal static extern int - PyString_Size(IntPtr pointer); + internal static extern int PyString_Size(IntPtr pointer); #endif internal static bool PyUnicode_Check(IntPtr ob) @@ -1403,16 +1245,13 @@ internal static bool PyUnicode_Check(IntPtr ob) #if UCS2 && PYTHON3 [DllImport(PythonDll)] - internal static extern IntPtr - PyUnicode_FromObject(IntPtr ob); + internal static extern IntPtr PyUnicode_FromObject(IntPtr ob); [DllImport(PythonDll)] - internal static extern IntPtr - PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); + internal static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); [DllImport(PythonDll, EntryPoint = "PyUnicode_FromKindAndData", CharSet = CharSet.Unicode)] - internal static extern IntPtr - PyUnicode_FromKindAndString(int kind, string s, int size); + internal static extern IntPtr PyUnicode_FromKindAndString(int kind, string s, int size); internal static IntPtr PyUnicode_FromUnicode(string s, int size) { @@ -1420,56 +1259,44 @@ internal static IntPtr PyUnicode_FromUnicode(string s, int size) } [DllImport(PythonDll)] - internal static extern int - PyUnicode_GetSize(IntPtr ob); + internal static extern int PyUnicode_GetSize(IntPtr ob); [DllImport(PythonDll)] - internal static extern IntPtr - PyUnicode_AsUnicode(IntPtr ob); + internal static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); [DllImport(PythonDll)] - internal static extern IntPtr - PyUnicode_FromOrdinal(int c); + internal static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS2 && PYTHON2 [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_FromObject")] - internal static extern IntPtr - PyUnicode_FromObject(IntPtr ob); + internal static extern IntPtr PyUnicode_FromObject(IntPtr ob); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_FromEncodedObject")] - internal static extern IntPtr - PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); + internal static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_FromUnicode", CharSet = CharSet.Unicode)] - internal static extern IntPtr - PyUnicode_FromUnicode(string s, int size); + internal static extern IntPtr PyUnicode_FromUnicode(string s, int size); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_GetSize")] - internal static extern int - PyUnicode_GetSize(IntPtr ob); + internal static extern int PyUnicode_GetSize(IntPtr ob); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_AsUnicode")] - internal static extern IntPtr - PyUnicode_AsUnicode(IntPtr ob); + internal static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_FromOrdinal")] - internal static extern IntPtr - PyUnicode_FromOrdinal(int c); + internal static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS4 && PYTHON3 [DllImport(PythonDll)] - internal static extern IntPtr - PyUnicode_FromObject(IntPtr ob); + internal static extern IntPtr PyUnicode_FromObject(IntPtr ob); [DllImport(PythonDll)] - internal static extern IntPtr - PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); + internal static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); [DllImport(PythonDll, EntryPoint = "PyUnicode_FromKindAndData")] - internal static extern IntPtr - PyUnicode_FromKindAndString( - int kind, - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrMarshaler))] string s, - int size - ); + internal static extern IntPtr PyUnicode_FromKindAndString( + int kind, + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrMarshaler))] string s, + int size + ); internal static IntPtr PyUnicode_FromUnicode(string s, int size) { @@ -1477,43 +1304,34 @@ internal static IntPtr PyUnicode_FromUnicode(string s, int size) } [DllImport(PythonDll)] - internal static extern int - PyUnicode_GetSize(IntPtr ob); + internal static extern int PyUnicode_GetSize(IntPtr ob); [DllImport(PythonDll)] - internal static extern IntPtr - PyUnicode_AsUnicode(IntPtr ob); + internal static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); [DllImport(PythonDll)] - internal static extern IntPtr - PyUnicode_FromOrdinal(int c); + internal static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS4 && PYTHON2 [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_FromObject")] - internal static extern IntPtr - PyUnicode_FromObject(IntPtr ob); + internal static extern IntPtr PyUnicode_FromObject(IntPtr ob); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_FromEncodedObject")] - internal static extern IntPtr - PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); + internal static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_FromUnicode")] - internal static extern IntPtr - PyUnicode_FromUnicode( - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrMarshaler))] string s, - int size - ); + internal static extern IntPtr PyUnicode_FromUnicode( + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrMarshaler))] string s, + int size + ); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_GetSize")] - internal static extern int - PyUnicode_GetSize(IntPtr ob); + internal static extern int PyUnicode_GetSize(IntPtr ob); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_AsUnicode")] - internal static extern IntPtr - PyUnicode_AsUnicode(IntPtr ob); + internal static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_FromOrdinal")] - internal static extern IntPtr - PyUnicode_FromOrdinal(int c); + internal static extern IntPtr PyUnicode_FromOrdinal(int c); #endif internal static IntPtr PyUnicode_FromString(string s) @@ -1541,10 +1359,7 @@ internal static string GetManagedString(IntPtr op) #if PYTHON2 // Python 3 strings are all Unicode if (type == Runtime.PyStringType) { - return Marshal.PtrToStringAnsi( - PyString_AS_STRING(op), - Runtime.PyString_Size(op) - ); + return Marshal.PtrToStringAnsi(PyString_AS_STRING(op), Runtime.PyString_Size(op)); } #endif @@ -1562,6 +1377,7 @@ internal static string GetManagedString(IntPtr op) return null; } + //==================================================================== // Python dictionary API //==================================================================== @@ -1572,68 +1388,52 @@ internal static bool PyDict_Check(IntPtr ob) } [DllImport(PythonDll)] - internal static extern IntPtr - PyDict_New(); + internal static extern IntPtr PyDict_New(); [DllImport(PythonDll)] - internal static extern IntPtr - PyDictProxy_New(IntPtr dict); + internal static extern IntPtr PyDictProxy_New(IntPtr dict); [DllImport(PythonDll)] - internal static extern IntPtr - PyDict_GetItem(IntPtr pointer, IntPtr key); + internal static extern IntPtr PyDict_GetItem(IntPtr pointer, IntPtr key); [DllImport(PythonDll)] - internal static extern IntPtr - PyDict_GetItemString(IntPtr pointer, string key); + internal static extern IntPtr PyDict_GetItemString(IntPtr pointer, string key); [DllImport(PythonDll)] - internal static extern int - PyDict_SetItem(IntPtr pointer, IntPtr key, IntPtr value); + internal static extern int PyDict_SetItem(IntPtr pointer, IntPtr key, IntPtr value); [DllImport(PythonDll)] - internal static extern int - PyDict_SetItemString(IntPtr pointer, string key, IntPtr value); + internal static extern int PyDict_SetItemString(IntPtr pointer, string key, IntPtr value); [DllImport(PythonDll)] - internal static extern int - PyDict_DelItem(IntPtr pointer, IntPtr key); + internal static extern int PyDict_DelItem(IntPtr pointer, IntPtr key); [DllImport(PythonDll)] - internal static extern int - PyDict_DelItemString(IntPtr pointer, string key); + internal static extern int PyDict_DelItemString(IntPtr pointer, string key); [DllImport(PythonDll)] - internal static extern int - PyMapping_HasKey(IntPtr pointer, IntPtr key); + internal static extern int PyMapping_HasKey(IntPtr pointer, IntPtr key); [DllImport(PythonDll)] - internal static extern IntPtr - PyDict_Keys(IntPtr pointer); + internal static extern IntPtr PyDict_Keys(IntPtr pointer); [DllImport(PythonDll)] - internal static extern IntPtr - PyDict_Values(IntPtr pointer); + internal static extern IntPtr PyDict_Values(IntPtr pointer); [DllImport(PythonDll)] - internal static extern IntPtr - PyDict_Items(IntPtr pointer); + internal static extern IntPtr PyDict_Items(IntPtr pointer); [DllImport(PythonDll)] - internal static extern IntPtr - PyDict_Copy(IntPtr pointer); + internal static extern IntPtr PyDict_Copy(IntPtr pointer); [DllImport(PythonDll)] - internal static extern int - PyDict_Update(IntPtr pointer, IntPtr other); + internal static extern int PyDict_Update(IntPtr pointer, IntPtr other); [DllImport(PythonDll)] - internal static extern void - PyDict_Clear(IntPtr pointer); + internal static extern void PyDict_Clear(IntPtr pointer); [DllImport(PythonDll)] - internal static extern int - PyDict_Size(IntPtr pointer); + internal static extern int PyDict_Size(IntPtr pointer); //==================================================================== @@ -1646,48 +1446,37 @@ internal static bool PyList_Check(IntPtr ob) } [DllImport(PythonDll)] - internal static extern IntPtr - PyList_New(int size); + internal static extern IntPtr PyList_New(int size); [DllImport(PythonDll)] - internal static extern IntPtr - PyList_AsTuple(IntPtr pointer); + internal static extern IntPtr PyList_AsTuple(IntPtr pointer); [DllImport(PythonDll)] - internal static extern IntPtr - PyList_GetItem(IntPtr pointer, int index); + internal static extern IntPtr PyList_GetItem(IntPtr pointer, int index); [DllImport(PythonDll)] - internal static extern int - PyList_SetItem(IntPtr pointer, int index, IntPtr value); + internal static extern int PyList_SetItem(IntPtr pointer, int index, IntPtr value); [DllImport(PythonDll)] - internal static extern int - PyList_Insert(IntPtr pointer, int index, IntPtr value); + internal static extern int PyList_Insert(IntPtr pointer, int index, IntPtr value); [DllImport(PythonDll)] - internal static extern int - PyList_Append(IntPtr pointer, IntPtr value); + internal static extern int PyList_Append(IntPtr pointer, IntPtr value); [DllImport(PythonDll)] - internal static extern int - PyList_Reverse(IntPtr pointer); + internal static extern int PyList_Reverse(IntPtr pointer); [DllImport(PythonDll)] - internal static extern int - PyList_Sort(IntPtr pointer); + internal static extern int PyList_Sort(IntPtr pointer); [DllImport(PythonDll)] - internal static extern IntPtr - PyList_GetSlice(IntPtr pointer, int start, int end); + internal static extern IntPtr PyList_GetSlice(IntPtr pointer, int start, int end); [DllImport(PythonDll)] - internal static extern int - PyList_SetSlice(IntPtr pointer, int start, int end, IntPtr value); + internal static extern int PyList_SetSlice(IntPtr pointer, int start, int end, IntPtr value); [DllImport(PythonDll)] - internal static extern int - PyList_Size(IntPtr pointer); + internal static extern int PyList_Size(IntPtr pointer); //==================================================================== @@ -1700,24 +1489,19 @@ internal static bool PyTuple_Check(IntPtr ob) } [DllImport(PythonDll)] - internal static extern IntPtr - PyTuple_New(int size); + internal static extern IntPtr PyTuple_New(int size); [DllImport(PythonDll)] - internal static extern IntPtr - PyTuple_GetItem(IntPtr pointer, int index); + internal static extern IntPtr PyTuple_GetItem(IntPtr pointer, int index); [DllImport(PythonDll)] - internal static extern int - PyTuple_SetItem(IntPtr pointer, int index, IntPtr value); + internal static extern int PyTuple_SetItem(IntPtr pointer, int index, IntPtr value); [DllImport(PythonDll)] - internal static extern IntPtr - PyTuple_GetSlice(IntPtr pointer, int start, int end); + internal static extern IntPtr PyTuple_GetSlice(IntPtr pointer, int start, int end); [DllImport(PythonDll)] - internal static extern int - PyTuple_Size(IntPtr pointer); + internal static extern int PyTuple_Size(IntPtr pointer); //==================================================================== @@ -1726,11 +1510,9 @@ internal static extern int #if PYTHON2 [DllImport(PythonDll)] - internal static extern bool - PyIter_Check(IntPtr pointer); + internal static extern bool PyIter_Check(IntPtr pointer); #elif PYTHON3 - internal static bool - PyIter_Check(IntPtr pointer) + internal static bool PyIter_Check(IntPtr pointer) { IntPtr ob_type = (IntPtr)Marshal.PtrToStructure(pointer + ObjectOffset.ob_type, typeof(IntPtr)); IntPtr tp_iternext = ob_type + TypeOffset.tp_iternext; @@ -1739,80 +1521,66 @@ internal static bool #endif [DllImport(PythonDll)] - internal static extern IntPtr - PyIter_Next(IntPtr pointer); + internal static extern IntPtr PyIter_Next(IntPtr pointer); + //==================================================================== // Python module API //==================================================================== [DllImport(PythonDll)] - internal static extern IntPtr - PyModule_New(string name); + internal static extern IntPtr PyModule_New(string name); [DllImport(PythonDll)] - internal static extern string - PyModule_GetName(IntPtr module); + internal static extern string PyModule_GetName(IntPtr module); [DllImport(PythonDll)] - internal static extern IntPtr - PyModule_GetDict(IntPtr module); + internal static extern IntPtr PyModule_GetDict(IntPtr module); [DllImport(PythonDll)] - internal static extern string - PyModule_GetFilename(IntPtr module); + internal static extern string PyModule_GetFilename(IntPtr module); #if PYTHON3 [DllImport(PythonDll)] - internal static extern IntPtr - PyModule_Create2(IntPtr module, int apiver); + internal static extern IntPtr PyModule_Create2(IntPtr module, int apiver); #endif [DllImport(PythonDll)] - internal static extern IntPtr - PyImport_Import(IntPtr name); + internal static extern IntPtr PyImport_Import(IntPtr name); [DllImport(PythonDll)] - internal static extern IntPtr - PyImport_ImportModule(string name); + internal static extern IntPtr PyImport_ImportModule(string name); [DllImport(PythonDll)] - internal static extern IntPtr - PyImport_ReloadModule(IntPtr module); + internal static extern IntPtr PyImport_ReloadModule(IntPtr module); [DllImport(PythonDll)] - internal static extern IntPtr - PyImport_AddModule(string name); + internal static extern IntPtr PyImport_AddModule(string name); [DllImport(PythonDll)] - internal static extern IntPtr - PyImport_GetModuleDict(); + internal static extern IntPtr PyImport_GetModuleDict(); #if PYTHON3 [DllImport(PythonDll)] - internal static extern void - PySys_SetArgvEx( - int argc, - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrArrayMarshaler))] string[] argv, - int updatepath - ); + internal static extern void PySys_SetArgvEx( + int argc, + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrArrayMarshaler))] string[] argv, + int updatepath + ); #elif PYTHON2 [DllImport(PythonDll)] - internal static extern void - PySys_SetArgvEx( - int argc, - string[] argv, - int updatepath - ); + internal static extern void PySys_SetArgvEx( + int argc, + string[] argv, + int updatepath + ); #endif [DllImport(PythonDll)] - internal static extern IntPtr - PySys_GetObject(string name); + internal static extern IntPtr PySys_GetObject(string name); [DllImport(PythonDll)] - internal static extern int - PySys_SetObject(string name, IntPtr ob); + internal static extern int PySys_SetObject(string name, IntPtr ob); //==================================================================== @@ -1825,12 +1593,10 @@ internal static bool PyType_Check(IntPtr ob) } [DllImport(PythonDll)] - internal static extern void - PyType_Modified(IntPtr type); + internal static extern void PyType_Modified(IntPtr type); [DllImport(PythonDll)] - internal static extern bool - PyType_IsSubtype(IntPtr t1, IntPtr t2); + internal static extern bool PyType_IsSubtype(IntPtr t1, IntPtr t2); internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) { @@ -1839,48 +1605,37 @@ internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) } [DllImport(PythonDll)] - internal static extern IntPtr - PyType_GenericNew(IntPtr type, IntPtr args, IntPtr kw); + internal static extern IntPtr PyType_GenericNew(IntPtr type, IntPtr args, IntPtr kw); [DllImport(PythonDll)] - internal static extern IntPtr - PyType_GenericAlloc(IntPtr type, int n); + internal static extern IntPtr PyType_GenericAlloc(IntPtr type, int n); [DllImport(PythonDll)] - internal static extern int - PyType_Ready(IntPtr type); + internal static extern int PyType_Ready(IntPtr type); [DllImport(PythonDll)] - internal static extern IntPtr - _PyType_Lookup(IntPtr type, IntPtr name); + internal static extern IntPtr _PyType_Lookup(IntPtr type, IntPtr name); [DllImport(PythonDll)] - internal static extern IntPtr - PyObject_GenericGetAttr(IntPtr obj, IntPtr name); + internal static extern IntPtr PyObject_GenericGetAttr(IntPtr obj, IntPtr name); [DllImport(PythonDll)] - internal static extern int - PyObject_GenericSetAttr(IntPtr obj, IntPtr name, IntPtr value); + internal static extern int PyObject_GenericSetAttr(IntPtr obj, IntPtr name, IntPtr value); [DllImport(PythonDll)] - internal static extern IntPtr - _PyObject_GetDictPtr(IntPtr obj); + internal static extern IntPtr _PyObject_GetDictPtr(IntPtr obj); [DllImport(PythonDll)] - internal static extern IntPtr - PyObject_GC_New(IntPtr tp); + internal static extern IntPtr PyObject_GC_New(IntPtr tp); [DllImport(PythonDll)] - internal static extern void - PyObject_GC_Del(IntPtr tp); + internal static extern void PyObject_GC_Del(IntPtr tp); [DllImport(PythonDll)] - internal static extern void - PyObject_GC_Track(IntPtr tp); + internal static extern void PyObject_GC_Track(IntPtr tp); [DllImport(PythonDll)] - internal static extern void - PyObject_GC_UnTrack(IntPtr tp); + internal static extern void PyObject_GC_UnTrack(IntPtr tp); //==================================================================== @@ -1888,16 +1643,13 @@ internal static extern void //==================================================================== [DllImport(PythonDll)] - internal static extern IntPtr - PyMem_Malloc(int size); + internal static extern IntPtr PyMem_Malloc(int size); [DllImport(PythonDll)] - internal static extern IntPtr - PyMem_Realloc(IntPtr ptr, int size); + internal static extern IntPtr PyMem_Realloc(IntPtr ptr, int size); [DllImport(PythonDll)] - internal static extern void - PyMem_Free(IntPtr ptr); + internal static extern void PyMem_Free(IntPtr ptr); //==================================================================== @@ -1905,52 +1657,40 @@ internal static extern void //==================================================================== [DllImport(PythonDll)] - internal static extern void - PyErr_SetString(IntPtr ob, string message); + internal static extern void PyErr_SetString(IntPtr ob, string message); [DllImport(PythonDll)] - internal static extern void - PyErr_SetObject(IntPtr ob, IntPtr message); + internal static extern void PyErr_SetObject(IntPtr ob, IntPtr message); [DllImport(PythonDll)] - internal static extern IntPtr - PyErr_SetFromErrno(IntPtr ob); + internal static extern IntPtr PyErr_SetFromErrno(IntPtr ob); [DllImport(PythonDll)] - internal static extern void - PyErr_SetNone(IntPtr ob); + internal static extern void PyErr_SetNone(IntPtr ob); [DllImport(PythonDll)] - internal static extern int - PyErr_ExceptionMatches(IntPtr exception); + internal static extern int PyErr_ExceptionMatches(IntPtr exception); [DllImport(PythonDll)] - internal static extern int - PyErr_GivenExceptionMatches(IntPtr ob, IntPtr val); + internal static extern int PyErr_GivenExceptionMatches(IntPtr ob, IntPtr val); [DllImport(PythonDll)] - internal static extern void - PyErr_NormalizeException(IntPtr ob, IntPtr val, IntPtr tb); + internal static extern void PyErr_NormalizeException(IntPtr ob, IntPtr val, IntPtr tb); [DllImport(PythonDll)] - internal static extern int - PyErr_Occurred(); + internal static extern int PyErr_Occurred(); [DllImport(PythonDll)] - internal static extern void - PyErr_Fetch(ref IntPtr ob, ref IntPtr val, ref IntPtr tb); + internal static extern void PyErr_Fetch(ref IntPtr ob, ref IntPtr val, ref IntPtr tb); [DllImport(PythonDll)] - internal static extern void - PyErr_Restore(IntPtr ob, IntPtr val, IntPtr tb); + internal static extern void PyErr_Restore(IntPtr ob, IntPtr val, IntPtr tb); [DllImport(PythonDll)] - internal static extern void - PyErr_Clear(); + internal static extern void PyErr_Clear(); [DllImport(PythonDll)] - internal static extern void - PyErr_Print(); + internal static extern void PyErr_Print(); //==================================================================== @@ -1958,11 +1698,9 @@ internal static extern void //==================================================================== [DllImport(PythonDll)] - internal static extern IntPtr - PyMethod_Self(IntPtr ob); + internal static extern IntPtr PyMethod_Self(IntPtr ob); [DllImport(PythonDll)] - internal static extern IntPtr - PyMethod_Function(IntPtr ob); + internal static extern IntPtr PyMethod_Function(IntPtr ob); } } From c7b4c212407168c9c2246536aa16e57a36c2acaa Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 1 Mar 2017 10:04:54 -0700 Subject: [PATCH 209/324] Apply consistent name qualification to runtime.cs --- src/runtime/runtime.cs | 206 ++++++++++++++++++++--------------------- 1 file changed, 103 insertions(+), 103 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 5ec66150d..df0d8e64d 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -184,111 +184,111 @@ internal static void Initialize() IsPython2 = pyversionnumber < 30; IsPython3 = pyversionnumber >= 30; - if (Runtime.Py_IsInitialized() == 0) + if (Py_IsInitialized() == 0) { - Runtime.Py_Initialize(); + Py_Initialize(); } - if (Runtime.PyEval_ThreadsInitialized() == 0) + if (PyEval_ThreadsInitialized() == 0) { - Runtime.PyEval_InitThreads(); + PyEval_InitThreads(); } IntPtr op; IntPtr dict; if (IsPython3) { - op = Runtime.PyImport_ImportModule("builtins"); - dict = Runtime.PyObject_GetAttrString(op, "__dict__"); + op = PyImport_ImportModule("builtins"); + dict = PyObject_GetAttrString(op, "__dict__"); } else // Python2 { - dict = Runtime.PyImport_GetModuleDict(); - op = Runtime.PyDict_GetItemString(dict, "__builtin__"); + dict = PyImport_GetModuleDict(); + op = PyDict_GetItemString(dict, "__builtin__"); } - PyNotImplemented = Runtime.PyObject_GetAttrString(op, "NotImplemented"); - PyBaseObjectType = Runtime.PyObject_GetAttrString(op, "object"); + PyNotImplemented = PyObject_GetAttrString(op, "NotImplemented"); + PyBaseObjectType = PyObject_GetAttrString(op, "object"); - PyModuleType = Runtime.PyObject_Type(op); - PyNone = Runtime.PyObject_GetAttrString(op, "None"); - PyTrue = Runtime.PyObject_GetAttrString(op, "True"); - PyFalse = Runtime.PyObject_GetAttrString(op, "False"); + PyModuleType = PyObject_Type(op); + PyNone = PyObject_GetAttrString(op, "None"); + PyTrue = PyObject_GetAttrString(op, "True"); + PyFalse = PyObject_GetAttrString(op, "False"); - PyBoolType = Runtime.PyObject_Type(PyTrue); - PyNoneType = Runtime.PyObject_Type(PyNone); - PyTypeType = Runtime.PyObject_Type(PyNoneType); + PyBoolType = PyObject_Type(PyTrue); + PyNoneType = PyObject_Type(PyNone); + PyTypeType = PyObject_Type(PyNoneType); - op = Runtime.PyObject_GetAttrString(dict, "keys"); - PyMethodType = Runtime.PyObject_Type(op); - Runtime.XDecref(op); + op = PyObject_GetAttrString(dict, "keys"); + PyMethodType = PyObject_Type(op); + XDecref(op); // For some arcane reason, builtins.__dict__.__setitem__ is *not* // a wrapper_descriptor, even though dict.__setitem__ is. // // object.__init__ seems safe, though. - op = Runtime.PyObject_GetAttrString(PyBaseObjectType, "__init__"); - PyWrapperDescriptorType = Runtime.PyObject_Type(op); - Runtime.XDecref(op); + op = PyObject_GetAttrString(PyBaseObjectType, "__init__"); + PyWrapperDescriptorType = PyObject_Type(op); + XDecref(op); #if PYTHON3 - Runtime.XDecref(dict); + XDecref(dict); #endif - op = Runtime.PyString_FromString("string"); - PyStringType = Runtime.PyObject_Type(op); - Runtime.XDecref(op); + op = PyString_FromString("string"); + PyStringType = PyObject_Type(op); + XDecref(op); - op = Runtime.PyUnicode_FromString("unicode"); - PyUnicodeType = Runtime.PyObject_Type(op); - Runtime.XDecref(op); + op = PyUnicode_FromString("unicode"); + PyUnicodeType = PyObject_Type(op); + XDecref(op); #if PYTHON3 - op = Runtime.PyBytes_FromString("bytes"); - PyBytesType = Runtime.PyObject_Type(op); - Runtime.XDecref(op); + op = PyBytes_FromString("bytes"); + PyBytesType = PyObject_Type(op); + XDecref(op); #endif - op = Runtime.PyTuple_New(0); - PyTupleType = Runtime.PyObject_Type(op); - Runtime.XDecref(op); + op = PyTuple_New(0); + PyTupleType = PyObject_Type(op); + XDecref(op); - op = Runtime.PyList_New(0); - PyListType = Runtime.PyObject_Type(op); - Runtime.XDecref(op); + op = PyList_New(0); + PyListType = PyObject_Type(op); + XDecref(op); - op = Runtime.PyDict_New(); - PyDictType = Runtime.PyObject_Type(op); - Runtime.XDecref(op); + op = PyDict_New(); + PyDictType = PyObject_Type(op); + XDecref(op); - op = Runtime.PyInt_FromInt32(0); - PyIntType = Runtime.PyObject_Type(op); - Runtime.XDecref(op); + op = PyInt_FromInt32(0); + PyIntType = PyObject_Type(op); + XDecref(op); - op = Runtime.PyLong_FromLong(0); - PyLongType = Runtime.PyObject_Type(op); - Runtime.XDecref(op); + op = PyLong_FromLong(0); + PyLongType = PyObject_Type(op); + XDecref(op); - op = Runtime.PyFloat_FromDouble(0); - PyFloatType = Runtime.PyObject_Type(op); - Runtime.XDecref(op); + op = PyFloat_FromDouble(0); + PyFloatType = PyObject_Type(op); + XDecref(op); #if PYTHON3 PyClassType = IntPtr.Zero; PyInstanceType = IntPtr.Zero; #elif PYTHON2 - IntPtr s = Runtime.PyString_FromString("_temp"); - IntPtr d = Runtime.PyDict_New(); + IntPtr s = PyString_FromString("_temp"); + IntPtr d = PyDict_New(); - IntPtr c = Runtime.PyClass_New(IntPtr.Zero, d, s); - PyClassType = Runtime.PyObject_Type(c); + IntPtr c = PyClass_New(IntPtr.Zero, d, s); + PyClassType = PyObject_Type(c); - IntPtr i = Runtime.PyInstance_New(c, IntPtr.Zero, IntPtr.Zero); - PyInstanceType = Runtime.PyObject_Type(i); + IntPtr i = PyInstance_New(c, IntPtr.Zero, IntPtr.Zero); + PyInstanceType = PyObject_Type(i); - Runtime.XDecref(s); - Runtime.XDecref(i); - Runtime.XDecref(c); - Runtime.XDecref(d); + XDecref(s); + XDecref(i); + XDecref(c); + XDecref(d); #endif Error = new IntPtr(-1); @@ -317,10 +317,10 @@ internal static void Initialize() // Need to add the runtime directory to sys.path so that we // can find built-in assemblies like System.Data, et. al. string rtdir = RuntimeEnvironment.GetRuntimeDirectory(); - IntPtr path = Runtime.PySys_GetObject("path"); - IntPtr item = Runtime.PyString_FromString(rtdir); - Runtime.PyList_Append(path, item); - Runtime.XDecref(item); + IntPtr path = PySys_GetObject("path"); + IntPtr item = PyString_FromString(rtdir); + PyList_Append(path, item); + XDecref(item); AssemblyManager.UpdatePath(); } @@ -401,21 +401,21 @@ internal static void CheckExceptionOccurred() internal static IntPtr GetBoundArgTuple(IntPtr obj, IntPtr args) { - if (Runtime.PyObject_TYPE(args) != Runtime.PyTupleType) + if (PyObject_TYPE(args) != PyTupleType) { Exceptions.SetError(Exceptions.TypeError, "tuple expected"); return IntPtr.Zero; } - int size = Runtime.PyTuple_Size(args); - IntPtr items = Runtime.PyTuple_New(size + 1); - Runtime.PyTuple_SetItem(items, 0, obj); - Runtime.XIncref(obj); + int size = PyTuple_Size(args); + IntPtr items = PyTuple_New(size + 1); + PyTuple_SetItem(items, 0, obj); + XIncref(obj); for (int i = 0; i < size; i++) { - IntPtr item = Runtime.PyTuple_GetItem(args, i); - Runtime.XIncref(item); - Runtime.PyTuple_SetItem(items, i + 1, item); + IntPtr item = PyTuple_GetItem(args, i); + XIncref(item); + PyTuple_SetItem(items, i + 1, item); } return items; @@ -424,23 +424,23 @@ internal static IntPtr GetBoundArgTuple(IntPtr obj, IntPtr args) internal static IntPtr ExtendTuple(IntPtr t, params IntPtr[] args) { - int size = Runtime.PyTuple_Size(t); + int size = PyTuple_Size(t); int add = args.Length; IntPtr item; - IntPtr items = Runtime.PyTuple_New(size + add); + IntPtr items = PyTuple_New(size + add); for (int i = 0; i < size; i++) { - item = Runtime.PyTuple_GetItem(t, i); - Runtime.XIncref(item); - Runtime.PyTuple_SetItem(items, i, item); + item = PyTuple_GetItem(t, i); + XIncref(item); + PyTuple_SetItem(items, i, item); } for (int n = 0; n < add; n++) { item = args[n]; - Runtime.XIncref(item); - Runtime.PyTuple_SetItem(items, size + n, item); + XIncref(item); + PyTuple_SetItem(items, size + n, item); } return items; @@ -459,24 +459,24 @@ internal static Type[] PythonArgsToTypeArray(IntPtr arg, bool mangleObjects) IntPtr args = arg; bool free = false; - if (!Runtime.PyTuple_Check(arg)) + if (!PyTuple_Check(arg)) { - args = Runtime.PyTuple_New(1); - Runtime.XIncref(arg); - Runtime.PyTuple_SetItem(args, 0, arg); + args = PyTuple_New(1); + XIncref(arg); + PyTuple_SetItem(args, 0, arg); free = true; } - int n = Runtime.PyTuple_Size(args); + int n = PyTuple_Size(args); Type[] types = new Type[n]; Type t = null; for (int i = 0; i < n; i++) { - IntPtr op = Runtime.PyTuple_GetItem(args, i); - if (mangleObjects && (!Runtime.PyType_Check(op))) + IntPtr op = PyTuple_GetItem(args, i); + if (mangleObjects && (!PyType_Check(op))) { - op = Runtime.PyObject_TYPE(op); + op = PyObject_TYPE(op); } ManagedType mt = ManagedType.GetManagedObject(op); @@ -506,7 +506,7 @@ internal static Type[] PythonArgsToTypeArray(IntPtr arg, bool mangleObjects) } if (free) { - Runtime.XDecref(args); + XDecref(args); } return types; } @@ -824,7 +824,7 @@ internal static unsafe IntPtr PyObject_TYPE(IntPtr op) internal static IntPtr PyObject_Type(IntPtr op) { IntPtr tp = PyObject_TYPE(op); - Runtime.XIncref(tp); + XIncref(tp); return tp; } @@ -966,12 +966,12 @@ internal static int PyObject_Compare(IntPtr value1, IntPtr value2) internal static bool PyInt_Check(IntPtr ob) { - return PyObject_TypeCheck(ob, Runtime.PyIntType); + return PyObject_TypeCheck(ob, PyIntType); } internal static bool PyBool_Check(IntPtr ob) { - return PyObject_TypeCheck(ob, Runtime.PyBoolType); + return PyObject_TypeCheck(ob, PyBoolType); } internal static IntPtr PyInt_FromInt32(int value) @@ -1014,7 +1014,7 @@ internal static IntPtr PyInt_FromInt64(long value) internal static bool PyLong_Check(IntPtr ob) { - return PyObject_TYPE(ob) == Runtime.PyLongType; + return PyObject_TYPE(ob) == PyLongType; } [DllImport(PythonDll)] @@ -1049,7 +1049,7 @@ internal static bool PyLong_Check(IntPtr ob) internal static bool PyFloat_Check(IntPtr ob) { - return PyObject_TYPE(ob) == Runtime.PyFloatType; + return PyObject_TYPE(ob) == PyFloatType; } [DllImport(PythonDll)] @@ -1199,7 +1199,7 @@ internal static bool IsStringType(IntPtr op) internal static bool PyString_Check(IntPtr ob) { - return PyObject_TYPE(ob) == Runtime.PyStringType; + return PyObject_TYPE(ob) == PyStringType; } internal static IntPtr PyString_FromString(string value) @@ -1240,7 +1240,7 @@ int size internal static bool PyUnicode_Check(IntPtr ob) { - return PyObject_TYPE(ob) == Runtime.PyUnicodeType; + return PyObject_TYPE(ob) == PyUnicodeType; } #if UCS2 && PYTHON3 @@ -1357,13 +1357,13 @@ internal static string GetManagedString(IntPtr op) IntPtr type = PyObject_TYPE(op); #if PYTHON2 // Python 3 strings are all Unicode - if (type == Runtime.PyStringType) + if (type == PyStringType) { - return Marshal.PtrToStringAnsi(PyString_AS_STRING(op), Runtime.PyString_Size(op)); + return Marshal.PtrToStringAnsi(PyString_AS_STRING(op), PyString_Size(op)); } #endif - if (type == Runtime.PyUnicodeType) + if (type == PyUnicodeType) { IntPtr p = PyUnicode_AsUnicode(op); int length = PyUnicode_GetSize(op); @@ -1384,7 +1384,7 @@ internal static string GetManagedString(IntPtr op) internal static bool PyDict_Check(IntPtr ob) { - return PyObject_TYPE(ob) == Runtime.PyDictType; + return PyObject_TYPE(ob) == PyDictType; } [DllImport(PythonDll)] @@ -1442,7 +1442,7 @@ internal static bool PyDict_Check(IntPtr ob) internal static bool PyList_Check(IntPtr ob) { - return PyObject_TYPE(ob) == Runtime.PyListType; + return PyObject_TYPE(ob) == PyListType; } [DllImport(PythonDll)] @@ -1485,7 +1485,7 @@ internal static bool PyList_Check(IntPtr ob) internal static bool PyTuple_Check(IntPtr ob) { - return PyObject_TYPE(ob) == Runtime.PyTupleType; + return PyObject_TYPE(ob) == PyTupleType; } [DllImport(PythonDll)] @@ -1589,7 +1589,7 @@ int updatepath internal static bool PyType_Check(IntPtr ob) { - return PyObject_TypeCheck(ob, Runtime.PyTypeType); + return PyObject_TypeCheck(ob, PyTypeType); } [DllImport(PythonDll)] From 6e9fed9f96f3833383e8a3a9d6d98f8fc728d0cf Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 28 Feb 2017 19:25:08 -0700 Subject: [PATCH 210/324] Unify PY3 UCS2/UCS4 unicode methods CustomMarshal implementation deals w UCS2/4 differences --- src/runtime/runtime.cs | 39 ++++++++------------------------------- 1 file changed, 8 insertions(+), 31 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index df0d8e64d..6629657fc 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1243,19 +1243,23 @@ internal static bool PyUnicode_Check(IntPtr ob) return PyObject_TYPE(ob) == PyUnicodeType; } -#if UCS2 && PYTHON3 +#if PYTHON3 [DllImport(PythonDll)] internal static extern IntPtr PyUnicode_FromObject(IntPtr ob); [DllImport(PythonDll)] internal static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - [DllImport(PythonDll, EntryPoint = "PyUnicode_FromKindAndData", CharSet = CharSet.Unicode)] - internal static extern IntPtr PyUnicode_FromKindAndString(int kind, string s, int size); + [DllImport(PythonDll, EntryPoint = "PyUnicode_FromKindAndData")] + internal static extern IntPtr PyUnicode_FromKindAndString( + int kind, + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrMarshaler))] string s, + int size + ); internal static IntPtr PyUnicode_FromUnicode(string s, int size) { - return PyUnicode_FromKindAndString(2, s, size); + return PyUnicode_FromKindAndString(UCS, s, size); } [DllImport(PythonDll)] @@ -1284,33 +1288,6 @@ internal static IntPtr PyUnicode_FromUnicode(string s, int size) [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_FromOrdinal")] internal static extern IntPtr PyUnicode_FromOrdinal(int c); -#elif UCS4 && PYTHON3 - [DllImport(PythonDll)] - internal static extern IntPtr PyUnicode_FromObject(IntPtr ob); - - [DllImport(PythonDll)] - internal static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - - [DllImport(PythonDll, EntryPoint = "PyUnicode_FromKindAndData")] - internal static extern IntPtr PyUnicode_FromKindAndString( - int kind, - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrMarshaler))] string s, - int size - ); - - internal static IntPtr PyUnicode_FromUnicode(string s, int size) - { - return PyUnicode_FromKindAndString(4, s, size); - } - - [DllImport(PythonDll)] - internal static extern int PyUnicode_GetSize(IntPtr ob); - - [DllImport(PythonDll)] - internal static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - - [DllImport(PythonDll)] - internal static extern IntPtr PyUnicode_FromOrdinal(int c); #elif UCS4 && PYTHON2 [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_FromObject")] internal static extern IntPtr PyUnicode_FromObject(IntPtr ob); From 464080f08e3df2f639b8e1a3abcb88489f0a75a1 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 28 Feb 2017 19:35:31 -0700 Subject: [PATCH 211/324] Unify PY2 UCS2/UCS4 unicode methods PyUnicodeEntryPoint is not used for PY3 since it was unified by PEP393. It could be defined as "PyUnicode_" for PY3 and further unify the code between PY2/PY3. Not implementing since not all PY3 methods exist in PY2 --- src/runtime/runtime.cs | 44 ++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 6629657fc..bde0fb660 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -82,8 +82,20 @@ public class Runtime { #if UCS4 public const int UCS = 4; + + /// + /// EntryPoint to be used in DllImport to map to correct Unicode + /// methods prior to PEP393. Only used for PY27. + /// + private const string PyUnicodeEntryPoint = "PyUnicodeUCS4_"; #elif UCS2 public const int UCS = 2; + + /// + /// EntryPoint to be used in DllImport to map to correct Unicode + /// methods prior to PEP393. Only used for PY27. + /// + private const string PyUnicodeEntryPoint = "PyUnicodeUCS2_"; #else #error You must define either UCS2 or UCS4! #endif @@ -1270,44 +1282,26 @@ internal static IntPtr PyUnicode_FromUnicode(string s, int size) [DllImport(PythonDll)] internal static extern IntPtr PyUnicode_FromOrdinal(int c); -#elif UCS2 && PYTHON2 - [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_FromObject")] - internal static extern IntPtr PyUnicode_FromObject(IntPtr ob); - - [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_FromEncodedObject")] - internal static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - - [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_FromUnicode", CharSet = CharSet.Unicode)] - internal static extern IntPtr PyUnicode_FromUnicode(string s, int size); - - [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_GetSize")] - internal static extern int PyUnicode_GetSize(IntPtr ob); - - [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_AsUnicode")] - internal static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - - [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS2_FromOrdinal")] - internal static extern IntPtr PyUnicode_FromOrdinal(int c); -#elif UCS4 && PYTHON2 - [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_FromObject")] +#elif PYTHON2 + [DllImport(PythonDll, EntryPoint = PyUnicodeEntryPoint + "FromObject")] internal static extern IntPtr PyUnicode_FromObject(IntPtr ob); - [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_FromEncodedObject")] + [DllImport(PythonDll, EntryPoint = PyUnicodeEntryPoint + "FromEncodedObject")] internal static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_FromUnicode")] + [DllImport(PythonDll, EntryPoint = PyUnicodeEntryPoint + "FromUnicode")] internal static extern IntPtr PyUnicode_FromUnicode( [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrMarshaler))] string s, int size ); - [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_GetSize")] + [DllImport(PythonDll, EntryPoint = PyUnicodeEntryPoint + "GetSize")] internal static extern int PyUnicode_GetSize(IntPtr ob); - [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_AsUnicode")] + [DllImport(PythonDll, EntryPoint = PyUnicodeEntryPoint + "AsUnicode")] internal static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(PythonDll, EntryPoint = "PyUnicodeUCS4_FromOrdinal")] + [DllImport(PythonDll, EntryPoint = PyUnicodeEntryPoint + "FromOrdinal")] internal static extern IntPtr PyUnicode_FromOrdinal(int c); #endif From 0fdb80a7ca068d0db5a99446c1004bc713ee13f5 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 28 Feb 2017 19:44:51 -0700 Subject: [PATCH 212/324] Rename internal methods to proper Python API name - PyUnicode_FromKindAndString to PyUnicode_FromKindAndData - PyString_AS_STRING to PyString_AsString --- src/runtime/converter.cs | 6 +++--- src/runtime/runtime.cs | 12 ++++++------ src/runtime/typemanager.cs | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index 8b58e5e9a..b66150a29 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -498,7 +498,7 @@ private static bool ToPrimitive(IntPtr value, Type obType, out object result, bo { if (Runtime.PyString_Size(value) == 1) { - op = Runtime.PyString_AS_STRING(value); + op = Runtime.PyString_AsString(value); result = (byte)Marshal.ReadByte(op); return true; } @@ -543,7 +543,7 @@ private static bool ToPrimitive(IntPtr value, Type obType, out object result, bo { if (Runtime.PyString_Size(value) == 1) { - op = Runtime.PyString_AS_STRING(value); + op = Runtime.PyString_AsString(value); result = (sbyte)Marshal.ReadByte(op); return true; } @@ -588,7 +588,7 @@ private static bool ToPrimitive(IntPtr value, Type obType, out object result, bo { if (Runtime.PyString_Size(value) == 1) { - op = Runtime.PyString_AS_STRING(value); + op = Runtime.PyString_AsString(value); result = (char)Marshal.ReadByte(op); return true; } diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index bde0fb660..75b2a2a9d 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1243,8 +1243,8 @@ int size [DllImport(PythonDll)] internal static extern IntPtr PyString_FromStringAndSize(string value, int size); - [DllImport(PythonDll, EntryPoint = "PyString_AsString")] - internal static extern IntPtr PyString_AS_STRING(IntPtr op); + [DllImport(PythonDll)] + internal static extern IntPtr PyString_AsString(IntPtr op); [DllImport(PythonDll)] internal static extern int PyString_Size(IntPtr pointer); @@ -1262,8 +1262,8 @@ internal static bool PyUnicode_Check(IntPtr ob) [DllImport(PythonDll)] internal static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - [DllImport(PythonDll, EntryPoint = "PyUnicode_FromKindAndData")] - internal static extern IntPtr PyUnicode_FromKindAndString( + [DllImport(PythonDll)] + internal static extern IntPtr PyUnicode_FromKindAndData( int kind, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrMarshaler))] string s, int size @@ -1271,7 +1271,7 @@ int size internal static IntPtr PyUnicode_FromUnicode(string s, int size) { - return PyUnicode_FromKindAndString(UCS, s, size); + return PyUnicode_FromKindAndData(UCS, s, size); } [DllImport(PythonDll)] @@ -1330,7 +1330,7 @@ internal static string GetManagedString(IntPtr op) #if PYTHON2 // Python 3 strings are all Unicode if (type == PyStringType) { - return Marshal.PtrToStringAnsi(PyString_AS_STRING(op), PyString_Size(op)); + return Marshal.PtrToStringAnsi(PyString_AsString(op), PyString_Size(op)); } #endif diff --git a/src/runtime/typemanager.cs b/src/runtime/typemanager.cs index b3b065cc4..6f373f036 100644 --- a/src/runtime/typemanager.cs +++ b/src/runtime/typemanager.cs @@ -415,7 +415,7 @@ internal static IntPtr AllocateTypeObject(string name) temp = Runtime.PyUnicode_FromString(name); #elif PYTHON2 IntPtr temp = Runtime.PyString_FromString(name); - IntPtr raw = Runtime.PyString_AS_STRING(temp); + IntPtr raw = Runtime.PyString_AsString(temp); #endif Marshal.WriteIntPtr(type, TypeOffset.tp_name, raw); Marshal.WriteIntPtr(type, TypeOffset.name, temp); From 9650e8bee8905f1baef7526bb5795fcc33564ee0 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 1 Mar 2017 10:59:50 -0700 Subject: [PATCH 213/324] Fix PY27 dll mapping in Linux/macOS On 5062377296e3594d461ff9459b85c5eb9d660957 this was fixed for PY3 but left unchanged for PY2. On linux/macOS the library is aliased `python2.7` while in windows its `python 27`. Since internally it wasn't mapped to the correct library in Linux/macOS, we had to remap it again using the dll.config file. Closes #120 --- .travis.yml | 2 -- CHANGELOG.md | 6 ++++-- Python.Runtime.dll.config | 15 --------------- setup.py | 4 ++-- src/runtime/runtime.cs | 2 +- 5 files changed, 7 insertions(+), 22 deletions(-) delete mode 100644 Python.Runtime.dll.config diff --git a/.travis.yml b/.travis.yml index 95e13b574..c20f935ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,8 +40,6 @@ install: script: - python -m pytest - - - cp Python.Runtime.dll.config src/embed_tests/bin/ - mono ./packages/NUnit.*/tools/nunit3-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll after_script: diff --git a/CHANGELOG.md b/CHANGELOG.md index f4f9a4e29..35d449ebd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,12 +49,14 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Fixed fixture location for Python tests and `Embedded_Tests` - Fixed `PythonException` crash during Shutdown (#400) - Fixed `AppDomain` unload during GC (#397)(#400) -- Fixed `Py_Main` & `PySys_SetArgvEx` no mem error on `UCS4/PY3` (#399) +- Fixed `Py_Main` & `PySys_SetArgvEx` `no mem error` on `UCS4/PY3` (#399) +- Fixed `Python.Runtime.dll.config` on macOS (#120) ### Removed - Removed `six` dependency for `unittests` (#329) - Removed `Mono.Unix` dependency for `UCS4` (#360) +- Removed need for `Python.Runtime.dll.config` ## [2.2.2][] - 2017-01-29 @@ -64,7 +66,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ## [2.2.1][] - 2017-01-26 -- `v2.2.0` had a release issue on pypi. Bumped to `v2.2.1` +- `v2.2.0` had a release issue on PyPi. Bumped to `v2.2.1` ### Added diff --git a/Python.Runtime.dll.config b/Python.Runtime.dll.config deleted file mode 100644 index b820676cf..000000000 --- a/Python.Runtime.dll.config +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - diff --git a/setup.py b/setup.py index 30168dfde..6e14b91ec 100644 --- a/setup.py +++ b/setup.py @@ -104,7 +104,7 @@ def _get_interop_filename(): def _get_source_files(): """Walk project and collect the files needed for ext_module""" - for ext in (".sln", ".config"): + for ext in (".sln", ): for path in glob.glob("*" + ext): yield path @@ -381,7 +381,7 @@ def run(self): data_files=[ ("{install_platlib}", [ "{build_lib}/Python.Runtime.dll", - "Python.Runtime.dll.config"]), + ]), ], cmdclass={ "build_ext": BuildExtPythonnet, diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 75b2a2a9d..c5135f752 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -124,7 +124,7 @@ public class Runtime #if MONO_LINUX || MONO_OSX #if PYTHON27 - internal const string dllBase = "python27"; + internal const string dllBase = "python2.7"; #elif PYTHON33 internal const string dllBase = "python3.3"; #elif PYTHON34 From 044edfebea9da124307d0bddc5fc86aaec4c7b4a Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 1 Mar 2017 11:41:36 -0700 Subject: [PATCH 214/324] Refactor runtime's dllBase As long as the API doesn't change on new python minor releases, all changes needed for new minor versions is isolated to a small section of code. --- src/runtime/runtime.cs | 44 +++++++++++------------------------------- 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index c5135f752..044fee51f 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -102,54 +102,30 @@ public class Runtime #if PYTHON27 public const string pyversion = "2.7"; - public const int pyversionnumber = 27; + public const string pyver = "27"; #elif PYTHON33 public const string pyversion = "3.3"; - public const int pyversionnumber = 33; + public const string pyver = "33"; #elif PYTHON34 public const string pyversion = "3.4"; - public const int pyversionnumber = 34; + public const string pyver = "34"; #elif PYTHON35 public const string pyversion = "3.5"; - public const int pyversionnumber = 35; + public const string pyver = "35"; #elif PYTHON36 public const string pyversion = "3.6"; - public const int pyversionnumber = 36; + public const string pyver = "36"; #elif PYTHON37 // TODO: Add interop37 after Python3.7 is released public const string pyversion = "3.7"; - public const int pyversionnumber = 37; + public const string pyver = "37"; #else #error You must define one of PYTHON33 to PYTHON37 or PYTHON27 #endif -#if MONO_LINUX || MONO_OSX -#if PYTHON27 - internal const string dllBase = "python2.7"; -#elif PYTHON33 - internal const string dllBase = "python3.3"; -#elif PYTHON34 - internal const string dllBase = "python3.4"; -#elif PYTHON35 - internal const string dllBase = "python3.5"; -#elif PYTHON36 - internal const string dllBase = "python3.6"; -#elif PYTHON37 - internal const string dllBase = "python3.7"; -#endif +#if MONO_LINUX || MONO_OSX // Linux/macOS use dotted version string + internal const string dllBase = "python" + pyversion; #else // Windows -#if PYTHON27 - internal const string dllBase = "python27"; -#elif PYTHON33 - internal const string dllBase = "python33"; -#elif PYTHON34 - internal const string dllBase = "python34"; -#elif PYTHON35 - internal const string dllBase = "python35"; -#elif PYTHON36 - internal const string dllBase = "python36"; -#elif PYTHON37 - internal const string dllBase = "python37"; -#endif + internal const string dllBase = "python" + pyver; #endif #if PYTHON_WITH_PYDEBUG @@ -174,6 +150,8 @@ public class Runtime public const string PythonDll = dllBase + dllWithPyDebug + dllWithPyMalloc + dllWithWideUnicode; #endif + public static readonly int pyversionnumber = Convert.ToInt32(pyver); + // set to true when python is finalizing internal static object IsFinalizingLock = new object(); internal static bool IsFinalizing = false; From 445531dff1a2c314ff495cfb755355c323f239ea Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 1 Mar 2017 12:58:07 -0700 Subject: [PATCH 215/324] Style clean-up runtime.cs --- src/runtime/runtime.cs | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 044fee51f..3611893aa 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -115,7 +115,7 @@ public class Runtime #elif PYTHON36 public const string pyversion = "3.6"; public const string pyver = "36"; -#elif PYTHON37 // TODO: Add interop37 after Python3.7 is released +#elif PYTHON37 // TODO: Add `interop37.cs` after PY37 is released public const string pyversion = "3.7"; public const string pyver = "37"; #else @@ -154,7 +154,7 @@ public class Runtime // set to true when python is finalizing internal static object IsFinalizingLock = new object(); - internal static bool IsFinalizing = false; + internal static bool IsFinalizing; internal static bool Is32Bit; internal static bool IsPython2; @@ -401,7 +401,7 @@ internal static IntPtr GetBoundArgTuple(IntPtr obj, IntPtr args) PyTuple_SetItem(items, 0, obj); XIncref(obj); - for (int i = 0; i < size; i++) + for (var i = 0; i < size; i++) { IntPtr item = PyTuple_GetItem(args, i); XIncref(item); @@ -419,14 +419,14 @@ internal static IntPtr ExtendTuple(IntPtr t, params IntPtr[] args) IntPtr item; IntPtr items = PyTuple_New(size + add); - for (int i = 0; i < size; i++) + for (var i = 0; i < size; i++) { item = PyTuple_GetItem(t, i); XIncref(item); PyTuple_SetItem(items, i, item); } - for (int n = 0; n < add; n++) + for (var n = 0; n < add; n++) { item = args[n]; XIncref(item); @@ -447,7 +447,7 @@ internal static Type[] PythonArgsToTypeArray(IntPtr arg, bool mangleObjects) // tuple of (managed or unmanaged) type objects, return a Type[] // containing the CLR Type objects that map to those types. IntPtr args = arg; - bool free = false; + var free = false; if (!PyTuple_Check(arg)) { @@ -458,10 +458,10 @@ internal static Type[] PythonArgsToTypeArray(IntPtr arg, bool mangleObjects) } int n = PyTuple_Size(args); - Type[] types = new Type[n]; + var types = new Type[n]; Type t = null; - for (int i = 0; i < n; i++) + for (var i = 0; i < n; i++) { IntPtr op = PyTuple_GetItem(args, i); if (mangleObjects && (!PyType_Check(op))) @@ -513,7 +513,7 @@ internal static unsafe void XIncref(IntPtr op) Py_IncRef(op); return; #else - void* p = (void*)op; + var p = (void*)op; if ((void*)0 != p) { if (Is32Bit) @@ -536,7 +536,7 @@ internal static unsafe void XDecref(IntPtr op) Py_DecRef(op); return; #else - void* p = (void*)op; + var p = (void*)op; if ((void*)0 != p) { if (Is32Bit) @@ -562,7 +562,6 @@ internal static unsafe void XDecref(IntPtr op) return; } NativeCall.Impl.Void_Call_1(new IntPtr(f), op); - return; } } #endif @@ -570,7 +569,7 @@ internal static unsafe void XDecref(IntPtr op) internal static unsafe long Refcount(IntPtr op) { - void* p = (void*)op; + var p = (void*)op; if ((void*)0 != p) { if (Is32Bit) @@ -786,15 +785,15 @@ internal static extern void Py_SetPath( /// internal static unsafe IntPtr PyObject_TYPE(IntPtr op) { - void* p = (void*)op; + var p = (void*)op; if ((void*)0 == p) { return IntPtr.Zero; } #if Py_DEBUG - int n = 3; + var n = 3; #else - int n = 1; + var n = 1; #endif if (Is32Bit) { @@ -966,13 +965,13 @@ internal static bool PyBool_Check(IntPtr ob) internal static IntPtr PyInt_FromInt32(int value) { - IntPtr v = new IntPtr(value); + var v = new IntPtr(value); return PyInt_FromLong(v); } internal static IntPtr PyInt_FromInt64(long value) { - IntPtr v = new IntPtr(value); + var v = new IntPtr(value); return PyInt_FromLong(v); } @@ -1285,7 +1284,7 @@ int size internal static IntPtr PyUnicode_FromString(string s) { - return PyUnicode_FromUnicode(s, (s.Length)); + return PyUnicode_FromUnicode(s, s.Length); } /// @@ -1463,7 +1462,7 @@ internal static bool PyTuple_Check(IntPtr ob) #elif PYTHON3 internal static bool PyIter_Check(IntPtr pointer) { - IntPtr ob_type = (IntPtr)Marshal.PtrToStructure(pointer + ObjectOffset.ob_type, typeof(IntPtr)); + var ob_type = (IntPtr)Marshal.PtrToStructure(pointer + ObjectOffset.ob_type, typeof(IntPtr)); IntPtr tp_iternext = ob_type + TypeOffset.tp_iternext; return tp_iternext != null && tp_iternext != _PyObject_NextNotImplemented; } From 3a7d56b75f768cc20ebd617c9f72fce247ebdedc Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 1 Mar 2017 15:15:16 -0700 Subject: [PATCH 216/324] Temporary disable Codecov flags Codecov added a limit of 20 uploads due to current on-going bug https://docs.codecov.io/blog/week-8-2017 Also fixed flags casing, documentations says has to be lowercase. --- .travis.yml | 2 +- appveyor.yml | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index c20f935ee..bf336dc9f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,7 +48,7 @@ after_script: # Waiting on mono-coverage, SharpCover or xr.Baboon - coverage xml -i - - codecov --file coverage.xml --flags Setup_Linux + - codecov --file coverage.xml --flags setup_linux notifications: email: false diff --git a/appveyor.yml b/appveyor.yml index e973ac581..c108801e7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -45,10 +45,13 @@ test_script: - ps: .\ci\appveyor_build_recipe.ps1 on_finish: - - coverage xml -i - - codecov --file coverage.xml --flags Setup_Windows - - codecov --file py.coverage --flags Python_Tests - - codecov --file cs.coverage --flags Embedded_Tests + # Temporary disable multiple upload due to codecov limit of 20 per commit. + # https://docs.codecov.io/blog/week-8-2017 + # - coverage xml -i + # - codecov --file coverage.xml --flags setup_windows + # - codecov --file py.coverage --flags python_tests + # - codecov --file cs.coverage --flags embedded_tests + - codecov --flags setup_windows artifacts: - path: dist\* From 50365862234d06d7793a202472feee34ba188aca Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 1 Mar 2017 20:46:08 -0700 Subject: [PATCH 217/324] Fix test_multiple_calls_to_initialize Exception check didn't upgrade syntax from unittests. Didn't cause issues because test was passing. --- src/tests/test_engine.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tests/test_engine.py b/src/tests/test_engine.py index cca08a4d2..60fdbf45d 100644 --- a/src/tests/test_engine.py +++ b/src/tests/test_engine.py @@ -15,8 +15,8 @@ def test_multiple_calls_to_initialize(): PythonEngine.Initialize() PythonEngine.Initialize() PythonEngine.Initialize() - except BaseException: - self.fail("Initialize() raise an exception.") + except Exception: + assert False # Initialize() raise an exception. @pytest.mark.skip(reason="FIXME: test crashes") From 6f3f3571229ba8674e09cbee6843911eacc4d311 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 2 Mar 2017 09:10:18 -0700 Subject: [PATCH 218/324] Fix PythonEngine.Version Add TestPythonEngineProperties. Ensure PythonEngine properties are working correctly. Currently only work on 32bit machines. Closes #413 --- CHANGELOG.md | 1 + src/embed_tests/Python.EmbeddingTest.csproj | 1 + src/embed_tests/TestPythonEngineProperties.cs | 70 +++++++++++++++++++ src/runtime/pythonengine.cs | 14 ++-- src/runtime/runtime.cs | 10 +-- 5 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 src/embed_tests/TestPythonEngineProperties.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 35d449ebd..bf3f3b2da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Fixed `AppDomain` unload during GC (#397)(#400) - Fixed `Py_Main` & `PySys_SetArgvEx` `no mem error` on `UCS4/PY3` (#399) - Fixed `Python.Runtime.dll.config` on macOS (#120) +- Fixed crash on `PythonEngine.Version` (#413) ### Removed diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index b48c909a0..3cca9da70 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -89,6 +89,7 @@ + diff --git a/src/embed_tests/TestPythonEngineProperties.cs b/src/embed_tests/TestPythonEngineProperties.cs new file mode 100644 index 000000000..c11eca6db --- /dev/null +++ b/src/embed_tests/TestPythonEngineProperties.cs @@ -0,0 +1,70 @@ +using System; +using NUnit.Framework; +using Python.Runtime; + +namespace Python.EmbeddingTest +{ + public class TestPythonEngineProperties + { + [Test] + public static void GetBuildinfoDoesntCrash() + { + using (Py.GIL()) + { + string s = PythonEngine.BuildInfo; + + Assert.IsTrue(s.Length > 5); + Assert.IsTrue(s.Contains(",")); + } + } + + [Test] + public static void GetCompilerDoesntCrash() + { + using (Py.GIL()) + { + string s = PythonEngine.Compiler; + + Assert.IsTrue(s.Length > 0); + Assert.IsTrue(s.Contains("[")); + Assert.IsTrue(s.Contains("]")); + } + } + + [Test] + public static void GetCopyrightDoesntCrash() + { + using (Py.GIL()) + { + string s = PythonEngine.Copyright; + + Assert.IsTrue(s.Length > 0); + Assert.IsTrue(s.Contains("Python Software Foundation")); + } + } + + [Test] + public static void GetPlatformDoesntCrash() + { + using (Py.GIL()) + { + string s = PythonEngine.Platform; + + Assert.IsTrue(s.Length > 0); + Assert.IsTrue(s.Contains("x") || s.Contains("win")); + } + } + + [Test] + public static void GetVersionDoesntCrash() + { + using (Py.GIL()) + { + string s = PythonEngine.Version; + + Assert.IsTrue(s.Length > 0); + Assert.IsTrue(s.Contains(",")); + } + } + } +} diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index eb6f9fa4d..b199bcd2e 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -3,6 +3,7 @@ using System.IO; using System.Linq; using System.Reflection; +using System.Runtime.InteropServices; namespace Python.Runtime { @@ -96,22 +97,27 @@ public static string PythonPath public static string Version { - get { return Runtime.Py_GetVersion(); } + get { return Marshal.PtrToStringAnsi(Runtime.Py_GetVersion()); } } public static string BuildInfo { - get { return Runtime.Py_GetBuildInfo(); } + get { return Marshal.PtrToStringAnsi(Runtime.Py_GetBuildInfo()); } } public static string Platform { - get { return Runtime.Py_GetPlatform(); } + get { return Marshal.PtrToStringAnsi(Runtime.Py_GetPlatform()); } } public static string Copyright { - get { return Runtime.Py_GetCopyright(); } + get { return Marshal.PtrToStringAnsi(Runtime.Py_GetCopyright()); } + } + + public static string Compiler + { + get { return Marshal.PtrToStringAnsi(Runtime.Py_GetCompiler()); } } public static int RunSimpleString(string code) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 3611893aa..ad929b230 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -729,19 +729,19 @@ internal static extern void Py_SetPath( #endif [DllImport(PythonDll)] - internal static extern string Py_GetVersion(); + internal static extern IntPtr Py_GetVersion(); [DllImport(PythonDll)] - internal static extern string Py_GetPlatform(); + internal static extern IntPtr Py_GetPlatform(); [DllImport(PythonDll)] - internal static extern string Py_GetCopyright(); + internal static extern IntPtr Py_GetCopyright(); [DllImport(PythonDll)] - internal static extern string Py_GetCompiler(); + internal static extern IntPtr Py_GetCompiler(); [DllImport(PythonDll)] - internal static extern string Py_GetBuildInfo(); + internal static extern IntPtr Py_GetBuildInfo(); [DllImport(PythonDll)] internal static extern int PyRun_SimpleString(string code); From e200cae68134fdafe5baf87f953d81fcd79badb4 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 2 Mar 2017 10:42:39 -0700 Subject: [PATCH 219/324] Add PYTHONPATH/PYTHONHOME default value tests Current tests crash on 64bit python on windows, and results get truncated on Linux. When working, PYTHONHOME should match ENV VAR if set. AppVeyor has been updated to test against not blank --- appveyor.yml | 3 ++ src/embed_tests/TestPythonEngineProperties.cs | 39 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index c108801e7..53fada6d7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -27,6 +27,9 @@ init: # Put desired Python version first in PATH - set PATH=%PYTHON%;%PYTHON%\Scripts;%PATH% + # Needed for test `GetPythonHomeDefault` + - set PYTHONHOME=%PYTHON% + install: - pip install --upgrade -r requirements.txt --quiet diff --git a/src/embed_tests/TestPythonEngineProperties.cs b/src/embed_tests/TestPythonEngineProperties.cs index c11eca6db..25da158f2 100644 --- a/src/embed_tests/TestPythonEngineProperties.cs +++ b/src/embed_tests/TestPythonEngineProperties.cs @@ -66,5 +66,44 @@ public static void GetVersionDoesntCrash() Assert.IsTrue(s.Contains(",")); } } + + [Test] + public static void GetPythonPathDefault() + { + PythonEngine.Initialize(); + string s = PythonEngine.PythonPath; + + StringAssert.Contains("python", s.ToLower()); + PythonEngine.Shutdown(); + } + + [Test] + public static void GetProgramNameDefault() + { + PythonEngine.Initialize(); + string s = PythonEngine.PythonHome; + + Assert.NotNull(s); + PythonEngine.Shutdown(); + } + + /// + /// Test default behavior of PYTHONHOME. If ENVVAR is set it will + /// return the same value. If not, returns EmptyString. + /// + /// + /// AppVeyor.yml has been update to tests with ENVVAR set. + /// + [Test] + public static void GetPythonHomeDefault() + { + string envPythonHome = Environment.GetEnvironmentVariable("PYTHONHOME") ?? ""; + + PythonEngine.Initialize(); + string enginePythonHome = PythonEngine.PythonHome; + + Assert.AreEqual(envPythonHome, enginePythonHome); + PythonEngine.Shutdown(); + } } } From 0cfc67a106ba0d69bf958e80ab3aab0a65262828 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 2 Mar 2017 11:38:27 -0700 Subject: [PATCH 220/324] Fix get PYTHONHOME/PYTHONPATH marshal Unlike #413, the return type changes between PY2/PY3. Extended Custom Marshaler to convert IntPtr to Unicode String --- src/runtime/CustomMarshaler.cs | 27 +++++++++++++++++++++++++ src/runtime/pythonengine.cs | 36 +++++++++++++++++----------------- src/runtime/runtime.cs | 15 ++++++-------- 3 files changed, 51 insertions(+), 27 deletions(-) diff --git a/src/runtime/CustomMarshaler.cs b/src/runtime/CustomMarshaler.cs index 475fa05eb..bdc32b9d9 100644 --- a/src/runtime/CustomMarshaler.cs +++ b/src/runtime/CustomMarshaler.cs @@ -72,6 +72,33 @@ public static ICustomMarshaler GetInstance(string cookie) { return Instance; } + + public static string PtrToStringUni(IntPtr p) + { + if (p == IntPtr.Zero) + { + return null; + } + + int size = GetUnicodeByteLength(p); + var buffer = new byte[size]; + Marshal.Copy(p, buffer, 0, size); + return PyEncoding.GetString(buffer, 0, size); + } + + public static int GetUnicodeByteLength(IntPtr p) + { + var len = 0; + while (true) + { + int c = Runtime.UCS == 2 + ? Marshal.ReadInt16(p, len * 2) + : Marshal.ReadInt32(p, len * 4); + + if (c == 0) return len* Runtime.UCS; + checked{ ++len; } + } + } } diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index b199bcd2e..e6808a514 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -57,12 +57,12 @@ public static string ProgramName { get { - string result = Runtime.Py_GetProgramName(); - if (result == null) - { - return ""; - } - return result; + IntPtr p = Runtime.Py_GetProgramName(); + string result = Runtime.IsPython3 + ? StrMarshaler.PtrToStringUni(p) + : Marshal.PtrToStringAnsi(p); + + return result ?? ""; } set { Runtime.Py_SetProgramName(value); } } @@ -71,12 +71,12 @@ public static string PythonHome { get { - string result = Runtime.Py_GetPythonHome(); - if (result == null) - { - return ""; - } - return result; + IntPtr p = Runtime.Py_GetPythonHome(); + string result = Runtime.IsPython3 + ? StrMarshaler.PtrToStringUni(p) + : Marshal.PtrToStringAnsi(p); + + return result ?? ""; } set { Runtime.Py_SetPythonHome(value); } } @@ -85,12 +85,12 @@ public static string PythonPath { get { - string result = Runtime.Py_GetPath(); - if (result == null) - { - return ""; - } - return result; + IntPtr p = Runtime.Py_GetPath(); + string result = Runtime.IsPython3 + ? StrMarshaler.PtrToStringUni(p) + : Marshal.PtrToStringAnsi(p); + + return result ?? ""; } set { Runtime.Py_SetPath(value); } } diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index ad929b230..eaf55c91b 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -683,8 +683,7 @@ public static extern int Py_Main( #if PYTHON3 [DllImport(PythonDll)] - [return: MarshalAs(UnmanagedType.LPWStr)] - internal static extern string Py_GetProgramName(); + internal static extern IntPtr Py_GetProgramName(); [DllImport(PythonDll)] internal static extern void Py_SetProgramName( @@ -692,8 +691,7 @@ internal static extern void Py_SetProgramName( ); [DllImport(PythonDll)] - [return: MarshalAs(UnmanagedType.LPWStr)] - internal static extern string Py_GetPythonHome(); + internal static extern IntPtr Py_GetPythonHome(); [DllImport(PythonDll)] internal static extern void Py_SetPythonHome( @@ -701,8 +699,7 @@ internal static extern void Py_SetPythonHome( ); [DllImport(PythonDll)] - [return: MarshalAs(UnmanagedType.LPWStr)] - internal static extern string Py_GetPath(); + internal static extern IntPtr Py_GetPath(); [DllImport(PythonDll)] internal static extern void Py_SetPath( @@ -710,19 +707,19 @@ internal static extern void Py_SetPath( ); #elif PYTHON2 [DllImport(PythonDll)] - internal static extern string Py_GetProgramName(); + internal static extern IntPtr Py_GetProgramName(); [DllImport(PythonDll)] internal static extern void Py_SetProgramName(string name); [DllImport(PythonDll)] - internal static extern string Py_GetPythonHome(); + internal static extern IntPtr Py_GetPythonHome(); [DllImport(PythonDll)] internal static extern void Py_SetPythonHome(string home); [DllImport(PythonDll)] - internal static extern string Py_GetPath(); + internal static extern IntPtr Py_GetPath(); [DllImport(PythonDll)] internal static extern void Py_SetPath(string home); From ffe64486b42aa6365e9af967d213caaaf22168f5 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 2 Mar 2017 13:40:12 -0700 Subject: [PATCH 221/324] Rename internal StrMarshaler to UcsMarshaler To clarify that this is meant to be applied on Unicode type IntPtr and not strings like ones. Made Marshalers internal, don't see a reason to expose it. --- src/runtime/CustomMarshaler.cs | 10 +++++----- src/runtime/pythonengine.cs | 6 +++--- src/runtime/runtime.cs | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/runtime/CustomMarshaler.cs b/src/runtime/CustomMarshaler.cs index bdc32b9d9..2241f29ae 100644 --- a/src/runtime/CustomMarshaler.cs +++ b/src/runtime/CustomMarshaler.cs @@ -9,7 +9,7 @@ namespace Python.Runtime /// Abstract class defining boiler plate methods that /// Custom Marshalers will use. /// - public abstract class MarshalerBase : ICustomMarshaler + internal abstract class MarshalerBase : ICustomMarshaler { public object MarshalNativeToManaged(IntPtr pNativeData) { @@ -39,9 +39,9 @@ public int GetNativeDataSize() /// Custom Marshaler to deal with Managed String to Native /// conversion differences on UCS2/UCS4. /// - public class StrMarshaler : MarshalerBase + internal class UcsMarshaler : MarshalerBase { - private static readonly MarshalerBase Instance = new StrMarshaler(); + private static readonly MarshalerBase Instance = new UcsMarshaler(); private static readonly Encoding PyEncoding = Runtime.PyEncoding; public override IntPtr MarshalManagedToNative(object managedObj) @@ -106,7 +106,7 @@ public static int GetUnicodeByteLength(IntPtr p) /// Custom Marshaler to deal with Managed String Arrays to Native /// conversion differences on UCS2/UCS4. /// - public class StrArrayMarshaler : MarshalerBase + internal class StrArrayMarshaler : MarshalerBase { private static readonly MarshalerBase Instance = new StrArrayMarshaler(); private static readonly Encoding PyEncoding = Runtime.PyEncoding; @@ -161,7 +161,7 @@ public static ICustomMarshaler GetInstance(string cookie) /// If instead we used `MarshalAs(UnmanagedType.LPWStr)` the output to /// `foo` would be `f\x00o\x00o\x00`. /// - public class Utf8Marshaler : MarshalerBase + internal class Utf8Marshaler : MarshalerBase { private static readonly MarshalerBase Instance = new Utf8Marshaler(); private static readonly Encoding PyEncoding = Encoding.UTF8; diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index e6808a514..4a641e538 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -59,7 +59,7 @@ public static string ProgramName { IntPtr p = Runtime.Py_GetProgramName(); string result = Runtime.IsPython3 - ? StrMarshaler.PtrToStringUni(p) + ? UcsMarshaler.PtrToStringUni(p) : Marshal.PtrToStringAnsi(p); return result ?? ""; @@ -73,7 +73,7 @@ public static string PythonHome { IntPtr p = Runtime.Py_GetPythonHome(); string result = Runtime.IsPython3 - ? StrMarshaler.PtrToStringUni(p) + ? UcsMarshaler.PtrToStringUni(p) : Marshal.PtrToStringAnsi(p); return result ?? ""; @@ -87,7 +87,7 @@ public static string PythonPath { IntPtr p = Runtime.Py_GetPath(); string result = Runtime.IsPython3 - ? StrMarshaler.PtrToStringUni(p) + ? UcsMarshaler.PtrToStringUni(p) : Marshal.PtrToStringAnsi(p); return result ?? ""; diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index eaf55c91b..540e2c45c 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1239,7 +1239,7 @@ internal static bool PyUnicode_Check(IntPtr ob) [DllImport(PythonDll)] internal static extern IntPtr PyUnicode_FromKindAndData( int kind, - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrMarshaler))] string s, + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UcsMarshaler))] string s, int size ); @@ -1265,7 +1265,7 @@ internal static IntPtr PyUnicode_FromUnicode(string s, int size) [DllImport(PythonDll, EntryPoint = PyUnicodeEntryPoint + "FromUnicode")] internal static extern IntPtr PyUnicode_FromUnicode( - [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrMarshaler))] string s, + [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UcsMarshaler))] string s, int size ); From f4c2ca2a2e57b94a8ebd9efb67decd0f5956ac14 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 2 Mar 2017 18:03:59 -0700 Subject: [PATCH 222/324] Unset PYTHONHOME in AppVeyor Its messing with `conda` causing it to fail to start. Tests in the `pr` #415 make this unnecessary. --- appveyor.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 53fada6d7..c108801e7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -27,9 +27,6 @@ init: # Put desired Python version first in PATH - set PATH=%PYTHON%;%PYTHON%\Scripts;%PATH% - # Needed for test `GetPythonHomeDefault` - - set PYTHONHOME=%PYTHON% - install: - pip install --upgrade -r requirements.txt --quiet From 0a478024175e52106d9d4ff2230e1f505e56d7d8 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 2 Mar 2017 18:17:01 -0700 Subject: [PATCH 223/324] Update conda Update to using conda based on PY36. Remove reference to deleted `dll.config` file --- ci/appveyor_build_recipe.ps1 | 2 +- conda.recipe/bld.bat | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/ci/appveyor_build_recipe.ps1 b/ci/appveyor_build_recipe.ps1 index 278e292b0..52520f4c2 100644 --- a/ci/appveyor_build_recipe.ps1 +++ b/ci/appveyor_build_recipe.ps1 @@ -2,7 +2,7 @@ $env:CONDA_PY = "$env:PY_VER" # Use pre-installed miniconda. Note that location differs if 64bit -$env:CONDA_BLD = "C:\miniconda35" +$env:CONDA_BLD = "C:\miniconda36" if ($env:PLATFORM -eq "x86"){ $env:CONDA_BLD_ARCH=32 diff --git a/conda.recipe/bld.bat b/conda.recipe/bld.bat index d846fc738..1495f877d 100644 --- a/conda.recipe/bld.bat +++ b/conda.recipe/bld.bat @@ -4,10 +4,3 @@ set PATH=C:\Program Files (x86)\MSBuild\14.0\Bin;%PATH% %PYTHON% setup.py install - -:: copy our compiled library -set SRC=%RECIPE_DIR%\.. -set DEST=%SP_DIR% - -:: Install step -copy %SRC%\Python.Runtime.dll.config %DEST% From 6668ebf5fef1a28246d5c691bf1d05d86b25fd32 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 2 Mar 2017 01:24:34 -0700 Subject: [PATCH 224/324] Fix PythonEngine PYTHONHOME setter Keep memory reference & fix PY3 marshal --- src/embed_tests/TestPythonEngineProperties.cs | 25 +++++++++++++++++++ src/runtime/pythonengine.cs | 15 ++++++++++- src/runtime/runtime.cs | 6 ++--- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/embed_tests/TestPythonEngineProperties.cs b/src/embed_tests/TestPythonEngineProperties.cs index 25da158f2..c7bf0870b 100644 --- a/src/embed_tests/TestPythonEngineProperties.cs +++ b/src/embed_tests/TestPythonEngineProperties.cs @@ -105,5 +105,30 @@ public static void GetPythonHomeDefault() Assert.AreEqual(envPythonHome, enginePythonHome); PythonEngine.Shutdown(); } + + [Test] + public void SetPythonHome() + { + var pythonHome = "/dummypath/"; + + PythonEngine.PythonHome = pythonHome; + PythonEngine.Initialize(); + + Assert.AreEqual(pythonHome, PythonEngine.PythonHome); + PythonEngine.Shutdown(); + } + + [Test] + public void SetPythonHomeTwice() + { + var pythonHome = "/dummypath/"; + + PythonEngine.PythonHome = "/dummypath2/"; + PythonEngine.PythonHome = pythonHome; + PythonEngine.Initialize(); + + Assert.AreEqual(pythonHome, PythonEngine.PythonHome); + PythonEngine.Shutdown(); + } } } diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index 4a641e538..8a00bb39f 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -14,6 +14,7 @@ public class PythonEngine : IDisposable { private static DelegateManager delegateManager; private static bool initialized; + private static IntPtr _pythonHome = IntPtr.Zero; public PythonEngine() { @@ -78,7 +79,17 @@ public static string PythonHome return result ?? ""; } - set { Runtime.Py_SetPythonHome(value); } + set + { + if (_pythonHome != IntPtr.Zero) + { + Marshal.FreeHGlobal(_pythonHome); + } + _pythonHome = Runtime.IsPython3 + ? UcsMarshaler.GetInstance("").MarshalManagedToNative(value) + : Marshal.StringToHGlobalAnsi(value); + Runtime.Py_SetPythonHome(_pythonHome); + } } public static string PythonPath @@ -284,6 +295,8 @@ public static void Shutdown() { if (initialized) { + Marshal.FreeHGlobal(_pythonHome); + _pythonHome = IntPtr.Zero; Runtime.Shutdown(); initialized = false; } diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 540e2c45c..e73ce07c3 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -694,9 +694,7 @@ internal static extern void Py_SetProgramName( internal static extern IntPtr Py_GetPythonHome(); [DllImport(PythonDll)] - internal static extern void Py_SetPythonHome( - [MarshalAs(UnmanagedType.LPWStr)] string home - ); + internal static extern void Py_SetPythonHome(IntPtr home); [DllImport(PythonDll)] internal static extern IntPtr Py_GetPath(); @@ -716,7 +714,7 @@ internal static extern void Py_SetPath( internal static extern IntPtr Py_GetPythonHome(); [DllImport(PythonDll)] - internal static extern void Py_SetPythonHome(string home); + internal static extern void Py_SetPythonHome(IntPtr home); [DllImport(PythonDll)] internal static extern IntPtr Py_GetPath(); From 321aa28ba6229bf5eea619c6d484093c16f12700 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 2 Mar 2017 16:40:12 -0700 Subject: [PATCH 225/324] Fix set PythonPath, set ProgramName Note on PythonPath. Its actually mapping to `Py_SetPath` which is very different from PYTHONPATH env var. There is no test on it because it should be set to real paths with libraries. Otherwise it crashes. 2nd Note. `Py_SetPath` doesn't exist on PY27. --- src/embed_tests/TestPythonEngineProperties.cs | 12 ++++++++ src/runtime/pythonengine.cs | 30 +++++++++++++++---- src/runtime/runtime.cs | 12 +++----- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/embed_tests/TestPythonEngineProperties.cs b/src/embed_tests/TestPythonEngineProperties.cs index c7bf0870b..11db57b3d 100644 --- a/src/embed_tests/TestPythonEngineProperties.cs +++ b/src/embed_tests/TestPythonEngineProperties.cs @@ -130,5 +130,17 @@ public void SetPythonHomeTwice() Assert.AreEqual(pythonHome, PythonEngine.PythonHome); PythonEngine.Shutdown(); } + + [Test] + public void SetProgramName() + { + var programName = "FooBar"; + + PythonEngine.ProgramName = programName; + PythonEngine.Initialize(); + + Assert.AreEqual(programName, PythonEngine.ProgramName); + PythonEngine.Shutdown(); + } } } diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index 8a00bb39f..b5f609630 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -15,6 +15,8 @@ public class PythonEngine : IDisposable private static DelegateManager delegateManager; private static bool initialized; private static IntPtr _pythonHome = IntPtr.Zero; + private static IntPtr _programName = IntPtr.Zero; + private static IntPtr _pythonPath = IntPtr.Zero; public PythonEngine() { @@ -65,7 +67,14 @@ public static string ProgramName return result ?? ""; } - set { Runtime.Py_SetProgramName(value); } + set + { + Marshal.FreeHGlobal(_programName); + _programName = Runtime.IsPython3 + ? UcsMarshaler.GetInstance("").MarshalManagedToNative(value) + : Marshal.StringToHGlobalAnsi(value); + Runtime.Py_SetProgramName(_programName); + } } public static string PythonHome @@ -81,10 +90,7 @@ public static string PythonHome } set { - if (_pythonHome != IntPtr.Zero) - { - Marshal.FreeHGlobal(_pythonHome); - } + Marshal.FreeHGlobal(_pythonHome); _pythonHome = Runtime.IsPython3 ? UcsMarshaler.GetInstance("").MarshalManagedToNative(value) : Marshal.StringToHGlobalAnsi(value); @@ -103,7 +109,14 @@ public static string PythonPath return result ?? ""; } - set { Runtime.Py_SetPath(value); } + set + { + Marshal.FreeHGlobal(_pythonPath); + _pythonPath = Runtime.IsPython3 + ? UcsMarshaler.GetInstance("").MarshalManagedToNative(value) + : Marshal.StringToHGlobalAnsi(value); + Runtime.Py_SetPath(_pythonPath); + } } public static string Version @@ -297,6 +310,11 @@ public static void Shutdown() { Marshal.FreeHGlobal(_pythonHome); _pythonHome = IntPtr.Zero; + Marshal.FreeHGlobal(_programName); + _programName = IntPtr.Zero; + Marshal.FreeHGlobal(_pythonPath); + _pythonPath = IntPtr.Zero; + Runtime.Shutdown(); initialized = false; } diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index e73ce07c3..d47c02490 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -686,9 +686,7 @@ public static extern int Py_Main( internal static extern IntPtr Py_GetProgramName(); [DllImport(PythonDll)] - internal static extern void Py_SetProgramName( - [MarshalAs(UnmanagedType.LPWStr)] string name - ); + internal static extern void Py_SetProgramName(IntPtr name); [DllImport(PythonDll)] internal static extern IntPtr Py_GetPythonHome(); @@ -700,15 +698,13 @@ internal static extern void Py_SetProgramName( internal static extern IntPtr Py_GetPath(); [DllImport(PythonDll)] - internal static extern void Py_SetPath( - [MarshalAs(UnmanagedType.LPWStr)] string home - ); + internal static extern void Py_SetPath(IntPtr home); #elif PYTHON2 [DllImport(PythonDll)] internal static extern IntPtr Py_GetProgramName(); [DllImport(PythonDll)] - internal static extern void Py_SetProgramName(string name); + internal static extern void Py_SetProgramName(IntPtr name); [DllImport(PythonDll)] internal static extern IntPtr Py_GetPythonHome(); @@ -720,7 +716,7 @@ internal static extern void Py_SetPath( internal static extern IntPtr Py_GetPath(); [DllImport(PythonDll)] - internal static extern void Py_SetPath(string home); + internal static extern void Py_SetPath(IntPtr home); #endif [DllImport(PythonDll)] From 3225465c39298f6205975dc24b41c3a2766ae1f6 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 3 Mar 2017 09:57:12 -0700 Subject: [PATCH 226/324] Deprecate public RunString Had to remove defaults to disambiguate call on `internal RunString`. Can re-add after removing `public RunString` Closes #401 --- CHANGELOG.md | 6 +++++- src/runtime/pythonengine.cs | 20 +++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c768b9946..ad9868020 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,10 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Unfroze Mono version on Travis (#345) - Changed `conda.recipe` build to only pull-requests (#345) +### Deprecated + +- Deprecated `RunString` (#401) + ### Fixed - Fixed crash during Initialization (#262)(#343) @@ -52,7 +56,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Fixed `Py_Main` & `PySys_SetArgvEx` `no mem error` on `UCS4/PY3` (#399) - Fixed `Python.Runtime.dll.config` on macOS (#120) - Fixed crash on `PythonEngine.Version` (#413) -- Fixed `PythonEngine.PythonPath` issues (#414) +- Fixed `PythonEngine.PythonPath` issues (#179)(#414)(#415) ### Removed diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index b5f609630..97d4eb693 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -469,16 +469,24 @@ public static void Exec(string code, IntPtr? globals = null, IntPtr? locals = nu /// - /// RunString Method + /// RunString Method. Function has been deprecated and will be removed. + /// Use Exec/Eval/RunSimpleString instead. + /// + [Obsolete("RunString is deprecated and will be removed. Use Exec/Eval/RunSimpleString instead.")] + public static PyObject RunString(string code, IntPtr? globals = null, IntPtr? locals = null) + { + return RunString(code, globals, locals, RunFlagType.File); + } + + /// + /// Internal RunString Method. /// /// /// Run a string containing Python code. Returns the result of /// executing the code string as a PyObject instance, or null if /// an exception was raised. /// - public static PyObject RunString( - string code, IntPtr? globals = null, IntPtr? locals = null, RunFlagType _flag = RunFlagType.File - ) + internal static PyObject RunString(string code, IntPtr? globals, IntPtr? locals, RunFlagType flag) { var borrowedGlobals = true; if (globals == null) @@ -502,12 +510,10 @@ public static PyObject RunString( borrowedLocals = false; } - var flag = (IntPtr)_flag; - try { IntPtr result = Runtime.PyRun_String( - code, flag, globals.Value, locals.Value + code, (IntPtr)flag, globals.Value, locals.Value ); Runtime.CheckExceptionOccurred(); From a14ff1479babf15519cbf1d775d56a90c7b621b7 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 3 Mar 2017 10:31:46 -0700 Subject: [PATCH 227/324] Combine Py_DEBUG and PYTHON_WITH_PYDEBUG flags They both refer to the PyDebug builds but were added at different times. Closes #362 --- src/runtime/interop.cs | 8 ++++---- src/runtime/runtime.cs | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/runtime/interop.cs b/src/runtime/interop.cs index 14a69591c..4ae4b61e0 100644 --- a/src/runtime/interop.cs +++ b/src/runtime/interop.cs @@ -75,7 +75,7 @@ static ObjectOffset() { int size = IntPtr.Size; var n = 0; // Py_TRACE_REFS add two pointers to PyObject_HEAD -#if Py_DEBUG +#if PYTHON_WITH_PYDEBUG _ob_next = 0; _ob_prev = 1 * size; n = 2; @@ -113,14 +113,14 @@ public static int Size(IntPtr ob) { return ExceptionOffset.Size(); } -#if Py_DEBUG +#if PYTHON_WITH_PYDEBUG return 6 * IntPtr.Size; #else return 4 * IntPtr.Size; #endif } -#if Py_DEBUG +#if PYTHON_WITH_PYDEBUG public static int _ob_next; public static int _ob_prev; #endif @@ -185,7 +185,7 @@ static BytesOffset() /* The *real* layout of a type object when allocated on the heap */ //typedef struct _heaptypeobject { -#if Py_DEBUG // #ifdef Py_TRACE_REFS +#if PYTHON_WITH_PYDEBUG /* _PyObject_HEAD_EXTRA defines pointers to support a doubly-linked list of all live heap objects. */ public static int _ob_next = 0; public static int _ob_prev = 0; diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index d47c02490..3fee90fa5 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -508,7 +508,7 @@ internal static Type[] PythonArgsToTypeArray(IntPtr arg, bool mangleObjects) /// internal static unsafe void XIncref(IntPtr op) { -#if Py_DEBUG +#if PYTHON_WITH_PYDEBUG // according to Python doc, Py_IncRef() is Py_XINCREF() Py_IncRef(op); return; @@ -530,7 +530,7 @@ internal static unsafe void XIncref(IntPtr op) internal static unsafe void XDecref(IntPtr op) { -#if Py_DEBUG +#if PYTHON_WITH_PYDEBUG // Py_DecRef calls Python's Py_DECREF // according to Python doc, Py_DecRef() is Py_XDECREF() Py_DecRef(op); @@ -584,7 +584,7 @@ internal static unsafe long Refcount(IntPtr op) return 0; } -#if Py_DEBUG +#if PYTHON_WITH_PYDEBUG // Py_IncRef and Py_DecRef are taking care of the extra payload // in Py_DEBUG builds of Python like _Py_RefTotal [DllImport(PythonDll)] @@ -781,7 +781,7 @@ internal static unsafe IntPtr PyObject_TYPE(IntPtr op) { return IntPtr.Zero; } -#if Py_DEBUG +#if PYTHON_WITH_PYDEBUG var n = 3; #else var n = 1; From 8fba051956060aa325a7825a7e41910b2116c2ce Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 3 Mar 2017 12:49:13 -0700 Subject: [PATCH 228/324] Remove PYTHON_WITH_WIDE_UNICODE flag ABIFlags were introduced in PY32, and --with_wide_unicode was removed in PY33. https://docs.python.org/3/whatsnew/3.3.html#functionality Closes #417 --- CHANGELOG.md | 2 ++ setup.py | 2 -- src/runtime/runtime.cs | 7 +------ 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad9868020..bf2384e9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Upgraded NUnit framework from `2.6.4` to `3.6.0` (#371) - Unfroze Mono version on Travis (#345) - Changed `conda.recipe` build to only pull-requests (#345) +- Combine `Py_DEBUG` and `PYTHON_WITH_PYDEBUG` flags (#362) ### Deprecated @@ -63,6 +64,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Removed `six` dependency for `unittests` (#329) - Removed `Mono.Unix` dependency for `UCS4` (#360) - Removed need for `Python.Runtime.dll.config` +- Removed PY32 build option `PYTHON_WITH_WIDE_UNICODE` (#417) ## [2.2.2][] - 2017-01-29 diff --git a/setup.py b/setup.py index 6e14b91ec..bb2a4d140 100644 --- a/setup.py +++ b/setup.py @@ -182,8 +182,6 @@ def build_extension(self, ext): defines.append("PYTHON_WITH_PYDEBUG") if "m" in sys.abiflags: defines.append("PYTHON_WITH_PYMALLOC") - if "u" in sys.abiflags: - defines.append("PYTHON_WITH_WIDE_UNICODE") # check the interop file exists, and create it if it doesn't interop_file = _get_interop_filename() diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 3fee90fa5..d98a20c0a 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -138,16 +138,11 @@ public class Runtime #else internal const string dllWithPyMalloc = ""; #endif -#if PYTHON_WITH_WIDE_UNICODE - internal const string dllWithWideUnicode = "u"; -#else - internal const string dllWithWideUnicode = ""; -#endif #if PYTHON_WITHOUT_ENABLE_SHARED public const string PythonDll = "__Internal"; #else - public const string PythonDll = dllBase + dllWithPyDebug + dllWithPyMalloc + dllWithWideUnicode; + public const string PythonDll = dllBase + dllWithPyDebug + dllWithPyMalloc; #endif public static readonly int pyversionnumber = Convert.ToInt32(pyver); From 85c85f2f7152967e1177f24f48a148db2e810365 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 3 Mar 2017 14:48:45 -0700 Subject: [PATCH 229/324] Refactor PY2/PY3 Marshal in/out String/Unicode --- src/runtime/CustomMarshaler.cs | 46 ++++++++++++++++++++++++++++++++-- src/runtime/pythonengine.cs | 30 +++++----------------- 2 files changed, 50 insertions(+), 26 deletions(-) diff --git a/src/runtime/CustomMarshaler.cs b/src/runtime/CustomMarshaler.cs index 2241f29ae..90bb77a71 100644 --- a/src/runtime/CustomMarshaler.cs +++ b/src/runtime/CustomMarshaler.cs @@ -95,10 +95,52 @@ public static int GetUnicodeByteLength(IntPtr p) ? Marshal.ReadInt16(p, len * 2) : Marshal.ReadInt32(p, len * 4); - if (c == 0) return len* Runtime.UCS; - checked{ ++len; } + if (c == 0) + { + return len * Runtime.UCS; + } + checked + { + ++len; + } } } + + /// + /// Utility function for Marshaling Unicode on PY3 and AnsiStr on PY2. + /// Use on functions whose Input signatures changed between PY2/PY3. + /// Ex. Py_SetPythonHome + /// + /// Managed String + /// + /// Ptr to Native String ANSI(PY2)/Unicode(PY3/UCS2)/UTF32(PY3/UCS4. + /// + /// + /// You MUST deallocate the IntPtr of the Return when done with it. + /// + public static IntPtr Py3UnicodePy2StringtoPtr(string s) + { + return Runtime.IsPython3 + ? Instance.MarshalManagedToNative(s) + : Marshal.StringToHGlobalAnsi(s); + } + + /// + /// Utility function for Marshaling Unicode IntPtr on PY3 and + /// AnsiStr IntPtr on PY2 to Managed Strings. Use on Python functions + /// whose return type changed between PY2/PY3. + /// Ex. Py_GetPythonHome + /// + /// Native Ansi/Unicode/UTF32 String + /// + /// Managed String + /// + public static string PtrToPy3UnicodePy2String(IntPtr p) + { + return Runtime.IsPython3 + ? PtrToStringUni(p) + : Marshal.PtrToStringAnsi(p); + } } diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index 97d4eb693..b97bea01b 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -61,18 +61,12 @@ public static string ProgramName get { IntPtr p = Runtime.Py_GetProgramName(); - string result = Runtime.IsPython3 - ? UcsMarshaler.PtrToStringUni(p) - : Marshal.PtrToStringAnsi(p); - - return result ?? ""; + return UcsMarshaler.PtrToPy3UnicodePy2String(p) ?? ""; } set { Marshal.FreeHGlobal(_programName); - _programName = Runtime.IsPython3 - ? UcsMarshaler.GetInstance("").MarshalManagedToNative(value) - : Marshal.StringToHGlobalAnsi(value); + _programName = UcsMarshaler.Py3UnicodePy2StringtoPtr(value); Runtime.Py_SetProgramName(_programName); } } @@ -82,18 +76,12 @@ public static string PythonHome get { IntPtr p = Runtime.Py_GetPythonHome(); - string result = Runtime.IsPython3 - ? UcsMarshaler.PtrToStringUni(p) - : Marshal.PtrToStringAnsi(p); - - return result ?? ""; + return UcsMarshaler.PtrToPy3UnicodePy2String(p) ?? ""; } set { Marshal.FreeHGlobal(_pythonHome); - _pythonHome = Runtime.IsPython3 - ? UcsMarshaler.GetInstance("").MarshalManagedToNative(value) - : Marshal.StringToHGlobalAnsi(value); + _pythonHome = UcsMarshaler.Py3UnicodePy2StringtoPtr(value); Runtime.Py_SetPythonHome(_pythonHome); } } @@ -103,18 +91,12 @@ public static string PythonPath get { IntPtr p = Runtime.Py_GetPath(); - string result = Runtime.IsPython3 - ? UcsMarshaler.PtrToStringUni(p) - : Marshal.PtrToStringAnsi(p); - - return result ?? ""; + return UcsMarshaler.PtrToPy3UnicodePy2String(p) ?? ""; } set { Marshal.FreeHGlobal(_pythonPath); - _pythonPath = Runtime.IsPython3 - ? UcsMarshaler.GetInstance("").MarshalManagedToNative(value) - : Marshal.StringToHGlobalAnsi(value); + _pythonPath = UcsMarshaler.Py3UnicodePy2StringtoPtr(value); Runtime.Py_SetPath(_pythonPath); } } From 895516e52bdb016208442c57613a356ca1a53bdb Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 3 Mar 2017 15:36:57 -0700 Subject: [PATCH 230/324] Refactor runtime.cs --- src/runtime/runtime.cs | 48 +++++++----------------------------------- 1 file changed, 8 insertions(+), 40 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index d98a20c0a..d3c756adf 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -565,18 +565,11 @@ internal static unsafe void XDecref(IntPtr op) internal static unsafe long Refcount(IntPtr op) { var p = (void*)op; - if ((void*)0 != p) + if ((void*)0 == p) { - if (Is32Bit) - { - return (*(int*)p); - } - else - { - return (*(long*)p); - } + return 0; } - return 0; + return Is32Bit ? (*(int*)p) : (*(long*)p); } #if PYTHON_WITH_PYDEBUG @@ -676,25 +669,6 @@ public static extern int Py_Main( [DllImport(PythonDll)] internal static extern IntPtr PyEval_GetLocals(); -#if PYTHON3 - [DllImport(PythonDll)] - internal static extern IntPtr Py_GetProgramName(); - - [DllImport(PythonDll)] - internal static extern void Py_SetProgramName(IntPtr name); - - [DllImport(PythonDll)] - internal static extern IntPtr Py_GetPythonHome(); - - [DllImport(PythonDll)] - internal static extern void Py_SetPythonHome(IntPtr home); - - [DllImport(PythonDll)] - internal static extern IntPtr Py_GetPath(); - - [DllImport(PythonDll)] - internal static extern void Py_SetPath(IntPtr home); -#elif PYTHON2 [DllImport(PythonDll)] internal static extern IntPtr Py_GetProgramName(); @@ -712,7 +686,6 @@ public static extern int Py_Main( [DllImport(PythonDll)] internal static extern void Py_SetPath(IntPtr home); -#endif [DllImport(PythonDll)] internal static extern IntPtr Py_GetVersion(); @@ -781,20 +754,15 @@ internal static unsafe IntPtr PyObject_TYPE(IntPtr op) #else var n = 1; #endif - if (Is32Bit) - { - return new IntPtr((void*)(*((uint*)p + n))); - } - else - { - return new IntPtr((void*)(*((ulong*)p + n))); - } + return Is32Bit + ? new IntPtr((void*)(*((uint*)p + n))) + : new IntPtr((void*)(*((ulong*)p + n))); } /// /// Managed version of the standard Python C API PyObject_Type call. - /// This version avoids a managed <-> unmanaged transition. This one - /// does incref the returned type object. + /// This version avoids a managed <-> unmanaged transition. + /// This one does incref the returned type object. /// internal static IntPtr PyObject_Type(IntPtr op) { From 7db41a9eaca9e702d9b7cc9363f99c3520fc930a Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Thu, 2 Mar 2017 21:47:11 -0700 Subject: [PATCH 231/324] Fix Py_SetPath not available in PY2 Closes #418 --- src/embed_tests/TestPythonEngineProperties.cs | 41 +++++++++++++++++++ src/runtime/pythonengine.cs | 4 ++ 2 files changed, 45 insertions(+) diff --git a/src/embed_tests/TestPythonEngineProperties.cs b/src/embed_tests/TestPythonEngineProperties.cs index 11db57b3d..9623ff25d 100644 --- a/src/embed_tests/TestPythonEngineProperties.cs +++ b/src/embed_tests/TestPythonEngineProperties.cs @@ -142,5 +142,46 @@ public void SetProgramName() Assert.AreEqual(programName, PythonEngine.ProgramName); PythonEngine.Shutdown(); } + + [Test] + public void SetPythonPath() + { + if (Runtime.Runtime.pyversion == "2.7") + { + // Assert.Skip outputs as a warning (ie. pending to fix) + Assert.Pass(); + } + + PythonEngine.Initialize(); + string path = PythonEngine.PythonPath; + PythonEngine.Shutdown(); + + PythonEngine.ProgramName = path; + PythonEngine.Initialize(); + + Assert.AreEqual(path, PythonEngine.PythonPath); + PythonEngine.Shutdown(); + } + + [Test] + public void SetPythonPathExceptionOn27() + { + if (Runtime.Runtime.pyversion != "2.7") + { + Assert.Pass(); + } + + // Get previous path to avoid crashing Python + PythonEngine.Initialize(); + string path = PythonEngine.PythonPath; + PythonEngine.Shutdown(); + + var ex = Assert.Throws(() => PythonEngine.PythonPath = "foo"); + Assert.AreEqual("Set PythonPath not supported on Python 2", ex.Message); + + PythonEngine.Initialize(); + Assert.AreEqual(path, PythonEngine.PythonPath); + PythonEngine.Shutdown(); + } } } diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index b97bea01b..1fd3b239a 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -95,6 +95,10 @@ public static string PythonPath } set { + if (Runtime.IsPython2) + { + throw new NotSupportedException("Set PythonPath not supported on Python 2"); + } Marshal.FreeHGlobal(_pythonPath); _pythonPath = UcsMarshaler.Py3UnicodePy2StringtoPtr(value); Runtime.Py_SetPath(_pythonPath); From 563f6a6f5024fa90beb8b872c3331f2626b111c9 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Fri, 3 Mar 2017 12:39:54 -0700 Subject: [PATCH 232/324] Calculate Runtime fields before Initialization --- src/runtime/runtime.cs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index d3c756adf..b3520913a 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -151,9 +151,9 @@ public class Runtime internal static object IsFinalizingLock = new object(); internal static bool IsFinalizing; - internal static bool Is32Bit; - internal static bool IsPython2; - internal static bool IsPython3; + internal static bool Is32Bit = IntPtr.Size == 4; + internal static bool IsPython2 = pyversionnumber < 30; + internal static bool IsPython3 = pyversionnumber >= 30; /// /// Encoding to use to convert Unicode to/from Managed to Native @@ -165,10 +165,6 @@ public class Runtime /// internal static void Initialize() { - Is32Bit = IntPtr.Size == 4; - IsPython2 = pyversionnumber < 30; - IsPython3 = pyversionnumber >= 30; - if (Py_IsInitialized() == 0) { Py_Initialize(); From 92996a103d392306b85c85cdedab1919efc1f4c3 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 4 Mar 2017 12:42:40 -0700 Subject: [PATCH 233/324] Add timing to detect slow tests on pytest --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index d1a72ff31..38aa3eb3d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -7,4 +7,4 @@ [tool:pytest] xfail_strict = True # -r fsxX: show extra summary info for: (f)ailed, (s)kip, (x)failed, (X)passed -addopts = -r fsxX --color=yes +addopts = -r fsxX --color=yes --durations=5 From 305040d7443406e1851d57040d250f778e6f94ee Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 4 Mar 2017 19:34:07 -0700 Subject: [PATCH 234/324] Rename test classes/files Make it easier to distinguish if editor tab refers to class or test. --- src/embed_tests/Python.EmbeddingTest.csproj | 12 ++++++------ src/embed_tests/{pyiter.cs => TestPyList.cs} | 2 +- src/embed_tests/{pylong.cs => TestPyLong.cs} | 2 +- src/embed_tests/{pyobject.cs => TestPyString.cs} | 2 +- src/embed_tests/{pytuple.cs => TestPyTuple.cs} | 2 +- .../{pythonexception.cs => TestPythonException.cs} | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) rename src/embed_tests/{pyiter.cs => TestPyList.cs} (96%) rename src/embed_tests/{pylong.cs => TestPyLong.cs} (93%) rename src/embed_tests/{pyobject.cs => TestPyString.cs} (92%) rename src/embed_tests/{pytuple.cs => TestPyTuple.cs} (99%) rename src/embed_tests/{pythonexception.cs => TestPythonException.cs} (96%) diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index 3cca9da70..0db3567ae 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -80,16 +80,16 @@ - - - - + - - + + + + + diff --git a/src/embed_tests/pyiter.cs b/src/embed_tests/TestPyList.cs similarity index 96% rename from src/embed_tests/pyiter.cs rename to src/embed_tests/TestPyList.cs index b896ab4c9..7a0a132b9 100644 --- a/src/embed_tests/pyiter.cs +++ b/src/embed_tests/TestPyList.cs @@ -5,7 +5,7 @@ namespace Python.EmbeddingTest { - public class PyIterTest + public class TestPyList { [Test] public void TestOnPyList() diff --git a/src/embed_tests/pylong.cs b/src/embed_tests/TestPyLong.cs similarity index 93% rename from src/embed_tests/pylong.cs rename to src/embed_tests/TestPyLong.cs index 0c57a0a74..ce9fa2ecb 100644 --- a/src/embed_tests/pylong.cs +++ b/src/embed_tests/TestPyLong.cs @@ -4,7 +4,7 @@ namespace Python.EmbeddingTest { - public class PyLongTest + public class TestPyLong { [Test] public void TestToInt64() diff --git a/src/embed_tests/pyobject.cs b/src/embed_tests/TestPyString.cs similarity index 92% rename from src/embed_tests/pyobject.cs rename to src/embed_tests/TestPyString.cs index be35ed3ca..943bd7fd4 100644 --- a/src/embed_tests/pyobject.cs +++ b/src/embed_tests/TestPyString.cs @@ -4,7 +4,7 @@ namespace Python.EmbeddingTest { - public class PyObjectTest + public class TestPyString { [Test] public void TestUnicode() diff --git a/src/embed_tests/pytuple.cs b/src/embed_tests/TestPyTuple.cs similarity index 99% rename from src/embed_tests/pytuple.cs rename to src/embed_tests/TestPyTuple.cs index 541e13210..2316001ea 100644 --- a/src/embed_tests/pytuple.cs +++ b/src/embed_tests/TestPyTuple.cs @@ -4,7 +4,7 @@ namespace Python.EmbeddingTest { - public class PyTupleTest + public class TestPyTuple { /// /// Test IsTupleType without having to Initialize a tuple. diff --git a/src/embed_tests/pythonexception.cs b/src/embed_tests/TestPythonException.cs similarity index 96% rename from src/embed_tests/pythonexception.cs rename to src/embed_tests/TestPythonException.cs index 0323567d0..3cf4d0aa3 100644 --- a/src/embed_tests/pythonexception.cs +++ b/src/embed_tests/TestPythonException.cs @@ -11,7 +11,7 @@ namespace Python.EmbeddingTest /// Keeping this in the old-style SetUp/TearDown /// to ensure that setup still works. /// - public class PythonExceptionTest + public class TestPythonException { private IntPtr gs; From de3874cf5eac4dcc48980c450e2d03ac512391fc Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 4 Mar 2017 21:49:34 -0700 Subject: [PATCH 235/324] Add PyTuple Ctor tests --- src/embed_tests/TestPyTuple.cs | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/embed_tests/TestPyTuple.cs b/src/embed_tests/TestPyTuple.cs index 2316001ea..417cf2c73 100644 --- a/src/embed_tests/TestPyTuple.cs +++ b/src/embed_tests/TestPyTuple.cs @@ -58,6 +58,42 @@ public void TestPyTupleBadCtor() } } + [Test] + public void TestPyTupleCtorEmptyArray() + { + using (Py.GIL()) + { + var a = new PyObject[] { }; + var t = new PyTuple(a); + + Assert.AreEqual(0, t.Length()); + } + } + + [Test] + public void TestPyTupleCtorArrayPyIntEmpty() + { + using (Py.GIL()) + { + var a = new PyInt[] { }; + var t = new PyTuple(a); + + Assert.AreEqual(0, t.Length()); + } + } + + [Test] + public void TestPyTupleCtorArray() + { + using (Py.GIL()) + { + var a = new PyObject[] {new PyInt(1), new PyString("Foo") }; + var t = new PyTuple(a); + + Assert.AreEqual(2, t.Length()); + } + } + /// /// Test PyTuple.Concat(...) doesn't let invalid appends happen /// and throws and exception. From d7777b93083e4369982c8cdbdca2f393b249a9f5 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 5 Mar 2017 18:55:59 -0700 Subject: [PATCH 236/324] Define and document Py_IncRef/Py_DecRef --- src/runtime/runtime.cs | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index b3520913a..346ea745f 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -500,7 +500,6 @@ internal static Type[] PythonArgsToTypeArray(IntPtr arg, bool mangleObjects) internal static unsafe void XIncref(IntPtr op) { #if PYTHON_WITH_PYDEBUG - // according to Python doc, Py_IncRef() is Py_XINCREF() Py_IncRef(op); return; #else @@ -522,8 +521,6 @@ internal static unsafe void XIncref(IntPtr op) internal static unsafe void XDecref(IntPtr op) { #if PYTHON_WITH_PYDEBUG - // Py_DecRef calls Python's Py_DECREF - // according to Python doc, Py_DecRef() is Py_XDECREF() Py_DecRef(op); return; #else @@ -568,15 +565,21 @@ internal static unsafe long Refcount(IntPtr op) return Is32Bit ? (*(int*)p) : (*(long*)p); } -#if PYTHON_WITH_PYDEBUG - // Py_IncRef and Py_DecRef are taking care of the extra payload - // in Py_DEBUG builds of Python like _Py_RefTotal + /// + /// Export of Macro Py_XIncRef. Use XIncref instead. + /// Limit this function usage for Testing and Py_Debug builds + /// + /// PyObject Ptr [DllImport(PythonDll)] - private static extern void Py_IncRef(IntPtr ob); + internal static extern void Py_IncRef(IntPtr ob); + /// + /// Export of Macro Py_XDecRef. Use XDecref instead. + /// Limit this function usage for Testing and Py_Debug builds + /// + /// PyObject Ptr [DllImport(PythonDll)] - private static extern void Py_DecRef(IntPtr ob); -#endif + internal static extern void Py_DecRef(IntPtr ob); [DllImport(PythonDll)] internal static extern void Py_Initialize(); From 977ee9603faef020215e2f4e78c99376089de90d Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 5 Mar 2017 18:59:13 -0700 Subject: [PATCH 237/324] Add Tests --- src/embed_tests/Python.EmbeddingTest.csproj | 7 + src/embed_tests/TestCustomMarshal.cs | 25 +++ src/embed_tests/TestPyAnsiString.cs | 96 ++++++++++ src/embed_tests/TestPyFloat.cs | 138 ++++++++++++++ src/embed_tests/TestPyInt.cs | 190 +++++++++++++++++++ src/embed_tests/TestPyLong.cs | 198 +++++++++++++++++++- src/embed_tests/TestPyNumber.cs | 35 ++++ src/embed_tests/TestPySequence.cs | 95 ++++++++++ src/embed_tests/TestPyString.cs | 88 ++++++++- src/embed_tests/TestRuntime.cs | 51 +++++ 10 files changed, 912 insertions(+), 11 deletions(-) create mode 100644 src/embed_tests/TestCustomMarshal.cs create mode 100644 src/embed_tests/TestPyAnsiString.cs create mode 100644 src/embed_tests/TestPyFloat.cs create mode 100644 src/embed_tests/TestPyInt.cs create mode 100644 src/embed_tests/TestPyNumber.cs create mode 100644 src/embed_tests/TestPySequence.cs create mode 100644 src/embed_tests/TestRuntime.cs diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index 0db3567ae..9c417cd27 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -84,12 +84,19 @@ + + + + + + + diff --git a/src/embed_tests/TestCustomMarshal.cs b/src/embed_tests/TestCustomMarshal.cs new file mode 100644 index 000000000..04c690090 --- /dev/null +++ b/src/embed_tests/TestCustomMarshal.cs @@ -0,0 +1,25 @@ +using System; +using NUnit.Framework; +using Python.Runtime; + +namespace Python.EmbeddingTest +{ + public class TestCustomMarshal + { + [Test] + public static void GetManagedStringTwice() + { + const string expected = "FooBar"; + using (Py.GIL()) + { + IntPtr op = Runtime.Runtime.PyUnicode_FromString(expected); + string s1 = Runtime.Runtime.GetManagedString(op); + string s2 = Runtime.Runtime.GetManagedString(op); + + Assert.AreEqual(1, Runtime.Runtime.Refcount(op)); + Assert.AreEqual(expected, s1); + Assert.AreEqual(expected, s2); + } + } + } +} diff --git a/src/embed_tests/TestPyAnsiString.cs b/src/embed_tests/TestPyAnsiString.cs new file mode 100644 index 000000000..9ba7d6cc6 --- /dev/null +++ b/src/embed_tests/TestPyAnsiString.cs @@ -0,0 +1,96 @@ +using System; +using NUnit.Framework; +using Python.Runtime; + +namespace Python.EmbeddingTest +{ + public class TestPyAnsiString + { + [OneTimeSetUp] + public void SetUp() + { + PythonEngine.Initialize(); + } + + [OneTimeTearDown] + public void Dispose() + { + PythonEngine.Shutdown(); + } + + [Test] + public void TestStringCtor() + { + const string expected = "foo"; + var actual = new PyAnsiString(expected); + Assert.AreEqual(expected, actual.ToString()); + } + + [Test] + public void TestEmptyStringCtor() + { + const string expected = ""; + var actual = new PyAnsiString(expected); + Assert.AreEqual(expected, actual.ToString()); + } + + [Test] + public void TestPyObjectCtor() + { + const string expected = "Foo"; + + var t = new PyAnsiString(expected); + var actual = new PyAnsiString(t); + + Assert.AreEqual(expected, actual.ToString()); + } + + [Test] + public void TestBadPyObjectCtor() + { + var t = new PyInt(5); + PyAnsiString actual = null; + + var ex = Assert.Throws(() => actual = new PyAnsiString(t)); + + StringAssert.StartsWith("object is not a string", ex.Message); + Assert.IsNull(actual); + } + + [Test] + public void TestCtorPtr() + { + const string expected = "foo"; + + var t = new PyAnsiString(expected); + var actual = new PyAnsiString(t.Handle); + + Assert.AreEqual(expected, actual.ToString()); + } + + [Test] + public void IsStringTrue() + { + var t = new PyAnsiString("foo"); + + Assert.True(PyAnsiString.IsStringType(t)); + } + + [Test] + public void IsStringFalse() + { + var t = new PyInt(5); + + Assert.False(PyAnsiString.IsStringType(t)); + } + + [Test] + [Ignore("Ambiguous behavior between PY2/PY3")] + public void TestUnicode() + { + const string expected = "foo\u00e9"; + PyObject actual = new PyAnsiString(expected); + Assert.AreEqual(expected, actual.ToString()); + } + } +} diff --git a/src/embed_tests/TestPyFloat.cs b/src/embed_tests/TestPyFloat.cs new file mode 100644 index 000000000..f2c85a77f --- /dev/null +++ b/src/embed_tests/TestPyFloat.cs @@ -0,0 +1,138 @@ +using System; +using NUnit.Framework; +using Python.Runtime; + +namespace Python.EmbeddingTest +{ + /// + /// PyFloat implementation isn't complete, thus tests aren't complete. + /// + public class TestPyFloat + { + [OneTimeSetUp] + public void SetUp() + { + PythonEngine.Initialize(); + } + + [OneTimeTearDown] + public void Dispose() + { + PythonEngine.Shutdown(); + } + + [Test] + public void IntPtrCtor() + { + var i = new PyFloat(1); + var ii = new PyFloat(i.Handle); + Assert.AreEqual(i.Handle, ii.Handle); + } + + [Test] + public void FloatCtor() + { + const float a = 4.5F; + var i = new PyFloat(a); + Assert.True(PyFloat.IsFloatType(i)); + // Assert.Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void PyObjectCtorGood() + { + var i = new PyFloat(5); + var a = new PyFloat(i); + Assert.True(PyFloat.IsFloatType(a)); + // Assert.Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void PyObjectCtorBad() + { + var i = new PyString("Foo"); + PyFloat a = null; + + var ex = Assert.Throws(() => a = new PyFloat(i)); + + StringAssert.StartsWith("object is not a float", ex.Message); + Assert.IsNull(a); + } + + [Test] + public void DoubleCtor() + { + const double a = 4.5; + var i = new PyFloat(a); + Assert.True(PyFloat.IsFloatType(i)); + // Assert.Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void StringIntCtor() + { + const string a = "5"; + var i = new PyFloat(a); + Assert.True(PyFloat.IsFloatType(i)); + // Assert.Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void StringDoubleCtor() + { + const string a = "4.5"; + var i = new PyFloat(a); + Assert.True(PyFloat.IsFloatType(i)); + // Assert.Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void StringBadCtor() + { + const string i = "Foo"; + PyFloat a = null; + + var ex = Assert.Throws(() => a = new PyFloat(i)); + + StringAssert.StartsWith("ValueError : could not convert string to float", ex.Message); + Assert.IsNull(a); + } + + [Test] + public void IsFloatTrue() + { + const double a = 4.5; + var i = new PyFloat(a); + Assert.True(PyFloat.IsFloatType(i)); + } + + [Test] + public void IsFloatFalse() + { + var i = new PyString("Foo"); + Assert.False(PyFloat.IsFloatType(i)); + } + + [Test] + public void AsFloatGood() + { + const double a = 4.5; + var i = new PyFloat(a); + PyFloat s = PyFloat.AsFloat(i); + + Assert.True(PyFloat.IsFloatType(s)); + // Assert.Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void AsFloatBad() + { + var s = new PyString("Foo"); + PyFloat a = null; + + var ex = Assert.Throws(() => a = PyFloat.AsFloat(s)); + StringAssert.StartsWith("ValueError : could not convert string to float", ex.Message); + Assert.IsNull(a); + } + } +} diff --git a/src/embed_tests/TestPyInt.cs b/src/embed_tests/TestPyInt.cs new file mode 100644 index 000000000..0cae171df --- /dev/null +++ b/src/embed_tests/TestPyInt.cs @@ -0,0 +1,190 @@ +using System; +using NUnit.Framework; +using Python.Runtime; + +namespace Python.EmbeddingTest +{ + public class TestPyInt + { + [OneTimeSetUp] + public void SetUp() + { + PythonEngine.Initialize(); + } + + [OneTimeTearDown] + public void Dispose() + { + PythonEngine.Shutdown(); + } + + [Test] + public void TestCtorInt() + { + const int i = 5; + var a = new PyInt(i); + Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void TestCtorUInt() + { + const uint i = 5; + var a = new PyInt(i); + Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void TestCtorLong() + { + const long i = 5; + var a = new PyInt(i); + Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void TestCtorULong() + { + const ulong i = 5; + var a = new PyInt(i); + Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void TestCtorShort() + { + const short i = 5; + var a = new PyInt(i); + Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void TestCtorUShort() + { + const ushort i = 5; + var a = new PyInt(i); + Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void TestCtorByte() + { + const byte i = 5; + var a = new PyInt(i); + Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void TestCtorSByte() + { + const sbyte i = 5; + var a = new PyInt(i); + Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void TestCtorPtr() + { + var i = new PyInt(5); + var a = new PyInt(i.Handle); + Assert.AreEqual(5, a.ToInt32()); + } + + [Test] + public void TestCtorPyObject() + { + var i = new PyInt(5); + var a = new PyInt(i); + Assert.AreEqual(5, a.ToInt32()); + } + + [Test] + public void TestCtorBadPyObject() + { + var i = new PyString("Foo"); + PyInt a = null; + + var ex = Assert.Throws(() => a = new PyInt(i)); + + StringAssert.StartsWith("object is not an int", ex.Message); + Assert.IsNull(a); + } + + [Test] + public void TestCtorString() + { + const string i = "5"; + var a = new PyInt(i); + Assert.AreEqual(5, a.ToInt32()); + } + + [Test] + public void TestCtorBadString() + { + const string i = "Foo"; + PyInt a = null; + + var ex = Assert.Throws(() => a = new PyInt(i)); + + StringAssert.StartsWith("ValueError : invalid literal for int", ex.Message); + Assert.IsNull(a); + } + + [Test] + public void TestIsIntTypeTrue() + { + var i = new PyInt(5); + Assert.IsTrue(PyInt.IsIntType(i)); + } + + [Test] + public void TestIsIntTypeFalse() + { + var s = new PyString("Foo"); + Assert.IsFalse(PyInt.IsIntType(s)); + } + + [Test] + public void TestAsIntGood() + { + var i = new PyInt(5); + var a = PyInt.AsInt(i); + Assert.AreEqual(5, a.ToInt32()); + } + + [Test] + public void TestAsIntBad() + { + var s = new PyString("Foo"); + PyInt a = null; + + var ex = Assert.Throws(() => a = PyInt.AsInt(s)); + StringAssert.StartsWith("ValueError : invalid literal for int", ex.Message); + Assert.IsNull(a); + } + + [Test] + public void TestConvertToInt32() + { + var a = new PyInt(5); + Assert.IsInstanceOf(typeof(int), a.ToInt32()); + Assert.AreEqual(5, a.ToInt32()); + } + + [Test] + public void TestConvertToInt16() + { + var a = new PyInt(5); + Assert.IsInstanceOf(typeof(short), a.ToInt16()); + Assert.AreEqual(5, a.ToInt16()); + } + + [Test] + public void TestConvertToInt64() + { + var a = new PyInt(5); + Assert.IsInstanceOf(typeof(long), a.ToInt64()); + Assert.AreEqual(5, a.ToInt64()); + } + } +} diff --git a/src/embed_tests/TestPyLong.cs b/src/embed_tests/TestPyLong.cs index ce9fa2ecb..9299bca7e 100644 --- a/src/embed_tests/TestPyLong.cs +++ b/src/embed_tests/TestPyLong.cs @@ -6,15 +6,201 @@ namespace Python.EmbeddingTest { public class TestPyLong { + [OneTimeSetUp] + public void SetUp() + { + PythonEngine.Initialize(); + } + + [OneTimeTearDown] + public void Dispose() + { + PythonEngine.Shutdown(); + } + [Test] public void TestToInt64() { - using (Py.GIL()) - { - long largeNumber = 8L * 1024L * 1024L * 1024L; // 8 GB - var pyLargeNumber = new PyLong(largeNumber); - Assert.AreEqual(largeNumber, pyLargeNumber.ToInt64()); - } + long largeNumber = 8L * 1024L * 1024L * 1024L; // 8 GB + var pyLargeNumber = new PyLong(largeNumber); + Assert.AreEqual(largeNumber, pyLargeNumber.ToInt64()); + } + + [Test] + public void TestCtorInt() + { + const int i = 5; + var a = new PyLong(i); + Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void TestCtorUInt() + { + const uint i = 5; + var a = new PyLong(i); + Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void TestCtorLong() + { + const long i = 5; + var a = new PyLong(i); + Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void TestCtorULong() + { + const ulong i = 5; + var a = new PyLong(i); + Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void TestCtorShort() + { + const short i = 5; + var a = new PyLong(i); + Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void TestCtorUShort() + { + const ushort i = 5; + var a = new PyLong(i); + Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void TestCtorByte() + { + const byte i = 5; + var a = new PyLong(i); + Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void TestCtorSByte() + { + const sbyte i = 5; + var a = new PyLong(i); + Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void TestCtorDouble() + { + double i = 5.0; + var a = new PyLong(i); + Assert.AreEqual(i, a.ToInt32()); + } + + [Test] + public void TestCtorPtr() + { + var i = new PyLong(5); + var a = new PyLong(i.Handle); + Assert.AreEqual(5, a.ToInt32()); + } + + [Test] + public void TestCtorPyObject() + { + var i = new PyLong(5); + var a = new PyLong(i); + Assert.AreEqual(5, a.ToInt32()); + } + + [Test] + public void TestCtorBadPyObject() + { + var i = new PyString("Foo"); + PyLong a = null; + + var ex = Assert.Throws(() => a = new PyLong(i)); + + StringAssert.StartsWith("object is not a long", ex.Message); + Assert.IsNull(a); + } + + [Test] + public void TestCtorString() + { + const string i = "5"; + var a = new PyLong(i); + Assert.AreEqual(5, a.ToInt32()); + } + + [Test] + public void TestCtorBadString() + { + const string i = "Foo"; + PyLong a = null; + + var ex = Assert.Throws(() => a = new PyLong(i)); + + StringAssert.StartsWith("ValueError : invalid literal", ex.Message); + Assert.IsNull(a); + } + + [Test] + public void TestIsIntTypeTrue() + { + var i = new PyLong(5); + Assert.IsTrue(PyLong.IsLongType(i)); + } + + [Test] + public void TestIsLongTypeFalse() + { + var s = new PyString("Foo"); + Assert.IsFalse(PyLong.IsLongType(s)); + } + + [Test] + public void TestAsLongGood() + { + var i = new PyLong(5); + var a = PyLong.AsLong(i); + Assert.AreEqual(5, a.ToInt32()); + } + + [Test] + public void TestAsLongBad() + { + var s = new PyString("Foo"); + PyLong a = null; + + var ex = Assert.Throws(() => a = PyLong.AsLong(s)); + StringAssert.StartsWith("ValueError : invalid literal", ex.Message); + Assert.IsNull(a); + } + + [Test] + public void TestConvertToInt32() + { + var a = new PyLong(5); + Assert.IsInstanceOf(typeof(int), a.ToInt32()); + Assert.AreEqual(5, a.ToInt32()); + } + + [Test] + public void TestConvertToInt16() + { + var a = new PyLong(5); + Assert.IsInstanceOf(typeof(short), a.ToInt16()); + Assert.AreEqual(5, a.ToInt16()); + } + + [Test] + public void TestConvertToInt64() + { + var a = new PyLong(5); + Assert.IsInstanceOf(typeof(long), a.ToInt64()); + Assert.AreEqual(5, a.ToInt64()); } } } diff --git a/src/embed_tests/TestPyNumber.cs b/src/embed_tests/TestPyNumber.cs new file mode 100644 index 000000000..8e829ce0e --- /dev/null +++ b/src/embed_tests/TestPyNumber.cs @@ -0,0 +1,35 @@ +using System; +using NUnit.Framework; +using Python.Runtime; + +namespace Python.EmbeddingTest +{ + public class TestPyNumber + { + [OneTimeSetUp] + public void SetUp() + { + PythonEngine.Initialize(); + } + + [OneTimeTearDown] + public void Dispose() + { + PythonEngine.Shutdown(); + } + + [Test] + public void IsNumberTypeTrue() + { + var i = new PyInt(1); + Assert.IsTrue(PyNumber.IsNumberType(i)); + } + + [Test] + public void IsNumberTypeFalse() + { + var s = new PyString("Foo"); + Assert.IsFalse(PyNumber.IsNumberType(s)); + } + } +} diff --git a/src/embed_tests/TestPySequence.cs b/src/embed_tests/TestPySequence.cs new file mode 100644 index 000000000..7c175b1ce --- /dev/null +++ b/src/embed_tests/TestPySequence.cs @@ -0,0 +1,95 @@ +using System; +using NUnit.Framework; +using Python.Runtime; + +namespace Python.EmbeddingTest +{ + public class TestPySequence + { + [OneTimeSetUp] + public void SetUp() + { + PythonEngine.Initialize(); + } + + [OneTimeTearDown] + public void Dispose() + { + PythonEngine.Shutdown(); + } + + [Test] + public void TestIsSequenceTrue() + { + var t = new PyString("FooBar"); + Assert.True(PySequence.IsSequenceType(t)); + } + + [Test] + public void TestIsSequenceFalse() + { + var t = new PyInt(5); + Assert.False(PySequence.IsSequenceType(t)); + } + + [Test] + public void TestGetSlice() + { + var t = new PyString("FooBar"); + + PyObject s = t.GetSlice(0, 3); + Assert.AreEqual("Foo", s.ToString()); + + PyObject s2 = t.GetSlice(3, 6); + Assert.AreEqual("Bar", s2.ToString()); + + PyObject s3 = t.GetSlice(0, 6); + Assert.AreEqual("FooBar", s3.ToString()); + + PyObject s4 = t.GetSlice(0, 12); + Assert.AreEqual("FooBar", s4.ToString()); + } + + [Test] + public void TestConcat() + { + var t1 = new PyString("Foo"); + var t2 = new PyString("Bar"); + + PyObject actual = t1.Concat(t2); + + Assert.AreEqual("FooBar", actual.ToString()); + } + + [Test] + public void TestRepeat() + { + var t1 = new PyString("Foo"); + + PyObject actual = t1.Repeat(3); + Assert.AreEqual("FooFooFoo", actual.ToString()); + + actual = t1.Repeat(-3); + Assert.AreEqual("", actual.ToString()); + } + + [Test] + public void TestContains() + { + var t1 = new PyString("FooBar"); + + Assert.True(t1.Contains(new PyString("a"))); + Assert.False(t1.Contains(new PyString("z"))); + } + + [Test] + public void TestIndex() + { + var t1 = new PyString("FooBar"); + + Assert.AreEqual(4, t1.Index(new PyString("a"))); + Assert.AreEqual(5, t1.Index(new PyString("r"))); + Assert.AreEqual(-1, t1.Index(new PyString("z"))); + } + } +} diff --git a/src/embed_tests/TestPyString.cs b/src/embed_tests/TestPyString.cs index 943bd7fd4..9d1cdb0e9 100644 --- a/src/embed_tests/TestPyString.cs +++ b/src/embed_tests/TestPyString.cs @@ -6,14 +6,92 @@ namespace Python.EmbeddingTest { public class TestPyString { + [OneTimeSetUp] + public void SetUp() + { + PythonEngine.Initialize(); + } + + [OneTimeTearDown] + public void Dispose() + { + PythonEngine.Shutdown(); + } + + [Test] + public void TestStringCtor() + { + const string expected = "foo"; + var actual = new PyString(expected); + Assert.AreEqual(expected, actual.ToString()); + } + + [Test] + public void TestEmptyStringCtor() + { + const string expected = ""; + var actual = new PyString(expected); + Assert.AreEqual(expected, actual.ToString()); + } + + [Test] + [Ignore("Ambiguous behavior between PY2/PY3. Needs remapping")] + public void TestPyObjectCtor() + { + const string expected = "Foo"; + + var t = new PyString(expected); + var actual = new PyString(t); + + Assert.AreEqual(expected, actual.ToString()); + } + + [Test] + public void TestBadPyObjectCtor() + { + var t = new PyInt(5); + PyString actual = null; + + var ex = Assert.Throws(() => actual = new PyString(t)); + + StringAssert.StartsWith("object is not a string", ex.Message); + Assert.IsNull(actual); + } + + [Test] + public void TestCtorPtr() + { + const string expected = "foo"; + + var t = new PyString(expected); + var actual = new PyString(t.Handle); + + Assert.AreEqual(expected, actual.ToString()); + } + + [Test] + [Ignore("Ambiguous behavior between PY2/PY3. Needs remapping")] + public void IsStringTrue() + { + var t = new PyString("foo"); + + Assert.True(PyString.IsStringType(t)); + } + + [Test] + public void IsStringFalse() + { + var t = new PyInt(5); + + Assert.False(PyString.IsStringType(t)); + } + [Test] public void TestUnicode() { - using (Py.GIL()) - { - PyObject s = new PyString("foo\u00e9"); - Assert.AreEqual("foo\u00e9", s.ToString()); - } + const string expected = "foo\u00e9"; + PyObject actual = new PyString(expected); + Assert.AreEqual(expected, actual.ToString()); } } } diff --git a/src/embed_tests/TestRuntime.cs b/src/embed_tests/TestRuntime.cs new file mode 100644 index 000000000..22e6db0a9 --- /dev/null +++ b/src/embed_tests/TestRuntime.cs @@ -0,0 +1,51 @@ +using System; +using NUnit.Framework; +using Python.Runtime; + +namespace Python.EmbeddingTest +{ + public class TestRuntime + { + [Test] + public static void Py_IsInitializedValue() + { + Runtime.Runtime.Py_Finalize(); // In case another test left it on. + Assert.AreEqual(0, Runtime.Runtime.Py_IsInitialized()); + Runtime.Runtime.Py_Initialize(); + Assert.AreEqual(1, Runtime.Runtime.Py_IsInitialized()); + Runtime.Runtime.Py_Finalize(); + Assert.AreEqual(0, Runtime.Runtime.Py_IsInitialized()); + } + + [Test] + public static void RefCountTest() + { + Runtime.Runtime.Py_Initialize(); + IntPtr op = Runtime.Runtime.PyUnicode_FromString("FooBar"); + + // New object RefCount should be one + Assert.AreEqual(1, Runtime.Runtime.Refcount(op)); + + // Checking refcount didn't change refcount + Assert.AreEqual(1, Runtime.Runtime.Refcount(op)); + + // New reference doesn't increase refcount + IntPtr p = op; + Assert.AreEqual(1, Runtime.Runtime.Refcount(p)); + + // Py_IncRef/Py_DecRef increase and decrease RefCount + Runtime.Runtime.Py_IncRef(op); + Assert.AreEqual(2, Runtime.Runtime.Refcount(op)); + Runtime.Runtime.Py_DecRef(op); + Assert.AreEqual(1, Runtime.Runtime.Refcount(op)); + + // XIncref/XDecref increase and decrease RefCount + Runtime.Runtime.XIncref(op); + Assert.AreEqual(2, Runtime.Runtime.Refcount(op)); + Runtime.Runtime.XDecref(op); + Assert.AreEqual(1, Runtime.Runtime.Refcount(op)); + + Runtime.Runtime.Py_Finalize(); + } + } +} From 6e4cf9d0fc4443db6f63c2f3c55e838fbda35ee0 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 5 Mar 2017 19:36:27 -0700 Subject: [PATCH 238/324] Refactor Exception checking on tested classes --- src/runtime/pyansistring.cs | 5 +--- src/runtime/pyfloat.cs | 15 ++-------- src/runtime/pyint.cs | 30 ++++---------------- src/runtime/pylong.cs | 55 ++++++++----------------------------- src/runtime/pystring.cs | 5 +--- 5 files changed, 22 insertions(+), 88 deletions(-) diff --git a/src/runtime/pyansistring.cs b/src/runtime/pyansistring.cs index 4843e5e2c..3d1d6ab68 100644 --- a/src/runtime/pyansistring.cs +++ b/src/runtime/pyansistring.cs @@ -45,10 +45,7 @@ public PyAnsiString(PyObject o) public PyAnsiString(string s) { obj = Runtime.PyString_FromString(s); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } diff --git a/src/runtime/pyfloat.cs b/src/runtime/pyfloat.cs index cca436def..edfaca542 100644 --- a/src/runtime/pyfloat.cs +++ b/src/runtime/pyfloat.cs @@ -51,10 +51,7 @@ public PyFloat(PyObject o) public PyFloat(double value) { obj = Runtime.PyFloat_FromDouble(value); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } @@ -69,10 +66,7 @@ public PyFloat(string value) using (var s = new PyString(value)) { obj = Runtime.PyFloat_FromString(s.obj, IntPtr.Zero); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } } @@ -100,10 +94,7 @@ public static bool IsFloatType(PyObject value) public static PyFloat AsFloat(PyObject value) { IntPtr op = Runtime.PyNumber_Float(value.obj); - if (op == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); return new PyFloat(op); } } diff --git a/src/runtime/pyint.cs b/src/runtime/pyint.cs index c84939482..f6911d9d7 100644 --- a/src/runtime/pyint.cs +++ b/src/runtime/pyint.cs @@ -51,10 +51,7 @@ public PyInt(PyObject o) public PyInt(int value) { obj = Runtime.PyInt_FromInt32(value); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } @@ -68,10 +65,7 @@ public PyInt(int value) public PyInt(uint value) : base(IntPtr.Zero) { obj = Runtime.PyInt_FromInt64(value); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } @@ -84,10 +78,7 @@ public PyInt(uint value) : base(IntPtr.Zero) public PyInt(long value) : base(IntPtr.Zero) { obj = Runtime.PyInt_FromInt64(value); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } @@ -101,10 +92,7 @@ public PyInt(long value) : base(IntPtr.Zero) public PyInt(ulong value) : base(IntPtr.Zero) { obj = Runtime.PyInt_FromInt64((long)value); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } @@ -163,10 +151,7 @@ public PyInt(sbyte value) : this((int)value) public PyInt(string value) { obj = Runtime.PyInt_FromString(value, IntPtr.Zero, 0); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } @@ -193,10 +178,7 @@ public static bool IsIntType(PyObject value) public static PyInt AsInt(PyObject value) { IntPtr op = Runtime.PyNumber_Int(value.obj); - if (op == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); return new PyInt(op); } diff --git a/src/runtime/pylong.cs b/src/runtime/pylong.cs index ade7cb42c..286af40df 100644 --- a/src/runtime/pylong.cs +++ b/src/runtime/pylong.cs @@ -51,10 +51,7 @@ public PyLong(PyObject o) public PyLong(int value) { obj = Runtime.PyLong_FromLong(value); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } @@ -68,10 +65,7 @@ public PyLong(int value) public PyLong(uint value) { obj = Runtime.PyLong_FromLong(value); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } @@ -84,10 +78,7 @@ public PyLong(uint value) public PyLong(long value) { obj = Runtime.PyLong_FromLongLong(value); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } @@ -101,10 +92,7 @@ public PyLong(long value) public PyLong(ulong value) { obj = Runtime.PyLong_FromUnsignedLongLong(value); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } @@ -117,10 +105,7 @@ public PyLong(ulong value) public PyLong(short value) { obj = Runtime.PyLong_FromLong(value); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } @@ -134,10 +119,7 @@ public PyLong(short value) public PyLong(ushort value) { obj = Runtime.PyLong_FromLong(value); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } @@ -150,10 +132,7 @@ public PyLong(ushort value) public PyLong(byte value) { obj = Runtime.PyLong_FromLong(value); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } @@ -167,10 +146,7 @@ public PyLong(byte value) public PyLong(sbyte value) { obj = Runtime.PyLong_FromLong(value); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } @@ -183,10 +159,7 @@ public PyLong(sbyte value) public PyLong(double value) { obj = Runtime.PyLong_FromDouble(value); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } @@ -199,10 +172,7 @@ public PyLong(double value) public PyLong(string value) { obj = Runtime.PyLong_FromString(value, IntPtr.Zero, 0); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } @@ -229,10 +199,7 @@ public static bool IsLongType(PyObject value) public static PyLong AsLong(PyObject value) { IntPtr op = Runtime.PyNumber_Long(value.obj); - if (op == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); return new PyLong(op); } diff --git a/src/runtime/pystring.cs b/src/runtime/pystring.cs index 624de80eb..c9c4f9f5b 100644 --- a/src/runtime/pystring.cs +++ b/src/runtime/pystring.cs @@ -54,10 +54,7 @@ public PyString(PyObject o) public PyString(string s) { obj = Runtime.PyUnicode_FromUnicode(s, s.Length); - if (obj == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); } From 657d674681c33f2be0a27dbb231fd9edfde9222c Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 5 Mar 2017 22:29:55 -0700 Subject: [PATCH 239/324] Clean-up Embedded tests --- src/embed_tests/TestCustomMarshal.cs | 28 +++- src/embed_tests/TestPyInt.cs | 4 +- src/embed_tests/TestPyList.cs | 39 +++-- src/embed_tests/TestPyLong.cs | 4 +- src/embed_tests/TestPyNumber.cs | 4 +- src/embed_tests/TestPyTuple.cs | 157 ++++++++---------- src/embed_tests/TestPythonEngineProperties.cs | 22 +-- src/embed_tests/TestPythonException.cs | 13 +- src/embed_tests/dynamic.cs | 6 +- src/embed_tests/pyimport.cs | 6 +- src/embed_tests/pyrunstring.cs | 6 +- 11 files changed, 140 insertions(+), 149 deletions(-) diff --git a/src/embed_tests/TestCustomMarshal.cs b/src/embed_tests/TestCustomMarshal.cs index 04c690090..5860857a3 100644 --- a/src/embed_tests/TestCustomMarshal.cs +++ b/src/embed_tests/TestCustomMarshal.cs @@ -6,20 +6,30 @@ namespace Python.EmbeddingTest { public class TestCustomMarshal { + [OneTimeSetUp] + public void SetUp() + { + PythonEngine.Initialize(); + } + + [OneTimeTearDown] + public void Dispose() + { + PythonEngine.Shutdown(); + } + [Test] public static void GetManagedStringTwice() { const string expected = "FooBar"; - using (Py.GIL()) - { - IntPtr op = Runtime.Runtime.PyUnicode_FromString(expected); - string s1 = Runtime.Runtime.GetManagedString(op); - string s2 = Runtime.Runtime.GetManagedString(op); - Assert.AreEqual(1, Runtime.Runtime.Refcount(op)); - Assert.AreEqual(expected, s1); - Assert.AreEqual(expected, s2); - } + IntPtr op = Runtime.Runtime.PyUnicode_FromString(expected); + string s1 = Runtime.Runtime.GetManagedString(op); + string s2 = Runtime.Runtime.GetManagedString(op); + + Assert.AreEqual(1, Runtime.Runtime.Refcount(op)); + Assert.AreEqual(expected, s1); + Assert.AreEqual(expected, s2); } } } diff --git a/src/embed_tests/TestPyInt.cs b/src/embed_tests/TestPyInt.cs index 0cae171df..4117336d8 100644 --- a/src/embed_tests/TestPyInt.cs +++ b/src/embed_tests/TestPyInt.cs @@ -134,14 +134,14 @@ public void TestCtorBadString() public void TestIsIntTypeTrue() { var i = new PyInt(5); - Assert.IsTrue(PyInt.IsIntType(i)); + Assert.True(PyInt.IsIntType(i)); } [Test] public void TestIsIntTypeFalse() { var s = new PyString("Foo"); - Assert.IsFalse(PyInt.IsIntType(s)); + Assert.False(PyInt.IsIntType(s)); } [Test] diff --git a/src/embed_tests/TestPyList.cs b/src/embed_tests/TestPyList.cs index 7a0a132b9..66b479b5c 100644 --- a/src/embed_tests/TestPyList.cs +++ b/src/embed_tests/TestPyList.cs @@ -7,25 +7,36 @@ namespace Python.EmbeddingTest { public class TestPyList { + [OneTimeSetUp] + public void SetUp() + { + PythonEngine.Initialize(); + } + + [OneTimeTearDown] + public void Dispose() + { + PythonEngine.Shutdown(); + } + [Test] public void TestOnPyList() { - using (Py.GIL()) + var list = new PyList(); + + list.Append(new PyString("foo")); + list.Append(new PyString("bar")); + list.Append(new PyString("baz")); + var result = new List(); + foreach (PyObject item in list) { - var list = new PyList(); - list.Append(new PyString("foo")); - list.Append(new PyString("bar")); - list.Append(new PyString("baz")); - var result = new List(); - foreach (PyObject item in list) - { - result.Add(item.ToString()); - } - Assert.AreEqual(3, result.Count); - Assert.AreEqual("foo", result[0]); - Assert.AreEqual("bar", result[1]); - Assert.AreEqual("baz", result[2]); + result.Add(item.ToString()); } + + Assert.AreEqual(3, result.Count); + Assert.AreEqual("foo", result[0]); + Assert.AreEqual("bar", result[1]); + Assert.AreEqual("baz", result[2]); } } } diff --git a/src/embed_tests/TestPyLong.cs b/src/embed_tests/TestPyLong.cs index 9299bca7e..fe3e13ef5 100644 --- a/src/embed_tests/TestPyLong.cs +++ b/src/embed_tests/TestPyLong.cs @@ -150,14 +150,14 @@ public void TestCtorBadString() public void TestIsIntTypeTrue() { var i = new PyLong(5); - Assert.IsTrue(PyLong.IsLongType(i)); + Assert.True(PyLong.IsLongType(i)); } [Test] public void TestIsLongTypeFalse() { var s = new PyString("Foo"); - Assert.IsFalse(PyLong.IsLongType(s)); + Assert.False(PyLong.IsLongType(s)); } [Test] diff --git a/src/embed_tests/TestPyNumber.cs b/src/embed_tests/TestPyNumber.cs index 8e829ce0e..0261c15c1 100644 --- a/src/embed_tests/TestPyNumber.cs +++ b/src/embed_tests/TestPyNumber.cs @@ -22,14 +22,14 @@ public void Dispose() public void IsNumberTypeTrue() { var i = new PyInt(1); - Assert.IsTrue(PyNumber.IsNumberType(i)); + Assert.True(PyNumber.IsNumberType(i)); } [Test] public void IsNumberTypeFalse() { var s = new PyString("Foo"); - Assert.IsFalse(PyNumber.IsNumberType(s)); + Assert.False(PyNumber.IsNumberType(s)); } } } diff --git a/src/embed_tests/TestPyTuple.cs b/src/embed_tests/TestPyTuple.cs index 417cf2c73..362251049 100644 --- a/src/embed_tests/TestPyTuple.cs +++ b/src/embed_tests/TestPyTuple.cs @@ -6,6 +6,18 @@ namespace Python.EmbeddingTest { public class TestPyTuple { + [OneTimeSetUp] + public void SetUp() + { + PythonEngine.Initialize(); + } + + [OneTimeTearDown] + public void Dispose() + { + PythonEngine.Shutdown(); + } + /// /// Test IsTupleType without having to Initialize a tuple. /// PyTuple constructor use IsTupleType. This decouples the tests. @@ -13,11 +25,8 @@ public class TestPyTuple [Test] public void TestStringIsTupleType() { - using (Py.GIL()) - { - var s = new PyString("foo"); - Assert.IsFalse(PyTuple.IsTupleType(s)); - } + var s = new PyString("foo"); + Assert.False(PyTuple.IsTupleType(s)); } /// @@ -26,72 +35,54 @@ public void TestStringIsTupleType() [Test] public void TestPyTupleIsTupleType() { - using (Py.GIL()) - { - var t = new PyTuple(); - Assert.IsTrue(PyTuple.IsTupleType(t)); - } + var t = new PyTuple(); + Assert.True(PyTuple.IsTupleType(t)); } [Test] public void TestPyTupleEmpty() { - using (Py.GIL()) - { - var t = new PyTuple(); - Assert.AreEqual(0, t.Length()); - } + var t = new PyTuple(); + Assert.AreEqual(0, t.Length()); } [Test] public void TestPyTupleBadCtor() { - using (Py.GIL()) - { - var i = new PyInt(5); - PyTuple t = null; + var i = new PyInt(5); + PyTuple t = null; - var ex = Assert.Throws(() => t = new PyTuple(i)); + var ex = Assert.Throws(() => t = new PyTuple(i)); - Assert.AreEqual("object is not a tuple", ex.Message); - Assert.IsNull(t); - } + Assert.AreEqual("object is not a tuple", ex.Message); + Assert.IsNull(t); } [Test] public void TestPyTupleCtorEmptyArray() { - using (Py.GIL()) - { - var a = new PyObject[] { }; - var t = new PyTuple(a); + var a = new PyObject[] { }; + var t = new PyTuple(a); - Assert.AreEqual(0, t.Length()); - } + Assert.AreEqual(0, t.Length()); } [Test] public void TestPyTupleCtorArrayPyIntEmpty() { - using (Py.GIL()) - { - var a = new PyInt[] { }; - var t = new PyTuple(a); + var a = new PyInt[] { }; + var t = new PyTuple(a); - Assert.AreEqual(0, t.Length()); - } + Assert.AreEqual(0, t.Length()); } [Test] public void TestPyTupleCtorArray() { - using (Py.GIL()) - { - var a = new PyObject[] {new PyInt(1), new PyString("Foo") }; - var t = new PyTuple(a); + var a = new PyObject[] { new PyInt(1), new PyString("Foo") }; + var t = new PyTuple(a); - Assert.AreEqual(2, t.Length()); - } + Assert.AreEqual(2, t.Length()); } /// @@ -108,69 +99,58 @@ public void TestPyTupleCtorArray() [Test] public void TestPyTupleInvalidAppend() { - using (Py.GIL()) - { - PyObject s = new PyString("foo"); - var t = new PyTuple(); + PyObject s = new PyString("foo"); + var t = new PyTuple(); - var ex = Assert.Throws(() => t.Concat(s)); + var ex = Assert.Throws(() => t.Concat(s)); - StringAssert.StartsWith("TypeError : can only concatenate tuple", ex.Message); - Assert.AreEqual(0, t.Length()); - Assert.IsEmpty(t); - } + StringAssert.StartsWith("TypeError : can only concatenate tuple", ex.Message); + Assert.AreEqual(0, t.Length()); + Assert.IsEmpty(t); } [Test] public void TestPyTupleValidAppend() { - using (Py.GIL()) - { - var t0 = new PyTuple(); - var t = new PyTuple(); - t.Concat(t0); - Assert.IsNotNull(t); - Assert.IsInstanceOf(typeof(PyTuple), t); - } + var t0 = new PyTuple(); + var t = new PyTuple(); + t.Concat(t0); + + Assert.IsNotNull(t); + Assert.IsInstanceOf(typeof(PyTuple), t); } [Test] public void TestPyTupleStringConvert() { - using (Py.GIL()) - { - PyObject s = new PyString("foo"); - PyTuple t = PyTuple.AsTuple(s); - Assert.IsNotNull(t); - Assert.IsInstanceOf(typeof(PyTuple), t); - Assert.AreEqual("f", t[0].ToString()); - Assert.AreEqual("o", t[1].ToString()); - Assert.AreEqual("o", t[2].ToString()); - } + PyObject s = new PyString("foo"); + PyTuple t = PyTuple.AsTuple(s); + + Assert.IsNotNull(t); + Assert.IsInstanceOf(typeof(PyTuple), t); + Assert.AreEqual("f", t[0].ToString()); + Assert.AreEqual("o", t[1].ToString()); + Assert.AreEqual("o", t[2].ToString()); } [Test] public void TestPyTupleValidConvert() { - using (Py.GIL()) - { - var l = new PyList(); - PyTuple t = PyTuple.AsTuple(l); - Assert.IsNotNull(t); - Assert.IsInstanceOf(typeof(PyTuple), t); - } + var l = new PyList(); + PyTuple t = PyTuple.AsTuple(l); + + Assert.IsNotNull(t); + Assert.IsInstanceOf(typeof(PyTuple), t); } [Test] public void TestNewPyTupleFromPyTuple() { - using (Py.GIL()) - { - var t0 = new PyTuple(); - var t = new PyTuple(t0); - Assert.IsNotNull(t); - Assert.IsInstanceOf(typeof(PyTuple), t); - } + var t0 = new PyTuple(); + var t = new PyTuple(t0); + + Assert.IsNotNull(t); + Assert.IsInstanceOf(typeof(PyTuple), t); } /// @@ -179,16 +159,13 @@ public void TestNewPyTupleFromPyTuple() [Test] public void TestInvalidAsTuple() { - using (Py.GIL()) - { - var i = new PyInt(5); - PyTuple t = null; + var i = new PyInt(5); + PyTuple t = null; - var ex = Assert.Throws(() => t = PyTuple.AsTuple(i)); + var ex = Assert.Throws(() => t = PyTuple.AsTuple(i)); - Assert.AreEqual("TypeError : 'int' object is not iterable", ex.Message); - Assert.IsNull(t); - } + Assert.AreEqual("TypeError : 'int' object is not iterable", ex.Message); + Assert.IsNull(t); } } } diff --git a/src/embed_tests/TestPythonEngineProperties.cs b/src/embed_tests/TestPythonEngineProperties.cs index 9623ff25d..01c6ae7e3 100644 --- a/src/embed_tests/TestPythonEngineProperties.cs +++ b/src/embed_tests/TestPythonEngineProperties.cs @@ -13,8 +13,8 @@ public static void GetBuildinfoDoesntCrash() { string s = PythonEngine.BuildInfo; - Assert.IsTrue(s.Length > 5); - Assert.IsTrue(s.Contains(",")); + Assert.True(s.Length > 5); + Assert.True(s.Contains(",")); } } @@ -25,9 +25,9 @@ public static void GetCompilerDoesntCrash() { string s = PythonEngine.Compiler; - Assert.IsTrue(s.Length > 0); - Assert.IsTrue(s.Contains("[")); - Assert.IsTrue(s.Contains("]")); + Assert.True(s.Length > 0); + Assert.True(s.Contains("[")); + Assert.True(s.Contains("]")); } } @@ -38,8 +38,8 @@ public static void GetCopyrightDoesntCrash() { string s = PythonEngine.Copyright; - Assert.IsTrue(s.Length > 0); - Assert.IsTrue(s.Contains("Python Software Foundation")); + Assert.True(s.Length > 0); + Assert.True(s.Contains("Python Software Foundation")); } } @@ -50,8 +50,8 @@ public static void GetPlatformDoesntCrash() { string s = PythonEngine.Platform; - Assert.IsTrue(s.Length > 0); - Assert.IsTrue(s.Contains("x") || s.Contains("win")); + Assert.True(s.Length > 0); + Assert.True(s.Contains("x") || s.Contains("win")); } } @@ -62,8 +62,8 @@ public static void GetVersionDoesntCrash() { string s = PythonEngine.Version; - Assert.IsTrue(s.Length > 0); - Assert.IsTrue(s.Contains(",")); + Assert.True(s.Length > 0); + Assert.True(s.Contains(",")); } } diff --git a/src/embed_tests/TestPythonException.cs b/src/embed_tests/TestPythonException.cs index 3cf4d0aa3..5470b246f 100644 --- a/src/embed_tests/TestPythonException.cs +++ b/src/embed_tests/TestPythonException.cs @@ -4,28 +4,21 @@ namespace Python.EmbeddingTest { - /// - /// Test Python Exceptions - /// - /// - /// Keeping this in the old-style SetUp/TearDown - /// to ensure that setup still works. - /// public class TestPythonException { - private IntPtr gs; + private IntPtr _gs; [SetUp] public void SetUp() { PythonEngine.Initialize(); - gs = PythonEngine.AcquireLock(); + _gs = PythonEngine.AcquireLock(); } [TearDown] public void Dispose() { - PythonEngine.ReleaseLock(gs); + PythonEngine.ReleaseLock(_gs); PythonEngine.Shutdown(); } diff --git a/src/embed_tests/dynamic.cs b/src/embed_tests/dynamic.cs index bfdc8fcc2..94397072a 100644 --- a/src/embed_tests/dynamic.cs +++ b/src/embed_tests/dynamic.cs @@ -7,18 +7,18 @@ namespace Python.EmbeddingTest { public class DynamicTest { - private Py.GILState gil; + private Py.GILState _gs; [SetUp] public void SetUp() { - gil = Py.GIL(); + _gs = Py.GIL(); } [TearDown] public void Dispose() { - gil.Dispose(); + _gs.Dispose(); } /// diff --git a/src/embed_tests/pyimport.cs b/src/embed_tests/pyimport.cs index 17547d69a..d25d0b8c4 100644 --- a/src/embed_tests/pyimport.cs +++ b/src/embed_tests/pyimport.cs @@ -19,13 +19,13 @@ namespace Python.EmbeddingTest /// public class PyImportTest { - private IntPtr gs; + private IntPtr _gs; [SetUp] public void SetUp() { PythonEngine.Initialize(); - gs = PythonEngine.AcquireLock(); + _gs = PythonEngine.AcquireLock(); /* Append the tests directory to sys.path * using reflection to circumvent the private @@ -41,7 +41,7 @@ public void SetUp() [TearDown] public void Dispose() { - PythonEngine.ReleaseLock(gs); + PythonEngine.ReleaseLock(_gs); PythonEngine.Shutdown(); } diff --git a/src/embed_tests/pyrunstring.cs b/src/embed_tests/pyrunstring.cs index b17bb87f8..81a1b07ca 100644 --- a/src/embed_tests/pyrunstring.cs +++ b/src/embed_tests/pyrunstring.cs @@ -6,18 +6,18 @@ namespace Python.EmbeddingTest { public class RunStringTest { - private Py.GILState gil; + private Py.GILState _gs; [SetUp] public void SetUp() { - gil = Py.GIL(); + _gs = Py.GIL(); } [TearDown] public void Dispose() { - gil.Dispose(); + _gs.Dispose(); } [Test] From 8ce4e0e78ba6028cfb1447ce6c0d06950afd23aa Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 5 Mar 2017 23:01:26 -0700 Subject: [PATCH 240/324] Add PyList tests --- src/embed_tests/TestPyList.cs | 130 ++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/src/embed_tests/TestPyList.cs b/src/embed_tests/TestPyList.cs index 66b479b5c..e9acfbb45 100644 --- a/src/embed_tests/TestPyList.cs +++ b/src/embed_tests/TestPyList.cs @@ -19,6 +19,136 @@ public void Dispose() PythonEngine.Shutdown(); } + [Test] + public void TestStringIsListType() + { + var s = new PyString("foo"); + Assert.False(PyList.IsListType(s)); + } + + [Test] + public void TestListIsListType() + { + var s = new PyList(); + Assert.True(PyList.IsListType(s)); + } + + [Test] + public void TestStringAsListType() + { + var i = new PyInt(5); + PyList t = null; + + var ex = Assert.Throws(() => t = PyList.AsList(i)); + + Assert.AreEqual("TypeError : 'int' object is not iterable", ex.Message); + Assert.IsNull(t); + } + + [Test] + public void TestListAsListType() + { + var l = new PyList(); + PyList t = PyList.AsList(l); + + Assert.IsNotNull(t); + Assert.IsInstanceOf(typeof(PyList), t); + } + + [Test] + public void TestEmptyCtor() + { + var s = new PyList(); + + Assert.IsInstanceOf(typeof(PyList), s); + Assert.AreEqual(0, s.Length()); + } + + [Test] + public void TestPyObjectArrayCtor() + { + var ai = new PyObject[] {new PyInt(3), new PyInt(2), new PyInt(1) }; + var s = new PyList(ai); + + Assert.IsInstanceOf(typeof(PyList), s); + Assert.AreEqual(3, s.Length()); + Assert.AreEqual("3", s[0].ToString()); + Assert.AreEqual("2", s[1].ToString()); + Assert.AreEqual("1", s[2].ToString()); + } + + [Test] + public void TestPyObjectCtor() + { + var a = new PyList(); + var s = new PyList(a); + + Assert.IsInstanceOf(typeof(PyList), s); + Assert.AreEqual(0, s.Length()); + } + + [Test] + public void TestBadPyObjectCtor() + { + var i = new PyInt(5); + PyList t = null; + + var ex = Assert.Throws(() => t = new PyList(i)); + + Assert.AreEqual("object is not a list", ex.Message); + Assert.IsNull(t); + } + + [Test] + public void TestAppend() + { + var ai = new PyObject[] { new PyInt(3), new PyInt(2), new PyInt(1) }; + var s = new PyList(ai); + s.Append(new PyInt(4)); + + Assert.AreEqual(4, s.Length()); + Assert.AreEqual("4", s[3].ToString()); + } + + [Test] + public void TestInsert() + { + var ai = new PyObject[] { new PyInt(3), new PyInt(2), new PyInt(1) }; + var s = new PyList(ai); + s.Insert(0, new PyInt(4)); + + Assert.AreEqual(4, s.Length()); + Assert.AreEqual("4", s[0].ToString()); + } + + [Test] + public void TestReverse() + { + var ai = new PyObject[] { new PyInt(3), new PyInt(1), new PyInt(2) }; + var s = new PyList(ai); + + s.Reverse(); + + Assert.AreEqual(3, s.Length()); + Assert.AreEqual("2", s[0].ToString()); + Assert.AreEqual("1", s[1].ToString()); + Assert.AreEqual("3", s[2].ToString()); + } + + [Test] + public void TestSort() + { + var ai = new PyObject[] { new PyInt(3), new PyInt(1), new PyInt(2) }; + var s = new PyList(ai); + + s.Sort(); + + Assert.AreEqual(3, s.Length()); + Assert.AreEqual("1", s[0].ToString()); + Assert.AreEqual("2", s[1].ToString()); + Assert.AreEqual("3", s[2].ToString()); + } + [Test] public void TestOnPyList() { From ae8e6f08df50fdad48cf69e6f1e1f3652510d90e Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 7 Mar 2017 12:48:33 -0700 Subject: [PATCH 241/324] Add test for pyscript global variable casting Test for #420 --- .../fixtures/PyImportTest/cast_global_var.py | 7 +++++++ src/embed_tests/pyimport.cs | 15 +++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 src/embed_tests/fixtures/PyImportTest/cast_global_var.py diff --git a/src/embed_tests/fixtures/PyImportTest/cast_global_var.py b/src/embed_tests/fixtures/PyImportTest/cast_global_var.py new file mode 100644 index 000000000..f9499539e --- /dev/null +++ b/src/embed_tests/fixtures/PyImportTest/cast_global_var.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- + +FOO = 1 + + +def test_foo(): + return FOO diff --git a/src/embed_tests/pyimport.cs b/src/embed_tests/pyimport.cs index d25d0b8c4..3bb9a34d6 100644 --- a/src/embed_tests/pyimport.cs +++ b/src/embed_tests/pyimport.cs @@ -64,5 +64,20 @@ public void TestSysArgsImportException() PyObject module = PythonEngine.ImportModule("PyImportTest.sysargv"); Assert.IsNotNull(module); } + + /// + /// Test Global Variable casting. GH#420 + /// + [Test] + public void TestCastGlobalVar() + { + dynamic foo = Py.Import("PyImportTest.cast_global_var"); + Assert.AreEqual("1", foo.FOO.ToString()); + Assert.AreEqual("1", foo.test_foo().ToString()); + + foo.FOO = 2; + Assert.AreEqual("2", foo.FOO.ToString()); + Assert.AreEqual("2", foo.test_foo().ToString()); + } } } From 898e13ec975312f3a50b50b6b922c470abe0e7eb Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Tue, 7 Mar 2017 22:03:52 -0700 Subject: [PATCH 242/324] Clean-up README.md example --- README.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6a721e70f..daa8b53d6 100644 --- a/README.md +++ b/README.md @@ -56,17 +56,22 @@ static void Main(string[] args) using (Py.GIL()) { dynamic np = Py.Import("numpy"); + Console.WriteLine(np.cos(np.pi * 2)); + dynamic sin = np.sin; - Console.WriteLine(np.cos(np.pi*2)); Console.WriteLine(sin(5)); + double c = np.cos(5) + sin(5); Console.WriteLine(c); /* this block is temporarily disabled due to regression #249 dynamic a = np.array(new List { 1, 2, 3 }); - dynamic b = np.array(new List { 6, 5, 4 }, Py.kw("dtype", np.int32)); Console.WriteLine(a.dtype); + + dynamic b = np.array(new List { 6, 5, 4 }, Py.kw("dtype", np.int32)); Console.WriteLine(b.dtype); - Console.WriteLine(a * b); */ + + Console.WriteLine(a * b); + */ Console.ReadKey(); } } @@ -80,7 +85,7 @@ Output: -0.6752620892 float64 int32 -[6. 10. 12.] +[ 6. 10. 12.] ``` [appveyor shield]: https://img.shields.io/appveyor/ci/pythonnet/pythonnet/master.svg?label=AppVeyor From 7d457efc7599684f0b236de69dada4c18aa430d3 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Wed, 8 Mar 2017 08:35:58 -0700 Subject: [PATCH 243/324] Fix typo in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index daa8b53d6..2794298a6 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ from System.Windows.Forms import Form to apply keyword arguments. - All python objects should be declared as `dynamic` type. - Mathematical operations involving python and literal/managed types must - have the python object first, eg. `np.pi_2` works, `2_np.pi` doesn't. + have the python object first, eg. `np.pi * 2` works, `2 * np.pi` doesn't. ### Example From 21d1636c12f74fb5777ab4478a1ec5f8f935fe21 Mon Sep 17 00:00:00 2001 From: denfromufa Date: Fri, 10 Mar 2017 22:59:55 -0600 Subject: [PATCH 244/324] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf2384e9f..20b564627 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,8 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Added `requirements.txt` - Added to `PythonEngine` methods `Eval` and `Exec` (#389) - Added implementations of `ICustomMarshal` (#407) +- Added docker images +- Added hooks in pyinstaller and cx_freeze for pythonnet ### Changed From c3b59db2c1ffdb92e86257304b3588274277e14a Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 11 Mar 2017 07:34:43 -0700 Subject: [PATCH 245/324] =?UTF-8?q?Bump=20version:=202.3.0.dev1=20?= =?UTF-8?q?=E2=86=92=202.3.0=20release?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- CHANGELOG.md | 10 ++++++---- conda.recipe/meta.yaml | 2 +- setup.py | 2 +- src/runtime/resources/clr.py | 2 +- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index f79dfb480..30af44995 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 2.3.0.dev1 +current_version = 2.3.0 parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\.(?P[a-z]+)(?P\d+))? serialize = {major}.{minor}.{patch}.{release}{dev} diff --git a/CHANGELOG.md b/CHANGELOG.md index 20b564627..0c7de23c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ This project adheres to [Semantic Versioning][]. This document follows the conventions laid out in [Keep a CHANGELOG][]. -## [unreleased][] +## [2.3.0][] - 2017-03-11 ### Added @@ -24,8 +24,8 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Added `requirements.txt` - Added to `PythonEngine` methods `Eval` and `Exec` (#389) - Added implementations of `ICustomMarshal` (#407) -- Added docker images -- Added hooks in pyinstaller and cx_freeze for pythonnet +- Added docker images (#322) +- Added hooks in `pyinstaller` and `cx_freeze` for `pythonnet` (#66) ### Changed @@ -543,7 +543,9 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. [semantic versioning]: http://semver.org/ -[unreleased]: ../../compare/v2.2.2...HEAD +[unreleased]: ../../compare/v2.3.0...HEAD + +[2.3.0]: ../../compare/v2.2.2...v2.3.0 [2.2.2]: ../../compare/v2.2.1...v2.2.2 diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml index eaa8747b2..98602481f 100644 --- a/conda.recipe/meta.yaml +++ b/conda.recipe/meta.yaml @@ -1,6 +1,6 @@ package: name: pythonnet - version: "2.3.0.dev1" + version: "2.3.0" build: skip: True # [not win] diff --git a/setup.py b/setup.py index bb2a4d140..b85e2c8ad 100644 --- a/setup.py +++ b/setup.py @@ -365,7 +365,7 @@ def run(self): setup( name="pythonnet", - version="2.3.0.dev1", + version="2.3.0", description=".Net and Mono integration for Python", url='https://pythonnet.github.io/', license='MIT', diff --git a/src/runtime/resources/clr.py b/src/runtime/resources/clr.py index ccd17889f..91f1f6b15 100644 --- a/src/runtime/resources/clr.py +++ b/src/runtime/resources/clr.py @@ -2,7 +2,7 @@ Code in this module gets loaded into the main clr module. """ -__version__ = "2.3.0.dev1" +__version__ = "2.3.0" class clrproperty(object): From 51ec8a4b5fb1c7565f043b215caa60a058f36cc6 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 11 Mar 2017 08:07:06 -0700 Subject: [PATCH 246/324] =?UTF-8?q?Bump=20version:=202.3.0.=E2=86=92=202.4?= =?UTF-8?q?.0.dev0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Can't start at dev1 as bumpversion breaks if we add a minimum start version for dev. --- .bumpversion.cfg | 2 +- CHANGELOG.md | 14 ++++++++++++++ conda.recipe/meta.yaml | 2 +- setup.py | 2 +- src/SharedAssemblyInfo.cs | 2 +- src/clrmodule/ClrModule.cs | 2 +- src/runtime/resources/clr.py | 2 +- 7 files changed, 20 insertions(+), 6 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 30af44995..ac1d31324 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 2.3.0 +current_version = 2.4.0.dev0 parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\.(?P[a-z]+)(?P\d+))? serialize = {major}.{minor}.{patch}.{release}{dev} diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c7de23c7..f9a3d7a2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,20 @@ This project adheres to [Semantic Versioning][]. This document follows the conventions laid out in [Keep a CHANGELOG][]. +## [unreleased][] + +### Added + +- Added `Foo` feature + +### Changed + +- Changed `Bar` feature + +### Fixed + +- Fixed `FooBar` bug + ## [2.3.0][] - 2017-03-11 ### Added diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml index 98602481f..3641185bb 100644 --- a/conda.recipe/meta.yaml +++ b/conda.recipe/meta.yaml @@ -1,6 +1,6 @@ package: name: pythonnet - version: "2.3.0" + version: "2.4.0.dev0" build: skip: True # [not win] diff --git a/setup.py b/setup.py index b85e2c8ad..b9893563a 100644 --- a/setup.py +++ b/setup.py @@ -365,7 +365,7 @@ def run(self): setup( name="pythonnet", - version="2.3.0", + version="2.4.0.dev0", description=".Net and Mono integration for Python", url='https://pythonnet.github.io/', license='MIT', diff --git a/src/SharedAssemblyInfo.cs b/src/SharedAssemblyInfo.cs index 24ba26862..c164e75d6 100644 --- a/src/SharedAssemblyInfo.cs +++ b/src/SharedAssemblyInfo.cs @@ -25,4 +25,4 @@ // Version Information. Keeping it simple. May need to revisit for Nuget // See: https://codingforsmarties.wordpress.com/2016/01/21/how-to-version-assemblies-destined-for-nuget/ // AssemblyVersion can only be numeric -[assembly: AssemblyVersion("2.3.0")] +[assembly: AssemblyVersion("2.4.0")] diff --git a/src/clrmodule/ClrModule.cs b/src/clrmodule/ClrModule.cs index d24376a1f..3bb3a533b 100644 --- a/src/clrmodule/ClrModule.cs +++ b/src/clrmodule/ClrModule.cs @@ -53,7 +53,7 @@ public static void initclr() { #if USE_PYTHON_RUNTIME_VERSION // Has no effect until SNK works. Keep updated anyways. - Version = new Version("2.3.0"), + Version = new Version("2.4.0"), #endif CultureInfo = CultureInfo.InvariantCulture }; diff --git a/src/runtime/resources/clr.py b/src/runtime/resources/clr.py index 91f1f6b15..e708a54ac 100644 --- a/src/runtime/resources/clr.py +++ b/src/runtime/resources/clr.py @@ -2,7 +2,7 @@ Code in this module gets loaded into the main clr module. """ -__version__ = "2.3.0" +__version__ = "2.4.0.dev0" class clrproperty(object): From d40a2dccbc484783bb24d95819ce5ff68e350b61 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sat, 11 Mar 2017 08:33:14 -0700 Subject: [PATCH 247/324] Build conda recipe on new tags Ensure that new binaries are generated for releases which are usually not from pull_requests. Using APPVEYOR_REPO_TAG_NAME because yields shorter syntax because it's undefined (ie false) when not a tag and APPVEYOR_REPO_TAG has to be compared to lowercase `true` instead of `True` like everything else. Definitions: APPVEYOR_REPO_TAG_NAME - contains tag name for builds started by tag; otherwise this variable is undefined; APPVEYOR_REPO_TAG - true if build has started by pushed tag; otherwise false; https://www.appveyor.com/docs/environment-variables/ --- ci/appveyor_build_recipe.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/appveyor_build_recipe.ps1 b/ci/appveyor_build_recipe.ps1 index 52520f4c2..84e0bc7c6 100644 --- a/ci/appveyor_build_recipe.ps1 +++ b/ci/appveyor_build_recipe.ps1 @@ -11,7 +11,7 @@ if ($env:PLATFORM -eq "x86"){ $env:CONDA_BLD = "$env:CONDA_BLD" + "-x64" } -if ($env:APPVEYOR_PULL_REQUEST_NUMBER -or $env:FORCE_CONDA_BUILD -eq "True") { +if ($env:APPVEYOR_PULL_REQUEST_NUMBER -or $env:APPVEYOR_REPO_TAG_NAME -or $env:FORCE_CONDA_BUILD -eq "True") { # Update PATH, and keep a copy to restore at end of this PowerShell script $old_path = $env:path $env:path = "$env:CONDA_BLD;$env:CONDA_BLD\Scripts;" + $env:path From 4df6105b98b302029e524c7ce36f7b3cb18f7040 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Mon, 13 Mar 2017 21:28:26 -0700 Subject: [PATCH 248/324] Fix numpy array and README example (#427) * Fix numpy array and README example Generic Lists were falling through and being classified as `typecode.Object` To solve this, adding a specific processing branch for `Generic Lists` only to avoid breaking the changes from 471673a1fa4691b3becb4d9fee6941308535bb04 Closes #249 * Update syntax --- README.md | 3 +- src/embed_tests/Python.EmbeddingTest.csproj | 1 + src/embed_tests/TestExample.cs | 53 +++++++++++++++++++++ src/runtime/converter.cs | 17 +++++++ 4 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 src/embed_tests/TestExample.cs diff --git a/README.md b/README.md index 2794298a6..da43abacd 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ static void Main(string[] args) double c = np.cos(5) + sin(5); Console.WriteLine(c); - /* this block is temporarily disabled due to regression #249 + dynamic a = np.array(new List { 1, 2, 3 }); Console.WriteLine(a.dtype); @@ -71,7 +71,6 @@ static void Main(string[] args) Console.WriteLine(b.dtype); Console.WriteLine(a * b); - */ Console.ReadKey(); } } diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index 9c417cd27..3ec0d4b57 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -85,6 +85,7 @@ + diff --git a/src/embed_tests/TestExample.cs b/src/embed_tests/TestExample.cs new file mode 100644 index 000000000..0cf795f5d --- /dev/null +++ b/src/embed_tests/TestExample.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using NUnit.Framework; +using Python.Runtime; + +namespace Python.EmbeddingTest +{ + public class TestExample + { + [OneTimeSetUp] + public void SetUp() + { + PythonEngine.Initialize(); + } + + [OneTimeTearDown] + public void Dispose() + { + PythonEngine.Shutdown(); + } + + [Test] + public void TestReadme() + { + dynamic np; + try + { + np = Py.Import("numpy"); + } + catch (PythonException) + { + Assert.Inconclusive("Numpy or dependency not installed"); + return; + } + + Assert.AreEqual("1.0", np.cos(np.pi * 2).ToString()); + + dynamic sin = np.sin; + StringAssert.StartsWith("-0.95892", sin(5).ToString()); + + double c = np.cos(5) + sin(5); + Assert.AreEqual(-0.675262, c, 0.01); + + dynamic a = np.array(new List { 1, 2, 3 }); + Assert.AreEqual("float64", a.dtype.ToString()); + + dynamic b = np.array(new List { 6, 5, 4 }, Py.kw("dtype", np.int32)); + Assert.AreEqual("int32", b.dtype.ToString()); + + Assert.AreEqual("[ 6. 10. 12.]", (a * b).ToString()); + } + } +} diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index b66150a29..e68767da9 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -1,5 +1,6 @@ using System; using System.Collections; +using System.Collections.Generic; using System.Globalization; using System.Reflection; using System.Runtime.InteropServices; @@ -133,6 +134,22 @@ internal static IntPtr ToPython(object value, Type type) return result; } + if (value is IList && value.GetType().IsGenericType) + { + using (var resultlist = new PyList()) + { + foreach (object o in (IEnumerable)value) + { + using (var p = new PyObject(ToPython(o, o?.GetType()))) + { + resultlist.Append(p); + } + } + Runtime.XIncref(resultlist.Handle); + return resultlist.Handle; + } + } + // it the type is a python subclass of a managed type then return the // underlying python object rather than construct a new wrapper object. var pyderived = value as IPythonDerivedType; From a94e155a4fc2184633fe51e24872ee9ed1547fda Mon Sep 17 00:00:00 2001 From: Christopher Pow Date: Wed, 22 Mar 2017 22:31:26 -0500 Subject: [PATCH 249/324] Msbuild15 patch (#435) * Update AUTHORS.md * Update CHANGELOG.md * Update setup.py * Update bld.bat --- AUTHORS.md | 1 + CHANGELOG.md | 1 + conda.recipe/bld.bat | 2 +- setup.py | 3 +++ 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/AUTHORS.md b/AUTHORS.md index 09358586e..2724b8203 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -16,6 +16,7 @@ - Bradley Friedman ([@leith-bartrich](https://github.com/leith-bartrich)) - Christian Heimes ([@tiran](https://github.com/tiran)) - Christoph Gohlke ([@cgohlke](https://github.com/cgohlke)) +- Christopher Pow ([@christopherpow](https://github.com/christopherpow)) - Daniel Fernandez ([@fdanny](https://github.com/fdanny)) - Daniel Santana ([@dgsantana](https://github.com/dgsantana)) - David Lechner ([@dlech](https://github.com/dlech)) diff --git a/CHANGELOG.md b/CHANGELOG.md index f9a3d7a2e..ac76b5f72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ### Fixed +- Fixed Visual Studio 2017 compat (#434) for setup.py - Fixed `FooBar` bug ## [2.3.0][] - 2017-03-11 diff --git a/conda.recipe/bld.bat b/conda.recipe/bld.bat index 1495f877d..27b55f2de 100644 --- a/conda.recipe/bld.bat +++ b/conda.recipe/bld.bat @@ -1,6 +1,6 @@ :: build it :: set path to modern MSBuild -set PATH=C:\Program Files (x86)\MSBuild\14.0\Bin;%PATH% +set PATH=C:\Program Files (x86)\MSBuild\14.0\Bin;C:\Program Files (x86)\MSBuild\15.0\Bin;%PATH% %PYTHON% setup.py install diff --git a/setup.py b/setup.py index b9893563a..c98f3ed57 100644 --- a/setup.py +++ b/setup.py @@ -65,6 +65,9 @@ ) VS_KEYS = ( + RegKey(sdk_name="MSBuild 15", key=vs_root.format("15.0"), + value_name="MSBuildToolsPath", suffix=""), + RegKey(sdk_name="MSBuild 14", key=vs_root.format("14.0"), value_name="MSBuildToolsPath", suffix=""), From 0757594c195964693ed9115cdd7c1e7a2c6c7637 Mon Sep 17 00:00:00 2001 From: denfromufa Date: Wed, 22 Mar 2017 23:08:22 -0500 Subject: [PATCH 250/324] Create .mention-bot --- .mention-bot | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .mention-bot diff --git a/.mention-bot b/.mention-bot new file mode 100644 index 000000000..da71eabb8 --- /dev/null +++ b/.mention-bot @@ -0,0 +1,36 @@ +{ + "maxReviewers": 5, // Maximum number of people to ping in the PR message, default is 3 + "numFilesToCheck": 10, // Number of files to check against, default is 5 + "message": "@pullRequester, thanks! @reviewers, please review this.", + // custom message using @pullRequester and @reviewers + "alwaysNotifyForPaths": [ + { + "name": "ghuser", // The user's Github username + "files": ["src/js/**/*.js"], // The array of file globs associated with the user + "skipTeamPrs": false // mention-bot will exclude the creator's own team from mentions + } + ], // Users will always be mentioned based on file glob + "fallbackNotifyForPaths": [ + { + "name": "ghuser", // The user's Github username + "files": ["src/js/**/*.js"], // The array of file globs associated with the user + "skipTeamPrs": false // mention-bot will exclude the creator's own team from mentions + } + ], // Users will be mentioned based on file glob if no other user was found + "findPotentialReviewers": true, // mention-bot will try to find potential reviewers based on files history, if disabled, `alwaysNotifyForPaths` is used instead + "fileBlacklist": ["*.md"], // mention-bot will ignore any files that match these file globs + "userBlacklist": [], // Users in this list will never be mentioned by mention-bot + "userBlacklistForPR": [], // PR made by users in this list will be ignored + "requiredOrgs": [], // mention-bot will only mention user who are a member of one of these organizations + "actions": ["opened"], // List of PR actions that mention-bot will listen to, default is "opened" + "skipAlreadyAssignedPR": false, // mention-bot will ignore already assigned PR's + "skipAlreadyMentionedPR": false, // mention-bot will ignore if there is already existing an exact mention + "assignToReviewer": false, // mention-bot assigns the most appropriate reviewer for PR + "createReviewRequest": false, // mention-bot creates review request for the most appropriate reviewer for PR + "createComment": true, // mention-bot creates a comment mentioning the reviewers for the PR + "skipTitle": "", // mention-bot will ignore PR that includes text in the title, + "withLabel": "", // mention-bot will only consider PR's with this label. Must set actions to ["labeled"]. + "delayed": false, // mention-bot will wait to comment until specified time in `delayedUntil` value + "delayedUntil": "3d", // Used if delayed is equal true, permitted values are: minutes, hours, or days, e.g.: '3 days', '40 minutes', '1 hour', '3d', '1h', '10m' + "skipCollaboratorPR": false // mention-bot will ignore if PR is made by collaborator +} From c8f37560d4bebaad6895fc6aa0c7c681856ab0e6 Mon Sep 17 00:00:00 2001 From: denfromufa Date: Thu, 23 Mar 2017 12:45:27 -0500 Subject: [PATCH 251/324] WPF DynamicGrid python and XAML layout files (#280) --- demo/DynamicGrid.py | 23 +++++++++++++++++++++++ demo/DynamicGrid.xaml | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 demo/DynamicGrid.py create mode 100644 demo/DynamicGrid.xaml diff --git a/demo/DynamicGrid.py b/demo/DynamicGrid.py new file mode 100644 index 000000000..951a6c248 --- /dev/null +++ b/demo/DynamicGrid.py @@ -0,0 +1,23 @@ +import clr +import sys +if sys.platform.lower() not in ['cli','win32']: + print("only windows is supported for wpf") +clr.AddReference(r"wpf\PresentationFramework") +from System.IO import StreamReader +from System.Windows.Markup import XamlReader +from System.Threading import Thread, ThreadStart, ApartmentState +from System.Windows import Application, Window + + +class MyWindow(Window): + def __init__(self): + stream = StreamReader("DynamicGrid.xaml") + window = XamlReader.Load(stream.BaseStream) + Application().Run(window) + + +if __name__ == '__main__': + thread = Thread(ThreadStart(MyWindow)) + thread.SetApartmentState(ApartmentState.STA) + thread.Start() + thread.Join() diff --git a/demo/DynamicGrid.xaml b/demo/DynamicGrid.xaml new file mode 100644 index 000000000..3c82eb16d --- /dev/null +++ b/demo/DynamicGrid.xaml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + From 39e4673fb275f65d1e2605048cac1914850c8078 Mon Sep 17 00:00:00 2001 From: Ville Vainio Date: Fri, 24 Mar 2017 02:51:22 +0200 Subject: [PATCH 252/324] Support clr.GetClrType() - as in IronPython (#433) * Support clr.GetClrType() - as in IronPython Implements https://github.com/pythonnet/pythonnet/issues/432 * Tests for clr.GetClrType() * clr.GetClrType test: ensure bad type raises ArgumentException * clr.GetClrType - added xml doc comment, updated AUTHORS.md and CHANGELOG.md * Simplified implementation of clr.GetClrType (taken from IronPython) --- AUTHORS.md | 1 + CHANGELOG.md | 2 +- src/runtime/moduleobject.cs | 17 +++++++++++++++++ src/tests/test_module.py | 20 ++++++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/AUTHORS.md b/AUTHORS.md index 2724b8203..10b17f157 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -32,6 +32,7 @@ - Sam Winstanley ([@swinstanley](https://github.com/swinstanley)) - Sean Freitag ([@cowboygneox](https://github.com/cowboygneox)) - Serge Weinstock ([@sweinst](https://github.com/sweinst)) +- Ville M. Vainio ([@vivainio](https://github.com/vivainio)) - Virgil Dupras ([@hsoft](https://github.com/hsoft)) - Wenguang Yang ([@yagweb](https://github.com/yagweb)) - Xavier Dupré ([@sdpython](https://github.com/sdpython)) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac76b5f72..b446cc4b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ## [unreleased][] ### Added - +- Added clr.GetClrType (#432)(#433) - Added `Foo` feature ### Changed diff --git a/src/runtime/moduleobject.cs b/src/runtime/moduleobject.cs index 258d77bac..e683026f9 100644 --- a/src/runtime/moduleobject.cs +++ b/src/runtime/moduleobject.cs @@ -403,6 +403,23 @@ public static Assembly AddReference(string name) return assembly; } + /// + /// Get a Type instance for a class object. + /// clr.GetClrType(IComparable) gives you the Type for IComparable, + /// that you can e.g. perform reflection on. Similar to typeof(IComparable) in C# + /// or clr.GetClrType(IComparable) in IronPython. + /// + /// + /// + /// The Type object + + [ModuleFunction] + [ForbidPythonThreads] + public static Type GetClrType(Type type) + { + return type; + } + [ModuleFunction] [ForbidPythonThreads] public static string FindAssembly(string name) diff --git a/src/tests/test_module.py b/src/tests/test_module.py index 2255ea411..e02aa6e01 100644 --- a/src/tests/test_module.py +++ b/src/tests/test_module.py @@ -352,6 +352,26 @@ def test_clr_add_reference(): with pytest.raises(FileNotFoundException): AddReference("somethingtotallysilly") +def test_clr_get_clr_type(): + """Test clr.GetClrType().""" + from clr import GetClrType + import System + from System import IComparable + from System import ArgumentException + assert GetClrType(System.String).FullName == "System.String" + comparable = GetClrType(IComparable) + assert comparable.FullName == "System.IComparable" + assert comparable.IsInterface + assert GetClrType(int).FullName == "System.Int32" + assert GetClrType(str).FullName == "System.String" + assert GetClrType(float).FullName == "System.Double" + dblarr = System.Array[System.Double] + assert GetClrType(dblarr).FullName == "System.Double[]" + + with pytest.raises(TypeError): + GetClrType(1) + with pytest.raises(TypeError): + GetClrType("thiswillfail") def test_assembly_load_thread_safety(): from Python.Test import ModuleTest From 7dba1055a313c26d6d6df34397482054d9e4ff6e Mon Sep 17 00:00:00 2001 From: denfromufa Date: Tue, 28 Mar 2017 13:11:02 -0500 Subject: [PATCH 253/324] Update .mention-bot --- .mention-bot | 53 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/.mention-bot b/.mention-bot index da71eabb8..6541cea2e 100644 --- a/.mention-bot +++ b/.mention-bot @@ -1,36 +1,35 @@ { - "maxReviewers": 5, // Maximum number of people to ping in the PR message, default is 3 - "numFilesToCheck": 10, // Number of files to check against, default is 5 + "maxReviewers": 5, + "numFilesToCheck": 10, "message": "@pullRequester, thanks! @reviewers, please review this.", - // custom message using @pullRequester and @reviewers "alwaysNotifyForPaths": [ { - "name": "ghuser", // The user's Github username - "files": ["src/js/**/*.js"], // The array of file globs associated with the user - "skipTeamPrs": false // mention-bot will exclude the creator's own team from mentions + "name": "ghuser", + "files": ["src/js/**/*.js"], + "skipTeamPrs": false } - ], // Users will always be mentioned based on file glob + ], "fallbackNotifyForPaths": [ { - "name": "ghuser", // The user's Github username - "files": ["src/js/**/*.js"], // The array of file globs associated with the user - "skipTeamPrs": false // mention-bot will exclude the creator's own team from mentions + "name": "ghuser", + "files": ["src/js/**/*.js"], + "skipTeamPrs": fals } - ], // Users will be mentioned based on file glob if no other user was found - "findPotentialReviewers": true, // mention-bot will try to find potential reviewers based on files history, if disabled, `alwaysNotifyForPaths` is used instead - "fileBlacklist": ["*.md"], // mention-bot will ignore any files that match these file globs - "userBlacklist": [], // Users in this list will never be mentioned by mention-bot - "userBlacklistForPR": [], // PR made by users in this list will be ignored - "requiredOrgs": [], // mention-bot will only mention user who are a member of one of these organizations - "actions": ["opened"], // List of PR actions that mention-bot will listen to, default is "opened" - "skipAlreadyAssignedPR": false, // mention-bot will ignore already assigned PR's - "skipAlreadyMentionedPR": false, // mention-bot will ignore if there is already existing an exact mention - "assignToReviewer": false, // mention-bot assigns the most appropriate reviewer for PR - "createReviewRequest": false, // mention-bot creates review request for the most appropriate reviewer for PR - "createComment": true, // mention-bot creates a comment mentioning the reviewers for the PR - "skipTitle": "", // mention-bot will ignore PR that includes text in the title, - "withLabel": "", // mention-bot will only consider PR's with this label. Must set actions to ["labeled"]. - "delayed": false, // mention-bot will wait to comment until specified time in `delayedUntil` value - "delayedUntil": "3d", // Used if delayed is equal true, permitted values are: minutes, hours, or days, e.g.: '3 days', '40 minutes', '1 hour', '3d', '1h', '10m' - "skipCollaboratorPR": false // mention-bot will ignore if PR is made by collaborator + ], + "findPotentialReviewers": true, + "fileBlacklist": ["*.md"], + "userBlacklist": [], + "userBlacklistForPR": [], + "requiredOrgs": [], + "actions": ["opened"], + "skipAlreadyAssignedPR": false, + "skipAlreadyMentionedPR": false, + "assignToReviewer": false, + "createReviewRequest": false, + "createComment": true, + "skipTitle": "", + "withLabel": "", + "delayed": false, + "delayedUntil": "3d", + "skipCollaboratorPR": false } From 3f83e985fba5821f4b132992134662f272d407d4 Mon Sep 17 00:00:00 2001 From: denfromufa Date: Tue, 28 Mar 2017 13:11:36 -0500 Subject: [PATCH 254/324] Update .mention-bot --- .mention-bot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.mention-bot b/.mention-bot index 6541cea2e..f07fa548e 100644 --- a/.mention-bot +++ b/.mention-bot @@ -13,7 +13,7 @@ { "name": "ghuser", "files": ["src/js/**/*.js"], - "skipTeamPrs": fals + "skipTeamPrs": false } ], "findPotentialReviewers": true, From 67650a23549aaa6437bd239b8e53d8928cdc2dc1 Mon Sep 17 00:00:00 2001 From: Victor Uriarte Date: Sun, 2 Apr 2017 08:50:17 -0700 Subject: [PATCH 255/324] Re-add CallingConvention Closes #448 --- src/runtime/runtime.cs | 491 +++++++++++++++++++++-------------------- 1 file changed, 252 insertions(+), 239 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 346ea745f..9ee693cf3 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -570,7 +570,7 @@ internal static unsafe long Refcount(IntPtr op) /// Limit this function usage for Testing and Py_Debug builds /// /// PyObject Ptr - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void Py_IncRef(IntPtr ob); /// @@ -578,157 +578,157 @@ internal static unsafe long Refcount(IntPtr op) /// Limit this function usage for Testing and Py_Debug builds /// /// PyObject Ptr - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void Py_DecRef(IntPtr ob); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void Py_Initialize(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int Py_IsInitialized(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void Py_Finalize(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_NewInterpreter(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void Py_EndInterpreter(IntPtr threadState); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyThreadState_New(IntPtr istate); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyThreadState_Get(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyThread_get_key_value(IntPtr key); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyThread_get_thread_ident(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyThread_set_key_value(IntPtr key, IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyThreadState_Swap(IntPtr key); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyGILState_Ensure(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyGILState_Release(IntPtr gs); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyGILState_GetThisThreadState(); #if PYTHON3 - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] public static extern int Py_Main( int argc, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrArrayMarshaler))] string[] argv ); #elif PYTHON2 - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] public static extern int Py_Main(int argc, string[] argv); #endif - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyEval_InitThreads(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyEval_ThreadsInitialized(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyEval_AcquireLock(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyEval_ReleaseLock(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyEval_AcquireThread(IntPtr tstate); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyEval_ReleaseThread(IntPtr tstate); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyEval_SaveThread(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyEval_RestoreThread(IntPtr tstate); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyEval_GetBuiltins(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyEval_GetGlobals(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyEval_GetLocals(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_GetProgramName(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void Py_SetProgramName(IntPtr name); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_GetPythonHome(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void Py_SetPythonHome(IntPtr home); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_GetPath(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void Py_SetPath(IntPtr home); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_GetVersion(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_GetPlatform(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_GetCopyright(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_GetCompiler(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_GetBuildInfo(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyRun_SimpleString(string code); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyRun_String(string code, IntPtr st, IntPtr globals, IntPtr locals); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_CompileString(string code, string file, IntPtr tok); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyImport_ExecCodeModule(string name, IntPtr code); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyCFunction_NewEx(IntPtr ml, IntPtr self, IntPtr mod); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyCFunction_Call(IntPtr func, IntPtr args, IntPtr kw); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyClass_New(IntPtr bases, IntPtr dict, IntPtr name); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyInstance_New(IntPtr cls, IntPtr args, IntPtr kw); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyInstance_NewRaw(IntPtr cls, IntPtr dict); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyMethod_New(IntPtr func, IntPtr self, IntPtr cls); @@ -777,44 +777,44 @@ internal static string PyObject_GetTypeName(IntPtr op) return Marshal.PtrToStringAnsi(ppName); } - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_HasAttrString(IntPtr pointer, string name); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_GetAttrString(IntPtr pointer, string name); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_SetAttrString(IntPtr pointer, string name, IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_HasAttr(IntPtr pointer, IntPtr name); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_GetAttr(IntPtr pointer, IntPtr name); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_SetAttr(IntPtr pointer, IntPtr name, IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_GetItem(IntPtr pointer, IntPtr key); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_SetItem(IntPtr pointer, IntPtr key, IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_DelItem(IntPtr pointer, IntPtr key); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_GetIter(IntPtr op); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_Call(IntPtr pointer, IntPtr args, IntPtr kw); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_CallObject(IntPtr pointer, IntPtr args); #if PYTHON3 - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_RichCompareBool(IntPtr value1, IntPtr value2, int opid); internal static int PyObject_Compare(IntPtr value1, IntPtr value2) @@ -842,46 +842,47 @@ internal static int PyObject_Compare(IntPtr value1, IntPtr value2) return -1; } #elif PYTHON2 - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_Compare(IntPtr value1, IntPtr value2); #endif - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_IsInstance(IntPtr ob, IntPtr type); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_IsSubclass(IntPtr ob, IntPtr type); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyCallable_Check(IntPtr pointer); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_IsTrue(IntPtr pointer); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_Not(IntPtr pointer); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_Size(IntPtr pointer); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_Hash(IntPtr op); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_Repr(IntPtr pointer); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_Str(IntPtr pointer); #if PYTHON3 - [DllImport(PythonDll, EntryPoint = "PyObject_Str")] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyObject_Str")] internal static extern IntPtr PyObject_Unicode(IntPtr pointer); #elif PYTHON2 - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_Unicode(IntPtr pointer); #endif - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_Dir(IntPtr pointer); @@ -890,20 +891,21 @@ internal static int PyObject_Compare(IntPtr value1, IntPtr value2) //==================================================================== #if PYTHON3 - [DllImport(PythonDll, EntryPoint = "PyNumber_Long")] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyNumber_Long")] internal static extern IntPtr PyNumber_Int(IntPtr ob); #elif PYTHON2 - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Int(IntPtr ob); #endif - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Long(IntPtr ob); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Float(IntPtr ob); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern bool PyNumber_Check(IntPtr ob); internal static bool PyInt_Check(IntPtr ob) @@ -929,28 +931,32 @@ internal static IntPtr PyInt_FromInt64(long value) } #if PYTHON3 - [DllImport(PythonDll, EntryPoint = "PyLong_FromLong")] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyLong_FromLong")] private static extern IntPtr PyInt_FromLong(IntPtr value); - [DllImport(PythonDll, EntryPoint = "PyLong_AsLong")] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyLong_AsLong")] internal static extern int PyInt_AsLong(IntPtr value); - [DllImport(PythonDll, EntryPoint = "PyLong_FromString")] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyLong_FromString")] internal static extern IntPtr PyInt_FromString(string value, IntPtr end, int radix); - [DllImport(PythonDll, EntryPoint = "PyLong_GetMax")] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyLong_GetMax")] internal static extern int PyInt_GetMax(); #elif PYTHON2 - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] private static extern IntPtr PyInt_FromLong(IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyInt_AsLong(IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyInt_FromString(string value, IntPtr end, int radix); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyInt_GetMax(); #endif @@ -959,34 +965,34 @@ internal static bool PyLong_Check(IntPtr ob) return PyObject_TYPE(ob) == PyLongType; } - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyLong_FromLong(long value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyLong_FromUnsignedLong(uint value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyLong_FromDouble(double value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyLong_FromLongLong(long value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyLong_FromUnsignedLongLong(ulong value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyLong_FromString(string value, IntPtr end, int radix); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyLong_AsLong(IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern uint PyLong_AsUnsignedLong(IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern long PyLong_AsLongLong(IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern ulong PyLong_AsUnsignedLongLong(IntPtr value); internal static bool PyFloat_Check(IntPtr ob) @@ -994,88 +1000,88 @@ internal static bool PyFloat_Check(IntPtr ob) return PyObject_TYPE(ob) == PyFloatType; } - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyFloat_FromDouble(double value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyFloat_FromString(IntPtr value, IntPtr junk); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern double PyFloat_AsDouble(IntPtr ob); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Add(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Subtract(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Multiply(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Divide(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_And(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Xor(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Or(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Lshift(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Rshift(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Power(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Remainder(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceAdd(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceSubtract(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceMultiply(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceDivide(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceAnd(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceXor(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceOr(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceLshift(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceRshift(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlacePower(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceRemainder(IntPtr o1, IntPtr o2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Negative(IntPtr o1); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Positive(IntPtr o1); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Invert(IntPtr o1); @@ -1083,49 +1089,49 @@ internal static bool PyFloat_Check(IntPtr ob) // Python sequence API //==================================================================== - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern bool PySequence_Check(IntPtr pointer); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PySequence_GetItem(IntPtr pointer, int index); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySequence_SetItem(IntPtr pointer, int index, IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySequence_DelItem(IntPtr pointer, int index); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PySequence_GetSlice(IntPtr pointer, int i1, int i2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySequence_SetSlice(IntPtr pointer, int i1, int i2, IntPtr v); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySequence_DelSlice(IntPtr pointer, int i1, int i2); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySequence_Size(IntPtr pointer); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySequence_Contains(IntPtr pointer, IntPtr item); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PySequence_Concat(IntPtr pointer, IntPtr other); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PySequence_Repeat(IntPtr pointer, int count); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySequence_Index(IntPtr pointer, IntPtr item); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySequence_Count(IntPtr pointer, IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PySequence_Tuple(IntPtr pointer); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PySequence_List(IntPtr pointer); @@ -1150,10 +1156,10 @@ internal static IntPtr PyString_FromString(string value) } #if PYTHON3 - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyBytes_FromString(string op); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyBytes_Size(IntPtr op); internal static IntPtr PyBytes_AS_STRING(IntPtr ob) @@ -1161,22 +1167,23 @@ internal static IntPtr PyBytes_AS_STRING(IntPtr ob) return ob + BytesOffset.ob_sval; } - [DllImport(PythonDll, EntryPoint = "PyUnicode_FromStringAndSize")] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = "PyUnicode_FromStringAndSize")] internal static extern IntPtr PyString_FromStringAndSize( [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Utf8Marshaler))] string value, int size ); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyUnicode_FromStringAndSize(IntPtr value, int size); #elif PYTHON2 - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyString_FromStringAndSize(string value, int size); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyString_AsString(IntPtr op); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyString_Size(IntPtr pointer); #endif @@ -1186,13 +1193,13 @@ internal static bool PyUnicode_Check(IntPtr ob) } #if PYTHON3 - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyUnicode_FromObject(IntPtr ob); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyUnicode_FromKindAndData( int kind, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UcsMarshaler))] string s, @@ -1204,34 +1211,40 @@ internal static IntPtr PyUnicode_FromUnicode(string s, int size) return PyUnicode_FromKindAndData(UCS, s, size); } - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyUnicode_GetSize(IntPtr ob); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyUnicode_FromOrdinal(int c); #elif PYTHON2 - [DllImport(PythonDll, EntryPoint = PyUnicodeEntryPoint + "FromObject")] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = PyUnicodeEntryPoint + "FromObject")] internal static extern IntPtr PyUnicode_FromObject(IntPtr ob); - [DllImport(PythonDll, EntryPoint = PyUnicodeEntryPoint + "FromEncodedObject")] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = PyUnicodeEntryPoint + "FromEncodedObject")] internal static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - [DllImport(PythonDll, EntryPoint = PyUnicodeEntryPoint + "FromUnicode")] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = PyUnicodeEntryPoint + "FromUnicode")] internal static extern IntPtr PyUnicode_FromUnicode( [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UcsMarshaler))] string s, int size ); - [DllImport(PythonDll, EntryPoint = PyUnicodeEntryPoint + "GetSize")] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = PyUnicodeEntryPoint + "GetSize")] internal static extern int PyUnicode_GetSize(IntPtr ob); - [DllImport(PythonDll, EntryPoint = PyUnicodeEntryPoint + "AsUnicode")] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = PyUnicodeEntryPoint + "AsUnicode")] internal static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(PythonDll, EntryPoint = PyUnicodeEntryPoint + "FromOrdinal")] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + EntryPoint = PyUnicodeEntryPoint + "FromOrdinal")] internal static extern IntPtr PyUnicode_FromOrdinal(int c); #endif @@ -1288,52 +1301,52 @@ internal static bool PyDict_Check(IntPtr ob) return PyObject_TYPE(ob) == PyDictType; } - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyDict_New(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyDictProxy_New(IntPtr dict); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyDict_GetItem(IntPtr pointer, IntPtr key); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyDict_GetItemString(IntPtr pointer, string key); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyDict_SetItem(IntPtr pointer, IntPtr key, IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyDict_SetItemString(IntPtr pointer, string key, IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyDict_DelItem(IntPtr pointer, IntPtr key); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyDict_DelItemString(IntPtr pointer, string key); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyMapping_HasKey(IntPtr pointer, IntPtr key); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyDict_Keys(IntPtr pointer); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyDict_Values(IntPtr pointer); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyDict_Items(IntPtr pointer); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyDict_Copy(IntPtr pointer); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyDict_Update(IntPtr pointer, IntPtr other); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyDict_Clear(IntPtr pointer); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyDict_Size(IntPtr pointer); @@ -1346,37 +1359,37 @@ internal static bool PyList_Check(IntPtr ob) return PyObject_TYPE(ob) == PyListType; } - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyList_New(int size); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyList_AsTuple(IntPtr pointer); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyList_GetItem(IntPtr pointer, int index); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyList_SetItem(IntPtr pointer, int index, IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyList_Insert(IntPtr pointer, int index, IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyList_Append(IntPtr pointer, IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyList_Reverse(IntPtr pointer); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyList_Sort(IntPtr pointer); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyList_GetSlice(IntPtr pointer, int start, int end); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyList_SetSlice(IntPtr pointer, int start, int end, IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyList_Size(IntPtr pointer); @@ -1389,19 +1402,19 @@ internal static bool PyTuple_Check(IntPtr ob) return PyObject_TYPE(ob) == PyTupleType; } - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyTuple_New(int size); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyTuple_GetItem(IntPtr pointer, int index); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyTuple_SetItem(IntPtr pointer, int index, IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyTuple_GetSlice(IntPtr pointer, int start, int end); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyTuple_Size(IntPtr pointer); @@ -1410,7 +1423,7 @@ internal static bool PyTuple_Check(IntPtr ob) //==================================================================== #if PYTHON2 - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern bool PyIter_Check(IntPtr pointer); #elif PYTHON3 internal static bool PyIter_Check(IntPtr pointer) @@ -1421,7 +1434,7 @@ internal static bool PyIter_Check(IntPtr pointer) } #endif - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyIter_Next(IntPtr pointer); @@ -1429,47 +1442,47 @@ internal static bool PyIter_Check(IntPtr pointer) // Python module API //==================================================================== - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyModule_New(string name); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern string PyModule_GetName(IntPtr module); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyModule_GetDict(IntPtr module); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern string PyModule_GetFilename(IntPtr module); #if PYTHON3 - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyModule_Create2(IntPtr module, int apiver); #endif - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyImport_Import(IntPtr name); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyImport_ImportModule(string name); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyImport_ReloadModule(IntPtr module); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyImport_AddModule(string name); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyImport_GetModuleDict(); #if PYTHON3 - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PySys_SetArgvEx( int argc, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrArrayMarshaler))] string[] argv, int updatepath ); #elif PYTHON2 - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PySys_SetArgvEx( int argc, string[] argv, @@ -1477,10 +1490,10 @@ int updatepath ); #endif - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PySys_GetObject(string name); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySys_SetObject(string name, IntPtr ob); @@ -1493,10 +1506,10 @@ internal static bool PyType_Check(IntPtr ob) return PyObject_TypeCheck(ob, PyTypeType); } - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyType_Modified(IntPtr type); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern bool PyType_IsSubtype(IntPtr t1, IntPtr t2); internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) @@ -1505,37 +1518,37 @@ internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) return (t == tp) || PyType_IsSubtype(t, tp); } - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyType_GenericNew(IntPtr type, IntPtr args, IntPtr kw); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyType_GenericAlloc(IntPtr type, int n); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyType_Ready(IntPtr type); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr _PyType_Lookup(IntPtr type, IntPtr name); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_GenericGetAttr(IntPtr obj, IntPtr name); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_GenericSetAttr(IntPtr obj, IntPtr name, IntPtr value); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr _PyObject_GetDictPtr(IntPtr obj); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_GC_New(IntPtr tp); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyObject_GC_Del(IntPtr tp); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyObject_GC_Track(IntPtr tp); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyObject_GC_UnTrack(IntPtr tp); @@ -1543,13 +1556,13 @@ internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) // Python memory API //==================================================================== - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyMem_Malloc(int size); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyMem_Realloc(IntPtr ptr, int size); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyMem_Free(IntPtr ptr); @@ -1557,40 +1570,40 @@ internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) // Python exception API //==================================================================== - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyErr_SetString(IntPtr ob, string message); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyErr_SetObject(IntPtr ob, IntPtr message); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyErr_SetFromErrno(IntPtr ob); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyErr_SetNone(IntPtr ob); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyErr_ExceptionMatches(IntPtr exception); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyErr_GivenExceptionMatches(IntPtr ob, IntPtr val); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyErr_NormalizeException(IntPtr ob, IntPtr val, IntPtr tb); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyErr_Occurred(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyErr_Fetch(ref IntPtr ob, ref IntPtr val, ref IntPtr tb); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyErr_Restore(IntPtr ob, IntPtr val, IntPtr tb); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyErr_Clear(); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyErr_Print(); @@ -1598,10 +1611,10 @@ internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) // Miscellaneous //==================================================================== - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyMethod_Self(IntPtr ob); - [DllImport(PythonDll)] + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyMethod_Function(IntPtr ob); } } From 29b74c799556bb47a8b81b5dc221541cecdbf670 Mon Sep 17 00:00:00 2001 From: Dave Hirschfeld Date: Wed, 10 May 2017 19:30:07 +1000 Subject: [PATCH 256/324] Allow passing None for nullable args (#460) --- src/runtime/converter.cs | 11 +++++++++++ src/testing/conversiontest.cs | 6 ++++++ src/tests/test_conversion.py | 6 ++++++ 3 files changed, 23 insertions(+) diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index e68767da9..0bf882cc5 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -318,6 +318,17 @@ internal static bool ToManagedValue(IntPtr value, Type obType, return true; } + if (obType.IsGenericType && obType.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + if( value == Runtime.PyNone ) + { + result = null; + return true; + } + // Set type to underlying type + obType = obType.GetGenericArguments()[0]; + } + if (obType.IsArray) { return ToArray(value, obType, out result, setError); diff --git a/src/testing/conversiontest.cs b/src/testing/conversiontest.cs index 7179c7607..36294594c 100644 --- a/src/testing/conversiontest.cs +++ b/src/testing/conversiontest.cs @@ -32,8 +32,14 @@ public ConversionTest() public byte[] ByteArrayField; public sbyte[] SByteArrayField; + + public T? Echo(T? arg) where T: struct { + return arg; + } + } + public interface ISpam { diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index ac263ef5d..9152e30d0 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -641,6 +641,8 @@ def test_enum_conversion(): def test_null_conversion(): """Test null conversion.""" + import System + ob = ConversionTest() ob.StringField = None @@ -652,6 +654,10 @@ def test_null_conversion(): ob.SpamField = None assert ob.SpamField is None + pi = 22/7 + assert ob.Echo[System.Double](pi) == pi + assert ob.Echo[System.DateTime](None) is None + # Primitive types and enums should not be set to null. with pytest.raises(TypeError): From cc483742332841e351c31ed834bc778c21102765 Mon Sep 17 00:00:00 2001 From: Dave Hirschfeld Date: Thu, 11 May 2017 17:47:47 +1000 Subject: [PATCH 257/324] Updated CHANGELOG and AUTHORS (#462) --- AUTHORS.md | 1 + CHANGELOG.md | 1 + 2 files changed, 2 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 10b17f157..d715eed6f 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -19,6 +19,7 @@ - Christopher Pow ([@christopherpow](https://github.com/christopherpow)) - Daniel Fernandez ([@fdanny](https://github.com/fdanny)) - Daniel Santana ([@dgsantana](https://github.com/dgsantana)) +- Dave Hirschfeld ([@dhirschfeld](https://github.com/dhirschfeld)) - David Lechner ([@dlech](https://github.com/dlech)) - Dmitriy Se ([@dmitriyse](https://github.com/dmitriyse)) - He-chien Tsai ([@t3476](https://github.com/t3476)) diff --git a/CHANGELOG.md b/CHANGELOG.md index b446cc4b6..6c245b17b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ### Added - Added clr.GetClrType (#432)(#433) - Added `Foo` feature +- Allowed passing None for nullable args (#460) ### Changed From d9a36669a6009d7705ff8923ac9de43a8f1a72bc Mon Sep 17 00:00:00 2001 From: David Suarez Date: Wed, 24 May 2017 16:10:21 +0200 Subject: [PATCH 258/324] Fixing Travis CI for mono 5.0 (#471) * Fixing setup.py with mono 5.0 * Go back to xbuild * Trying to figure out the error cause. Apparently xbuild cannot process the Copy section of the pdb file in the projects. I have commented them out for now, but this is not a real soltion since they are needed in debug versions. Just to se if it fixes the CI. --- setup.py | 2 +- src/embed_tests/Python.EmbeddingTest.csproj | 2 +- src/runtime/Python.Runtime.csproj | 2 +- src/testing/Python.Test.csproj | 2 +- tools/nuget/nuget.exe | Bin 4266712 -> 4596440 bytes 5 files changed, 4 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index c98f3ed57..c23f6b5bd 100644 --- a/setup.py +++ b/setup.py @@ -209,7 +209,7 @@ def build_extension(self, ext): 'pythonnet.sln', '/p:Configuration={}'.format(_config), '/p:Platform={}'.format(ARCH), - '/p:DefineConstants="{}"'.format(','.join(defines)), + '/p:DefineConstants="{}"'.format('%3B'.join(defines)), '/p:PythonBuildDir="{}"'.format(os.path.abspath(dest_dir)), '/p:PythonInteropFile="{}"'.format(os.path.basename(interop_file)), '/verbosity:{}'.format(VERBOSITY), diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index 3ec0d4b57..56ef886ee 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -115,6 +115,6 @@ - + diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index 8580b7f61..2fd66ad73 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -161,6 +161,6 @@ - + diff --git a/src/testing/Python.Test.csproj b/src/testing/Python.Test.csproj index ce8dca10d..8a8d9ed2b 100644 --- a/src/testing/Python.Test.csproj +++ b/src/testing/Python.Test.csproj @@ -108,6 +108,6 @@ - + diff --git a/tools/nuget/nuget.exe b/tools/nuget/nuget.exe index e42e6d8277d7b195a11ef130fe77d6f46e91c6d7..463f8e137da6faa6695d029ff8b0e130ad31ebff 100644 GIT binary patch literal 4596440 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

q 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

    Uys~CwEAk;MWAS)g}amC0@%+7 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 z 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

    =-i5B7U5v5~ zimOZU?j#>Mol^5&ybsBKb@g7nABnUH*46I#kj9cbp|BUP58@XyUacJ|3w;nDNmrMG z+=L@+K8}winW5yf_>CkhL9FFH@monAQ?f5!LbAh=z4_nA=abyA-HXK!@uiIE$Li{* z_ybI_Umd|+aPif2m5O+Nd8DC|gYk9L>80fN_#=%CVtOHn{0o~u;!luFQgS%Hon(!Y zBk>nWwkt7-S4sY(B$#-ct@hBi>qmJw-7@9apor#WwVfhgKTIz@~7beO`N_`~IL`uRF>gvKoA<1(}{+Vb> zvP;QjiS{I4D7hlht%;+N3tYO`bZJU zn?6#NMAnh4U)vKkno1fD#%_8ZsZE_d>gt6=Q<9&Q>`1h0DlPxVSOXDPg@GN3PSlYn zu&kXoKt!khC`)i3QKB<-Lit`y-vJTdtN2I{>eL14j3aE`P4s5mhlvi!dx_KON}d{< zL-JW-a8sF0Jc(bnt=p3r1ClY{DET6BHA$5MPv@(|4Yb?~#I`?QCvIxW8HXcfp|2CS z(XabJUc`Yb@`;%wA3HLz;K#&Vk|V0KKe33UDCxO6m{`?RT8UmrXKUxr#3rVXJXI&8 zFmO1rxvA8_R?Zdf%+9x@kB>Y_SHm1B3d=&q}9*HLLuJ&BXGPj+EscmtTqGRkc%;Uqtf0lA8HVn+1>; z`<2wnZ{AES$5J+ZFe}M#LsxSB!unn(za2?Ur-OM){>daK`bZa&4vVd;fyui0J!!eK zTCSfzgycLQIS=76<~m0T1NHOA(at1C1|}PUNF7}4NZ7Q>Ur3$4>Q}q`Ma?8t*Qid% z{8jX8ns^t9qCrD26k!>V$zl}|? z^Yfn}k+o$@M(00E%d%48k&j9GshunGKc}mUlw6hn70Ih zO;>Fl8JN5#|GX2Wg*+3)*5zyR&p%P>@;FDzLf7P9L_2pZiJ5yrF$c*XeWJ7ykK&h* zErILvuc6Mr9SNIp`Qu4GR&rzhJQCR_MO>AdiTNu|loFnwwIpmNFgt0X=kg3XL|nABz@J+?EF`lV*gY!KmQZz^qOj1EavBbPMvF2=b`+X%_VoH`bh2O zl7{#A$O+VWQOTzKHq9j#yM3e`UEROY^J`OnPm*s{=kfeANg_Ef?pyK)kyKOia{hRd z_DWvKpGY!P$?N$u;JY!;x_A`^-pOCe@QhWR_k|!9(ni@F{4jqx$pB4_kMpsIJane0 ztIzYFY%Xgl_b;`vC=2b)-$tE{BRxC6=D$L+*twdNI+Fhd$y&7&D)@=yB_-j4UrGL> zq;A0pEyVYl8lL(EZAkX0AaxhlGOVw@#6Iw_KF9NY8 zyj#IdEu@6^ailENt>Cs6l7_c0MV|{=80b+jla{CBmyk)ZevaJh2-ZmoW>e=8kbmO{ zn==dM(#~E-3Ik^sETvAMqNg($MCxf3M~peIU0wqHW*3tL-l>DRMVUi~tDa-q3!Q(Att@|C-xuoDJ>g@HAZA{fN%pz?}M;5%? zVj^4}Rh^LqZ_`z#k{8n}3O;0NRCA;-aBaapl4eS-7XmvUAmy#)agKC!I-lm>T<{xp z-p8t%)w#8xj3lk(_JV?z689jU%dk2n1r=M0R$7aX(XR0SyM2bu6_iu zHTThiMJ=V~R;yx3S?JM%WlZN)qixL%o6QBQnHPPbBQ-Z{wic`>IakS!f(>-V*&lUw z6g)zmD^%y-1*Vmhp9zjM48B&7AerYQX_8VOsnAMd`m)-2t)Q@#l#Mr(yjxI2S0AgZ zA0656BQ>cLD73M_)5-<)TSGSZPY(XxUING7XJS;2*j=|UxesK2TSYo zDSCWz1<8%-s!p<$WS%1rMVcfxla#7X)8x}6Pbz7Ze1+t7NA{&!CtoA^T6Nkc-)bej z%pZ;v20A2nF<#l@y?Av7k=CZZBgS-2en8URM?R$G?mkx^lbq>Dr)byY9+FY2b87NC zl48~Ao!n2dM0L(g{!X&ektXQ@$zW@#1=}3iml~LikbLe)^Yp-EjO3{53{Do1)U9gc z)jB;mnIbvak$tHl$xLgB>3NPAGbEX#&Im_3riUaelHB1)kMuv1MI`sCor{t+NS<*d zY%WUHBKcHxE>6}ZiB_}W>7BkT*@&c`Bl}XLl1)hZIMO#gD%p(WGS#^v*_`AKN4lo3 zNVX)oTXn8ZwjtT#$lm;`lkG@eaRj5>WWUzZcmGGp`}5ZIh^D-C0ml$w3gl~ zQr#;pTawpNr=}ybGfyOMCh6_SzSI-R+epUwbZ#fPQ+1w7&LzR~0&EjzXP!>ZC;3!$ zo=z?y$*WPWa~DZXNA{(jPA(_u;YgG8)5&{DE>xXu$p=V^9ciB4mMkS%syfdk*O6>@ zq;>k47D*}@&%Hs)Xpo(mr3S3(l`A|@)eQ|s`F~{9g?>l*_eGb`7X&%s`GmCBa$k$YzQ}I zUr&BQ($0~6skf8gkX-0U*u0(mj%4>TuN~W&JW4WNb-qZ}ZzJ_|fs%vCek2d5b|n>Kc;kRVR|Vv5oZ9rH){~i_}fjc|u)9 zQa6*ludXVlrji8fdO27zbq7gpNA{(PQVU2nD^8yUBBRh^SkA5f>ik9Yk}eZKXYIpybq473y^Hk?JIa zl$?=jProi#GAPxxt(1hDLF_nlP^wp38E39`q%1Tj)t7dpC3y!lY=)!;lYEI^mRy(` zMpC9^Sn6W>Rk4Amb4hA6{b~tf{kkM|1^pW0NLlET)U~v83&=biVKX9iGs(S5u1QU4 zD`SbXaIIE!FtdTJeYWJGO!pPqVxq?*&olDgmlEZOF(0I=x0m`=w~6Q1 z2dNs=>FiP9U>NM({ z;fOJZQ$uO_2Gu#7x|Xi)apcw9@#zh8^}4#Mntq6`{!~|0)0?Q%teN%8m|E$rBxn1` zQ*`w&N5ar~n&d7=_U4+WziBVEV4Lc+O#euoy^fTccIo{j@e{pxwM+j*S51|)Pyb3X z#77R%)h#}9m}I$|2yN8hlyGJOT@$eRv4ohv&? z3m{JhNtwrreR@m>Te~d@gIwJ~>YzNAWb4JX=?NXAzHf&eA%%gl>6>X;o>Y39e%;`R zJgMZ7iPVuNj65=#M4mA6$TSjp!pM?w>6s+*gpnoxO3xvY=ZP%2F+HzCpr+m3)P`_E zdJ)4cyPH~aYkDPPDt9&tG3M6vDiXO)?U4rGEk zN%|=gxw>ubl%%(j9PsJ9MUvN|T<0D7CD*&HUnS|CB$b^`*vv?OLefOZtn^-zUP|Vq zzb28Z@&NpksIwewE;GLp-cyqmuABq^D4CEdDu zFFp1oDZO$fT}ak^n*JAcuhUaV7AW~9eFuqLTeq&hOV2t<%HbNP zW6Y1~1=M-okOSbOkNNC`!z8CD$z|dvi=Dwfk{}tSq(UY`B7LO|PlZhO`M{ovN7= zXs1-|RLwLcc}hvGOe+$3GRTIfcBUP}yi;|WWV)U#srtQ=)|qZ}^`|4>N4sbG(N*PE zUc64p3_7_OuIei3mAQanmgk9V2zzBNWxQHDox(t`%w^Q+;|O+d1QFjaa%5AkPi6#t zFHy^VGowiEa-?>PL7AILHmlB{Ofl`e>By_O^E0za4yw-3%zV0%yJu}`{3CNG!&AGp zjh8W(X6_^D;3M~+EMuGQj)bAJo_5Z3WNgJ-GT+dzi#@Q%Jh_NKcZ1KGKV1w2z!hGRa4JlPvd<(@CE2kvc0X=Vmp)y8?r zm}V z)~c&7Geb#U^pOiXNr`&jk;1^2nG0!WpCi~eLkM(!SDkM&mr^Iz&I|K?5D8%wM~wL; zb7dz<`MRp}OXfDZYNh1Y%w2TVOI;nzJWid9ROeu33+>#b4D>dbUxcEwP37sq%5yb_70M@s?#q!hva!B z{j=BY@edH*8-|bv=taMd2&_&9|Ppb2; zY$KAuNuHg_+1_24r%GmI&*>s5-`o*nW@az!BI$gRBZFcyvlr8q+<$0uaDMh`x{|xI zgcvhFdoBHvyR$r<>u5*r#q!9FbafgmTUQIR#nc((2=;c)PNmMZs-*i=E`P@g|B#~#gt(}e8uSn!cZA%``eur3~963^my~}^1&I3<)I*&VYz*#QK zdop{N=_7ZzSvy;^N0~nI{JRjWjbuYzCEw*~cTXpeBzCfObxG{0Y`m-ZF82hAPGMks zHbb3xxZlsZdchI7H`S7NvS)Oa(jw2cTXH13j;`c>T1x`Cr%2@aZc7Ssdq`?K-^1p( z+|jO5#@aZ7J;idvx=EN%SDmi8OGqwJ(mi)2$yi5bR~(dksGF2bS@*MkU7UNDI`V{( zCBt*OyNO?O)UQ#wFS|+kxkoLJ%6(1pxRPsfKhe$$j*P8%eJF0wN+}H|~FG~r@ZrKyj|k#EiB!%C}Q zda&74X)jEO&8|u%>&o`bWwXDM7e;;#R_z=PS4ylaOJ2h>szs$7@I$ezk?QYa%Le?{%`cPf-A8F?GIZgMY5 zM&5yupEgu6sgW7=BaVi);t8 zo6Q4}U0|-VsTtWFCZe`g`-73aVXClsDDr8T0yYmvJ_9p^P2I>*FfX#HA2|+YF`I^w zlVH}fX&gBXW+$7bk+WgWvS}VUALdUsEh87fRCvg0bAIG9m=rbzkt<!^kLH>awE(*Hk~53!MwtzOXSxuYuP*+xf^CXn{JT@VNS5=9(f$*cQ!pE&%l(e zWA&m}qoQceW_)Cg z`V**y`D`XeJ_OT&&2-arWAlb-db3$(nt^QAkqM)cN3hvs#!O@LWn?4NHJ8nH(=253 zm1&l-IbxdCY>t~|9h>jT$l5ouIb+6r$L5#Fe8e1NbBT-`jf-q9M;5?bXH#UF+iaqu z3T&h5mWIj+d&D|A-l#%bOl(wp#Kdq+d{igYT5HpWs9*i1hi+MO| zgw52A8jUu;$F(<)nuKyb=5q2)v!7$yM@>e|1&-+$H5JBDSB-N~*yB;tVO*x6U!jSb zX{&u;)GWmKIoIH*xiF1P)3)@msF&-9(N(4+moqGC0opv6&8VoQFr(OvHjO@;o;A$` zju}fv&W$N-LT1bxY{o?`N6GK7nP{5#*i1If$84sXW(%7)$jG|BX7jcgbBfLKs1>N| zJe&2Vxx!|nX>PLFM@E)>hs`l*?wVuAqgJ8h=z7*!a6al|H7Zxf-+i zGioDDKAYQQWbGZ;IHFa|(`>?{zeLP1Hl@i-pj?yK+!wtIF*DeBOtXxQH+m0ZK4lXd zy$|K=WfK>D0OlB*Br>vv=S))+mL(0%sDC&n7=6e#VpXHhAXj94Yd+VGz6296O}JIvqt(-TaQxS8JW0pl{!CYkXcC^2N zJf@C@)(l@B9Yl<-{hjD4F!!1@R_4bjzMx^m3s=o+>bZi%kd zK+fmE9P@Q_edHR&W{+uJVzW28A!76jxi7j2%-bAuFuJ*|u0zo+5u^L{eRN@iNZPA! zG;2u847&=7i%+^kXnt zrunYKh3IEsYMW+$iObPr86qu&GxDq`9CHF85eU>|&7ud9M9!Jcprg^+p7w3%;&K)^V;aii^$VMKoQW`hnx;>!70w)6IV+r1ZRSH~Z5TZdKX*2S(MNf+ zvoTEBCf3MraW+L=@ocs_o7>9y!r9uE>q}>whUKYW8D_4cu~KB`Q^4js z=i@NF*z9ulKslqhoZZeR5Tkps*VzX~_hO&3FWNkb%h~Vj-%!r*w@pLeu5u1UE#5owXZ{XUGIiEo}JGh+houh2+IYXxGU41|6e3oM9Z?%k4XJvVD&iNd29W={X zSMr?m1zS1ioG-%Ye*Ng23iFehD_s2SoURO?JHI$*!rbDROU_v^<(gW@^onyXjE~K4 z&X-}Tvbo`$57UUvpUwp^o!R{5TnICOO_6gE%yVoUt~VM!Powb)o06_K5u;bF3a;fa zZ*k0ht`#u4rxjhRU_R!U2-g~zU2H13-fKv|I4#bxiE@327+sgk^(l;A$6{O?Vf1l# zyFQ1x!{vBfTVSG^Sz{RM`T{0{O}uLdOl>v^uCHMV*!W!E!t`cixW0qY$1Bmb8%7_m zB-efz-S-sN!G`kMG}bJqC@jr&1ZKhim<|794&G(t`tzGoknM?+&=m*-T~EPc~DWuxTPoNJIP0HeoexT_l4qsM22>j4-&KBHWv{;~?BtTix*lm%g63iP zc>0h2l@}pbJ;dlI10h!=y2xemL=+uD58 z^*nOv{rpMS6kE(`*9@CE>zajJdar)lwF>46*Y&q+jV;$du6GfmcgrH?1DKL6t)o*S zW}Pip$(Z$sahowkVWnd}g?WfgWXwieE^o}|h{@-eq?oT@9%qvm^9{@x(}atT^*Mz4OGW6Hv8;*z(< zl!w{RxwgerfH})CyJITC+~k-&F_mB{nD^L}awj&vd*!d-PDacQGlt#|x&tuB*u=Z5*>WYhAF!De zcP-?)%5|l?>%f$5ZS_6Z{Rm7lo7(PrFxA*JayPJ*+|1nwG0n{w`u@ASsV%0!-3BrG zylCrgXNxIxcd(fb?k>pHk4x_4ehfxGL+k8*+?K1WyNAs@=I(`D`YFT+_c$1R|31<^ z0cHZ%HQGH9Wb zneN3fxol>+--OXut5@BtU|Mm^>+ZEML)g6I{s`tpHY?m8H*Or`(eIiv%~#8jJ`VTbN>W$mSgt2FQDWSZLIM* z;l5_8>$Lj@a_RN?k~^%4TwBU~Vjkx9RPbcjVxm1ci0Q^LE>BgM0c_$twP5rcjU-Qf7+rg^ zr=cxZil?!yt}IV$Ta4e+7G^BhmFwwZE4jL-r!Ch5o?bB1IaeLe0GMTL>UxI5e8{GW zXB>>KtCi-Mve$Mr-=SLWQygu^$igNVv+TghgqmS1op6f9B zczx#iqlsLRu5rnmJhyD^+3fiTb?F_^UQflQvR|bNt>d-N6A7cA)9&{~!^CpT0gnr& z3Y&u-H%ucohdo{xy+=CYiEn!MN^;C&*kX=*l5H{Hdr}dj_s^$1nYNhIo@~VEYtvaz z&=&K9CkHY5j^m=|0hq4b=1ZQMFeBOg=BWoWkIhX_Gh4~GJS`BT*OuF!d>B3J{`M5u zaus>nB1S(U7v2sqdL}r$osdhk-TKzHTeIs&_GB9yW6oh2?qQgz3z6)%7le(O1R>-gj)}H1@7Uj2`Ev z-ZhBPqE{q=M7TynF^fY^$qK8alu98r8wO5oR>Exs&&E znAvPPd$+)>VAIw6CCnB!k9)tu7`{E!dh5~M`we3BYSYuZn~V@g%v|)B&b)gOqucY8 zY4phV_3lT^1v6JsSU>MU7=3p$)_WL6?;OT^kHXyHTob*=VVv#NOehMQ={*6X*PjL6 zQ??OX+9Dy-jXnrxy?JhrC{{Rw#!=@ z=5>zQ?Y$R9kMmJ)WV5?h(c|7|n>pc)L9Q>joKs$Jv+>lPU)lWZO@eWBu+Gzqrio^A z*)*AKD#RwC1mRV)Xj_SnPwgHg}7C2r*A^u70u2VDvrO zu-HPFNgOjGwmr;3HX~y@!srnj72DZX*R!#YBjy9n^?K}cFnVS#kDUsm*XMU)r^9^1 zxmLu^ggMP-W$Y{%y?e!bNqjy&C$1a5VgUk6K_H`J&*IF0580D1jXdSQh zu}hlCr_D~&6oqYwU4~r6=DajU@#n@L$G#0yY|h87fGIZTV^=qm*Na@P>+{%m5u=|3 zejfXQ&3qC2vCV9c{S58VyNj=4Kexqv8@t8U=3TL0B1WI5yJL62=r-?-{RT$2d4KG8 zC`Yej2V?ix>N*s=4>3)7#J-O`3iAY;pJR{1jAL^n_5{ppY#ec?U_N3~A?^&!0n>zw zn7DH=zi^B@?njt%ovb669(Nulkxk{epKWcf688&Ys+%!IVIAWlo6EJOBbxzn(J+I# zoM+-(Fq7E~jdQ~+;#|YxyfFJYW?Ebv%mt2_9+vcqE)naieed`FnixSXfrJHzbbn7;8{VZt7@=IX@w$6(y1q5H4+?l4W*ERF98(~-^E z_+Bv2u=ymuH_R;4(60u?KLxX#W4?^<2eXgO?)ax+&a*ibKM9}3f)W3I#xhw08SSK~**=qCfW<440h$GQHA9|JR=bKQv_3$uw$`Gj${ za$E@$Y~{EUo^O8l)jTd?B4W;QIY|lAVE$rLC1D0kWH)PWR7-dXCWB4QgxR)|>nF@b zj9wvICMSnC}OeNnB1z-;Xd$*i`VH$7t-}Tv5IYFyFIr z`K}_D-sO6Hf7wRN>-!rq`aU<#cL(NIE+^hsqQ%|!I|;s$F#2rr`R;+yXOrP8)8g*4 zAkkMAF}kiyUlfde<#`ntmCC+)L*kHJ(iW5UH8-{UZi z*v$2Hhv~{@p0B4Whf99h*9%6^y0?A3Vf3Bva^F+7F?`3@4>5DNl=n#dI$TiZv>3q!M^Vs4WoCkANt0koOihP^}g}8+CTM8L5!ZypZjLo zVmA9`+1m4k?`6d3_I&A^52M?&!}l7DZqL`gMYfW^^)0cPJ-+2Ov){MMW)At@wVC6- z^|ltC@O_LJ-NKW;PhoTmPy05(=oX&!ZLyX7gYOHJ{5g-|Pre?HOWpw#5uLdLU*w$4oE=*kUFb!x5veAg>wIZ85JK zGi_$EF&nw`)oQ8niY;cD@hW0I=Gs3rR>16G^O3O%<~*AX#u^xXbT%0u!RVR!x$!ZK zUdJ{YpW15QVr)c=o|#`6U&82p-8aTpFuE7t8sFH;*=g)VjJ}@kHuk{$!EN4S?1Rxe zkfX*47(MHb8K-R}A2-h0%n9R10Zbg5Ziy{m za@llGY-OvxcVdTDayQtRW1dRvj9mJ-Kb6?kmaA{#V~Ejb!N|m?VY+ZR&n6Cp(P!n@ z#33;HYBeEoD2(2(KA$)oM$e5&i6d>bzmPZ@F@w0S7Zb$EKFV_vr^D!d%iP47w%X?<&O(e{MHeQ%3Zr|mC~=`J*W$!Qh);#-K>$}#UHz5{cT&4$F4Ft^xjPFxM+>}~B}w1*&`~*g?8z&Msq8vRMrxG{Y`gJC8D`NCM{9@vFF#6M& zmlJo}a$QN>ix~Z`_RqxQi0N$hB3#@`JYmaqJMlDf>G@ogc+M8{PvVb=(JPxs`WZ&g zUPsa|Fg>}hu%t^cdj6D8x?wB1Lefo}shISaEmurZSiW3o^{jIzg~N>Dx?+<`=ij~8 zN=k~bnam_Na_P_i_>!Qzt3cX4)h*vYEo9 zrZ&?dsinWvsZ>jot~1*2!(kfi=Fde#k18fYtdc+!x3`RVH_^mo?e zzi=@sX*kSW9@SAvBT&1ZtD}-e+R7Q7G#W8_CX7iMYl|71G!8M#%#w@3CMHdW*}!H> z(iE6|Y-S`)%a?2KC2r5Wq#1}Q-N!m}-%k1f#=~Y!(mI$lHtUi;f~m^pv!st<^ql`P z=~I}d9J3>7ldTtfk~Sk|D94;i+5@AH&JRiZkV_w(ACnHi=%aH!=`f5wIv0|T+3LEO zbi!sXC!I!JQ_R}Kg){ly)_2c&cXFlH@=UR=XmnSS91Wva{-k6VjJ}siPL8palbY;7 z%mVIddU70$zFy=eC)jdTO*Rm-j&tQDC);A`B&XWSc_cXlW;^Gqo16usk50>EKa76X z)G9dubB1%ZPOjWq&X#MY38!BYucFF%%Gv{TPre_<%cgg7b(mb!6ovIot^re@V}>Nx zg6YCBLz8R6jNq6t$#q~};+XNtkJ$P?HMt&Q)^g1B72@~7bIxkiy=fh;P*^pcS)0EAYXtTFVajD$&KlbA9ZrV5*^lrb<3 z+2p2#VD$LZOc`&hy;jO|wvub7OoHjcR1?G6lzLycrWNI;2d4nZc%W%AD5n zj^j->T~p?xoXuQv*Ob>_F0$#7@;Zzj)jlbUVZ!@cqtP#A2}~NB!6{2^{Th|>7Gmmh z%$SrFFrC=En6e6{ADh`JYhXsQc{Sx-7(McDro7*}B%R%p%ozIgNXmzZ(Yt~*DIdcu z<8s!fd}?dqrj(6{S;sM(Q#QlwWb<{(Rv2CTo|G?O^o%;1vfWnliIlGpbB@b7lk%Od zoJ%RYVQz5Djg-B%7?HXkMt?h|OzJ^fUH7IQMvT56ESGu=Cj4pZc$H869!B5&xl&Ks z%5kTjMvRMd8L1awsQcW~FJuMVHhY zFk3k0(bStTM>(cn>MfWn95W#GZvuGCuX5g1fJklTynd z#>M4KPAvzckNZoh6=3vL@8#5rFnT7ul3EEy-;vEvje^NAOQzo-O?ARN#AZRN%hsNS zscxHDoEnE*ZMlU@QhhMGh3}*$+RWP2WEkDTb*ZVgl0Qw&Kuk|Ad2?zIM(^UjO3i_p z%`v-EtHS8okEG_=%*oX1HuFPj4O{KMq}D>rb}spHY8@Co&bLw@v6XWtwSIy8{;B?J zXyIuMVf0@^yEm;da_Os8#k6L&lAUQSZ6$ls@@=_%X$3HPkCc(t4(24cIWw&Tj2^M7 zX`Nv7%3nRLi>>c9(jG(1RkNIM@nBjH7(J@>)B4$RHBEaOG4~C$=6v(CK`{E>s$JR; z7`-00Pa6uOpC@!o8xEsCz1AshBuuthGW~Vzw9zoSJzdhqz&y;gcTWr1TG%gbJYw_} zMFsNO)Ro8ZVA>mq(Z}L&+FLOC+H@psIgCC!Kc%gJ8N%ay zF>N)>95#QZt%cD?rzq{c0=e&%f8kEu$K8|uf$iwroBj!MeZu9GPu~QiTNs_b8Rh`T zc+$7RTxXM#{sm0MLDoDBrf-MQN4ZA&S1MOat39>Tzkvyuxx&T6>EFTB<8tby?}E|q zVOyo|f$7FEZPNF_=)QMOKVa*7kMu*fzV}K$fn1ZgoIdGiVD$6MLFwmUmT=6_^dDii zvKgCx9_BQg$>|qh^mE8L=@()C;h4GUmtow4t@zIbl=yd-?a7glk{7N8O^yqOaB{Y9-D3H|G=zg^KH6lBd?VQ*c?nR0i%z_>GYB? zzj4f&^inY8hgdV=m-Nyw0XDy--wUJLd@H>ijJ`IBj0!LwK(s0yQZo&z)TVDxoxct&-Y^W2M(88vJz9F2Fx(c?ThqpmI2l#B+5sql<-1gB>-fk|MqAfp*fHk)M`Enw=iS(VWWrYoCu z8Le$~ZOLeZ82udS%Zv^%!_8dbVn;@27`-BWm(deuGMBtJqgNZb*3IW!$1-{&MqhKk z&*%%YlyjZR=ntc>l@~GwzxkZndS%{+w|{Veyb%(E~jIoI2nKfwHM z8d^m&e}XAB+&Y45GJl5gvUxxA7a08=u??A*V5)J<$CV_AtX`ibk~ zSt%$-?^kme^j`p7~SU4*^d>Dr;*p+_Ift^aTxt=uaIfR`!Ou+x1%~bP$Vlxl=x5DUO z^ljwd3G)ZHu#tbaEmt%DVVJ1V)=_TdKLwM_rj7r+Emxuc0*wAuz>fZFFnT6*@?VG1 zzpK{Se*;Fhr;Gn4Om(iSoBs}sF1e@wo_2C3=rMf4U&dy7`OCr-ayh;IEpi- z<~cTl{4p?#*$nslVAipjI=|`8UE;*!=HWmE82vk(Z38YCJ%8E--0kI?h=H7|eZUJdkxl17Qu}afkA5@THIR;S^bve4 z;D^z3tXm)mqtCeRfgG6GTyoDqE{tx^fWU+8<$Ac7V+IBuf>~*r;ZcJF^=!F@1RB8T zvtVeT5zLod&hS7J7(FvXfdZIg95X)97Uowr69VmEN`$QA^<1C>jBfL^z~eBwr!xXQ z+RGK&$+=z%Jb@U!9?mmO9>=^AcoH#s)mjkf3!_(nMS=b>bvW0XfdMdW*eneUYA=6R zR{vJa+kugY(O0W?0?)$eb9rT8ER3GdYXaji@&mc#wSnhgo@euJ;05H;ZGJB>6{c4c zYsB6UOo!1U|6yPT%zQ3qUEn1ceWt7r%!bi(?32J;m>#@pZ3?^$qig>>@CuBc30ng5 zVRTQo2402HziRtMU;&IiI@<#aY0e9=+H9fQ@l{|EVsu^KnnstrGw_D3obLi}!szzw z3M^BGd$Bw4HjKW4>ej7jzE<*1~+kqk1s#9?UK_hXNnq z2;MW!Iy%P!pCU&0>-)eq7<~j!2DZcKBX~OS6^x6^ITQE>MqfS826n>e<8>~u3r1h@ ze+cY>(PQ{yU>}Sgjq`y6FnVVG95@7%#kF4u9D&j2;Kjgk7+u$;zzLX#IoIXDNti-5 zw*%*4bieKdF2VHS7!mvxM&DmJf>&Vl)v9Fh8q65Z6&}0}qpu*Pf;V9FzNJj?Cd@3( zRW^7FW;vTm!4e(h)j`iFPw-wCeWt_)%fsk48^Op9a$S{wl~4Y2lu8OlBSx=d$w3#4 z9>bKN+ZK}=^up-RW2Xhvv%;I4tM`f#Y4e|Vf61LOCv|@BKHD@MqWSV zs}rn?lC^mxSRY0|i>nuG2&13s*AF%(Q~bC08w8so=5Ma6xoIknSI4U;tW_`{F#$Gh zg9R{k*>niDh3UnnORycxL^j=m9bne5=^5+<^A(%k!7eaAv*{mv6sE)kt388)-C&a0 z3=MXNsmEq)uqRAsHWPxqVEVI}8SD-7BAa=^r#jsI+~(C_Kg8%~Xv>46VHR_)cY)7V|}L3XJDDYc#$IPJ?-n&FQ6zGbUX87@TjLndgHGR1Duu{2W{eqxX;( zf{S4EKJ#Mm4VV*L@~^=+RScV}!DTS|to$wbHjMr)_uqr>bTCAB8j40|N(e*97sky% zFR+_$I)_+E)QVCaVgu85rXx&enEoLuK#tgZt-SS_x)QZR>M*96ocamV&rG@nx)fcq zRhuCyl@+2R`VmVc+iZx+M317jxG_9b4*uKG$9&AuB7P1)SpO>MoBS>X%>-eUyfKx6e4nn&8BmRlSD7T(a&y+DIgEg z93n#`6D=Xi5mkv~oFSSJy$$L{vun0k@Ie2_n^kTkPWQvyN6B zqQ8)%Ba!TzLyRQ4LzEv{NF?(bVl`38vodu9k*ZDiZ4bL&I7f+!LX<;}vP4lthPa=| z4cC@PmC~PSI@8BQs@`Kv*70zNpE&L|Q*?wilGTU|)X|D49b}C?jT$*M8ZR)tL8RKU zh3N!Skr`(Q-6LNmE5`#&I&Y!ra>Xzr)sGj5d+Q*(5_OB~rcIOr*}_ zuZgOlzk7*fKXSxrqPxc>KlCd(*}nYH-%RDAEf>R-%9O{{fay`DVN4TEDt`7XWcM*q zHMH*-ks4<`YI>aiqEywlIHwhNKT$2@)n|ouE;vL>N>wA?k7){#TA!B^soJ(P>G^kt z3((32)Pgg*MZ zNBt>P_2UJmB}A&Woo3!#@q?L~D{e5AicxuUMHEv4Qx&FqL`kh_9IRS*y?0la$&Xwf);jTH}{1O1M?)BSkqTCsS3XCQMyS zGQM-mVy;Psc$-Mh7ej0$lGgy;mg4he52ecMOkwCS zlbl1+8R7&vd7kHo&JwBGE-+nVy2TXcRdG3@EK?FwJ(Kc8SEl|Z6>rrfa^tAp!q8Nv zc_ul;LL#-=>iO~>IW?bm5KW}K1)(2^em7Hdgd>*r2b3BiB8b$O#u3fp1iB1ojhpbpVWN~N6}ky@J`C0a+$A^Ni$!8DQS6(V`9{kIWv zh*gxT_5z!T)Y`d|NY#6eNUb1um?Gna_yqO(h&~6U5q$y5A^I9ri)a@ppGcK5fN3Jp zexyz#Is%$YbON-3=`$kLmT!sF?&~0@{z`NfIZ7m0d1Hu_%U~BEQgzfKQsq6u)Pm?d zO6f#&3G@_^YRgC>Ro+CVIYieG_cqf8qCdz*h_8umBlQ%KI46(MWukD<4WfHNWqsDT zIEhrNd_?N_R$*#DbRTlGf2`~6`zS;lZ&O23q!k^ zjxn8K`i1E>Q#r%R>tymVr7-20mq6u6RG> znj`05Vd!y6Rn(v9Ir`eIboLxs==o5JQ#98kx(g(dvm{r1L?qjnE50$wA&xQqY{ogn zUrZ$vg{X`+Tm5i|Xma<%r4rQu)o1ETq|TWkOwSQLgt*y6>Ig39)Q^ekA@wVw#-N{x z)JTRWS>*+p+7lHbu8-;R#5f|EBTr0Xn$5I?X&uv6lN@3{kvuCR#P3A%42TeSm?D#v zQzPDq>MabVlIsfcGvzVWVQR$GoGITVTC<7dS!ReQh`OUk{fV9gjV0;}TE^}(qJeNb zh~#xYOza{WN-j(sB^m)bPc#N`*N7&7N~EZ(i$jzpdI8QLng+^}4&~J$noBNB6cD|N z)Luk#bPX|rXc1h9NFC|dOv(>^L8NvH2Z>}qa>Oa73ryEdGO)h9LvgC)H7L2rOm&Dd zsX}akizfOEltHuwRD)?80K-QQV;t-{( z+P*h)IK)jNRfjW89eszWLi7VlmiLH?IHrkAQ<>&5Enr&0w3=xh)8|ZIFnw!Mj@UbdXXNoiwR<++}id6)g;1XS&H0maS5Y=ZGLT zmRedElJ^jb-0TufDxO2G5%OFp49T-rQB{hQR6I_$S)N;kp@%6|QkZB$^c=;7iFQm+ z5>17hKs1lYfxBLLv>f8!p2W*gC zqzF+&w3u38hhgnSNTMcT;;Pt za+S{m$-PA#kX+@PfaETt4M<)Cx`M1V(INB>C7*Mxs#>lhlib^?xCGOw`-MFi7kMXg5PeIb)Kefo(GQ@iL>E9W(t7YKQI2?o+;yS| z(VD0TG=ga{(+;A0ev)y&5=9X?gtY>zyat@yZRUWY@23?GlweYXNFk~TCy%tc%c@3B zQjVxkREJV?L~Ew5O#PWgGCjvMi)jJVGNunq3KN@%8c-c!;#;DophHBh(5eeW>dEnS zA~|0Saf_%eQXP3}_0cX*+(YhBN;O1zq9;M}-O~W%_?pJ~8PHLpkwj{jHWtoJIi`U8 zL~1nZ5zU0_!fpuDWG4OIU=ca_)K8WC3gtD#dUEO-u$4%i3wwwbBlQB&3Xs*K9Pt~u zwW#+t(MOQ&U7;v^N1lf68J@oPt^in^I(h$o5E`KI44={tuZl&bb-)0vht zZD!K%dXJO)fofAvQ&h><$f-4=;sX{1iGD>~Gp3$QV~A9}i~w%Xbsa|BDE^ZE1k??h#TahsANOjAyO@Wj$q^;%sQaD>;Urpu)GQ*kb9=;e zhUh?~=D`z0YbeekUSjtJ(>0USKK28Oix6@TtSJ6rdg=@(_rS{4C-)6pU!ns2>5T7s|BT`qjn?!ktt5naT z`-y78wIx!cHioD!+*GDTL@MtlB30fgBKb_qA?~fOo@CJ{E{RkN@|k)PH9~o#iBxTi zICUG5s`nC8cmvC2GBqKRrP$93Ig)Azsz{!1ik_w%isa5x(Fk_WF->KfZ_@wOkJl+q z^S~t!Ush;24(4rub8cE$Fs~?7FMyai+^@iv|)B__V*RT;Ft7Jp;r_?cUBZ<^V zE+$e(;Y*?kNIl7Po#RS2vU0eIG17FzDXKmb2cSgo$K!wTRRRH6c>t(wE&7BDK?6LZo&wTZvvq3-sJQLr%@a z5>2eyyiE5qwPey~z+iIn$*e=nBa%;M>6tW2R3?G4Rk=q86>+WulTz3`8byvm7Hykp~A$-lOu@4Z*)z%OX5FJITRhuCilRHDs z5S@sA0$DSWcK^KN=|`z*cWAxADhyd~unI%Za_U^Bl_uqfJ~Jso93ztRIYL}BDM#EP zx=8ir2zPTK{w9hLc|>v~BSbqQ`G(C9V~Fm#Ap7>eR|rE)qg3^@=T)NnD9#XX5k-Mk z5UK0$|E3mSY2^Kke9l@J`iOEU+HO+uIJr}hPkPlIl_GgZrAXdUDUx?+lJY})sT6q> z@an7&~;!gPx1SEk>YO0=}Pl=H799pA#x@03H)-%R1Hl*~=C8U^>Zkf$0yXlKHCjIid{H zeM~MUA5#`n(4_p({Y>?l+A?)#dYWh;wK-ReGAT#QBU1fXW|AS~GsYnlXNV8UsWW~D z(Flx&btbDPn$IEbIHk@7oh6c2mmG0}=yh@t;%}m*L{99p-$h(@^a)X}$RRhF z@;bzWL~7P`AW}Q-fkf&$IGIT8OO_CQPI=W`%-0}!Zy?DK*7H+C$Y*Yi&?9k4o#Fa?4B|_XJl0AwLB@5`Yji{q6k!&B00g?O`PK2mVbONdQOaqx_ zGOZ+%J&F)}nXWUr+Ne_ULk|(j_T`6qGEHUrfawU+6{hlSt-MK0b(q>QJ;OAWX$8}l zOy`+Ip;fYvsTtFgOjDRvo0KCC5&c9Xlp{*CQ>2dDRg9Y4QAo-Un=-XJi);q5Slvl1G zIbs=+x(>R`R71RHrW(RJ_X|TC$*GwmuV9J}kdyDX3Pb0ZE}2AESRysE{~(H?wiu#_ zD3Pf6`X`@vW|J!nm1=L1yth|Q-fJk5PrDV#r`?Lmn>ivKkwiIEN~B05%9G@%NmLuu zlBh1IJJT?tM&$BCQ;6gmL7yHo=eQjGIe2^#H34+-*QncUBjum zyu<8tTmB@c+UMF=Ou4S@CYNI6`0rzx zBN95(_a^8V<%kD}`hprUwPEVX^bFGsrlmv!k@tO~5jf^sh{k|+6HOp8#3`a_AbHO@ z3nZWQEhNelwSaoLT$fp=|k zG;+i)${{IFd{0!~7Wbo>O4r6m)q6=pc!^{V`eq_gCFH0_r25vH$VJW}Iups2;lJmV zL-eIMb!7B+rk-Q>2Gi$EM~LJ%OB~`KrnJYbQtC6wb1)Wd=|wIDB+tRBpy$ce1}z~{ zt>4ahb$R-`Zq~O*a)k9AyBuMC$1X=$-?7UP7pN3D59qqpO%Z+Olc)h|t54Jvq`xue zjI>(tZ{L%XGqDwNSl?g$x3k+2)^}SB{%#9hHOi~!_9y)%S|Np&attQx5TO z-^A44@wColhqy#J)Y1Cy?|ABOELmfpA1d>>nkDpkR;C(EO-yo#PDJV$^(1-%WAF^o zQ$#eM%{V$QiPVu^MI`4W?ev-UGW|?6fbtr``cA7u{7p{vBeA;>!;xxzGu9B+_hAjO zB|^ph`?0h}oSu?UDdSK|2O?RrA)X;p=jv-r+nBBrO+=2!9zwhbszNjeRG;W|koDa( zL$oBPN`8XqO{6|cv>YVw{oV)7C8xfB{w|SfL7I7P8Dc-Vj}Ui>=rf|?dzy%zs+7V| z4pV)T=q&(|dMad{jfUt$Zad1eW{Dx5B`3e{mnY^C$rj{^#U{~rtB7PN4zZm`ealL| zi#bfCIK){qj#g1>-x-wrH@Sww;t8afVq0};P+leZGE)aP@`tuRdy@W`E3limknh@oI?rxv# zheLFyRCO%-5~-5M5~-5)m@Xh!6Qz7gq~^vsqB?M4Pb$h0$wW=y0z@rA4-s_+wIJ$6 zlqWh7sj;_4$RYFy=`paz${~hQ4t1t1B^pGf&~YPDR}E|Y=(FcEE^17Fpw!WbE8E+0 z*+diJ^ys!^XN|K%3?w%lar1~~gFYluwH+o>qxO$Ux-Euq^`YnOl*15tL~nq)5v>4O zO zL%c$+#ASIbKOibgr0;tSv5#CdoSwTskdtSWL;ObMLEduxthr&Blp`t=B~WU9s0NW7 zjr>qkB6$S!Lyr^5J1@HW5hbGzxogP)$SPU8mX0tR12yTJ&aaasfMUSt^r(YBKdn1 zhUiNq_cVqWN+kPh2rGv}=wB(&SK^swoI|W9Qtxce6UllVqV&_&{zaZC@=E6riR9FZ z`M>9{L)4&D`O6*-A!nG1>&iLC5~*+0zeUuFT2J3KC+Y~Y&P#g3LA9y3E%JO*t-4Ne zJrGx7fDlik=W=Hx_aHfZqVQR|Mg=v^cbUkN!&7?fBl1N_9^Tem7 z%Mn|No})VcZTI#6@B91v%sO(#Wv;FKKzj2-wdIGRh}7IQnEXr+GBsoB&NP~78q=FZ zYK^cyqeP#tBPV~0!4L<{ID@|}5h1RSlcVw9d-)vkr^L&#%;P1PrG*IevK}WKw=;GLf1kGfgU9@2ljl zQd{UbCetCNOH6l|$_%k`#F~^R3?f-ao~Xvu(j@f>PMJ!33vxGXJ%848g`x2#6@OAb zg`8Tc|Lcj;za8n~y_`j*{Doe=!nDk!Jh7HYwSFVhUZ&$rKQfhi#>(Mj@-bCsYRS}< zX(W^Ni#B;;3cH0&>zTe~I>2S=Na1*K3(O}Y7Sbaa8NvUc@Z@|=( zDMWOKM$I9t^?-i)fm1&tlJ(N{gGgOxZV<_lG{k+wEb_U3aB?}K7p1Cq4%T^2zmZ2y z?zHIH4UswrHxrFVDMyH=fo>Dc1I0W`pSlNCGsz*^5~=5`Rnk=73^9`2JBXV@B%jvO zlYFB0;jC};72gBP`KR7oyiakTQ=Ix7kL;W3k*Y&J-~AfyTZ-ESI!m-4berf1D1407 z0$HzW!F}Y^eUFDop3{b~&Td0wkvmH+Pt+xnvpr9ABa&xDo_N+I`c)*N^T_))(N)l9 zA~}9JVh_=6xU)p!imbyi)*9VxqSEAwUwh;mZCP(&s3D~)>SB`m-(8Llqy|* z=oyoW$LVJo&r_;8YxPRFjGSBv4e>rv1lnhn>=0j=<$8 zz>R93|I?da2f8*;4vl5;F&Vufr^lJ{>cjK8b+5sYJ4U`JuW* z^4>2$)P|{-NrsSbIEEufh@5KQt0o!ZBch2&{gy}_-*ZG$;2aZFDm|+Y(l?RdeB|bW zY7nW`TXT(e0OVdpY9FFSM24{L^JuPhv-Z0$Q0j7|zDM*v=m?W|j-Knmr4j8TqE(Mb zw$Bi~iR4%rVl^>XPLiM5acFe<&`NQX@pA=PgPnN`b3M zlm*IX*OTLh5miU(bRxM^h!F2H?PvOpNR?7%qD8U=wUJkn?3+U*P-z+zgWAC*NMvJY|yOr(A0) z?>m))X&8}w{!Du*lV}G@q~79fCQ`F*7t{AdY8L;@qN>6t#mQr2h}LG_{7?^*96}#U`E9_TsJuMUpHd~|i06o| z!p$aSmH|sUdojtBckTG^zOS zZOXTO%_voU0x_S+KKAk$6^7(*Dk_q{si;V{MUnjNMMWX1L(w!QIrh@!iI+{6CsvzO zye%J*D@0ok63L?#A#M{P8;G1(X&W( zO{04aP+cPV)ZQTm6HS7vcn>|t1bIy=zDs+Z;^t9mVdyQB=zBIq^8FxvLWtchB2}_{ zL$rW$9u6O2Ma%yKDAd*iP3{js*{g$`YdPB4&w*hVGN7M{7l}NVg z-`Cisl&anuZI^lRX5~ksjmWFt=#-u*#8$WrqMe`?M0<(o_ao@I$z$#i1IWo^?%>Y` zIK*snhv2Ln^ah&TadL+Ekw}eN>6a|ZAUciI=0ratZyz(&A*P#D{Fuv?Q0AcDE;92L zhSoD}VcKa@@w+1HuGb;{cV4ME{tMc2l=5CdTdcRu^wx-+Y(4$*(kzSoMCy|W&6#== z$r)ydNko5w-XO8MCdswgRFgxMzsu`wBzMCQ@x# zW2VycH6rzWFe@%UWIa!$XX}(IXJU>BpJUBB>sbE#`CFIHw{)u4As!==Ep>=zh*V3h z(J+LQ%BzC*RVPxPQ+R@?rfM@$BhX|bb@b(EbVPablW}tQK;IalRJp3qFRL=0B2s5< z_+0A=S{hLgUCdy#i54NQJ&}69)ss`7C3*)rULca|3+<82)I70;=?K$BroWjg zzHF^hiA=dnk1%y)>d7>UX$I3urb8ytccqCM(OBi-6Vo4}M^UfPFGGRSi8c}ChaM(U ztJ!}&WvAa*pg8&I3HlTl(Kd`hA0oMzZxb46meM9PfoUSsbf!fn<%xAnTbXt-on*Sk zRK!$zzG`!xa53q-lN54aQTy^lHd76gia(c<`vY~J%blCLF4Q;6`?uBhzpthS_QmSn zpd*zc@7fH}jYypza@VX<$C3LEM`4Otn<3;Ur(_EZVSUcc5b|?w@=3lSq3(a)(gcH$#3x;*g{(+#HZS5=NY z5n+-cGKjv%=*m6Z8I=4Gxt~D!M9TFfx(GLvNX|t1q!W?)%N=jB`H1Gdm?!CjLDzfnZYC{Vu>VOU^ z7#afx45KobGYYzjBRXqd#elBaHKWohrZufuK}9iQz$|7=m=)8S6Xu*njC|ksythvE zZSKI}et+SQexA>Bs_N9K9Bx&$6KARlJJMxWIo;xPx6@-zFFC!JQB(K=q#fo-AnqyD z*1wLI;M<9n^n4(#la~eQj1o`E>O|-|kkKlfO#!i0l)^!vDHb+ru7tE>6K8$c%Y{GI zdz^!sFSeu0GcA?yl+za(HHXfZDz@gZnA6Hm8#ry_bcoYwPB%F{cuutvHiS%JW3N~8Ua#c6Udehro{9#t-cMJ=u4+xoqAspU3bo?rFsO2 zwlsy)K>Q9nuzEoz!|otRIa!qBDL2Nuzf=mJL8jAuGhG>JL6E-nuIx0xDV1Bw@%ENr zD!09%Pvy%Jlm)z@z?o4gq>?@f{svn9u~qD7#IhW0#8c=88VyES4lx>y5GNS1RL?Yu zb+Qs(hU-O;)%Jp|X4G2U4aBl+3WtI8CVuQ0 zN}&pwO6E$Zse6m2@B&;}Uz)-@Ahz0;>c=3)R=?uodDhnI&u|s}>BMnMvRSTR^R-!x)Rdn8VyeH?#_ zdgYZ%yTX3*$pGJW|eh4%fY3f^%*SnlG~mf((%@tRzGrzb)&WVt;>FK>NHv*it2$*X6p2N*UVof#9bl0k=Ft9 zD=USgoz8F?<#dPB(-~>^W0oIT4_0x_txiXRI>NQ&=SHx<0og*3)#lm_koAD9wR&?# z|BF@lLJ2KB&8qi7+$XGr@^!d{XtI?+O`zt$(qcY02kr!lHh`!|4#Gvz+d9dfMqDr{A3xxFN=| zhSNZ&e>x3wy3FYwr&pZ5bP6{{&GR`eB^)vTZ9)p`Srmr)I|2@@OT>+$0?e8?uX=kVXoQ`lh+v(bj(oM5c z80WHgGs0~BCf!KGX>}0et%OQO(_Z_b-e=<~?wzb0-?#Vx?QILB2)nw_!f$9;28i0qHi!5Rl@%0Hig0w4f5=?a@kjIP+Kg?dfyKI8K*vxlzw6;8cC zwkIqoh29{I-RrqOu2c3k`~C*mK}P&X4!$>13UMbvb9C(_YzKd$!!yE78j#BEDyOuc z6Gy-1aErTg#;E!8_)J#&og~fX;vNNFrGYtW=ZXx>R7Kz zVb3fC&g9P#^WZ+Gk$daz7uIF&Zxl%BWjdZT3m$RVS0I&9r`sZNmiv!kVkhgkTtLwUK(~L@CJCH18i~0n%6piAw)~6b=Gs0?Ce*{P))0wVsR3>W(H-Wx{ z=ElG;AwL`OYozF5xQd=~deiAUr%6szoaVeEhVAOKw$s*5gPab^sOXC#{&NVfETiTS zZ_Q{;tR5+y8afmHepk7H%0IE?y$YJg=v&Z&M)TaMKCwA02Vy=q2i^@At>>~Mw3gGR zPCGjt<#d|U#ZK2d-R<;Wr_Y^Acg1)+J1yeW%V`6rt(|stI@akzryHCe%c$Zned|1? zdam?cE$xrTT~3^eKv=c-DVdg1V2f8Dk?KL$yJK1QaoQlGlJDl>3-507hxg4;H~LxK zNEYzaA8SPI{!6lo?QKg7u{AWyf+InyVV5{Pf_Fd_P)A7rd0L;@%^0IH+uR)rf;c# z%Lw-fFwc=JeyPSQ51nJ(<-Uqsw?c^HU;$nq0G(EseSI2pWLlcTK^ftekkbQB6EmuWA2KS1DNeIJ5N(;; ziT4a2wb)jM>`9~4Tl9nMRg(<{$=?^4HNOj4C7c0SKP$`Op!zRFV_bH>`+LD;q|(~hX&$ zt1G)~ZKn;KTAa3bI@sw1r?kry_ZVBN=eX-dPVrk{Yjupv?#~Ey(r5aQLB{WDIB5dv zjJ!uXcZxky?WnuZ!^%^fjmN0l)j}kFsgLD(kP2J}R@XuZ%?|$tV(Ynj1pLNAORbkTu)M$92tL+{MNn ze7MqrrZ5ns7O)pc_3sFf&W!yB)Yrn^0NMnEFEF63jJ^gbMe!5}zUMs}`}@T+!fpU) zThp=wNZ%m_gQywj;Xq0+$8L>-yr(|cLYxFw-dHb%3qboo)*NC^HibJfSB?7$oAPBv zlrM7wyLqnVY0!Zd@2j987RRGQqXi#ACR=#2ziO_3LUw|M=rKN)TT1x`kez9+DGy@G zG1Eub3*p)v(mA}8lSy9+n>0r)_}2x*ahch|Gdov-8p1Hhm_w;<=zhRa z9=f(xc`{RUDYRs=jGDqY&{+7>9l(1*DaTu?&%u>BRGarjIsP&HJ&3S){S3rfQVFv> zrm{?7TdQ+JMt!Z-iqnc2Rl+(Tjr;vT-+GBTW=uR*HXPIqoyzx^qs}~L`K-F%3N`8(c?(O z8H(cg(EWV};(vrUg+D=TZ;J<(?`PDMhKJq&TMS+6*nFpP62U&?p{l zX{q*utIB9IkXpc2PLExt5ezrnI!4zCE_)TE5brsC>9nJ3+1Ke`PRD^XkGL4bnP4UG zq>l7medILRsq2%`zGa=(aN5XepwsS7)r@M}LM-!2xB#y6 zAg|KN0n~BGRNKcnO?3LwY1XHrzXhF^c3RhIOQ$`Yj&M58=`^Q{oUU=Y)#*N`r<~q( z`X(d1LI%?QUq!C+QU!!i2ZCOXD{T8_{gAjkW5UYZA zF-q&VxCek)DO}m&@frzeZ}XSRqe%0~@OOauqXlXew6ton;c)#=o$F6);A@}F)^CQZ z&J^7Rx&;34cJvj}QVI`2rnO|+Lr$xcqVodWL#74Lg0P}=hG3Rw)P8Zx3ZyZ9GI{~c zbJl@OA=2rN&0Ln&N83U+s?O3QAp8HHr5C}fYc1~|0;vz@z8B58>sa9RnjISS~+h2$D#6@ULA83&3&~OiXElB6<#)33k ze-Naa_`1{gPIFFBt;2urf_AZZd%0{K(EcWi<&oAJE!EB8N}F4%dpO0FNK-f}lQoAZ z!;Blf#gV4(WVj9kwN!8Qun#*;aC$o<><^)au~bX8v!gQl8LmoO`eG7a(@1A9u#S2@ z`dig$Pp8{D$#vTM2iS#0i&Ebi*L0PTdZ{y@PbGMR(^F17ouyadc)#Kd%YzT#dX5o$ z?@NuogX~75t{2BX``1j%wC$^e1z*6PmW5p$bg$7WpeKwr1ifOk9q2=&!JzMqj&eE& z^ry*2g7m)6O`wKf*g_uybqCe1A$Sgj_gz}6&%#yoveQJTuQRGmN4lpu39dRH+wfwf z-k_cq@7ACdjSdH`E?fQ+@7auij4z{9LV6kRUdVI{XM%@)AEY?a32dIv=4pTYlPFv_ zFwNnmSYPG`ZDull>0)nNv`AB@ z@A7a@VIK<{zX#wSB@k9$$WH+sX8LXh9S3R-<3OyF`ln94LB}`B&N6>5!}Vg*m+Eu8 zi#NR#eT}gEQe6qZg03+w9bb+uVE&A1YYD&I(O+wIDY%MOc3RVEeW!j-n`cy%_lt!c z;mUd4V)mXJ)4N#U7joWTSUK#IxmLnZ&<(IayB|D%uP zdtV}k5HW-_^PjG6vD~;GvOA4pZZrqph~$n^a~KO((IZaJIx(+wqWfLQ)Wd!6l=6Po z|He{?^|__m02%Y3rMj5Ysu@+n+929jl#}|$fqTtn-qC)vebSY@AUs=PFEqsSy zA;|O&K@W3f-`TUyAMcgR0=`4AlDQ^Z_zwn(m#+ZOU)wJdY=E#0fj8>=8}UZHWce2f zTFrI(FA_)#UnCIGf*mX@U)J9Rgxhhje#YMeIK;y8Jpd8k0~ls9TCY6FzXx!Rxz5OY z0HYKFnnipMV2sK59snu52cZ9xy9=_0!2bmpZ^SZx)@VG+_kE+UKwlfp_euye|Hcq& zffh2_9kiO!=}vcmHa6MYpskIVldOMw(P2-M1d~` zoSt=J>3?eJ{mEquy%uGCo%VG)&*^?A{_~0Yl8+!0b$T7|)th~+FOspohhJZP@pnL}TJq;I}AW4vo+gq_c< zM&MOAuXUy7SpQN@oc8+`Ji)G#=8F@gqP~54Wgv7Ubb8W)|dP}%i4GD;%k@q z&!GdcUjl!%qa;rnGpzpQnAB2DFK-sTw|ND$XjT>9%&a}}#@Y4qZQ63cyvnO|j{q;? zUOBBZ{!^dqS8LR*fEm4eqZ1k&YxTWnWwW&B&e1BKsFiD+Uuh>=vZ-TB_jb~)p0p2F z`|^Lf!80M-Q?0$rvpZ_oT4qbU4^jJ7i+L&w(s{zP1C&nv6`cu8dpGU92~u=oFzxnm z7iVL$lxI^~jQ$1dw+Ctb*xiUD_WnlvubH7nkAqGz;+S%dQD2NRR~Q|=EN(X#@jpr* zF*+NXpEbG%^tRFapwEnEe+%m^Blck(|DXlz!@3x;=c*X31b@qc(jB6Pz<5_v2*kUY z5##-b5#v4HXgh=*YjhmwH>2x71O8-ewBUFn_K9a2u}{3hh<)N6M(pdJG-6-(wh_nB zZ;aU2%{+zrUWC56jeZ3!X4K}`UY!X_Y|_CnnSsYaw4`!d>5fB5^qeLqV7NHh?d z)fU+HXZ)sAQ>emb{UZ_Qld1<>q8_lm=o{6Jh@)cnj(NXFUl0b>$T|L$egWbxfgypace+aX0dYw&NlRsv5{oM~G4=Eb=ty9xey zs}Uz#K^K{4fxM=Hmg%pc=e3smxZ7&wJATDegPACK3&rYeR0@K-zHdT^~WIB zvL6ULF(_%)9NfM=4DT*Lrt}^SY7XmXwls%UrvshNxK?r0-taibT}L?aW{z6zD9BEN zW}Jfuon`b8XoL~-?=quUJ4@kNxL#$lcR<$}eG9tDXqI<1CYM4t5Nlm2EbX+0yZ+r} zaUZTJ903_`o8ZPP_Ulv%@f&VSHGadbEy2^e;oSwqi+>??;vFZ+c(aMrV6Qnp02)|5 z5phs+Q#cp&h}k?clhw{1#<+~<+@3Ih&qGF1dAw-E7Vs9RrTSwQ0yp{J!|g6}wRMI2 z`@)Fxc7^4;W}e4v5UCN;n^+HgiQr z@CQ=Q%8_ITgw@Pr4ewPXn+j;2jU>|aFeUqqZSu3@g6C-ybsN?62|u>5g$ zIKW&vI}~wtxUI>!!=ez}VG%K3_BU77aS`LCYbo^HS-GLp!bg~l-!P6d;&%ofjE3G^Lgm2f9^ z1O7Bh|G%&{T=i{d6A<$>%`r76oOx#I+YYX33wwYXA*%$Qc3sqH2xR~r{yb-^gyuwY+ZK)mreJqcb>QNx(q{@7G^LHs^tAZq3A5=X4J_dgqn=98=dTAiO z&4PcCyCjxi>Yvkp;V`|LseYD`)`)*I3%E+%$%y%Uj1hO*&NpIzaI+EngNKdSAG~M8 zQkZ1K{$S2oY5i}AV{xPSHh68D>HLvgaUw6H=Fk(gw1wyeS{|f+jg(%CZwRZvl_k>@ z{+3ZoHJ+hwscsJ$a~H3AXN0e+pp{MYxuAY?WmSVipJfH2||YzBHikl8p$fUZtA|{&bRq zE6pV!!yD(H;%hiaDe4Ww#)dhZ~Gw*%$6nN%I zv!I<|vnY*pX;wAVQ=5s?}KdC)r&fB%?%yIe&bLD98k`c#%4~;lte{IAbQ{M;qRdBM&7~4!8 zsF@=UDZMUMve(7tgiQBM8_XZ)aNUf!!suy4eN9GOo33R$UUFo$~D< zYYs*Ktd#n?c>W5u92(nO+KWv8qO@Pv*t*kyX)JeG43Yjtsf_l<^=c`+<2Cy`5POE1 z15dGPrr&)I*N3&F`i-J59O=aBw0A$!iPb5HP5obw&$VBS`|Kdeigq>jhAUt3CQ#aeagr1Q7NS)3+b!38R05 zo&})?zF0dBrI32P)D!X@px4dc)cs#WU`u%iu4*a28F6mbwIgM$q zWe#Bn!|6q*_cOwqAwKUM{3zy=2wMr0;L7~d{Du1Or2J|%t-oqu~|3n}= z*62Xc86eHuDbq?xGS&mhsE;zdDu56d8l40hZ6P=dy2psKr58Xg)pOvgoE+tJM@G1R z`Jw7dQ+Nb2&Ti7%Xz3fS`p!2^Gy6{MvvSs~K9)V^C+5o8<`1A0w&GuYYF~%xdzGxJ zgy#{jYV3y@;s2sRQ=kRq_LW@m)-!09*(qBRG?&qOnJd=L=ozFX?g8MG=;d*APW5yU zLa>f2pBI7_)lRK?S>__v&L(qZ?Ofl8J+Riq94odq8RygtQ3)qP^GTpm7!J}NMY7;t z$o5AF+=K&FjlOjH1Jt(lDU}UhW6h4Rr7&dv7-Bid6gKYrXk1k~SPw+3Ln788*__rD z1E57Un|U?d(#G1Py#i_xamGE;T-gs@Z^V9xGQ3jtl(aO3ZJ|$Ju-M8pCUc}yePKS| zVPQEs%ayBW*~eA%ICJIbob5s&tSq2D$*4udurF8$)<4NuG9vaW(#$hTnHJcmcFymx zl3fhhSEl7r&>u!Tks|sMGU=Q58_Xl-V9nuvNe`p6U&4IWe1rMi$6T3Ln;J2%{%OQH zO%>E+|MPRc(VEaa0)($_8L2EOD>_S}KH_R~WxOJ`P{qr9QM}Ak#mhWpybXcvS0T7= zyxC-2H$Dz(3VXo8~Kx3UGhjZW)1?cj8{(*;geV(;B{0>*{r8S2+zK_%+qb9t=uN-O${XyJ8YYN*t z{nP0rr%|BKtR}KH=^P&W91-idh;2*65&I_#!TvzR8S+eXvW~MYEMUaizMK(9tJOe7 z|L4`EbSEs>0IpraQy~5WQ3xeSE^GKPrejr*Y)<|LxNHaacf8Azzx38d%BwM$%S+#kzqN5*K^#nx^o@2~ z?sb1DubwTCG1nCKa}WEo`|J2q%!9>2^0%7H`nqg8m+kMe6mJSU%>7;O{vLJN%LTHc zms*qN4?V+7^nK^GWZ?{q8ZDwEv}y4~nOmpu-8*kshFu+%4_z877e!cw1Hsc)j|lPmT8 zXtL+r-+w_fcVdd(a{AC+zXWwQ*B@Q>yVEQ`$JpisRm|VKpeCd4PI>FsF;`mOV#M6| zhf&^NN~MVY4mE%IR4R9wYx2ibDo>fpQ!E5isk~w;l^aZ@WK5-GOr?maR9-QaqPFal z1+?!%w@+GF3bKm!-Ds|~PbsH;)Lg>N;JA)o0i-$WnwhK|T0r9vwiLF{T+3lM_jeHJ z5z|cjRF)*AjrB#gv}OIY>rk>j<*w=#t(RuzF4LhpBz??XxiWVZmbt6i#N1UaVeX2G zY-TM{2)ZVJN@cz+sBW+n6fbKDt*Xymy;fV4yGMKOp6I!IuFEcRSw6>=Hrnz8N}(KL zh{n)Xjw?jIKFem-7uwv2cPwHFvcAZ5Mq2F~RwJ0>$}8r$h&e9T>D%|YX<<&zxP3|` z+ncoHYlKos`&3_OpW>i>3d>$arO#ePGWIH>D?n=J*Mk)HHg~-jlxj{gA_c${&Fi&dAE)8Ib1V90O*Vi)Hi@WF0}}@K)wJV`Z*%u*|!dK9>37Ml5sYP&s^@ zi?@%ta_m{tXqeNF@b@>9{o%y&RY|jUZUxseZcO7#y3u?frl=gcWiq9FAJam8O52i| zKe--gt}8)ysA*Xo{(z%nyCCfO z7Is^NrB%{5!eqNbMq3)gzM#vD4g+0hbS&sLqf?#E11ZEvkV1@h*=?XlEJVJ2yk;`? zNGdnBU&`7}$ER?`KU_kedh`iS>_NUX*O)`7Lz!zi`~c$roE2+M{+Q1{ngz4{665Fs znrxbv22HUOd5q%^^H)?_Yr-GzT56oh>nn#1UGwH3{jcC45beWlCy@Rh>`V~_n1P5#thu^y<;VLecdU=Nbl(iqtC zRXl{`)HldO6j^Ynx#lg9ee6|aAA1$i;~@1197!~q=I4L1{zJGb zHjdqr1)m2`VgYQEV&^ z$?_?B*R-Vapq6h0Q$mcThPx&yE^R)Dm5^l4+C+G zNAClg+hnJ@D^n!<@+p#xWweNeV2YF*`4p*+GexVIzx*7ozsXoe(#J9qv5ZvaETci@ zk7cA*aUSgBe^{2oNDyD4t)F=)Ue-y~jkeN}+F+_{ijC=D*!uai`q(v5<{J0eD<5q3 zF%D^AUWsS{^QFC7N}*^L-qwu!2#c3-r1DUT+Uf;l70V;F8RawEjASei+FTCTAa^aZQmZEiSOh@rdfh98% zA<{eyr!cd0;2(oQ{1-#K_V!!+hnY1&S6YajKzz$WEpN2NdlY12j7|jIW%M7=!$!kF z&lp_^Qi~enbeGe^pjXV_GnuSy>)(UFQg{XaJ~H|Wr0+tr{f--HChG=Dvy2~2##zRn zM$5ysLuZy{npO3NjQ?;{4t+B%<**${^?5L;tA)tVK`JIoA(*?eFU`3QM%ZQH4|hgE zy^a0@dK@EIDO?RomKM#(R<}5k=DQI>sf;t8;=C%d>ScuGw~kWy1EhZtqLvLUj(Pr& ztQ-~s@qdWQVMUPYcs}Ku=d3D+-tZ^QQC}q-umHZ6+Wzh~aOM97;r}{7Dy<_jDz={K z-Ny2282qV!ITy5}$x_NkLB{_B(oB^hR67TO8pADcRjs=hG}vV0K?fL30C8s77+wb* z0ok-|DTfr>2M8gnzHwrYbUd`Awp9+Z{HZom4s(Gtr_SeOS|8E+a_A0!%5nBI+T&Rs zveQg+nrHWh>@39w(u{j&kY?ORfX;VYE;C{a7-Pg1pc(fW@OK|%%D;zmWGV=uf7CTPglx9l*0xf*1vMt%tLGkVm&Q~K_H!-`6uW* zSXBy#gZK_9PQ8GZvRZr|Xp*^J(YmIO>u%Y{b+>3=_!Aul>TCXv&8Qqs z1?g$)Iv(`!M-2NsehiB@z!r)%;s~er zAy+N=cAEbFgsb|xjwQUgWU)=HuN)SHE58}meoyYS4SFQpm2Ryr16R?@eWGk-mu=fK z%GPn&&MqsvmQCDsE2k5di(z?QRB`N{xz^h9{DL7oWVY-FSJBZ<|8_dx>1wAtoW?u7 znbDGgFMZz!&E@blWEyMFhs>z__pYMWDs$rpvw(RZVjhT?2O{QyhDlxEyAhsT3w#h)y8Bk6sRG->gX12!HAwi(I?GRhpwK zZjR#|@ONOueVfM%UlJHY($G|*6sgWnwZ6|Z)Vp62)5`P>usmBXiqL-Zp^>6q+Pni>Bw zWd1ri&F54B@yGuLHq7*u0EMoh#hA*#O_&$ zX8Y&&3q6(7wvVr~mBYSS*fMT4mF&f~ayZ&$CxDo1<#1L;x{Y;-$8n8O8ikm0zVTKL zmmtI~7WRfLYA?`IA=kyFnhOnwPm&)KXsXbiC#CsncYT+GUIl1JtasMwCJPKc#Zu zn9|33dA{+>(FJ1>UD2bkqaDp)*I=13+sSodJ3q zx75mE45**U9&_0nAckEm#Q(fsEPMl*N^3HRH{8m>sb)OqX}S4eOKbI5jMJhy$|a+6 zXaFr}mM#L4Eh~YTqDolTX|s%K=PExA!1prKye(Wsdpixy2t6i(0}3-Q8SAL35FP|15}Yf0JF^ zhAjuzxwe(^BXa)mFDKB)deBmR$mw~fFP!F>P5v5i%S^L}hOnN~jv$s%L)gb@2uQu- zu^`orSeB_&Yg@pH@W;BVGo;7B(o#4FGTMhyc6ueF^tHa0eunFLmdZat$6H%Svd|&Q z(p+yI$c9^pg+L?gD7p4@e|O?@(oOLKINO6ET8giO%_v*wI4J; zgWWgW1_bQ}SKNra8+R#;-gg=Ql}JAM!jt_ZfK~qn!_$m z|8zRi=~$;zoJKftmt-%qo?k(a!o8TeQnoX-;8Uy2KuhC*y6YMa=0_I zr4+b3IGfpbB6g3|dboQuCuB8W*K5Y#ZntBn2(GQw@z5fg;MD!#=*pKV=&D|z8>lgS z2!C8lV$Ggepd8}&kMwP}9Dac-|J5FQpmUUJcKsGLEptJp?{xEn^qsB;NIO*Aw_U>g z^@2>_>6)F^1!*s66VM9gZ!4#rGOD$Jw)BC&>6PG~2&?iv#3`+w(rK1ymtc{WRD#Dr zv)1e^w>8bGvmncAj>mhA%cfPTrEnMg@ip<{y7m%W*Fzko@D_+)Z_xjPHZs}oApRpl zDa~|LgZDCfiZT-Xiu|@4>#Co-#Q7`yA+=%;=#~G!4<)U2cgAixIUpXYJHinET z*Pi(ZxK`|cOaEd29kMN4uYgST?^=-dpKmle9IhhnfvQFv3z=%?sSFD(m=%DU(BDhT zSPMHM^C#JTCgb_0hm3e$>LsJA;O|qTF0OWz;DCFAsaT zg=Kn=He!0uFk*@>1Qpj<);ek_hot!=hOqBtY%`1(x*+5G{H1Uyi2qSq3aqE2%$2qC z1|!y3)~n*!Qi@W%H$or((;``bQ$vv5>H5<7wR<7c$?pe^hH=hi#FO8z7(Irt?-@-1 zsh++D`rKp_LG)K|-)|=S9IjpFrz`F2ZWQLiI@wCA6R2Xc(-+2%o;i}eCWZ$$c zm^y6gF>6PJRqV);&;yE-Gn{{&GxzZf<*2KEe>8}ZBD^+r5Dd500tPm1^@ zX`IP8(`QR=3_LZ-uYHYSQ^fl`Tm}u>HUl40?DVzY>$nLXW z08-n(67&tiqP2srv;N?D(4`i3B8W9i`SOeTi}keLmQ=p7C6;Avi=PC2>W4bc6XRfC zqO#1F)@%#J7Ak$Qo|bVYck1?*Qr;Pw)wX(oSl3EnZ4g^`DYSstYVjHvh;2q`o6lk! z3fXc-am|G9V32Xmgt-~|$(78NJ^Gp;m2^K)W8g@)nGwe~l3f38GM=ba>0bzaJD6+~ zXdfe<_&6NYcAnm4{Y$bcrMIp8OXX1?_6EeOnNg9J8_Q+~CDWu4S&HeZMGVHHPxh)O9%$m&zsXtEdw-Y!Q7&2n!7En!+7 z0O?fI)1cHxD0kUYa}T**v(EOsiV({2n3F0Q+M>0U@*tn`70jx(!mehn`4EcjW5jm9 zoh?hT{RkObMJbdz$2s~OAX?RSO_aVx;ZLQ?(%PUMHZz1uh9O!!M0@gnIfPY?Gf)3v zVPn0o&)s~v;j}-(s$|v!?PX!9Wk1)#Ih=Bw<);4XaJcG(xK5t&Jpa)q<1WcbMm$3x z;u(VTOvW<=BaOB|Y@>~~1KkIz-*J#tamN9@d1fi@TV<3^a+JdUkUa@4hp9}lW~My-{?kY(L6DY z3vn%pH9K56Z^vF3Xk&y(wMqHBg~>R>+sX9hYwVsTOR>EVEnH>QjzUGTeF}evTG(Gn zK4NP=$=-2DL2PM+P}-vP%I@7}O_a+d|e!yndFvW3~xpEKhek1PTJqwcSt0v=$O6#{3vascl zcB5!L#~y`vD;Gkti6-MN&c{Y;L(8{DT<862#C9}$cc!-=T<0~~611=p*Un2B^*}yo zeYpc%xo&I>dw^Cl*8@Q78664wyU__w|8W}ObT#Ne^LGnqh|zr@t(_kSU1+iwKw3w= z>9UVN*PH7%AX)zl=mE&eVdi;D_Wpf2%m#YOWE?{$7|jQnX3Z6l&XM&7y=<<1L9ZJP zaM?dVT0QLpVhNVR5RkN-57MmV8j#k`H#v<3sRYNl>~WV(aM`P%cP!p_K{GGJbhMW~ zKnSL-zMj_iWP1(C zKjqMR8KH)Nl=p)&LcAb`Meb%KTXfcxt9jeH^PI#0jQvy^Iv^nI10*C+gsOuF1B^NO24|SC-6`<{E2BeT}G(H~K4wJ)lqZ zv?#rYz;%qpaXjdDqkn@~n^anNL)IABi#}|`UXpqP{Im#=5J0Olsc2 zWKY2Y5l1WP!@ezKs#mcN>7M2u=9>1np<9{t}+Ce+V@*tME`i<%5OS(PqSJJ_?>4g?= z%%OTM^<_Sz_CX)YOc|Lt=W zLezizywPO&Z=ZLWEPeZ29kD$ESvhPB>SyzuXtUb>Gv?ajIk{a%wYwjCK_;tC2K^Ty zO5sdUen(xajt|T=#-X}aU(y#M?3WhrsElxG3iO?YWm*1a#C*}6>gnt2XlFX8kA$%t zqI~{8LSfOS90l8#O&~=ou@8FpCiN@wyyXM#4!)^wfR*t z823SPWgc|55L|(4wG+#zKDKOa1${~{Lo8$VEf0OczACH@qHA&3sr{+vH!U^aoi~M+ zm7uw`y1mn$P6s>v+i7@4_+O)a<4LxgAk*A&EJ&wg#)0~n&GE*P@_AjzG_v4rmj4)1-+t?B-AnMt?~=Huo>3`$2-1ENbDVXp9P%x1TZ=7!N@X{b;ky5j3j#pGJJ=?$gX+BRdD^l{M`g%Z1VS& z`Q!f30%ps7aOFRvX`~zEuMd1LeVM;T?4#i%g2|o*l@?`euY%?-ETyHTUkG%cL^r zeIb^4?OB(69ber-OLsPXoD=SD z#J!RIjo8kI81d`+nMR!9(X~EL>*HMxu~AkID`!+6;tJD}W}9onA5ValLw_gMSgn*; zme&@<`|xzN;EodX?QivT=Zx?j2K2av9SV~5jN=89am;%Yq#XJP)EL+^d~U>^;b%}K zoQkllow)VeC-$u8LUt(bwp6e?sy-HL=c92q2w#HB;kqn@G|y6@X7)oJLG|N87n8+% zS=o13lck+Iu7G~E(eE~BUf5E3cNPbBj<7peK?t0+aM|;qP2f-UU`cc3XtkngehaR; zMfWj?xAzq9>gM`2Wa?=qftYf+t^-%4XhTqA;EJlhg~-?O?aeh`$M-NX6A~!Lb&W_4!02#&#a496H0FzJV_Q8f&s;K}yGppl40S zJ*`)aR)y?cqfI~>FSiCQZR0t=4}N8?dq76QJg+I{MAS0}p7|1o{}I4=E*as2La%+)={wulq+ zit(01kwrN2Mk>c0|Vc)P2G3BMOZ!We^%>vdTO+CJtl zX<>*%AyXa<0qG7jQ!ZK6WIUU40;t};i%d3c`##SsD2GXI%WMn9yy}usYxSOWG;+39 z7l({}SZj4Tr`4P`a@yQ!Tc|rG`qAlkr`Z;cxzX8aNvGAFTAX%v+Q(^#)4!e0$f!A-3u0Ys4#S;B zI$h;-ozpE&W1Svw8t?S9(~C~8JH6-hxzkThQ=Dd5B-%H-(>zY|I?eCY-KpZVgwrxk zD?0UYVhJiYSc0Op-F0IpmcCrKa@lrHyEw6K$lsnWW1W=jAeRks8s>Dm)A>##ovw9a zy_ddQTsF?>S*JIhK6ConY1T!fmM%^erRf5V`>X<>b4Ed+UMf_ALGbIU68(6 z-vTNJ-qB`Dmg{}y%9DFs4>pD)p?SO!Z~8oBuEQXE#pn#s`$iXnel{8fYFM0c+yGk6 z=uW2xK^x=0h%xSiwg%PbILDdV9Df=9H1@pf#QuH_XvVn|$ksKQ;=~bRBa<?X_f-MltPQ< z0+T@s%aT^>(E24<*+D7`Z!n7YGNhGL~DTF_ws$itmnBP?G$YYSJCDmeRbO= zBfJR%QtR0pL|e*%v!HjOr5vJ6HRn^)%-NhmSVG#SgXx69Ts88vSRDu?qBLOFB^Xan1?yEY?f+1x_#3!rj{ zvrT=S%cpIi`OBwmCzIvpwtJZ@rVY245L^1rez1o)!ie9`k2m6Jdfmw2X?mSB;c5EQ z;ab0jNN0ugV(L?fV}zwGePezVGQOEq4xf>%RQ~|+^`vr`bFoNqt%3C>Wa&O)(dkdc zoAjmFk_9Q=6kCi#J-=*jMr?dBHQAySU;T@z`4wN=Dc=bCct@ffk_E}qWXu1Oa`vM2 zIsVt;8LqEDdjQmi{nUP^Z9&*X-Td{<(uM2xtn6+ z*Uej?1-p5$>Q2*_tdFHoU*>wpi#rp{jr0;P-e-W8drixXmTzsX1^)v@M4FN4@ zt|x$W^5RU8Zbn=LTFqRq0QEJx5j4PPENB;_hd|Q&w9|i`-UTUbpMegv5I=y9Hu?i} zlF@8S;KrO$1LzV^eP5@Vm}*X{lmAPN=!V!vBR1`;upVIF5VBiMmQINGhD@)_@r3xJ z=GqUkCyh8_za$yP+SGpEHW^3pFO4{7rIzBf?d9=u=V_9KU@uVL0#Z-Y-nJTBW9=9a zb4@Al(34iB78P4EzW-o%x)WSW;SkuzcUN&*J^AZgwZq%W<5 zLA@<(6{N7EK&xBsJ_J&TmqGkqi<3Vf)zh$4v^nKC^LZW9$9&%0D3wANgxJPp3xWoL z>ht~plNIH2Y?qjqA*}KsAMY_1whvsjKfW1=DJq9OosI`->^{T&o$s>iK$^o%y9Ffs zlD``fc0T(86D_T63#q=O7LXsASSNLAL#;7sPS%fiOOwq-Ei{EqmZo@9eU5FgxOQ?} zJ27I1kjiZ*km}IkAic85vOLT4K)Jy> zq?XK@!+KQ?|3QcmMjTf!GfL@Ar{ph(zpKnOpF`KR8RAB_g(;_IyhMU^+3iLT!u4*W z=RhoJv<0W{LC=^gYx^5U?3ERkY5UM*Y#%y768nw%7SQ&5Xxeiw+Wa-*sO?|!?W4Y4 z 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

    >6p+z+NUH^nwd3C0!N63e(*Z3(xd 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

    yYi08 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 M5xNA)U5?Z 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�GPv0~5J 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 z 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%0At`(u!nb=p&$6UeIIz_5Nc{ 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%0AbOD=l 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ⓈFDaHK_b!((^x^ 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

    ^cTf%#$Sh`@c}7`Ib8)zA>|C@_*#7A34`8q3|> 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π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

    4VV7v@=* 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 z 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≪2) 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 XcJ6O#NIKSAxqIi1lO=0sfg8;L?w_lE From ce14424b03ff6d0275aae833fccffa04be018f9d Mon Sep 17 00:00:00 2001 From: David Suarez Date: Wed, 24 May 2017 18:29:05 +0200 Subject: [PATCH 259/324] Implement named arguments and With semantics in C# embedding side (#461) * Added python "with" construction * Added some unit tests for new With method * Renamed With tests for easier grouping * Support for named arguments to invoke python methods * Named argument tests cosmetic changed * Fixed failing test in python 2.7 * Reset line endings in csproj to LF --- src/embed_tests/Python.EmbeddingTest.csproj | 6 +- src/embed_tests/TestNamedArguments.cs | 64 +++++++++++++++ src/embed_tests/TestPyWith.cs | 88 +++++++++++++++++++++ src/runtime/pyobject.cs | 76 ++++++++++++++---- src/runtime/pythonengine.cs | 31 +++++++- 5 files changed, 245 insertions(+), 20 deletions(-) create mode 100644 src/embed_tests/TestNamedArguments.cs create mode 100644 src/embed_tests/TestPyWith.cs diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index 56ef886ee..2edf4f515 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -1,4 +1,4 @@ - + Debug @@ -97,6 +97,8 @@ + + @@ -117,4 +119,4 @@ - + \ No newline at end of file diff --git a/src/embed_tests/TestNamedArguments.cs b/src/embed_tests/TestNamedArguments.cs new file mode 100644 index 000000000..1d7076956 --- /dev/null +++ b/src/embed_tests/TestNamedArguments.cs @@ -0,0 +1,64 @@ +using System; +using NUnit.Framework; +using Python.Runtime; + +namespace Python.EmbeddingTest +{ + public class TestNamedArguments + { + [OneTimeSetUp] + public void SetUp() + { + PythonEngine.Initialize(); + } + + [OneTimeTearDown] + public void Dispose() + { + PythonEngine.Shutdown(); + } + + ///

    + /// Test named arguments support through Py.kw method + /// + [Test] + public void TestKeywordArgs() + { + dynamic a = CreateTestClass(); + var result = (int)a.Test3(2, Py.kw("a4", 8)); + + Assert.AreEqual(12, result); + } + + + /// + /// Test keyword arguments with .net named arguments + /// + [Test] + public void TestNamedArgs() + { + dynamic a = CreateTestClass(); + var result = (int)a.Test3(2, a4: 8); + + Assert.AreEqual(12, result); + } + + + + private static PyObject CreateTestClass() + { + var locals = new PyDict(); + + PythonEngine.Exec(@" +class cmTest3: + def Test3(self, a1 = 1, a2 = 1, a3 = 1, a4 = 1): + return a1 + a2 + a3 + a4 + +a = cmTest3() +", null, locals.Handle); + + return locals.GetItem("a"); + } + + } +} diff --git a/src/embed_tests/TestPyWith.cs b/src/embed_tests/TestPyWith.cs new file mode 100644 index 000000000..fd3f8e662 --- /dev/null +++ b/src/embed_tests/TestPyWith.cs @@ -0,0 +1,88 @@ +using System; +using NUnit.Framework; +using Python.Runtime; + +namespace Python.EmbeddingTest +{ + public class TestPyWith + { + [OneTimeSetUp] + public void SetUp() + { + PythonEngine.Initialize(); + } + + [OneTimeTearDown] + public void Dispose() + { + PythonEngine.Shutdown(); + } + + /// + /// Test that exception is raised in context manager that ignores it. + /// + [Test] + public void TestWithPositive() + { + var locals = new PyDict(); + + PythonEngine.Exec(@" +class CmTest: + def __enter__(self): + print('Enter') + return self + def __exit__(self, t, v, tb): + # Exception not handled, return will be False + print('Exit') + def fail(self): + return 5 / 0 + +a = CmTest() +", null, locals.Handle); + + var a = locals.GetItem("a"); + + try + { + Py.With(a, cmTest => + { + cmTest.fail(); + }); + } + catch (PythonException e) + { + Assert.IsTrue(e.Message.Contains("ZeroDivisionError")); + } + } + + + /// + /// Test that exception is not raised in context manager that handles it + /// + [Test] + public void TestWithNegative() + { + var locals = new PyDict(); + + PythonEngine.Exec(@" +class CmTest: + def __enter__(self): + print('Enter') + return self + def __exit__(self, t, v, tb): + # Signal exception is handled by returning true + return True + def fail(self): + return 5 / 0 + +a = CmTest() +", null, locals.Handle); + + var a = locals.GetItem("a"); + Py.With(a, cmTest => + { + cmTest.fail(); + }); + } + } +} diff --git a/src/runtime/pyobject.cs b/src/runtime/pyobject.cs index 47f413409..80704c59e 100644 --- a/src/runtime/pyobject.cs +++ b/src/runtime/pyobject.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Dynamic; using System.Linq.Expressions; @@ -915,6 +915,34 @@ public override bool TrySetMember(SetMemberBinder binder, object value) return true; } + private void GetArgs(object[] inargs, CallInfo callInfo, out PyTuple args, out PyDict kwargs) + { + if (callInfo == null || callInfo.ArgumentNames.Count == 0) + { + GetArgs(inargs, out args, out kwargs); + return; + } + + // Support for .net named arguments + var namedArgumentCount = callInfo.ArgumentNames.Count; + var regularArgumentCount = callInfo.ArgumentCount - namedArgumentCount; + + var argTuple = Runtime.PyTuple_New(regularArgumentCount); + for (int i = 0; i < regularArgumentCount; ++i) + { + AddArgument(argTuple, i, inargs[i]); + } + args = new PyTuple(argTuple); + + var namedArgs = new object[namedArgumentCount * 2]; + for (int i = 0; i < namedArgumentCount; ++i) + { + namedArgs[i * 2] = callInfo.ArgumentNames[i]; + namedArgs[i * 2 + 1] = inargs[regularArgumentCount + i]; + } + kwargs = Py.kw(namedArgs); + } + private void GetArgs(object[] inargs, out PyTuple args, out PyDict kwargs) { int arg_count; @@ -925,22 +953,10 @@ private void GetArgs(object[] inargs, out PyTuple args, out PyDict kwargs) IntPtr argtuple = Runtime.PyTuple_New(arg_count); for (var i = 0; i < arg_count; i++) { - IntPtr ptr; - if (inargs[i] is PyObject) - { - ptr = ((PyObject)inargs[i]).Handle; - Runtime.XIncref(ptr); - } - else - { - ptr = Converter.ToPython(inargs[i], inargs[i]?.GetType()); - } - if (Runtime.PyTuple_SetItem(argtuple, i, ptr) < 0) - { - throw new PythonException(); - } + AddArgument(argtuple, i, inargs[i]); } args = new PyTuple(argtuple); + kwargs = null; for (int i = arg_count; i < inargs.Length; i++) { @@ -959,6 +975,32 @@ private void GetArgs(object[] inargs, out PyTuple args, out PyDict kwargs) } } + private static void AddArgument(IntPtr argtuple, int i, object target) + { + IntPtr ptr = GetPythonObject(target); + + if (Runtime.PyTuple_SetItem(argtuple, i, ptr) < 0) + { + throw new PythonException(); + } + } + + private static IntPtr GetPythonObject(object target) + { + IntPtr ptr; + if (target is PyObject) + { + ptr = ((PyObject)target).Handle; + Runtime.XIncref(ptr); + } + else + { + ptr = Converter.ToPython(target, target?.GetType()); + } + + return ptr; + } + public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { if (this.HasAttr(binder.Name) && this.GetAttr(binder.Name).IsCallable()) @@ -967,7 +1009,7 @@ public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, o PyDict kwargs = null; try { - GetArgs(args, out pyargs, out kwargs); + GetArgs(args, binder.CallInfo, out pyargs, out kwargs); result = CheckNone(InvokeMethod(binder.Name, pyargs, kwargs)); } finally @@ -997,7 +1039,7 @@ public override bool TryInvoke(InvokeBinder binder, object[] args, out object re PyDict kwargs = null; try { - GetArgs(args, out pyargs, out kwargs); + GetArgs(args, binder.CallInfo, out pyargs, out kwargs); result = CheckNone(Invoke(pyargs, kwargs)); } finally diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index 1fd3b239a..9ddd85da6 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -632,5 +632,34 @@ public static void SetArgv(IEnumerable argv) Runtime.CheckExceptionOccurred(); } } + + public static void With(PyObject obj, Action Body) + { + // Behavior described here: + // https://docs.python.org/2/reference/datamodel.html#with-statement-context-managers + + IntPtr type = Runtime.PyNone; + IntPtr val = Runtime.PyNone; + IntPtr traceBack = Runtime.PyNone; + PythonException ex = null; + + try + { + PyObject enterResult = obj.InvokeMethod("__enter__"); + + Body(enterResult); + } + catch (PythonException e) + { + ex = e; + type = ex.PyType; + val = ex.PyValue; + traceBack = ex.PyTB; + } + + var exitResult = obj.InvokeMethod("__exit__", new PyObject(type), new PyObject(val), new PyObject(traceBack)); + + if (ex != null && !exitResult.IsTrue()) throw ex; + } } } From aef02e254839062f2b4f522191b77cd481e3ec5a Mon Sep 17 00:00:00 2001 From: denfromufa Date: Wed, 7 Jun 2017 14:45:35 -0500 Subject: [PATCH 260/324] documentation update for keyword arguments (#483) * documentation update for keyword arguments * Update README.md * Update CHANGELOG.md --- CHANGELOG.md | 3 ++- README.md | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c245b17b..c8b54b36d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,9 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ### Added - Added clr.GetClrType (#432)(#433) -- Added `Foo` feature - Allowed passing None for nullable args (#460) +- Added keyword arguments based on C# syntax for calling CPython methods (#461) + ### Changed diff --git a/README.md b/README.md index da43abacd..7d12eafaf 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ from System.Windows.Forms import Form a `using (Py.GIL()) {/* Your code here */}` block. - Import python modules using `dynamic mod = Py.Import("mod")`, then you can call functions as normal, eg `mod.func(args)`. -- Use `mod.func(args, Py.kw("keywordargname", keywordargvalue))` +- Use `mod.func(args, Py.kw("keywordargname", keywordargvalue))` or `mod.func(args, keywordargname=keywordargvalue)` to apply keyword arguments. - All python objects should be declared as `dynamic` type. - Mathematical operations involving python and literal/managed types must @@ -67,7 +67,7 @@ static void Main(string[] args) dynamic a = np.array(new List { 1, 2, 3 }); Console.WriteLine(a.dtype); - dynamic b = np.array(new List { 6, 5, 4 }, Py.kw("dtype", np.int32)); + dynamic b = np.array(new List { 6, 5, 4 }, dtype=np.int32); Console.WriteLine(b.dtype); Console.WriteLine(a * b); From 550a02737f5413d0adb5b55075104b7931aca267 Mon Sep 17 00:00:00 2001 From: yagweb Date: Fri, 9 Jun 2017 21:56:22 +0800 Subject: [PATCH 261/324] =?UTF-8?q?add=20a=20scope=20class=20to=20manage?= =?UTF-8?q?=20the=20context=20of=20interaction=20with=20Python=20an?= =?UTF-8?q?=E2=80=A6=20(#381)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add a scope class to manage the context of interaction with Python and simplify the variable exchanging * Deprecate public RunString Had to remove defaults to disambiguate call on `internal RunString`. Can re-add after removing `public RunString` Closes #401 * Rename several methods and add three methods Referring to IronPython, change the name of the methods Get, Exists, SetLocal, DelLocal to GetVariable, ContainsVariable, SetVariable, RemoveVariable. Hidden the methods SetGlobalVariable, RemoveGlobalVariable. Add a new method 'Compile' to compile string into ast, the ast can be seen as the ScriptSource of IronPython. Add two new methods 'Execute' and 'Execute' to execute an ast and obtain the result, corresponding to the 'Execute' method of IronPython. * rebased * Rebased update * format cleanup * create unnamed pyscope, make PyScope.GILState save remove method GetInstHandle add function to create unnamed pyscope add a field isDisposed for PyScope.GILState to make it more save * fixup! create unnamed pyscope, make PyScope.GILState save * remove GIL and rebased * Add several methods add ImportScope: a scope can import variable from any scope, equivalent to python 'import * from mod' add dynamic member support add an OnDispose event remove the field ‘globals’ referring to python module put the scope class in a new file Unit test: TestThread uses scope function replacing Exec/Eval to speed up the execution. * add a Variables method * fixup! add a Variables method * remove private method _GetVariable * add unit test for Variables() method * add several methods and rebased Add an optional dict parameter for Eval/Exec/Execute methods Add a new field obj which point to a Python Module (same as pyobject) Add a static method New Rename the old ImportScope method to ImportAllFromScope Add a new ImportScope method and add a unit test for it Rename the CreateScope method to NewScope * add a new class PyScopeManager * cleaned up the Import methods * updated according to filmor's comments * fixup! updated according to filmor's comments * Get/Set Methods renamed --- src/embed_tests/Python.EmbeddingTest.csproj | 1 + src/embed_tests/TestPyScope.cs | 372 +++++++++++ src/runtime/Python.Runtime.csproj | 3 +- src/runtime/pyobject.cs | 21 + src/runtime/pyscope.cs | 655 ++++++++++++++++++++ src/runtime/pythonengine.cs | 20 + src/runtime/runtime.cs | 3 + 7 files changed, 1074 insertions(+), 1 deletion(-) create mode 100644 src/embed_tests/TestPyScope.cs create mode 100644 src/runtime/pyscope.cs diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index 2edf4f515..fc887d815 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -100,6 +100,7 @@ + diff --git a/src/embed_tests/TestPyScope.cs b/src/embed_tests/TestPyScope.cs new file mode 100644 index 000000000..49c15a3a1 --- /dev/null +++ b/src/embed_tests/TestPyScope.cs @@ -0,0 +1,372 @@ +using System; +using NUnit.Framework; +using Python.Runtime; + +namespace Python.EmbeddingTest +{ + public class PyScopeTest + { + private PyScope ps; + + [SetUp] + public void SetUp() + { + using (Py.GIL()) + { + ps = Py.CreateScope("test"); + } + } + + [TearDown] + public void Dispose() + { + using (Py.GIL()) + { + ps.Dispose(); + ps = null; + } + } + + /// + /// Eval a Python expression and obtain its return value. + /// + [Test] + public void TestEval() + { + using (Py.GIL()) + { + ps.Set("a", 1); + var result = ps.Eval("a + 2"); + Assert.AreEqual(3, result); + } + } + + /// + /// Exec Python statements and obtain the variables created. + /// + [Test] + public void TestExec() + { + using (Py.GIL()) + { + ps.Set("bb", 100); //declare a global variable + ps.Set("cc", 10); //declare a local variable + ps.Exec("aa = bb + cc + 3"); + var result = ps.Get("aa"); + Assert.AreEqual(113, result); + } + } + + /// + /// Compile an expression into an ast object; + /// Execute the ast and obtain its return value. + /// + [Test] + public void TestCompileExpression() + { + using (Py.GIL()) + { + ps.Set("bb", 100); //declare a global variable + ps.Set("cc", 10); //declare a local variable + PyObject script = PythonEngine.Compile("bb + cc + 3", "", RunFlagType.Eval); + var result = ps.Execute(script); + Assert.AreEqual(113, result); + } + } + + /// + /// Compile Python statements into an ast object; + /// Execute the ast; + /// Obtain the local variables created. + /// + [Test] + public void TestCompileStatements() + { + using (Py.GIL()) + { + ps.Set("bb", 100); //declare a global variable + ps.Set("cc", 10); //declare a local variable + PyObject script = PythonEngine.Compile("aa = bb + cc + 3", "", RunFlagType.File); + ps.Execute(script); + var result = ps.Get("aa"); + Assert.AreEqual(113, result); + } + } + + /// + /// Create a function in the scope, then the function can read variables in the scope. + /// It cannot write the variables unless it uses the 'global' keyword. + /// + [Test] + public void TestScopeFunction() + { + using (Py.GIL()) + { + ps.Set("bb", 100); + ps.Set("cc", 10); + ps.Exec( + "def func1():\n" + + " bb = cc + 10\n"); + dynamic func1 = ps.Get("func1"); + func1(); //call the function, it can be called any times + var result = ps.Get("bb"); + Assert.AreEqual(100, result); + + ps.Set("bb", 100); + ps.Set("cc", 10); + ps.Exec( + "def func2():\n" + + " global bb\n" + + " bb = cc + 10\n"); + dynamic func2 = ps.Get("func2"); + func2(); + result = ps.Get("bb"); + Assert.AreEqual(20, result); + } + } + + /// + /// Create a class in the scope, the class can read variables in the scope. + /// Its methods can write the variables with the help of 'global' keyword. + /// + [Test] + public void TestScopeClass() + { + using (Py.GIL()) + { + dynamic _ps = ps; + _ps.bb = 100; + ps.Exec( + "class Class1():\n" + + " def __init__(self, value):\n" + + " self.value = value\n" + + " def call(self, arg):\n" + + " return self.value + bb + arg\n" + //use scope variables + " def update(self, arg):\n" + + " global bb\n" + + " bb = self.value + arg\n" //update scope variable + ); + dynamic obj1 = _ps.Class1(20); + var result = obj1.call(10).As(); + Assert.AreEqual(130, result); + + obj1.update(10); + result = ps.Get("bb"); + Assert.AreEqual(30, result); + } + } + + /// + /// Import a python module into the session. + /// Equivalent to the Python "import" statement. + /// + [Test] + public void TestImportModule() + { + using (Py.GIL()) + { + dynamic sys = ps.Import("sys"); + Assert.IsTrue(ps.Contains("sys")); + + ps.Exec("sys.attr1 = 2"); + var value1 = ps.Eval("sys.attr1"); + var value2 = sys.attr1.As(); + Assert.AreEqual(2, value1); + Assert.AreEqual(2, value2); + + //import as + ps.Import("sys", "sys1"); + Assert.IsTrue(ps.Contains("sys1")); + } + } + + /// + /// Create a scope and import variables from a scope, + /// exec Python statements in the scope then discard it. + /// + [Test] + public void TestImportScope() + { + using (Py.GIL()) + { + ps.Set("bb", 100); + ps.Set("cc", 10); + + using (var scope = Py.CreateScope()) + { + scope.Import(ps, "ps"); + scope.Exec("aa = ps.bb + ps.cc + 3"); + var result = scope.Get("aa"); + Assert.AreEqual(113, result); + } + + Assert.IsFalse(ps.Contains("aa")); + } + } + + /// + /// Create a scope and import variables from a scope, + /// exec Python statements in the scope then discard it. + /// + [Test] + public void TestImportAllFromScope() + { + using (Py.GIL()) + { + ps.Set("bb", 100); + ps.Set("cc", 10); + + using (var scope = ps.NewScope()) + { + scope.Exec("aa = bb + cc + 3"); + var result = scope.Get("aa"); + Assert.AreEqual(113, result); + } + + Assert.IsFalse(ps.Contains("aa")); + } + } + + /// + /// Create a scope and import variables from a scope, + /// call the function imported. + /// + [Test] + public void TestImportScopeFunction() + { + using (Py.GIL()) + { + ps.Set("bb", 100); + ps.Set("cc", 10); + ps.Exec( + "def func1():\n" + + " return cc + bb\n"); + + using (PyScope scope = ps.NewScope()) + { + //'func1' is imported from the origion scope + scope.Exec( + "def func2():\n" + + " return func1() - cc - bb\n"); + dynamic func2 = scope.Get("func2"); + + var result1 = func2().As(); + Assert.AreEqual(0, result1); + + scope.Set("cc", 20);//it has no effect on the globals of 'func1' + var result2 = func2().As(); + Assert.AreEqual(-10, result2); + scope.Set("cc", 10); //rollback + + ps.Set("cc", 20); + var result3 = func2().As(); + Assert.AreEqual(10, result3); + ps.Set("cc", 10); //rollback + } + } + } + + /// + /// Import a python module into the session with a new name. + /// Equivalent to the Python "import .. as .." statement. + /// + [Test] + public void TestImportScopeByName() + { + using (Py.GIL()) + { + ps.Set("bb", 100); + + using (var scope = Py.CreateScope()) + { + scope.ImportAll("test"); + //scope.ImportModule("test"); + + Assert.IsTrue(scope.Contains("bb")); + } + } + } + + /// + /// Use the locals() and globals() method just like in python module + /// + [Test] + public void TestVariables() + { + (ps.Variables() as dynamic)["ee"] = new PyInt(200); + var a0 = ps.Get("ee"); + Assert.AreEqual(200, a0); + + ps.Exec("locals()['ee'] = 210"); + var a1 = ps.Get("ee"); + Assert.AreEqual(210, a1); + + ps.Exec("globals()['ee'] = 220"); + var a2 = ps.Get("ee"); + Assert.AreEqual(220, a2); + + using (var item = ps.Variables()) + { + item["ee"] = new PyInt(230); + } + var a3 = ps.Get("ee"); + Assert.AreEqual(230, a3); + } + + /// + /// Share a pyscope by multiple threads. + /// + [Test] + public void TestThread() + { + //After the proposal here https://github.com/pythonnet/pythonnet/pull/419 complished, + //the BeginAllowThreads statement blow and the last EndAllowThreads statement + //should be removed. + dynamic _ps = ps; + var ts = PythonEngine.BeginAllowThreads(); + using (Py.GIL()) + { + _ps.res = 0; + _ps.bb = 100; + _ps.th_cnt = 0; + //add function to the scope + //can be call many times, more efficient than ast + ps.Exec( + "def update():\n" + + " global res, th_cnt\n" + + " res += bb + 1\n" + + " th_cnt += 1\n" + ); + } + int th_cnt = 3; + for (int i =0; i< th_cnt; i++) + { + System.Threading.Thread th = new System.Threading.Thread(()=> + { + using (Py.GIL()) + { + //ps.GetVariable("update")(); //call the scope function dynamicly + _ps.update(); + } + }); + th.Start(); + } + //equivalent to Thread.Join, make the main thread join the GIL competition + int cnt = 0; + while(cnt != th_cnt) + { + using (Py.GIL()) + { + cnt = ps.Get("th_cnt"); + } + System.Threading.Thread.Sleep(10); + } + using (Py.GIL()) + { + var result = ps.Get("res"); + Assert.AreEqual(101* th_cnt, result); + } + PythonEngine.EndAllowThreads(ts); + } + } +} diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index 2fd66ad73..ee1a3c701 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -1,4 +1,4 @@ - + Debug @@ -127,6 +127,7 @@ + diff --git a/src/runtime/pyobject.cs b/src/runtime/pyobject.cs index 80704c59e..b7df2a924 100644 --- a/src/runtime/pyobject.cs +++ b/src/runtime/pyobject.cs @@ -96,6 +96,27 @@ public object AsManagedObject(Type t) } return result; } + + /// + /// As Method + /// + /// + /// Return a managed object of the given type, based on the + /// value of the Python object. + /// + public T As() + { + if (typeof(T) == typeof(PyObject) || typeof(T) == typeof(object)) + { + return (T)(this as object); + } + object result; + if (!Converter.ToManaged(obj, typeof(T), out result, false)) + { + throw new InvalidCastException("cannot convert object to target type"); + } + return (T)result; + } /// diff --git a/src/runtime/pyscope.cs b/src/runtime/pyscope.cs new file mode 100644 index 000000000..1991772dc --- /dev/null +++ b/src/runtime/pyscope.cs @@ -0,0 +1,655 @@ +using System; +using System.Linq; +using System.Collections.Generic; +using System.Dynamic; + +namespace Python.Runtime +{ + public class PyScopeException : Exception + { + public PyScopeException(string message) + : base(message) + { + + } + } + + /// + /// Classes/methods have this attribute must be used with GIL obtained. + /// + public class PyGILAttribute : Attribute + { + } + + [PyGIL] + public class PyScope : DynamicObject, IDisposable + { + public readonly string Name; + + /// + /// the python Module object the scope associated with. + /// + internal readonly IntPtr obj; + + /// + /// the variable dict of the scope. + /// + internal readonly IntPtr variables; + + private bool _isDisposed; + + /// + /// The Manager this scope associated with. + /// It provides scopes this scope can import. + /// + internal readonly PyScopeManager Manager; + + /// + /// event which will be triggered after the scope disposed. + /// + public event Action OnDispose; + + /// + /// Constructor + /// + /// + /// Create a scope based on a Python Module. + /// + internal PyScope(IntPtr ptr, PyScopeManager manager) + { + if (Runtime.PyObject_Type(ptr) != Runtime.PyModuleType) + { + throw new PyScopeException("object is not a module"); + } + Manager = manager ?? PyScopeManager.Global; + obj = ptr; + //Refcount of the variables not increase + variables = Runtime.PyModule_GetDict(obj); + if (variables == IntPtr.Zero) + { + throw new PythonException(); + } + Runtime.PyDict_SetItemString( + variables, "__builtins__", + Runtime.PyEval_GetBuiltins() + ); + this.Name = this.Get("__name__"); + } + + /// + /// return the variable dict of the scope. + /// + /// + public PyDict Variables() + { + Runtime.XIncref(variables); + return new PyDict(variables); + } + + /// + /// Create a scope, and import all from this scope + /// + /// + public PyScope NewScope() + { + var scope = Manager.Create(); + scope.ImportAll(this); + return scope; + } + + /// + /// Import method + /// + /// + /// Import a scope or a module of given name, + /// scope will be looked up first. + /// + public dynamic Import(string name, string asname = null) + { + Check(); + if (String.IsNullOrEmpty(asname)) + { + asname = name; + } + PyScope scope; + Manager.TryGet(name, out scope); + if (scope != null) + { + Import(scope, asname); + return scope; + } + else + { + PyObject module = PythonEngine.ImportModule(name); + Import(module, asname); + return module; + } + } + + /// + /// Import method + /// + /// + /// Import a scope as a variable of given name. + /// + public void Import(PyScope scope, string asname) + { + this.Set(asname, scope.obj); + } + + /// + /// Import Method + /// + /// + /// The 'import .. as ..' statement in Python. + /// Import a module as a variable into the scope. + /// + public void Import(PyObject module, string asname = null) + { + if (String.IsNullOrEmpty(asname)) + { + asname = module.GetAttr("__name__").As(); + } + Set(asname, module); + } + + /// + /// ImportAll Method + /// + /// + /// The 'import * from ..' statement in Python. + /// Import all content of a scope/module of given name into the scope, scope will be looked up first. + /// + public void ImportAll(string name) + { + PyScope scope; + Manager.TryGet(name, out scope); + if (scope != null) + { + ImportAll(scope); + return; + } + else + { + PyObject module = PythonEngine.ImportModule(name); + ImportAll(module); + } + } + + /// + /// ImportAll Method + /// + /// + /// Import all variables of the scope into this scope. + /// + public void ImportAll(PyScope scope) + { + int result = Runtime.PyDict_Update(variables, scope.variables); + if (result < 0) + { + throw new PythonException(); + } + } + + /// + /// ImportAll Method + /// + /// + /// Import all variables of the module into this scope. + /// + public void ImportAll(PyObject module) + { + if (Runtime.PyObject_Type(module.obj) != Runtime.PyModuleType) + { + throw new PyScopeException("object is not a module"); + } + var module_dict = Runtime.PyModule_GetDict(module.obj); + int result = Runtime.PyDict_Update(variables, module_dict); + if (result < 0) + { + throw new PythonException(); + } + } + + /// + /// ImportAll Method + /// + /// + /// Import all variables in the dictionary into this scope. + /// + public void ImportAll(PyDict dict) + { + int result = Runtime.PyDict_Update(variables, dict.obj); + if (result < 0) + { + throw new PythonException(); + } + } + + /// + /// Execute method + /// + /// + /// Execute a Python ast and return the result as a PyObject. + /// The ast can be either an expression or stmts. + /// + public PyObject Execute(PyObject script, PyDict locals = null) + { + Check(); + IntPtr _locals = locals == null ? variables : locals.obj; + IntPtr ptr = Runtime.PyEval_EvalCode(script.Handle, variables, _locals); + Runtime.CheckExceptionOccurred(); + if (ptr == Runtime.PyNone) + { + Runtime.XDecref(ptr); + return null; + } + return new PyObject(ptr); + } + + /// + /// Execute method + /// + /// + /// Execute a Python ast and return the result as a PyObject, + /// and convert the result to a Managed Object of given type. + /// The ast can be either an expression or stmts. + /// + public T Execute(PyObject script, PyDict locals = null) + { + Check(); + PyObject pyObj = Execute(script, locals); + if (pyObj == null) + { + return default(T); + } + var obj = pyObj.As(); + return obj; + } + + /// + /// Eval method + /// + /// + /// Evaluate a Python expression and return the result as a PyObject + /// or null if an exception is raised. + /// + public PyObject Eval(string code, PyDict locals = null) + { + Check(); + IntPtr _locals = locals == null ? variables : locals.obj; + var flag = (IntPtr)Runtime.Py_eval_input; + IntPtr ptr = Runtime.PyRun_String( + code, flag, variables, _locals + ); + Runtime.CheckExceptionOccurred(); + return new PyObject(ptr); + } + + /// + /// Evaluate a Python expression + /// + /// + /// Evaluate a Python expression + /// and convert the result to a Managed Object of given type. + /// + public T Eval(string code, PyDict locals = null) + { + Check(); + PyObject pyObj = Eval(code, locals); + var obj = pyObj.As(); + return obj; + } + + /// + /// Exec Method + /// + /// + /// Exec a Python script and save its local variables in the current local variable dict. + /// + public void Exec(string code, PyDict locals = null) + { + Check(); + IntPtr _locals = locals == null ? variables : locals.obj; + Exec(code, variables, _locals); + } + + private void Exec(string code, IntPtr _globals, IntPtr _locals) + { + var flag = (IntPtr)Runtime.Py_file_input; + IntPtr ptr = Runtime.PyRun_String( + code, flag, _globals, _locals + ); + Runtime.CheckExceptionOccurred(); + if (ptr != Runtime.PyNone) + { + throw new PythonException(); + } + Runtime.XDecref(ptr); + } + + /// + /// Set Variable Method + /// + /// + /// Add a new variable to the variables dict if it not exist + /// or update its value if the variable exists. + /// + public void Set(string name, object value) + { + IntPtr _value = Converter.ToPython(value, value?.GetType()); + Set(name, _value); + Runtime.XDecref(_value); + } + + private void Set(string name, IntPtr value) + { + Check(); + using (var pyKey = new PyString(name)) + { + int r = Runtime.PyObject_SetItem(variables, pyKey.obj, value); + if (r < 0) + { + throw new PythonException(); + } + } + } + + /// + /// Remove Method + /// + /// + /// Remove a variable from the variables dict. + /// + public void Remove(string name) + { + Check(); + using (var pyKey = new PyString(name)) + { + int r = Runtime.PyObject_DelItem(variables, pyKey.obj); + if (r < 0) + { + throw new PythonException(); + } + } + } + + /// + /// Contains Method + /// + /// + /// Returns true if the variable exists in the scope. + /// + public bool Contains(string name) + { + Check(); + using (var pyKey = new PyString(name)) + { + return Runtime.PyMapping_HasKey(variables, pyKey.obj) != 0; + } + } + + /// + /// Get Method + /// + /// + /// Returns the value of the variable of given name. + /// If the variable does not exist, throw an Exception. + /// + public PyObject Get(string name) + { + PyObject scope; + var state = TryGet(name, out scope); + if(!state) + { + throw new PyScopeException($"The scope of name '{Name}' has no attribute '{name}'"); + } + return scope; + } + + /// + /// TryGet Method + /// + /// + /// Returns the value of the variable, local variable first. + /// If the variable does not exist, return null. + /// + public bool TryGet(string name, out PyObject value) + { + Check(); + using (var pyKey = new PyString(name)) + { + if (Runtime.PyMapping_HasKey(variables, pyKey.obj) != 0) + { + IntPtr op = Runtime.PyObject_GetItem(variables, pyKey.obj); + if (op == IntPtr.Zero) + { + throw new PythonException(); + } + if (op == Runtime.PyNone) + { + Runtime.XDecref(op); + value = null; + return true; + } + value = new PyObject(op); + return true; + } + else + { + value = null; + return false; + } + } + } + + /// + /// Get Method + /// + /// + /// Obtain the value of the variable of given name, + /// and convert the result to a Managed Object of given type. + /// If the variable does not exist, throw an Exception. + /// + public T Get(string name) + { + Check(); + PyObject pyObj = Get(name); + if (pyObj == null) + { + return default(T); + } + return pyObj.As(); + } + + /// + /// TryGet Method + /// + /// + /// Obtain the value of the variable of given name, + /// and convert the result to a Managed Object of given type. + /// If the variable does not exist, return false. + /// + public bool TryGet(string name, out T value) + { + Check(); + PyObject pyObj; + var result = TryGet(name, out pyObj); + if (!result) + { + value = default(T); + return false; + } + if (pyObj == null) + { + if(typeof(T).IsValueType) + { + throw new PyScopeException($"The value of the attribute '{name}' is None which cannot be convert to '{typeof(T).ToString()}'"); + } + else + { + value = default(T); + return true; + } + } + value = pyObj.As(); + return true; + } + + public override bool TryGetMember(GetMemberBinder binder, out object result) + { + result = this.Get(binder.Name); + return true; + } + + public override bool TrySetMember(SetMemberBinder binder, object value) + { + this.Set(binder.Name, value); + return true; + } + + private void Check() + { + if (_isDisposed) + { + throw new PyScopeException($"The scope of name '{Name}' object has been disposed"); + } + } + + public void Dispose() + { + if (_isDisposed) + { + return; + } + _isDisposed = true; + Runtime.XDecref(obj); + this.OnDispose?.Invoke(this); + } + + ~PyScope() + { + Dispose(); + } + } + + public class PyScopeManager + { + public readonly static PyScopeManager Global = new PyScopeManager(); + + private Dictionary NamedScopes = new Dictionary(); + + internal PyScope NewScope(string name) + { + if (name == null) + { + name = ""; + } + var module = Runtime.PyModule_New(name); + if (module == IntPtr.Zero) + { + throw new PythonException(); + } + return new PyScope(module, this); + } + + /// + /// Create Method + /// + /// + /// Create an anonymous scope. + /// + [PyGIL] + public PyScope Create() + { + var scope = this.NewScope(null); + return scope; + } + + /// + /// Create Method + /// + /// + /// Create an named scope of given name. + /// + [PyGIL] + public PyScope Create(string name) + { + if (String.IsNullOrEmpty(name)) + { + throw new ArgumentNullException(nameof(name)); + } + if (name != null && Contains(name)) + { + throw new PyScopeException($"A scope of name '{name}' does already exist"); + } + var scope = this.NewScope(name); + scope.OnDispose += Remove; + NamedScopes[name] = scope; + return scope; + } + + /// + /// Contains Method + /// + /// + /// return true if the scope exists in this manager. + /// + public bool Contains(string name) + { + return NamedScopes.ContainsKey(name); + } + + /// + /// Get Method + /// + /// + /// Find the scope in this manager. + /// If the scope not exist, an Exception will be thrown. + /// + public PyScope Get(string name) + { + if (String.IsNullOrEmpty(name)) + { + throw new ArgumentNullException(nameof(name)); + } + if (NamedScopes.ContainsKey(name)) + { + return NamedScopes[name]; + } + throw new PyScopeException($"There is no scope named '{name}' registered in this manager"); + } + + /// + /// Get Method + /// + /// + /// Try to find the scope in this manager. + /// + public bool TryGet(string name, out PyScope scope) + { + return NamedScopes.TryGetValue(name, out scope); + } + + /// + /// Remove Method + /// + /// + /// remove the scope from this manager. + /// + public void Remove(PyScope scope) + { + NamedScopes.Remove(scope.Name); + } + + [PyGIL] + public void Clear() + { + var scopes = NamedScopes.Values.ToList(); + foreach (var scope in scopes) + { + scope.Dispose(); + } + } + } +} diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index 9ddd85da6..556da698f 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -294,6 +294,7 @@ public static void Shutdown() { if (initialized) { + PyScopeManager.Global.Clear(); Marshal.FreeHGlobal(_pythonHome); _pythonHome = IntPtr.Zero; Marshal.FreeHGlobal(_programName); @@ -421,6 +422,13 @@ public static PyObject ModuleFromString(string name, string code) return new PyObject(m); } + public static PyObject Compile(string code, string filename = "", RunFlagType mode = RunFlagType.File) + { + var flag = (IntPtr)mode; + IntPtr ptr = Runtime.Py_CompileString(code, filename, flag); + Runtime.CheckExceptionOccurred(); + return new PyObject(ptr); + } /// /// Eval Method @@ -539,6 +547,18 @@ public static GILState GIL() return new GILState(); } + public static PyScope CreateScope() + { + var scope = PyScopeManager.Global.Create(); + return scope; + } + + public static PyScope CreateScope(string name) + { + var scope = PyScopeManager.Global.Create(name); + return scope; + } + public class GILState : IDisposable { private IntPtr state; diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 9ee693cf3..a24b6f6d4 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -707,6 +707,9 @@ public static extern int Py_Main( [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyRun_String(string code, IntPtr st, IntPtr globals, IntPtr locals); + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + internal static extern IntPtr PyEval_EvalCode(IntPtr co, IntPtr globals, IntPtr locals); + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_CompileString(string code, string file, IntPtr tok); From bfce5e299d89b4d6082e4a9664ea3a107f7cc4aa Mon Sep 17 00:00:00 2001 From: testrunner123 Date: Wed, 14 Jun 2017 13:50:56 +0200 Subject: [PATCH 262/324] Fix missing Incref for Namespace and Assembly (#482) Fix crash of python interpreter 3.5 64-bit in garbage collector --- AUTHORS.md | 2 ++ CHANGELOG.md | 11 +++++------ src/runtime/typemanager.cs | 2 ++ src/tests/test_subclass.py | 3 --- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/AUTHORS.md b/AUTHORS.md index d715eed6f..9f4060c25 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -43,3 +43,5 @@ - ([@rico-chet](https://github.com/rico-chet)) - ([@rmadsen-ks](https://github.com/rmadsen-ks)) - ([@stonebig](https://github.com/stonebig)) +- ([@testrunner123](https://github.com/testrunner123)) + diff --git a/CHANGELOG.md b/CHANGELOG.md index c8b54b36d..728c8c69b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,19 +8,18 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ## [unreleased][] ### Added -- Added clr.GetClrType (#432)(#433) -- Allowed passing None for nullable args (#460) +- Added `clr.GetClrType` (#432, #433) +- Allowed passing `None` for nullable args (#460) - Added keyword arguments based on C# syntax for calling CPython methods (#461) - ### Changed -- Changed `Bar` feature - ### Fixed - Fixed Visual Studio 2017 compat (#434) for setup.py -- Fixed `FooBar` bug +- Fixed crash on exit of the Python interpreter if a python class + derived from a .NET class has a `__namespace__` or `__assembly__` + attribute (#481) ## [2.3.0][] - 2017-03-11 diff --git a/src/runtime/typemanager.cs b/src/runtime/typemanager.cs index 6f373f036..ad0fddcc1 100644 --- a/src/runtime/typemanager.cs +++ b/src/runtime/typemanager.cs @@ -206,6 +206,7 @@ internal static IntPtr CreateSubType(IntPtr py_name, IntPtr py_base_type, IntPtr if (0 != Runtime.PyMapping_HasKey(py_dict, assemblyKey.Handle)) { var pyAssembly = new PyObject(Runtime.PyDict_GetItem(py_dict, assemblyKey.Handle)); + Runtime.XIncref(pyAssembly.Handle); disposeList.Add(pyAssembly); if (!Converter.ToManagedValue(pyAssembly.Handle, typeof(string), out assembly, false)) { @@ -218,6 +219,7 @@ internal static IntPtr CreateSubType(IntPtr py_name, IntPtr py_base_type, IntPtr if (0 != Runtime.PyMapping_HasKey(py_dict, namespaceKey.Handle)) { var pyNamespace = new PyObject(Runtime.PyDict_GetItem(py_dict, namespaceKey.Handle)); + Runtime.XIncref(pyNamespace.Handle); disposeList.Add(pyNamespace); if (!Converter.ToManagedValue(pyNamespace.Handle, typeof(string), out namespaceStr, false)) { diff --git a/src/tests/test_subclass.py b/src/tests/test_subclass.py index 8e862a56d..739c24c07 100644 --- a/src/tests/test_subclass.py +++ b/src/tests/test_subclass.py @@ -85,7 +85,6 @@ def OnTestEvent(self, value): return DerivedEventTest -@pytest.mark.skip(reason="FIXME: test randomly pass/fails") def test_base_class(): """Test base class managed type""" ob = SubClassTest() @@ -98,7 +97,6 @@ def test_base_class(): assert list(SubClassTest.test_list(ob)) == ["a", "b", "c"] -@pytest.mark.skip(reason="FIXME: test randomly pass/fails") def test_interface(): """Test python classes can derive from C# interfaces""" InterfaceTestClass = interface_test_class_fixture() @@ -112,7 +110,6 @@ def test_interface(): assert id(x) == id(ob) -@pytest.mark.skip(reason="FIXME: test randomly pass/fails") def test_derived_class(): """Test python class derived from managed type""" DerivedClass = derived_class_fixture() From d39f9f6e0ce20f1f3946394559b4206e93880128 Mon Sep 17 00:00:00 2001 From: Konstantin Date: Wed, 14 Jun 2017 17:18:46 +0300 Subject: [PATCH 263/324] Fix conversion of 'float' and 'double' values (#487) * Fix conversion of 'float' and 'double' values Fix problem of conversion 'float' and 'double' values in converter.cs. As there was a range check both for 'float' and 'double' values, which are less or greater than its 'MinValue' and 'MaxValue' accordingly, several values like 'float.NegativeInfinity', 'float.PositiveInfinity' and the same 'double' values cannot be converted from Python to .NET values. Add error check after 'PyFloat_AsDouble' call. Due to Python C API documentation, method 'PyFloat_AsDouble' can return '-1.0' upon failure. So it requires error check. This rule forces to check for error and throw exception in case of error. Add tests, which cover problem of conversion 'float' and 'double' values. Resolves: #486. * Fix failing 'test_double_conversion' test Fix incorrect part of 'test_double_conversion' test in test_conversion.py. An 'OverflowError' was expected for valid values, which represent Python 'inf' and '-inf'. The problem was identified with support of conversion for Python 'inf' and '-inf' to .NET System.Double PositiveInfinity and NegativeInfinity. See also: #487. --- AUTHORS.md | 1 + CHANGELOG.md | 2 + src/embed_tests/Python.EmbeddingTest.csproj | 1 + src/embed_tests/TestConverter.cs | 48 +++++++++++++++++++++ src/runtime/converter.cs | 11 ++--- src/tests/test_conversion.py | 11 ----- 6 files changed, 58 insertions(+), 16 deletions(-) create mode 100644 src/embed_tests/TestConverter.cs diff --git a/AUTHORS.md b/AUTHORS.md index 9f4060c25..434c57801 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -27,6 +27,7 @@ - Joe Frayne ([@jfrayne](https://github.com/jfrayne)) - John Burnett ([@johnburnett](https://github.com/johnburnett)) - Luke Stratman ([@lstratman](https://github.com/lstratman)) +- Konstantin Posudevskiy ([@konstantin-posudevskiy](https://github.com/konstantin-posudevskiy)) - Matthias Dittrich ([@matthid](https://github.com/matthid)) - Patrick Stewart ([@patstew](https://github.com/patstew)) - Raphael Nestler ([@rnestler](https://github.com/rnestler)) diff --git a/CHANGELOG.md b/CHANGELOG.md index 728c8c69b..f3bcdfe16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,8 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Fixed crash on exit of the Python interpreter if a python class derived from a .NET class has a `__namespace__` or `__assembly__` attribute (#481) +- Fixed conversion of 'float' and 'double' values (#486) + ## [2.3.0][] - 2017-03-11 diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index fc887d815..d45c622f9 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -84,6 +84,7 @@ + diff --git a/src/embed_tests/TestConverter.cs b/src/embed_tests/TestConverter.cs new file mode 100644 index 000000000..346c8afdc --- /dev/null +++ b/src/embed_tests/TestConverter.cs @@ -0,0 +1,48 @@ +using NUnit.Framework; +using Python.Runtime; + +namespace Python.EmbeddingTest +{ + public class TestConverter + { + [OneTimeSetUp] + public void SetUp() + { + PythonEngine.Initialize(); + } + + [OneTimeTearDown] + public void Dispose() + { + PythonEngine.Shutdown(); + } + + [Test] + public void TestConvertSingleToManaged( + [Values(float.PositiveInfinity, float.NegativeInfinity, float.MinValue, float.MaxValue, float.NaN, + float.Epsilon)] float testValue) + { + var pyFloat = new PyFloat(testValue); + + object convertedValue; + var converted = Converter.ToManaged(pyFloat.Handle, typeof(float), out convertedValue, false); + + Assert.IsTrue(converted); + Assert.IsTrue(((float) convertedValue).Equals(testValue)); + } + + [Test] + public void TestConvertDoubleToManaged( + [Values(double.PositiveInfinity, double.NegativeInfinity, double.MinValue, double.MaxValue, double.NaN, + double.Epsilon)] double testValue) + { + var pyFloat = new PyFloat(testValue); + + object convertedValue; + var converted = Converter.ToManaged(pyFloat.Handle, typeof(double), out convertedValue, false); + + Assert.IsTrue(converted); + Assert.IsTrue(((double) convertedValue).Equals(testValue)); + } + } +} diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index 0bf882cc5..5179c849b 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -770,10 +770,14 @@ private static bool ToPrimitive(IntPtr value, Type obType, out object result, bo goto type_error; } double dd = Runtime.PyFloat_AsDouble(op); + Runtime.CheckExceptionOccurred(); Runtime.XDecref(op); if (dd > Single.MaxValue || dd < Single.MinValue) { - goto overflow; + if (!double.IsInfinity(dd)) + { + goto overflow; + } } result = (float)dd; return true; @@ -785,11 +789,8 @@ private static bool ToPrimitive(IntPtr value, Type obType, out object result, bo goto type_error; } double d = Runtime.PyFloat_AsDouble(op); + Runtime.CheckExceptionOccurred(); Runtime.XDecref(op); - if (d > Double.MaxValue || d < Double.MinValue) - { - goto overflow; - } result = d; return true; } diff --git a/src/tests/test_conversion.py b/src/tests/test_conversion.py index 9152e30d0..53e5d8051 100644 --- a/src/tests/test_conversion.py +++ b/src/tests/test_conversion.py @@ -466,17 +466,6 @@ def test_double_conversion(): with pytest.raises(TypeError): ConversionTest().DoubleField = None - with pytest.raises(OverflowError): - ConversionTest().DoubleField = 1.7976931348623159e308 - - with pytest.raises(OverflowError): - ConversionTest().DoubleField = -1.7976931348623159e308 - - with pytest.raises(OverflowError): - _ = System.Double(1.7976931348623159e308) - - with pytest.raises(OverflowError): - _ = System.Double(-1.7976931348623159e308) def test_decimal_conversion(): From 12af79445d4ca7cc37e5da8e7d8672f7f7729b1b Mon Sep 17 00:00:00 2001 From: Rickard Holmberg Date: Fri, 16 Jun 2017 15:19:39 +0200 Subject: [PATCH 264/324] clrmethod working for python 2 (#494) * Add Runtime.PyObject_IsIterable and fix PyIter_Check for Python 2 * Add test_clrmethod.py and update AUTHORS and CHANGELOG * Fix test docstrings * Use IntPtr.Zero instead of null for comparisons with IntPtrs * Add test on Runtime.PyObject_IsIterable and Runtime.PyIter_Check * Use the already defined TypeFlags.HaveIter instead of redefining it * Add PyIter_Check and PyObject_IsIterable tests on threading.Lock, which does not have type feature iter * Move the tests from test_runtime.py to TestRuntime.py --- AUTHORS.md | 1 + CHANGELOG.md | 1 + src/embed_tests/TestRuntime.cs | 43 +++++++++++++++++++- src/runtime/pyobject.cs | 2 +- src/runtime/runtime.cs | 39 ++++++++++++------ src/tests/test_clrmethod.py | 73 ++++++++++++++++++++++++++++++++++ 6 files changed, 144 insertions(+), 15 deletions(-) create mode 100644 src/tests/test_clrmethod.py diff --git a/AUTHORS.md b/AUTHORS.md index 434c57801..78bb25f9e 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -31,6 +31,7 @@ - Matthias Dittrich ([@matthid](https://github.com/matthid)) - Patrick Stewart ([@patstew](https://github.com/patstew)) - Raphael Nestler ([@rnestler](https://github.com/rnestler)) +- Rickard Holmberg ([@rickardraysearch](https://github.com/rickardraysearch)) - Sam Winstanley ([@swinstanley](https://github.com/swinstanley)) - Sean Freitag ([@cowboygneox](https://github.com/cowboygneox)) - Serge Weinstock ([@sweinst](https://github.com/sweinst)) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3bcdfe16..38fa56a62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. derived from a .NET class has a `__namespace__` or `__assembly__` attribute (#481) - Fixed conversion of 'float' and 'double' values (#486) +- Fixed 'clrmethod' for python 2 (#492) ## [2.3.0][] - 2017-03-11 diff --git a/src/embed_tests/TestRuntime.cs b/src/embed_tests/TestRuntime.cs index 22e6db0a9..2e0598da7 100644 --- a/src/embed_tests/TestRuntime.cs +++ b/src/embed_tests/TestRuntime.cs @@ -1,4 +1,4 @@ -using System; +using System; using NUnit.Framework; using Python.Runtime; @@ -47,5 +47,46 @@ public static void RefCountTest() Runtime.Runtime.Py_Finalize(); } + + [Test] + public static void PyCheck_Iter_PyObject_IsIterable_Test() + { + Runtime.Runtime.Py_Initialize(); + + // Tests that a python list is an iterable, but not an iterator + var pyList = Runtime.Runtime.PyList_New(0); + Assert.IsFalse(Runtime.Runtime.PyIter_Check(pyList)); + Assert.IsTrue(Runtime.Runtime.PyObject_IsIterable(pyList)); + + // Tests that a python list iterator is both an iterable and an iterator + var pyListIter = Runtime.Runtime.PyObject_GetIter(pyList); + Assert.IsTrue(Runtime.Runtime.PyObject_IsIterable(pyListIter)); + Assert.IsTrue(Runtime.Runtime.PyIter_Check(pyListIter)); + + // Tests that a python float is neither an iterable nor an iterator + var pyFloat = Runtime.Runtime.PyFloat_FromDouble(2.73); + Assert.IsFalse(Runtime.Runtime.PyObject_IsIterable(pyFloat)); + Assert.IsFalse(Runtime.Runtime.PyIter_Check(pyFloat)); + + Runtime.Runtime.Py_Finalize(); + } + + [Test] + public static void PyCheck_Iter_PyObject_IsIterable_ThreadingLock_Test() + { + Runtime.Runtime.Py_Initialize(); + + // Create an instance of threading.Lock, which is one of the very few types that does not have the + // TypeFlags.HaveIter set in Python 2. This tests a different code path in PyObject_IsIterable and PyIter_Check. + var threading = Runtime.Runtime.PyImport_ImportModule("threading"); + var threadingDict = Runtime.Runtime.PyModule_GetDict(threading); + var lockType = Runtime.Runtime.PyDict_GetItemString(threadingDict, "Lock"); + var lockInstance = Runtime.Runtime.PyObject_CallObject(lockType, Runtime.Runtime.PyTuple_New(0)); + + Assert.IsFalse(Runtime.Runtime.PyObject_IsIterable(lockInstance)); + Assert.IsFalse(Runtime.Runtime.PyIter_Check(lockInstance)); + + Runtime.Runtime.Py_Finalize(); + } } } diff --git a/src/runtime/pyobject.cs b/src/runtime/pyobject.cs index b7df2a924..1b41b0893 100644 --- a/src/runtime/pyobject.cs +++ b/src/runtime/pyobject.cs @@ -802,7 +802,7 @@ public bool IsCallable() /// public bool IsIterable() { - return Runtime.PyIter_Check(obj); + return Runtime.PyObject_IsIterable(obj); } diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index a24b6f6d4..73caeb854 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Runtime.InteropServices; using System.Security; using System.Text; @@ -274,11 +274,10 @@ internal static void Initialize() Error = new IntPtr(-1); -#if PYTHON3 IntPtr dllLocal = IntPtr.Zero; if (PythonDll != "__Internal") { - NativeMethods.LoadLibrary(PythonDll); + dllLocal = NativeMethods.LoadLibrary(PythonDll); } _PyObject_NextNotImplemented = NativeMethods.GetProcAddress(dllLocal, "_PyObject_NextNotImplemented"); #if !(MONO_LINUX || MONO_OSX) @@ -286,7 +285,6 @@ internal static void Initialize() { NativeMethods.FreeLibrary(dllLocal); } -#endif #endif // Initialize modules that depend on the runtime class. @@ -349,8 +347,8 @@ internal static int AtExit() #if PYTHON3 internal static IntPtr PyBytesType; - internal static IntPtr _PyObject_NextNotImplemented; #endif + internal static IntPtr _PyObject_NextNotImplemented; internal static IntPtr PyNotImplemented; internal const int Py_LT = 0; @@ -780,6 +778,21 @@ internal static string PyObject_GetTypeName(IntPtr op) return Marshal.PtrToStringAnsi(ppName); } + /// + /// Test whether the Python object is an iterable. + /// + internal static bool PyObject_IsIterable(IntPtr pointer) + { + var ob_type = Marshal.ReadIntPtr(pointer, ObjectOffset.ob_type); +#if PYTHON2 + long tp_flags = Marshal.ReadInt64(ob_type, TypeOffset.tp_flags); + if ((tp_flags & TypeFlags.HaveIter) == 0) + return false; +#endif + IntPtr tp_iter = Marshal.ReadIntPtr(ob_type, TypeOffset.tp_iter); + return tp_iter != IntPtr.Zero; + } + [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_HasAttrString(IntPtr pointer, string name); @@ -1425,17 +1438,17 @@ internal static bool PyTuple_Check(IntPtr ob) // Python iterator API //==================================================================== -#if PYTHON2 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] - internal static extern bool PyIter_Check(IntPtr pointer); -#elif PYTHON3 internal static bool PyIter_Check(IntPtr pointer) { - var ob_type = (IntPtr)Marshal.PtrToStructure(pointer + ObjectOffset.ob_type, typeof(IntPtr)); - IntPtr tp_iternext = ob_type + TypeOffset.tp_iternext; - return tp_iternext != null && tp_iternext != _PyObject_NextNotImplemented; - } + var ob_type = Marshal.ReadIntPtr(pointer, ObjectOffset.ob_type); +#if PYTHON2 + long tp_flags = Marshal.ReadInt64(ob_type, TypeOffset.tp_flags); + if ((tp_flags & TypeFlags.HaveIter) == 0) + return false; #endif + IntPtr tp_iternext = Marshal.ReadIntPtr(ob_type, TypeOffset.tp_iternext); + return tp_iternext != IntPtr.Zero && tp_iternext != _PyObject_NextNotImplemented; + } [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyIter_Next(IntPtr pointer); diff --git a/src/tests/test_clrmethod.py b/src/tests/test_clrmethod.py new file mode 100644 index 000000000..a6078bece --- /dev/null +++ b/src/tests/test_clrmethod.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- + +"""Test clrmethod and clrproperty support for calling methods and getting/setting python properties from CLR.""" + +import Python.Test as Test +import System +import pytest +import clr + +class ExampleClrClass(System.Object): + __namespace__ = "PyTest" + def __init__(self): + self._x = 3 + @clr.clrmethod(int, [int]) + def test(self, x): + return x*2 + + def get_X(self): + return self._x + def set_X(self, value): + self._x = value + X = clr.clrproperty(int, get_X, set_X) + + @clr.clrproperty(int) + def Y(self): + return self._x * 2 + +def test_set_and_get_property_from_py(): + """Test setting and getting clr-accessible properties from python.""" + t = ExampleClrClass() + assert t.X == 3 + assert t.Y == 3 * 2 + t.X = 4 + assert t.X == 4 + assert t.Y == 4 * 2 + +def test_set_and_get_property_from_clr(): + """Test setting and getting clr-accessible properties from the clr.""" + t = ExampleClrClass() + assert t.GetType().GetProperty("X").GetValue(t) == 3 + assert t.GetType().GetProperty("Y").GetValue(t) == 3 * 2 + t.GetType().GetProperty("X").SetValue(t, 4) + assert t.GetType().GetProperty("X").GetValue(t) == 4 + assert t.GetType().GetProperty("Y").GetValue(t) == 4 * 2 + + +def test_set_and_get_property_from_clr_and_py(): + """Test setting and getting clr-accessible properties alternatingly from the clr and from python.""" + t = ExampleClrClass() + assert t.GetType().GetProperty("X").GetValue(t) == 3 + assert t.GetType().GetProperty("Y").GetValue(t) == 3 * 2 + assert t.X == 3 + assert t.Y == 3 * 2 + t.GetType().GetProperty("X").SetValue(t, 4) + assert t.GetType().GetProperty("X").GetValue(t) == 4 + assert t.GetType().GetProperty("Y").GetValue(t) == 4 * 2 + assert t.X == 4 + assert t.Y == 4 * 2 + t.X = 5 + assert t.GetType().GetProperty("X").GetValue(t) == 5 + assert t.GetType().GetProperty("Y").GetValue(t) == 5 * 2 + assert t.X == 5 + assert t.Y == 5 * 2 + +def test_method_invocation_from_py(): + """Test calling a clr-accessible method from python.""" + t = ExampleClrClass() + assert t.test(41) == 41*2 + +def test_method_invocation_from_clr(): + """Test calling a clr-accessible method from the clr.""" + t = ExampleClrClass() + assert t.GetType().GetMethod("test").Invoke(t, [37]) == 37*2 From c8ae358a8820e140693933287c83871e1c0d8fea Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Tue, 20 Jun 2017 08:36:22 +0200 Subject: [PATCH 265/324] Fix check so that we don't leak a reference. (#500) `PyObject_TYPE` does not `Incref` the type object returned, in contrast to `PyObject_Type`, which was used here before. --- src/runtime/pyscope.cs | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/runtime/pyscope.cs b/src/runtime/pyscope.cs index 1991772dc..25282ac26 100644 --- a/src/runtime/pyscope.cs +++ b/src/runtime/pyscope.cs @@ -57,7 +57,7 @@ public class PyScope : DynamicObject, IDisposable /// internal PyScope(IntPtr ptr, PyScopeManager manager) { - if (Runtime.PyObject_Type(ptr) != Runtime.PyModuleType) + if (!Runtime.PyType_IsSubtype(Runtime.PyObject_TYPE(ptr), Runtime.PyModuleType)) { throw new PyScopeException("object is not a module"); } @@ -65,10 +65,8 @@ internal PyScope(IntPtr ptr, PyScopeManager manager) obj = ptr; //Refcount of the variables not increase variables = Runtime.PyModule_GetDict(obj); - if (variables == IntPtr.Zero) - { - throw new PythonException(); - } + Runtime.CheckExceptionOccurred(); + Runtime.PyDict_SetItemString( variables, "__builtins__", Runtime.PyEval_GetBuiltins() @@ -123,7 +121,7 @@ public dynamic Import(string name, string asname = null) PyObject module = PythonEngine.ImportModule(name); Import(module, asname); return module; - } + } } /// @@ -290,7 +288,7 @@ public PyObject Eval(string code, PyDict locals = null) /// Evaluate a Python expression /// /// - /// Evaluate a Python expression + /// Evaluate a Python expression /// and convert the result to a Managed Object of given type. /// public T Eval(string code, PyDict locals = null) @@ -400,7 +398,7 @@ public PyObject Get(string name) { PyObject scope; var state = TryGet(name, out scope); - if(!state) + if (!state) { throw new PyScopeException($"The scope of name '{Name}' has no attribute '{name}'"); } @@ -447,7 +445,7 @@ public bool TryGet(string name, out PyObject value) /// Get Method /// /// - /// Obtain the value of the variable of given name, + /// Obtain the value of the variable of given name, /// and convert the result to a Managed Object of given type. /// If the variable does not exist, throw an Exception. /// @@ -466,7 +464,7 @@ public T Get(string name) /// TryGet Method /// /// - /// Obtain the value of the variable of given name, + /// Obtain the value of the variable of given name, /// and convert the result to a Managed Object of given type. /// If the variable does not exist, return false. /// @@ -479,10 +477,10 @@ public bool TryGet(string name, out T value) { value = default(T); return false; - } + } if (pyObj == null) { - if(typeof(T).IsValueType) + if (typeof(T).IsValueType) { throw new PyScopeException($"The value of the attribute '{name}' is None which cannot be convert to '{typeof(T).ToString()}'"); } @@ -490,7 +488,7 @@ public bool TryGet(string name, out T value) { value = default(T); return true; - } + } } value = pyObj.As(); return true; From a5f5dc2c2c1b4c5e40e01c069ed6b6d5d6ceb5fa Mon Sep 17 00:00:00 2001 From: Rickard Holmberg Date: Mon, 26 Jun 2017 12:29:00 +0200 Subject: [PATCH 266/324] Another shot at #495 (#503) * Add tests of subclassing with __namespace__ * Remove __init__ call from ClassDerived.InvokeCtor * Trying out __init__ * Cleanup * Add tests constructing python type from CLR and calling __init__ * Revert borked changelog update * Don't leak init reference * Rename tests * Remove unused internal Runtime.GetBoundArgTuple * Reenable skipped tests in test_subclass.py --- CHANGELOG.md | 1 + src/runtime/classderived.cs | 36 +--------------- src/runtime/metatype.cs | 18 ++------ src/runtime/runtime.cs | 23 ----------- src/tests/test_subclass.py | 82 ++++++++++++++++++++++++++++++------- 5 files changed, 74 insertions(+), 86 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 38fa56a62..5ae62d692 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. attribute (#481) - Fixed conversion of 'float' and 'double' values (#486) - Fixed 'clrmethod' for python 2 (#492) +- Fixed double calling of constructor when deriving from .NET class (#495) ## [2.3.0][] - 2017-03-11 diff --git a/src/runtime/classderived.cs b/src/runtime/classderived.cs index c180f9acc..16d3b99db 100644 --- a/src/runtime/classderived.cs +++ b/src/runtime/classderived.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -808,7 +808,6 @@ public static void InvokeCtor(IPythonDerivedType obj, string origCtorName, objec obj, args); - var disposeList = new List(); CLRObject self = null; IntPtr gs = Runtime.PyGILState_Ensure(); try @@ -821,42 +820,9 @@ public static void InvokeCtor(IPythonDerivedType obj, string origCtorName, objec // object to be collected. FieldInfo fi = obj.GetType().GetField("__pyobj__"); fi.SetValue(obj, self); - - Runtime.XIncref(self.pyHandle); - var pyself = new PyObject(self.pyHandle); - disposeList.Add(pyself); - - Runtime.XIncref(Runtime.PyNone); - var pynone = new PyObject(Runtime.PyNone); - disposeList.Add(pynone); - - // call __init__ - PyObject init = pyself.GetAttr("__init__", pynone); - disposeList.Add(init); - if (init.Handle != Runtime.PyNone) - { - // if __init__ hasn't been overridden then it will be a managed object - ManagedType managedMethod = ManagedType.GetManagedObject(init.Handle); - if (null == managedMethod) - { - var pyargs = new PyObject[args.Length]; - for (var i = 0; i < args.Length; ++i) - { - pyargs[i] = new PyObject(Converter.ToPython(args[i], args[i]?.GetType())); - disposeList.Add(pyargs[i]); - } - - disposeList.Add(init.Invoke(pyargs)); - } - } } finally { - foreach (PyObject x in disposeList) - { - x?.Dispose(); - } - // Decrement the python object's reference count. // This doesn't actually destroy the object, it just sets the reference to this object // to be a weak reference and it will be destroyed when the C# object is destroyed. diff --git a/src/runtime/metatype.cs b/src/runtime/metatype.cs index bfb71e26d..25e9817bd 100644 --- a/src/runtime/metatype.cs +++ b/src/runtime/metatype.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Runtime.InteropServices; namespace Python.Runtime @@ -157,23 +157,13 @@ public static IntPtr tp_call(IntPtr tp, IntPtr args, IntPtr kw) return IntPtr.Zero; } - IntPtr py__init__ = Runtime.PyString_FromString("__init__"); - IntPtr type = Runtime.PyObject_TYPE(obj); - IntPtr init = Runtime._PyType_Lookup(type, py__init__); - Runtime.XDecref(py__init__); + var init = Runtime.PyObject_GetAttrString(obj, "__init__"); Runtime.PyErr_Clear(); if (init != IntPtr.Zero) { - IntPtr bound = Runtime.GetBoundArgTuple(obj, args); - if (bound == IntPtr.Zero) - { - Runtime.XDecref(obj); - return IntPtr.Zero; - } - - IntPtr result = Runtime.PyObject_Call(init, bound, kw); - Runtime.XDecref(bound); + IntPtr result = Runtime.PyObject_Call(init, args, kw); + Runtime.XDecref(init); if (result == IntPtr.Zero) { diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 73caeb854..3d1078805 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -378,29 +378,6 @@ internal static void CheckExceptionOccurred() } } - internal static IntPtr GetBoundArgTuple(IntPtr obj, IntPtr args) - { - if (PyObject_TYPE(args) != PyTupleType) - { - Exceptions.SetError(Exceptions.TypeError, "tuple expected"); - return IntPtr.Zero; - } - int size = PyTuple_Size(args); - IntPtr items = PyTuple_New(size + 1); - PyTuple_SetItem(items, 0, obj); - XIncref(obj); - - for (var i = 0; i < size; i++) - { - IntPtr item = PyTuple_GetItem(args, i); - XIncref(item); - PyTuple_SetItem(items, i + 1, item); - } - - return items; - } - - internal static IntPtr ExtendTuple(IntPtr t, params IntPtr[] args) { int size = PyTuple_Size(t); diff --git a/src/tests/test_subclass.py b/src/tests/test_subclass.py index 739c24c07..43d013c7c 100644 --- a/src/tests/test_subclass.py +++ b/src/tests/test_subclass.py @@ -15,12 +15,12 @@ from ._compat import range -def interface_test_class_fixture(): +def interface_test_class_fixture(subnamespace): """Delay creation of class until test starts.""" class InterfaceTestClass(IInterfaceTest): """class that implements the test interface""" - __namespace__ = "Python.Test" + __namespace__ = "Python.Test." + subnamespace def foo(self): return "InterfaceTestClass" @@ -31,12 +31,12 @@ def bar(self, x, i): return InterfaceTestClass -def derived_class_fixture(): +def derived_class_fixture(subnamespace): """Delay creation of class until test starts.""" class DerivedClass(SubClassTest): """class that derives from a class deriving from IInterfaceTest""" - __namespace__ = "Python.Test" + __namespace__ = "Python.Test." + subnamespace def foo(self): return "DerivedClass" @@ -60,12 +60,12 @@ def return_list(self): return DerivedClass -def derived_event_test_class_fixture(): +def derived_event_test_class_fixture(subnamespace): """Delay creation of class until test starts.""" class DerivedEventTest(IInterfaceTest): """class that implements IInterfaceTest.TestEvent""" - __namespace__ = "Python.Test" + __namespace__ = "Python.Test." + subnamespace def __init__(self): self.event_handlers = [] @@ -99,7 +99,7 @@ def test_base_class(): def test_interface(): """Test python classes can derive from C# interfaces""" - InterfaceTestClass = interface_test_class_fixture() + InterfaceTestClass = interface_test_class_fixture(test_interface.__name__) ob = InterfaceTestClass() assert ob.foo() == "InterfaceTestClass" assert FunctionsTest.test_foo(ob) == "InterfaceTestClass" @@ -112,7 +112,7 @@ def test_interface(): def test_derived_class(): """Test python class derived from managed type""" - DerivedClass = derived_class_fixture() + DerivedClass = derived_class_fixture(test_derived_class.__name__) ob = DerivedClass() assert ob.foo() == "DerivedClass" assert ob.base_foo() == "foo" @@ -128,10 +128,9 @@ def test_derived_class(): assert id(x) == id(ob) -@pytest.mark.skip(reason="FIXME: test randomly pass/fails") def test_create_instance(): """Test derived instances can be created from managed code""" - DerivedClass = derived_class_fixture() + DerivedClass = derived_class_fixture(test_create_instance.__name__) ob = FunctionsTest.create_instance(DerivedClass) assert ob.foo() == "DerivedClass" assert FunctionsTest.test_foo(ob) == "DerivedClass" @@ -142,7 +141,7 @@ def test_create_instance(): x = FunctionsTest.pass_through(ob) assert id(x) == id(ob) - InterfaceTestClass = interface_test_class_fixture() + InterfaceTestClass = interface_test_class_fixture(test_create_instance.__name__) ob2 = FunctionsTest.create_instance(InterfaceTestClass) assert ob2.foo() == "InterfaceTestClass" assert FunctionsTest.test_foo(ob2) == "InterfaceTestClass" @@ -153,7 +152,6 @@ def test_create_instance(): assert id(y) == id(ob2) -@pytest.mark.skip(reason="FIXME: test randomly pass/fails") def test_events(): class EventHandler(object): def handler(self, x, args): @@ -166,12 +164,12 @@ def handler(self, x, args): assert FunctionsTest.test_event(x, 1) == 1 assert event_handler.value == 1 - InterfaceTestClass = interface_test_class_fixture() + InterfaceTestClass = interface_test_class_fixture(test_events.__name__) i = InterfaceTestClass() with pytest.raises(System.NotImplementedException): FunctionsTest.test_event(i, 2) - DerivedEventTest = derived_event_test_class_fixture() + DerivedEventTest = derived_event_test_class_fixture(test_events.__name__) d = DerivedEventTest() d.add_TestEvent(event_handler.handler) assert FunctionsTest.test_event(d, 3) == 3 @@ -190,3 +188,59 @@ def test_isinstance_check(): for x in b: assert isinstance(x, System.Object) assert isinstance(x, System.String) + +def test_namespace_and_init(): + calls = [] + class TestX(System.Object): + __namespace__ = "test_clr_subclass_with_init_args" + def __init__(self, *args, **kwargs): + calls.append((args, kwargs)) + t = TestX(1,2,3,foo="bar") + assert len(calls) == 1 + assert calls[0][0] == (1,2,3) + assert calls[0][1] == {"foo":"bar"} + +def test_namespace_and_argless_init(): + calls = [] + class TestX(System.Object): + __namespace__ = "test_clr_subclass_without_init_args" + def __init__(self): + calls.append(True) + t = TestX() + assert len(calls) == 1 + assert calls[0] == True + + +def test_namespace_and_no_init(): + class TestX(System.Object): + __namespace__ = "test_clr_subclass_without_init" + q = 1 + t = TestX() + assert t.q == 1 + +def test_construction_from_clr(): + import clr + calls = [] + class TestX(System.Object): + __namespace__ = "test_clr_subclass_init_from_clr" + @clr.clrmethod(None, [int, str]) + def __init__(self, i, s): + calls.append((i, s)) + + # Construct a TestX from Python + t = TestX(1, "foo") + assert len(calls) == 1 + assert calls[0][0] == 1 + assert calls[0][1] == "foo" + + # Reset calls and construct a TestX from CLR + calls = [] + tp = t.GetType() + t2 = tp.GetConstructors()[0].Invoke(None) + assert len(calls) == 0 + + # The object has only been constructed, now it needs to be initialized as well + tp.GetMethod("__init__").Invoke(t2, [1, "foo"]) + assert len(calls) == 1 + assert calls[0][0] == 1 + assert calls[0][1] == "foo" From 0ce630186680b7db5d4f149502e0221e7e82a3e6 Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Mon, 26 Jun 2017 12:31:13 +0200 Subject: [PATCH 267/324] Handle C long size on Windows. (#497) On Windows 64bit systems, a C `long` is a 32 bit integer while the rest of the world has agreed on making `sizeof(long) == sizeof(void*)`. --- src/runtime/Python.Runtime.csproj | 3 ++- src/runtime/Util.cs | 33 +++++++++++++++++++++++++++++++ src/runtime/clrobject.cs | 4 ++-- src/runtime/managedtype.cs | 6 +++--- src/runtime/metatype.cs | 4 ++-- src/runtime/runtime.cs | 8 ++++++-- src/runtime/typemanager.cs | 10 +++++----- 7 files changed, 53 insertions(+), 15 deletions(-) create mode 100644 src/runtime/Util.cs diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index ee1a3c701..9999f8303 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -136,6 +136,7 @@ + @@ -164,4 +165,4 @@ - + \ No newline at end of file diff --git a/src/runtime/Util.cs b/src/runtime/Util.cs new file mode 100644 index 000000000..dd4418cc9 --- /dev/null +++ b/src/runtime/Util.cs @@ -0,0 +1,33 @@ +using System; +using System.Runtime.InteropServices; + +namespace Python.Runtime +{ + internal class Util + { + internal static Int64 ReadCLong(IntPtr tp, int offset) + { + // On Windows, a C long is always 32 bits. + if (Runtime.IsWindows || Runtime.Is32Bit) + { + return Marshal.ReadInt32(tp, offset); + } + else + { + return Marshal.ReadInt64(tp, offset); + } + } + + internal static void WriteCLong(IntPtr type, int offset, Int64 flags) + { + if (Runtime.IsWindows || Runtime.Is32Bit) + { + Marshal.WriteInt32(type, offset, (Int32)(flags & 0xffffffffL)); + } + else + { + Marshal.WriteInt64(type, offset, flags); + } + } + } +} \ No newline at end of file diff --git a/src/runtime/clrobject.cs b/src/runtime/clrobject.cs index 472e5dcbb..fb3d0e0d7 100644 --- a/src/runtime/clrobject.cs +++ b/src/runtime/clrobject.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Runtime.InteropServices; namespace Python.Runtime @@ -11,7 +11,7 @@ internal CLRObject(object ob, IntPtr tp) { IntPtr py = Runtime.PyType_GenericAlloc(tp, 0); - var flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags); + long flags = Util.ReadCLong(tp, TypeOffset.tp_flags); if ((flags & TypeFlags.Subclass) != 0) { IntPtr dict = Marshal.ReadIntPtr(py, ObjectOffset.DictOffset(tp)); diff --git a/src/runtime/managedtype.cs b/src/runtime/managedtype.cs index 9ee8d223b..562b2e5f8 100644 --- a/src/runtime/managedtype.cs +++ b/src/runtime/managedtype.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Runtime.InteropServices; namespace Python.Runtime @@ -28,7 +28,7 @@ internal static ManagedType GetManagedObject(IntPtr ob) tp = ob; } - var flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags); + var flags = Util.ReadCLong(tp, TypeOffset.tp_flags); if ((flags & TypeFlags.Managed) != 0) { IntPtr op = tp == ob @@ -63,7 +63,7 @@ internal static bool IsManagedType(IntPtr ob) tp = ob; } - var flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags); + var flags = Util.ReadCLong(tp, TypeOffset.tp_flags); if ((flags & TypeFlags.Managed) != 0) { return true; diff --git a/src/runtime/metatype.cs b/src/runtime/metatype.cs index 25e9817bd..982f4a632 100644 --- a/src/runtime/metatype.cs +++ b/src/runtime/metatype.cs @@ -105,7 +105,7 @@ public static IntPtr tp_new(IntPtr tp, IntPtr args, IntPtr kw) flags |= TypeFlags.BaseType; flags |= TypeFlags.Subclass; flags |= TypeFlags.HaveGC; - Marshal.WriteIntPtr(type, TypeOffset.tp_flags, (IntPtr)flags); + Util.WriteCLong(type, TypeOffset.tp_flags, flags); TypeManager.CopySlot(base_type, type, TypeOffset.tp_dealloc); @@ -237,7 +237,7 @@ public static void tp_dealloc(IntPtr tp) { // Fix this when we dont cheat on the handle for subclasses! - var flags = (int)Marshal.ReadIntPtr(tp, TypeOffset.tp_flags); + var flags = Util.ReadCLong(tp, TypeOffset.tp_flags); if ((flags & TypeFlags.Subclass) == 0) { IntPtr gc = Marshal.ReadIntPtr(tp, TypeOffset.magic()); diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 3d1078805..90c56817a 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -152,6 +152,10 @@ public class Runtime internal static bool IsFinalizing; internal static bool Is32Bit = IntPtr.Size == 4; + + // .NET core: System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Windows) + internal static bool IsWindows = Environment.OSVersion.Platform == PlatformID.Win32NT; + internal static bool IsPython2 = pyversionnumber < 30; internal static bool IsPython3 = pyversionnumber >= 30; @@ -762,7 +766,7 @@ internal static bool PyObject_IsIterable(IntPtr pointer) { var ob_type = Marshal.ReadIntPtr(pointer, ObjectOffset.ob_type); #if PYTHON2 - long tp_flags = Marshal.ReadInt64(ob_type, TypeOffset.tp_flags); + long tp_flags = Util.ReadCLong(ob_type, TypeOffset.tp_flags); if ((tp_flags & TypeFlags.HaveIter) == 0) return false; #endif @@ -1419,7 +1423,7 @@ internal static bool PyIter_Check(IntPtr pointer) { var ob_type = Marshal.ReadIntPtr(pointer, ObjectOffset.ob_type); #if PYTHON2 - long tp_flags = Marshal.ReadInt64(ob_type, TypeOffset.tp_flags); + long tp_flags = Util.ReadCLong(ob_type, TypeOffset.tp_flags); if ((tp_flags & TypeFlags.HaveIter) == 0) return false; #endif diff --git a/src/runtime/typemanager.cs b/src/runtime/typemanager.cs index ad0fddcc1..6570ee083 100644 --- a/src/runtime/typemanager.cs +++ b/src/runtime/typemanager.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; using System.Reflection; @@ -86,7 +86,7 @@ internal static IntPtr CreateType(Type impl) int flags = TypeFlags.Default | TypeFlags.Managed | TypeFlags.HeapType | TypeFlags.HaveGC; - Marshal.WriteIntPtr(type, TypeOffset.tp_flags, (IntPtr)flags); + Util.WriteCLong(type, TypeOffset.tp_flags, flags); Runtime.PyType_Ready(type); @@ -160,7 +160,7 @@ internal static IntPtr CreateType(ManagedType impl, Type clrType) flags |= TypeFlags.HeapType; flags |= TypeFlags.BaseType; flags |= TypeFlags.HaveGC; - Marshal.WriteIntPtr(type, TypeOffset.tp_flags, (IntPtr)flags); + Util.WriteCLong(type, TypeOffset.tp_flags, flags); // Leverage followup initialization from the Python runtime. Note // that the type of the new type must PyType_Type at the time we @@ -323,7 +323,7 @@ internal static IntPtr CreateMetaType(Type impl) flags |= TypeFlags.Managed; flags |= TypeFlags.HeapType; flags |= TypeFlags.HaveGC; - Marshal.WriteIntPtr(type, TypeOffset.tp_flags, (IntPtr)flags); + Util.WriteCLong(type, TypeOffset.tp_flags, flags); // We need space for 3 PyMethodDef structs, each of them // 4 int-ptrs in size. @@ -380,7 +380,7 @@ internal static IntPtr BasicSubType(string name, IntPtr base_, Type impl) flags |= TypeFlags.Managed; flags |= TypeFlags.HeapType; flags |= TypeFlags.HaveGC; - Marshal.WriteIntPtr(type, TypeOffset.tp_flags, (IntPtr)flags); + Util.WriteCLong(type, TypeOffset.tp_flags, flags); CopySlot(base_, type, TypeOffset.tp_traverse); CopySlot(base_, type, TypeOffset.tp_clear); From 86f7ba31fba223c42f6b29421d662768a43749d2 Mon Sep 17 00:00:00 2001 From: The Gitter Badger Date: Wed, 5 Jul 2017 16:10:28 -0500 Subject: [PATCH 268/324] Add Gitter badge (#505) --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7d12eafaf..dab57ef70 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # pythonnet - Python for .NET +[![Join the chat at https://gitter.im/pythonnet/pythonnet](https://badges.gitter.im/pythonnet/pythonnet.svg)](https://gitter.im/pythonnet/pythonnet?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + [![appveyor shield][]](https://ci.appveyor.com/project/pythonnet/pythonnet/branch/master) [![travis shield][]](https://travis-ci.org/pythonnet/pythonnet) [![codecov shield][]](https://codecov.io/github/pythonnet/pythonnet) From 87eb1023139b7cb52968ef748e5b13f629e925fd Mon Sep 17 00:00:00 2001 From: denfromufa Date: Mon, 10 Jul 2017 01:50:30 -0700 Subject: [PATCH 269/324] Update README.md (#507) --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index dab57ef70..06a2f1918 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,10 @@ int32 [ 6. 10. 12.] ``` +Information on installation, FAQ, troubleshooting, debugging, and projects using pythonnet can be found in the Wiki: + +https://github.com/pythonnet/pythonnet/wiki + [appveyor shield]: https://img.shields.io/appveyor/ci/pythonnet/pythonnet/master.svg?label=AppVeyor [codecov shield]: https://img.shields.io/codecov/c/github/pythonnet/pythonnet/master.svg?label=Codecov From 25e66f018f7e5b4d24aaf6876b5ce497f07eba88 Mon Sep 17 00:00:00 2001 From: dmitriyse Date: Tue, 11 Jul 2017 02:32:38 +0400 Subject: [PATCH 270/324] Binary substitution of Python.Runtime.dll becomes safe. (#456) * Binary substitution of Python.Runtime.Dll becomes safe. * Public constants replaced to static readonly fields. Relaxed platform binding. * Static readonly fields (related to build depented values) replaced by properties. --- src/embed_tests/TestPythonEngineProperties.cs | 4 +- src/runtime/CustomMarshaler.cs | 6 +- src/runtime/Python.Runtime.csproj | 6 +- src/runtime/runtime.cs | 545 +++++++++--------- 4 files changed, 291 insertions(+), 270 deletions(-) diff --git a/src/embed_tests/TestPythonEngineProperties.cs b/src/embed_tests/TestPythonEngineProperties.cs index 01c6ae7e3..76177d05a 100644 --- a/src/embed_tests/TestPythonEngineProperties.cs +++ b/src/embed_tests/TestPythonEngineProperties.cs @@ -146,7 +146,7 @@ public void SetProgramName() [Test] public void SetPythonPath() { - if (Runtime.Runtime.pyversion == "2.7") + if (Runtime.Runtime._pyversion == "2.7") { // Assert.Skip outputs as a warning (ie. pending to fix) Assert.Pass(); @@ -166,7 +166,7 @@ public void SetPythonPath() [Test] public void SetPythonPathExceptionOn27() { - if (Runtime.Runtime.pyversion != "2.7") + if (Runtime.Runtime._pyversion != "2.7") { Assert.Pass(); } diff --git a/src/runtime/CustomMarshaler.cs b/src/runtime/CustomMarshaler.cs index 90bb77a71..b51911816 100644 --- a/src/runtime/CustomMarshaler.cs +++ b/src/runtime/CustomMarshaler.cs @@ -91,13 +91,13 @@ public static int GetUnicodeByteLength(IntPtr p) var len = 0; while (true) { - int c = Runtime.UCS == 2 + int c = Runtime._UCS == 2 ? Marshal.ReadInt16(p, len * 2) : Marshal.ReadInt32(p, len * 4); if (c == 0) { - return len * Runtime.UCS; + return len * Runtime._UCS; } checked { @@ -163,7 +163,7 @@ public override IntPtr MarshalManagedToNative(object managedObj) } int totalStrLength = argv.Sum(arg => arg.Length + 1); - int memSize = argv.Length * IntPtr.Size + totalStrLength * Runtime.UCS; + int memSize = argv.Length * IntPtr.Size + totalStrLength * Runtime._UCS; IntPtr mem = Marshal.AllocHGlobal(memSize); try diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index 9999f8303..82825a626 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -20,12 +20,14 @@ false ..\pythonnet.snk - + + + PYTHON2;PYTHON27;UCS4 true diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 90c56817a..8f730a855 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -80,8 +80,14 @@ public static IntPtr GetProcAddress(IntPtr dllHandle, string name) ///

    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
    *vOI=#8}L%f z0Lbk`(38T6C%Bic_a+46+bMRe5xbCB?=-Ay$R5kRI6KaS!KFyn?O#ShN@LLX*U|kz z<1Dzmqb6s;_kkd&w_N$YXg%foD3p!ml5cRimY5rY9w*ONk3patbAbbYH9{`?k9x#~{s(i?o*oG5a#&HV%(;$(Y z1cE9>m-E9#ECO_zuxPZHu;db5N7^3FW;h-ea)w=J<2l`990n6k{>FZg9ho>nw4R@6 z5q*(%2Rz5ta<2R>h~PT*_@l^Qc%$qOQmnVJ?ATWuj%aMl1I;qFS2vHNC}$%>IW+I! z&^!+Lxo)a^bz7=;Z|KW%mi)3y==QgR1!+|2JID=Z{kZVdInrgpqm(~y7d$9mj-U{D zNa(){;9wyr#^3{E@ahNCh0!qc{P8 ztG##UorlulodoO%b7K?l+gw}Z3k~BiTGWf%h5y*|+r_RBfgT!d{-bcv_!3XQlvVA*rh3^Nt%m09cA4J%mEPn_;ok<7pv2^(# z2As-tNxwh18TDlGn5h2|pbMikt-)ODhDndvzzmTxR1ryWDQ)(%g=Qq3AnDCtI`5vpUB>Xk6os2k~ipxC?#nNe~MN+WsZUx*SAn&$CjB;QtKQ=qK}bS zN0~1ot4%e!t+?T&2^r`pLum3GC0l$SjKpl?{g|1c6=AUHN4e$gje1V8HyfBRWT40P zB>E!~>$273kg%&xI7LL1Bbr8$C}f}_O7w?hq(!AcY=zH?8XwYx43rO{=&%dSMo;9$ zZ6g`}gqbu`R3?wyd z!}V+fvuTD|L`nD)%3u|1F&T-|lM(G+1dEPHNc zTcY>k_#Z(>U)pagTw%>y;o1&{9@^M&wzxIXc50HzD=eBf8I~S!w?>pfP zLV@L5pbozAis!kcJ>kF=h#|c_kp^`rW5ULS?cIyVg^AR8dm+`QNSb3wG2{%FSC1ko z_pP|Fx(0c4SoZjDV5c3HcN>z9KPB+o@n7TDsW66D!11sX)E(BPM0mF&p~=tiIx*t) zoX~rpC9mHKJa_zA{5loJlo!@B$%_c@b1`14?DCzYqaoY043rA*=FpJj9nOSTU`a8W z(=J;rc0?!9E@iAP|5!YyZtrq9YU95LbGnU>({=hhxR&oCYq)4h@q^$G5ca>OxT|A-bqr7_*N#sYg(v{Z?I?(aqjYGh|S|@=>0^s!ma6EEy~A=-3w4i zY=M6{NV_(nz36~Fb%EbZX6t9PV+;IbCLDEvpHT;0zAo+;VMd+H2Iy8*!9Z(1+kNW~?6|9W2&0m0>4c)e%q1J=7WGA^d18?xZf}`YIZ6V z2D%QO!Xr}ukkmgy;4LKQAM>$nf0c2b!r6e*>$?HxTRm^F4q66P-03}zME*|@%-@Th zL_NM>q6M>BIry2cvKOT8#D~By|LpQlK{oy>JgW7$J2O)L8S&`SlXiun_wl6|y!YQ3 z$TQNE!;JCXO`?Q?KFE8GPrn79a+EI$tE{3pNz&yb#C3@t5h2BOM@e7}8H{&tS! ztS3?Kb+n78ArS52pO8kML;ufE%3o5N0SE$XScIQZ+H^3*G@S}bBl}G8#sb()H{Zt} z7P8XoLB>jbw#Kx;H0e=xK57!rPBjT(YD^;hH?lDO!oL7dIKLyeCm~{?%7?rJVLC%$ z8|fUGYr&$dOIY4tgTzhvPvOV^4FdMspQVK98_~ScYiInY`7G6fJ_@yBWi~mc>+SZ@ zZKDIvceWONJj!87`|5Rk+=<@qSv(u1oo8gskRDZwm(ETai=zC03yNSl9%`QQ7GHcy zjX^NuKZiuQR?HYN#myx#V|-_=OFa;mlW^XMGOkVdNlKhW{#uO*|97CI{lJI$J-~5R zz8d%t?E}SCUt0jA18#SN6972lOI?c6(l7fjbPd-F8gs}0BkcgA+h;uQoUVfIG~t6oHGJ7Vi(N7Oo``$@)Rr_cb&E zC~iN46F_nM8=L^Z;eGEtfg6>2xBZ8p%yA+Vt?NvkBMYo=BJDWp(56f6l)4eMy_*5r z-hBvp;gjRPfB@5(JMp87OxrP;?cEJTm+jq3{F@db_zIvRhCT3*#LuHh1zq5ii#XbB zCp9@e_}oJVA#M=!z6QwlzQxe?Zo*F)*I+r`*8znHlI0iJ)BXX0?LlqL|07i= z_RjwM2nbMRnfwRvumsgv-k*>{R=!+qdMi!Ss|_~(pOFNEjU#Jg+T7Yyh?IXOq!3?x zxnlg2fat-RDDyiX8SoDxKS-HGaP-~hAWa#%!zA<$;LFEs581yYDd2uP<+Y6Owl^sl z_f8r?DPKbCFg@A?;0fnX?9u)LHiar5dZ!>+w5~eGdOh-eGs;^25HtHLQXx0$vwS|e zU&z2iyK6%xUzMyytM7-h%ZKBk|9>D!v5JOE3&6`s`F{h(y8_R|gK)~Hnq*PQ%KITJ zp^N&MJ!~J2m=nEe2MET?vybb+?`>jR>{U0l(k$@E)$S5^ryw#cJ(I(mPKMVp1?)`v z;HQzWEft)Ndg}H6jz~70-zNi(seD?TV~jp?fgXheY^8!rOnsJ76lVx4spvEBiN*kR6bZ}dZ*L#q`hS-V$bo(%p@kW;6(z}pWKF#x5trNgzojO!NYc~zz7#H%6N}~ z1l(UliX|V}{92IWqPhG!6eD`6M%8gxEiWf;d*7wBkAjl33l*kc63_~Q2~$wxPC7UE z=b~~^2YilMh}u20Vq34aUU!!)2wSJvy7K-Xh%!#?M*TN*yvpcU0OSPR!3HOQ;tnx5 z0e~~($-7Y(98c`d`gqbJ@Z50=zqscQp^hg|AIB3SrX5d^_u(cV0g%soqj@{j1V0X) zlskR|K^cKy8;6oWWn>cC4WIM(NdD4(1kf}`8Jqx$JKEp`0In17CBJ~*tHjQpgl5gX zL7l*AZ3nnN?4o>L>MD9Vitg32=X*Z|0oKvJubCq%zafne0eT z18D>;Y|Q6uh_|QlKz1R-OcbgtTxSTqsh#4&=sbj-p`ra z0&r|E=J7Nm(=IHCph3z0oFvn0EtWhb*Jm{xl8qSH;HB4rIetR;{$g6bttl+kHp3S? zjZh5avaJmk7BDF};KwZVDFXAZtzjbZr=4DDVGZ;tPkuQQ>a#o@OP4(@{YRLpJ}%4fJAMq)caCJS!=Zn+_Y6v{T9>>d1lkk3sb}$1>OfN4 zdyZgAz`w>GD&{YWd7eKaZ|}$s7GDzmsMv?}hL6DFOh;%}D9H`}S?CS5GYsa>+S+6P zHT9Gmky3ij$XAd@6_(fk2vUWqm<>8&ga4onJ}EZHhg?7z4%1VT{gcTYXuVM7Ltfi8 zTnIB$(*29+Fi}A|KIDyo!>*6!fI(_LG?eo3Mh&iubJEm*R6r?#9^zi|OR>t79NmuI z+0?S=uHP3?z=n<>{06lpGjSaWUB;}nKeE5BuJfnCDRITgu*=}D zWZDL~OdTY>KSQ`1{I$?oV*YA0ELIcxiUIuiWnf{@w7pYoaZ_y{{($5CAA>CT;GO@& ztRL8x^>OAW`cKGe3id!bCyJcA;J?Ut-j%Qgbgxmpv!|I2J~tG4QvUV?VwMmoN-{&> zO8*cU$)eeHBT0!oQz$j1DB789B`Lpv%u3>3OKE!*Bc)YBH8d%WBkQ}_wBL@>=9iz1 zB1B>oA;x6h>Cl~GDF3FR%mQ_x%7+}*hkI7Hr^B`>Nnfldj8M!;uwTnN>%y&W~NN3h}OyTZBJo1*edZ^{JK+m5_#$ zOU~a4b1b>KKDslth&XYdn@g_FtVX7i28~V43G&0V+|k`IfNe(gqd>a36$7Rg8gYz|D z;P|+0*=;MsadiqQ=>+`06V~1#CG9DkJ%#NA*>;1pP~}5!S2Pp(dtHp&)UABU&afJ3JH2U&X|2?NJ^c=3$OM zPwG2FZ|L~*S>JZBi%AmZP=C6o0e{8{PQ!z)O&Ak(W@`2{%uYuA#a`Xh=monfSqPsB zCXcQ_b~uN8cZS^gKu*oqSWY=?umVj_&uo)M2z3jd(dfFB?ZDU$&aX+`N$$(Ry?>jf zCX0}PN=?WPJIGh1#)`m2bwzANYSIXyO3i44)VCR_qgx(c&m#l$0UEEc4IVS;qS~!@ zsF)|B`k$*kk0)3N&3Fugd=Aylal!8+PHmxXQ+0cSLEUDjq>0H~3v0UDgM6Iw#@2LCH02Ng?96=oPRPmmb{^Ge)^FzuJa@bczfOfQ zoo}PF=X{%phWR$f9w@>3Jb1~Jns;WSW*m@tJ3t!Q(Q<|mE3jzCB5mw`mji zW;|=NzJdI|3=yJ&$ni#THoD7rmCA)#q0-G2&#yybbAPl-tLd}AYx?Zw0I+P!DN%cI z5fD1{oJ^9JEV7&TkrV^SXUXGIo`z{?G?Kl2YTLy+!`yem<;W$6u;T^`lsV-I)^1mt za_?Zh`I8EpwSBaulZ*`t06O5{`RkY_fZ|RuH~|!Qs=*1MxYGL z9EpdXn@tyM?g{T_(5CJEmFQmq#C&rAw~1NwF|ZE)OQ7Urg!eNnw0d_VkR?fk=#~+p z_c7;+WKvwpfp2_HEPiYFxg44aCY)Hs6#MfYM24l1X}dl6B;Z8fL0(eFMe9J6FtCHs zJ;0Vf!Ufvxc$}x7Cx@2fi8=?1+3m$oTzdb+L6e{gbihGTdP8*@YTgM~@$8i2p`+xa z`37X5vv({t!eehd9z{fX^R8Snv~m2v@z5=q_2${u84%=q=sk`>;Zwvt7Nhvt6hj;tDFlwd}Snb97|h!^S)k75EB*~wcb+lk7lmeJX&lAxb z^|t8i}@m}^~opGH40WQFF`OF=FZAB^q#Y#pSNPk6FI4z@gpXDD8-&kP_`8H(12`J%U27lY z^<&g&yqUZaf;E0)L|#lYYr}f#&#R(^!3MlFWG7|fobOT!kH4+*3zuNHi_PP2f)2Yj zEg}_~p!;&G56hvHDp?4h3e3_K$WHoWfTOZyt@o%XTa;ydfCWwJ3v#XF3#Hhn!6w6{ zuUtN|5I!m&qxP&wK*+_uiuQhjnc9LsuXSk#Oo;5jB0q zUI1Z2NnJtHb_EJ|CNZK|lKGw7&{!ihik^DKh%WOS2_99F3lDwolTn**q$dNsT(38O z$j!=Tw>FEMY^S^eHQ}8iMYsUrdX&q?PQ!VCv+3>=WYj|0tqlI>@P8=P(s#l6?y1ON`_n$R3-=bGLy0Dc@Jh@^bIBV*RvFna$S8Yp+76Lx1M zWpZzOW#nypCnD5N4Q?XLn2OZd5030N&VHiAJJE2SN1&spc(qP>CHkQ8U088Wg+Jb# zz-V(7JW(Tcrtn{=k>Uw`i?>yQ?@ik4t+eo#fiX4IM?(uPyJEGKL~;)umM(1Bn!$V1Cru&FYJWY>EG6_k=~>|DzKE)E&UZZY780sE_vCcnHx zvYv3}Hjv>ZVG!%)GI-`2AF4dwn~@|E?IZ{xMk|LK6d7<;Regb&y@kf!%+Ur(#&gb0 z9$E1Efg0z!=WsA2jcLMztKsT6AGhbJ{O>@H;4kT?@E^*cQF0B3Z#Lv!Z&jBdYU5QuEK8jM^H(jbHg%=-1 zsXotC=%w*ev}P>rSu>_SHJ$Old3O3<=;${!9VI#}dS~wFr+`*n)KDJ;D%_RrOvk6c zf!{QaKz)2N8xpbciR8jV$0tU$$(hRub|?SEs1tr&tTy&dX~ako-BC`0kbz!KAkp2( zWDjAoeVxhF0d$(X)<_yMsK7~g1!}m}6GMmj*E=JxIJW ziGyrclRXt_LI&DX5sJ1i_JNeHsZWll?4dYbb>bb{dr)Kiv%NFeE5Mfocrw5)?=Vzy z2`$kIM=1}N>iR82gCWQ?O|6=`oV>Y&xdOgiM)4R_jzCl(ZQ3D@ay5RbtEQ!`eyOXL zTkK0+1{YZq^Cfr5qJlXNzAT66rhfDT;+X2#JBH%O%43Mxwb8qLsiG#y6ysV!<64QJ zN*WO6}7k8zHD!CQ=cW}`$? z)Zf#g@5%SjF=$)QqMgc~Yt)TJM>v;)(c~kXpR=)Y=LC0wJ?8KKMt&I&a|~DJ&#pO= z`H+sO4M#HV$^d(`M?e|wwGBEWjS#BN7>()73HPq^OwMi6{z)T*%9GI;PY){$u6Gkk z+?njoCC9MNVTJoJ8?+9z(OONLx6NX=j~S~f)W5!ishjJqMo=XWVN^K*QGqrMvkjqv zxxqq6ucn1z-F&y;Kp>}SKCv84|EPAnJ2+KIA2QJI77*Gr*Vu8mjNG-uXxeZ|BZR6j zMq>)oPx7rnnKs0YRn8;YR)@9XXiLUW^KG_2aD0$~Q!LIc;;w!qlS9L8;TYxH_921f z!b67yMpaZ8Decxj8bLN(!CbUYZ?D&AQ++x~gxTRC~BT+0JCVA%Rfoc*AH$ zKi>dP&Iz!KGnknrE73sI%NE$NGvJ%RKuO>e&M z16kF(At-G?9^nDZ4LD0jrOO&~G!5A(ApVh1BZcOTWjeP?X2MZl8)dY?#9(RvV)k!9 z0JDA(Kcn0I4<`U*#(~eBW1%oQupS;r!60WO*fa9+sahRP(J9((^zkVY3bkH|%xKgk zPeGb+75O&fQ!t^VR-Zzm2a#Bt;I^z9kUV6dO^}d^7F-RzO9PZugZg>=`_Tb}hcMS> zL}o%sts+bGU=nY;$RrOLsK|sOk?&{}xivhDIW;3D6H00oQ=*5Gc-zG!dB{M;BovAH zV568$cocJLMocD@)GDS#k0dcxSm9J|(+EWRkb#asgkmGm5q0iQH8w=kCvAOvBYns~ zxf63MrQ$M0c!Wb zW}&=4!m9s`|1$U?-Z_%8DA->){>fXG()IOq`B*iQQ!l52S&7M==uP@hj9}az%9}OT z9_tA3`y1#J;c+ZyGZoB)l3FX6(S*+>h{7ngwXMPMXmZ+iqa?ZTP@`ltGRiDeigbcLi2~DYaR=O=hKKv8*Rqn=G5BL91U_QYqsI8=Y83@ZjJzNGljds5`mIl-| zFSNb2n4m}&m^NX^3CF7-y&SS>IByTX zSofkjt@eI%ZfG~_f322mO)wiwhyT`Lx|h%vs&2=GG=i5He8T zPNFB03B~UTJ~+Mj#(|kU)fP93vxT6;)F)*LPJesk3CY01_^%6aq z#H!zWrWbIl`XzbDK=n%~6>#2CH~4J$8s;$*O_D&URFjNGZ#7{N9d9*_!yHGkCj^kI z>S;Z^bmIV~;hbyNu1vtq{+I<@A=Zd%U#_beo*B%hsQ_`Xv3`QBXG+4Lf;AO<6Ae%% zJe};Cn4Hw?QTSa%dnBpQ>lKp{J&o+NUzCemYZ6XzFIRwtE>(~wWT5?`L{B9jt;)yb z644qXQ`CA@nnFj*D-@07Ap@;SLU?zA!-Fi4N7rm(x6&;-P<`eKj(zIG|CUNVgW10Z zPx8SNjh3`vYoBR1k`(5d^|`|Q8q{kfRyogNl`tR4tb(ltSD;N8{Iy@vdpgryT}dB% zbU1t&o=LG#iulSvldDlR(dyrgm(_xECq+*55s@W)cEq^aMpy1+N0<@z*s>+e2ny@4Op=VNdOmmXa5{?nQQ=uEWqktm zVq*oE2~@2>v5!*Cbb9z23&}o%p{iI@V|KpCtU_{kRoAY~i;~Df~?O2NDRC_74(0n@pN$ zl*YDVpQj{g$UtY&gy7%Rr>K;(dni1QIm|>%5(t%wDbaJuL>uXX?rB{tQz7*asl*y7 z$wLO(ND0}&ZeXMhm4ia5z}9#n^O=dTBoHbUR-zY>$^IyPJ~*RMSYuJs%mfNOeL3@$ zdKrj)+7wxZ3@X@9bOoy4j}@NJjJACgBDwHTtuPwX3N|^gOdc&aq){424qtW~zkPo@ ze1-==10<611IF7svc$?GtquFsGews}wQd=W4KHg{`q84rNy>(ArsxH5?VGcS9+RvV z)_VeVZ?IDAR+&^$Wz@LsCjz*iu=ffl3LwIi3TKA!`c@2k>nu*H7r8-a?3QXBX+`X zME8d7_)rLri_q3F8)>LvrDv z*)y63fBHO~>2L#?&!h@TAXHj~5`6=i=&&@q-Yb|EZQ60Huip=u>m~mr4H>AfDA7yE zZic=hX+j3tzzF5^(?GYiMb{+0M}wE}J3hhsjHnfh>yPWIt)sqj)tqlJAN zdc?Z=w&EC*MhLaAj7GglS6W=c;;}4fg{;vA;$GoaD#fo=3JHZ;D}~WqTJ_kOfuYLO zgvWgWb8dnkv@O@GO-@P+I6Q~Ue_tf)32tfZ?9IqJwX>gmN8%gV4U>^@t5n%pGHT~C z2_MIZ+)g*FG9L~s)9i~)mxHN4?=sNy=!jb-3*l3F3v*yJ5x$XpwQBCg@=HgY98OwaQ8dF2-(C z7q(4Z*p&Y^B+oDV_P?T+0~=mFf{$Rn3o!`)@XP4@e}xg24EaZwaV`Ge3|tz1L_3lA zJ0+29?dqCxvuAl$c%-D_IaK_W+i}Y z^ANm{4zwI#!>cDWI0rvGEjAdwgC&?r*GU4Q(ymjYZ?7|HZXb&TAp^hHvLCozEP$s z4o79(D!EG*l`9byD0YBj8Oj}?0Y$s)@1!WI&!+dmNfR|97)63~9RpJ6o@AZtJQ?Vi#{Sen+Exci#8?f5J7Cb#` zN956ozQnGK!#GMuk)0p#_#f0fTv}O+`|pL6-OKxd&?7W^m>SRz)WohXjToS39(Ic! z2;!%UqU*~kN_0@>ePHY@DDZ6rEeD6gSQ(?&hiS)c#jMatan~YQTYb(|2-ZQOl=ptH zGhfem%M{G}r(kZHgu$DJSQB?j)OI?!d(zW%@SQ1`CnsaNJxs04wMm}_A9HPz?O{ns zFR%>$1uD!2POBFPYaVWi`U;Zscq54FKu-4Pd*M`!yzK`%rgP*cosy&)WoCJkn~j(J^X^}>eA^JK4~`~lR!_!Y2oo?o5MO@@P5#XP_2REYO+W)NRo24t?U zx)Sh&vmMiZ2+s;tKJ?J?hP^QaZHW|yLUdwI`NL$jf)CKC;@wh2vueDfYanjIKOf}@ z-#vx*Lh`;^c=I7wM~B0!rX=fQvX4qKJ{0rvUX8Tq2(JaYy?8Ei=}36jA%Z(&pwxLh zXL$;`N9kopSK+xGp<~7M;1oF}G-Vumr4AYhKL%$0$H}oZjSk@uFvHLFKp>|Z@U!Gf zJ#>(m$Ujm$bfAnpcpn&U*OI-o_q2z34~|$%gNC1g#cvE1!=)Vos(QGjHC*~JWXX5p zb$@D%$3%wx8!1Ancnyn~@@`@*jVZu#$W#6VW0|ynGk@J8`V*_e^*+g1TQ1Yl=G_9& z{}h5z?tIo!w*rNfpT^IU?`bjIiTtKoF_6JB7C2Mh8$X>{6$tas+dyF=xvc*gL~{-< ziFF{`?TC!7rjZ^Y!cOGBUt_2=;VyX3H0^&D35BtL2cRK+=6??G){%5(z_Hx@*nN1ksUHf;7e{Jc`G z751Sz9JSv1_4>Q?cRyj^jP=65&0gTK)^A|CJFyS>GIZdE*P?|qwU)z#l3LetB>E8& zt4EMUM_PAXw=x|hO~^n!0z&cqV;oj@{X-D66Mvc)5Aa&1&G(xClVN|E_ z;YaJ-nm%Mq8X;6}j4C((s}M6Xg+K6O6s&4a`=x9rScGcuzlP-Uu7}2>(f?jxBk=2W z@IHX$Rt#nSHvlylsxQ^Us=(v(5WT2HnC~l^EqEP+=EX56EzU`jtx2PEM5Jr^;4a-d> z+{r2S7hcaCRQ#srF{BYf6`#?V_>TW=5`w_+bk8!(E_(A5zNpTziS@ z6uI{DQ}mZ+nZ$HK@d-AWsLyVYDK{%O+k;;^?Ee@XHq%cYOo-o@Yxf@qYGS@dgYUy+ z8u&#*i6F-^`#Ii?v+A$;2frl29GP@QFDGF6YyjQR=v^EVW>e6NE|+D@j_(Q#q?j^T z*W-U5^oP#g;@DyShTscuS?_H8a-InH2Jdj;Zg(6fI1Xul2s|0{uNQZ7uf%VWb6Ec; zkkBp8LmcOIe~JiiZTcC0)eY-I72v_ofxxw(^yNBmiubvi<4B(c8QOSVe(|oB_As%{ML5cWHV@I<2pR2|6mA<9pu}b6Z4n`2{j7RQXWn67VGO+WCc?q`ZF$ z#rAayK2!>53pbu_W@(BgWS8=P2{?=U6n=%@j)eateoB3KqI@&{uYnkhBI&XVrv6hv zMHdx*eYyi$TJE!~gFmM}*(zIBr7^GIILV13?*mK8TIF*3X+z-3b7h}`oKA(Iza!Ke zeqc(Wc3`1?gZv9sKJ*Snd2s*3yP(SY=`+j}hnenar1N0jIF2UoS3{0xfC~N!J5yhn za?G)+C@xwn-alZs?>cfz4{CcN5B4p(eucRYPGjl|Z*-t_O)^N&hckjYb7eLbf7!4f zPa5tclC-gx3}YM||5>nz&fCr6nK=0iZ$lBA8h4mbQtP-Q(NB|D9ga1SB{uGu&U>11 zM_ovHV}$e}19dnEZE9n|=`n`4lKTw1ancB(cH@l3yK!+i;AY4-IP{&Q4(kqRVx`m# z7Qj$9QUkKeh%W)f-W|PUvbv)SSoH4Qbpu!~@O}#=w{h~1oq2u5w%dCYc9u<~{fF@D zZ$wK<>)Wt{$X73hmqn(e96!=;vd*y+@LJ_P*>{tmeQF!XMDMvAWUanl+rV1e!;&5E zD)}EusJ42znx?h9Z=$>y23xSlzX+WSU2X?Avp85K!)=paG@yssDZXT@RBJ%9o6>v@ zG=;?Y*GY;#Y{dFQt7YxacC`!%V9xjB$tdbHzVf&=8#o?%@_vV)N=hNG{2oz(HtkyT z+P*=)Y6DHLmXao9pf*4#ZUcWnHsg-~=~Nh^4bH{RU<-~P!aFO-_bkLm%ZA^=BCd81b|$OL~vf{zF9@{KO&5D}cD#=3zDmI z3_Ge|bO#h9e3*GRBRCUEY870f50O|s^ZTan+>NfM^~^~gGEmQ)Q0Y~e0BU12#TUim+s4^kR{h{?%@2;wJ@Q`n1om_v!x&)pg?aArvykpcjtMJJ zY<|e@`^YaLz9YJimDI&wsEcFJCCC{8JIF7HD#~2PfX}m2$j@NV(d&{J1(u(j*$Oo`T@dn{Zi=KbxQQ~9ly`Um1bjU z!Z`kpQk|t!JBL*SechomN z!pF#SF?lw5%>fC7O1Hx$`Y4%b2e~aLM@b$s&<>JNA~*wDkPz}kn9h6uN5|nYWCP|-Hvv4BJ2Gp%)A-NnNU)zZLxo6cx8KKhTzU9GC=RW;It4AiO!P3wnXy5=oG6KYF2(MNN! zduD}CFw17N!Gw}pwIR`8kXY;SgVSrHJ{p_hO+y@O#0L6XC-~>?IhYd~u#eKx!1OU$5(|rosAn#oL6*Ph6n9ribIu*t+na9IpF}C5JZXzb#t?Ho@lDoaGHu(skd4JU41W+7yHB}D+DDGN=6F_m- z8JqyXnR}Oi#tacRC2yfLP5@) z+e5A1KVS|rYi=EiE@{UYi;CYL1Haq?rJ&4p6EfFL`Ul`yt1j2*5Z<+2ZPy^+9O-&^-B}AtB zBATn8Q`C#5W1m*^J`e5M*vP()&BC7Y|SRt|ElfJNR0y6%YXKr`Xkhr4AC~ z|B+wspU~s@ivrIb|2KY}3S(L?$7{V1;r$y4SzhHi+k%}~uaPp}iZYk3LUi(t*1p_m zjpjP@8?B*;n@~tcHZ-EIWn5xv%Ut`iTP?iE;C{ z_X*_P*~(KD2SXxrcV@3O4|+QvdP~Su4{KGofVR|uJh2OJWKYPq#gStIZC&!|MM~!SDvsm`}>H49J%fnObTO)`C<@)2Z_( zeD5BM)7+#_s7f>C|AFTQZ8={wsV60h>76>VeqrsEZy9pIhvUvsz`S1iB$UXNJxX06 z$H!a1yUp<@@RLo?-v<;}=$wCo|0N`BbJPO7m+(}kKnMa@oAacRC+S>(Y4Pdjms@i=}fBIE5aF8Y$DU$abFu- zqF#&f@P4RWhqP$0$$?iitkj`q)HrgR__nUWM#u*fQ4~ zm-fFFILtM9#?J9@>Oc?Ap?4HpvcWHfahQ+mmS*Ox^W|RUD)=NdiGLs(feyzq^eG7! zJ-}QTX2DQx4`2BKQ+(mP)?sji*3b6n6bYdQlN(><>&}7YC`B&8<%C$YG>wd zewmLKFGu>c^zrC1(G{{A!t13;DGPpBaPFH+KP4~Gh=6qJ@l?7f)_ctKd3Fs%MM@G! zrxcB6So70ja`i`xiLRGK(Sebjrae0ZeZuB#eD(O(uhMVrt%5@Uc^mHX#_?ADL;(yA z{_XY1LHt_*kRQK=K7rqNhz))f#-^9G-)YpPO-$`@E1${L?@G9N^hY=V5jj09Q1~nK z583XvB70l&En-Q6g>QaHiv}K|*GOU@#asj5ChS3twx>!52tn;}_#_x=~d&;-bzh&iwblOhn%$D;Wyh=G z7@y|v_`g6ZwWh@AY|6QKQ6y*4Wi&L=N%_`nOxo;vYvKFM8rxh8zL15zux-=9lMOl$ z-ONA{4nIGVMET3D2z&>@;MAf97=Ic&&q$kEDxCxLTNh#g$3kfnnPNclelXl}OmeURy34krs{&jKsf_BIKOqc4u&((FJ|628HZHpzi&gp7pFBpE&v{dMOan~|(wmvTOwfd2M z$}PSFPw+KpR*ZH&DgSvCUOp4uw{MXSSKoeD9Eu^#KMlQQ%Ktr{%4A8C_Z=F4_}rw2 zhu0rQ$@?c`Qc|JvInU^_iVKWW((rk|=v+X~y7qR{zb&xfY+E-pmMiMRwZrCQK{F0^ zD@098vWmuST$E5l^Yg!&Rz8T^*T10LMz!Fx=+{$8X)(xle3ZO1+1H=$%k0f@rw2!# zaFSb+nr|QlH-YJVjI*3{L{nn81G!c>5E-$p8w&F>s%PoxA2vd0Pya6yH6Otd7h{J( z>muV_r089U;xvhTDIIT}K;C_hhWg-gH255cX+MFl1)_qYslp6!Y=Q~NZdzLZ8Vqei z;5Q{5{F*zBA0hzc0uGBz>MIHWT<^#l*?apG>ax7YGOV3+wRNHGVP+F`c4s1$eq1ZU zqW5#<>nZJyzb7a%yky()-@FIAI7J*l1jbIht{TH0O6)shh=Ymv5D>-B)-u6?HRR~X zZ5qlhTC0KAGAtj^3U)z#L@z?oV^TLYmVdAk2_)y@@!*>h4?nBSg2VW%E^Dxw@weB6 z3eGmPQTj_6r;Jhj!;G^K>4Lm{G^lw0GN7{h{(b2(P> z)ki}m(97WKsw%g`zWh%hWyJ6%faSBuwLA-t3gPF-bv9F-39LT{kR}a3%_r}!k%qT1 zeq}xW8OGmJk7K0e)q2e+cY9{e>N;OIzt9RPHtsgs#qTT2(B3X}dv5l@GoG+!j* zEj~IAS}YZeokwSMKtO3(_mOw}19)hukylmjVwU`nW8Pl|E5q-(d4DdDgP5xAGsc4y zyuZ-H@f*j>1FwfI8?V=ix}fK`l+R{5c!LnqgRxG`H+!e=w?`h(Z!yDbx6k{R?XpX` zFcB==5ni-R_+@1}KZIqiZ=kY=R^c8MJd;I;d0scfk#CP)&u5(@j&(Bf;a_krQdLALkv=nb$hLd2x~gjVYy@WiB9c+D01#CW&- zCdc#gt9un)0?!@q#II9fOnIZO$eV};-n}F3)~VqAd5(KnKt!kSxSJ0LCK|!@6C!)f z2FAN^0L}1x1f}{=7=2OXJkZH`Z?(>pH^#KYZU&{*HN-tzy2kjMHOo457#%RzmEM5( z7nrxKZtJ4lYk|{vG+TG%yr}7HWKAq3i$1YQq2pnCfUndD|51uC+e;mAk`&`>cSNpt= z_Ywuh_Y(2zR2Cvs`#MGKi--pMn);1K$J!6F-6y*IE3|>dGcJ3UU=gTwE~CVk5#?x! zuD^M(3y7Zb;Q#W|U0$1%Kz$Row*$f9n^XAeit!Y_T>jE6I2rO1^(9FjG7#1}U(8zP zA?dfkH%fklP|`T&v?O$cWf@TFPk7!Kyc=&ZLOA#w5Oi5@C3>}nQ6XB9mwk=IP_V%~ zS7*ECtFHs+Z%f`gAw%yhFzoTrV0EhntM8-pks`RukejJjB3ePjjgAKoNF<(X$`DUV|-YQ znqi6N;Zy`M;j9Bqc{?!o|A%knYMV=HACFqG;Hc*8ZftBXL=vr!;^IlwZP!2ZP^;TZ zLCe2rkC;o~wk$(N-5T3)aE##;oCQc82j>%q(^fdyB}<6$^cOXz=VD|meehvC#;5C< zNEXa>eQOTCnQCD+n6qWCH@F4~%45*<20P(@hhHK-4K@e&s~@?x72kx^aB2q-$)^1~ z`CQsCwW0QYrxC*#r0xFz$)atjMIhXeD2*a{+P@3_xJwA5odL(r z(mNi?!CM_wpJ{6z?wSCL8m}L3h1aW^=9QLxFub`mMXqECZ64za5tjCTI(T6xVTul<3&?7i@US}Nwu+^-s->}M;?tF)?E!&XRa;$%q$T|m zdS>F*7Oq66MxKqA?DHu>k5 zon_Y78dah8leccW-?X>1g^e@|%ck)4F>p9C+3X(L&Xo#4MT$nX&hd%2MsF#hb?z;L zG~RLq!EGjqZezE}y*N%(E2giSZ5_Nu>tPSugKC^^ZyylDe&LrgF1!#$U*?Mc_^ims zM+vId*~|tsXp^sluCmyPDCQAk;F87bN-OZ2>Ryf0m!g|po|aBL;jd&a)B#dkZ8-}! zs&KEr&3Xqg&moWEIRM}?yc!7?jva`I?e7b?d!Hi!%Sh9Gg0~+q-u?*s`n>}Pa|DXx z@m*V?I>A2>Pl~im8(a@UL}cq55;`q*L0+9?j(zRBzS&y^KzzI)st}4BJZYq@n%5ufhN*V#RrwlqVbW5K=yhBcG>^#@UCgJzmmw4_{m>Vf?$ITNm?b=oIdz>Qn%f6u9phoB+Tv zE#FT)4KV*&H_Ch0(nTa&Wg>ug0QZ9@F8*CFeo-ryhyQrxf%zr<*I^l=7FidMtdB=7 zW`w@*9!i*ykD;PtaIt;{*}iXN695^YTv(6f9ODOk#54j>UQC{>Kf*S=i>dQ)6B5|L z7KydfIw|I4E9Cln|7_4{u(?gpNODJ+0bUXxc+1P1^L)r9%h4)J--cPYR}=L zNGL1S<&#LqsNm4s@N>ZK=asSY`UE7ly%~vpVM2ll#4YoiAw@p>;?`|{$2hX zLAs8d-17F2C7Y;yzI?B1{r}=&dmiKEhae%27~a^Agq^KYkzBWJm1@LVE$2@43M;ys#tz*t{4*?DT><|@NTbbHf<~46viT1n%Tnbe_EH4E({$pCEw9kZ2`}T$+wZdW8 zkJC12hp_FR5N01J0P;A?uKWnNXurU&kd-VUpnjN+4*{b6W-Qpd^)J}grrjGX5DPz5 zG?1tfIR2F=j1Nc0Eq7ur*oO1Lm*VmN$J_nK=XBry<3BmqmFr5bB#kt`XsV$aj-(o7 zDnCkuqN=KDnp&o*s;R1-%C%HAO;EK=Rn1gQQ!_F%GxgTYRIO80Gc!{&GfOiwGcz;m z%*+g*$MbcrD~a~`cz^c&{PE3AuIpU)^E%Jh>%7kEyw2?@*?6>TkjH+*9q1f<;g*YYkXQZV$ zlW-ltc}&i6BT+y2WYox2{D67NIX2*y;S#lzD`&0V#ZXh04t=6Mt2~F88;Lb6s?id9 zOM68OxV=z{x;~%UWX}!8CVLDmAZL!ubS9y62|@4qf#;(Uy~{ zZTxRCbLHKurJqNa@a|YjU1s(6SzS=C*GyeLj_~f|$S&LgD-}7-ZNY4F@is;V2l&az zumY%le9vIO!sf&V#c0v(g}T6Vc35XTl^B$}9ijirpLCh+X~xPoScx}z#|rt5hAus# z<3-!LP2%In@7->Zvsu5nsnH^n-A&nW5-|n2MaEiQ`OuJJa31gkJO^Vq8NZ>AOSay_ zqz~oAF}tmg3-xVn^5)Ww&zX-(GlNt7WxLOGFwRuT!spDxoDMPGe-GvJVn}!!vz|l> zTvl>_FO7H_KA8V)2k?|E>bXgj5cIjzWj@aAEqq0v`$b9M^o@ z-~Z4T&CPb7mQr?<^^?Iv2>-9Mv_eyJ-dfu-N(kZ47N5s*;V`Dy*qK`~Z zDg9&v@(M}&G|#Qqbxg4QH?=+7>oZ^;n(Yu1PQ#bz_?#2Hu)*va2~qVd3gPpfm6vgj zcg?)+{SdZU4&vetc;vBH*`z_|SroTv1l=*q{2w%JD;$~Mu|NVivZy@l z-G0$x%rc*YE=KCn+b~kHI2W&>q)3Q+kS@M$>B#*UulZc}u$|xiAyzjPm6MLei^n2T zcrMmFH8!?&RFUtED)2CFEN=HUc99)Wz8JOkPE>$crm@<7@)2+~@PgDGjwT@o=ZN@T zfD}I}bhcoP;FCZXM@IQlNBIj8j1Fq$Q(UC<525t<`o%h!TY}Y$P7jbO85gY*C=RQk zViY{OU7m?nPa#Hk7|Xrt1(Ia$Ls+;DrvlxHx!o5sCwKwV&hUSTn6};*2_xTaD|;;OrqDsj@z=IGTlx1zkB=qRqd2qb zDE&qItvDD#O(QSF+D13+lR*4c@&{DA9 z%hg!#b73qdtA2om@l~o{kpvjG<`q2(jjZD@F)yxdU-D9!8c8aYE4QuRqT5y_ctE{% z&y9SU<&PK6^qL$H0%@D()J)VNRg z4ETjM(pPwf5)?jWp`i^FmVUtsoYS@%R2;{<#cnR(s=UqP1S%AV&uC0q0cNpM5e zFoZP6RWn<5>+5DedEIR3Gp?Kc)$3-P9n&o8-)> z>UT(+dP8JI{dZzTrM$zCBi`J{v$P4>Z9nmy4X8FV|J~Mp!FzB3 zek+#y2>rtI-u}N83-`hApYYqhUw9awci}e+8=<}95i+Y3{vzI^{e|=+WqA23-t)2l zws#vo3Ta2T^Hh9yLRX~ihW)(mqzr&xLthrE`#mNDRo$`XRekZ|EQ6YH4914hWpZSh zKejD%LYArf176L`b<4;z4$F{F4=iKu_~!WB9;m_`+x&%xp%A_`DHB!F_6=W=zh{wy zNaXKX0&#xt@2kwxk#8qE@#$+tAKr~RHKSAab7*xghJGRQ$16$kX2_1G_2Xlm?y?c3 z7~Z;>KCrjdqui@zxo^-HS?5K|jB~e_5C_kdo8z$zbOOQFmQ=Db(|r%cZw)BpXxwW? zZHI7v;4@=PEMjHf>?}l>st2WZACcOXKk}I)Res&9r(0)9%~pLKALmHzR{cb#WMftR zL#AXCv~8Pq<4T`1u?t3O-nn<*{?QW=zX$iXLaYa0Yz3TPpFvRDU;7t%i>*B?S$OAk zH(1YL9qy1ic^PYg;i05)S7u{(UnI2?`NFwZFpZnHNAazkMLn=Yocn8;ycv@=#uBm+ z{-#|5yN{!kNq8o5F&5!pI2UlHV_UQyt1_*Tk9pf^O=Jz{w3Xk4_qlJNP|g>zl;e7f zS`S687y4_lhu{W%?K!+5CaysU$URUa!|Kkq?;@6}KhF zQQJh7SN)9yF$;?4CAWO3e@BQA2FS|nA3FHnkXi7Uv$J8(x} z6&9E8R|>z5-7YnurKgnB@5S(YF|He8U3adNl3y^)hwwh%neoD zaTm7rH?X2Pk!w0QL|9eNLrraal~wftK4&h9MKN>QeRJ>{x2qiBBG;tNf`7k$!L;c0 zI(v7Nyc_et<$-M(2Ikmrj9W+}va#c4)Hm>(93Kp|oe9^i?>Pyz=WqckY z{q&;2avJXoSL1kv>vh;Jq1u5M^~o291nLH1D*BjVDW(DudM59$Wopm8;bk_HS(G!brUjo_)4VaO_1$R(Yj zF!nV0i&YcZB=w|j@Ta!L(&#GX%#oR9jq&whIKo@LqKWeAJx)9by8!+!KT(QOjp)(6 zC*Y#_nlCkT(YyoR1#qWG$Y{a1+tX2D!5{2kPILe8I!8NV!J7WBUTM?QLApN}tbyjSAgCh+^#8IhWEr!dR~PaTr^7dWeb1-5?f0=|(*Bt)|+FiuEupHhS1jiOaR3-+hhe zm#kd;#$w-;V#yBoHZW(VcV`@&MR$qGt%SM)LVG_Z*NU`$AQjPVoz^#$@5%Y?)0Wpd)wy! zvHm>rk|%A>r(B;(L zk4g{3Uk$t=l|Eed{h4UrpZdyUxw2e@riU?LuKAO{Aco1`kLF~$e&l32{55rVBj)ux z(z0muoH;U+D zjYZ8I^ZW?;`52GC%&Kf$Hdcz z=;bUTK7sfu;-`rh+^y$ZOMDOUl%aZ@3gT;tpCev0Opia0_RH6 z)O+-Ni-=bepHF-P@q@%K67M`hFXs^AQ;9DozJ+)*@%Vf7@{|&Q$c(+ z@l(WmP1WOviEkr*jrhQX+12BWCBA_89^$c2>+y#WpG$lP@hikjX6X6OBEFUQ1>yx&di)v0 zHxWNUJUgt%uOPmh_#xuSU((}`BwkN^7x8PvORDvJXA*BBevWwRGkW|!#LJ1-5^p5F zm-sp2=`;0mmJpvvyq@?*;)jS|BA)%MUd~a(=MmpV{2cL|S$e(|#Fr4?L;MQyg6H&n zrxIU9{4nu^8a;ji@kzv&65mDqJn?SN>*X0sd>-*8;wOlw*6R5VAs!~)NW7VNR-K-2 z1@Q*r&BU{2lla6Nh&L0@nnU6fZy?@GJZr8Ve-!b0;ya07Cf@G_JzqRvqh8-wPy7V& z&hzv*<;0f|-$y+5MLm8gahLcy;>U<*&e!uDO}w7?4&oPy=YLtxcM9=U#E%e9uGixa zCtgi_Bk^OzlfR0=!Bk@zj^A_px@g)Lk|Iv1ZHZzO)1_=vCT@s|@nNxWc%9%nA`1H?POuE&{1d?oQC#8Vpd z_#=tWC%%LDCE^8d==n}3zK-~D;#n*8_~VE#Ccc+=!Z-Bzqlhmievo+TDn0%<;>(F2 zC7$(7J^lpZtB4;b-fguWe-iNx#Lp8iS)<3FM|>ag)J8o{1@T7WXNVVkOOIbed>8SA zwR)Vf#2bj8AfESaJ${(@cH+KudYqBOmlAI#-t9Yj{At9Sh<{AH|9U-sE%9B%G5Y1-%9)<@%|h2_%n%bC4P~3|2Ii|;#-MdB;J1$ ziBEhh@r%TJ{f{1h8u9hSPZ7`AtjC{3d^Pc7#5=#G$FCs1g7^{Q=}mh4vBZ}VKSsRg z_x1Q;;_ngKgzB=P(o=<#O}-$guWs~)GEcmwfM#0%cmQfCBB;YN#cDD=<)Hb-s*jXy~NW$ z)YDHSzLEGP;zJMW@s|*9A>Q*BdYo$FJBeQ*o_|P>UqO5s@g2lZ5KsQ4o^J{9Da4l& z-$DEg@yx?|d4>>oi8m16L;O7P>|g2S8B2UN@h0M@h-V$q^Bqlm9`UWj&k)c4wVv-- z;`PM06F*11+fhB=p~PL{D~RtRewKLVZ}jq%5uZkU8Sx#&PZLjV*2^=1_!QzBh+iZ= zid;dgqRF~pY>Zz108xE_Bh z@lC`p5HIw(|R12_%`CcKkIQu5noRH1o8f7^!N*j zA0uAy7d=ir@n+)rXZ1Mqh#w)I_g6j6Y~qKA_c*7=nMwQr@g9HEw?-!%TnMeE} z@oZalK3X# z=ZN=-)8p3=-%UI@UXL@Lcq8$%#QTTz_;ZQxBc7h1$EhT~p7?p<`H6b`F!8O#FB30K z(&Nt~zK3|i4SJl>#Fr93LOd&3k6%f=k@#`qJv!*|rxR}?eu;Q#iXMMH@qNToZq(zH z6JJUE1o57!dVH7oTH+^&cTLmdR}x=IyqS2XbUl7K@nysh5l_j`G9_iKR`SsOOI1Qd@b>F#EWj$ zOFX|jiBG(V_yywqd+70J5#LVy3h`1$k3X0AF5BtG#b;^&DM+W%ZcwHevNql&*=HO#Mco& zMm)2h9)C3Pdg42XUnHJ?r=IT=;;V=sBA(n|k3W)lJ@H+{uMsaP)bpK5yovZZ;(0}S z{3*m6i60~0zgUmInD{B;r6qct<;2esAAXk}XBF{_#77U%yqS3C;d=Z^;;V_DAf9uN9)Ak) z^~6sT?=wP=Ka2QI;_>(DamEl|LHs!Jo+I`6Gl*{^9&?`_X9V#j#E%m1I!cc}mH1}j zmx!0$ug70N{2=j8qxCowiLWRAG4Y}Y^!PK0zf0UVMvpUs_+sLRiDx~i$Dc@i9r3fo z3&!g4XA$2)JodACoB_nc#5WT^N4(cKJ>O}>*AqWQJm(=j{v_h7i60~0xm=H5L3{=A zgTzxF*5i*MzJ&Ne;wj@veBw)pA0(dgITD}v65hWh0-$gv>F+EN> z@zuo75brlhk3WO>7UGwP4|rUUKbQD!;_;L9IHQO!A%2*6r!VO7ClFsv{3P-0DSG^g z#2bm9B;Ml*J^obU8;GAJoG3BLUrGEZ@${$k z_+yAKBEFY+>~uYT8Sz@;+lXHxUiL*j-vz`E67S^daV8R9PyA!zMNjMT=MvvbJY|L+ zXFT!M#9N4Wtk=ddi-kQ+lXHwUiKwD{(Rzli6>R-amEl|M*KMOUeD<9 zXA$2`JY}XHX9Dr{#4ivpdsdIXi1< z$JtN3Xr7+lCBBjP8R9)()Z_cB)*gQMdH1_s^>e2_zL0&h{rC`Qe>#M76O_{5hHKTJIRRT7{0GUA7cr!OP%iPsa~N&GVLey{2Iy2RHL zKS8|nay@=I@g>Cf5s&@49>0|MEaK~lA1B^vg`V#i;tPoHBz}o_pV#$#rxIUH{3!91 z20i`=;&X{N5Z_Nc_=cWu8Sxt8TZo?{-gBj%?kT_ia6X0r6?X8;Lg)PhF?yJCgW3;@gRzC!Y5mJ>N;h8;Bnw zp0HkzKc4s|;<4Y=<5UpeOgy+jk28UI6Y==(>2WHFZy}zrQI9i`_*UW{6EApEk6%rE zEAdOjOE&58Yl-h59`iqXoFT;L6W>ETezP8bB=Pyg_YjYNi^M0si1-2GDNTC(vBZ}V zKSI3I_x1P{#8(nOM!fSDJ^m!(>xrKu-tPx`{2Jmri3hjpaYhkeO8hAC?6>v!lZkI2 zew=vrHa-3X;tj-)63=``k3Ww1QsM`RCvVr|k0QR1_+H|{AL{Xk6JJdH2=VN9_4reW zZz6t?cFcXA$v9 z#1|3YO8hwSgb(!c^dnwLd;#$$;w{93yY=$CPwKM|Nk5+WT;l7AA0&Q>c-J56x@AFeVel796 z#2@aZ*Jt`ZJ^oPQ)x_5lKTJIKXL`Q(-=_#DzcXOi?Ah#w=KdQdOVaN;$@HxWNU zJo6WNz9WgxCf-E+6!Gto`pi0{m#2bw1Mz0!S-&Lli8l~$CZ2Ve#3$ZByqS2`uk`p& z-J$RA85kOCgAbAd;{^b#Pffn$DcvGiTDNL{hRgpvxsjeeuem(q&`bO((|29d>`?Y7ClZm@s-3+ z5byb0J-$nP3-Qau%Z};s>xut`)aQPZ{u=QO@^II5haUrPJ{@q`n4zQc*nBff+9W#aw+pywMVzKQr5;yq64@t?k3KORjY z>6a4UMf^PRZhzFvGnV)~;!VU)5Kld&=R1UWn0O=cL&SrB((^4L?hk28b#R^qXj^f+UQuO@zu_<(=w@fQ+5O1#HqJx(?8UBpxV zqsOTvzLEGJ$aR%7Bz?~-dcISLuO)thc-O0X{7T|0i8mAPbWM+6PJ9{hL&Q@oTfcrn zd@1oC4bc0UQKbL*!Yz9G{Um;Dj9$(G#H)#KBz}^3XIsyA9PvfOcN4!tyq{0ccRKMq zJL>iMN|NptNxzoFKS8{!UoU4R@s-4ziFbO->Y}&jaU{-C;s=Q*hxGD{ zBEFFLUgE(7J^oPQ^N8;xevSBmL_OahWb5_$81Y}k>FIAt*S&`1yOH=Y;wedb`G*j% zCccjNQQ`?V==lyH?h;>3{1EZjWIf+L#OD)lB7T~9b_YG*al{uA-%0!;@m?u3Y8T z#K#a16JJJrEAgYmFB9*ap_jju_(bCKh_5BShxlpYv6*@~dlDZ-dv&U&0l#J3VpxJ8dsNxX@8Fk6pPL3|T&Ul%>jiz#}0 zE+^?%5iP*IfA8w(@#hggNql%uJBJ8Z?~|v; zSxWo@@$%dCINOLn+gab=vwG=qYKS)zFS$dH(?I+(@rrys&UWHiz4i1p#G8qi^wHxq z5Wh^kw67j#BJqX9w-7%@Jib8Bw}AKr;`PKg6K^IS`x(7F`NYQ)pGUlb_;%vW#4i)i z>Zg~#gm?w<8sZJaw-awBewldIoqG9)k-vi|A?d@!HxNHTJgdK6p0UIi65mDqGVy{! zJ>O}>8;Lg)FC@pQ)FM6K{=_SY&nDhTd=K$6#FLBlauyITCtgE*74cofPZ3Wq(aSlK z_*~*!iJv9j?Jhmv@x&Js-%b27@je6ee5Vj!N&FD;q=9<;BI47DuO@z&czmgz?*QU6 zh_5Anlz7r0J>N3o)x_5m|19YTT1fhf#8b-ja^?{qO1zTzEaFRvZzR5l_;KQwiKh?N z*EgTIOT3ZzN#a9>==m-pet>xAyY)Czi4X3nkHect`t!sKhU)o-i8m2HPrP6liBG(V z_<7<5!%2MNO~gZFJae9;&$~y@cM|ai;)jSQjL_o`AznkgiTD}f-R{-%tsuUX_^^R` z`%EPMQhz;tDS1BaPo(|tBjpK>)YoeW@!7<;6Te8j;66QHm-q(ar-*kOrN^%%-az~a z@yo=s@7MDkLVODGg~T@zKScZ@@vPB$IZKI8B3@5?1M&UD&k|36KriP2;**IlBEE%q z3-Q=7dU<*gA4j~F_*&xoiC-Yz?LobqBZ$`$-$wib@jheqe5Vs%Py8hDuAkN8PawX6 z_+jEHo==n|~-bnm?a=)*cr0-Ly=UY#_g?PcEdYlEsj}h-TQIE5b z_;KR>AJgM3B7TB+(Ih?2GUAtrPk3C9vy*tvWIg=?;%AAE`GOv23-L}<^z^mFj}ssI zgdXSpEWKY{PtwOu)#FSg{x0!OPwH{1i6121YnmQs0r8W>%bwEXtR#Mk_!Fc)$4%Gc zZzbO8i+cJR;w{8WT|Lff;=ZT#^plD2A>MO_9%mu(v&1{xsJGA2ReJnJ;undJ4C`@L z5kF6S_?PrJ4aCn8A5yKySx)>6@zQ7XI7^8iB%V1_k28UIBk|M3^Pkn@R}U^i zU!ccXMEnHt9xv%}!o+tFPgtnODJR}Y{2cL;m-YDd#19eAUZlsFMtm!A-z$2Yk;EH_ zpCMkdSdYJucr)?5uj+AXi0>nwwM36Ijrexr318FWR1mKxzMc3v;@y_&`IZx3NPGwJ z^Td0+s^?old@=D|#4i%hTc+nbmiRp4O~g+SPkl|#cL?z?@kZi@i2Ii7`4$kLM0_dn zKaumJT_k<%*Y)xYC%%CAKH^C$^!THRFCl)2c>3#l{Bq(eh&L1O+@QzrPkcJ@L&Rg> z(Bqd9pGCZh_*vpTR_ggqB;G*$F!AJX=-`4Y;N_-XZ!^9KT>G8{m&m_K)xYb*)&l4nlkMHQ^ znMQmQ@$-*<71#Hrk*muCm@?Elfz&nAA1c6AI7^9dCw_)_ z)?q#VNa8ibHxO?op71L@-xA`}h&K@5NBlDJ-d*+c(7YphIj0fdK>Q5xykC>}#5WK> zLp<*&iBEh3@iWBpext|#6FI(5Bk8vjPiWTTR}kMo{4(*8AL;QMh@T-|(xS&%NW7VN z-f#6dHN+1P?|)2>b04{WRZh~cB7TZ^{_pgBXA<8*Ja}A>Gn)8v;>U>h_`M$ACBBvT z-)__UjcX+R$P;?L%ZZ;Lp8p3uP7U!r#8Xe|aVm*#AbyefkU#427Zd+!j$WV5Bz?*$ zJ^pawwZxl*rmBbGc zk3FO3TSR<1@zul+6OaFkp6`!I|2cr9uO+gC{~j54)spnviC-e#|8IJ})x?{Ke@s08V?F+K;v0ycCf?)kdi=@6e^2VOk)*#s zeE4}i-xb8q5FhXlJf9i2+h<}FkpZiJr*o%7n0mQ3`ZzO(_ zc;|oV`HmyLi1=>eSBUq!q~|-G_~WEL*OK&SiTC@ro^LJj-NchF>v6^rUrGEV@m~MY z<5v@Zmw4CX@!YU}Y=5x+!ytWS@#k$BLrr=LiCJMr{bJ&sF!FY!83pWOm_{2Jni zi01|MIP-`%6EBF<<18e8f_O>19%m`>GsK64^f*5!_1QqupC>*tL66@^{4(*eiF%w3 z#C=J6`U>Jr#1n4N<4hvHo%qXSJfE7Z#~(+0Iq{>!vpVSUClFsn{5bJ$DSG_L#Mco& zO+4>LJ^ocvpVLYDb;OSo&q~$v9Y=gI@x8=-X?pwt#Ag!UO#BS-oOC_k-sJdRNz$(* z-b}nxhMsRZ@nysh5l_j~B|>T^CxzmIrICq3VC;wy=tAl~yP zJ-$nP3-Qau%d+(N^~CoR|4Vm$yp(#g9)A?^dg42YUnbtKv!1U@d_D0K#5>=j$1f+o zg!n$M)?=UYa+ns{1Yy?w4H=}!>v ze5+oba^g#f?;{@DO^;tnd=~L0;%ABXxJ}P@BJo>O_4;fe=}!>P%hB@<6W>nU*Ikb@ zlK4{M&BVL)(Bn@d-bDN|@fXwd`W)iu`PL9`B7TN=x1M_Z3gSzN?<4NZ)#H~C4-?-& z`~>l=JU!o`#9iVmi0>kPmU!mvdU?u-Pb0pJ_zvQyiKq6`%QJxZ6yht0?<0PNc>W!F zc_tEHN_;o*i^O~8>-km?UqpNd@sEjj>aFKHg7_@r>xmyF9^XgLw}|*u;wy;nC4Px` z&%Szj#uHyayovZp;+X|{z9Wd&5Z_4r81a)J-s>*CJQc(j5Z_AtB=OV%dcI}EUE(W= z?<4*Osn1I!eUE{9ImZ#7M|?B!W5kn6^?XZ+PbI#b_-^9oiFX~Om*-LPcZ;J*`sKur z5${o^=j#&RO8gq};e++~i-{j0o;^g5Gllpj;vbOuyhzfIyj#zA74h@LhY!``G!Q>W ze8@08&T`^sh?fr6<18h9ig<@U`gvu^J$n3E#J3W^K)hgt9)AY$O~lU<&%0NTKb818 z;wOoB8>z>iNW78wS>pZg)8o%2zK?kNC_PRk@%6;d6CZHD9>1RWLE>4X^*GOy_BolP z-$Fe00X_aW;%kXtAU<@A9)B6}lf?TysK=R4{4nvHv3i`JllrVC>9-NTLcHv=dcO0C z?PA1++{5bLKhxPaqh&K>FN<4GC z9)BG1rNj>sPyU=9Kc9Fx@!7=J5kEluBJu1By_~~|yTq3h-$DEo@#N3z<$3ld{rKLW zq@PZ_k@!*K$rJSQ3?*Jed^7P=#5+Ht=R2180^&P}5ALMb=LM2}NTpt$CB%;r@Aar2 zr-t}m;+YfmIFpGt5s!IHk29M1O5$gTcb=rjFDJf)_&(yXkL&SEiO(Y5MEorA9+UNa zClYTUewcXj7xegJh&K>FNj!gw9)A|`UBr`~(BqU7UrqcB@qSbF__K-cC7$}E9%nT1 zrNoaA&zh#kuO!|`{1oxLr}X$P@h0LIiI+^*CwW#19cqe_D@UPJ9LNX5t@_`s_S|0wEEaIDq zpC;b5R?l}l@g>Cf5|63VQ%_PP6s+6N#@U{xR{QIePrL#PIpvRv~d>!%A#PjCq@uw5tMEqmo1uyFHtBG$Veu;R=d_8_G@x8>;zpTfZNPHvl zOT>rP>+zQmZz10ED|(!2;yZ~aEzslKO8$SP@g#jC@e9OBGbi6Ysx7kF$dKW#SXQ zrpMVqyz5dueKqle#CyG}$5}x9B=NFkdYqNSFA*R2njU8}@ucN?`l-Zs6R#uBA$R?{ z9>0S4GU5k_$FI=i49^S7q+6{(?k#rBe=N(Nd#mlM zH4~O)!LCHjOn7!RYGwj43nPpViy3rrVY^$+l8_bq}Oj z{+!}Wc=x)|n7$fVHP{M-AC0j>Idf#D^Q>j%6~!WfQ`prCI2VfX@&nrng?x2mKDF>S z+ZL9Y-oiy#*jM-9rxLGjODr>;yO5KEobo!vI9ri}vj9bQ{*DZb6A>bNkn=XQFo5Yy zGwF;#iNZJ8Rv^I+ry*Tp+SR}yv29406z9B*0O2KgN%g1rm`w4zbMfY;V--_l z3uV<)V%-e+B=hD;l7RaLf`YrE>U#aICD|k@3VLa81%4Ds8eU*o0iXLaUUQ1$Fuyxy z%$6L3DM8!y#UM=3Sp+D?>RBm4*AH?LFpwG-tSaqmKkZZ_ugpa;mKBqekrKDY&6T{p zC@FF7-;lKMK`e`a)#;XHJ6}b#pqq_U9ZRHS&KI%D?o)Uv>V}VXV?R~XYX(Q^BxjDy zOhPdNC`QZUNS+#>67O6@<)wyFLe+hcK~X9=GVPWlo799BDSQwq-FHy4?(M)#Xm?pY z5uSLx-vD=N3avoEY{QQ-a#Iqd?Uf-zG(F44%F5^4@h)o+{rN2>y2JcPGzimQN1e#L zsNW6mh|j&?5=XoaDL#)6(nRDZt9Oibqc@4V+K%G3NQ>#-B8E(3I(Rb^60ATxK4$gq zVB)ygADjX-1N&-VA!<1MLs`>z@shddb)?J5u$|vy%e$Wgg@1&XHQ^n24LS2=>q^@Q z_?=fUZ3QwGt;7=H_b@vl=yztJO$Ytqbkv&joJ{+i8hMLubbF2SK9aU1Ax5xBN*i=< zl}6Tb52mZXDY=^rx@Q#L1WAl5mP8qaA-u*pyRhsl8CQMycQvJZoGYKhAK>M=fC(1x zg2}o&QvaW|^5_H*hjg=h8-5bHMG4>4dbz zV0aH!Co#_b3EsK~ow-sAdu7^oe~Py_cOPC`@~})&oY??z?$03pco!XV$eo5PTaqw0 z)!%-0RcvykF9)*CXKsaN{QZ0T1eezKh;e%4sPuxWTx{x8maShq;+aBW$Gd|ROs~%rZ!R& zQsPq*B4I;bZ}|tWw+wl`WyouL=s3_;rI5j3N}MxJN|oqGw_z#+1x59CMS|kju3o!l z_JdD0U8@YGksow{Rvvx_;rAB&HcB(bPt+g5bTNLv1xL4FrD3l0Q^k01-`7ObqmQwq zPQMvRFOBj`NLzznvy9IwwSwNH zv`1f2g1ox_gB2{4$QgwQYh}8X*sfKRqKlga%pPuMm|4Ce>CSAQ`=->)1SB?X^A_9j zA(z~`Pwrrgpk_y%BRgvDowm=Jh2w$qsp7$fkSFoNp_=|^PGB$IN?A5mKM$35((TaM@ry5D``~oqm#R#OAAKM*;8JUYlA^V(+?EIDP zHi`OmtVaiI6+Sb@_GNeOl;!*ai%SQBSYH2;VA__6U9|`GnB~5Wh-S0f8Mb>B4Ldu2 zy!$@zli7B#Y<%G?ww@QO*xM%91n9$1_jlSgGU0O{!U`cxapbe#9cSRrt)Cyj=eqKC zd+$S-z8d(>U{u5}kwMNJnd#KY-a8vFxz@nwva#;{609xOXo>akr(&&_Scgq4nd!_? zV|`X)wTnGQK7TEm7sg_ZsOa#o5Jo!5Jm&?xxDQGqRN((D-PlOFtlr6{%`8HjvE8XS zBG~Q}yk=yCzlS6^5V-i{9ziY%rf&+mzs7W8z+}r0c{>Es|8k)D*ZDST zz;u1i+Fs^JQ&-upvLC_p)xh_WTlhC9X3iX$>7eE3IWNk~dMuq8X)h>8Gt$VpL3}h% zGvSpZ6g4wp%8_Ah#{1VyIo6;banJ$f6%B^jj(pCLBWcL_2vLh~H~Kx~XZi@+c@vXG z8Le7`kpmVpisK+Azl{jC^Pcoi=vHw=mxvB}x4hiz!oQ6`IQ@{&UZ)mtnlN1`W3)&> zZyexk21g=bp0~fHT7SZ{{P;4*50!pEex+P;R`CFSAH#3qR=n6%&C;J9!B%(PLa1E3 z>SKYG7~4jMPicj+wEGQ=OruGX-@yN}?Yx7+JHKqVWIp(2=OyVwBeAXz{(p~cS81W` zs!v9)Ixr;Cfre9TEAU*jpBaLZ%8%b{prS6Av>hDO0#%*w{zQ-KTjNg0qNsN>zX)ab z`OQJroh%-y%MR9i2=Xf0LuRObZOQ??D}M9wI{?3h6Y+v=`vX*BWvFnH_i2mwX`J`z z``)MF-lwhJC)p&e%VEM>1QT9rOhgi5m$N>(-hpDH?%?ZcBeF{QQT0~HtD{8I23|Ak z({2+cM3y-jT_!rr4z6*(fa(a?L1&vOu<3`qSjm=*8&;TDti{LyzF5{Vl0oAqGcXI9 z*5&17w}HtqBpG`7h0IvF!OKsYY=SpxDDK%7e@L`p{I4tE#q*i5%{LIwYqc2Dnk=K+ z-e<{1l^?rmB-%%0EN=s{u%k%hZbzAseWx9D1WAK#N1Z^@n%mJ$W~gn}F{^iqwI1QW zi86)XLe+(Q0jD1tNTeTHEM@T;?9^z3Hp9U{-4pG)$SJ0a+&UOtIdf#D(--la z`RHrRpfsUS26#a;Bu$LOT=dDx!-=)*B#}eGFFt)J$jFth)|?;O)}vP8*S+Hb`rXwi zb#9#<{w;dS+79SwTMymI=EKj>nsQTnCtA`o%8%XdR53Dn49hzEB_Za^HoM=hkx)K= z_-(A5`#b5|+w6y}_G6#(Ppo*c?4@>%WayxcgnUj8UOU9JMtQe&2{{HOn{(_&)VeEC_c;eqf>0pM`4JW_Du9_moD)jH#RPK+A|aUJTNBLu@SYee%R9mQ1Cp)@n&Djd zk4X1ipxw;la_}f@jdL2|y*P<+83Ff{EE@NzU~%n()xC;D_@-xEu!&D|PT;*r_5rV4 z=Mc|p{c;5-8ZpJ+EnLWg;auvd?ApzCq3jtZ$)C(n4Of zxqm=*358+sjWNzie86elHdJKMqo6oU%xZ^N5c{NG<+eBYYuN{%f5h%9@(*do_UZj8B_F#-klPMD(Ok{hfqziP>B z>lHh*HdUHiW-U%>YXgxo)2wsZzZP?XlT*Ecfr zG-gVBOzj=CJ|~&r$DF3v?w>KMyImtW`tCx{hq1JzPA~XFB!L7*0x66CuK4x|B1;Vl z33>_IorAx5{qnLBzE3W15X)TkWrqgcBw=z)NirX9Uj>CyFPI}mz#LO6IW@8@KFJ&Q zCvyT^i>rHnH2z=Y{N6sOTR8O<19@#HZHtu|%5l7YW$~X{yGe3;l2m zVz*sS30GilC@@Eon)C=JWxJ`aBg91PpdA)dchkF%8cCE}yLt;g9wJYk)lzLNMB;+fyk<5UyhN4(d1Jx)FG3&e+f zm&Ey`r{WsxX!IH1k-jVYcK0lH_w+$2kjzEsOJYKS4EtL$5y&+|u7sfNU4_8WIQ#aM zaqfTQ_|*f$iD35aP7)60N%77Nc#HSOiCGxKEJ3vOi0_Tr(h@QfZ8OM9DjbM8@!oYm zf6(0QNbx5W;^fZ?`d*exEOK;1?1VT>BqQp>xKJ%e1`N77A>*`!c<(&?9W(ffH`hkv zz2jZbTrP|xv?G^w|BBTs@ksz&JCXj>J6BJ!9+>Ej%~E^ETXJIhU6eN?WbWnI0bEg* z^IG>DmUjP!mq6yjAzU<&OT~SE7r90hYpxM(Fw5Ck$3htk1>@X7NS_ohgNH9(JvGp~(=4N!#-gqsuR;Do=Oh??@3+%2ty2%vGyqpZUesX$0$Yk*XY`7rvYpqu8HkHityjz&W#9_5U7zk zLHAckRFs7CUfm70Q1uNzC>7grHZT^T-_y$^8f32(;zs&0;yt@B3 zlb7+D6yNK&Ui?(QcWpPtpE+JCI&y52^MySK^CrqC;O>7A zF`;k}=3)?a1s@WT`&E-oku(&qHsV}d^bHlsl?DWn`iXN(q-orSQ1L$Z8WzCvmJfrl zt*wKwk*$NUc6I7SlIsqUNZti?6D@H9mm51aZhw zZbTM;9)Y}7hnmg!kM<%JkGl^6b2lm_Xc}-zLTa#3Izu}p!O6fzDUv-^v^7vX!gnwH zu5hsE9(fBCx3!mOP8}si>oSs+30Ev#U6gSP^^cf=H7cxV$EK*oBTVEXsf=j)s^8;F zAIu_!a`(b^I!FOgldUOizmo~`(#WX<;3fc8GK5blav|E>J;+E6pw6V#7QZLAOQd(Y zG45(cTf>!AD!UI6@IDm3-SGPaekG;+h~t)yg;A&VbNos{=3%e7rmMW|wV3*Q8*JdVA2AG*C&$@Z3 zj7cDq&P*U3b`hMo_|2nWb`72q^1IJS?jC#3pNvPkADFi9NK!fU+0H1Wa{FTiyhj%T z-biN?dfEi^$};Bio;~PwvPC+sfEm3cU3Ye3*GRnf{d1<3bC-FP1lQ%9VaUO|x8;@V zS+88Cj5B2#_1^XYd8GCZSaO_{AG;<;%8D!6azHf6zKjdowW8iU?>3xC7D+HeRw?sF zY0#1^x?h=v>*Wp{f}vh}%Di{%nq0{MLs8@f4OD26tlDQYM)zqU2 z`30mY8jj_?tC}(R*vVXUmGez!96qiIWJZeS;?v6$P`PUY9V7H~8=332xO(w|t4)e0ES-o?tdW>1NwU)WK1|PjuEPfi3 z8FDQ1)ynFil}at(;9^$WsX%r`a+50)caBC&-p)U881zbj^Bvn63tSWDc9jZ`q=;`V zV^TcMo1T&s@ott$aW_7A&B1vXlike`#&*VIx@92pN%iCYn=9L}NNyN-Ayd%f2|0hl zi<^o-=7cjk(?|^c5-gI-wE^#3CsL$~t%a7MH;OHlyavw@b(3JDkv>}Zf3~H> z=(06sz)P9anli)jBShr-J03rbRt3hsW=+$)`b@jNKFhI8_9k| zyX9^x!&{$p>%l4B(D{Cx;opb&&gbxAyZ7Q1i zZ#R;AF6M*_H(mm6F;>9agMu9cF0Ow>KbcC$&f~SwI4s`UMk9;Ic}dJZf@{y8_sS78 z&m;WM)Ft);ue&mr^i6kjqkUtHJ0D3yg>nYz?X(786buxHMB{?a1bp;vl6m`WinR)J z@PuTF-=uMTNMP=;I{{hJ?9GufnpHG=iFYRnx9RRdnxy!la*l=_)ZDk|iTA5F?*Sq(mbLuWxCdIwB4APvW#6LuhE!U zy)&)X5&uW1W7~NUi<$FXZ_-@QDwb0;+gJ5ShV^uY^B7W~o+P1}n>omAW}ipi^B$Sk zr9z{|aZwHkk>?w2U(id@J#th$_36j)>}Wt|l4OYWH)HGyt6N?4x?I4LQ`;R%&%k}bIb_nx#PQ)=&0rXSCz+=a$pbr5HCRfq8sa0cMBcS*_@bO+)C zZr7FKtyl)7u|;>_)eDh1$P9SRuHu|;?e5T5`@LE~XMHo;3C_4=+qFH5m2YYv$4)ab z(0ey~Z`xHK_GzCbXLvhhy-bqmjxDDa-mWWmz`ge1rG1~Il^r{p_BovDKaQ%z5eiQ) z`|a3TJc#VKZ}8XR0ts4!=tr;y&gqd|ySEg#p)3m!MXO~rJX z40>hiYdf;1RBy*-kT!-fRUbs~##FWw#=Keqk8@>y-*)rAB=ZG4mN8eXId{gx#@NpG z^SC_WcfNuFNT@~53FQp97Rx*rZ6h!%HPwoj{!`AoyWsO~vre+4QkS+f19GwZs5~!KB=2(GJ`DNoG0XP`dHYh0Oqv6@>AK8yy%4%Yry7wGn6~-8USh^3?Zw-{L-eNhM_Iq%1IW+Q{{ z-sZtUK|Z+;pj44khtC+eT4s84-7&J_58@>}7B983uy=}=Q1}p%wcp5Qe@^l?T6VFyV`d&DDQ(-9 zxDoNNyA@TGWJc;$F&lhOCwWDRk8?jOd5yzMWP`3Tr;OeP{nRyX6mSk!wXIlQ7_55a z78RUS=w+Z4GgLYdR=XwGW{fCKmSVFW2F+soyM9m4gyz zcMO+f_8d_&3kg$uce2(YhyAEyJU?wab5S^-`!Ld>UdQ9DXf9?4+|OaMsvc4B6>3;r zGezjvtn1Gbmhb=^lXqxwx$@EHFCW(Z*WA23_Z=e&T` z4S7%I7t6W5?YxAJQm#oY#JhJ%*7WN*fABxx)FJtE=s&TarAtn@Hx*}|4@P3Ec(T{W zOZ%7W4Dy4t{)`80M^5s+fk>ICJ*H3&e?H#>X4{R4yqnXV$h6zK$nC$zMUn^10m%6> z;yf6A4h`E_o+XxZ2>FTTB^MXGyvjvcUNV%9=4JY2w0G|zvZ%HOy8V5v1l|}X&gz3e z2V@_0UN#3AGx7*TclPbra0$U8+2+B>j%s6CF3{smV#t0!5LcvMLb>gX+EO%6918;0 zSj?9n+gH5-DQgE{hFv4C(d!d3?LLOBTRTYR`J73ZR+2m}NpJ}8N5e>62jUwEpdF;(PMK%_1tjn{2>?6%fLWXu$_euhkbfpVnbVE81W6uk@RwCH^) zf-jg6d}XRT4ctALv82m6%o-%;|G~^9T`)+r21%D6?6{=M4*4J>AoG`*p~5eUV~MNc zCJ~mn)|%)kL<|*zE({Z7>yEh(`zYCBe9+K^A+6~%t{zxn|7f8~)8EIayPiEnzY%yb`3@?WaFLcmb zE?}1XNX|dZxl;%0MNG$tHQ;*W1%(%d=k;z=!eHxWebi34}I|Gx| zyS&yc8!O;eL2x*@iqTWXKpFf5oiIr5^vJ%Sg}$-^df2qT$j&DX0ngN;iK7#F6>s6L zcnO&iOjN#P;%2(lcn@N?G`H$oFq7uw@GkMB*5{A4!-wT=fsILLCYHf{$WP2a z);j-LnJ>?7W+ToK*$zJEb;PPp4wwOQ2pn)fLV9Tuk@L%!3gf^&cNP}Log44b19N6~ z`=5Q0Gd$c^lV%d>#7v8M4$0Ap$@Kr)!{rv+nQj9L5xq&5h4T(MhRP5AN=;^6ccU$O zpDi)byU&K@O=oXAHL`l>6MdFkLi@F>Uv%g%$BjUE4Pwbb`FnVe^jiUQu3+*CKab^W zhf0CH$zd{S#&xyBWwL551{SrrXC1i_ir#*ReDJx85wP}dOk;yddqkVZO>%$kgSgTz z6Sa7%0_kcEA~Vbvk^4cCpIeKZ-8xfzITx1PqUXvxB(%xiusK)0r``NrGGD;1kykSx zkN37Nzf(0_BnCxZlG2QPdgkqOZWDH|h_#vr#HJ75Wz91l>9K zlo*Gi_QC+tb@DNoOXrCYgXFT!$?N#hw`m1G0&L zf{Fy$+y&8#-H8gr#GpQ?7;r~a1Y}VG_kCd#cYMI0KH>(7;`X>dkNXne@9&(t-FGGl z@_+yDJM+1H>z+Dw>eQ)Ir}nBKbLBg259Tyg7h(<6<+I_ED7})Kyjj%M3EN$GF=4;&VQ<2B>MXwF^a8jczEk-qnUuzRr=P&b zKzCzp8;0a;BYkDOcSa_gZm7Cbv<5`UN^~iGnNiy3&aw>~F#hy%0Bd-^LT|TsT1PGO zcCYc_(orJb2N^cM@Y~UE<-~p9X?**W_{1Bj%@~Ml07cg_+gH?sZm~EMkkd9?y^P>dn@or&MNj}aO z63({+f9P>zr7iMLDe^Ih`D{59ZUJI#U)(q29?IuYxv&b{`=Q}Xs<|aT85=%WwhTR1 zFO15=<1ATve`NToVOVn4ur_bWCY-y=?6kBkVN%$|JgTMi$R3x+S52?sZA;Ti6D41j z5VLO20+Z9|91L!lC`~Mz&~m=g;C|OF^Yq@~WjzcEtCYu`0RZfUmHPoNz5`auC$xsa zY*g}YlGM5o(WbBD2V3h_!mO6rf_a{19Qv8>I2m^I7fjEq2s^m`F#;?!MuDJNs8=hB zXja5K)+*Q?0}5fn*BH1Byq&Q|X^k%lC?=ng+tfWab+?6`;7Ik^5o7K6iI8rn_11d7MR@(LhUQV~d?c^TjRO_;b0wY~!g!$k;pp~lWa(~gz$Ot1a zAF`RIFaWb~dECH+Erks2ilngNf^3|i-)!4YjCad)(~W~WW6u#qiVJ zcr@N6tGvqgJDPr+!ewjH@?dMbdATcRVaxk`ktUbwz2tV0Z`*)_p~;pN)kP{>taO~A zaY;d}O>3248RJ?rcouesp_b!`8l!5vBhT-XZCzmx@v_2G&h|W`9r09@O!NMyNZB+7CS6n=cMNa+ zMadU|+7P6Vo9xvAYS__$Huc}Up7u>ZzeGMg7(6Z`snqdd>UF@=!m4ELm|1Ni{46Aa~AJ+XlqE}45&8v%visZYZ zJdQSGWp32yh^PEohf@*9R9Nd^qPdVkg*ic^S^b8!4h}GcCWOOU2SF{Z$ajO>tZg`% zcUapXkeh7x_O%T{aI}en<^aC|y(}+|CoSx1!j9Yx)We$7=Aq&PHLc`p5`ND(hi`1N zH3>f=>(dALVc|m@mOJG3q-8Qto&9!bu$ihJ7iZM)*hN&+ov42Ie-ss2p%gh;W4pLs zn&fQ%543!em`XP6L^QVZ`}tfK)V_Z{0om(Rx2&VnC?%d!#pHTC^>}ki&QpiU8P5rW z1r^FEX07BCrC))c+P!MuQ280cfFlez!oZy6NpcT(-?zN*zQdk{-Hx&bD*Z<1g-ufb zm%OM5{NM4iIVh$&pYCk0RWN<*XLweFsO-gHOCSNmt z8WXOhujSVUfEn;n5laq&ujZX_Vddg0cRp4Gw2pG5fnpzLlk`=2d3%#{{f* z*;dc|Ue4dNixTIAl?E$UbI=ZXT=QXTpB$Jvm445TJBxEVzO3-R+uQq!E$t^pLqo|o zNu{UNr>BueCYzOBpco$*D4ap+*w%u4b_`N0g*;a^Z(DMyRlNp~?N9FDhZc7}7KfFZ zza_;MIAujG-KAh-J#Sc-my8CxzJ~fC8S{@5qfO7GL|D@+Vw|J(3nGB;_tORW7c8&_ zS&8yl-MKSl8HzTnW_|y;(*aCe3hkf%TP$0rC<5&BBnv#E+kF%}?WG z`mmwCUHRF>vGH9@UWY2h%|9a#k0E`%0jlp4z$gizGeNFUY8ewaD;Jl4MaduWv%$Ng zgTF>GqvQ_?Vlq0K%6Sq(8$U&PofC-(TKf})7dXBRr@NCi*-uc60~3gNXdwBk(U7|s z+}S=Nq9{bIH-J3Xf?&21eD3-B=xQxxwZq&Cy0 z9nH#T($`PUM@rwKI0xngg*-NFtZ?O`LV;apbtWT}7Ef<;3=OjR%&-zwUDnXKct3p6 z8P`0cO=yj#my;-;92hbhHqsaR5O?GjsnS=MW`!ACm)+#<#NWCMVm1lcTWwAfwa=7k z7Bld32*9eTmaL;sB6l@zhMK0HiQgxYv2-?+sM8E5uf%siM|h=bg|6UE~Hl&H;<=`_4`}0A@Cx zEahhE>andtucv>a@YMgXVLR4{$1SZ*N{ZlzG;Ri)y@-tCJPV&r->cTpfJMI3TsHMV zQB^!hG&864l%*X^xh7RHy96IwS5r;O`sNc7%Eo;@_Fx@mDEgYrg9<&5Ei7@q>xCyj z+xuYaV+3oWZk-8}+BYEeiA{S5yPnNJMbj*k*~9_ls#23JP#9a=U$_QV*!5T^AJP}# z$DG|(KtX`RaN84G=gyXyY(5+M3+AM0lBh%GZ4PUgByUC8Nv|t&F&%+Ql+^ew)1N+( zSfZp`axl4cMfI+@BNxkN4_dL1-=_xkjB#0|+Tp?#*b#PmGH*Db8MRI_!>++kTC&Vk$by*}IfA6wfWp)Z@WrmEV6X1) znmk>fUCnzlLop?T0N}T6fSShuwmh0cBDEN2N@6p+0U6oGTH^?z_(ykRvh&f?*qaaU z@cev!D=n~)wbklHUl8is6{il8l~DUU>{yhMv%Y;eezPkoPsI*7kF$ zIL(r!sWR0;{^_of%Q>{4?Ha8VS^}!-7#+O}%n7gU*mwLjeIa@DBtqrye8BZy>%(M1 z*`I6sXsz<<1>p5qoW4!MELpofGhYtM#(Bzxmx8W8_Yc!YvUKU&35+@M8rVo{;Kxa4 zo&pDjb5H4Bdbu>)Es$F`YX^osl4@|+cZMc_^P_pFJ}V=2;?|nOdGk>6deC{O6Pxk- z<8!t=4}#6-$)!??+&XJMUu=MW#t2U%Eo^9}eLeRgfYGeHCXWUhTVt28skMBR(qEF8 zNt*{Y6zw_x6`*7_+?3K^7+NCr`D4k30!|sBKtL2l@mia$_Hag zgMuv<%-#6ddg`4;c#F|gS|qz?5Qyn$#!@i&aNtlFt?uUK}0p5r^l*l62YTD z&8NucvdzcC_-%?Lc=35_F3xIaEG^{M&e$KfggFCwnWUc;DJ#|_veT3E^z_-@NT$vg z=)z(DFOu-N`AN9F9WUZhym45i?s~D)y#10TyRh@T{jz!PG~8DnEZiODsd?vwRQ;8- z#@W2Ax&bBYQFYsKJ*8A@A=JK*hFkwoYkxJy{5OTOgDn|8z8oxT$duA|;Pf#}o7>?` z7|m1X&iQ2&LbgkP`|VdK-Jwc^u|ib@e}`t#M@40x=~2OIyWJDh=F#Hqj=kCgB=*2# z?KS&2wB7@CQ2=)ggfIbNlB4aDbzj|ChhhskqK^E?Kp%^`4V zgY6OU4It^2#J?unqOrZrwT-@67;EbK{u$?=zT_bgqtDY@P&)MYZzA6-%Y%OU8z+Ik z{lU^Pk5&7ynahmHzyBL1C9jM}Z06od{!ntbSQgxPSrZM9WP1U%=1}9R|N3`4x!inS zCu8O>ZDwqk^>LE2Nz7ZhvXP#DBZaeZ7vcxWzvBq(OS}^~ea)Pj4W3p1Z=w&f*iZ7G zpXR~BO4>_{#Lw(`nCmIV=!r->F#->A+W73$Uhv?}iC@i6Zf;aLXOQyyIdVh0zix+p zkfGiD#t*jKDEBMY4ehPEJfv~X%YV1&*?1Y_TY0M(RR?X!fi>snl){kC4uM~G2x$Kq z1l+v&0GXqcfu4WEwmv7a{Cgzgw6c_yBm-QPFG*j=OeVWl4wF`XuMnvUd9}ats-O0( z)&s>45}!>!W_tL48Q<92hZTBJfTG2Bx^mt(pw7WWzS|$HhQ=|y7u*@lq|c<`V;XvD z{ig5ar(t6dmW$Tm@Xc;^Xh(W=UR?ibX9e?-p?mGS6TM?K^^&aR8zv()8)hxvqIZv@ z#F&;f9bB&_PbL_Kw6nguZ!&D-`78(>@Z4std<_l6YxPkY+WZPAx_h|!u{L~U^UK=s(dMmfcyg`Ctrxk$WJWKxn<;wf z;qB4vO9?f#5+0)2Eppm)LX=#r=`Z=wuE$>PTwcB8@-52v+ilGnoluQ#tAB?l=T@%B>P!B~DHHwtO3z}Gaa7}bQ zd_>_Rq2IK5^Q)9EYWp_7K(@BtMTTw>%seJGZ+>;#|EC|w`~@=){4Z+zuliu-FPM2? zgL(?5D7VN@O>9_Atb)%nHGXXZgQL#(1%=fQuOyt+d}GPG@%3(!H8iZ`&kGZjz&gpU zZ&&-sZrr?V@4`9Fli|ij_9tR<8`J?rHnw(6;UM&^VtUqk53zMe#nM=MJ+4}5+4^Uu8iN@<711yGp;YNAh6dIEI~iE>xk{Ke zENFPrb|Cauy0|js0ai-t(gV|CU0PzH?6}A(VNWMSn~;bDbMCbhq`ye?9|1bGNvf$X z180d2p48rV15>tM!b$kW2J_A*ds*SlLyHuyz{X$PoNZ*h7Edxf zr4G?Yi7k0NXxSmatmY`JD)3{n>nTp&3Nhc=IQda?QWLOU_R+(E$j^fqa3`g8Ca{}(xkI~fR z7+kfk$!8L{uQHdw3q({zd6}AbxtjOb33hgR-LkbeVwSyRvN&pC$?V~%Dg3QymK(1HVJS;M6;Y*H zA`86e&nuc0FPax+MKe7`=qikwk)teX>(Jo(efSvYueE-rqRJ4zhq`=zsGfTFs2%m( z`Z$5+W;yY$-aV_==9eR0KY=TQs9Iji7Gbp%O=EtF00;Yf8*2D*O-XNOpHhF{K>uPU z1fwWdbc05 zHHPWqGpgRxgG6XaeTf%M)&BVa^(9W%%~tQ;UivvAH^tLAYo>htgYBU8 zL1(0&1oqeAVcivZK10H6)Tj#6ZjM8q{D)FLWGT0U4(dam*!>mpkgdk)ACBVsu$jdE zk^0Dv!nhC`^%3KtFU#!olcYB&8!t1}Js7H!I0volrutd`%uIE8o~fo>d;*1VKHXGn zMd~4#PZY55Up&|0I8Q|nxBjyBsOAUEpbnW5P=7CKua{_k7?EyKPB(9nOS;$mmR!=y z<{#uz^RZd^5H883xw~9S-GH?z2DYf>FtA1K10M$%Tf3^Tjreb7-p`AlBb}&c)ZC(q;rJklHLS_ zeWk*wroR@BI7)8@%>JWa%KbflHm;&Hhwpp&)^0==OtBj=Ih9XP71q)i7ARh8we5n* zU_~>S-XiJ58#luqt$d4{+Mvzg;8|+zr}sdRgA9*_O&U_S5{9{3N3P_U%*^X;Ah7!7 z%oQ+K4a`-YIVNi*d`jn86iC)s5uy}oySMpB73p_5##BqUAiY@nq zvQlrXe<0utu=!7V8b15eAHkaGOoovDC*E1|sZnx71_RDuhVwE-G!)f`(w~S-N3H>2 z$~+wOWjN@|Q2Mil$ObUvk$^nnxzIceBicNQAIo$v(OX|3$=!x7w(f-2^HlCN7aB3b z`|SI@eHRsWUv$RH7O4g-+_gAP?gBB)YN?n2`5F)x1(N}%!I38}Xs7yaEyDI$`%oi~ z(d?TEXjhg*tJG4r4V7~O7VZ0>eZkuNM!vIibv?*nx{avTIQal7rgsCIaP0K!xI>PV zT(mZpwKN_&Nomu58X2&~@KUsU0EZgHuj4*qA!xioXUiUq0b8=8-TN1)i@=xN+r)DQ zZgisX8Xl}n;k5953GcfWJbwpYuz&Jyd<93ad!s#W=z1HE#HVV8jzg~08l_iamd#A_ zNg2cpn2a@$O1UOtK^T!?nA(=77PjoU26QdI=`Hwel zk-m2aGh|k~pB8JqCtS|h15cKvG%&v*^}0_qx;dQI%}jUt0|3bx{5W|o(i3^@xe)ma zM4m=wuE_P(d&la1mz;T$2XI3*G2R2V6~4uTYGOth9F@S3)BsVbYC{&&cC#cc_BbC> z$wG0gT%BDw;=@_FdZ2LB-d?WO4Ys~XDz`}GrKi;GZ;?}VyE%Z}<#l`9Tvcb9|0m>4 ze94*PJ=06@YhI?pEsxfJL5I8Pl4nXB(0RM)@P1cD&m11dyEB+M9QL*hW)6q3EX#Q@ zhr_PUVCHbxH5tqt4!bsknZsdM38uX$wh%$(j3pe&x8Qv6AmuzCvNBdQ2W<+V`Spbf zoHHUI`&jktWui$s->NtBd3v|kIO@Zev>{y0*=bm2De*?L*U9G|BI7Q!7b}-9=f_Rc z`R~AQ_V_5!VWq7Z5ydCow?Ly`G;(-aQRa()UGQUmYL#Wecy(H1((b{YAC?b!0vU-^ zo;xo?7k?Hfvl6e>JDL>_7sy#oE@8OSkHa&rIWu(MW#qB=IWC&L0>sr;de)eMH{B6X zv@c~;tew&Wy=SHGIQ=$BpYUiv{BCGJ4$et!qS4lO@SYQ9G%}~mXQWm6&9u9+m|@!I zO3jc*4=cUsl}aATTY%-IV)4bTz2J6E=^;KNX^Bg}OB9SKw|%4Ym9t*WJY8~0&x0O& zVWL@ibeA|@NUFl6GGyYSyr!tL6wSU9EI$r>Xin~^8GSg^dQM`iT7*{XB~O7TYCX@> zdf~$mSTVpDf)UxK%KDaTE{+>0UdFvgdEQd~vu4Bs!UnL)gln=xC ze6Xb?o)3(enfz;|v3>84lGl?=8#9j53vqUP#;u9Q8ALQ;mnTZd@(DzdlO==A8U(W) z*Mru+>TO6!6;4IEL=sb>#Qj5r&}+*SD#`tFL$~U5tI+KZV|b6PWRn$Z)b;h8H5*7}j~%8m1lge-84wXgNc z*oMRD8x~IGIfO?I{(5D+Z(3=v`zCZlxTtv-=EqP;AK)kWr9Tnbs-h36saMIM(T@Z} zP+FKlp*Wn&@N3k3fzZq}l*ne4{g za%MeId9pU$jUfG;Fg7uC68clpwN-xe3Yq||pW!vHpeZ6RXw5d=2Q6p{pn^7@woBK~ zA?gz-E9+gki0fS*U)1dRXl7h@Sw>3RmlC|Uu5mGHT{mltT)x>( ztI351m{nKmP)1pG6?>@aL}h3vwN=q;E5<(PfBKk)`gvBZC6{XiqDz%m*H#U8v^B(- zW6DMqo>yL7$*-hPdy39O3m!GUm zxnEY;tl9%yeQ>D>L3lR?PejDJ}cG`HqV1lzUy~Fe*sCZM)zE{tl0D#K} z^&(qnvsMdg)U1@Ok_(_iHz9ck@6z<{z@z2~%ISk>F~*j!rLDICO+MQ;oPjAVp$ts1 zNLLJ5pGoT_&%kTk=!^XtbI5k2vKqJ=<53%lB3@{$;)goj`qH$Y{XJd_4yTC;&-e+P zbWFH(tQjR|5{Ye+rDJ??;h|JulOaFzI}l~!zM?}imC3mCkRY5A9NeD#O)#A%3x-(zZMJXybTqCx9YRg<*L*G%-A(+iNfQ#60QGYwRk1_KT-i zO4tOXKd$tyn3fp`>X2ULo+n2uOa{or%EN$_2RqZ}V}!AOtT_lu|Nf&H%p4A5F2eE5 z0gN&?IGkK>5xDyXbKl1?n>ga;=fu3mQ0RI78dEy=K1f8Z-^lrXIg4|m&$etMc}EuR z?oPOW6NLQq`$Qim`E%d^@y>lnG?SZgY9`HX4|8T)#T@U8!~2r(er&>;gM&?i*3Ux3VH}VsWHoHGbj=xEf zjLk_%R1C@I`J^L7zwj1Z?z_D0`)ptiPKO=p#d2u`1k$KUMcuQ+xA|I5p$7-qF+Ak&R#Oii!S)qkY_RPuT za9L{U`*A#~G*08004aM5E;sYg^Pa|P0B%&Qk{Y%lIWDs>J7b_x1C8{M!x|;2Sbl2* zp7I;jkrIXcX3KOmt1_N^2B5_I5k55cYa@|^oKiDunz4bw{Nn7TT9eUr;3MFRuQ%~E z>her(B>0*Iv_>NXhrDSApLq(wxxt+fUi~)Tth}(^D~DqNb}syIp};`$CEy{>5$k-8 z_gQT)-bcbE1Ub*GYMB7vLh9aIfFq!#qyP>0xq(`*w+j=w+4V(N&cd2O;5hFJ@5lm_{YDJ9x z_@9u*)>p!l|lj@ufO_iSz7;ML+ImkXZNQYe z9H?1a$GXo)e~P7VK0PY)$WGf;G-`Q~5g~K62Pi>8u(ocAJ++sngnI zShG4`d%pHWu_lbh?f49E$If6+rPuG}p8WvftE-1j>a7HlvMU|zu-V8c4bn-R{U9U<)4wWTIDK&Fq)?Cy%n0e<@R*3ILmQIY zV5h%4FF5G)2vkZ_Y`!Y2Dv$mx%`;^>@gHqbI z4QsM!CLE`h&dZ5^ugitiAqVEjI9v;5R%GZ@w|_r;p$_g5P`de)l5m_py$PR_5!YLXk3b9D65BBV7+k zvS9P@B8SbZ%VNQ(_f$u&wx&UR(wtfdvKc4P^X<@#)1r`pYdynRy!Rtb!Ja7jGOKd|=}N!dMF>$d8L0#=6X0PD*uTO?WcWdF;m-^sH&wCWG` z-XhTwvGS3=*eCR*Icjr&0qm0*%p3-zW`$4f9!jFEF7K%+A9kt4U=R`S5zGeZD=coCM z(+WOun_QtbYP95+Rz>T~Hm!RCt(s^FA*03GIuRwcpAob;M^izvAk6}3?%5!`Z`QZu zVh)$fEg8%lz*uuPoP1XlnT0WKjn=Iho;e(EEW`V82k*8F&m11dXET^NfL)mJ>>^Hn zYSD#{pF6R>@ow>cdluFlPVaLW%p3;uywqLiU*Y=^ zwTlPomQb$7t5=kV^fRoV5&ewnXG}lK^|L}hEA=y8)h|chh2WID;VUXbJPKS<;L0dp zV?4`wR`4ib#R68i5ikU#RE}Oz9pX{IssdI=`5NO{&a;9?0f|q)SC>XYKwE>l{0gcD z{U~s~sL(Va1sK!Ma{a8(k4SKlyJ)brp){HiAyWp2uAp+4N7t~NBl=Oo>s?BDy-P_a z@9fv;bUB@_t4m`U9W8StTxocipOF!MNJPCfHpb8L75uEwkA-GVLZrATad{S+^+*a` zR_L-qmle9K&}D@#E3^r|?vk$~`W0Dd?U5jiNxp8PuUAG1T2c6l!dDdDhcSX&5cfsO)RJL_7z$s(X6O#mBLy-dLVhj zAWI$yDjR-LbpH48_C+rF#VcajmzR(hKhxq-;%yh`ieq%z`b8Gs^03rJaBeW&ajA>w zFI?&(PIg@CBFt>5OIGjP2h8lNIYK^%;B&fW-xO&?0&(fu+4HrDQDhO!KjXb z#*Z?5b2$EwGnhGmvDW4RU^}d}5l}Ydmav8hL^WulD?ElIFGahbv zkQ)!z_YULXpUw&2PurX|+Oxu*w~9spt;y*wJO_RbFr5;NF1bRODh{sK8HzOLoJJd- zt!EMb&OB{Bi%sSj*S?UYy$D4*#Tpa^&X%R9ejb;Q*XZEAr<%C!EYXwP$v&^);SPK_ z>A*)uI`EM;oO(6c5W?b42ZH+m23b|Ql9di%+?NPP?Bm3^nH#xfI>y1ss8%=>IXoH} z#Wp@?jqYVNyQjh-$qGo=;AU)dJd|6jR{V?6iIPt0@HmzJ{Ia_) zP!*I~$~v>-X*@6H*-ppg3f>R!JQ+9DOyNQvt+KzIhsAjXI#ej3)om{F-H4oQw&-TS0RH(xrm_kx1r2CEf;QDuY_@ zX`mq^ln;Eo&}i}n;HGb5V0^C3v91$ftA5fa2=(F)MIS=BofdYwue_RVDm@ij2I1OX zx$bU-W-%2PvVv0Cr16)`Pww;)^4s717$I)^$(?c{RjDzgSbhIqVhh?W#3DiSiP=lI zza)hL>KyjbNJ!VoYn!~%J>~p@ITJZQZO+AVe!!e{Ij=P*7x$II6$Dz#vFT2+Hz=Y8)cNC3}s>^LjQK+*u*S3n} zOvyIRpX+KjBPkws6_b}~pG%u|{D&}?R}GRsDuMkxzG)$qwy?lJn!-z3 zLcM*nlCkwRlp`+|@o}Qhs-}Y=awaBn9$fo-(xiUiflxhYhxjyUe$@f8XBEZ4>F|g(3Lwc8gB;#K}(%;sF(y<$df#&|4< zX%C4f2=wH3fK1%0%~x_5n?9iJJ338L0_hcDb+d4mTQOz1wA=RDvBDPHG0SC!wp#zbs6sN(TdDTTjHU(SLX0LZfMprk6qDu zXz|XYxg?`W*u1;Vf1c)ri+v5V4;NdlG7$l@T{U}K(hI^_LN%}ur>?4DpAOE_o#6Bf zM-?mb7M+2e;4Bl)ejS{_o!|@!N4036GrSX=5#gv#4LEzy=vc@zGj3juf|H$9J7ac> zW&fih+J}be^4*iEyUNy`$7c*5TPxSYx@heVSV(ud;@;omcAM?z;2x6EUa?EsEB_ts zanXL{j!IK_IeOw4rhV*mkSr}7^Hccryl}C%c2&jEH#rf~+JG}h z!zE6hY!PAGPLo4@ms34z>jOP0xam{Mh^`EVxmV!+wI>#Osiv4?QyYS5f7P?9w^ZRZ zcn;@z9?wg7)PcB>=j%Kg6PUc~b%o{#ddmbO5NEYLSBG}sAHh>F)8tM;sE zb>w$NJE*lk(zmvV3iw79@bn0!mLSx^i>!Ukhi&?CP%FV;cn~%Zyc#yR%Qyu2u7a2j zwu1=NdSp8m)?>biSgPq!A;|X>#LPrHh(N7JDM$^;Y0EHO5Ek&JhlMcTR~Re)?Jxqh z4rqtz+Psp zSQXI@BT#Fq9j3N@S*kF#bS8vpcf2||Do|^>9j1HxvU3!sJ3StQSC4S zwbr-8)VD8tiNe&=V?&s4gV5<;cM>Id>)>|4rQ4UCtAIScX#a5tW)7$5JXY>{WG zKCpb+9Z32o>hVq#H(_5EO}>DlQrsw~_D3h1wK8C!K9HV^W60W^;ltOJ?8%WD3p`&8 zrb%tvDyZ1>0EcPxvuFDt>{7}dV>RuFUdHhkW<{ANG22SSs^4D}H5c8SwT^9bpRGpo zhOo6QdJA6z_XxM2VRfzSr`i`oJgaz);(0s|0@&$u8t`ZHD7hI<pM=L;($w{q)aUH*I6D4>#dVOm=iAdKLnhM zh$LH!+40sH6&A;a5XTLq*E@7CfVB61efyf>MYBH>M^82E1ES_-9oEHP^S%Y&d*9kl zn)%QBJ~~P?rWUon1G(h+CNN-q2K#0Qrn{LnK*n(LFO(+MF{(oncf#-?j8+mtj|JB-T}3 zRWS}_i4HoYq&5w3HD>1Vs&)%-HCWnk-FvbJ={<`4A*kAE z12x*+GQ7!Q5V5BR-u)2OC-t#x|o_*$AoTEgTgBNYXvE#+)-K^x_A|CX4H+DYxPl1 zc8B_$Sj@(l>xBV&EXPO|$wheD@O06JM2pFDAp>78MxN~8l5!W5R|`osecXKf?Sb{8 zuUS7$Tn}LQ6kyoK#mN6RBbM&Q5engys&+qnZf=07$oo;Q?#6CL_Kg|Y{8+Zcl2`<# zocP5Oi`6=kPe;J>Gq!co?A6uu2uZoL?S~}aS4-T2tZmY!+&U7!t@7a@$~B+cNn%|7 z-Gz&Y=U8N9J8NsU%EFmrKeun`cmf#v@koc+TsXaocSH7>+a@(T;bx$-rB?mUlI^G^ z?hCWHcb;M&so&?~*!Oyw6krM8BJiMP>Zb!G95#*RB^ z&qwy_;rSusjDt(oZDKGXB3XStsHooZ9hB?6T zx{0Lu?Oi3+b>4+#g{D?&J&QPuuOs4ZVxp6Q6wZv-eVa=@Pb2Oq^71^D?L*=F37vSe z-PT<8^;l49rLE_aeqUnvMg_F8)>n+(BfSbGb|-NtEk|rq0E;?KkCrx}K&;u$;@7<_ zZz0a(O;$f5P^~N743$llMF^~QBQoN;l0IIg^l^kwkKw1+M*PExxIZCKe=#oG&T{(5 z$AZu>IfsvQ-6+yltEdv!xpm+oTw(3aP5BE$SV-cB)iO>Gm*0$35I<84Zt5wG+W)7QZFMnQV2mR1j5NuNL<*YY)91V;D0P6pWJ-{!9^|Bmce6W_W zWV+B-xP(+Z2^n^6G8vZaNcdtW@61x<6+>vQ7*8RAp^g|e!yXKt_jpgjcV5O0&x{gR z0NDzgxRktyT$+b9-nakHv;6O0yKmuA^7zT{7pEH(UD!g}cqU-q(`vDCjDw~$Q6Xhy zIX#)*p30OaX}PtRIC{&~)>8#^j7oY6AC>e}eix+G^3``24d-{Qwv=47W3gybWs36< zYuJm_xBt&dELcuY1F>-vXih&po$tvvw!b@7cETF}+9c+UqYgT0oN))|VgtD$`W zEI9Y22u}mHFw!4|Xr7KAy7>%V$ukvJ$LT#wKsgNjY`$Qz0zzW))O zkUQ8J)w3tVf&SucYE<0)s^%tlG>XbfnPO!9`62Pa#ZJ|D>;l0w9~vObE=i% zlJ)YM<6nr+u{9_qb9M|>T=%nNZ2T(2es~94&JK2047)ODq4JRpA6vVua2A}NWMw$C zCnFL!Fpb;rg@@*#1Vd|1Do#W+0!oZ)>8WryOp52S*z?hk3~ zvNW1qsQ5;B%_Y>kdTrP{Gq!g;sIjfuJ@m~-lRi_NinVh?OQoq~=UFoblcOc=aK(T! zW8(#6c7NFmGItgBR|orR&TzF}yXKK3Q|ArS0AaxPW|EU$hwM_7aZhr+#_4gKj9af> za^||PIxIOecn0Ax5KB(s7yyRW2!eQQ?V&nK!!K*I0*a&<65hn}^bgU8%lJ>s+nxqXoq21F+eAwUSR)!p|1sjPLKlQ*sPH zL)|t6S!JtDwF1+(mcv%P=;_fpgD7q zj-z{VQ}WE=<`6jR{`t`BiJKBy4kyqPlu}yp@@dp8x=uT#SU3RbodUlW#2Qi2uyw(pPv1-u1=syd%-j`DCBBA= zhPR-sT^%={BNEnA^al0VzCUz_t(=nS?c!0^+b$#M-YUAhZ_(Rv{bU+7M_f*HRc{tu zAFhxY&mH~|x}~9CS}r_}V5h;GS-x6hZ=<3x^qFmui@M2b*Mv0nu)p91WPr_Whyzva z`}}7u(VUA#@i*_mvXq=X#&9-%=PANN*r##*}4ZDTL6hFD#rU@weJ4h=q(_3Oc z+BrLL^R{{1kd^8m#@l|GSyHR}$((%ukTuYMQSOp=bLM~%=BED&ENgGov7+1u8Yf>Q z&*$U=4RHR}!AY2et{DvhJ^yQk`=NCPawz&Ca!=yZkHBGBvf>(Fa{BlZJIykD&zwF! zGoy--@ux2{=E6ACJXV^kzr_0X7D)X>7%Lq0yN zWd-EHN31x)=&=MSFKDw(?gP*@$HZXujejpVrw^UgP*3M&Y*eRr6M^Q+FF$C>$?Ik~ z1WEZ+vTAu?Vh66&@pRexq4g{I=8SA9kLRCfQL+&++hFem`=OPu0lujXe<)O5By6>N z7f^X|8*ce?bhK&~$$olAPnGFGPlFy}e6MEAx~I{Qm#f?Eh9!0D zT^gG@aTQ9@4ww$e-C#6dhg`EJnU-bSnrqDTzQoSuy2gX+&a%QZy7P>-?(CpBwFR2< zYLxMzjCGF8C`Gv(%&iZ%TUg`fmv@r;9>5RR38vb*GtR||pf|^VK% zU`x+a%()gDCct_&W$)Rv+g)Xgqtl-1VxxhBG*<6zhIAFq^agccLhyEbs%%^>2yRU* z4{pv*a36eg-5azsN1ol*y`9-DOHtVpLmmbjrW!JB3CV93z>zjjGc zPW{wKw`6$>d2$sr0;*ato?_!ueT`nfySU2|7ebiHa^e=ElQM;%$0eg1r*FXA1;Wno z=(H{=;worlm}}?LJ>ec7-R9%t@h+26K}PI3$RzH}J;YAh=N?MQ4wJE;NMmgNXHTd+S9!6K>TOYHY`Y3P zDif8g2D?zYl5e-|$I7^PdU5+A!uQ#H@tK6@-mGFe2kD{YTOiuBLaBL$vWfc^8K`pK z;k@tF3w@d0%LRT{+q=}fq3sTYM)R2OZ~Jmnc#Y;kDSfqZOOmXvtQRz@bQXN(iUu|= z-|7D_L_%Ld&W>&en)5mqw|9``>>zi6Eir8UHF4)V|HLm|?sM%Jvh!-AxUZOePn-rN zuUd6TdRo5}7Yz(Ei-VWnpYdjM` zwW+)d7}_?mbP;ysb%nxS$reP~n6W@A*>;M3W_zCAj-phydiVm6tp**mty|R0F9YIf z4a_Cjg1FgX&UAtHvI<>i0FB07R%U4{FVazUYAc%qUVudz%pAa2XQRG5%X;oNjqhK( z)Y`(&N3Qecbc-9wCZ4HBL<^yg+IG|GX_+ow<#8a&<~i#g6yz5uaZCd|qOp_uhSA!lYF;LG>3a<9nyS zMhwfQp8;OQ<)%7GlEW66=t_f}P;4cO>kM+DLvoyRQskz=e_pafmpTUOOf6foNnLI378;;AXPN#A_FK(XJ!BPARJIU3FLzY90 zKlPE9BfjVGD1v>+TJ3XIEtit7QM|N}zDinDT5V%!Ygn~Rd2#z5+gXI?fVb=V^LwzD zjjQz(FqDNCf}gA-dG^zKHPo3+xQG{r<=B3@a^;%e5(iiEK43~--S!(kt-x|~ibB2~ zYq2?|fY@R&D%zhT+SY5Ju|-hxO5Pxo!f4}Ot8GE}nn13LiHN049fNF}DVy)lq@@WC z#c0xO5l8Jj#;Q@6t>D`AaOF$RJoq$>N+tu2alRP83DxyK6APE{)p{*ITU2}}Zl7-q zHXTShe7wtROfOK)+MQV!0{M*5rk&;8lw7k`SOg$j*}z7k1Nh9|WJhDSXh&iAk%g7g3+$%Y->Kci9%5o@Sk0o6Et_c$ z*8AygcL%Buoqb=T3W@K(MYCP_Pib(5p1R>OXJ1R+M7AN*e@dpWCvnM}m6;T&z2+3a zgQ;&l z;V=94i;G!(PhN)DN{K{Zb$2E^=1EOVja}us7`l_U4_yE`s>Nu$Ol5 zP6%1_g8{%ZUx;Jv*KlxT>3l}vy1 z9j8~f>6!mE0iXEX|5^v+_^$@~dfTPEup|2ReO)I$`+nDg?{|mq(dNiq@i`M}O9k7( zz7@9}=765w>3agc*3yl(uD35+SEsdg23tXj&cn~&f?uOp-62;AunZ65vm#_)ZB`^V{f9gyL_Z=wJD9UvKb9CJO2pET&5ejwmy-ydA? z{huUad^ceH#Vx5IBcAUt+r2AdOkvU%;yH&t&iePFbBbW z3fDsrm^Iyo|1oefz3o5}g-1^p6>cRS{Y9HLz=0n*uu;y|DME=h{k;R0v-NTZi{F4P zXX``<|Dywzv-M&J|FZ*@v-NxjZ|{KRY&9MHuMSww*7*+pO9w1x>+uF|xwKSP&+;_K z>7OZO>BmVqMp071C}wh2(lR+4&!k;rO^@M?(dOLNr$DwAB~Rs*egYbkLTBvhlep90 zK$&_+y}Z(34ykpN&_4xAurcf6)~ERj+);+&)@K%c-?ZR+q5r(^skqqHx>+F<(?sD= zzWa);TLdvdz|jFLKfhG~le*>)lH2t8S^ZePDXmdq1l;pvo09Ws!(kkg+ZUo)JMd@^ zUu=C&-j)j%ew6UDJB07bqgi-#(4_czg12?B4RMaNwpnfU^F?pdHLBZ6tT*OuVHwqt zV7~wbn?gESiC11{`6+eE^3yfJ{LWUWFA_?Aly!Z_>6aV;U*HZuCs%bn1F zq3D0PLto!<`js|)^Pfk*4Vh10rDP}cUnKf>1p4q|-(T&-r|&rZPX}bYs<7;Y)~smV z*$J!fIK9gOM?{JFe~r&{+fHD2I}Di_-n=xmA@kEDJCX6xDPv{RyE*0a#;dIjle`R0 zN~!Fhl~#pO-u{N8;060SQE%>(1=Mf@R&OiN);EA|5!Aerx5@s!Ju`x``xf?_&bIPi z-|U=l0O>XVZ}FK+ZwD6A%l;7ym)s-7Z(HDu_II2Vb&(ee>ZC#Vv9Senz%4K~YC6mu z4jay3<^a~ecCj6SycxN$Wr|~kOSRTzYFDxHkn8D7<>bx4xLAl^8x-+THii)C@(aju zP08C9qAbQvSvmPzyy;I!)l7A~QBKdRcoQqCGO(Q99Bn?Fnme}xiayJ5fhKg}rSLaU zi@O`+e3Z=&4zY0%GiXd%?akV+^t;HWoc<5dukPOGp3>wegpz&_Xes?Zzdel$fh>)Z zd->=sruXrxroWfL{sB%#yfjnBnt>ncOG`rjgkSR+u;l{;QWBuQ74&;I0KFeXJF;8- zIe~foujsL?kK^fl>ErwT(!-)JVl4U^R=D^Pfu~-e#f}=U;l8WEw=rzy-V?sI@mYma zK5M6X(eFFFaQXcOVOpJWHt#LcXX9~ln$I}Ln5|$@kH!5vX)txBd8U-5KZb(_o%F&0 z$ESc@o6_)Ksd*(Sc4~H;J0qG(o8_s-E-CAU3oLF`NjCMaLUJ@u7teq2tmmPtYtIvT z9~Rut&cR=U`=z<>b8$De@)LNzrY(0-Z~nQ%lt!T^ns<`}?0QNrMFDMKdZPJva3-1~ zU*k9PnP~3CXZ98F_S+G(zXCN6vft<1@45E-dVXWmxvgK6s@fU9zLP=rLUqXTu=g^P zhjhtwa-gx7B}9PDBNV*MjNAaTtp||%7D3G`xf}~Z&C^4OlBrMfQxH1mk&dk$FYHY= zy_`5&Kf_CBtj>U4On(RcvNaDlAG#}f3)Fi{tbs{?4w`iet#oi=Vik4#1wclXyr2x7 z)LnK0>3;)X_u*3dOWq9qT?=XM<@%MrN?d>TYdILHN`Hf6$PXUpO0o2}d?uF>Wq+kX zW4kbV73N}de@)@ zZZ8&d7S`SCOMv0=_aIF@p7 zPU9~Z=dR}H)bgx;Et`8deCBXz+#t`h7$V6Y=9~+9^v#xk)Aegew{$*(%P+(GJMKnG zfGBqIlEqsQ*F@ysCc8-qCPc5?^bM8e?WJGp0(of)W%C_q$fSnSa)_2|gX=Y((vD!z z>35lF3%G6j*4sE4+^SnQt$bTx-44VT=zQyDQ;jx8YUAO-ALCdwP3GzPiVgzp-1b!OC0MJ1m>Rs_GA1p-lu;tSNe(mxP(%>+_B1eMBCX-PXCW+noi z1=%^)PKM=Fvtv$W@#h8Vc;y0_9{e8b=XIY2+I2?G^{Vp#qc_`FJda`LZ#=2SHB z$!RqUs7`mNx~E6a(J~7VkIW;=Gecar0P!h#M0sY2k6eKGoIIjD^9gFc65pT`s-PFv zTNA#1_78=#&sd}>59+XGHdfD=&%&|cPIIs}&^^$z%^GnugIKS9G)g&n7{QC%)Uovu zT;}y_ldBB)_xV6u)$%hq^HnXaKN7sRYCU~U2HR%Mz#QR8qw%So&^YJrHVrz0wA$*$ zf%H#MV@k4)D4&cLvNbKQ?}F*dtl&Q-w#p%BWbe`3WQ)re`I28f1N4$u;uy z3>ltL9W5{(UCEX5F{C~Y%~S@s%*NL4SGXIQz0zc6v723Pex;L>F_hm)h#Jw)GRnXK zm*X?ZUAQKnVvG*ij5@1P+9K+$7^alTX{ulpSuNQI9n1P+rB9XKU&zL4x)>;1r>uUU z$v-akqP}9WOw8BHk7_YUyp&RAbZ_Z1p}4f1{8?X>rIqBbI6P9_mm&K%Iig5|7q7nn za|TxAJYb`0Y-AY5jCR7*j1l7a8v*xuqjxLH+Xq=M5V{p%=BGN%Oc}~-(}>e*SGarS z^l017OowC;LM)k4Yp7l-GDLU<3CychKbDk6OKPOB>E^OlI^BX`B9!~nADtgp+e zPd@*ONYlUZqwba4ruP+Iyoa~hv|r>f2*0XhoBZ0zT;>H0T46kfNhjJ0wd8i}L-Kb~ z4(XfmdRp1uIWN>h*qNaT%|js@!gt`t4h;k1d)lf0c7+$3@wWn%mG-MD$mH?R&$y(f9$ zEUouhme|fm zGS^QubSpVovosoeefxhiN?r?s-)UDZCRaK3%#_Hu*M2yw)}u+Tq8-+52>)6Q;UbBp zA^c7}IPJ0C}G2w#Yc%`YPXYwa{S&+;5At5z`LO*azPbsW;m6vO>gEoBs+SLT+9BgFPT1=kXEi6IVtJ6P2MZ-t;^mjWSwdp(CA1kIm z+jg&<=H8bq#FFXvv_D3sFUQ^3(gyTaN39@MSu%5!ypA@nw&iM@tSMC`^(~K z@ja#=M|yG0%=|-+qT9aqBD+wY`^%b>E~kgnvt|b%rsZAAEo>C`u&}?!8u*R>-Wdf~ zV_Uw{UoN`zG_as+fTo^Lh@~9&bg~u%sjITI#w9=BLVjE;^F?08<{uDzz2-Nqt8;C( zZJ&E~fcIBR&F#XiS|{Ek62HZI)j!k;DeQz|jTS#3RGIOL*W`+yBDCJhO zGipB$^ftb3k+jv9%ZVnh2UIUM)t>fbHyogLvjf!d0YmL$2Po|T)DCvQu>cxp@Uvse zvz-)S6>>Z3?D&R-@E*IrW=A@`|A!JB3=*uSwT05jY)ZH7>%SQJba_KcSwMrw%7Asa z*?@++Q?aU>LE$S_s+p-^jMRdiPXD{7{Eq5r=ev z<2AJq&v%xr<3mqlUw(+xCY!2Ol@+Zy>#eM>p+4S#FXysVU1A4W_gX!c(uYW zjIhxHnq!zjE=gK=bv07ORAA__hG~Uh@&5PO1{)f79(Lm@GA=EG>}uXnyLY0w_FKC$ zAujpR=_Yo==}$ceCk-91Q@RVsKtX@84Je2EiVqMV)k@1TI~TcVO{L>G`(n(S*i$zA zU5uAI)^cAg3PN$Y zJ1_GKzQ^$D$Onr$g9Pd$MLw?79#imf%p>yP`_&e*c?zcHe4fG_Mthdy=^bVchaH%~ z%;7Muf^s}_0Moji6}(@I?nkqneP7gpG`k&GBjr;U}dz$9Nf}6 zlHB1)W9+?Ek$IzdrXbNUtudpZKyRFdTg}NJM7_n zhYCpv{eUHfi7DIk#@d9zqXV1L5Ea znavPar7*G1<2pLBG5pQ+W{VS>54N;3|JFxRlAi@0)W@ZG=Qdtkx$GW&jZboSyx^9``zk{tw^eBYV7BszOnz8JjZJHpaA@R{u? z4o#~*h>{_Q_<4TGu$#Yl+%=#tDlHx%0>3?|DxS|o=&MejZ%wv#s4>G z23)E#?M1;dJ+hOE!}%9lI3aV-0GAnEy&oRFm0S8&A=R7Y+IvHIKP$Xn7~X0Y3r}^o z-fs@?cZT<^;r+hw{%UytIJ|!w-uLkC3hqzwZv2U#$ZBmbxRISUoZKa8MYcOXxzpX> zB}bAUxchr@-|g=2%l&nCpDOn@ci%4eeeS+j?r*po78WJnboYI7f6LuAcyN!qza{v0 z-AyxTQSudc-!1nK<@Q1rU3aG-Uv=MC%6-4N?GV=FCl0?$@E^PT+j9Sx+?^9oqx45I zy|y99;ZA^C41vYBh9uqwF5`v9V=;X>?{*O5Z;ZQ+WcS_<-l_sh9xf%d;@MhB z@$4?Q)^PDvPodRKOgfaD%h0%uBA=Hrr$scp_ z4Q{nDH28Ko@wa|QJC^%U=NK0&mf|_O+{IFH?%lkSaX2Y$Fa2IEUA7|BQkEy}MP3CN z4J7}{Xd|z-n|uuJ-LVtbdJxt1bVc`KjYzQ#J1yFFJ$-T;wU3kS5W7y_6TrFiF@uZP zb^5k-rP7OcC@&sLzLKqhl_2-BnSm<^A9apM4B1*rFGIMtpq?F;Z&9wbevc_@{R(Gy ziN1z5=skE_VQryreb!bONZu9FE_rLj=SsDvEZVTC# zb4hj2R?rQP=r@;IBocH%T?;ptV z{%7$%A>Q}mC+M8oUlnKF>W7tZ#N>Cqbv-IVu^hViRhU|~A(gI`qn!NO^;7BAxqGS) zuWjSACi)HdV?IJa&iW}^z)A?HaMI!K5GOWjFzN9R?Y-8x;dLE)ae9g971P)8ind|= z!_JO{Y)R8M$~%{?zI+^uvpAgRcXi@;$UN8c^p>pUt&SuVT1y#b!o|{91tN7i^-UOn0vXq zj}Ux6*#2G|OEE*3a69q;&de`?~6z?NUE+KfdRLYP>DzJ0+_v(tP?ag74!&C;9u} zIj1}OqGfX@=rv%6Z~Ga|r^C=uI~wLb$psXV*K73?)q5t?a6|8TqSZq?(f@YkPJ4S=Jr`5u#ioi=461&Py3U`le0&)qRUeyk$SHptZ>9C!6P+(; zrJP((Ym%kT`~N_46@OXSPc8_%{vm{=j(oouI4`!9qSh*JJ{IfQI+)O^=r<~RmG@ls z!#xanyw~RO%v*Rb6rS|P9PkK?HIc=M3**6q%Y4V9>#aSps$K|JRDf(4hWqS!xI;U^ zH4MXj&OF?ao!}aV;XZdB?(j}<4a0EHoQJzJ9t^{9pZ9NZ4a0EHo`<_LehtHL&zgt3 zGky)jaGyU9cW3+>hT*ml+o32Q`Ff6Moe;&@{l*1O zbDlGx=X*>3(gkw>%j&>SnXYcaTXpCRy4JDbhwzo@w(8JB`JNLhz%2ZyE&Pi@_{Yo( zf7pWXhbz2LbKyT@;a?oWACZM0(fq)X3&J0z@IuXnzsbVCB!qu#7Jf+Kk6sY|aSAWg zT=<(U{COe#Ffp1rSIaE1J~L)9kOn>Z(6G&FaCu)sOLgR}WE!K4EMLPB~oC#U*^Gko6$ zFR|1>mG|I5J%IR7y>1&52JL#U=GQ;OSf!baFjhGyBE-2_wA>E*+|Oq%Z7&5Zq7R`i z6e^5y7qwg#LVQZsn!NQFwvrCc$wqLqr;0x>m26%rw7gUvdCBDPQiXLqtlo4n*St+$J)<2zlJFx8XGAB^tdg*7a6{{nb%dJ~Ar4b($Z zkASDanoWX6>6|!m-%@%aF{Mx8$L_9oXnGRg>%JAA{{hmSsFmY;IOFs-f~IHj6Q57l zhPpiGcf0(~H@|nu@8q1{=jC^{`MpPePtEz=BEJ`y-+Se!R#_I`hvj#U`Q0eLQ*wSE zm0#2RZjhf^$XU3L%kL%TcfI`7`p^76DZh>8_ip*AWuN(dT7EAwzxT`U)STZJ<#(R> zy-$9p<@~-bzYEOoo$`}52b!}2{6Dn437lL-wLgC6-k#gbtUW#Hp3EfaNl3zFLPA)C zo|!De5(L>nFbVrETW;u1STdOqPy{uA5Jdrr&n5bhMNk2eCl63$QFfmS5)e@kLE!;z zh~fABo>SF*yL)C5{lEWwK0UYURMn|dr%s(ZwU1C@@n8>P*sSOdk7ttbp$M4n@B#rp z5&_d4o+RL(M!aG4F!>CMc7y+U>z2S{;%9~TJH~ck%Mdc`5^p3asdM2kXw8;q&&F8J&z%c4r z8%BU=Rd4l|7)Bjv!w3+K=MDb{oEA*Cv{P^Rs|0sZF?hpYAy|}=!c`-wZ8m`Z>vix8 zI}`A~Pwe3E%i@H7$vBv4bTCFqN1mLI6`$eg^>-NH@|Kj2h7PyG>xki`%QukD4Nt{? zeaKv#;X&wgyXWcbJpX&81eQHBm_9uim*DF4GWL#@Sa=9vxOsmYk}m1Hi?1*{4$ZM& zHHoCb;TWKIh6e*LkNG8VYzXt||0zUMXNZl<$yg}KO8FFUjO#t|kexgZ2-`?6*2ZxC z(APB$%Z<5N=fUc7|KAtZ4X;Ly;bCM0Zr}Mg3!Ua-wCc*a&OFy~9s=Fk#r1O*L!Dl@ z8l#Z#SV+;pL_pCf2{;6EH0<}n5qJtvpboZYxT|SRXe0OtKwfwjLUE}E!A*WggP0&g zZ3u#!Z3Txcr7z6M4abd|phUyu!taB_Ske7GhrWQr2)m<#XL>;&cU%x*ceOGv!U6Bz2QrmdoF?MTV* zY(&YxZX}$?h9JtcaWuOF%LvK#%o3IBUB363W_UDBHL`oT=I$qH%TMyLwjuu zZx%P~I}K|LzDWSXI!#z+?o#f-a2}Sn-1dx7TpiBl3EvZ0pxv(B#DSzE{2Qofa)$|S zj^hL@jeQjaSE5x{Mu$lea0~z`7i=d|2Dl{Gf%jVPl3ZxrYlm})v z>VSC3OJ;1mRqghl%m`1Z{+E=9_PX|Eno$FGz-6E!2*3*eubrP}w3#Jpafb=dw5D4+S_2LUG^19DS(6bCQ7}=! zaRM?Dgr_j0_W|w9v>9DVliKRaMv$Po5~qbw$Mk2~tgiIo>& HpX;b=m8dOW15c8 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

    Ngxyb-Y_wLRx&ed1DVpbm`B@&gfv6hsv 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Øj2uj4TNID=ZJJDLiBsg2kfy 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%0A8PQ!9;ZpkKGb3klqRwYotK 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 ZMI8j+qNY$HoPsW8e}ITem=TOj{tb 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

public class Runtime { + // C# compiler copies constants to the assemblies that references this library. + // We needs to replace all public constants to static readonly fields to allow + // binary substitution of different Python.Runtime.dll builds in a target application. + + public static int UCS => _UCS; + #if UCS4 - public const int UCS = 4; + internal const int _UCS = 4; /// /// EntryPoint to be used in DllImport to map to correct Unicode @@ -89,7 +95,7 @@ public class Runtime /// private const string PyUnicodeEntryPoint = "PyUnicodeUCS4_"; #elif UCS2 - public const int UCS = 2; + internal const int _UCS = 2; /// /// EntryPoint to be used in DllImport to map to correct Unicode @@ -100,32 +106,39 @@ public class Runtime #error You must define either UCS2 or UCS4! #endif + // C# compiler copies constants to the assemblies that references this library. + // We needs to replace all public constants to static readonly fields to allow + // binary substitution of different Python.Runtime.dll builds in a target application. + + public string pyversion => _pyversion; + public string pyver => _pyver; + #if PYTHON27 - public const string pyversion = "2.7"; - public const string pyver = "27"; + internal const string _pyversion = "2.7"; + internal const string _pyver = "27"; #elif PYTHON33 - public const string pyversion = "3.3"; - public const string pyver = "33"; + internal const string _pyversion = "3.3"; + internal const string _pyver = "33"; #elif PYTHON34 - public const string pyversion = "3.4"; - public const string pyver = "34"; + internal const string _pyversion = "3.4"; + internal const string _pyver = "34"; #elif PYTHON35 - public const string pyversion = "3.5"; - public const string pyver = "35"; + internal const string _pyversion = "3.5"; + internal const string _pyver = "35"; #elif PYTHON36 - public const string pyversion = "3.6"; - public const string pyver = "36"; + internal const string _pyversion = "3.6"; + internal const string _pyver = "36"; #elif PYTHON37 // TODO: Add `interop37.cs` after PY37 is released - public const string pyversion = "3.7"; - public const string pyver = "37"; + internal const string _pyversion = "3.7"; + internal const string _pyver = "37"; #else #error You must define one of PYTHON33 to PYTHON37 or PYTHON27 #endif #if MONO_LINUX || MONO_OSX // Linux/macOS use dotted version string - internal const string dllBase = "python" + pyversion; + internal const string dllBase = "python" + _pyversion; #else // Windows - internal const string dllBase = "python" + pyver; + internal const string dllBase = "python" + _pyver; #endif #if PYTHON_WITH_PYDEBUG @@ -139,13 +152,19 @@ public class Runtime internal const string dllWithPyMalloc = ""; #endif + // C# compiler copies constants to the assemblies that references this library. + // We needs to replace all public constants to static readonly fields to allow + // binary substitution of different Python.Runtime.dll builds in a target application. + + public static readonly string PythonDLL = _PythonDll; + #if PYTHON_WITHOUT_ENABLE_SHARED - public const string PythonDll = "__Internal"; + internal const string _PythonDll = "__Internal"; #else - public const string PythonDll = dllBase + dllWithPyDebug + dllWithPyMalloc; + internal const string _PythonDll = dllBase + dllWithPyDebug + dllWithPyMalloc; #endif - public static readonly int pyversionnumber = Convert.ToInt32(pyver); + public static readonly int pyversionnumber = Convert.ToInt32(_pyver); // set to true when python is finalizing internal static object IsFinalizingLock = new object(); @@ -162,7 +181,7 @@ public class Runtime /// /// Encoding to use to convert Unicode to/from Managed to Native /// - internal static readonly Encoding PyEncoding = UCS == 2 ? Encoding.Unicode : Encoding.UTF32; + internal static readonly Encoding PyEncoding = _UCS == 2 ? Encoding.Unicode : Encoding.UTF32; /// /// Initialize the runtime... @@ -279,9 +298,9 @@ internal static void Initialize() Error = new IntPtr(-1); IntPtr dllLocal = IntPtr.Zero; - if (PythonDll != "__Internal") + if (_PythonDll != "__Internal") { - dllLocal = NativeMethods.LoadLibrary(PythonDll); + dllLocal = NativeMethods.LoadLibrary(_PythonDll); } _PyObject_NextNotImplemented = NativeMethods.GetProcAddress(dllLocal, "_PyObject_NextNotImplemented"); #if !(MONO_LINUX || MONO_OSX) @@ -549,7 +568,7 @@ internal static unsafe long Refcount(IntPtr op) /// Limit this function usage for Testing and Py_Debug builds /// /// PyObject Ptr - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void Py_IncRef(IntPtr ob); /// @@ -557,160 +576,160 @@ internal static unsafe long Refcount(IntPtr op) /// Limit this function usage for Testing and Py_Debug builds /// /// PyObject Ptr - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void Py_DecRef(IntPtr ob); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void Py_Initialize(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int Py_IsInitialized(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void Py_Finalize(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_NewInterpreter(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void Py_EndInterpreter(IntPtr threadState); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyThreadState_New(IntPtr istate); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyThreadState_Get(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyThread_get_key_value(IntPtr key); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyThread_get_thread_ident(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyThread_set_key_value(IntPtr key, IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyThreadState_Swap(IntPtr key); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyGILState_Ensure(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyGILState_Release(IntPtr gs); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyGILState_GetThisThreadState(); #if PYTHON3 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] public static extern int Py_Main( int argc, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrArrayMarshaler))] string[] argv ); #elif PYTHON2 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] public static extern int Py_Main(int argc, string[] argv); #endif - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyEval_InitThreads(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyEval_ThreadsInitialized(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyEval_AcquireLock(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyEval_ReleaseLock(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyEval_AcquireThread(IntPtr tstate); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyEval_ReleaseThread(IntPtr tstate); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyEval_SaveThread(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyEval_RestoreThread(IntPtr tstate); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyEval_GetBuiltins(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyEval_GetGlobals(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyEval_GetLocals(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_GetProgramName(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void Py_SetProgramName(IntPtr name); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_GetPythonHome(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void Py_SetPythonHome(IntPtr home); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_GetPath(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void Py_SetPath(IntPtr home); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_GetVersion(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_GetPlatform(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_GetCopyright(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_GetCompiler(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_GetBuildInfo(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyRun_SimpleString(string code); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyRun_String(string code, IntPtr st, IntPtr globals, IntPtr locals); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyEval_EvalCode(IntPtr co, IntPtr globals, IntPtr locals); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr Py_CompileString(string code, string file, IntPtr tok); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyImport_ExecCodeModule(string name, IntPtr code); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyCFunction_NewEx(IntPtr ml, IntPtr self, IntPtr mod); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyCFunction_Call(IntPtr func, IntPtr args, IntPtr kw); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyClass_New(IntPtr bases, IntPtr dict, IntPtr name); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyInstance_New(IntPtr cls, IntPtr args, IntPtr kw); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyInstance_NewRaw(IntPtr cls, IntPtr dict); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyMethod_New(IntPtr func, IntPtr self, IntPtr cls); @@ -774,44 +793,44 @@ internal static bool PyObject_IsIterable(IntPtr pointer) return tp_iter != IntPtr.Zero; } - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_HasAttrString(IntPtr pointer, string name); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_GetAttrString(IntPtr pointer, string name); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_SetAttrString(IntPtr pointer, string name, IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_HasAttr(IntPtr pointer, IntPtr name); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_GetAttr(IntPtr pointer, IntPtr name); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_SetAttr(IntPtr pointer, IntPtr name, IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_GetItem(IntPtr pointer, IntPtr key); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_SetItem(IntPtr pointer, IntPtr key, IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_DelItem(IntPtr pointer, IntPtr key); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_GetIter(IntPtr op); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_Call(IntPtr pointer, IntPtr args, IntPtr kw); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_CallObject(IntPtr pointer, IntPtr args); #if PYTHON3 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_RichCompareBool(IntPtr value1, IntPtr value2, int opid); internal static int PyObject_Compare(IntPtr value1, IntPtr value2) @@ -839,47 +858,47 @@ internal static int PyObject_Compare(IntPtr value1, IntPtr value2) return -1; } #elif PYTHON2 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_Compare(IntPtr value1, IntPtr value2); #endif - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_IsInstance(IntPtr ob, IntPtr type); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_IsSubclass(IntPtr ob, IntPtr type); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyCallable_Check(IntPtr pointer); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_IsTrue(IntPtr pointer); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_Not(IntPtr pointer); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_Size(IntPtr pointer); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_Hash(IntPtr op); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_Repr(IntPtr pointer); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_Str(IntPtr pointer); #if PYTHON3 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyObject_Str")] internal static extern IntPtr PyObject_Unicode(IntPtr pointer); #elif PYTHON2 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_Unicode(IntPtr pointer); #endif - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_Dir(IntPtr pointer); @@ -888,21 +907,21 @@ internal static int PyObject_Compare(IntPtr value1, IntPtr value2) //==================================================================== #if PYTHON3 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyNumber_Long")] internal static extern IntPtr PyNumber_Int(IntPtr ob); #elif PYTHON2 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Int(IntPtr ob); #endif - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Long(IntPtr ob); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Float(IntPtr ob); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern bool PyNumber_Check(IntPtr ob); internal static bool PyInt_Check(IntPtr ob) @@ -928,32 +947,32 @@ internal static IntPtr PyInt_FromInt64(long value) } #if PYTHON3 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyLong_FromLong")] private static extern IntPtr PyInt_FromLong(IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyLong_AsLong")] internal static extern int PyInt_AsLong(IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyLong_FromString")] internal static extern IntPtr PyInt_FromString(string value, IntPtr end, int radix); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyLong_GetMax")] internal static extern int PyInt_GetMax(); #elif PYTHON2 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] private static extern IntPtr PyInt_FromLong(IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyInt_AsLong(IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyInt_FromString(string value, IntPtr end, int radix); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyInt_GetMax(); #endif @@ -962,34 +981,34 @@ internal static bool PyLong_Check(IntPtr ob) return PyObject_TYPE(ob) == PyLongType; } - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyLong_FromLong(long value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyLong_FromUnsignedLong(uint value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyLong_FromDouble(double value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyLong_FromLongLong(long value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyLong_FromUnsignedLongLong(ulong value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyLong_FromString(string value, IntPtr end, int radix); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyLong_AsLong(IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern uint PyLong_AsUnsignedLong(IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern long PyLong_AsLongLong(IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern ulong PyLong_AsUnsignedLongLong(IntPtr value); internal static bool PyFloat_Check(IntPtr ob) @@ -997,88 +1016,88 @@ internal static bool PyFloat_Check(IntPtr ob) return PyObject_TYPE(ob) == PyFloatType; } - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyFloat_FromDouble(double value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyFloat_FromString(IntPtr value, IntPtr junk); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern double PyFloat_AsDouble(IntPtr ob); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Add(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Subtract(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Multiply(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Divide(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_And(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Xor(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Or(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Lshift(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Rshift(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Power(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Remainder(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceAdd(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceSubtract(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceMultiply(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceDivide(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceAnd(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceXor(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceOr(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceLshift(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceRshift(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlacePower(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_InPlaceRemainder(IntPtr o1, IntPtr o2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Negative(IntPtr o1); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Positive(IntPtr o1); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyNumber_Invert(IntPtr o1); @@ -1086,49 +1105,49 @@ internal static bool PyFloat_Check(IntPtr ob) // Python sequence API //==================================================================== - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern bool PySequence_Check(IntPtr pointer); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PySequence_GetItem(IntPtr pointer, int index); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySequence_SetItem(IntPtr pointer, int index, IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySequence_DelItem(IntPtr pointer, int index); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PySequence_GetSlice(IntPtr pointer, int i1, int i2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySequence_SetSlice(IntPtr pointer, int i1, int i2, IntPtr v); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySequence_DelSlice(IntPtr pointer, int i1, int i2); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySequence_Size(IntPtr pointer); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySequence_Contains(IntPtr pointer, IntPtr item); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PySequence_Concat(IntPtr pointer, IntPtr other); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PySequence_Repeat(IntPtr pointer, int count); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySequence_Index(IntPtr pointer, IntPtr item); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySequence_Count(IntPtr pointer, IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PySequence_Tuple(IntPtr pointer); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PySequence_List(IntPtr pointer); @@ -1153,10 +1172,10 @@ internal static IntPtr PyString_FromString(string value) } #if PYTHON3 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyBytes_FromString(string op); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyBytes_Size(IntPtr op); internal static IntPtr PyBytes_AS_STRING(IntPtr ob) @@ -1164,23 +1183,23 @@ internal static IntPtr PyBytes_AS_STRING(IntPtr ob) return ob + BytesOffset.ob_sval; } - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl, EntryPoint = "PyUnicode_FromStringAndSize")] internal static extern IntPtr PyString_FromStringAndSize( [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(Utf8Marshaler))] string value, int size ); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyUnicode_FromStringAndSize(IntPtr value, int size); #elif PYTHON2 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyString_FromStringAndSize(string value, int size); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyString_AsString(IntPtr op); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyString_Size(IntPtr pointer); #endif @@ -1190,13 +1209,13 @@ internal static bool PyUnicode_Check(IntPtr ob) } #if PYTHON3 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyUnicode_FromObject(IntPtr ob); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyUnicode_FromKindAndData( int kind, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UcsMarshaler))] string s, @@ -1205,42 +1224,42 @@ int size internal static IntPtr PyUnicode_FromUnicode(string s, int size) { - return PyUnicode_FromKindAndData(UCS, s, size); + return PyUnicode_FromKindAndData(_UCS, s, size); } - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyUnicode_GetSize(IntPtr ob); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyUnicode_FromOrdinal(int c); #elif PYTHON2 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl, EntryPoint = PyUnicodeEntryPoint + "FromObject")] internal static extern IntPtr PyUnicode_FromObject(IntPtr ob); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl, EntryPoint = PyUnicodeEntryPoint + "FromEncodedObject")] internal static extern IntPtr PyUnicode_FromEncodedObject(IntPtr ob, IntPtr enc, IntPtr err); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl, EntryPoint = PyUnicodeEntryPoint + "FromUnicode")] internal static extern IntPtr PyUnicode_FromUnicode( [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(UcsMarshaler))] string s, int size ); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl, EntryPoint = PyUnicodeEntryPoint + "GetSize")] internal static extern int PyUnicode_GetSize(IntPtr ob); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl, EntryPoint = PyUnicodeEntryPoint + "AsUnicode")] internal static extern IntPtr PyUnicode_AsUnicode(IntPtr ob); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl, + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl, EntryPoint = PyUnicodeEntryPoint + "FromOrdinal")] internal static extern IntPtr PyUnicode_FromOrdinal(int c); #endif @@ -1279,7 +1298,7 @@ internal static string GetManagedString(IntPtr op) IntPtr p = PyUnicode_AsUnicode(op); int length = PyUnicode_GetSize(op); - int size = length * UCS; + int size = length * _UCS; var buffer = new byte[size]; Marshal.Copy(p, buffer, 0, size); return PyEncoding.GetString(buffer, 0, size); @@ -1298,52 +1317,52 @@ internal static bool PyDict_Check(IntPtr ob) return PyObject_TYPE(ob) == PyDictType; } - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyDict_New(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyDictProxy_New(IntPtr dict); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyDict_GetItem(IntPtr pointer, IntPtr key); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyDict_GetItemString(IntPtr pointer, string key); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyDict_SetItem(IntPtr pointer, IntPtr key, IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyDict_SetItemString(IntPtr pointer, string key, IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyDict_DelItem(IntPtr pointer, IntPtr key); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyDict_DelItemString(IntPtr pointer, string key); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyMapping_HasKey(IntPtr pointer, IntPtr key); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyDict_Keys(IntPtr pointer); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyDict_Values(IntPtr pointer); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyDict_Items(IntPtr pointer); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyDict_Copy(IntPtr pointer); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyDict_Update(IntPtr pointer, IntPtr other); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyDict_Clear(IntPtr pointer); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyDict_Size(IntPtr pointer); @@ -1356,37 +1375,37 @@ internal static bool PyList_Check(IntPtr ob) return PyObject_TYPE(ob) == PyListType; } - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyList_New(int size); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyList_AsTuple(IntPtr pointer); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyList_GetItem(IntPtr pointer, int index); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyList_SetItem(IntPtr pointer, int index, IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyList_Insert(IntPtr pointer, int index, IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyList_Append(IntPtr pointer, IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyList_Reverse(IntPtr pointer); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyList_Sort(IntPtr pointer); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyList_GetSlice(IntPtr pointer, int start, int end); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyList_SetSlice(IntPtr pointer, int start, int end, IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyList_Size(IntPtr pointer); @@ -1399,19 +1418,19 @@ internal static bool PyTuple_Check(IntPtr ob) return PyObject_TYPE(ob) == PyTupleType; } - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyTuple_New(int size); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyTuple_GetItem(IntPtr pointer, int index); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyTuple_SetItem(IntPtr pointer, int index, IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyTuple_GetSlice(IntPtr pointer, int start, int end); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyTuple_Size(IntPtr pointer); @@ -1431,7 +1450,7 @@ internal static bool PyIter_Check(IntPtr pointer) return tp_iternext != IntPtr.Zero && tp_iternext != _PyObject_NextNotImplemented; } - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyIter_Next(IntPtr pointer); @@ -1439,47 +1458,47 @@ internal static bool PyIter_Check(IntPtr pointer) // Python module API //==================================================================== - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyModule_New(string name); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern string PyModule_GetName(IntPtr module); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyModule_GetDict(IntPtr module); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern string PyModule_GetFilename(IntPtr module); #if PYTHON3 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyModule_Create2(IntPtr module, int apiver); #endif - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyImport_Import(IntPtr name); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyImport_ImportModule(string name); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyImport_ReloadModule(IntPtr module); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyImport_AddModule(string name); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyImport_GetModuleDict(); #if PYTHON3 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PySys_SetArgvEx( int argc, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(StrArrayMarshaler))] string[] argv, int updatepath ); #elif PYTHON2 - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PySys_SetArgvEx( int argc, string[] argv, @@ -1487,10 +1506,10 @@ int updatepath ); #endif - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PySys_GetObject(string name); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PySys_SetObject(string name, IntPtr ob); @@ -1503,10 +1522,10 @@ internal static bool PyType_Check(IntPtr ob) return PyObject_TypeCheck(ob, PyTypeType); } - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyType_Modified(IntPtr type); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern bool PyType_IsSubtype(IntPtr t1, IntPtr t2); internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) @@ -1515,37 +1534,37 @@ internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) return (t == tp) || PyType_IsSubtype(t, tp); } - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyType_GenericNew(IntPtr type, IntPtr args, IntPtr kw); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyType_GenericAlloc(IntPtr type, int n); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyType_Ready(IntPtr type); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr _PyType_Lookup(IntPtr type, IntPtr name); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_GenericGetAttr(IntPtr obj, IntPtr name); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyObject_GenericSetAttr(IntPtr obj, IntPtr name, IntPtr value); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr _PyObject_GetDictPtr(IntPtr obj); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyObject_GC_New(IntPtr tp); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyObject_GC_Del(IntPtr tp); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyObject_GC_Track(IntPtr tp); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyObject_GC_UnTrack(IntPtr tp); @@ -1553,13 +1572,13 @@ internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) // Python memory API //==================================================================== - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyMem_Malloc(int size); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyMem_Realloc(IntPtr ptr, int size); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyMem_Free(IntPtr ptr); @@ -1567,40 +1586,40 @@ internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) // Python exception API //==================================================================== - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyErr_SetString(IntPtr ob, string message); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyErr_SetObject(IntPtr ob, IntPtr message); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyErr_SetFromErrno(IntPtr ob); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyErr_SetNone(IntPtr ob); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyErr_ExceptionMatches(IntPtr exception); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyErr_GivenExceptionMatches(IntPtr ob, IntPtr val); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyErr_NormalizeException(IntPtr ob, IntPtr val, IntPtr tb); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern int PyErr_Occurred(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyErr_Fetch(ref IntPtr ob, ref IntPtr val, ref IntPtr tb); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyErr_Restore(IntPtr ob, IntPtr val, IntPtr tb); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyErr_Clear(); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern void PyErr_Print(); @@ -1608,10 +1627,10 @@ internal static bool PyObject_TypeCheck(IntPtr ob, IntPtr tp) // Miscellaneous //==================================================================== - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyMethod_Self(IntPtr ob); - [DllImport(PythonDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(_PythonDll, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr PyMethod_Function(IntPtr ob); } } From 0abfde0d693e11b3165195d76cbae5e43e7c326a Mon Sep 17 00:00:00 2001 From: dse Date: Sat, 29 Jul 2017 01:57:22 +0400 Subject: [PATCH 271/324] Full featured xplat build. --- NuGet.config | 7 + pythonnet.15.sln | 194 ++++++++++++++++++ setup.py | 31 ++- src/clrmodule/clrmodule.15.csproj | 100 +++++++++ src/console/Console.15.csproj | 104 ++++++++++ .../Python.EmbeddingTest.15.csproj | 120 +++++++++++ src/runtime/Python.Runtime.15.csproj | 120 +++++++++++ src/testing/Python.Test.15.csproj | 91 ++++++++ 8 files changed, 764 insertions(+), 3 deletions(-) create mode 100644 NuGet.config create mode 100644 pythonnet.15.sln create mode 100644 src/clrmodule/clrmodule.15.csproj create mode 100644 src/console/Console.15.csproj create mode 100644 src/embed_tests/Python.EmbeddingTest.15.csproj create mode 100644 src/runtime/Python.Runtime.15.csproj create mode 100644 src/testing/Python.Test.15.csproj diff --git a/NuGet.config b/NuGet.config new file mode 100644 index 000000000..719fbc83c --- /dev/null +++ b/NuGet.config @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/pythonnet.15.sln b/pythonnet.15.sln new file mode 100644 index 000000000..121631e43 --- /dev/null +++ b/pythonnet.15.sln @@ -0,0 +1,194 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26730.3 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Runtime.15", "src\runtime\Python.Runtime.15.csproj", "{2759F4FF-716B-4828-916F-50FA86613DFC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.EmbeddingTest.15", "src\embed_tests\Python.EmbeddingTest.15.csproj", "{66B8D01A-9906-452A-B09E-BF75EA76468F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "clrmodule.15", "src\clrmodule\clrmodule.15.csproj", "{E08678D4-9A52-4AD5-B63D-8EBC7399981B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Console.15", "src\console\Console.15.csproj", "{CDAD305F-8E72-492C-A314-64CF58D472A0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Test.15", "src\testing\Python.Test.15.csproj", "{F94B547A-E97E-4500-8D53-B4D64D076E5F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DebugMono|x64 = DebugMono|x64 + DebugMono|x86 = DebugMono|x86 + DebugMonoPY3|x64 = DebugMonoPY3|x64 + DebugMonoPY3|x86 = DebugMonoPY3|x86 + DebugWin|x64 = DebugWin|x64 + DebugWin|x86 = DebugWin|x86 + DebugWinPY3|x64 = DebugWinPY3|x64 + DebugWinPY3|x86 = DebugWinPY3|x86 + ReleaseMono|x64 = ReleaseMono|x64 + ReleaseMono|x86 = ReleaseMono|x86 + ReleaseMonoPY3|x64 = ReleaseMonoPY3|x64 + ReleaseMonoPY3|x86 = ReleaseMonoPY3|x86 + ReleaseWin|x64 = ReleaseWin|x64 + ReleaseWin|x86 = ReleaseWin|x86 + ReleaseWinPY3|x64 = ReleaseWinPY3|x64 + ReleaseWinPY3|x86 = ReleaseWinPY3|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|x64.Build.0 = DebugMono|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|x86.Build.0 = DebugMono|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|x64.ActiveCfg = DebugWin|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|x64.Build.0 = DebugWin|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|x86.ActiveCfg = DebugWin|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|x86.Build.0 = DebugWin|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|x64.Build.0 = DebugWinPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|x86.Build.0 = DebugWinPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|x64.Build.0 = ReleaseMono|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|x86.Build.0 = ReleaseMono|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|x64.ActiveCfg = ReleaseWin|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|x64.Build.0 = ReleaseWin|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|x86.ActiveCfg = ReleaseWin|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|x86.Build.0 = ReleaseWin|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|Any CPU + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMono|x64.ActiveCfg = DebugMono|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMono|x64.Build.0 = DebugMono|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMono|x86.ActiveCfg = DebugMono|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMono|x86.Build.0 = DebugMono|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWin|x64.ActiveCfg = DebugWin|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWin|x64.Build.0 = DebugWin|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWin|x86.ActiveCfg = DebugWin|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWin|x86.Build.0 = DebugWin|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMono|x64.Build.0 = ReleaseMono|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMono|x86.Build.0 = ReleaseMono|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMono|x64.ActiveCfg = DebugMono|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMono|x86.ActiveCfg = DebugMono|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWin|x64.ActiveCfg = DebugWin|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWin|x64.Build.0 = DebugWin|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWin|x86.ActiveCfg = DebugWin|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWin|x86.Build.0 = DebugWin|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMono|x64.ActiveCfg = DebugMono|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMono|x64.Build.0 = DebugMono|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMono|x86.ActiveCfg = DebugMono|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMono|x86.Build.0 = DebugMono|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWin|x64.ActiveCfg = DebugWin|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWin|x64.Build.0 = DebugWin|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWin|x86.ActiveCfg = DebugWin|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWin|x86.Build.0 = DebugWin|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMono|x64.Build.0 = ReleaseMono|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMono|x86.Build.0 = ReleaseMono|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMono|x64.ActiveCfg = DebugMono|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMono|x64.Build.0 = DebugMono|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMono|x86.ActiveCfg = DebugMono|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMono|x86.Build.0 = DebugMono|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWin|x64.ActiveCfg = DebugWin|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWin|x64.Build.0 = DebugWin|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWin|x86.ActiveCfg = DebugWin|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWin|x86.Build.0 = DebugWin|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMono|x64.Build.0 = ReleaseMono|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMono|x86.Build.0 = ReleaseMono|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A6347B90-BBE6-4E45-90BF-1BD8B76069E3} + EndGlobalSection +EndGlobal diff --git a/setup.py b/setup.py index c23f6b5bd..895219eec 100644 --- a/setup.py +++ b/setup.py @@ -133,6 +133,16 @@ def _get_long_description(): class BuildExtPythonnet(build_ext.build_ext): + user_options = build_ext.build_ext.user_options + [ + ('xplat', None, None) + ] + def initialize_options(self): + build_ext.build_ext.initialize_options(self) + self.xplat = None + + def finalize_options(self): + build_ext.build_ext.finalize_options(self) + def build_extension(self, ext): """Builds the .pyd file using msbuild or xbuild""" if ext.name != "clr": @@ -198,7 +208,7 @@ def build_extension(self, ext): _config = "{0}Win".format(CONFIG) elif DEVTOOLS == "Mono": - _xbuild = "xbuild" + _xbuild = 'dotnet msbuild' if self.xplat else 'xbuild' _config = "{0}Mono".format(CONFIG) else: raise NotImplementedError( @@ -206,10 +216,10 @@ def build_extension(self, ext): cmd = [ _xbuild, - 'pythonnet.sln', + 'pythonnet.15.sln' if self.xplat else 'pythonnet.sln', '/p:Configuration={}'.format(_config), '/p:Platform={}'.format(ARCH), - '/p:DefineConstants="{}"'.format('%3B'.join(defines)), + '/p:{}DefineConstants="{}"'.format('Custom' if self.xplat else '','%3B'.join(defines)), '/p:PythonBuildDir="{}"'.format(os.path.abspath(dest_dir)), '/p:PythonInteropFile="{}"'.format(os.path.basename(interop_file)), '/verbosity:{}'.format(VERBOSITY), @@ -221,6 +231,7 @@ def build_extension(self, ext): self.debug_print("Building: {0}".format(" ".join(cmd))) use_shell = True if DEVTOOLS == "Mono" else False + subprocess.check_call(" ".join(cmd + ["/t:Clean"]), shell=use_shell) subprocess.check_call(" ".join(cmd + ["/t:Build"]), shell=use_shell) @@ -267,6 +278,20 @@ def _install_packages(self): nuget = "mono {0}".format(nuget) use_shell = True + if self.xplat: + if DEVTOOLS == "MsDev": + _config = "{0}Win".format(CONFIG) + elif DEVTOOLS == "Mono": + _config = "{0}Mono".format(CONFIG) + else: + raise NotImplementedError( + "DevTool {0} not supported (use MsDev/Mono)".format(DEVTOOLS)) + + cmd = "dotnet msbuild /t:Restore pythonnet.15.sln /p:Configuration={0} /p:Platform={1}".format(_config, ARCH) + self.debug_print("Updating packages with xplat: {0}".format(cmd)) + subprocess.check_call(cmd, shell=use_shell) + return; + cmd = "{0} update -self".format(nuget) self.debug_print("Updating NuGet: {0}".format(cmd)) subprocess.check_call(cmd, shell=use_shell) diff --git a/src/clrmodule/clrmodule.15.csproj b/src/clrmodule/clrmodule.15.csproj new file mode 100644 index 000000000..fe31bdb9d --- /dev/null +++ b/src/clrmodule/clrmodule.15.csproj @@ -0,0 +1,100 @@ + + + + + + net40 + x64;x86 + DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 + clrmodule + clrmodule + clrmodule + 2.4.0 + false + false + false + false + false + false + bin\clrmodule.xml + bin\ + false + 1591 + ..\..\ + $(SolutionDir)\bin\ + 6 + prompt + $(PYTHONNET_DEFINE_CONSTANTS) + XPLAT + $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + + + + x86 + + + x64 + + + + true + $(DefineConstants);PYTHON2;TRACE;DEBUG + full + + + $(DefineConstants);PYTHON2 + true + pdbonly + + + true + $(DefineConstants);PYTHON2;TRACE;DEBUG + full + + + $(DefineConstants);PYTHON2 + true + pdbonly + + + true + $(DefineConstants);PYTHON3;TRACE;DEBUG + full + + + $(DefineConstants);PYTHON3 + true + pdbonly + + + true + $(DefineConstants);PYTHON3;TRACE;DEBUG + full + + + $(DefineConstants);PYTHON3 + true + pdbonly + + + + + + + + + + + + + + $(TargetPath) + $(TargetDir)$(TargetName).pdb + + + + + + + + diff --git a/src/console/Console.15.csproj b/src/console/Console.15.csproj new file mode 100644 index 000000000..2b22144de --- /dev/null +++ b/src/console/Console.15.csproj @@ -0,0 +1,104 @@ + + + + net40 + x64;x86 + DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 + Exe + nPython + Python.Runtime + nPython + 2.4.0 + false + false + false + false + false + false + bin\nPython.xml + bin\ + false + 1591 + ..\..\ + $(SolutionDir)\bin\ + 6 + python-clear.ico + prompt + $(PYTHONNET_DEFINE_CONSTANTS) + XPLAT + $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ + + + x86 + + + x64 + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) + true + pdbonly + + + $(PythonManifest) + + + + + + + Properties\SharedAssemblyInfo.cs + + + + + + Python.Runtime.dll + + + + + + + + + + + + diff --git a/src/embed_tests/Python.EmbeddingTest.15.csproj b/src/embed_tests/Python.EmbeddingTest.15.csproj new file mode 100644 index 000000000..c490463e8 --- /dev/null +++ b/src/embed_tests/Python.EmbeddingTest.15.csproj @@ -0,0 +1,120 @@ + + + + + net40 + x64;x86 + DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 + net45 + Python.EmbeddingTest + Python.EmbeddingTest + Python.EmbeddingTest + 2.4.0 + false + false + false + false + bin\ + false + $(OutputPath)\$(AssemblyName).xml + 1591 + ..\..\ + $(SolutionDir)\bin\ + 6 + prompt + $(PYTHONNET_DEFINE_CONSTANTS) + XPLAT + $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ + + + x86 + + + x64 + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants); + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants); + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants); + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants); + true + pdbonly + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(TargetPath) + $(TargetDir)$(TargetName).pdb + + + + + + + + diff --git a/src/runtime/Python.Runtime.15.csproj b/src/runtime/Python.Runtime.15.csproj new file mode 100644 index 000000000..567be6090 --- /dev/null +++ b/src/runtime/Python.Runtime.15.csproj @@ -0,0 +1,120 @@ + + + + net40 + AnyCPU + DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 + net45 + Python.Runtime + Python.Runtime + Python.Runtime + 2.4.0 + false + false + false + false + false + false + bin\ + false + $(OutputPath)\$(AssemblyName).xml + 1591;NU1701 + ..\..\ + $(SolutionDir)\bin\ + 6 + True + ..\pythonnet.snk + $(PYTHONNET_DEFINE_CONSTANTS) + XPLAT + $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ + + + + $(DefineConstants);PYTHON2;PYTHON27;UCS4 + true + pdbonly + + + $(DefineConstants);PYTHON3;PYTHON36;UCS4 + true + pdbonly + + + true + $(DefineConstants);PYTHON2;PYTHON27;UCS4;TRACE;DEBUG + false + full + + + true + $(DefineConstants);PYTHON3;PYTHON36;UCS4;TRACE;DEBUG + false + full + + + $(DefineConstants);PYTHON2;PYTHON27;UCS2 + true + pdbonly + + + $(DefineConstants);PYTHON3;PYTHON36;UCS2 + true + pdbonly + + + true + $(DefineConstants);PYTHON2;PYTHON27;UCS2;TRACE;DEBUG + false + full + + + true + $(DefineConstants);PYTHON3;PYTHON36;UCS2;TRACE;DEBUG + false + full + + + + + + + + + + + + + + + + + + + + + + clr.py + + + + + + + + + + + + + + + $(TargetPath) + $(TargetDir)$(TargetName).pdb + + + + + + + diff --git a/src/testing/Python.Test.15.csproj b/src/testing/Python.Test.15.csproj new file mode 100644 index 000000000..8bfd3afe7 --- /dev/null +++ b/src/testing/Python.Test.15.csproj @@ -0,0 +1,91 @@ + + + + net40 + x64;x86 + DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 + Python.Test + Python.Test + Python.Test + 2.4.0 + bin\Python.Test.xml + bin\ + false + 1591,0067 + ..\..\ + $(SolutionDir)\bin\ + 6 + false + ..\pythonnet.snk + prompt + $(PYTHONNET_DEFINE_CONSTANTS) + XPLAT + $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ + + + x86 + + + x64 + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) + true + pdbonly + + + + + + + + + + + + + + $(TargetPath) + $(TargetDir)$(TargetName).pdb + + + + + + From 085239291e53e6952e6a5ccf90358e71c1fa6220 Mon Sep 17 00:00:00 2001 From: dse Date: Mon, 4 Sep 2017 18:39:53 +0400 Subject: [PATCH 272/324] All finalizers are disabled until valid implementation. Helps to avoid non relevant CI build faults. --- src/runtime/delegatemanager.cs | 4 ++++ src/runtime/pyobject.cs | 6 +++++- src/runtime/pyscope.cs | 6 +++++- src/runtime/pythonexception.cs | 4 ++++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/runtime/delegatemanager.cs b/src/runtime/delegatemanager.cs index df5eec427..7632816d1 100644 --- a/src/runtime/delegatemanager.cs +++ b/src/runtime/delegatemanager.cs @@ -195,6 +195,10 @@ public Dispatcher(IntPtr target, Type dtype) ~Dispatcher() { + // We needs to disable Finalizers until it's valid implementation. + // Current implementation can produce low probability floating bugs. + return; + // Note: the managed GC thread can run and try to free one of // these *after* the Python runtime has been finalized! if (Runtime.Py_IsInitialized() > 0) diff --git a/src/runtime/pyobject.cs b/src/runtime/pyobject.cs index 1b41b0893..5900e80b7 100644 --- a/src/runtime/pyobject.cs +++ b/src/runtime/pyobject.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Dynamic; using System.Linq.Expressions; @@ -43,6 +43,10 @@ protected PyObject() ~PyObject() { + // We needs to disable Finalizers until it's valid implementation. + // Current implementation can produce low probability floating bugs. + return; + Dispose(); } diff --git a/src/runtime/pyscope.cs b/src/runtime/pyscope.cs index 25282ac26..67f93c6e2 100644 --- a/src/runtime/pyscope.cs +++ b/src/runtime/pyscope.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Collections.Generic; using System.Dynamic; @@ -527,6 +527,10 @@ public void Dispose() ~PyScope() { + // We needs to disable Finalizers until it's valid implementation. + // Current implementation can produce low probability floating bugs. + return; + Dispose(); } } diff --git a/src/runtime/pythonexception.cs b/src/runtime/pythonexception.cs index 4fe07f3cf..4031b0526 100644 --- a/src/runtime/pythonexception.cs +++ b/src/runtime/pythonexception.cs @@ -57,6 +57,10 @@ public PythonException() ~PythonException() { + // We needs to disable Finalizers until it's valid implementation. + // Current implementation can produce low probability floating bugs. + return; + Dispose(); } From d16100c9b6af123a40398b3b2f40518f0cd552bb Mon Sep 17 00:00:00 2001 From: dse Date: Sat, 29 Jul 2017 09:32:50 +0400 Subject: [PATCH 273/324] NetCoreApp 2.0 target added, compile issues fixed, CI system improved. --- .travis.yml | 1 + appveyor.yml | 2 ++ ci/appveyor_run_tests.ps1 | 17 ++++++++++++++ setup.py | 6 ++++- src/clrmodule/clrmodule.15.csproj | 1 + src/console/Console.15.csproj | 12 +++++----- src/console/pythonconsole.cs | 9 ++++++-- src/embed_tests/Program.cs | 19 ++++++++++++++++ .../Python.EmbeddingTest.15.csproj | 22 +++++++++++++------ src/embed_tests/pyimport.cs | 4 ++++ src/runtime/Python.Runtime.15.csproj | 19 +++++++++++----- src/runtime/nativecall.cs | 9 +++++++- src/runtime/polyfill/ReflectionPolifills.cs | 16 ++++++++++++++ src/testing/Python.Test.15.csproj | 11 ++++++---- src/tests/fixtures/netcoreapp2.0/.gitkeep | 0 15 files changed, 123 insertions(+), 25 deletions(-) create mode 100644 src/embed_tests/Program.cs create mode 100644 src/runtime/polyfill/ReflectionPolifills.cs create mode 100644 src/tests/fixtures/netcoreapp2.0/.gitkeep diff --git a/.travis.yml b/.travis.yml index 2468ed60a..627fd9ebf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -169,6 +169,7 @@ install: script: - python -m pytest - mono $NUNIT_PATH src/embed_tests/bin/Python.EmbeddingTest.dll + - if [[ $BUILD_OPTS == --xplat ]]; then dotnet src/embed_tests/bin/netcoreapp2.0_publish/Python.EmbeddingTest.dll; fi after_script: # Uncomment if need to geninterop, ie. py37 final diff --git a/appveyor.yml b/appveyor.yml index c7c3a7810..74d6698c8 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -43,6 +43,8 @@ init: install: - pip install --upgrade -r requirements.txt --quiet - choco install vswhere -y + # - cmd: curl -O https://download.microsoft.com/download/5/6/B/56BFEF92-9045-4414-970C-AB31E0FC07EC/dotnet-runtime-2.0.0-win-x86.exe + # - cmd: dotnet-runtime-2.0.0-win-x86.exe /install /quiet /norestart /log install.log # Install OpenCover. Can't put on `packages.config`, not Mono compatible - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages -Verbosity quiet diff --git a/ci/appveyor_run_tests.ps1 b/ci/appveyor_run_tests.ps1 index 2821cf915..b45440fbe 100644 --- a/ci/appveyor_run_tests.ps1 +++ b/ci/appveyor_run_tests.ps1 @@ -44,6 +44,23 @@ if ($CS_STATUS -ne 0) { Write-Host "Embedded tests failed" -ForegroundColor "Red" } +if ($env:BUILD_OPTS -eq "--xplat"){ + if ($env:PLATFORM -eq "x64") { + $DOTNET_CMD = "dotnet" + } + else{ + $DOTNET_CMD = "c:\Program Files (x86)\dotnet\dotnet" + } + + # Run Embedded tests for netcoreapp2.0 (OpenCover currently does not supports dotnet core) + Write-Host ("Starting embedded tests for netcoreapp2.0") -ForegroundColor "Green" + &$DOTNET_CMD .\src\embed_tests\bin\netcoreapp2.0_publish\Python.EmbeddingTest.dll + $CS_STATUS = $LastExitCode + if ($CS_STATUS -ne 0) { + Write-Host "Embedded tests for netcoreapp2.0 failed" -ForegroundColor "Red" + } +} + # Set exit code to fail if either Python or Embedded tests failed if ($PYTHON_STATUS -ne 0 -or $CS_STATUS -ne 0) { Write-Host "Tests failed" -ForegroundColor "Red" diff --git a/setup.py b/setup.py index 6cfd773a6..376a575aa 100644 --- a/setup.py +++ b/setup.py @@ -257,7 +257,11 @@ def build_extension(self, ext): subprocess.check_call(" ".join(cmd + ["/t:Clean"]), shell=use_shell) subprocess.check_call(" ".join(cmd + ["/t:Build"]), shell=use_shell) - + if DEVTOOLS == "MsDev15": + subprocess.check_call(" ".join(cmd + ["/t:Console_15:publish;Python_EmbeddingTest_15:publish", "/p:TargetFramework=netcoreapp2.0"]), shell=use_shell) + elif DEVTOOLS == "dotnet": + subprocess.check_call(" ".join(cmd + ["/t:publish", "/p:TargetFramework=netcoreapp2.0"]), shell=use_shell) + if DEVTOOLS == "Mono" or DEVTOOLS == "dotnet": self._build_monoclr() diff --git a/src/clrmodule/clrmodule.15.csproj b/src/clrmodule/clrmodule.15.csproj index fe31bdb9d..6b1593a43 100644 --- a/src/clrmodule/clrmodule.15.csproj +++ b/src/clrmodule/clrmodule.15.csproj @@ -22,6 +22,7 @@ 1591 ..\..\ $(SolutionDir)\bin\ + $(PythonBuildDir)\$(TargetFramework)\ 6 prompt $(PYTHONNET_DEFINE_CONSTANTS) diff --git a/src/console/Console.15.csproj b/src/console/Console.15.csproj index 2b22144de..3192a143a 100644 --- a/src/console/Console.15.csproj +++ b/src/console/Console.15.csproj @@ -1,7 +1,7 @@ - net40 + net40;netcoreapp2.0 x64;x86 DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 Exe @@ -15,12 +15,14 @@ false false false - bin\nPython.xml bin\ - false + false + $(OutputPath)\$(AssemblyName).xml + $(OutputPath)\$(TargetFramework)\$(AssemblyName).xml 1591 ..\..\ $(SolutionDir)\bin\ + $(PythonBuildDir)\$(TargetFramework)\ 6 python-clear.ico prompt @@ -88,7 +90,7 @@ - + Python.Runtime.dll @@ -99,6 +101,6 @@ - + diff --git a/src/console/pythonconsole.cs b/src/console/pythonconsole.cs index e9bb31e69..912e9bb0d 100644 --- a/src/console/pythonconsole.cs +++ b/src/console/pythonconsole.cs @@ -16,8 +16,9 @@ namespace Python.Runtime /// public sealed class PythonConsole { +#if NET40 private static AssemblyLoader assemblyLoader = new AssemblyLoader(); - +#endif private PythonConsole() { } @@ -25,9 +26,11 @@ private PythonConsole() [STAThread] public static int Main(string[] args) { + // Only net40 is capable to safely inject python.runtime.dll into resources. +#if NET40 // reference the static assemblyLoader to stop it being optimized away AssemblyLoader a = assemblyLoader; - +#endif string[] cmd = Environment.GetCommandLineArgs(); PythonEngine.Initialize(); @@ -37,6 +40,7 @@ public static int Main(string[] args) return i; } +#if NET40 // Register a callback function to load embedded assemblies. // (Python.Runtime.dll is included as a resource) private sealed class AssemblyLoader @@ -73,5 +77,6 @@ public AssemblyLoader() }; } } +#endif } } diff --git a/src/embed_tests/Program.cs b/src/embed_tests/Program.cs new file mode 100644 index 000000000..b4439e3e4 --- /dev/null +++ b/src/embed_tests/Program.cs @@ -0,0 +1,19 @@ +using System; + +using NUnit.Common; + +using NUnitLite; + +namespace Python.EmbeddingTest +{ + public class Program + { + public static int Main(string[] args) + { + return new AutoRun(typeof(Program).Assembly).Execute( + args, + new ExtendedTextWrapper(Console.Out), + Console.In); + } + } +} diff --git a/src/embed_tests/Python.EmbeddingTest.15.csproj b/src/embed_tests/Python.EmbeddingTest.15.csproj index e4a35ab97..9df876ef0 100644 --- a/src/embed_tests/Python.EmbeddingTest.15.csproj +++ b/src/embed_tests/Python.EmbeddingTest.15.csproj @@ -2,10 +2,11 @@ - net40 + net40;netcoreapp2.0 x64;x86 DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 - net45 + Exe + false Python.EmbeddingTest Python.EmbeddingTest Python.EmbeddingTest @@ -15,16 +16,19 @@ false false bin\ - false - $(OutputPath)\$(AssemblyName).xml + false + $(OutputPath)\$(AssemblyName).xml + $(OutputPath)\$(TargetFramework)\$(AssemblyName).xml 1591 ..\..\ - $(SolutionDir)\bin\ + $(SolutionDir)\bin\ + $(OutputPath)\$(TargetFramework)_publish 6 prompt $(PYTHONNET_DEFINE_CONSTANTS) XPLAT $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(DefineConstants);NETCOREAPP $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ @@ -87,8 +91,12 @@ + + + + + - @@ -113,7 +121,7 @@ - + diff --git a/src/embed_tests/pyimport.cs b/src/embed_tests/pyimport.cs index 3bb9a34d6..acb3433de 100644 --- a/src/embed_tests/pyimport.cs +++ b/src/embed_tests/pyimport.cs @@ -30,7 +30,11 @@ public void SetUp() /* Append the tests directory to sys.path * using reflection to circumvent the private * modifiers placed on most Runtime methods. */ +#if NETCOREAPP + const string s = "../../fixtures"; +#else const string s = "../fixtures"; +#endif string testPath = Path.Combine(TestContext.CurrentContext.TestDirectory, s); IntPtr str = Runtime.Runtime.PyString_FromString(testPath); diff --git a/src/runtime/Python.Runtime.15.csproj b/src/runtime/Python.Runtime.15.csproj index e9b90057a..56f415006 100644 --- a/src/runtime/Python.Runtime.15.csproj +++ b/src/runtime/Python.Runtime.15.csproj @@ -1,7 +1,7 @@ - net40 + net40;netcoreapp2.0 AnyCPU DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 net45 @@ -16,17 +16,20 @@ false false bin\ - false - $(OutputPath)\$(AssemblyName).xml + false + $(OutputPath)\$(AssemblyName).xml + $(OutputPath)\$(TargetFramework)\$(AssemblyName).xml 1591;NU1701 ..\..\ - $(SolutionDir)\bin\ + $(SolutionDir)\bin\ + $(PythonBuildDir)\$(TargetFramework)\ 6 True ..\pythonnet.snk $(PYTHONNET_DEFINE_CONSTANTS) XPLAT $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(DefineConstants);NETCOREAPP $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ @@ -98,6 +101,12 @@ + + + 4.4.0 + + + @@ -118,7 +127,7 @@ - + diff --git a/src/runtime/nativecall.cs b/src/runtime/nativecall.cs index 9d1b0f41c..c3af14398 100644 --- a/src/runtime/nativecall.cs +++ b/src/runtime/nativecall.cs @@ -106,12 +106,19 @@ private static void GenerateThunk(TypeBuilder tb, MethodInfo method) il.Emit(OpCodes.Ldarg_1); +#if NETCOREAPP + il.EmitCalli(OpCodes.Calli, + CallingConventions.ExplicitThis, + method.ReturnType, + nargs, null + ); +#else il.EmitCalli(OpCodes.Calli, CallingConvention.Cdecl, method.ReturnType, nargs ); - +#endif il.Emit(OpCodes.Ret); tb.DefineMethodOverride(mb, method); diff --git a/src/runtime/polyfill/ReflectionPolifills.cs b/src/runtime/polyfill/ReflectionPolifills.cs new file mode 100644 index 000000000..6daf5312f --- /dev/null +++ b/src/runtime/polyfill/ReflectionPolifills.cs @@ -0,0 +1,16 @@ +using System; +using System.Reflection; +using System.Reflection.Emit; + +namespace Python.Runtime +{ + public static class ReflectionPolifills + { +#if NETCOREAPP + public static AssemblyBuilder DefineDynamicAssembly(this AppDomain appDomain, AssemblyName assemblyName, AssemblyBuilderAccess assemblyBuilderAccess) + { + return AssemblyBuilder.DefineDynamicAssembly(assemblyName, assemblyBuilderAccess); + } +#endif + } +} diff --git a/src/testing/Python.Test.15.csproj b/src/testing/Python.Test.15.csproj index 8bfd3afe7..50093fb17 100644 --- a/src/testing/Python.Test.15.csproj +++ b/src/testing/Python.Test.15.csproj @@ -1,19 +1,21 @@ - net40 + net40;netcoreapp2.0 x64;x86 DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 Python.Test Python.Test Python.Test 2.4.0 - bin\Python.Test.xml bin\ - false + false + $(OutputPath)\$(AssemblyName).xml + $(OutputPath)\$(TargetFramework)\$(AssemblyName).xml 1591,0067 ..\..\ $(SolutionDir)\bin\ + $(PythonBuildDir)\$(TargetFramework)\ 6 false ..\pythonnet.snk @@ -85,7 +87,8 @@ $(TargetDir)$(TargetName).pdb - + + diff --git a/src/tests/fixtures/netcoreapp2.0/.gitkeep b/src/tests/fixtures/netcoreapp2.0/.gitkeep new file mode 100644 index 000000000..e69de29bb From d743ba8c59c21d1460e5c0d52dc391c8e0e54b24 Mon Sep 17 00:00:00 2001 From: denfromufa Date: Thu, 10 Aug 2017 01:49:54 -0500 Subject: [PATCH 274/324] Update .travis.yml (#524) --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index bf336dc9f..d6fcc4a88 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,6 +35,7 @@ before_install: - export LD_LIBRARY_PATH=$PY_LIBDIR:$LD_LIBRARY_PATH install: + - pip install --upgrade setuptools # TEMP - due to setuptools 36.2.0 bug - pip install --upgrade -r requirements.txt - coverage run setup.py install From ae7219e1a0c88bf01709470a41d5bedb3e523c6a Mon Sep 17 00:00:00 2001 From: Rickard Holmberg Date: Thu, 10 Aug 2017 18:20:44 +0200 Subject: [PATCH 275/324] Use PyPI published version of codecov (#526) --- requirements.txt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index bcceedf25..18f9bf902 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,11 +2,10 @@ pytest coverage +# Coverage upload +codecov + # Platform specific requirements pip; sys_platform == 'win32' wheel; sys_platform == 'win32' pycparser; sys_platform != 'win32' - -# Coverage upload -# codecov v2.0.6 isn't on PyPi -https://github.com/codecov/codecov-python/tarball/v2.0.6 From af62a1ab1f5dcdefaeca4cbf94f3ef99f525d364 Mon Sep 17 00:00:00 2001 From: Rickard Holmberg Date: Fri, 11 Aug 2017 20:16:18 +0200 Subject: [PATCH 276/324] Explicitly specify files to upload to codecov (#527) * Explicitly specify files to upload to codecov * Produce coverage.xml --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index c108801e7..2f1103f5a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -47,11 +47,11 @@ test_script: on_finish: # Temporary disable multiple upload due to codecov limit of 20 per commit. # https://docs.codecov.io/blog/week-8-2017 - # - coverage xml -i + - coverage xml -i # - codecov --file coverage.xml --flags setup_windows # - codecov --file py.coverage --flags python_tests # - codecov --file cs.coverage --flags embedded_tests - - codecov --flags setup_windows + - codecov --file py.coverage cs.coverage coverage.xml --flags setup_windows artifacts: - path: dist\* From 8b0b399ffb52faafab4d47a9510da5ed24a37fca Mon Sep 17 00:00:00 2001 From: dse Date: Fri, 18 Aug 2017 19:03:54 +0400 Subject: [PATCH 277/324] .Net 45 TargetingPack System.XML.dll naming fix. (For xplat linux build). --- src/runtime/Python.Runtime.15.csproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/runtime/Python.Runtime.15.csproj b/src/runtime/Python.Runtime.15.csproj index 567be6090..e9b90057a 100644 --- a/src/runtime/Python.Runtime.15.csproj +++ b/src/runtime/Python.Runtime.15.csproj @@ -113,6 +113,10 @@ $(TargetDir)$(TargetName).pdb + + + + From 3f02c12fdf34af8f7226e75b8998a7634201e39f Mon Sep 17 00:00:00 2001 From: dse Date: Fri, 18 Aug 2017 21:34:17 +0400 Subject: [PATCH 278/324] Setup.py --xplat option refactored. Travis-ci build matrix extended. --- .travis.yml | 157 +++++++++++++++++++++++++++++++++++++++++++++++----- setup.py | 92 ++++++++++++++++++++---------- 2 files changed, 206 insertions(+), 43 deletions(-) diff --git a/.travis.yml b/.travis.yml index d6fcc4a88..fbb67d397 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,18 +1,145 @@ +dist: trusty sudo: false - language: python -python: - - 2.7 - - 3.3 - - 3.4 - - 3.5 - - 3.6 - - 3.7-dev - + matrix: - allow_failures: - - python: 3.7-dev + include: + - python: 2.7 + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: 3.3 + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: 3.4 + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: 3.5 + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: 3.6 + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: "3.7-dev" + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: 2.7 + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + addons: + apt: + sources: + - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main + key_url: https://packages.microsoft.com/keys/microsoft.asc + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + packages: + - mono-devel + - ca-certificates-mono + - dotnet-hostfxr-2.0.0 + - dotnet-runtime-2.0.0 + - dotnet-sdk-2.0.0 + - python: 3.3 + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + addons: + apt: + sources: + - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main + key_url: https://packages.microsoft.com/keys/microsoft.asc + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + packages: + - mono-devel + - ca-certificates-mono + - dotnet-hostfxr-2.0.0 + - dotnet-runtime-2.0.0 + - dotnet-sdk-2.0.0 + - python: 3.4 + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + addons: + apt: + sources: + - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main + key_url: https://packages.microsoft.com/keys/microsoft.asc + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + packages: + - mono-devel + - ca-certificates-mono + - dotnet-hostfxr-2.0.0 + - dotnet-runtime-2.0.0 + - dotnet-sdk-2.0.0 + - python: 3.5 + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + addons: + apt: + sources: + - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main + key_url: https://packages.microsoft.com/keys/microsoft.asc + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + packages: + - mono-devel + - ca-certificates-mono + - dotnet-hostfxr-2.0.0 + - dotnet-runtime-2.0.0 + - dotnet-sdk-2.0.0 + - python: 3.6 + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + addons: + apt: + sources: + - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main + key_url: https://packages.microsoft.com/keys/microsoft.asc + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + packages: + - mono-devel + - ca-certificates-mono + - dotnet-hostfxr-2.0.0 + - dotnet-runtime-2.0.0 + - dotnet-sdk-2.0.0 + - python: "3.7-dev" + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + addons: + apt: + sources: + - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main + key_url: https://packages.microsoft.com/keys/microsoft.asc + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + packages: + - mono-devel + - ca-certificates-mono + - dotnet-hostfxr-2.0.0 + - dotnet-runtime-2.0.0 + - dotnet-sdk-2.0.0 + allow_failures: + - python: "3.7-dev" + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: "3.7-dev" + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe env: global: - LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so @@ -23,8 +150,8 @@ env: addons: apt: sources: - - mono - - mono-libtiff-compat + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF packages: - mono-devel - ca-certificates-mono @@ -37,11 +164,11 @@ before_install: install: - pip install --upgrade setuptools # TEMP - due to setuptools 36.2.0 bug - pip install --upgrade -r requirements.txt - - coverage run setup.py install + - coverage run setup.py install $BUILD_OPTS script: - python -m pytest - - mono ./packages/NUnit.*/tools/nunit3-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll + - mono $NUNIT_PATH src/embed_tests/bin/Python.EmbeddingTest.dll after_script: # Uncomment if need to geninterop, ie. py37 final diff --git a/setup.py b/setup.py index 895219eec..0b95e993e 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ import sys import sysconfig from distutils import spawn -from distutils.command import build_ext, install_data, install_lib +from distutils.command import install, build, build_ext, install_data, install_lib from setuptools import Extension, setup @@ -131,6 +131,12 @@ def _get_long_description(): except ImportError: return '.Net and Mono integration for Python' +def _update_xlat_devtools(): + global DEVTOOLS + if DEVTOOLS == "MsDev": + DEVTOOLS = "MsDev15" + elif DEVTOOLS == "Mono": + DEVTOOLS = "dotnet" class BuildExtPythonnet(build_ext.build_ext): user_options = build_ext.build_ext.user_options + [ @@ -144,6 +150,9 @@ def finalize_options(self): build_ext.build_ext.finalize_options(self) def build_extension(self, ext): + if self.xplat: + _update_xlat_devtools() + """Builds the .pyd file using msbuild or xbuild""" if ext.name != "clr": return build_ext.build_ext.build_extension(self, ext) @@ -174,7 +183,7 @@ def build_extension(self, ext): if CONFIG == "Debug": defines.extend(["DEBUG", "TRACE"]) - if sys.platform != "win32" and DEVTOOLS == "Mono": + if sys.platform != "win32" and (DEVTOOLS == "Mono" or DEVTOOLS == "dotnet"): on_darwin = sys.platform == "darwin" defines.append("MONO_OSX" if on_darwin else "MONO_LINUX") @@ -206,20 +215,34 @@ def build_extension(self, ext): if DEVTOOLS == "MsDev": _xbuild = '"{0}"'.format(self._find_msbuild_tool("msbuild.exe")) _config = "{0}Win".format(CONFIG) - + _solution_file = 'pythonnet.sln' + _custom_define_constants = False + elif DEVTOOLS == "MsDev15": + # Improve this with self._find_msbuild_tool_15 to find good >15.3 msbuild, currently only works under VS 15.3 developer environment. + _xbuild = '"{0}"'.format(self._find_msbuild_tool("msbuild.exe")) + _config = "{0}Win".format(CONFIG) + _solution_file = 'pythonnet.15.sln' + _custom_define_constants = True elif DEVTOOLS == "Mono": - _xbuild = 'dotnet msbuild' if self.xplat else 'xbuild' + _xbuild = 'xbuild' _config = "{0}Mono".format(CONFIG) + _solution_file = 'pythonnet.sln' + _custom_define_constants = False + elif DEVTOOLS == "dotnet": + _xbuild = 'dotnet msbuild' + _config = "{0}Mono".format(CONFIG) + _solution_file = 'pythonnet.15.sln' + _custom_define_constants = True else: raise NotImplementedError( - "DevTool {0} not supported (use MsDev/Mono)".format(DEVTOOLS)) + "DevTool {0} not supported (use MsDev/MsDev15/Mono/dotnet)".format(DEVTOOLS)) cmd = [ _xbuild, - 'pythonnet.15.sln' if self.xplat else 'pythonnet.sln', + _solution_file, '/p:Configuration={}'.format(_config), '/p:Platform={}'.format(ARCH), - '/p:{}DefineConstants="{}"'.format('Custom' if self.xplat else '','%3B'.join(defines)), + '/p:{}DefineConstants="{}"'.format('Custom' if _custom_define_constants else '','%3B'.join(defines)), '/p:PythonBuildDir="{}"'.format(os.path.abspath(dest_dir)), '/p:PythonInteropFile="{}"'.format(os.path.basename(interop_file)), '/verbosity:{}'.format(VERBOSITY), @@ -230,16 +253,16 @@ def build_extension(self, ext): cmd.append('/p:PythonManifest="{0}"'.format(manifest)) self.debug_print("Building: {0}".format(" ".join(cmd))) - use_shell = True if DEVTOOLS == "Mono" else False + use_shell = True if DEVTOOLS == "Mono" or DEVTOOLS == "dotnet" else False subprocess.check_call(" ".join(cmd + ["/t:Clean"]), shell=use_shell) subprocess.check_call(" ".join(cmd + ["/t:Build"]), shell=use_shell) - if DEVTOOLS == "Mono": + if DEVTOOLS == "Mono" or DEVTOOLS == "dotnet": self._build_monoclr() def _get_manifest(self, build_dir): - if DEVTOOLS != "MsDev": + if DEVTOOLS != "MsDev" and DEVTOOLS != "MsDev15": return mt = self._find_msbuild_tool("mt.exe", use_windows_sdk=True) manifest = os.path.abspath(os.path.join(build_dir, "app.manifest")) @@ -272,33 +295,30 @@ def _build_monoclr(self): def _install_packages(self): """install packages using nuget""" - nuget = os.path.join("tools", "nuget", "nuget.exe") - use_shell = False - if DEVTOOLS == "Mono": - nuget = "mono {0}".format(nuget) - use_shell = True + use_shell = DEVTOOLS == "Mono" or DEVTOOLS == "dotnet" - if self.xplat: - if DEVTOOLS == "MsDev": + if DEVTOOLS == "MsDev15" or DEVTOOLS == "dotnet": + if DEVTOOLS == "MsDev15": _config = "{0}Win".format(CONFIG) - elif DEVTOOLS == "Mono": + elif DEVTOOLS == "dotnet": _config = "{0}Mono".format(CONFIG) - else: - raise NotImplementedError( - "DevTool {0} not supported (use MsDev/Mono)".format(DEVTOOLS)) cmd = "dotnet msbuild /t:Restore pythonnet.15.sln /p:Configuration={0} /p:Platform={1}".format(_config, ARCH) self.debug_print("Updating packages with xplat: {0}".format(cmd)) subprocess.check_call(cmd, shell=use_shell) - return; + else: + nuget = os.path.join("tools", "nuget", "nuget.exe") - cmd = "{0} update -self".format(nuget) - self.debug_print("Updating NuGet: {0}".format(cmd)) - subprocess.check_call(cmd, shell=use_shell) + if DEVTOOLS == "Mono": + nuget = "mono {0}".format(nuget) - cmd = "{0} restore pythonnet.sln -o packages".format(nuget) - self.debug_print("Installing packages: {0}".format(cmd)) - subprocess.check_call(cmd, shell=use_shell) + cmd = "{0} update -self".format(nuget) + self.debug_print("Updating NuGet: {0}".format(cmd)) + subprocess.check_call(cmd, shell=use_shell) + + cmd = "{0} restore pythonnet.sln -o packages".format(nuget) + self.debug_print("Installing packages: {0}".format(cmd)) + subprocess.check_call(cmd, shell=use_shell) def _find_msbuild_tool(self, tool="msbuild.exe", use_windows_sdk=False): """Return full path to one of the Microsoft build tools""" @@ -381,6 +401,21 @@ def run(self): return install_data.install_data.run(self) +class InstallPythonnet(install.install): + user_options = install.install.user_options + [ + ('xplat', None, None) + ] + def initialize_options(self): + install.install.initialize_options(self) + self.xplat = None + + def finalize_options(self): + install.install.finalize_options(self) + + def run(self): + if self.xplat: + _update_xlat_devtools() + return install.install.run(self) ############################################################################### setupdir = os.path.dirname(__file__) @@ -410,6 +445,7 @@ def run(self): ]), ], cmdclass={ + "install": InstallPythonnet, "build_ext": BuildExtPythonnet, "install_lib": InstallLibPythonnet, "install_data": InstallDataPythonnet, From 78d5d463dd41f54ce3c400e6288f418544c7ae81 Mon Sep 17 00:00:00 2001 From: dse Date: Sun, 20 Aug 2017 00:50:46 +0400 Subject: [PATCH 279/324] AppVeyor matrix extended, xplat build added. --- appveyor.yml | 16 +++++++++++- ci/appveyor_run_tests.ps1 | 7 +++++- setup.py | 51 +++++++++++++++++++++++++++++++-------- 3 files changed, 62 insertions(+), 12 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 2f1103f5a..474e82766 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,9 @@ version: '{branch}-{build}' build: off +image: + - Visual Studio 2017 + platform: - x86 - x64 @@ -17,6 +20,16 @@ environment: - PYTHON_VERSION: 3.4 - PYTHON_VERSION: 3.5 - PYTHON_VERSION: 3.6 + - PYTHON_VERSION: 2.7 + BUILD_OPTS:--xplat + - PYTHON_VERSION: 3.3 + BUILD_OPTS:--xplat + - PYTHON_VERSION: 3.4 + BUILD_OPTS:--xplat + - PYTHON_VERSION: 3.5 + BUILD_OPTS:--xplat + - PYTHON_VERSION: 3.6 + BUILD_OPTS:--xplat init: # Update Environment Variables based on matrix/platform @@ -29,6 +42,7 @@ init: install: - pip install --upgrade -r requirements.txt --quiet + - choco install vswhere -y # Install OpenCover. Can't put on `packages.config`, not Mono compatible - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages -Verbosity quiet @@ -37,7 +51,7 @@ build_script: # Create clean `sdist`. Only used for releases - python setup.py --quiet sdist # Build `wheel` with coverage of `setup.py` - - coverage run setup.py bdist_wheel + - coverage run setup.py bdist_wheel %BUILD_OPTS% test_script: - pip install --no-index --find-links=.\dist\ pythonnet diff --git a/ci/appveyor_run_tests.ps1 b/ci/appveyor_run_tests.ps1 index 4245d1577..2821cf915 100644 --- a/ci/appveyor_run_tests.ps1 +++ b/ci/appveyor_run_tests.ps1 @@ -11,7 +11,12 @@ if ($FALSE -and $env:PLATFORM -eq "x86"){ # Executable paths for OpenCover # Note if OpenCover fails, it won't affect the exit codes. $OPENCOVER = Resolve-Path .\packages\OpenCover.*\tools\OpenCover.Console.exe -$CS_RUNNER = Resolve-Path .\packages\NUnit.*\tools\"$CS_RUNNER".exe +if ($env:BUILD_OPTS -eq "--xplat"){ + $CS_RUNNER = Resolve-Path $env:USERPROFILE\.nuget\packages\nunit.consolerunner\*\tools\"$CS_RUNNER".exe +} +else{ + $CS_RUNNER = Resolve-Path .\packages\NUnit.*\tools\"$CS_RUNNER".exe +} $PY = Get-Command python # Can't use ".\build\*\Python.EmbeddingTest.dll". Missing framework files. diff --git a/setup.py b/setup.py index 0b95e993e..6cfd773a6 100644 --- a/setup.py +++ b/setup.py @@ -15,6 +15,7 @@ import sysconfig from distutils import spawn from distutils.command import install, build, build_ext, install_data, install_lib +from wheel import bdist_wheel from setuptools import Extension, setup @@ -139,14 +140,14 @@ def _update_xlat_devtools(): DEVTOOLS = "dotnet" class BuildExtPythonnet(build_ext.build_ext): - user_options = build_ext.build_ext.user_options + [ - ('xplat', None, None) + user_options = build_ext.build_ext.user_options + [ + ('xplat', None, None) ] - def initialize_options(self): - build_ext.build_ext.initialize_options(self) - self.xplat = None - - def finalize_options(self): + def initialize_options(self): + build_ext.build_ext.initialize_options(self) + self.xplat = None + + def finalize_options(self): build_ext.build_ext.finalize_options(self) def build_extension(self, ext): @@ -218,8 +219,7 @@ def build_extension(self, ext): _solution_file = 'pythonnet.sln' _custom_define_constants = False elif DEVTOOLS == "MsDev15": - # Improve this with self._find_msbuild_tool_15 to find good >15.3 msbuild, currently only works under VS 15.3 developer environment. - _xbuild = '"{0}"'.format(self._find_msbuild_tool("msbuild.exe")) + _xbuild = '"{0}"'.format(self._find_msbuild_tool_15()) _config = "{0}Win".format(CONFIG) _solution_file = 'pythonnet.15.sln' _custom_define_constants = True @@ -364,6 +364,20 @@ def _find_msbuild_tool(self, tool="msbuild.exe", use_windows_sdk=False): raise RuntimeError("{0} could not be found".format(tool)) + def _find_msbuild_tool_15(self): + """Return full path to one of the Microsoft build tools""" + try: + basePathes = subprocess.check_output( + ["vswhere", "-latest", + "-version", "[15.0, 16.0)", + "-requires", "Microsoft.Component.MSBuild", + "-property", "InstallationPath"]).splitlines() + if len(basePathes): + return os.path.join(basePathes[0].decode(sys.stdout.encoding or "utf-8"), "MSBuild", "15.0", "Bin", "MSBuild.exe") + else: + raise RuntimeError("MSBuild >=15.0 could not be found.") + except subprocess.CalledProcessError as e: + raise RuntimeError("MSBuild >=15.0 could not be found. {0}".format(e.output)) class InstallLibPythonnet(install_lib.install_lib): def install(self): @@ -417,7 +431,23 @@ def run(self): _update_xlat_devtools() return install.install.run(self) -############################################################################### +class BDistWheelPythonnet(bdist_wheel.bdist_wheel): + user_options = bdist_wheel.bdist_wheel.user_options + [ + ('xplat', None, None) + ] + def initialize_options(self): + bdist_wheel.bdist_wheel.initialize_options(self) + self.xplat = None + + def finalize_options(self): + bdist_wheel.bdist_wheel.finalize_options(self) + + def run(self): + if self.xplat: + _update_xlat_devtools() + return bdist_wheel.bdist_wheel.run(self) + + ############################################################################### setupdir = os.path.dirname(__file__) if setupdir: os.chdir(setupdir) @@ -449,6 +479,7 @@ def run(self): "build_ext": BuildExtPythonnet, "install_lib": InstallLibPythonnet, "install_data": InstallDataPythonnet, + "bdist_wheel": BDistWheelPythonnet }, classifiers=[ 'Development Status :: 5 - Production/Stable', From 2dc1b472c9af1d6dd2d60d30d33e7888264372b1 Mon Sep 17 00:00:00 2001 From: dse Date: Sun, 20 Aug 2017 10:34:38 +0400 Subject: [PATCH 280/324] appveyor.yml yaml syntax fix. --- appveyor.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 474e82766..af75d5e63 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -20,16 +20,16 @@ environment: - PYTHON_VERSION: 3.4 - PYTHON_VERSION: 3.5 - PYTHON_VERSION: 3.6 - - PYTHON_VERSION: 2.7 - BUILD_OPTS:--xplat + - PYTHON_VERSION: 2.7 + BUILD_OPTS: --xplat - PYTHON_VERSION: 3.3 - BUILD_OPTS:--xplat + BUILD_OPTS: --xplat - PYTHON_VERSION: 3.4 - BUILD_OPTS:--xplat + BUILD_OPTS: --xplat - PYTHON_VERSION: 3.5 - BUILD_OPTS:--xplat + BUILD_OPTS: --xplat - PYTHON_VERSION: 3.6 - BUILD_OPTS:--xplat + BUILD_OPTS: --xplat init: # Update Environment Variables based on matrix/platform From 665b9d7df8cf8ad1b237a89a8fc5d33ffb7b2d76 Mon Sep 17 00:00:00 2001 From: dse Date: Sun, 20 Aug 2017 12:40:21 +0400 Subject: [PATCH 281/324] NUnit dependency upgraded to 3.7. Changelog improved. --- CHANGELOG.md | 4 ++++ src/embed_tests/Python.EmbeddingTest.15.csproj | 4 ++-- src/embed_tests/Python.EmbeddingTest.csproj | 4 ++-- src/embed_tests/packages.config | 4 ++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ae62d692..e5929107b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ## [unreleased][] ### Added +- Added new build system (pythonnet.15.sln) based on dotnetcore-sdk/xplat(crossplatform msbuild). + Currently there two side-by-side build systems that produces the same output (net40) from the same sources. + After a some transition time, current (mono/ msbuild 14.0) build system will be removed. +- NUnit upgraded to 3.7 (eliminates travis-ci random bug) - Added `clr.GetClrType` (#432, #433) - Allowed passing `None` for nullable args (#460) - Added keyword arguments based on C# syntax for calling CPython methods (#461) diff --git a/src/embed_tests/Python.EmbeddingTest.15.csproj b/src/embed_tests/Python.EmbeddingTest.15.csproj index c490463e8..e4a35ab97 100644 --- a/src/embed_tests/Python.EmbeddingTest.15.csproj +++ b/src/embed_tests/Python.EmbeddingTest.15.csproj @@ -85,8 +85,8 @@ - - + + diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index d45c622f9..fe02b0526 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -70,8 +70,8 @@ - - ..\..\packages\NUnit.3.6.0\lib\net40\nunit.framework.dll + + ..\..\packages\NUnit.3.7.1\lib\net40\nunit.framework.dll diff --git a/src/embed_tests/packages.config b/src/embed_tests/packages.config index 4cb01d3be..8c175f441 100644 --- a/src/embed_tests/packages.config +++ b/src/embed_tests/packages.config @@ -1,5 +1,5 @@ - - + + From 504495e70c9d202a37e9cbf1ce919a3424d29592 Mon Sep 17 00:00:00 2001 From: dse Date: Tue, 22 Aug 2017 17:55:33 +0400 Subject: [PATCH 282/324] EmbeddingTest fixes, and stubs. --- src/embed_tests/TestPySequence.cs | 6 ++++-- src/runtime/importhook.cs | 3 +++ src/runtime/runtime.cs | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/embed_tests/TestPySequence.cs b/src/embed_tests/TestPySequence.cs index 7c175b1ce..1e3ebf144 100644 --- a/src/embed_tests/TestPySequence.cs +++ b/src/embed_tests/TestPySequence.cs @@ -69,8 +69,10 @@ public void TestRepeat() PyObject actual = t1.Repeat(3); Assert.AreEqual("FooFooFoo", actual.ToString()); - actual = t1.Repeat(-3); - Assert.AreEqual("", actual.ToString()); + // On 32 bit system this argument should be int, but on the 64 bit system this should be long value. + // This works on the Framework 4.0 accidentally, it should produce out of memory! + // actual = t1.Repeat(-3); + // Assert.AreEqual("", actual.ToString()); } [Test] diff --git a/src/runtime/importhook.cs b/src/runtime/importhook.cs index bc9ac5eee..7fd431113 100644 --- a/src/runtime/importhook.cs +++ b/src/runtime/importhook.cs @@ -75,7 +75,10 @@ internal static void Shutdown() if (Runtime.Py_IsInitialized() != 0) { Runtime.XDecref(py_clr_module); + // TODO: Very strange behavior under CoreCLR. System.ExecutionEngineException (Crash) +#if !NETCOREAPP Runtime.XDecref(root.pyHandle); +#endif Runtime.XDecref(py_import); } } diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 8f730a855..e4a1c0143 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -298,6 +298,7 @@ internal static void Initialize() Error = new IntPtr(-1); IntPtr dllLocal = IntPtr.Zero; +#if !NETCOREAPP if (_PythonDll != "__Internal") { dllLocal = NativeMethods.LoadLibrary(_PythonDll); @@ -309,7 +310,7 @@ internal static void Initialize() NativeMethods.FreeLibrary(dllLocal); } #endif - +#endif // Initialize modules that depend on the runtime class. AssemblyManager.Initialize(); PyCLRMetaType = MetaType.Initialize(); From 1cc90083db2cb795132f38a3dee8bce02244097e Mon Sep 17 00:00:00 2001 From: dse Date: Tue, 22 Aug 2017 21:59:12 +0400 Subject: [PATCH 283/324] Fix for importing numpy and other python modules with native parts. --- src/runtime/runtime.cs | 42 +++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index e4a1c0143..1999b6684 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Runtime.InteropServices; using System.Security; using System.Text; @@ -9,6 +9,27 @@ namespace Python.Runtime internal static class NativeMethods { #if MONO_LINUX || MONO_OSX +#if NETCOREAPP + private static int RTLD_NOW = 0x2; +#if MONO_LINUX + private static int RTLD_GLOBAL = 0x100; + private static IntPtr RTLD_DEFAULT = IntPtr.Zero; + private const string NativeDll = "libdl.so"; + public static IntPtr LoadLibrary(string fileName) + { + return dlopen($"lib{fileName}.so", RTLD_NOW | RTLD_GLOBAL); + } +#elif MONO_OSX + private static int RTLD_GLOBAL = 0x8; + private const string NativeDll = "/usr/lib/libSystem.dylib" + private static IntPtr RTLD_DEFAULT = new IntPtr(-2); + + public static IntPtr LoadLibrary(string fileName) + { + return dlopen($"lib{fileName}.dylib", RTLD_NOW | RTLD_GLOBAL); + } +#endif +#else private static int RTLD_NOW = 0x2; private static int RTLD_SHARED = 0x20; #if MONO_OSX @@ -23,6 +44,8 @@ public static IntPtr LoadLibrary(string fileName) { return dlopen(fileName, RTLD_NOW | RTLD_SHARED); } +#endif + public static void FreeLibrary(IntPtr handle) { @@ -48,16 +71,16 @@ public static IntPtr GetProcAddress(IntPtr dllHandle, string name) return res; } - [DllImport(NativeDll)] - private static extern IntPtr dlopen(String fileName, int flags); + [DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] + public static extern IntPtr dlopen(String fileName, int flags); - [DllImport(NativeDll)] + [DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr dlsym(IntPtr handle, String symbol); - [DllImport(NativeDll)] + [DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl)] private static extern int dlclose(IntPtr handle); - [DllImport(NativeDll)] + [DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl)] private static extern IntPtr dlerror(); #else // Windows private const string NativeDll = "kernel32.dll"; @@ -158,7 +181,7 @@ public class Runtime public static readonly string PythonDLL = _PythonDll; -#if PYTHON_WITHOUT_ENABLE_SHARED +#if PYTHON_WITHOUT_ENABLE_SHARED && !NETCOREAPP internal const string _PythonDll = "__Internal"; #else internal const string _PythonDll = dllBase + dllWithPyDebug + dllWithPyMalloc; @@ -298,19 +321,20 @@ internal static void Initialize() Error = new IntPtr(-1); IntPtr dllLocal = IntPtr.Zero; -#if !NETCOREAPP + if (_PythonDll != "__Internal") { dllLocal = NativeMethods.LoadLibrary(_PythonDll); } _PyObject_NextNotImplemented = NativeMethods.GetProcAddress(dllLocal, "_PyObject_NextNotImplemented"); + #if !(MONO_LINUX || MONO_OSX) if (dllLocal != IntPtr.Zero) { NativeMethods.FreeLibrary(dllLocal); } #endif -#endif + // Initialize modules that depend on the runtime class. AssemblyManager.Initialize(); PyCLRMetaType = MetaType.Initialize(); From 2edbc873e26682adf931c581a1a0fefa6df2b9d3 Mon Sep 17 00:00:00 2001 From: dse Date: Sun, 27 Aug 2017 21:11:01 +0400 Subject: [PATCH 284/324] NetCoreApp 2.0 fix. EmitCalli does not supports cdecl. Falling-back to a slow Marshal-based solution. + x86 fix. --- appveyor.yml | 4 ++-- src/runtime/importhook.cs | 3 --- src/runtime/metatype.cs | 4 ++-- src/runtime/nativecall.cs | 39 ++++++++++++++++++++++++++++++--------- src/runtime/runtime.cs | 4 ++-- 5 files changed, 36 insertions(+), 18 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 74d6698c8..1953d85d5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -43,8 +43,8 @@ init: install: - pip install --upgrade -r requirements.txt --quiet - choco install vswhere -y - # - cmd: curl -O https://download.microsoft.com/download/5/6/B/56BFEF92-9045-4414-970C-AB31E0FC07EC/dotnet-runtime-2.0.0-win-x86.exe - # - cmd: dotnet-runtime-2.0.0-win-x86.exe /install /quiet /norestart /log install.log + - cmd: curl -O https://download.microsoft.com/download/5/6/B/56BFEF92-9045-4414-970C-AB31E0FC07EC/dotnet-runtime-2.0.0-win-x86.exe + - cmd: dotnet-runtime-2.0.0-win-x86.exe /install /quiet /norestart /log install.log # Install OpenCover. Can't put on `packages.config`, not Mono compatible - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages -Verbosity quiet diff --git a/src/runtime/importhook.cs b/src/runtime/importhook.cs index 7fd431113..bc9ac5eee 100644 --- a/src/runtime/importhook.cs +++ b/src/runtime/importhook.cs @@ -75,10 +75,7 @@ internal static void Shutdown() if (Runtime.Py_IsInitialized() != 0) { Runtime.XDecref(py_clr_module); - // TODO: Very strange behavior under CoreCLR. System.ExecutionEngineException (Crash) -#if !NETCOREAPP Runtime.XDecref(root.pyHandle); -#endif Runtime.XDecref(py_import); } } diff --git a/src/runtime/metatype.cs b/src/runtime/metatype.cs index 982f4a632..3295ab110 100644 --- a/src/runtime/metatype.cs +++ b/src/runtime/metatype.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Runtime.InteropServices; namespace Python.Runtime @@ -201,7 +201,7 @@ public static int tp_setattro(IntPtr tp, IntPtr name, IntPtr value) IntPtr fp = Marshal.ReadIntPtr(dt, TypeOffset.tp_descr_set); if (fp != IntPtr.Zero) { - return NativeCall.Impl.Int_Call_3(fp, descr, name, value); + return NativeCall.Int_Call_3(fp, descr, name, value); } Exceptions.SetError(Exceptions.AttributeError, "attribute is read-only"); return -1; diff --git a/src/runtime/nativecall.cs b/src/runtime/nativecall.cs index c3af14398..6a2df8418 100644 --- a/src/runtime/nativecall.cs +++ b/src/runtime/nativecall.cs @@ -23,6 +23,32 @@ namespace Python.Runtime /// internal class NativeCall { +#if NETCOREAPP + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void Void_1_Delegate(IntPtr a1); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate IntPtr IntPtr_3_Delegate(IntPtr a1, IntPtr a2, IntPtr a3); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int Int_3_Delegate(IntPtr a1, IntPtr a2, IntPtr a3); + + public static void Void_Call_1(IntPtr fp, IntPtr a1) + { + ((Void_1_Delegate)Marshal.GetDelegateForFunctionPointer(fp, typeof(Void_1_Delegate)))(a1); + } + + public static IntPtr Call_3(IntPtr fp, IntPtr a1, IntPtr a2, IntPtr a3) + { + return ((IntPtr_3_Delegate)Marshal.GetDelegateForFunctionPointer(fp, typeof(IntPtr_3_Delegate)))(a1, a2, a3); + } + + + public static int Int_Call_3(IntPtr fp, IntPtr a1, IntPtr a2, IntPtr a3) + { + return ((Int_3_Delegate)Marshal.GetDelegateForFunctionPointer(fp, typeof(Int_3_Delegate)))(a1, a2, a3); + } +#else private static AssemblyBuilder aBuilder; private static ModuleBuilder mBuilder; @@ -106,19 +132,12 @@ private static void GenerateThunk(TypeBuilder tb, MethodInfo method) il.Emit(OpCodes.Ldarg_1); -#if NETCOREAPP - il.EmitCalli(OpCodes.Calli, - CallingConventions.ExplicitThis, - method.ReturnType, - nargs, null - ); -#else il.EmitCalli(OpCodes.Calli, CallingConvention.Cdecl, method.ReturnType, nargs ); -#endif + il.Emit(OpCodes.Ret); tb.DefineMethodOverride(mb, method); @@ -139,9 +158,10 @@ public static int Int_Call_3(IntPtr fp, IntPtr a1, IntPtr a2, IntPtr a3) { return Impl.Int_Call_3(fp, a1, a2, a3); } +#endif } - +#if !NETCORAPP /// /// Defines native call signatures to be generated by NativeCall. /// @@ -155,4 +175,5 @@ public interface INativeCall IntPtr Call_3(IntPtr funcPtr, IntPtr a1, IntPtr a2, IntPtr a3); } +#endif } diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 1999b6684..ffb16eb21 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -522,7 +522,7 @@ internal static Type[] PythonArgsToTypeArray(IntPtr arg, bool mangleObjects) ///
internal static unsafe void XIncref(IntPtr op) { -#if PYTHON_WITH_PYDEBUG +#if PYTHON_WITH_PYDEBUG || NETCOREAPP Py_IncRef(op); return; #else @@ -543,7 +543,7 @@ internal static unsafe void XIncref(IntPtr op) internal static unsafe void XDecref(IntPtr op) { -#if PYTHON_WITH_PYDEBUG +#if PYTHON_WITH_PYDEBUG || NETCOREAPP Py_DecRef(op); return; #else From dac5a96a67bd0f26d921467809593bf6e8a71c71 Mon Sep 17 00:00:00 2001 From: dse Date: Tue, 22 Aug 2017 22:33:55 +0400 Subject: [PATCH 285/324] Changelog improved. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e5929107b..64823f490 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ## [unreleased][] ### Added +- Added support for embedding python into dotnet core 2.0 (NetCoreApp2.0) - Added new build system (pythonnet.15.sln) based on dotnetcore-sdk/xplat(crossplatform msbuild). Currently there two side-by-side build systems that produces the same output (net40) from the same sources. After a some transition time, current (mono/ msbuild 14.0) build system will be removed. From 2ac981bd5bbcb7776ca5dd095bf8ac2aa3d81af6 Mon Sep 17 00:00:00 2001 From: dse Date: Wed, 23 Aug 2017 01:25:15 +0400 Subject: [PATCH 286/324] Build order improvement. --- .travis.yml | 50 +++++++++++++++++++++++++------------------------- appveyor.yml | 10 +++++----- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/.travis.yml b/.travis.yml index fbb67d397..2468ed60a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,31 +4,6 @@ language: python matrix: include: - - python: 2.7 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - - python: 3.3 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - - python: 3.4 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - - python: 3.5 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - - python: 3.6 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - - python: "3.7-dev" - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - - python: 2.7 env: - BUILD_OPTS=--xplat @@ -131,6 +106,31 @@ matrix: - dotnet-hostfxr-2.0.0 - dotnet-runtime-2.0.0 - dotnet-sdk-2.0.0 + + - python: 2.7 + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: 3.3 + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: 3.4 + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: 3.5 + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: 3.6 + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: "3.7-dev" + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe allow_failures: - python: "3.7-dev" env: diff --git a/appveyor.yml b/appveyor.yml index af75d5e63..c7c3a7810 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -15,11 +15,6 @@ environment: CODECOV_ENV: PYTHON_VERSION, PLATFORM matrix: - - PYTHON_VERSION: 2.7 - - PYTHON_VERSION: 3.3 - - PYTHON_VERSION: 3.4 - - PYTHON_VERSION: 3.5 - - PYTHON_VERSION: 3.6 - PYTHON_VERSION: 2.7 BUILD_OPTS: --xplat - PYTHON_VERSION: 3.3 @@ -30,6 +25,11 @@ environment: BUILD_OPTS: --xplat - PYTHON_VERSION: 3.6 BUILD_OPTS: --xplat + - PYTHON_VERSION: 2.7 + - PYTHON_VERSION: 3.3 + - PYTHON_VERSION: 3.4 + - PYTHON_VERSION: 3.5 + - PYTHON_VERSION: 3.6 init: # Update Environment Variables based on matrix/platform From ed4861886c615c653ff43268198523cc7f1ee86c Mon Sep 17 00:00:00 2001 From: dse Date: Wed, 6 Sep 2017 18:27:13 +0400 Subject: [PATCH 287/324] Mono builds now can be build on Windows. DEBUG;TRACE fix for the case VS + non empty PYTHONNET_DEFINE_CONSTANTS --- src/clrmodule/clrmodule.15.csproj | 1 + src/console/Console.15.csproj | 1 + src/embed_tests/Python.EmbeddingTest.15.csproj | 1 + src/runtime/Python.Runtime.15.csproj | 3 ++- src/testing/Python.Test.15.csproj | 1 + 5 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/clrmodule/clrmodule.15.csproj b/src/clrmodule/clrmodule.15.csproj index fe31bdb9d..4d8a1b8ff 100644 --- a/src/clrmodule/clrmodule.15.csproj +++ b/src/clrmodule/clrmodule.15.csproj @@ -27,6 +27,7 @@ $(PYTHONNET_DEFINE_CONSTANTS) XPLAT $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(DefineConstants);TRACE;DEBUG diff --git a/src/console/Console.15.csproj b/src/console/Console.15.csproj index 2b22144de..0c89fce40 100644 --- a/src/console/Console.15.csproj +++ b/src/console/Console.15.csproj @@ -27,6 +27,7 @@ $(PYTHONNET_DEFINE_CONSTANTS) XPLAT $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(DefineConstants);TRACE;DEBUG $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ diff --git a/src/embed_tests/Python.EmbeddingTest.15.csproj b/src/embed_tests/Python.EmbeddingTest.15.csproj index e4a35ab97..ac6ecba92 100644 --- a/src/embed_tests/Python.EmbeddingTest.15.csproj +++ b/src/embed_tests/Python.EmbeddingTest.15.csproj @@ -25,6 +25,7 @@ $(PYTHONNET_DEFINE_CONSTANTS) XPLAT $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(DefineConstants);TRACE;DEBUG $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ diff --git a/src/runtime/Python.Runtime.15.csproj b/src/runtime/Python.Runtime.15.csproj index e9b90057a..cc5b0083b 100644 --- a/src/runtime/Python.Runtime.15.csproj +++ b/src/runtime/Python.Runtime.15.csproj @@ -27,6 +27,7 @@ $(PYTHONNET_DEFINE_CONSTANTS) XPLAT $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(DefineConstants);TRACE;DEBUG $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ @@ -113,7 +114,7 @@ $(TargetDir)$(TargetName).pdb - + diff --git a/src/testing/Python.Test.15.csproj b/src/testing/Python.Test.15.csproj index 8bfd3afe7..635580854 100644 --- a/src/testing/Python.Test.15.csproj +++ b/src/testing/Python.Test.15.csproj @@ -21,6 +21,7 @@ $(PYTHONNET_DEFINE_CONSTANTS) XPLAT $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(DefineConstants);TRACE;DEBUG $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ From 3069fe42d90b659da9fbb5d80a3825db2343f446 Mon Sep 17 00:00:00 2001 From: dse Date: Wed, 6 Sep 2017 22:21:30 +0400 Subject: [PATCH 288/324] Python.Runtime.dll now targets NetStandard2.0 inplace of NetCoreApp 2.0 --- CHANGELOG.md | 2 +- pythonnet.15.sln | 10 +++++----- setup.py | 7 ++----- src/embed_tests/pyimport.cs | 2 +- src/runtime/Python.Runtime.15.csproj | 11 +++++------ src/runtime/nativecall.cs | 2 +- src/runtime/polyfill/ReflectionPolifills.cs | 9 +++++++-- src/runtime/runtime.cs | 8 ++++---- src/testing/Python.Test.15.csproj | 8 ++++++-- .../{netcoreapp2.0 => netstandard2.0}/.gitkeep | 0 10 files changed, 32 insertions(+), 27 deletions(-) rename src/tests/fixtures/{netcoreapp2.0 => netstandard2.0}/.gitkeep (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64823f490..7d408a8d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ## [unreleased][] ### Added -- Added support for embedding python into dotnet core 2.0 (NetCoreApp2.0) +- Added support for embedding python into dotnet core 2.0 (NetStandard 2.0) - Added new build system (pythonnet.15.sln) based on dotnetcore-sdk/xplat(crossplatform msbuild). Currently there two side-by-side build systems that produces the same output (net40) from the same sources. After a some transition time, current (mono/ msbuild 14.0) build system will be removed. diff --git a/pythonnet.15.sln b/pythonnet.15.sln index 121631e43..f2015e480 100644 --- a/pythonnet.15.sln +++ b/pythonnet.15.sln @@ -2,15 +2,15 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.26730.3 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Runtime.15", "src\runtime\Python.Runtime.15.csproj", "{2759F4FF-716B-4828-916F-50FA86613DFC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Runtime.15", "src/runtime/Python.Runtime.15.csproj", "{2759F4FF-716B-4828-916F-50FA86613DFC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.EmbeddingTest.15", "src\embed_tests\Python.EmbeddingTest.15.csproj", "{66B8D01A-9906-452A-B09E-BF75EA76468F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.EmbeddingTest.15", "src/embed_tests/Python.EmbeddingTest.15.csproj", "{66B8D01A-9906-452A-B09E-BF75EA76468F}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "clrmodule.15", "src\clrmodule\clrmodule.15.csproj", "{E08678D4-9A52-4AD5-B63D-8EBC7399981B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "clrmodule.15", "src/clrmodule/clrmodule.15.csproj", "{E08678D4-9A52-4AD5-B63D-8EBC7399981B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Console.15", "src\console\Console.15.csproj", "{CDAD305F-8E72-492C-A314-64CF58D472A0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Console.15", "src/console/Console.15.csproj", "{CDAD305F-8E72-492C-A314-64CF58D472A0}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Test.15", "src\testing\Python.Test.15.csproj", "{F94B547A-E97E-4500-8D53-B4D64D076E5F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Test.15", "src/testing/Python.Test.15.csproj", "{F94B547A-E97E-4500-8D53-B4D64D076E5F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/setup.py b/setup.py index 376a575aa..e4294edf6 100644 --- a/setup.py +++ b/setup.py @@ -257,11 +257,8 @@ def build_extension(self, ext): subprocess.check_call(" ".join(cmd + ["/t:Clean"]), shell=use_shell) subprocess.check_call(" ".join(cmd + ["/t:Build"]), shell=use_shell) - if DEVTOOLS == "MsDev15": - subprocess.check_call(" ".join(cmd + ["/t:Console_15:publish;Python_EmbeddingTest_15:publish", "/p:TargetFramework=netcoreapp2.0"]), shell=use_shell) - elif DEVTOOLS == "dotnet": - subprocess.check_call(" ".join(cmd + ["/t:publish", "/p:TargetFramework=netcoreapp2.0"]), shell=use_shell) - + if DEVTOOLS == "MsDev15" or DEVTOOLS == "dotnet": + subprocess.check_call(" ".join(cmd + ['"/t:Console_15:publish;Python_EmbeddingTest_15:publish"', "/p:TargetFramework=netcoreapp2.0"]), shell=use_shell) if DEVTOOLS == "Mono" or DEVTOOLS == "dotnet": self._build_monoclr() diff --git a/src/embed_tests/pyimport.cs b/src/embed_tests/pyimport.cs index acb3433de..4123b4f31 100644 --- a/src/embed_tests/pyimport.cs +++ b/src/embed_tests/pyimport.cs @@ -30,7 +30,7 @@ public void SetUp() /* Append the tests directory to sys.path * using reflection to circumvent the private * modifiers placed on most Runtime methods. */ -#if NETCOREAPP +#if NETSTANDARD const string s = "../../fixtures"; #else const string s = "../fixtures"; diff --git a/src/runtime/Python.Runtime.15.csproj b/src/runtime/Python.Runtime.15.csproj index 56f415006..d80764551 100644 --- a/src/runtime/Python.Runtime.15.csproj +++ b/src/runtime/Python.Runtime.15.csproj @@ -1,7 +1,7 @@ - net40;netcoreapp2.0 + net40;netstandard2.0 AnyCPU DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 net45 @@ -29,7 +29,7 @@ $(PYTHONNET_DEFINE_CONSTANTS) XPLAT $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); - $(DefineConstants);NETCOREAPP + $(DefineConstants);NETSTANDARD $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ @@ -101,10 +101,9 @@ - - - 4.4.0 - + + + diff --git a/src/runtime/nativecall.cs b/src/runtime/nativecall.cs index 6a2df8418..49bf8b707 100644 --- a/src/runtime/nativecall.cs +++ b/src/runtime/nativecall.cs @@ -23,7 +23,7 @@ namespace Python.Runtime ///
internal class NativeCall { -#if NETCOREAPP +#if NETSTANDARD [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void Void_1_Delegate(IntPtr a1); diff --git a/src/runtime/polyfill/ReflectionPolifills.cs b/src/runtime/polyfill/ReflectionPolifills.cs index 6daf5312f..a7e9c879a 100644 --- a/src/runtime/polyfill/ReflectionPolifills.cs +++ b/src/runtime/polyfill/ReflectionPolifills.cs @@ -4,13 +4,18 @@ namespace Python.Runtime { +#if NETSTANDARD public static class ReflectionPolifills { -#if NETCOREAPP public static AssemblyBuilder DefineDynamicAssembly(this AppDomain appDomain, AssemblyName assemblyName, AssemblyBuilderAccess assemblyBuilderAccess) { return AssemblyBuilder.DefineDynamicAssembly(assemblyName, assemblyBuilderAccess); } -#endif + + public static Type CreateType(this TypeBuilder typeBuilder) + { + return typeBuilder.GetTypeInfo().GetType(); + } } +#endif } diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index ffb16eb21..31cf25795 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -9,7 +9,7 @@ namespace Python.Runtime internal static class NativeMethods { #if MONO_LINUX || MONO_OSX -#if NETCOREAPP +#if NETSTANDARD private static int RTLD_NOW = 0x2; #if MONO_LINUX private static int RTLD_GLOBAL = 0x100; @@ -181,7 +181,7 @@ public class Runtime public static readonly string PythonDLL = _PythonDll; -#if PYTHON_WITHOUT_ENABLE_SHARED && !NETCOREAPP +#if PYTHON_WITHOUT_ENABLE_SHARED && !NETSTANDARD internal const string _PythonDll = "__Internal"; #else internal const string _PythonDll = dllBase + dllWithPyDebug + dllWithPyMalloc; @@ -522,7 +522,7 @@ internal static Type[] PythonArgsToTypeArray(IntPtr arg, bool mangleObjects) ///
internal static unsafe void XIncref(IntPtr op) { -#if PYTHON_WITH_PYDEBUG || NETCOREAPP +#if PYTHON_WITH_PYDEBUG || NETSTANDARD Py_IncRef(op); return; #else @@ -543,7 +543,7 @@ internal static unsafe void XIncref(IntPtr op) internal static unsafe void XDecref(IntPtr op) { -#if PYTHON_WITH_PYDEBUG || NETCOREAPP +#if PYTHON_WITH_PYDEBUG || NETSTANDARD Py_DecRef(op); return; #else diff --git a/src/testing/Python.Test.15.csproj b/src/testing/Python.Test.15.csproj index 50093fb17..094b00658 100644 --- a/src/testing/Python.Test.15.csproj +++ b/src/testing/Python.Test.15.csproj @@ -1,7 +1,7 @@ - net40;netcoreapp2.0 + net40;netstandard2.0 x64;x86 DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 Python.Test @@ -77,7 +77,11 @@ - + + + + + diff --git a/src/tests/fixtures/netcoreapp2.0/.gitkeep b/src/tests/fixtures/netstandard2.0/.gitkeep similarity index 100% rename from src/tests/fixtures/netcoreapp2.0/.gitkeep rename to src/tests/fixtures/netstandard2.0/.gitkeep From afaca1bb1ebb5e3f52779830f4db37d3656ec9bc Mon Sep 17 00:00:00 2001 From: dse Date: Wed, 6 Sep 2017 22:35:12 +0400 Subject: [PATCH 289/324] Wrong NETSTANDARD/NETCOREAPP define constant change. --- src/embed_tests/pyimport.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/embed_tests/pyimport.cs b/src/embed_tests/pyimport.cs index 4123b4f31..acb3433de 100644 --- a/src/embed_tests/pyimport.cs +++ b/src/embed_tests/pyimport.cs @@ -30,7 +30,7 @@ public void SetUp() /* Append the tests directory to sys.path * using reflection to circumvent the private * modifiers placed on most Runtime methods. */ -#if NETSTANDARD +#if NETCOREAPP const string s = "../../fixtures"; #else const string s = "../fixtures"; From b20d134ed17561f6c7e9e564c8909827d45885be Mon Sep 17 00:00:00 2001 From: dse Date: Thu, 7 Sep 2017 02:30:16 +0400 Subject: [PATCH 290/324] Typo fix. --- src/runtime/nativecall.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/runtime/nativecall.cs b/src/runtime/nativecall.cs index 49bf8b707..c64306958 100644 --- a/src/runtime/nativecall.cs +++ b/src/runtime/nativecall.cs @@ -161,7 +161,7 @@ public static int Int_Call_3(IntPtr fp, IntPtr a1, IntPtr a2, IntPtr a3) #endif } -#if !NETCORAPP +#if !NETSTANDARD /// /// Defines native call signatures to be generated by NativeCall. /// From 966f035a2e58e691b06c64bf29dc0d07ab169c1f Mon Sep 17 00:00:00 2001 From: dse Date: Thu, 7 Sep 2017 12:49:17 +0400 Subject: [PATCH 291/324] PYTHONNET_PY3_VERSION, PYTHONNET_PY2_VERSION build related environment vars introduced. --- src/runtime/Python.Runtime.15.csproj | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/runtime/Python.Runtime.15.csproj b/src/runtime/Python.Runtime.15.csproj index cc5b0083b..3c180e9ea 100644 --- a/src/runtime/Python.Runtime.15.csproj +++ b/src/runtime/Python.Runtime.15.csproj @@ -29,49 +29,53 @@ $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); $(DefineConstants);TRACE;DEBUG $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ + $(PYTHONNET_PY2_VERSION) + PYTHON27 + $(PYTHONNET_PY3_VERSION) + PYTHON36 - $(DefineConstants);PYTHON2;PYTHON27;UCS4 + $(DefineConstants);PYTHON2;$(Python2Version);UCS4 true pdbonly - $(DefineConstants);PYTHON3;PYTHON36;UCS4 + $(DefineConstants);PYTHON3;$(Python3Version);UCS4 true pdbonly true - $(DefineConstants);PYTHON2;PYTHON27;UCS4;TRACE;DEBUG + $(DefineConstants);PYTHON2;$(Python2Version);UCS4;TRACE;DEBUG false full true - $(DefineConstants);PYTHON3;PYTHON36;UCS4;TRACE;DEBUG + $(DefineConstants);PYTHON3;$(Python3Version);UCS4;TRACE;DEBUG false full - $(DefineConstants);PYTHON2;PYTHON27;UCS2 + $(DefineConstants);PYTHON2;$(Python2Version);UCS2 true pdbonly - $(DefineConstants);PYTHON3;PYTHON36;UCS2 + $(DefineConstants);PYTHON3;$(Python3Version);UCS2 true pdbonly true - $(DefineConstants);PYTHON2;PYTHON27;UCS2;TRACE;DEBUG + $(DefineConstants);PYTHON2;$(Python2Version);UCS2;TRACE;DEBUG false full true - $(DefineConstants);PYTHON3;PYTHON36;UCS2;TRACE;DEBUG + $(DefineConstants);PYTHON3;$(Python3Version);UCS2;TRACE;DEBUG false full From f4a66087435c14d0fbea7a7498e6e6f9baf3f5b3 Mon Sep 17 00:00:00 2001 From: dse Date: Thu, 7 Sep 2017 14:14:15 +0400 Subject: [PATCH 292/324] Small compile fixes. --- src/embed_tests/TestPythonEngineProperties.cs | 4 ++-- src/runtime/runtime.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/embed_tests/TestPythonEngineProperties.cs b/src/embed_tests/TestPythonEngineProperties.cs index 76177d05a..01c6ae7e3 100644 --- a/src/embed_tests/TestPythonEngineProperties.cs +++ b/src/embed_tests/TestPythonEngineProperties.cs @@ -146,7 +146,7 @@ public void SetProgramName() [Test] public void SetPythonPath() { - if (Runtime.Runtime._pyversion == "2.7") + if (Runtime.Runtime.pyversion == "2.7") { // Assert.Skip outputs as a warning (ie. pending to fix) Assert.Pass(); @@ -166,7 +166,7 @@ public void SetPythonPath() [Test] public void SetPythonPathExceptionOn27() { - if (Runtime.Runtime._pyversion != "2.7") + if (Runtime.Runtime.pyversion != "2.7") { Assert.Pass(); } diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 8f730a855..3949500e2 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -110,8 +110,8 @@ public class Runtime // We needs to replace all public constants to static readonly fields to allow // binary substitution of different Python.Runtime.dll builds in a target application. - public string pyversion => _pyversion; - public string pyver => _pyver; + public static string pyversion => _pyversion; + public static string pyver => _pyver; #if PYTHON27 internal const string _pyversion = "2.7"; From a89685ebc76e98eab7bc287f1ba8b54788b7ceb5 Mon Sep 17 00:00:00 2001 From: dse Date: Thu, 7 Sep 2017 19:34:48 +0400 Subject: [PATCH 293/324] PYTHONNET_WIN_DEFINE_CONSTANTS and PYTHONNET_MONO_DEFINE_CONSTANTS introduced. + Fix for building mono versions under windows. --- src/runtime/Python.Runtime.15.csproj | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/runtime/Python.Runtime.15.csproj b/src/runtime/Python.Runtime.15.csproj index 3c180e9ea..93bd143dc 100644 --- a/src/runtime/Python.Runtime.15.csproj +++ b/src/runtime/Python.Runtime.15.csproj @@ -33,49 +33,53 @@ PYTHON27 $(PYTHONNET_PY3_VERSION) PYTHON36 + $(PYTHONNET_WIN_DEFINE_CONSTANTS) + UCS2 + $(PYTHONNET_MONO_DEFINE_CONSTANTS) + UCS4;MONO_LINUX;PYTHON_WITH_PYMALLOC - $(DefineConstants);PYTHON2;$(Python2Version);UCS4 + $(DefineConstants);PYTHON2;$(Python2Version);$(PythonMonoDefineConstants) true pdbonly - $(DefineConstants);PYTHON3;$(Python3Version);UCS4 + $(DefineConstants);PYTHON3;$(Python3Version);$(PythonMonoDefineConstants) true pdbonly true - $(DefineConstants);PYTHON2;$(Python2Version);UCS4;TRACE;DEBUG + $(DefineConstants);PYTHON2;$(Python2Version);$(PythonMonoDefineConstants);TRACE;DEBUG false full true - $(DefineConstants);PYTHON3;$(Python3Version);UCS4;TRACE;DEBUG + $(DefineConstants);PYTHON3;$(Python3Version);$(PythonMonoDefineConstants);TRACE;DEBUG false full - $(DefineConstants);PYTHON2;$(Python2Version);UCS2 + $(DefineConstants);PYTHON2;$(Python2Version);$(PythonWinDefineConstants) true pdbonly - $(DefineConstants);PYTHON3;$(Python3Version);UCS2 + $(DefineConstants);PYTHON3;$(Python3Version);$(PythonWinDefineConstants) true pdbonly true - $(DefineConstants);PYTHON2;$(Python2Version);UCS2;TRACE;DEBUG + $(DefineConstants);PYTHON2;$(Python2Version);$(PythonWinDefineConstants);TRACE;DEBUG false full true - $(DefineConstants);PYTHON3;$(Python3Version);UCS2;TRACE;DEBUG + $(DefineConstants);PYTHON3;$(Python3Version);$(PythonWinDefineConstants);TRACE;DEBUG false full @@ -107,7 +111,7 @@ - + From 4bac6941d461656dd828a09e3774c9e7e30e0d4c Mon Sep 17 00:00:00 2001 From: Denis Akhiyarov Date: Fri, 15 Sep 2017 09:59:40 -0500 Subject: [PATCH 294/324] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 06a2f1918..89dcf2206 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ static void Main(string[] args) dynamic a = np.array(new List { 1, 2, 3 }); Console.WriteLine(a.dtype); - dynamic b = np.array(new List { 6, 5, 4 }, dtype=np.int32); + dynamic b = np.array(new List { 6, 5, 4 }, dtype: np.int32); Console.WriteLine(b.dtype); Console.WriteLine(a * b); From 4b381bff6de886330e37fc5e606b0e29fa5d2bac Mon Sep 17 00:00:00 2001 From: dmitriyse Date: Thu, 21 Sep 2017 12:11:32 +0400 Subject: [PATCH 295/324] CoreCLR msbuild (xplat) support. Initial compilable version. (#518) * Full featured xplat build. * .Net 45 TargetingPack System.XML.dll naming fix. (For xplat linux build). * Setup.py --xplat option refactored. Travis-ci build matrix extended. * AppVeyor matrix extended, xplat build added. * appveyor.yml yaml syntax fix. * NUnit dependency upgraded to 3.7. Changelog improved. * Build order improvement. * Mono builds now can be build on Windows. DEBUG;TRACE fix for the case VS + non empty PYTHONNET_DEFINE_CONSTANTS * PYTHONNET_PY3_VERSION, PYTHONNET_PY2_VERSION build related environment vars introduced. * Small compile fixes. * PYTHONNET_WIN_DEFINE_CONSTANTS and PYTHONNET_MONO_DEFINE_CONSTANTS introduced. + Fix for building mono versions under windows. --- .travis.yml | 157 ++++++++++++-- CHANGELOG.md | 4 + NuGet.config | 7 + appveyor.yml | 16 +- ci/appveyor_run_tests.ps1 | 7 +- pythonnet.15.sln | 194 ++++++++++++++++++ setup.py | 136 ++++++++++-- src/clrmodule/clrmodule.15.csproj | 101 +++++++++ src/console/Console.15.csproj | 105 ++++++++++ .../Python.EmbeddingTest.15.csproj | 121 +++++++++++ src/embed_tests/Python.EmbeddingTest.csproj | 4 +- src/embed_tests/TestPythonEngineProperties.cs | 4 +- src/embed_tests/packages.config | 4 +- src/runtime/Python.Runtime.15.csproj | 133 ++++++++++++ src/runtime/runtime.cs | 4 +- src/testing/Python.Test.15.csproj | 92 +++++++++ 16 files changed, 1042 insertions(+), 47 deletions(-) create mode 100644 NuGet.config create mode 100644 pythonnet.15.sln create mode 100644 src/clrmodule/clrmodule.15.csproj create mode 100644 src/console/Console.15.csproj create mode 100644 src/embed_tests/Python.EmbeddingTest.15.csproj create mode 100644 src/runtime/Python.Runtime.15.csproj create mode 100644 src/testing/Python.Test.15.csproj diff --git a/.travis.yml b/.travis.yml index d6fcc4a88..2468ed60a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,18 +1,145 @@ +dist: trusty sudo: false - language: python -python: - - 2.7 - - 3.3 - - 3.4 - - 3.5 - - 3.6 - - 3.7-dev - + matrix: - allow_failures: - - python: 3.7-dev + include: + - python: 2.7 + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + addons: + apt: + sources: + - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main + key_url: https://packages.microsoft.com/keys/microsoft.asc + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + packages: + - mono-devel + - ca-certificates-mono + - dotnet-hostfxr-2.0.0 + - dotnet-runtime-2.0.0 + - dotnet-sdk-2.0.0 + - python: 3.3 + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + addons: + apt: + sources: + - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main + key_url: https://packages.microsoft.com/keys/microsoft.asc + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + packages: + - mono-devel + - ca-certificates-mono + - dotnet-hostfxr-2.0.0 + - dotnet-runtime-2.0.0 + - dotnet-sdk-2.0.0 + - python: 3.4 + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + addons: + apt: + sources: + - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main + key_url: https://packages.microsoft.com/keys/microsoft.asc + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + packages: + - mono-devel + - ca-certificates-mono + - dotnet-hostfxr-2.0.0 + - dotnet-runtime-2.0.0 + - dotnet-sdk-2.0.0 + - python: 3.5 + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + addons: + apt: + sources: + - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main + key_url: https://packages.microsoft.com/keys/microsoft.asc + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + packages: + - mono-devel + - ca-certificates-mono + - dotnet-hostfxr-2.0.0 + - dotnet-runtime-2.0.0 + - dotnet-sdk-2.0.0 + - python: 3.6 + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + addons: + apt: + sources: + - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main + key_url: https://packages.microsoft.com/keys/microsoft.asc + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + packages: + - mono-devel + - ca-certificates-mono + - dotnet-hostfxr-2.0.0 + - dotnet-runtime-2.0.0 + - dotnet-sdk-2.0.0 + - python: "3.7-dev" + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + addons: + apt: + sources: + - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main + key_url: https://packages.microsoft.com/keys/microsoft.asc + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + packages: + - mono-devel + - ca-certificates-mono + - dotnet-hostfxr-2.0.0 + - dotnet-runtime-2.0.0 + - dotnet-sdk-2.0.0 + - python: 2.7 + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: 3.3 + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: 3.4 + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: 3.5 + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: 3.6 + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: "3.7-dev" + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + allow_failures: + - python: "3.7-dev" + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: "3.7-dev" + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe env: global: - LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so @@ -23,8 +150,8 @@ env: addons: apt: sources: - - mono - - mono-libtiff-compat + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF packages: - mono-devel - ca-certificates-mono @@ -37,11 +164,11 @@ before_install: install: - pip install --upgrade setuptools # TEMP - due to setuptools 36.2.0 bug - pip install --upgrade -r requirements.txt - - coverage run setup.py install + - coverage run setup.py install $BUILD_OPTS script: - python -m pytest - - mono ./packages/NUnit.*/tools/nunit3-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll + - mono $NUNIT_PATH src/embed_tests/bin/Python.EmbeddingTest.dll after_script: # Uncomment if need to geninterop, ie. py37 final diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ae62d692..e5929107b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ## [unreleased][] ### Added +- Added new build system (pythonnet.15.sln) based on dotnetcore-sdk/xplat(crossplatform msbuild). + Currently there two side-by-side build systems that produces the same output (net40) from the same sources. + After a some transition time, current (mono/ msbuild 14.0) build system will be removed. +- NUnit upgraded to 3.7 (eliminates travis-ci random bug) - Added `clr.GetClrType` (#432, #433) - Allowed passing `None` for nullable args (#460) - Added keyword arguments based on C# syntax for calling CPython methods (#461) diff --git a/NuGet.config b/NuGet.config new file mode 100644 index 000000000..719fbc83c --- /dev/null +++ b/NuGet.config @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 2f1103f5a..c7c3a7810 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,9 @@ version: '{branch}-{build}' build: off +image: + - Visual Studio 2017 + platform: - x86 - x64 @@ -12,6 +15,16 @@ environment: CODECOV_ENV: PYTHON_VERSION, PLATFORM matrix: + - PYTHON_VERSION: 2.7 + BUILD_OPTS: --xplat + - PYTHON_VERSION: 3.3 + BUILD_OPTS: --xplat + - PYTHON_VERSION: 3.4 + BUILD_OPTS: --xplat + - PYTHON_VERSION: 3.5 + BUILD_OPTS: --xplat + - PYTHON_VERSION: 3.6 + BUILD_OPTS: --xplat - PYTHON_VERSION: 2.7 - PYTHON_VERSION: 3.3 - PYTHON_VERSION: 3.4 @@ -29,6 +42,7 @@ init: install: - pip install --upgrade -r requirements.txt --quiet + - choco install vswhere -y # Install OpenCover. Can't put on `packages.config`, not Mono compatible - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages -Verbosity quiet @@ -37,7 +51,7 @@ build_script: # Create clean `sdist`. Only used for releases - python setup.py --quiet sdist # Build `wheel` with coverage of `setup.py` - - coverage run setup.py bdist_wheel + - coverage run setup.py bdist_wheel %BUILD_OPTS% test_script: - pip install --no-index --find-links=.\dist\ pythonnet diff --git a/ci/appveyor_run_tests.ps1 b/ci/appveyor_run_tests.ps1 index 4245d1577..2821cf915 100644 --- a/ci/appveyor_run_tests.ps1 +++ b/ci/appveyor_run_tests.ps1 @@ -11,7 +11,12 @@ if ($FALSE -and $env:PLATFORM -eq "x86"){ # Executable paths for OpenCover # Note if OpenCover fails, it won't affect the exit codes. $OPENCOVER = Resolve-Path .\packages\OpenCover.*\tools\OpenCover.Console.exe -$CS_RUNNER = Resolve-Path .\packages\NUnit.*\tools\"$CS_RUNNER".exe +if ($env:BUILD_OPTS -eq "--xplat"){ + $CS_RUNNER = Resolve-Path $env:USERPROFILE\.nuget\packages\nunit.consolerunner\*\tools\"$CS_RUNNER".exe +} +else{ + $CS_RUNNER = Resolve-Path .\packages\NUnit.*\tools\"$CS_RUNNER".exe +} $PY = Get-Command python # Can't use ".\build\*\Python.EmbeddingTest.dll". Missing framework files. diff --git a/pythonnet.15.sln b/pythonnet.15.sln new file mode 100644 index 000000000..121631e43 --- /dev/null +++ b/pythonnet.15.sln @@ -0,0 +1,194 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26730.3 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Runtime.15", "src\runtime\Python.Runtime.15.csproj", "{2759F4FF-716B-4828-916F-50FA86613DFC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.EmbeddingTest.15", "src\embed_tests\Python.EmbeddingTest.15.csproj", "{66B8D01A-9906-452A-B09E-BF75EA76468F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "clrmodule.15", "src\clrmodule\clrmodule.15.csproj", "{E08678D4-9A52-4AD5-B63D-8EBC7399981B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Console.15", "src\console\Console.15.csproj", "{CDAD305F-8E72-492C-A314-64CF58D472A0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Test.15", "src\testing\Python.Test.15.csproj", "{F94B547A-E97E-4500-8D53-B4D64D076E5F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + DebugMono|x64 = DebugMono|x64 + DebugMono|x86 = DebugMono|x86 + DebugMonoPY3|x64 = DebugMonoPY3|x64 + DebugMonoPY3|x86 = DebugMonoPY3|x86 + DebugWin|x64 = DebugWin|x64 + DebugWin|x86 = DebugWin|x86 + DebugWinPY3|x64 = DebugWinPY3|x64 + DebugWinPY3|x86 = DebugWinPY3|x86 + ReleaseMono|x64 = ReleaseMono|x64 + ReleaseMono|x86 = ReleaseMono|x86 + ReleaseMonoPY3|x64 = ReleaseMonoPY3|x64 + ReleaseMonoPY3|x86 = ReleaseMonoPY3|x86 + ReleaseWin|x64 = ReleaseWin|x64 + ReleaseWin|x86 = ReleaseWin|x86 + ReleaseWinPY3|x64 = ReleaseWinPY3|x64 + ReleaseWinPY3|x86 = ReleaseWinPY3|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|x64.Build.0 = DebugMono|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|x86.Build.0 = DebugMono|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|x64.ActiveCfg = DebugWin|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|x64.Build.0 = DebugWin|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|x86.ActiveCfg = DebugWin|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|x86.Build.0 = DebugWin|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|x64.Build.0 = DebugWinPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|x86.Build.0 = DebugWinPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|x64.Build.0 = ReleaseMono|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|x86.Build.0 = ReleaseMono|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|x64.ActiveCfg = ReleaseWin|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|x64.Build.0 = ReleaseWin|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|x86.ActiveCfg = ReleaseWin|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|x86.Build.0 = ReleaseWin|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|Any CPU + {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|Any CPU + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMono|x64.ActiveCfg = DebugMono|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMono|x64.Build.0 = DebugMono|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMono|x86.ActiveCfg = DebugMono|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMono|x86.Build.0 = DebugMono|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWin|x64.ActiveCfg = DebugWin|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWin|x64.Build.0 = DebugWin|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWin|x86.ActiveCfg = DebugWin|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWin|x86.Build.0 = DebugWin|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMono|x64.Build.0 = ReleaseMono|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMono|x86.Build.0 = ReleaseMono|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 + {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMono|x64.ActiveCfg = DebugMono|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMono|x86.ActiveCfg = DebugMono|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWin|x64.ActiveCfg = DebugWin|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWin|x64.Build.0 = DebugWin|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWin|x86.ActiveCfg = DebugWin|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWin|x86.Build.0 = DebugWin|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 + {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMono|x64.ActiveCfg = DebugMono|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMono|x64.Build.0 = DebugMono|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMono|x86.ActiveCfg = DebugMono|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMono|x86.Build.0 = DebugMono|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWin|x64.ActiveCfg = DebugWin|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWin|x64.Build.0 = DebugWin|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWin|x86.ActiveCfg = DebugWin|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWin|x86.Build.0 = DebugWin|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMono|x64.Build.0 = ReleaseMono|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMono|x86.Build.0 = ReleaseMono|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 + {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMono|x64.ActiveCfg = DebugMono|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMono|x64.Build.0 = DebugMono|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMono|x86.ActiveCfg = DebugMono|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMono|x86.Build.0 = DebugMono|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWin|x64.ActiveCfg = DebugWin|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWin|x64.Build.0 = DebugWin|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWin|x86.ActiveCfg = DebugWin|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWin|x86.Build.0 = DebugWin|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMono|x64.Build.0 = ReleaseMono|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMono|x86.Build.0 = ReleaseMono|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 + {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A6347B90-BBE6-4E45-90BF-1BD8B76069E3} + EndGlobalSection +EndGlobal diff --git a/setup.py b/setup.py index c23f6b5bd..6cfd773a6 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,8 @@ import sys import sysconfig from distutils import spawn -from distutils.command import build_ext, install_data, install_lib +from distutils.command import install, build, build_ext, install_data, install_lib +from wheel import bdist_wheel from setuptools import Extension, setup @@ -131,9 +132,28 @@ def _get_long_description(): except ImportError: return '.Net and Mono integration for Python' +def _update_xlat_devtools(): + global DEVTOOLS + if DEVTOOLS == "MsDev": + DEVTOOLS = "MsDev15" + elif DEVTOOLS == "Mono": + DEVTOOLS = "dotnet" class BuildExtPythonnet(build_ext.build_ext): + user_options = build_ext.build_ext.user_options + [ + ('xplat', None, None) + ] + def initialize_options(self): + build_ext.build_ext.initialize_options(self) + self.xplat = None + + def finalize_options(self): + build_ext.build_ext.finalize_options(self) + def build_extension(self, ext): + if self.xplat: + _update_xlat_devtools() + """Builds the .pyd file using msbuild or xbuild""" if ext.name != "clr": return build_ext.build_ext.build_extension(self, ext) @@ -164,7 +184,7 @@ def build_extension(self, ext): if CONFIG == "Debug": defines.extend(["DEBUG", "TRACE"]) - if sys.platform != "win32" and DEVTOOLS == "Mono": + if sys.platform != "win32" and (DEVTOOLS == "Mono" or DEVTOOLS == "dotnet"): on_darwin = sys.platform == "darwin" defines.append("MONO_OSX" if on_darwin else "MONO_LINUX") @@ -196,20 +216,33 @@ def build_extension(self, ext): if DEVTOOLS == "MsDev": _xbuild = '"{0}"'.format(self._find_msbuild_tool("msbuild.exe")) _config = "{0}Win".format(CONFIG) - + _solution_file = 'pythonnet.sln' + _custom_define_constants = False + elif DEVTOOLS == "MsDev15": + _xbuild = '"{0}"'.format(self._find_msbuild_tool_15()) + _config = "{0}Win".format(CONFIG) + _solution_file = 'pythonnet.15.sln' + _custom_define_constants = True elif DEVTOOLS == "Mono": - _xbuild = "xbuild" + _xbuild = 'xbuild' _config = "{0}Mono".format(CONFIG) + _solution_file = 'pythonnet.sln' + _custom_define_constants = False + elif DEVTOOLS == "dotnet": + _xbuild = 'dotnet msbuild' + _config = "{0}Mono".format(CONFIG) + _solution_file = 'pythonnet.15.sln' + _custom_define_constants = True else: raise NotImplementedError( - "DevTool {0} not supported (use MsDev/Mono)".format(DEVTOOLS)) + "DevTool {0} not supported (use MsDev/MsDev15/Mono/dotnet)".format(DEVTOOLS)) cmd = [ _xbuild, - 'pythonnet.sln', + _solution_file, '/p:Configuration={}'.format(_config), '/p:Platform={}'.format(ARCH), - '/p:DefineConstants="{}"'.format('%3B'.join(defines)), + '/p:{}DefineConstants="{}"'.format('Custom' if _custom_define_constants else '','%3B'.join(defines)), '/p:PythonBuildDir="{}"'.format(os.path.abspath(dest_dir)), '/p:PythonInteropFile="{}"'.format(os.path.basename(interop_file)), '/verbosity:{}'.format(VERBOSITY), @@ -220,15 +253,16 @@ def build_extension(self, ext): cmd.append('/p:PythonManifest="{0}"'.format(manifest)) self.debug_print("Building: {0}".format(" ".join(cmd))) - use_shell = True if DEVTOOLS == "Mono" else False + use_shell = True if DEVTOOLS == "Mono" or DEVTOOLS == "dotnet" else False + subprocess.check_call(" ".join(cmd + ["/t:Clean"]), shell=use_shell) subprocess.check_call(" ".join(cmd + ["/t:Build"]), shell=use_shell) - if DEVTOOLS == "Mono": + if DEVTOOLS == "Mono" or DEVTOOLS == "dotnet": self._build_monoclr() def _get_manifest(self, build_dir): - if DEVTOOLS != "MsDev": + if DEVTOOLS != "MsDev" and DEVTOOLS != "MsDev15": return mt = self._find_msbuild_tool("mt.exe", use_windows_sdk=True) manifest = os.path.abspath(os.path.join(build_dir, "app.manifest")) @@ -261,19 +295,30 @@ def _build_monoclr(self): def _install_packages(self): """install packages using nuget""" - nuget = os.path.join("tools", "nuget", "nuget.exe") - use_shell = False - if DEVTOOLS == "Mono": - nuget = "mono {0}".format(nuget) - use_shell = True + use_shell = DEVTOOLS == "Mono" or DEVTOOLS == "dotnet" + + if DEVTOOLS == "MsDev15" or DEVTOOLS == "dotnet": + if DEVTOOLS == "MsDev15": + _config = "{0}Win".format(CONFIG) + elif DEVTOOLS == "dotnet": + _config = "{0}Mono".format(CONFIG) + + cmd = "dotnet msbuild /t:Restore pythonnet.15.sln /p:Configuration={0} /p:Platform={1}".format(_config, ARCH) + self.debug_print("Updating packages with xplat: {0}".format(cmd)) + subprocess.check_call(cmd, shell=use_shell) + else: + nuget = os.path.join("tools", "nuget", "nuget.exe") + + if DEVTOOLS == "Mono": + nuget = "mono {0}".format(nuget) - cmd = "{0} update -self".format(nuget) - self.debug_print("Updating NuGet: {0}".format(cmd)) - subprocess.check_call(cmd, shell=use_shell) + cmd = "{0} update -self".format(nuget) + self.debug_print("Updating NuGet: {0}".format(cmd)) + subprocess.check_call(cmd, shell=use_shell) - cmd = "{0} restore pythonnet.sln -o packages".format(nuget) - self.debug_print("Installing packages: {0}".format(cmd)) - subprocess.check_call(cmd, shell=use_shell) + cmd = "{0} restore pythonnet.sln -o packages".format(nuget) + self.debug_print("Installing packages: {0}".format(cmd)) + subprocess.check_call(cmd, shell=use_shell) def _find_msbuild_tool(self, tool="msbuild.exe", use_windows_sdk=False): """Return full path to one of the Microsoft build tools""" @@ -319,6 +364,20 @@ def _find_msbuild_tool(self, tool="msbuild.exe", use_windows_sdk=False): raise RuntimeError("{0} could not be found".format(tool)) + def _find_msbuild_tool_15(self): + """Return full path to one of the Microsoft build tools""" + try: + basePathes = subprocess.check_output( + ["vswhere", "-latest", + "-version", "[15.0, 16.0)", + "-requires", "Microsoft.Component.MSBuild", + "-property", "InstallationPath"]).splitlines() + if len(basePathes): + return os.path.join(basePathes[0].decode(sys.stdout.encoding or "utf-8"), "MSBuild", "15.0", "Bin", "MSBuild.exe") + else: + raise RuntimeError("MSBuild >=15.0 could not be found.") + except subprocess.CalledProcessError as e: + raise RuntimeError("MSBuild >=15.0 could not be found. {0}".format(e.output)) class InstallLibPythonnet(install_lib.install_lib): def install(self): @@ -356,8 +415,39 @@ def run(self): return install_data.install_data.run(self) +class InstallPythonnet(install.install): + user_options = install.install.user_options + [ + ('xplat', None, None) + ] + def initialize_options(self): + install.install.initialize_options(self) + self.xplat = None + + def finalize_options(self): + install.install.finalize_options(self) -############################################################################### + def run(self): + if self.xplat: + _update_xlat_devtools() + return install.install.run(self) + +class BDistWheelPythonnet(bdist_wheel.bdist_wheel): + user_options = bdist_wheel.bdist_wheel.user_options + [ + ('xplat', None, None) + ] + def initialize_options(self): + bdist_wheel.bdist_wheel.initialize_options(self) + self.xplat = None + + def finalize_options(self): + bdist_wheel.bdist_wheel.finalize_options(self) + + def run(self): + if self.xplat: + _update_xlat_devtools() + return bdist_wheel.bdist_wheel.run(self) + + ############################################################################### setupdir = os.path.dirname(__file__) if setupdir: os.chdir(setupdir) @@ -385,9 +475,11 @@ def run(self): ]), ], cmdclass={ + "install": InstallPythonnet, "build_ext": BuildExtPythonnet, "install_lib": InstallLibPythonnet, "install_data": InstallDataPythonnet, + "bdist_wheel": BDistWheelPythonnet }, classifiers=[ 'Development Status :: 5 - Production/Stable', diff --git a/src/clrmodule/clrmodule.15.csproj b/src/clrmodule/clrmodule.15.csproj new file mode 100644 index 000000000..4d8a1b8ff --- /dev/null +++ b/src/clrmodule/clrmodule.15.csproj @@ -0,0 +1,101 @@ + + + + + + net40 + x64;x86 + DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 + clrmodule + clrmodule + clrmodule + 2.4.0 + false + false + false + false + false + false + bin\clrmodule.xml + bin\ + false + 1591 + ..\..\ + $(SolutionDir)\bin\ + 6 + prompt + $(PYTHONNET_DEFINE_CONSTANTS) + XPLAT + $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(DefineConstants);TRACE;DEBUG + + + + x86 + + + x64 + + + + true + $(DefineConstants);PYTHON2;TRACE;DEBUG + full + + + $(DefineConstants);PYTHON2 + true + pdbonly + + + true + $(DefineConstants);PYTHON2;TRACE;DEBUG + full + + + $(DefineConstants);PYTHON2 + true + pdbonly + + + true + $(DefineConstants);PYTHON3;TRACE;DEBUG + full + + + $(DefineConstants);PYTHON3 + true + pdbonly + + + true + $(DefineConstants);PYTHON3;TRACE;DEBUG + full + + + $(DefineConstants);PYTHON3 + true + pdbonly + + + + + + + + + + + + + + $(TargetPath) + $(TargetDir)$(TargetName).pdb + + + + + + + + diff --git a/src/console/Console.15.csproj b/src/console/Console.15.csproj new file mode 100644 index 000000000..0c89fce40 --- /dev/null +++ b/src/console/Console.15.csproj @@ -0,0 +1,105 @@ + + + + net40 + x64;x86 + DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 + Exe + nPython + Python.Runtime + nPython + 2.4.0 + false + false + false + false + false + false + bin\nPython.xml + bin\ + false + 1591 + ..\..\ + $(SolutionDir)\bin\ + 6 + python-clear.ico + prompt + $(PYTHONNET_DEFINE_CONSTANTS) + XPLAT + $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(DefineConstants);TRACE;DEBUG + $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ + + + x86 + + + x64 + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) + true + pdbonly + + + $(PythonManifest) + + + + + + + Properties\SharedAssemblyInfo.cs + + + + + + Python.Runtime.dll + + + + + + + + + + + + diff --git a/src/embed_tests/Python.EmbeddingTest.15.csproj b/src/embed_tests/Python.EmbeddingTest.15.csproj new file mode 100644 index 000000000..ac6ecba92 --- /dev/null +++ b/src/embed_tests/Python.EmbeddingTest.15.csproj @@ -0,0 +1,121 @@ + + + + + net40 + x64;x86 + DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 + net45 + Python.EmbeddingTest + Python.EmbeddingTest + Python.EmbeddingTest + 2.4.0 + false + false + false + false + bin\ + false + $(OutputPath)\$(AssemblyName).xml + 1591 + ..\..\ + $(SolutionDir)\bin\ + 6 + prompt + $(PYTHONNET_DEFINE_CONSTANTS) + XPLAT + $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(DefineConstants);TRACE;DEBUG + $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ + + + x86 + + + x64 + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants); + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants); + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants); + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants); + true + pdbonly + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(TargetPath) + $(TargetDir)$(TargetName).pdb + + + + + + + + diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index d45c622f9..fe02b0526 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -70,8 +70,8 @@ - - ..\..\packages\NUnit.3.6.0\lib\net40\nunit.framework.dll + + ..\..\packages\NUnit.3.7.1\lib\net40\nunit.framework.dll diff --git a/src/embed_tests/TestPythonEngineProperties.cs b/src/embed_tests/TestPythonEngineProperties.cs index 76177d05a..01c6ae7e3 100644 --- a/src/embed_tests/TestPythonEngineProperties.cs +++ b/src/embed_tests/TestPythonEngineProperties.cs @@ -146,7 +146,7 @@ public void SetProgramName() [Test] public void SetPythonPath() { - if (Runtime.Runtime._pyversion == "2.7") + if (Runtime.Runtime.pyversion == "2.7") { // Assert.Skip outputs as a warning (ie. pending to fix) Assert.Pass(); @@ -166,7 +166,7 @@ public void SetPythonPath() [Test] public void SetPythonPathExceptionOn27() { - if (Runtime.Runtime._pyversion != "2.7") + if (Runtime.Runtime.pyversion != "2.7") { Assert.Pass(); } diff --git a/src/embed_tests/packages.config b/src/embed_tests/packages.config index 4cb01d3be..8c175f441 100644 --- a/src/embed_tests/packages.config +++ b/src/embed_tests/packages.config @@ -1,5 +1,5 @@ - - + + diff --git a/src/runtime/Python.Runtime.15.csproj b/src/runtime/Python.Runtime.15.csproj new file mode 100644 index 000000000..93bd143dc --- /dev/null +++ b/src/runtime/Python.Runtime.15.csproj @@ -0,0 +1,133 @@ + + + + net40 + AnyCPU + DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 + net45 + Python.Runtime + Python.Runtime + Python.Runtime + 2.4.0 + false + false + false + false + false + false + bin\ + false + $(OutputPath)\$(AssemblyName).xml + 1591;NU1701 + ..\..\ + $(SolutionDir)\bin\ + 6 + True + ..\pythonnet.snk + $(PYTHONNET_DEFINE_CONSTANTS) + XPLAT + $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(DefineConstants);TRACE;DEBUG + $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ + $(PYTHONNET_PY2_VERSION) + PYTHON27 + $(PYTHONNET_PY3_VERSION) + PYTHON36 + $(PYTHONNET_WIN_DEFINE_CONSTANTS) + UCS2 + $(PYTHONNET_MONO_DEFINE_CONSTANTS) + UCS4;MONO_LINUX;PYTHON_WITH_PYMALLOC + + + + $(DefineConstants);PYTHON2;$(Python2Version);$(PythonMonoDefineConstants) + true + pdbonly + + + $(DefineConstants);PYTHON3;$(Python3Version);$(PythonMonoDefineConstants) + true + pdbonly + + + true + $(DefineConstants);PYTHON2;$(Python2Version);$(PythonMonoDefineConstants);TRACE;DEBUG + false + full + + + true + $(DefineConstants);PYTHON3;$(Python3Version);$(PythonMonoDefineConstants);TRACE;DEBUG + false + full + + + $(DefineConstants);PYTHON2;$(Python2Version);$(PythonWinDefineConstants) + true + pdbonly + + + $(DefineConstants);PYTHON3;$(Python3Version);$(PythonWinDefineConstants) + true + pdbonly + + + true + $(DefineConstants);PYTHON2;$(Python2Version);$(PythonWinDefineConstants);TRACE;DEBUG + false + full + + + true + $(DefineConstants);PYTHON3;$(Python3Version);$(PythonWinDefineConstants);TRACE;DEBUG + false + full + + + + + + + + + + + + + + + + + + + + + + clr.py + + + + + + + + + + + + + + + $(TargetPath) + $(TargetDir)$(TargetName).pdb + + + + + + + + + + + diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 8f730a855..3949500e2 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -110,8 +110,8 @@ public class Runtime // We needs to replace all public constants to static readonly fields to allow // binary substitution of different Python.Runtime.dll builds in a target application. - public string pyversion => _pyversion; - public string pyver => _pyver; + public static string pyversion => _pyversion; + public static string pyver => _pyver; #if PYTHON27 internal const string _pyversion = "2.7"; diff --git a/src/testing/Python.Test.15.csproj b/src/testing/Python.Test.15.csproj new file mode 100644 index 000000000..635580854 --- /dev/null +++ b/src/testing/Python.Test.15.csproj @@ -0,0 +1,92 @@ + + + + net40 + x64;x86 + DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 + Python.Test + Python.Test + Python.Test + 2.4.0 + bin\Python.Test.xml + bin\ + false + 1591,0067 + ..\..\ + $(SolutionDir)\bin\ + 6 + false + ..\pythonnet.snk + prompt + $(PYTHONNET_DEFINE_CONSTANTS) + XPLAT + $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(DefineConstants);TRACE;DEBUG + $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ + + + x86 + + + x64 + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) + true + pdbonly + + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) + true + pdbonly + + + + + + + + + + + + + + $(TargetPath) + $(TargetDir)$(TargetName).pdb + + + + + + From df1c22410922b1f205556d4bbc31dc9f828a3447 Mon Sep 17 00:00:00 2001 From: dmitriyse Date: Thu, 21 Sep 2017 16:47:52 +0400 Subject: [PATCH 296/324] Added CoreCLR 2.0 build target. Compile issues fixed. (#519) * Full featured xplat build. * NetCoreApp 2.0 target added, compile issues fixed, CI system improved. * .Net 45 TargetingPack System.XML.dll naming fix. (For xplat linux build). * Setup.py --xplat option refactored. Travis-ci build matrix extended. * AppVeyor matrix extended, xplat build added. * appveyor.yml yaml syntax fix. * NUnit dependency upgraded to 3.7. Changelog improved. * EmbeddingTest fixes, and stubs. * Fix for importing numpy and other python modules with native parts. * Changelog improved. * Build order improvement. * NetCoreApp 2.0 fix. EmitCalli does not supports cdecl. Falling-back to a slow Marshal-based solution. + x86 fix. * All finalizers are disabled until valid implementation. Helps to avoid non relevant CI build faults. * Mono builds now can be build on Windows. DEBUG;TRACE fix for the case VS + non empty PYTHONNET_DEFINE_CONSTANTS * Python.Runtime.dll now targets NetStandard2.0 inplace of NetCoreApp 2.0 * Wrong NETSTANDARD/NETCOREAPP define constant change. * Typo fix. --- .travis.yml | 1 + CHANGELOG.md | 1 + appveyor.yml | 2 + ci/appveyor_run_tests.ps1 | 17 +++++++ pythonnet.15.sln | 10 ++--- setup.py | 2 + src/clrmodule/clrmodule.15.csproj | 1 + src/console/Console.15.csproj | 12 ++--- src/console/pythonconsole.cs | 9 +++- src/embed_tests/Program.cs | 19 ++++++++ .../Python.EmbeddingTest.15.csproj | 21 ++++++--- src/embed_tests/TestPySequence.cs | 6 ++- src/embed_tests/pyimport.cs | 4 ++ src/runtime/Python.Runtime.15.csproj | 44 +++++++++---------- src/runtime/delegatemanager.cs | 4 ++ src/runtime/metatype.cs | 4 +- src/runtime/nativecall.cs | 30 ++++++++++++- src/runtime/polyfill/ReflectionPolifills.cs | 21 +++++++++ src/runtime/pyobject.cs | 6 ++- src/runtime/pyscope.cs | 6 ++- src/runtime/pythonexception.cs | 4 ++ src/runtime/runtime.cs | 43 ++++++++++++++---- src/testing/Python.Test.15.csproj | 17 ++++--- src/tests/fixtures/netstandard2.0/.gitkeep | 0 24 files changed, 223 insertions(+), 61 deletions(-) create mode 100644 src/embed_tests/Program.cs create mode 100644 src/runtime/polyfill/ReflectionPolifills.cs create mode 100644 src/tests/fixtures/netstandard2.0/.gitkeep diff --git a/.travis.yml b/.travis.yml index 2468ed60a..627fd9ebf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -169,6 +169,7 @@ install: script: - python -m pytest - mono $NUNIT_PATH src/embed_tests/bin/Python.EmbeddingTest.dll + - if [[ $BUILD_OPTS == --xplat ]]; then dotnet src/embed_tests/bin/netcoreapp2.0_publish/Python.EmbeddingTest.dll; fi after_script: # Uncomment if need to geninterop, ie. py37 final diff --git a/CHANGELOG.md b/CHANGELOG.md index e5929107b..7d408a8d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ## [unreleased][] ### Added +- Added support for embedding python into dotnet core 2.0 (NetStandard 2.0) - Added new build system (pythonnet.15.sln) based on dotnetcore-sdk/xplat(crossplatform msbuild). Currently there two side-by-side build systems that produces the same output (net40) from the same sources. After a some transition time, current (mono/ msbuild 14.0) build system will be removed. diff --git a/appveyor.yml b/appveyor.yml index c7c3a7810..1953d85d5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -43,6 +43,8 @@ init: install: - pip install --upgrade -r requirements.txt --quiet - choco install vswhere -y + - cmd: curl -O https://download.microsoft.com/download/5/6/B/56BFEF92-9045-4414-970C-AB31E0FC07EC/dotnet-runtime-2.0.0-win-x86.exe + - cmd: dotnet-runtime-2.0.0-win-x86.exe /install /quiet /norestart /log install.log # Install OpenCover. Can't put on `packages.config`, not Mono compatible - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages -Verbosity quiet diff --git a/ci/appveyor_run_tests.ps1 b/ci/appveyor_run_tests.ps1 index 2821cf915..b45440fbe 100644 --- a/ci/appveyor_run_tests.ps1 +++ b/ci/appveyor_run_tests.ps1 @@ -44,6 +44,23 @@ if ($CS_STATUS -ne 0) { Write-Host "Embedded tests failed" -ForegroundColor "Red" } +if ($env:BUILD_OPTS -eq "--xplat"){ + if ($env:PLATFORM -eq "x64") { + $DOTNET_CMD = "dotnet" + } + else{ + $DOTNET_CMD = "c:\Program Files (x86)\dotnet\dotnet" + } + + # Run Embedded tests for netcoreapp2.0 (OpenCover currently does not supports dotnet core) + Write-Host ("Starting embedded tests for netcoreapp2.0") -ForegroundColor "Green" + &$DOTNET_CMD .\src\embed_tests\bin\netcoreapp2.0_publish\Python.EmbeddingTest.dll + $CS_STATUS = $LastExitCode + if ($CS_STATUS -ne 0) { + Write-Host "Embedded tests for netcoreapp2.0 failed" -ForegroundColor "Red" + } +} + # Set exit code to fail if either Python or Embedded tests failed if ($PYTHON_STATUS -ne 0 -or $CS_STATUS -ne 0) { Write-Host "Tests failed" -ForegroundColor "Red" diff --git a/pythonnet.15.sln b/pythonnet.15.sln index 121631e43..f2015e480 100644 --- a/pythonnet.15.sln +++ b/pythonnet.15.sln @@ -2,15 +2,15 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.26730.3 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Runtime.15", "src\runtime\Python.Runtime.15.csproj", "{2759F4FF-716B-4828-916F-50FA86613DFC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Runtime.15", "src/runtime/Python.Runtime.15.csproj", "{2759F4FF-716B-4828-916F-50FA86613DFC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.EmbeddingTest.15", "src\embed_tests\Python.EmbeddingTest.15.csproj", "{66B8D01A-9906-452A-B09E-BF75EA76468F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.EmbeddingTest.15", "src/embed_tests/Python.EmbeddingTest.15.csproj", "{66B8D01A-9906-452A-B09E-BF75EA76468F}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "clrmodule.15", "src\clrmodule\clrmodule.15.csproj", "{E08678D4-9A52-4AD5-B63D-8EBC7399981B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "clrmodule.15", "src/clrmodule/clrmodule.15.csproj", "{E08678D4-9A52-4AD5-B63D-8EBC7399981B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Console.15", "src\console\Console.15.csproj", "{CDAD305F-8E72-492C-A314-64CF58D472A0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Console.15", "src/console/Console.15.csproj", "{CDAD305F-8E72-492C-A314-64CF58D472A0}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Test.15", "src\testing\Python.Test.15.csproj", "{F94B547A-E97E-4500-8D53-B4D64D076E5F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Test.15", "src/testing/Python.Test.15.csproj", "{F94B547A-E97E-4500-8D53-B4D64D076E5F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/setup.py b/setup.py index 6cfd773a6..24557c137 100644 --- a/setup.py +++ b/setup.py @@ -257,6 +257,8 @@ def build_extension(self, ext): subprocess.check_call(" ".join(cmd + ["/t:Clean"]), shell=use_shell) subprocess.check_call(" ".join(cmd + ["/t:Build"]), shell=use_shell) + if DEVTOOLS == "MsDev15" or DEVTOOLS == "dotnet": + subprocess.check_call(" ".join(cmd + ['"/t:Console_15:publish;Python_EmbeddingTest_15:publish"', "/p:TargetFramework=netcoreapp2.0"]), shell=use_shell) if DEVTOOLS == "Mono" or DEVTOOLS == "dotnet": self._build_monoclr() diff --git a/src/clrmodule/clrmodule.15.csproj b/src/clrmodule/clrmodule.15.csproj index 4d8a1b8ff..e97c6fe1b 100644 --- a/src/clrmodule/clrmodule.15.csproj +++ b/src/clrmodule/clrmodule.15.csproj @@ -22,6 +22,7 @@ 1591 ..\..\ $(SolutionDir)\bin\ + $(PythonBuildDir)\$(TargetFramework)\ 6 prompt $(PYTHONNET_DEFINE_CONSTANTS) diff --git a/src/console/Console.15.csproj b/src/console/Console.15.csproj index 0c89fce40..ed9d3d8f9 100644 --- a/src/console/Console.15.csproj +++ b/src/console/Console.15.csproj @@ -1,7 +1,7 @@ - net40 + net40;netcoreapp2.0 x64;x86 DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 Exe @@ -15,12 +15,14 @@ false false false - bin\nPython.xml bin\ - false + false + $(OutputPath)\$(AssemblyName).xml + $(OutputPath)\$(TargetFramework)\$(AssemblyName).xml 1591 ..\..\ $(SolutionDir)\bin\ + $(PythonBuildDir)\$(TargetFramework)\ 6 python-clear.ico prompt @@ -89,7 +91,7 @@ - + Python.Runtime.dll @@ -100,6 +102,6 @@ - + diff --git a/src/console/pythonconsole.cs b/src/console/pythonconsole.cs index e9bb31e69..912e9bb0d 100644 --- a/src/console/pythonconsole.cs +++ b/src/console/pythonconsole.cs @@ -16,8 +16,9 @@ namespace Python.Runtime /// public sealed class PythonConsole { +#if NET40 private static AssemblyLoader assemblyLoader = new AssemblyLoader(); - +#endif private PythonConsole() { } @@ -25,9 +26,11 @@ private PythonConsole() [STAThread] public static int Main(string[] args) { + // Only net40 is capable to safely inject python.runtime.dll into resources. +#if NET40 // reference the static assemblyLoader to stop it being optimized away AssemblyLoader a = assemblyLoader; - +#endif string[] cmd = Environment.GetCommandLineArgs(); PythonEngine.Initialize(); @@ -37,6 +40,7 @@ public static int Main(string[] args) return i; } +#if NET40 // Register a callback function to load embedded assemblies. // (Python.Runtime.dll is included as a resource) private sealed class AssemblyLoader @@ -73,5 +77,6 @@ public AssemblyLoader() }; } } +#endif } } diff --git a/src/embed_tests/Program.cs b/src/embed_tests/Program.cs new file mode 100644 index 000000000..b4439e3e4 --- /dev/null +++ b/src/embed_tests/Program.cs @@ -0,0 +1,19 @@ +using System; + +using NUnit.Common; + +using NUnitLite; + +namespace Python.EmbeddingTest +{ + public class Program + { + public static int Main(string[] args) + { + return new AutoRun(typeof(Program).Assembly).Execute( + args, + new ExtendedTextWrapper(Console.Out), + Console.In); + } + } +} diff --git a/src/embed_tests/Python.EmbeddingTest.15.csproj b/src/embed_tests/Python.EmbeddingTest.15.csproj index ac6ecba92..a30e8b3d9 100644 --- a/src/embed_tests/Python.EmbeddingTest.15.csproj +++ b/src/embed_tests/Python.EmbeddingTest.15.csproj @@ -2,10 +2,11 @@ - net40 + net40;netcoreapp2.0 x64;x86 DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 - net45 + Exe + false Python.EmbeddingTest Python.EmbeddingTest Python.EmbeddingTest @@ -15,16 +16,19 @@ false false bin\ - false - $(OutputPath)\$(AssemblyName).xml + false + $(OutputPath)\$(AssemblyName).xml + $(OutputPath)\$(TargetFramework)\$(AssemblyName).xml 1591 ..\..\ - $(SolutionDir)\bin\ + $(SolutionDir)\bin\ + $(OutputPath)\$(TargetFramework)_publish 6 prompt $(PYTHONNET_DEFINE_CONSTANTS) XPLAT $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(DefineConstants);NETCOREAPP $(DefineConstants);TRACE;DEBUG $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ @@ -88,6 +92,11 @@ + + + + + @@ -114,7 +123,7 @@ - + diff --git a/src/embed_tests/TestPySequence.cs b/src/embed_tests/TestPySequence.cs index 7c175b1ce..1e3ebf144 100644 --- a/src/embed_tests/TestPySequence.cs +++ b/src/embed_tests/TestPySequence.cs @@ -69,8 +69,10 @@ public void TestRepeat() PyObject actual = t1.Repeat(3); Assert.AreEqual("FooFooFoo", actual.ToString()); - actual = t1.Repeat(-3); - Assert.AreEqual("", actual.ToString()); + // On 32 bit system this argument should be int, but on the 64 bit system this should be long value. + // This works on the Framework 4.0 accidentally, it should produce out of memory! + // actual = t1.Repeat(-3); + // Assert.AreEqual("", actual.ToString()); } [Test] diff --git a/src/embed_tests/pyimport.cs b/src/embed_tests/pyimport.cs index 3bb9a34d6..acb3433de 100644 --- a/src/embed_tests/pyimport.cs +++ b/src/embed_tests/pyimport.cs @@ -30,7 +30,11 @@ public void SetUp() /* Append the tests directory to sys.path * using reflection to circumvent the private * modifiers placed on most Runtime methods. */ +#if NETCOREAPP + const string s = "../../fixtures"; +#else const string s = "../fixtures"; +#endif string testPath = Path.Combine(TestContext.CurrentContext.TestDirectory, s); IntPtr str = Runtime.Runtime.PyString_FromString(testPath); diff --git a/src/runtime/Python.Runtime.15.csproj b/src/runtime/Python.Runtime.15.csproj index 93bd143dc..1ca767ca4 100644 --- a/src/runtime/Python.Runtime.15.csproj +++ b/src/runtime/Python.Runtime.15.csproj @@ -1,7 +1,7 @@ - net40 + net40;netstandard2.0 AnyCPU DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 net45 @@ -16,70 +16,65 @@ false false bin\ - false - $(OutputPath)\$(AssemblyName).xml + false + $(OutputPath)\$(AssemblyName).xml + $(OutputPath)\$(TargetFramework)\$(AssemblyName).xml 1591;NU1701 ..\..\ - $(SolutionDir)\bin\ + $(SolutionDir)\bin\ + $(PythonBuildDir)\$(TargetFramework)\ 6 True ..\pythonnet.snk $(PYTHONNET_DEFINE_CONSTANTS) XPLAT $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); + $(DefineConstants);NETSTANDARD $(DefineConstants);TRACE;DEBUG $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ - $(PYTHONNET_PY2_VERSION) - PYTHON27 - $(PYTHONNET_PY3_VERSION) - PYTHON36 - $(PYTHONNET_WIN_DEFINE_CONSTANTS) - UCS2 - $(PYTHONNET_MONO_DEFINE_CONSTANTS) - UCS4;MONO_LINUX;PYTHON_WITH_PYMALLOC - $(DefineConstants);PYTHON2;$(Python2Version);$(PythonMonoDefineConstants) + $(DefineConstants);PYTHON2;PYTHON27;UCS4 true pdbonly - $(DefineConstants);PYTHON3;$(Python3Version);$(PythonMonoDefineConstants) + $(DefineConstants);PYTHON3;PYTHON36;UCS4 true pdbonly true - $(DefineConstants);PYTHON2;$(Python2Version);$(PythonMonoDefineConstants);TRACE;DEBUG + $(DefineConstants);PYTHON2;PYTHON27;UCS4;TRACE;DEBUG false full true - $(DefineConstants);PYTHON3;$(Python3Version);$(PythonMonoDefineConstants);TRACE;DEBUG + $(DefineConstants);PYTHON3;PYTHON36;UCS4;TRACE;DEBUG false full - $(DefineConstants);PYTHON2;$(Python2Version);$(PythonWinDefineConstants) + $(DefineConstants);PYTHON2;PYTHON27;UCS2 true pdbonly - $(DefineConstants);PYTHON3;$(Python3Version);$(PythonWinDefineConstants) + $(DefineConstants);PYTHON3;PYTHON36;UCS2 true pdbonly true - $(DefineConstants);PYTHON2;$(Python2Version);$(PythonWinDefineConstants);TRACE;DEBUG + $(DefineConstants);PYTHON2;PYTHON27;UCS2;TRACE;DEBUG false full true - $(DefineConstants);PYTHON3;$(Python3Version);$(PythonWinDefineConstants);TRACE;DEBUG + $(DefineConstants);PYTHON3;PYTHON36;UCS2;TRACE;DEBUG false full @@ -107,11 +102,16 @@ + + + + + - + @@ -127,7 +127,7 @@ - + diff --git a/src/runtime/delegatemanager.cs b/src/runtime/delegatemanager.cs index df5eec427..7632816d1 100644 --- a/src/runtime/delegatemanager.cs +++ b/src/runtime/delegatemanager.cs @@ -195,6 +195,10 @@ public Dispatcher(IntPtr target, Type dtype) ~Dispatcher() { + // We needs to disable Finalizers until it's valid implementation. + // Current implementation can produce low probability floating bugs. + return; + // Note: the managed GC thread can run and try to free one of // these *after* the Python runtime has been finalized! if (Runtime.Py_IsInitialized() > 0) diff --git a/src/runtime/metatype.cs b/src/runtime/metatype.cs index 982f4a632..3295ab110 100644 --- a/src/runtime/metatype.cs +++ b/src/runtime/metatype.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Runtime.InteropServices; namespace Python.Runtime @@ -201,7 +201,7 @@ public static int tp_setattro(IntPtr tp, IntPtr name, IntPtr value) IntPtr fp = Marshal.ReadIntPtr(dt, TypeOffset.tp_descr_set); if (fp != IntPtr.Zero) { - return NativeCall.Impl.Int_Call_3(fp, descr, name, value); + return NativeCall.Int_Call_3(fp, descr, name, value); } Exceptions.SetError(Exceptions.AttributeError, "attribute is read-only"); return -1; diff --git a/src/runtime/nativecall.cs b/src/runtime/nativecall.cs index 9d1b0f41c..c64306958 100644 --- a/src/runtime/nativecall.cs +++ b/src/runtime/nativecall.cs @@ -23,6 +23,32 @@ namespace Python.Runtime ///
internal class NativeCall { +#if NETSTANDARD + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate void Void_1_Delegate(IntPtr a1); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate IntPtr IntPtr_3_Delegate(IntPtr a1, IntPtr a2, IntPtr a3); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate int Int_3_Delegate(IntPtr a1, IntPtr a2, IntPtr a3); + + public static void Void_Call_1(IntPtr fp, IntPtr a1) + { + ((Void_1_Delegate)Marshal.GetDelegateForFunctionPointer(fp, typeof(Void_1_Delegate)))(a1); + } + + public static IntPtr Call_3(IntPtr fp, IntPtr a1, IntPtr a2, IntPtr a3) + { + return ((IntPtr_3_Delegate)Marshal.GetDelegateForFunctionPointer(fp, typeof(IntPtr_3_Delegate)))(a1, a2, a3); + } + + + public static int Int_Call_3(IntPtr fp, IntPtr a1, IntPtr a2, IntPtr a3) + { + return ((Int_3_Delegate)Marshal.GetDelegateForFunctionPointer(fp, typeof(Int_3_Delegate)))(a1, a2, a3); + } +#else private static AssemblyBuilder aBuilder; private static ModuleBuilder mBuilder; @@ -132,9 +158,10 @@ public static int Int_Call_3(IntPtr fp, IntPtr a1, IntPtr a2, IntPtr a3) { return Impl.Int_Call_3(fp, a1, a2, a3); } +#endif } - +#if !NETSTANDARD /// /// Defines native call signatures to be generated by NativeCall. /// @@ -148,4 +175,5 @@ public interface INativeCall IntPtr Call_3(IntPtr funcPtr, IntPtr a1, IntPtr a2, IntPtr a3); } +#endif } diff --git a/src/runtime/polyfill/ReflectionPolifills.cs b/src/runtime/polyfill/ReflectionPolifills.cs new file mode 100644 index 000000000..a7e9c879a --- /dev/null +++ b/src/runtime/polyfill/ReflectionPolifills.cs @@ -0,0 +1,21 @@ +using System; +using System.Reflection; +using System.Reflection.Emit; + +namespace Python.Runtime +{ +#if NETSTANDARD + public static class ReflectionPolifills + { + public static AssemblyBuilder DefineDynamicAssembly(this AppDomain appDomain, AssemblyName assemblyName, AssemblyBuilderAccess assemblyBuilderAccess) + { + return AssemblyBuilder.DefineDynamicAssembly(assemblyName, assemblyBuilderAccess); + } + + public static Type CreateType(this TypeBuilder typeBuilder) + { + return typeBuilder.GetTypeInfo().GetType(); + } + } +#endif +} diff --git a/src/runtime/pyobject.cs b/src/runtime/pyobject.cs index 1b41b0893..5900e80b7 100644 --- a/src/runtime/pyobject.cs +++ b/src/runtime/pyobject.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Dynamic; using System.Linq.Expressions; @@ -43,6 +43,10 @@ protected PyObject() ~PyObject() { + // We needs to disable Finalizers until it's valid implementation. + // Current implementation can produce low probability floating bugs. + return; + Dispose(); } diff --git a/src/runtime/pyscope.cs b/src/runtime/pyscope.cs index 25282ac26..67f93c6e2 100644 --- a/src/runtime/pyscope.cs +++ b/src/runtime/pyscope.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Collections.Generic; using System.Dynamic; @@ -527,6 +527,10 @@ public void Dispose() ~PyScope() { + // We needs to disable Finalizers until it's valid implementation. + // Current implementation can produce low probability floating bugs. + return; + Dispose(); } } diff --git a/src/runtime/pythonexception.cs b/src/runtime/pythonexception.cs index 4fe07f3cf..4031b0526 100644 --- a/src/runtime/pythonexception.cs +++ b/src/runtime/pythonexception.cs @@ -57,6 +57,10 @@ public PythonException() ~PythonException() { + // We needs to disable Finalizers until it's valid implementation. + // Current implementation can produce low probability floating bugs. + return; + Dispose(); } diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 3949500e2..abd0661a4 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Runtime.InteropServices; using System.Security; using System.Text; @@ -9,6 +9,27 @@ namespace Python.Runtime internal static class NativeMethods { #if MONO_LINUX || MONO_OSX +#if NETSTANDARD + private static int RTLD_NOW = 0x2; +#if MONO_LINUX + private static int RTLD_GLOBAL = 0x100; + private static IntPtr RTLD_DEFAULT = IntPtr.Zero; + private const string NativeDll = "libdl.so"; + public static IntPtr LoadLibrary(string fileName) + { + return dlopen($"lib{fileName}.so", RTLD_NOW | RTLD_GLOBAL); + } +#elif MONO_OSX + private static int RTLD_GLOBAL = 0x8; + private const string NativeDll = "/usr/lib/libSystem.dylib" + private static IntPtr RTLD_DEFAULT = new IntPtr(-2); + + public static IntPtr LoadLibrary(string fileName) + { + return dlopen($"lib{fileName}.dylib", RTLD_NOW | RTLD_GLOBAL); + } +#endif +#else private static int RTLD_NOW = 0x2; private static int RTLD_SHARED = 0x20; #if MONO_OSX @@ -23,6 +44,8 @@ public static IntPtr LoadLibrary(string fileName) { return dlopen(fileName, RTLD_NOW | RTLD_SHARED); } +#endif + public static void FreeLibrary(IntPtr handle) { @@ -48,16 +71,16 @@ public static IntPtr GetProcAddress(IntPtr dllHandle, string name) return res; } - [DllImport(NativeDll)] - private static extern IntPtr dlopen(String fileName, int flags); + [DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] + public static extern IntPtr dlopen(String fileName, int flags); - [DllImport(NativeDll)] + [DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr dlsym(IntPtr handle, String symbol); - [DllImport(NativeDll)] + [DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl)] private static extern int dlclose(IntPtr handle); - [DllImport(NativeDll)] + [DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl)] private static extern IntPtr dlerror(); #else // Windows private const string NativeDll = "kernel32.dll"; @@ -158,7 +181,7 @@ public class Runtime public static readonly string PythonDLL = _PythonDll; -#if PYTHON_WITHOUT_ENABLE_SHARED +#if PYTHON_WITHOUT_ENABLE_SHARED && !NETSTANDARD internal const string _PythonDll = "__Internal"; #else internal const string _PythonDll = dllBase + dllWithPyDebug + dllWithPyMalloc; @@ -298,11 +321,13 @@ internal static void Initialize() Error = new IntPtr(-1); IntPtr dllLocal = IntPtr.Zero; + if (_PythonDll != "__Internal") { dllLocal = NativeMethods.LoadLibrary(_PythonDll); } _PyObject_NextNotImplemented = NativeMethods.GetProcAddress(dllLocal, "_PyObject_NextNotImplemented"); + #if !(MONO_LINUX || MONO_OSX) if (dllLocal != IntPtr.Zero) { @@ -497,7 +522,7 @@ internal static Type[] PythonArgsToTypeArray(IntPtr arg, bool mangleObjects) /// internal static unsafe void XIncref(IntPtr op) { -#if PYTHON_WITH_PYDEBUG +#if PYTHON_WITH_PYDEBUG || NETSTANDARD Py_IncRef(op); return; #else @@ -518,7 +543,7 @@ internal static unsafe void XIncref(IntPtr op) internal static unsafe void XDecref(IntPtr op) { -#if PYTHON_WITH_PYDEBUG +#if PYTHON_WITH_PYDEBUG || NETSTANDARD Py_DecRef(op); return; #else diff --git a/src/testing/Python.Test.15.csproj b/src/testing/Python.Test.15.csproj index 635580854..a46cafb9d 100644 --- a/src/testing/Python.Test.15.csproj +++ b/src/testing/Python.Test.15.csproj @@ -1,19 +1,21 @@ - net40 + net40;netstandard2.0 x64;x86 DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 Python.Test Python.Test Python.Test 2.4.0 - bin\Python.Test.xml bin\ - false + false + $(OutputPath)\$(AssemblyName).xml + $(OutputPath)\$(TargetFramework)\$(AssemblyName).xml 1591,0067 ..\..\ $(SolutionDir)\bin\ + $(PythonBuildDir)\$(TargetFramework)\ 6 false ..\pythonnet.snk @@ -76,7 +78,11 @@
- + + + + + @@ -86,7 +92,8 @@ $(TargetDir)$(TargetName).pdb - + + diff --git a/src/tests/fixtures/netstandard2.0/.gitkeep b/src/tests/fixtures/netstandard2.0/.gitkeep new file mode 100644 index 000000000..e69de29bb From c4910f0d1802fa77511e7e4f91d6f519c1dd1792 Mon Sep 17 00:00:00 2001 From: dse Date: Fri, 22 Sep 2017 01:32:00 +0400 Subject: [PATCH 297/324] vswhere.exe tool now distributed with the pythonnet sources, dotnet-core-2.0-x86 installation step removed. --- appveyor.yml | 3 --- setup.py | 2 +- tools/vswhere/vswhere.exe | Bin 0 -> 402040 bytes 3 files changed, 1 insertion(+), 4 deletions(-) create mode 100644 tools/vswhere/vswhere.exe diff --git a/appveyor.yml b/appveyor.yml index 1953d85d5..8178f173f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -42,9 +42,6 @@ init: install: - pip install --upgrade -r requirements.txt --quiet - - choco install vswhere -y - - cmd: curl -O https://download.microsoft.com/download/5/6/B/56BFEF92-9045-4414-970C-AB31E0FC07EC/dotnet-runtime-2.0.0-win-x86.exe - - cmd: dotnet-runtime-2.0.0-win-x86.exe /install /quiet /norestart /log install.log # Install OpenCover. Can't put on `packages.config`, not Mono compatible - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages -Verbosity quiet diff --git a/setup.py b/setup.py index e4294edf6..cebc1903a 100644 --- a/setup.py +++ b/setup.py @@ -369,7 +369,7 @@ def _find_msbuild_tool_15(self): """Return full path to one of the Microsoft build tools""" try: basePathes = subprocess.check_output( - ["vswhere", "-latest", + ["tools\\vswhere\\vswhere.exe", "-latest", "-version", "[15.0, 16.0)", "-requires", "Microsoft.Component.MSBuild", "-property", "InstallationPath"]).splitlines() diff --git a/tools/vswhere/vswhere.exe b/tools/vswhere/vswhere.exe new file mode 100644 index 0000000000000000000000000000000000000000..3eb2df00987641952f6cb94bbe9127958256b9d8 GIT binary patch literal 402040 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 zπ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%0D@?;oA*SC=;pP)&+H#xaBg;>g7V9+muza=c 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 literal 0 HcmV?d00001 From 153de5ec53fc48da4c994c07053d11645f25ddbd Mon Sep 17 00:00:00 2001 From: dse Date: Fri, 22 Sep 2017 02:16:32 +0400 Subject: [PATCH 298/324] .travis.yaml file simplification. --- .travis.yml | 137 +++++++++++++--------------------------------------- 1 file changed, 33 insertions(+), 104 deletions(-) diff --git a/.travis.yml b/.travis.yml index 627fd9ebf..025229d04 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,11 +4,12 @@ language: python matrix: include: +# --------------------- XPLAT builds ------------------------ - python: 2.7 - env: + env: &xplat-env - BUILD_OPTS=--xplat - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: + addons: &xplat-addons apt: sources: - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main @@ -22,124 +23,52 @@ matrix: - dotnet-runtime-2.0.0 - dotnet-sdk-2.0.0 - python: 3.3 - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: - apt: - sources: - - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main - key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main - key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF - packages: - - mono-devel - - ca-certificates-mono - - dotnet-hostfxr-2.0.0 - - dotnet-runtime-2.0.0 - - dotnet-sdk-2.0.0 + env: *xplat-env + addons: *xplat-addons + - python: 3.4 - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: - apt: - sources: - - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main - key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main - key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF - packages: - - mono-devel - - ca-certificates-mono - - dotnet-hostfxr-2.0.0 - - dotnet-runtime-2.0.0 - - dotnet-sdk-2.0.0 + env: *xplat-env + addons: *xplat-addons + - python: 3.5 - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: - apt: - sources: - - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main - key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main - key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF - packages: - - mono-devel - - ca-certificates-mono - - dotnet-hostfxr-2.0.0 - - dotnet-runtime-2.0.0 - - dotnet-sdk-2.0.0 + env: *xplat-env + addons: *xplat-addons + - python: 3.6 - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: - apt: - sources: - - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main - key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main - key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF - packages: - - mono-devel - - ca-certificates-mono - - dotnet-hostfxr-2.0.0 - - dotnet-runtime-2.0.0 - - dotnet-sdk-2.0.0 + env: *xplat-env + addons: *xplat-addons - python: "3.7-dev" - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: - apt: - sources: - - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main - key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main - key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF - packages: - - mono-devel - - ca-certificates-mono - - dotnet-hostfxr-2.0.0 - - dotnet-runtime-2.0.0 - - dotnet-sdk-2.0.0 + env: *xplat-env + addons: *xplat-addons +# --------------------- Classic builds ------------------------ - python: 2.7 - env: + env: &classic-env - BUILD_OPTS= - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: 3.3 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + env: *classic-env + - python: 3.4 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + env: *classic-env + - python: 3.5 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + env: *classic-env + - python: 3.6 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + env: *classic-env + - python: "3.7-dev" - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + env: *classic-env + allow_failures: - python: "3.7-dev" - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + env: *xplat-env + - python: "3.7-dev" - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + env: *classic-env + env: global: - LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so From 447da7d01d7ec1236270bb15d05210225d82a9b9 Mon Sep 17 00:00:00 2001 From: dse Date: Fri, 22 Sep 2017 03:33:45 +0400 Subject: [PATCH 299/324] PYTHONNET_INTEROP_FILE env var introduced to allow working with custom interop*.cs file inside IDE. --- src/runtime/Python.Runtime.15.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/runtime/Python.Runtime.15.csproj b/src/runtime/Python.Runtime.15.csproj index 8916e28ee..e83ac8ce0 100644 --- a/src/runtime/Python.Runtime.15.csproj +++ b/src/runtime/Python.Runtime.15.csproj @@ -40,6 +40,7 @@ UCS2 $(PYTHONNET_MONO_DEFINE_CONSTANTS) UCS4;MONO_LINUX;PYTHON_WITH_PYMALLOC + $(PYTHONNET_INTEROP_FILE) From 729322359760e7c12b5a1308d2a076c20eabd17c Mon Sep 17 00:00:00 2001 From: dse Date: Fri, 22 Sep 2017 04:04:38 +0400 Subject: [PATCH 300/324] pdb generation improved for all conditions Net 4.0/NetStandard 2.0 x Debug/Release. --- src/clrmodule/clrmodule.15.csproj | 25 +++++------- src/console/Console.15.csproj | 37 ++++++------------ .../Python.EmbeddingTest.15.csproj | 38 ++++++------------- src/runtime/Python.Runtime.15.csproj | 38 +++++++++---------- src/testing/Python.Test.15.csproj | 37 ++++++------------ 5 files changed, 63 insertions(+), 112 deletions(-) diff --git a/src/clrmodule/clrmodule.15.csproj b/src/clrmodule/clrmodule.15.csproj index e97c6fe1b..2585ffdd2 100644 --- a/src/clrmodule/clrmodule.15.csproj +++ b/src/clrmodule/clrmodule.15.csproj @@ -38,45 +38,38 @@ x64 + + false + full + + + true + pdbonly + + - true $(DefineConstants);PYTHON2;TRACE;DEBUG - full $(DefineConstants);PYTHON2 - true - pdbonly - true $(DefineConstants);PYTHON2;TRACE;DEBUG - full $(DefineConstants);PYTHON2 - true - pdbonly - true $(DefineConstants);PYTHON3;TRACE;DEBUG - full $(DefineConstants);PYTHON3 - true - pdbonly - true $(DefineConstants);PYTHON3;TRACE;DEBUG - full $(DefineConstants);PYTHON3 - true - pdbonly diff --git a/src/console/Console.15.csproj b/src/console/Console.15.csproj index ed9d3d8f9..ec5008036 100644 --- a/src/console/Console.15.csproj +++ b/src/console/Console.15.csproj @@ -38,46 +38,33 @@ x64 - - true - $(DefineConstants);DEBUG;TRACE + + + false full - - $(DefineConstants) + true pdbonly - + true - $(DefineConstants);DEBUG;TRACE + false full - - $(DefineConstants) - true - pdbonly - - + true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants) true - pdbonly + portable - - true + + $(DefineConstants);DEBUG;TRACE - full - + $(DefineConstants) - true - pdbonly + $(PythonManifest) diff --git a/src/embed_tests/Python.EmbeddingTest.15.csproj b/src/embed_tests/Python.EmbeddingTest.15.csproj index 47c8a6107..92d55a7e0 100644 --- a/src/embed_tests/Python.EmbeddingTest.15.csproj +++ b/src/embed_tests/Python.EmbeddingTest.15.csproj @@ -38,45 +38,31 @@ x64 - - true - $(DefineConstants);DEBUG;TRACE + + + false full - - $(DefineConstants); + true pdbonly - + true - $(DefineConstants);DEBUG;TRACE + false full - - $(DefineConstants); - true - pdbonly - - + true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants); true - pdbonly + portable - - true + + $(DefineConstants);DEBUG;TRACE - full - - $(DefineConstants); - true - pdbonly + + $(DefineConstants) diff --git a/src/runtime/Python.Runtime.15.csproj b/src/runtime/Python.Runtime.15.csproj index e83ac8ce0..cfde0a127 100644 --- a/src/runtime/Python.Runtime.15.csproj +++ b/src/runtime/Python.Runtime.15.csproj @@ -42,50 +42,48 @@ UCS4;MONO_LINUX;PYTHON_WITH_PYMALLOC $(PYTHONNET_INTEROP_FILE) + + false + full + + + true + pdbonly + + + true + false + full + + + true + true + portable + $(DefineConstants);PYTHON2;$(Python2Version);$(PythonMonoDefineConstants) - true - pdbonly $(DefineConstants);PYTHON3;$(Python3Version);$(PythonMonoDefineConstants) - true - pdbonly - true $(DefineConstants);PYTHON2;$(Python2Version);$(PythonMonoDefineConstants);TRACE;DEBUG - false - full - true $(DefineConstants);PYTHON3;$(Python3Version);$(PythonMonoDefineConstants);TRACE;DEBUG - false - full $(DefineConstants);PYTHON2;$(Python2Version);$(PythonWinDefineConstants) - true - pdbonly $(DefineConstants);PYTHON3;$(Python3Version);$(PythonWinDefineConstants) - true - pdbonly - true $(DefineConstants);PYTHON2;$(Python2Version);$(PythonWinDefineConstants);TRACE;DEBUG - false - full - true $(DefineConstants);PYTHON3;$(Python3Version);$(PythonWinDefineConstants);TRACE;DEBUG - false - full diff --git a/src/testing/Python.Test.15.csproj b/src/testing/Python.Test.15.csproj index a46cafb9d..da20ed2ef 100644 --- a/src/testing/Python.Test.15.csproj +++ b/src/testing/Python.Test.15.csproj @@ -32,46 +32,33 @@ x64 - - true - $(DefineConstants);DEBUG;TRACE + + + false full - - $(DefineConstants) + true pdbonly - + true - $(DefineConstants);DEBUG;TRACE + false full - - $(DefineConstants) - true - pdbonly - - + true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants) true - pdbonly + portable - - true + + $(DefineConstants);DEBUG;TRACE - full - + $(DefineConstants) - true - pdbonly + From 0df38c24a8d593ad2bb6cffb7e0dd0f292184373 Mon Sep 17 00:00:00 2001 From: dse Date: Fri, 22 Sep 2017 04:15:36 +0400 Subject: [PATCH 301/324] Fix for the #539 classic build fails when VS 2017 installed. --- setup.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/setup.py b/setup.py index cebc1903a..19516aae3 100644 --- a/setup.py +++ b/setup.py @@ -323,6 +323,20 @@ def _install_packages(self): def _find_msbuild_tool(self, tool="msbuild.exe", use_windows_sdk=False): """Return full path to one of the Microsoft build tools""" + + # trying to search path with help of vswhere when MSBuild 15.0 and higher installed. + if use_windows_sdk==False: + try: + basePathes = subprocess.check_output( + ["tools\\vswhere\\vswhere.exe", "-latest", + "-version", "[15.0, 16.0)", + "-requires", "Microsoft.Component.MSBuild", + "-property", "InstallationPath"]).splitlines() + if len(basePathes): + return os.path.join(basePathes[0].decode(sys.stdout.encoding or "utf-8"), "MSBuild", "15.0", "Bin", "MSBuild.exe") + except: + pass # keep trying to search by old method. + # Search in PATH first path = spawn.find_executable(tool) if path: From 580f13fb273e0f53b84b081d510093e50698c37b Mon Sep 17 00:00:00 2001 From: dse Date: Sun, 1 Oct 2017 14:23:47 +0400 Subject: [PATCH 302/324] Marshalling fix for 3-IntPtr args cdecl calls. --- src/runtime/nativecall.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/runtime/nativecall.cs b/src/runtime/nativecall.cs index c64306958..b5bf25dd7 100644 --- a/src/runtime/nativecall.cs +++ b/src/runtime/nativecall.cs @@ -27,9 +27,6 @@ internal class NativeCall [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void Void_1_Delegate(IntPtr a1); - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate IntPtr IntPtr_3_Delegate(IntPtr a1, IntPtr a2, IntPtr a3); - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate int Int_3_Delegate(IntPtr a1, IntPtr a2, IntPtr a3); @@ -40,7 +37,8 @@ public static void Void_Call_1(IntPtr fp, IntPtr a1) public static IntPtr Call_3(IntPtr fp, IntPtr a1, IntPtr a2, IntPtr a3) { - return ((IntPtr_3_Delegate)Marshal.GetDelegateForFunctionPointer(fp, typeof(IntPtr_3_Delegate)))(a1, a2, a3); + var d = (Interop.TernaryFunc)Marshal.GetDelegateForFunctionPointer(fp, typeof(Interop.TernaryFunc)); + return d(a1, a2, a3); } From 52a675f7372d0e830e16415f4e46320e15385044 Mon Sep 17 00:00:00 2001 From: dse Date: Sun, 5 Nov 2017 02:08:10 +0400 Subject: [PATCH 303/324] Build fixes for the fresh Windows 10 SDKS. --- setup.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 19516aae3..c686f4ec2 100644 --- a/setup.py +++ b/setup.py @@ -40,6 +40,12 @@ kits_suffix = os.path.join("bin", ARCH) WIN_SDK_KEYS = ( + RegKey(sdk_name="Windows Kit 10.0", key=kits_root, + value_name="KitsRoot10", suffix=os.path.join("bin", "10.0.16299.0", ARCH)), + + RegKey(sdk_name="Windows Kit 10.0", key=kits_root, + value_name="KitsRoot10", suffix=os.path.join("bin", "10.0.15063.0", ARCH)), + RegKey(sdk_name="Windows Kit 10.0", key=kits_root, value_name="KitsRoot10", suffix=kits_suffix), @@ -325,7 +331,7 @@ def _find_msbuild_tool(self, tool="msbuild.exe", use_windows_sdk=False): """Return full path to one of the Microsoft build tools""" # trying to search path with help of vswhere when MSBuild 15.0 and higher installed. - if use_windows_sdk==False: + if tool=="msbuild.exe" and use_windows_sdk==False: try: basePathes = subprocess.check_output( ["tools\\vswhere\\vswhere.exe", "-latest", From 64cb7f843f32a000dbfbac97ae60e44c6628fff2 Mon Sep 17 00:00:00 2001 From: dse Date: Tue, 7 Nov 2017 21:59:17 +0400 Subject: [PATCH 304/324] Workaround: Mono downgrade to 5.2.0 to avoid broken mono 5.4.0.201 --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 025229d04..3ab0e900f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ matrix: sources: - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + - sourceline: deb http://download.mono-project.com/repo/debian trusty/snapshots/5.2.0.224 main key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF packages: - mono-devel @@ -79,7 +79,7 @@ env: addons: apt: sources: - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + - sourceline: deb http://download.mono-project.com/repo/debian trusty/snapshots/5.2.0.224 main key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF packages: - mono-devel From 75e5231c15ff132e650d76859e676567c0b8b5c7 Mon Sep 17 00:00:00 2001 From: dmitriyse Date: Wed, 8 Nov 2017 01:19:38 +0400 Subject: [PATCH 305/324] Build system improvements pack - addressing comments to PR and some issues. (#546) * vswhere.exe tool now distributed with the pythonnet sources, dotnet-core-2.0-x86 installation step removed. * .travis.yaml file simplification. * PYTHONNET_INTEROP_FILE env var introduced to allow working with custom interop*.cs file inside IDE. * pdb generation improved for all conditions Net 4.0/NetStandard 2.0 x Debug/Release. * Fix for the #539 classic build fails when VS 2017 installed. * Build fixes for the fresh Windows 10 SDKS. * Workaround: Mono downgrade to 5.2.0 to avoid broken mono 5.4.0.201 --- .travis.yml | 141 +++++------------- appveyor.yml | 3 - setup.py | 22 ++- src/clrmodule/clrmodule.15.csproj | 25 ++-- src/console/Console.15.csproj | 37 ++--- .../Python.EmbeddingTest.15.csproj | 38 ++--- src/runtime/Python.Runtime.15.csproj | 39 +++-- src/testing/Python.Test.15.csproj | 37 ++--- tools/vswhere/vswhere.exe | Bin 0 -> 402040 bytes 9 files changed, 120 insertions(+), 222 deletions(-) create mode 100644 tools/vswhere/vswhere.exe diff --git a/.travis.yml b/.travis.yml index 627fd9ebf..3ab0e900f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,16 +4,17 @@ language: python matrix: include: +# --------------------- XPLAT builds ------------------------ - python: 2.7 - env: + env: &xplat-env - BUILD_OPTS=--xplat - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: + addons: &xplat-addons apt: sources: - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + - sourceline: deb http://download.mono-project.com/repo/debian trusty/snapshots/5.2.0.224 main key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF packages: - mono-devel @@ -22,124 +23,52 @@ matrix: - dotnet-runtime-2.0.0 - dotnet-sdk-2.0.0 - python: 3.3 - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: - apt: - sources: - - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main - key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main - key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF - packages: - - mono-devel - - ca-certificates-mono - - dotnet-hostfxr-2.0.0 - - dotnet-runtime-2.0.0 - - dotnet-sdk-2.0.0 + env: *xplat-env + addons: *xplat-addons + - python: 3.4 - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: - apt: - sources: - - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main - key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main - key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF - packages: - - mono-devel - - ca-certificates-mono - - dotnet-hostfxr-2.0.0 - - dotnet-runtime-2.0.0 - - dotnet-sdk-2.0.0 + env: *xplat-env + addons: *xplat-addons + - python: 3.5 - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: - apt: - sources: - - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main - key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main - key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF - packages: - - mono-devel - - ca-certificates-mono - - dotnet-hostfxr-2.0.0 - - dotnet-runtime-2.0.0 - - dotnet-sdk-2.0.0 + env: *xplat-env + addons: *xplat-addons + - python: 3.6 - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: - apt: - sources: - - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main - key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main - key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF - packages: - - mono-devel - - ca-certificates-mono - - dotnet-hostfxr-2.0.0 - - dotnet-runtime-2.0.0 - - dotnet-sdk-2.0.0 + env: *xplat-env + addons: *xplat-addons - python: "3.7-dev" - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: - apt: - sources: - - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main - key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main - key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF - packages: - - mono-devel - - ca-certificates-mono - - dotnet-hostfxr-2.0.0 - - dotnet-runtime-2.0.0 - - dotnet-sdk-2.0.0 + env: *xplat-env + addons: *xplat-addons +# --------------------- Classic builds ------------------------ - python: 2.7 - env: + env: &classic-env - BUILD_OPTS= - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + - python: 3.3 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + env: *classic-env + - python: 3.4 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + env: *classic-env + - python: 3.5 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + env: *classic-env + - python: 3.6 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + env: *classic-env + - python: "3.7-dev" - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + env: *classic-env + allow_failures: - python: "3.7-dev" - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe + env: *xplat-env + - python: "3.7-dev" - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + env: *classic-env + env: global: - LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so @@ -150,7 +79,7 @@ env: addons: apt: sources: - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + - sourceline: deb http://download.mono-project.com/repo/debian trusty/snapshots/5.2.0.224 main key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF packages: - mono-devel diff --git a/appveyor.yml b/appveyor.yml index 1953d85d5..8178f173f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -42,9 +42,6 @@ init: install: - pip install --upgrade -r requirements.txt --quiet - - choco install vswhere -y - - cmd: curl -O https://download.microsoft.com/download/5/6/B/56BFEF92-9045-4414-970C-AB31E0FC07EC/dotnet-runtime-2.0.0-win-x86.exe - - cmd: dotnet-runtime-2.0.0-win-x86.exe /install /quiet /norestart /log install.log # Install OpenCover. Can't put on `packages.config`, not Mono compatible - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages -Verbosity quiet diff --git a/setup.py b/setup.py index 24557c137..0fa4cda48 100644 --- a/setup.py +++ b/setup.py @@ -40,6 +40,12 @@ kits_suffix = os.path.join("bin", ARCH) WIN_SDK_KEYS = ( + RegKey(sdk_name="Windows Kit 10.0", key=kits_root, + value_name="KitsRoot10", suffix=os.path.join("bin", "10.0.16299.0", ARCH)), + + RegKey(sdk_name="Windows Kit 10.0", key=kits_root, + value_name="KitsRoot10", suffix=os.path.join("bin", "10.0.15063.0", ARCH)), + RegKey(sdk_name="Windows Kit 10.0", key=kits_root, value_name="KitsRoot10", suffix=kits_suffix), @@ -324,6 +330,20 @@ def _install_packages(self): def _find_msbuild_tool(self, tool="msbuild.exe", use_windows_sdk=False): """Return full path to one of the Microsoft build tools""" + + # trying to search path with help of vswhere when MSBuild 15.0 and higher installed. + if tool=="msbuild.exe" and use_windows_sdk==False: + try: + basePathes = subprocess.check_output( + ["tools\\vswhere\\vswhere.exe", "-latest", + "-version", "[15.0, 16.0)", + "-requires", "Microsoft.Component.MSBuild", + "-property", "InstallationPath"]).splitlines() + if len(basePathes): + return os.path.join(basePathes[0].decode(sys.stdout.encoding or "utf-8"), "MSBuild", "15.0", "Bin", "MSBuild.exe") + except: + pass # keep trying to search by old method. + # Search in PATH first path = spawn.find_executable(tool) if path: @@ -370,7 +390,7 @@ def _find_msbuild_tool_15(self): """Return full path to one of the Microsoft build tools""" try: basePathes = subprocess.check_output( - ["vswhere", "-latest", + ["tools\\vswhere\\vswhere.exe", "-latest", "-version", "[15.0, 16.0)", "-requires", "Microsoft.Component.MSBuild", "-property", "InstallationPath"]).splitlines() diff --git a/src/clrmodule/clrmodule.15.csproj b/src/clrmodule/clrmodule.15.csproj index e97c6fe1b..2585ffdd2 100644 --- a/src/clrmodule/clrmodule.15.csproj +++ b/src/clrmodule/clrmodule.15.csproj @@ -38,45 +38,38 @@ x64 + + false + full + + + true + pdbonly + + - true $(DefineConstants);PYTHON2;TRACE;DEBUG - full $(DefineConstants);PYTHON2 - true - pdbonly - true $(DefineConstants);PYTHON2;TRACE;DEBUG - full $(DefineConstants);PYTHON2 - true - pdbonly - true $(DefineConstants);PYTHON3;TRACE;DEBUG - full $(DefineConstants);PYTHON3 - true - pdbonly - true $(DefineConstants);PYTHON3;TRACE;DEBUG - full $(DefineConstants);PYTHON3 - true - pdbonly diff --git a/src/console/Console.15.csproj b/src/console/Console.15.csproj index ed9d3d8f9..ec5008036 100644 --- a/src/console/Console.15.csproj +++ b/src/console/Console.15.csproj @@ -38,46 +38,33 @@ x64 - - true - $(DefineConstants);DEBUG;TRACE + + + false full - - $(DefineConstants) + true pdbonly - + true - $(DefineConstants);DEBUG;TRACE + false full - - $(DefineConstants) - true - pdbonly - - + true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants) true - pdbonly + portable - - true + + $(DefineConstants);DEBUG;TRACE - full - + $(DefineConstants) - true - pdbonly + $(PythonManifest) diff --git a/src/embed_tests/Python.EmbeddingTest.15.csproj b/src/embed_tests/Python.EmbeddingTest.15.csproj index a30e8b3d9..436d2457c 100644 --- a/src/embed_tests/Python.EmbeddingTest.15.csproj +++ b/src/embed_tests/Python.EmbeddingTest.15.csproj @@ -38,45 +38,31 @@ x64 - - true - $(DefineConstants);DEBUG;TRACE + + + false full - - $(DefineConstants); + true pdbonly - + true - $(DefineConstants);DEBUG;TRACE + false full - - $(DefineConstants); - true - pdbonly - - + true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants); true - pdbonly + portable - - true + + $(DefineConstants);DEBUG;TRACE - full - - $(DefineConstants); - true - pdbonly + + $(DefineConstants) diff --git a/src/runtime/Python.Runtime.15.csproj b/src/runtime/Python.Runtime.15.csproj index 1ca767ca4..18770cc51 100644 --- a/src/runtime/Python.Runtime.15.csproj +++ b/src/runtime/Python.Runtime.15.csproj @@ -32,51 +32,50 @@ $(DefineConstants);NETSTANDARD $(DefineConstants);TRACE;DEBUG $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ + $(PYTHONNET_INTEROP_FILE) + + + false + full + + + true + pdbonly + + + true + false + full + + + true + true + portable $(DefineConstants);PYTHON2;PYTHON27;UCS4 - true - pdbonly $(DefineConstants);PYTHON3;PYTHON36;UCS4 - true - pdbonly - true $(DefineConstants);PYTHON2;PYTHON27;UCS4;TRACE;DEBUG - false - full - true $(DefineConstants);PYTHON3;PYTHON36;UCS4;TRACE;DEBUG - false - full $(DefineConstants);PYTHON2;PYTHON27;UCS2 - true - pdbonly $(DefineConstants);PYTHON3;PYTHON36;UCS2 - true - pdbonly - true $(DefineConstants);PYTHON2;PYTHON27;UCS2;TRACE;DEBUG - false - full - true $(DefineConstants);PYTHON3;PYTHON36;UCS2;TRACE;DEBUG - false - full diff --git a/src/testing/Python.Test.15.csproj b/src/testing/Python.Test.15.csproj index a46cafb9d..da20ed2ef 100644 --- a/src/testing/Python.Test.15.csproj +++ b/src/testing/Python.Test.15.csproj @@ -32,46 +32,33 @@ x64 - - true - $(DefineConstants);DEBUG;TRACE + + + false full - - $(DefineConstants) + true pdbonly - + true - $(DefineConstants);DEBUG;TRACE + false full - - $(DefineConstants) - true - pdbonly - - + true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants) true - pdbonly + portable - - true + + $(DefineConstants);DEBUG;TRACE - full - + $(DefineConstants) - true - pdbonly + diff --git a/tools/vswhere/vswhere.exe b/tools/vswhere/vswhere.exe new file mode 100644 index 0000000000000000000000000000000000000000..3eb2df00987641952f6cb94bbe9127958256b9d8 GIT binary patch literal 402040 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 zπ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%0D@?;oA*SC=;pP)&+H#xaBg;>g7V9+muza=c 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 literal 0 HcmV?d00001 From 9d25e9c50d24ea1aa884f18d08475c04f0174732 Mon Sep 17 00:00:00 2001 From: dse Date: Wed, 15 Nov 2017 18:33:18 +0400 Subject: [PATCH 306/324] Fixed problem with --xplat build when mono does not installed. --- setup.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index c686f4ec2..4ec2a2113 100644 --- a/setup.py +++ b/setup.py @@ -280,7 +280,13 @@ def _get_manifest(self, build_dir): return manifest def _build_monoclr(self): - mono_libs = _check_output("pkg-config --libs mono-2", shell=True) + try: + mono_libs = _check_output("pkg-config --libs mono-2", shell=True) + except: + if DEVTOOLS == "dotnet": + print("Skipping building monoclr module...") + return + raise mono_cflags = _check_output("pkg-config --cflags mono-2", shell=True) glib_libs = _check_output("pkg-config --libs glib-2.0", shell=True) glib_cflags = _check_output("pkg-config --cflags glib-2.0", shell=True) From 700b5228aca993792d2dab2f30b1c1c4dfe473ee Mon Sep 17 00:00:00 2001 From: dse Date: Fri, 17 Nov 2017 00:16:20 +0400 Subject: [PATCH 307/324] backout #546, wrong merge! --- .travis.yml | 141 +++++++++++++----- appveyor.yml | 3 + setup.py | 22 +-- src/clrmodule/clrmodule.15.csproj | 25 ++-- src/console/Console.15.csproj | 37 +++-- .../Python.EmbeddingTest.15.csproj | 38 +++-- src/runtime/Python.Runtime.15.csproj | 39 ++--- src/testing/Python.Test.15.csproj | 37 +++-- tools/vswhere/vswhere.exe | Bin 402040 -> 0 bytes 9 files changed, 222 insertions(+), 120 deletions(-) delete mode 100644 tools/vswhere/vswhere.exe diff --git a/.travis.yml b/.travis.yml index 3ab0e900f..627fd9ebf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,17 +4,16 @@ language: python matrix: include: -# --------------------- XPLAT builds ------------------------ - python: 2.7 - env: &xplat-env + env: - BUILD_OPTS=--xplat - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: &xplat-addons + addons: apt: sources: - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/debian trusty/snapshots/5.2.0.224 main + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF packages: - mono-devel @@ -23,52 +22,124 @@ matrix: - dotnet-runtime-2.0.0 - dotnet-sdk-2.0.0 - python: 3.3 - env: *xplat-env - addons: *xplat-addons - + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + addons: + apt: + sources: + - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main + key_url: https://packages.microsoft.com/keys/microsoft.asc + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + packages: + - mono-devel + - ca-certificates-mono + - dotnet-hostfxr-2.0.0 + - dotnet-runtime-2.0.0 + - dotnet-sdk-2.0.0 - python: 3.4 - env: *xplat-env - addons: *xplat-addons - + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + addons: + apt: + sources: + - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main + key_url: https://packages.microsoft.com/keys/microsoft.asc + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + packages: + - mono-devel + - ca-certificates-mono + - dotnet-hostfxr-2.0.0 + - dotnet-runtime-2.0.0 + - dotnet-sdk-2.0.0 - python: 3.5 - env: *xplat-env - addons: *xplat-addons - + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + addons: + apt: + sources: + - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main + key_url: https://packages.microsoft.com/keys/microsoft.asc + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + packages: + - mono-devel + - ca-certificates-mono + - dotnet-hostfxr-2.0.0 + - dotnet-runtime-2.0.0 + - dotnet-sdk-2.0.0 - python: 3.6 - env: *xplat-env - addons: *xplat-addons + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + addons: + apt: + sources: + - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main + key_url: https://packages.microsoft.com/keys/microsoft.asc + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + packages: + - mono-devel + - ca-certificates-mono + - dotnet-hostfxr-2.0.0 + - dotnet-runtime-2.0.0 + - dotnet-sdk-2.0.0 - python: "3.7-dev" - env: *xplat-env - addons: *xplat-addons + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + addons: + apt: + sources: + - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main + key_url: https://packages.microsoft.com/keys/microsoft.asc + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main + key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + packages: + - mono-devel + - ca-certificates-mono + - dotnet-hostfxr-2.0.0 + - dotnet-runtime-2.0.0 + - dotnet-sdk-2.0.0 -# --------------------- Classic builds ------------------------ - python: 2.7 - env: &classic-env + env: - BUILD_OPTS= - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - - python: 3.3 - env: *classic-env - + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - python: 3.4 - env: *classic-env - + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - python: 3.5 - env: *classic-env - + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - python: 3.6 - env: *classic-env - + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - python: "3.7-dev" - env: *classic-env - + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe allow_failures: - python: "3.7-dev" - env: *xplat-env - + env: + - BUILD_OPTS= + - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - python: "3.7-dev" - env: *classic-env - + env: + - BUILD_OPTS=--xplat + - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe env: global: - LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so @@ -79,7 +150,7 @@ env: addons: apt: sources: - - sourceline: deb http://download.mono-project.com/repo/debian trusty/snapshots/5.2.0.224 main + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF packages: - mono-devel diff --git a/appveyor.yml b/appveyor.yml index 8178f173f..1953d85d5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -42,6 +42,9 @@ init: install: - pip install --upgrade -r requirements.txt --quiet + - choco install vswhere -y + - cmd: curl -O https://download.microsoft.com/download/5/6/B/56BFEF92-9045-4414-970C-AB31E0FC07EC/dotnet-runtime-2.0.0-win-x86.exe + - cmd: dotnet-runtime-2.0.0-win-x86.exe /install /quiet /norestart /log install.log # Install OpenCover. Can't put on `packages.config`, not Mono compatible - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages -Verbosity quiet diff --git a/setup.py b/setup.py index 0fa4cda48..24557c137 100644 --- a/setup.py +++ b/setup.py @@ -40,12 +40,6 @@ kits_suffix = os.path.join("bin", ARCH) WIN_SDK_KEYS = ( - RegKey(sdk_name="Windows Kit 10.0", key=kits_root, - value_name="KitsRoot10", suffix=os.path.join("bin", "10.0.16299.0", ARCH)), - - RegKey(sdk_name="Windows Kit 10.0", key=kits_root, - value_name="KitsRoot10", suffix=os.path.join("bin", "10.0.15063.0", ARCH)), - RegKey(sdk_name="Windows Kit 10.0", key=kits_root, value_name="KitsRoot10", suffix=kits_suffix), @@ -330,20 +324,6 @@ def _install_packages(self): def _find_msbuild_tool(self, tool="msbuild.exe", use_windows_sdk=False): """Return full path to one of the Microsoft build tools""" - - # trying to search path with help of vswhere when MSBuild 15.0 and higher installed. - if tool=="msbuild.exe" and use_windows_sdk==False: - try: - basePathes = subprocess.check_output( - ["tools\\vswhere\\vswhere.exe", "-latest", - "-version", "[15.0, 16.0)", - "-requires", "Microsoft.Component.MSBuild", - "-property", "InstallationPath"]).splitlines() - if len(basePathes): - return os.path.join(basePathes[0].decode(sys.stdout.encoding or "utf-8"), "MSBuild", "15.0", "Bin", "MSBuild.exe") - except: - pass # keep trying to search by old method. - # Search in PATH first path = spawn.find_executable(tool) if path: @@ -390,7 +370,7 @@ def _find_msbuild_tool_15(self): """Return full path to one of the Microsoft build tools""" try: basePathes = subprocess.check_output( - ["tools\\vswhere\\vswhere.exe", "-latest", + ["vswhere", "-latest", "-version", "[15.0, 16.0)", "-requires", "Microsoft.Component.MSBuild", "-property", "InstallationPath"]).splitlines() diff --git a/src/clrmodule/clrmodule.15.csproj b/src/clrmodule/clrmodule.15.csproj index 2585ffdd2..e97c6fe1b 100644 --- a/src/clrmodule/clrmodule.15.csproj +++ b/src/clrmodule/clrmodule.15.csproj @@ -38,38 +38,45 @@ x64 - - false - full - - - true - pdbonly - - + true $(DefineConstants);PYTHON2;TRACE;DEBUG + full $(DefineConstants);PYTHON2 + true + pdbonly + true $(DefineConstants);PYTHON2;TRACE;DEBUG + full $(DefineConstants);PYTHON2 + true + pdbonly + true $(DefineConstants);PYTHON3;TRACE;DEBUG + full $(DefineConstants);PYTHON3 + true + pdbonly + true $(DefineConstants);PYTHON3;TRACE;DEBUG + full $(DefineConstants);PYTHON3 + true + pdbonly diff --git a/src/console/Console.15.csproj b/src/console/Console.15.csproj index ec5008036..ed9d3d8f9 100644 --- a/src/console/Console.15.csproj +++ b/src/console/Console.15.csproj @@ -38,33 +38,46 @@ x64 - - - false + + true + $(DefineConstants);DEBUG;TRACE full - + + $(DefineConstants) true pdbonly - + true - false + $(DefineConstants);DEBUG;TRACE full - + + $(DefineConstants) + true + pdbonly + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) true - portable + pdbonly - - + + true $(DefineConstants);DEBUG;TRACE + full - + $(DefineConstants) + true + pdbonly - $(PythonManifest) diff --git a/src/embed_tests/Python.EmbeddingTest.15.csproj b/src/embed_tests/Python.EmbeddingTest.15.csproj index 436d2457c..a30e8b3d9 100644 --- a/src/embed_tests/Python.EmbeddingTest.15.csproj +++ b/src/embed_tests/Python.EmbeddingTest.15.csproj @@ -38,31 +38,45 @@ x64 - - - false + + true + $(DefineConstants);DEBUG;TRACE full - + + $(DefineConstants); true pdbonly - + true - false + $(DefineConstants);DEBUG;TRACE full - + + $(DefineConstants); + true + pdbonly + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants); true - portable + pdbonly - - + + true $(DefineConstants);DEBUG;TRACE + full - - $(DefineConstants) + + $(DefineConstants); + true + pdbonly diff --git a/src/runtime/Python.Runtime.15.csproj b/src/runtime/Python.Runtime.15.csproj index 18770cc51..1ca767ca4 100644 --- a/src/runtime/Python.Runtime.15.csproj +++ b/src/runtime/Python.Runtime.15.csproj @@ -32,50 +32,51 @@ $(DefineConstants);NETSTANDARD $(DefineConstants);TRACE;DEBUG $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ - $(PYTHONNET_INTEROP_FILE) - - - false - full - - - true - pdbonly - - - true - false - full - - - true - true - portable $(DefineConstants);PYTHON2;PYTHON27;UCS4 + true + pdbonly $(DefineConstants);PYTHON3;PYTHON36;UCS4 + true + pdbonly + true $(DefineConstants);PYTHON2;PYTHON27;UCS4;TRACE;DEBUG + false + full + true $(DefineConstants);PYTHON3;PYTHON36;UCS4;TRACE;DEBUG + false + full $(DefineConstants);PYTHON2;PYTHON27;UCS2 + true + pdbonly $(DefineConstants);PYTHON3;PYTHON36;UCS2 + true + pdbonly + true $(DefineConstants);PYTHON2;PYTHON27;UCS2;TRACE;DEBUG + false + full + true $(DefineConstants);PYTHON3;PYTHON36;UCS2;TRACE;DEBUG + false + full diff --git a/src/testing/Python.Test.15.csproj b/src/testing/Python.Test.15.csproj index da20ed2ef..a46cafb9d 100644 --- a/src/testing/Python.Test.15.csproj +++ b/src/testing/Python.Test.15.csproj @@ -32,33 +32,46 @@ x64 - - - false + + true + $(DefineConstants);DEBUG;TRACE full - + + $(DefineConstants) true pdbonly - + true - false + $(DefineConstants);DEBUG;TRACE full - + + $(DefineConstants) + true + pdbonly + + true + $(DefineConstants);DEBUG;TRACE + full + + + $(DefineConstants) true - portable + pdbonly - - + + true $(DefineConstants);DEBUG;TRACE + full - + $(DefineConstants) + true + pdbonly - diff --git a/tools/vswhere/vswhere.exe b/tools/vswhere/vswhere.exe deleted file mode 100644 index 3eb2df00987641952f6cb94bbe9127958256b9d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 402040 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 zπ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%0D@?;oA*SC=;pP)&+H#xaBg;>g7V9+muza=c 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 From 43a9eb65e7c2487cb1b77791e57c670014669d45 Mon Sep 17 00:00:00 2001 From: dse Date: Fri, 17 Nov 2017 00:17:12 +0400 Subject: [PATCH 308/324] Backed #519, wrong merge! --- .travis.yml | 1 - CHANGELOG.md | 1 - appveyor.yml | 2 - ci/appveyor_run_tests.ps1 | 17 ------- pythonnet.15.sln | 10 ++--- setup.py | 2 - src/clrmodule/clrmodule.15.csproj | 1 - src/console/Console.15.csproj | 12 +++-- src/console/pythonconsole.cs | 9 +--- src/embed_tests/Program.cs | 19 -------- .../Python.EmbeddingTest.15.csproj | 21 +++------ src/embed_tests/TestPySequence.cs | 6 +-- src/embed_tests/pyimport.cs | 4 -- src/runtime/Python.Runtime.15.csproj | 44 +++++++++---------- src/runtime/delegatemanager.cs | 4 -- src/runtime/metatype.cs | 4 +- src/runtime/nativecall.cs | 30 +------------ src/runtime/polyfill/ReflectionPolifills.cs | 21 --------- src/runtime/pyobject.cs | 6 +-- src/runtime/pyscope.cs | 6 +-- src/runtime/pythonexception.cs | 4 -- src/runtime/runtime.cs | 43 ++++-------------- src/testing/Python.Test.15.csproj | 17 +++---- src/tests/fixtures/netstandard2.0/.gitkeep | 0 24 files changed, 61 insertions(+), 223 deletions(-) delete mode 100644 src/embed_tests/Program.cs delete mode 100644 src/runtime/polyfill/ReflectionPolifills.cs delete mode 100644 src/tests/fixtures/netstandard2.0/.gitkeep diff --git a/.travis.yml b/.travis.yml index 627fd9ebf..2468ed60a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -169,7 +169,6 @@ install: script: - python -m pytest - mono $NUNIT_PATH src/embed_tests/bin/Python.EmbeddingTest.dll - - if [[ $BUILD_OPTS == --xplat ]]; then dotnet src/embed_tests/bin/netcoreapp2.0_publish/Python.EmbeddingTest.dll; fi after_script: # Uncomment if need to geninterop, ie. py37 final diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d408a8d1..e5929107b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,6 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ## [unreleased][] ### Added -- Added support for embedding python into dotnet core 2.0 (NetStandard 2.0) - Added new build system (pythonnet.15.sln) based on dotnetcore-sdk/xplat(crossplatform msbuild). Currently there two side-by-side build systems that produces the same output (net40) from the same sources. After a some transition time, current (mono/ msbuild 14.0) build system will be removed. diff --git a/appveyor.yml b/appveyor.yml index 1953d85d5..c7c3a7810 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -43,8 +43,6 @@ init: install: - pip install --upgrade -r requirements.txt --quiet - choco install vswhere -y - - cmd: curl -O https://download.microsoft.com/download/5/6/B/56BFEF92-9045-4414-970C-AB31E0FC07EC/dotnet-runtime-2.0.0-win-x86.exe - - cmd: dotnet-runtime-2.0.0-win-x86.exe /install /quiet /norestart /log install.log # Install OpenCover. Can't put on `packages.config`, not Mono compatible - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages -Verbosity quiet diff --git a/ci/appveyor_run_tests.ps1 b/ci/appveyor_run_tests.ps1 index b45440fbe..2821cf915 100644 --- a/ci/appveyor_run_tests.ps1 +++ b/ci/appveyor_run_tests.ps1 @@ -44,23 +44,6 @@ if ($CS_STATUS -ne 0) { Write-Host "Embedded tests failed" -ForegroundColor "Red" } -if ($env:BUILD_OPTS -eq "--xplat"){ - if ($env:PLATFORM -eq "x64") { - $DOTNET_CMD = "dotnet" - } - else{ - $DOTNET_CMD = "c:\Program Files (x86)\dotnet\dotnet" - } - - # Run Embedded tests for netcoreapp2.0 (OpenCover currently does not supports dotnet core) - Write-Host ("Starting embedded tests for netcoreapp2.0") -ForegroundColor "Green" - &$DOTNET_CMD .\src\embed_tests\bin\netcoreapp2.0_publish\Python.EmbeddingTest.dll - $CS_STATUS = $LastExitCode - if ($CS_STATUS -ne 0) { - Write-Host "Embedded tests for netcoreapp2.0 failed" -ForegroundColor "Red" - } -} - # Set exit code to fail if either Python or Embedded tests failed if ($PYTHON_STATUS -ne 0 -or $CS_STATUS -ne 0) { Write-Host "Tests failed" -ForegroundColor "Red" diff --git a/pythonnet.15.sln b/pythonnet.15.sln index f2015e480..121631e43 100644 --- a/pythonnet.15.sln +++ b/pythonnet.15.sln @@ -2,15 +2,15 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.26730.3 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Runtime.15", "src/runtime/Python.Runtime.15.csproj", "{2759F4FF-716B-4828-916F-50FA86613DFC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Runtime.15", "src\runtime\Python.Runtime.15.csproj", "{2759F4FF-716B-4828-916F-50FA86613DFC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.EmbeddingTest.15", "src/embed_tests/Python.EmbeddingTest.15.csproj", "{66B8D01A-9906-452A-B09E-BF75EA76468F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.EmbeddingTest.15", "src\embed_tests\Python.EmbeddingTest.15.csproj", "{66B8D01A-9906-452A-B09E-BF75EA76468F}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "clrmodule.15", "src/clrmodule/clrmodule.15.csproj", "{E08678D4-9A52-4AD5-B63D-8EBC7399981B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "clrmodule.15", "src\clrmodule\clrmodule.15.csproj", "{E08678D4-9A52-4AD5-B63D-8EBC7399981B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Console.15", "src/console/Console.15.csproj", "{CDAD305F-8E72-492C-A314-64CF58D472A0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Console.15", "src\console\Console.15.csproj", "{CDAD305F-8E72-492C-A314-64CF58D472A0}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Test.15", "src/testing/Python.Test.15.csproj", "{F94B547A-E97E-4500-8D53-B4D64D076E5F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Test.15", "src\testing\Python.Test.15.csproj", "{F94B547A-E97E-4500-8D53-B4D64D076E5F}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/setup.py b/setup.py index 24557c137..6cfd773a6 100644 --- a/setup.py +++ b/setup.py @@ -257,8 +257,6 @@ def build_extension(self, ext): subprocess.check_call(" ".join(cmd + ["/t:Clean"]), shell=use_shell) subprocess.check_call(" ".join(cmd + ["/t:Build"]), shell=use_shell) - if DEVTOOLS == "MsDev15" or DEVTOOLS == "dotnet": - subprocess.check_call(" ".join(cmd + ['"/t:Console_15:publish;Python_EmbeddingTest_15:publish"', "/p:TargetFramework=netcoreapp2.0"]), shell=use_shell) if DEVTOOLS == "Mono" or DEVTOOLS == "dotnet": self._build_monoclr() diff --git a/src/clrmodule/clrmodule.15.csproj b/src/clrmodule/clrmodule.15.csproj index e97c6fe1b..4d8a1b8ff 100644 --- a/src/clrmodule/clrmodule.15.csproj +++ b/src/clrmodule/clrmodule.15.csproj @@ -22,7 +22,6 @@ 1591 ..\..\ $(SolutionDir)\bin\ - $(PythonBuildDir)\$(TargetFramework)\ 6 prompt $(PYTHONNET_DEFINE_CONSTANTS) diff --git a/src/console/Console.15.csproj b/src/console/Console.15.csproj index ed9d3d8f9..0c89fce40 100644 --- a/src/console/Console.15.csproj +++ b/src/console/Console.15.csproj @@ -1,7 +1,7 @@ - net40;netcoreapp2.0 + net40 x64;x86 DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 Exe @@ -15,14 +15,12 @@ false false false + bin\nPython.xml bin\ - false - $(OutputPath)\$(AssemblyName).xml - $(OutputPath)\$(TargetFramework)\$(AssemblyName).xml + false 1591 ..\..\ $(SolutionDir)\bin\ - $(PythonBuildDir)\$(TargetFramework)\ 6 python-clear.ico prompt @@ -91,7 +89,7 @@ - + Python.Runtime.dll @@ -102,6 +100,6 @@ - + diff --git a/src/console/pythonconsole.cs b/src/console/pythonconsole.cs index 912e9bb0d..e9bb31e69 100644 --- a/src/console/pythonconsole.cs +++ b/src/console/pythonconsole.cs @@ -16,9 +16,8 @@ namespace Python.Runtime /// public sealed class PythonConsole { -#if NET40 private static AssemblyLoader assemblyLoader = new AssemblyLoader(); -#endif + private PythonConsole() { } @@ -26,11 +25,9 @@ private PythonConsole() [STAThread] public static int Main(string[] args) { - // Only net40 is capable to safely inject python.runtime.dll into resources. -#if NET40 // reference the static assemblyLoader to stop it being optimized away AssemblyLoader a = assemblyLoader; -#endif + string[] cmd = Environment.GetCommandLineArgs(); PythonEngine.Initialize(); @@ -40,7 +37,6 @@ public static int Main(string[] args) return i; } -#if NET40 // Register a callback function to load embedded assemblies. // (Python.Runtime.dll is included as a resource) private sealed class AssemblyLoader @@ -77,6 +73,5 @@ public AssemblyLoader() }; } } -#endif } } diff --git a/src/embed_tests/Program.cs b/src/embed_tests/Program.cs deleted file mode 100644 index b4439e3e4..000000000 --- a/src/embed_tests/Program.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; - -using NUnit.Common; - -using NUnitLite; - -namespace Python.EmbeddingTest -{ - public class Program - { - public static int Main(string[] args) - { - return new AutoRun(typeof(Program).Assembly).Execute( - args, - new ExtendedTextWrapper(Console.Out), - Console.In); - } - } -} diff --git a/src/embed_tests/Python.EmbeddingTest.15.csproj b/src/embed_tests/Python.EmbeddingTest.15.csproj index a30e8b3d9..ac6ecba92 100644 --- a/src/embed_tests/Python.EmbeddingTest.15.csproj +++ b/src/embed_tests/Python.EmbeddingTest.15.csproj @@ -2,11 +2,10 @@ - net40;netcoreapp2.0 + net40 x64;x86 DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 - Exe - false + net45 Python.EmbeddingTest Python.EmbeddingTest Python.EmbeddingTest @@ -16,19 +15,16 @@ false false bin\ - false - $(OutputPath)\$(AssemblyName).xml - $(OutputPath)\$(TargetFramework)\$(AssemblyName).xml + false + $(OutputPath)\$(AssemblyName).xml 1591 ..\..\ - $(SolutionDir)\bin\ - $(OutputPath)\$(TargetFramework)_publish + $(SolutionDir)\bin\ 6 prompt $(PYTHONNET_DEFINE_CONSTANTS) XPLAT $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); - $(DefineConstants);NETCOREAPP $(DefineConstants);TRACE;DEBUG $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ @@ -92,11 +88,6 @@ - - - - - @@ -123,7 +114,7 @@ - + diff --git a/src/embed_tests/TestPySequence.cs b/src/embed_tests/TestPySequence.cs index 1e3ebf144..7c175b1ce 100644 --- a/src/embed_tests/TestPySequence.cs +++ b/src/embed_tests/TestPySequence.cs @@ -69,10 +69,8 @@ public void TestRepeat() PyObject actual = t1.Repeat(3); Assert.AreEqual("FooFooFoo", actual.ToString()); - // On 32 bit system this argument should be int, but on the 64 bit system this should be long value. - // This works on the Framework 4.0 accidentally, it should produce out of memory! - // actual = t1.Repeat(-3); - // Assert.AreEqual("", actual.ToString()); + actual = t1.Repeat(-3); + Assert.AreEqual("", actual.ToString()); } [Test] diff --git a/src/embed_tests/pyimport.cs b/src/embed_tests/pyimport.cs index acb3433de..3bb9a34d6 100644 --- a/src/embed_tests/pyimport.cs +++ b/src/embed_tests/pyimport.cs @@ -30,11 +30,7 @@ public void SetUp() /* Append the tests directory to sys.path * using reflection to circumvent the private * modifiers placed on most Runtime methods. */ -#if NETCOREAPP - const string s = "../../fixtures"; -#else const string s = "../fixtures"; -#endif string testPath = Path.Combine(TestContext.CurrentContext.TestDirectory, s); IntPtr str = Runtime.Runtime.PyString_FromString(testPath); diff --git a/src/runtime/Python.Runtime.15.csproj b/src/runtime/Python.Runtime.15.csproj index 1ca767ca4..93bd143dc 100644 --- a/src/runtime/Python.Runtime.15.csproj +++ b/src/runtime/Python.Runtime.15.csproj @@ -1,7 +1,7 @@ - net40;netstandard2.0 + net40 AnyCPU DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 net45 @@ -16,65 +16,70 @@ false false bin\ - false - $(OutputPath)\$(AssemblyName).xml - $(OutputPath)\$(TargetFramework)\$(AssemblyName).xml + false + $(OutputPath)\$(AssemblyName).xml 1591;NU1701 ..\..\ - $(SolutionDir)\bin\ - $(PythonBuildDir)\$(TargetFramework)\ + $(SolutionDir)\bin\ 6 True ..\pythonnet.snk $(PYTHONNET_DEFINE_CONSTANTS) XPLAT $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); - $(DefineConstants);NETSTANDARD $(DefineConstants);TRACE;DEBUG $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ + $(PYTHONNET_PY2_VERSION) + PYTHON27 + $(PYTHONNET_PY3_VERSION) + PYTHON36 + $(PYTHONNET_WIN_DEFINE_CONSTANTS) + UCS2 + $(PYTHONNET_MONO_DEFINE_CONSTANTS) + UCS4;MONO_LINUX;PYTHON_WITH_PYMALLOC - $(DefineConstants);PYTHON2;PYTHON27;UCS4 + $(DefineConstants);PYTHON2;$(Python2Version);$(PythonMonoDefineConstants) true pdbonly - $(DefineConstants);PYTHON3;PYTHON36;UCS4 + $(DefineConstants);PYTHON3;$(Python3Version);$(PythonMonoDefineConstants) true pdbonly true - $(DefineConstants);PYTHON2;PYTHON27;UCS4;TRACE;DEBUG + $(DefineConstants);PYTHON2;$(Python2Version);$(PythonMonoDefineConstants);TRACE;DEBUG false full true - $(DefineConstants);PYTHON3;PYTHON36;UCS4;TRACE;DEBUG + $(DefineConstants);PYTHON3;$(Python3Version);$(PythonMonoDefineConstants);TRACE;DEBUG false full - $(DefineConstants);PYTHON2;PYTHON27;UCS2 + $(DefineConstants);PYTHON2;$(Python2Version);$(PythonWinDefineConstants) true pdbonly - $(DefineConstants);PYTHON3;PYTHON36;UCS2 + $(DefineConstants);PYTHON3;$(Python3Version);$(PythonWinDefineConstants) true pdbonly true - $(DefineConstants);PYTHON2;PYTHON27;UCS2;TRACE;DEBUG + $(DefineConstants);PYTHON2;$(Python2Version);$(PythonWinDefineConstants);TRACE;DEBUG false full true - $(DefineConstants);PYTHON3;PYTHON36;UCS2;TRACE;DEBUG + $(DefineConstants);PYTHON3;$(Python3Version);$(PythonWinDefineConstants);TRACE;DEBUG false full @@ -102,16 +107,11 @@ - - - - - - + @@ -127,7 +127,7 @@ - + diff --git a/src/runtime/delegatemanager.cs b/src/runtime/delegatemanager.cs index 7632816d1..df5eec427 100644 --- a/src/runtime/delegatemanager.cs +++ b/src/runtime/delegatemanager.cs @@ -195,10 +195,6 @@ public Dispatcher(IntPtr target, Type dtype) ~Dispatcher() { - // We needs to disable Finalizers until it's valid implementation. - // Current implementation can produce low probability floating bugs. - return; - // Note: the managed GC thread can run and try to free one of // these *after* the Python runtime has been finalized! if (Runtime.Py_IsInitialized() > 0) diff --git a/src/runtime/metatype.cs b/src/runtime/metatype.cs index 3295ab110..982f4a632 100644 --- a/src/runtime/metatype.cs +++ b/src/runtime/metatype.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Runtime.InteropServices; namespace Python.Runtime @@ -201,7 +201,7 @@ public static int tp_setattro(IntPtr tp, IntPtr name, IntPtr value) IntPtr fp = Marshal.ReadIntPtr(dt, TypeOffset.tp_descr_set); if (fp != IntPtr.Zero) { - return NativeCall.Int_Call_3(fp, descr, name, value); + return NativeCall.Impl.Int_Call_3(fp, descr, name, value); } Exceptions.SetError(Exceptions.AttributeError, "attribute is read-only"); return -1; diff --git a/src/runtime/nativecall.cs b/src/runtime/nativecall.cs index c64306958..9d1b0f41c 100644 --- a/src/runtime/nativecall.cs +++ b/src/runtime/nativecall.cs @@ -23,32 +23,6 @@ namespace Python.Runtime /// internal class NativeCall { -#if NETSTANDARD - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate void Void_1_Delegate(IntPtr a1); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate IntPtr IntPtr_3_Delegate(IntPtr a1, IntPtr a2, IntPtr a3); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - private delegate int Int_3_Delegate(IntPtr a1, IntPtr a2, IntPtr a3); - - public static void Void_Call_1(IntPtr fp, IntPtr a1) - { - ((Void_1_Delegate)Marshal.GetDelegateForFunctionPointer(fp, typeof(Void_1_Delegate)))(a1); - } - - public static IntPtr Call_3(IntPtr fp, IntPtr a1, IntPtr a2, IntPtr a3) - { - return ((IntPtr_3_Delegate)Marshal.GetDelegateForFunctionPointer(fp, typeof(IntPtr_3_Delegate)))(a1, a2, a3); - } - - - public static int Int_Call_3(IntPtr fp, IntPtr a1, IntPtr a2, IntPtr a3) - { - return ((Int_3_Delegate)Marshal.GetDelegateForFunctionPointer(fp, typeof(Int_3_Delegate)))(a1, a2, a3); - } -#else private static AssemblyBuilder aBuilder; private static ModuleBuilder mBuilder; @@ -158,10 +132,9 @@ public static int Int_Call_3(IntPtr fp, IntPtr a1, IntPtr a2, IntPtr a3) { return Impl.Int_Call_3(fp, a1, a2, a3); } -#endif } -#if !NETSTANDARD + /// /// Defines native call signatures to be generated by NativeCall. /// @@ -175,5 +148,4 @@ public interface INativeCall IntPtr Call_3(IntPtr funcPtr, IntPtr a1, IntPtr a2, IntPtr a3); } -#endif } diff --git a/src/runtime/polyfill/ReflectionPolifills.cs b/src/runtime/polyfill/ReflectionPolifills.cs deleted file mode 100644 index a7e9c879a..000000000 --- a/src/runtime/polyfill/ReflectionPolifills.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Reflection; -using System.Reflection.Emit; - -namespace Python.Runtime -{ -#if NETSTANDARD - public static class ReflectionPolifills - { - public static AssemblyBuilder DefineDynamicAssembly(this AppDomain appDomain, AssemblyName assemblyName, AssemblyBuilderAccess assemblyBuilderAccess) - { - return AssemblyBuilder.DefineDynamicAssembly(assemblyName, assemblyBuilderAccess); - } - - public static Type CreateType(this TypeBuilder typeBuilder) - { - return typeBuilder.GetTypeInfo().GetType(); - } - } -#endif -} diff --git a/src/runtime/pyobject.cs b/src/runtime/pyobject.cs index 5900e80b7..1b41b0893 100644 --- a/src/runtime/pyobject.cs +++ b/src/runtime/pyobject.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Dynamic; using System.Linq.Expressions; @@ -43,10 +43,6 @@ protected PyObject() ~PyObject() { - // We needs to disable Finalizers until it's valid implementation. - // Current implementation can produce low probability floating bugs. - return; - Dispose(); } diff --git a/src/runtime/pyscope.cs b/src/runtime/pyscope.cs index 67f93c6e2..25282ac26 100644 --- a/src/runtime/pyscope.cs +++ b/src/runtime/pyscope.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Collections.Generic; using System.Dynamic; @@ -527,10 +527,6 @@ public void Dispose() ~PyScope() { - // We needs to disable Finalizers until it's valid implementation. - // Current implementation can produce low probability floating bugs. - return; - Dispose(); } } diff --git a/src/runtime/pythonexception.cs b/src/runtime/pythonexception.cs index 4031b0526..4fe07f3cf 100644 --- a/src/runtime/pythonexception.cs +++ b/src/runtime/pythonexception.cs @@ -57,10 +57,6 @@ public PythonException() ~PythonException() { - // We needs to disable Finalizers until it's valid implementation. - // Current implementation can produce low probability floating bugs. - return; - Dispose(); } diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index abd0661a4..3949500e2 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Runtime.InteropServices; using System.Security; using System.Text; @@ -9,27 +9,6 @@ namespace Python.Runtime internal static class NativeMethods { #if MONO_LINUX || MONO_OSX -#if NETSTANDARD - private static int RTLD_NOW = 0x2; -#if MONO_LINUX - private static int RTLD_GLOBAL = 0x100; - private static IntPtr RTLD_DEFAULT = IntPtr.Zero; - private const string NativeDll = "libdl.so"; - public static IntPtr LoadLibrary(string fileName) - { - return dlopen($"lib{fileName}.so", RTLD_NOW | RTLD_GLOBAL); - } -#elif MONO_OSX - private static int RTLD_GLOBAL = 0x8; - private const string NativeDll = "/usr/lib/libSystem.dylib" - private static IntPtr RTLD_DEFAULT = new IntPtr(-2); - - public static IntPtr LoadLibrary(string fileName) - { - return dlopen($"lib{fileName}.dylib", RTLD_NOW | RTLD_GLOBAL); - } -#endif -#else private static int RTLD_NOW = 0x2; private static int RTLD_SHARED = 0x20; #if MONO_OSX @@ -44,8 +23,6 @@ public static IntPtr LoadLibrary(string fileName) { return dlopen(fileName, RTLD_NOW | RTLD_SHARED); } -#endif - public static void FreeLibrary(IntPtr handle) { @@ -71,16 +48,16 @@ public static IntPtr GetProcAddress(IntPtr dllHandle, string name) return res; } - [DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - public static extern IntPtr dlopen(String fileName, int flags); + [DllImport(NativeDll)] + private static extern IntPtr dlopen(String fileName, int flags); - [DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] + [DllImport(NativeDll)] private static extern IntPtr dlsym(IntPtr handle, String symbol); - [DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(NativeDll)] private static extern int dlclose(IntPtr handle); - [DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl)] + [DllImport(NativeDll)] private static extern IntPtr dlerror(); #else // Windows private const string NativeDll = "kernel32.dll"; @@ -181,7 +158,7 @@ public class Runtime public static readonly string PythonDLL = _PythonDll; -#if PYTHON_WITHOUT_ENABLE_SHARED && !NETSTANDARD +#if PYTHON_WITHOUT_ENABLE_SHARED internal const string _PythonDll = "__Internal"; #else internal const string _PythonDll = dllBase + dllWithPyDebug + dllWithPyMalloc; @@ -321,13 +298,11 @@ internal static void Initialize() Error = new IntPtr(-1); IntPtr dllLocal = IntPtr.Zero; - if (_PythonDll != "__Internal") { dllLocal = NativeMethods.LoadLibrary(_PythonDll); } _PyObject_NextNotImplemented = NativeMethods.GetProcAddress(dllLocal, "_PyObject_NextNotImplemented"); - #if !(MONO_LINUX || MONO_OSX) if (dllLocal != IntPtr.Zero) { @@ -522,7 +497,7 @@ internal static Type[] PythonArgsToTypeArray(IntPtr arg, bool mangleObjects) /// internal static unsafe void XIncref(IntPtr op) { -#if PYTHON_WITH_PYDEBUG || NETSTANDARD +#if PYTHON_WITH_PYDEBUG Py_IncRef(op); return; #else @@ -543,7 +518,7 @@ internal static unsafe void XIncref(IntPtr op) internal static unsafe void XDecref(IntPtr op) { -#if PYTHON_WITH_PYDEBUG || NETSTANDARD +#if PYTHON_WITH_PYDEBUG Py_DecRef(op); return; #else diff --git a/src/testing/Python.Test.15.csproj b/src/testing/Python.Test.15.csproj index a46cafb9d..635580854 100644 --- a/src/testing/Python.Test.15.csproj +++ b/src/testing/Python.Test.15.csproj @@ -1,21 +1,19 @@ - net40;netstandard2.0 + net40 x64;x86 DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 Python.Test Python.Test Python.Test 2.4.0 + bin\Python.Test.xml bin\ - false - $(OutputPath)\$(AssemblyName).xml - $(OutputPath)\$(TargetFramework)\$(AssemblyName).xml + false 1591,0067 ..\..\ $(SolutionDir)\bin\ - $(PythonBuildDir)\$(TargetFramework)\ 6 false ..\pythonnet.snk @@ -78,11 +76,7 @@ - - - - - + @@ -92,8 +86,7 @@ $(TargetDir)$(TargetName).pdb - - + diff --git a/src/tests/fixtures/netstandard2.0/.gitkeep b/src/tests/fixtures/netstandard2.0/.gitkeep deleted file mode 100644 index e69de29bb..000000000 From 1c794261ada5217833a9d23d3f7bfb399e60fe09 Mon Sep 17 00:00:00 2001 From: dse Date: Fri, 17 Nov 2017 00:20:09 +0400 Subject: [PATCH 309/324] backout #518, wrong merge ! --- .travis.yml | 157 ++------------ CHANGELOG.md | 4 - NuGet.config | 7 - appveyor.yml | 16 +- ci/appveyor_run_tests.ps1 | 7 +- pythonnet.15.sln | 194 ------------------ setup.py | 136 ++---------- src/clrmodule/clrmodule.15.csproj | 101 --------- src/console/Console.15.csproj | 105 ---------- .../Python.EmbeddingTest.15.csproj | 121 ----------- src/embed_tests/Python.EmbeddingTest.csproj | 4 +- src/embed_tests/TestPythonEngineProperties.cs | 4 +- src/embed_tests/packages.config | 4 +- src/runtime/Python.Runtime.15.csproj | 133 ------------ src/runtime/runtime.cs | 4 +- src/testing/Python.Test.15.csproj | 92 --------- 16 files changed, 47 insertions(+), 1042 deletions(-) delete mode 100644 NuGet.config delete mode 100644 pythonnet.15.sln delete mode 100644 src/clrmodule/clrmodule.15.csproj delete mode 100644 src/console/Console.15.csproj delete mode 100644 src/embed_tests/Python.EmbeddingTest.15.csproj delete mode 100644 src/runtime/Python.Runtime.15.csproj delete mode 100644 src/testing/Python.Test.15.csproj diff --git a/.travis.yml b/.travis.yml index 2468ed60a..d6fcc4a88 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,145 +1,18 @@ -dist: trusty sudo: false + language: python - -matrix: - include: - - python: 2.7 - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: - apt: - sources: - - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main - key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main - key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF - packages: - - mono-devel - - ca-certificates-mono - - dotnet-hostfxr-2.0.0 - - dotnet-runtime-2.0.0 - - dotnet-sdk-2.0.0 - - python: 3.3 - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: - apt: - sources: - - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main - key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main - key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF - packages: - - mono-devel - - ca-certificates-mono - - dotnet-hostfxr-2.0.0 - - dotnet-runtime-2.0.0 - - dotnet-sdk-2.0.0 - - python: 3.4 - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: - apt: - sources: - - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main - key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main - key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF - packages: - - mono-devel - - ca-certificates-mono - - dotnet-hostfxr-2.0.0 - - dotnet-runtime-2.0.0 - - dotnet-sdk-2.0.0 - - python: 3.5 - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: - apt: - sources: - - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main - key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main - key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF - packages: - - mono-devel - - ca-certificates-mono - - dotnet-hostfxr-2.0.0 - - dotnet-runtime-2.0.0 - - dotnet-sdk-2.0.0 - - python: 3.6 - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: - apt: - sources: - - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main - key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main - key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF - packages: - - mono-devel - - ca-certificates-mono - - dotnet-hostfxr-2.0.0 - - dotnet-runtime-2.0.0 - - dotnet-sdk-2.0.0 - - python: "3.7-dev" - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe - addons: - apt: - sources: - - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main - key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main - key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF - packages: - - mono-devel - - ca-certificates-mono - - dotnet-hostfxr-2.0.0 - - dotnet-runtime-2.0.0 - - dotnet-sdk-2.0.0 +python: + - 2.7 + - 3.3 + - 3.4 + - 3.5 + - 3.6 + - 3.7-dev - - python: 2.7 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - - python: 3.3 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - - python: 3.4 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - - python: 3.5 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - - python: 3.6 - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - - python: "3.7-dev" - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe +matrix: allow_failures: - - python: "3.7-dev" - env: - - BUILD_OPTS= - - NUNIT_PATH=./packages/NUnit.*/tools/nunit3-console.exe - - python: "3.7-dev" - env: - - BUILD_OPTS=--xplat - - NUNIT_PATH=~/.nuget/packages/nunit.consolerunner/3.*/tools/nunit3-console.exe + - python: 3.7-dev + env: global: - LD_PRELOAD=/lib/x86_64-linux-gnu/libSegFault.so @@ -150,8 +23,8 @@ env: addons: apt: sources: - - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main - key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF + - mono + - mono-libtiff-compat packages: - mono-devel - ca-certificates-mono @@ -164,11 +37,11 @@ before_install: install: - pip install --upgrade setuptools # TEMP - due to setuptools 36.2.0 bug - pip install --upgrade -r requirements.txt - - coverage run setup.py install $BUILD_OPTS + - coverage run setup.py install script: - python -m pytest - - mono $NUNIT_PATH src/embed_tests/bin/Python.EmbeddingTest.dll + - mono ./packages/NUnit.*/tools/nunit3-console.exe src/embed_tests/bin/Python.EmbeddingTest.dll after_script: # Uncomment if need to geninterop, ie. py37 final diff --git a/CHANGELOG.md b/CHANGELOG.md index e5929107b..5ae62d692 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,10 +8,6 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. ## [unreleased][] ### Added -- Added new build system (pythonnet.15.sln) based on dotnetcore-sdk/xplat(crossplatform msbuild). - Currently there two side-by-side build systems that produces the same output (net40) from the same sources. - After a some transition time, current (mono/ msbuild 14.0) build system will be removed. -- NUnit upgraded to 3.7 (eliminates travis-ci random bug) - Added `clr.GetClrType` (#432, #433) - Allowed passing `None` for nullable args (#460) - Added keyword arguments based on C# syntax for calling CPython methods (#461) diff --git a/NuGet.config b/NuGet.config deleted file mode 100644 index 719fbc83c..000000000 --- a/NuGet.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index c7c3a7810..2f1103f5a 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,9 +1,6 @@ version: '{branch}-{build}' build: off -image: - - Visual Studio 2017 - platform: - x86 - x64 @@ -15,16 +12,6 @@ environment: CODECOV_ENV: PYTHON_VERSION, PLATFORM matrix: - - PYTHON_VERSION: 2.7 - BUILD_OPTS: --xplat - - PYTHON_VERSION: 3.3 - BUILD_OPTS: --xplat - - PYTHON_VERSION: 3.4 - BUILD_OPTS: --xplat - - PYTHON_VERSION: 3.5 - BUILD_OPTS: --xplat - - PYTHON_VERSION: 3.6 - BUILD_OPTS: --xplat - PYTHON_VERSION: 2.7 - PYTHON_VERSION: 3.3 - PYTHON_VERSION: 3.4 @@ -42,7 +29,6 @@ init: install: - pip install --upgrade -r requirements.txt --quiet - - choco install vswhere -y # Install OpenCover. Can't put on `packages.config`, not Mono compatible - .\tools\nuget\nuget.exe install OpenCover -OutputDirectory packages -Verbosity quiet @@ -51,7 +37,7 @@ build_script: # Create clean `sdist`. Only used for releases - python setup.py --quiet sdist # Build `wheel` with coverage of `setup.py` - - coverage run setup.py bdist_wheel %BUILD_OPTS% + - coverage run setup.py bdist_wheel test_script: - pip install --no-index --find-links=.\dist\ pythonnet diff --git a/ci/appveyor_run_tests.ps1 b/ci/appveyor_run_tests.ps1 index 2821cf915..4245d1577 100644 --- a/ci/appveyor_run_tests.ps1 +++ b/ci/appveyor_run_tests.ps1 @@ -11,12 +11,7 @@ if ($FALSE -and $env:PLATFORM -eq "x86"){ # Executable paths for OpenCover # Note if OpenCover fails, it won't affect the exit codes. $OPENCOVER = Resolve-Path .\packages\OpenCover.*\tools\OpenCover.Console.exe -if ($env:BUILD_OPTS -eq "--xplat"){ - $CS_RUNNER = Resolve-Path $env:USERPROFILE\.nuget\packages\nunit.consolerunner\*\tools\"$CS_RUNNER".exe -} -else{ - $CS_RUNNER = Resolve-Path .\packages\NUnit.*\tools\"$CS_RUNNER".exe -} +$CS_RUNNER = Resolve-Path .\packages\NUnit.*\tools\"$CS_RUNNER".exe $PY = Get-Command python # Can't use ".\build\*\Python.EmbeddingTest.dll". Missing framework files. diff --git a/pythonnet.15.sln b/pythonnet.15.sln deleted file mode 100644 index 121631e43..000000000 --- a/pythonnet.15.sln +++ /dev/null @@ -1,194 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26730.3 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Runtime.15", "src\runtime\Python.Runtime.15.csproj", "{2759F4FF-716B-4828-916F-50FA86613DFC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.EmbeddingTest.15", "src\embed_tests\Python.EmbeddingTest.15.csproj", "{66B8D01A-9906-452A-B09E-BF75EA76468F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "clrmodule.15", "src\clrmodule\clrmodule.15.csproj", "{E08678D4-9A52-4AD5-B63D-8EBC7399981B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Console.15", "src\console\Console.15.csproj", "{CDAD305F-8E72-492C-A314-64CF58D472A0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Python.Test.15", "src\testing\Python.Test.15.csproj", "{F94B547A-E97E-4500-8D53-B4D64D076E5F}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - DebugMono|x64 = DebugMono|x64 - DebugMono|x86 = DebugMono|x86 - DebugMonoPY3|x64 = DebugMonoPY3|x64 - DebugMonoPY3|x86 = DebugMonoPY3|x86 - DebugWin|x64 = DebugWin|x64 - DebugWin|x86 = DebugWin|x86 - DebugWinPY3|x64 = DebugWinPY3|x64 - DebugWinPY3|x86 = DebugWinPY3|x86 - ReleaseMono|x64 = ReleaseMono|x64 - ReleaseMono|x86 = ReleaseMono|x86 - ReleaseMonoPY3|x64 = ReleaseMonoPY3|x64 - ReleaseMonoPY3|x86 = ReleaseMonoPY3|x86 - ReleaseWin|x64 = ReleaseWin|x64 - ReleaseWin|x86 = ReleaseWin|x86 - ReleaseWinPY3|x64 = ReleaseWinPY3|x64 - ReleaseWinPY3|x86 = ReleaseWinPY3|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|x64.Build.0 = DebugMono|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMono|x86.Build.0 = DebugMono|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|x64.ActiveCfg = DebugWin|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|x64.Build.0 = DebugWin|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|x86.ActiveCfg = DebugWin|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWin|x86.Build.0 = DebugWin|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|x64.Build.0 = DebugWinPY3|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.DebugWinPY3|x86.Build.0 = DebugWinPY3|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|x64.Build.0 = ReleaseMono|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMono|x86.Build.0 = ReleaseMono|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|x64.ActiveCfg = ReleaseWin|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|x64.Build.0 = ReleaseWin|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|x86.ActiveCfg = ReleaseWin|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWin|x86.Build.0 = ReleaseWin|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|Any CPU - {2759F4FF-716B-4828-916F-50FA86613DFC}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|Any CPU - {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMono|x64.ActiveCfg = DebugMono|x64 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMono|x64.Build.0 = DebugMono|x64 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMono|x86.ActiveCfg = DebugMono|x86 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMono|x86.Build.0 = DebugMono|x86 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWin|x64.ActiveCfg = DebugWin|x64 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWin|x64.Build.0 = DebugWin|x64 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWin|x86.ActiveCfg = DebugWin|x86 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWin|x86.Build.0 = DebugWin|x86 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMono|x64.Build.0 = ReleaseMono|x64 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMono|x86.Build.0 = ReleaseMono|x86 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 - {66B8D01A-9906-452A-B09E-BF75EA76468F}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMono|x64.ActiveCfg = DebugMono|x64 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMono|x86.ActiveCfg = DebugMono|x86 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWin|x64.ActiveCfg = DebugWin|x64 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWin|x64.Build.0 = DebugWin|x64 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWin|x86.ActiveCfg = DebugWin|x86 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWin|x86.Build.0 = DebugWin|x86 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 - {E08678D4-9A52-4AD5-B63D-8EBC7399981B}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMono|x64.ActiveCfg = DebugMono|x64 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMono|x64.Build.0 = DebugMono|x64 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMono|x86.ActiveCfg = DebugMono|x86 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMono|x86.Build.0 = DebugMono|x86 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWin|x64.ActiveCfg = DebugWin|x64 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWin|x64.Build.0 = DebugWin|x64 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWin|x86.ActiveCfg = DebugWin|x86 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWin|x86.Build.0 = DebugWin|x86 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMono|x64.Build.0 = ReleaseMono|x64 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMono|x86.Build.0 = ReleaseMono|x86 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 - {CDAD305F-8E72-492C-A314-64CF58D472A0}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMono|x64.ActiveCfg = DebugMono|x64 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMono|x64.Build.0 = DebugMono|x64 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMono|x86.ActiveCfg = DebugMono|x86 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMono|x86.Build.0 = DebugMono|x86 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWin|x64.ActiveCfg = DebugWin|x64 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWin|x64.Build.0 = DebugWin|x64 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWin|x86.ActiveCfg = DebugWin|x86 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWin|x86.Build.0 = DebugWin|x86 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMono|x64.Build.0 = ReleaseMono|x64 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMono|x86.Build.0 = ReleaseMono|x86 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 - {F94B547A-E97E-4500-8D53-B4D64D076E5F}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {A6347B90-BBE6-4E45-90BF-1BD8B76069E3} - EndGlobalSection -EndGlobal diff --git a/setup.py b/setup.py index 6cfd773a6..c23f6b5bd 100644 --- a/setup.py +++ b/setup.py @@ -14,8 +14,7 @@ import sys import sysconfig from distutils import spawn -from distutils.command import install, build, build_ext, install_data, install_lib -from wheel import bdist_wheel +from distutils.command import build_ext, install_data, install_lib from setuptools import Extension, setup @@ -132,28 +131,9 @@ def _get_long_description(): except ImportError: return '.Net and Mono integration for Python' -def _update_xlat_devtools(): - global DEVTOOLS - if DEVTOOLS == "MsDev": - DEVTOOLS = "MsDev15" - elif DEVTOOLS == "Mono": - DEVTOOLS = "dotnet" class BuildExtPythonnet(build_ext.build_ext): - user_options = build_ext.build_ext.user_options + [ - ('xplat', None, None) - ] - def initialize_options(self): - build_ext.build_ext.initialize_options(self) - self.xplat = None - - def finalize_options(self): - build_ext.build_ext.finalize_options(self) - def build_extension(self, ext): - if self.xplat: - _update_xlat_devtools() - """Builds the .pyd file using msbuild or xbuild""" if ext.name != "clr": return build_ext.build_ext.build_extension(self, ext) @@ -184,7 +164,7 @@ def build_extension(self, ext): if CONFIG == "Debug": defines.extend(["DEBUG", "TRACE"]) - if sys.platform != "win32" and (DEVTOOLS == "Mono" or DEVTOOLS == "dotnet"): + if sys.platform != "win32" and DEVTOOLS == "Mono": on_darwin = sys.platform == "darwin" defines.append("MONO_OSX" if on_darwin else "MONO_LINUX") @@ -216,33 +196,20 @@ def build_extension(self, ext): if DEVTOOLS == "MsDev": _xbuild = '"{0}"'.format(self._find_msbuild_tool("msbuild.exe")) _config = "{0}Win".format(CONFIG) - _solution_file = 'pythonnet.sln' - _custom_define_constants = False - elif DEVTOOLS == "MsDev15": - _xbuild = '"{0}"'.format(self._find_msbuild_tool_15()) - _config = "{0}Win".format(CONFIG) - _solution_file = 'pythonnet.15.sln' - _custom_define_constants = True + elif DEVTOOLS == "Mono": - _xbuild = 'xbuild' + _xbuild = "xbuild" _config = "{0}Mono".format(CONFIG) - _solution_file = 'pythonnet.sln' - _custom_define_constants = False - elif DEVTOOLS == "dotnet": - _xbuild = 'dotnet msbuild' - _config = "{0}Mono".format(CONFIG) - _solution_file = 'pythonnet.15.sln' - _custom_define_constants = True else: raise NotImplementedError( - "DevTool {0} not supported (use MsDev/MsDev15/Mono/dotnet)".format(DEVTOOLS)) + "DevTool {0} not supported (use MsDev/Mono)".format(DEVTOOLS)) cmd = [ _xbuild, - _solution_file, + 'pythonnet.sln', '/p:Configuration={}'.format(_config), '/p:Platform={}'.format(ARCH), - '/p:{}DefineConstants="{}"'.format('Custom' if _custom_define_constants else '','%3B'.join(defines)), + '/p:DefineConstants="{}"'.format('%3B'.join(defines)), '/p:PythonBuildDir="{}"'.format(os.path.abspath(dest_dir)), '/p:PythonInteropFile="{}"'.format(os.path.basename(interop_file)), '/verbosity:{}'.format(VERBOSITY), @@ -253,16 +220,15 @@ def build_extension(self, ext): cmd.append('/p:PythonManifest="{0}"'.format(manifest)) self.debug_print("Building: {0}".format(" ".join(cmd))) - use_shell = True if DEVTOOLS == "Mono" or DEVTOOLS == "dotnet" else False - + use_shell = True if DEVTOOLS == "Mono" else False subprocess.check_call(" ".join(cmd + ["/t:Clean"]), shell=use_shell) subprocess.check_call(" ".join(cmd + ["/t:Build"]), shell=use_shell) - if DEVTOOLS == "Mono" or DEVTOOLS == "dotnet": + if DEVTOOLS == "Mono": self._build_monoclr() def _get_manifest(self, build_dir): - if DEVTOOLS != "MsDev" and DEVTOOLS != "MsDev15": + if DEVTOOLS != "MsDev": return mt = self._find_msbuild_tool("mt.exe", use_windows_sdk=True) manifest = os.path.abspath(os.path.join(build_dir, "app.manifest")) @@ -295,30 +261,19 @@ def _build_monoclr(self): def _install_packages(self): """install packages using nuget""" - use_shell = DEVTOOLS == "Mono" or DEVTOOLS == "dotnet" - - if DEVTOOLS == "MsDev15" or DEVTOOLS == "dotnet": - if DEVTOOLS == "MsDev15": - _config = "{0}Win".format(CONFIG) - elif DEVTOOLS == "dotnet": - _config = "{0}Mono".format(CONFIG) - - cmd = "dotnet msbuild /t:Restore pythonnet.15.sln /p:Configuration={0} /p:Platform={1}".format(_config, ARCH) - self.debug_print("Updating packages with xplat: {0}".format(cmd)) - subprocess.check_call(cmd, shell=use_shell) - else: - nuget = os.path.join("tools", "nuget", "nuget.exe") - - if DEVTOOLS == "Mono": - nuget = "mono {0}".format(nuget) + nuget = os.path.join("tools", "nuget", "nuget.exe") + use_shell = False + if DEVTOOLS == "Mono": + nuget = "mono {0}".format(nuget) + use_shell = True - cmd = "{0} update -self".format(nuget) - self.debug_print("Updating NuGet: {0}".format(cmd)) - subprocess.check_call(cmd, shell=use_shell) + cmd = "{0} update -self".format(nuget) + self.debug_print("Updating NuGet: {0}".format(cmd)) + subprocess.check_call(cmd, shell=use_shell) - cmd = "{0} restore pythonnet.sln -o packages".format(nuget) - self.debug_print("Installing packages: {0}".format(cmd)) - subprocess.check_call(cmd, shell=use_shell) + cmd = "{0} restore pythonnet.sln -o packages".format(nuget) + self.debug_print("Installing packages: {0}".format(cmd)) + subprocess.check_call(cmd, shell=use_shell) def _find_msbuild_tool(self, tool="msbuild.exe", use_windows_sdk=False): """Return full path to one of the Microsoft build tools""" @@ -364,20 +319,6 @@ def _find_msbuild_tool(self, tool="msbuild.exe", use_windows_sdk=False): raise RuntimeError("{0} could not be found".format(tool)) - def _find_msbuild_tool_15(self): - """Return full path to one of the Microsoft build tools""" - try: - basePathes = subprocess.check_output( - ["vswhere", "-latest", - "-version", "[15.0, 16.0)", - "-requires", "Microsoft.Component.MSBuild", - "-property", "InstallationPath"]).splitlines() - if len(basePathes): - return os.path.join(basePathes[0].decode(sys.stdout.encoding or "utf-8"), "MSBuild", "15.0", "Bin", "MSBuild.exe") - else: - raise RuntimeError("MSBuild >=15.0 could not be found.") - except subprocess.CalledProcessError as e: - raise RuntimeError("MSBuild >=15.0 could not be found. {0}".format(e.output)) class InstallLibPythonnet(install_lib.install_lib): def install(self): @@ -415,39 +356,8 @@ def run(self): return install_data.install_data.run(self) -class InstallPythonnet(install.install): - user_options = install.install.user_options + [ - ('xplat', None, None) - ] - def initialize_options(self): - install.install.initialize_options(self) - self.xplat = None - - def finalize_options(self): - install.install.finalize_options(self) - - def run(self): - if self.xplat: - _update_xlat_devtools() - return install.install.run(self) - -class BDistWheelPythonnet(bdist_wheel.bdist_wheel): - user_options = bdist_wheel.bdist_wheel.user_options + [ - ('xplat', None, None) - ] - def initialize_options(self): - bdist_wheel.bdist_wheel.initialize_options(self) - self.xplat = None - - def finalize_options(self): - bdist_wheel.bdist_wheel.finalize_options(self) - def run(self): - if self.xplat: - _update_xlat_devtools() - return bdist_wheel.bdist_wheel.run(self) - - ############################################################################### +############################################################################### setupdir = os.path.dirname(__file__) if setupdir: os.chdir(setupdir) @@ -475,11 +385,9 @@ def run(self): ]), ], cmdclass={ - "install": InstallPythonnet, "build_ext": BuildExtPythonnet, "install_lib": InstallLibPythonnet, "install_data": InstallDataPythonnet, - "bdist_wheel": BDistWheelPythonnet }, classifiers=[ 'Development Status :: 5 - Production/Stable', diff --git a/src/clrmodule/clrmodule.15.csproj b/src/clrmodule/clrmodule.15.csproj deleted file mode 100644 index 4d8a1b8ff..000000000 --- a/src/clrmodule/clrmodule.15.csproj +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - net40 - x64;x86 - DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 - clrmodule - clrmodule - clrmodule - 2.4.0 - false - false - false - false - false - false - bin\clrmodule.xml - bin\ - false - 1591 - ..\..\ - $(SolutionDir)\bin\ - 6 - prompt - $(PYTHONNET_DEFINE_CONSTANTS) - XPLAT - $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); - $(DefineConstants);TRACE;DEBUG - - - - x86 - - - x64 - - - - true - $(DefineConstants);PYTHON2;TRACE;DEBUG - full - - - $(DefineConstants);PYTHON2 - true - pdbonly - - - true - $(DefineConstants);PYTHON2;TRACE;DEBUG - full - - - $(DefineConstants);PYTHON2 - true - pdbonly - - - true - $(DefineConstants);PYTHON3;TRACE;DEBUG - full - - - $(DefineConstants);PYTHON3 - true - pdbonly - - - true - $(DefineConstants);PYTHON3;TRACE;DEBUG - full - - - $(DefineConstants);PYTHON3 - true - pdbonly - - - - - - - - - - - - - - $(TargetPath) - $(TargetDir)$(TargetName).pdb - - - - - - - - diff --git a/src/console/Console.15.csproj b/src/console/Console.15.csproj deleted file mode 100644 index 0c89fce40..000000000 --- a/src/console/Console.15.csproj +++ /dev/null @@ -1,105 +0,0 @@ - - - - net40 - x64;x86 - DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 - Exe - nPython - Python.Runtime - nPython - 2.4.0 - false - false - false - false - false - false - bin\nPython.xml - bin\ - false - 1591 - ..\..\ - $(SolutionDir)\bin\ - 6 - python-clear.ico - prompt - $(PYTHONNET_DEFINE_CONSTANTS) - XPLAT - $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); - $(DefineConstants);TRACE;DEBUG - $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ - - - x86 - - - x64 - - - true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants) - true - pdbonly - - - true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants) - true - pdbonly - - - true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants) - true - pdbonly - - - true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants) - true - pdbonly - - - $(PythonManifest) - - - - - - - Properties\SharedAssemblyInfo.cs - - - - - - Python.Runtime.dll - - - - - - - - - - - - diff --git a/src/embed_tests/Python.EmbeddingTest.15.csproj b/src/embed_tests/Python.EmbeddingTest.15.csproj deleted file mode 100644 index ac6ecba92..000000000 --- a/src/embed_tests/Python.EmbeddingTest.15.csproj +++ /dev/null @@ -1,121 +0,0 @@ - - - - - net40 - x64;x86 - DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 - net45 - Python.EmbeddingTest - Python.EmbeddingTest - Python.EmbeddingTest - 2.4.0 - false - false - false - false - bin\ - false - $(OutputPath)\$(AssemblyName).xml - 1591 - ..\..\ - $(SolutionDir)\bin\ - 6 - prompt - $(PYTHONNET_DEFINE_CONSTANTS) - XPLAT - $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); - $(DefineConstants);TRACE;DEBUG - $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ - - - x86 - - - x64 - - - true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants); - true - pdbonly - - - true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants); - true - pdbonly - - - true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants); - true - pdbonly - - - true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants); - true - pdbonly - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(TargetPath) - $(TargetDir)$(TargetName).pdb - - - - - - - - diff --git a/src/embed_tests/Python.EmbeddingTest.csproj b/src/embed_tests/Python.EmbeddingTest.csproj index fe02b0526..d45c622f9 100644 --- a/src/embed_tests/Python.EmbeddingTest.csproj +++ b/src/embed_tests/Python.EmbeddingTest.csproj @@ -70,8 +70,8 @@ - - ..\..\packages\NUnit.3.7.1\lib\net40\nunit.framework.dll + + ..\..\packages\NUnit.3.6.0\lib\net40\nunit.framework.dll diff --git a/src/embed_tests/TestPythonEngineProperties.cs b/src/embed_tests/TestPythonEngineProperties.cs index 01c6ae7e3..76177d05a 100644 --- a/src/embed_tests/TestPythonEngineProperties.cs +++ b/src/embed_tests/TestPythonEngineProperties.cs @@ -146,7 +146,7 @@ public void SetProgramName() [Test] public void SetPythonPath() { - if (Runtime.Runtime.pyversion == "2.7") + if (Runtime.Runtime._pyversion == "2.7") { // Assert.Skip outputs as a warning (ie. pending to fix) Assert.Pass(); @@ -166,7 +166,7 @@ public void SetPythonPath() [Test] public void SetPythonPathExceptionOn27() { - if (Runtime.Runtime.pyversion != "2.7") + if (Runtime.Runtime._pyversion != "2.7") { Assert.Pass(); } diff --git a/src/embed_tests/packages.config b/src/embed_tests/packages.config index 8c175f441..4cb01d3be 100644 --- a/src/embed_tests/packages.config +++ b/src/embed_tests/packages.config @@ -1,5 +1,5 @@ - - + + diff --git a/src/runtime/Python.Runtime.15.csproj b/src/runtime/Python.Runtime.15.csproj deleted file mode 100644 index 93bd143dc..000000000 --- a/src/runtime/Python.Runtime.15.csproj +++ /dev/null @@ -1,133 +0,0 @@ - - - - net40 - AnyCPU - DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 - net45 - Python.Runtime - Python.Runtime - Python.Runtime - 2.4.0 - false - false - false - false - false - false - bin\ - false - $(OutputPath)\$(AssemblyName).xml - 1591;NU1701 - ..\..\ - $(SolutionDir)\bin\ - 6 - True - ..\pythonnet.snk - $(PYTHONNET_DEFINE_CONSTANTS) - XPLAT - $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); - $(DefineConstants);TRACE;DEBUG - $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ - $(PYTHONNET_PY2_VERSION) - PYTHON27 - $(PYTHONNET_PY3_VERSION) - PYTHON36 - $(PYTHONNET_WIN_DEFINE_CONSTANTS) - UCS2 - $(PYTHONNET_MONO_DEFINE_CONSTANTS) - UCS4;MONO_LINUX;PYTHON_WITH_PYMALLOC - - - - $(DefineConstants);PYTHON2;$(Python2Version);$(PythonMonoDefineConstants) - true - pdbonly - - - $(DefineConstants);PYTHON3;$(Python3Version);$(PythonMonoDefineConstants) - true - pdbonly - - - true - $(DefineConstants);PYTHON2;$(Python2Version);$(PythonMonoDefineConstants);TRACE;DEBUG - false - full - - - true - $(DefineConstants);PYTHON3;$(Python3Version);$(PythonMonoDefineConstants);TRACE;DEBUG - false - full - - - $(DefineConstants);PYTHON2;$(Python2Version);$(PythonWinDefineConstants) - true - pdbonly - - - $(DefineConstants);PYTHON3;$(Python3Version);$(PythonWinDefineConstants) - true - pdbonly - - - true - $(DefineConstants);PYTHON2;$(Python2Version);$(PythonWinDefineConstants);TRACE;DEBUG - false - full - - - true - $(DefineConstants);PYTHON3;$(Python3Version);$(PythonWinDefineConstants);TRACE;DEBUG - false - full - - - - - - - - - - - - - - - - - - - - - - clr.py - - - - - - - - - - - - - - - $(TargetPath) - $(TargetDir)$(TargetName).pdb - - - - - - - - - - - diff --git a/src/runtime/runtime.cs b/src/runtime/runtime.cs index 3949500e2..8f730a855 100644 --- a/src/runtime/runtime.cs +++ b/src/runtime/runtime.cs @@ -110,8 +110,8 @@ public class Runtime // We needs to replace all public constants to static readonly fields to allow // binary substitution of different Python.Runtime.dll builds in a target application. - public static string pyversion => _pyversion; - public static string pyver => _pyver; + public string pyversion => _pyversion; + public string pyver => _pyver; #if PYTHON27 internal const string _pyversion = "2.7"; diff --git a/src/testing/Python.Test.15.csproj b/src/testing/Python.Test.15.csproj deleted file mode 100644 index 635580854..000000000 --- a/src/testing/Python.Test.15.csproj +++ /dev/null @@ -1,92 +0,0 @@ - - - - net40 - x64;x86 - DebugMono;DebugMonoPY3;ReleaseMono;ReleaseMonoPY3;DebugWin;DebugWinPY3;ReleaseWin;ReleaseWinPY3 - Python.Test - Python.Test - Python.Test - 2.4.0 - bin\Python.Test.xml - bin\ - false - 1591,0067 - ..\..\ - $(SolutionDir)\bin\ - 6 - false - ..\pythonnet.snk - prompt - $(PYTHONNET_DEFINE_CONSTANTS) - XPLAT - $(DefineConstants);$(CustomDefineConstants);$(BaseDefineConstants); - $(DefineConstants);TRACE;DEBUG - $(NuGetPackageRoot)\microsoft.targetingpack.netframework.v4.5\1.0.1\lib\net45\ - - - x86 - - - x64 - - - true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants) - true - pdbonly - - - true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants) - true - pdbonly - - - true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants) - true - pdbonly - - - true - $(DefineConstants);DEBUG;TRACE - full - - - $(DefineConstants) - true - pdbonly - - - - - - - - - - - - - - $(TargetPath) - $(TargetDir)$(TargetName).pdb - - - - - - From 7f81b382bfd7f724c230a7807e65784487ef0fbf Mon Sep 17 00:00:00 2001 From: dse Date: Wed, 13 Dec 2017 02:25:20 +0400 Subject: [PATCH 310/324] Build fix for python 3.3 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 18f9bf902..24679b2af 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # Requirements for both Travis and AppVeyor -pytest +pytest==3.2.5 coverage # Coverage upload From 27da1ca1e3315a3534174c46b7b6606a7d909c9d Mon Sep 17 00:00:00 2001 From: dse Date: Thu, 28 Dec 2017 21:16:46 +0400 Subject: [PATCH 311/324] PyObject was made IEnumerable --- src/embed_tests/dynamic.cs | 4 ++-- src/runtime/pyobject.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/embed_tests/dynamic.cs b/src/embed_tests/dynamic.cs index 94397072a..d75dc01d6 100644 --- a/src/embed_tests/dynamic.cs +++ b/src/embed_tests/dynamic.cs @@ -103,7 +103,7 @@ public void PassObjectInPython() Assert.AreEqual(sys.testattr3.ToString(), "True"); // Compare in .NET - Assert.AreEqual(sys.testattr1, sys.testattr2); + Assert.IsTrue(sys.testattr1.Equals(sys.testattr2)); } /// @@ -125,7 +125,7 @@ public void PassPyObjectInNet() Assert.AreEqual(sys.testattr3.ToString(), "True"); // Compare in .NET - Assert.AreEqual(sys.testattr1, sys.testattr2); + Assert.IsTrue(sys.testattr1.Equals(sys.testattr2)); } } } diff --git a/src/runtime/pyobject.cs b/src/runtime/pyobject.cs index 5900e80b7..0d186bf4e 100644 --- a/src/runtime/pyobject.cs +++ b/src/runtime/pyobject.cs @@ -12,7 +12,7 @@ namespace Python.Runtime /// PY3: https://docs.python.org/3/c-api/object.html /// for details. /// - public class PyObject : DynamicObject, IDisposable + public class PyObject : DynamicObject, IEnumerable, IDisposable { protected internal IntPtr obj = IntPtr.Zero; private bool disposed = false; From c6cc3daa339bcdd5bdd6ea860047913999319610 Mon Sep 17 00:00:00 2001 From: ywg16-pc Date: Wed, 10 Jan 2018 16:14:12 +0800 Subject: [PATCH 312/324] fixed bug of Exec method #591 --- src/embed_tests/pyrunstring.cs | 15 +++++++++++++++ src/runtime/pythonengine.cs | 10 ++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/embed_tests/pyrunstring.cs b/src/embed_tests/pyrunstring.cs index 81a1b07ca..07875a2a8 100644 --- a/src/embed_tests/pyrunstring.cs +++ b/src/embed_tests/pyrunstring.cs @@ -57,5 +57,20 @@ public void TestExec() object c = locals.GetItem("c").AsManagedObject(typeof(int)); Assert.AreEqual(111, c); } + + [Test] + public void TestExec2() + { + string code = @" +class Test1(): + pass + +class Test2(): + def __init__(self): + Test1() + +Test2()"; + PythonEngine.Exec(code); + } } } diff --git a/src/runtime/pythonengine.cs b/src/runtime/pythonengine.cs index 556da698f..a23c7ac79 100644 --- a/src/runtime/pythonengine.cs +++ b/src/runtime/pythonengine.cs @@ -496,12 +496,10 @@ internal static PyObject RunString(string code, IntPtr? globals, IntPtr? locals, borrowedGlobals = false; } } - - var borrowedLocals = true; + if (locals == null) { - locals = Runtime.PyDict_New(); - borrowedLocals = false; + locals = globals; } try @@ -516,10 +514,6 @@ internal static PyObject RunString(string code, IntPtr? globals, IntPtr? locals, } finally { - if (!borrowedLocals) - { - Runtime.XDecref(locals.Value); - } if (!borrowedGlobals) { Runtime.XDecref(globals.Value); From cd2189110c9f94cf32b4f358f0c1e2e266e8b10e Mon Sep 17 00:00:00 2001 From: dse Date: Sat, 13 Jan 2018 02:12:30 +0400 Subject: [PATCH 313/324] Backed out changeset: Mono downgrade to 5.2.0 --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3ab0e900f..025229d04 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ matrix: sources: - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main key_url: https://packages.microsoft.com/keys/microsoft.asc - - sourceline: deb http://download.mono-project.com/repo/debian trusty/snapshots/5.2.0.224 main + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF packages: - mono-devel @@ -79,7 +79,7 @@ env: addons: apt: sources: - - sourceline: deb http://download.mono-project.com/repo/debian trusty/snapshots/5.2.0.224 main + - sourceline: deb http://download.mono-project.com/repo/ubuntu trusty main key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF packages: - mono-devel From c9afb7ad758d4bdfbe0f97aded491df3eda68f41 Mon Sep 17 00:00:00 2001 From: dse Date: Sat, 13 Jan 2018 18:17:18 +0400 Subject: [PATCH 314/324] PythonTypeName property added to the PythonException object. --- src/embed_tests/TestPythonException.cs | 14 ++++++++++++++ src/runtime/pythonexception.cs | 10 ++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/embed_tests/TestPythonException.cs b/src/embed_tests/TestPythonException.cs index 5470b246f..0acdaa2fa 100644 --- a/src/embed_tests/TestPythonException.cs +++ b/src/embed_tests/TestPythonException.cs @@ -40,5 +40,19 @@ public void TestNoError() var e = new PythonException(); // There is no PyErr to fetch Assert.AreEqual("", e.Message); } + + [Test] + public void TestPythonErrorTypeName() + { + try + { + var module = PythonEngine.ImportModule("really____unknown___module"); + Assert.Fail("Unknown module should not be loaded"); + } + catch (PythonException ex) + { + Assert.AreEqual(ex.PythonTypeName, "ModuleNotFoundError"); + } + } } } diff --git a/src/runtime/pythonexception.cs b/src/runtime/pythonexception.cs index 4031b0526..ded7fbeb5 100644 --- a/src/runtime/pythonexception.cs +++ b/src/runtime/pythonexception.cs @@ -13,6 +13,7 @@ public class PythonException : System.Exception private IntPtr _pyTB = IntPtr.Zero; private string _tb = ""; private string _message = ""; + private string _pythonTypeName = ""; private bool disposed = false; public PythonException() @@ -33,6 +34,8 @@ public PythonException() type = pyTypeName.ToString(); } + _pythonTypeName = type; + Runtime.XIncref(_pyValue); using (var pyValue = new PyObject(_pyValue)) { @@ -132,6 +135,13 @@ public override string StackTrace get { return _tb; } } + /// + /// Python error type name. + /// + public string PythonTypeName + { + get { return _pythonTypeName; } + } /// /// Dispose Method From 9d357f91b86377ab38227dd2ec771c3b65485c6a Mon Sep 17 00:00:00 2001 From: Denis Akhiyarov Date: Sun, 28 Jan 2018 11:39:33 -0600 Subject: [PATCH 315/324] fix for "handle is not inialized" crash on `clr.GetClrType(System.__class__)` --- pythonnet.sln | 64 +++++++++++++++---------------- src/clrmodule/clrmodule.csproj | 7 +++- src/runtime/Python.Runtime.csproj | 1 + src/runtime/managedtype.cs | 4 ++ 4 files changed, 42 insertions(+), 34 deletions(-) diff --git a/pythonnet.sln b/pythonnet.sln index c5afd66c3..4fd6fa85b 100644 --- a/pythonnet.sln +++ b/pythonnet.sln @@ -32,38 +32,38 @@ Global ReleaseWinPY3|x86 = ReleaseWinPY3|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x64.ActiveCfg = DebugMono|x64 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x64.Build.0 = DebugMono|x64 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x86.ActiveCfg = DebugMono|x86 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x86.Build.0 = DebugMono|x86 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x64.ActiveCfg = DebugWin|x64 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x64.Build.0 = DebugWin|x64 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x86.ActiveCfg = DebugWin|x86 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x86.Build.0 = DebugWin|x86 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x64.Build.0 = ReleaseMono|x64 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x86.Build.0 = ReleaseMono|x86 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x64.Build.0 = DebugMono|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x86.Build.0 = DebugMono|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x64.ActiveCfg = DebugWin|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x64.Build.0 = DebugWin|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x86.ActiveCfg = DebugWin|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x86.Build.0 = DebugWin|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x64.Build.0 = DebugWinPY3|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x86.Build.0 = DebugWinPY3|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x64.Build.0 = ReleaseMono|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x86.Build.0 = ReleaseMono|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x64.ActiveCfg = ReleaseWin|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x64.Build.0 = ReleaseWin|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x86.ActiveCfg = ReleaseWin|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x86.Build.0 = ReleaseWin|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|Any CPU {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMono|x64.ActiveCfg = DebugMono|x64 {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMono|x64.Build.0 = DebugMono|x64 {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMono|x86.ActiveCfg = DebugMono|x86 diff --git a/src/clrmodule/clrmodule.csproj b/src/clrmodule/clrmodule.csproj index 6e5ff4966..d4bacdf05 100644 --- a/src/clrmodule/clrmodule.csproj +++ b/src/clrmodule/clrmodule.csproj @@ -1,4 +1,4 @@ - + Debug @@ -65,6 +65,9 @@ true pdbonly + + TRACE;DEBUG;PYTHON3;PYTHON35;UCS2 + ..\..\packages\UnmanagedExports.1.2.7\lib\net\RGiesecke.DllExport.Metadata.dll @@ -92,4 +95,4 @@ - + \ No newline at end of file diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index 82825a626..e95c6a9bb 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -71,6 +71,7 @@ PYTHON3;PYTHON36;UCS2;TRACE;DEBUG false full + TRACE;DEBUG;PYTHON3;PYTHON35;UCS2 diff --git a/src/runtime/managedtype.cs b/src/runtime/managedtype.cs index 562b2e5f8..0b95e85fd 100644 --- a/src/runtime/managedtype.cs +++ b/src/runtime/managedtype.cs @@ -34,6 +34,10 @@ internal static ManagedType GetManagedObject(IntPtr ob) IntPtr op = tp == ob ? Marshal.ReadIntPtr(tp, TypeOffset.magic()) : Marshal.ReadIntPtr(ob, ObjectOffset.magic(ob)); + if (op == IntPtr.Zero) + { + return null; + } var gc = (GCHandle)op; return (ManagedType)gc.Target; } From 32ec24c3fba98143da3e34c6f973f6c283bef168 Mon Sep 17 00:00:00 2001 From: Denis Akhiyarov Date: Sun, 28 Jan 2018 11:56:49 -0600 Subject: [PATCH 316/324] Revert "fix for "handle is not inialized" crash on `clr.GetClrType(System.__class__)`" This reverts commit 9d357f91b86377ab38227dd2ec771c3b65485c6a. --- pythonnet.sln | 64 +++++++++++++++---------------- src/clrmodule/clrmodule.csproj | 7 +--- src/runtime/Python.Runtime.csproj | 1 - src/runtime/managedtype.cs | 4 -- 4 files changed, 34 insertions(+), 42 deletions(-) diff --git a/pythonnet.sln b/pythonnet.sln index 4fd6fa85b..c5afd66c3 100644 --- a/pythonnet.sln +++ b/pythonnet.sln @@ -32,38 +32,38 @@ Global ReleaseWinPY3|x86 = ReleaseWinPY3|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x64.ActiveCfg = DebugMono|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x64.Build.0 = DebugMono|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x86.ActiveCfg = DebugMono|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x86.Build.0 = DebugMono|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x64.ActiveCfg = DebugWin|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x64.Build.0 = DebugWin|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x86.ActiveCfg = DebugWin|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x86.Build.0 = DebugWin|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x64.Build.0 = DebugWinPY3|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x86.Build.0 = DebugWinPY3|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x64.ActiveCfg = ReleaseMono|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x64.Build.0 = ReleaseMono|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x86.ActiveCfg = ReleaseMono|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x86.Build.0 = ReleaseMono|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x64.ActiveCfg = ReleaseWin|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x64.Build.0 = ReleaseWin|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x86.ActiveCfg = ReleaseWin|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x86.Build.0 = ReleaseWin|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|Any CPU - {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|Any CPU + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x64.ActiveCfg = DebugMono|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x64.Build.0 = DebugMono|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x86.ActiveCfg = DebugMono|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMono|x86.Build.0 = DebugMono|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x64.ActiveCfg = DebugMonoPY3|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x64.Build.0 = DebugMonoPY3|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x86.ActiveCfg = DebugMonoPY3|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugMonoPY3|x86.Build.0 = DebugMonoPY3|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x64.ActiveCfg = DebugWin|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x64.Build.0 = DebugWin|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x86.ActiveCfg = DebugWin|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWin|x86.Build.0 = DebugWin|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x64.ActiveCfg = DebugWinPY3|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x64.Build.0 = DebugWinPY3|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x86.ActiveCfg = DebugWinPY3|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.DebugWinPY3|x86.Build.0 = DebugWinPY3|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x64.ActiveCfg = ReleaseMono|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x64.Build.0 = ReleaseMono|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x86.ActiveCfg = ReleaseMono|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMono|x86.Build.0 = ReleaseMono|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x64.ActiveCfg = ReleaseMonoPY3|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x64.Build.0 = ReleaseMonoPY3|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x86.ActiveCfg = ReleaseMonoPY3|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseMonoPY3|x86.Build.0 = ReleaseMonoPY3|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x64.ActiveCfg = ReleaseWinPY3|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x64.Build.0 = ReleaseWinPY3|x64 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x86.ActiveCfg = ReleaseWinPY3|x86 + {097B4AC0-74E9-4C58-BCF8-C69746EC8271}.ReleaseWinPY3|x86.Build.0 = ReleaseWinPY3|x86 {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMono|x64.ActiveCfg = DebugMono|x64 {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMono|x64.Build.0 = DebugMono|x64 {6F401A34-273B-450F-9A4C-13550BE0767B}.DebugMono|x86.ActiveCfg = DebugMono|x86 diff --git a/src/clrmodule/clrmodule.csproj b/src/clrmodule/clrmodule.csproj index d4bacdf05..6e5ff4966 100644 --- a/src/clrmodule/clrmodule.csproj +++ b/src/clrmodule/clrmodule.csproj @@ -1,4 +1,4 @@ - + Debug @@ -65,9 +65,6 @@ true pdbonly - - TRACE;DEBUG;PYTHON3;PYTHON35;UCS2 - ..\..\packages\UnmanagedExports.1.2.7\lib\net\RGiesecke.DllExport.Metadata.dll @@ -95,4 +92,4 @@ - \ No newline at end of file + diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj index e95c6a9bb..82825a626 100644 --- a/src/runtime/Python.Runtime.csproj +++ b/src/runtime/Python.Runtime.csproj @@ -71,7 +71,6 @@ PYTHON3;PYTHON36;UCS2;TRACE;DEBUG false full - TRACE;DEBUG;PYTHON3;PYTHON35;UCS2 diff --git a/src/runtime/managedtype.cs b/src/runtime/managedtype.cs index 0b95e85fd..562b2e5f8 100644 --- a/src/runtime/managedtype.cs +++ b/src/runtime/managedtype.cs @@ -34,10 +34,6 @@ internal static ManagedType GetManagedObject(IntPtr ob) IntPtr op = tp == ob ? Marshal.ReadIntPtr(tp, TypeOffset.magic()) : Marshal.ReadIntPtr(ob, ObjectOffset.magic(ob)); - if (op == IntPtr.Zero) - { - return null; - } var gc = (GCHandle)op; return (ManagedType)gc.Target; } From 16f05e51d894f230787af0e7f64ac29514ab46fd Mon Sep 17 00:00:00 2001 From: Denis Akhiyarov Date: Sun, 28 Jan 2018 12:11:13 -0600 Subject: [PATCH 317/324] fix for "handle is not inialized" crash on `clr.GetClrType(System.__class__)` --- src/runtime/managedtype.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/runtime/managedtype.cs b/src/runtime/managedtype.cs index 562b2e5f8..3191da949 100644 --- a/src/runtime/managedtype.cs +++ b/src/runtime/managedtype.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Runtime.InteropServices; namespace Python.Runtime @@ -34,6 +34,10 @@ internal static ManagedType GetManagedObject(IntPtr ob) IntPtr op = tp == ob ? Marshal.ReadIntPtr(tp, TypeOffset.magic()) : Marshal.ReadIntPtr(ob, ObjectOffset.magic(ob)); + if (op == IntPtr.Zero) + { + return null; + } var gc = (GCHandle)op; return (ManagedType)gc.Target; } From 19ec8224795cd7385de65fb5c7dc2cb81a85927e Mon Sep 17 00:00:00 2001 From: Denis Akhiyarov Date: Sun, 28 Jan 2018 12:21:27 -0600 Subject: [PATCH 318/324] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d408a8d1..380c6f6d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Fixed conversion of 'float' and 'double' values (#486) - Fixed 'clrmethod' for python 2 (#492) - Fixed double calling of constructor when deriving from .NET class (#495) +- Fixed `clr.GetClrType` when iterating over `System` members (#607) ## [2.3.0][] - 2017-03-11 From a2bbd65caed0f3687198e48c654a3c1683a3c76c Mon Sep 17 00:00:00 2001 From: bmigette <34238692+bmigette@users.noreply.github.com> Date: Tue, 6 Feb 2018 19:43:05 +0100 Subject: [PATCH 319/324] Update README.md Fixed readme `mod.func(args, keywordargname: keywordargvalue)` --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 89dcf2206..7e859481d 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ from System.Windows.Forms import Form a `using (Py.GIL()) {/* Your code here */}` block. - Import python modules using `dynamic mod = Py.Import("mod")`, then you can call functions as normal, eg `mod.func(args)`. -- Use `mod.func(args, Py.kw("keywordargname", keywordargvalue))` or `mod.func(args, keywordargname=keywordargvalue)` +- Use `mod.func(args, Py.kw("keywordargname", keywordargvalue))` or `mod.func(args, keywordargname: keywordargvalue)` to apply keyword arguments. - All python objects should be declared as `dynamic` type. - Mathematical operations involving python and literal/managed types must From e57882af6fe96a7b9b2758b91a58ff8525f15ce7 Mon Sep 17 00:00:00 2001 From: Ivan Cronyn Date: Wed, 7 Feb 2018 12:29:27 +0000 Subject: [PATCH 320/324] Update AUTHORS.md Added Ivan Cronyn --- AUTHORS.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/AUTHORS.md b/AUTHORS.md index 78bb25f9e..66e025039 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -23,7 +23,8 @@ - David Lechner ([@dlech](https://github.com/dlech)) - Dmitriy Se ([@dmitriyse](https://github.com/dmitriyse)) - He-chien Tsai ([@t3476](https://github.com/t3476)) -- Jeff Reback ([@jreback](https://github.com/jreback)) +-   Ivan Cronyn ([@cronan](https://github.com/cronan)) +-   Jeff Reback ([@jreback](https://github.com/jreback)) - Joe Frayne ([@jfrayne](https://github.com/jfrayne)) - John Burnett ([@johnburnett](https://github.com/johnburnett)) - Luke Stratman ([@lstratman](https://github.com/lstratman)) From c3486f1c0b2429c394d7583afdd60cbb12754a60 Mon Sep 17 00:00:00 2001 From: Denis Akhiyarov Date: Fri, 9 Feb 2018 22:58:53 -0600 Subject: [PATCH 321/324] Update TestPythonException.cs --- src/embed_tests/TestPythonException.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/embed_tests/TestPythonException.cs b/src/embed_tests/TestPythonException.cs index 0acdaa2fa..57a8d54af 100644 --- a/src/embed_tests/TestPythonException.cs +++ b/src/embed_tests/TestPythonException.cs @@ -51,7 +51,7 @@ public void TestPythonErrorTypeName() } catch (PythonException ex) { - Assert.AreEqual(ex.PythonTypeName, "ModuleNotFoundError"); + Assert.That(ex.PythonTypeName, Is.EqualTo("ModuleNotFoundError").Or.EqualTo("ImportError")); } } } From 0dbda70841b319feb30e7e51feb94fab59f131d9 Mon Sep 17 00:00:00 2001 From: Denis Akhiyarov Date: Fri, 9 Feb 2018 23:32:40 -0600 Subject: [PATCH 322/324] Update TestExample.cs https://github.com/pythonnet/pythonnet/pull/596#issuecomment-364626728 --- src/embed_tests/TestExample.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/embed_tests/TestExample.cs b/src/embed_tests/TestExample.cs index 0cf795f5d..671f9e33d 100644 --- a/src/embed_tests/TestExample.cs +++ b/src/embed_tests/TestExample.cs @@ -47,7 +47,7 @@ public void TestReadme() dynamic b = np.array(new List { 6, 5, 4 }, Py.kw("dtype", np.int32)); Assert.AreEqual("int32", b.dtype.ToString()); - Assert.AreEqual("[ 6. 10. 12.]", (a * b).ToString()); + Assert.AreEqual("[ 6. 10. 12.]", (a * b).ToString().Replace(" ", " ")); } } } From adc1240c306f0c969c329e39042717b89bcf36c0 Mon Sep 17 00:00:00 2001 From: "Cronyn, Ivan (London)" Date: Fri, 16 Feb 2018 10:37:22 +0000 Subject: [PATCH 323/324] Fixes lock recursion bug in assembly loading --- CHANGELOG.md | 1 + src/runtime/assemblymanager.cs | 106 ++------------------------------- src/tests/test_module.py | 6 ++ 3 files changed, 11 insertions(+), 102 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 380c6f6d3..3d0dcd6de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Fixed 'clrmethod' for python 2 (#492) - Fixed double calling of constructor when deriving from .NET class (#495) - Fixed `clr.GetClrType` when iterating over `System` members (#607) +- Fixed `LockRecursionException` when loading assemblies (#627) ## [2.3.0][] - 2017-03-11 diff --git a/src/runtime/assemblymanager.cs b/src/runtime/assemblymanager.cs index 06a4449a2..d63930a58 100644 --- a/src/runtime/assemblymanager.cs +++ b/src/runtime/assemblymanager.cs @@ -26,7 +26,7 @@ internal class AssemblyManager private static Dictionary probed; // modified from event handlers below, potentially triggered from different .NET threads - private static AssemblyList assemblies; + private static ConcurrentQueue assemblies; internal static List pypath; private AssemblyManager() @@ -43,7 +43,7 @@ internal static void Initialize() namespaces = new ConcurrentDictionary>(); probed = new Dictionary(32); //generics = new Dictionary>(); - assemblies = new AssemblyList(16); + assemblies = new ConcurrentQueue(); pypath = new List(16); AppDomain domain = AppDomain.CurrentDomain; @@ -60,7 +60,7 @@ internal static void Initialize() try { ScanAssembly(a); - assemblies.Add(a); + assemblies.Enqueue(a); } catch (Exception ex) { @@ -91,7 +91,7 @@ internal static void Shutdown() private static void AssemblyLoadHandler(object ob, AssemblyLoadEventArgs args) { Assembly assembly = args.LoadedAssembly; - assemblies.Add(assembly); + assemblies.Enqueue(assembly); ScanAssembly(assembly); } @@ -461,103 +461,5 @@ public static Type LookupType(string qname) } return null; } - - /// - /// Wrapper around List<Assembly> for thread safe access - /// - private class AssemblyList : IEnumerable - { - private readonly List _list; - private readonly ReaderWriterLockSlim _lock; - - public AssemblyList(int capacity) - { - _list = new List(capacity); - _lock = new ReaderWriterLockSlim(); - } - - public int Count - { - get - { - _lock.EnterReadLock(); - try - { - return _list.Count; - } - finally - { - _lock.ExitReadLock(); - } - } - } - - public void Add(Assembly assembly) - { - _lock.EnterWriteLock(); - try - { - _list.Add(assembly); - } - finally - { - _lock.ExitWriteLock(); - } - } - - public IEnumerator GetEnumerator() - { - return ((IEnumerable)this).GetEnumerator(); - } - - /// - /// Enumerator wrapping around 's enumerator. - /// Acquires and releases a read lock on during enumeration - /// - private class Enumerator : IEnumerator - { - private readonly AssemblyList _assemblyList; - - private readonly IEnumerator _listEnumerator; - - public Enumerator(AssemblyList assemblyList) - { - _assemblyList = assemblyList; - _assemblyList._lock.EnterReadLock(); - _listEnumerator = _assemblyList._list.GetEnumerator(); - } - - public void Dispose() - { - _listEnumerator.Dispose(); - _assemblyList._lock.ExitReadLock(); - } - - public bool MoveNext() - { - return _listEnumerator.MoveNext(); - } - - public void Reset() - { - _listEnumerator.Reset(); - } - - public Assembly Current - { - get { return _listEnumerator.Current; } - } - - object IEnumerator.Current - { - get { return Current; } - } - } - - IEnumerator IEnumerable.GetEnumerator() - { - return new Enumerator(this); - } - } } } diff --git a/src/tests/test_module.py b/src/tests/test_module.py index e02aa6e01..62d79b9ab 100644 --- a/src/tests/test_module.py +++ b/src/tests/test_module.py @@ -387,3 +387,9 @@ def test_assembly_load_thread_safety(): from System.Collections.Generic import Dictionary _ = Dictionary[Guid, DateTime]() ModuleTest.JoinThreads() + +def test_assembly_load_recursion_bug(): + """Test fix for recursion bug documented in #627""" + from System.Configuration import ConfigurationManager + content = dir(ConfigurationManager) + assert len(content) > 5, content From f55ee1e3b489f3243ea98764a61ae67d5592bf1b Mon Sep 17 00:00:00 2001 From: Callum Noble Date: Tue, 19 Dec 2017 16:30:04 -0800 Subject: [PATCH 324/324] Fixed errors breaking .NET Remoting on method invoke (#276) --- AUTHORS.md | 1 + CHANGELOG.md | 1 + src/runtime/converter.cs | 8 ++++++++ 3 files changed, 10 insertions(+) diff --git a/AUTHORS.md b/AUTHORS.md index 66e025039..55aa69d11 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -14,6 +14,7 @@ - Arvid JB ([@ArvidJB](https://github.com/ArvidJB)) - Bradley Friedman ([@leith-bartrich](https://github.com/leith-bartrich)) +- Callum Noble ([@callumnoble](https://github.com/callumnoble)) - Christian Heimes ([@tiran](https://github.com/tiran)) - Christoph Gohlke ([@cgohlke](https://github.com/cgohlke)) - Christopher Pow ([@christopherpow](https://github.com/christopherpow)) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d0dcd6de..96461ca68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][]. - Fixed double calling of constructor when deriving from .NET class (#495) - Fixed `clr.GetClrType` when iterating over `System` members (#607) - Fixed `LockRecursionException` when loading assemblies (#627) +- Fixed errors breaking .NET Remoting on method invoke (#276) ## [2.3.0][] - 2017-03-11 diff --git a/src/runtime/converter.cs b/src/runtime/converter.cs index 5179c849b..13498e3dc 100644 --- a/src/runtime/converter.cs +++ b/src/runtime/converter.cs @@ -155,7 +155,15 @@ internal static IntPtr ToPython(object value, Type type) var pyderived = value as IPythonDerivedType; if (null != pyderived) { + #if NETSTANDARD return ClassDerivedObject.ToPython(pyderived); + #else + // if object is remote don't do this + if (!System.Runtime.Remoting.RemotingServices.IsTransparentProxy(pyderived)) + { + return ClassDerivedObject.ToPython(pyderived); + } + #endif } // hmm - from Python, we almost never care what the declared