bareduckdb 0.20.200__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 (203) hide show
  1. bareduckdb-0.20.200/.github/workflows/README_ACT.md +70 -0
  2. bareduckdb-0.20.200/.github/workflows/benchmarks.yml +100 -0
  3. bareduckdb-0.20.200/.github/workflows/build_wheels.yml +146 -0
  4. bareduckdb-0.20.200/.github/workflows/dev_versions.yml +325 -0
  5. bareduckdb-0.20.200/.github/workflows/graalpy.yml +39 -0
  6. bareduckdb-0.20.200/.github/workflows/renovate.yml +40 -0
  7. bareduckdb-0.20.200/.github/workflows/sanitizers.yml +455 -0
  8. bareduckdb-0.20.200/.gitignore +251 -0
  9. bareduckdb-0.20.200/.gitmodules +5 -0
  10. bareduckdb-0.20.200/.pre-commit-config.yaml +53 -0
  11. bareduckdb-0.20.200/.sanitizer-thread-suppressions.txt +23 -0
  12. bareduckdb-0.20.200/.vscode/settings.json +4 -0
  13. bareduckdb-0.20.200/CLAUDE.md +495 -0
  14. bareduckdb-0.20.200/CMakeLists.txt +268 -0
  15. bareduckdb-0.20.200/LICENSE +21 -0
  16. bareduckdb-0.20.200/PKG-INFO +490 -0
  17. bareduckdb-0.20.200/README.md +443 -0
  18. bareduckdb-0.20.200/README_GRAALPY.md +133 -0
  19. bareduckdb-0.20.200/README_PROGRESS.md +194 -0
  20. bareduckdb-0.20.200/pyproject.toml +339 -0
  21. bareduckdb-0.20.200/renovate.json +12 -0
  22. bareduckdb-0.20.200/run_benchmarks.sh +222 -0
  23. bareduckdb-0.20.200/src/bareduckdb/__init__.py +136 -0
  24. bareduckdb-0.20.200/src/bareduckdb/_duckdb_fetch.py +114 -0
  25. bareduckdb-0.20.200/src/bareduckdb/_duckdb_runtime.py +159 -0
  26. bareduckdb-0.20.200/src/bareduckdb/_utils.py +5 -0
  27. bareduckdb-0.20.200/src/bareduckdb/_version.py +24 -0
  28. bareduckdb-0.20.200/src/bareduckdb/aio/__init__.py +5 -0
  29. bareduckdb-0.20.200/src/bareduckdb/aio/async_connection.py +248 -0
  30. bareduckdb-0.20.200/src/bareduckdb/capi/__init__.py +0 -0
  31. bareduckdb-0.20.200/src/bareduckdb/capi/arrow_export.py +87 -0
  32. bareduckdb-0.20.200/src/bareduckdb/capi/impl/__init__.py +0 -0
  33. bareduckdb-0.20.200/src/bareduckdb/capi/impl/_probe.pyx +21 -0
  34. bareduckdb-0.20.200/src/bareduckdb/capi/impl/arrow.pxd +8 -0
  35. bareduckdb-0.20.200/src/bareduckdb/capi/impl/arrow.pyx +273 -0
  36. bareduckdb-0.20.200/src/bareduckdb/capi/impl/arrow_c_data.h +73 -0
  37. bareduckdb-0.20.200/src/bareduckdb/capi/impl/atomics.pxd +86 -0
  38. bareduckdb-0.20.200/src/bareduckdb/capi/impl/connection.pxd +130 -0
  39. bareduckdb-0.20.200/src/bareduckdb/capi/impl/connection.pyx +2149 -0
  40. bareduckdb-0.20.200/src/bareduckdb/capi/impl/duckdb_v2.pxd +1164 -0
  41. bareduckdb-0.20.200/src/bareduckdb/capi/impl/errors.pxd +23 -0
  42. bareduckdb-0.20.200/src/bareduckdb/capi/impl/errors.pyx +98 -0
  43. bareduckdb-0.20.200/src/bareduckdb/capi/impl/result.pxd +98 -0
  44. bareduckdb-0.20.200/src/bareduckdb/capi/impl/result.pyx +2674 -0
  45. bareduckdb-0.20.200/src/bareduckdb/capi/include/HEADER_VERSION.txt +4 -0
  46. bareduckdb-0.20.200/src/bareduckdb/capi/include/duckdb_v2.h +16533 -0
  47. bareduckdb-0.20.200/src/bareduckdb/capi/parse_cache.py +68 -0
  48. bareduckdb-0.20.200/src/bareduckdb/capi/statement_kind.py +36 -0
  49. bareduckdb-0.20.200/src/bareduckdb/compat/__init__.py +10 -0
  50. bareduckdb-0.20.200/src/bareduckdb/compat/arrow_type_names.py +237 -0
  51. bareduckdb-0.20.200/src/bareduckdb/compat/connection_compat.py +288 -0
  52. bareduckdb-0.20.200/src/bareduckdb/compat/module_api.py +63 -0
  53. bareduckdb-0.20.200/src/bareduckdb/compat/result_compat.py +969 -0
  54. bareduckdb-0.20.200/src/bareduckdb/compat/variant.py +164 -0
  55. bareduckdb-0.20.200/src/bareduckdb/core/__init__.py +11 -0
  56. bareduckdb-0.20.200/src/bareduckdb/core/appender.py +100 -0
  57. bareduckdb-0.20.200/src/bareduckdb/core/arrow_timetz.py +123 -0
  58. bareduckdb-0.20.200/src/bareduckdb/core/connection_api.py +147 -0
  59. bareduckdb-0.20.200/src/bareduckdb/core/connection_base.py +604 -0
  60. bareduckdb-0.20.200/src/bareduckdb/core/sql_statement.py +136 -0
  61. bareduckdb-0.20.200/src/bareduckdb/functional/__init__.py +28 -0
  62. bareduckdb-0.20.200/src/bareduckdb/install_duckdb.py +44 -0
  63. bareduckdb-0.20.200/src/bareduckdb/progress.py +82 -0
  64. bareduckdb-0.20.200/src/bareduckdb/py.typed +0 -0
  65. bareduckdb-0.20.200/tests/__init__.py +0 -0
  66. bareduckdb-0.20.200/tests/aio/conftest.py +47 -0
  67. bareduckdb-0.20.200/tests/aio/test_aio_basic.py +38 -0
  68. bareduckdb-0.20.200/tests/aio/test_aio_cancel.py +343 -0
  69. bareduckdb-0.20.200/tests/aio/test_aio_pool.py +155 -0
  70. bareduckdb-0.20.200/tests/capi/__init__.py +0 -0
  71. bareduckdb-0.20.200/tests/capi/pxd_prototypes.txt +184 -0
  72. bareduckdb-0.20.200/tests/capi/test_arrow.py +798 -0
  73. bareduckdb-0.20.200/tests/capi/test_atomics.py +189 -0
  74. bareduckdb-0.20.200/tests/capi/test_connection.py +133 -0
  75. bareduckdb-0.20.200/tests/capi/test_declarations.py +335 -0
  76. bareduckdb-0.20.200/tests/capi/test_duckdb_runtime.py +167 -0
  77. bareduckdb-0.20.200/tests/capi/test_errors.py +26 -0
  78. bareduckdb-0.20.200/tests/capi/test_freethreading.py +26 -0
  79. bareduckdb-0.20.200/tests/capi/test_importer_lifetime.py +54 -0
  80. bareduckdb-0.20.200/tests/capi/test_incremental_scan.py +235 -0
  81. bareduckdb-0.20.200/tests/capi/test_lifetime.py +125 -0
  82. bareduckdb-0.20.200/tests/capi/test_locking.py +190 -0
  83. bareduckdb-0.20.200/tests/capi/test_no_runtime_deps.py +34 -0
  84. bareduckdb-0.20.200/tests/capi/test_partition_order.py +92 -0
  85. bareduckdb-0.20.200/tests/capi/test_projection_import.py +110 -0
  86. bareduckdb-0.20.200/tests/capi/test_projection_pushdown.py +60 -0
  87. bareduckdb-0.20.200/tests/capi/test_register.py +403 -0
  88. bareduckdb-0.20.200/tests/capi/test_register_memory.py +98 -0
  89. bareduckdb-0.20.200/tests/capi/test_register_slicing.py +111 -0
  90. bareduckdb-0.20.200/tests/capi/test_result.py +783 -0
  91. bareduckdb-0.20.200/tests/capi/test_single_scan_registration.py +133 -0
  92. bareduckdb-0.20.200/tests/capi/test_uncached_direct_emit.py +191 -0
  93. bareduckdb-0.20.200/tests/comparison/__init__.py +0 -0
  94. bareduckdb-0.20.200/tests/comparison/conftest.py +336 -0
  95. bareduckdb-0.20.200/tests/comparison/test_arrow_duckdb_parquet.py +319 -0
  96. bareduckdb-0.20.200/tests/comparison/test_arrow_schema_compatibility.py +70 -0
  97. bareduckdb-0.20.200/tests/comparison/test_config_values.py +40 -0
  98. bareduckdb-0.20.200/tests/comparison/test_dbapi.py +241 -0
  99. bareduckdb-0.20.200/tests/comparison/test_description_after_consumers.py +78 -0
  100. bareduckdb-0.20.200/tests/comparison/test_parameter_shapes.py +124 -0
  101. bareduckdb-0.20.200/tests/comparison/test_registration.py +92 -0
  102. bareduckdb-0.20.200/tests/comparison/test_row_value_limits.py +127 -0
  103. bareduckdb-0.20.200/tests/comparison/test_single_evaluation.py +69 -0
  104. bareduckdb-0.20.200/tests/compat/conftest.py +36 -0
  105. bareduckdb-0.20.200/tests/compat/test_arrow_reader_contract.py +72 -0
  106. bareduckdb-0.20.200/tests/compat/test_compat_basic.py +58 -0
  107. bareduckdb-0.20.200/tests/compat/test_connection_surface.py +354 -0
  108. bareduckdb-0.20.200/tests/compat/test_cursor_close_race.py +50 -0
  109. bareduckdb-0.20.200/tests/compat/test_cursor_shared_database.py +170 -0
  110. bareduckdb-0.20.200/tests/compat/test_dbapi_no_pyarrow_import.py +64 -0
  111. bareduckdb-0.20.200/tests/compat/test_default_output_type_surfaces.py +42 -0
  112. bareduckdb-0.20.200/tests/compat/test_deferred_conversion.py +256 -0
  113. bareduckdb-0.20.200/tests/compat/test_install_load_extension.py +121 -0
  114. bareduckdb-0.20.200/tests/conftest.py +114 -0
  115. bareduckdb-0.20.200/tests/core/test_arrow_corruption_fixes.py +118 -0
  116. bareduckdb-0.20.200/tests/core/test_arrow_export_model.py +96 -0
  117. bareduckdb-0.20.200/tests/core/test_arrow_in.py +75 -0
  118. bareduckdb-0.20.200/tests/core/test_arrow_lossless_conversion.py +89 -0
  119. bareduckdb-0.20.200/tests/core/test_arrow_upstream_conformance.py +32 -0
  120. bareduckdb-0.20.200/tests/core/test_bignum_roundtrip.py +93 -0
  121. bareduckdb-0.20.200/tests/core/test_config.py +106 -0
  122. bareduckdb-0.20.200/tests/core/test_connect.py +45 -0
  123. bareduckdb-0.20.200/tests/core/test_connection_base_cursor.py +64 -0
  124. bareduckdb-0.20.200/tests/core/test_consumer_state.py +214 -0
  125. bareduckdb-0.20.200/tests/core/test_data_kwarg.py +58 -0
  126. bareduckdb-0.20.200/tests/core/test_decimal_validation.py +30 -0
  127. bareduckdb-0.20.200/tests/core/test_infinite_date_parts.py +28 -0
  128. bareduckdb-0.20.200/tests/core/test_interpreter_shutdown.py +38 -0
  129. bareduckdb-0.20.200/tests/core/test_interrupt_progress.py +177 -0
  130. bareduckdb-0.20.200/tests/core/test_interrupt_sticky.py +204 -0
  131. bareduckdb-0.20.200/tests/core/test_json_ignore_errors.py +98 -0
  132. bareduckdb-0.20.200/tests/core/test_module_surface.py +144 -0
  133. bareduckdb-0.20.200/tests/core/test_parameters.py +106 -0
  134. bareduckdb-0.20.200/tests/core/test_parquet_variant_gzip.py +54 -0
  135. bareduckdb-0.20.200/tests/core/test_parse_cache.py +349 -0
  136. bareduckdb-0.20.200/tests/core/test_parse_sql.py +152 -0
  137. bareduckdb-0.20.200/tests/core/test_pending_submission.py +650 -0
  138. bareduckdb-0.20.200/tests/core/test_reader_close.py +214 -0
  139. bareduckdb-0.20.200/tests/core/test_readonly_query.py +56 -0
  140. bareduckdb-0.20.200/tests/core/test_register.py +166 -0
  141. bareduckdb-0.20.200/tests/core/test_registration_contract.py +386 -0
  142. bareduckdb-0.20.200/tests/core/test_replacement_scan_flag.py +60 -0
  143. bareduckdb-0.20.200/tests/core/test_row_column_decode.py +106 -0
  144. bareduckdb-0.20.200/tests/core/test_row_returning_writes.py +241 -0
  145. bareduckdb-0.20.200/tests/core/test_single_evaluation.py +75 -0
  146. bareduckdb-0.20.200/tests/core/test_stream_batch_size.py +38 -0
  147. bareduckdb-0.20.200/tests/core/test_streaming_lifetime.py +99 -0
  148. bareduckdb-0.20.200/tests/core/test_timetz_exporter_conformance.py +109 -0
  149. bareduckdb-0.20.200/tests/core/test_timetz_utc_opt_in.py +134 -0
  150. bareduckdb-0.20.200/tests/core/test_type_roundtrip_matrix.py +682 -0
  151. bareduckdb-0.20.200/tests/core/test_uncached_lock_discipline.py +66 -0
  152. bareduckdb-0.20.200/tests/core/test_upstream_regressions.py +18 -0
  153. bareduckdb-0.20.200/tests/core/test_uuid_types.py +74 -0
  154. bareduckdb-0.20.200/tests/core/test_variant_arrow_export.py +46 -0
  155. bareduckdb-0.20.200/tests/core/test_variant_rows.py +207 -0
  156. bareduckdb-0.20.200/tests/dataset/basic/__init__.py +0 -0
  157. bareduckdb-0.20.200/tests/dataset/basic/test_dataset_basic.py +115 -0
  158. bareduckdb-0.20.200/tests/dataset/basic/test_explain.py +121 -0
  159. bareduckdb-0.20.200/tests/dataset/basic/test_join_filter_pushdown.py +82 -0
  160. bareduckdb-0.20.200/tests/dataset/basic/test_registration_replacement.py +164 -0
  161. bareduckdb-0.20.200/tests/dataset/conftest.py +61 -0
  162. bareduckdb-0.20.200/tests/dataset/filter/__init__.py +0 -0
  163. bareduckdb-0.20.200/tests/dataset/filter/test_filter_pushdown_types.py +327 -0
  164. bareduckdb-0.20.200/tests/dataset/filter/test_nan_filter_pushdown.py +192 -0
  165. bareduckdb-0.20.200/tests/dataset/filter/test_pushdown_never_underfilters.py +84 -0
  166. bareduckdb-0.20.200/tests/dataset/projection/__init__.py +0 -0
  167. bareduckdb-0.20.200/tests/dataset/test_dataset_backend.py +134 -0
  168. bareduckdb-0.20.200/tests/downstream/__init__.py +0 -0
  169. bareduckdb-0.20.200/tests/downstream/conftest.py +21 -0
  170. bareduckdb-0.20.200/tests/downstream/test_ibis.py +298 -0
  171. bareduckdb-0.20.200/tests/downstream/test_jupysql.py +178 -0
  172. bareduckdb-0.20.200/tests/downstream/test_magic_duckdb.py +177 -0
  173. bareduckdb-0.20.200/tests/downstream/test_sqlalchemy.py +303 -0
  174. bareduckdb-0.20.200/tests/lazyframe/test_lazyframe_pushdown.py +142 -0
  175. bareduckdb-0.20.200/tests/lazyframe/test_pl_lazy_join.py +34 -0
  176. bareduckdb-0.20.200/tests/polars/__init__.py +0 -0
  177. bareduckdb-0.20.200/tests/polars/test_pl_lazy_batch_size.py +25 -0
  178. bareduckdb-0.20.200/tests/polars/test_polars_native.py +252 -0
  179. bareduckdb-0.20.200/tests/polars/test_polars_no_pyarrow_import.py +55 -0
  180. bareduckdb-0.20.200/tests/polars_only/__init__.py +0 -0
  181. bareduckdb-0.20.200/tests/polars_only/test_dbapi_nodep.py +94 -0
  182. bareduckdb-0.20.200/tests/polars_only/test_nodep.py +32 -0
  183. bareduckdb-0.20.200/tests/polars_only/test_register_nodep.py +85 -0
  184. bareduckdb-0.20.200/tests/polars_pushdown/__init__.py +0 -0
  185. bareduckdb-0.20.200/tests/polars_pushdown/test_dynamic_predicate_pushdown.py +116 -0
  186. bareduckdb-0.20.200/tests/polars_pushdown/test_polars_agg.py +38 -0
  187. bareduckdb-0.20.200/tests/polars_pushdown/test_polars_basic.py +39 -0
  188. bareduckdb-0.20.200/tests/polars_pushdown/test_polars_filters.py +290 -0
  189. bareduckdb-0.20.200/tests/polars_pushdown/test_polars_types.py +51 -0
  190. bareduckdb-0.20.200/tests/test_pl_lazy.py +220 -0
  191. bareduckdb-0.20.200/tests/udtfs/__init__.py +0 -0
  192. bareduckdb-0.20.200/tests/udtfs/conftest.py +5 -0
  193. bareduckdb-0.20.200/tests/udtfs/test_dml_statements.py +203 -0
  194. bareduckdb-0.20.200/tests/udtfs/test_replacement_scan.py +94 -0
  195. bareduckdb-0.20.200/tests/udtfs/test_udtf_basic.py +243 -0
  196. bareduckdb-0.20.200/tests/udtfs/test_udtf_edge_cases.py +117 -0
  197. bareduckdb-0.20.200/tests/vortexdata/__init__.py +0 -0
  198. bareduckdb-0.20.200/tests/vortexdata/test_core_vortex.py +32 -0
  199. bareduckdb-0.20.200/tools/fetch_duckdb.py +85 -0
  200. bareduckdb-0.20.200/typings/polars/__init__.pyi +10 -0
  201. bareduckdb-0.20.200/typings/polars/io/__init__.pyi +3 -0
  202. bareduckdb-0.20.200/typings/polars/io/plugins.pyi +3 -0
  203. bareduckdb-0.20.200/uv.lock +1534 -0
