Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-kiwisolver for 
openSUSE:Factory checked in at 2025-01-15 17:42:22
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-kiwisolver (Old)
 and      /work/SRC/openSUSE:Factory/.python-kiwisolver.new.1881 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-kiwisolver"

Wed Jan 15 17:42:22 2025 rev:12 rq:1237808 version:1.4.8

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-kiwisolver/python-kiwisolver.changes      
2024-10-25 19:18:43.788341273 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-kiwisolver.new.1881/python-kiwisolver.changes
    2025-01-15 17:42:29.854936692 +0100
@@ -1,0 +2,8 @@
+Tue Jan 14 10:16:44 UTC 2025 - John Paul Adrian Glaubitz 
<adrian.glaub...@suse.com>
+
+- Update to 1.4.8
+  * Drop support for Python 3.8 and 3.9
+  * Do not link to MSVCP on Windows and drop windows 32 bits support
+  * Add support for free-threaded builds on Python 3.13
+
+-------------------------------------------------------------------

Old:
----
  kiwisolver-1.4.7.tar.gz

New:
----
  kiwisolver-1.4.8.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-kiwisolver.spec ++++++
--- /var/tmp/diff_new_pack.IUOXZK/_old  2025-01-15 17:42:30.518964216 +0100
+++ /var/tmp/diff_new_pack.IUOXZK/_new  2025-01-15 17:42:30.518964216 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-kiwisolver
 #
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2025 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
 
 %{?sle15_python_module_pythons}
 Name:           python-kiwisolver
-Version:        1.4.7
+Version:        1.4.8
 Release:        0
 Summary:        An implementation of the Cassowary constraint solver
 License:        BSD-3-Clause

++++++ kiwisolver-1.4.7.tar.gz -> kiwisolver-1.4.8.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/.github/workflows/ci.yml 
new/kiwisolver-1.4.8/.github/workflows/ci.yml
--- old/kiwisolver-1.4.7/.github/workflows/ci.yml       2024-09-04 
10:32:21.000000000 +0200
+++ new/kiwisolver-1.4.8/.github/workflows/ci.yml       2024-12-24 
18:54:47.000000000 +0100
@@ -22,15 +22,15 @@
     runs-on: ubuntu-latest
     strategy:
       matrix:
