pluginify 0.0.0.post1.dev0__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.
- pluginify-0.0.0.post1.dev0/.github/workflows/generate-badges.yaml +240 -0
- pluginify-0.0.0.post1.dev0/.github/workflows/lint-and-test.yaml +119 -0
- pluginify-0.0.0.post1.dev0/.github/workflows/package-and-publish.yaml +104 -0
- pluginify-0.0.0.post1.dev0/.github/workflows/status-check.yaml +17 -0
- pluginify-0.0.0.post1.dev0/LICENSE +128 -0
- pluginify-0.0.0.post1.dev0/PKG-INFO +66 -0
- pluginify-0.0.0.post1.dev0/README.md +41 -0
- pluginify-0.0.0.post1.dev0/docs/source/releases/latest/ci-fix-perms.yaml +15 -0
- pluginify-0.0.0.post1.dev0/docs/source/releases/latest/copy-geoips-functionality.yaml +45 -0
- pluginify-0.0.0.post1.dev0/docs/source/releases/latest/initial-commit.yaml +92 -0
- pluginify-0.0.0.post1.dev0/docs/source/releases/latest/remove-all-geoips-references.yaml +54 -0
- pluginify-0.0.0.post1.dev0/docs/source/releases/latest/replace-geoips-functionality.yaml +34 -0
- pluginify-0.0.0.post1.dev0/docs/source/releases/latest/update-black-formatting.yaml +15 -0
- pluginify-0.0.0.post1.dev0/pluginify/__init__.py +11 -0
- pluginify-0.0.0.post1.dev0/pluginify/_version.py +7 -0
- pluginify-0.0.0.post1.dev0/pluginify/commandline_typer.py +258 -0
- pluginify-0.0.0.post1.dev0/pluginify/config.py +144 -0
- pluginify-0.0.0.post1.dev0/pluginify/create_plugin_registries.py +1037 -0
- pluginify-0.0.0.post1.dev0/pluginify/errors.py +16 -0
- pluginify-0.0.0.post1.dev0/pluginify/interfaces/__init__.py +9 -0
- pluginify-0.0.0.post1.dev0/pluginify/interfaces/base.py +665 -0
- pluginify-0.0.0.post1.dev0/pluginify/interfaces/class_based/data_modifiers.py +38 -0
- pluginify-0.0.0.post1.dev0/pluginify/interfaces/class_based_plugin.py +210 -0
- pluginify-0.0.0.post1.dev0/pluginify/interfaces/yaml_based/configs.py +27 -0
- pluginify-0.0.0.post1.dev0/pluginify/plugin_registry.py +925 -0
- pluginify-0.0.0.post1.dev0/pluginify/plugins/classes/data_modifiers/cuboid.py +41 -0
- pluginify-0.0.0.post1.dev0/pluginify/plugins/yaml/configs/stucco.yaml +16 -0
- pluginify-0.0.0.post1.dev0/pluginify/pydantic_models/v1/configs.py +58 -0
- pluginify-0.0.0.post1.dev0/pluginify/utils/__init__.py +62 -0
- pluginify-0.0.0.post1.dev0/pluginify/utils/context_managers.py +32 -0
- pluginify-0.0.0.post1.dev0/pyproject.toml +65 -0
- pluginify-0.0.0.post1.dev0/tests/conftest.py +45 -0
- pluginify-0.0.0.post1.dev0/tests/unit_tests/config/test_config.py +155 -0
- pluginify-0.0.0.post1.dev0/tests/unit_tests/plugin_registries/files/bad/invalid_interfaces.yaml +16 -0
- pluginify-0.0.0.post1.dev0/tests/unit_tests/plugin_registries/files/bad/missing_lowest_keys.yaml +16 -0
- pluginify-0.0.0.post1.dev0/tests/unit_tests/plugin_registries/files/bad/missing_plugin_types.yaml +26 -0
- pluginify-0.0.0.post1.dev0/tests/unit_tests/plugin_registries/files/good/pluginify.yaml +22 -0
- pluginify-0.0.0.post1.dev0/tests/unit_tests/plugin_registries/test_plugin_registries.py +553 -0
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
name: Nightly Badge Generation
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
- cron: '0 2 * * *'
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
|
|
11
|
+
concurrency:
|
|
12
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
13
|
+
cancel-in-progress: true
|
|
14
|
+
|
|
15
|
+
env:
|
|
16
|
+
UV_SYSTEM_PYTHON: true
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
check-commits:
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
outputs:
|
|
22
|
+
has_new_commits: ${{ steps.check.outputs.has_new_commits }}
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v4
|
|
25
|
+
with:
|
|
26
|
+
fetch-depth: 0
|
|
27
|
+
|
|
28
|
+
- name: Check for new commits in last 24 hours
|
|
29
|
+
id: check
|
|
30
|
+
run: |
|
|
31
|
+
COMMITS=$(git log --oneline --since="25 hours ago" --no-merges | grep -v "\[skip ci\]" | wc -l)
|
|
32
|
+
if [ "$COMMITS" -gt 0 ]; then
|
|
33
|
+
echo "has_new_commits=true" >> $GITHUB_OUTPUT
|
|
34
|
+
echo "Found $COMMITS new commits in the last 25 hours"
|
|
35
|
+
else
|
|
36
|
+
echo "has_new_commits=false" >> $GITHUB_OUTPUT
|
|
37
|
+
echo "No new commits in the last 25 hours"
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
generate-badges:
|
|
41
|
+
needs: check-commits
|
|
42
|
+
if: needs.check-commits.outputs.has_new_commits == 'true'
|
|
43
|
+
runs-on: ubuntu-latest
|
|
44
|
+
|
|
45
|
+
steps:
|
|
46
|
+
- uses: actions/checkout@v4
|
|
47
|
+
with:
|
|
48
|
+
fetch-depth: 0
|
|
49
|
+
|
|
50
|
+
- uses: actions/setup-python@v5
|
|
51
|
+
with:
|
|
52
|
+
python-version: "3.13"
|
|
53
|
+
|
|
54
|
+
- uses: astral-sh/setup-uv@v6
|
|
55
|
+
|
|
56
|
+
- name: Install dependencies
|
|
57
|
+
run: |
|
|
58
|
+
uv pip install -e .[doc,lint,test]
|
|
59
|
+
uv pip install pytest mypy ruff commitizen coverage genbadge[all]
|
|
60
|
+
|
|
61
|
+
- name: Create directories
|
|
62
|
+
run: |
|
|
63
|
+
mkdir -p .github/badges
|
|
64
|
+
mkdir -p reports
|
|
65
|
+
|
|
66
|
+
- name: Run pytest with coverage
|
|
67
|
+
id: pytest
|
|
68
|
+
continue-on-error: true
|
|
69
|
+
run: coverage run -m pytest --junitxml=reports/junit.xml
|
|
70
|
+
|
|
71
|
+
- name: Generate pytest badge
|
|
72
|
+
run: |
|
|
73
|
+
if [ -f reports/junit.xml ]; then
|
|
74
|
+
genbadge tests -i reports/junit.xml -o .github/badges/tests-badge.svg -n "tests"
|
|
75
|
+
else
|
|
76
|
+
python -c "
|
|
77
|
+
from genbadge import Badge
|
|
78
|
+
b = Badge(left_txt='tests', right_txt='error', color='red')
|
|
79
|
+
b.write_to('.github/badges/tests-badge.svg', use_shields=False)
|
|
80
|
+
"
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
- name: Generate coverage badge
|
|
84
|
+
run: |
|
|
85
|
+
if [ -f coverage.xml ]; then
|
|
86
|
+
genbadge coverage -i coverage.xml -o .github/badges/coverage-badge.svg -n "coverage"
|
|
87
|
+
else
|
|
88
|
+
python -c "
|
|
89
|
+
from genbadge import Badge
|
|
90
|
+
b = Badge(left_txt='coverage', right_txt='error', color='red')
|
|
91
|
+
b.write_to('.github/badges/coverage-badge.svg', use_shields=False)
|
|
92
|
+
"
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
- name: Run mypy
|
|
96
|
+
id: mypy
|
|
97
|
+
continue-on-error: true
|
|
98
|
+
run: mypy ./src --junit-xml reports/mypy.xml || true
|
|
99
|
+
|
|
100
|
+
- name: Generate mypy badge
|
|
101
|
+
run: |
|
|
102
|
+
if [ -f reports/mypy.xml ]; then
|
|
103
|
+
genbadge tests -i reports/mypy.xml -o .github/badges/mypy-badge.svg -n "mypy"
|
|
104
|
+
else
|
|
105
|
+
python -c "
|
|
106
|
+
from genbadge import Badge
|
|
107
|
+
b = Badge(left_txt='mypy', right_txt='passing', color='brightgreen')
|
|
108
|
+
b.write_to('.github/badges/mypy-badge.svg', use_shields=False)
|
|
109
|
+
"
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
- name: Run ruff
|
|
113
|
+
id: ruff
|
|
114
|
+
continue-on-error: true
|
|
115
|
+
run: ruff check ./src --output-format=junit -o reports/ruff.xml || true
|
|
116
|
+
|
|
117
|
+
- name: Generate ruff badge
|
|
118
|
+
run: |
|
|
119
|
+
if [ -f reports/ruff.xml ] && [ -s reports/ruff.xml ]; then
|
|
120
|
+
if grep -q "<testcase" reports/ruff.xml; then
|
|
121
|
+
genbadge tests -i reports/ruff.xml -o .github/badges/ruff-badge.svg -n "ruff"
|
|
122
|
+
else
|
|
123
|
+
python -c "
|
|
124
|
+
from genbadge import Badge
|
|
125
|
+
b = Badge(left_txt='ruff', right_txt='passing', color='brightgreen')
|
|
126
|
+
b.write_to('.github/badges/ruff-badge.svg', use_shields=False)
|
|
127
|
+
"
|
|
128
|
+
fi
|
|
129
|
+
else
|
|
130
|
+
python -c "
|
|
131
|
+
from genbadge import Badge
|
|
132
|
+
b = Badge(left_txt='ruff', right_txt='passing', color='brightgreen')
|
|
133
|
+
b.write_to('.github/badges/ruff-badge.svg', use_shields=False)
|
|
134
|
+
"
|
|
135
|
+
fi
|
|
136
|
+
|
|
137
|
+
- name: Test install
|
|
138
|
+
id: install
|
|
139
|
+
continue-on-error: true
|
|
140
|
+
run: uv pip install -e . --reinstall
|
|
141
|
+
|
|
142
|
+
- name: Generate install badge
|
|
143
|
+
run: |
|
|
144
|
+
if [ "${{ steps.install.outcome }}" == "success" ]; then
|
|
145
|
+
python -c "
|
|
146
|
+
from genbadge import Badge
|
|
147
|
+
b = Badge(left_txt='install', right_txt='passing', color='brightgreen')
|
|
148
|
+
b.write_to('.github/badges/install-badge.svg', use_shields=False)
|
|
149
|
+
"
|
|
150
|
+
else
|
|
151
|
+
python -c "
|
|
152
|
+
from genbadge import Badge
|
|
153
|
+
b = Badge(left_txt='install', right_txt='failing', color='red')
|
|
154
|
+
b.write_to('.github/badges/install-badge.svg', use_shields=False)
|
|
155
|
+
"
|
|
156
|
+
fi
|
|
157
|
+
|
|
158
|
+
- uses: actions/setup-node@v4
|
|
159
|
+
with:
|
|
160
|
+
node-version: "22"
|
|
161
|
+
|
|
162
|
+
- name: Run cspell
|
|
163
|
+
id: cspell
|
|
164
|
+
continue-on-error: true
|
|
165
|
+
run: npx cspell "./src/**/*" --no-progress
|
|
166
|
+
|
|
167
|
+
- name: Generate cspell badge
|
|
168
|
+
run: |
|
|
169
|
+
if [ "${{ steps.cspell.outcome }}" == "success" ]; then
|
|
170
|
+
python -c "
|
|
171
|
+
from genbadge import Badge
|
|
172
|
+
b = Badge(left_txt='cspell', right_txt='passing', color='brightgreen')
|
|
173
|
+
b.write_to('.github/badges/cspell-badge.svg', use_shields=False)
|
|
174
|
+
"
|
|
175
|
+
else
|
|
176
|
+
python -c "
|
|
177
|
+
from genbadge import Badge
|
|
178
|
+
b = Badge(left_txt='cspell', right_txt='failing', color='red')
|
|
179
|
+
b.write_to('.github/badges/cspell-badge.svg', use_shields=False)
|
|
180
|
+
"
|
|
181
|
+
fi
|
|
182
|
+
|
|
183
|
+
- name: Check commitizen
|
|
184
|
+
id: commitizen
|
|
185
|
+
continue-on-error: true
|
|
186
|
+
env:
|
|
187
|
+
COMMITIZEN_START_REV: "9d83e6984277ccbe6c5f6713f65b75a90e7c7e40"
|
|
188
|
+
run: cz check --rev-range ${{ env.COMMITIZEN_START_REV }}..HEAD
|
|
189
|
+
|
|
190
|
+
- name: Generate commitizen badge
|
|
191
|
+
run: |
|
|
192
|
+
if [ "${{ steps.commitizen.outcome }}" == "success" ]; then
|
|
193
|
+
python -c "
|
|
194
|
+
from genbadge import Badge
|
|
195
|
+
b = Badge(left_txt='commitizen', right_txt='passing', color='brightgreen')
|
|
196
|
+
b.write_to('.github/badges/commitizen-badge.svg', use_shields=False)
|
|
197
|
+
"
|
|
198
|
+
else
|
|
199
|
+
python -c "
|
|
200
|
+
from genbadge import Badge
|
|
201
|
+
b = Badge(left_txt='commitizen', right_txt='failing', color='red')
|
|
202
|
+
b.write_to('.github/badges/commitizen-badge.svg', use_shields=False)
|
|
203
|
+
"
|
|
204
|
+
fi
|
|
205
|
+
|
|
206
|
+
- name: Check for badge changes
|
|
207
|
+
id: badge_changes
|
|
208
|
+
run: |
|
|
209
|
+
git add .github/badges/*.svg
|
|
210
|
+
if git diff --cached --quiet; then
|
|
211
|
+
echo "has_changes=false" >> $GITHUB_OUTPUT
|
|
212
|
+
echo "No badge changes detected"
|
|
213
|
+
else
|
|
214
|
+
echo "has_changes=true" >> $GITHUB_OUTPUT
|
|
215
|
+
echo "Badge changes detected:"
|
|
216
|
+
git diff --cached --name-status .github/badges/
|
|
217
|
+
fi
|
|
218
|
+
|
|
219
|
+
- name: Commit and push badges
|
|
220
|
+
if: steps.badge_changes.outputs.has_changes == 'true'
|
|
221
|
+
run: |
|
|
222
|
+
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
|
223
|
+
git config --local user.name "github-actions[bot]"
|
|
224
|
+
git commit -m "chore: update badges [skip ci]"
|
|
225
|
+
git push
|
|
226
|
+
|
|
227
|
+
- name: Generate summary
|
|
228
|
+
run: |
|
|
229
|
+
echo "## Badge Generation Summary" >> $GITHUB_STEP_SUMMARY
|
|
230
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
231
|
+
echo "| Check | Status |" >> $GITHUB_STEP_SUMMARY
|
|
232
|
+
echo "|-------|--------|" >> $GITHUB_STEP_SUMMARY
|
|
233
|
+
echo "| Pytest & Coverage | ${{ steps.pytest.outcome }} |" >> $GITHUB_STEP_SUMMARY
|
|
234
|
+
echo "| Mypy | ${{ steps.mypy.outcome }} |" >> $GITHUB_STEP_SUMMARY
|
|
235
|
+
echo "| Ruff | ${{ steps.ruff.outcome }} |" >> $GITHUB_STEP_SUMMARY
|
|
236
|
+
echo "| Install | ${{ steps.install.outcome }} |" >> $GITHUB_STEP_SUMMARY
|
|
237
|
+
echo "| CSpell | ${{ steps.cspell.outcome }} |" >> $GITHUB_STEP_SUMMARY
|
|
238
|
+
echo "| Commitizen | ${{ steps.commitizen.outcome }} |" >> $GITHUB_STEP_SUMMARY
|
|
239
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
240
|
+
echo "Badges committed: ${{ steps.badge_changes.outputs.has_changes }}" >> $GITHUB_STEP_SUMMARY
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
concurrency:
|
|
13
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
14
|
+
cancel-in-progress: true
|
|
15
|
+
|
|
16
|
+
env:
|
|
17
|
+
UV_SYSTEM_PYTHON: true
|
|
18
|
+
COMMITIZEN_START_REV: "9d83e6984277ccbe6c5f6713f65b75a90e7c7e40"
|
|
19
|
+
|
|
20
|
+
jobs:
|
|
21
|
+
# ---------------------------------------------------------------------------
|
|
22
|
+
# Single lint job — every hook runs as its own step so failures are visible
|
|
23
|
+
# ---------------------------------------------------------------------------
|
|
24
|
+
lint:
|
|
25
|
+
runs-on: ubuntu-latest
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
with:
|
|
29
|
+
fetch-depth: 0 # needed for commitizen rev-range
|
|
30
|
+
|
|
31
|
+
- uses: actions/setup-python@v5
|
|
32
|
+
with:
|
|
33
|
+
python-version: "3.13"
|
|
34
|
+
|
|
35
|
+
- uses: actions/setup-go@v5
|
|
36
|
+
with:
|
|
37
|
+
go-version: stable
|
|
38
|
+
cache: false
|
|
39
|
+
|
|
40
|
+
- uses: actions/setup-node@v4
|
|
41
|
+
with:
|
|
42
|
+
node-version: "22"
|
|
43
|
+
|
|
44
|
+
- uses: astral-sh/setup-uv@v6
|
|
45
|
+
|
|
46
|
+
- name: Ruff (lint)
|
|
47
|
+
uses: pre-commit/action@v3.0.1
|
|
48
|
+
with:
|
|
49
|
+
extra_args: ruff-check --all-files
|
|
50
|
+
|
|
51
|
+
- name: Ruff (format)
|
|
52
|
+
if: success() || failure()
|
|
53
|
+
uses: pre-commit/action@v3.0.1
|
|
54
|
+
with:
|
|
55
|
+
extra_args: ruff-format --all-files
|
|
56
|
+
|
|
57
|
+
- name: Blacken-docs
|
|
58
|
+
if: success() || failure()
|
|
59
|
+
uses: pre-commit/action@v3.0.1
|
|
60
|
+
with:
|
|
61
|
+
extra_args: blacken-docs --all-files
|
|
62
|
+
|
|
63
|
+
- name: mdformat
|
|
64
|
+
if: success() || failure()
|
|
65
|
+
uses: pre-commit/action@v3.0.1
|
|
66
|
+
with:
|
|
67
|
+
extra_args: mdformat --all-files
|
|
68
|
+
|
|
69
|
+
- name: actionlint
|
|
70
|
+
if: success() || failure()
|
|
71
|
+
uses: pre-commit/action@v3.0.1
|
|
72
|
+
with:
|
|
73
|
+
extra_args: actionlint --all-files
|
|
74
|
+
|
|
75
|
+
- name: validate-pyproject
|
|
76
|
+
if: success() || failure()
|
|
77
|
+
uses: pre-commit/action@v3.0.1
|
|
78
|
+
with:
|
|
79
|
+
extra_args: validate-pyproject --all-files
|
|
80
|
+
|
|
81
|
+
- name: yamlfmt
|
|
82
|
+
if: success() || failure()
|
|
83
|
+
uses: pre-commit/action@v3.0.1
|
|
84
|
+
with:
|
|
85
|
+
extra_args: yamlfmt --all-files
|
|
86
|
+
|
|
87
|
+
- name: cspell
|
|
88
|
+
if: success() || failure()
|
|
89
|
+
uses: pre-commit/action@v3.0.1
|
|
90
|
+
with:
|
|
91
|
+
extra_args: cspell --all-files
|
|
92
|
+
|
|
93
|
+
# ---------------------------------------------------------------------------
|
|
94
|
+
# Single matrix job — install once, then run pytest + docs + mypy
|
|
95
|
+
# ---------------------------------------------------------------------------
|
|
96
|
+
test:
|
|
97
|
+
runs-on: ubuntu-latest
|
|
98
|
+
strategy:
|
|
99
|
+
fail-fast: false
|
|
100
|
+
matrix:
|
|
101
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
102
|
+
steps:
|
|
103
|
+
- uses: actions/checkout@v4
|
|
104
|
+
|
|
105
|
+
- uses: actions/setup-python@v5
|
|
106
|
+
with:
|
|
107
|
+
python-version: ${{ matrix.python-version }}
|
|
108
|
+
|
|
109
|
+
- uses: astral-sh/setup-uv@v6
|
|
110
|
+
|
|
111
|
+
- name: Install package with all extras
|
|
112
|
+
run: uv pip install -e .[doc,lint,test] pytest mypy
|
|
113
|
+
|
|
114
|
+
- name: Run pytest
|
|
115
|
+
run: python -m pytest
|
|
116
|
+
|
|
117
|
+
- name: Run mypy
|
|
118
|
+
if: (success() || failure()) && matrix.python-version == '3.13'
|
|
119
|
+
run: mypy ./src
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
# Allow manual trigger for testing the workflow
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
id-token: write
|
|
13
|
+
|
|
14
|
+
concurrency:
|
|
15
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
16
|
+
cancel-in-progress: true
|
|
17
|
+
|
|
18
|
+
env:
|
|
19
|
+
UV_SYSTEM_PYTHON: true
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
# ---------------------------------------------------------------------------
|
|
23
|
+
# Build sdist and wheel
|
|
24
|
+
# ---------------------------------------------------------------------------
|
|
25
|
+
build:
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
steps:
|
|
28
|
+
- uses: actions/checkout@v4
|
|
29
|
+
|
|
30
|
+
- uses: actions/setup-python@v5
|
|
31
|
+
with:
|
|
32
|
+
python-version: "3.13"
|
|
33
|
+
|
|
34
|
+
- uses: astral-sh/setup-uv@v6
|
|
35
|
+
|
|
36
|
+
- name: Install build tools
|
|
37
|
+
run: uv pip install build
|
|
38
|
+
|
|
39
|
+
- name: Build sdist and wheel
|
|
40
|
+
run: python -m build
|
|
41
|
+
|
|
42
|
+
- name: List built artifacts
|
|
43
|
+
run: ls -lh dist/
|
|
44
|
+
|
|
45
|
+
- name: Upload build artifacts
|
|
46
|
+
uses: actions/upload-artifact@v4
|
|
47
|
+
with:
|
|
48
|
+
name: dist
|
|
49
|
+
path: dist/
|
|
50
|
+
if-no-files-found: error
|
|
51
|
+
|
|
52
|
+
# ---------------------------------------------------------------------------
|
|
53
|
+
# Run the test suite against the built wheel (not the source tree)
|
|
54
|
+
# ---------------------------------------------------------------------------
|
|
55
|
+
test-built-package:
|
|
56
|
+
needs: build
|
|
57
|
+
runs-on: ${{ matrix.os }}
|
|
58
|
+
strategy:
|
|
59
|
+
fail-fast: false
|
|
60
|
+
matrix:
|
|
61
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
62
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
63
|
+
steps:
|
|
64
|
+
- uses: actions/checkout@v4
|
|
65
|
+
|
|
66
|
+
- uses: actions/setup-python@v5
|
|
67
|
+
with:
|
|
68
|
+
python-version: ${{ matrix.python-version }}
|
|
69
|
+
|
|
70
|
+
- uses: astral-sh/setup-uv@v6
|
|
71
|
+
|
|
72
|
+
- name: Download build artifacts
|
|
73
|
+
uses: actions/download-artifact@v4
|
|
74
|
+
with:
|
|
75
|
+
name: dist
|
|
76
|
+
path: dist/
|
|
77
|
+
|
|
78
|
+
- name: Install wheel and test dependencies
|
|
79
|
+
shell: bash
|
|
80
|
+
run: |
|
|
81
|
+
uv pip install dist/*.whl
|
|
82
|
+
uv pip install pytest pytest-cov pytest-xdist pydantic
|
|
83
|
+
|
|
84
|
+
- name: Run tests
|
|
85
|
+
run: python -m pytest tests/ -v
|
|
86
|
+
|
|
87
|
+
# ---------------------------------------------------------------------------
|
|
88
|
+
# Publish to PyPI
|
|
89
|
+
# ---------------------------------------------------------------------------
|
|
90
|
+
publish-pypi:
|
|
91
|
+
needs: [build, test-built-package]
|
|
92
|
+
runs-on: ubuntu-latest
|
|
93
|
+
#if: github.event_name == 'release'
|
|
94
|
+
steps:
|
|
95
|
+
- name: Download build artifacts
|
|
96
|
+
uses: actions/download-artifact@v4
|
|
97
|
+
with:
|
|
98
|
+
name: dist
|
|
99
|
+
path: dist/
|
|
100
|
+
|
|
101
|
+
- name: Publish to PyPI
|
|
102
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
103
|
+
with:
|
|
104
|
+
password: ${{ secrets.PYPI_TOKEN }}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
name: Require up-to-date branch
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
push:
|
|
6
|
+
branches:
|
|
7
|
+
- main
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
status-check:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- name: No-op status check
|
|
17
|
+
run: echo "No-op Actions workflow to allow enforcing up to date branches before merge"
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
NRL OPEN LICENSE AGREEMENT
|
|
2
|
+
|
|
3
|
+
1. Scope and Applicability: This Agreement applies to Computer Software that
|
|
4
|
+
is made available under this Agreement. By using, modifying, or disseminating
|
|
5
|
+
the Computer Software, You accept the terms and conditions in this Agreement.
|
|
6
|
+
Use, modification, and dissemination of the Computer Software is permitted
|
|
7
|
+
only in accordance with the terms and conditions of this Agreement. No other
|
|
8
|
+
rights or licenses to the Computer Software are granted. Unauthorized use,
|
|
9
|
+
sale, conveyance, disposition, or modification of a Computer Software may
|
|
10
|
+
result in civil penalties and/or criminal penalties under 18 U.S.C. § 641.
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
2. For purposes of this Agreement, the following definitions apply:
|
|
14
|
+
|
|
15
|
+
a. “Computer software” means computer programs, source code, source code
|
|
16
|
+
listings, object code listings, design details, algorithms, processes,
|
|
17
|
+
flow charts, formulae, and related material that would enable the software
|
|
18
|
+
to be reproduced, recreated, or recompiled.
|
|
19
|
+
|
|
20
|
+
b. “Derivative work” is a work based upon some or all of the Computer Software.
|
|
21
|
+
|
|
22
|
+
c. “Unlimited rights” means rights to use, modify, reproduce, release,
|
|
23
|
+
perform, display, or disclose, in whole or in part, in any manner and for
|
|
24
|
+
any purpose whatsoever, and to have or authorize others to do so.
|
|
25
|
+
|
|
26
|
+
d. “You” means yourself and any corporation, company, association, firm,
|
|
27
|
+
partnership, society, and joint stock company to which you are an employee,
|
|
28
|
+
volunteer, or an independent contractor performing services therefor.
|
|
29
|
+
|
|
30
|
+
3. Use and Distribution License: The Government of the United States of
|
|
31
|
+
America (“Government”) hereby authorizes You to use and modify the Computer
|
|
32
|
+
Software for any purpose. The Government hereby authorizes You to
|
|
33
|
+
redistribute the Computer Software, but only under the terms of this
|
|
34
|
+
Agreement. You agree that any modifications to and derivative works of the
|
|
35
|
+
Computer Software generated by You shall be distributed only under the terms
|
|
36
|
+
of this Agreement. You shall provide a copy of this Agreement with any
|
|
37
|
+
distribution of the Computer Software, or any modification to and derivative
|
|
38
|
+
works of the Computer Software.
|
|
39
|
+
|
|
40
|
+
4. Ownership: All Computer Software is property of the Government and under
|
|
41
|
+
the custody and administration of the U.S. Naval Research Laboratory (NRL).
|
|
42
|
+
Nothing in the Agreement shall be construed to constitute a sale, assignment,
|
|
43
|
+
or transfer of ownership to You of the Computer Software.
|
|
44
|
+
|
|
45
|
+
5. Markings: You shall not remove any copyright notices, disclaimers, notices
|
|
46
|
+
of Government sponsorship and license rights, third-party licenses, and any
|
|
47
|
+
other identifications, contained in the Computer Software or provided in a
|
|
48
|
+
file accompanying the Computer Software, such as a license file.
|
|
49
|
+
|
|
50
|
+
6. Header File Required: For source code provided under this Agreement, the
|
|
51
|
+
header of each source file shall contain the following statement:
|
|
52
|
+
|
|
53
|
+
!#######################################################################
|
|
54
|
+
|
|
55
|
+
THIS SOURCE CODE IS PROPERTY OF THE GOVERNMENT OF THE UNITED STATES OF
|
|
56
|
+
AMERICA. BY USING, MODIFYING, OR DISSEMINATING THIS SOURCE CODE, YOU ACCEPT
|
|
57
|
+
THE TERMS AND CONDITIONS IN THE NRL OPEN LICENSE AGREEMENT. USE, MODIFICATION,
|
|
58
|
+
AND DISSEMINATION ARE PERMITTED ONLY IN ACCORDANCE WITH THE TERMS AND
|
|
59
|
+
CONDITIONS OF THE NRL OPEN LICENSE AGREEMENT. NO OTHER RIGHTS OR LICENSES
|
|
60
|
+
ARE GRANTED. UNAUTHORIZED USE, SALE, CONVEYANCE, DISPOSITION, OR MODIFICATION
|
|
61
|
+
OF THIS SOURCE CODE MAY RESULT IN CIVIL PENALTIES AND/OR CRIMINAL PENALTIES
|
|
62
|
+
UNDER 18 U.S.C. § 641.
|
|
63
|
+
|
|
64
|
+
!########################################################################
|
|
65
|
+
|
|
66
|
+
7. Government Rights: In consideration of making the Computer Software
|
|
67
|
+
available to You, You irrevocably grant the Government, at no cost, unlimited
|
|
68
|
+
rights in any and all modifications to, and derivative works of, the Computer
|
|
69
|
+
Software. Upon request, You shall deliver to NRL, or another Federal component
|
|
70
|
+
or agency as NRL may designate, all modifications to and derivative works of
|
|
71
|
+
the Computer Software generated by You or that are in Your possession.
|
|
72
|
+
|
|
73
|
+
8. ALL MATERIAL IS PROVIDED “AS IS” AND WITHOUT ANY REPRESENTATION OR
|
|
74
|
+
WARRANTY, EXPRESS OR IMPLIED, INCLUDING WITHOUT ANY PARTICULAR PURPOSE
|
|
75
|
+
OR ANY WARRANTIES OF ACCURACY OR COMPLETENESS OR ANY WARRANTIES THAT THE
|
|
76
|
+
USE OF THE COMPUTER SOFTWARE WILL NOT INFRINGE OR VIOLATE ANY PATENT OR
|
|
77
|
+
OTHER PROPRIETARY RIGHTS OF ANY THIRD PARTY (WHETHER DIRECTLY OR INDIRECTLY).
|
|
78
|
+
|
|
79
|
+
9. Notice: You shall provide prominent notice on any derivative work of the
|
|
80
|
+
Computer Software, or in a file accompanying the Computer Software, that the
|
|
81
|
+
Computer Software was developed in part or in whole by NRL.
|
|
82
|
+
|
|
83
|
+
10. No Support. The Computer Software(s) is provided without any support or
|
|
84
|
+
maintenance, and without any obligation to provide modifications,
|
|
85
|
+
improvements, enhancements, or updates thereto. No oral or written
|
|
86
|
+
information or advice given by Federal employees shall create a warranty
|
|
87
|
+
or in any way modify this Agreement.
|
|
88
|
+
|
|
89
|
+
11. Export Control: This Agreement does not authorize any disclosure, export,
|
|
90
|
+
or deemed export of technical information, articles, or services, nor does it
|
|
91
|
+
authorize or approve the use of any exemption to the export licensing
|
|
92
|
+
requirements of the International Traffic in Arms Regulations (“ITAR”) or the
|
|
93
|
+
Export Administration Regulations (“EAR”). You shall ensure full compliance
|
|
94
|
+
with all applicable requirements and restrictions established in law and
|
|
95
|
+
regulation pertaining to United States export controls including the Arms
|
|
96
|
+
Export Control Act, the International Traffic in Arms Regulations, the Export
|
|
97
|
+
Control Reform Act, the Export Administration Regulations, and the Atomic
|
|
98
|
+
Energy Act.
|
|
99
|
+
|
|
100
|
+
12. Termination: The Government, either through NRL or another Federal
|
|
101
|
+
component or agency, may terminate this Agreement at any time. The Government
|
|
102
|
+
rights under Section 7 shall survive termination.
|
|
103
|
+
|
|
104
|
+
13. Liability: You shall be solely liable for all claims and/or damages which
|
|
105
|
+
may arise from Your use, storage or disposal of the Computer Software under
|
|
106
|
+
this Agreement. Nothing in this Agreement shall be construed as a waiver of
|
|
107
|
+
the sovereign immunity of the United States.
|
|
108
|
+
|
|
109
|
+
14. Indemnification: You agree on behalf of Yourself, and any successors in
|
|
110
|
+
interest or assignees of You, to hold harmless and indemnify the United States
|
|
111
|
+
from any claim for damages or injury to any person or property arising out of
|
|
112
|
+
the provision of the Computer Software. This will include any costs relating
|
|
113
|
+
to infringing a third party’s intellectual property rights.
|
|
114
|
+
|
|
115
|
+
15. Governing Law & Jurisdiction. If a dispute, controversy, or claim relating
|
|
116
|
+
to this Agreement shall arise, You agree to first attempt to settle such
|
|
117
|
+
matter through informal dispute resolution. If any such matter cannot be
|
|
118
|
+
resolved informally, applicable U.S. Federal laws shall govern this Agreement
|
|
119
|
+
for all purposes.
|
|
120
|
+
|
|
121
|
+
16. No Government Endorsement: You shall not make or include any statements
|
|
122
|
+
that imply NRL or another component or agency of the Federal Government
|
|
123
|
+
endorses You, Your work, or any product or service You offer.
|
|
124
|
+
|
|
125
|
+
17. Severability. If any provision or term of this Agreement is held to be
|
|
126
|
+
invalid by a court of competent jurisdiction, then such provision or term
|
|
127
|
+
will be enforced to the maximum extent possible and the remaining terms of
|
|
128
|
+
this Agreement will continue in full force and effect.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pluginify
|
|
3
|
+
Version: 0.0.0.post1.dev0
|
|
4
|
+
Summary: Pluginify package
|
|
5
|
+
License: LICENSE
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Author: Evan Rose
|
|
8
|
+
Requires-Python: >=3.11.0,<3.13.0
|
|
9
|
+
Classifier: License :: Other/Proprietary License
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
13
|
+
Provides-Extra: doc
|
|
14
|
+
Requires-Dist: docstring_parser
|
|
15
|
+
Requires-Dist: jsonschema (>4.18.0)
|
|
16
|
+
Requires-Dist: lexeme-type
|
|
17
|
+
Requires-Dist: platformdirs
|
|
18
|
+
Requires-Dist: pydantic (>=2.10.0)
|
|
19
|
+
Requires-Dist: pyyaml
|
|
20
|
+
Requires-Dist: sphinxcontrib-typer ; extra == "doc"
|
|
21
|
+
Requires-Dist: typer
|
|
22
|
+
Project-URL: Repository, https://github.com/NRLMMD-GEOIPS/pluginify
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
|
|
25
|
+
# # # This source code is subject to the license referenced at
|
|
26
|
+
# # # https://github.com/NRLMMD-GEOIPS.
|
|
27
|
+
|
|
28
|
+
Pluginify
|
|
29
|
+
=========
|
|
30
|
+
|
|
31
|
+
This repository contains everything necessary to fully register YAML and python classes
|
|
32
|
+
and/or modules as valid python plugin objects. A YAML-based plugin object essentially
|
|
33
|
+
acts as a configuration object for a class / module -based python plugin. The python
|
|
34
|
+
based plugins are then responsible for reading, manipulating, or outputting a dataset
|
|
35
|
+
in a certain format. For most python based plugins, we expect this dataset to be a valid
|
|
36
|
+
xarray.DataTree object.
|
|
37
|
+
|
|
38
|
+
No valid plugins should be stored in this package. Rather, this package contains all the
|
|
39
|
+
functionality to register, retrieve, and create your plugin objects via a unified
|
|
40
|
+
PluginRegistry class. This package can and is used alongside other packages such as
|
|
41
|
+
[GeoIPS](https://github.com/NRLMMD-GEOIPS/geoips) to handle their plugin-based
|
|
42
|
+
infrastructure.
|
|
43
|
+
|
|
44
|
+
Install pluginify package
|
|
45
|
+
-------------------------
|
|
46
|
+
Current status:
|
|
47
|
+
```bash
|
|
48
|
+
git clone https://github.com/NRLMMD-GEOIPS/pluginify.git
|
|
49
|
+
# cd to pluginify's top level dir
|
|
50
|
+
pip install -e .
|
|
51
|
+
```
|
|
52
|
+
In the future:
|
|
53
|
+
```bash
|
|
54
|
+
pip install pluginify
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Use pluginify
|
|
58
|
+
-------------
|
|
59
|
+
```bash
|
|
60
|
+
pluginify -h
|
|
61
|
+
# Top level commands without additional args
|
|
62
|
+
pluginify create
|
|
63
|
+
# OR
|
|
64
|
+
pluginify delete
|
|
65
|
+
```
|
|
66
|
+
|