From 92e829f5cde0ba9168da8493193064deaa5a1b0a Mon Sep 17 00:00:00 2001 From: Eli Rykoff Date: Wed, 5 Apr 2023 16:15:49 -0700 Subject: [PATCH 01/15] Fix inability to handle zero-size arrays with numpy>=1.23. Numpy updated the code to give zero stride for arrays that have zero in any dimension. This should still match the ndarray usage in pybind11. --- include/ndarray/pybind11.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/include/ndarray/pybind11.h b/include/ndarray/pybind11.h index 5d216dee..bd1eaeda 100644 --- a/include/ndarray/pybind11.h +++ b/include/ndarray/pybind11.h @@ -120,6 +120,13 @@ Pybind11Helper { pybind11_np_size_t const * strides = wrapper.strides(); pybind11_np_size_t const itemsize = wrapper.itemsize(); if (C > 0) { + // If the shape is zero in any dimension, we don't + // worry about the strides. + for (int i = 0; i < C; ++i) { + if (shape[N-i-1] == 0) { + return true; + } + } pybind11_np_size_t requiredStride = itemsize; for (int i = 0; i < C; ++i) { if (strides[N-i-1] != requiredStride) { @@ -128,6 +135,13 @@ Pybind11Helper { requiredStride *= shape[N-i-1]; } } else if (C < 0) { + // If the shape is zero in any dimension, we don't + // worry about the strides. + for (int i = 0; i < -C; ++i) { + if (shape[i] == 0) { + return true; + } + } pybind11_np_size_t requiredStride = itemsize; for (int i = 0; i < -C; ++i) { if (strides[i] != requiredStride) { From 66c52f99e2210ae8fee9403bfce85fe4e5007f33 Mon Sep 17 00:00:00 2001 From: Eli Rykoff Date: Wed, 5 Apr 2023 20:06:24 -0700 Subject: [PATCH 02/15] Add python=3.10 to build matrix. --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 3a13ce4e..c14fc6c6 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [2.7, 3.7, 3.8, 3.9] + python-version: ["2.7", "3.7", "3.8", "3.9", "3.10"] steps: - uses: actions/checkout@v2 - uses: conda-incubator/setup-miniconda@v2 From 031eb1e1447d306b8a16b6535b3cf1ee6b807a09 Mon Sep 17 00:00:00 2001 From: Eli Rykoff Date: Wed, 5 Apr 2023 20:06:41 -0700 Subject: [PATCH 03/15] Add all packages for building in conda-forge-land. --- etc/conda-forge-testing.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/etc/conda-forge-testing.yaml b/etc/conda-forge-testing.yaml index ce4fc26e..2a4f1a3d 100644 --- a/etc/conda-forge-testing.yaml +++ b/etc/conda-forge-testing.yaml @@ -7,5 +7,7 @@ dependencies: - fftw - numpy - pybind11 - - gxx_linux-64 + - c-compiler - eigen + - cmake + - pkg-config From 9c4e10b2d24d1a058b39b44c0072a714be4d2d69 Mon Sep 17 00:00:00 2001 From: Eli Rykoff Date: Wed, 5 Apr 2023 20:18:22 -0700 Subject: [PATCH 04/15] Fix test to actually test the right array-match. --- tests/pybind11_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/pybind11_test.py b/tests/pybind11_test.py index 1c913ed6..c11ab945 100644 --- a/tests/pybind11_test.py +++ b/tests/pybind11_test.py @@ -40,10 +40,10 @@ def testStrideHandling(self): array = numpy.zeros(1, dtype=float) # just test that these don't throw pybind11_test_mod.acceptArray10(array) - pybind11_test_mod.acceptArray10(array) + pybind11_test_mod.acceptArray1(array) array = numpy.zeros(0, dtype=float) pybind11_test_mod.acceptArray10(array) - pybind11_test_mod.acceptArray10(array) + pybind11_test_mod.acceptArray1(array) # test that we gracefully fail when the strides are no multiples of the itemsize dtype = numpy.dtype([("f1", numpy.float64), ("f2", numpy.int16)]) table = numpy.zeros(3, dtype=dtype) From 760a422b3be8cbeb7e251a53ca86153e86d351e3 Mon Sep 17 00:00:00 2001 From: Eli Rykoff Date: Mon, 10 Apr 2023 12:01:57 -0700 Subject: [PATCH 05/15] Restore installation directive. --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index cc61976b..477666c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,3 +32,6 @@ if(NDARRAY_TEST) add_subdirectory(tests) endif(NDARRAY_TEST) +# installation +install(DIRECTORY include/ DESTINATION include/ + FILES_MATCHING PATTERN "*.h") From a0a4d45934bd47891850b5a3b6dbc50f9522ef87 Mon Sep 17 00:00:00 2001 From: Eli Rykoff Date: Mon, 10 Apr 2023 12:03:26 -0700 Subject: [PATCH 06/15] Update tests to use pure acceptance test. The old test tried to do a comparison to a fixed size. --- tests/pybind11_test.py | 4 ++-- tests/pybind11_test_mod.cc | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/pybind11_test.py b/tests/pybind11_test.py index c11ab945..c42c8db5 100644 --- a/tests/pybind11_test.py +++ b/tests/pybind11_test.py @@ -40,10 +40,10 @@ def testStrideHandling(self): array = numpy.zeros(1, dtype=float) # just test that these don't throw pybind11_test_mod.acceptArray10(array) - pybind11_test_mod.acceptArray1(array) + pybind11_test_mod.acceptArray11(array) array = numpy.zeros(0, dtype=float) pybind11_test_mod.acceptArray10(array) - pybind11_test_mod.acceptArray1(array) + pybind11_test_mod.acceptArray11(array) # test that we gracefully fail when the strides are no multiples of the itemsize dtype = numpy.dtype([("f1", numpy.float64), ("f2", numpy.int16)]) table = numpy.zeros(3, dtype=dtype) diff --git a/tests/pybind11_test_mod.cc b/tests/pybind11_test_mod.cc index dae388aa..f1d90c80 100644 --- a/tests/pybind11_test_mod.cc +++ b/tests/pybind11_test_mod.cc @@ -41,6 +41,8 @@ bool acceptArray1(ndarray::Array const & a1) { void acceptArray10(ndarray::Array const & a1) {} +void acceptArray11(ndarray::Array const & a1) {} + bool acceptArray3(ndarray::Array const & a1) { ndarray::Array a2 = returnArray3(); #ifndef GCC_45 @@ -70,6 +72,7 @@ PYBIND11_MODULE(pybind11_test_mod, mod) { mod.def("returnConstArray3", returnConstArray3); mod.def("acceptArray1", acceptArray1); mod.def("acceptArray10", acceptArray10); + mod.def("acceptArray11", acceptArray11); mod.def("acceptArray3", acceptArray3); mod.def("acceptNoneArray", acceptNoneArray, "array"_a = nullptr); -} \ No newline at end of file +} From 6d7b01d32208e569c4c178e027b57d8fc85e2b40 Mon Sep 17 00:00:00 2001 From: Eli Rykoff Date: Mon, 10 Apr 2023 12:51:45 -0700 Subject: [PATCH 07/15] Rename some test functions to acceptZeroShapeArrayXY. --- tests/pybind11_test.py | 12 +++++++----- tests/pybind11_test_mod.cc | 8 ++++---- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/tests/pybind11_test.py b/tests/pybind11_test.py index c42c8db5..26030bf5 100644 --- a/tests/pybind11_test.py +++ b/tests/pybind11_test.py @@ -38,12 +38,14 @@ def testStrideHandling(self): # in NumPy 1.8+ 1- and 0-sized arrays can have arbitrary strides; we should # be able to handle those array = numpy.zeros(1, dtype=float) - # just test that these don't throw - pybind11_test_mod.acceptArray10(array) - pybind11_test_mod.acceptArray11(array) + # the zero shape array tests are simply checking that pybind11 can handle + # arbitrary strides (non-zero for length 1 array, zero for length 0 array + # for numpy >= 1.23). + pybind11_test_mod.acceptZeroShapeArray10(array) + pybind11_test_mod.acceptZeroShapeArray11(array) array = numpy.zeros(0, dtype=float) - pybind11_test_mod.acceptArray10(array) - pybind11_test_mod.acceptArray11(array) + pybind11_test_mod.acceptZeroShapeArray10(array) + pybind11_test_mod.acceptZeroShapeArray11(array) # test that we gracefully fail when the strides are no multiples of the itemsize dtype = numpy.dtype([("f1", numpy.float64), ("f2", numpy.int16)]) table = numpy.zeros(3, dtype=dtype) diff --git a/tests/pybind11_test_mod.cc b/tests/pybind11_test_mod.cc index f1d90c80..96149e64 100644 --- a/tests/pybind11_test_mod.cc +++ b/tests/pybind11_test_mod.cc @@ -39,9 +39,9 @@ bool acceptArray1(ndarray::Array const & a1) { #endif } -void acceptArray10(ndarray::Array const & a1) {} +void acceptZeroShapeArray10(ndarray::Array const & a1) {} -void acceptArray11(ndarray::Array const & a1) {} +void acceptZeroShapeArray11(ndarray::Array const & a1) {} bool acceptArray3(ndarray::Array const & a1) { ndarray::Array a2 = returnArray3(); @@ -71,8 +71,8 @@ PYBIND11_MODULE(pybind11_test_mod, mod) { mod.def("returnArray3", returnArray3); mod.def("returnConstArray3", returnConstArray3); mod.def("acceptArray1", acceptArray1); - mod.def("acceptArray10", acceptArray10); - mod.def("acceptArray11", acceptArray11); + mod.def("acceptZeroShapeArray10", acceptZeroShapeArray10); + mod.def("acceptZeroShapeArray11", acceptZeroShapeArray11); mod.def("acceptArray3", acceptArray3); mod.def("acceptNoneArray", acceptNoneArray, "array"_a = nullptr); } From bfdc408fb464822422d73cb86acd47348829ceb9 Mon Sep 17 00:00:00 2001 From: Eli Rykoff Date: Mon, 10 Apr 2023 13:13:58 -0700 Subject: [PATCH 08/15] Rename functions. --- tests/pybind11_test.py | 14 ++++++++------ tests/pybind11_test_mod.cc | 8 ++++---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/tests/pybind11_test.py b/tests/pybind11_test.py index 26030bf5..d6b2f719 100644 --- a/tests/pybind11_test.py +++ b/tests/pybind11_test.py @@ -41,15 +41,16 @@ def testStrideHandling(self): # the zero shape array tests are simply checking that pybind11 can handle # arbitrary strides (non-zero for length 1 array, zero for length 0 array # for numpy >= 1.23). - pybind11_test_mod.acceptZeroShapeArray10(array) - pybind11_test_mod.acceptZeroShapeArray11(array) + pybind11_test_mod.acceptAnyArray10(array) + pybind11_test_mod.acceptAnyArray11(array) array = numpy.zeros(0, dtype=float) - pybind11_test_mod.acceptZeroShapeArray10(array) - pybind11_test_mod.acceptZeroShapeArray11(array) + pybind11_test_mod.acceptAnyArray10(array) + pybind11_test_mod.acceptAnyArray11(array) # test that we gracefully fail when the strides are no multiples of the itemsize dtype = numpy.dtype([("f1", numpy.float64), ("f2", numpy.int16)]) table = numpy.zeros(3, dtype=dtype) - self.assertRaises(TypeError, pybind11_test_mod.acceptArray10, table['f1']) + self.assertRaises(TypeError, pybind11_test_mod.acceptAnyArray10, table['f1']) + self.assertRaises(TypeError, pybind11_test_mod.acceptAnyArray11, table['f1']) def testNone(self): array = numpy.zeros(10, dtype=float) @@ -62,7 +63,8 @@ def testNonNativeByteOrder(self): d2 = numpy.dtype(">f8") nonnative = d2 if d1 == numpy.dtype(float) else d1 a = numpy.zeros(5, dtype=nonnative) - self.assertRaises(TypeError, pybind11_test_mod.acceptArray10, a) + self.assertRaises(TypeError, pybind11_test_mod.acceptAnyArray10, a) + self.assertRaises(TypeError, pybind11_test_mod.acceptAnyArray11, a) if __name__ == "__main__": diff --git a/tests/pybind11_test_mod.cc b/tests/pybind11_test_mod.cc index 96149e64..464eb2cb 100644 --- a/tests/pybind11_test_mod.cc +++ b/tests/pybind11_test_mod.cc @@ -39,9 +39,9 @@ bool acceptArray1(ndarray::Array const & a1) { #endif } -void acceptZeroShapeArray10(ndarray::Array const & a1) {} +void acceptAnyArray10(ndarray::Array const & a1) {} -void acceptZeroShapeArray11(ndarray::Array const & a1) {} +void acceptAnyArray11(ndarray::Array const & a1) {} bool acceptArray3(ndarray::Array const & a1) { ndarray::Array a2 = returnArray3(); @@ -71,8 +71,8 @@ PYBIND11_MODULE(pybind11_test_mod, mod) { mod.def("returnArray3", returnArray3); mod.def("returnConstArray3", returnConstArray3); mod.def("acceptArray1", acceptArray1); - mod.def("acceptZeroShapeArray10", acceptZeroShapeArray10); - mod.def("acceptZeroShapeArray11", acceptZeroShapeArray11); + mod.def("acceptAnyArray10", acceptAnyArray10); + mod.def("acceptAnyArray11", acceptAnyArray11); mod.def("acceptArray3", acceptArray3); mod.def("acceptNoneArray", acceptNoneArray, "array"_a = nullptr); } From 5dd165c75faeb79efccc58370d2eb422ee6ceb4f Mon Sep 17 00:00:00 2001 From: hsk17 Date: Thu, 27 Apr 2023 15:21:04 +0200 Subject: [PATCH 09/15] formatting.h: add include add "#include " to fix gcc-13 compile time error "std::int8_t has not been declared" --- include/ndarray/formatting.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/ndarray/formatting.h b/include/ndarray/formatting.h index e3f34b87..d716033e 100644 --- a/include/ndarray/formatting.h +++ b/include/ndarray/formatting.h @@ -19,6 +19,7 @@ #include "ndarray/ExpressionBase.h" +#include #include namespace ndarray { From e22959f1dcfa2b9fffc31af9828c6dbfe98c7866 Mon Sep 17 00:00:00 2001 From: Matthias Wittgen Date: Tue, 20 Jun 2023 13:17:53 -0700 Subject: [PATCH 10/15] Avoid using boost::unary_function and boost::binary_function --- include/ndarray/operators.h | 54 +++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/include/ndarray/operators.h b/include/ndarray/operators.h index 9d671444..3ce6749f 100644 --- a/include/ndarray/operators.h +++ b/include/ndarray/operators.h @@ -64,6 +64,56 @@ struct BinaryPredicate { typedef bool result_type; }; +// Local helper classes to avoid using the Boost ones, +// which inherit from boost::unary_function and boost::binary_function +// Boost might use the std implementations underneath, +// which are removed in the C++17 standard, but are still supported by some compilers +// in C++20 + +template +class _binder1st { +public: + using second_argument_type = typename boost::binary_traits::second_argument_type; + using result_type = typename boost::binary_traits::result_type; + + _binder1st(typename boost::binary_traits::param_type x, + typename boost::call_traits::first_argument_type>::param_type y) + : + op(x), value(y) {} + + typename boost::binary_traits::result_type + operator()( + typename boost::call_traits::second_argument_type>::param_type x) const { + return op(value, x); + } + +protected: + typename boost::binary_traits::function_type op; + typename boost::binary_traits::first_argument_type value; +}; + +template +class _binder2nd { +public: + using first_argument_type = typename boost::binary_traits; + using result_type = typename boost::binary_traits::result_type; + + _binder2nd(typename boost::binary_traits::param_type x, + typename boost::call_traits::second_argument_type>::param_type y) + : + op(x), value(y) {} + + typename boost::binary_traits::result_type + operator()( + typename boost::call_traits::first_argument_type>::param_type x) const { + return op(x, value); + } + +protected: + typename boost::binary_traits::function_type op; + typename boost::binary_traits::second_argument_type value; +}; + /** * \internal @class AdaptableFunctionTag * \brief A CRTP base class for non-template classes that contain a templated functor. @@ -78,7 +128,7 @@ struct AdaptableFunctionTag { typedef typename Derived::template ScalarFunction< A, typename ExpressionTraits::Element > BinaryFunction; - typedef boost::binder1st Bound; + typedef _binder1st Bound; static Bound bind(A const & scalar) { return Bound(BinaryFunction(),scalar); } @@ -89,7 +139,7 @@ struct AdaptableFunctionTag { typedef typename Derived::template ScalarFunction< typename ExpressionTraits::Element, B > BinaryFunction; - typedef boost::binder2nd Bound; + typedef _binder2nd Bound; static Bound bind(B const & scalar) { return Bound(BinaryFunction(),scalar); } From 6e35f9a02905ac171931adc5bd18f317e80fce90 Mon Sep 17 00:00:00 2001 From: Matthias Wittgen Date: Tue, 20 Jun 2023 17:23:57 -0700 Subject: [PATCH 11/15] Define binary_traits locally --- include/ndarray/operators.h | 41 ++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/include/ndarray/operators.h b/include/ndarray/operators.h index 3ce6749f..5ff06cbe 100644 --- a/include/ndarray/operators.h +++ b/include/ndarray/operators.h @@ -18,7 +18,6 @@ #include "ndarray/Array.h" #include -#include #include #include "ndarray/detail/UnaryOp.h" @@ -70,48 +69,56 @@ struct BinaryPredicate { // which are removed in the C++17 standard, but are still supported by some compilers // in C++20 +template +struct binary_traits +{ + typedef Operation function_type; + typedef const function_type & param_type; + typedef typename Operation::result_type result_type; + typedef typename Operation::first_argument_type first_argument_type; + typedef typename Operation::second_argument_type second_argument_type; +}; + template class _binder1st { public: - using second_argument_type = typename boost::binary_traits::second_argument_type; - using result_type = typename boost::binary_traits::result_type; + using result_type = typename binary_traits::result_type; - _binder1st(typename boost::binary_traits::param_type x, - typename boost::call_traits::first_argument_type>::param_type y) + _binder1st(typename binary_traits::param_type x, + typename boost::call_traits::first_argument_type>::param_type y) : op(x), value(y) {} - typename boost::binary_traits::result_type + typename binary_traits::result_type operator()( - typename boost::call_traits::second_argument_type>::param_type x) const { + typename boost::call_traits::second_argument_type>::param_type x) const { return op(value, x); } protected: - typename boost::binary_traits::function_type op; - typename boost::binary_traits::first_argument_type value; + typename binary_traits::function_type op; + typename binary_traits::first_argument_type value; }; template class _binder2nd { public: - using first_argument_type = typename boost::binary_traits; - using result_type = typename boost::binary_traits::result_type; + using result_type = typename binary_traits::result_type; - _binder2nd(typename boost::binary_traits::param_type x, - typename boost::call_traits::second_argument_type>::param_type y) + _binder2nd(typename binary_traits::param_type x, + typename boost::call_traits::second_argument_type>::param_type y) : op(x), value(y) {} - typename boost::binary_traits::result_type + typename binary_traits::result_type operator()( - typename boost::call_traits::first_argument_type>::param_type x) const { + typename boost::call_traits::first_argument_type>::param_type x) const { return op(x, value); } protected: - typename boost::binary_traits::function_type op; - typename boost::binary_traits::second_argument_type value; + typename binary_traits::function_type op; + typename binary_traits::second_argument_type value; }; /** From 4d58d4e44ace32d7ccb194fd3fc7b6cf4f1a3d19 Mon Sep 17 00:00:00 2001 From: Jim Bosch Date: Thu, 10 Oct 2024 09:45:19 -0400 Subject: [PATCH 12/15] Update Python CI versions. --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c14fc6c6..f626d31d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["2.7", "3.7", "3.8", "3.9", "3.10"] + python-version: ["3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v2 - uses: conda-incubator/setup-miniconda@v2 From 7364bb9a98b24a80fdbf4d4abbb3b4fd79375391 Mon Sep 17 00:00:00 2001 From: Jim Bosch Date: Thu, 10 Oct 2024 09:53:22 -0400 Subject: [PATCH 13/15] Print conda env dependency versions in CI. --- .github/workflows/build.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index f626d31d..9e4244d2 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -26,6 +26,9 @@ jobs: environment-file: etc/conda-forge-testing.yaml activate-environment: ndarray + - name: Print conda environment + run: conda list -n ndarray + - name: Create Build Environment # Some projects don't allow in-source building, so create a separate build directory # We'll use this as our working directory for all subsequent commands From 0ec5d83d735bcab160190090ff117bb7624f9661 Mon Sep 17 00:00:00 2001 From: Matthias Wittgen Date: Sat, 28 Feb 2026 15:31:13 -0800 Subject: [PATCH 14/15] Fix compilation issues with newer compilers and boost versions --- CHANGELOG.md | 6 ++++++ include/ndarray/ArrayBase.h | 6 +----- include/ndarray/Vector.h | 1 + 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e350d59f..33a8de5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # ndarray change log +## 1.6.5 + +### Bug fixes + +Fix compilation issues with newer compiler and boost versions. + ## 1.5.1 ### Bug fixes diff --git a/include/ndarray/ArrayBase.h b/include/ndarray/ArrayBase.h index 79325028..085a44c0 100644 --- a/include/ndarray/ArrayBase.h +++ b/include/ndarray/ArrayBase.h @@ -85,11 +85,7 @@ class ArrayBase : public ExpressionBase { /// @brief Return a single element from the array. Element & operator[](Index const & i) const { - return *(this->_data + this->_core-> - #ifndef _MSC_VER - template - #endif - computeOffset(i)); + return *(this->_data + this->_core->computeOffset(i)); } /// @brief Return an Iterator to the beginning of the array. diff --git a/include/ndarray/Vector.h b/include/ndarray/Vector.h index f8e476c6..13e6cb07 100644 --- a/include/ndarray/Vector.h +++ b/include/ndarray/Vector.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include From 44c5f66c6088454cb1057a8f8ae0453242ec7fe9 Mon Sep 17 00:00:00 2001 From: Matthias Wittgen Date: Sat, 28 Feb 2026 15:52:28 -0800 Subject: [PATCH 15/15] Update python build matrix --- .github/workflows/build.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 9e4244d2..af64045c 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -13,10 +13,10 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v2 - - uses: conda-incubator/setup-miniconda@v2 + - uses: conda-incubator/setup-miniconda@v3 with: auto-update-conda: true miniconda-version: "latest"