-        python-version: ['3.9']
+        python-version: ['3.12']
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
       - name: Get history and tags for SCM versioning to work
         run: |
           git fetch --prune --unshallow
           git fetch --depth=1 origin +refs/tags/*:refs/tags/*
       - name: Set up Python ${{ matrix.python-version }}
-        uses: actions/setup-python@v4
+        uses: actions/setup-python@v5
         with:
           python-version: ${{ matrix.python-version }}
       - name: Install dependencies
@@ -60,7 +60,7 @@
       matrix:
         os: [ubuntu-latest]
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
       - name: Install dependencies
         run: |
           sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
@@ -78,22 +78,20 @@
     strategy:
       matrix:
         os: [ubuntu-latest, windows-latest, macos-latest]
-        python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13-dev', 
'pypy-3.8', 'pypy-3.9', 'pypy-3.10']
+        python-version: ['3.10', '3.11', '3.12', '3.13', '3.13t', 'pypy-3.10']
         exclude:
-          - python-version: '3.8'
-            os: macos-latest
-          - python-version: '3.9'
-            os: macos-latest
-          - python-version: 'pypy-3.8'
-            os: macos-latest
+          # TODO: Reenable this once there's a setuptools release that sets 
Py_GIL_DISABLED
+          # correctly on Windows
+          - os: windows-latest
+            python-version: 3.13t
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
       - name: Get history and tags for SCM versioning to work
         run: |
           git fetch --prune --unshallow
           git fetch --depth=1 origin +refs/tags/*:refs/tags/*
       - name: Set up Python ${{ matrix.python-version }}
-        uses: actions/setup-python@v4
+        uses: Quansight-Labs/setup-python@v5
         with:
           python-version: ${{ matrix.python-version }}
       - name: Install dependencies
@@ -113,7 +111,7 @@
         run: |
           bash -c "find . -type f -name '*.gcno' -exec gcov -pb --all-blocks 
{} +" || true
       - name: Upload coverage to Codecov
-        uses: codecov/codecov-action@v3
+        uses: codecov/codecov-action@v5
         if: (github.event_name != 'schedule' && matrix.os != 'windows-latest')
         with:
           token: ${{ secrets.CODECOV_TOKEN }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/.github/workflows/docs.yml 
new/kiwisolver-1.4.8/.github/workflows/docs.yml
--- old/kiwisolver-1.4.7/.github/workflows/docs.yml     2024-09-04 
10:32:21.000000000 +0200
+++ new/kiwisolver-1.4.8/.github/workflows/docs.yml     2024-12-24 
18:54:47.000000000 +0100
@@ -21,13 +21,13 @@
     name: Docs building
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v3
+      - uses: actions/checkout@v4
       - name: Get history and tags for SCM versioning to work
         run: |
           git fetch --prune --unshallow
           git fetch --depth=1 origin +refs/tags/*:refs/tags/*
       - name: Set up Python
-        uses: actions/setup-python@v4
+        uses: actions/setup-python@v5
         with:
           python-version: '3.x'
       - name: Install dependencies
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/.github/workflows/release.yml 
new/kiwisolver-1.4.8/.github/workflows/release.yml
--- old/kiwisolver-1.4.7/.github/workflows/release.yml  2024-09-04 
10:32:21.000000000 +0200
+++ new/kiwisolver-1.4.8/.github/workflows/release.yml  2024-12-24 
18:54:47.000000000 +0100
@@ -13,13 +13,13 @@
     runs-on: ubuntu-latest
     steps:
       - name: Checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
       - name: Get history and tags for SCM versioning to work
         run: |
           git fetch --prune --unshallow
           git fetch --depth=1 origin +refs/tags/*:refs/tags/*
       - name: Setup Python
-        uses: actions/setup-python@v4
+        uses: actions/setup-python@v5
         with:
           python-version: '3.x'
       - name: Build sdist
@@ -34,9 +34,9 @@
           cd ..
           pytest kiwi/py/tests -v -W error
       - name: Store artifacts
-        uses: actions/upload-artifact@v3
+        uses: actions/upload-artifact@v4
         with:
-          name: artifact
+          name: cibw-sdist
           path: dist/*
 
   build_wheels:
@@ -47,21 +47,11 @@
     strategy:
       matrix:
         os: [ubuntu-latest, windows-latest, macos-latest]
-        # We build separately 3.8 using manylinux1
-        manylinux_version: [manylinux1, manylinux2010, manylinux2014]
+        manylinux_version: [manylinux2010, manylinux2014]
         archs: [auto]
         include:
           - os: ubuntu-latest
             archs: aarch64
-            manylinux_version: manylinux1
-          - os: ubuntu-latest
-            archs: ppc64le
-            manylinux_version: manylinux1
-          - os: ubuntu-latest
-            archs: s390x
-            manylinux_version: manylinux1
-          - os: ubuntu-latest
-            archs: aarch64
             manylinux_version: manylinux2010
           - os: ubuntu-latest
             archs: ppc64le
@@ -82,13 +72,13 @@
             archs: ARM64
     steps:
       - name: Checkout
-        uses: actions/checkout@v3
+        uses: actions/checkout@v4
       - name: Get history and tags for SCM versioning to work
         run: |
           git fetch --prune --unshallow
           git fetch --depth=1 origin +refs/tags/*:refs/tags/*
       - name: Setup Python
-        uses: actions/setup-python@v4
+        uses: actions/setup-python@v5
         with:
           python-version: '3.x'
       - name: Set up QEMU
@@ -101,41 +91,12 @@
           python -m pip install --upgrade pip
           python -m pip install wheel cibuildwheel
       - name: Build wheels
-        if: matrix.manylinux_version == 'manylinux1'
-        env:
-          # On Windows, we explicitly request MSVC compilers (as GitHub Action 
runners have
-          # MinGW on PATH that would be picked otherwise), switch to a static 
build for
-          # runtimes, but use dynamic linking for `VCRUNTIME140.dll`, 
`VCRUNTIME140_1.dll`,
-          # and the UCRT. This avoids requiring specific versions of 
`MSVCP140.dll`, while
-          # keeping shared state with the rest of the Python 
process/extensions.
-          CIBW_CONFIG_SETTINGS_WINDOWS: >-
-            setup-args="--vsenv"
-            setup-args="-Db_vscrt=mt"
-            
setup-args="-Dcpp_link_args=['ucrt.lib','vcruntime.lib','/nodefaultlib:libucrt.lib','/nodefaultlib:libvcruntime.lib']"
-          CIBW_BUILD: "cp38-*"
-          CIBW_ARCHS_MACOS: x86_64 universal2 arm64
-          CIBW_ARCHS_LINUX: ${{ matrix.archs }}
-          CIBW_MANYLINUX_X86_64_IMAGE: manylinux1
-          CIBW_MANYLINUX_I686_IMAGE: manylinux1
-          CIBW_TEST_REQUIRES: pytest
-          CIBW_TEST_COMMAND: pytest {package}/py/tests -v -W error
-        run: |
-          python -m cibuildwheel . --output-dir dist
-      - name: Build wheels
         if: matrix.manylinux_version == 'manylinux2010'
         env:
-          # On Windows, we explicitly request MSVC compilers (as GitHub Action 
runners have
-          # MinGW on PATH that would be picked otherwise), switch to a static 
build for
-          # runtimes, but use dynamic linking for `VCRUNTIME140.dll`, 
`VCRUNTIME140_1.dll`,
-          # and the UCRT. This avoids requiring specific versions of 
`MSVCP140.dll`, while
-          # keeping shared state with the rest of the Python 
process/extensions.
-          CIBW_CONFIG_SETTINGS_WINDOWS: >-
-            setup-args="--vsenv"
-            setup-args="-Db_vscrt=mt"
-            
setup-args="-Dcpp_link_args=['ucrt.lib','vcruntime.lib','/nodefaultlib:libucrt.lib','/nodefaultlib:libvcruntime.lib']"
-          CIBW_BUILD: "cp39-* cp310-* pp38-*"
+          CIBW_BUILD: "cp310-*"
           CIBW_ARCHS_MACOS: x86_64 universal2 arm64
           CIBW_ARCHS_LINUX: ${{ matrix.archs }}
+          CIBW_ARCHS_WINDOWS: auto64
           CIBW_MANYLINUX_X86_64_IMAGE: manylinux2010
           CIBW_MANYLINUX_I686_IMAGE: manylinux2010
           CIBW_TEST_REQUIRES: pytest
@@ -145,18 +106,12 @@
       - name: Build wheels
         if: matrix.manylinux_version == 'manylinux2014'
         env:
-          # On Windows, we explicitly request MSVC compilers (as GitHub Action 
runners have
-          # MinGW on PATH that would be picked otherwise), switch to a static 
build for
-          # runtimes, but use dynamic linking for `VCRUNTIME140.dll`, 
`VCRUNTIME140_1.dll`,
-          # and the UCRT. This avoids requiring specific versions of 
`MSVCP140.dll`, while
-          # keeping shared state with the rest of the Python 
process/extensions.
-          CIBW_CONFIG_SETTINGS_WINDOWS: >-
-            setup-args="--vsenv"
-            setup-args="-Db_vscrt=mt"
-            
setup-args="-Dcpp_link_args=['ucrt.lib','vcruntime.lib','/nodefaultlib:libucrt.lib','/nodefaultlib:libvcruntime.lib']"
-          CIBW_BUILD: "cp311-* cp312-* cp313-* pp39-* pp310-*"
+          CIBW_BUILD: "cp311-* cp312-* cp313-* cp313t-* pp310-*"
+          CIBW_SKIP: "cp313t-win*"
+          CIBW_ENABLE: cpython-freethreading
           CIBW_ARCHS_MACOS: x86_64 universal2 arm64
           CIBW_ARCHS_LINUX: ${{ matrix.archs }}
+          CIBW_ARCHS_WINDOWS: auto64
           CIBW_MANYLINUX_X86_64_IMAGE: manylinux2014
           CIBW_MANYLINUX_I686_IMAGE: manylinux2014
           CIBW_TEST_REQUIRES: pytest
@@ -164,18 +119,9 @@
         run: |
           python -m cibuildwheel . --output-dir dist
       - name: Build wheels
-        if: runner.os == 'Windows' && matrix.archs != 'auto'
+        if: runner.os == 'Windows' && matrix.archs == 'ARM64'
         env:
-          # On Windows, we explicitly request MSVC compilers (as GitHub Action 
runners have
-          # MinGW on PATH that would be picked otherwise), switch to a static 
build for
-          # runtimes, but use dynamic linking for `VCRUNTIME140.dll`, 
`VCRUNTIME140_1.dll`,
-          # and the UCRT. This avoids requiring specific versions of 
`MSVCP140.dll`, while
-          # keeping shared state with the rest of the Python 
process/extensions.
-          CIBW_CONFIG_SETTINGS_WINDOWS: >-
-            setup-args="--vsenv"
-            setup-args="-Db_vscrt=mt"
-            
setup-args="-Dcpp_link_args=['ucrt.lib','vcruntime.lib','/nodefaultlib:libucrt.lib','/nodefaultlib:libvcruntime.lib']"
-          CIBW_BUILD: "cp39-* cp310-* cp311-* cp312-* cp313-*"
+          CIBW_BUILD: "cp310-* cp311-* cp312-* cp313-*"
           CIBW_ARCHS_WINDOWS: ${{ matrix.archs }}
           # It is not yet possible to run ARM64 tests, only cross-compile them.
           CIBW_TEST_SKIP: "*-win_arm64"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/PKG-INFO 
new/kiwisolver-1.4.8/PKG-INFO
--- old/kiwisolver-1.4.7/PKG-INFO       2024-09-04 10:32:27.468615000 +0200
+++ new/kiwisolver-1.4.8/PKG-INFO       2024-12-24 18:54:53.570472500 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: kiwisolver
-Version: 1.4.7
+Version: 1.4.8
 Summary: A fast implementation of the Cassowary constraint solver
 Author-email: The Nucleic Development Team <sccolb...@gmail.com>
 Maintainer-email: "Matthieu C. Dartiailh" <m.dartia...@gmail.com>
@@ -83,15 +83,13 @@
 Classifier: License :: OSI Approved :: BSD License
 Classifier: Programming Language :: Python
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
 Classifier: Programming Language :: Python :: 3.13
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
-Requires-Python: >=3.8
+Requires-Python: >=3.10
 Description-Content-Type: text/x-rst
 License-File: LICENSE
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/py/kiwisolver/__init__.py 
new/kiwisolver-1.4.8/py/kiwisolver/__init__.py
--- old/kiwisolver-1.4.7/py/kiwisolver/__init__.py      2024-09-04 
10:32:21.000000000 +0200
+++ new/kiwisolver-1.4.8/py/kiwisolver/__init__.py      2024-12-24 
18:54:47.000000000 +0100
@@ -26,17 +26,17 @@
 
 __all__ = [
     "BadRequiredStrength",
+    "Constraint",
     "DuplicateConstraint",
     "DuplicateEditVariable",
+    "Expression",
+    "Solver",
+    "Term",
     "UnknownConstraint",
     "UnknownEditVariable",
     "UnsatisfiableConstraint",
-    "strength",
     "Variable",
-    "Term",
-    "Expression",
-    "Constraint",
-    "Solver",
-    "__version__",
     "__kiwi_version__",
+    "__version__",
+    "strength",
 ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/py/kiwisolver.egg-info/PKG-INFO 
new/kiwisolver-1.4.8/py/kiwisolver.egg-info/PKG-INFO
--- old/kiwisolver-1.4.7/py/kiwisolver.egg-info/PKG-INFO        2024-09-04 
10:32:27.000000000 +0200
+++ new/kiwisolver-1.4.8/py/kiwisolver.egg-info/PKG-INFO        2024-12-24 
18:54:53.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: kiwisolver
-Version: 1.4.7
+Version: 1.4.8
 Summary: A fast implementation of the Cassowary constraint solver
 Author-email: The Nucleic Development Team <sccolb...@gmail.com>
 Maintainer-email: "Matthieu C. Dartiailh" <m.dartia...@gmail.com>
@@ -83,15 +83,13 @@
 Classifier: License :: OSI Approved :: BSD License
 Classifier: Programming Language :: Python
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Programming Language :: Python :: 3.9
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
 Classifier: Programming Language :: Python :: 3.13
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: PyPy
-Requires-Python: >=3.8
+Requires-Python: >=3.10
 Description-Content-Type: text/x-rst
 License-File: LICENSE
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/py/src/constraint.cpp 
new/kiwisolver-1.4.8/py/src/constraint.cpp
--- old/kiwisolver-1.4.7/py/src/constraint.cpp  2024-09-04 10:32:21.000000000 
+0200
+++ new/kiwisolver-1.4.8/py/src/constraint.cpp  2024-12-24 18:54:47.000000000 
+0100
@@ -44,8 +44,12 @@
     cn->expression = reduce_expression(pyexpr);
     if (!cn->expression)
         return 0;
+
+    ACQUIRE_GLOBAL_LOCK();
     kiwi::Expression expr(convert_to_kiwi_expression(cn->expression));
     new (&cn->constraint) kiwi::Constraint(expr, op, strength);
+    RELEASE_GLOBAL_LOCK();
+
     return pycn.release();
 }
 
@@ -68,7 +72,9 @@
 {
     PyObject_GC_UnTrack(self);
     Constraint_clear(self);
+    ACQUIRE_GLOBAL_LOCK();
     self->constraint.~Constraint();
+    RELEASE_GLOBAL_LOCK();
     Py_TYPE(self)->tp_free(pyobject_cast(self));
 }
 
@@ -83,11 +89,21 @@
         PyObject *item = PyTuple_GET_ITEM(expr->terms, i);
         Term *term = reinterpret_cast<Term *>(item);
         stream << term->coefficient << " * ";
-        stream << reinterpret_cast<Variable 
*>(term->variable)->variable.name();
+        ACQUIRE_GLOBAL_LOCK();
+        std::string name = reinterpret_cast<Variable 
*>(term->variable)->variable.name();
+        RELEASE_GLOBAL_LOCK();
+        stream << name;
         stream << " + ";
     }
     stream << expr->constant;
-    switch (self->constraint.op())
+
+    ACQUIRE_GLOBAL_LOCK();
+    kiwi::RelationalOperator op = self->constraint.op();
+    double strength = self->constraint.strength();
+    bool violated = self->constraint.violated();
+    RELEASE_GLOBAL_LOCK();
+
+    switch (op)
     {
     case kiwi::OP_EQ:
         stream << " == 0";
@@ -99,8 +115,8 @@
         stream << " >= 0";
         break;
     }
-    stream << " | strength = " << self->constraint.strength();
-    if (self->constraint.violated())
+    stream << " | strength = " << strength;
+    if (violated)
     {
         stream << " (VIOLATED)";
     }
@@ -117,7 +133,12 @@
 Constraint_op(Constraint *self)
 {
     PyObject *res = 0;
-    switch (self->constraint.op())
+
+    ACQUIRE_GLOBAL_LOCK();
+    kiwi::RelationalOperator op = self->constraint.op();
+    RELEASE_GLOBAL_LOCK();
+
+    switch (op)
     {
     case kiwi::OP_EQ:
         res = PyUnicode_FromString("==");
@@ -135,13 +156,20 @@
 PyObject *
 Constraint_strength(Constraint *self)
 {
-    return PyFloat_FromDouble(self->constraint.strength());
+    ACQUIRE_GLOBAL_LOCK();
+    double strength = self->constraint.strength();
+    RELEASE_GLOBAL_LOCK();
+    return PyFloat_FromDouble(strength);
 }
 
 PyObject *
 Constraint_violated(Constraint *self)
 {
-    if (self->constraint.violated()) {
+    ACQUIRE_GLOBAL_LOCK();
+    bool violated = self->constraint.violated();
+    RELEASE_GLOBAL_LOCK();
+
+    if (violated) {
         Py_RETURN_TRUE;
     } else {
         Py_RETURN_FALSE;
@@ -162,7 +190,11 @@
     Constraint *oldcn = reinterpret_cast<Constraint *>(pyoldcn);
     Constraint *newcn = reinterpret_cast<Constraint *>(pynewcn);
     newcn->expression = cppy::incref(oldcn->expression);
+
+    ACQUIRE_GLOBAL_LOCK();
     new (&newcn->constraint) kiwi::Constraint(oldcn->constraint, strength);
+    RELEASE_GLOBAL_LOCK();
+
     return pynewcn;
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/py/src/expression.cpp 
new/kiwisolver-1.4.8/py/src/expression.cpp
--- old/kiwisolver-1.4.7/py/src/expression.cpp  2024-09-04 10:32:21.000000000 
+0200
+++ new/kiwisolver-1.4.8/py/src/expression.cpp  2024-12-24 18:54:47.000000000 
+0100
@@ -89,7 +89,10 @@
         PyObject* item = PyTuple_GET_ITEM( self->terms, i );
         Term* term = reinterpret_cast<Term*>( item );
         stream << term->coefficient << " * ";
-        stream << reinterpret_cast<Variable*>( term->variable 
)->variable.name();
+        ACQUIRE_GLOBAL_LOCK();
+        std::string name = reinterpret_cast<Variable*>( term->variable 
)->variable.name();
+        RELEASE_GLOBAL_LOCK();
+        stream << name;
         stream << " + ";
     }
     stream << self->constant;
@@ -121,7 +124,10 @@
         PyObject* item = PyTuple_GET_ITEM( self->terms, i );
         Term* term = reinterpret_cast<Term*>( item );
         Variable* pyvar = reinterpret_cast<Variable*>( term->variable );
-        result += term->coefficient * pyvar->variable.value();
+        ACQUIRE_GLOBAL_LOCK();
+        double value = pyvar->variable.value();
+        RELEASE_GLOBAL_LOCK();
+        result += term->coefficient * value;
     }
     return PyFloat_FromDouble( result );
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/py/src/kiwisolver.cpp 
new/kiwisolver-1.4.8/py/src/kiwisolver.cpp
--- old/kiwisolver-1.4.7/py/src/kiwisolver.cpp  2024-09-04 10:32:21.000000000 
+0200
+++ new/kiwisolver-1.4.8/py/src/kiwisolver.cpp  2024-12-24 18:54:47.000000000 
+0100
@@ -5,11 +5,18 @@
 |
 | The full license is in the file LICENSE, distributed with this software.
 |----------------------------------------------------------------------------*/
