Skip to content

Backport PR #3607 on branch 1.11.x ((chore): derive CI matrix from hatch env)#3647

Merged
flying-sheep merged 4 commits into1.11.xfrom
auto-backport-of-pr-3607-on-1.11.x
May 28, 2025
Merged

Backport PR #3607 on branch 1.11.x ((chore): derive CI matrix from hatch env)#3647
flying-sheep merged 4 commits into1.11.xfrom
auto-backport-of-pr-3607-on-1.11.x

Conversation

@flying-sheep
Copy link
Copy Markdown
Member

Backports #3607

@flying-sheep
Copy link
Copy Markdown
Member Author

@ilan-gold what do you think: louvain 0.7.1 makes things crash, but 0.7.2 requires igraph≥0.9.5.

should I bump things until everything works together or disable louvain for the low-vers job in this backport?

@flying-sheep flying-sheep requested a review from ilan-gold May 27, 2025 09:14
@ilan-gold
Copy link
Copy Markdown
Contributor

@ilan-gold what do you think: louvain 0.7.1 makes things crash, but 0.7.2 requires igraph≥0.9.5.

Sorry, isn't the igraph minimum version higher than 0.9.5? Why is this problematic?

@flying-sheep
Copy link
Copy Markdown
Member Author

flying-sheep commented May 27, 2025

ah my mistake, I read uv’s error wrong. What it really says is

louvain==0.7.2 depends on igraph>=0.9.5,<0.10 and scanpy[test]==1.11.2.dev29+g607bfb8f8.d20250527 depends on igraph==0.10.8

so louvain 0.7.2 introduced1 an upper bound that’s incompatible, which means that louvain~=0.7 isn’t compatible with e.g. the minimum leiden version we support and needs to be bumped.


I guess it would be valid to say “scanpy 0.11.x works with (louvain==0.7.2 and igraph==0.9.5) or (leiden==0.9.0 and igraph==0.10.8)”, but that’s getting too far into the weeds.

Let’s just define one baseline for low versions and that’s it.

Footnotes

  1. in actuality that bound was of course there earlier, that’s why things crash. 0.7.2 just made the bound explicit.

@codecov
Copy link
Copy Markdown

codecov bot commented May 27, 2025

❌ 3 Tests Failed:

Tests completed Failed Passed Skipped
1984 3 1981 107
View the full list of 3 ❄️ flaky tests
tests/test_preprocessing.py::test_regress_out_constants

Flake rate in main: 40.00% (Passed 3 times, Failed 2 times)

