GSEGUtils 0.5.2__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 (77) hide show
  1. gsegutils-0.5.2/.git_archival.txt +3 -0
  2. gsegutils-0.5.2/.gitattributes +1 -0
  3. gsegutils-0.5.2/.github/actions/setup-python-deps/action.yml +23 -0
  4. gsegutils-0.5.2/.github/workflows/ci.yml +88 -0
  5. gsegutils-0.5.2/.github/workflows/publish-pypi.yml +53 -0
  6. gsegutils-0.5.2/.github/workflows/publish-testpypi.yml +53 -0
  7. gsegutils-0.5.2/.github/workflows/release-please.yml +55 -0
  8. gsegutils-0.5.2/.gitignore +199 -0
  9. gsegutils-0.5.2/.license-header.txt +12 -0
  10. gsegutils-0.5.2/.pre-commit-config.yaml +61 -0
  11. gsegutils-0.5.2/.readthedocs.yaml +24 -0
  12. gsegutils-0.5.2/.release-please-manifest.json +3 -0
  13. gsegutils-0.5.2/CHANGELOG.md +280 -0
  14. gsegutils-0.5.2/CITATION.cff +47 -0
  15. gsegutils-0.5.2/LICENSE +35 -0
  16. gsegutils-0.5.2/MIGRATION-v1.0.md +198 -0
  17. gsegutils-0.5.2/PKG-INFO +147 -0
  18. gsegutils-0.5.2/README.md +70 -0
  19. gsegutils-0.5.2/docs/Makefile +20 -0
  20. gsegutils-0.5.2/docs/README.md +45 -0
  21. gsegutils-0.5.2/docs/make.bat +35 -0
  22. gsegutils-0.5.2/docs/source/API.rst +11 -0
  23. gsegutils-0.5.2/docs/source/BaseArrays.rst +140 -0
  24. gsegutils-0.5.2/docs/source/GSEGUtils.base_arrays.rst +10 -0
  25. gsegutils-0.5.2/docs/source/GSEGUtils.base_types.rst +54 -0
  26. gsegutils-0.5.2/docs/source/GSEGUtils.lazy_disk_cache.rst +10 -0
  27. gsegutils-0.5.2/docs/source/GSEGUtils.util.rst +9 -0
  28. gsegutils-0.5.2/docs/source/GSEGUtils.validators.rst +8 -0
  29. gsegutils-0.5.2/docs/source/LazyDiskCache.rst +5 -0
  30. gsegutils-0.5.2/docs/source/_static/gseg_utils_theme.css +7 -0
  31. gsegutils-0.5.2/docs/source/about.rst +75 -0
  32. gsegutils-0.5.2/docs/source/conf.py +79 -0
  33. gsegutils-0.5.2/docs/source/index.rst +19 -0
  34. gsegutils-0.5.2/mypy.ini +84 -0
  35. gsegutils-0.5.2/pyproject.toml +104 -0
  36. gsegutils-0.5.2/pyrightconfig.json +9 -0
  37. gsegutils-0.5.2/release-please-config.json +28 -0
  38. gsegutils-0.5.2/setup.cfg +4 -0
  39. gsegutils-0.5.2/src/GSEGUtils/__init__.py +53 -0
  40. gsegutils-0.5.2/src/GSEGUtils/__init__.pyi +48 -0
  41. gsegutils-0.5.2/src/GSEGUtils/_version.py +24 -0
  42. gsegutils-0.5.2/src/GSEGUtils/base_arrays.py +717 -0
  43. gsegutils-0.5.2/src/GSEGUtils/base_types.py +516 -0
  44. gsegutils-0.5.2/src/GSEGUtils/config.py +68 -0
  45. gsegutils-0.5.2/src/GSEGUtils/constants.py +40 -0
  46. gsegutils-0.5.2/src/GSEGUtils/generate_init_stubs.py +435 -0
  47. gsegutils-0.5.2/src/GSEGUtils/lazy_disk_cache/__init__.py +33 -0
  48. gsegutils-0.5.2/src/GSEGUtils/lazy_disk_cache/disk_backed_ndarray.py +171 -0
  49. gsegutils-0.5.2/src/GSEGUtils/lazy_disk_cache/disk_backed_store.py +500 -0
  50. gsegutils-0.5.2/src/GSEGUtils/lazy_disk_cache/lazy_disk_cache.py +543 -0
  51. gsegutils-0.5.2/src/GSEGUtils/logging_setup.py +109 -0
  52. gsegutils-0.5.2/src/GSEGUtils/py.typed +0 -0
  53. gsegutils-0.5.2/src/GSEGUtils/singleton.py +78 -0
  54. gsegutils-0.5.2/src/GSEGUtils/util.py +374 -0
  55. gsegutils-0.5.2/src/GSEGUtils/validators.py +759 -0
  56. gsegutils-0.5.2/src/GSEGUtils.egg-info/PKG-INFO +147 -0
  57. gsegutils-0.5.2/src/GSEGUtils.egg-info/SOURCES.txt +75 -0
  58. gsegutils-0.5.2/src/GSEGUtils.egg-info/dependency_links.txt +1 -0
  59. gsegutils-0.5.2/src/GSEGUtils.egg-info/requires.txt +18 -0
  60. gsegutils-0.5.2/src/GSEGUtils.egg-info/scm_file_list.json +71 -0
  61. gsegutils-0.5.2/src/GSEGUtils.egg-info/scm_version.json +8 -0
  62. gsegutils-0.5.2/src/GSEGUtils.egg-info/top_level.txt +1 -0
  63. gsegutils-0.5.2/tests/benchmarks/__init__.py +6 -0
  64. gsegutils-0.5.2/tests/benchmarks/conftest.py +80 -0
  65. gsegutils-0.5.2/tests/benchmarks/test_lazy_disk_cache.py +83 -0
  66. gsegutils-0.5.2/tests/benchmarks/test_singleton.py +38 -0
  67. gsegutils-0.5.2/tests/test_base_arrays.py +1031 -0
  68. gsegutils-0.5.2/tests/test_base_types.py +0 -0
  69. gsegutils-0.5.2/tests/test_constants.py +31 -0
  70. gsegutils-0.5.2/tests/test_generate_init_stubs.py +208 -0
  71. gsegutils-0.5.2/tests/test_lazy_disk_cache.py +881 -0
  72. gsegutils-0.5.2/tests/test_pydantic_library.py +157 -0
  73. gsegutils-0.5.2/tests/test_singleton.py +118 -0
  74. gsegutils-0.5.2/tests/test_util.py +225 -0
  75. gsegutils-0.5.2/tests/test_validators.py +922 -0
  76. gsegutils-0.5.2/tests/test_validators_contract.py +73 -0
  77. gsegutils-0.5.2/tests/utils.py +18 -0
