Repository: python-graphblas/python-graphblas (language: python)

Issue:
bug: deprecating python 3.8 support might resolve it
Below is a traceback from a failing test on Python 3.8 (the 3.9 version appears to run fine, albeit there's the extra ubuntu-vs-macos dimension):

<details>

```bash
Run if [[ source == "wheel" ]]; then
Collecting suitesparse-graphblas
  Downloading suitesparse-graphblas-7.4.4.0.tar.gz (132 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 132.5/132.5 kB 5.5 MB/s eta 0:00:00
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to build wheel: started
  Getting requirements to build wheel: finished with status 'done'
  Preparing metadata (pyproject.toml): started
  Preparing metadata (pyproject.toml): finished with status 'done'
Building wheels for collected packages: suitesparse-graphblas
  Building wheel for suitesparse-graphblas (pyproject.toml): started
  Building wheel for suitesparse-graphblas (pyproject.toml): finished with status 'error'
  error: subprocess-exited-with-error
  
  × Building wheel for suitesparse-graphblas (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [140 lines of output]
      running bdist_wheel
      running build
      running build_py
      creating build
      creating build/lib.macosx-10.9-x86_64-cpython-38
      creating build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas
      copying suitesparse_graphblas/matrix.py -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas
      copying suitesparse_graphblas/vector.py -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas
      copying suitesparse_graphblas/scalar.py -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas
      copying suitesparse_graphblas/__init__.py -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas
      copying suitesparse_graphblas/exceptions.py -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas
      copying suitesparse_graphblas/create_headers.py -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas
      creating build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas/tests
      copying suitesparse_graphblas/tests/conftest.py -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas/tests
      copying suitesparse_graphblas/tests/test_package.py -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas/tests
      copying suitesparse_graphblas/tests/test_exceptions.py -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas/tests
      copying suitesparse_graphblas/tests/__init__.py -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas/tests
      copying suitesparse_graphblas/tests/test_io.py -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas/tests
      copying suitesparse_graphblas/tests/test_doctest.py -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas/tests
      copying suitesparse_graphblas/tests/test_scalar.py -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas/tests
      copying suitesparse_graphblas/tests/test_initialize.py -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas/tests
      creating build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas/io
      copying suitesparse_graphblas/io/serialize.py -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas/io
      copying suitesparse_graphblas/io/binary.py -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas/io
      copying suitesparse_graphblas/io/__init__.py -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas/io
      running egg_info
      writing suitesparse_graphblas.egg-info/PKG-INFO
      writing dependency_links to suitesparse_graphblas.egg-info/dependency_links.txt
      writing requirements to suitesparse_graphblas.egg-info/requires.txt
      writing top-level names to suitesparse_graphblas.egg-info/top_level.txt
      reading manifest file 'suitesparse_graphblas.egg-info/SOURCES.txt'
      reading manifest template 'MANIFEST.in'
      adding license file 'LICENSE'
      writing manifest file 'suitesparse_graphblas.egg-info/SOURCES.txt'
      copying suitesparse_graphblas/source.c -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas
      copying suitesparse_graphblas/suitesparse_graphblas.h -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas
      copying suitesparse_graphblas/suitesparse_graphblas_arm64.h -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas
      copying suitesparse_graphblas/suitesparse_graphblas_no_complex.h -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas
      copying suitesparse_graphblas/utils.c -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas
      copying suitesparse_graphblas/utils.pxd -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas
      copying suitesparse_graphblas/utils.pyx -> build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas
      running build_ext
      generating cffi module 'build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c'
      creating build/temp.macosx-10.9-x86_64-cpython-38
      building 'suitesparse_graphblas.utils' extension
      creating build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas
      clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -fwrapv -O2 -Wall -fPIC -O2 -isystem /Users/runner/miniconda3/envs/graphblas/include -fPIC -O2 -isystem /Users/runner/miniconda3/envs/graphblas/include -DNPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION -I/private/var/folders/24/8k48jl6d249_n_qfxwsl6xvm0000gn/T/pip-build-env-7a5vl165/overlay/lib/python3.8/site-packages/numpy/core/include -I/Users/runner/miniconda3/envs/graphblas/include -I/Users/runner/miniconda3/envs/graphblas/include/python3.8 -c suitesparse_graphblas/utils.c -o build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas/utils.o
      suitesparse_graphblas/utils.c:8356:5: warning: 'tp_print' is deprecated [-Wdeprecated-declarations]
          0,
          ^
      /Users/runner/miniconda3/envs/graphblas/include/python3.8/cpython/object.h:260:5: note: 'tp_print' has been explicitly marked deprecated here
          Py_DEPRECATED(3.8) int (*tp_print)(PyObject *, FILE *, int);
          ^
      /Users/runner/miniconda3/envs/graphblas/include/python3.8/pyport.h:515:54: note: expanded from macro 'Py_DEPRECATED'
      #define Py_DEPRECATED(VERSION_UNUSED) __attribute__((__deprecated__))
                                                           ^
      1 warning generated.
      clang -bundle -undefined dynamic_lookup -Wl,-rpath,/Users/runner/miniconda3/envs/graphblas/lib -L/Users/runner/miniconda3/envs/graphblas/lib -Wl,-rpath,/Users/runner/miniconda3/envs/graphblas/lib -L/Users/runner/miniconda3/envs/graphblas/lib build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas/utils.o -o build/lib.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas/utils.cpython-38-darwin.so
      building 'suitesparse_graphblas._graphblas' extension
      creating build/temp.macosx-10.9-x86_64-cpython-38/build
      creating build/temp.macosx-10.9-x86_64-cpython-38/build/temp.macosx-10.9-x86_64-cpython-38
      clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -fwrapv -O2 -Wall -fPIC -O2 -isystem /Users/runner/miniconda3/envs/graphblas/include -fPIC -O2 -isystem /Users/runner/miniconda3/envs/graphblas/include -I/Users/runner/miniconda3/envs/graphblas/include -I/Users/runner/miniconda3/envs/graphblas/include/python3.8 -c build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c -o build/temp.macosx-10.9-x86_64-cpython-38/build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.o
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:4613:12: error: use of undeclared identifier 'GxB_DESCRIPTOR_NTHREADS'
        int n = (GxB_DESCRIPTOR_NTHREADS) <= 0;
                 ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:4614:30: error: use of undeclared identifier 'GxB_DESCRIPTOR_NTHREADS'
        *o = (unsigned long long)((GxB_DESCRIPTOR_NTHREADS) | 0);  /* check that GxB_DESCRIPTOR_NTHREADS is an integer */
                                   ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:4620:12: error: use of undeclared identifier 'GxB_DESCRIPTOR_CHUNK'
        int n = (GxB_DESCRIPTOR_CHUNK) <= 0;
                 ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:4621:30: error: use of undeclared identifier 'GxB_DESCRIPTOR_CHUNK'
        *o = (unsigned long long)((GxB_DESCRIPTOR_CHUNK) | 0);  /* check that GxB_DESCRIPTOR_CHUNK is an integer */
                                   ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:4627:12: error: use of undeclared identifier 'GxB_DESCRIPTOR_GPU_CONTROL'
        int n = (GxB_DESCRIPTOR_GPU_CONTROL) <= 0;
                 ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:4628:30: error: use of undeclared identifier 'GxB_DESCRIPTOR_GPU_CONTROL'
        *o = (unsigned long long)((GxB_DESCRIPTOR_GPU_CONTROL) | 0);  /* check that GxB_DESCRIPTOR_GPU_CONTROL is an integer */
                                   ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:4634:12: error: use of undeclared identifier 'GxB_DESCRIPTOR_GPU_CHUNK'
        int n = (GxB_DESCRIPTOR_GPU_CHUNK) <= 0;
                 ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:4635:30: error: use of undeclared identifier 'GxB_DESCRIPTOR_GPU_CHUNK'
        *o = (unsigned long long)((GxB_DESCRIPTOR_GPU_CHUNK) | 0);  /* check that GxB_DESCRIPTOR_GPU_CHUNK is an integer */
                                   ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:4704:12: error: use of undeclared identifier 'GxB_GPU_ALWAYS'
        int n = (GxB_GPU_ALWAYS) <= 0;
                 ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:4705:30: error: use of undeclared identifier 'GxB_GPU_ALWAYS'
        *o = (unsigned long long)((GxB_GPU_ALWAYS) | 0);  /* check that GxB_GPU_ALWAYS is an integer */
                                   ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:4711:12: error: use of undeclared identifier 'GxB_GPU_NEVER'
        int n = (GxB_GPU_NEVER) <= 0;
                 ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:4712:30: error: use of undeclared identifier 'GxB_GPU_NEVER'
        *o = (unsigned long long)((GxB_GPU_NEVER) | 0);  /* check that GxB_GPU_NEVER is an integer */
                                   ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:5152:12: error: use of undeclared identifier 'GxB_GLOBAL_GPU_CONTROL'; did you mean 'GxB_GLOBAL_GPU_ID'?
        int n = (GxB_GLOBAL_GPU_CONTROL) <= 0;
                 ^~~~~~~~~~~~~~~~~~~~~~
                 GxB_GLOBAL_GPU_ID
      /Users/runner/miniconda3/envs/graphblas/include/GraphBLAS.h:3978:5: note: 'GxB_GLOBAL_GPU_ID' declared here
          GxB_GLOBAL_GPU_ID = GxB_GPU_ID,      // which GPU to use (DRAFT)
          ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:5153:30: error: use of undeclared identifier 'GxB_GLOBAL_GPU_CONTROL'; did you mean 'GxB_GLOBAL_GPU_ID'?
        *o = (unsigned long long)((GxB_GLOBAL_GPU_CONTROL) | 0);  /* check that GxB_GLOBAL_GPU_CONTROL is an integer */
                                   ^~~~~~~~~~~~~~~~~~~~~~
                                   GxB_GLOBAL_GPU_ID
      /Users/runner/miniconda3/envs/graphblas/include/GraphBLAS.h:3978:5: note: 'GxB_GLOBAL_GPU_ID' declared here
          GxB_GLOBAL_GPU_ID = GxB_GPU_ID,      // which GPU to use (DRAFT)
          ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:5159:12: error: use of undeclared identifier 'GxB_GLOBAL_GPU_CHUNK'; did you mean 'GxB_GLOBAL_CHUNK'?
        int n = (GxB_GLOBAL_GPU_CHUNK) <= 0;
                 ^~~~~~~~~~~~~~~~~~~~
                 GxB_GLOBAL_CHUNK
      /Users/runner/miniconda3/envs/graphblas/include/GraphBLAS.h:3977:5: note: 'GxB_GLOBAL_CHUNK' declared here
          GxB_GLOBAL_CHUNK = GxB_CHUNK,        // chunk size for small problems.
          ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:5160:30: error: use of undeclared identifier 'GxB_GLOBAL_GPU_CHUNK'; did you mean 'GxB_GLOBAL_CHUNK'?
        *o = (unsigned long long)((GxB_GLOBAL_GPU_CHUNK) | 0);  /* check that GxB_GLOBAL_GPU_CHUNK is an integer */
                                   ^~~~~~~~~~~~~~~~~~~~
                                   GxB_GLOBAL_CHUNK
      /Users/runner/miniconda3/envs/graphblas/include/GraphBLAS.h:3977:5: note: 'GxB_GLOBAL_CHUNK' declared here
          GxB_GLOBAL_CHUNK = GxB_CHUNK,        // chunk size for small problems.
          ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:5228:10: error: implicit declaration of function 'GB_BinaryOp_new' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        return GB_BinaryOp_new(x0, x1, x2, x3, x4, x5);
               ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:5305:14: error: implicit declaration of function 'GB_BinaryOp_new' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        { result = GB_BinaryOp_new(x0, x1, x2, x3, x4, x5); }
                   ^
      build/temp.macosx-10.9-x86_64-cpython-38/suitesparse_graphblas._graphblas.c:5481:10: error: implicit declaration of function 'GB_SelectOp_new' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
        return GB_SelectOp_new(x0, x1, x2, x3, x4);
               ^
      fatal error: too many errors emitted, stopping now [-ferror-limit=]
      20 errors generated.
      /private/var/folders/24/8k48jl6d249_n_qfxwsl6xvm0000gn/T/pip-build-env-7a5vl165/overlay/lib/python3.8/site-packages/setuptools/config/pyprojecttoml.py:66: _BetaConfiguration: Support for `[tool.setuptools]` in `pyproject.toml` is still *beta*.
        config = read_configuration(filepath, True, ignore_option_errors, dist)
      error: command '/usr/bin/clang' failed with exit code 1
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for suitesparse-graphblas
ERROR: Could not build wheels for suitesparse-graphblas, which is required to install pyproject.toml-based projects
Failed to build suitesparse-graphblas
Error: Process completed with exit code 1.
```

</details>

The full set of results is here: https://github.com/python-graphblas/python-graphblas/actions/runs/5152658998/jobs/9278993418?pr=457

Perhaps this will go away once the 3.8 version support is dropped.


Discussion / hints:
Thanks for the report @SultanOrazbayev!

Oh, I see the problem: it's installing `graphblas=8.0.0`, which needs #456, and `python-suitesparse-python=7.4.4`. If we're installing `suitesparse-graphblas` via wheels, we should not be installing `graphblas` from conda-forge, so this is wrong. If necessary, I can also update the github action workflow to contrain the version of graphblas we install. In the past, we've been faster to upgrade to new breaking releases of SuiteSparse:GraphBLAS.

Btw, we can drop Python 3.8 at any time, and I would be curious how complete this document is:
https://github.com/python-graphblas/python-graphblas/wiki/Drop-support-of-old-Python-version

Fix patch:
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 4588ed4f4..4d0e5c0b6 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -66,7 +66,7 @@ repos:
       - id: black
       - id: black-jupyter
   - repo: https://github.com/charliermarsh/ruff-pre-commit
-    rev: v0.0.269
+    rev: v0.0.270
     hooks:
       - id: ruff
         args: [--fix-only, --show-fixes]
@@ -94,7 +94,7 @@ repos:
         additional_dependencies: [tomli]
         files: ^(graphblas|docs)/
   - repo: https://github.com/charliermarsh/ruff-pre-commit
-    rev: v0.0.269
+    rev: v0.0.270
     hooks:
       - id: ruff
   - repo: https://github.com/sphinx-contrib/sphinx-lint
@@ -110,7 +110,7 @@ repos:
       - id: pyroma
         args: [-n, "10", .]
   - repo: https://github.com/shellcheck-py/shellcheck-py
-    rev: "v0.9.0.2"
+    rev: "v0.9.0.5"
     hooks:
     - id: shellcheck
   - repo: local
diff --git a/scripts/check_versions.sh b/scripts/check_versions.sh
index dda7adbaa..af72f9655 100755
--- a/scripts/check_versions.sh
+++ b/scripts/check_versions.sh
@@ -4,13 +4,13 @@
 # This may be helpful when updating dependency versions in CI.
 # Tip: add `--json` for more information.
 conda search 'numpy[channel=conda-forge]>=1.24.3'
-conda search 'pandas[channel=conda-forge]>=2.0.1'
+conda search 'pandas[channel=conda-forge]>=2.0.2'
 conda search 'scipy[channel=conda-forge]>=1.10.1'
 conda search 'networkx[channel=conda-forge]>=3.1'
-conda search 'awkward[channel=conda-forge]>=2.2.0'
+conda search 'awkward[channel=conda-forge]>=2.2.1'
 conda search 'sparse[channel=conda-forge]>=0.14.0'
-conda search 'fast_matrix_market[channel=conda-forge]>=1.5.1'
-conda search 'numba[channel=conda-forge]>=0.56.4'
+conda search 'fast_matrix_market[channel=conda-forge]>=1.6.0'
+conda search 'numba[channel=conda-forge]>=0.57.0'
 conda search 'pyyaml[channel=conda-forge]>=6.0'
 conda search 'flake8-bugbear[channel=conda-forge]>=23.5.9'
 conda search 'flake8-simplify[channel=conda-forge]>=0.20.0'


Test patch:
diff --git a/.github/workflows/test_and_build.yml b/.github/workflows/test_and_build.yml
index d129ef26f..ac541294f 100644
--- a/.github/workflows/test_and_build.yml
+++ b/.github/workflows/test_and_build.yml
@@ -17,9 +17,9 @@ on:
     branches:
       - main
 
-concurrency:
-  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
-  cancel-in-progress: true
+# concurrency:
+#   group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+#   cancel-in-progress: true
 
 jobs:
   rngs:
@@ -131,9 +131,9 @@ jobs:
             source
             upstream
           weights: |
-            1
-            1
-            1
+            1000000
+            1000000
+            1000000
             1
       - name: Setup mamba
         uses: conda-incubator/setup-miniconda@v2
@@ -170,7 +170,7 @@ jobs:
           nxver=$(python -c 'import random ; print(random.choice(["=2.7", "=2.8", "=3.0", "=3.1", ""]))')
           yamlver=$(python -c 'import random ; print(random.choice(["=5.4", "=6.0", ""]))')
           sparsever=$(python -c 'import random ; print(random.choice(["=0.13", "=0.14", ""]))')
-          fmmver=$(python -c 'import random ; print(random.choice(["=1.4", "=1.5", ""]))')
+          fmmver=$(python -c 'import random ; print(random.choice(["=1.4", "=1.5", "=1.6", ""]))')
           if [[ ${{ startsWith(steps.pyver.outputs.selected, '3.8') }} == true ]]; then
             npver=$(python -c 'import random ; print(random.choice(["=1.21", "=1.22", "=1.23", "=1.24", ""]))')
             spver=$(python -c 'import random ; print(random.choice(["=1.8", "=1.9", "=1.10", ""]))')
@@ -252,13 +252,14 @@ jobs:
           fi
           echo "versions: np${npver} sp${spver} pd${pdver} ak${akver} nx${nxver} numba${numbaver} yaml${yamlver} sparse${sparsever} psgver${psgver}"
 
+          set -x  # echo on
           $(command -v mamba || command -v conda) install packaging pytest coverage coveralls=3.3.1 pytest-randomly cffi donfig tomli \
             pyyaml${yamlver} ${sparse} pandas${pdver} scipy${spver} numpy${npver} ${awkward} \
             networkx${nxver} ${numba} ${fmm} ${psg} \
             ${{ matrix.slowtask == 'pytest_bizarro' && 'black' || '' }} \
             ${{ matrix.slowtask == 'notebooks' && 'matplotlib nbconvert jupyter "ipython>=7"' || '' }} \
             ${{ steps.sourcetype.outputs.selected == 'upstream' && 'cython' || '' }} \
-            ${{ steps.sourcetype.outputs.selected != 'wheel' && '"graphblas>=7.4.0"' || '' }} \
+            ${{ steps.sourcetype.outputs.selected != 'wheel' && '"graphblas=7.4"' || '' }} \
             ${{ contains(steps.pyver.outputs.selected, 'pypy') && 'pypy' || '' }}
       - name: Build extension module
         run: |
@@ -308,6 +309,7 @@ jobs:
             if [[ $H && $bizarro ]] ; then if [[ $macos  ]] ; then echo " $suitesparse" ; elif [[ $windows ]] ; then echo " $vanilla"     ; fi ; fi)
           echo ${args}
           pytest -v --pyargs suitesparse_graphblas
