Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
2eeb507
refactor: another PyPSA v1 deprecation (#1858)
lkstrp Oct 14, 2025
620fe79
Update pre-commit hook to reuse-lint-file (#1862)
lkstrp Oct 16, 2025
0f60de2
fix: add retrys for zenodo requests with tenacity (#1861)
lkstrp Oct 18, 2025
4a0ac92
[github-actions.ci] Update locked envs
github-actions[bot] Oct 20, 2025
383615f
feat: add river-water and sea-water sourced heat pumps (#1618)
amos-schledorn Oct 24, 2025
3679dc5
[github-actions.ci] Update locked envs (#1867)
github-actions[bot] Oct 28, 2025
a036da8
refactor: use snapshot_weightings to define nyears in build_transport…
tgilon Oct 31, 2025
946609e
Add option to set minimum unit dispatch for electrolysis (#1859)
millingermarkus Nov 1, 2025
31e7992
chore(deps): bump the github-actions group with 2 updates (#1870)
dependabot[bot] Nov 1, 2025
ae6466c
Fix to allow osm-raw network building for islanded systems (#1852)
bobbyxng Nov 1, 2025
0276a1e
Fix by specifying axis (#1835)
jonathan-peel Nov 1, 2025
f867415
fix: remove perfect test in clean-tests (#1876)
tgilon Nov 3, 2025
d1589e7
feat: overwrite costs through file (#1752)
tgilon Nov 3, 2025
c45ef4b
code: Add empty folders to repo (#1764)
euronion Nov 4, 2025
cae7dfe
Implement OETC integration (#1831)
KristijanFaust-OET Nov 5, 2025
c26b4f1
Rename index in GeoDataFrame for clarity and more generic shape colum…
FabianHofmann Nov 5, 2025
14be760
Validate configuration settingf for temporal clustering to prevent in…
martacki Nov 5, 2025
966b746
fix: fix capital and marginal costs overwrite (#1879)
tgilon Nov 5, 2025
dd7b149
feat:allocate heat pump capex on heat bus (#1748)
amos-schledorn Nov 7, 2025
a1dee3f
doc: Automatically update DAGs in documentation (#1880)
euronion Nov 7, 2025
822a927
Fix outdated expression for 'transmission_limit' (#1894)
Parisra Nov 10, 2025
84f8706
code: Fix deprecation warning for pandas 2.3.0 / 3.0 (#1898)
euronion Nov 14, 2025
ac707d7
code: Fix PyPSA v1 compatability in build_transmission_projects.py (#…
euronion Nov 14, 2025
81b3bf5
Update dependency management to `pixi` (#1886)
brynpickering Nov 14, 2025
107bd06
ci: fix unit tests typo (#1905)
lkstrp Nov 17, 2025
2e15678
chore(deps): bump prefix-dev/setup-pixi in the github-actions group (…
dependabot[bot] Nov 17, 2025
fd146fd
Fix clean-tests section in pixi.toml (#1901)
euronion Nov 17, 2025
f053ef8
refactor: remove hotfix and check that the directory exists (#1840)
tgilon Nov 19, 2025
cbe69b6
feat: Add snakemake-storage-plugin-cached-http to address zenodo fail…
coroa Nov 20, 2025
3fdb823
[github-actions.ci] Update locked envs (#1900)
github-actions[bot] Nov 20, 2025
8e9d903
Add co2 price to sector networks as marginal_cost on the `co2 atmosph…
coroa Nov 20, 2025
067821c
chore(deps): bump actions/checkout in the github-actions group (#1914)
dependabot[bot] Nov 23, 2025
2efe86f
hotfix: handle unavailability of WDPA where optional (#1919)
fneum Nov 23, 2025
437eb82
ci: free up disk space (#1920)
lkstrp Nov 24, 2025
3e1c6bb
fill cost values with defaults after merging custom costs (#1911)
martacki Nov 25, 2025
687bd02
chore: set ptes.dynamic_capacity default to false (#1924)
amos-schledorn Nov 26, 2025
9b39110
add pixi files and data folder to .sync-send (#1923)
fneum Nov 30, 2025
08dd2c9
Bugfix load shedding scaling (#1908)
jonathan-peel Nov 30, 2025
dc14c8f
[github-actions.ci] Update locked envs (#1925)
github-actions[bot] Dec 1, 2025
b894989
Capture raw osm `power=circuit` route relation (#1926)
brynpickering Dec 1, 2025
71fe926
Capture OSM link `section` as valid relation role for geometries (#1927)
brynpickering Dec 1, 2025
24705ca
Bugfix valueerror time dep hp cop (#1929)
jonathan-peel Dec 1, 2025
2739717
Heat dsm 2025 (#1857)
lprieto1409 Dec 2, 2025
151f603
data: Intermediate layer for versioning of datasets (#1675)
euronion Dec 2, 2025
3ca79a8
Fix BFS Swiss transport parsing (#1934)
danielelerede-oet Dec 4, 2025
4e75e2e
Adding Existing Biomass Heating in Urban Decentral and Rural (#1872)
LukasFrankenQ Dec 4, 2025
efb69ee
Fix build_energy_totals (Swiss transport) (#1936)
bobbyxng Dec 5, 2025
cfc6f56
fix bug in marginal and capital cost calculation for tech biomass-to-…
p-glaum Dec 10, 2025
88f5bd9
chore(deps): bump peter-evans/create-pull-request (#1942)
dependabot[bot] Dec 10, 2025
a2a7491
ci: run model runs only with src changes (#1932)
lkstrp Dec 10, 2025
420ab53
code: Remove unused inputs from snakefile (#1909)
euronion Dec 10, 2025
6016de4
Update README.md
fneum Dec 12, 2025
b5f353a
update pypsa-eur logo (#1946)
fneum Dec 12, 2025
b2c1afe
chore(deps): bump actions/cache from 4 to 5 in the github-actions gro…
dependabot[bot] Dec 12, 2025
a7e2514
chore(deps): bump the github-actions group with 2 updates (#1947)
dependabot[bot] Dec 16, 2025
21ed3dc
Make model instance conveniently inspectable (separate problem prep a…
Irieo Dec 16, 2025
3a35b4a
Fix OSM network building from overpass (formerly osm-raw) (#1940)
bobbyxng Dec 16, 2025
090dbd9
Update locked environment files for all platforms (#1948)
github-actions[bot] Dec 17, 2025
36f4a17
follow PyPSA to name 'PyPSA-Eur' contributors as authors/copyright (#…
fneum Dec 18, 2025
73fb005
Feature: Interactive balance maps (#1935)
bobbyxng Dec 29, 2025
c894c31
Merge remote-tracking branch 'upstream/master' into merge-upstream-26…
lindnemi Jan 5, 2026
87e90bd
append pixi toml
lindnemi Jan 5, 2026
30b87de
write retieve config in pypsa-de.yaml
lindnemi Jan 5, 2026
5aed3e2
use storage plugin for lau regions
lindnemi Jan 6, 2026
f261e6b
remove old sys.path.insert
lindnemi Jan 6, 2026
ff74f7e
adapt to new upstream functionality for modifying costs, deprecating …
lindnemi Jan 7, 2026
c8eb4f6
fix merge error
lindnemi Jan 7, 2026
4bac824
transition to new load_costs syntax in exporter
lindnemi Jan 7, 2026
4467ca2
adjust to some changes in PyPSA
lindnemi Jan 8, 2026
956d2ae
eliminate a few warnings
lindnemi Jan 8, 2026
b949771
remove deprecated rule
lindnemi Jan 8, 2026
b9d82a1
correct a sign mistake in n.statistics due to the new implementation …
lindnemi Jan 8, 2026
924754b
minor fix
lindnemi Jan 8, 2026
b720758
move and rename the `ariadne-data` folder to `data/pypsa-de`
lindnemi Jan 8, 2026
383190d
use pypsa-eur retrieve convention for ariadne_database
lindnemi Jan 8, 2026
94a7110
use new syntax for all data retrieval
lindnemi Jan 8, 2026
2c21379
separate dataset entry for ariadne template
lindnemi Jan 8, 2026
51971fc
update ariadne plots
lindnemi Jan 9, 2026
aa620cb
update CITATION file with article
lindnemi Jan 9, 2026
961d52b
disbale co2 network by default
lindnemi Jan 12, 2026
247dd17
fix roundoff error
lindnemi Jan 12, 2026
6ff6bb3
disable some config changes in pypsa-eur
lindnemi Jan 12, 2026
fa868d7
fix: compatibility of build_gas_* rules with pyogrio >=0.12.0 (#1955)
coroa Jan 6, 2026
3cc874b
[pre-commit.ci] pre-commit autoupdate (#1954)
pre-commit-ci[bot] Jan 6, 2026
eec3ac0
doc: fix PR template hyperlink (#1957)
tgilon Jan 7, 2026
0d40d4f
fix: add pydeck lower version bound that was missing from pypsa <1.0.…
coroa Jan 7, 2026
56222f7
fix: fix compatibility with numpy >=2 (#1958)
coroa Jan 12, 2026
f8dd423
fix: Version controlled data layer (#1963)
euronion Jan 12, 2026
795f997
[github-actions.ci] Update locked envs (#1953)
github-actions[bot] Jan 14, 2026
4ff9378
Bugfix pypsa eur as snakemake module (#1967)
jonathan-peel Jan 14, 2026
5ba3203
fix: update costs for solar-hsat in myopic optimization; small refactor
lindnemi Jan 12, 2026
9edd96f
address pylint errors
lindnemi Jan 15, 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
6 changes: 6 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# SPDX-FileCopyrightText: Contributors to PyPSA-Eur <https://github.com/pypsa/pypsa-eur>
#
# SPDX-License-Identifier: CC0-1.0

*
!pixi.*
2 changes: 2 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@

*.h5 filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
# SCM syntax highlighting & preventing 3-way merges
pixi.lock merge=binary linguist-language=YAML linguist-generated=true
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug_report.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ body:
attributes:
label: Installed Versions
description: >
Please share information on your environment. Paste the output below. For conda ``conda env export`` and for pip ``pip freeze``.
Please share information on your environment. Paste the output below. For conda ``conda env export`` and for pixi, the content of ``pixi.lock``.
value: >
<details>

Expand Down
93 changes: 93 additions & 0 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
name: Release

on:
push:
tags:
- v*.*.*

env:
PREPARATION_COMMIT: '[github-actions.ci] prepare release ${{ github.ref_name }}'
BASE_ENV: envs/environment.yaml

jobs:
check-preparation:
name: Check if release is prepared
runs-on: ubuntu-latest
outputs:
prepared: ${{ steps.validate.outputs.prepared }}
steps:
- uses: actions/checkout@v6

- name: Validate commit message
id: validate
run: |
# Check if last commit is the expected commit message
COMMIT_MESSAGE=$(git log -1 --pretty=%B)
echo "Expected: '${{ env.PREPARATION_COMMIT }}'"
echo "Received: '$COMMIT_MESSAGE'"

prepared="false"
if [[ "$COMMIT_MESSAGE" == "${{ env.PREPARATION_COMMIT }}" ]]; then
prepared="true"
fi

echo "prepared=$prepared" >> $GITHUB_OUTPUT

prepare-release:
name: Prepare release
needs: [check-preparation]
if: ${{ needs.check-preparation.outputs.prepared == 'false' }}
runs-on: ubuntu-latest
steps:
- name: Generate token for PyPSA Bot
id: generate-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ vars.PYPSA_BOT_ID }}
private-key: ${{ secrets.PYPSA_BOT_PRIVATE_KEY }}

- uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Find the branch for commit/ tag
run: |
branch=$(git branch -r --contains ${{ github.sha }} | grep -v 'HEAD' | head -n 1 | sed 's|origin/||' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
echo "Branch found: $branch"
echo "BRANCH_NAME=$branch" >> $GITHUB_ENV

- uses: actions/checkout@v6
with:
fetch-depth: 0
ref: ${{ env.BRANCH_NAME }}
token: ${{ steps.generate-token.outputs.token }}

- name: Setup Pixi
uses: prefix-dev/[email protected]
with:
pixi-version: v0.59.0
cache: true
# Do not cache in branches
cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }}

# Start of preparation script

- name: Update DAGs in documentation
run: |
pixi run update-dags

# End of preparation script

- name: Remove previous tag
run: |
git tag -d ${{ github.ref_name }}
git push origin --delete ${{ github.ref_name }}

- name: Commit changes
uses: stefanzweifel/git-auto-commit-action@v7
with:
branch: ${{ env.BRANCH_NAME }}
commit_message: '${{ env.PREPARATION_COMMIT }}'
tagging_message: '${{ github.ref_name }}' # add tag again
push_options: '${{ github.ref_name }}'
add_options: '-u' # Never add untracked files
97 changes: 53 additions & 44 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,6 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

env:
BASE_ENV: envs/environment.yaml

jobs:
run-tests:
name: OS
Expand All @@ -36,67 +33,75 @@ jobs:
steps:
- uses: actions/checkout@v6

- name: Setup env file path (ubuntu)
if: matrix.os == 'ubuntu'
run: |
echo "env_file=envs/linux-64.lock.yaml" >> $GITHUB_ENV

- name: Setup env file path (macos and windows)
if: matrix.os != 'ubuntu'
run: |
if [[ "${{ matrix.os }}" == "macos" ]]; then
echo "env_file=envs/osx-arm64.lock.yaml" >> $GITHUB_ENV
else
echo "env_file=envs/win-64.lock.yaml" >> $GITHUB_ENV
fi

- name: Use base env file if it was changed
- uses: dorny/paths-filter@v3
id: filter
with:
filters: |
src:
- 'scripts/**'
- 'rules/**'
- 'data/**'
- 'Snakefile'
- 'config/**'
- 'test/**'
- 'pixi.toml'
- 'pixi.lock'
- '.github/workflows/test.yaml'

- name: Free up disk space
run: |
git fetch origin ${{ github.event.repository.default_branch }}
if git diff --name-only origin/${{ github.event.repository.default_branch }} | grep '${{ env.BASE_ENV }}'; then
echo "Base env ${{ env.BASE_ENV }} changed. Using it instead of locked envs."
echo "env_file=${{ env.BASE_ENV }}" >> $GITHUB_ENV
else
echo "Base env ${{ env.BASE_ENV }} not changed. Using locked envs."
fi
echo "Initial disk space"
df -h
echo "Free up disk space"
sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL
sudo docker image prune --all --force
sudo docker builder prune -a --force
echo "Final disk space"
df -h
- name: Skip - no source changes
if: steps.filter.outputs.src != 'true' && github.event_name != 'schedule'
run: echo "Skipping tests because no source code changes detected"

- name: Setup Pixi
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule'
uses: prefix-dev/[email protected]
with:
pixi-version: v0.59.0
cache: true
# Do not cache in branches
cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }}

- name: Setup cache keys
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule'
run: |
echo "WEEK=$(date +'%Y%U')" >> $GITHUB_ENV # data and cutouts

- uses: actions/cache@v5
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule'
with:
path: |
data
cutouts
key: data-cutouts-${{ env.WEEK }}

- uses: conda-incubator/setup-miniconda@v3
with:
miniforge-version: latest
activate-environment: pypsa-de
channel-priority: strict

- name: Cache Conda env
uses: actions/cache@v5
with:
path: ${{ env.CONDA }}/envs
key: conda-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles(format('{0}', env.env_file)) }}
id: cache-env

- name: Update environment
if: steps.cache-env.outputs.cache-hit != 'true'
- name: Run pylint check on scripts
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule'
# check for undefined variables to reuse functions across scripts
run: |
conda env update -n pypsa-de -f ${{ env.env_file }}
echo "Run conda list" && conda list
pixi run pylint --disable=all --enable=E0601,E0606 --output-format=parseable scripts/add_* scripts/prepare_* scripts/solve_*

- name: Run snakemake test workflows
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule'
env:
SNAKEMAKE_STORAGE_CACHED_HTTP_CACHE: ""
SNAKEMAKE_STORAGE_CACHED_HTTP_SKIP_REMOTE_CHECKS: "1"
run: |
make test
pixi run integration-tests

- name: Run unit tests
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule'
run: |
make unit-test
pixi run unit-tests

- name: Upload artifacts
if: always()
Expand All @@ -108,3 +113,7 @@ jobs:
.snakemake/log
results
retention-days: 3

- name: Show remaining disk space
if: always()
run: df -h
68 changes: 68 additions & 0 deletions .github/workflows/update-lockfile.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: Update locked envs
on:
push:
paths:
- pixi.toml
schedule:
- cron: "0 8 1,16 * *" # Bi-weekly
workflow_dispatch:

jobs:
update-locked-environment:
if: ${{ github.ref == 'refs/heads/master' }}
name: Update lockfiles
runs-on: ubuntu-latest
defaults:
run:
shell: bash -l {0}
steps:
- uses: actions/checkout@v6

- name: Setup Pixi
uses: prefix-dev/[email protected]
with:
pixi-version: v0.59.0

- name: Update lockfile
run: |
rm pixi.lock
pixi install --all

- name: Create new conda lock files
run: |
pixi workspace export conda-explicit-spec -e default envs
for f in envs/*_conda_spec*; do mv "$f" "${f/_conda_spec/.pin}"; done

- name: Create new conda environment file
run: |
pixi workspace export conda-environment -e default envs/environment.yaml -n pypsa-eur

- name: Upload artifacts
uses: actions/upload-artifact@v6
with:
name: lockfiles
path: |
pixi.lock
envs/

create-pull-request:
needs: update-locked-environment
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Download all artifacts
uses: actions/download-artifact@v7
with:
name: lockfiles

- name: Create Pull Request
uses: peter-evans/create-pull-request@v8
with:
token: ${{ secrets.GITHUB_TOKEN }}
branch: update-locked-environment
title: "[github-actions.ci] Update locked envs"
body: |
Automatically generated PR to update the pixi lockfile.

**Note: Do not merge without manual test execution. Either update the branch to trigger tests, or use `workflow_dispatch` to run tests manually. Unlike standard PRs, tests will not run automatically.**
commit-message: "Update locked environment files for all platforms"
Loading
Loading