PyStormTracker 0.3.0__tar.gz → 0.3.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/.github/workflows/ci.yml +38 -45
- pystormtracker-0.3.1/.github/workflows/docker-publish.yml +88 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/.github/workflows/python-publish.yml +4 -5
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/.pre-commit-config.yaml +2 -1
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/.readthedocs.yaml +6 -3
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/CITATION.cff +2 -2
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/Dockerfile +5 -2
- pystormtracker-0.3.1/LICENSE +29 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/PKG-INFO +44 -33
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/README.md +29 -18
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/pyproject.toml +16 -24
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/models/tracks.py +24 -11
- pystormtracker-0.3.1/tests/conftest.py +35 -0
- pystormtracker-0.3.0/src/pystormtracker/data.py → pystormtracker-0.3.1/tests/data_utils.py +2 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/tests/test_integration.py +5 -3
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/tests/test_stormtracker.py +2 -1
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/uv.lock +180 -879
- pystormtracker-0.3.0/.gitattributes +0 -0
- pystormtracker-0.3.0/.github/workflows/docker-publish.yml +0 -70
- pystormtracker-0.3.0/LICENSE +0 -40
- pystormtracker-0.3.0/tests/conftest.py +0 -30
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/.github/dependabot.yml +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/.gitignore +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/codecov.yml +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/data/test/tracks/era5_msl_2.5x2.5_v0.0.2_imilast.txt +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/docs/IntercomparisonProtocol.pdf +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/docs/conf.py +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/docs/index.md +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/__init__.py +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/models/__init__.py +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/models/center.py +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/models/grid.py +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/models/time.py +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/simple/__init__.py +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/simple/detector.py +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/simple/linker.py +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/stormtracker.py +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/tests/__init__.py +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/tests/test_center.py +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/tests/test_simple_detector.py +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/tests/test_simple_linker.py +0 -0
- {pystormtracker-0.3.0 → pystormtracker-0.3.1}/tests/test_tracks.py +0 -0
|
@@ -2,10 +2,12 @@ name: CI
|
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
|
-
branches:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
- dev
|
|
6
8
|
pull_request:
|
|
7
|
-
branches:
|
|
8
|
-
|
|
9
|
+
branches:
|
|
10
|
+
- dev
|
|
9
11
|
workflow_dispatch:
|
|
10
12
|
|
|
11
13
|
permissions:
|
|
@@ -27,47 +29,42 @@ jobs:
|
|
|
27
29
|
if: github.event_name == 'push' || github.event.pull_request.head.ref != 'dev'
|
|
28
30
|
steps:
|
|
29
31
|
- uses: actions/checkout@v4
|
|
30
|
-
- name: Set up
|
|
31
|
-
uses:
|
|
32
|
+
- name: Set up uv
|
|
33
|
+
uses: astral-sh/setup-uv@v7
|
|
32
34
|
with:
|
|
33
|
-
|
|
34
|
-
cache: "pip"
|
|
35
|
-
- name: Install dependencies
|
|
36
|
-
run: pip install ruff
|
|
35
|
+
enable-cache: true
|
|
37
36
|
- name: Lint with Ruff
|
|
38
|
-
run: ruff check .
|
|
37
|
+
run: uv run ruff check .
|
|
39
38
|
|
|
40
39
|
ruff-format:
|
|
41
40
|
runs-on: ubuntu-latest
|
|
42
41
|
if: github.event_name == 'push' || github.event.pull_request.head.ref != 'dev'
|
|
43
42
|
steps:
|
|
44
43
|
- uses: actions/checkout@v4
|
|
45
|
-
- name: Set up
|
|
46
|
-
uses:
|
|
44
|
+
- name: Set up uv
|
|
45
|
+
uses: astral-sh/setup-uv@v7
|
|
47
46
|
with:
|
|
48
|
-
|
|
49
|
-
cache: "pip"
|
|
50
|
-
- name: Install dependencies
|
|
51
|
-
run: pip install ruff
|
|
47
|
+
enable-cache: true
|
|
52
48
|
- name: Check formatting with Ruff
|
|
53
|
-
run: ruff format --check .
|
|
49
|
+
run: uv run ruff format --check .
|
|
54
50
|
|
|
55
51
|
mypy-typecheck:
|
|
56
52
|
runs-on: ubuntu-latest
|
|
57
53
|
if: github.event_name == 'push' || github.event.pull_request.head.ref != 'dev'
|
|
58
54
|
steps:
|
|
59
55
|
- uses: actions/checkout@v4
|
|
60
|
-
- name: Set up
|
|
61
|
-
uses:
|
|
56
|
+
- name: Set up uv
|
|
57
|
+
uses: astral-sh/setup-uv@v7
|
|
62
58
|
with:
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
- name: Install dependencies
|
|
59
|
+
enable-cache: true
|
|
60
|
+
- name: Install system dependencies
|
|
66
61
|
run: |
|
|
67
|
-
|
|
68
|
-
|
|
62
|
+
sudo apt-get update
|
|
63
|
+
sudo apt-get install -y libeccodes-dev
|
|
64
|
+
- name: Install dependencies
|
|
65
|
+
run: uv sync --group dev
|
|
69
66
|
- name: Type check with Mypy
|
|
70
|
-
run: mypy src/ tests/
|
|
67
|
+
run: uv run mypy src/ tests/
|
|
71
68
|
|
|
72
69
|
unit-tests:
|
|
73
70
|
name: unit-tests (Python ${{ matrix.python-version }})
|
|
@@ -78,22 +75,20 @@ jobs:
|
|
|
78
75
|
python-version: ${{ fromJSON(needs.prepare.outputs.python-versions) }}
|
|
79
76
|
steps:
|
|
80
77
|
- uses: actions/checkout@v4
|
|
81
|
-
- name: Set up
|
|
82
|
-
uses:
|
|
78
|
+
- name: Set up uv
|
|
79
|
+
uses: astral-sh/setup-uv@v7
|
|
83
80
|
with:
|
|
81
|
+
enable-cache: true
|
|
84
82
|
python-version: ${{ matrix.python-version }}
|
|
85
|
-
|
|
86
|
-
- name: Install dependencies
|
|
83
|
+
- name: Install system dependencies
|
|
87
84
|
run: |
|
|
88
|
-
|
|
89
|
-
|
|
85
|
+
sudo apt-get update
|
|
86
|
+
sudo apt-get install -y libeccodes-dev
|
|
87
|
+
- name: Install dependencies
|
|
88
|
+
run: uv sync --group dev
|
|
90
89
|
- name: Run Unit Tests
|
|
91
90
|
run: |
|
|
92
|
-
pytest -vv
|
|
93
|
-
- name: Upload coverage reports to Codecov
|
|
94
|
-
uses: codecov/codecov-action@v5
|
|
95
|
-
with:
|
|
96
|
-
token: ${{ secrets.CODECOV_TOKEN }}
|
|
91
|
+
uv run pytest -vv
|
|
97
92
|
|
|
98
93
|
integration-tests:
|
|
99
94
|
name: integration-tests (Python ${{ matrix.python-version }})
|
|
@@ -104,22 +99,20 @@ jobs:
|
|
|
104
99
|
python-version: ${{ fromJSON(needs.prepare.outputs.python-versions) }}
|
|
105
100
|
steps:
|
|
106
101
|
- uses: actions/checkout@v4
|
|
107
|
-
- name: Set up
|
|
108
|
-
uses:
|
|
102
|
+
- name: Set up uv
|
|
103
|
+
uses: astral-sh/setup-uv@v7
|
|
109
104
|
with:
|
|
105
|
+
enable-cache: true
|
|
110
106
|
python-version: ${{ matrix.python-version }}
|
|
111
|
-
|
|
112
|
-
- name: Install MPI
|
|
107
|
+
- name: Install system dependencies
|
|
113
108
|
run: |
|
|
114
109
|
sudo apt-get update
|
|
115
|
-
sudo apt-get install -y openmpi-bin libopenmpi-dev
|
|
110
|
+
sudo apt-get install -y openmpi-bin libopenmpi-dev libeccodes-dev
|
|
116
111
|
- name: Install dependencies
|
|
117
|
-
run:
|
|
118
|
-
python -m pip install --upgrade pip
|
|
119
|
-
pip install .[dev]
|
|
112
|
+
run: uv sync --group dev
|
|
120
113
|
- name: Run Integration Tests
|
|
121
114
|
run: |
|
|
122
|
-
pytest -vv tests/test_integration.py --run-
|
|
115
|
+
uv run pytest -vv tests/test_integration.py --run-integration
|
|
123
116
|
- name: Upload coverage reports to Codecov
|
|
124
117
|
uses: codecov/codecov-action@v5
|
|
125
118
|
with:
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
name: Docker Publish
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_run:
|
|
5
|
+
workflows: ["CI"]
|
|
6
|
+
branches: [dev]
|
|
7
|
+
types: [completed]
|
|
8
|
+
release:
|
|
9
|
+
types: [published]
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
inputs:
|
|
12
|
+
branch:
|
|
13
|
+
description: 'The branch to build from'
|
|
14
|
+
required: true
|
|
15
|
+
type: choice
|
|
16
|
+
options:
|
|
17
|
+
- main
|
|
18
|
+
- dev
|
|
19
|
+
default: 'main'
|
|
20
|
+
|
|
21
|
+
env:
|
|
22
|
+
DOCKER_HUB_REPO: xddd/pystormtracker
|
|
23
|
+
GHCR_REPO: ghcr.io/xddd/pystormtracker
|
|
24
|
+
|
|
25
|
+
jobs:
|
|
26
|
+
build-and-push:
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
if: |
|
|
29
|
+
(github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success') ||
|
|
30
|
+
github.event_name == 'release' ||
|
|
31
|
+
github.event_name == 'workflow_dispatch'
|
|
32
|
+
permissions:
|
|
33
|
+
contents: read
|
|
34
|
+
packages: write
|
|
35
|
+
steps:
|
|
36
|
+
- name: Checkout repository
|
|
37
|
+
uses: actions/checkout@v6
|
|
38
|
+
with:
|
|
39
|
+
# Checkout the branch on manual trigger, the commit on workflow_run, or the tag on release
|
|
40
|
+
ref: ${{ github.event.inputs.branch || github.event.workflow_run.head_sha }}
|
|
41
|
+
fetch-depth: 0 # Fetches all history for all tags. Needed for semver.
|
|
42
|
+
|
|
43
|
+
- name: Set up QEMU
|
|
44
|
+
uses: docker/setup-qemu-action@v4
|
|
45
|
+
|
|
46
|
+
- name: Set up Docker Buildx
|
|
47
|
+
uses: docker/setup-buildx-action@v4
|
|
48
|
+
|
|
49
|
+
- name: Log in to Docker Hub
|
|
50
|
+
uses: docker/login-action@v4
|
|
51
|
+
with:
|
|
52
|
+
username: ${{ vars.DOCKER_HUB_USERNAME }}
|
|
53
|
+
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
|
|
54
|
+
|
|
55
|
+
- name: Log in to GHCR
|
|
56
|
+
uses: docker/login-action@v4
|
|
57
|
+
with:
|
|
58
|
+
registry: ghcr.io
|
|
59
|
+
username: ${{ github.repository_owner }}
|
|
60
|
+
password: ${{ secrets.GHCR_PAT }}
|
|
61
|
+
|
|
62
|
+
- name: Extract Docker metadata
|
|
63
|
+
id: meta
|
|
64
|
+
uses: docker/metadata-action@v6
|
|
65
|
+
with:
|
|
66
|
+
images: |
|
|
67
|
+
${{ env.DOCKER_HUB_REPO }}
|
|
68
|
+
${{ env.GHCR_REPO }}
|
|
69
|
+
tags: |
|
|
70
|
+
# Tag all builds with the short commit hash
|
|
71
|
+
type=sha,format=short
|
|
72
|
+
# 'dev' tag for CI runs on dev branch or manual builds of dev
|
|
73
|
+
type=raw,value=dev,enable=${{ (github.event_name == 'workflow_run' && github.event.workflow_run.head_branch == 'dev') || (github.event_name == 'workflow_dispatch' && github.event.inputs.branch == 'dev') }}
|
|
74
|
+
# 'latest' and semantic version tags for releases
|
|
75
|
+
type=raw,value=latest,enable=${{ github.event_name == 'release' }}
|
|
76
|
+
type=match,pattern=v(.*),group=1,enable=${{ github.event_name == 'release' }}
|
|
77
|
+
|
|
78
|
+
- name: Build and push Docker image
|
|
79
|
+
uses: docker/build-push-action@v7
|
|
80
|
+
with:
|
|
81
|
+
context: .
|
|
82
|
+
push: true
|
|
83
|
+
provenance: false
|
|
84
|
+
platforms: linux/amd64,linux/arm64
|
|
85
|
+
tags: ${{ steps.meta.outputs.tags }}
|
|
86
|
+
labels: ${{ steps.meta.outputs.labels }}
|
|
87
|
+
cache-from: type=gha
|
|
88
|
+
cache-to: type=gha,mode=max
|
|
@@ -17,14 +17,13 @@ jobs:
|
|
|
17
17
|
steps:
|
|
18
18
|
- uses: actions/checkout@v4
|
|
19
19
|
|
|
20
|
-
-
|
|
20
|
+
- name: Set up uv
|
|
21
|
+
uses: astral-sh/setup-uv@v7
|
|
21
22
|
with:
|
|
22
|
-
|
|
23
|
+
enable-cache: true
|
|
23
24
|
|
|
24
25
|
- name: Build release distributions
|
|
25
|
-
run:
|
|
26
|
-
python -m pip install build
|
|
27
|
-
python -m build
|
|
26
|
+
run: uv build
|
|
28
27
|
|
|
29
28
|
- name: Upload distributions
|
|
30
29
|
uses: actions/upload-artifact@v7
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
default_stages: [pre-commit, pre-push]
|
|
1
2
|
repos:
|
|
2
3
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
3
4
|
rev: v5.0.0
|
|
@@ -19,4 +20,4 @@ repos:
|
|
|
19
20
|
rev: v1.15.0
|
|
20
21
|
hooks:
|
|
21
22
|
- id: mypy
|
|
22
|
-
additional_dependencies: [numpy, pooch, scipy, pytest,
|
|
23
|
+
additional_dependencies: [numpy, pooch, scipy, pytest, xarray, dask, distributed, h5netcdf]
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Read the Docs configuration file
|
|
1
|
+
# Read the Docs configuration file for Sphinx projects
|
|
2
2
|
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
|
3
3
|
|
|
4
4
|
version: 2
|
|
@@ -6,14 +6,17 @@ version: 2
|
|
|
6
6
|
build:
|
|
7
7
|
os: ubuntu-24.04
|
|
8
8
|
tools:
|
|
9
|
-
python: "3.
|
|
9
|
+
python: "3.11"
|
|
10
10
|
|
|
11
11
|
python:
|
|
12
12
|
install:
|
|
13
13
|
- method: pip
|
|
14
14
|
path: .
|
|
15
15
|
extra_requirements:
|
|
16
|
-
-
|
|
16
|
+
- docs
|
|
17
17
|
|
|
18
18
|
sphinx:
|
|
19
19
|
configuration: docs/conf.py
|
|
20
|
+
|
|
21
|
+
formats:
|
|
22
|
+
- pdf
|
|
@@ -11,7 +11,7 @@ identifiers:
|
|
|
11
11
|
- type: doi
|
|
12
12
|
value: 10.5281/zenodo.18764813
|
|
13
13
|
repository-code: 'https://github.com/mwyau/PyStormTracker'
|
|
14
|
-
url: 'https://
|
|
14
|
+
url: 'https://pystormtracker.readthedocs.io/'
|
|
15
15
|
abstract: A Parallel Object-Oriented Cyclone Tracker in Python
|
|
16
16
|
keywords:
|
|
17
17
|
- cyclone tracking
|
|
@@ -19,7 +19,7 @@ keywords:
|
|
|
19
19
|
- dask
|
|
20
20
|
- mpi
|
|
21
21
|
license: BSD-3-Clause
|
|
22
|
-
version: 0.3.
|
|
22
|
+
version: 0.3.1
|
|
23
23
|
date-released: '2026-03-08'
|
|
24
24
|
preferred-citation:
|
|
25
25
|
type: article
|
|
@@ -14,11 +14,14 @@ WORKDIR /app
|
|
|
14
14
|
# Create data directory for mounting
|
|
15
15
|
RUN mkdir /data && chmod 777 /data
|
|
16
16
|
|
|
17
|
+
# Install uv
|
|
18
|
+
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
|
|
19
|
+
|
|
17
20
|
# Copy the project files
|
|
18
21
|
COPY . .
|
|
19
22
|
|
|
20
|
-
# Install the package and its dependencies
|
|
21
|
-
RUN pip install --no-cache
|
|
23
|
+
# Install the package and its dependencies using uv
|
|
24
|
+
RUN uv pip install --system --no-cache .
|
|
22
25
|
|
|
23
26
|
# Add a non-root user for security
|
|
24
27
|
RUN useradd -m pst
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2015, University Corporation for Atmospheric Research (UCAR)
|
|
4
|
+
Copyright (c) 2026, Albert M. W. Yau
|
|
5
|
+
|
|
6
|
+
Redistribution and use in source and binary forms, with or without
|
|
7
|
+
modification, are permitted provided that the following conditions are met:
|
|
8
|
+
|
|
9
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
list of conditions and the following disclaimer.
|
|
11
|
+
|
|
12
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
and/or other materials provided with the distribution.
|
|
15
|
+
|
|
16
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
17
|
+
contributors may be used to endorse or promote products derived from
|
|
18
|
+
this software without specific prior written permission.
|
|
19
|
+
|
|
20
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
23
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
24
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
25
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
26
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
27
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
28
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
29
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: PyStormTracker
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.1
|
|
4
4
|
Summary: A Parallel Object-Oriented Cyclone Tracker in Python
|
|
5
|
-
Project-URL: Homepage, https://
|
|
5
|
+
Project-URL: Homepage, https://pystormtracker.readthedocs.io/
|
|
6
6
|
Project-URL: Repository, https://github.com/mwyau/PyStormTracker.git
|
|
7
7
|
Project-URL: Issues, https://github.com/mwyau/PyStormTracker/issues
|
|
8
8
|
Author-email: "Albert M. W. Yau" <albert@mwyau.com>
|
|
9
|
-
Maintainer-email: "Albert M. W. Yau" <albert@mwyau.com>
|
|
10
9
|
License: BSD-3-Clause
|
|
11
10
|
License-File: LICENSE
|
|
12
11
|
Classifier: Development Status :: 4 - Beta
|
|
@@ -19,20 +18,21 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
19
18
|
Classifier: Programming Language :: Python :: 3.14
|
|
20
19
|
Classifier: Topic :: Scientific/Engineering :: Atmospheric Science
|
|
21
20
|
Requires-Python: >=3.11
|
|
21
|
+
Requires-Dist: dask>=2024.0.0
|
|
22
|
+
Requires-Dist: distributed>=2024.0.0
|
|
23
|
+
Requires-Dist: h5netcdf>=1.0.0
|
|
24
|
+
Requires-Dist: h5py>=3.0.0
|
|
22
25
|
Requires-Dist: numpy>=1.23.0
|
|
23
26
|
Requires-Dist: scipy>=1.9.0
|
|
24
|
-
Requires-Dist: xarray
|
|
25
|
-
Provides-Extra:
|
|
26
|
-
Requires-Dist:
|
|
27
|
-
Requires-Dist:
|
|
28
|
-
Requires-Dist:
|
|
29
|
-
|
|
30
|
-
Requires-Dist:
|
|
31
|
-
|
|
32
|
-
Requires-Dist:
|
|
33
|
-
Requires-Dist: ruff>=0.9.0; extra == 'dev'
|
|
34
|
-
Requires-Dist: sphinx-rtd-theme>=2.0.0; extra == 'dev'
|
|
35
|
-
Requires-Dist: sphinx>=7.2.0; extra == 'dev'
|
|
27
|
+
Requires-Dist: xarray>=2024.9.0
|
|
28
|
+
Provides-Extra: docs
|
|
29
|
+
Requires-Dist: myst-parser>=2.0.0; extra == 'docs'
|
|
30
|
+
Requires-Dist: sphinx-rtd-theme>=2.0.0; extra == 'docs'
|
|
31
|
+
Requires-Dist: sphinx>=7.2.0; extra == 'docs'
|
|
32
|
+
Provides-Extra: grib
|
|
33
|
+
Requires-Dist: cfgrib>=0.9.15; extra == 'grib'
|
|
34
|
+
Provides-Extra: mpi
|
|
35
|
+
Requires-Dist: mpi4py>=4.0.0; extra == 'mpi'
|
|
36
36
|
Description-Content-Type: text/markdown
|
|
37
37
|
|
|
38
38
|
# PyStormTracker
|
|
@@ -47,7 +47,9 @@ Description-Content-Type: text/markdown
|
|
|
47
47
|
[](https://github.com/orgs/xddd/packages/container/package/pystormtracker)
|
|
48
48
|
[](https://doi.org/10.5281/zenodo.18764813)
|
|
49
49
|
|
|
50
|
-
PyStormTracker
|
|
50
|
+
PyStormTracker implements the "Simple Tracker" algorithm for cyclone trajectory analysis in **Yau and Chang (2020)**. Work is currently in progress to port the adaptive constraints tracking algorithm in **Hodges (1999)** from C to Python, and the Accumulated Track Activity metrics in **Yau and Chang (2020)** from Matlab to Python.
|
|
51
|
+
|
|
52
|
+
Originally developed at the **National Center for Atmospheric Research (NCAR)** during the **2015 SIParCS** program, this package utilizes task-parallel strategies and tree reduction algorithms to efficiently process large climate datasets.
|
|
51
53
|
|
|
52
54
|
## Features
|
|
53
55
|
|
|
@@ -82,23 +84,27 @@ Full documentation, including API references and advanced usage examples, is ava
|
|
|
82
84
|
|
|
83
85
|
### From PyPI (Recommended)
|
|
84
86
|
You can install the latest stable version of PyStormTracker directly from PyPI:
|
|
87
|
+
|
|
88
|
+
For use as a CLI tool:
|
|
89
|
+
```bash
|
|
90
|
+
uv tool install PyStormTracker
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
For use as a library in your project:
|
|
85
94
|
```bash
|
|
86
|
-
|
|
95
|
+
uv add PyStormTracker
|
|
87
96
|
```
|
|
88
97
|
|
|
89
98
|
### From Source
|
|
90
|
-
|
|
99
|
+
2. Install with **uv** (Recommended):
|
|
91
100
|
```bash
|
|
92
101
|
git clone https://github.com/mwyau/PyStormTracker.git
|
|
93
102
|
cd PyStormTracker
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
2. Install with **uv** (Recommended):
|
|
97
|
-
```bash
|
|
98
|
-
uv sync --extra dev
|
|
103
|
+
uv sync --group dev
|
|
99
104
|
uv run pre-commit install --hook-type pre-push
|
|
100
105
|
```
|
|
101
106
|
|
|
107
|
+
|
|
102
108
|
## Usage
|
|
103
109
|
|
|
104
110
|
Once installed, you can use the `stormtracker` command directly:
|
|
@@ -125,7 +131,7 @@ stormtracker -i era5_msl_2.5x2.5.nc -v msl -o my_tracks
|
|
|
125
131
|
Using **uv** is the recommended way to set up your environment:
|
|
126
132
|
```bash
|
|
127
133
|
# Install dependencies and sync virtual environment
|
|
128
|
-
uv sync --
|
|
134
|
+
uv sync --group dev
|
|
129
135
|
|
|
130
136
|
# Install pre-push hooks
|
|
131
137
|
uv run pre-commit install --hook-type pre-push
|
|
@@ -147,8 +153,8 @@ uv run mypy src/
|
|
|
147
153
|
|
|
148
154
|
### Tiered Testing
|
|
149
155
|
To keep development cycles fast, testing is tiered:
|
|
150
|
-
- **Fast Tests**: Default local runs (skips
|
|
151
|
-
- **
|
|
156
|
+
- **Fast Tests**: Default local runs (skips integration tests).
|
|
157
|
+
- **Integration Tests**: ONLY long-running integration/regression tests.
|
|
152
158
|
- **Full Suite**: Everything (used in CI).
|
|
153
159
|
|
|
154
160
|
**Run fast unit tests only (Default):**
|
|
@@ -156,11 +162,12 @@ To keep development cycles fast, testing is tiered:
|
|
|
156
162
|
uv run pytest
|
|
157
163
|
```
|
|
158
164
|
|
|
159
|
-
**Run ONLY
|
|
165
|
+
**Run ONLY integration tests:**
|
|
160
166
|
```bash
|
|
161
|
-
uv run pytest --run-
|
|
167
|
+
uv run pytest --run-integration
|
|
162
168
|
```
|
|
163
169
|
|
|
170
|
+
|
|
164
171
|
**Run everything:**
|
|
165
172
|
```bash
|
|
166
173
|
uv run pytest --run-all
|
|
@@ -170,17 +177,21 @@ uv run pytest --run-all
|
|
|
170
177
|
|
|
171
178
|
If you use this software in your research, please cite the following:
|
|
172
179
|
|
|
173
|
-
- **Yau, A. M. W., and E. K. M. Chang**, 2020: Finding Storm Track Activity Metrics That Are Highly Correlated with Weather Impacts. Part I: Frameworks for Evaluation and Accumulated Track Activity. *J. Climate*, **33**, 10169–10186, https://doi.org/10.1175/JCLI-D-20-0393.1.
|
|
174
|
-
|
|
175
180
|
- **Yau, A. M. W.**, 2026: mwyau/PyStormTracker. *Zenodo*, https://doi.org/10.5281/zenodo.18764813.
|
|
176
181
|
|
|
182
|
+
- **Yau, A. M. W., and E. K. M. Chang**, 2020: Finding Storm Track Activity Metrics That Are Highly Correlated with Weather Impacts. Part I: Frameworks for Evaluation and Accumulated Track Activity. *J. Climate*, **33**, 10169–10186, https://doi.org/10.1175/JCLI-D-20-0393.1.
|
|
183
|
+
|
|
177
184
|
## References
|
|
178
185
|
|
|
179
186
|
- **Yau, A. M. W., K. Paul and J. Dennis**, 2016: PyStormTracker: A Parallel Object-Oriented Cyclone Tracker in Python. *96th American Meteorological Society Annual Meeting*, New Orleans, LA. *Zenodo*, https://doi.org/10.5281/zenodo.18868625.
|
|
187
|
+
|
|
180
188
|
- **Neu, U., et al.**, 2013: IMILAST: A Community Effort to Intercompare Extratropical Cyclone Detection and Tracking Algorithms. *Bull. Amer. Meteor. Soc.*, **94**, 529–547, https://doi.org/10.1175/BAMS-D-11-00154.1.
|
|
181
|
-
|
|
182
|
-
|
|
189
|
+
- **IMILAST Intercomparison Protocol**: https://proclim.scnat.ch/en/activities/project_imilast/intercomparison
|
|
190
|
+
- **IMILAST Data Download**: https://proclim.scnat.ch/en/activities/project_imilast/data_download
|
|
191
|
+
|
|
192
|
+
- **Hodges, K. I.**, 1999: Adaptive Constraints for Feature Tracking. *Mon. Wea. Rev.*, **127**, 1362–1373, [https://doi.org/10.1175/1520-0493(1999)127<1362:ACFFT>2.0.CO;2](https://doi.org/10.1175/1520-0493(1999)127<1362:ACFFT>2.0.CO;2).
|
|
193
|
+
|
|
183
194
|
|
|
184
195
|
## License
|
|
185
196
|
|
|
186
|
-
This project is licensed under the terms found in the `LICENSE` file.
|
|
197
|
+
This project is licensed under the BSD-3-Clause terms found in the `LICENSE` file.
|
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
[](https://github.com/orgs/xddd/packages/container/package/pystormtracker)
|
|
11
11
|
[](https://doi.org/10.5281/zenodo.18764813)
|
|
12
12
|
|
|
13
|
-
PyStormTracker
|
|
13
|
+
PyStormTracker implements the "Simple Tracker" algorithm for cyclone trajectory analysis in **Yau and Chang (2020)**. Work is currently in progress to port the adaptive constraints tracking algorithm in **Hodges (1999)** from C to Python, and the Accumulated Track Activity metrics in **Yau and Chang (2020)** from Matlab to Python.
|
|
14
|
+
|
|
15
|
+
Originally developed at the **National Center for Atmospheric Research (NCAR)** during the **2015 SIParCS** program, this package utilizes task-parallel strategies and tree reduction algorithms to efficiently process large climate datasets.
|
|
14
16
|
|
|
15
17
|
## Features
|
|
16
18
|
|
|
@@ -45,23 +47,27 @@ Full documentation, including API references and advanced usage examples, is ava
|
|
|
45
47
|
|
|
46
48
|
### From PyPI (Recommended)
|
|
47
49
|
You can install the latest stable version of PyStormTracker directly from PyPI:
|
|
50
|
+
|
|
51
|
+
For use as a CLI tool:
|
|
52
|
+
```bash
|
|
53
|
+
uv tool install PyStormTracker
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
For use as a library in your project:
|
|
48
57
|
```bash
|
|
49
|
-
|
|
58
|
+
uv add PyStormTracker
|
|
50
59
|
```
|
|
51
60
|
|
|
52
61
|
### From Source
|
|
53
|
-
|
|
62
|
+
2. Install with **uv** (Recommended):
|
|
54
63
|
```bash
|
|
55
64
|
git clone https://github.com/mwyau/PyStormTracker.git
|
|
56
65
|
cd PyStormTracker
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
2. Install with **uv** (Recommended):
|
|
60
|
-
```bash
|
|
61
|
-
uv sync --extra dev
|
|
66
|
+
uv sync --group dev
|
|
62
67
|
uv run pre-commit install --hook-type pre-push
|
|
63
68
|
```
|
|
64
69
|
|
|
70
|
+
|
|
65
71
|
## Usage
|
|
66
72
|
|
|
67
73
|
Once installed, you can use the `stormtracker` command directly:
|
|
@@ -88,7 +94,7 @@ stormtracker -i era5_msl_2.5x2.5.nc -v msl -o my_tracks
|
|
|
88
94
|
Using **uv** is the recommended way to set up your environment:
|
|
89
95
|
```bash
|
|
90
96
|
# Install dependencies and sync virtual environment
|
|
91
|
-
uv sync --
|
|
97
|
+
uv sync --group dev
|
|
92
98
|
|
|
93
99
|
# Install pre-push hooks
|
|
94
100
|
uv run pre-commit install --hook-type pre-push
|
|
@@ -110,8 +116,8 @@ uv run mypy src/
|
|
|
110
116
|
|
|
111
117
|
### Tiered Testing
|
|
112
118
|
To keep development cycles fast, testing is tiered:
|
|
113
|
-
- **Fast Tests**: Default local runs (skips
|
|
114
|
-
- **
|
|
119
|
+
- **Fast Tests**: Default local runs (skips integration tests).
|
|
120
|
+
- **Integration Tests**: ONLY long-running integration/regression tests.
|
|
115
121
|
- **Full Suite**: Everything (used in CI).
|
|
116
122
|
|
|
117
123
|
**Run fast unit tests only (Default):**
|
|
@@ -119,11 +125,12 @@ To keep development cycles fast, testing is tiered:
|
|
|
119
125
|
uv run pytest
|
|
120
126
|
```
|
|
121
127
|
|
|
122
|
-
**Run ONLY
|
|
128
|
+
**Run ONLY integration tests:**
|
|
123
129
|
```bash
|
|
124
|
-
uv run pytest --run-
|
|
130
|
+
uv run pytest --run-integration
|
|
125
131
|
```
|
|
126
132
|
|
|
133
|
+
|
|
127
134
|
**Run everything:**
|
|
128
135
|
```bash
|
|
129
136
|
uv run pytest --run-all
|
|
@@ -133,17 +140,21 @@ uv run pytest --run-all
|
|
|
133
140
|
|
|
134
141
|
If you use this software in your research, please cite the following:
|
|
135
142
|
|
|
136
|
-
- **Yau, A. M. W., and E. K. M. Chang**, 2020: Finding Storm Track Activity Metrics That Are Highly Correlated with Weather Impacts. Part I: Frameworks for Evaluation and Accumulated Track Activity. *J. Climate*, **33**, 10169–10186, https://doi.org/10.1175/JCLI-D-20-0393.1.
|
|
137
|
-
|
|
138
143
|
- **Yau, A. M. W.**, 2026: mwyau/PyStormTracker. *Zenodo*, https://doi.org/10.5281/zenodo.18764813.
|
|
139
144
|
|
|
145
|
+
- **Yau, A. M. W., and E. K. M. Chang**, 2020: Finding Storm Track Activity Metrics That Are Highly Correlated with Weather Impacts. Part I: Frameworks for Evaluation and Accumulated Track Activity. *J. Climate*, **33**, 10169–10186, https://doi.org/10.1175/JCLI-D-20-0393.1.
|
|
146
|
+
|
|
140
147
|
## References
|
|
141
148
|
|
|
142
149
|
- **Yau, A. M. W., K. Paul and J. Dennis**, 2016: PyStormTracker: A Parallel Object-Oriented Cyclone Tracker in Python. *96th American Meteorological Society Annual Meeting*, New Orleans, LA. *Zenodo*, https://doi.org/10.5281/zenodo.18868625.
|
|
150
|
+
|
|
143
151
|
- **Neu, U., et al.**, 2013: IMILAST: A Community Effort to Intercompare Extratropical Cyclone Detection and Tracking Algorithms. *Bull. Amer. Meteor. Soc.*, **94**, 529–547, https://doi.org/10.1175/BAMS-D-11-00154.1.
|
|
144
|
-
|
|
145
|
-
|
|
152
|
+
- **IMILAST Intercomparison Protocol**: https://proclim.scnat.ch/en/activities/project_imilast/intercomparison
|
|
153
|
+
- **IMILAST Data Download**: https://proclim.scnat.ch/en/activities/project_imilast/data_download
|
|
154
|
+
|
|
155
|
+
- **Hodges, K. I.**, 1999: Adaptive Constraints for Feature Tracking. *Mon. Wea. Rev.*, **127**, 1362–1373, [https://doi.org/10.1175/1520-0493(1999)127<1362:ACFFT>2.0.CO;2](https://doi.org/10.1175/1520-0493(1999)127<1362:ACFFT>2.0.CO;2).
|
|
156
|
+
|
|
146
157
|
|
|
147
158
|
## License
|
|
148
159
|
|
|
149
|
-
This project is licensed under the terms found in the `LICENSE` file.
|
|
160
|
+
This project is licensed under the BSD-3-Clause terms found in the `LICENSE` file.
|