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.
Files changed (42) hide show
  1. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/.github/workflows/ci.yml +38 -45
  2. pystormtracker-0.3.1/.github/workflows/docker-publish.yml +88 -0
  3. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/.github/workflows/python-publish.yml +4 -5
  4. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/.pre-commit-config.yaml +2 -1
  5. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/.readthedocs.yaml +6 -3
  6. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/CITATION.cff +2 -2
  7. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/Dockerfile +5 -2
  8. pystormtracker-0.3.1/LICENSE +29 -0
  9. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/PKG-INFO +44 -33
  10. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/README.md +29 -18
  11. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/pyproject.toml +16 -24
  12. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/models/tracks.py +24 -11
  13. pystormtracker-0.3.1/tests/conftest.py +35 -0
  14. pystormtracker-0.3.0/src/pystormtracker/data.py → pystormtracker-0.3.1/tests/data_utils.py +2 -0
  15. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/tests/test_integration.py +5 -3
  16. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/tests/test_stormtracker.py +2 -1
  17. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/uv.lock +180 -879
  18. pystormtracker-0.3.0/.gitattributes +0 -0
  19. pystormtracker-0.3.0/.github/workflows/docker-publish.yml +0 -70
  20. pystormtracker-0.3.0/LICENSE +0 -40
  21. pystormtracker-0.3.0/tests/conftest.py +0 -30
  22. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/.github/dependabot.yml +0 -0
  23. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/.gitignore +0 -0
  24. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/codecov.yml +0 -0
  25. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/data/test/tracks/era5_msl_2.5x2.5_v0.0.2_imilast.txt +0 -0
  26. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/docs/IntercomparisonProtocol.pdf +0 -0
  27. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/docs/conf.py +0 -0
  28. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/docs/index.md +0 -0
  29. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/__init__.py +0 -0
  30. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/models/__init__.py +0 -0
  31. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/models/center.py +0 -0
  32. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/models/grid.py +0 -0
  33. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/models/time.py +0 -0
  34. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/simple/__init__.py +0 -0
  35. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/simple/detector.py +0 -0
  36. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/simple/linker.py +0 -0
  37. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/src/pystormtracker/stormtracker.py +0 -0
  38. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/tests/__init__.py +0 -0
  39. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/tests/test_center.py +0 -0
  40. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/tests/test_simple_detector.py +0 -0
  41. {pystormtracker-0.3.0 → pystormtracker-0.3.1}/tests/test_simple_linker.py +0 -0
  42. {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: [main, dev]
5
+ branches:
6
+ - main
7
+ - dev
6
8
  pull_request:
7
- branches: [main, dev]
8
- types: [opened, synchronize, reopened]
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 Python
31
- uses: actions/setup-python@v6
32
+ - name: Set up uv
33
+ uses: astral-sh/setup-uv@v7
32
34
  with:
33
- python-version: "3.11"
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 Python
46
- uses: actions/setup-python@v6
44
+ - name: Set up uv
45
+ uses: astral-sh/setup-uv@v7
47
46
  with:
48
- python-version: "3.11"
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 Python
61
- uses: actions/setup-python@v6
56
+ - name: Set up uv
57
+ uses: astral-sh/setup-uv@v7
62
58
  with:
63
- python-version: "3.11"
64
- cache: "pip"
65
- - name: Install dependencies
59
+ enable-cache: true
60
+ - name: Install system dependencies
66
61
  run: |
67
- python -m pip install --upgrade pip
68
- pip install .[dev]
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 Python ${{ matrix.python-version }}
82
- uses: actions/setup-python@v6
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
- cache: "pip"
86
- - name: Install dependencies
83
+ - name: Install system dependencies
87
84
  run: |
88
- python -m pip install --upgrade pip
89
- pip install .[dev]
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 Python ${{ matrix.python-version }}
108
- uses: actions/setup-python@v6
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
- cache: "pip"
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-all
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
- - uses: actions/setup-python@v6
20
+ - name: Set up uv
21
+ uses: astral-sh/setup-uv@v7
21
22
  with:
22
- python-version: "3.x"
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, pandas, xarray, dask, distributed, h5netcdf]
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.14"
9
+ python: "3.11"
10
10
 
