From 60923ec21818f81ad4d721dfa6c03d7bcc8405e4 Mon Sep 17 00:00:00 2001 From: Shivendra Devadhe Date: Sat, 28 Feb 2026 23:54:54 +0530 Subject: [PATCH 01/11] fix(cpp): handle npos in PathToDirectory for S3 URIs without query strings --- cpp/src/graphar/graph_info.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cpp/src/graphar/graph_info.cc b/cpp/src/graphar/graph_info.cc index 3ec666e4a..fb82d0b43 100644 --- a/cpp/src/graphar/graph_info.cc +++ b/cpp/src/graphar/graph_info.cc @@ -1103,8 +1103,10 @@ namespace { static std::string PathToDirectory(const std::string& path) { if (path.rfind("s3://", 0) == 0) { size_t t = path.find_last_of('?'); - std::string prefix = path.substr(0, t); - std::string suffix = path.substr(t); + + std::string prefix = (t == std::string::npos) ? path : path.substr(0, t); + std::string suffix = (t == std::string::npos) ? "" : path.substr(t); + const size_t last_slash_idx = prefix.rfind('/'); if (std::string::npos != last_slash_idx) { return prefix.substr(0, last_slash_idx + 1) + suffix; From 62b47a13418f55ff095781759efe655a584478a9 Mon Sep 17 00:00:00 2001 From: Shivendra Devadhe Date: Tue, 3 Mar 2026 12:37:26 +0530 Subject: [PATCH 02/11] added test for handling npos in PathToDirectory --- cpp/CMakeLists.txt | 1 + cpp/src/graphar/graph_info.cc | 46 +++++++++++++++-------------- cpp/src/graphar/util.h | 2 ++ cpp/test/test_util.cc | 54 +++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 22 deletions(-) create mode 100644 cpp/test/test_util.cc diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index ef53c556e..c415a8063 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -650,6 +650,7 @@ if (BUILD_TESTS) add_test(test_graph SRCS test/test_graph.cc) add_test(test_multi_label SRCS test/test_multi_label.cc) add_test(test_multi_property SRCS test/test_multi_property.cc) + add_test(test_util SRCS test/test_util.cc) # enable_testing() endif() diff --git a/cpp/src/graphar/graph_info.cc b/cpp/src/graphar/graph_info.cc index fb82d0b43..c4460fce1 100644 --- a/cpp/src/graphar/graph_info.cc +++ b/cpp/src/graphar/graph_info.cc @@ -28,6 +28,7 @@ #include "graphar/graph_info.h" #include "graphar/result.h" #include "graphar/types.h" +#include "graphar/util.h" #include "graphar/version_parser.h" #include "graphar/yaml.h" @@ -1100,26 +1101,6 @@ Status EdgeInfo::Save(const std::string& path) const { namespace { -static std::string PathToDirectory(const std::string& path) { - if (path.rfind("s3://", 0) == 0) { - size_t t = path.find_last_of('?'); - - std::string prefix = (t == std::string::npos) ? path : path.substr(0, t); - std::string suffix = (t == std::string::npos) ? "" : path.substr(t); - - const size_t last_slash_idx = prefix.rfind('/'); - if (std::string::npos != last_slash_idx) { - return prefix.substr(0, last_slash_idx + 1) + suffix; - } - } else { - const size_t last_slash_idx = path.rfind('/'); - if (std::string::npos != last_slash_idx) { - return path.substr(0, last_slash_idx + 1); // +1 to include the slash - } - } - return path; -} - static Result> ConstructGraphInfo( std::shared_ptr graph_meta, const std::string& default_name, const std::string& default_prefix, const std::shared_ptr fs, @@ -1411,8 +1392,8 @@ Result> GraphInfo::Load(const std::string& path) { fs->ReadFileToValue(no_url_path)); GAR_ASSIGN_OR_RAISE(auto graph_meta, Yaml::Load(yaml_content)); std::string default_name = "graph"; - std::string default_prefix = PathToDirectory(path); - no_url_path = PathToDirectory(no_url_path); + std::string default_prefix = util::PathToDirectory(path); + no_url_path = util::PathToDirectory(no_url_path); return ConstructGraphInfo(graph_meta, default_name, default_prefix, fs, no_url_path); } @@ -1487,4 +1468,25 @@ Status GraphInfo::Save(const std::string& path) const { return fs->WriteValueToFile(yaml_content, no_url_path); } +namespace util { +std::string PathToDirectory(const std::string& path) { + if (path.rfind("s3://", 0) == 0) { + size_t t = path.find_last_of('?'); + // Your fix here + std::string prefix = (t == std::string::npos) ? path : path.substr(0, t); + std::string suffix = (t == std::string::npos) ? "" : path.substr(t); + + const size_t last_slash_idx = prefix.rfind('/'); + if (std::string::npos != last_slash_idx) { + return prefix.substr(0, last_slash_idx + 1) + suffix; + } + } else { + const size_t last_slash_idx = path.rfind('/'); + if (std::string::npos != last_slash_idx) { + return path.substr(0, last_slash_idx + 1); + } + } + return path; +} +} // namespace util } // namespace graphar diff --git a/cpp/src/graphar/util.h b/cpp/src/graphar/util.h index 1ef13a3ea..61bc59bc3 100644 --- a/cpp/src/graphar/util.h +++ b/cpp/src/graphar/util.h @@ -273,4 +273,6 @@ static arrow::Status OpenParquetArrowReader( return arrow::Status::OK(); } +std::string PathToDirectory(const std::string& path); + } // namespace graphar::util diff --git a/cpp/test/test_util.cc b/cpp/test/test_util.cc new file mode 100644 index 000000000..c83becb3c --- /dev/null +++ b/cpp/test/test_util.cc @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#include +#include +#include "./util.h" +#include "graphar/util.h" + +namespace graphar { + +TEST_CASE_METHOD(GlobalFixture, "PathUtilTest") { + SECTION("PathToDirectory_S3_Handling") { + // 1. Test standard S3 URI with query (existing functionality) + std::string s3_with_query = "s3://bucket/path/graph.yml?version=123"; + REQUIRE(util::PathToDirectory(s3_with_query) == + "s3://bucket/path/?version=123"); + + // 2. Test S3 URI WITHOUT query (The Bug Fix!) + std::string s3_no_query = "s3://bucket/path/graph.yml"; + REQUIRE(util::PathToDirectory(s3_no_query) == "s3://bucket/path/"); + + // 3. Test S3 URI at root + std::string s3_root = "s3://bucket/graph.yml"; + REQUIRE(util::PathToDirectory(s3_root) == "s3://bucket/"); + } + + SECTION("PathToDirectory_Local_Handling") { + // 4. Test standard local path + std::string local_path = "/tmp/data/graph.yml"; + REQUIRE(util::PathToDirectory(local_path) == "/tmp/data/"); + + // 5. Test relative path + std::string relative_path = "graph.yml"; + REQUIRE(util::PathToDirectory(relative_path) == "graph.yml"); + } +} + +} // namespace graphar \ No newline at end of file From 63095a203a125116099f60c4ab3d6257eadc29eb Mon Sep 17 00:00:00 2001 From: Shivendra Devadhe Date: Tue, 3 Mar 2026 13:01:44 +0530 Subject: [PATCH 03/11] build: fix cmake target conflicts and register path utility tests --- cpp/CMakeLists.txt | 13 +------------ cpp/test/CMakeLists.txt | 1 + 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 27572ae8b..7fff7e354 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -455,18 +455,7 @@ if (BUILD_TESTS) include(Catch) catch_discover_tests(${target}) endmacro() - - add_test(test_info SRCS test/test_info.cc) - add_test(test_arrow_chunk_writer SRCS test/test_arrow_chunk_writer.cc) - add_test(test_builder SRCS test/test_builder.cc) - add_test(test_chunk_info_reader SRCS test/test_chunk_info_reader.cc) - add_test(test_arrow_chunk_reader SRCS test/test_arrow_chunk_reader.cc) - add_test(test_graph SRCS test/test_graph.cc) - add_test(test_multi_label SRCS test/test_multi_label.cc) - add_test(test_multi_property SRCS test/test_multi_property.cc) - add_test(test_util SRCS test/test_util.cc) - - # enable_testing() + endif() if (BUILD_BENCHMARKS) diff --git a/cpp/test/CMakeLists.txt b/cpp/test/CMakeLists.txt index 35f25ce04..29fb3ed00 100644 --- a/cpp/test/CMakeLists.txt +++ b/cpp/test/CMakeLists.txt @@ -81,3 +81,4 @@ add_graphar_test(test_arrow_chunk_reader SRCS test_arrow_chunk_reader.cc) add_graphar_test(test_graph SRCS test_graph.cc) add_graphar_test(test_multi_label SRCS test_multi_label.cc) add_graphar_test(test_multi_property SRCS test_multi_property.cc) +add_graphar_test(test_util SRCS test_util.cc) From b06d19adddb1fdbd81928a168fb3c8f20fe3af07 Mon Sep 17 00:00:00 2001 From: Shivendra Devadhe Date: Tue, 3 Mar 2026 13:12:59 +0530 Subject: [PATCH 04/11] build: remove redundant test declarations --- cpp/CMakeLists.txt | 97 ---------------------------------------------- 1 file changed, 97 deletions(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 7fff7e354..f1fa70e98 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -399,103 +399,6 @@ install(EXPORT graphar-targets DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/graphar ) -# ------------------------------------------------------------------------------ -# Test targets -# ------------------------------------------------------------------------------ -if (BUILD_TESTS) - find_package(Catch2 3 REQUIRED) - - macro(add_test target) - set(options) - set(oneValueArgs) - set(multiValueArgs SRCS) - cmake_parse_arguments(add_test "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - add_executable(${target} ${add_test_SRCS}) - target_compile_features(${target} PRIVATE cxx_std_${GAR_CXX_STANDARD}) - target_include_directories(${target} PRIVATE ${PROJECT_SOURCE_DIR}/thirdparty) - target_link_libraries(${target} PRIVATE Catch2::Catch2WithMain graphar ${CMAKE_DL_LIBS}) - if (BUILD_ARROW_FROM_SOURCE) - target_include_directories(${target} SYSTEM BEFORE PRIVATE ${GAR_ARROW_INCLUDE_DIR}) - if (APPLE) - target_link_libraries(${target} PRIVATE -Wl,-force_load gar_arrow_static - "${GAR_PARQUET_STATIC_LIB}" - "${GAR_ARROW_BUNDLED_DEPS_STATIC_LIB}" - protobuf::libprotobuf - "-framework CoreFoundation" - "-framework Security" - "-framework Network") - else() - target_link_libraries(${target} PRIVATE -Wl,--exclude-libs,ALL -Wl,--whole-archive gar_arrow_static - "${GAR_PARQUET_STATIC_LIB}" - "${GAR_ARROW_BUNDLED_DEPS_STATIC_LIB}" -Wl,--no-whole-archive) - endif() - else() - if(APPLE) - if(USE_STATIC_ARROW) - target_link_libraries(${target} PRIVATE -Wl,-force_load - Arrow::arrow_static - Parquet::parquet_static) - else() - target_link_libraries(${target} PRIVATE Arrow::arrow_shared - Parquet::parquet_shared) - endif() - else() - if(USE_STATIC_ARROW) - target_link_libraries(${target} PRIVATE -Wl,--exclude-libs,ALL -Wl,--whole-archive - Arrow::arrow_static - Parquet::parquet_static -Wl,--no-whole-archive) - else() - target_link_libraries(${target} PRIVATE Arrow::arrow_shared - Parquet::parquet_shared) - endif() - endif() - endif() - target_include_directories(${target} PRIVATE ${PROJECT_SOURCE_DIR}/include $) - include(CTest) - include(Catch) - catch_discover_tests(${target}) - endmacro() - -endif() - -if (BUILD_BENCHMARKS) - find_package(benchmark REQUIRED) - - macro(add_benchmark target) - set(options) - set(oneValueArgs) - set(multiValueArgs SRCS) - cmake_parse_arguments(add_test "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - add_executable(${target} ${add_test_SRCS}) - target_compile_features(${target} PRIVATE cxx_std_${GAR_CXX_STANDARD}) - target_include_directories(${target} PRIVATE ${PROJECT_SOURCE_DIR}/thirdparty) - if(APPLE) - target_link_libraries(${target} PRIVATE benchmark::benchmark_main graphar Arrow::arrow_shared Parquet::parquet_shared ${CMAKE_DL_LIBS}) - else() - target_link_libraries(${target} PRIVATE benchmark::benchmark_main graphar parquet arrow ${CMAKE_DL_LIBS}) - endif() - if (BUILD_ARROW_FROM_SOURCE) - target_include_directories(${target} SYSTEM BEFORE PRIVATE ${GAR_ARROW_INCLUDE_DIR}) - if (APPLE) - target_link_libraries(${target} PRIVATE -Wl,-force_load ${GAR_ARROW_STATIC_LIB} - "${GAR_PARQUET_STATIC_LIB}" - "${GAR_ARROW_BUNDLED_DEPS_STATIC_LIB}" - protobuf::libprotobuf - "-framework CoreFoundation" - "-framework Security" - "-framework Network") - else() - target_link_libraries(${target} PRIVATE -Wl,--exclude-libs,ALL -Wl,--whole-archive ${GAR_ARROW_STATIC_LIB} - "${GAR_PARQUET_STATIC_LIB}" - "${GAR_ARROW_BUNDLED_DEPS_STATIC_LIB}" -Wl,--no-whole-archive) - endif() - endif() - endmacro() - add_benchmark(arrow_chunk_reader_benchmark SRCS benchmarks/arrow_chunk_reader_benchmark.cc) - add_benchmark(label_filter_benchmark SRCS benchmarks/label_filter_benchmark.cc) - add_benchmark(graph_info_benchmark SRCS benchmarks/graph_info_benchmark.cc) -endif() - # ------------------------------------------------------------------------------ # Format code & cpplint # ------------------------------------------------------------------------------ From dc0d1ea78e1f3d7367ae7e03e489022dc3a94476 Mon Sep 17 00:00:00 2001 From: Shivendra Devadhe Date: Tue, 3 Mar 2026 13:19:13 +0530 Subject: [PATCH 05/11] removed unnecessary changes --- cpp/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index f1fa70e98..cf87165e5 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -419,4 +419,4 @@ add_custom_target(graphar-clformat add_custom_target(graphar-cpplint COMMAND ${PROJECT_SOURCE_DIR}/misc/cpplint.py --root=${PROJECT_SOURCE_DIR}/include ${FILES_NEED_LINT} COMMENT "Running cpplint check." - VERBATIM) + VERBATIM) \ No newline at end of file From 0a634c139e5fdc1b537da1f10aa9b7a5d116efc9 Mon Sep 17 00:00:00 2001 From: Shivendra Devadhe Date: Tue, 3 Mar 2026 13:26:56 +0530 Subject: [PATCH 06/11] style: fix include order and whitespace in test_util --- cpp/test/test_util.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cpp/test/test_util.cc b/cpp/test/test_util.cc index c83becb3c..3b5f5dd63 100644 --- a/cpp/test/test_util.cc +++ b/cpp/test/test_util.cc @@ -17,8 +17,10 @@ * under the License. */ -#include #include +#include + +#include #include "./util.h" #include "graphar/util.h" @@ -51,4 +53,4 @@ TEST_CASE_METHOD(GlobalFixture, "PathUtilTest") { } } -} // namespace graphar \ No newline at end of file +} // namespace graphar From bbc4f6e9beccc9d20d031c5ced7b01108abde495 Mon Sep 17 00:00:00 2001 From: Shivendra Devadhe Date: Tue, 10 Mar 2026 19:51:50 +0530 Subject: [PATCH 07/11] placed PathToDirectory function in util.cc --- cpp/src/graphar/graph_info.cc | 22 ---------------------- cpp/src/graphar/util.cc | 19 +++++++++++++++++++ cpp/test/test_util.cc | 7 +------ 3 files changed, 20 insertions(+), 28 deletions(-) diff --git a/cpp/src/graphar/graph_info.cc b/cpp/src/graphar/graph_info.cc index c4460fce1..598fdce5f 100644 --- a/cpp/src/graphar/graph_info.cc +++ b/cpp/src/graphar/graph_info.cc @@ -1467,26 +1467,4 @@ Status GraphInfo::Save(const std::string& path) const { GAR_ASSIGN_OR_RAISE(auto yaml_content, this->Dump()); return fs->WriteValueToFile(yaml_content, no_url_path); } - -namespace util { -std::string PathToDirectory(const std::string& path) { - if (path.rfind("s3://", 0) == 0) { - size_t t = path.find_last_of('?'); - // Your fix here - std::string prefix = (t == std::string::npos) ? path : path.substr(0, t); - std::string suffix = (t == std::string::npos) ? "" : path.substr(t); - - const size_t last_slash_idx = prefix.rfind('/'); - if (std::string::npos != last_slash_idx) { - return prefix.substr(0, last_slash_idx + 1) + suffix; - } - } else { - const size_t last_slash_idx = path.rfind('/'); - if (std::string::npos != last_slash_idx) { - return path.substr(0, last_slash_idx + 1); - } - } - return path; -} -} // namespace util } // namespace graphar diff --git a/cpp/src/graphar/util.cc b/cpp/src/graphar/util.cc index 0712e0700..ebdfe359a 100644 --- a/cpp/src/graphar/util.cc +++ b/cpp/src/graphar/util.cc @@ -106,4 +106,23 @@ std::string ValueGetter::Value(const void* data, int64_t offset) { reinterpret_cast(data)->GetView(offset)); } +std::string PathToDirectory(const std::string& path) { + if (path.rfind("s3://", 0) == 0) { + size_t t = path.find_last_of('?'); + + std::string prefix = (t == std::string::npos) ? path : path.substr(0, t); + std::string suffix = (t == std::string::npos) ? "" : path.substr(t); + + const size_t last_slash_idx = prefix.rfind('/'); + if (std::string::npos != last_slash_idx) { + return prefix.substr(0, last_slash_idx + 1) + suffix; + } + } else { + const size_t last_slash_idx = path.rfind('/'); + if (std::string::npos != last_slash_idx) { + return path.substr(0, last_slash_idx + 1); + } + } + return path; +} } // namespace graphar::util diff --git a/cpp/test/test_util.cc b/cpp/test/test_util.cc index 3b5f5dd63..ba3d40072 100644 --- a/cpp/test/test_util.cc +++ b/cpp/test/test_util.cc @@ -26,28 +26,23 @@ namespace graphar { -TEST_CASE_METHOD(GlobalFixture, "PathUtilTest") { +TEST_CASE("PathUtilTest", "[util]") { SECTION("PathToDirectory_S3_Handling") { - // 1. Test standard S3 URI with query (existing functionality) std::string s3_with_query = "s3://bucket/path/graph.yml?version=123"; REQUIRE(util::PathToDirectory(s3_with_query) == "s3://bucket/path/?version=123"); - // 2. Test S3 URI WITHOUT query (The Bug Fix!) std::string s3_no_query = "s3://bucket/path/graph.yml"; REQUIRE(util::PathToDirectory(s3_no_query) == "s3://bucket/path/"); - // 3. Test S3 URI at root std::string s3_root = "s3://bucket/graph.yml"; REQUIRE(util::PathToDirectory(s3_root) == "s3://bucket/"); } SECTION("PathToDirectory_Local_Handling") { - // 4. Test standard local path std::string local_path = "/tmp/data/graph.yml"; REQUIRE(util::PathToDirectory(local_path) == "/tmp/data/"); - // 5. Test relative path std::string relative_path = "graph.yml"; REQUIRE(util::PathToDirectory(relative_path) == "graph.yml"); } From f5d5c9f064e8ce5fa18f0a0d60eea5b2bcc13e50 Mon Sep 17 00:00:00 2001 From: syaojun Date: Tue, 10 Mar 2026 23:58:01 +0800 Subject: [PATCH 08/11] fix(workflow): update cibuildwheel version to >=2.22 in Python wheel workflow --- .github/workflows/python-wheel-workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-wheel-workflow.yml b/.github/workflows/python-wheel-workflow.yml index 4504bd40f..dd07301e1 100644 --- a/.github/workflows/python-wheel-workflow.yml +++ b/.github/workflows/python-wheel-workflow.yml @@ -232,7 +232,7 @@ jobs: run: | set -euxo pipefail python -m pip install --upgrade pip - python -m pip install packaging cibuildwheel + python -m pip install packaging "cibuildwheel>=2.22" mkdir -p python/dist python -m cibuildwheel --output-dir python/dist "$PKGDIR" From 78214acf511fba70a85a1d3dcb6c87c436913d9f Mon Sep 17 00:00:00 2001 From: syaojun Date: Wed, 11 Mar 2026 00:01:10 +0800 Subject: [PATCH 09/11] fix(docs): correct user to users and update Python version requirement to >=3.9 in README --- python/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/README.md b/python/README.md index c6a5e8ff5..70325da9f 100644 --- a/python/README.md +++ b/python/README.md @@ -1,12 +1,12 @@ # GraphAr Python SDK -GraphAr Python SDK provides Python bindings for the GraphAr C++ library, allowing user to work with GraphAr formatted graph data in Python environments. It includes both a high-level API for data manipulation and a command-line interface for common operations. +GraphAr Python SDK provides Python bindings for the GraphAr C++ library, allowing users to work with GraphAr formatted graph data in Python environments. It includes both a high-level API for data manipulation and a command-line interface for common operations. ## Installation ### Prerequisites -- Python >= 3.7 +- Python >= 3.9 - pip (latest version recommended) - CMake >= 3.15 (for building from source) - Apache Arrow >= 12.0 (for building from source) From 4fd6420773117201d072a9cf7368eb91eb8b21cf Mon Sep 17 00:00:00 2001 From: syaojun Date: Wed, 11 Mar 2026 01:02:35 +0800 Subject: [PATCH 10/11] fix(workflow): adjust cibuildwheel installation for macOS to use uv frontend --- .github/workflows/python-wheel-workflow.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-wheel-workflow.yml b/.github/workflows/python-wheel-workflow.yml index dd07301e1..c80403251 100644 --- a/.github/workflows/python-wheel-workflow.yml +++ b/.github/workflows/python-wheel-workflow.yml @@ -114,6 +114,8 @@ jobs: CIBW_PLATFORM: ${{ matrix.os }} CIBW_BUILD: "cp39-* cp310-* cp311-* cp312-* cp313-*" CIBW_SKIP: "*-musllinux_*" + # Use uv on macOS to avoid transient GitHub rate limits when cibuildwheel + CIBW_BUILD_FRONTEND: ${{ matrix.os == 'macos' && 'build[uv]' || 'build' }} # Pin arch to the matrix platform CIBW_ARCHS: ${{ matrix.platform }} CIBW_MANYLINUX_X86_64_IMAGE: ${{ matrix.os == 'linux' && format('manylinux{0}', matrix.manylinux) || '' }} @@ -232,7 +234,11 @@ jobs: run: | set -euxo pipefail python -m pip install --upgrade pip - python -m pip install packaging "cibuildwheel>=2.22" + if [ "${{ matrix.os }}" = "macos" ]; then + python -m pip install packaging "cibuildwheel[uv]>=2.22" + else + python -m pip install packaging "cibuildwheel>=2.22" + fi mkdir -p python/dist python -m cibuildwheel --output-dir python/dist "$PKGDIR" From 5033d50643c0e4d4d1e6597c5729afaabf0f92ab Mon Sep 17 00:00:00 2001 From: Shivendra Devadhe Date: Fri, 13 Mar 2026 15:39:45 +0530 Subject: [PATCH 11/11] chore: force fresh CI run