Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
9ca700a
Rename package to solweig, add UTCI/PET Rust modules
songololo Jan 20, 2026
4b42939
cleanup packages
songololo Jan 20, 2026
bd79063
Phase 1 complete: Testing infrastructure with UMEP Python ground truth
songololo Jan 21, 2026
75f0462
Add simplified SOLWEIG API with 100% parity to runner
songololo Jan 21, 2026
36d91f1
Update MODERNIZATION_PLAN with January 2026 progress
songololo Jan 23, 2026
3ac83ac
Phase 5 complete: API organization and legacy deletion
songololo Jan 23, 2026
915ada3
Clean up deprecated session summaries and old test files
songololo Jan 23, 2026
93c62b1
Add color preview images using matplotlib colormaps
songololo Jan 23, 2026
5b2318e
increment
songololo Feb 2, 2026
778c88a
iter
songololo Feb 3, 2026
d390cf2
iter
songololo Feb 3, 2026
3863a91
iter
songololo Feb 3, 2026
208c68d
Add golden test fixtures and comprehensive regression tests
songololo Feb 4, 2026
f945dbe
Phase E: API improvements - error handling, result methods, config pr…
songololo Feb 4, 2026
886777a
iter
songololo Feb 4, 2026
38ac7b9
Add ROADMAP.md tracking project development priorities
songololo Feb 4, 2026
b2d6334
scaffolds docs and QGIS.
songololo Feb 4, 2026
5fca476
low sun angles
songololo Feb 5, 2026
b8da467
cleanup
songololo Feb 5, 2026
bf7c6e2
Phase G steps 1-2: move cylindric_wedge and patch sum to Rust
songololo Feb 5, 2026
4455bbd
QGIS and Rust.
songololo Feb 5, 2026
35b6e33
tests
songololo Feb 6, 2026
3a8e3ea
Align poe verify_project and typecheck tasks with pre-commit hook cov…
songololo Feb 6, 2026
b75daca
Update roadmap: mark G.2 complete, clarify GPU buffer reuse scope
songololo Feb 6, 2026
989aad9
GPU buffer reuse: cache wgpu buffers across shadow calls (G.3.1)
songololo Feb 6, 2026
c170fa9
Add poe test/test_full tasks with pytest.mark.slow split
songololo Feb 6, 2026
f5749bd
Expand CI test coverage: all non-slow tests + fix ty check scope
songololo Feb 6, 2026
e79b889
Rename poe test to test_quick for clarity
songololo Feb 6, 2026
738a126
Add QGIS plugin tests: 40 tests for converters and base algorithm (Ph…
songololo Feb 6, 2026
39c8a87
Add orchestration unit tests (57 tests) and fix QGIS mock pollution
songololo Feb 6, 2026
473f9f4
Add mkdocstrings dependencies and fix docs build
songololo Feb 6, 2026
fe4f91c
Update roadmap: mark QGIS tests, orchestration tests, API reference c…
songololo Feb 6, 2026
a5271b4
Add field-data validation tests and UMEP met loader
songololo Feb 6, 2026
0eeedab
Update ROADMAP: Phase H field-data validation in progress
songololo Feb 6, 2026
e47f917
JSON parameter integration: bundled UMEP JSON as single source of truth
songololo Feb 6, 2026
8ec8840
Add wall_material parameter for scalar wall material selection
songololo Feb 6, 2026
dca406f
Add Montpellier Tmrt validation against INRAE PRESTI globe thermometers
songololo Feb 6, 2026
b0424f0
Add isotropic sky model validation test to Montpellier suite
songololo Feb 6, 2026
4610cb3
Use clear-sky GHI model and concrete wall material in Montpellier val…
songololo Feb 6, 2026
f62c4d3
qgis
songololo Feb 6, 2026
1a56008
QGIS and Rust.
songololo Feb 6, 2026
6da975b
rasters
songololo Feb 7, 2026
e48d89b
qgis and memory.
songololo Feb 7, 2026
662a9d6
Fix nested if statement and format code
songololo Feb 7, 2026
37a46c5
memory
songololo Feb 7, 2026
f0a3aaf
perf
songololo Feb 7, 2026
37b34e6
v0.1.0b2
songololo Feb 7, 2026
242f539
README.md update.
songololo Feb 7, 2026
9612a13
Mac Intel Runner
songololo Feb 7, 2026
bb4c0fe
README.md, edit.
songololo Feb 7, 2026
3238645
QGIS Plugin Bundle
songololo Feb 7, 2026
1801fbb
QGIS Plugin Repository compliance & v0.1.0-beta4
songololo Feb 8, 2026
caed378
Fix CI workflows & bump v0.1.0-beta5
songololo Feb 8, 2026
8c22d12
QGIS plugin: auto-detect outdated solweig & prompt upgrade
songololo Feb 8, 2026
9b06e4b
CI: gate publish on tests & bump v0.1.0-beta7
songololo Feb 8, 2026
09be439
Fix Montpellier validation tests: add missing compute_svf() call
songololo Feb 8, 2026
4f42049
CI: replace deprecated maturin upload with pypa/gh-action-pypi-publish
songololo Feb 8, 2026
c55a347
QGIS plugin: fix provider not registering in Processing Toolbox & bum…
songololo Feb 9, 2026
4a33c14
Fix QGIS numpy dtype crash: consolidate geospatial backend detection …
songololo Feb 9, 2026
6ae1c34
Auto-fill NaN in surface layers & improve QGIS height convention UX —…
songololo Feb 9, 2026
f49f00d
Fix PyPI sdist missing LICENSE file & bump v0.1.0-beta11
songololo Feb 9, 2026
f67fad1
CI: create GitHub Release with wheels on tag push & bump v0.1.0-beta12
songololo Feb 9, 2026
5790774
Prefer local pysrc solweig in dev and add API/version checks
songololo Feb 9, 2026
65fe069
Location.from_epw, anisotropic tiled sky, SVF cache fixes & bump v0.1…
songololo Feb 11, 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
87 changes: 87 additions & 0 deletions .github/workflows/build-qgis-plugin.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
name: Build QGIS Plugin

on:
push:
tags:
- "v*"
workflow_dispatch:
inputs:
version:
description: "Version for the release"
required: true
default: "0.1.0"

jobs:
build-plugin:
name: Build QGIS Plugin
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Get version
id: version
run: |
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
else
# Extract version from tag (e.g., v0.1.0 -> 0.1.0)
echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
fi

- name: Build plugin package
run: python qgis_plugin/build_plugin.py --version ${{ steps.version.outputs.version }}

- name: Validate plugin ZIP
run: |
cd qgis_plugin
ZIP=$(ls solweig-qgis-*.zip | head -1)
echo "Validating $ZIP..."
unzip -l "$ZIP" | tee /tmp/bundle_contents.txt

# Check essential files exist
for file in metadata.txt __init__.py provider.py icon.png; do
if grep -q "solweig_qgis/$file" /tmp/bundle_contents.txt; then
echo " OK: $file found"
else
echo " MISSING: $file"
exit 1
fi
done

echo "Plugin validation passed."

- name: Upload plugin package
uses: actions/upload-artifact@v4
with:
name: qgis-plugin
path: qgis_plugin/solweig-qgis-*.zip

create-release:
name: Create Release
needs: build-plugin
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')
permissions:
contents: write

steps:
- name: Download plugin
uses: actions/download-artifact@v4
with:
name: qgis-plugin
path: artifacts/

- name: Create Release
uses: softprops/action-gh-release@v2
with:
files: |
artifacts/*.zip
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
55 changes: 55 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Deploy Documentation

on:
push:
branches: [main]
tags-ignore:
- "**"
paths:
- 'docs/**'
- 'mkdocs.yml'
- 'pysrc/**'
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write

concurrency:
group: "pages"
cancel-in-progress: false

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'

- name: Install dependencies
run: |
pip install mkdocs-material mkdocstrings[python] pymdown-extensions

- name: Build documentation
run: mkdocs build --strict

- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: site/

deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
43 changes: 20 additions & 23 deletions .github/workflows/python-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,15 @@ name: publish package
on:
push:
tags-ignore:
- "*.*.*[a]*"
- "*.*.*[a]*" # Skip alpha tags (e.g. v0.1.0a1); beta/rc/release tags publish to PyPI
permissions:
contents: read
jobs:
check:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v3
- name: Set up Python ${{ matrix.python-version }}
run: uv python install ${{ matrix.python-version }}
test:
uses: ./.github/workflows/test.yml
linux:
runs-on: ${{ matrix.platform.runner }}
needs: check
needs: test
strategy:
matrix:
platform:
Expand All @@ -47,7 +37,7 @@ jobs:
path: dist
musllinux:
runs-on: ${{ matrix.platform.runner }}
needs: check
needs: test
strategy:
matrix:
platform:
Expand All @@ -74,7 +64,7 @@ jobs:
path: dist
windows:
runs-on: ${{ matrix.platform.runner }}
needs: check
needs: test
strategy:
matrix:
platform:
Expand All @@ -99,13 +89,13 @@ jobs:
path: dist
macos:
runs-on: ${{ matrix.platform.runner }}
needs: check
needs: test
strategy:
matrix:
platform:
- runner: macos-13
- runner: macos-15-intel # Intel x86_64 (GitHub's recommended replacement)
target: x86_64
- runner: macos-14
- runner: macos-14 # Apple Silicon ARM64
target: aarch64
steps:
- uses: actions/checkout@v4
Expand All @@ -125,7 +115,7 @@ jobs:
path: dist
sdist:
runs-on: ubuntu-latest
needs: check
needs: test
steps:
- uses: actions/checkout@v4
- name: Build sdist
Expand Down Expand Up @@ -156,9 +146,16 @@ jobs:
uses: actions/attest-build-provenance@v2
with:
subject-path: "wheels-*/*"
- name: Merge wheels into dist/
if: ${{ startsWith(github.ref, 'refs/tags/') }}
run: mkdir -p dist && cp wheels-*/* dist/
- name: Publish to PyPI
if: ${{ startsWith(github.ref, 'refs/tags/') }}
uses: PyO3/maturin-action@v1
uses: pypa/gh-action-pypi-publish@release/v1
- name: Create GitHub Release
if: ${{ startsWith(github.ref, 'refs/tags/') }}
uses: softprops/action-gh-release@v2
with:
command: upload
args: --non-interactive --skip-existing wheels-*/*
files: dist/*
generate_release_notes: true
prerelease: ${{ contains(github.ref, 'a') || contains(github.ref, 'b') || contains(github.ref, 'rc') }}
157 changes: 157 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
name: Test

on:
push:
branches:
- main
- dev
tags-ignore:
- "**"
pull_request:
branches:
- main
- dev
workflow_call: # Allow publish workflow to call this as a dependency

# Cancel in-progress runs for the same branch/PR
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@v5

- name: Set up Python
run: uv python install 3.12

- name: Install dependencies
run: uv sync --group dev

- name: Run ruff check
run: uv run ruff check

- name: Run ruff format check
run: uv run ruff format --check

typecheck:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@v5

- name: Set up Python
run: uv python install 3.12

- name: Install dependencies
run: uv sync --group dev

- name: Run ty
run: uv run ty check pysrc/ tests/ demos/ scripts/ qgis_plugin/

test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12"]
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@v5

- name: Set up Python ${{ matrix.python-version }}
run: uv python install ${{ matrix.python-version }}

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Install dependencies
run: uv sync --group dev

- name: Build Rust extension
run: uv run maturin develop --release

- name: Run tests (excluding slow)
run: uv run python -m pytest tests/ -m 'not slow' -v --tb=short
env:
PYTHONPATH: ${{ github.workspace }}

memory-benchmark:
name: Memory benchmark
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@v5

- name: Set up Python 3.12
run: uv python install 3.12

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Install dependencies
run: uv sync --group dev

- name: Build Rust extension
run: uv run maturin develop --release

- name: Run memory benchmark tests
run: uv run python -m pytest tests/benchmarks/ -v --tb=short
env:
PYTHONPATH: ${{ github.workspace }}

test-qgis-compat:
name: Test QGIS compatibility (NumPy 1.26)
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@v5

- name: Set up Python 3.12
run: uv python install 3.12

- name: Install GDAL system libraries
run: sudo apt-get update && sudo apt-get install -y libgdal-dev gdal-bin python3-gdal

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Install dependencies (QGIS compat - NumPy 1.26)
run: uv sync --group qgis-compat

- name: Install GDAL Python bindings matching system
run: uv pip install "gdal==$(gdal-config --version)"

- name: Build Rust extension
run: uv run maturin develop --release

- name: Verify NumPy version
run: uv run python -c "import numpy; assert numpy.__version__.startswith('1.26'), f'Expected NumPy 1.26.x, got {numpy.__version__}'"

- name: Verify GDAL backend is used
run: uv run python -c "from solweig import io; assert io.GDAL_ENV, 'Expected GDAL backend'"
env:
UMEP_USE_GDAL: "1"

- name: Run tests (excluding slow) with GDAL backend
run: uv run python -m pytest tests/ -m 'not slow' -v --tb=short
env:
PYTHONPATH: ${{ github.workspace }}
UMEP_USE_GDAL: "1"
Loading
Loading