+#include <mutex>
 #include <cppy/cppy.h>
 #include <kiwi/kiwi.h>
 #include "types.h"
 #include "version.h"
 
+namespace kiwisolver
+{
+
+std::recursive_mutex global_lock;
+
+}
 
 namespace
 {
@@ -162,6 +169,9 @@
 
 PyModuleDef_Slot kiwisolver_slots[] = {
     {Py_mod_exec, reinterpret_cast<void*>( kiwi_modexec ) },
+#ifdef Py_GIL_DISABLED
+    {Py_mod_gil, Py_MOD_GIL_NOT_USED},
+#endif
     {0, NULL}
 };
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/py/src/solver.cpp 
new/kiwisolver-1.4.8/py/src/solver.cpp
--- old/kiwisolver-1.4.7/py/src/solver.cpp      2024-09-04 10:32:21.000000000 
+0200
+++ new/kiwisolver-1.4.8/py/src/solver.cpp      2024-12-24 18:54:47.000000000 
+0100
@@ -26,7 +26,9 @@
        if( !pysolver )
                return 0;
        Solver* self = reinterpret_cast<Solver*>( pysolver );
+       ACQUIRE_GLOBAL_LOCK();
        new( &self->solver ) kiwi::Solver();
+       RELEASE_GLOBAL_LOCK();
        return pysolver;
 }
 