Stack Traces | 0.011s run time
#x1B[0m#x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mtest_regress_out_constants#x1B[39;49;00m():#x1B[90m#x1B[39;49;00m
        adata = AnnData(np.hstack((np.full((#x1B[94m10#x1B[39;49;00m, #x1B[94m1#x1B[39;49;00m), #x1B[94m0.0#x1B[39;49;00m), np.full((#x1B[94m10#x1B[39;49;00m, #x1B[94m1#x1B[39;49;00m), #x1B[94m1.0#x1B[39;49;00m))))#x1B[90m#x1B[39;49;00m
        adata.obs[#x1B[33m"#x1B[39;49;00m#x1B[33mpercent_mito#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m] = np.random.rand(adata.X.shape[#x1B[94m0#x1B[39;49;00m])#x1B[90m#x1B[39;49;00m
        adata.obs[#x1B[33m"#x1B[39;49;00m#x1B[33mn_counts#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m] = adata.X.sum(axis=#x1B[94m1#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m
        adata_copy = adata.copy()#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
>       sc.pp.regress_out(adata, keys=[#x1B[33m"#x1B[39;49;00m#x1B[33mn_counts#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, #x1B[33m"#x1B[39;49;00m#x1B[33mpercent_mito#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m])#x1B[90m#x1B[39;49;00m

#x1B[1m#x1B[31mtests/test_preprocessing.py#x1B[0m:467: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../site-packages/legacy_api_wrap/__init__.py#x1B[0m:82: in fn_compatible
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m fn(*args_all, **kw)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../scanpy/preprocessing/_simple.py#x1B[0m:787: in regress_out
    #x1B[0mres = Parallel(n_jobs=n_jobs)(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12....../site-packages/joblib/parallel.py#x1B[0m:1986: in __call__
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m output #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.return_generator #x1B[94melse#x1B[39;49;00m #x1B[96mlist#x1B[39;49;00m(output)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12....../site-packages/joblib/parallel.py#x1B[0m:1914: in _get_sequential_output
    #x1B[0mres = func(*args, **kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../scanpy/preprocessing/_simple.py#x1B[0m:809: in _regress_out_chunk
    #x1B[0m#x1B[94mimport#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mstatsmodels#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mapi#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mas#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96msm#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../site-packages/statsmodels/api.py#x1B[0m:76: in <module>
    #x1B[0m#x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m datasets, distributions, iolib, regression, robust, tools#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../statsmodels/distributions/__init__.py#x1B[0m:7: in <module>
    #x1B[0m#x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mdiscrete#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m (#x1B[90m#x1B[39;49;00m
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    #x1B[0m#x1B[94mimport#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mnumpy#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mas#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mnp#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
    #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mscipy#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mstats#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m rv_discrete, poisson, nbinom#x1B[90m#x1B[39;49;00m
    #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mscipy#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mspecial#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m gammaln#x1B[90m#x1B[39;49;00m
>   #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mscipy#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96m_lib#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96m_util#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m _lazywhere#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE   ImportError: cannot import name '_lazywhere' from 'scipy._lib._util' (/home/runner/..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../scipy/_lib/_util.py)#x1B[0m

#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../statsmodels/distributions/discrete.py#x1B[0m:5: ImportError
tests/test_preprocessing.py::test_regress_out_constants_equivalent

Flake rate in main: 40.00% (Passed 3 times, Failed 2 times)

Stack Traces | 0.034s run time
#x1B[0m#x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mtest_regress_out_constants_equivalent#x1B[39;49;00m():#x1B[90m#x1B[39;49;00m
        #x1B[90m# Tests that constant values don't change results#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[90m# (since support for constant values is implemented by us)#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96msklearn#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mdatasets#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m make_blobs#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        X, cat = make_blobs(#x1B[94m100#x1B[39;49;00m, #x1B[94m20#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m
        a = sc.AnnData(np.hstack([X, np.zeros((#x1B[94m100#x1B[39;49;00m, #x1B[94m5#x1B[39;49;00m))]), obs={#x1B[33m"#x1B[39;49;00m#x1B[33mcat#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m: pd.Categorical(cat)})#x1B[90m#x1B[39;49;00m
        b = sc.AnnData(X, obs={#x1B[33m"#x1B[39;49;00m#x1B[33mcat#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m: pd.Categorical(cat)})#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
>       sc.pp.regress_out(a, #x1B[33m"#x1B[39;49;00m#x1B[33mcat#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m

#x1B[1m#x1B[31mtests/test_preprocessing.py#x1B[0m:490: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../site-packages/legacy_api_wrap/__init__.py#x1B[0m:82: in fn_compatible
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m fn(*args_all, **kw)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../scanpy/preprocessing/_simple.py#x1B[0m:787: in regress_out
    #x1B[0mres = Parallel(n_jobs=n_jobs)(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12....../site-packages/joblib/parallel.py#x1B[0m:1986: in __call__
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m output #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.return_generator #x1B[94melse#x1B[39;49;00m #x1B[96mlist#x1B[39;49;00m(output)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12....../site-packages/joblib/parallel.py#x1B[0m:1914: in _get_sequential_output
    #x1B[0mres = func(*args, **kwargs)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../scanpy/preprocessing/_simple.py#x1B[0m:809: in _regress_out_chunk
    #x1B[0m#x1B[94mimport#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mstatsmodels#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mapi#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mas#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96msm#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../site-packages/statsmodels/api.py#x1B[0m:76: in <module>
    #x1B[0m#x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m datasets, distributions, iolib, regression, robust, tools#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../statsmodels/distributions/__init__.py#x1B[0m:7: in <module>
    #x1B[0m#x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mdiscrete#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m (#x1B[90m#x1B[39;49;00m
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    #x1B[0m#x1B[94mimport#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mnumpy#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mas#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mnp#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
    #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mscipy#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mstats#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m rv_discrete, poisson, nbinom#x1B[90m#x1B[39;49;00m
    #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mscipy#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96mspecial#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m gammaln#x1B[90m#x1B[39;49;00m
>   #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mscipy#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96m_lib#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96m_util#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m _lazywhere#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE   ImportError: cannot import name '_lazywhere' from 'scipy._lib._util' (/home/runner/..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../scipy/_lib/_util.py)#x1B[0m

#x1B[1m#x1B[31m../../../..../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../statsmodels/distributions/discrete.py#x1B[0m:5: ImportError
tests/test_preprocessing.py::test_regress_out_categorical

Flake rate in main: 40.00% (Passed 3 times, Failed 2 times)

Stack Traces | 19.1s run time
joblib.externals.loky.process_executor._RemoteTraceback: 
"""
Traceback (most recent call last):
  File "......................../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../externals/loky/process_executor.py", line 490, in _process_worker
    r = call_item()
        ^^^^^^^^^^^
  File "......................../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../externals/loky/process_executor.py", line 291, in __call__
    return self.fn(*self.args, **self.kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "......................../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12...................../site-packages/joblib/parallel.py", line 607, in __call__
    return [func(*args, **kwargs) for func, args, kwargs in self.items]
            ^^^^^^^^^^^^^^^^^^^^^
  File ".../scanpy/preprocessing/_simple.py", line 809, in _regress_out_chunk
    import statsmodels.api as sm
  File "......................../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../site-packages/statsmodels/api.py", line 76, in <module>
    from . import datasets, distributions, iolib, regression, robust, tools
  File "......................../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../statsmodels/distributions/__init__.py", line 7, in <module>
    from .discrete import (
  File "......................../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../statsmodels/distributions/discrete.py", line 5, in <module>
    from scipy._lib._util import _lazywhere
ImportError: cannot import name '_lazywhere' from 'scipy._lib._util' (......................../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../scipy/_lib/_util.py)
"""

#x1B[33mThe above exception was the direct cause of the following exception:#x1B[0m

    #x1B[0m#x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92mtest_regress_out_categorical#x1B[39;49;00m():#x1B[90m#x1B[39;49;00m
        #x1B[94mimport#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mpandas#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mas#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mpd#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        #x1B[94mfrom#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[04m#x1B[96mscipy#x1B[39;49;00m#x1B[04m#x1B[96m.#x1B[39;49;00m#x1B[04m#x1B[96msparse#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[94mimport#x1B[39;49;00m random#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
        adata = AnnData(random(#x1B[94m1000#x1B[39;49;00m, #x1B[94m100#x1B[39;49;00m, density=#x1B[94m0.6#x1B[39;49;00m, #x1B[96mformat#x1B[39;49;00m=#x1B[33m"#x1B[39;49;00m#x1B[33mcsr#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m))#x1B[90m#x1B[39;49;00m
        #x1B[90m# create a categorical column#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
        adata.obs[#x1B[33m"#x1B[39;49;00m#x1B[33mbatch#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m] = pd.Categorical(np.random.randint(#x1B[94m1#x1B[39;49;00m, #x1B[94m4#x1B[39;49;00m, size=adata.X.shape[#x1B[94m0#x1B[39;49;00m]))#x1B[90m#x1B[39;49;00m
    #x1B[90m#x1B[39;49;00m
>       multi = sc.pp.regress_out(adata, keys=#x1B[33m"#x1B[39;49;00m#x1B[33mbatch#x1B[39;49;00m#x1B[33m"#x1B[39;49;00m, n_jobs=#x1B[94m8#x1B[39;49;00m, copy=#x1B[94mTrue#x1B[39;49;00m)#x1B[90m#x1B[39;49;00m

#x1B[1m#x1B[31mtests/test_preprocessing.py#x1B[0m:457: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
#x1B[1m#x1B[31m../../../.local.../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../site-packages/legacy_api_wrap/__init__.py#x1B[0m:82: in fn_compatible
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m fn(*args_all, **kw)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[.../scanpy/preprocessing/_simple.py#x1B[0m:787: in regress_out
    #x1B[0mres = Parallel(n_jobs=n_jobs)(#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../.local.../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12...................../site-packages/joblib/parallel.py#x1B[0m:2072: in __call__
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m output #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.return_generator #x1B[94melse#x1B[39;49;00m #x1B[96mlist#x1B[39;49;00m(output)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../.local.../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12...................../site-packages/joblib/parallel.py#x1B[0m:1682: in _get_outputs
    #x1B[0m#x1B[94myield from#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._retrieve()#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../.local.../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12...................../site-packages/joblib/parallel.py#x1B[0m:1784: in _retrieve
    #x1B[0m#x1B[96mself#x1B[39;49;00m._raise_error_fast()#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../.local.../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12...................../site-packages/joblib/parallel.py#x1B[0m:1859: in _raise_error_fast
    #x1B[0merror_job.get_result(#x1B[96mself#x1B[39;49;00m.timeout)#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31m../../../.local.../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12...................../site-packages/joblib/parallel.py#x1B[0m:758: in get_result
    #x1B[0m#x1B[94mreturn#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._return_or_raise()#x1B[90m#x1B[39;49;00m
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <joblib.parallel.BatchCompletionCallBack object at 0x7efbae5f0d10>

    #x1B[0m#x1B[94mdef#x1B[39;49;00m#x1B[90m #x1B[39;49;00m#x1B[92m_return_or_raise#x1B[39;49;00m(#x1B[96mself#x1B[39;49;00m):#x1B[90m#x1B[39;49;00m
        #x1B[94mtry#x1B[39;49;00m:#x1B[90m#x1B[39;49;00m
            #x1B[94mif#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m.status == TASK_ERROR:#x1B[90m#x1B[39;49;00m
>               #x1B[94mraise#x1B[39;49;00m #x1B[96mself#x1B[39;49;00m._result#x1B[90m#x1B[39;49;00m
#x1B[1m#x1B[31mE               ImportError: cannot import name '_lazywhere' from 'scipy._lib._util' (......................../home/runner/.local.../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12.../scipy/_lib/_util.py)#x1B[0m

#x1B[1m#x1B[31m../../../.local.../scanpy/B9PcT7QG/hatch-test.pre/lib/python3.12...................../site-packages/joblib/parallel.py#x1B[0m:773: ImportError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@ilan-gold
Copy link
Copy Markdown
Contributor

ilan-gold commented May 27, 2025

The fix seems reasonable @flying-sheep. Another option would be to introduce a temporary fix into the min-vers.py file but I think the number of people using only louvain without leiden (or something else requiring a higher leiden bound) is probably vanishingly low.

@flying-sheep flying-sheep enabled auto-merge (squash) May 27, 2025 10:14
@flying-sheep flying-sheep disabled auto-merge May 28, 2025 07:25
@flying-sheep flying-sheep merged commit fa36e63 into 1.11.x May 28, 2025
7 of 9 checks passed
@flying-sheep flying-sheep deleted the auto-backport-of-pr-3607-on-1.11.x branch May 28, 2025 07:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants