kosoku 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.
Files changed (200) hide show
  1. kosoku-0.1.0/.gitattributes +1 -0
  2. kosoku-0.1.0/.github/workflows/ci.yaml +85 -0
  3. kosoku-0.1.0/.github/workflows/release.yaml +218 -0
  4. kosoku-0.1.0/.github/workflows/renovate.yaml +18 -0
  5. kosoku-0.1.0/.gitignore +23 -0
  6. kosoku-0.1.0/CODE_OF_CONDUCT.md +31 -0
  7. kosoku-0.1.0/Cargo.lock +1182 -0
  8. kosoku-0.1.0/Cargo.toml +48 -0
  9. kosoku-0.1.0/LICENSE +21 -0
  10. kosoku-0.1.0/NOTICE.txt +182 -0
  11. kosoku-0.1.0/PKG-INFO +74 -0
  12. kosoku-0.1.0/README.md +51 -0
  13. kosoku-0.1.0/kosoku/__init__.py +8 -0
  14. kosoku-0.1.0/kosoku/_caseindex.py +97 -0
  15. kosoku-0.1.0/kosoku/_cli.py +155 -0
  16. kosoku-0.1.0/kosoku/_errors.py +22 -0
  17. kosoku-0.1.0/kosoku/_kosoku.pyi +541 -0
  18. kosoku-0.1.0/kosoku/_report.py +638 -0
  19. kosoku-0.1.0/kosoku/_report_assets.py +427 -0
  20. kosoku-0.1.0/kosoku/cases/__init__.py +165 -0
  21. kosoku-0.1.0/kosoku/cases/case.py +140 -0
  22. kosoku-0.1.0/kosoku/cases/case10_1_1.py +51 -0
  23. kosoku-0.1.0/kosoku/cases/case12_x_x.py +387 -0
  24. kosoku-0.1.0/kosoku/cases/case1_1_1.py +34 -0
  25. kosoku-0.1.0/kosoku/cases/case1_1_2.py +33 -0
  26. kosoku-0.1.0/kosoku/cases/case1_1_3.py +33 -0
  27. kosoku-0.1.0/kosoku/cases/case1_1_4.py +32 -0
  28. kosoku-0.1.0/kosoku/cases/case1_1_5.py +32 -0
  29. kosoku-0.1.0/kosoku/cases/case1_1_6.py +32 -0
  30. kosoku-0.1.0/kosoku/cases/case1_1_7.py +32 -0
  31. kosoku-0.1.0/kosoku/cases/case1_1_8.py +32 -0
  32. kosoku-0.1.0/kosoku/cases/case1_2_1.py +32 -0
  33. kosoku-0.1.0/kosoku/cases/case1_2_2.py +32 -0
  34. kosoku-0.1.0/kosoku/cases/case1_2_3.py +32 -0
  35. kosoku-0.1.0/kosoku/cases/case1_2_4.py +32 -0
  36. kosoku-0.1.0/kosoku/cases/case1_2_5.py +32 -0
  37. kosoku-0.1.0/kosoku/cases/case1_2_6.py +32 -0
  38. kosoku-0.1.0/kosoku/cases/case1_2_7.py +32 -0
  39. kosoku-0.1.0/kosoku/cases/case1_2_8.py +32 -0
  40. kosoku-0.1.0/kosoku/cases/case2_1.py +31 -0
  41. kosoku-0.1.0/kosoku/cases/case2_10.py +37 -0
  42. kosoku-0.1.0/kosoku/cases/case2_11.py +28 -0
  43. kosoku-0.1.0/kosoku/cases/case2_2.py +32 -0
  44. kosoku-0.1.0/kosoku/cases/case2_3.py +33 -0
  45. kosoku-0.1.0/kosoku/cases/case2_4.py +32 -0
  46. kosoku-0.1.0/kosoku/cases/case2_5.py +32 -0
  47. kosoku-0.1.0/kosoku/cases/case2_6.py +32 -0
  48. kosoku-0.1.0/kosoku/cases/case2_7.py +32 -0
  49. kosoku-0.1.0/kosoku/cases/case2_8.py +34 -0
  50. kosoku-0.1.0/kosoku/cases/case2_9.py +33 -0
  51. kosoku-0.1.0/kosoku/cases/case3_1.py +33 -0
  52. kosoku-0.1.0/kosoku/cases/case3_2.py +35 -0
  53. kosoku-0.1.0/kosoku/cases/case3_3.py +35 -0
  54. kosoku-0.1.0/kosoku/cases/case3_4.py +35 -0
  55. kosoku-0.1.0/kosoku/cases/case3_5.py +32 -0
  56. kosoku-0.1.0/kosoku/cases/case3_6.py +32 -0
  57. kosoku-0.1.0/kosoku/cases/case3_7.py +31 -0
  58. kosoku-0.1.0/kosoku/cases/case4_1_1.py +31 -0
  59. kosoku-0.1.0/kosoku/cases/case4_1_2.py +31 -0
  60. kosoku-0.1.0/kosoku/cases/case4_1_3.py +35 -0
  61. kosoku-0.1.0/kosoku/cases/case4_1_4.py +35 -0
  62. kosoku-0.1.0/kosoku/cases/case4_1_5.py +35 -0
  63. kosoku-0.1.0/kosoku/cases/case4_2_1.py +31 -0
  64. kosoku-0.1.0/kosoku/cases/case4_2_2.py +31 -0
  65. kosoku-0.1.0/kosoku/cases/case4_2_3.py +35 -0
  66. kosoku-0.1.0/kosoku/cases/case4_2_4.py +35 -0
  67. kosoku-0.1.0/kosoku/cases/case4_2_5.py +35 -0
  68. kosoku-0.1.0/kosoku/cases/case5_1.py +32 -0
  69. kosoku-0.1.0/kosoku/cases/case5_10.py +32 -0
  70. kosoku-0.1.0/kosoku/cases/case5_11.py +32 -0
  71. kosoku-0.1.0/kosoku/cases/case5_12.py +32 -0
  72. kosoku-0.1.0/kosoku/cases/case5_13.py +32 -0
  73. kosoku-0.1.0/kosoku/cases/case5_14.py +32 -0
  74. kosoku-0.1.0/kosoku/cases/case5_15.py +36 -0
  75. kosoku-0.1.0/kosoku/cases/case5_16.py +34 -0
  76. kosoku-0.1.0/kosoku/cases/case5_17.py +34 -0
  77. kosoku-0.1.0/kosoku/cases/case5_18.py +32 -0
  78. kosoku-0.1.0/kosoku/cases/case5_19.py +57 -0
  79. kosoku-0.1.0/kosoku/cases/case5_2.py +32 -0
  80. kosoku-0.1.0/kosoku/cases/case5_20.py +31 -0
  81. kosoku-0.1.0/kosoku/cases/case5_3.py +33 -0
  82. kosoku-0.1.0/kosoku/cases/case5_4.py +33 -0
  83. kosoku-0.1.0/kosoku/cases/case5_5.py +33 -0
  84. kosoku-0.1.0/kosoku/cases/case5_6.py +35 -0
  85. kosoku-0.1.0/kosoku/cases/case5_7.py +35 -0
  86. kosoku-0.1.0/kosoku/cases/case5_8.py +35 -0
  87. kosoku-0.1.0/kosoku/cases/case5_9.py +33 -0
  88. kosoku-0.1.0/kosoku/cases/case6_1_1.py +33 -0
  89. kosoku-0.1.0/kosoku/cases/case6_1_2.py +35 -0
  90. kosoku-0.1.0/kosoku/cases/case6_1_3.py +36 -0
  91. kosoku-0.1.0/kosoku/cases/case6_2_1.py +39 -0
  92. kosoku-0.1.0/kosoku/cases/case6_2_2.py +41 -0
  93. kosoku-0.1.0/kosoku/cases/case6_2_3.py +39 -0
  94. kosoku-0.1.0/kosoku/cases/case6_2_4.py +39 -0
  95. kosoku-0.1.0/kosoku/cases/case6_3_1.py +44 -0
  96. kosoku-0.1.0/kosoku/cases/case6_3_2.py +39 -0
  97. kosoku-0.1.0/kosoku/cases/case6_4_1.py +68 -0
  98. kosoku-0.1.0/kosoku/cases/case6_4_2.py +61 -0
  99. kosoku-0.1.0/kosoku/cases/case6_4_3.py +64 -0
  100. kosoku-0.1.0/kosoku/cases/case6_4_4.py +64 -0
  101. kosoku-0.1.0/kosoku/cases/case6_x_x.py +434 -0
  102. kosoku-0.1.0/kosoku/cases/case7_13_1.py +47 -0
  103. kosoku-0.1.0/kosoku/cases/case7_13_2.py +47 -0
  104. kosoku-0.1.0/kosoku/cases/case7_1_1.py +44 -0
  105. kosoku-0.1.0/kosoku/cases/case7_1_2.py +46 -0
  106. kosoku-0.1.0/kosoku/cases/case7_1_3.py +47 -0
  107. kosoku-0.1.0/kosoku/cases/case7_1_4.py +46 -0
  108. kosoku-0.1.0/kosoku/cases/case7_1_5.py +47 -0
  109. kosoku-0.1.0/kosoku/cases/case7_1_6.py +57 -0
  110. kosoku-0.1.0/kosoku/cases/case7_3_1.py +42 -0
  111. kosoku-0.1.0/kosoku/cases/case7_3_2.py +42 -0
  112. kosoku-0.1.0/kosoku/cases/case7_3_3.py +44 -0
  113. kosoku-0.1.0/kosoku/cases/case7_3_4.py +42 -0
  114. kosoku-0.1.0/kosoku/cases/case7_3_5.py +43 -0
  115. kosoku-0.1.0/kosoku/cases/case7_3_6.py +43 -0
  116. kosoku-0.1.0/kosoku/cases/case7_5_1.py +54 -0
  117. kosoku-0.1.0/kosoku/cases/case7_7_X.py +57 -0
  118. kosoku-0.1.0/kosoku/cases/case7_9_X.py +57 -0
  119. kosoku-0.1.0/kosoku/cases/case9_1_1.py +55 -0
  120. kosoku-0.1.0/kosoku/cases/case9_1_2.py +31 -0
  121. kosoku-0.1.0/kosoku/cases/case9_1_3.py +31 -0
  122. kosoku-0.1.0/kosoku/cases/case9_1_4.py +31 -0
  123. kosoku-0.1.0/kosoku/cases/case9_1_5.py +31 -0
  124. kosoku-0.1.0/kosoku/cases/case9_1_6.py +31 -0
  125. kosoku-0.1.0/kosoku/cases/case9_2_1.py +55 -0
  126. kosoku-0.1.0/kosoku/cases/case9_2_2.py +31 -0
  127. kosoku-0.1.0/kosoku/cases/case9_2_3.py +31 -0
  128. kosoku-0.1.0/kosoku/cases/case9_2_4.py +31 -0
  129. kosoku-0.1.0/kosoku/cases/case9_2_5.py +31 -0
  130. kosoku-0.1.0/kosoku/cases/case9_2_6.py +31 -0
  131. kosoku-0.1.0/kosoku/cases/case9_3_1.py +56 -0
  132. kosoku-0.1.0/kosoku/cases/case9_3_2.py +32 -0
  133. kosoku-0.1.0/kosoku/cases/case9_3_3.py +32 -0
  134. kosoku-0.1.0/kosoku/cases/case9_3_4.py +32 -0
  135. kosoku-0.1.0/kosoku/cases/case9_3_5.py +32 -0
  136. kosoku-0.1.0/kosoku/cases/case9_3_6.py +32 -0
  137. kosoku-0.1.0/kosoku/cases/case9_3_7.py +32 -0
  138. kosoku-0.1.0/kosoku/cases/case9_3_8.py +32 -0
  139. kosoku-0.1.0/kosoku/cases/case9_3_9.py +32 -0
  140. kosoku-0.1.0/kosoku/cases/case9_4_1.py +55 -0
  141. kosoku-0.1.0/kosoku/cases/case9_4_2.py +32 -0
  142. kosoku-0.1.0/kosoku/cases/case9_4_3.py +32 -0
  143. kosoku-0.1.0/kosoku/cases/case9_4_4.py +32 -0
  144. kosoku-0.1.0/kosoku/cases/case9_4_5.py +32 -0
  145. kosoku-0.1.0/kosoku/cases/case9_4_6.py +32 -0
  146. kosoku-0.1.0/kosoku/cases/case9_4_7.py +32 -0
  147. kosoku-0.1.0/kosoku/cases/case9_4_8.py +32 -0
  148. kosoku-0.1.0/kosoku/cases/case9_4_9.py +32 -0
  149. kosoku-0.1.0/kosoku/cases/case9_5_1.py +57 -0
  150. kosoku-0.1.0/kosoku/cases/case9_5_2.py +28 -0
  151. kosoku-0.1.0/kosoku/cases/case9_5_3.py +28 -0
  152. kosoku-0.1.0/kosoku/cases/case9_5_4.py +28 -0
  153. kosoku-0.1.0/kosoku/cases/case9_5_5.py +28 -0
  154. kosoku-0.1.0/kosoku/cases/case9_5_6.py +28 -0
  155. kosoku-0.1.0/kosoku/cases/case9_6_1.py +57 -0
  156. kosoku-0.1.0/kosoku/cases/case9_6_2.py +28 -0
  157. kosoku-0.1.0/kosoku/cases/case9_6_3.py +28 -0
  158. kosoku-0.1.0/kosoku/cases/case9_6_4.py +28 -0
  159. kosoku-0.1.0/kosoku/cases/case9_6_5.py +28 -0
  160. kosoku-0.1.0/kosoku/cases/case9_6_6.py +28 -0
  161. kosoku-0.1.0/kosoku/cases/case9_7_X.py +95 -0
  162. kosoku-0.1.0/kosoku/py.typed +0 -0
  163. kosoku-0.1.0/kosoku/shim/autobahn/__init__.py +0 -0
  164. kosoku-0.1.0/kosoku/shim/autobahn/websocket/__init__.py +0 -0
  165. kosoku-0.1.0/kosoku/shim/autobahn/websocket/compress.py +23 -0
  166. kosoku-0.1.0/kosoku/shim/autobahn/websocket/protocol.py +43 -0
  167. kosoku-0.1.0/kosoku/shim/autobahn/websocket/utf8validator.py +13 -0
  168. kosoku-0.1.0/kosoku/shim/autobahntestsuite/__init__.py +7 -0
  169. kosoku-0.1.0/kosoku/shim/autobahntestsuite/testdata/10.1.1.105.5439.pdf +0 -0
  170. kosoku-0.1.0/kosoku/shim/autobahntestsuite/testdata/data1.html +4254 -0
  171. kosoku-0.1.0/kosoku/shim/autobahntestsuite/testdata/data1.json +6581 -0
  172. kosoku-0.1.0/kosoku/shim/autobahntestsuite/testdata/lena512.bmp +0 -0
  173. kosoku-0.1.0/kosoku/shim/autobahntestsuite/testdata/pg2229.txt +7429 -0
  174. kosoku-0.1.0/kosoku/shim/pkg_resources.py +20 -0
  175. kosoku-0.1.0/kosoku.code-workspace +51 -0
  176. kosoku-0.1.0/poe_tasks.toml +59 -0
  177. kosoku-0.1.0/pyproject.toml +64 -0
  178. kosoku-0.1.0/renovate.json +26 -0
  179. kosoku-0.1.0/scripts/generate.py +272 -0
  180. kosoku-0.1.0/src/asyncrt.rs +27 -0
  181. kosoku-0.1.0/src/client.rs +311 -0
  182. kosoku-0.1.0/src/compress.rs +162 -0
  183. kosoku-0.1.0/src/constants.rs +190 -0
  184. kosoku-0.1.0/src/deflate.rs +201 -0
  185. kosoku-0.1.0/src/lib.rs +262 -0
  186. kosoku-0.1.0/src/protocol.rs +790 -0
  187. kosoku-0.1.0/src/result.rs +363 -0
  188. kosoku-0.1.0/src/runner.rs +502 -0
  189. kosoku-0.1.0/src/server.rs +485 -0
  190. kosoku-0.1.0/src/traffic.rs +138 -0
  191. kosoku-0.1.0/src/utf8.rs +123 -0
  192. kosoku-0.1.0/src/wirelog.rs +162 -0
  193. kosoku-0.1.0/tests/__init__.py +0 -0
  194. kosoku-0.1.0/tests/_util.py +26 -0
  195. kosoku-0.1.0/tests/apps/echo.py +16 -0
  196. kosoku-0.1.0/tests/conftest.py +24 -0
  197. kosoku-0.1.0/tests/test_fuzzingclient.py +148 -0
  198. kosoku-0.1.0/tests/test_fuzzingserver.py +210 -0
  199. kosoku-0.1.0/tests/test_utf8validator.py +75 -0
  200. kosoku-0.1.0/uv.lock +698 -0
