Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
786a1c5
Enhance README with additional badges
mwyau Mar 5, 2026
ac87ae3
chore: Remove deprecated scripts and notebooks
mwyau Mar 7, 2026
aefd95a
fix: Support N-dimensional arrays, valid_time, and empty centers in E…
mwyau Mar 7, 2026
377df82
feat: Export tracked cyclones to IMILAST format
mwyau Mar 7, 2026
3172c08
test: Integrate pooch for ERA5 test datasets and refactor tests
mwyau Mar 7, 2026
e923f1f
chore: Bump version to v0.3.0, update documentation and dependencies
mwyau Mar 7, 2026
bac6aa6
docs: Add IMILAST Intercomparison Protocol
mwyau Mar 7, 2026
124a70c
Add IMILAST output support and legacy regression integration test
mwyau Mar 7, 2026
d0428fb
Refactor integration test comparison to use explicit tolerances
mwyau Mar 8, 2026
45ae7a6
Ignore .vscode directory
mwyau Mar 8, 2026
9d526b8
Fix all ruff and mypy issues and ensure all tests pass
mwyau Mar 8, 2026
0bb9332
Refactor track handling to Tracks class and remove all CSV references
mwyau Mar 8, 2026
e136140
Merge pull request #8 from mwyau/feature/imilast-output-and-pooch-tes…
mwyau Mar 8, 2026
e705098
Add GitHub Actions CI workflow and update pre-commit configuration
mwyau Mar 8, 2026
ba3c9fd
Remove deprecated ANN rules from ruff config
mwyau Mar 8, 2026
cebbf4d
Add IMILAST data download link to README
mwyau Mar 8, 2026
274bb7f
Update README with CI/CD feature
mwyau Mar 8, 2026
666b87f
Optimize CI workflow and refactor Center to dataclass
mwyau Mar 8, 2026
605ef2e
Refactor codebase for modern Python 3.10+ standards and optimize CI
mwyau Mar 8, 2026
1c53a6f
Simplify output extension handling to only use .txt
mwyau Mar 8, 2026
3e9d1bd
Remove hardcoded Windows paths and improve test portability
mwyau Mar 8, 2026
7c768e5
Optimize integration tests for speed: use direct calls, streamline co…
mwyau Mar 8, 2026
91754f2
Standardize integration test IDs and tiered coverage logic
mwyau Mar 8, 2026
3404664
Restore Python matrix (3.10, 3.11, 3.12) for CI testing
mwyau Mar 8, 2026
af1dff0
Install MPI dependencies in CI runner
mwyau Mar 8, 2026
58632af
Potential fix for code scanning alert no. 1: Workflow does not contai…
mwyau Mar 8, 2026
9026719
Add unit tests for Tracks IMILAST I/O and finalize CI/CD enhancements
mwyau Mar 8, 2026
d4a8137
Add Development section to README
mwyau Mar 8, 2026
38662a5
Further granularize CI: split linting and type-checking into separate…
mwyau Mar 8, 2026
d62ffe3
Introduce TimeRange dataclass and refactor time tracking logic
mwyau Mar 8, 2026
2dae06e
Implement structural pattern matching in get_var and finalize moderni…
mwyau Mar 8, 2026
ff3b71d
Clean up Grid protocol signature: remove default values
mwyau Mar 8, 2026
1feb956
Refactor head and tail to use object references for a more Pythonic i…
mwyau Mar 8, 2026
0db3316
Enforce strict types in Track model and eliminate remaining isinstanc…
mwyau Mar 8, 2026
31afee9
Make Tracks.compare order-independent and clean up redundant test sor…
mwyau Mar 8, 2026
cefd36c
Centralize track sorting logic in Tracks.sort and reuse in from_imila…
mwyau Mar 8, 2026
c3b87ff
Final README refinements for modernization and project structure
mwyau Mar 8, 2026
ad5964e
Default pytest to skip slow tests locally and override in CI
mwyau Mar 8, 2026
413fcab
Merge pull request #9 from mwyau/feature/cicd-improvements
mwyau Mar 8, 2026
a8714c3
WIP: Migrate to xarray, update tiered testing logic, and clean up dep…
mwyau Mar 8, 2026
eb73342
Migrate to xarray, update TimeRange, and optimize integration tests
mwyau Mar 8, 2026
468641f
style: run ruff format
mwyau Mar 8, 2026
48e0a24
WIP: Rename chart_buffer to time_chunk_size and optimize detector
mwyau Mar 8, 2026
b31c644
Replace netCDF4 with h5netcdf and remove unused xdist
mwyau Mar 8, 2026
947a708
Modernize codebase: rename chart to frame, optimize regression tests,…
mwyau Mar 8, 2026
684950e
Fix: Explicitly add h5py dependency for CI
mwyau Mar 8, 2026
cd6d807
Fix: Remove unused type ignore in detector.py
mwyau Mar 8, 2026
22c5ff3
ci: increase pytest verbosity
mwyau Mar 8, 2026
a9207e3
Fix: Explicitly use h5netcdf engine and remove redundant h5py dependency
mwyau Mar 8, 2026
3de8b39
modernize: achieve 100% strict typing without Any or type:ignore
mwyau Mar 8, 2026
c6edc6e
build: drop support for python <3.12 and target only 3.12
mwyau Mar 8, 2026
66a03d8
ci: use strategy matrix for python 3.12
mwyau Mar 8, 2026
9f20ceb
build: refine tiered testing logic with --run-slow and --run-all
mwyau Mar 8, 2026
3ac2474
Merge pull request #10 from mwyau/feature/migrate-to-xarray
mwyau Mar 8, 2026
c026bac
feat: add code coverage reporting with pytest-cov
mwyau Mar 8, 2026
21330e4
feat: add support for python 3.13 and 3.14
mwyau Mar 8, 2026
cf8086f
feat: complete modernization with Python 3.14 Docker base
mwyau Mar 8, 2026
753cca7
docs: organize README badges
mwyau Mar 8, 2026
cea0543
docs: fix typo in usage table
mwyau Mar 8, 2026
445285b
docs: finalize Codecov reporting and CI workflow
mwyau Mar 8, 2026
ad5fdf4
fix: CI coverage reports
mwyau Mar 8, 2026
8255d09
Merge pull request #11 from mwyau/feature/modernize-env-and-coverage
mwyau Mar 8, 2026
41cfe97
fix: Docker GitHub Actions
mwyau Mar 8, 2026
06ac1d1
ci: simplify docker tagging logic with pattern input
mwyau Mar 8, 2026
41cc6cc
fix: setup-buildx-action
mwyau Mar 8, 2026
413c810
ci: use vars.DOCKER_HUB_USERNAME for Docker Hub login
mwyau Mar 8, 2026
e736120
Merge pull request #12 from mwyau/fix/docker-publish
mwyau Mar 8, 2026
6f4151a
Configure Dependabot for pip and GitHub Actions
mwyau Mar 8, 2026
634c929
build(deps): bump docker/build-push-action from 5 to 7
dependabot[bot] Mar 8, 2026
9c8d002
build(deps): bump actions/setup-python from 5 to 6
dependabot[bot] Mar 8, 2026
37993c9
build(deps): bump actions/download-artifact from 4 to 8
dependabot[bot] Mar 8, 2026
fe6b9be
build(deps): bump docker/login-action from 3 to 4
dependabot[bot] Mar 8, 2026
d759431
build(deps): bump actions/upload-artifact from 4 to 7
dependabot[bot] Mar 8, 2026
e19ab09
Merge pull request #13 from mwyau/dependabot/github_actions/docker/bu…
mwyau Mar 8, 2026
70c0b1a
Merge pull request #14 from mwyau/dependabot/github_actions/actions/s…
mwyau Mar 8, 2026
f3050dd
Merge pull request #15 from mwyau/dependabot/github_actions/actions/d…
mwyau Mar 8, 2026
b9fc1d8
Merge pull request #16 from mwyau/dependabot/github_actions/docker/lo…
mwyau Mar 8, 2026
ce1abd0
Merge pull request #17 from mwyau/dependabot/github_actions/actions/u…
mwyau Mar 8, 2026
9e16d5f
fix: resolve 0% coverage and restore python 3.11 support
mwyau Mar 8, 2026
3e23fc6
docs: update docker badge and python version support
mwyau Mar 8, 2026
05bbeb2
docs: update docker badge to show image name
mwyau Mar 8, 2026
0fafb10
docs: update GHCR link to organization URL
mwyau Mar 8, 2026
d576750
refactor: use TypeAlias for Python 3.11 compatibility
mwyau Mar 8, 2026
f422f07
docs: rearrange README badges
mwyau Mar 8, 2026
e7571ca
docs: fix typo in CLI arguments table
mwyau Mar 8, 2026
e5ac70f
Merge pull request #19 from mwyau/fix/codecov-python-311
mwyau Mar 8, 2026
1a533e6
feat: add Read the Docs documentation scaffolding
mwyau Mar 8, 2026
2206b64
docs: add Read the Docs badge and section to README
mwyau Mar 8, 2026
d659959
docs: fix unused imports and add link to intercomparison protocol
mwyau Mar 8, 2026
8616894
Merge pull request #20 from mwyau/feature/add-docs
mwyau Mar 8, 2026
2946eb0
ci: optimize Docker Publish trigger to avoid redundant builds
mwyau Mar 8, 2026
1de468a
ci: optimize triggers and use shared matrix versions
mwyau Mar 8, 2026
3620b3d
Merge pull request #21 from mwyau/fix/docker-publish-trigger
mwyau Mar 8, 2026
4f77c34
chore: update pre-commit hooks and switch to pre-push
mwyau Mar 8, 2026
bdec886
style: automatic fixes from pre-commit
mwyau Mar 8, 2026
5c86781
security: prevent checkout of untrusted code in trusted context
mwyau Mar 8, 2026
ca37cff
feat: switch to uv for dependency management and local dev
mwyau Mar 8, 2026
7f73477
chore: streamline dependencies to 18-month window (NEP-29 adjusted)
mwyau Mar 8, 2026
b2b6d90
chore: use dependency-groups for dev dependencies
mwyau Mar 8, 2026
e856a25
chore: add uv.lock for deterministic builds
mwyau Mar 8, 2026
06c4e99
chore: align numpy and scipy with xarray 2024.9.0 minimums
mwyau Mar 8, 2026
2116dcb
docs: move documentation badge next to CI badge
mwyau Mar 8, 2026
be341b5
docs: move DOI badge to the end
mwyau Mar 8, 2026
9f025b7
docs: refine Xarray feature description
mwyau Mar 8, 2026
0cce512
Merge pull request #22 from mwyau/feature/dependency-management
mwyau Mar 8, 2026
e7c42d1
chore: update release date in CITATION.cff
mwyau Mar 8, 2026
dc960bf
fix: resolve double CI trigger and README formatting
mwyau Mar 8, 2026
5849d7a
ci: disable Codecov status checks to only report coverage
mwyau Mar 8, 2026
9edbccd
feat: increase test coverage and add documentation comments
mwyau Mar 8, 2026
a7d1ef3
Merge branch 'chore/release-update' into fix/final-touches
mwyau Mar 8, 2026
25c7973
Merge pull request #23 from mwyau/fix/final-consolidated
mwyau Mar 8, 2026
4672769
docs: lowercase GHCR organization name
mwyau Mar 8, 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
1 change: 0 additions & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
@@ -1 +0,0 @@
data/test/*.nc filter=lfs diff=lfs merge=lfs -text export-ignore
16 changes: 16 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file

version: 2
updates:
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "daily"

- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
126 changes: 126 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
name: CI

on:
push:
branches: [main, dev]
pull_request:
branches: [main, dev]
types: [opened, synchronize, reopened]
workflow_dispatch:

permissions:
contents: read

jobs:
prepare:
runs-on: ubuntu-latest
# Skip PR CI if the head branch is 'dev' to avoid double runs (push trigger covers it)
if: github.event_name == 'push' || github.event.pull_request.head.ref != 'dev'
outputs:
python-versions: ${{ steps.versions.outputs.value }}
steps:
- id: versions
run: echo 'value=["3.11", "3.12", "3.13", "3.14"]' >> $GITHUB_OUTPUT

ruff-lint:
runs-on: ubuntu-latest
if: github.event_name == 'push' || github.event.pull_request.head.ref != 'dev'
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.11"
cache: "pip"
- name: Install dependencies
run: pip install ruff
- name: Lint with Ruff
run: ruff check .

ruff-format:
runs-on: ubuntu-latest
if: github.event_name == 'push' || github.event.pull_request.head.ref != 'dev'
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.11"
cache: "pip"
- name: Install dependencies
run: pip install ruff
- name: Check formatting with Ruff
run: ruff format --check .

mypy-typecheck:
runs-on: ubuntu-latest
if: github.event_name == 'push' || github.event.pull_request.head.ref != 'dev'
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.11"
cache: "pip"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install .[dev]
- name: Type check with Mypy
run: mypy src/ tests/

unit-tests:
name: unit-tests (Python ${{ matrix.python-version }})
needs: prepare
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ${{ fromJSON(needs.prepare.outputs.python-versions) }}
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
cache: "pip"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install .[dev]
- name: Run Unit Tests
run: |
pytest -vv
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}

integration-tests:
name: integration-tests (Python ${{ matrix.python-version }})
needs: prepare
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ${{ fromJSON(needs.prepare.outputs.python-versions) }}
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
cache: "pip"
- name: Install MPI
run: |
sudo apt-get update
sudo apt-get install -y openmpi-bin libopenmpi-dev
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install .[dev]
- name: Run Integration Tests
run: |
pytest -vv tests/test_integration.py --run-all
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
70 changes: 70 additions & 0 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: Docker Publish

on:
workflow_run:
workflows: ["CI"]
types: [completed]

env:
DOCKER_HUB_REPO: xddd/pystormtracker
GHCR_REPO: ghcr.io/xddd/pystormtracker

jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
# Only run if CI was successful AND it was a push event to main or dev
# Added head_repository check to prevent checkout of untrusted code in trusted context
if: >
github.event.workflow_run.conclusion == 'success' &&
github.event.workflow_run.head_repository.full_name == github.repository &&
(github.event.workflow_run.event == 'push' || github.event.workflow_run.event == 'workflow_dispatch') &&
(github.event.workflow_run.head_branch == 'main' || github.event.workflow_run.head_branch == 'dev')

steps:
- name: Checkout repository
# Use the commit from the completed workflow run
uses: actions/checkout@v4
with:
ref: ${{ github.event.workflow_run.head_sha }}

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4

- name: Log in to Docker Hub
uses: docker/login-action@v4
with:
username: ${{ vars.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

- name: Log in to GHCR
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GHCR_PAT }}

- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: |
${{ env.DOCKER_HUB_REPO }}
${{ env.GHCR_REPO }}
tags: |
type=raw,value=dev,pattern=dev
type=raw,value=latest,pattern=main
type=semver,pattern={{version}},pattern=main
type=semver,pattern={{major}}.{{minor}},pattern=main

- name: Build and push Docker image
uses: docker/build-push-action@v7
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
6 changes: 3 additions & 3 deletions .github/workflows/python-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
steps:
- uses: actions/checkout@v4

- uses: actions/setup-python@v5
- uses: actions/setup-python@v6
with:
python-version: "3.x"

Expand All @@ -27,7 +27,7 @@ jobs:
python -m build

- name: Upload distributions
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: release-dists
path: dist/
Expand All @@ -54,7 +54,7 @@ jobs:
echo "version=${VERSION#v}" >> $GITHUB_OUTPUT

- name: Retrieve release distributions
uses: actions/download-artifact@v4
uses: actions/download-artifact@v8
with:
name: release-dists
path: dist/
Expand Down
9 changes: 6 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,10 @@ target/

# netCDF files
*.nc
!data/test/*.nc

# CSV files
*.csv
# TXT track files
*.txt
!data/test/tracks/*.txt

# VSCode
.vscode/
10 changes: 4 additions & 6 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
rev: v5.0.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
Expand All @@ -9,16 +9,14 @@ repos:
- id: debug-statements

- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.3.4
rev: v0.9.9
hooks:
# Run the linter.
- id: ruff
args: [ --fix ]
# Run the formatter.
- id: ruff-format

- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.9.0
rev: v1.15.0
hooks:
- id: mypy
additional_dependencies: [ types-all ]
additional_dependencies: [numpy, pooch, scipy, pytest, pandas, xarray, dask, distributed, h5netcdf]
19 changes: 19 additions & 0 deletions .readthedocs.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details

version: 2

build:
os: ubuntu-24.04
tools:
python: "3.14"

python:
install:
- method: pip
path: .
extra_requirements:
- dev

sphinx:
configuration: docs/conf.py
4 changes: 2 additions & 2 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ keywords:
- dask
- mpi
license: BSD-3-Clause
version: 0.2.2
date-released: '2026-03-04'
version: 0.3.0
date-released: '2026-03-08'
preferred-citation:
type: article
authors:
Expand Down
32 changes: 32 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Use Python 3.14 slim as the base image
FROM python:3.14-slim

# Install system dependencies for MPI and building packages
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
libopenmpi-dev \
openmpi-bin \
&& rm -rf /var/lib/apt/lists/*

# Set working directory
WORKDIR /app

# Create data directory for mounting
RUN mkdir /data && chmod 777 /data

# Copy the project files
COPY . .

# Install the package and its dependencies
RUN pip install --no-cache-dir .

# Add a non-root user for security
RUN useradd -m pst
USER pst

# Volume for data persistence
VOLUME /data

# Default command
ENTRYPOINT ["stormtracker"]
CMD ["--help"]
Loading