@@ -34,7 +36,9 @@
 void
 Solver_dealloc( Solver* self )
 {
+       ACQUIRE_GLOBAL_LOCK();
        self->solver.~Solver();
+       RELEASE_GLOBAL_LOCK();
        Py_TYPE( self )->tp_free( pyobject_cast( self ) );
 }
 
@@ -47,15 +51,19 @@
        Constraint* cn = reinterpret_cast<Constraint*>( other );
        try
        {
+               ACQUIRE_GLOBAL_LOCK();
                self->solver.addConstraint( cn->constraint );
+               RELEASE_GLOBAL_LOCK();
        }
        catch( const kiwi::DuplicateConstraint& )
        {
+               RELEASE_GLOBAL_LOCK();
                PyErr_SetObject( DuplicateConstraint, other );
                return 0;
        }
        catch( const kiwi::UnsatisfiableConstraint& )
        {
+               RELEASE_GLOBAL_LOCK();
                PyErr_SetObject( UnsatisfiableConstraint, other );
                return 0;
        }
@@ -71,10 +79,13 @@
        Constraint* cn = reinterpret_cast<Constraint*>( other );
        try
        {
+               ACQUIRE_GLOBAL_LOCK();
                self->solver.removeConstraint( cn->constraint );
+               RELEASE_GLOBAL_LOCK();
        }
        catch( const kiwi::UnknownConstraint& )
        {
+               RELEASE_GLOBAL_LOCK();
                PyErr_SetObject( UnknownConstraint, other );
                return 0;
        }
