diff --git a/.travis.yml b/.travis.yml
index 900e207a7..d059bdcde 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -22,6 +22,7 @@ matrix:
- dotnet-hostfxr-2.0.0
- dotnet-runtime-2.0.0
- dotnet-sdk-2.0.0
+
- python: 3.4
env: *xplat-env
addons: *xplat-addons
@@ -33,9 +34,24 @@ matrix:
- python: 3.6
env: *xplat-env
addons: *xplat-addons
- - python: "3.7-dev"
+
+ - python: 3.7
env: *xplat-env
- addons: *xplat-addons
+ dist: xenial
+ sudo: true
+ addons: &xplat-addons-xenial
+ apt:
+ sources:
+ - sourceline: deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main
+ key_url: https://packages.microsoft.com/keys/microsoft.asc
+ - sourceline: deb https://download.mono-project.com/repo/ubuntu stable-xenial 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
@@ -52,15 +68,18 @@ matrix:
- python: 3.6
env: *classic-env
- - python: "3.7-dev"
- env: *classic-env
-
- allow_failures:
- - python: "3.7-dev"
- env: *xplat-env
-
- - python: "3.7-dev"
+ - python: 3.7
env: *classic-env
+ dist: xenial
+ sudo: true
+ addons:
+ apt:
+ sources:
+ - sourceline: deb http://download.mono-project.com/repo/ubuntu xenial main
+ key_url: http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xA6A19B38D3D831EF
+ packages:
+ - mono-devel
+ - ca-certificates-mono
env:
global:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index aac38988b..4d5e52c92 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,7 @@ This document follows the conventions laid out in [Keep a CHANGELOG][].
- Implemented GetDynamicMemberNames() for PyObject to allow dynamic object members to be visible in the debugger ([#443][i443])([#690][p690])
- Incorporated reference-style links to issues and pull requests in the CHANGELOG ([#608][i608])
- Added detailed comments about aproaches and dangers to handle multi-app-domains ([#625][p625])
+- Python 3.7 support, builds and testing added. Defaults changed from Python 3.6 to 3.7 ([#698][p698])
### Changed
diff --git a/appveyor.yml b/appveyor.yml
index b371a2696..ce345cbf8 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -23,10 +23,13 @@ environment:
BUILD_OPTS: --xplat
- PYTHON_VERSION: 3.6
BUILD_OPTS: --xplat
+ - PYTHON_VERSION: 3.7
+ BUILD_OPTS: --xplat
- PYTHON_VERSION: 2.7
- PYTHON_VERSION: 3.4
- PYTHON_VERSION: 3.5
- PYTHON_VERSION: 3.6
+ - PYTHON_VERSION: 3.7
matrix:
allow_failures:
diff --git a/setup.py b/setup.py
index 183ba4c3a..0c28a80f5 100644
--- a/setup.py
+++ b/setup.py
@@ -22,7 +22,7 @@
# 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
+VERBOSITY = "normal" # quiet, minimal, normal, detailed, diagnostic
is_64bits = sys.maxsize > 2**32
DEVTOOLS = "MsDev" if sys.platform == "win32" else "Mono"
@@ -516,10 +516,10 @@ def run(self):
'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',
+ 'Programming Language :: Python :: 3.7',
'Operating System :: Microsoft :: Windows',
'Operating System :: POSIX :: Linux',
'Operating System :: MacOS :: MacOS X',
diff --git a/src/runtime/Python.Runtime.15.csproj b/src/runtime/Python.Runtime.15.csproj
index cfde0a127..46a58ca33 100644
--- a/src/runtime/Python.Runtime.15.csproj
+++ b/src/runtime/Python.Runtime.15.csproj
@@ -35,7 +35,7 @@
$(PYTHONNET_PY2_VERSION)
PYTHON27
$(PYTHONNET_PY3_VERSION)
- PYTHON36
+ PYTHON37
$(PYTHONNET_WIN_DEFINE_CONSTANTS)
UCS2
$(PYTHONNET_MONO_DEFINE_CONSTANTS)
diff --git a/src/runtime/Python.Runtime.csproj b/src/runtime/Python.Runtime.csproj
index 1fea78082..d839272dc 100644
--- a/src/runtime/Python.Runtime.csproj
+++ b/src/runtime/Python.Runtime.csproj
@@ -34,7 +34,7 @@
pdbonly
- PYTHON3;PYTHON36;UCS4
+ PYTHON3;PYTHON37;UCS4
true
pdbonly
@@ -46,7 +46,7 @@
true
- PYTHON3;PYTHON36;UCS4;TRACE;DEBUG
+ PYTHON3;PYTHON37;UCS4;TRACE;DEBUG
false
full
@@ -56,7 +56,7 @@
pdbonly
- PYTHON3;PYTHON36;UCS2
+ PYTHON3;PYTHON37;UCS2
true
pdbonly
@@ -68,7 +68,7 @@
true
- PYTHON3;PYTHON36;UCS2;TRACE;DEBUG
+ PYTHON3;PYTHON37;UCS2;TRACE;DEBUG
false
full
@@ -166,4 +166,4 @@
-
\ No newline at end of file
+
diff --git a/src/runtime/interop37.cs b/src/runtime/interop37.cs
new file mode 100644
index 000000000..d5fc76ad3
--- /dev/null
+++ b/src/runtime/interop37.cs
@@ -0,0 +1,149 @@
+// Auto-generated by geninterop.py.
+// DO NOT MODIFIY BY HAND.
+
+
+#if PYTHON37
+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_as_async = 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 tp_finalize = 0;
+ public static int am_await = 0;
+ public static int am_aiter = 0;
+ public static int am_anext = 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 nb_matrix_multiply = 0;
+ public static int nb_inplace_matrix_multiply = 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;
+ public static int qualname = 0;
+ public static int ht_cached_keys = 0;
+
+ /* here are optional user slots, followed by the members. */
+ public static int members = 0;
+ }
+}
+
+#endif
diff --git a/src/tests/test_exceptions.py b/src/tests/test_exceptions.py
index c697290ee..08b00d77d 100644
--- a/src/tests/test_exceptions.py
+++ b/src/tests/test_exceptions.py
@@ -289,7 +289,8 @@ def test_python_compat_of_managed_exceptions():
assert e.args == (msg,)
assert isinstance(e.args, tuple)
if PY3:
- assert repr(e) == "OverflowException('Simple message',)"
+ strexp = "OverflowException('Simple message"
+ assert repr(e)[:len(strexp)] == strexp
elif PY2:
assert repr(e) == "OverflowException(u'Simple message',)"
diff --git a/tools/geninterop/fake_libc_include/crypt.h b/tools/geninterop/fake_libc_include/crypt.h
new file mode 100644
index 000000000..3b16d481f
--- /dev/null
+++ b/tools/geninterop/fake_libc_include/crypt.h
@@ -0,0 +1 @@
+#include "features.h"
\ No newline at end of file
diff --git a/tools/geninterop/geninterop.py b/tools/geninterop/geninterop.py
index bf5fdb96b..f8ef8e561 100644
--- a/tools/geninterop/geninterop.py
+++ b/tools/geninterop/geninterop.py
@@ -173,7 +173,8 @@ def preprocess_python_headers():
"-D", "__attribute__(x)=",
"-D", "__inline__=inline",
"-D", "__asm__=;#pragma asm",
- "-D", "__int64=long long"
+ "-D", "__int64=long long",
+ "-D", "_POSIX_THREADS"
]
if hasattr(sys, "abiflags"):
@@ -185,7 +186,7 @@ def preprocess_python_headers():
defines.extend(("-D", "PYTHON_WITH_WIDE_UNICODE"))
python_h = os.path.join(include_py, "Python.h")
- cmd = ["clang", "-I"] + include_dirs + defines + ["-E", python_h]
+ cmd = ["clang", "-pthread", "-I"] + include_dirs + defines + ["-E", python_h]
# normalize as the parser doesn't like windows line endings.
lines = []