@@ -0,0 +1,3 @@
1
+ node: $Format:%H$
2
+ node-date: $Format:%cI$
3
+ describe-name:$Format:%(describe:tags=true,match=v*,match=release-*)$
@@ -0,0 +1 @@
1
+ .git_archival.txt export-subst
@@ -0,0 +1,23 @@
1
+ name: Setup Python + deps (GSEGUtils)
2
+ description: >
3
+ Set up Python 3.12, restore pip cache, and install GSEGUtils[dev]. The
4
+ caller MUST run `actions/checkout` BEFORE invoking this composite —
5
+ GitHub needs the repo on the runner filesystem to find this action.yml.
6
+ Intentionally asymmetric with the pchandler variant — omits the
7
+ deploy-key SSH step (no cross-repo git+ssh dep). See pchandler workspace
8
+ Phase 8 CONTEXT.md Claude's Discretion §Composite action scope.
9
+
10
+ runs:
11
+ using: composite
12
+ steps:
13
+ - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
14
+ with:
15
+ python-version: "3.12"
16
+
17
+ - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
18
+ with:
19
+ path: ~/.cache/pip
20
+ key: pip-${{ runner.os }}-3.12-${{ hashFiles('pyproject.toml') }}
21
+
22
+ - shell: bash
23
+ run: pip install .[dev]
@@ -0,0 +1,88 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main, refactor/gsd]
7
+
8
+ jobs:
9
+ lint:
10
+ name: Lint (pre-commit)
11
+ runs-on: ubuntu-latest
12
+
13
+ permissions:
14
+ contents: write
15
+ pull-requests: write
16
+
17
+ steps:
18
+ - name: Checkout
19
+ uses: actions/checkout@v4
20
+ with:
21
+ # On PRs, check out the head branch so pushes work
22
+ ref: ${{ github.event_name == 'pull_request' && github.head_ref || '' }}
23
+ token: ${{ secrets.GITHUB_TOKEN }}
24
+ fetch-depth: 0
25
+
26
+ - uses: actions/setup-python@v5
27
+ with:
28
+ python-version: "3.12"
29
+
30
+ - name: Run pre-commit on PRs
31
+ if: github.event_name == 'pull_request'
32
+ uses: pre-commit/action@v3.0.1
33
+ with:
34
+ extra_args: --all-files
35
+
36
+ - name: Run pre-commit on push
37
+ if: github.event_name == 'push'
38
+ uses: pre-commit/action@v3.0.1
39
+ with:
40
+ extra_args: --all-files
41
+
42
+ tests:
43
+ name: Tests (pytest)
44
+ needs: [lint]
45
+ runs-on: ubuntu-latest
46
+ steps:
47
+ - uses: actions/checkout@v4
48
+
49
+ - uses: actions/setup-python@v5
50
+ with:
51
+ python-version: "3.12"
52
+
53
+ - name: Cache pip
54
+ uses: actions/cache@v4
55
+ with:
56
+ path: ~/.cache/pip
57
+ key: pip-${{ runner.os }}-3.12-${{ hashFiles('pyproject.toml') }}
58
+
59
+ - name: Install dev deps
60
+ run: pip install .[dev]
61
+
62
+ - name: Pyright (informational)
63
+ id: pyright
64
+ continue-on-error: true
65
+ uses: jakebailey/pyright-action@v3
66
+ with:
67
+ annotate: warnings
68
+ # NOTE: leave the `warnings` input UNSET — setting it to `true` would
69
+ # ESCALATE warnings to exit 1 (Pitfall 2 in 01-RESEARCH.md). The
70
+ # warn-only semantics come from the step-level continue-on-error flag.
71
+ working-directory: .
72
+
73
+ - name: Upload pyright report
74
+ if: always()
75
+ uses: actions/upload-artifact@v4
76
+ with:
77
+ name: pyright-report-${{ github.run_id }}
78
+ path: .pyright-report.json
79
+ if-no-files-found: ignore
80
+
81
+ - name: Run tests
82
+ run: pytest -m "not benchmark" --cov=GSEGUtils --cov-report=xml
83
+
84
+ - name: Upload coverage to Codecov
85
+ if: success()
86
+ uses: codecov/codecov-action@v4
87
+ with:
88
+ token: ${{ secrets.CODECOV_TOKEN }}
@@ -0,0 +1,53 @@
1
+ name: Publish to PyPI
2
+
3
+ "on":
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ build:
9
+ name: Build distribution
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: read
13
+ steps:
14
+ - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
15
+ with:
16
+ fetch-depth: 0
17
+ fetch-tags: true
18
+
19
+ - uses: ./.github/actions/setup-python-deps
20
+
21
+ - name: Build wheel and sdist
22
+ run: |
23
+ pip install build
24
+ python -m build --wheel --sdist
25
+
26
+ - name: Upload dist artifacts
27
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
28
+ with:
29
+ name: dist-${{ github.run_id }}
30
+ path: dist/
31
+ retention-days: 1
32
+
33
+ publish-to-pypi:
34
+ name: Publish to PyPI
35
+ needs: build
36
+ runs-on: ubuntu-latest
37
+ environment:
38
+ name: pypi
39
+ url: https://pypi.org/p/GSEGUtils
40
+ permissions:
41
+ id-token: write # OIDC token for trusted publisher + Sigstore signing
42
+ attestations: write # per PYPI-01 locked spec
43
+ steps:
44
+ - name: Download dist artifacts
45
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
46
+ with:
47
+ name: dist-${{ github.run_id }}
48
+ path: dist/
49
+
50
+ - name: Publish to PyPI
51
+ uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
52
+ # attestations: true is the default — PEP 740 attestation auto-produced by the action
53
+ # No repository-url override (defaults to https://upload.pypi.org/legacy/)
@@ -0,0 +1,53 @@
1
+ name: Publish to TestPyPI
2
+
3
+ "on":
4
+ workflow_dispatch:
5
+
6
+ jobs:
7
+ build:
8
+ name: Build distribution (TestPyPI)
9
+ runs-on: ubuntu-latest
10
+ permissions:
11
+ contents: read
12
+ steps:
13
+ - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
14
+ with:
15
+ fetch-depth: 0
16
+ fetch-tags: true
17
+
18
+ - uses: ./.github/actions/setup-python-deps
19
+
20
+ - name: Build wheel and sdist
21
+ run: |
22
+ pip install build
23
+ python -m build --wheel --sdist
24
+
25
+ - name: Upload dist artifacts
26
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
27
+ with:
28
+ name: dist-testpypi-${{ github.run_id }}
29
+ path: dist/
30
+ retention-days: 1
31
+
32
+ publish-to-testpypi:
33
+ name: Publish to TestPyPI
34
+ needs: build
35
+ runs-on: ubuntu-latest
36
+ environment:
37
+ name: testpypi
38
+ url: https://test.pypi.org/p/GSEGUtils
39
+ permissions:
40
+ id-token: write # OIDC token for trusted publisher (D-09: no attestations:write)
41
+ steps:
42
+ - name: Download dist artifacts
43
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
44
+ with:
45
+ name: dist-testpypi-${{ github.run_id }}
46
+ path: dist/
47
+
48
+ - name: Publish to TestPyPI
49
+ uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
50
+ with:
51
+ repository-url: https://test.pypi.org/legacy/
52
+ attestations: false # D-09: TestPyPI PEP 740 support inconsistent; dry-run proves pipeline not signing
53
+ skip-existing: true # allow repeat dispatches from same HEAD without failure (RESEARCH Pitfall 2)
@@ -0,0 +1,55 @@
1
+ name: release-please
2
+ on:
3
+ workflow_run:
4
+ workflows:
5
+ - CI
6
+ types: [completed]
7
+ branches:
8
+ - main
9
+
10
+ permissions:
11
+ contents: write
12
+ pull-requests: write
13
+ issues: write
14
+
15
+ jobs:
16
+ release-please:
17
+ if: ${{ github.event.workflow_run.conclusion == 'success' }}
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - id: app-token
21
+ uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
22
+ with:
23
+ app-id: ${{ secrets.APP_ID }}
24
+ private-key: ${{ secrets.APP_PRIVATE_KEY }}
25
+
26
+ - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1
27
+ with:
28
+ fetch-depth: 0
29
+ fetch-tags: true
30
+ token: ${{ steps.app-token.outputs.token }}
31
+
32
+ - uses: googleapis/release-please-action@45996ed1f6d02564a971a2fa1b5860e934307cf7 # v5.0.0
33
+ id: release
34
+ with:
35
+ token: ${{ steps.app-token.outputs.token }}
36
+ config-file: release-please-config.json
37
+ # release-type: python
38
+
39
+ - name: Tag major and minor versions
40
+ if: ${{ steps.release.outputs.release_created == 'true' }}
41
+ run: |
42
+ git config user.name github-actions[bot]
43
+ git config user.email 41898282+github-actions[bot]@users.noreply.github.com
44
+
45
+ # Clean up old tags if they exist
46
+ git tag -d v${{ steps.release.outputs.major }} || true
47
+ git tag -d v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }} || true
48
+ git push origin :refs/tags/v${{ steps.release.outputs.major }} || true
49
+ git push origin :refs/tags/v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }} || true
50
+
51
+ # Create and push new tags
52
+ git tag -a v${{ steps.release.outputs.major }} -m "Release v${{ steps.release.outputs.major }}"
53
+ git tag -a v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }} -m "Release v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}"
54
+ git push origin v${{ steps.release.outputs.major }}
55
+ git push origin v${{ steps.release.outputs.major }}.${{ steps.release.outputs.minor }}
@@ -0,0 +1,199 @@
1
+ # Actions
2
+ src/**/_version.py
3
+
4
+ # Old files
5
+ _old/
6
+ _scrap/
7
+ _future/
8
+
9
+
10
+ # BAK files
11
+ **/*.bak
12
+
13
+ # Created by .ignore support plugin (hsz.mobi)
14
+ ### Python template
15
+ # Byte-compiled / optimized / DLL files
16
+ __pycache__/
17
+ *.py[cod]
18
+ *$py.class
19
+
20
+ # C extensions
21
+ *.so
22
+
23
+ # Distribution / packaging
24
+ .Python
25
+ env/
26
+ build/
27
+ develop-eggs/
28
+ dist/
29
+ downloads/
30
+ eggs/
31
+ .eggs/
32
+ lib/
33
+ lib64/
34
+ parts/
35
+ sdist/
36
+ var/
37
+ *.egg-info/
38
+ .installed.cfg
39
+ *.egg
40
+
41
+ # PyInstaller
42
+ # Usually these files are written by a python script from a template
43
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
44
+ *.manifest
45
+ *.spec
46
+
47
+ # Installer logs
48
+ pip-log.txt
49
+ pip-delete-this-directory.txt
50
+
51
+ # Unit test / coverage reports
52
+ htmlcov/
53
+ .tox/
54
+ .coverage
55
+ .coverage.*
56
+ .cache
57
+ nosetests.xml
58
+ coverage.xml
59
+ *,cover
60
+ .hypothesis/
61
+
62
+ # Translations
63
+ *.mo
64
+ *.pot
65
+
66
+ # Django stuff:
67
+ *.log
68
+ local_settings.py
69
+
70
+ # Flask stuff:
71
+ instance/
72
+ .webassets-cache
73
+
74
+ # Scrapy stuff:
75
+ .scrapy
76
+
77
+ # Sphinx documentation
78
+ docs/_build/
79
+
80
+ # PyBuilder
81
+ target/
82
+
83
+ # IPython Notebook
84
+ .ipynb_checkpoints
85
+
86
+ # pyenv
87
+ .python-version
88
+
89
+ # celery beat schedule file
90
+ celerybeat-schedule
91
+
92
+ # dotenv
93
+ .env
94
+
95
+ # virtualenv
96
+ venv/
97
+ ENV/
98
+
99
+ # Spyder project settings
100
+ .spyderproject
101
+
102
+ # Rope project settings
103
+ .ropeproject
104
+ ### VirtualEnv template
105
+ # Virtualenv
106
+ # http://iamzed.com/2009/05/07/a-primer-on-virtualenv/
107
+ [Bb]in
108
+ [Ii]nclude
109
+ [Ll]ib
110
+ [Ll]ib64
111
+ [Ll]ocal
112
+ [Ss]cripts
113
+ pyvenv.cfg
114
+ .venv
115
+ pip-selfcheck.json
116
+
117
+ ### JetBrains template
118
+ # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
119
+ # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
120
+
121
+ # User-specific stuff
122
+ .idea/**/workspace.xml
123
+ .idea/**/tasks.xml
124
+ .idea/**/usage.statistics.xml
125
+ .idea/**/dictionaries
126
+ .idea/**/shelf
127
+
128
+ # AWS User-specific
129
+ .idea/**/aws.xml
130
+
131
+ # Generated files
132
+ .idea/**/contentModel.xml
133
+
134
+ # Sensitive or high-churn files
135
+ .idea/**/dataSources/
136
+ .idea/**/dataSources.ids
137
+ .idea/**/dataSources.local.xml
138
+ .idea/**/sqlDataSources.xml
139
+ .idea/**/dynamic.xml
140
+ .idea/**/uiDesigner.xml
141
+ .idea/**/dbnavigator.xml
142
+
143
+ # Gradle
144
+ .idea/**/gradle.xml
145
+ .idea/**/libraries
146
+
147
+ # Gradle and Maven with auto-import
148
+ # When using Gradle or Maven with auto-import, you should exclude module files,
149
+ # since they will be recreated, and may cause churn. Uncomment if using
150
+ # auto-import.
151
+ # .idea/artifacts
152
+ # .idea/compiler.xml
153
+ # .idea/jarRepositories.xml
154
+ # .idea/modules.xml
155
+ # .idea/*.iml
156
+ # .idea/modules
157
+ # *.iml
158
+ # *.ipr
159
+
160
+ # CMake
161
+ cmake-build-*/
162
+
163
+ # Mongo Explorer plugin
164
+ .idea/**/mongoSettings.xml
165
+
166
+ # File-based project format
167
+ *.iws
168
+
169
+ # IntelliJ
170
+ out/
171
+
172
+ # mpeltonen/sbt-idea plugin
173
+ .idea_modules/
174
+
175
+ # JIRA plugin
176
+ atlassian-ide-plugin.xml
177
+
178
+ # Cursive Clojure plugin
179
+ .idea/replstate.xml
180
+
181
+ # SonarLint plugin
182
+ .idea/sonarlint/
183
+
184
+ # Crashlytics plugin (for Android Studio and IntelliJ)
185
+ com_crashlytics_export_strings.xml
186
+ crashlytics.properties
187
+ crashlytics-build.properties
188
+ fabric.properties
189
+
190
+ # Editor-based Rest Client
191
+ .idea/httpRequests
192
+
193
+ # Android studio 3.1+ serialized cache file
194
+ .idea/caches/build_file_checksums.ser
195
+
196
+ # idea folder, uncomment if you don't need it
197
+ .idea/
198
+
199
+ .vscode/
@@ -0,0 +1,12 @@
1
+ GSEGUtils – General utility functions and classes for GSEG research/projects
2
+
3
+ Copyright (c) 2025–2026 ETH Zurich
4
+ Department of Civil, Environmental and Geomatic Engineering (D-BAUG)
5
+ Institute of Geodesy and Photogrammetry
6
+ Geosensors and Engineering Geodesy
7
+
8
+ Authors:
9
+ Nicholas Meyer
10
+ Jon Allemand
11
+
12
+ SPDX-License-Identifier: BSD-3-Clause
@@ -0,0 +1,61 @@
1
+ repos:
2
+ - repo: https://github.com/Lucas-C/pre-commit-hooks
3
+ rev: v1.5.4
4
+ hooks:
5
+ - id: insert-license
6
+ name: Insert project banner into Python files
7
+ files: ^src/.*\.(py|pyi)$
8
+ exclude: ^(?:tests/|examples/|\.venv/|venv/|\.git/|build/|dist/|docs/_build/|\.mypy_cache/|\.pytest_cache/|\.ruff_cache/|\.tox/|\.eggs/|site-packages/)
9
+ args:
10
+ - --license-filepath=.license-header.txt
11
+ - --comment-style=#
12
+ - --use-current-year
13
+ - --allow-past-years
14
+ - --detect-license-in-X-top-lines=30
15
+
16
+ - repo: https://github.com/pre-commit/pre-commit-hooks
17
+ rev: v5.0.0
18
+ hooks:
19
+ - id: trailing-whitespace
20
+ - id: end-of-file-fixer
21
+ - id: check-yaml
22
+ - id: check-toml
23
+ - id: check-added-large-files
24
+
25
+ - repo: https://github.com/astral-sh/ruff-pre-commit
26
+ rev: v0.15.12
27
+ hooks:
28
+ - id: ruff-check
29
+ args: ["--fix"]
30
+ - id: ruff-format
31
+
32
+ - repo: https://github.com/pre-commit/mirrors-mypy
33
+ rev: v1.17.1
34
+ hooks:
35
+ - id: mypy
36
+ args: ["--config-file", "mypy.ini"]
37
+ pass_filenames: false
38
+ # The pydantic.mypy plugin is loaded by mypy at startup (see mypy.ini
39
+ # `plugins = pydantic.mypy`). mirrors-mypy runs in an isolated venv,
40
+ # so plugin packages must be declared as additional_dependencies here.
41
+ additional_dependencies:
42
+ - "pydantic~=2.11"
43
+ - "numpy>=2.0,<2.4"
44
+ - "numpydantic~=1.10"
45
+
46
+ - repo: local
47
+ hooks:
48
+ - id: pyright-informational
49
+ name: pyright (informational, never blocks)
50
+ # language: python + additional_dependencies so the hook works in CI
51
+ # (lint job installs only `pre-commit` — no system pyright). The pip
52
+ # `pyright` package fetches its Node binary at install time. Local dev
53
+ # already has pyright via `pip install -e .[dev]`, so this is a no-op
54
+ # there. The `|| true` keeps the hook non-blocking regardless.
55
+ entry: bash -c 'pyright "$@" || true' --
56
+ language: python
57
+ additional_dependencies: ["pyright~=1.1"]
58
+ types: [python]
59
+ require_serial: true
60
+ pass_filenames: false
61
+ verbose: true
@@ -0,0 +1,24 @@
1
+ # Read the Docs configuration file
2
+ # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
3
+
4
+ # Required
5
+ version: 2
6
+
7
+ # Set the OS, Python version, and other tools you might need
8
+ build:
9
+ os: ubuntu-24.04
10
+ tools:
11
+ python: "3.12"
12
+ jobs:
13
+ post_build:
14
+ - if [ -f "$READTHEDOCS_OUTPUT/html/LICENSE" ]; then mv "$READTHEDOCS_OUTPUT/html/LICENSE" "$READTHEDOCS_OUTPUT/html/LICENSE.txt"; fi
15
+
16
+ sphinx:
17
+ configuration: docs/source/conf.py
18
+
19
+ python:
20
+ install:
21
+ - method: pip
22
+ path: .
23
+ extra_requirements:
24
+ - doc
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.5.2"
3
+ }