@@ -88,7 +99,12 @@
        if( !Constraint::TypeCheck( other ) )
                return cppy::type_error( other, "Constraint" );
        Constraint* cn = reinterpret_cast<Constraint*>( other );
-       return cppy::incref( self->solver.hasConstraint( cn->constraint ) ? 
Py_True : Py_False );
+
+       ACQUIRE_GLOBAL_LOCK();
+       bool hasConstraint = self->solver.hasConstraint( cn->constraint );
+       RELEASE_GLOBAL_LOCK();
+
+       return cppy::incref( hasConstraint ? Py_True : Py_False );
 }
 
 
@@ -107,15 +123,19 @@
        Variable* var = reinterpret_cast<Variable*>( pyvar );
        try
        {
+               ACQUIRE_GLOBAL_LOCK();
                self->solver.addEditVariable( var->variable, strength );
+               RELEASE_GLOBAL_LOCK();
        }
        catch( const kiwi::DuplicateEditVariable& )
        {
+               RELEASE_GLOBAL_LOCK();
                PyErr_SetObject( DuplicateEditVariable, pyvar );
                return 0;
        }
        catch( const kiwi::BadRequiredStrength& e )
        {
+               RELEASE_GLOBAL_LOCK();
                PyErr_SetString( BadRequiredStrength, e.what() );
                return 0;
        }