@@ -0,0 +1,70 @@
1
+ # Running GitHub Actions Locally with nektos/act
2
+
3
+ This guide explains how to run GitHub Actions workflows locally using [nektos/act](https://github.com/nektos/act), which allows you to test workflows before pushing to GitHub.
4
+
5
+ ## Prerequisites
6
+
7
+ - Docker must be installed and running
8
+ - Install the `act` binary, `curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash`
9
+
10
+ ## Quick Start
11
+
12
+ ### List Available Workflows
13
+
14
+ ```bash
15
+ ../act/bin/act --list
16
+ ```
17
+
18
+ ### Run the Dev Versions Workflow
19
+
20
+ To run the complete dev_versions workflow:
21
+
22
+ ```bash
23
+ ../act/bin/act -W .github/workflows/dev_versions.yml --matrix python-version:3.15t --matrix os:ubuntu-latest -P ubuntu-latest=catthehacker/ubuntu:act-24.04 --reuse
24
+ ```
25
+
26
+ `--matrix` values have to exist in the workflow. `dev_versions.yml` currently defines
27
+ `python-version` as `3.14` and `3.15t` only, across `ubuntu-latest`, `macos-latest` and
28
+ `windows-latest`; `3.12` and `3.14t` are not in it. Re-read the matrix before copying a
29
+ command from here.
30
+
31
+ ### 3. Run Specific Jobs
32
+
33
+ `dev_versions.yml` has four jobs: `dev_versions`, `musl`, `graalpy` and `benchmarks`. The
34
+ last two are calls into the reusable workflows `graalpy.yml` and `benchmarks.yml`, and all
35
+ three are chained behind `dev_versions` with `needs:`. To run just the first:
36
+
37
+ ```bash
38
+ ../act/bin/act -W .github/workflows/dev_versions.yml --matrix python-version:3.14 -P ubuntu-latest=catthehacker/ubuntu:act-latest -j dev_versions --artifact-server-path /tmp/artifacts --reuse
39
+ ```
40
+
41
+ ### Run the GraalPy job on its own
42
+
43
+ `graalpy.yml` also accepts `workflow_dispatch`, so it runs standalone without the CPython
44
+ matrix in front of it. The stock runner image has no cmake, so build a derived one first.
45
+
46
+ ```bash
47
+ ../act/bin/act -W .github/workflows/graalpy.yml -j graalpy -P ubuntu-latest=<image with cmake, ninja and build-essential> --reuse
48
+ ```
49
+
50
+ ## Common Options
51
+
52
+ - -n : dry run
53
+ - -v : verbose
54
+ - --reuse
55
+
56
+ ## Known act gaps
57
+
58
+ Three things bite locally that do not bite on a GitHub runner:
59
+
60
+ - **`catthehacker/ubuntu:act-24.04` has no `cmake`**, so any job that invokes CMake outside
61
+ scikit-build-core's own bootstrap dies with `cmake: command not found`. Derive an image:
62
+ `FROM catthehacker/ubuntu:act-24.04` plus
63
+ `apt-get install -y cmake ninja-build build-essential`, then pass it with
64
+ `-P ubuntu-latest=<that image>`.
65
+ - **`--reuse` reuses the container, not the image.** After changing the `-P` image you must
66
+ `docker rm -f` the existing `act-...` container or act silently keeps the old one.
67
+ - **In a git worktree, `setuptools-scm` cannot see `.git`**, because it is a file pointing at
68
+ a gitdir outside the bind mount, and the build fails with "unable to detect version".
69
+ Pass `--env SETUPTOOLS_SCM_PRETEND_VERSION=0.1.dev0`. `actions/checkout` on a real runner
70
+ produces a normal `.git` directory, so this is local-only.
@@ -0,0 +1,100 @@
1
+ name: Benchmarks
2
+
3
+ # workflow_call so dev_versions.yml runs it after its tests
4
+ on:
5
+ workflow_call:
6
+ workflow_dispatch:
7
+
8
+ jobs:
9
+ benchmark:
10
+ name: 'Benchmarks'
11
+ runs-on: ubuntu-latest
12
+ timeout-minutes: 60
13
+
14
+ permissions:
15
+ contents: read
16
+ pull-requests: write
17
+
18
+ steps:
19
+ - name: Checkout code
20
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
21
+ with:
22
+ fetch-depth: 0
23
+ submodules: false
24
+
25
+ - name: Set up Python
26
+ uses: actions/setup-python@v7.1.0
27
+ with:
28
+ python-version: '3.15'
29
+
30
+ - name: Install UV
31
+ uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
32
+ with:
33
+ enable-cache: true
34
+ cache-suffix: -benchmarks
35
+ - name: Check resources
36
+ run: |
37
+ cat /proc/meminfo | head -5
38
+ ulimit -a
39
+ nproc
40
+ # gcc-14/g++-14 are preinstalled, so this only selects them via CC/CXX.
41
+ - name: Setup Compiler
42
+ shell: bash
43
+ run: |
44
+ gcc-14 --version
45
+ g++-14 --version
46
+ echo "CC=gcc-14" >> $GITHUB_ENV
47
+ echo "CXX=g++-14" >> $GITHUB_ENV
48
+
49
+ - name: Verify the lock matches pyproject
50
+ run: uv lock --check
51
+
52
+ - name: Build current repo
53
+ run: uv sync
54
+
55
+ - name: Run benchmarks
56
+ id: bench
57
+ shell: bash
58
+ run: |
59
+ set -u
60
+ status=0
61
+ ./run_benchmarks.sh || status=$?
62
+ echo "status=$status" >> "$GITHUB_OUTPUT"
63
+
64
+ - name: Upload results
65
+ if: always()
66
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
67
+ with:
68
+ name: benchmark-results-${{ github.sha }}
69
+ path: benchmark-results/
70
+
71
+ - name: Generate comparison
72
+ id: comparison
73
+ if: always()
74
+ shell: bash
75
+ run: |
76
+ set -u
77
+ status=0
78
+ uv run python tests/benchmarks/compare_results.py benchmark-results > comparison.md || status=$?
79
+ cat comparison.md
80
+ echo "status=$status" >> "$GITHUB_OUTPUT"
81
+
82
+ # Fork PRs get a read-only token, so only comment on same-repo PRs.
83
+ - name: Comment on PR
84
+ if: >-
85
+ always() &&
86
+ github.event_name == 'pull_request' &&
87
+ github.event.pull_request.head.repo.full_name == github.repository
88
+ env:
89
+ GH_TOKEN: ${{ github.token }}
90
+ run: |
91
+ gh pr comment ${{ github.event.pull_request.number }} --body-file comparison.md
92
+
93
+ - name: Fail on benchmark error
94
+ if: >-
95
+ always() &&
96
+ (steps.bench.outputs.status != '0' ||
97
+ steps.comparison.outputs.status != '0')
98
+ run: |
99
+ echo "run_benchmarks.sh exited ${{ steps.bench.outputs.status }}, compare_results.py exited ${{ steps.comparison.outputs.status }}."
100
+ exit 1
@@ -0,0 +1,146 @@
1
+ name: Build Wheels
2
+ permissions:
3
+ contents: read
4
+
5
+ on:
6
+ push:
7
+ branches: [main]
8
+ workflow_dispatch:
9
+
10
+ concurrency:
11
+ group: ${{ github.workflow }}-${{ github.ref }}
12
+ cancel-in-progress: ${{ !startsWith(github.ref, 'refs/tags/') }}
13
+
14
+ jobs:
15
+ build_wheels:
16
+ name: 'Wheel: ${{ matrix.python }}-${{ matrix.platform.cibw_system }}_${{ matrix.platform.arch }}'
17
+ strategy:
18
+ fail-fast: false
19
+ matrix:
20
+ python: [cp312, cp314t, cp315t]
21
+ platform:
22
+ - { os: ubuntu-latest, arch: x86_64, cibw_system: manylinux }
23
+ - { os: ubuntu-24.04-arm, arch: aarch64, cibw_system: manylinux }
24
+ - { os: ubuntu-latest, arch: x86_64, cibw_system: musllinux }
25
+ - { os: ubuntu-24.04-arm, arch: aarch64, cibw_system: musllinux }
26
+ - { os: macos-latest, arch: arm64, cibw_system: macosx }
27
+ - { os: windows-latest, arch: AMD64, cibw_system: win }
28
+ # - { os: macos-13, arch: x86_64, cibw_system: macosx }
29
+ runs-on: ${{ matrix.platform.os }}
30
+
31
+ steps:
32
+ - name: Checkout code
33
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
34
+ with:
35
+ fetch-depth: 0
36
+ submodules: false
37
+
38
+ - name: Install Astral UV
39
+ uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
40
+ with:
41
+ enable-cache: true
42
+ cache-suffix: -${{ matrix.python }}-${{ matrix.platform.cibw_system }}_${{ matrix.platform.arch }}
43
+
44
+ - name: Build and test wheels
45
+ if: matrix.platform.cibw_system != 'musllinux'
46
+ uses: pypa/cibuildwheel@b9e566a2b284570af229f6c2a33673410d0389a3 # v4.3.4
47
+ env:
48
+ CIBW_TEST_COMMAND: pytest {project}/tests --import-mode=importlib --ignore={project}/tests/experimental --ignore={project}/tests/downstream --ignore={project}/tests/comparison --ignore={project}/tests/benchmarks -v -n auto --cov=bareduckdb --cov-report=term-missing
49
+ CIBW_TEST_EXTRAS: "test"
50
+ CIBW_TEST_REQUIRES: filelock
51
+ CIBW_ARCHS: ${{ matrix.platform.arch }}
52
+ CIBW_BUILD: ${{ matrix.python }}-${{ matrix.platform.cibw_system }}_${{ matrix.platform.arch }}
53
+
54
+ - name: Build and test wheels (musllinux)
55
+ if: matrix.platform.cibw_system == 'musllinux'
56
+ uses: pypa/cibuildwheel@b9e566a2b284570af229f6c2a33673410d0389a3 # v4.3.4
57
+ env:
58
+ CIBW_TEST_COMMAND: |
59
+ set -e
60
+ LIB={project}/src/bareduckdb/_libs/libduckdb.so
61
+ test -f "$LIB" || { echo "ERROR: $LIB missing after build"; exit 1; }
62
+ PKG=$(python -c "import importlib.util as u; print(u.find_spec('bareduckdb').submodule_search_locations[0])")
63
+ mkdir -p "$PKG/_libs"
64
+ cp -f "$LIB" "$PKG/_libs/"
65
+ pytest {project}/tests --import-mode=importlib --ignore={project}/tests/experimental --ignore={project}/tests/downstream --ignore={project}/tests/comparison --ignore={project}/tests/benchmarks -v -n auto --cov=bareduckdb --cov-report=term-missing
66
+ CIBW_TEST_EXTRAS: "test"
67
+ CIBW_TEST_REQUIRES: filelock
68
+ CIBW_ARCHS: ${{ matrix.platform.arch }}
69
+ CIBW_BUILD: ${{ matrix.python }}-${{ matrix.platform.cibw_system }}_${{ matrix.platform.arch }}
70
+
71
+ - name: Upload wheel
72
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
73
+ with:
74
+ name: wheel-${{ matrix.python }}-${{ matrix.platform.cibw_system }}_${{ matrix.platform.arch }}
75
+ path: wheelhouse/*.whl
76
+ compression-level: 0
77
+
78
+ sdist:
79
+ name: Build sdist
80
+ runs-on: ubuntu-latest
81
+
82
+ steps:
83
+ - name: Checkout code
84
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
85
+ with:
86
+ fetch-depth: 0 # setuptools-scm needs the tags to compute a version
87
+ submodules: false
88
+
89
+ - name: Install Astral UV
90
+ uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
91
+
92
+ - name: Build sdist
93
+ run: uv build --sdist --out-dir dist
94
+
95
+ - name: Upload sdist
96
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
97
+ with:
98
+ name: sdist
99
+ path: dist/*.tar.gz
100
+ compression-level: 0
101
+
102
+ # Separate job: the matrix's CIBW_TEST_* env vars would mask pyproject's gp* override
103
+ graalpy_wheel:
104
+ name: GraalPy wheel
105
+ uses: ./.github/workflows/graalpy.yml
106
+ permissions:
107
+ contents: read
108
+
109
+ publish-wheels:
110
+ name: Publish Wheels to PyPI
111
+ needs: [build_wheels, graalpy_wheel, sdist]
112
+ runs-on: ubuntu-latest
113
+ if: startsWith(github.ref, 'refs/tags/v')
114
+ permissions:
115
+ id-token: write
116
+
117
+ steps:
118
+ - name: Download wheels
119
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
120
+ with:
121
+ path: dist/
122
+ pattern: "*wheel*"
123
+ merge-multiple: true
124
+
125
+ - name: Download sdist
126
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
127
+ with:
128
+ path: dist/
129
+ name: sdist
130
+
131
+ - name: List distributables
132
+ run: |
133
+ ls -lhR dist/
134
+ test -n "$(ls dist/*.tar.gz 2>/dev/null)" || { echo "ERROR: no sdist"; exit 1; }
135
+ test -n "$(ls dist/*graalpy*.whl 2>/dev/null)" || { echo "ERROR: no GraalPy wheel"; exit 1; }
136
+ # Anything else in packages-dir fails the upload
137
+ stray=$(find dist -mindepth 1 ! -name '*.whl' ! -name '*.tar.gz')
138
+ test -z "$stray" || { echo "ERROR: unexpected entries in dist/:"; echo "$stray"; exit 1; }
139
+ # PyPI rejects bare linux_* tags. Fail first.
140
+ bad=$(find dist \( -name '*-linux_x86_64.whl' -o -name '*-linux_aarch64.whl' -o -name '*-linux_i686.whl' \))
141
+ test -z "$bad" || { echo "ERROR: unrepaired linux tag, PyPI will reject:"; echo "$bad"; exit 1; }
142
+
143
+ - name: Publish to PyPI
144
+ uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3
145
+ with:
146
+ packages-dir: dist/
@@ -0,0 +1,325 @@
1
+ name: Extensive Tests
2
+
3
+ # This tests is a more extensive suite that's likely more fragile and slower:
4
+ # - parallel thread safety tests
5
+ # - Nightly builds of pyarrow and pandas
6
+ # - Downstream integration tests for common libraries
7
+ # - Ensures pyarrow capsules (via polars) works without importing pyarrow
8
+ on:
9
+ # branches: filters out tag pushes, which otherwise ran the whole matrix again.
10
+ push:
11
+ branches: ['**']
12
+ # schedule:
13
+ # - cron: '0 6 * * *'
14
+ workflow_dispatch:
15
+
16
+ concurrency:
17
+ group: ${{ github.workflow }}-${{ github.ref }}
18
+ cancel-in-progress: true
19
+
20
+ jobs:
21
+ dev_versions:
22
+ name: 'Full Tests - Python ${{ matrix.python-version }} - ${{ matrix.os }}'
23
+ runs-on: ${{ matrix.os }}
24
+
25
+ permissions:
26
+ contents: read
27
+
28
+ strategy:
29
+ fail-fast: false
30
+ matrix:
31
+ include:
32
+ - os: ubuntu-latest
33
+ python-version: '3.14'
34
+ - os: ubuntu-latest
35
+ python-version: '3.15t'
36
+ # - os: macos-latest
37
+ # python-version: '3.12'
38
+ - os: macos-latest
39
+ python-version: '3.15t'
40
+ - os: windows-latest
41
+ python-version: '3.14'
42
+ - os: windows-latest
43
+ python-version: '3.15t'
44
+ steps:
45
+ - name: Checkout code
46
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
47
+ with:
48
+ fetch-depth: 0
49
+ submodules: false
50
+
51
+ - name: Set up Python
52
+ uses: actions/setup-python@v7.1.0
53
+ with:
54
+ python-version: ${{ matrix.python-version }}
55
+ allow-prereleases: true
56
+
57
+ - name: Install UV
58
+ uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
59
+ with:
60
+ enable-cache: true
61
+ cache-suffix: -dev-versions-${{ matrix.python-version }}
62
+
63
+ - name: Setup Compiler
64
+ shell: bash
65
+ run: |
66
+ if [ "${{ runner.os }}" = "Windows" ]; then
67
+ # Windows: MSVC ships with the runner and matches DuckDB's prebuilt DLL
68
+ echo "Using MSVC"
69
+ elif [ "${{ matrix.os }}" = "macos-latest" ]; then
70
+ # macOS: Use AppleClang (default) to match DuckDB's build
71
+ # DuckDB prebuilt binaries are compiled with AppleClang
72
+ echo "Using default AppleClang compiler"
73
+ cc --version
74
+ c++ --version
75
+ else
76
+ # Ubuntu: Install and configure GCC 14
77
+ sudo apt-get update
78
+ sudo apt-get install -y gcc-14 g++-14
79
+ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-14 100
80
+ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-14 100
81
+ echo "CC=gcc-14" >> $GITHUB_ENV
82
+ echo "CXX=g++-14" >> $GITHUB_ENV
83
+ gcc --version
84
+ g++ --version
85
+ fi
86
+
87
+ # Scheduled and manual runs re-resolve
88
+ - name: Refresh lock for nightly deps
89
+ if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
90
+ run: uv lock --upgrade
91
+
92
+ - name: Verify the lock matches pyproject
93
+ if: github.event_name != 'schedule' && github.event_name != 'workflow_dispatch'
94
+ run: uv lock --check
95
+
96
+ - name: Build
97
+ shell: bash
98
+ run: |
99
+ # No --no-build: pyyaml ships no cp315 wheel and must build from its sdist
100
+ uv sync --no-install-project
101
+ uv sync --reinstall-package bareduckdb -v
102
+
103
+ - name: Install GIL-only deps (polars, vortex-data)
104
+ shell: bash
105
+ run: |
106
+ if uv run --no-sync python -c "import sysconfig, sys; sys.exit(1 if sysconfig.get_config_var('Py_GIL_DISABLED') else 0)"; then
107
+ uv pip install --group dev-gil --only-binary :all:
108
+ else
109
+ echo "free-threaded interpreter: skipping the dev-gil group"
110
+ fi
111
+
112
+ - name: Run core tests 1
113
+ shell: bash
114
+ run: |
115
+ uv run --no-sync pytest tests --ignore=tests/experimental --ignore=tests/downstream --ignore=tests/comparison --ignore=tests/benchmarks -v -n auto
116
+
117
+ - name: Run parallel thread safety tests
118
+ shell: bash
119
+ run: |
120
+ NPROC=$(nproc 2>/dev/null || sysctl -n hw.ncpu)
121
+ THREADS=$((NPROC - 1))
122
+ THREADS=$((THREADS < 1 ? 1 : THREADS)) # Ensure at least 1 thread
123
+ # Capped for OOM issues / DEFAULT_TABLE_BATCH_ROWS
124
+ THREADS=$((THREADS > 4 ? 4 : THREADS))
125
+ echo "NPROC: $NPROC"
126
+ echo "THREADS: $THREADS"
127
+ # NOTE: -m "not anyio and not parallel_threads" deselects two whole categories of
128
+ # the registry code:
129
+ # - all of tests/aio (every async test there carries anyio's "anyio" marker)
130
+ # - every registration test file (test_register.py, test_uncached_direct_emit.py,
131
+ # test_incremental_scan.py, test_registration_contract.py, test_register_memory.py),
132
+ # because each carries a file-level @pytest.mark.parallel_threads(1)
133
+ # So this pass exercises essentially none of register()/unregister(). The
134
+ # workflow-side mitigation is the dedicated tests/aio stage below. Closing the
135
+ # registration half needs a tests/ change rather than a workflow one: narrow those
136
+ # blanket file-level markers to only the tests that genuinely touch process-global
137
+ # state, so the rest run under --parallel-threads.
138
+ uv run --no-sync pytest tests/ -n 0 --parallel-threads=$THREADS --iterations=5 --tb=short -v -m "not anyio and not parallel_threads" --ignore=tests/experimental --ignore=tests/comparison --ignore=tests/downstream --ignore=tests/benchmarks --cov=bareduckdb --cov-append
139
+
140
+ - name: Run tests/aio under repetition (async pool concurrency, asyncio and trio)
141
+ shell: bash
142
+ run: |
143
+ # tests/aio is deselected from the OS-thread parallel pass above because async
144
+ # concurrency is cooperative (one event loop, many tasks), not thread-based, and
145
+ # pytest-run-parallel and anyio's pytest plugin are not vetted together here. Repetition
146
+ # via pytest-repeat (--count, already a dev dependency) is the concurrency lever
147
+ # that fits async code: each repetition re-runs the pool's own internal
148
+ # task/connection concurrency, the shape that produced a "free(): chunks in
149
+ # smallbin corrupted" crash in a registered Arrow source scanned through the async
150
+ # pool. This is NOT a substitute for real multi-thread coverage of tests/aio.
151
+ uv run --no-sync pytest tests/aio -n 0 --count=20 --tb=short -v --cov=bareduckdb --cov-append
152
+
153
+ - name: Test PyArrow is Optional
154
+ # TODO: 3.15: pola-rs/polars#28347
155
+ if: matrix.python-version != '3.14t' && !startsWith(matrix.python-version, '3.15')
156
+ shell: bash
157
+ run: |
158
+ # Test that bareduckdb works with polars without pyarrow installed
159
+ uv pip uninstall pyarrow
160
+ # Assert polars is importable first, and assert pyarrow is not, otherwise tests skipped
161
+ uv run --no-sync python -c "import polars; print('polars', polars.__version__)"
162
+ uv run --no-sync python -c "
163
+ import importlib.util, sys
164
+ if importlib.util.find_spec('pyarrow') is not None:
165
+ sys.exit('pyarrow is still installed; the uninstall above did not take effect')
166
+ print('pyarrow absent, as intended')
167
+ "
168
+ # -n 0: xdist reports a missing path as "0 items"
169
+ uv run --no-sync pytest tests/polars_only -n 0 -v --cov=bareduckdb --cov-append
170
+ uv pip install pyarrow
171
+
172
+ - name: Run DuckDB comparison tests
173
+ # duckdb has no 3.14t or 3.15 wheels yet.
174
+ if: matrix.python-version != '3.14t' && !startsWith(matrix.python-version, '3.15')
175
+ shell: bash
176
+ run: |
177
+ uv pip install "duckdb==2.0.*"
178
+ uv run --no-sync pytest tests/comparison -v --tb=short --cov=bareduckdb --cov-append
179
+ uv pip uninstall duckdb
180
+
181
+ # - name: Test PyPI DuckDB extensions
182
+ # if: matrix.python-version != '3.14t'
183
+ # shell: bash
184
+ # run: |
185
+ # uv pip install duckdb-extensions==1.4.2 duckdb-extension-httpfs
186
+
187
+ # uv run --no-sync python -c "
188
+ # import bareduckdb
189
+ # conn = bareduckdb.Connection()
190
+
191
+ # conn.load_extension('httpfs')
192
+
193
+ # result = conn.execute('''SELECT * FROM duckdb_extensions() WHERE extension_name = 'httpfs' ''').fetchall()
194
+ # assert len(result) > 0, 'httpfs extension not loaded'
195
+
196
+ # extension_info = result[0]
197
+ # assert extension_info[1] is False
198
+ # assert extension_info[2] is True
199
+
200
+ # conn.close()
201
+ # "
202
+
203
+ # uv pip uninstall duckdb-extensions duckdb-extension-httpfs
204
+
205
+ - name: Run downstream integration tests
206
+ # TODO: No duckdb 3.15
207
+ if: matrix.python-version != '3.14t' && !startsWith(matrix.python-version, '3.15')
208
+ shell: bash
209
+ run: |
210
+ # magic-duckdb
211
+ uv sync --group downstream
212
+
213
+ # Run tests separately to avoid module contamination
214
+ uv run --no-sync pytest tests/downstream/test_sqlalchemy.py tests/downstream/test_magic_duckdb.py -v --cov=bareduckdb --cov-append
215
+ uv run --no-sync pytest tests/downstream/test_jupysql.py -v --cov=bareduckdb --cov-append
216
+
217
+ - name: Generate coverage report
218
+ if: always()
219
+ shell: bash
220
+ run: |
221
+ uv run --no-sync coverage report --show-missing
222
+
223
+ - name: Count Lines of Code (cloc)
224
+ uses: djdefi/cloc-action@a0529b3e4543679d21233a9287ee96b1b1a29949 # 7
225
+ if: matrix.os == 'ubuntu-latest'
226
+ with:
227
+ options: --exclude-dir=tests,external,.git,.github,benchmarks,notebooks,include
228
+
229
+ - name: Upload test results
230
+ if: always()
231
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
232
+ with:
233
+ name: dev-versions-test-results-${{ matrix.python-version }}
234
+ path: |
235
+ .pytest_cache/
236
+ retention-days: 7
237
+
238
+ musl:
239
+ name: 'Musl Tests - ${{ matrix.python }} - musllinux_1_2'
240
+ runs-on: ubuntu-latest
241
+ needs: dev_versions
242
+
243
+ permissions:
244
+ contents: read
245
+
246
+ strategy:
247
+ fail-fast: false
248
+ matrix:
249
+ include:
250
+ - { python: cp314, pydir: cp314-cp314 }
251
+ - { python: cp315t, pydir: cp315-cp315t }
252
+
253
+ steps:
254
+ # Checkout on the glibc host
255
+ - name: Checkout code
256
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
257
+ with:
258
+ fetch-depth: 0
259
+ submodules: false
260
+
261
+ - name: Cache uv downloads
262
+ uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
263
+ with:
264
+ path: .uv-cache
265
+ key: uv-musl-${{ matrix.python }}-${{ hashFiles('uv.lock') }}
266
+ restore-keys: uv-musl-${{ matrix.python }}-
267
+
268
+ - name: Build and test in musllinux_1_2
269
+ shell: bash
270
+ # Same image cibuildwheel uses
271
+ run: |
272
+ docker run --rm -v "$PWD:/build" -w /build \
273
+ -e UV_CACHE_DIR=/build/.uv-cache \
274
+ quay.io/pypa/musllinux_1_2_x86_64 sh -c '
275
+ set -e
276
+ PY=/opt/python/${{ matrix.pydir }}/bin/python
277
+ test -x "$PY" || { echo "ERROR: no interpreter at $PY"; ls /opt/python; exit 1; }
278
+ gcc --version | head -1
279
+ export UV_PYTHON="$PY"
280
+ uv sync --no-default-groups --extra test --reinstall-package bareduckdb
281
+
282
+ # libduckdb must be the musl build, not glibc
283
+ LIB=$(find src/bareduckdb/_libs -name "libduckdb.so")
284
+ readelf -d "$LIB" | grep -q "libc.musl" || { echo "ERROR: $LIB is not musl-linked"; exit 1; }
285
+ echo "OK: $LIB is musl-linked"
286
+
287
+ SRC_DIR=$(cd "$(dirname "$LIB")" && pwd)
288
+ # cd+pwd rather than realpath -m: busybox realpath has no -m.
289
+ DEST_DIR=$(uv run --no-sync python -c "import os, sysconfig; print(os.path.join(sysconfig.get_paths()[\"platlib\"], \"bareduckdb\", \"_libs\"))")
290
+ if [ "$DEST_DIR" != "$SRC_DIR" ]; then
291
+ mkdir -p "$DEST_DIR"
292
+ # Hard link, so musl dedupes it by inode against the preloaded copy and maps
293
+ # DuckDB once; cp is the cross-device fallback.
294
+ ln -f "$SRC_DIR/libduckdb.so" "$DEST_DIR/libduckdb.so" 2>/dev/null \
295
+ || cp -f "$SRC_DIR/libduckdb.so" "$DEST_DIR/"
296
+ echo "Linked $SRC_DIR/libduckdb.so into $DEST_DIR"
297
+ fi
298
+
299
+ uv run --no-sync pytest tests --ignore=tests/experimental --ignore=tests/downstream \
300
+ --ignore=tests/comparison --ignore=tests/benchmarks \
301
+ -o addopts="" -q -n auto
302
+
303
+ # Drop the pre-built wheels that are cheaper to refetch than to store.
304
+ uv cache prune --ci
305
+ '
306
+
307
+ - name: Make the uv cache readable by the runner
308
+ if: always()
309
+ shell: bash
310
+ run: sudo chown -R "$(id -u):$(id -g)" .uv-cache || true
311
+
312
+ graalpy:
313
+ name: GraalPy
314
+ needs: dev_versions
315
+ uses: ./.github/workflows/graalpy.yml
316
+ permissions:
317
+ contents: read
318
+
319
+ benchmarks:
320
+ name: Benchmarks
321
+ needs: dev_versions
322
+ uses: ./.github/workflows/benchmarks.yml
323
+ permissions:
324
+ contents: read
325
+ pull-requests: write
@@ -0,0 +1,39 @@
1
+ name: GraalPy
2
+
3
+ # workflow_call so build_wheels.yml and dev_versions.yml can chain it
4
+ on:
5
+ workflow_call:
6
+ workflow_dispatch:
7
+
8
+ # Build, repair and test settings live in pyproject.toml's `gp*` cibuildwheel override.
9
+ # Linux x86_64 only: Oracle's GraalPy index has no pyarrow wheel for any other platform.
10
+ jobs:
11
+ graalpy:
12
+ name: 'GraalPy - gp313_253 - manylinux x86_64'
13
+ runs-on: ubuntu-latest
14
+
15
+ continue-on-error: true
16
+
17
+ permissions:
18
+ contents: read
19
+
20
+ steps:
21
+ - name: Checkout code
22
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
23
+ with:
24
+ fetch-depth: 0
25
+ submodules: false
26
+
27
+ - name: Build and test GraalPy wheel
28
+ uses: pypa/cibuildwheel@b9e566a2b284570af229f6c2a33673410d0389a3 # v4.3.4
29
+ with:
30
+ only: gp313_253-manylinux_x86_64
31
+
32
+ - name: Upload GraalPy wheel
33
+ if: always()
34
+ uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
35
+ with:
36
+ name: graalpy-wheel
37
+ path: wheelhouse/*.whl
38
+ if-no-files-found: warn
39
+ compression-level: 0