diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1fd5139e9c..5c89064511 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1153,7 +1153,7 @@ jobs: uses: jwlawson/actions-setup-cmake@v2.0 - name: Install ninja-build tool - uses: seanmiddleditch/gha-setup-ninja@v5 + uses: seanmiddleditch/gha-setup-ninja@v6 - name: Run pip installs run: | diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c61eb08207..fbecbc0aef 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,14 +25,14 @@ repos: # Clang format the codebase automatically - repo: https://github.com/pre-commit/mirrors-clang-format - rev: "v19.1.6" + rev: "v19.1.7" hooks: - id: clang-format types_or: [c++, c, cuda] # Ruff, the Python auto-correcting linter/formatter written in Rust - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.8.6 + rev: v0.9.4 hooks: - id: ruff args: ["--fix", "--show-fixes"] @@ -121,7 +121,7 @@ repos: # Use tools/codespell_ignore_lines_from_errors.py # to rebuild .codespell-ignore-lines - repo: https://github.com/codespell-project/codespell - rev: "v2.3.0" + rev: "v2.4.1" hooks: - id: codespell exclude: ".supp$" @@ -144,14 +144,14 @@ repos: # PyLint has native support - not always usable, but works for us - repo: https://github.com/PyCQA/pylint - rev: "v3.3.3" + rev: "v3.3.4" hooks: - id: pylint files: ^pybind11 # Check schemas on some of our YAML files - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.30.0 + rev: 0.31.1 hooks: - id: check-readthedocs - id: check-github-workflows diff --git a/include/pybind11/detail/class.h b/include/pybind11/detail/class.h index f39a34f05d..f53fdf74ce 100644 --- a/include/pybind11/detail/class.h +++ b/include/pybind11/detail/class.h @@ -576,9 +576,9 @@ extern "C" inline int pybind11_clear(PyObject *self) { inline void enable_dynamic_attributes(PyHeapTypeObject *heap_type) { auto *type = &heap_type->ht_type; type->tp_flags |= Py_TPFLAGS_HAVE_GC; -#if PY_VERSION_HEX < 0x030B0000 - type->tp_dictoffset = type->tp_basicsize; // place dict at the end - type->tp_basicsize += (ssize_t) sizeof(PyObject *); // and allocate enough space for it +#if PY_VERSION_HEX < 0x030B0000 || defined(PYPY_VERSION) // For PyPy see PR #5508 + type->tp_dictoffset = type->tp_basicsize; // place dict at the end + type->tp_basicsize += (ssize_t) sizeof(PyObject *); // and allocate enough space for it #else type->tp_flags |= Py_TPFLAGS_MANAGED_DICT; #endif diff --git a/tests/conftest.py b/tests/conftest.py index 8eb803d2f3..a018a3f795 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -212,9 +212,9 @@ def pytest_configure(): def pytest_report_header(config): del config # Unused. - assert ( - pybind11_tests.compiler_info is not None - ), "Please update pybind11_tests.cpp if this assert fails." + assert pybind11_tests.compiler_info is not None, ( + "Please update pybind11_tests.cpp if this assert fails." + ) return ( "C++ Info:" f" {pybind11_tests.compiler_info}" diff --git a/tests/test_eigen_matrix.py b/tests/test_eigen_matrix.py index 5093ce7d88..47efc9d8f7 100644 --- a/tests/test_eigen_matrix.py +++ b/tests/test_eigen_matrix.py @@ -244,9 +244,9 @@ def test_eigen_ref_to_python(): chols = [m.cholesky1, m.cholesky2, m.cholesky3, m.cholesky4] for i, chol in enumerate(chols, start=1): mymat = chol(np.array([[1.0, 2, 4], [2, 13, 23], [4, 23, 77]])) - assert np.all( - mymat == np.array([[1, 0, 0], [2, 3, 0], [4, 5, 6]]) - ), f"cholesky{i}" + assert np.all(mymat == np.array([[1, 0, 0], [2, 3, 0], [4, 5, 6]])), ( + f"cholesky{i}" + ) def assign_both(a1, a2, r, c, v): diff --git a/tests/test_gil_scoped.py b/tests/test_gil_scoped.py index 257e66612f..2db771a508 100644 --- a/tests/test_gil_scoped.py +++ b/tests/test_gil_scoped.py @@ -108,6 +108,10 @@ def test_nested_acquire(): @pytest.mark.skipif(sys.platform.startswith("emscripten"), reason="Requires threads") +@pytest.mark.skipif( + env.GRAALPY and sys.platform == "darwin", + reason="Transiently crashes on GraalPy on OS X", +) def test_multi_acquire_release_cross_module(): for bits in range(16 * 8): internals_ids = m.test_multi_acquire_release_cross_module(bits) diff --git a/tests/test_pytypes.py b/tests/test_pytypes.py index 469137cc3c..18932311e7 100644 --- a/tests/test_pytypes.py +++ b/tests/test_pytypes.py @@ -52,10 +52,10 @@ def test_from_iterable(pytype, from_iter_func): def test_iterable(doc): assert doc(m.get_iterable) == "get_iterable() -> Iterable" - lins = [1, 2, 3] - i = m.get_first_item_from_iterable(lins) + lst = [1, 2, 3] + i = m.get_first_item_from_iterable(lst) assert i == 1 - i = m.get_second_item_from_iterable(lins) + i = m.get_second_item_from_iterable(lst) assert i == 2 @@ -67,13 +67,13 @@ def test_list(capture, doc): assert m.list_no_args() == [] assert m.list_ssize_t() == [] assert m.list_size_t() == [] - lins = [1, 2] - m.list_insert_ssize_t(lins) - assert lins == [1, 83, 2] - m.list_insert_size_t(lins) - assert lins == [1, 83, 2, 57] - m.list_clear(lins) - assert lins == [] + lst = [1, 2] + m.list_insert_ssize_t(lst) + assert lst == [1, 83, 2] + m.list_insert_size_t(lst) + assert lst == [1, 83, 2, 57] + m.list_clear(lst) + assert lst == [] with capture: lst = m.get_list() diff --git a/tests/test_smart_ptr.py b/tests/test_smart_ptr.py index 9729004ffc..ab8a1ce62e 100644 --- a/tests/test_smart_ptr.py +++ b/tests/test_smart_ptr.py @@ -313,9 +313,8 @@ def test_smart_ptr_from_default(): instance = m.HeldByDefaultHolder() with pytest.raises(RuntimeError) as excinfo: m.HeldByDefaultHolder.load_shared_ptr(instance) - assert ( - "Unable to load a custom holder type from a " - "default-holder instance" in str(excinfo.value) + assert "Unable to load a custom holder type from a default-holder instance" in str( + excinfo.value )