@@ -131,10 +151,13 @@
        Variable* var = reinterpret_cast<Variable*>( other );
        try
        {
+               ACQUIRE_GLOBAL_LOCK();
                self->solver.removeEditVariable( var->variable );
+               RELEASE_GLOBAL_LOCK();
        }
        catch( const kiwi::UnknownEditVariable& )
        {
+               RELEASE_GLOBAL_LOCK();
                PyErr_SetObject( UnknownEditVariable, other );
                return 0;
        }
@@ -148,7 +171,10 @@
        if( !Variable::TypeCheck( other ) )
                return cppy::type_error( other, "Variable" );
        Variable* var = reinterpret_cast<Variable*>( other );
-       return cppy::incref( self->solver.hasEditVariable( var->variable ) ? 
Py_True : Py_False );
+       ACQUIRE_GLOBAL_LOCK();
+       bool hasEditVariable = self->solver.hasEditVariable( var->variable );
+       RELEASE_GLOBAL_LOCK();
+       return cppy::incref( hasEditVariable ? Py_True : Py_False );
 }
 
 
@@ -167,10 +193,13 @@
        Variable* var = reinterpret_cast<Variable*>( pyvar );
        try
        {
+               ACQUIRE_GLOBAL_LOCK();
                self->solver.suggestValue( var->variable, value );
+               RELEASE_GLOBAL_LOCK();
        }
        catch( const kiwi::UnknownEditVariable& )
        {
+               RELEASE_GLOBAL_LOCK();
                PyErr_SetObject( UnknownEditVariable, pyvar );
                return 0;
        }
@@ -181,7 +210,9 @@
 PyObject*
 Solver_updateVariables( Solver* self )
 {
+       ACQUIRE_GLOBAL_LOCK();
        self->solver.updateVariables();
+       RELEASE_GLOBAL_LOCK();
        Py_RETURN_NONE;
 }
 
@@ -189,7 +220,9 @@
 PyObject*
 Solver_reset( Solver* self )
 {
+       ACQUIRE_GLOBAL_LOCK();
        self->solver.reset();
+       RELEASE_GLOBAL_LOCK();
        Py_RETURN_NONE;
 }
 
@@ -197,7 +230,10 @@
 PyObject*
 Solver_dump( Solver* self )
 {
-       cppy::ptr dump_str( PyUnicode_FromString( self->solver.dumps().c_str() 
) );
+       ACQUIRE_GLOBAL_LOCK();
+       std::string dumps = self->solver.dumps();
+       RELEASE_GLOBAL_LOCK();
+       cppy::ptr dump_str( PyUnicode_FromString( dumps.c_str() ) );
        PyObject_Print( dump_str.get(), stdout, 0 );
        Py_RETURN_NONE;
 }
@@ -205,7 +241,10 @@
 PyObject*
 Solver_dumps( Solver* self )
 {
-       return PyUnicode_FromString( self->solver.dumps().c_str() );
+       ACQUIRE_GLOBAL_LOCK();
+       std::string dumps = self->solver.dumps();
+       RELEASE_GLOBAL_LOCK();
+       return PyUnicode_FromString( dumps.c_str() );
 }
 
 static PyMethodDef
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/py/src/symbolics.h 
new/kiwisolver-1.4.8/py/src/symbolics.h
--- old/kiwisolver-1.4.7/py/src/symbolics.h     2024-09-04 10:32:21.000000000 
+0200
+++ new/kiwisolver-1.4.8/py/src/symbolics.h     2024-12-24 18:54:47.000000000 
+0100
@@ -579,8 +579,10 @@
        cn->expression = reduce_expression( pyexpr.get() );
        if( !cn->expression )
                return 0;
+       ACQUIRE_GLOBAL_LOCK();
        kiwi::Expression expr( convert_to_kiwi_expression( cn->expression ) );
        new( &cn->constraint ) kiwi::Constraint( expr, op, 
kiwi::strength::required );
+       RELEASE_GLOBAL_LOCK();
        return pycn.release();
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/py/src/term.cpp 
new/kiwisolver-1.4.8/py/src/term.cpp
--- old/kiwisolver-1.4.7/py/src/term.cpp        2024-09-04 10:32:21.000000000 
+0200
+++ new/kiwisolver-1.4.8/py/src/term.cpp        2024-12-24 18:54:47.000000000 
+0100
@@ -78,7 +78,10 @@
 {
        std::stringstream stream;
        stream << self->coefficient << " * ";
-       stream << reinterpret_cast<Variable*>( self->variable 
)->variable.name();
+       ACQUIRE_GLOBAL_LOCK();
+       std::string name = reinterpret_cast<Variable*>( self->variable 
)->variable.name();
+       RELEASE_GLOBAL_LOCK();
+       stream << name;
        return PyUnicode_FromString( stream.str().c_str() );
 }
 
