pyspart 0.6.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.
Files changed (100) hide show
  1. pyspart-0.6.0/.editorconfig +23 -0
  2. pyspart-0.6.0/.gitattributes +53 -0
  3. pyspart-0.6.0/.github/FUNDING.yml +1 -0
  4. pyspart-0.6.0/.github/ISSUE_TEMPLATE/bug_report.md +25 -0
  5. pyspart-0.6.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  6. pyspart-0.6.0/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  7. pyspart-0.6.0/.github/workflows/benches.yml +40 -0
  8. pyspart-0.6.0/.github/workflows/lints.yml +49 -0
  9. pyspart-0.6.0/.github/workflows/publish.yml +41 -0
  10. pyspart-0.6.0/.github/workflows/publish_py.yml +185 -0
  11. pyspart-0.6.0/.github/workflows/tests.yml +60 -0
  12. pyspart-0.6.0/.gitignore +101 -0
  13. pyspart-0.6.0/.pre-commit-config.yaml +49 -0
  14. pyspart-0.6.0/AGENTS.md +340 -0
  15. pyspart-0.6.0/CLAUDE.md +1 -0
  16. pyspart-0.6.0/CODE_OF_CONDUCT.md +3 -0
  17. pyspart-0.6.0/CONTRIBUTING.md +53 -0
  18. pyspart-0.6.0/Cargo.lock +1043 -0
  19. pyspart-0.6.0/Cargo.toml +87 -0
  20. pyspart-0.6.0/LICENSE-APACHE +201 -0
  21. pyspart-0.6.0/LICENSE-MIT +21 -0
  22. pyspart-0.6.0/Makefile +219 -0
  23. pyspart-0.6.0/PKG-INFO +248 -0
  24. pyspart-0.6.0/README.md +229 -0
  25. pyspart-0.6.0/ROADMAP.md +46 -0
  26. pyspart-0.6.0/benches/bench_delete.rs +185 -0
  27. pyspart-0.6.0/benches/bench_insert.rs +212 -0
  28. pyspart-0.6.0/benches/bench_insert_bulk.rs +159 -0
  29. pyspart-0.6.0/benches/bench_knn_search.rs +189 -0
  30. pyspart-0.6.0/benches/bench_range_search.rs +314 -0
  31. pyspart-0.6.0/benches/bench_serialization.rs +135 -0
  32. pyspart-0.6.0/benches/main.rs +22 -0
  33. pyspart-0.6.0/benches/shared.rs +70 -0
  34. pyspart-0.6.0/codecov.yml +4 -0
  35. pyspart-0.6.0/examples/README.md +9 -0
  36. pyspart-0.6.0/examples/kdtree.rs +99 -0
  37. pyspart-0.6.0/examples/octree.rs +61 -0
  38. pyspart-0.6.0/examples/quadtree.rs +59 -0
  39. pyspart-0.6.0/examples/rstar_tree.rs +95 -0
  40. pyspart-0.6.0/examples/rtree.rs +93 -0
  41. pyspart-0.6.0/logo.svg +29 -0
  42. pyspart-0.6.0/py.typed +0 -0
  43. pyspart-0.6.0/pyproject.toml +46 -0
  44. pyspart-0.6.0/pyspart/Cargo.toml +18 -0
  45. pyspart-0.6.0/pyspart/LICENSE-MIT +21 -0
  46. pyspart-0.6.0/pyspart/README.md +219 -0
  47. pyspart-0.6.0/pyspart/examples/README.md +9 -0
  48. pyspart-0.6.0/pyspart/examples/kdtree.py +67 -0
  49. pyspart-0.6.0/pyspart/examples/octree.py +51 -0
  50. pyspart-0.6.0/pyspart/examples/quadtree.py +44 -0
  51. pyspart-0.6.0/pyspart/examples/rstar_tree.py +77 -0
  52. pyspart-0.6.0/pyspart/examples/rtree.py +75 -0
  53. pyspart-0.6.0/pyspart/py.typed +0 -0
  54. pyspart-0.6.0/pyspart/pyspart.pyi +739 -0
  55. pyspart-0.6.0/pyspart/src/geometry.rs +76 -0
  56. pyspart-0.6.0/pyspart/src/kdtree.rs +288 -0
  57. pyspart-0.6.0/pyspart/src/lib.rs +78 -0
  58. pyspart-0.6.0/pyspart/src/octree.rs +185 -0
  59. pyspart-0.6.0/pyspart/src/point2d.rs +83 -0
  60. pyspart-0.6.0/pyspart/src/point3d.rs +87 -0
  61. pyspart-0.6.0/pyspart/src/quadtree.rs +188 -0
  62. pyspart-0.6.0/pyspart/src/rstar_tree.rs +283 -0
  63. pyspart-0.6.0/pyspart/src/rtree.rs +283 -0
  64. pyspart-0.6.0/pyspart/src/types.rs +98 -0
  65. pyspart-0.6.0/pyspart/tests/test_advanced_scenarios.py +579 -0
  66. pyspart-0.6.0/pyspart/tests/test_bulk_insert.py +131 -0
  67. pyspart-0.6.0/pyspart/tests/test_core_types.py +327 -0
  68. pyspart-0.6.0/pyspart/tests/test_edge_cases.py +255 -0
  69. pyspart-0.6.0/pyspart/tests/test_serialization.py +182 -0
  70. pyspart-0.6.0/pyspart/tests/test_serialization_integration.py +540 -0
  71. pyspart-0.6.0/pyspart.pyi +739 -0
  72. pyspart-0.6.0/rust-toolchain.toml +3 -0
  73. pyspart-0.6.0/src/errors.rs +90 -0
  74. pyspart-0.6.0/src/geometry.rs +1226 -0
  75. pyspart-0.6.0/src/index.rs +132 -0
  76. pyspart-0.6.0/src/kdtree.rs +1140 -0
  77. pyspart-0.6.0/src/knn.rs +177 -0
  78. pyspart-0.6.0/src/lib.rs +43 -0
  79. pyspart-0.6.0/src/octree.rs +793 -0
  80. pyspart-0.6.0/src/quadtree.rs +733 -0
  81. pyspart-0.6.0/src/rstar_tree.rs +1156 -0
  82. pyspart-0.6.0/src/rtree.rs +1048 -0
  83. pyspart-0.6.0/src/rtree_common.rs +586 -0
  84. pyspart-0.6.0/tests/README.md +11 -0
  85. pyspart-0.6.0/tests/common.rs +141 -0
  86. pyspart-0.6.0/tests/test_completeness.rs +923 -0
  87. pyspart-0.6.0/tests/test_integration_kdtree.rs +213 -0
  88. pyspart-0.6.0/tests/test_integration_octree.rs +97 -0
  89. pyspart-0.6.0/tests/test_integration_quadtree.rs +95 -0
  90. pyspart-0.6.0/tests/test_integration_rstar_tree.rs +244 -0
  91. pyspart-0.6.0/tests/test_integration_rtree.rs +244 -0
  92. pyspart-0.6.0/tests/test_proptest_geometry.rs +134 -0
  93. pyspart-0.6.0/tests/test_proptest_kdtree.rs +164 -0
  94. pyspart-0.6.0/tests/test_proptest_octree.rs +59 -0
  95. pyspart-0.6.0/tests/test_proptest_quadtree.rs +59 -0
  96. pyspart-0.6.0/tests/test_proptest_rstar_tree.rs +131 -0
  97. pyspart-0.6.0/tests/test_proptest_rtree.rs +175 -0
  98. pyspart-0.6.0/tests/test_serialization.rs +131 -0
  99. pyspart-0.6.0/tests/test_spatial_index.rs +515 -0
  100. pyspart-0.6.0/uv.lock +768 -0
