diff --git a/.github/workflows/build-lint-and-test.yml b/.github/workflows/build-lint-and-test.yml index 87b885ee..ce6e296d 100644 --- a/.github/workflows/build-lint-and-test.yml +++ b/.github/workflows/build-lint-and-test.yml @@ -60,64 +60,78 @@ jobs: strategy: matrix: - scylla-version: [ENTERPRISE-RELEASE, ENTERPRISE-PRIOR-RELEASE] + scylla-version: [LATEST, PRIOR, LTS-LATEST, LTS-PRIOR] fail-fast: false steps: - name: Checkout uses: actions/checkout@v4 - - name: Setup Python 3 - uses: actions/setup-python@v5 - with: - python-version: "3.11" - - name: Update apt cache run: sudo apt-get update -y - name: Install CCM + run: make install-ccm-if-missing + + - name: Select scylla filter + id: scylla-filter run: | - make install-ccm-if-missing + # Select the latest stable patch on each release line and drop + # prerelease tags before taking the requested position. + case "${{ matrix.scylla-version }}" in + LATEST) + printf 'value=%s\n' '^[0-9]{4}$.^[2-9][0-9]*$.LAST and *.*.^[0-9]+$ and LAST' >> "$GITHUB_OUTPUT" + ;; + PRIOR) + printf 'value=%s\n' '^[0-9]{4}$.^[2-9][0-9]*$.LAST and *.*.^[0-9]+$ and LAST-1' >> "$GITHUB_OUTPUT" + ;; + LTS-LATEST) + printf 'value=%s\n' '^[0-9]{4}$.1.LAST and *.*.^[0-9]+$ and LAST' >> "$GITHUB_OUTPUT" + ;; + LTS-PRIOR) + printf 'value=%s\n' '^[0-9]{4}$.1.LAST and *.*.^[0-9]+$ and LAST-1' >> "$GITHUB_OUTPUT" + ;; + *) + echo "Unknown scylla version name ${{ matrix.scylla-version }}" + exit 1 + ;; + esac - name: Get scylla version id: scylla-version + uses: scylladb-actions/get-version@v0.4.5 + with: + source: dockerhub-imagetag + repo: scylladb/scylla + filters: ${{ steps.scylla-filter.outputs.value }} + + - name: Resolve scylla version + id: scylla-version-value run: | - if [[ "${{ matrix.scylla-version }}" == "ENTERPRISE-RELEASE" ]]; then - echo "value=$(python3 ci/version_fetch.py --version-index 1 scylla-enterprise-stable:1 | tr -d '\"')" | tee -a $GITHUB_OUTPUT - elif [[ "${{ matrix.scylla-version }}" == "ENTERPRISE-PRIOR-RELEASE" ]]; then - echo "value=$(python3 ci/version_fetch.py --version-index 2 scylla-enterprise-stable:2 | tr -d '\"')" | tee -a $GITHUB_OUTPUT - elif [[ "${{ matrix.scylla-version }}" == "ENTERPRISE-RC" ]]; then - echo "value=$(python3 ci/version_fetch.py --version-index 1 scylla-enterprise-rc | tr -d '\"')" | tee -a $GITHUB_OUTPUT - elif [[ "${{ matrix.scylla-version }}" == "OSS-RELEASE" ]]; then - echo "value=$(python3 ci/version_fetch.py --version-index 1 scylla-oss-stable:1 | tr -d '\"')" | tee -a $GITHUB_OUTPUT - elif [[ "${{ matrix.scylla-version }}" == "OSS-PRIOR-RELEASE" ]]; then - echo "value=$(python3 ci/version_fetch.py --version-index 2 scylla-oss-stable:2 | tr -d '\"')" | tee -a $GITHUB_OUTPUT - elif [[ "${{ matrix.scylla-version }}" == "OSS-RC" ]]; then - echo "value=$(python3 ci/version_fetch.py --version-index 1 scylla-oss-rc | tr -d '\"')" | tee -a $GITHUB_OUTPUT - elif echo "${{ matrix.scylla-version }}" | grep -P '^[0-9\.]+'; then # If you want to run specific version do just that - echo "value=${{ matrix.scylla-version }}" | tee -a $GITHUB_OUTPUT - else - echo "Unknown scylla version name `${{ matrix.scylla-version }}`" + value='${{ fromJson(steps.scylla-version.outputs.versions)[0] }}' + if [ -z "$value" ]; then + echo "No Scylla version resolved for ${{ matrix.scylla-version }}" >&2 exit 1 fi + echo "value=$value" | tee -a "$GITHUB_OUTPUT" - name: Pull CCM image from the cache uses: actions/cache/restore@v4 id: pull-image with: path: ~/.ccm/scylla-repository - key: image-scylla-${{ runner.os }}-${{ steps.scylla-version.outputs.value }} + key: image-scylla-${{ runner.os }}-${{ steps.scylla-version-value.outputs.value }} - - name: Download Scylla (${{ steps.scylla-version.outputs.value }}) image + - name: Download Scylla (${{ steps.scylla-version-value.outputs.value }}) image if: steps.pull-image.outputs.cache-hit != 'true' - run: SCYLLA_VERSION="release:${{ steps.scylla-version.outputs.value }}" make download-ccm-scylla-image + run: SCYLLA_VERSION="release:${{ steps.scylla-version-value.outputs.value }}" make download-ccm-scylla-image - name: Save CCM image cache uses: actions/cache/save@v4 if: steps.pull-image.outputs.cache-hit != 'true' with: path: ~/.ccm/scylla-repository - key: image-scylla-${{ runner.os }}-${{ steps.scylla-version.outputs.value }} + key: image-scylla-${{ runner.os }}-${{ steps.scylla-version-value.outputs.value }} - name: Pull integration test binary uses: actions/cache/restore@v4 @@ -134,9 +148,9 @@ jobs: - name: Prepare environment run: make update-rust-tooling prepare-integration-test - - name: Run integration tests on Scylla ${{ steps.scylla-version.outputs.value }} + - name: Run integration tests on Scylla ${{ steps.scylla-version-value.outputs.value }} id: run-integration-tests - run: SCYLLA_VERSION="release:${{ steps.scylla-version.outputs.value }}" make run-test-integration-scylla + run: SCYLLA_VERSION="release:${{ steps.scylla-version-value.outputs.value }}" make run-test-integration-scylla - name: Upload test logs uses: actions/upload-artifact@v4 @@ -158,7 +172,7 @@ jobs: strategy: matrix: - cassandra-version: [RELEASE-3.X] + cassandra-version: [3-LATEST] java-version: [8] fail-fast: false @@ -172,11 +186,6 @@ jobs: java-version: ${{ matrix.java-version }} distribution: "adopt" - - name: Setup Python 3 - uses: actions/setup-python@v5 - with: - python-version: "3.11" - - name: Update apt cache run: sudo apt-get update -y @@ -185,32 +194,38 @@ jobs: - name: Get cassandra version id: cassandra-version + uses: scylladb-actions/get-version@v0.4.5 + with: + source: github-tag + repo: apache/cassandra + prefix: cassandra- + out-no-prefix: true + github-token: ${{ secrets.GITHUB_TOKEN }} + filters: '^[0-9]+$.^[0-9]+$.^[0-9]+$ and 3.LAST.LAST' + + - name: Resolve cassandra version + id: cassandra-version-value run: | - if [[ "${{ matrix.cassandra-version }}" == "RELEASE-3.X" ]]; then - echo "value=$(python3 ci/version_fetch.py --version-index 1 cassandra3-stable:1 | tr -d '\"')" | tee -a $GITHUB_OUTPUT - elif [[ "${{ matrix.cassandra-version }}" == "RELEASE-4.X" ]]; then - echo "value=$(python3 ci/version_fetch.py --version-index 1 cassandra4-stable:1 | tr -d '\"')" | tee -a $GITHUB_OUTPUT - else - echo "Unknown cassandra version name `${{ matrix.cassandra-version }}`" - fi + value=${{ fromJson(steps.cassandra-version.outputs.versions)[0] }} + echo "value=${value#cassandra-}" | tee -a "$GITHUB_OUTPUT" - name: Pull CCM image from the cache uses: actions/cache/restore@v4 id: pull-image with: path: ~/.ccm/repository - key: image-cassandra-${{ runner.os }}-${{ steps.cassandra-version.outputs.value }} + key: image-cassandra-${{ runner.os }}-${{ steps.cassandra-version-value.outputs.value }} - - name: Download Cassandra (${{ steps.cassandra-version.outputs.value }}) image + - name: Download Cassandra (${{ steps.cassandra-version-value.outputs.value }}) image if: steps.pull-image.outputs.cache-hit != 'true' - run: CASSANDRA_VERSION="${{ steps.cassandra-version.outputs.value }}" make download-ccm-cassandra-image + run: CASSANDRA_VERSION="${{ steps.cassandra-version-value.outputs.value }}" make download-ccm-cassandra-image - name: Save CCM image cache uses: actions/cache/save@v4 if: steps.pull-image.outputs.cache-hit != 'true' with: path: ~/.ccm/repository - key: image-cassandra-${{ runner.os }}-${{ steps.cassandra-version.outputs.value }} + key: image-cassandra-${{ runner.os }}-${{ steps.cassandra-version-value.outputs.value }} - name: Pull integration test binary uses: actions/cache/restore@v4 @@ -227,9 +242,9 @@ jobs: - name: Prepare environment run: make update-rust-tooling prepare-integration-test - - name: Run integration tests on Cassandra ${{ steps.cassandra-version.outputs.value }} + - name: Run integration tests on Cassandra ${{ steps.cassandra-version-value.outputs.value }} id: run-integration-tests - run: CASSANDRA_VERSION="${{ steps.cassandra-version.outputs.value }}" make run-test-integration-cassandra + run: CASSANDRA_VERSION="${{ steps.cassandra-version-value.outputs.value }}" make run-test-integration-cassandra - name: Upload test logs uses: actions/upload-artifact@v4 diff --git a/CMakeLists.txt b/CMakeLists.txt index e0552c31..339f5d86 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -304,8 +304,7 @@ set(CPACK_MONOLITHIC_INSTALL ON) set(CPACK_VERBATIM_VARIABLES ON) # Normalize package output names so generated artifacts share a consistent -# `scylla_cpp_driver__` family. macOS DMGs use explicit -# per-component file names to avoid CPack's default `-` suffix. +# `scylla_cpp_driver__.{deb,rpm,pkg,msi}` pattern. set(CPACK_MONOLITHIC_INSTALL OFF) if(WIN32) set(CPACK_MONOLITHIC_INSTALL ON) @@ -384,11 +383,7 @@ elseif(APPLE) set(CPACK_GENERATOR "productbuild;DragNDrop") set(CPACK_DMG_COMPONENT_INSTALL ON) set(CPACK_PACKAGE_FILE_NAME - "${SCYLLA_DRIVER_ARTIFACT_BASE_NAME}_${PROJECT_VERSION_STRING}") - set(CPACK_DMG_${SCYLLA_DRIVER_RUNTIME_COMPONENT_NAME_UPPER}_FILE_NAME - "${SCYLLA_DRIVER_RUNTIME_COMPONENT_NAME}_${PROJECT_VERSION_STRING}") - set(CPACK_DMG_${SCYLLA_DRIVER_DEV_COMPONENT_NAME_UPPER}_FILE_NAME - "${SCYLLA_DRIVER_DEV_COMPONENT_NAME}_${PROJECT_VERSION_STRING}") + "${SCYLLA_DRIVER_ARTIFACT_BASE_NAME}_${PROJECT_VERSION_STRING}_macos") set(CPACK_PRODUCTBUILD_IDENTIFIER "com.scylladb.cpp-rs-driver") set(CPACK_PRODUCTBUILD_SIGNING_IDENTITY "") set(CPACK_PRODUCTBUILD_COMPONENT_INSTALL ON) diff --git a/Makefile b/Makefile index a9b3532a..64419e31 100644 --- a/Makefile +++ b/Makefile @@ -4,9 +4,17 @@ SPACE := ${EMPTY} ${EMPTY} SHELL := bash .SHELLFLAGS := -ec + +CCM_INSTALL_DIR ?= $(HOME)/.local/share/scylla-ccm +CCM_REPOSITORY ?= https://github.com/scylladb/scylla-ccm.git + ifeq ($(OS),Windows_NT) SHELL := pwsh.exe .SHELLFLAGS := -NoProfile -Command $$ErrorActionPreference = 'Stop'; +else + export PATH := $(CCM_INSTALL_DIR):$(HOME)/.local/bin:$(PATH) + export PERL5LIB := $(CCM_INSTALL_DIR):$(PERL5LIB) + export PYTHONPATH := $(CCM_INSTALL_DIR):$(PYTHONPATH) endif UNAME_S := $(shell uname -s) @@ -244,11 +252,21 @@ install-clang-format-if-missing: update-apt-cache-if-needed install-ccm-if-missing: @ccm list >/dev/null 2>&1 || ( echo "CCM not found in the system, install it." - pip3 install --user https://github.com/scylladb/scylla-ccm/archive/${CCM_COMMIT_ID}.zip + $(MAKE) install-ccm ) install-ccm: - @pip3 install --user https://github.com/scylladb/scylla-ccm/archive/${CCM_COMMIT_ID}.zip + @echo "Installing CCM from ${CCM_REPOSITORY}@${CCM_COMMIT_ID}" + rm -rf "${CCM_INSTALL_DIR}.tmp" + mkdir -p "$$(dirname "${CCM_INSTALL_DIR}")" + git clone --filter=blob:none --depth 1 --no-checkout "${CCM_REPOSITORY}" "${CCM_INSTALL_DIR}.tmp" + git -C "${CCM_INSTALL_DIR}.tmp" fetch --depth 1 origin "${CCM_COMMIT_ID}" + git -C "${CCM_INSTALL_DIR}.tmp" checkout --detach FETCH_HEAD + pip3 install --user ruamel-yaml psutil requests packaging boto3 tqdm urllib3 + chmod +x "${CCM_INSTALL_DIR}.tmp/ccm" + rm -rf "${CCM_INSTALL_DIR}" + mv "${CCM_INSTALL_DIR}.tmp" "${CCM_INSTALL_DIR}" + ccm list >/dev/null install-java8-if-missing: @dpkg -l openjdk-8-jre >/dev/null 2>&1 && exit 0 diff --git a/ci/version_fetch.py b/ci/version_fetch.py deleted file mode 100644 index 81bfcc19..00000000 --- a/ci/version_fetch.py +++ /dev/null @@ -1,212 +0,0 @@ -#!/usr/bin/python3 - -""" -This Python script allows you to list the -latest version numbers of Scylla and Cassandra. -You can specify whether you want the -versions of Scylla OSS or Scylla Enterprise, -either N latest stable X.Y.latest or -all non-obsolete RCs. You can also fetch -the latest version of Cassandra 3. -How are those versions fetched? We use Docker Hub -tags API. -""" - -import requests -import argparse -import re -import json -import sys - -DOCKER_HUB_TAGS_ENDPOINT = 'https://hub.docker.com/v2/namespaces/%s/repositories/%s/tags?page_size=1000' -DOCKER_HUB_SCYLLA_NAMESPACE = 'scylladb' - -SCYLLA_OSS = (DOCKER_HUB_SCYLLA_NAMESPACE, 'scylla') -SCYLLA_ENTERPRISE = (DOCKER_HUB_SCYLLA_NAMESPACE, 'scylla-enterprise') - -CASSANDRA_ENDPOINT = 'https://dlcdn.apache.org/cassandra/' -CASSANDRA_REGEX = re.compile(r'a href="([0-9])\.(\d+)\.(\d+)/"') - -VERSION_DEFINITION_RE = re.compile( - r'((?:(scylla-oss-stable):(\d+))|(?:(scylla-enterprise-stable)(:\d+)?)|(?:(cassandra3-stable)(:\d+)?)|(?:(cassandra4-stable)(:\d+)?)|(?:(scylla-oss-rc)(:\d+)?)|(?:(scylla-enterprise-rc)(:\d+)?))') -ONLY_DIGITS_RE = re.compile("^[0-9]+") - -class Version: - raw = "" - invalid = False - major = 0 - minor = 0 - minor_raw = "" - minor_rest = "" - patch = 0 - patch_raw = "" - patch_rest = "" - is_dev = False - - def __init__(self, ver): - self.raw = ver - chunks = ver.split(".", maxsplit=3) - if len(chunks) < 3: - self.invalid = True - return - - self.major, self.minor_raw, self.patch_raw = chunks - - try: - self.major = int(self.major) - except Exception: - self.invalid = True - return - - digits = ONLY_DIGITS_RE.match(self.minor_raw) - if digits: - try: - self.minor = int(self.minor_raw[digits.regs[0][0]:digits.regs[0][1]]) - self.minor_rest = self.minor_raw[digits.regs[0][1]:] - if self.minor_rest: - self.is_dev = True - except Exception: - self.invalid = True - else: - self.minor = 0 - - digits = ONLY_DIGITS_RE.match(self.patch_raw) - if digits: - try: - self.patch = int(self.patch_raw[digits.regs[0][0]:digits.regs[0][1]]) - self.patch_rest = self.patch_raw[digits.regs[0][1]:] - if self.patch_rest: - self.is_dev = True - except Exception: - self.invalid = True - else: - self.patch = 0 - - def __str__(self): - return self.raw - - def __repr__(self): - return self.raw - - def __lt__(self, other): - if self.major != other.major: - return self.major < other.major - if self.minor != other.minor: - return self.minor < other.minor - if self.patch != other.patch: - return self.patch < other.patch - if self.is_dev == other.is_dev: - return self.patch_rest < other.patch_rest - return self.is_dev - - -def fetch_docker_hub_tags(namespace, repository): - tags = [] - - # Fetch all pages of tags for a given repository - current_page_endpoint = DOCKER_HUB_TAGS_ENDPOINT % (namespace, repository) - while True: - # Fetch a page - tags_data = requests.get(current_page_endpoint).json() - - # Extract all tags from the response - tags.extend(map(lambda e: e['name'], tags_data['results'])) - - # Move to the next page if it's needed - if tags_data['next'] is not None: - current_page_endpoint = tags_data['next'] - else: - break - - result = [] - for tag in tags: - try: - ver = Version(tag) - if not ver.patch_raw or ver.invalid: - continue - result.append(ver) - except Exception: - continue - - return reversed(sorted(result)) - -rc_only = lambda x: x.is_dev -release_only = lambda x: not x.is_dev -scylla_oss_only = lambda x: x.major < 2000 -scylla_enterprise_only = lambda x: x.major > 2000 -cassandra_3_only = lambda x: x.major == 3 -cassandra_4_only = lambda x: x.major == 4 - -def filter_versions(all_versions, count, *filters): - result = [] - for ver in filter(lambda ver: all(map(lambda ft: ft(ver), filters)), all_versions): - for existing_ver in result: - if ver.major == existing_ver.major and ver.minor == existing_ver.minor: - break - else: - if len(result) >= count: - return result - result.append(ver) - return result - -def fetch_all_cassandra_versions(): - # Download folder listing for Cassandra download site - data = requests.get(CASSANDRA_ENDPOINT).text - - # Parse only those version numbers which match '3.NUM.NUM' - # into tuple (3, NUM, NUM) - data = CASSANDRA_REGEX.finditer(data) - data = map(lambda e: e.groups(), data) - data = map(lambda e: Version(f"{e[0]}.{e[1]}.{e[2]}"), data) - return reversed(sorted(data)) - - -if __name__ == '__main__': - total_result = [] - - def version_definition_type(arg): - if not VERSION_DEFINITION_RE.match(arg): - raise argparse.ArgumentTypeError(f"invalid version definition `{arg}`") - return arg - - parser = argparse.ArgumentParser(description='Get scylla and cassandra versions.') - parser.add_argument('definitions', metavar='VERSION-DEFINITION', type=version_definition_type, nargs='+', - help='A list of scylla and cassandra version definitions: scylla-oss-stable[:COUNT] | scylla-enterprise-stable[:COUNT] | cassandra3-stable[:COUNT] | cassandra4-stable[:COUNT] | scylla-oss-rc[:COUNT] | scylla-enterprise-rc[:COUNT]') - - parser.add_argument('--version-index', dest='version_index', type=int, default=0, help='print single version only') - - args = parser.parse_args() - - for version_def in args.definitions: - groups = VERSION_DEFINITION_RE.match(version_def).groups() - groups = [g for g in groups if g][1:] - - mode_name = groups[0] - versions_count = int(groups[1].replace(":","")) if len(groups) > 1 else 1 - - result = [] - if mode_name == 'scylla-oss-stable': - result = filter_versions(fetch_docker_hub_tags(*SCYLLA_OSS), versions_count, scylla_oss_only, release_only) - elif mode_name == 'scylla-enterprise-stable': - result = filter_versions(fetch_docker_hub_tags(*SCYLLA_ENTERPRISE), versions_count, scylla_enterprise_only, release_only) - elif mode_name == 'cassandra3-stable': - result = filter_versions(fetch_all_cassandra_versions(), versions_count, cassandra_3_only) - elif mode_name == 'cassandra4-stable': - result = filter_versions(fetch_all_cassandra_versions(), versions_count, cassandra_4_only) - elif mode_name == 'scylla-oss-rc': - result = filter_versions(fetch_docker_hub_tags(*SCYLLA_OSS), versions_count, scylla_oss_only, rc_only) - elif mode_name == 'scylla-enterprise-rc': - result = filter_versions(fetch_docker_hub_tags(*SCYLLA_ENTERPRISE), versions_count, scylla_enterprise_only, rc_only) - - total_result += result - - total_result = [str(k) for k in reversed(sorted(total_result))] - - if args.version_index == 0: - print(json.dumps(list(total_result))) - sys.exit(0) - if len(total_result) < args.version_index: - print("No versions found", file=sys.stderr) - sys.exit(1) - print(json.dumps(total_result[args.version_index-1])) - sys.exit(0) diff --git a/cmake/RunMacProductbuild.cmake b/cmake/RunMacProductbuild.cmake index 24ed5f1b..f164d30a 100644 --- a/cmake/RunMacProductbuild.cmake +++ b/cmake/RunMacProductbuild.cmake @@ -40,9 +40,9 @@ if(DEFINED CPACK_EXECUTABLE AND NOT CPACK_EXECUTABLE STREQUAL "") set(_cpack_executable "${CPACK_EXECUTABLE}") endif() -# Split CPACK_PACKAGE_FILE_NAME (e.g. "scylla_cpp_driver_0.1.0") into: +# Split CPACK_PACKAGE_FILE_NAME (e.g. "scylla_cpp_driver_0.1.0_macos") into: # _base_name = "scylla_cpp_driver" (component/package name) -# _suffix = "0.1.0" (version) +# _suffix = "0.1.0_macos" (version + platform) # The regex anchors on the last underscore followed by a digit (start of version). string(REGEX MATCH "^(.+)_([0-9].*)$" _matched "${CPACK_PACKAGE_FILE_NAME}") if(NOT _matched) diff --git a/docs/pyproject.toml b/docs/pyproject.toml index 40884414..80ddd3e9 100644 --- a/docs/pyproject.toml +++ b/docs/pyproject.toml @@ -5,11 +5,11 @@ version = "0.1.0" requires-python = ">=3.11" dependencies = [ "pygments>=2.18.0", - "sphinx-scylladb-theme>=1.9.2", + "sphinx-scylladb-theme>=1.9.1", "myst-parser>=5.0.0", "sphinx-autobuild>=2025.4.8", "sphinx>=9.0", - "sphinx-multiversion-scylla>=0.3.8", + "sphinx-multiversion-scylla>=0.3.7", "sphinx-sitemap>=2.9.0", "redirects_cli>=0.1.3", "breathe>=4.35.0", diff --git a/docs/uv.lock b/docs/uv.lock index 13c95dbf..fd6c2e5d 100644 --- a/docs/uv.lock +++ b/docs/uv.lock @@ -673,9 +673,9 @@ requires-dist = [ { name = "redirects-cli", specifier = ">=0.1.3" }, { name = "sphinx", specifier = ">=9.0" }, { name = "sphinx-autobuild", specifier = ">=2025.4.8" }, - { name = "sphinx-multiversion-scylla", specifier = ">=0.3.8" }, + { name = "sphinx-multiversion-scylla", specifier = ">=0.3.7" }, { name = "sphinx-scylladb-markdown", specifier = ">=0.1.2" }, - { name = "sphinx-scylladb-theme", specifier = ">=1.9.2" }, + { name = "sphinx-scylladb-theme", specifier = ">=1.9.1" }, { name = "sphinx-sitemap", specifier = ">=2.9.0" }, ] @@ -706,15 +706,15 @@ wheels = [ [[package]] name = "sphinx-multiversion-scylla" -version = "0.3.8" +version = "0.3.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/83/b7/ca070ac96cbca8b91c499827790ca4816a259b9259a961108a3fd9fa470c/sphinx_multiversion_scylla-0.3.8.tar.gz", hash = "sha256:418b563afd3c75c40f096b614cb4c595928692fb0b340762e5fd19c876567040", size = 12749, upload-time = "2026-04-13T16:45:16.119Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/b1/83fb37f6c9038469b3bd01453875bb2127b3c03f9f41247394ad2063645c/sphinx_multiversion_scylla-0.3.7.tar.gz", hash = "sha256:fc1ddd58e82cfd8810c1be6db8717a244043c04c1c632e9bd1436415d1db0d3b", size = 12665, upload-time = "2026-02-27T18:43:17.849Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/1d/c4dea80220e2cab5dc326da2369ecac60b5fc71cb0643df698ef76bb14bb/sphinx_multiversion_scylla-0.3.8-py3-none-any.whl", hash = "sha256:a3a16724eb5ec76563f12dd66efb2e7c5d9aa2ddf5e8bb755e817f9973b44ffd", size = 12675, upload-time = "2026-04-13T16:45:14.859Z" }, + { url = "https://files.pythonhosted.org/packages/a1/94/f5b6219ca1136dc0305aaf3fb6c96aa2dfe65224d6dc147e00a6485a1a22/sphinx_multiversion_scylla-0.3.7-py3-none-any.whl", hash = "sha256:6205d261a77c90b7ea3105311d1d56014736a5148966133c34344512bb8c4e4f", size = 12558, upload-time = "2026-02-27T18:43:16.988Z" }, ] [[package]] @@ -748,7 +748,7 @@ wheels = [ [[package]] name = "sphinx-scylladb-theme" -version = "1.9.2" +version = "1.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "beautifulsoup4" }, @@ -761,9 +761,9 @@ dependencies = [ { name = "sphinx-tabs" }, { name = "sphinxcontrib-mermaid" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/31/92/e30549be27dfdbfb3a1bf52cbc5496c190230dd2d4e7a41c8bafada8f4a2/sphinx_scylladb_theme-1.9.2.tar.gz", hash = "sha256:f4319deeefcc446779375c2d9cbdd922eaf63da092a50def74247dd2156f1274", size = 1683295, upload-time = "2026-04-14T11:07:30.662Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/4e/e49e351d4c429b8fe3090657d39e956d53dff61187d783caac1cba81bd72/sphinx_scylladb_theme-1.9.1.tar.gz", hash = "sha256:2ba6367f005d2c68eee1916cc16385989b8e53bbddcc81193003bdeb3bd3415e", size = 1676201, upload-time = "2026-03-09T18:10:43.841Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/ff/9957eef93c1b46dbbccd66cb4766d513c1061961daaa60fcfc1a78b3bc20/sphinx_scylladb_theme-1.9.2-py3-none-any.whl", hash = "sha256:1d75463151693c3b31ef48b2401aa4db18953fc515b4061c6f127182242e0280", size = 1669961, upload-time = "2026-04-14T11:07:28.944Z" }, + { url = "https://files.pythonhosted.org/packages/4f/30/2b2bae1b022d1fabef405a4857f160464548e08d924f24d0b26d0ca6a848/sphinx_scylladb_theme-1.9.1-py3-none-any.whl", hash = "sha256:6156d60befc3da03bd11991fec9bc590e27ce7cc4ab05aa334edd5611424b106", size = 1662204, upload-time = "2026-03-09T18:10:45.638Z" }, ] [[package]] diff --git a/packaging/smoke-test-app/CMakeLists.txt b/packaging/smoke-test-app/CMakeLists.txt index 22d0ca07..3cfaa6ad 100644 --- a/packaging/smoke-test-app/CMakeLists.txt +++ b/packaging/smoke-test-app/CMakeLists.txt @@ -259,7 +259,7 @@ elseif(APPLE) COPYONLY) set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_BINARY_DIR}/LICENSE.txt") set(CPACK_PACKAGE_FILE_NAME - "${_SMOKE_APP_PACKAGE_BASENAME}-${PROJECT_VERSION_STRING}") + "${_SMOKE_APP_PACKAGE_BASENAME}-${PROJECT_VERSION_STRING}-macos") set(CPACK_PRODUCTBUILD_IDENTIFIER "com.scylladb.cpp-rs-driver.smoke-app") set(CPACK_PRODUCTBUILD_SIGNING_IDENTITY "") if(SMOKE_APP_COMPONENT_NAME) diff --git a/packaging/smoke-test-app/Makefile b/packaging/smoke-test-app/Makefile index 27dc82a4..92a093f7 100644 --- a/packaging/smoke-test-app/Makefile +++ b/packaging/smoke-test-app/Makefile @@ -205,21 +205,20 @@ install-driver-rpm: install-driver-dev-pkg: @shopt -s nullglob - packages=(${MAKEFILE_PATH}/../../build/scylla_cpp_driver-dev_*.pkg) + packages=(${MAKEFILE_PATH}/../../build/scylla_cpp_driver-dev_*_macos.pkg) package_name="scylla-rs-driver dev PKG" ${INSTALL_PACKAGE_SCRIPT} install-driver-pkg: @shopt -s nullglob - packages=(${MAKEFILE_PATH}/../../build/scylla_cpp_driver_*.pkg) + packages=(${MAKEFILE_PATH}/../../build/scylla_cpp_driver_*_macos.pkg) package_name="scylla-rs-driver PKG" ${INSTALL_PACKAGE_SCRIPT} install-driver-dev-dmg: @shopt -s nullglob - dmg_files=(${MAKEFILE_PATH}/../../build/scylla_cpp_driver-dev_*.dmg) + dmg_files=(${MAKEFILE_PATH}/../../build/scylla_cpp_driver_*_macos-scylla_cpp_driver-dev.dmg) if [ "$${#dmg_files[@]}" -eq 0 ]; then echo "No driver dev DMG found"; exit 1; fi - if [ "$${#dmg_files[@]}" -gt 1 ]; then echo "Found more than one driver dev DMG: $${dmg_files[@]}"; exit 1; fi dmg="$${dmg_files[0]}" mount_point=$$(mktemp -d) hdiutil attach "$$dmg" -mountpoint "$$mount_point" -nobrowse @@ -231,9 +230,8 @@ install-driver-dev-dmg: install-driver-dmg: @shopt -s nullglob - dmg_files=(${MAKEFILE_PATH}/../../build/scylla_cpp_driver_*.dmg) + dmg_files=(${MAKEFILE_PATH}/../../build/scylla_cpp_driver_*_macos-scylla_cpp_driver.dmg) if [ "$${#dmg_files[@]}" -eq 0 ]; then echo "No driver DMG found"; exit 1; fi - if [ "$${#dmg_files[@]}" -gt 1 ]; then echo "Found more than one driver DMG: $${dmg_files[@]}"; exit 1; fi dmg="$${dmg_files[0]}" mount_point=$$(mktemp -d) hdiutil attach "$$dmg" -mountpoint "$$mount_point" -nobrowse @@ -244,9 +242,8 @@ install-driver-dmg: install-app-dmg: @shopt -s nullglob - dmg_files=($(BUILD_DIR)/scylla-cpp-driver-smoke-app-*.dmg) + dmg_files=($(BUILD_DIR)/scylla-cpp-driver-smoke-app-*-macos.dmg) if [ "$${#dmg_files[@]}" -eq 0 ]; then echo "No smoke-app DMG found"; exit 1; fi - if [ "$${#dmg_files[@]}" -gt 1 ]; then echo "Found more than one smoke-app DMG: $${dmg_files[@]}"; exit 1; fi dmg="$${dmg_files[0]}" mount_point=$$(mktemp -d) hdiutil attach "$$dmg" -mountpoint "$$mount_point" -nobrowse diff --git a/tests/src/integration/ccm/process.cpp b/tests/src/integration/ccm/process.cpp index 56c8ce19..5de3015d 100644 --- a/tests/src/integration/ccm/process.cpp +++ b/tests/src/integration/ccm/process.cpp @@ -16,9 +16,11 @@ #include "process.hpp" +#include #include #include #include +#include #include @@ -31,6 +33,49 @@ namespace utils { +namespace { + +bool has_directory_separator(const std::string& file) { + return file.find('/') != std::string::npos; +} + +bool is_executable(const std::string& file) { return access(file.c_str(), X_OK) == 0; } + +std::string resolve_executable(const std::string& file) { + if (file.empty() || has_directory_separator(file)) { + return file; + } + + const char* path_env = getenv("PATH"); + if (path_env == NULL) { + return file; + } + + std::string path(path_env); + size_t offset = 0; + while (offset <= path.size()) { + size_t next = path.find(':', offset); + std::string directory = path.substr(offset, next - offset); + if (directory.empty()) { + directory = "."; + } + + std::string candidate = directory + "/" + file; + if (is_executable(candidate)) { + return candidate; + } + + if (next == std::string::npos) { + break; + } + offset = next + 1; + } + + return file; +} + +} // namespace + Process::Result Process::execute(const Args& command) { Result result; @@ -62,7 +107,8 @@ Process::Result Process::execute(const Args& command) { args.push_back(NULL); options.args = const_cast(&args[0]); options.exit_cb = Process::on_exit; - options.file = command[0].c_str(); + std::string executable = resolve_executable(command[0]); + options.file = executable.c_str(); // Spawn the process uv_process_t process; diff --git a/tests/src/integration/tests/test_exec_profile.cpp b/tests/src/integration/tests/test_exec_profile.cpp index 7967fb77..215ca01f 100644 --- a/tests/src/integration/tests/test_exec_profile.cpp +++ b/tests/src/integration/tests/test_exec_profile.cpp @@ -267,9 +267,12 @@ CASSANDRA_INTEGRATION_TEST_F(ExecutionProfileTest, RequestTimeout) { ASSERT_EQ(CASS_OK, result.error_code()); // Execute a batched query with assigned profile (should timeout) - // NOTE: Selects are not allowed in batches but is OK for this test case + Statement batch_statement( + format_string("INSERT INTO %s (key, value) VALUES (?, ?)", table_name_.c_str()), 2); + batch_statement.bind(0, Text(test_name_ + "_batch_timeout")); + batch_statement.bind(1, Integer(1000)); Batch batch; - batch.add(statement); + batch.add(batch_statement); batch.set_execution_profile("request_timeout"); batch.set_sleep_time(10); // Simulate >=10ms latency (well above 1ms timeout) result = session_.execute(batch, false);