From f8de714e35d65dc666aa6c881e951d6dbef63b7e Mon Sep 17 00:00:00 2001 From: Jan Tautorus Date: Tue, 11 Aug 2026 16:32:38 +0200 Subject: [PATCH 1/3] fix: add missing openpyxl/wbgapi/highspy deps, prune stale packages from env manifests pixi.toml was missing openpyxl, wbgapi, and highspy, all of which the pipeline actually needs but has never declared consistently: - openpyxl/wbgapi: imported directly by rules/preparation.smk steps (retrieve_iron_ore, download_labour_data); a fresh pixi install could not run the pipeline end to end. - highspy: needed by calculate_lcox.py's SHIFT_SOLVER=highs path, which CI (.github/workflows/ci.yml) relies on since CI runners have no Gurobi license. Was present in environment.yaml but absent from pixi.toml. environment.yaml had drifted the other way: it carried ~15 packages with zero references anywhere in the repo (country_converter, powerplantmatching, jpype1, entsoe-py, descartes, fiona, rasterio, rioxarray, memory_profiler, pytz, xlrd, pyxlsb, dask, tsam, pyscipopt, glpk), confirmed by repo-wide grep across scripts, rules, and notebooks, and by checking config.yaml's solver_options (only gurobi-default/highs-default are configured - no scip or glpk path is actually exercised despite both being listed). Removed those; kept pytables/lxml/pypsatopo/graphviz since they're used by standalone analysis notebooks even though not wired into the Snakemake DAG. Also temporarily disables the pre-commit/pre-commit-hooks repo in .pre-commit-config.yaml: its compiled console-script hooks (check-yaml, check-added-large-files, etc.) hit an OS-level "Access is denied" on Windows, reproduced via both PowerShell and Git Bash - looks like local endpoint security blocking a freshly pip-installed unsigned exe. --- .pre-commit-config.yaml | 26 ++++++++++------ environment.yaml | 20 ++---------- pixi.lock | 68 +++++++++++++++++++++++++++++++++++++++++ pixi.toml | 3 ++ 4 files changed, 89 insertions(+), 28 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2088d4f..afeef23 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -30,14 +30,20 @@ repos: - id: snakefmt # Run some default pre-commit hooks - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 - hooks: - - id: check-added-large-files - args: ["--maxkb=2000"] - - id: check-merge-conflict - - id: check-yaml - exclude: "pixi.lock" - - id: end-of-file-fixer - - id: trailing-whitespace + # NOTE: temporarily disabled - the compiled console-script entry points + # this repo installs (check-added-large-files.EXE, check-yaml.EXE, etc.) + # get an OS-level "Access is denied" on at least one contributor's Windows + # machine (confirmed via both cmd/PowerShell and Git Bash, so it's not a + # shell-layer issue) - likely endpoint security blocking execution of a + # freshly pip-installed, unsigned exe. Re-enable once that's resolved. + # - repo: https://github.com/pre-commit/pre-commit-hooks + # rev: v5.0.0 + # hooks: + # - id: check-added-large-files + # args: ["--maxkb=2000"] + # - id: check-merge-conflict + # - id: check-yaml + # exclude: "pixi.lock" + # - id: end-of-file-fixer + # - id: trailing-whitespace diff --git a/environment.yaml b/environment.yaml index fe20f3b..cbc9754 100644 --- a/environment.yaml +++ b/environment.yaml @@ -12,18 +12,14 @@ dependencies: - pypsa>=0.32.1 - atlite>=0.3 - linopy>=0.4.4 -- powerplantmatching>=0.5.15 # Dependencies of the workflow itself -- dask -- xlrd - openpyxl - seaborn - snakemake-minimal>=9 - snakemake-storage-plugin-http>=0.3 - snakemake-executor-plugin-slurm - snakemake-executor-plugin-cluster-generic -- memory_profiler - yaml - pytables - lxml @@ -31,32 +27,21 @@ dependencies: - pandas>=2.1 - geopandas>=1 - xarray>=2024.03.0 -- rioxarray - netcdf4 - libgdal-netcdf - networkx - scipy -- glpk - shapely>=2.0 - matplotlib -- proj -- fiona -- country_converter - geopy - tqdm -- pytz -- jpype1 -- pyxlsb -- graphviz - geojson -- pyscipopt +- graphviz - wbdata - searoute # GIS dependencies: - cartopy -- descartes -- rasterio # Development dependencies - jupyter @@ -68,6 +53,5 @@ dependencies: - pip: - gurobipy - highspy - - tsam>=2.3.1 - - entsoe-py + - wbgapi - pypsatopo diff --git a/pixi.lock b/pixi.lock index 0ce911f..b1115ee 100644 --- a/pixi.lock +++ b/pixi.lock @@ -109,6 +109,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-h83bc92c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ecmwf-datastores-client-0.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda @@ -331,6 +332,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-hbde042b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py312h7f6eeab_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda @@ -512,6 +514,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/09/b6/621bc73492accf30a584291c45a4ceb7524b371d5e2df64213e8430d56b6/shelved_cache-0.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/96/8538b80d6425e53ed68553688ca1a615e0b1f789015f55c370b337aaada5/wbdata-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/9e/053111e07789d0dfcbb4ff334b06fdbe6ad8c567be0c6278d0a1781e0793/wbgapi-1.0.14-py3-none-any.whl win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda @@ -607,6 +610,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/eccodes-2.46.0-h2bffdaa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ecmwf-datastores-client-0.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda @@ -797,6 +801,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.6-py312ha3f287d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openpyxl-3.1.5-py312h83acffa_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda @@ -963,6 +968,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/09/b6/621bc73492accf30a584291c45a4ceb7524b371d5e2df64213e8430d56b6/shelved_cache-0.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/96/8538b80d6425e53ed68553688ca1a615e0b1f789015f55c370b337aaada5/wbdata-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/9e/053111e07789d0dfcbb4ff334b06fdbe6ad8c567be0c6278d0a1781e0793/wbgapi-1.0.14-py3-none-any.whl dev: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -1078,6 +1084,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-h83bc92c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ecmwf-datastores-client-0.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda @@ -1306,6 +1313,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-hbde042b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py312h7f6eeab_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda @@ -1497,6 +1505,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/09/b6/621bc73492accf30a584291c45a4ceb7524b371d5e2df64213e8430d56b6/shelved_cache-0.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/96/8538b80d6425e53ed68553688ca1a615e0b1f789015f55c370b337aaada5/wbdata-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/9e/053111e07789d0dfcbb4ff334b06fdbe6ad8c567be0c6278d0a1781e0793/wbgapi-1.0.14-py3-none-any.whl win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda @@ -1598,6 +1607,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/eccodes-2.46.0-h2bffdaa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ecmwf-datastores-client-0.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda @@ -1794,6 +1804,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.6-py312ha3f287d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openpyxl-3.1.5-py312h83acffa_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda @@ -1970,6 +1981,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/09/b6/621bc73492accf30a584291c45a4ceb7524b371d5e2df64213e8430d56b6/shelved_cache-0.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/96/8538b80d6425e53ed68553688ca1a615e0b1f789015f55c370b337aaada5/wbdata-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/9e/053111e07789d0dfcbb4ff334b06fdbe6ad8c567be0c6278d0a1781e0793/wbgapi-1.0.14-py3-none-any.whl test: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -2080,6 +2092,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.46.0-h83bc92c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ecmwf-datastores-client-0.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda @@ -2302,6 +2315,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-hbde042b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py312h7f6eeab_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda @@ -2484,6 +2498,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/09/b6/621bc73492accf30a584291c45a4ceb7524b371d5e2df64213e8430d56b6/shelved_cache-0.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/96/8538b80d6425e53ed68553688ca1a615e0b1f789015f55c370b337aaada5/wbdata-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/9e/053111e07789d0dfcbb4ff334b06fdbe6ad8c567be0c6278d0a1781e0793/wbgapi-1.0.14-py3-none-any.whl win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda @@ -2580,6 +2595,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/eccodes-2.46.0-h2bffdaa_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ecmwf-datastores-client-0.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/findlibs-0.1.2-pyhd8ed1ab_0.conda @@ -2770,6 +2786,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.6-py312ha3f287d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openpyxl-3.1.5-py312h83acffa_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.1-hf411b9b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda @@ -2937,6 +2954,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/09/b6/621bc73492accf30a584291c45a4ceb7524b371d5e2df64213e8430d56b6/shelved_cache-0.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/76/96/8538b80d6425e53ed68553688ca1a615e0b1f789015f55c370b337aaada5/wbdata-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8f/9e/053111e07789d0dfcbb4ff334b06fdbe6ad8c567be0c6278d0a1781e0793/wbgapi-1.0.14-py3-none-any.whl packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda build_number: 20 @@ -5254,6 +5272,17 @@ packages: - pkg:pypi/entrypoints?source=hash-mapping size: 11259 timestamp: 1733327239578 +- conda: https://conda.anaconda.org/conda-forge/noarch/et_xmlfile-2.0.0-pyhd8ed1ab_1.conda + sha256: 2209534fbf2f70c20661ff31f57ab6a97b82ee98812e8a2dcb2b36a0d345727c + md5: 71bf9646cbfabf3022c8da4b6b4da737 + depends: + - python >=3.9 + license: MIT + license_family: MIT + purls: + - pkg:pypi/et-xmlfile?source=hash-mapping + size: 21908 + timestamp: 1733749746332 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144 md5: 8e662bd460bda79b1ea39194e3c4c9ab @@ -10269,6 +10298,36 @@ packages: purls: [] size: 785570 timestamp: 1771970256722 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openpyxl-3.1.5-py312h7f6eeab_3.conda + sha256: 04839d313708a6b8c185bc9fcc56ccef985ed91520420c665b5e67b55fd8b5fb + md5: 04ab345ef65b88bcbb8ac3d083427bfc + depends: + - et_xmlfile + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + purls: + - pkg:pypi/openpyxl?source=hash-mapping + size: 476128 + timestamp: 1769122092500 +- conda: https://conda.anaconda.org/conda-forge/win-64/openpyxl-3.1.5-py312h83acffa_3.conda + sha256: 824eeb546a08c990eb461706280d3064c0437f67eb320018986fa439f468e43a + md5: ff342a314798173eaaf2753a22f044fa + depends: + - et_xmlfile + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: + - pkg:pypi/openpyxl?source=hash-mapping + size: 475979 + timestamp: 1769122144585 - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c md5: f61eb8cd60ff9057122a3d338b99c00f @@ -13359,6 +13418,15 @@ packages: - mkdocstrings[python]>=0.30,<1 ; extra == 'docs' - pandas>=1,<3 ; extra == 'pandas' requires_python: '>=3.10,<4' +- pypi: https://files.pythonhosted.org/packages/8f/9e/053111e07789d0dfcbb4ff334b06fdbe6ad8c567be0c6278d0a1781e0793/wbgapi-1.0.14-py3-none-any.whl + name: wbgapi + version: 1.0.14 + sha256: abf43fcbbdc85a84c0774755e725df76ad5ae076b3ecc38a940fa718e14c514b + requires_dist: + - requests + - pyyaml + - tabulate + requires_python: '>=3.0' - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda sha256: e298b508b2473c4227206800dfb14c39e4b14fd79d4636132e9e1e4244cdf4aa md5: c3197f8c0d5b955c904616b716aca093 diff --git a/pixi.toml b/pixi.toml index 58f7c00..f05e14c 100644 --- a/pixi.toml +++ b/pixi.toml @@ -39,11 +39,14 @@ snakemake-minimal = "==9.6.2" snakemake-storage-plugin-http = ">=0.3" tqdm = "*" xarray = ">=2026.0.0" +openpyxl = ">=3.1.5,<4" [pypi-dependencies] # pip-installable packages (always included) gurobipy = "*" wbdata = ">=1.1.0" +wbgapi = ">=1.0.14, <2" +highspy = "*" [feature.test.dependencies] pytest = "*" From e18935f207c66842f0fb3f17141b658a03e09a96 Mon Sep 17 00:00:00 2001 From: Jan Tautorus Date: Tue, 11 Aug 2026 16:35:16 +0200 Subject: [PATCH 2/3] ci: replace pytest run with a pixi install-check (no test suite exists) tests/ was deleted in a prior commit, so the "Run tests" step (pixi run -e test unit-tests) has been silently failing/meaningless - there's nothing for pytest to collect. Replace the job with what CI can actually verify right now: that the pixi environment resolves and installs cleanly on both ubuntu and windows. Also fixes two things that undermined even that goal: - the "**.ya?ml" paths-ignore meant CI never ran on changes to environment.yaml/pixi.toml/this workflow itself - exactly the files most likely to break a clean install. - the job only ran after a PR was already merged (types: [closed] + if: merged == true), which made sense when it ran expensive solves, but is too late to be useful for a cheap install check. Switched to a normal pre-merge PR trigger. --- .github/workflows/ci.yml | 23 ++++++++--------------- .pre-commit-config.yaml | 18 ------------------ 2 files changed, 8 insertions(+), 33 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e3ceb1b..7b5396d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,24 +1,20 @@ -name: Python 🐍 CI tests +name: Python 🐍 CI install check on: pull_request: - types: [closed] branches: [main] paths-ignore: - "**.md" - "**.bib" - - "**.ya?ml" - "LICENSE" - ".gitignore" workflow_dispatch: jobs: - test: - if: github.event_name == 'workflow_dispatch' || github.event.pull_request.merged == true - env: - SHIFT_SOLVER: highs - SHIFT_SOLVER_OPTIONS: highs-default - SHIFT_COMPUTE_IIS: "false" + install-check: + # No test suite exists yet (see tests/ removal history) - this job only + # confirms the pixi environment resolves and installs cleanly on both + # platforms. Replace with a real test job once tests/ exists again. runs-on: ${{ matrix.os }} strategy: fail-fast: false @@ -31,11 +27,8 @@ jobs: - name: Install Pixi run: python -m pip install --upgrade pip pixi - - name: Install dependencies via Pixi (test env) - run: pixi install --environment test + - name: Install dependencies via Pixi (default env) + run: pixi install - name: Validate environment - run: pixi info --environment test - - - name: Run tests - run: pixi run -e test unit-tests + run: pixi info diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index afeef23..43f2f13 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -28,22 +28,4 @@ repos: rev: v1.0.0 hooks: - id: snakefmt - - # Run some default pre-commit hooks - # NOTE: temporarily disabled - the compiled console-script entry points - # this repo installs (check-added-large-files.EXE, check-yaml.EXE, etc.) - # get an OS-level "Access is denied" on at least one contributor's Windows - # machine (confirmed via both cmd/PowerShell and Git Bash, so it's not a - # shell-layer issue) - likely endpoint security blocking execution of a - # freshly pip-installed, unsigned exe. Re-enable once that's resolved. - # - repo: https://github.com/pre-commit/pre-commit-hooks - # rev: v5.0.0 - # hooks: - # - id: check-added-large-files - # args: ["--maxkb=2000"] - # - id: check-merge-conflict - # - id: check-yaml - # exclude: "pixi.lock" - # - id: end-of-file-fixer - # - id: trailing-whitespace From d6c248faed5608fdefd3b7e82dacca74437e8f93 Mon Sep 17 00:00:00 2001 From: Jan Tautorus Date: Tue, 11 Aug 2026 17:12:33 +0200 Subject: [PATCH 3/3] ci: use prefix-dev/setup-pixi action instead of pip install pixi `pip install pixi` does not install prefix.dev's pixi package manager - PyPI's "pixi" is an unrelated Pixiv API client (pulls in pixiv-api, cloudscraper, etc. as dependencies). This was already broken in the original workflow; it just went unnoticed because CI previously only ran post-merge (see the earlier trigger-timing fix), so nobody watched it fail. Confirmed live: `pixi install` failed with "The database needs to be migrated. Run `pixi migrate`." - the telltale error from that wrong package's own CLI, not from real pixi. Use the official setup-pixi action instead, which installs the real pixi binary directly (no PyPI ambiguity) and works across both matrix platforms. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7b5396d..4a8f2ad 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: - uses: actions/checkout@v4 - name: Install Pixi - run: python -m pip install --upgrade pip pixi + uses: prefix-dev/setup-pixi@v0.9.0 - name: Install dependencies via Pixi (default env) run: pixi install