@@ -0,0 +1,23 @@
1
+ # https://editorconfig.org/
2
+ root = true
3
+
4
+ [*]
5
+ charset = utf-8
6
+ end_of_line = lf
7
+ indent_style = space
8
+ indent_size = 4
9
+ insert_final_newline = true
10
+ trim_trailing_whitespace = true
11
+
12
+ [*.{rs,py,pyi}]
13
+ max_line_length = 100
14
+
15
+ [*.md]
16
+ max_line_length = 150
17
+ trim_trailing_whitespace = false
18
+
19
+ [*.sh]
20
+ indent_size = 2
21
+
22
+ [*.{yaml,yml,json}]
23
+ indent_size = 2
@@ -0,0 +1,53 @@
1
+ # Normalize all text files to LF line endings
2
+ * text=auto eol=lf
3
+
4
+ # Go source files
5
+ *.go text
6
+ *.mod text
7
+ *.sum text
8
+
9
+ # Markdown and documentation files
10
+ *.md text
11
+ *.rst text
12
+
13
+ # JSON, YAML, and configuration files
14
+ *.json text
15
+ *.yaml text
16
+ *.yml text
17
+ *.toml text
18
+
19
+ # Shell scripts
20
+ *.sh text eol=lf
21
+
22
+ # Static files
23
+ *.html text
24
+ *.css text
25
+ *.js text
26
+ *.svg text
27
+ *.xml text
28
+
29
+ # Large assets (use Git LFS)
30
+ *.png filter=lfs diff=lfs merge=lfs -text
31
+ *.jpg filter=lfs diff=lfs merge=lfs -text
32
+ *.jpeg filter=lfs diff=lfs merge=lfs -text
33
+ *.gif filter=lfs diff=lfs merge=lfs -text
34
+ *.ico filter=lfs diff=lfs merge=lfs -text
35
+ *.mp4 filter=lfs diff=lfs merge=lfs -text
36
+ *.mov filter=lfs diff=lfs merge=lfs -text
37
+ *.zip filter=lfs diff=lfs merge=lfs -text
38
+ *.tar filter=lfs diff=lfs merge=lfs -text
39
+ *.gz filter=lfs diff=lfs merge=lfs -text
40
+ *.tgz filter=lfs diff=lfs merge=lfs -text
41
+
42
+ # Font files (binary, tracked via LFS)
43
+ *.ttf filter=lfs diff=lfs merge=lfs -text
44
+ *.woff filter=lfs diff=lfs merge=lfs -text
45
+ *.woff2 filter=lfs diff=lfs merge=lfs -text
46
+
47
+ # Build artifacts (binary, optional LFS tracking)
48
+ *.exe filter=lfs diff=lfs merge=lfs -text
49
+ *.dll filter=lfs diff=lfs merge=lfs -text
50
+ *.so filter=lfs diff=lfs merge=lfs -text
51
+ *.out filter=lfs diff=lfs merge=lfs -text
52
+ *.a filter=lfs diff=lfs merge=lfs -text
53
+ *.o filter=lfs diff=lfs merge=lfs -text
@@ -0,0 +1 @@
1
+ github: [ habedi ]
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: Bug report
3
+ about: Create a report to help us improve
4
+ title: ''
5
+ labels: bug
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Describe the bug**
11
+ A clear and concise description of what the bug is.
12
+
13
+ **To Reproduce**
14
+ Steps to reproduce the behavior:
15
+
16
+ 1.
17
+
18
+ **Expected behavior**
19
+ A clear and concise description of what you expected to happen.
20
+
21
+ **Logs**
22
+ If applicable, add logs to help explain your problem.
23
+
24
+ **Additional context**
25
+ Add any other context about the problem here.
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Discussions
4
+ url: https://github.com/habedi/spart/discussions
5
+ about: Please ask and answer general questions here
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an idea for this project
4
+ title: ''
5
+ labels: enhancement
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Is your feature request related to a problem? Please describe.**
11
+ A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12
+
13
+ **Describe the solution you'd like**
14
+ A clear and concise description of what you want to happen.
15
+
16
+ **Describe alternatives you've considered**
17
+ A clear and concise description of any alternative solutions or features you've considered.
18
+
19
+ **Additional context**
20
+ Add any other context or screenshots about the feature request here.
@@ -0,0 +1,40 @@
1
+ name: Run Benchmarks
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ schedule: # Run every day at midnight (UTC)
6
+ - cron: '0 0 * * *'
7
+
8
+ concurrency:
9
+ group: ${{ github.workflow }}-${{ github.ref }}
10
+ cancel-in-progress: true
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ jobs:
16
+ benchmarks:
17
+ runs-on: ubuntu-latest
18
+
19
+ strategy:
20
+ matrix:
21
+ rust-version: [ "1.85.0", "stable" ]
22
+
23
+ steps:
24
+ - name: Checkout repository
25
+ uses: actions/checkout@v4
26
+
27
+ - name: Set up Rust ${{ matrix.rust-version }}
28
+ uses: actions-rust-lang/setup-rust-toolchain@v1
29
+ with:
30
+ toolchain: ${{ matrix.rust-version }}
31
+ cache: true
32
+
33
+ - name: Install dependencies
34
+ run: |
35
+ sudo apt-get update
36
+ sudo apt-get install -y clang curl pkg-config libssl-dev make
37
+ make install-deps
38
+
39
+ - name: Run benchmarks
40
+ run: make bench
@@ -0,0 +1,49 @@
1
+ name: Run Linter Checks
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ schedule: # Run every day at midnight (UTC)
6
+ - cron: '0 0 * * *'
7
+ pull_request:
8
+ branches:
9
+ - main
10
+ paths-ignore:
11
+ - '**.md'
12
+ - 'docs/**'
13
+ push:
14
+ branches:
15
+ - main
16
+ - develop
17
+ paths-ignore:
18
+ - '**.md'
19
+ - 'docs/**'
20
+
21
+ concurrency:
22
+ group: ${{ github.workflow }}-${{ github.ref }}
23
+ cancel-in-progress: true
24
+
25
+ permissions:
26
+ contents: read
27
+
28
+ jobs:
29
+ lint:
30
+ runs-on: ubuntu-latest
31
+
32
+ steps:
33
+ - name: Checkout code
34
+ uses: actions/checkout@v4
35
+
36
+ - name: Set up Rust
37
+ uses: actions-rust-lang/setup-rust-toolchain@v1
38
+ with:
39
+ toolchain: '1.85.0'
40
+ cache: true
41
+
42
+ - name: Install dependencies
43
+ run: |
44
+ sudo apt-get update
45
+ sudo apt-get install -y clang curl pkg-config libssl-dev make
46
+ make install-deps
47
+
48
+ - name: Run linters
49
+ run: make lint
@@ -0,0 +1,41 @@
1
+ name: Publish to Crates.io
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ push:
6
+ tags:
7
+ - 'v*'
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+
14
+ # Run tests before publishing and only publish if tests pass
15
+ call_tests:
16
+ uses: ./.github/workflows/tests.yml
17
+
18
+ publish:
19
+ runs-on: ubuntu-latest
20
+ # Try to publish only if the tests pass
21
+ needs: call_tests
22
+ if: success()
23
+
24
+ steps:
25
+ - name: Checkout repository
26
+ uses: actions/checkout@v4
27
+
28
+ - name: Set up Rust
29
+ uses: actions-rust-lang/setup-rust-toolchain@v1
30
+ with:
31
+ toolchain: '1.85.0'
32
+
33
+ - name: Publish to Crates.io
34
+ env:
35
+ CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
36
+ run: |
37
+ sudo apt-get update
38
+ sudo apt-get install -y clang curl pkg-config libssl-dev make
39
+ make install-deps
40
+ cargo publish --token $CARGO_REGISTRY_TOKEN
41
+ continue-on-error: false
@@ -0,0 +1,185 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ push:
6
+ tags:
7
+ - 'v*'
8
+
9
+ concurrency:
10
+ group: ${{ github.workflow }}-${{ github.ref }}
11
+ cancel-in-progress: true
12
+
13
+ permissions:
14
+ contents: read
15
+
16
+ jobs:
17
+ build_wheels:
18
+ name: Wheel for ${{ matrix.target }}
19
+ runs-on: ${{ matrix.os }}
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ include:
24
+ - os: ubuntu-latest
25
+ target: x86_64-unknown-linux-gnu
26
+ zig: true
27
+ - os: ubuntu-latest
28
+ target: aarch64-unknown-linux-gnu
29
+ zig: true
30
+ # Linux, musl: Alpine and the images built on it.
31
+ - os: ubuntu-latest
32
+ target: x86_64-unknown-linux-musl
33
+ zig: true
34
+ - os: ubuntu-latest
35
+ target: aarch64-unknown-linux-musl
36
+ zig: true
37
+ - os: macos-14
38
+ target: aarch64-apple-darwin
39
+ zig: false
40
+ - os: macos-14
41
+ target: x86_64-apple-darwin
42
+ zig: false
43
+ # Windows. The runner is x86_64; the ARM64 wheel is cross-compiled.
44
+ - os: windows-latest
45
+ target: x86_64-pc-windows-msvc
46
+ zig: false
47
+ - os: windows-latest
48
+ target: aarch64-pc-windows-msvc
49
+ zig: false
50
+
51
+ steps:
52
+ - name: Checkout repository
53
+ uses: actions/checkout@v4
54
+
55
+ - name: Set up Python
56
+ uses: actions/setup-python@v5
57
+ with:
58
+ python-version: "3.10"
59
+
60
+ - name: Set up Rust
61
+ uses: dtolnay/rust-toolchain@stable
62
+
63
+ - name: Add the target to the pinned toolchain
64
+ run: rustup target add ${{ matrix.target }}
65
+ shell: bash
66
+
67
+ - name: Install Zig
68
+ uses: mlugg/setup-zig@v1
69
+ with:
70
+ version: 0.13.0
71
+ if: matrix.zig
72
+
73
+ - name: Install maturin
74
+ run: pip install maturin
75
+ shell: bash
76
+
77
+ - name: Build wheel
78
+ run: |
79
+ cd pyspart
80
+ maturin build --release --target ${{ matrix.target }} ${{ matrix.zig && '--zig' || '' }} --out dist
81
+ shell: bash
82
+
83
+ - name: Upload wheel as artifact
84
+ uses: actions/upload-artifact@v4
85
+ with:
86
+ name: wheel-${{ matrix.target }}
87
+ path: pyspart/dist/*.whl
88
+ if-no-files-found: error
89
+
90
+ build_sdist:
91
+ name: Source distribution
92
+ runs-on: ubuntu-latest
93
+ steps:
94
+ - name: Checkout repository
95
+ uses: actions/checkout@v4
96
+
97
+ - name: Set up Python
98
+ uses: actions/setup-python@v5
99
+ with:
100
+ python-version: "3.10"
101
+
102
+ - name: Set up Rust
103
+ uses: dtolnay/rust-toolchain@stable
104
+
105
+ - name: Install maturin
106
+ run: pip install maturin
107
+
108
+ - name: Build sdist
109
+ run: |
110
+ cd pyspart
111
+ maturin sdist --out dist
112
+
113
+ - name: Check the sdist builds and imports from source
114
+ run: |
115
+ python -m venv /tmp/sdist-check
116
+ /tmp/sdist-check/bin/pip install --upgrade pip
117
+ /tmp/sdist-check/bin/pip install pyspart/dist/*.tar.gz
118
+ /tmp/sdist-check/bin/python -c "
119
+ import pyspart as ps
120
+ boundary = {'x': 0.0, 'y': 0.0, 'width': 100.0, 'height': 100.0}
121
+ tree = ps.Quadtree(boundary, 4)
122
+ tree.insert(ps.Point2D(10.0, 10.0, 'a'))
123
+ assert len(tree) == 1
124
+ assert len(tree.range_search_bbox(boundary)) == 1
125
+ print('sdist builds and imports')
126
+ "
127
+
128
+ - name: Upload sdist as artifact
129
+ uses: actions/upload-artifact@v4
130
+ with:
131
+ name: sdist
132
+ path: pyspart/dist/*.tar.gz
133
+ if-no-files-found: error
134
+
135
+ publish_to_pypi:
136
+ name: Publish to PyPI
137
+ needs: [build_wheels, build_sdist]
138
+ runs-on: ubuntu-latest
139
+ if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
140
+
141
+ steps:
142
+ - name: Set up Python
143
+ uses: actions/setup-python@v5
144
+ with:
145
+ python-version: "3.10"
146
+
147
+ - name: Set up uv
148
+ uses: astral-sh/setup-uv@v6
149
+
150
+ - name: Download all artifacts
151
+ uses: actions/download-artifact@v4
152
+ with:
153
+ path: dist
154
+ merge-multiple: true
155
+
156
+ - name: Verify the distributions
157
+ run: |
158
+ ls -la dist/
159
+ count=$(ls -1 dist/*.whl | wc -l)
160
+ test "$count" -eq 8 || { echo "expected 8 wheels, found $count"; exit 1; }
161
+ test -n "$(ls -1 dist/*.tar.gz 2>/dev/null)" || { echo "no sdist found"; exit 1; }
162
+ python - <<'PY'
163
+ import email, glob, os, sys, zipfile
164
+
165
+ tag = os.environ.get("GITHUB_REF_NAME", "").lstrip("v")
166
+ wheels = sorted(glob.glob("dist/*.whl"))
167
+ versions = set()
168
+ for wheel in wheels:
169
+ with zipfile.ZipFile(wheel) as archive:
170
+ name = next(n for n in archive.namelist() if n.endswith(".dist-info/METADATA"))
171
+ meta = email.message_from_bytes(archive.read(name))
172
+ assert meta["Name"] == "pyspart", f"{wheel}: unexpected name {meta['Name']}"
173
+ versions.add(meta["Version"])
174
+ if len(versions) != 1:
175
+ sys.exit(f"wheels disagree on the version: {sorted(versions)}")
176
+ built = versions.pop()
177
+ if tag and built != tag:
178
+ sys.exit(f"tag {tag!r} does not match the built version {built!r}")
179
+ print(f"verified {len(wheels)} wheels and an sdist for pyspart {built}")
180
+ PY
181
+
182
+ - name: Publish to PyPI
183
+ env:
184
+ UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
185
+ run: uv publish --check-url https://pypi.org/simple/ dist/*
@@ -0,0 +1,60 @@
1
+ name: Run Tests
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ schedule: # Run every day at midnight (UTC)
6
+ - cron: '0 0 * * *'
7
+ workflow_call:
8
+ pull_request:
9
+ branches:
10
+ - main
11
+ paths-ignore:
12
+ - '**.md'
13
+ - 'docs/**'
14
+ push:
15
+ branches:
16
+ - main
17
+ - develop
18
+ paths-ignore:
19
+ - '**.md'
20
+ - 'docs/**'
21
+
22
+ concurrency:
23
+ group: ${{ github.workflow }}-${{ github.ref }}
24
+ cancel-in-progress: true
25
+
26
+ permissions:
27
+ contents: read
28
+
29
+ jobs:
30
+ tests:
31
+ runs-on: ubuntu-latest
32
+
33
+ strategy:
34
+ matrix:
35
+ rust-version: [ "1.85.0", "stable" ]
36
+
37
+ steps:
38
+ - name: Checkout repository
39
+ uses: actions/checkout@v4
40
+
41
+ - name: Set up Rust ${{ matrix.rust-version }}
42
+ uses: actions-rust-lang/setup-rust-toolchain@v1
43
+ with:
44
+ toolchain: ${{ matrix.rust-version }}
45
+ cache: true
46
+
47
+ - name: Install dependencies
48
+ run: |
49
+ sudo apt-get update
50
+ sudo apt-get install -y clang curl pkg-config libssl-dev make
51
+ make install-deps
52
+
53
+ - name: Run tests and generate coverage report
54
+ run: make coverage
55
+
56
+ - name: Upload coverage reports to Codecov
57
+ uses: codecov/codecov-action@v5
58
+ with:
59
+ token: ${{ secrets.CODECOV_TOKEN }}
60
+ continue-on-error: false
@@ -0,0 +1,101 @@
1
+ # Python specific
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # Virtual environments
7
+ .env/
8
+ env/
9
+ .venv/
10
+ venv/
11
+
12
+ # Packaging and distribution files
13
+ .Python
14
+ build/
15
+ dist/
16
+ *.egg-info/
17
+ *.egg
18
+ MANIFEST
19
+
20
+ # Dependency directories
21
+ develop-eggs/
22
+ downloads/
23
+ eggs/
24
+ .eggs/
25
+ lib/
26
+ lib64/
27
+ parts/
28
+ sdist/
29
+ var/
30
+ wheels/
31
+ .installed.cfg
32
+
33
+ # Test and coverage reports
34
+ htmlcov/
35
+ .tox/
36
+ .coverage
37
+ .coverage.*
38
+ .cache
39
+ nosetests.xml
40
+ coverage.xml
41
+ *.cover
42
+ .hypothesis/
43
+ .pytest_cache/
44
+
45
+ # IDE specific files and directories
46
+ .idea/
47
+ *.iml
48
+ .vscode/
49
+
50
+ # Jupyter Notebook files
51
+ .ipynb_checkpoints
52
+
53
+ # Temporary files created by editors and the system and folders to ignore
54
+ *.swp
55
+ *~
56
+ *.bak
57
+ *.tmp
58
+ temp/
59
+ tmp/
60
+
61
+ # Database files (SQLite, DuckDB, etc.)
62
+ *.duckdb
63
+ *.db
64
+ *.wal
65
+ *.sqlite
66
+
67
+ # Dependency lock files (uncomment to ignore)
68
+ poetry.lock
69
+
70
+ # Rust specific
71
+ /target/
72
+ .cargo-ok
73
+ cobertura.xml
74
+ tarpaulin-report.html
75
+
76
+ # Comment out the next line if you want to checkin your lock file for Cargo
77
+ Cargo.lock
78
+
79
+ # Miscellaneous files and directories to ignore
80
+ # Add any additional file patterns a directory names that should be ignored down here
81
+ .DS_Store
82
+ quadtree-zng
83
+ quadtree-zng.exe
84
+ kdtree_2d.dot
85
+ kdtree_3d.dot
86
+ octree.dot
87
+ quadtree.dot
88
+ rtree_2d.dot
89
+ rtree_3d.dot
90
+ src/main.rs
91
+ .benchmarks
92
+ *.log
93
+ *_output.txt
94
+ pyspart/target/
95
+ .output.txt
96
+ *.proptest-regressions
97
+ .claude/
98
+ .codex
99
+ .agents/
100
+ NOTES.md
101
+ dist-*
@@ -0,0 +1,49 @@
1
+ default_stages: [ pre-push ]
2
+ fail_fast: false
3
+ exclude: ^(docs/|examples/benches)
4
+
5
+ repos:
6
+ - repo: https://github.com/pre-commit/pre-commit-hooks
7
+ rev: v5.0.0
8
+ hooks:
9
+ - id: trailing-whitespace
10
+ args: [ --markdown-linebreak-ext=md ]
11
+ - id: end-of-file-fixer
12
+ - id: mixed-line-ending
13
+ - id: check-merge-conflict
14
+ - id: check-added-large-files
15
+ - id: detect-private-key
16
+ - id: check-yaml
17
+ - id: check-toml
18
+ - id: check-json
19
+ - id: check-docstring-first
20
+ - id: pretty-format-json
21
+ args: [ --autofix, --no-sort-keys ]
22
+
23
+ - repo: local
24
+ hooks:
25
+ - id: format
26
+ name: Format Rust Code
27
+ entry: make format
28
+ language: system
29
+ pass_filenames: false
30
+ stages: [ pre-commit ]
31
+
32
+ - id: lint
33
+ name: Check Code Style (Rust)
34
+ entry: make lint
35
+ language: system
36
+ pass_filenames: false
37
+ stages: [ pre-commit ]
38
+
39
+ - id: test
40
+ name: Run Rust Tests
41
+ entry: make nextest
42
+ language: system
43
+ pass_filenames: false
44
+
45
+ - id: test-py
46
+ name: Run Python Tests
47
+ entry: make test-py
48
+ language: system
49
+ pass_filenames: false