robin-sparkless 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 (253) hide show
  1. robin_sparkless-0.1.0/.cargo/audit.toml +3 -0
  2. robin_sparkless-0.1.0/.github/workflows/ci.yml +246 -0
  3. robin_sparkless-0.1.0/.github/workflows/python_publish_failed.yml +43 -0
  4. robin_sparkless-0.1.0/.github/workflows/python_publish_manual.yml +119 -0
  5. robin_sparkless-0.1.0/.github/workflows/release.yml +417 -0
  6. robin_sparkless-0.1.0/.gitignore +58 -0
  7. robin_sparkless-0.1.0/.python-version +1 -0
  8. robin_sparkless-0.1.0/.readthedocs.yaml +18 -0
  9. robin_sparkless-0.1.0/CHANGELOG.md +245 -0
  10. robin_sparkless-0.1.0/Cargo.lock +5034 -0
  11. robin_sparkless-0.1.0/Cargo.toml +69 -0
  12. robin_sparkless-0.1.0/Makefile +82 -0
  13. robin_sparkless-0.1.0/PKG-INFO +72 -0
  14. robin_sparkless-0.1.0/README-Python.md +57 -0
  15. robin_sparkless-0.1.0/README.md +151 -0
  16. robin_sparkless-0.1.0/benches/filter_select_groupby.rs +76 -0
  17. robin_sparkless-0.1.0/deny.toml +48 -0
  18. robin_sparkless-0.1.0/docs/COMPILATION_STATUS.md +17 -0
  19. robin_sparkless-0.1.0/docs/CONVERTER_STATUS.md +70 -0
  20. robin_sparkless-0.1.0/docs/FULL_BACKEND_ROADMAP.md +342 -0
  21. robin_sparkless-0.1.0/docs/GAP_ANALYSIS_SPARKLESS_3.28.md +278 -0
  22. robin_sparkless-0.1.0/docs/IMPLEMENTATION_STATUS.md +100 -0
  23. robin_sparkless-0.1.0/docs/LOGICAL_PLAN_FORMAT.md +155 -0
  24. robin_sparkless-0.1.0/docs/MIGRATION_STATUS.md +56 -0
  25. robin_sparkless-0.1.0/docs/PARITY_CHECK_SPARKLESS_3.28.md +380 -0
  26. robin_sparkless-0.1.0/docs/PARITY_STATUS.md +220 -0
  27. robin_sparkless-0.1.0/docs/PHASE15_GAP_LIST.md +62 -0
  28. robin_sparkless-0.1.0/docs/PYSPARK_DIFFERENCES.md +100 -0
  29. robin_sparkless-0.1.0/docs/PYTHON_API.md +146 -0
  30. robin_sparkless-0.1.0/docs/QUICKSTART.md +155 -0
  31. robin_sparkless-0.1.0/docs/READINESS_FOR_SPARKLESS_PLAN.md +89 -0
  32. robin_sparkless-0.1.0/docs/README.md +29 -0
  33. robin_sparkless-0.1.0/docs/RELEASING.md +42 -0
  34. robin_sparkless-0.1.0/docs/ROADMAP.md +531 -0
  35. robin_sparkless-0.1.0/docs/ROBIN_SPARKLESS_MISSING.md +99 -0
  36. robin_sparkless-0.1.0/docs/SIGNATURE_ALIGNMENT_TASKS.md +274 -0
  37. robin_sparkless-0.1.0/docs/SIGNATURE_GAP_ANALYSIS.md +192 -0
  38. robin_sparkless-0.1.0/docs/SPARKLESS_3.28_API_SNAPSHOT.md +103 -0
  39. robin_sparkless-0.1.0/docs/SPARKLESS_INTEGRATION_ANALYSIS.md +319 -0
  40. robin_sparkless-0.1.0/docs/SPARKLESS_PARITY_ISSUES_REPORTED.md +34 -0
  41. robin_sparkless-0.1.0/docs/SPARKLESS_PARITY_STATUS.md +60 -0
  42. robin_sparkless-0.1.0/docs/SPARKLESS_REFACTOR_PLAN.md +140 -0
  43. robin_sparkless-0.1.0/docs/TEST_CREATION_GUIDE.md +238 -0
  44. robin_sparkless-0.1.0/docs/index.md +38 -0
  45. robin_sparkless-0.1.0/docs/requirements.txt +4 -0
  46. robin_sparkless-0.1.0/docs/signature_comparison.json +12754 -0
  47. robin_sparkless-0.1.0/docs/signatures_pyspark.json +8199 -0
  48. robin_sparkless-0.1.0/docs/signatures_robin_sparkless.json +6116 -0
  49. robin_sparkless-0.1.0/examples/complex_filters.rs +80 -0
  50. robin_sparkless-0.1.0/mkdocs.yml +77 -0
  51. robin_sparkless-0.1.0/pyproject.toml +25 -0
  52. robin_sparkless-0.1.0/requirements-ci.txt +4 -0
  53. robin_sparkless-0.1.0/rust-toolchain.toml +5 -0
  54. robin_sparkless-0.1.0/scripts/bench_robin_vs_sparkless.py +358 -0
  55. robin_sparkless-0.1.0/scripts/compare_signatures.py +344 -0
  56. robin_sparkless-0.1.0/scripts/export_pyspark_signatures.py +190 -0
  57. robin_sparkless-0.1.0/scripts/export_robin_signatures.py +148 -0
  58. robin_sparkless-0.1.0/scripts/sparkless_parity_check.py +395 -0
  59. robin_sparkless-0.1.0/scripts/write_signature_alignment_tasks.py +166 -0
  60. robin_sparkless-0.1.0/src/column.rs +2795 -0
  61. robin_sparkless-0.1.0/src/dataframe/aggregations.rs +754 -0
  62. robin_sparkless-0.1.0/src/dataframe/joins.rs +120 -0
  63. robin_sparkless-0.1.0/src/dataframe/mod.rs +777 -0
  64. robin_sparkless-0.1.0/src/dataframe/stats.rs +223 -0
  65. robin_sparkless-0.1.0/src/dataframe/transformations.rs +1139 -0
  66. robin_sparkless-0.1.0/src/delta/mod.rs +264 -0
  67. robin_sparkless-0.1.0/src/expression.rs +28 -0
  68. robin_sparkless-0.1.0/src/functions.rs +2772 -0
  69. robin_sparkless-0.1.0/src/lib.rs +35 -0
  70. robin_sparkless-0.1.0/src/plan/expr.rs +1718 -0
  71. robin_sparkless-0.1.0/src/plan/mod.rs +333 -0
  72. robin_sparkless-0.1.0/src/python/mod.rs +3984 -0
  73. robin_sparkless-0.1.0/src/schema.rs +326 -0
  74. robin_sparkless-0.1.0/src/session.rs +781 -0
  75. robin_sparkless-0.1.0/src/sql/mod.rs +87 -0
  76. robin_sparkless-0.1.0/src/sql/parser.rs +39 -0
  77. robin_sparkless-0.1.0/src/sql/translator.rs +452 -0
  78. robin_sparkless-0.1.0/src/type_coercion.rs +122 -0
  79. robin_sparkless-0.1.0/src/udfs.rs +3664 -0
  80. robin_sparkless-0.1.0/tests/convert_sparkless_fixtures.py +320 -0
  81. robin_sparkless-0.1.0/tests/error_handling.rs +200 -0
  82. robin_sparkless-0.1.0/tests/fixtures/array_append.json +31 -0
  83. robin_sparkless-0.1.0/tests/fixtures/array_contains.json +41 -0
  84. robin_sparkless-0.1.0/tests/fixtures/array_distinct.json +1 -0
  85. robin_sparkless-0.1.0/tests/fixtures/array_except.json +33 -0
  86. robin_sparkless-0.1.0/tests/fixtures/array_insert.json +33 -0
  87. robin_sparkless-0.1.0/tests/fixtures/array_intersect.json +33 -0
  88. robin_sparkless-0.1.0/tests/fixtures/array_prepend.json +31 -0
  89. robin_sparkless-0.1.0/tests/fixtures/array_size.json +41 -0
  90. robin_sparkless-0.1.0/tests/fixtures/array_sum.json +37 -0
  91. robin_sparkless-0.1.0/tests/fixtures/array_union.json +33 -0
  92. robin_sparkless-0.1.0/tests/fixtures/arrays_overlap.json +33 -0
  93. robin_sparkless-0.1.0/tests/fixtures/arrays_zip.json +32 -0
  94. robin_sparkless-0.1.0/tests/fixtures/assert_true.json +32 -0
  95. robin_sparkless-0.1.0/tests/fixtures/assert_true_err_msg.json +32 -0
  96. robin_sparkless-0.1.0/tests/fixtures/case_insensitive_columns.json +30 -0
  97. robin_sparkless-0.1.0/tests/fixtures/coalesce.json +113 -0
  98. robin_sparkless-0.1.0/tests/fixtures/cross_join.json +32 -0
  99. robin_sparkless-0.1.0/tests/fixtures/cume_dist_window.json +46 -0
  100. robin_sparkless-0.1.0/tests/fixtures/date_add_sub.json +31 -0
  101. robin_sparkless-0.1.0/tests/fixtures/date_from_unix_date.json +30 -0
  102. robin_sparkless-0.1.0/tests/fixtures/datediff.json +31 -0
  103. robin_sparkless-0.1.0/tests/fixtures/datetime_hour_minute.json +31 -0
  104. robin_sparkless-0.1.0/tests/fixtures/datetime_quarter_week.json +37 -0
  105. robin_sparkless-0.1.0/tests/fixtures/describe.json +32 -0
  106. robin_sparkless-0.1.0/tests/fixtures/distinct.json +32 -0
  107. robin_sparkless-0.1.0/tests/fixtures/drop_columns.json +28 -0
  108. robin_sparkless-0.1.0/tests/fixtures/dropna.json +28 -0
  109. robin_sparkless-0.1.0/tests/fixtures/element_at.json +41 -0
  110. robin_sparkless-0.1.0/tests/fixtures/factorial.json +34 -0
  111. robin_sparkless-0.1.0/tests/fixtures/fillna.json +27 -0
  112. robin_sparkless-0.1.0/tests/fixtures/filter_age_gt_30.json +77 -0
  113. robin_sparkless-0.1.0/tests/fixtures/filter_and_or.json +85 -0
  114. robin_sparkless-0.1.0/tests/fixtures/filter_nested.json +111 -0
  115. robin_sparkless-0.1.0/tests/fixtures/filter_not.json +71 -0
  116. robin_sparkless-0.1.0/tests/fixtures/find_in_set.json +1 -0
  117. robin_sparkless-0.1.0/tests/fixtures/first_row.json +29 -0
  118. robin_sparkless-0.1.0/tests/fixtures/first_value_window.json +47 -0
  119. robin_sparkless-0.1.0/tests/fixtures/format_string.json +1 -0
  120. robin_sparkless-0.1.0/tests/fixtures/from_unixtime.json +32 -0
  121. robin_sparkless-0.1.0/tests/fixtures/from_utc_timestamp_test.json +28 -0
  122. robin_sparkless-0.1.0/tests/fixtures/get_map.json +27 -0
  123. robin_sparkless-0.1.0/tests/fixtures/groupby_any_value.json +35 -0
  124. robin_sparkless-0.1.0/tests/fixtures/groupby_avg.json +96 -0
  125. robin_sparkless-0.1.0/tests/fixtures/groupby_count.json +95 -0
  126. robin_sparkless-0.1.0/tests/fixtures/groupby_first_last.json +39 -0
  127. robin_sparkless-0.1.0/tests/fixtures/groupby_max.json +96 -0
  128. robin_sparkless-0.1.0/tests/fixtures/groupby_median.json +37 -0
  129. robin_sparkless-0.1.0/tests/fixtures/groupby_min.json +96 -0
  130. robin_sparkless-0.1.0/tests/fixtures/groupby_multi_agg.json +117 -0
  131. robin_sparkless-0.1.0/tests/fixtures/groupby_null_keys.json +105 -0
  132. robin_sparkless-0.1.0/tests/fixtures/groupby_product.json +35 -0
  133. robin_sparkless-0.1.0/tests/fixtures/groupby_single_group.json +35 -0
  134. robin_sparkless-0.1.0/tests/fixtures/groupby_single_row_groups.json +37 -0
  135. robin_sparkless-0.1.0/tests/fixtures/groupby_stddev_count_distinct.json +39 -0
  136. robin_sparkless-0.1.0/tests/fixtures/groupby_sum.json +96 -0
  137. robin_sparkless-0.1.0/tests/fixtures/groupby_with_nulls.json +90 -0
  138. robin_sparkless-0.1.0/tests/fixtures/head_n.json +32 -0
  139. robin_sparkless-0.1.0/tests/fixtures/ilike_escape_char.json +31 -0
  140. robin_sparkless-0.1.0/tests/fixtures/inner_join.json +153 -0
  141. robin_sparkless-0.1.0/tests/fixtures/intersect.json +26 -0
  142. robin_sparkless-0.1.0/tests/fixtures/join_duplicate_keys.json +43 -0
  143. robin_sparkless-0.1.0/tests/fixtures/join_null_keys.json +43 -0
  144. robin_sparkless-0.1.0/tests/fixtures/json_array_length_test.json +31 -0
  145. robin_sparkless-0.1.0/tests/fixtures/json_get_json_object.json +31 -0
  146. robin_sparkless-0.1.0/tests/fixtures/lag_lead_window.json +158 -0
  147. robin_sparkless-0.1.0/tests/fixtures/last_value_window.json +47 -0
  148. robin_sparkless-0.1.0/tests/fixtures/left_join.json +171 -0
  149. robin_sparkless-0.1.0/tests/fixtures/like_escape_char.json +35 -0
  150. robin_sparkless-0.1.0/tests/fixtures/limit.json +32 -0
  151. robin_sparkless-0.1.0/tests/fixtures/make_date.json +36 -0
  152. robin_sparkless-0.1.0/tests/fixtures/make_timestamp_test.json +33 -0
  153. robin_sparkless-0.1.0/tests/fixtures/make_timestamp_timezone.json +31 -0
  154. robin_sparkless-0.1.0/tests/fixtures/map_concat.json +28 -0
  155. robin_sparkless-0.1.0/tests/fixtures/map_contains_key.json +27 -0
  156. robin_sparkless-0.1.0/tests/fixtures/map_filter.json +26 -0
  157. robin_sparkless-0.1.0/tests/fixtures/map_zip_with.json +28 -0
  158. robin_sparkless-0.1.0/tests/fixtures/math_cosh_cbrt.json +48 -0
  159. robin_sparkless-0.1.0/tests/fixtures/math_sin_cos.json +35 -0
  160. robin_sparkless-0.1.0/tests/fixtures/math_sqrt_pow.json +33 -0
  161. robin_sparkless-0.1.0/tests/fixtures/months_between_round_off.json +33 -0
  162. robin_sparkless-0.1.0/tests/fixtures/named_struct_test.json +31 -0
  163. robin_sparkless-0.1.0/tests/fixtures/nth_value_window.json +48 -0
  164. robin_sparkless-0.1.0/tests/fixtures/ntile_window.json +47 -0
  165. robin_sparkless-0.1.0/tests/fixtures/null_comparison_equality.json +115 -0
  166. robin_sparkless-0.1.0/tests/fixtures/null_comparison_ordering.json +115 -0
  167. robin_sparkless-0.1.0/tests/fixtures/null_in_filter.json +78 -0
  168. robin_sparkless-0.1.0/tests/fixtures/null_safe_equality.json +124 -0
  169. robin_sparkless-0.1.0/tests/fixtures/offset_n.json +31 -0
  170. robin_sparkless-0.1.0/tests/fixtures/outer_join.json +180 -0
  171. robin_sparkless-0.1.0/tests/fixtures/parse_url_key.json +31 -0
  172. robin_sparkless-0.1.0/tests/fixtures/percent_rank_window.json +46 -0
  173. robin_sparkless-0.1.0/tests/fixtures/phase15_aliases_nvl_isnull.json +58 -0
  174. robin_sparkless-0.1.0/tests/fixtures/plans/filter_select_limit.json +31 -0
  175. robin_sparkless-0.1.0/tests/fixtures/plans/join_simple.json +39 -0
  176. robin_sparkless-0.1.0/tests/fixtures/plans/with_column_functions.json +49 -0
  177. robin_sparkless-0.1.0/tests/fixtures/pmod.json +34 -0
  178. robin_sparkless-0.1.0/tests/fixtures/position_start.json +35 -0
  179. robin_sparkless-0.1.0/tests/fixtures/raise_error.json +19 -0
  180. robin_sparkless-0.1.0/tests/fixtures/rank_window.json +142 -0
  181. robin_sparkless-0.1.0/tests/fixtures/read_csv.json +81 -0
  182. robin_sparkless-0.1.0/tests/fixtures/read_json.json +81 -0
  183. robin_sparkless-0.1.0/tests/fixtures/read_parquet.json +85 -0
  184. robin_sparkless-0.1.0/tests/fixtures/regexp_count.json +1 -0
  185. robin_sparkless-0.1.0/tests/fixtures/regexp_extract_all.json +35 -0
  186. robin_sparkless-0.1.0/tests/fixtures/regexp_instr.json +1 -0
  187. robin_sparkless-0.1.0/tests/fixtures/regexp_like.json +35 -0
  188. robin_sparkless-0.1.0/tests/fixtures/regexp_substr.json +1 -0
  189. robin_sparkless-0.1.0/tests/fixtures/replace.json +30 -0
  190. robin_sparkless-0.1.0/tests/fixtures/right_join.json +171 -0
  191. robin_sparkless-0.1.0/tests/fixtures/row_number_window.json +155 -0
  192. robin_sparkless-0.1.0/tests/fixtures/split_part.json +1 -0
  193. robin_sparkless-0.1.0/tests/fixtures/string_ascii.json +39 -0
  194. robin_sparkless-0.1.0/tests/fixtures/string_concat.json +93 -0
  195. robin_sparkless-0.1.0/tests/fixtures/string_crc32.json +31 -0
  196. robin_sparkless-0.1.0/tests/fixtures/string_format_number.json +39 -0
  197. robin_sparkless-0.1.0/tests/fixtures/string_left_right_replace.json +54 -0
  198. robin_sparkless-0.1.0/tests/fixtures/string_length_trim.json +41 -0
  199. robin_sparkless-0.1.0/tests/fixtures/string_levenshtein.json +33 -0
  200. robin_sparkless-0.1.0/tests/fixtures/string_lpad_rpad.json +31 -0
  201. robin_sparkless-0.1.0/tests/fixtures/string_mask.json +29 -0
  202. robin_sparkless-0.1.0/tests/fixtures/string_repeat_reverse.json +31 -0
  203. robin_sparkless-0.1.0/tests/fixtures/string_soundex.json +31 -0
  204. robin_sparkless-0.1.0/tests/fixtures/string_substring.json +79 -0
  205. robin_sparkless-0.1.0/tests/fixtures/string_substring_index.json +33 -0
  206. robin_sparkless-0.1.0/tests/fixtures/string_translate.json +29 -0
  207. robin_sparkless-0.1.0/tests/fixtures/string_upper_lower.json +105 -0
  208. robin_sparkless-0.1.0/tests/fixtures/string_xxhash64.json +29 -0
  209. robin_sparkless-0.1.0/tests/fixtures/struct_test.json +31 -0
  210. robin_sparkless-0.1.0/tests/fixtures/subtract.json +26 -0
  211. robin_sparkless-0.1.0/tests/fixtures/summary.json +32 -0
  212. robin_sparkless-0.1.0/tests/fixtures/timestamp_micros.json +30 -0
  213. robin_sparkless-0.1.0/tests/fixtures/timestamp_millis.json +30 -0
  214. robin_sparkless-0.1.0/tests/fixtures/timestamp_seconds.json +30 -0
  215. robin_sparkless-0.1.0/tests/fixtures/timestampadd_test.json +30 -0
  216. robin_sparkless-0.1.0/tests/fixtures/to_char_format.json +28 -0
  217. robin_sparkless-0.1.0/tests/fixtures/to_timestamp_format.json +28 -0
  218. robin_sparkless-0.1.0/tests/fixtures/try_divide.json +33 -0
  219. robin_sparkless-0.1.0/tests/fixtures/type_coercion_mixed.json +102 -0
  220. robin_sparkless-0.1.0/tests/fixtures/type_coercion_numeric.json +93 -0
  221. robin_sparkless-0.1.0/tests/fixtures/union_all.json +42 -0
  222. robin_sparkless-0.1.0/tests/fixtures/union_by_name.json +42 -0
  223. robin_sparkless-0.1.0/tests/fixtures/unix_date.json +30 -0
  224. robin_sparkless-0.1.0/tests/fixtures/unix_timestamp.json +32 -0
  225. robin_sparkless-0.1.0/tests/fixtures/when_otherwise.json +96 -0
  226. robin_sparkless-0.1.0/tests/fixtures/when_then_otherwise.json +96 -0
  227. robin_sparkless-0.1.0/tests/fixtures/when_two_arg.json +34 -0
  228. robin_sparkless-0.1.0/tests/fixtures/width_bucket.json +33 -0
  229. robin_sparkless-0.1.0/tests/fixtures/with_arithmetic_logical_mix.json +130 -0
  230. robin_sparkless-0.1.0/tests/fixtures/with_bit_ops.json +44 -0
  231. robin_sparkless-0.1.0/tests/fixtures/with_bround.json +33 -0
  232. robin_sparkless-0.1.0/tests/fixtures/with_btrim.json +33 -0
  233. robin_sparkless-0.1.0/tests/fixtures/with_column_renamed.json +29 -0
  234. robin_sparkless-0.1.0/tests/fixtures/with_conv.json +33 -0
  235. robin_sparkless-0.1.0/tests/fixtures/with_curdate_now.json +31 -0
  236. robin_sparkless-0.1.0/tests/fixtures/with_dayname.json +30 -0
  237. robin_sparkless-0.1.0/tests/fixtures/with_extract.json +30 -0
  238. robin_sparkless-0.1.0/tests/fixtures/with_hash.json +32 -0
  239. robin_sparkless-0.1.0/tests/fixtures/with_hex.json +31 -0
  240. robin_sparkless-0.1.0/tests/fixtures/with_isin.json +34 -0
  241. robin_sparkless-0.1.0/tests/fixtures/with_jvm_stubs.json +40 -0
  242. robin_sparkless-0.1.0/tests/fixtures/with_logical_column.json +113 -0
  243. robin_sparkless-0.1.0/tests/fixtures/with_rand_seed.json +28 -0
  244. robin_sparkless-0.1.0/tests/fixtures/with_shift_left.json +32 -0
  245. robin_sparkless-0.1.0/tests/fixtures/with_str_to_map.json +33 -0
  246. robin_sparkless-0.1.0/tests/fixtures/with_unix_micros.json +28 -0
  247. robin_sparkless-0.1.0/tests/fixtures/with_url_decode.json +28 -0
  248. robin_sparkless-0.1.0/tests/fixtures/with_url_encode.json +28 -0
  249. robin_sparkless-0.1.0/tests/fixtures/with_weekday.json +30 -0
  250. robin_sparkless-0.1.0/tests/fixtures/zip_with.json +33 -0
  251. robin_sparkless-0.1.0/tests/gen_pyspark_cases.py +1507 -0
  252. robin_sparkless-0.1.0/tests/parity.rs +5311 -0
  253. robin_sparkless-0.1.0/tests/python/test_robin_sparkless.py +207 -0