@@ -0,0 +1 @@
1
+ * text=auto eol=lf
@@ -0,0 +1,85 @@
1
+ name: CI
2
+ on:
3
+ push:
4
+ branches:
5
+ - main
6
+ pull_request:
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ concurrency:
13
+ # Cancel in-progress jobs for PRs only
14
+ group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/main' && github.sha || github.ref }}
15
+ cancel-in-progress: true
16
+
17
+ jobs:
18
+ build:
19
+ runs-on: ${{ matrix.os }}
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ os:
24
+ - macos-15
25
+ - ubuntu-24.04
26
+ - windows-2025
27
+ python:
28
+ - "3.10"
29
+ - "3.14"
30
+ # Test oldest and newest on all OS's, but others only on one
31
+ # to save CI load.
32
+ include:
33
+ - os: ubuntu-24.04
34
+ python: "3.11"
35
+ - os: ubuntu-24.04
36
+ python: "3.12"
37
+ - os: ubuntu-24.04
38
+ python: "3.13"
39
+ - os: ubuntu-24.04
40
+ python: "3.14t"
41
+ # Enable coverage on just one job
42
+ - os: ubuntu-24.04
43
+ python: "3.14"
44
+ coverage: "cov"
45
+
46
+ env:
47
+ # Avoid multiple compile e.g. in lint and test by setting as a job env var
48
+ RUSTFLAGS: "${{ matrix.coverage == 'cov' && '-C instrument-coverage' || '' }}"
49
+ MATURIN_DEVELOP_ARGS: ${{ matrix.python != '3.14t' && '--features pyo3/abi3-py310' || '' }}
50
+
51
+ steps:
52
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
53
+
54
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
55
+ with:
56
+ version: "0.11.23"
57
+ python-version: ${{ matrix.python }}
58
+
59
+ - name: Setup rust
60
+ run: |
61
+ rustup update
62
+ ${{ matrix.coverage == 'cov' && 'rustup component add llvm-tools' || '' }}
63
+
64
+ - run: uv sync --locked
65
+
66
+ # Go ahead and run lint on all Python versions since we may have version-specific
67
+ # guards in rust in the future.
68
+ - name: run lints
69
+ if: startsWith(matrix.os, 'ubuntu-')
70
+ run: uv run poe lint
71
+
72
+ - name: run tests
73
+ run: uv run poe test ${{ matrix.coverage == 'cov' && '--cov=kosoku --cov-report=xml' || '' }}
74
+
75
+ - name: verify wheel build
76
+ run: uv run poe wheel
77
+
78
+ - name: prepare coverage
79
+ if: ${{ matrix.coverage == 'cov' }}
80
+ run: |
81
+ $(rustc --print=target-libdir)/../bin/llvm-profdata merge -sparse default_*.profraw -o tests.profdata
82
+ $(rustc --print=target-libdir)/../bin/llvm-cov export -format=lcov --ignore-filename-regex='/.cargo/registry' --ignore-filename-regex='.cargo/git/checkouts' --ignore-filename-regex='.rustup/toolchains' -instr-profile tests.profdata kosoku/_kosoku.*.so > tests.lcov
83
+
84
+ - uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0
85
+ if: ${{ matrix.coverage == 'cov' }}
@@ -0,0 +1,218 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "*"
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ linux:
14
+ runs-on: ${{ matrix.platform.runner }}
15
+ strategy:
16
+ matrix:
17
+ platform:
18
+ - runner: ubuntu-24.04
19
+ target: x86_64
20
+ - runner: ubuntu-24.04-arm
21
+ target: aarch64
22
+ steps:
23
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
24
+
25
+ - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
26
+ with:
27
+ python-version: 3.x
28
+
29
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
30
+
31
+ - name: Build wheels
32
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
33
+ with:
34
+ target: ${{ matrix.platform.target }}
35
+ args: --release --out dist -i 3.14t -i pypy3.11
36
+ sccache: true
37
+ manylinux: auto
38
+
39
+ - name: Build abi3 wheels
40
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
41
+ with:
42
+ target: ${{ matrix.platform.target }}
43
+ args: --release --out dist -i 3.10 --features pyo3/abi3-py310
44
+ sccache: true
45
+ manylinux: auto
46
+
47
+ - name: Upload wheels
48
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
49
+ with:
50
+ name: wheels-linux-${{ matrix.platform.target }}
51
+ path: dist
52
+
53
+ musllinux:
54
+ runs-on: ${{ matrix.platform.runner }}
55
+ strategy:
56
+ matrix:
57
+ platform:
58
+ - runner: ubuntu-24.04
59
+ target: x86_64
60
+ - runner: ubuntu-24.04-arm
61
+ target: aarch64
62
+ steps:
63
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
64
+
65
+ - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
66
+ with:
67
+ python-version: 3.x
68
+
69
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
70
+
71
+ - name: Build wheels
72
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
73
+ with:
74
+ target: ${{ matrix.platform.target }}
75
+ args: --release --out dist -i 3.14t -i pypy3.11
76
+ sccache: true
77
+ manylinux: musllinux_1_2
78
+
79
+ - name: Build abi3 wheels
80
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
81
+ with:
82
+ target: ${{ matrix.platform.target }}
83
+ args: --release --out dist -i 3.10 --features pyo3/abi3-py310
84
+ sccache: true
85
+ manylinux: musllinux_1_2
86
+
87
+ - name: Upload wheels
88
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
89
+ with:
90
+ name: wheels-musllinux-${{ matrix.platform.target }}
91
+ path: dist
92
+
93
+ windows:
94
+ runs-on: ${{ matrix.platform.runner }}
95
+ strategy:
96
+ matrix:
97
+ platform:
98
+ - runner: windows-2025
99
+ steps:
100
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
101
+
102
+ - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
103
+ with:
104
+ python-version: "3.10"
105
+
106
+ # On Windows, maturin seems to have trouble automatically detecting Python not in
107
+ # the tool cache, so we set these up individually and pass the path directly.
108
+ - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
109
+ id: python-314t
110
+ with:
111
+ python-version: 3.14t
112
+
113
+ - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
114
+ id: python-pypy311
115
+ with:
116
+ python-version: pypy3.11
117
+
118
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
119
+
120
+ - name: Build wheels
121
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
122
+ with:
123
+ args: --release --out dist -i ${{ steps.python-314t.outputs.python-path }} -i ${{ steps.python-pypy311.outputs.python-path }}
124
+ sccache: true
125
+
126
+ - name: Build abi3 wheels
127
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
128
+ with:
129
+ args: --release --out dist -i 3.10 --features pyo3/abi3-py310
130
+ sccache: true
131
+
132
+ - name: Upload wheels
133
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
134
+ with:
135
+ name: wheels-windows-${{ matrix.platform.target }}
136
+ path: dist
137
+
138
+ macos:
139
+ runs-on: ${{ matrix.platform.runner }}
140
+ strategy:
141
+ matrix:
142
+ platform:
143
+ - runner: macos-15
144
+ target: aarch64
145
+ steps:
146
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
147
+
148
+ - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
149
+ with:
150
+ python-version: |
151
+ 3.10
152
+ 3.14t
153
+ pypy3.11
154
+
155
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
156
+
157
+ - name: Build wheels
158
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
159
+ with:
160
+ target: ${{ matrix.platform.target }}
161
+ args: --release --out dist -i 3.14t -i pypy3.11
162
+ sccache: true
163
+
164
+ - name: Build abi3 wheels
165
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
166
+ with:
167
+ target: ${{ matrix.platform.target }}
168
+ args: --release --out dist -i 3.10 --features pyo3/abi3-py310
169
+ sccache: true
170
+
171
+ - name: Upload wheels
172
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
173
+ with:
174
+ name: wheels-macos-${{ matrix.platform.target }}
175
+ path: dist
176
+
177
+ sdist:
178
+ runs-on: ubuntu-24.04
179
+ steps:
180
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
181
+
182
+ - name: Build sdist
183
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0
184
+ with:
185
+ command: sdist
186
+ args: --out dist
187
+
188
+ - name: Upload sdist
189
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
190
+ with:
191
+ name: wheels-sdist
192
+ path: dist
193
+
194
+ release:
195
+ name: Release
196
+ runs-on: ubuntu-24.04
197
+ if: ${{ github.event_name != 'pull_request' }}
198
+ environment: ${{ github.event_name == 'push' && 'prod' || 'dev' }}
199
+ needs:
200
+ - linux
201
+ - musllinux
202
+ - windows
203
+ - macos
204
+ - sdist
205
+ permissions:
206
+ id-token: write
207
+ contents: write
208
+ attestations: write
209
+ steps:
210
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
211
+ with:
212
+ path: dist/
213
+ merge-multiple: true
214
+
215
+ - uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
216
+ with:
217
+ repository-url: ${{ github.event_name != 'push' && 'https://test.pypi.org/legacy/' || null }}
218
+ skip-existing: ${{ github.event_name != 'push' }}
@@ -0,0 +1,18 @@
1
+ name: Renovate Dependencies
2
+
3
+ on:
4
+ schedule:
5
+ # https://crontab.guru/#5_12_*_*_1
6
+ - cron: "5 12 * * 1"
7
+ workflow_dispatch:
8
+
9
+ # Uses app token so default token needs no permissions
10
+ permissions: {}
11
+
12
+ jobs:
13
+ renovate:
14
+ uses: curioswitch/go-build/.github/workflows/export-renovate.yaml@338fc9f50df6cb664134b5c600630dcbc483d81f # v0.7.3
15
+ with:
16
+ github_app_id: "1047503"
17
+ secrets:
18
+ github_app_key: ${{ secrets.CURIOSWITCH_APP_KEY }}
@@ -0,0 +1,23 @@
1
+ debug
2
+ target
3
+
4
+ __pycache__
5
+ .venv
6
+
7
+ .envrc
8
+ .idea
9
+ .vscode
10
+
11
+ *.profraw
12
+ *.profdata
13
+ *.lcov
14
+
15
+ profile.json.gz
16
+
17
+ dist
18
+ out
19
+ site
20
+ .DS_Store
21
+ *.so
22
+ *.pyd
23
+ *.dSYM
@@ -0,0 +1,31 @@
1
+ This project follows the CurioSwitch code of conduct.
2
+
3
+ > [!WARNING]
4
+ > Any following content is overridden by the laws of CurioSwitch's residing country, Japan.
5
+ > For example, things like death threats will be dealt with strictly.
6
+
7
+ There is just one guideline: be fair. It is not possible to define fairness precisely
8
+ but consider these examples when thinking about it.
9
+
10
+ Fair:
11
+
12
+ - Respond promptly to submitted issues / PRs.
13
+ - Contributors spend time on submissions and it is not fair to not do the same in return.
14
+ - Aim for robust / tested code and systems.
15
+ - It is not fair to users to give them a tool that only half-works and causes them frustration.
16
+ - Acknowledge others' points, even if disagreeing, instead of ignoring.
17
+ - People engage in good faith, and it is not fair to leave it wasted.
18
+
19
+ Unfair:
20
+
21
+ - Keep issues about bugs or significant pain points open for a long time or suggest the contributor can raise a PR.
22
+ - Users are not maintainers and it is not fair to expect them to become one to fix a bug
23
+ (it is always welcome when they have the time and will to contribute though).
24
+ - Prioritize issues and discussions with friends, acquaintances, or those in the same timezone over others.
25
+ - This is OSS and it is not fair to create boundaries or factions within it.
26
+
27
+ We are not perfect and may act in a way that isn't fair. This is fine and generally will not
28
+ need punitive measures - we will aim to improve over time. But do accept feedback about it in
29
+ good faith and respond to it fairly. If you need to provide feedback related to the above in
30
+ a private matter, feel free to email oss@curioswitch.org and we will aim to help in a fair
31
+ manner.