okpalette 0.1.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.
@@ -0,0 +1,80 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ concurrency:
12
+ group: ${{ github.workflow }}-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+ rust:
17
+ name: Rust
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - name: Check out repository
21
+ uses: actions/checkout@v4
22
+
23
+ - name: Install Rust
24
+ uses: dtolnay/rust-toolchain@stable
25
+ with:
26
+ components: clippy, rustfmt
27
+
28
+ - name: Cache Rust build artifacts
29
+ uses: Swatinem/rust-cache@v2
30
+
31
+ - name: Check formatting
32
+ run: cargo fmt --all -- --check
33
+
34
+ - name: Run clippy
35
+ run: cargo clippy --all-targets --all-features -- -D warnings
36
+
37
+ - name: Run Rust tests
38
+ run: cargo test
39
+
40
+ python:
41
+ name: Python ${{ matrix.python-version }}
42
+ runs-on: ubuntu-latest
43
+ strategy:
44
+ fail-fast: false
45
+ matrix:
46
+ python-version: ["3.12", "3.13", "3.14"]
47
+ steps:
48
+ - name: Check out repository
49
+ uses: actions/checkout@v4
50
+
51
+ - name: Install Rust
52
+ uses: dtolnay/rust-toolchain@stable
53
+
54
+ - name: Cache Rust build artifacts
55
+ uses: Swatinem/rust-cache@v2
56
+
57
+ - name: Install Python
58
+ uses: actions/setup-python@v5
59
+ with:
60
+ python-version: ${{ matrix.python-version }}
61
+
62
+ - name: Install uv
63
+ uses: astral-sh/setup-uv@v6
64
+ with:
65
+ enable-cache: true
66
+
67
+ - name: Sync development dependencies
68
+ run: uv sync --extra dev --locked
69
+
70
+ - name: Build and install native extension
71
+ run: uv run --extra dev maturin develop --uv
72
+
73
+ - name: Run Python tests
74
+ run: uv run --extra dev pytest
75
+
76
+ - name: Run ruff
77
+ run: uv run --extra dev ruff check .
78
+
79
+ - name: Run ty
80
+ run: uv run --extra dev ty check
@@ -0,0 +1,131 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ concurrency:
12
+ group: ${{ github.workflow }}-${{ github.ref }}
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+ linux:
17
+ name: Linux ${{ matrix.target }}
18
+ runs-on: ubuntu-latest
19
+ strategy:
20
+ fail-fast: false
21
+ matrix:
22
+ target: [x86_64, aarch64]
23
+ steps:
24
+ - name: Check out repository
25
+ uses: actions/checkout@v4
26
+
27
+ - name: Build wheel
28
+ uses: PyO3/maturin-action@v1
29
+ with:
30
+ command: build
31
+ target: ${{ matrix.target }}
32
+ manylinux: "2014"
33
+ args: --release --locked --out dist
34
+
35
+ - name: Upload wheel
36
+ uses: actions/upload-artifact@v4
37
+ with:
38
+ name: dist-linux-${{ matrix.target }}
39
+ path: dist
40
+
41
+ macos:
42
+ name: macOS aarch64
43
+ runs-on: macos-14
44
+ steps:
45
+ - name: Check out repository
46
+ uses: actions/checkout@v4
47
+
48
+ - name: Build wheel
49
+ uses: PyO3/maturin-action@v1
50
+ with:
51
+ command: build
52
+ target: aarch64
53
+ args: --release --locked --out dist
54
+
55
+ - name: Upload wheel
56
+ uses: actions/upload-artifact@v4
57
+ with:
58
+ name: dist-macos-aarch64
59
+ path: dist
60
+
61
+ windows:
62
+ name: Windows x64
63
+ runs-on: windows-latest
64
+ steps:
65
+ - name: Check out repository
66
+ uses: actions/checkout@v4
67
+
68
+ - name: Install Python
69
+ uses: actions/setup-python@v5
70
+ with:
71
+ python-version: "3.12"
72
+ architecture: x64
73
+
74
+ - name: Build wheel
75
+ uses: PyO3/maturin-action@v1
76
+ with:
77
+ command: build
78
+ target: x64
79
+ args: --release --locked --out dist
80
+
81
+ - name: Upload wheel
82
+ uses: actions/upload-artifact@v4
83
+ with:
84
+ name: dist-windows-x64
85
+ path: dist
86
+
87
+ sdist:
88
+ name: Source distribution
89
+ runs-on: ubuntu-latest
90
+ steps:
91
+ - name: Check out repository
92
+ uses: actions/checkout@v4
93
+
94
+ - name: Build sdist
95
+ uses: PyO3/maturin-action@v1
96
+ with:
97
+ command: sdist
98
+ args: --out dist
99
+
100
+ - name: Upload sdist
101
+ uses: actions/upload-artifact@v4
102
+ with:
103
+ name: dist-sdist
104
+ path: dist
105
+
106
+ publish:
107
+ name: Publish to PyPI
108
+ runs-on: ubuntu-latest
109
+ needs: [linux, macos, windows, sdist]
110
+ if: startsWith(github.ref, 'refs/tags/v')
111
+ environment:
112
+ name: pypi
113
+ url: https://pypi.org/p/okpalette
114
+ permissions:
115
+ contents: read
116
+ id-token: write
117
+ steps:
118
+ - name: Download distributions
119
+ uses: actions/download-artifact@v4
120
+ with:
121
+ pattern: dist-*
122
+ path: dist
123
+ merge-multiple: true
124
+
125
+ - name: List distributions
126
+ run: ls -la dist
127
+
128
+ - name: Publish distributions
129
+ uses: pypa/gh-action-pypi-publish@release/v1
130
+ with:
131
+ packages-dir: dist
@@ -0,0 +1,23 @@
1
+ .kata.local.toml
2
+ .kata/
3
+ .docs/
4
+
5
+ # Rust build output
6
+ target/
7
+
8
+ # Python environments and caches
9
+ .venv/
10
+ __pycache__/
11
+ *.py[cod]
12
+ .pytest_cache/
13
+ .ruff_cache/
14
+ .mypy_cache/
15
+
16
+ # Python/Rust extension build artifacts
17
+ dist/
18
+ build/
19
+ *.egg-info/
20
+ python/okpalette/_core*.so
21
+
22
+ # Generated smoke-test review artifacts
23
+ output/
@@ -0,0 +1,42 @@
1
+ # Repository Instructions
2
+
3
+ <!-- codebase-memory-mcp:start -->
4
+ # Codebase Knowledge Graph (codebase-memory-mcp)
5
+
6
+ This project uses codebase-memory-mcp to maintain a knowledge graph of the codebase.
7
+ ALWAYS prefer MCP graph tools over grep/glob/file-search for code discovery.
8
+
9
+ ## Priority Order
10
+
11
+ 1. `search_graph` - find functions, classes, routes, variables by pattern
12
+ 2. `trace_path` - trace who calls a function or what it calls
13
+ 3. `get_code_snippet` - read specific function/class source code
14
+ 4. `query_graph` - run Cypher queries for complex patterns
15
+ 5. `get_architecture` - high-level project summary
16
+
17
+ ## When to fall back to grep/glob
18
+
19
+ - Searching for string literals, error messages, config values
20
+ - Searching non-code files (Dockerfiles, shell scripts, configs)
21
+ - When MCP tools return insufficient results
22
+
23
+ ## Examples
24
+
25
+ - Find a handler: `search_graph(name_pattern=".*OrderHandler.*")`
26
+ - Who calls it: `trace_path(function_name="OrderHandler", direction="inbound")`
27
+ - Read source: `get_code_snippet(qualified_name="pkg/orders.OrderHandler")`
28
+ <!-- codebase-memory-mcp:end -->
29
+
30
+ ## Development Loop
31
+
32
+ Before handing off code changes, run the checks in this order:
33
+
34
+ ```bash
35
+ cargo fmt
36
+ cargo clippy --all-targets --all-features -- -D warnings
37
+ cargo test
38
+ uv run --extra dev ruff check .
39
+ uv run --extra dev ty check
40
+ ```
41
+
42
+ For docs-only changes, say explicitly when the loop is skipped.
@@ -0,0 +1,282 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "adler2"
7
+ version = "2.0.1"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
10
+
11
+ [[package]]
12
+ name = "bitflags"
13
+ version = "2.11.1"
14
+ source = "registry+https://github.com/rust-lang/crates.io-index"
15
+ checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
16
+
17
+ [[package]]
18
+ name = "cfg-if"
19
+ version = "1.0.4"
20
+ source = "registry+https://github.com/rust-lang/crates.io-index"
21
+ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
22
+
23
+ [[package]]
24
+ name = "crc32fast"
25
+ version = "1.5.0"
26
+ source = "registry+https://github.com/rust-lang/crates.io-index"
27
+ checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511"
28
+ dependencies = [
29
+ "cfg-if",
30
+ ]
31
+
32
+ [[package]]
33
+ name = "crossbeam-deque"
34
+ version = "0.8.6"
35
+ source = "registry+https://github.com/rust-lang/crates.io-index"
36
+ checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
37
+ dependencies = [
38
+ "crossbeam-epoch",
39
+ "crossbeam-utils",
40
+ ]
41
+
42
+ [[package]]
43
+ name = "crossbeam-epoch"
44
+ version = "0.9.18"
45
+ source = "registry+https://github.com/rust-lang/crates.io-index"
46
+ checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
47
+ dependencies = [
48
+ "crossbeam-utils",
49
+ ]
50
+
51
+ [[package]]
52
+ name = "crossbeam-utils"
53
+ version = "0.8.21"
54
+ source = "registry+https://github.com/rust-lang/crates.io-index"
55
+ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
56
+
57
+ [[package]]
58
+ name = "either"
59
+ version = "1.15.0"
60
+ source = "registry+https://github.com/rust-lang/crates.io-index"
61
+ checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
62
+
63
+ [[package]]
64
+ name = "fdeflate"
65
+ version = "0.3.7"
66
+ source = "registry+https://github.com/rust-lang/crates.io-index"
67
+ checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c"
68
+ dependencies = [
69
+ "simd-adler32",
70
+ ]
71
+
72
+ [[package]]
73
+ name = "flate2"
74
+ version = "1.1.9"
75
+ source = "registry+https://github.com/rust-lang/crates.io-index"
76
+ checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c"
77
+ dependencies = [
78
+ "crc32fast",
79
+ "miniz_oxide",
80
+ ]
81
+
82
+ [[package]]
83
+ name = "heck"
84
+ version = "0.5.0"
85
+ source = "registry+https://github.com/rust-lang/crates.io-index"
86
+ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
87
+
88
+ [[package]]
89
+ name = "libc"
90
+ version = "0.2.186"
91
+ source = "registry+https://github.com/rust-lang/crates.io-index"
92
+ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
93
+
94
+ [[package]]
95
+ name = "miniz_oxide"
96
+ version = "0.8.9"
97
+ source = "registry+https://github.com/rust-lang/crates.io-index"
98
+ checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
99
+ dependencies = [
100
+ "adler2",
101
+ "simd-adler32",
102
+ ]
103
+
104
+ [[package]]
105
+ name = "okpalette"
106
+ version = "0.1.0"
107
+ dependencies = [
108
+ "png",
109
+ "pyo3",
110
+ "rayon",
111
+ "thiserror",
112
+ ]
113
+
114
+ [[package]]
115
+ name = "once_cell"
116
+ version = "1.21.4"
117
+ source = "registry+https://github.com/rust-lang/crates.io-index"
118
+ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
119
+
120
+ [[package]]
121
+ name = "png"
122
+ version = "0.18.1"
123
+ source = "registry+https://github.com/rust-lang/crates.io-index"
124
+ checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61"
125
+ dependencies = [
126
+ "bitflags",
127
+ "crc32fast",
128
+ "fdeflate",
129
+ "flate2",
130
+ "miniz_oxide",
131
+ ]
132
+
133
+ [[package]]
134
+ name = "portable-atomic"
135
+ version = "1.13.1"
136
+ source = "registry+https://github.com/rust-lang/crates.io-index"
137
+ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
138
+
139
+ [[package]]
140
+ name = "proc-macro2"
141
+ version = "1.0.106"
142
+ source = "registry+https://github.com/rust-lang/crates.io-index"
143
+ checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
144
+ dependencies = [
145
+ "unicode-ident",
146
+ ]
147
+
148
+ [[package]]
149
+ name = "pyo3"
150
+ version = "0.28.3"
151
+ source = "registry+https://github.com/rust-lang/crates.io-index"
152
+ checksum = "91fd8e38a3b50ed1167fb981cd6fd60147e091784c427b8f7183a7ee32c31c12"
153
+ dependencies = [
154
+ "libc",
155
+ "once_cell",
156
+ "portable-atomic",
157
+ "pyo3-build-config",
158
+ "pyo3-ffi",
159
+ "pyo3-macros",
160
+ ]
161
+
162
+ [[package]]
163
+ name = "pyo3-build-config"
164
+ version = "0.28.3"
165
+ source = "registry+https://github.com/rust-lang/crates.io-index"
166
+ checksum = "e368e7ddfdeb98c9bca7f8383be1648fd84ab466bf2bc015e94008db6d35611e"
167
+ dependencies = [
168
+ "target-lexicon",
169
+ ]
170
+
171
+ [[package]]
172
+ name = "pyo3-ffi"
173
+ version = "0.28.3"
174
+ source = "registry+https://github.com/rust-lang/crates.io-index"
175
+ checksum = "7f29e10af80b1f7ccaf7f69eace800a03ecd13e883acfacc1e5d0988605f651e"
176
+ dependencies = [
177
+ "libc",
178
+ "pyo3-build-config",
179
+ ]
180
+
181
+ [[package]]
182
+ name = "pyo3-macros"
183
+ version = "0.28.3"
184
+ source = "registry+https://github.com/rust-lang/crates.io-index"
185
+ checksum = "df6e520eff47c45997d2fc7dd8214b25dd1310918bbb2642156ef66a67f29813"
186
+ dependencies = [
187
+ "proc-macro2",
188
+ "pyo3-macros-backend",
189
+ "quote",
190
+ "syn",
191
+ ]
192
+
193
+ [[package]]
194
+ name = "pyo3-macros-backend"
195
+ version = "0.28.3"
196
+ source = "registry+https://github.com/rust-lang/crates.io-index"
197
+ checksum = "c4cdc218d835738f81c2338f822078af45b4afdf8b2e33cbb5916f108b813acb"
198
+ dependencies = [
199
+ "heck",
200
+ "proc-macro2",
201
+ "pyo3-build-config",
202
+ "quote",
203
+ "syn",
204
+ ]
205
+
206
+ [[package]]
207
+ name = "quote"
208
+ version = "1.0.45"
209
+ source = "registry+https://github.com/rust-lang/crates.io-index"
210
+ checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
211
+ dependencies = [
212
+ "proc-macro2",
213
+ ]
214
+
215
+ [[package]]
216
+ name = "rayon"
217
+ version = "1.12.0"
218
+ source = "registry+https://github.com/rust-lang/crates.io-index"
219
+ checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d"
220
+ dependencies = [
221
+ "either",
222
+ "rayon-core",
223
+ ]
224
+
225
+ [[package]]
226
+ name = "rayon-core"
227
+ version = "1.13.0"
228
+ source = "registry+https://github.com/rust-lang/crates.io-index"
229
+ checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91"
230
+ dependencies = [
231
+ "crossbeam-deque",
232
+ "crossbeam-utils",
233
+ ]
234
+
235
+ [[package]]
236
+ name = "simd-adler32"
237
+ version = "0.3.9"
238
+ source = "registry+https://github.com/rust-lang/crates.io-index"
239
+ checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214"
240
+
241
+ [[package]]
242
+ name = "syn"
243
+ version = "2.0.117"
244
+ source = "registry+https://github.com/rust-lang/crates.io-index"
245
+ checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
246
+ dependencies = [
247
+ "proc-macro2",
248
+ "quote",
249
+ "unicode-ident",
250
+ ]
251
+
252
+ [[package]]
253
+ name = "target-lexicon"
254
+ version = "0.13.5"
255
+ source = "registry+https://github.com/rust-lang/crates.io-index"
256
+ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
257
+
258
+ [[package]]
259
+ name = "thiserror"
260
+ version = "2.0.18"
261
+ source = "registry+https://github.com/rust-lang/crates.io-index"
262
+ checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
263
+ dependencies = [
264
+ "thiserror-impl",
265
+ ]
266
+
267
+ [[package]]
268
+ name = "thiserror-impl"
269
+ version = "2.0.18"
270
+ source = "registry+https://github.com/rust-lang/crates.io-index"
271
+ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
272
+ dependencies = [
273
+ "proc-macro2",
274
+ "quote",
275
+ "syn",
276
+ ]
277
+
278
+ [[package]]
279
+ name = "unicode-ident"
280
+ version = "1.0.24"
281
+ source = "registry+https://github.com/rust-lang/crates.io-index"
282
+ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
@@ -0,0 +1,20 @@
1
+ [package]
2
+ name = "okpalette"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+ license = "MIT"
6
+ description = "Fast, dependency-free OKLab categorical color palettes powered by Rust"
7
+ readme = "README.md"
8
+ repository = "https://github.com/pmbaumgartner/okpalette"
9
+ homepage = "https://github.com/pmbaumgartner/okpalette"
10
+
11
+ [lib]
12
+ name = "_core"
13
+ crate-type = ["cdylib", "rlib"]
14
+
15
+ [dependencies]
16
+ # Use abi3-py312 so one wheel can support Python 3.12+ where PyO3 APIs allow it.
17
+ pyo3 = { version = "0.28.3", features = ["abi3-py312"] }
18
+ png = "0.18"
19
+ rayon = "1.12"
20
+ thiserror = "2.0"