From 21e10945a06bcf3e15d9a72f64cf832147dbaab2 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Wed, 2 Feb 2022 11:25:28 -0500 Subject: [PATCH 1/6] ci: move centos 8 to stream (#3675) --- .github/workflows/ci.yml | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 38b85aeef..050c525ce 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -600,11 +600,11 @@ jobs: fail-fast: false matrix: centos: - - 7 # GCC 4.8 - - 8 + - centos7 # GCC 4.8 + - stream8 name: "🐍 3 • CentOS ${{ matrix.centos }} • x64" - container: "centos:${{ matrix.centos }}" + container: "quay.io/centos/centos:${{ matrix.centos }}" steps: - uses: actions/checkout@v2 @@ -619,22 +619,11 @@ jobs: run: | python3 -m pip install cmake -r tests/requirements.txt - - name: VAR_BUILD_TYPE 7 - if: matrix.centos == 7 - run: echo MinSizeRel > VAR_BUILD_TYPE - - # Using Release to avoid segfault that appeared around 2021-06-04, - # apparently when the gcc version changed from 8.3 to 8.4. - - name: VAR_BUILD_TYPE 8 - if: matrix.centos == 8 - run: echo Release > VAR_BUILD_TYPE - - # Temporally disabling EIGEN due to SSL issue in CentOS 7 - name: Configure shell: bash run: > cmake -S . -B build - -DCMAKE_BUILD_TYPE=$(cat VAR_BUILD_TYPE) + -DCMAKE_BUILD_TYPE=MinSizeRel -DPYBIND11_WERROR=ON -DDOWNLOAD_CATCH=ON -DDOWNLOAD_EIGEN=ON From 0f6ad9105ca8376863e10b0eaf1cbc1a5d561038 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Wed, 2 Feb 2022 16:08:44 -0500 Subject: [PATCH 2/6] docs: update changelog for 2.9.1 (#3670) * docs: update changelog for 2.9.1 * Update changelog.rst * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update changelog.rst Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/changelog.rst | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index c05e7d3c5..16bf3aa3f 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -6,6 +6,59 @@ Changelog Starting with version 1.8.0, pybind11 releases use a `semantic versioning `_ policy. +Version 2.9.1 (Feb 2, 2022) +--------------------------- + +Changes: + +* If possible, attach Python exception with ``py::raise_from`` to ``TypeError`` + when casting from C++ to Python. This will give additional info if Python + exceptions occur in the caster. Adds a test case of trying to convert a set + from C++ to Python when the hash function is not defined in Python. + `#3605 `_ + +* Add a mapping of C++11 nested exceptions to their Python exception + equivalent using ``py::raise_from``. This attaches the nested exceptions in + Python using the ``__cause__`` field. + `#3608 `_ + +* Propagate Python exception traceback using ``raise_from`` if a pybind11 + function runs out of overloads. + `#3671 `_ + +* ``py::multiple_inheritance`` is now only needed when C++ bases are hidden + from pybind11. + `#3650 `_ and + `#3659 `_ + + +Bug fixes: + +* Remove a boolean cast in ``numpy.h`` that causes MSVC C4800 warnings when + compiling against Python 3.10 or newer. + `#3669 `_ + +* Render ``py::bool_`` and ``py::float_`` as ``bool`` and ``float`` + respectively. + `#3622 `_ + +Build system improvements: + +* Fix CMake extension suffix computation on Python 3.10+. + `#3663 `_ + +* Allow ``CMAKE_ARGS`` to override CMake args in pybind11's own ``setup.py``. + `#3577 `_ + +* Remove a few deprecated c-headers. + `#3610 `_ + +* More uniform handling of test targets. + `#3590 `_ + +* Add clang-tidy readability check to catch potentially swapped function args. + `#3611 `_ + Version 2.9.0 (Dec 28, 2021) ---------------------------- From 3899dc65b91f189f9ac03f2f9ec7d9c25b76134b Mon Sep 17 00:00:00 2001 From: "Ralf W. Grosse-Kunstleve" Date: Wed, 2 Feb 2022 13:16:44 -0800 Subject: [PATCH 3/6] Documenting missing unit test coverage. (#3673) --- include/pybind11/pybind11.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h index ede35e186..7aa93bb5a 100644 --- a/include/pybind11/pybind11.h +++ b/include/pybind11/pybind11.h @@ -991,6 +991,7 @@ protected: #if PY_VERSION_HEX >= 0x03030000 // Attach additional error info to the exception if supported if (PyErr_Occurred()) { + // #HelpAppreciated: unit test coverage for this branch. raise_from(PyExc_TypeError, msg.c_str()); return nullptr; } From ffa346860b306c9bbfb341aed9c14c067751feb8 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Wed, 2 Feb 2022 17:34:15 -0500 Subject: [PATCH 4/6] chore: bump to 2.9.1 --- include/pybind11/detail/common.h | 4 ++-- pybind11/_version.py | 2 +- setup.cfg | 9 ++++++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/include/pybind11/detail/common.h b/include/pybind11/detail/common.h index b3513da83..5c59b4141 100644 --- a/include/pybind11/detail/common.h +++ b/include/pybind11/detail/common.h @@ -11,11 +11,11 @@ #define PYBIND11_VERSION_MAJOR 2 #define PYBIND11_VERSION_MINOR 9 -#define PYBIND11_VERSION_PATCH 0 +#define PYBIND11_VERSION_PATCH 1 // Similar to Python's convention: https://docs.python.org/3/c-api/apiabiversion.html // Additional convention: 0xD = dev -#define PYBIND11_VERSION_HEX 0x02090000 +#define PYBIND11_VERSION_HEX 0x02090100 #define PYBIND11_NAMESPACE_BEGIN(name) namespace name { #define PYBIND11_NAMESPACE_END(name) } diff --git a/pybind11/_version.py b/pybind11/_version.py index 6627d4c7e..9d39b77a4 100644 --- a/pybind11/_version.py +++ b/pybind11/_version.py @@ -8,5 +8,5 @@ def _to_int(s): return s -__version__ = "2.9.0" +__version__ = "2.9.1" version_info = tuple(_to_int(s) for s in __version__.split(".")) diff --git a/setup.cfg b/setup.cfg index 95963d2f8..317c44bbf 100644 --- a/setup.cfg +++ b/setup.cfg @@ -31,8 +31,15 @@ keywords = C++11 Python bindings +project_urls = + Documentation = https://pybind11.readthedocs.io/ + Bug Tracker = https://github.com/pybind/pybind11/issues + Discussions = https://github.com/pybind/pybind11/discussions + Changelog = https://pybind11.readthedocs.io/en/latest/changelog.html + Chat = https://gitter.im/pybind/Lobby + [options] -python_requires = >=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4 +python_requires = >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.* zip_safe = False [bdist_wheel] From 1d3b04e805c8a7dd4d8b68e2a311c75a66cae1d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Thu, 3 Feb 2022 18:29:46 +0100 Subject: [PATCH 5/6] test: Strip whitespace when comparing numpy dtypes for 1.22 compat (#3682) * test: Strip whitespace when comparing numpy dtypes for 1.22 compat Strip whitespace when comparing numpy dtype str() in order to preserve test compatibility with both numpy 1.22 and older versions whose output differ by whitespace. Fixes #3680 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- tests/test_numpy_dtypes.py | 44 +++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/tests/test_numpy_dtypes.py b/tests/test_numpy_dtypes.py index 06e578329..0098eccb8 100644 --- a/tests/test_numpy_dtypes.py +++ b/tests/test_numpy_dtypes.py @@ -32,8 +32,8 @@ def dt_fmt(): e = "<" if byteorder == "little" else ">" return ( "{{'names':['bool_','uint_','float_','ldbl_']," - " 'formats':['?','" + e + "u4','" + e + "f4','" + e + "f{}']," - " 'offsets':[0,4,8,{}], 'itemsize':{}}}" + "'formats':['?','" + e + "u4','" + e + "f4','" + e + "f{}']," + "'offsets':[0,4,8,{}],'itemsize':{}}}" ) @@ -46,7 +46,7 @@ def simple_dtype_fmt(): def packed_dtype_fmt(): from sys import byteorder - return "[('bool_', '?'), ('uint_', '{e}u4'), ('float_', '{e}f4'), ('ldbl_', '{e}f{}')]".format( + return "[('bool_','?'),('uint_','{e}u4'),('float_','{e}f4'),('ldbl_','{e}f{}')]".format( np.dtype("longdouble").itemsize, e="<" if byteorder == "little" else ">" ) @@ -77,7 +77,7 @@ def partial_nested_fmt(): partial_size = partial_ld_off + ld.itemsize partial_end_padding = partial_size % np.dtype("uint64").alignment partial_nested_size = partial_nested_off * 2 + partial_size + partial_end_padding - return "{{'names':['a'], 'formats':[{}], 'offsets':[{}], 'itemsize':{}}}".format( + return "{{'names':['a'],'formats':[{}],'offsets':[{}],'itemsize':{}}}".format( partial_dtype_fmt(), partial_nested_off, partial_nested_size ) @@ -123,25 +123,25 @@ def test_dtype(simple_dtype): e = "<" if byteorder == "little" else ">" - assert m.print_dtypes() == [ + assert [x.replace(" ", "") for x in m.print_dtypes()] == [ simple_dtype_fmt(), packed_dtype_fmt(), - "[('a', {}), ('b', {})]".format(simple_dtype_fmt(), packed_dtype_fmt()), + "[('a',{}),('b',{})]".format(simple_dtype_fmt(), packed_dtype_fmt()), partial_dtype_fmt(), partial_nested_fmt(), - "[('a', 'S3'), ('b', 'S3')]", + "[('a','S3'),('b','S3')]", ( - "{{'names':['a','b','c','d'], " - + "'formats':[('S4', (3,)),('" + "{{'names':['a','b','c','d']," + + "'formats':[('S4',(3,)),('" + e - + "i4', (2,)),('u1', (3,)),('" + + "i4',(2,)),('u1',(3,)),('" + e - + "f4', (4, 2))], " - + "'offsets':[0,12,20,24], 'itemsize':56}}" + + "f4',(4,2))]," + + "'offsets':[0,12,20,24],'itemsize':56}}" ).format(e=e), - "[('e1', '" + e + "i8'), ('e2', 'u1')]", - "[('x', 'i1'), ('y', '" + e + "u8')]", - "[('cflt', '" + e + "c8'), ('cdbl', '" + e + "c16')]", + "[('e1','" + e + "i8'),('e2','u1')]", + "[('x','i1'),('y','" + e + "u8')]", + "[('cflt','" + e + "c8'),('cdbl','" + e + "c16')]", ] d1 = np.dtype( @@ -238,7 +238,7 @@ def test_recarray(simple_dtype, packed_dtype): ] arr = m.create_rec_partial(3) - assert str(arr.dtype) == partial_dtype_fmt() + assert str(arr.dtype).replace(" ", "") == partial_dtype_fmt() partial_dtype = arr.dtype assert "" not in arr.dtype.fields assert partial_dtype.itemsize > simple_dtype.itemsize @@ -246,7 +246,7 @@ def test_recarray(simple_dtype, packed_dtype): assert_equal(arr, elements, packed_dtype) arr = m.create_rec_partial_nested(3) - assert str(arr.dtype) == partial_nested_fmt() + assert str(arr.dtype).replace(" ", "") == partial_nested_fmt() assert "" not in arr.dtype.fields assert "" not in arr.dtype.fields["a"][0].fields assert arr.dtype.itemsize > partial_dtype.itemsize @@ -285,12 +285,12 @@ def test_array_array(): e = "<" if byteorder == "little" else ">" arr = m.create_array_array(3) - assert str(arr.dtype) == ( - "{{'names':['a','b','c','d'], " - + "'formats':[('S4', (3,)),('" + assert str(arr.dtype).replace(" ", "") == ( + "{{'names':['a','b','c','d']," + + "'formats':[('S4',(3,)),('" + e - + "i4', (2,)),('u1', (3,)),('{e}f4', (4, 2))], " - + "'offsets':[0,12,20,24], 'itemsize':56}}" + + "i4',(2,)),('u1',(3,)),('{e}f4',(4,2))]," + + "'offsets':[0,12,20,24],'itemsize':56}}" ).format(e=e) assert m.print_array_array(arr) == [ "a={{A,B,C,D},{K,L,M,N},{U,V,W,X}},b={0,1}," From 36813cfa1228f9414aac669d239a0d3255fc25c3 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Thu, 3 Feb 2022 12:44:02 -0500 Subject: [PATCH 6/6] chore: back to work --- docs/changelog.rst | 6 ++++++ include/pybind11/detail/common.h | 6 +++--- pybind11/_version.py | 2 +- setup.py | 7 +++++-- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 16bf3aa3f..63c7f41d8 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -6,6 +6,12 @@ Changelog Starting with version 1.8.0, pybind11 releases use a `semantic versioning `_ policy. +IN DEVELOPMENT +-------------- + +Changes will be added here periodically. + + Version 2.9.1 (Feb 2, 2022) --------------------------- diff --git a/include/pybind11/detail/common.h b/include/pybind11/detail/common.h index 5c59b4141..d9f838236 100644 --- a/include/pybind11/detail/common.h +++ b/include/pybind11/detail/common.h @@ -10,12 +10,12 @@ #pragma once #define PYBIND11_VERSION_MAJOR 2 -#define PYBIND11_VERSION_MINOR 9 -#define PYBIND11_VERSION_PATCH 1 +#define PYBIND11_VERSION_MINOR 10 +#define PYBIND11_VERSION_PATCH 0.dev1 // Similar to Python's convention: https://docs.python.org/3/c-api/apiabiversion.html // Additional convention: 0xD = dev -#define PYBIND11_VERSION_HEX 0x02090100 +#define PYBIND11_VERSION_HEX 0x020A00D1 #define PYBIND11_NAMESPACE_BEGIN(name) namespace name { #define PYBIND11_NAMESPACE_END(name) } diff --git a/pybind11/_version.py b/pybind11/_version.py index 9d39b77a4..7519ac903 100644 --- a/pybind11/_version.py +++ b/pybind11/_version.py @@ -8,5 +8,5 @@ def _to_int(s): return s -__version__ = "2.9.1" +__version__ = "2.10.0.dev1" version_info = tuple(_to_int(s) for s in __version__.split(".")) diff --git a/setup.py b/setup.py index 0e7348982..f83837919 100644 --- a/setup.py +++ b/setup.py @@ -45,8 +45,11 @@ def build_expected_version_hex(matches): if serial is None: msg = 'Invalid PYBIND11_VERSION_PATCH: "{}"'.format(patch_level_serial) raise RuntimeError(msg) - return "0x{:02x}{:02x}{:02x}{}{:x}".format( - major, minor, patch, level[:1].upper(), serial + return ( + "0x" + + "{:02x}{:02x}{:02x}{}{:x}".format( + major, minor, patch, level[:1], serial + ).upper() )