@@ -0,0 +1,3 @@
1
+ # cargo-audit: ignore unmaintained transitive deps (paste, rustls-pemfile) from deltalake
2
+ [advisories]
3
+ ignore = ["RUSTSEC-2024-0436", "RUSTSEC-2025-0134"]
@@ -0,0 +1,246 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, master]
6
+ pull_request:
7
+ branches: [main, master]
8
+
9
+ jobs:
10
+ format:
11
+ name: Format
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - name: Install Rust
16
+ uses: dtolnay/rust-toolchain@master
17
+ with:
18
+ toolchain: 1.89.0
19
+ components: rustfmt
20
+ - name: Cache cargo
21
+ uses: actions/cache@v4
22
+ with:
23
+ path: |
24
+ ~/.cargo/registry
25
+ ~/.cargo/git
26
+ target
27
+ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
28
+ restore-keys: |
29
+ ${{ runner.os }}-cargo-
30
+ - name: Check format
31
+ run: cargo fmt --check
32
+
33
+ clippy:
34
+ name: Clippy
35
+ runs-on: ubuntu-latest
36
+ steps:
37
+ - uses: actions/checkout@v4
38
+ - name: Install Rust
39
+ uses: dtolnay/rust-toolchain@master
40
+ with:
41
+ toolchain: 1.89.0
42
+ components: clippy
43
+ - name: Cache cargo
44
+ uses: actions/cache@v4
45
+ with:
46
+ path: |
47
+ ~/.cargo/registry
48
+ ~/.cargo/git
49
+ target
50
+ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
51
+ restore-keys: |
52
+ ${{ runner.os }}-cargo-
53
+ - name: Clippy
54
+ run: cargo clippy -- -D warnings
55
+
56
+ audit:
57
+ name: Audit
58
+ runs-on: ubuntu-latest
59
+ steps:
60
+ - uses: actions/checkout@v4
61
+ - name: Install Rust
62
+ uses: dtolnay/rust-toolchain@master
63
+ with:
64
+ toolchain: 1.89.0
65
+ - name: Install cargo-audit
66
+ run: cargo install cargo-audit
67
+ - name: Cache cargo
68
+ uses: actions/cache@v4
69
+ with:
70
+ path: |
71
+ ~/.cargo/registry
72
+ ~/.cargo/git
73
+ target
74
+ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
75
+ restore-keys: |
76
+ ${{ runner.os }}-cargo-
77
+ - name: Audit
78
+ run: cargo audit
79
+
80
+ deny:
81
+ name: Deny
82
+ runs-on: ubuntu-latest
83
+ steps:
84
+ - uses: actions/checkout@v4
85
+ - name: Install Rust
86
+ uses: dtolnay/rust-toolchain@master
87
+ with:
88
+ toolchain: 1.89.0
89
+ - name: Install cargo-deny
90
+ run: cargo install cargo-deny
91
+ - name: Cache cargo
92
+ uses: actions/cache@v4
93
+ with:
94
+ path: |
95
+ ~/.cargo/registry
96
+ ~/.cargo/git
97
+ target
98
+ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
99
+ restore-keys: |
100
+ ${{ runner.os }}-cargo-
101
+ - name: Deny
102
+ run: cargo deny check advisories bans sources
103
+
104
+ build:
105
+ name: Build test binaries
106
+ runs-on: ubuntu-latest
107
+ steps:
108
+ - uses: actions/checkout@v4
109
+
110
+ - name: Install Rust
111
+ uses: dtolnay/rust-toolchain@master
112
+ with:
113
+ toolchain: 1.89.0
114
+
115
+ - name: Cache cargo
116
+ uses: actions/cache@v4
117
+ with:
118
+ path: |
119
+ ~/.cargo/registry
120
+ ~/.cargo/git
121
+ target
122
+ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
123
+ restore-keys: |
124
+ ${{ runner.os }}-cargo-
125
+
126
+ - name: Build test binaries
127
+ run: cargo build --tests
128
+ env:
129
+ CARGO_BUILD_JOBS: 1
130
+
131
+ test-error-handling:
132
+ name: Test (error_handling)
133
+ runs-on: ubuntu-latest
134
+ needs: build
135
+ timeout-minutes: 10
136
+ steps:
137
+ - uses: actions/checkout@v4
138
+ - name: Install Rust
139
+ uses: dtolnay/rust-toolchain@master
140
+ with:
141
+ toolchain: 1.89.0
142
+ - name: Install cargo-nextest
143
+ run: cargo install cargo-nextest --version 0.9.92 --locked
144
+ - name: Cache cargo
145
+ uses: actions/cache@v4
146
+ with:
147
+ path: |
148
+ ~/.cargo/registry
149
+ ~/.cargo/git
150
+ target
151
+ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
152
+ restore-keys: |
153
+ ${{ runner.os }}-cargo-
154
+ - name: Test error_handling
155
+ run: cargo nextest run --test error_handling
156
+ env:
157
+ NEXTEST_THREADS: "1"
158
+
159
+ test-parity:
160
+ name: Test (parity)
161
+ runs-on: ubuntu-latest
162
+ needs: build
163
+ timeout-minutes: 15
164
+ steps:
165
+ - uses: actions/checkout@v4
166
+ - name: Install Rust
167
+ uses: dtolnay/rust-toolchain@master
168
+ with:
169
+ toolchain: 1.89.0
170
+ - name: Install cargo-nextest
171
+ run: cargo install cargo-nextest --version 0.9.92 --locked
172
+ - name: Cache cargo
173
+ uses: actions/cache@v4
174
+ with:
175
+ path: |
176
+ ~/.cargo/registry
177
+ ~/.cargo/git
178
+ target
179
+ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
180
+ restore-keys: |
181
+ ${{ runner.os }}-cargo-
182
+ - name: Test parity
183
+ run: cargo nextest run --test parity
184
+ env:
185
+ NEXTEST_THREADS: "1"
186
+
187
+ python-tests:
188
+ name: Python tests (PyO3) - ${{ matrix.os }} py${{ matrix.python-version }}
189
+ runs-on: ${{ matrix.os }}
190
+ strategy:
191
+ fail-fast: false
192
+ matrix:
193
+ os: [ubuntu-latest, windows-latest, macos-latest]
194
+ python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"]
195
+ defaults:
196
+ run:
197
+ shell: bash
198
+ steps:
199
+ - uses: actions/checkout@v4
200
+
201
+ - name: Set up Python
202
+ uses: actions/setup-python@v5
203
+ with:
204
+ python-version: ${{ matrix.python-version }}
205
+
206
+ - name: Install Rust
207
+ uses: dtolnay/rust-toolchain@master
208
+ with:
209
+ toolchain: 1.89.0
210
+ components: clippy, rustfmt
211
+
212
+ - name: Cache cargo
213
+ uses: actions/cache@v4
214
+ with:
215
+ path: |
216
+ ~/.cargo/registry
217
+ ~/.cargo/git
218
+ target
219
+ key: ${{ runner.os }}-cargo-py-${{ hashFiles('**/Cargo.lock') }}
220
+ restore-keys: |
221
+ ${{ runner.os }}-cargo-py-
222
+
223
+ - name: Create venv
224
+ run: python -m venv .venv
225
+
226
+ - name: Set Python path
227
+ run: |
228
+ if [ "$RUNNER_OS" = "Windows" ]; then
229
+ echo "PY=.venv/Scripts/python" >> $GITHUB_ENV
230
+ else
231
+ echo "PY=.venv/bin/python" >> $GITHUB_ENV
232
+ fi
233
+
234
+ - name: Verify Python version
235
+ run: $PY --version
236
+
237
+ - name: Install maturin and pytest
238
+ run: $PY -m pip install -r requirements-ci.txt
239
+
240
+ - name: Build and install extension
241
+ run: $PY -m maturin develop --features pyo3 --release
242
+ env:
243
+ VIRTUAL_ENV: ${{ github.workspace }}/.venv
244
+
245
+ - name: Run Python tests
246
+ run: $PY -m pytest tests/python/ -v
@@ -0,0 +1,43 @@
1
+ name: Python publish (failed targets only)
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ version:
7
+ description: "Package version to (re)publish (for reference only)"
8
+ required: false
9
+ default: ""
10
+
11
+ env:
12
+ # All jobs assume this secret is configured with a PyPI API token
13
+ MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
14
+
15
+ jobs:
16
+ pypi-manylinux-x86_64:
17
+ name: PyPI manylinux (x86_64) + sdist
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+ - name: Publish to PyPI (manylinux x86_64 + sdist)
22
+ uses: messense/maturin-action@v1
23
+ with:
24
+ target: x86_64-unknown-linux-gnu
25
+ command: publish
26
+ args: --skip-existing --zig
27
+ manylinux: "2_17"
28
+ container: off
29
+
30
+ pypi-manylinux-aarch64:
31
+ name: PyPI manylinux (aarch64)
32
+ runs-on: ubuntu-24.04-arm
33
+ steps:
34
+ - uses: actions/checkout@v4
35
+ - name: Publish to PyPI (manylinux aarch64)
36
+ uses: messense/maturin-action@v1
37
+ with:
38
+ target: aarch64-unknown-linux-gnu
39
+ command: publish
40
+ args: --skip-existing --no-sdist --zig
41
+ manylinux: "2_28"
42
+ container: off
43
+
@@ -0,0 +1,119 @@
1
+ name: Python publish (manual)
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ publish-crate:
7
+ description: "Also publish Rust crate to crates.io"
8
+ required: false
9
+ default: "false"
10
+ type: choice
11
+ options: ["false", "true"]
12
+
13
+ jobs:
14
+ # Optional: re-publish the Rust crate when requested.
15
+ publish-crate:
16
+ if: ${{ inputs.publish-crate == 'true' }}
17
+ name: Publish crate to crates.io (manual)
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+ - name: Install Rust
22
+ uses: dtolnay/rust-toolchain@master
23
+ with:
24
+ toolchain: 1.89.0
25
+ - name: Cache cargo
26
+ uses: actions/cache@v4
27
+ with:
28
+ path: |
29
+ ~/.cargo/registry
30
+ ~/.cargo/git
31
+ target
32
+ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
33
+ restore-keys: |
34
+ ${{ runner.os }}-cargo-
35
+ - name: Publish to crates.io
36
+ run: cargo publish --token ${{ secrets.CARGO_REGISTRY_TOKEN }}
37
+
38
+ pypi-manylinux-x86_64:
39
+ name: PyPI manylinux (x86_64) + sdist (manual)
40
+ runs-on: ubuntu-latest
41
+ needs: []
42
+ steps:
43
+ - uses: actions/checkout@v4
44
+ - name: Publish to PyPI (manylinux x86_64 + sdist)
45
+ uses: messense/maturin-action@v1
46
+ env:
47
+ MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
48
+ with:
49
+ target: x86_64-unknown-linux-gnu
50
+ command: publish
51
+ args: --skip-existing --zig
52
+ manylinux: "2_17"
53
+ container: off
54
+
55
+ pypi-manylinux-aarch64:
56
+ name: PyPI manylinux (aarch64) (manual)
57
+ runs-on: ubuntu-24.04-arm
58
+ needs: []
59
+ steps:
60
+ - uses: actions/checkout@v4
61
+ - name: Publish to PyPI (manylinux aarch64)
62
+ uses: messense/maturin-action@v1
63
+ env:
64
+ MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
65
+ with:
66
+ target: aarch64-unknown-linux-gnu
67
+ command: publish
68
+ args: --skip-existing --no-sdist --zig
69
+ manylinux: "2_28"
70
+ container: off
71
+
72
+ pypi-musllinux-x86_64:
73
+ name: PyPI musllinux (x86_64, musl 1.2+) (manual)
74
+ runs-on: ubuntu-latest
75
+ needs: []
76
+ steps:
77
+ - uses: actions/checkout@v4
78
+ - name: Publish to PyPI (musllinux x86_64)
79
+ uses: messense/maturin-action@v1
80
+ env:
81
+ MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
82
+ with:
83
+ target: x86_64-unknown-linux-musl
84
+ command: publish
85
+ args: --skip-existing --no-sdist --zig --compatibility musllinux_1_2
86
+
87
+ pypi-musllinux-aarch64:
88
+ name: PyPI musllinux (aarch64, musl 1.2+) (manual)
89
+ runs-on: ubuntu-24.04-arm
90
+ needs: []
91
+ steps:
92
+ - uses: actions/checkout@v4
93
+ - name: Publish to PyPI (musllinux aarch64)
94
+ uses: messense/maturin-action@v1
95
+ env:
96
+ MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
97
+ with:
98
+ target: aarch64-unknown-linux-musl
99
+ command: publish
100
+ args: --skip-existing --no-sdist --zig --compatibility musllinux_1_2
101
+
102
+ pypi-mac:
103
+ name: PyPI macOS (${{ matrix.target }}) (manual)
104
+ runs-on: macos-14
105
+ strategy:
106
+ fail-fast: false
107
+ matrix:
108
+ target: [x86_64-apple-darwin, aarch64-apple-darwin]
109
+ steps:
110
+ - uses: actions/checkout@v4
111
+ - name: Publish to PyPI (macOS)
112
+ uses: messense/maturin-action@v1
113
+ env:
114
+ MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
115
+ with:
116
+ target: ${{ matrix.target }}
117
+ command: publish
118
+ args: --skip-existing --no-sdist
119
+