+          set -x  # echo on
           coverage run -m pytest --color=yes --randomly -v ${args} \
             ${{ matrix.slowtask == 'pytest_normal' && '--runslow' || '' }}
       - name: Unit tests (bizarro scalars)
@@ -343,6 +345,7 @@ jobs:
             if [[ $H && $normal  ]] ; then if [[ $macos  ]] ; then echo " $suitesparse" ; elif [[ $windows ]] ; then echo " $vanilla"     ; fi ; fi)$( \
             if [[ $H && $bizarro ]] ; then if [[ $macos  ]] ; then echo " $vanilla"     ; elif [[ $windows ]] ; then echo " $suitesparse" ; fi ; fi)
           echo ${args}
+          set -x  # echo on
           coverage run -a -m pytest --color=yes --randomly -v ${args} \
             ${{ matrix.slowtask == 'pytest_bizarro' && '--runslow' || '' }}
           git checkout .  # Undo changes to scalar default
diff --git a/graphblas/tests/test_vector.py b/graphblas/tests/test_vector.py
index bd2083fd1..36ab346b8 100644
--- a/graphblas/tests/test_vector.py
+++ b/graphblas/tests/test_vector.py
@@ -1432,7 +1432,7 @@ def test_vector_index_with_scalar():
         s0 = Scalar.from_value(0, dtype=dtype)
         w = v[[s1, s0]].new()
         assert w.isequal(expected)
-    for dtype in ["bool", "fp32", "fp64"] + ["fc32", "fc64"] if dtypes._supports_complex else []:
+    for dtype in ["bool", "fp32", "fp64"] + (["fc32", "fc64"] if dtypes._supports_complex else []):
         s = Scalar.from_value(1, dtype=dtype)
         with pytest.raises(TypeError, match="An integer is required for indexing"):
             v[s]