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.
- pyspart-0.6.0/.editorconfig +23 -0
- pyspart-0.6.0/.gitattributes +53 -0
- pyspart-0.6.0/.github/FUNDING.yml +1 -0
- pyspart-0.6.0/.github/ISSUE_TEMPLATE/bug_report.md +25 -0
- pyspart-0.6.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
- pyspart-0.6.0/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- pyspart-0.6.0/.github/workflows/benches.yml +40 -0
- pyspart-0.6.0/.github/workflows/lints.yml +49 -0
- pyspart-0.6.0/.github/workflows/publish.yml +41 -0
- pyspart-0.6.0/.github/workflows/publish_py.yml +185 -0
- pyspart-0.6.0/.github/workflows/tests.yml +60 -0
- pyspart-0.6.0/.gitignore +101 -0
- pyspart-0.6.0/.pre-commit-config.yaml +49 -0
- pyspart-0.6.0/AGENTS.md +340 -0
- pyspart-0.6.0/CLAUDE.md +1 -0
- pyspart-0.6.0/CODE_OF_CONDUCT.md +3 -0
- pyspart-0.6.0/CONTRIBUTING.md +53 -0
- pyspart-0.6.0/Cargo.lock +1043 -0
- pyspart-0.6.0/Cargo.toml +87 -0
- pyspart-0.6.0/LICENSE-APACHE +201 -0
- pyspart-0.6.0/LICENSE-MIT +21 -0
- pyspart-0.6.0/Makefile +219 -0
- pyspart-0.6.0/PKG-INFO +248 -0
- pyspart-0.6.0/README.md +229 -0
- pyspart-0.6.0/ROADMAP.md +46 -0
- pyspart-0.6.0/benches/bench_delete.rs +185 -0
- pyspart-0.6.0/benches/bench_insert.rs +212 -0
- pyspart-0.6.0/benches/bench_insert_bulk.rs +159 -0
- pyspart-0.6.0/benches/bench_knn_search.rs +189 -0
- pyspart-0.6.0/benches/bench_range_search.rs +314 -0
- pyspart-0.6.0/benches/bench_serialization.rs +135 -0
- pyspart-0.6.0/benches/main.rs +22 -0
- pyspart-0.6.0/benches/shared.rs +70 -0
- pyspart-0.6.0/codecov.yml +4 -0
- pyspart-0.6.0/examples/README.md +9 -0
- pyspart-0.6.0/examples/kdtree.rs +99 -0
- pyspart-0.6.0/examples/octree.rs +61 -0
- pyspart-0.6.0/examples/quadtree.rs +59 -0
- pyspart-0.6.0/examples/rstar_tree.rs +95 -0
- pyspart-0.6.0/examples/rtree.rs +93 -0
- pyspart-0.6.0/logo.svg +29 -0
- pyspart-0.6.0/py.typed +0 -0
- pyspart-0.6.0/pyproject.toml +46 -0
- pyspart-0.6.0/pyspart/Cargo.toml +18 -0
- pyspart-0.6.0/pyspart/LICENSE-MIT +21 -0
- pyspart-0.6.0/pyspart/README.md +219 -0
- pyspart-0.6.0/pyspart/examples/README.md +9 -0
- pyspart-0.6.0/pyspart/examples/kdtree.py +67 -0
- pyspart-0.6.0/pyspart/examples/octree.py +51 -0
- pyspart-0.6.0/pyspart/examples/quadtree.py +44 -0
- pyspart-0.6.0/pyspart/examples/rstar_tree.py +77 -0
- pyspart-0.6.0/pyspart/examples/rtree.py +75 -0
- pyspart-0.6.0/pyspart/py.typed +0 -0
- pyspart-0.6.0/pyspart/pyspart.pyi +739 -0
- pyspart-0.6.0/pyspart/src/geometry.rs +76 -0
- pyspart-0.6.0/pyspart/src/kdtree.rs +288 -0
- pyspart-0.6.0/pyspart/src/lib.rs +78 -0
- pyspart-0.6.0/pyspart/src/octree.rs +185 -0
- pyspart-0.6.0/pyspart/src/point2d.rs +83 -0
- pyspart-0.6.0/pyspart/src/point3d.rs +87 -0
- pyspart-0.6.0/pyspart/src/quadtree.rs +188 -0
- pyspart-0.6.0/pyspart/src/rstar_tree.rs +283 -0
- pyspart-0.6.0/pyspart/src/rtree.rs +283 -0
- pyspart-0.6.0/pyspart/src/types.rs +98 -0
- pyspart-0.6.0/pyspart/tests/test_advanced_scenarios.py +579 -0
- pyspart-0.6.0/pyspart/tests/test_bulk_insert.py +131 -0
- pyspart-0.6.0/pyspart/tests/test_core_types.py +327 -0
- pyspart-0.6.0/pyspart/tests/test_edge_cases.py +255 -0
- pyspart-0.6.0/pyspart/tests/test_serialization.py +182 -0
- pyspart-0.6.0/pyspart/tests/test_serialization_integration.py +540 -0
- pyspart-0.6.0/pyspart.pyi +739 -0
- pyspart-0.6.0/rust-toolchain.toml +3 -0
- pyspart-0.6.0/src/errors.rs +90 -0
- pyspart-0.6.0/src/geometry.rs +1226 -0
- pyspart-0.6.0/src/index.rs +132 -0
- pyspart-0.6.0/src/kdtree.rs +1140 -0
- pyspart-0.6.0/src/knn.rs +177 -0
- pyspart-0.6.0/src/lib.rs +43 -0
- pyspart-0.6.0/src/octree.rs +793 -0
- pyspart-0.6.0/src/quadtree.rs +733 -0
- pyspart-0.6.0/src/rstar_tree.rs +1156 -0
- pyspart-0.6.0/src/rtree.rs +1048 -0
- pyspart-0.6.0/src/rtree_common.rs +586 -0
- pyspart-0.6.0/tests/README.md +11 -0
- pyspart-0.6.0/tests/common.rs +141 -0
- pyspart-0.6.0/tests/test_completeness.rs +923 -0
- pyspart-0.6.0/tests/test_integration_kdtree.rs +213 -0
- pyspart-0.6.0/tests/test_integration_octree.rs +97 -0
- pyspart-0.6.0/tests/test_integration_quadtree.rs +95 -0
- pyspart-0.6.0/tests/test_integration_rstar_tree.rs +244 -0
- pyspart-0.6.0/tests/test_integration_rtree.rs +244 -0
- pyspart-0.6.0/tests/test_proptest_geometry.rs +134 -0
- pyspart-0.6.0/tests/test_proptest_kdtree.rs +164 -0
- pyspart-0.6.0/tests/test_proptest_octree.rs +59 -0
- pyspart-0.6.0/tests/test_proptest_quadtree.rs +59 -0
- pyspart-0.6.0/tests/test_proptest_rstar_tree.rs +131 -0
- pyspart-0.6.0/tests/test_proptest_rtree.rs +175 -0
- pyspart-0.6.0/tests/test_serialization.rs +131 -0
- pyspart-0.6.0/tests/test_spatial_index.rs +515 -0
- 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,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
|
pyspart-0.6.0/.gitignore
ADDED
|
@@ -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
|