11
11
  python:
12
12
  install:
13
13
  - method: pip
14
14
  path: .
15
15
  extra_requirements:
16
- - dev
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://github.com/mwyau/PyStormTracker'
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.0
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-dir .
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.0
3
+ Version: 0.3.1
4
4
  Summary: A Parallel Object-Oriented Cyclone Tracker in Python
5
- Project-URL: Homepage, https://github.com/mwyau/PyStormTracker
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[accel,io,parallel]>=2024.9.0
25
- Provides-Extra: dev
26
- Requires-Dist: mpi4py>=4.0.0; extra == 'dev'
27
- Requires-Dist: mypy>=1.15.0; extra == 'dev'
28
- Requires-Dist: myst-parser>=2.0.0; extra == 'dev'
29
- Requires-Dist: pandas>=2.2.0; extra == 'dev'
30
- Requires-Dist: pre-commit>=4.0.0; extra == 'dev'
31
- Requires-Dist: pytest-cov>=5.0.0; extra == 'dev'
32
- Requires-Dist: pytest>=8.1.1; extra == 'dev'
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
  [![GHCR](https://img.shields.io/badge/ghcr.io-xddd%2Fpystormtracker-blue?logo=github)](https://github.com/orgs/xddd/packages/container/package/pystormtracker)
48
48
  [![DOI](https://zenodo.org/badge/36328800.svg)](https://doi.org/10.5281/zenodo.18764813)
49
49
 
50
- PyStormTracker provides the implementation of the "Simple Tracker" algorithm used for cyclone trajectory analysis in **Yau and Chang (2020)**. It was originally developed at the **National Center for Atmospheric Research (NCAR)** as part of the **2015 Summer Internships in Parallel Computational Science (SIParCS)** program, utilizing a task-parallel strategy with temporal decomposition and a tree reduction algorithm to process large climate datasets.
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
- pip install PyStormTracker
95
+ uv add PyStormTracker
87
96
  ```
88
97
 
89
98
  ### From Source
90
- 1. Clone the repository:
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 --extra dev
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 slow tests).
151
- - **Slow Tests**: ONLY long-running integration/regression tests.
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 slow/integration tests:**
165
+ **Run ONLY integration tests:**
160
166
  ```bash
161
- uv run pytest --run-slow
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
- - **IMILAST Intercomparison Protocol**: https://proclim.scnat.ch/en/activities/project_imilast/intercomparison
182
- - **IMILAST Data Download**: https://proclim.scnat.ch/en/activities/project_imilast/data_download
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
  [![GHCR](https://img.shields.io/badge/ghcr.io-xddd%2Fpystormtracker-blue?logo=github)](https://github.com/orgs/xddd/packages/container/package/pystormtracker)
11
11
  [![DOI](https://zenodo.org/badge/36328800.svg)](https://doi.org/10.5281/zenodo.18764813)
12
12
 
13
- PyStormTracker provides the implementation of the "Simple Tracker" algorithm used for cyclone trajectory analysis in **Yau and Chang (2020)**. It was originally developed at the **National Center for Atmospheric Research (NCAR)** as part of the **2015 Summer Internships in Parallel Computational Science (SIParCS)** program, utilizing a task-parallel strategy with temporal decomposition and a tree reduction algorithm to process large climate datasets.
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
- pip install PyStormTracker
58
+ uv add PyStormTracker
50
59
  ```
51
60
 
52
61
  ### From Source
53
- 1. Clone the repository:
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 --extra dev
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 slow tests).
114
- - **Slow Tests**: ONLY long-running integration/regression tests.
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 slow/integration tests:**
128
+ **Run ONLY integration tests:**
123
129
  ```bash
124
- uv run pytest --run-slow
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
- - **IMILAST Intercomparison Protocol**: https://proclim.scnat.ch/en/activities/project_imilast/intercomparison
145
- - **IMILAST Data Download**: https://proclim.scnat.ch/en/activities/project_imilast/data_download
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.