@@ -101,7 +104,10 @@
 Term_value( Term* self )
 {
        Variable* pyvar = reinterpret_cast<Variable*>( self->variable );
-       return PyFloat_FromDouble( self->coefficient * pyvar->variable.value() 
);
+       ACQUIRE_GLOBAL_LOCK();
+       double value = pyvar->variable.value();
+       RELEASE_GLOBAL_LOCK();
+       return PyFloat_FromDouble( self->coefficient * value );
 }
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/py/src/util.h 
new/kiwisolver-1.4.8/py/src/util.h
--- old/kiwisolver-1.4.7/py/src/util.h  2024-09-04 10:32:21.000000000 +0200
+++ new/kiwisolver-1.4.8/py/src/util.h  2024-12-24 18:54:47.000000000 +0100
@@ -7,6 +7,7 @@
 |----------------------------------------------------------------------------*/
 #pragma once
 #include <map>
+#include <mutex>
 #include <string>
 #include <cppy/cppy.h>
 #include <kiwi/kiwi.h>
@@ -16,6 +17,20 @@
 namespace kiwisolver
 {
 
+#ifdef Py_GIL_DISABLED
+extern std::recursive_mutex global_lock;
+#define ACQUIRE_GLOBAL_LOCK() global_lock.lock()
+#define RELEASE_GLOBAL_LOCK() global_lock.unlock()
+#else
+#define ACQUIRE_GLOBAL_LOCK()
+#define RELEASE_GLOBAL_LOCK()
+#endif
+
+#ifndef Py_BEGIN_CRITICAL_SECTION
+#define Py_BEGIN_CRITICAL_SECTION(op) {
+#define Py_END_CRITICAL_SECTION() }
+#endif
+
 inline bool
 convert_to_double( PyObject* obj, double& out )
 {
@@ -171,9 +186,15 @@
         PyObject* item = PyTuple_GET_ITEM( expr->terms, i );
         Term* term = reinterpret_cast<Term*>( item );
         Variable* var = reinterpret_cast<Variable*>( term->variable );
-        kterms.push_back( kiwi::Term( var->variable, term->coefficient ) );
-    }
-    return kiwi::Expression( kterms, expr->constant );
+        ACQUIRE_GLOBAL_LOCK();
+        kiwi::Term t( var->variable, term->coefficient );
+        RELEASE_GLOBAL_LOCK();
+        kterms.push_back( t );
+    }
+    ACQUIRE_GLOBAL_LOCK();
+    kiwi::Expression expression( kterms, expr->constant );
+    RELEASE_GLOBAL_LOCK();
+    return expression;
 }
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/py/src/variable.cpp 
new/kiwisolver-1.4.8/py/src/variable.cpp
--- old/kiwisolver-1.4.7/py/src/variable.cpp    2024-09-04 10:32:21.000000000 
+0200
+++ new/kiwisolver-1.4.8/py/src/variable.cpp    2024-12-24 18:54:47.000000000 
+0100
@@ -46,11 +46,15 @@
                std::string c_name;
                if( !convert_pystr_to_str(name, c_name) )
                        return 0;  // LCOV_EXCL_LINE
+               ACQUIRE_GLOBAL_LOCK();
                new( &self->variable ) kiwi::Variable( c_name );
+               RELEASE_GLOBAL_LOCK();
        }
        else
        {
+               ACQUIRE_GLOBAL_LOCK();
                new( &self->variable ) kiwi::Variable();
+               RELEASE_GLOBAL_LOCK();
        }
 
        return pyvar.release();
@@ -81,7 +85,9 @@
 {
        PyObject_GC_UnTrack( self );
        Variable_clear( self );
+       ACQUIRE_GLOBAL_LOCK();
        self->variable.~Variable();
+       RELEASE_GLOBAL_LOCK();
        Py_TYPE( self )->tp_free( pyobject_cast( self ) );
 }
 
@@ -89,14 +95,20 @@
 PyObject*
 Variable_repr( Variable* self )
 {
-       return PyUnicode_FromString( self->variable.name().c_str() );
+       ACQUIRE_GLOBAL_LOCK();
+       std::string name = self->variable.name();
+       RELEASE_GLOBAL_LOCK();
+       return PyUnicode_FromString( name.c_str() );
 }
 
 
 PyObject*
 Variable_name( Variable* self )
 {
-       return PyUnicode_FromString( self->variable.name().c_str() );
+       ACQUIRE_GLOBAL_LOCK();
+       std::string name = self->variable.name();
+       RELEASE_GLOBAL_LOCK();
+       return PyUnicode_FromString( name.c_str() );
 }
 
 
@@ -108,13 +120,17 @@
    std::string str;
    if( !convert_pystr_to_str( pystr, str ) )
        return 0;
