GeoRacoon 1.0.0__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.
- georacoon-1.0.0/.github/workflows/crossPRcoverage.yml +29 -0
- georacoon-1.0.0/.github/workflows/deploy.yml +144 -0
- georacoon-1.0.0/.github/workflows/develop.yml +80 -0
- georacoon-1.0.0/.github/workflows/docs_deploy.yml +38 -0
- georacoon-1.0.0/.github/workflows/release.yml +105 -0
- georacoon-1.0.0/.github/workflows/status.yml +82 -0
- georacoon-1.0.0/.github/workflows/test_release.yml +62 -0
- georacoon-1.0.0/.gitignore +159 -0
- georacoon-1.0.0/.readthedocs.yaml +22 -0
- georacoon-1.0.0/LICENSE +21 -0
- georacoon-1.0.0/MANIFEST.in +4 -0
- georacoon-1.0.0/PKG-INFO +362 -0
- georacoon-1.0.0/README.md +324 -0
- georacoon-1.0.0/docs/requirements.txt +8 -0
- georacoon-1.0.0/examples/README.rst +10 -0
- georacoon-1.0.0/examples/exmpl_01_lst_topogradient.py +378 -0
- georacoon-1.0.0/examples/plot_01_lst_topogradient.py +445 -0
- georacoon-1.0.0/images/georacoon_v02_202509.svg +213 -0
- georacoon-1.0.0/public/.gitkeep +0 -0
- georacoon-1.0.0/pyproject.toml +75 -0
- georacoon-1.0.0/requirements.txt +7 -0
- georacoon-1.0.0/setup.cfg +4 -0
- georacoon-1.0.0/src/GeoRacoon.egg-info/PKG-INFO +362 -0
- georacoon-1.0.0/src/GeoRacoon.egg-info/SOURCES.txt +50 -0
- georacoon-1.0.0/src/GeoRacoon.egg-info/dependency_links.txt +1 -0
- georacoon-1.0.0/src/GeoRacoon.egg-info/requires.txt +25 -0
- georacoon-1.0.0/src/GeoRacoon.egg-info/scm_file_list.json +112 -0
- georacoon-1.0.0/src/GeoRacoon.egg-info/scm_version.json +8 -0
- georacoon-1.0.0/src/GeoRacoon.egg-info/top_level.txt +3 -0
- georacoon-1.0.0/src/convster/__init__.py +25 -0
- georacoon-1.0.0/src/convster/filters/__init__.py +22 -0
- georacoon-1.0.0/src/convster/filters/gaussian.py +282 -0
- georacoon-1.0.0/src/convster/helper.py +94 -0
- georacoon-1.0.0/src/convster/parallel.py +1475 -0
- georacoon-1.0.0/src/convster/processing.py +1223 -0
- georacoon-1.0.0/src/coonfit/__init__.py +35 -0
- georacoon-1.0.0/src/coonfit/exceptions.py +19 -0
- georacoon-1.0.0/src/coonfit/helper.py +120 -0
- georacoon-1.0.0/src/coonfit/inference.py +815 -0
- georacoon-1.0.0/src/coonfit/parallel.py +1246 -0
- georacoon-1.0.0/src/coonfit/parallel_helpers.py +566 -0
- georacoon-1.0.0/src/riogrande/__init__.py +28 -0
- georacoon-1.0.0/src/riogrande/helper.py +891 -0
- georacoon-1.0.0/src/riogrande/io/__init__.py +48 -0
- georacoon-1.0.0/src/riogrande/io/core.py +622 -0
- georacoon-1.0.0/src/riogrande/io/exceptions.py +39 -0
- georacoon-1.0.0/src/riogrande/io/models.py +1689 -0
- georacoon-1.0.0/src/riogrande/parallel.py +571 -0
- georacoon-1.0.0/src/riogrande/prepare.py +281 -0
- georacoon-1.0.0/src/riogrande/timing.py +93 -0
- georacoon-1.0.0/test_france_layers_filtered.png +0 -0
- georacoon-1.0.0/tests/requirements.txt +7 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
name: Post coverage comment (cross-repo PRs)
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_run:
|
|
5
|
+
workflows: ["Run Tests"]
|
|
6
|
+
types:
|
|
7
|
+
- completed
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
coverage-comment:
|
|
11
|
+
name: Post coverage comment
|
|
12
|
+
runs-on: ubuntu-24.04
|
|
13
|
+
if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success'
|
|
14
|
+
permissions:
|
|
15
|
+
# Necessary for publishing new comments in pull requests
|
|
16
|
+
pull-requests: write
|
|
17
|
+
# Necessary for editing existing comments
|
|
18
|
+
contents: write
|
|
19
|
+
# Necessary for looking up the workflow that launched this one
|
|
20
|
+
# and downloading the related artifact
|
|
21
|
+
actions: read
|
|
22
|
+
steps:
|
|
23
|
+
# DO NOT checkout here, for security reasons
|
|
24
|
+
# See: https://securitylab.github.com/research/github-actions-preventing-pwn-requests/
|
|
25
|
+
- name: Post comment
|
|
26
|
+
uses: py-cov-action/python-coverage-comment-action@v3
|
|
27
|
+
with:
|
|
28
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
29
|
+
GITHUB_PR_RUN_ID: ${{ github.event.workflow_run.id }}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
name: Deployment Smoke Test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
pull_request:
|
|
8
|
+
types: [opened, synchronize, reopened, ready_for_review]
|
|
9
|
+
branches:
|
|
10
|
+
- main
|
|
11
|
+
|
|
12
|
+
env:
|
|
13
|
+
PYTHON_VERSION: "3.13"
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
smoke-test:
|
|
17
|
+
if: github.event.pull_request.draft == false
|
|
18
|
+
runs-on: ${{ matrix.runner }}
|
|
19
|
+
container: ${{ matrix.container || '' }}
|
|
20
|
+
strategy:
|
|
21
|
+
matrix:
|
|
22
|
+
include:
|
|
23
|
+
- runner: ubuntu-latest
|
|
24
|
+
os: ubuntu
|
|
25
|
+
badge-label: Ubuntu
|
|
26
|
+
container: ""
|
|
27
|
+
- runner: ubuntu-latest
|
|
28
|
+
os: fedora
|
|
29
|
+
badge-label: Fedora
|
|
30
|
+
container: fedora:latest
|
|
31
|
+
- runner: macos-latest
|
|
32
|
+
os: macos
|
|
33
|
+
badge-label: macOS
|
|
34
|
+
container: ""
|
|
35
|
+
- runner: windows-latest
|
|
36
|
+
os: windows
|
|
37
|
+
badge-label: Windows
|
|
38
|
+
container: ""
|
|
39
|
+
fail-fast: false
|
|
40
|
+
steps:
|
|
41
|
+
- name: Install system dependencies (Fedora)
|
|
42
|
+
if: matrix.os == 'fedora'
|
|
43
|
+
run: |
|
|
44
|
+
dnf install -y python3 python3-pip python3-devel gcc gcc-c++ gdal gdal-devel git git-lfs
|
|
45
|
+
|
|
46
|
+
- uses: actions/checkout@v5
|
|
47
|
+
with:
|
|
48
|
+
lfs: 'true'
|
|
49
|
+
submodules: recursive
|
|
50
|
+
|
|
51
|
+
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
|
52
|
+
if: matrix.os != 'fedora'
|
|
53
|
+
uses: actions/setup-python@v5
|
|
54
|
+
with:
|
|
55
|
+
python-version: ${{ env.PYTHON_VERSION }}
|
|
56
|
+
|
|
57
|
+
- name: Install GeoRacoon
|
|
58
|
+
shell: bash
|
|
59
|
+
run: |
|
|
60
|
+
git config --global --add safe.directory '*'
|
|
61
|
+
python3 -m venv .venv
|
|
62
|
+
# Windows venv uses Scripts/, Unix uses bin/
|
|
63
|
+
if [[ -f .venv/bin/activate ]]; then
|
|
64
|
+
source .venv/bin/activate
|
|
65
|
+
else
|
|
66
|
+
source .venv/Scripts/activate
|
|
67
|
+
fi
|
|
68
|
+
pip install --upgrade pip
|
|
69
|
+
pip install .
|
|
70
|
+
|
|
71
|
+
- name: Debug Python path
|
|
72
|
+
shell: bash
|
|
73
|
+
run: |
|
|
74
|
+
# Windows venv uses Scripts/, Unix uses bin/
|
|
75
|
+
if [[ -f .venv/bin/activate ]]; then
|
|
76
|
+
source .venv/bin/activate
|
|
77
|
+
else
|
|
78
|
+
source .venv/Scripts/activate
|
|
79
|
+
fi
|
|
80
|
+
echo "which python: $(which python)"
|
|
81
|
+
echo "which python3: $(which python3 2>/dev/null || echo 'not found')"
|
|
82
|
+
python -c "import sys; print(f'sys.executable: {sys.executable}'); print(f'sys.prefix: {sys.prefix}')"
|
|
83
|
+
|
|
84
|
+
- name: Smoke test
|
|
85
|
+
shell: bash
|
|
86
|
+
run: |
|
|
87
|
+
# Windows venv uses Scripts/, Unix uses bin/
|
|
88
|
+
if [[ -f .venv/bin/activate ]]; then
|
|
89
|
+
source .venv/bin/activate
|
|
90
|
+
else
|
|
91
|
+
source .venv/Scripts/activate
|
|
92
|
+
fi
|
|
93
|
+
python -c "
|
|
94
|
+
import os, tempfile
|
|
95
|
+
import numpy as np
|
|
96
|
+
from riogrande.io import Source, Band, write_band
|
|
97
|
+
from convster.processing import select_category
|
|
98
|
+
from coonfit.inference import get_optimal_weights
|
|
99
|
+
|
|
100
|
+
# -- riogrande: write a GeoTIFF via Source, then read it back via Band
|
|
101
|
+
with tempfile.TemporaryDirectory() as tmp:
|
|
102
|
+
path = os.path.join(tmp, 'smoke.tif')
|
|
103
|
+
data = np.array([[42.0]], dtype='float32')
|
|
104
|
+
profile = dict(
|
|
105
|
+
driver='GTiff', dtype='float32',
|
|
106
|
+
width=1, height=1, count=1,
|
|
107
|
+
crs='EPSG:4326',
|
|
108
|
+
)
|
|
109
|
+
src = Source(path, profile=profile)
|
|
110
|
+
with src.open(mode='w') as dst:
|
|
111
|
+
write_band(dst, data, bidx=1, name='smoke')
|
|
112
|
+
band = Band(source=src, bidx=1, tags={'name': 'smoke'})
|
|
113
|
+
result = band.get_data()
|
|
114
|
+
assert result[0, 0] == 42.0, f'Expected 42.0, got {result[0, 0]}'
|
|
115
|
+
print('riogrande: Source write + Band read OK')
|
|
116
|
+
|
|
117
|
+
# -- convster: select_category on a tiny categorical array
|
|
118
|
+
cat = np.array([[2]], dtype='uint8')
|
|
119
|
+
sel = select_category(cat, category=2)
|
|
120
|
+
assert sel[0, 0] == np.iinfo(sel.dtype).max, f'select_category failed: {sel[0, 0]}'
|
|
121
|
+
print('convster: select_category OK')
|
|
122
|
+
|
|
123
|
+
# -- coonfit: get_optimal_weights on trivial regression
|
|
124
|
+
X = np.array([[1.0]])
|
|
125
|
+
y = np.array([2.0])
|
|
126
|
+
w = get_optimal_weights(X, y)
|
|
127
|
+
assert abs(w[0] - 2.0) < 1e-6, f'get_optimal_weights failed: {w}'
|
|
128
|
+
print('coonfit: get_optimal_weights OK')
|
|
129
|
+
|
|
130
|
+
print('All smoke tests passed')
|
|
131
|
+
"
|
|
132
|
+
|
|
133
|
+
# Update OS badge in gist (only on push to main)
|
|
134
|
+
- name: Update ${{ matrix.badge-label }} status badge
|
|
135
|
+
if: always() && github.ref == 'refs/heads/main'
|
|
136
|
+
# pinned to v1.8.0
|
|
137
|
+
uses: schneegans/dynamic-badges-action@0e50b8bad39e7e1afd3e4e9c2b7dd145fad07501
|
|
138
|
+
with:
|
|
139
|
+
auth: ${{ secrets.GIST_SECRET }}
|
|
140
|
+
gistID: ${{ vars.STATUS_GIST_ID }}
|
|
141
|
+
filename: deploy-${{ matrix.os }}.json
|
|
142
|
+
label: ${{ matrix.badge-label }}
|
|
143
|
+
message: ${{ job.status == 'success' && 'passing' || 'failing' }}
|
|
144
|
+
color: ${{ job.status == 'success' && 'brightgreen' || 'red' }}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
name: Run Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
types: [opened, synchronize, reopened, edited, ready_for_review]
|
|
6
|
+
branches:
|
|
7
|
+
- main
|
|
8
|
+
permissions:
|
|
9
|
+
pull-requests: write
|
|
10
|
+
contents: write
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
unit-tests:
|
|
14
|
+
if: github.event.pull_request.draft == false
|
|
15
|
+
runs-on: ubuntu-24.04
|
|
16
|
+
strategy:
|
|
17
|
+
matrix:
|
|
18
|
+
pythonV: ["3.10", "3.11", "3.12", "3.13", "3.14"]
|
|
19
|
+
fail-fast: false
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v5
|
|
22
|
+
with:
|
|
23
|
+
lfs: 'true'
|
|
24
|
+
submodules: recursive
|
|
25
|
+
|
|
26
|
+
- name: Set up Python ${{ matrix.pythonV }}
|
|
27
|
+
uses: actions/setup-python@v5
|
|
28
|
+
with:
|
|
29
|
+
python-version: ${{ matrix.pythonV }}
|
|
30
|
+
|
|
31
|
+
- name: Install dependencies
|
|
32
|
+
run: |
|
|
33
|
+
python -m venv .venv
|
|
34
|
+
source .venv/bin/activate
|
|
35
|
+
pip install --upgrade pip
|
|
36
|
+
pip install -e .[testing]
|
|
37
|
+
|
|
38
|
+
- name: Run tests with coverage
|
|
39
|
+
run: |
|
|
40
|
+
source .venv/bin/activate
|
|
41
|
+
python -c "import multiprocessing; print(multiprocessing.cpu_count())"
|
|
42
|
+
python -m pytest -s -vvv --timeout 300 --cov
|
|
43
|
+
env:
|
|
44
|
+
COVERAGE_FILE: ".coverage.unittests"
|
|
45
|
+
|
|
46
|
+
# NOTE: we report the coverage only for the oldest python version supported
|
|
47
|
+
- name: Store coverage file
|
|
48
|
+
if: matrix.pythonV == '3.10'
|
|
49
|
+
uses: actions/upload-artifact@v4
|
|
50
|
+
with:
|
|
51
|
+
name: coverage-unittests
|
|
52
|
+
path: .coverage.unittests
|
|
53
|
+
include-hidden-files: true
|
|
54
|
+
|
|
55
|
+
coverage:
|
|
56
|
+
name: coverage-comment
|
|
57
|
+
runs-on: ubuntu-24.04
|
|
58
|
+
needs: [unit-tests]
|
|
59
|
+
if: needs.unit-tests.result == 'success' || needs.unit-tests.result == 'failure'
|
|
60
|
+
steps:
|
|
61
|
+
- uses: actions/checkout@v5
|
|
62
|
+
- uses: actions/download-artifact@v4
|
|
63
|
+
id: download
|
|
64
|
+
with:
|
|
65
|
+
pattern: coverage-*
|
|
66
|
+
merge-multiple: true
|
|
67
|
+
|
|
68
|
+
- name: Coverage comment
|
|
69
|
+
id: coverage_comment
|
|
70
|
+
uses: py-cov-action/python-coverage-comment-action@v3
|
|
71
|
+
with:
|
|
72
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
73
|
+
MERGE_COVERAGE_FILES: true
|
|
74
|
+
|
|
75
|
+
- name: Store Pull Request comment to be posted
|
|
76
|
+
uses: actions/upload-artifact@v4
|
|
77
|
+
if: steps.coverage_comment.outputs.COMMENT_FILE_WRITTEN == 'true'
|
|
78
|
+
with:
|
|
79
|
+
name: python-coverage-comment-action
|
|
80
|
+
path: python-coverage-comment-action.txt
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
name: Deploy Documentation
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
build-and-deploy-docs:
|
|
9
|
+
runs-on: ubuntu-24.04
|
|
10
|
+
steps:
|
|
11
|
+
- uses: actions/checkout@v3
|
|
12
|
+
with:
|
|
13
|
+
submodules: recursive
|
|
14
|
+
|
|
15
|
+
- name: Set up Python 3.10
|
|
16
|
+
uses: actions/setup-python@v3
|
|
17
|
+
with:
|
|
18
|
+
python-version: '3.10'
|
|
19
|
+
|
|
20
|
+
- name: Install documentation dependencies
|
|
21
|
+
run: |
|
|
22
|
+
python -m venv .venv
|
|
23
|
+
source .venv/bin/activate
|
|
24
|
+
pip install --upgrade pip
|
|
25
|
+
pip install -r docs/requirements.txt
|
|
26
|
+
pip install -e .
|
|
27
|
+
|
|
28
|
+
- name: Generate API docs and build documentation
|
|
29
|
+
run: |
|
|
30
|
+
source .venv/bin/activate
|
|
31
|
+
sphinx-build -b html docs public
|
|
32
|
+
|
|
33
|
+
# TODO: change to proper deployment
|
|
34
|
+
# - name: Deploy to GitHub Pages
|
|
35
|
+
# uses: peaceiris/actions-gh-pages@v3
|
|
36
|
+
# with:
|
|
37
|
+
# github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
38
|
+
# publish_dir: ./public
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Release workflow: builds sdist, creates a GitHub Release with
|
|
2
|
+
# auto-generated notes, and publishes to PyPI via OIDC trusted publishing.
|
|
3
|
+
# The PyPI publish step is gated on the ``pypi`` GitHub environment, which
|
|
4
|
+
# is configured (in repo settings) to require manual reviewer approval.
|
|
5
|
+
#
|
|
6
|
+
# Tag conventions (no ``v`` prefix; SemVer-style):
|
|
7
|
+
# 1.2.3 -- final release
|
|
8
|
+
# 1.2.3-rc1 -- pre-releases (alpha / beta / rc; PEP 440 normalises
|
|
9
|
+
# ``1.2.3-rc1`` to ``1.2.3rc1`` for the wheel version)
|
|
10
|
+
#
|
|
11
|
+
# Prerequisites (configured outside this workflow):
|
|
12
|
+
# * PyPI trusted publisher: workflow=release.yml, environment=pypi
|
|
13
|
+
# * GitHub environment ``pypi`` with required reviewers
|
|
14
|
+
# * Tag protection rule for the patterns below
|
|
15
|
+
|
|
16
|
+
name: Release
|
|
17
|
+
|
|
18
|
+
on:
|
|
19
|
+
push:
|
|
20
|
+
tags:
|
|
21
|
+
- '[0-9]+.[0-9]+.[0-9]+'
|
|
22
|
+
- '[0-9]+.[0-9]+.[0-9]+-[abr]*'
|
|
23
|
+
|
|
24
|
+
permissions:
|
|
25
|
+
contents: read
|
|
26
|
+
|
|
27
|
+
jobs:
|
|
28
|
+
guard_main:
|
|
29
|
+
# Refuse to release from a tag that does not point at a commit on main.
|
|
30
|
+
# Prevents accidental releases from feature branches or stale tags.
|
|
31
|
+
name: Verify tag is on main
|
|
32
|
+
runs-on: ubuntu-latest
|
|
33
|
+
steps:
|
|
34
|
+
- uses: actions/checkout@v4
|
|
35
|
+
with:
|
|
36
|
+
fetch-depth: 0
|
|
37
|
+
- name: Check tag commit is an ancestor of origin/main
|
|
38
|
+
run: |
|
|
39
|
+
git fetch origin main
|
|
40
|
+
if ! git merge-base --is-ancestor "$GITHUB_SHA" origin/main; then
|
|
41
|
+
echo "::error::Tag commit $GITHUB_SHA is not on origin/main; refusing to release."
|
|
42
|
+
exit 1
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
build:
|
|
46
|
+
name: Build artifacts
|
|
47
|
+
needs: guard_main
|
|
48
|
+
runs-on: ubuntu-latest
|
|
49
|
+
steps:
|
|
50
|
+
- uses: actions/checkout@v4
|
|
51
|
+
with:
|
|
52
|
+
# hatch-vcs needs the full history (or at least tags) to resolve
|
|
53
|
+
# the version dynamically.
|
|
54
|
+
fetch-depth: 0
|
|
55
|
+
|
|
56
|
+
- name: Build wheel and sdist
|
|
57
|
+
run: pipx run build
|
|
58
|
+
|
|
59
|
+
- uses: actions/upload-artifact@v4
|
|
60
|
+
with:
|
|
61
|
+
name: dist-${{ github.ref_name }}
|
|
62
|
+
path: dist/*
|
|
63
|
+
|
|
64
|
+
create_github_release:
|
|
65
|
+
name: Create GitHub Release
|
|
66
|
+
needs: build
|
|
67
|
+
runs-on: ubuntu-latest
|
|
68
|
+
permissions:
|
|
69
|
+
contents: write
|
|
70
|
+
steps:
|
|
71
|
+
- uses: actions/download-artifact@v4
|
|
72
|
+
with:
|
|
73
|
+
pattern: dist-*
|
|
74
|
+
path: dist
|
|
75
|
+
merge-multiple: true
|
|
76
|
+
|
|
77
|
+
- name: Create release
|
|
78
|
+
uses: softprops/action-gh-release@v2
|
|
79
|
+
with:
|
|
80
|
+
generate_release_notes: true
|
|
81
|
+
files: dist/*
|
|
82
|
+
# Mark pre-releases (anything with a/b/rc in the tag) appropriately
|
|
83
|
+
# so PyPI/users see the right channel.
|
|
84
|
+
prerelease: ${{ contains(github.ref_name, 'a') || contains(github.ref_name, 'b') || contains(github.ref_name, 'rc') }}
|
|
85
|
+
|
|
86
|
+
publish_pypi:
|
|
87
|
+
name: Publish to PyPI
|
|
88
|
+
needs: create_github_release
|
|
89
|
+
runs-on: ubuntu-latest
|
|
90
|
+
environment:
|
|
91
|
+
name: pypi
|
|
92
|
+
url: https://pypi.org/p/tempnet
|
|
93
|
+
permissions:
|
|
94
|
+
id-token: write # OIDC for trusted publishing
|
|
95
|
+
attestations: write # sigstore provenance attestations
|
|
96
|
+
steps:
|
|
97
|
+
- uses: actions/download-artifact@v4
|
|
98
|
+
with:
|
|
99
|
+
pattern: dist-*
|
|
100
|
+
path: dist
|
|
101
|
+
merge-multiple: true
|
|
102
|
+
|
|
103
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
104
|
+
with:
|
|
105
|
+
attestations: true
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
name: Status
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
unit-tests:
|
|
10
|
+
runs-on: ubuntu-24.04
|
|
11
|
+
strategy:
|
|
12
|
+
matrix:
|
|
13
|
+
pythonV: ["3.10", "3.11", "3.12", "3.13", "3.14"]
|
|
14
|
+
fail-fast: false
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v5
|
|
17
|
+
with:
|
|
18
|
+
lfs: 'true'
|
|
19
|
+
submodules: recursive
|
|
20
|
+
|
|
21
|
+
- name: Set up Python ${{ matrix.pythonV }}
|
|
22
|
+
uses: actions/setup-python@v5
|
|
23
|
+
with:
|
|
24
|
+
python-version: ${{ matrix.pythonV }}
|
|
25
|
+
|
|
26
|
+
- name: Install dependencies
|
|
27
|
+
run: |
|
|
28
|
+
python -m venv .venv
|
|
29
|
+
source .venv/bin/activate
|
|
30
|
+
pip install --upgrade pip
|
|
31
|
+
pip install -e .[testing]
|
|
32
|
+
|
|
33
|
+
- name: Run tests with coverage
|
|
34
|
+
run: |
|
|
35
|
+
source .venv/bin/activate
|
|
36
|
+
python -c "import multiprocessing; print(multiprocessing.cpu_count())"
|
|
37
|
+
python -m pytest -s -vvv --timeout 600 --cov
|
|
38
|
+
env:
|
|
39
|
+
COVERAGE_FILE: ".coverage.unittests"
|
|
40
|
+
|
|
41
|
+
# NOTE: we report the coverage only for the oldest python version supported
|
|
42
|
+
- name: Store coverage file
|
|
43
|
+
if: matrix.pythonV == '3.10'
|
|
44
|
+
uses: actions/upload-artifact@v4
|
|
45
|
+
with:
|
|
46
|
+
name: coverage-unittests
|
|
47
|
+
path: .coverage.unittests
|
|
48
|
+
include-hidden-files: true
|
|
49
|
+
|
|
50
|
+
# Update per-version pass/fail badge in gist
|
|
51
|
+
- name: Update Python ${{ matrix.pythonV }} status badge
|
|
52
|
+
if: always()
|
|
53
|
+
# pinned to v1.8.0
|
|
54
|
+
uses: schneegans/dynamic-badges-action@0e50b8bad39e7e1afd3e4e9c2b7dd145fad07501
|
|
55
|
+
with:
|
|
56
|
+
auth: ${{ secrets.GIST_SECRET }}
|
|
57
|
+
gistID: ${{ vars.STATUS_GIST_ID }}
|
|
58
|
+
filename: python-${{ matrix.pythonV }}.json
|
|
59
|
+
label: "Python ${{ matrix.pythonV }}"
|
|
60
|
+
message: ${{ job.status == 'success' && 'passing' || 'failing' }}
|
|
61
|
+
color: ${{ job.status == 'success' && 'brightgreen' || 'red' }}
|
|
62
|
+
|
|
63
|
+
coverage-badge:
|
|
64
|
+
name: coverage-badge
|
|
65
|
+
runs-on: ubuntu-24.04
|
|
66
|
+
needs: [unit-tests]
|
|
67
|
+
if: always()
|
|
68
|
+
permissions:
|
|
69
|
+
contents: write
|
|
70
|
+
steps:
|
|
71
|
+
- uses: actions/checkout@v5
|
|
72
|
+
- uses: actions/download-artifact@v4
|
|
73
|
+
id: download
|
|
74
|
+
with:
|
|
75
|
+
pattern: coverage-*
|
|
76
|
+
merge-multiple: true
|
|
77
|
+
|
|
78
|
+
- name: Update coverage badge
|
|
79
|
+
uses: py-cov-action/python-coverage-comment-action@v3
|
|
80
|
+
with:
|
|
81
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
82
|
+
MERGE_COVERAGE_FILES: true
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Manual TestPyPI dry-run. Trigger via the Actions tab; the branch picker
|
|
2
|
+
# in the workflow_dispatch UI selects which ref to build from. Useful for
|
|
3
|
+
# validating the build and publish pipeline before cutting a real release tag.
|
|
4
|
+
#
|
|
5
|
+
# Prerequisites (configured outside this workflow):
|
|
6
|
+
# * TestPyPI trusted publisher: workflow=test_release.yml, environment=testpypi
|
|
7
|
+
# * GitHub environment ``testpypi`` (no reviewers required)
|
|
8
|
+
|
|
9
|
+
name: Test release (TestPyPI)
|
|
10
|
+
|
|
11
|
+
on:
|
|
12
|
+
workflow_dispatch: {}
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
build:
|
|
19
|
+
name: Build artifacts
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v4
|
|
23
|
+
with:
|
|
24
|
+
fetch-depth: 0
|
|
25
|
+
|
|
26
|
+
- name: Build wheel and sdist
|
|
27
|
+
# TestPyPI rejects PEP 440 local version segments (the ``+gSHA``
|
|
28
|
+
# suffix hatch-vcs appends on non-tag commits). Strip it here --
|
|
29
|
+
# and only here -- so PyPI releases and local dev installs are
|
|
30
|
+
# unaffected.
|
|
31
|
+
env:
|
|
32
|
+
SETUPTOOLS_SCM_LOCAL_SCHEME: no-local-version
|
|
33
|
+
run: pipx run build
|
|
34
|
+
|
|
35
|
+
- uses: actions/upload-artifact@v4
|
|
36
|
+
with:
|
|
37
|
+
name: dist-testrelease
|
|
38
|
+
path: dist/*
|
|
39
|
+
|
|
40
|
+
publish_testpypi:
|
|
41
|
+
name: Publish to TestPyPI
|
|
42
|
+
needs: build
|
|
43
|
+
runs-on: ubuntu-latest
|
|
44
|
+
environment:
|
|
45
|
+
name: testpypi
|
|
46
|
+
url: https://test.pypi.org/p/tempnet
|
|
47
|
+
permissions:
|
|
48
|
+
id-token: write
|
|
49
|
+
steps:
|
|
50
|
+
- uses: actions/download-artifact@v4
|
|
51
|
+
with:
|
|
52
|
+
pattern: dist-*
|
|
53
|
+
path: dist
|
|
54
|
+
merge-multiple: true
|
|
55
|
+
|
|
56
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
57
|
+
with:
|
|
58
|
+
repository-url: https://test.pypi.org/legacy/
|
|
59
|
+
# TestPyPI rejects re-uploads of an existing version; allow the
|
|
60
|
+
# workflow to succeed when the version already exists so repeated
|
|
61
|
+
# dry-runs from the same commit don't fail noisily.
|
|
62
|
+
skip-existing: true
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# ignore api folder for docs
|
|
2
|
+
docs/api/
|
|
3
|
+
public/
|
|
4
|
+
|
|
5
|
+
# Byte-compiled / optimized / DLL files
|
|
6
|
+
__pycache__/
|
|
7
|
+
*.py[cod]
|
|
8
|
+
*$py.class
|
|
9
|
+
|
|
10
|
+
# C extensions
|
|
11
|
+
*.so
|
|
12
|
+
|
|
13
|
+
# Distribution / packaging
|
|
14
|
+
.Python
|
|
15
|
+
build/
|
|
16
|
+
develop-eggs/
|
|
17
|
+
dist/
|
|
18
|
+
downloads/
|
|
19
|
+
eggs/
|
|
20
|
+
.eggs/
|
|
21
|
+
lib/
|
|
22
|
+
lib64/
|
|
23
|
+
parts/
|
|
24
|
+
sdist/
|
|
25
|
+
var/
|
|
26
|
+
wheels/
|
|
27
|
+
pip-wheel-metadata/
|
|
28
|
+
share/python-wheels/
|
|
29
|
+
*.egg-info/
|
|
30
|
+
.installed.cfg
|
|
31
|
+
*.egg
|
|
32
|
+
MANIFEST
|
|
33
|
+
|
|
34
|
+
# PyInstaller
|
|
35
|
+
# Usually these files are written by a python script from a template
|
|
36
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
37
|
+
*.manifest
|
|
38
|
+
*.spec
|
|
39
|
+
|
|
40
|
+
# Installer logs
|
|
41
|
+
pip-log.txt
|
|
42
|
+
pip-delete-this-directory.txt
|
|
43
|
+
|
|
44
|
+
# Unit test / coverage reports
|
|
45
|
+
htmlcov/
|
|
46
|
+
.tox/
|
|
47
|
+
.nox/
|
|
48
|
+
.coverage
|
|
49
|
+
.coverage.*
|
|
50
|
+
.cache
|
|
51
|
+
nosetests.xml
|
|
52
|
+
coverage.xml
|
|
53
|
+
*.cover
|
|
54
|
+
*.py,cover
|
|
55
|
+
.hypothesis/
|
|
56
|
+
.pytest_cache/
|
|
57
|
+
|
|
58
|
+
# Translations
|
|
59
|
+
*.mo
|
|
60
|
+
*.pot
|
|
61
|
+
|
|
62
|
+
# Django stuff:
|
|
63
|
+
*.log
|
|
64
|
+
local_settings.py
|
|
65
|
+
db.sqlite3
|
|
66
|
+
db.sqlite3-journal
|
|
67
|
+
|
|
68
|
+
# Flask stuff:
|
|
69
|
+
instance/
|
|
70
|
+
.webassets-cache
|
|
71
|
+
|
|
72
|
+
# Scrapy stuff:
|
|
73
|
+
.scrapy
|
|
74
|
+
|
|
75
|
+
# Sphinx documentation
|
|
76
|
+
docs/_build/
|
|
77
|
+
docs/auto_examples/
|
|
78
|
+
docs/sg_execution_times.rst
|
|
79
|
+
|
|
80
|
+
# PyBuilder
|
|
81
|
+
target/
|
|
82
|
+
|
|
83
|
+
# Jupyter Notebook
|
|
84
|
+
.ipynb_checkpoints
|
|
85
|
+
|
|
86
|
+
# IPython
|
|
87
|
+
profile_default/
|
|
88
|
+
ipython_config.py
|
|
89
|
+
|
|
90
|
+
# pyenv
|
|
91
|
+
.python-version
|
|
92
|
+
|
|
93
|
+
# pipenv
|
|
94
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
95
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
96
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
97
|
+
# install all needed dependencies.
|
|
98
|
+
#Pipfile.lock
|
|
99
|
+
|
|
100
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
|
101
|
+
__pypackages__/
|
|
102
|
+
|
|
103
|
+
# Celery stuff
|
|
104
|
+
celerybeat-schedule
|
|
105
|
+
celerybeat.pid
|
|
106
|
+
|
|
107
|
+
# SageMath parsed files
|
|
108
|
+
*.sage.py
|
|
109
|
+
|
|
110
|
+
# Environments
|
|
111
|
+
.env
|
|
112
|
+
.venv
|
|
113
|
+
env/
|
|
114
|
+
venv/
|
|
115
|
+
ENV/
|
|
116
|
+
env.bak/
|
|
117
|
+
venv.bak/
|
|
118
|
+
|
|
119
|
+
# Spyder project settings
|
|
120
|
+
.spyderproject
|
|
121
|
+
.spyproject
|
|
122
|
+
|
|
123
|
+
# Pycharm project settings
|
|
124
|
+
.idea
|
|
125
|
+
|
|
126
|
+
# Rope project settings
|
|
127
|
+
.ropeproject
|
|
128
|
+
|
|
129
|
+
# mkdocs documentation
|
|
130
|
+
/site
|
|
131
|
+
|
|
132
|
+
# mypy
|
|
133
|
+
.mypy_cache/
|
|
134
|
+
.dmypy.json
|
|
135
|
+
dmypy.json
|
|
136
|
+
|
|
137
|
+
# Pyre type checker
|
|
138
|
+
.pyre/
|
|
139
|
+
|
|
140
|
+
# vim
|
|
141
|
+
*.swp
|
|
142
|
+
|
|
143
|
+
# any slurm output file
|
|
144
|
+
*.out
|
|
145
|
+
|
|
146
|
+
# exclude local configurations
|
|
147
|
+
locals.py
|
|
148
|
+
|
|
149
|
+
# generally exclude results and input data
|
|
150
|
+
data/
|
|
151
|
+
results/
|
|
152
|
+
*.png
|
|
153
|
+
*.pdf
|
|
154
|
+
*.tif
|
|
155
|
+
|
|
156
|
+
# nixos
|
|
157
|
+
shell.nix
|
|
158
|
+
|
|
159
|
+
*.revision
|