Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
121 commits
Select commit Hold shift + click to select a range
0331b34
Changes
FBumann Feb 1, 2026
b5df113
Add memory becnhmark
FBumann Feb 1, 2026
d0a8c74
bench: improve benchmark_lp_writer.py
FBumann Feb 1, 2026
f1746e9
- linopy/variables.py: ffill, bfill, sanitize — labels were cast ba…
FBumann Feb 2, 2026
2f3e87e
Add dtype tests
FBumann Feb 2, 2026
59f92ae
Fix multiplication of constant-only LinearExpression (#568)
FabianHofmann Feb 6, 2026
36b15c5
perf: speed up LP file writing (2.5-3.9x on large models, no regressi…
FBumann Feb 6, 2026
9ce2005
Add auto_mask parameter to Model class (#555)
FBumann Feb 6, 2026
c9f83bb
update release notes
FabianHofmann Feb 9, 2026
19651ed
Bugfix/fix readthedocs (#574)
RobbieKiwi Feb 9, 2026
97ed0c0
fix polars dep lb (#578)
FBumann Feb 10, 2026
606a714
fix: revert np.where to xarray.where when adding vars/ constraints (#…
lkstrp Feb 10, 2026
ec6262b
test and future warning for #575 (#579)
lkstrp Feb 10, 2026
75c442c
Reinsert broadcasted mask (#580)
FabianHofmann Feb 10, 2026
45285ee
fix: add coords and dims to as_dataarray (#582)
FabianHofmann Feb 11, 2026
16d6f32
update release notes
FabianHofmann Feb 11, 2026
6655b54
fix: update HiGHS URLs and naming (#585)
FabianHofmann Feb 16, 2026
d5136e7
Add Knitro solver support (#532)
FabianHofmann Feb 18, 2026
1b08d2b
update release notes
FabianHofmann Feb 18, 2026
b7aba5f
feat: add sos reformulations into linopy to simplify adoption of new …
FBumann Feb 20, 2026
fc5fa6f
feat: add piecewise linear constraint API (SOS2, incremental, disjunc…
FBumann Feb 23, 2026
5d71b5d
Add reformulate_sos='auto' support to solve() (#595)
FabianHofmann Feb 23, 2026
0a40d2c
fix: make google-cloud-storage and requests optional dependencies (#589)
lkstrp Feb 24, 2026
b383231
build(deps): bump the github-actions group with 3 updates (#598)
dependabot[bot] Mar 2, 2026
a90f1e6
Expose the knitro context (#600)
finozzifa Mar 4, 2026
cea4306
update release notes from patch release
FabianHofmann Mar 4, 2026
ae7cef0
enable quadratic for win with scip (#588)
davide-f Mar 9, 2026
982b573
Piecewise linear constraints: follow-up improvements (#602)
FabianHofmann Mar 9, 2026
4f999c8
Increase SCIP time limit in test to fix flaky CI (fixes #577) (#606)
FabianHofmann Mar 10, 2026
ee62dcc
refac: introduce consistent convention for linopy operations with sub…
FabianHofmann Mar 10, 2026
ef9a9e4
Fix Xpress IIS mapping for masked constraints (#605)
FabianHofmann Mar 11, 2026
1e5a4ec
handle missing dual values when barrier solution has no crossover (#601)
danielelerede-oet Mar 11, 2026
c415b4e
feat: Add semi-continous variables as an option (#593)
mcoughlin Mar 11, 2026
dfd4ad5
All join="override" usages in tests have been replaced with assign_co…
FBumann Mar 14, 2026
532126d
Delete dev-scripts/benchmark_lp_writer.py
FBumann Mar 14, 2026
4abee58
Move label_dtype to options for runtime configurability
FBumann Mar 14, 2026
ee31b8c
Revert int32 for dimension coordinates to fix build regression
FBumann Mar 14, 2026
6383e2a
ci: Add CI workflow to test documentation notebooks (#615)
FBumann Mar 16, 2026
474f79b
Add OetcSettings.from_env() and forward solver options through Model.…
FabianHofmann Mar 16, 2026
393da2f
feat: add m.copy() method to create deep copy of model (#623)
bobbyxng Mar 23, 2026
f8dcfea
feat: Add fix(), unfix(), and fixed to Variable and Variables (#625)
FBumann Mar 24, 2026
1bc3efc
fix: Include semi-continuous in Variable.type property (#635)
FBumann Mar 26, 2026
136c13f
Re-introduce knitro context closure and export solver quantities (#633)
finozzifa Mar 26, 2026
3402b2c
udpate release notes with path release
FabianHofmann Mar 26, 2026
5d278fb
feat: Add relax() and unrelax() to Variable and Variables (#634)
FBumann Mar 26, 2026
43af227
refac: replace print calls with str-returning format_* methods (#621)
FBumann Mar 26, 2026
472ecc9
perf: use numpy array lookup for solution unpacking (#619)
MaykThewessen Mar 30, 2026
c6b07e5
chore: benchmarks (#567)
FBumann Mar 30, 2026
36bc106
fix: add_variables ignoring coords for DataArray bounds (#614)
FBumann Mar 30, 2026
5514510
fix: blacklist highs 1.14.0 (#654)
coroa Apr 17, 2026
339e142
fix: use xarray.Dataset copy instead of constructor (#647)
maurerle Apr 17, 2026
db8ccde
feat: add __weakref__ to Model.__slots__ (#656)
FBumann Apr 20, 2026
837e5ed
fix: as_dataarray treating multi-index levels as extra dims (#659)
FabianHofmann Apr 20, 2026
d261a15
fix: compute a single IIS in Xpress infeasibility path (#658)
FabianHofmann Apr 21, 2026
67f5d74
update release notes (#661)
FabianHofmann Apr 21, 2026
bd3450a
fix: raise clear error when solving model without objective (#671)
FBumann May 4, 2026
620766d
build(deps): bump the github-actions group across 1 directory with 3 …
dependabot[bot] May 4, 2026
94a38cd
feat: Unify piecewise API behind add_piecewise_formulation (sign + LP…
FBumann May 6, 2026
4ce1289
feat: add slopes_align to breakpoints() (#672)
FabianHofmann May 6, 2026
a9584d2
refac(piecewise): introduce Slopes class, remove breakpoints(slopes=)…
FBumann May 7, 2026
73dd70b
fix: serialize MultiIndex level names as JSON for scipy netCDF backen…
FBumann May 7, 2026
24ee544
docs: restructure upcoming changelog and add missing PRs (#675)
FBumann May 7, 2026
3f6ab10
chore: Update release notes for v0.7.0 (#676)
FBumann May 11, 2026
22b5ca6
[pre-commit.ci] pre-commit autoupdate (#505)
pre-commit-ci[bot] May 11, 2026
8190a77
perf: matrix accessor rewrite (#630)
coroa May 11, 2026
c04d272
docs(piecewise): rewrite reference page + tutorials for correctness a…
FBumann May 12, 2026
001e5c9
docs: fix broken toctree, refresh API reference, and clean up referen…
FBumann May 15, 2026
4daf611
refactor: stateful Solver instances and two-step solve API (#682)
FabianHofmann May 18, 2026
f25b172
docs: silence HiGHS console output in tutorial notebooks (#678)
FBumann May 18, 2026
6124e81
docs: reorganize toctree into basic→advanced sections, rewrite user-g…
FBumann May 18, 2026
8e8fed7
docs: credit Felix Bumann in copyright, author, and pyproject maintai…
FBumann May 18, 2026
1909f4a
feat(xpress): add direct API support via loadproblem (#684)
FabianHofmann May 18, 2026
c23ebfe
deps: add `remote` extra for paramiko and migrate install docs to uv …
FBumann May 18, 2026
deb6901
fix(sos): refuse masked SOS variables with a clear error; fix `reform…
FBumann May 18, 2026
8aa8d0c
fix(test): only skip GPU-only solvers without --run-gpu (#693) (#694)
FBumann May 19, 2026
bd952aa
refactor(sos): add Model.apply/undo_sos_reformulation methods (#690)
FBumann May 19, 2026
c75c55a
fix(remote): use TemporaryDirectory to avoid Windows tempfile lock (#…
FabianHofmann May 19, 2026
7e2d3c1
Xpress 9.9+ backward compatibility and other updates (#701)
brunoficoxpress May 20, 2026
7c80046
ci: swap aflc/pre-commit-jupyter for kynan/nbstripout (#700)
FBumann May 20, 2026
be6d3a3
fix(sos): SOS constraints on masked variables (#688) (#692)
FBumann May 20, 2026
ed594d7
fix(xpress): use ExitStack to manage xpress.problem() lifecycle (#702)
brunoficoxpress May 20, 2026
37af4ba
fix(license-leaks): release license slot from Mosek, COPT, and MindOp…
FBumann May 21, 2026
06870bc
drop python 3.10 support (#721)
lkstrp May 22, 2026
0953594
refactor(types): unify SUPPORTED_CONSTANT_TYPES with ConstantLike ali…
FBumann May 27, 2026
ea8b3c4
Improve Mosek interface to select optimal solution (#667)
mgrabovsky May 27, 2026
4881a52
Feature/example of drop=True (#557)
RobbieKiwi May 27, 2026
3f824cc
refactor: unify coords-as-truth handling in add_variables/add_constra…
FBumann Jun 2, 2026
d8d52b4
ci: fix model runs (#522)
lkstrp Jun 3, 2026
62cfe34
perf(matrices): cache MatrixAccessor properties with cached_property …
MaykThewessen Jun 3, 2026
f4af3f1
feat: add BaseExpression.has_terms property (#743)
FBumann Jun 3, 2026
d5a82a2
refactor: move alignment code to linopy/alignment.py; restructure tes…
FBumann Jun 3, 2026
d834810
311 syntax (#739)
RobbieKiwi Jun 3, 2026
a74724f
refactor: return Self from SolverStatus.from_termination_condition (#…
FBumann Jun 3, 2026
6a5d748
docs: add AI-assisted contribution guide (#754)
FBumann Jun 4, 2026
076c16a
fix(alignment): tolerate xarray without CoordinateValidationError (#762)
FBumann Jun 5, 2026
a539a6e
fix: regression with tuple coords entries as xarray's (dim_name, valu…
FBumann Jun 7, 2026
fdf613d
test: use public API in assertions instead of internal .data (#760)
FBumann Jun 7, 2026
7eb8c9a
fix(groupby): group by non-dimension coordinate names; fast multi-key…
FBumann Jun 7, 2026
9eeb838
fix: Variable.fix() value alignment on named dimensions (#774)
FBumann Jun 9, 2026
6fb7bb7
feat: Add indicator constraints (#594)
mcoughlin Jun 9, 2026
356fd45
feat: add m.dualize() (#626)
bobbyxng Jun 9, 2026
0f62fd8
docs: cut release notes for v0.8.0 (#759)
FBumann Jun 10, 2026
eba69dd
fix(docs): repair mobile sidebar by bumping sphinx-book-theme to 1.2.…
FBumann Jun 18, 2026
31b6778
feat(io): stamp linopy version into netCDF export (#780)
FBumann Jun 18, 2026
081cd8b
fix(io): write LP bounds for tightened binary variables (#777)
FBumann Jun 19, 2026
86baf59
feat(model): allow {0,1} bounds for binaries in add_variables (#778)
FBumann Jun 22, 2026
35bd6bf
bench: internal performance benchmark suite + CodSpeed CI (#781)
FBumann Jun 23, 2026
191913e
build(deps-dev): bump matplotlib from 3.9.1 to 3.11.0 (#788)
dependabot[bot] Jun 23, 2026
6827040
build(deps): bump the github-actions group with 2 updates (#784)
dependabot[bot] Jun 23, 2026
ddbd829
build(deps-dev): bump sphinx from 7.3.7 to 9.0.4 (#789)
dependabot[bot] Jun 23, 2026
08ecde2
build(deps-dev): bump pytest in the benchmark-tooling group (#785)
dependabot[bot] Jun 23, 2026
c2d9f5c
build(deps-dev): bump sphinx-rtd-theme from 2.0.0 to 3.1.0 (#786)
dependabot[bot] Jun 23, 2026
8dfa6d4
fix(constraints): freeze empty constraint groups without reshape erro…
Ketchp Jun 23, 2026
2bbbeef
feat(persistent): in-place solver updates (Solver framework + HiGHS/G…
FabianHofmann Jun 24, 2026
d810de7
build(deps-dev): bump numpydoc from 1.7.0 to 1.10.0 (#787)
dependabot[bot] Jun 24, 2026
2d47d4a
fix(variables): Variable.where works with solution attached (#790)
FabianHofmann Jun 24, 2026
4ddf3fb
chore: fix typing with new highspy version (#795)
FBumann Jun 29, 2026
1dbde37
docs: import AGENTS.md into CLAUDE.md (#794)
FBumann Jun 29, 2026
fe798b1
feat(piecewise): `active_fill` for partial `active` gates (alt. to #7…
FBumann Jun 30, 2026
52e3185
Merge remote-tracking branch 'origin/master' into perf/int32-resolve
FBumann Jun 30, 2026
f7bad31
perf(int32): respect label_dtype when reconstructing CSR constraints
FBumann Jun 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,30 @@ updates:
github-actions:
patterns:
- '*'

# Pinned ``[benchmarks]`` extra in pyproject.toml. One PR per dep bump
# → CodSpeed CI runs and attributes any perf delta to that specific
# bump. Keeps the cross-version ``sweep`` baseline (lockfile-pinned)
# stable while still surfacing upstream perf changes per-PR with
# eyes-open review. Loose ``[project.dependencies]`` (numpy, scipy, ...)
# have no version specifier so Dependabot leaves them alone — only the
# ``==`` pins in ``[benchmarks]`` produce PRs.
- package-ecosystem: pip
directory: /
schedule:
interval: monthly
open-pull-requests-limit: 5
groups:
# Measurement scaffolding + CLI/notebook tooling. Perf-irrelevant —
# they don't move CodSpeed signal, so batching into one PR cuts
# review noise. Perf-relevant deps (numpy, xarray, highspy, …) stay
# un-grouped so each gets its own attributed CodSpeed delta.
benchmark-tooling:
patterns:
- pytest
- pytest-benchmark
- pytest-memray
- pytest-codspeed
- nbconvert
- typer
- plotly
4 changes: 4 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
Closes # (if applicable).

<!-- Using AI? Keep this description human: write your own intent by hand and
mark AI-generated content. See AGENTS.md for the rules. -->

## Changes proposed in this Pull Request


## Checklist

- [ ] AI-generated content is marked (see [`AGENTS.md`](../blob/master/AGENTS.md)).
- [ ] Code changes are sufficiently documented; i.e. new functions contain docstrings and further explanations may be given in `doc`.
- [ ] Unit tests for new features were added (if applicable).
- [ ] A note for the release notes `doc/release_notes.rst` of the upcoming release is included.
Expand Down
39 changes: 39 additions & 0 deletions .github/workflows/benchmark-smoke.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: Benchmark smoke

# Builds every spec and fires every phase once (--benchmark-disable):
# a "did a refactor break a spec?" check, not timing.

on:
push:
branches: [ master ]
pull_request:
branches: [ '*' ]

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
smoke:
name: Benchmark smoke (quick)
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0 # setuptools_scm

- name: Set up Python 3.13
uses: actions/setup-python@v6
with:
python-version: "3.13"

- name: Install package and benchmark dependencies
run: |
python -m pip install uv
uv pip install --system -e ".[dev,benchmarks]"

- name: Run benchmark smoke
# Every spec builds at one size and every phase fires once, no timings.
run: |
pytest benchmarks/ --benchmark-disable -q
2 changes: 1 addition & 1 deletion .github/workflows/claude.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ jobs:
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@v7
with:
fetch-depth: 1

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ jobs:
# your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@v7

# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
Expand Down
76 changes: 76 additions & 0 deletions .github/workflows/codspeed.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
name: CodSpeed

# Both instruments in one workflow (CodSpeed aggregates per-commit results from a
# single workflow). Memory: heap tracking on a free GitHub runner, every PR +
# master. Walltime: bare-metal macro runner, master + the maintainer-gated
# `trigger:benchmark` label only.

on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
types: [ opened, synchronize, reopened, labeled ]
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
memory:
name: Memory (heap)
runs-on: ubuntu-latest
continue-on-error: true # informational, never blocks a merge
permissions:
contents: read # actions/checkout
id-token: write # OIDC auth with CodSpeed — no token secret
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0 # setuptools_scm
- name: Set up Python 3.13
uses: actions/setup-python@v6
with:
python-version: "3.13"
- name: Install pinned benchmark environment
run: |
python -m pip install uv
uv pip install --system -e ".[dev,benchmarks]"
- name: Run benchmarks under CodSpeed (memory)
uses: CodSpeedHQ/action@v4
with:
mode: memory
run: |
pytest benchmarks/ --codspeed

walltime:
name: Walltime (macro runner)
# Master push / dispatch always; PRs only when explicitly labelled — macro
# minutes are metered and bare-metal shouldn't run arbitrary PR code.
if: >-
${{ github.event_name != 'pull_request' ||
contains(github.event.pull_request.labels.*.name, 'trigger:benchmark') }}
runs-on: codspeed-macro
continue-on-error: true
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0 # setuptools_scm
- name: Set up Python 3.13
uses: actions/setup-python@v6
with:
python-version: "3.13"
- name: Install pinned benchmark environment
run: |
python -m pip install uv
uv pip install --system -e ".[dev,benchmarks]"
- name: Run benchmarks under CodSpeed (walltime)
uses: CodSpeedHQ/action@v4
with:
mode: walltime
run: |
pytest benchmarks/ --codspeed
8 changes: 4 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
name: Build and verify package
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- uses: hynek/build-and-inspect-python-package@v2

release:
Expand All @@ -20,8 +20,8 @@ jobs:
needs: [build]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: softprops/action-gh-release@v2
- uses: actions/checkout@v7
- uses: softprops/action-gh-release@v3
with:
generate_release_notes: true

Expand All @@ -36,7 +36,7 @@ jobs:
permissions:
id-token: write
steps:
- uses: actions/download-artifact@v7
- uses: actions/download-artifact@v8
with:
name: Packages
path: dist
Expand Down
57 changes: 29 additions & 28 deletions .github/workflows/test-models.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@ on:
branches:
- master
pull_request:
branches:
- master
branches: ["*"]
schedule:
- cron: "0 5 * * *"

Expand All @@ -24,14 +23,14 @@ jobs:
matrix:
version:
- master
# - latest # Activate when v0.14.0 is released
# - latest

defaults:
run:
shell: bash -l {0}

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
repository: PyPSA/pypsa-eur
ref: master
Expand All @@ -43,11 +42,23 @@ jobs:
latest_tag=$(git describe --tags `git rev-list --tags --max-count=1`)
git checkout $latest_tag

- name: Setup Pixi
uses: prefix-dev/setup-pixi@v0.9.6
with:
pixi-version: v0.68.1
cache: true
# Do not cache in branches
cache-write: ${{ github.event_name == 'push' && github.ref_name == 'master' }}

- name: Setup cache keys
run: |
echo "WEEK=$(date +'%Y%U')" >> $GITHUB_ENV # data and cutouts

# Only run check if package is not pinned
- name: Check if inhouse package is pinned
- name: Check if linopy package is pinned
run: |
grep_line=$(grep -- '- pypsa' envs/environment.yaml)
if [[ $grep_line == *"<"* || $grep_line == *"=="* ]]; then
grep_line=$(grep -- '${{ github.event.repository.name }} = ' pixi.toml)
if [[ $grep_line == *"<* || $grep_line == *"==* ]]; then
echo "pinned=true" >> $GITHUB_ENV
else
echo "pinned=false" >> $GITHUB_ENV
Expand All @@ -67,45 +78,35 @@ jobs:
cutouts
key: data-cutouts-${{ env.week }}

- uses: conda-incubator/setup-miniconda@v3
if: env.pinned == 'false'
with:
activate-environment: pypsa-eur

- name: Cache Conda env
if: env.pinned == 'false'
uses: actions/cache@v5
with:
path: ${{ env.CONDA }}/envs
key: conda-pypsa-eur-${{ env.week }}-${{ hashFiles('envs/linux-64.lock.yaml') }}
id: cache-env

- name: Update environment
if: env.pinned == 'false' && steps.cache-env.outputs.cache-hit != 'true'
run: conda env update -n pypsa-eur -f envs/linux-64.lock.yaml

- name: Install package from ref
if: env.pinned == 'false'
run: |
python -m pip install git+https://github.com/${{ github.repository }}@${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
pixi remove pypsa
pixi remove linopy
pixi add --pypi --git https://github.com/${{ github.repository }}.git ${{ github.event.repository.name }} --rev ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
pixi add --pypi pypsa

- name: Run snakemake test workflows
if: env.pinned == 'false'
run: |
make test
pixi run integration-tests

- name: Run unit tests
if: env.pinned == 'false'
run: |
make unit-test
pixi run unit-tests

- name: Upload artifacts
if: env.pinned == 'false'
uses: actions/upload-artifact@v6
uses: actions/upload-artifact@v7
with:
name: results-pypsa-eur-${{ matrix.version }}
path: |
logs
.snakemake/log
results
retention-days: 3

- name: Show remaining disk space
if: always()
run: df -h
58 changes: 58 additions & 0 deletions .github/workflows/test-notebooks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
name: Test Notebooks

on:
push:
branches: [ master ]
pull_request:
branches: [ '*' ]
schedule:
- cron: "0 5 * * TUE"

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
notebooks:
name: Test documentation notebooks
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0

- name: Set up Python 3.12
uses: actions/setup-python@v6
with:
python-version: "3.12"

- name: Install package and dependencies
run: |
python -m pip install uv
uv pip install --system -e ".[docs]"

- name: Execute notebooks
run: |
EXIT_CODE=0
for notebook in examples/*.ipynb; do
name=$(basename "$notebook")

# Skip notebooks that require credentials or special setup
case "$name" in
solve-on-oetc.ipynb|solve-on-remote.ipynb)
echo "Skipping $name (requires credentials or special setup)"
continue
;;
esac

echo "::group::Running $name"
if jupyter nbconvert --to notebook --execute --ExecutePreprocessor.timeout=600 "$notebook"; then
echo "✓ $name passed"
else
echo "::error::✗ $name failed"
EXIT_CODE=1
fi
echo "::endgroup::"
done
exit $EXIT_CODE
Loading
Loading