-   self->variable.setName( str );
+       
+       ACQUIRE_GLOBAL_LOCK();
+       self->variable.setName( str );
+       RELEASE_GLOBAL_LOCK();
+
        Py_RETURN_NONE;
 }
 
 
 PyObject*
-Variable_context( Variable* self )
+Variable_context_locked( Variable* self )
 {
        if( self->context )
                return cppy::incref( self->context );
@@ -123,14 +139,32 @@
 
 
 PyObject*
-Variable_setContext( Variable* self, PyObject* value )
+Variable_context( Variable* self )
+{
+       PyObject* context;
+       Py_BEGIN_CRITICAL_SECTION(self);
+       context = Variable_context_locked(self);
+       Py_END_CRITICAL_SECTION();
+       return context;
+}
+
+
+void
+Variable_setContext_locked( Variable* self, PyObject* value )
 {
        if( value != self->context )
        {
-               PyObject* temp = self->context;
-               self->context = cppy::incref( value );
-               Py_XDECREF( temp );
+               Py_XSETREF(self->context, cppy::incref( value ));
        }
+}
+
+
+PyObject*
+Variable_setContext( Variable* self, PyObject* value )
+{
+       Py_BEGIN_CRITICAL_SECTION(self);
+       Variable_setContext_locked(self, value);
+       Py_END_CRITICAL_SECTION();
        Py_RETURN_NONE;
 }
 
@@ -138,7 +172,10 @@
 PyObject*
 Variable_value( Variable* self )
 {
-       return PyFloat_FromDouble( self->variable.value() );
+       ACQUIRE_GLOBAL_LOCK();
+       double value = self->variable.value();
+       RELEASE_GLOBAL_LOCK();
+       return PyFloat_FromDouble( value );
 }
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/py/src/version.h 
new/kiwisolver-1.4.8/py/src/version.h
--- old/kiwisolver-1.4.7/py/src/version.h       2024-09-04 10:32:27.000000000 
+0200
+++ new/kiwisolver-1.4.8/py/src/version.h       2024-12-24 18:54:53.000000000 
+0100
@@ -9,5 +9,5 @@
 
 #pragma once
 
-#define PY_KIWI_VERSION "1.4.7"
+#define PY_KIWI_VERSION "1.4.8"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/pyproject.toml 
new/kiwisolver-1.4.8/pyproject.toml
--- old/kiwisolver-1.4.7/pyproject.toml 2024-09-04 10:32:21.000000000 +0200
+++ new/kiwisolver-1.4.8/pyproject.toml 2024-12-24 18:54:47.000000000 +0100
@@ -10,7 +10,7 @@
   name = "kiwisolver"
   description = "A fast implementation of the Cassowary constraint solver"
   readme = "README.rst"
-  requires-python = ">=3.8"
+  requires-python = ">=3.10"
   license = { file = "LICENSE" }
   authors = [{ name = "The Nucleic Development Team", email = 
"sccolb...@gmail.com" }]
   maintainers = [{ name = "Matthieu C. Dartiailh", email = 
"m.dartia...@gmail.com" }]
@@ -18,8 +18,6 @@
     "License :: OSI Approved :: BSD License",
     "Programming Language :: Python",
     "Programming Language :: Python :: 3",
-    "Programming Language :: Python :: 3.8",
-    "Programming Language :: Python :: 3.9",
     "Programming Language :: Python :: 3.10",
     "Programming Language :: Python :: 3.11",
     "Programming Language :: Python :: 3.12",
@@ -40,7 +38,7 @@
     "setuptools>=61.2; implementation_name == 'cpython'",
     "setuptools>=61.2,<=72.1.0; implementation_name != 'cpython'",
     "setuptools_scm[toml]>=3.4.3",
-    "cppy>=1.2.0"
+    "cppy>=1.3.0"
   ]
   build-backend = "setuptools.build_meta"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/releasenotes.rst 
new/kiwisolver-1.4.8/releasenotes.rst
--- old/kiwisolver-1.4.7/releasenotes.rst       2024-09-04 10:32:21.000000000 
+0200
+++ new/kiwisolver-1.4.8/releasenotes.rst       2024-12-24 18:54:47.000000000 
+0100
@@ -1,6 +1,12 @@
 Kiwi Release Notes
 ==================
 
+Wrappers 1.4.8 | Solver 1.4.2 | 24/12/2024
+------------------------------------------
+- drop support for Python 3.8 and 3.9 PR #189
+- do not link to MSVCP on Windows and drop windows 32 bits support PR #189
+- add support for free-threaded builds on Python 3.13 PR #190 #191
+
 Wrappers 1.4.7 | Solver 1.4.2 | 03/09/2024
 ------------------------------------------
 - no library changes only fixes to the build infrastructure
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwisolver-1.4.7/setup.py 
new/kiwisolver-1.4.8/setup.py
--- old/kiwisolver-1.4.7/setup.py       2024-09-04 10:32:21.000000000 +0200
+++ new/kiwisolver-1.4.8/setup.py       2024-12-24 18:54:47.000000000 +0100
@@ -5,7 +5,6 @@
 #
 # The full license is in the file LICENSE, distributed with this software.
 # 
--------------------------------------------------------------------------------------
-import os
 
 from setuptools import Extension, setup
 

Reply via email to