diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 2446752f9..3b70e7c01 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -7,7 +7,7 @@ on: tags: - release-* paths-ignore: - - "site/**/*" + - site/**/* - schemas/**/* - util/**/* workflow_dispatch: {} @@ -26,7 +26,7 @@ jobs: rustup toolchain install nightly --profile minimal rustup component add --toolchain nightly rustfmt - name: Check fmt - run: cargo +nightly fmt + run: cargo +nightly fmt --check test: name: Test on Rust stable @@ -54,14 +54,15 @@ jobs: - uses: Swatinem/rust-cache@v2 - name: Retrieve toml-test run: | - wget https://github.com/toml-lang/toml-test/releases/download/v2.1.0/toml-test-v2.1.0-linux-amd64.gz - gunzip toml-test-v2.1.0-linux-amd64.gz - chmod +x toml-test-v2.1.0-linux-amd64 + wget https://github.com/toml-lang/toml-test/releases/download/v2.2.0/toml-test-v2.2.0-linux-amd64.gz + echo "08f9e0a97da1151c33debf01358a8f5ef45e2a56be201241ae5eb5c2e9323fef toml-test-v2.2.0-linux-amd64.gz" | sha256sum -c - + gunzip toml-test-v2.2.0-linux-amd64.gz + chmod +x toml-test-v2.2.0-linux-amd64 - name: Build olpat-cli run: | cargo build --bin olpat --no-default-features --features "rustls-tls,toml-test" - name: Run toml-test - run: ./toml-test-v2.1.0-linux-amd64 test -toml 1.1 -skip 'invalid/control/cr,invalid/control/multi-cr,invalid/control/rawmulti-cr,invalid/table/append-with-dotted-keys-04,invalid/table/super-twice,valid/array/array,valid/comment/everywhere,valid/comment/nonascii,valid/datetime/datetime,valid/datetime/edge,valid/datetime/leap-year,valid/datetime/local,valid/datetime/local-date,valid/datetime/local-time,valid/datetime/milliseconds,valid/datetime/no-seconds,valid/datetime/timezone,valid/example,valid/key/numeric-04,valid/key/quoted-unicode,valid/spec-1.1.0/common-12,valid/spec-1.1.0/common-27,valid/spec-1.1.0/common-28,valid/spec-1.1.0/common-29,valid/spec-1.1.0/common-30,valid/spec-1.1.0/common-31,valid/spec-1.1.0/common-32,valid/spec-1.1.0/common-33,valid/spec-1.1.0/common-34,valid/spec-1.1.0/common-44,valid/spec-example-1,valid/spec-example-1-compact,valid/string/escape-esc,valid/string/hex-escape,valid/string/quoted-unicode' -decoder "./target/debug/olpat toml-test" + run: ./toml-test-v2.2.0-linux-amd64 test -toml 1.1 -skip 'invalid/control/cr,invalid/control/multi-cr,invalid/control/rawmulti-cr,invalid/table/append-with-dotted-keys-04,invalid/table/super-twice,valid/array/array,valid/comment/everywhere,valid/comment/nonascii,valid/datetime/datetime,valid/datetime/edge,valid/datetime/leap-year,valid/datetime/local,valid/datetime/local-date,valid/datetime/local-time,valid/datetime/milliseconds,valid/datetime/no-seconds,valid/datetime/timezone,valid/example,valid/key/numeric-04,valid/key/quoted-unicode,valid/spec-1.1.0/common-12,valid/spec-1.1.0/common-27,valid/spec-1.1.0/common-28,valid/spec-1.1.0/common-29,valid/spec-1.1.0/common-30,valid/spec-1.1.0/common-31,valid/spec-1.1.0/common-32,valid/spec-1.1.0/common-33,valid/spec-1.1.0/common-34,valid/spec-1.1.0/common-44,valid/spec-example-1,valid/spec-example-1-compact,valid/string/escape-esc,valid/string/hex-escape,valid/string/quoted-unicode' -decoder "./target/debug/olpat toml-test" test-msrv-lib: name: Test libraries with MSRV @@ -76,7 +77,7 @@ jobs: - name: Test MSRV for olpat run: | cargo check -p olpat-lsp-async-stub -p olpat-common -p olpat-lsp -p olpat - cargo test -p olpat-lsp-async-stub -p olpat-common -p olpat-lsp -p olpat + cargo test -p olpat-lsp-async-stub -p olpat-common -p olpat-lsp -p olpat test-msrv-bin: name: Test binaries with MSRV @@ -91,4 +92,79 @@ jobs: - name: Test olpat-cli run: | cargo check -p olpat-cli - cargo test -p olpat-cli + cargo test -p olpat-cli + + build_test_pypi_olpat_cli: + name: Build python wheels + if: contains(fromJSON('["push", "workflow_dispatch", "pull_request"]'), github.event_name) + runs-on: ${{ matrix.os }}-latest + strategy: + fail-fast: false + matrix: + os: [ubuntu, windows, macos] + arch: [x86, x64] # TODO: add aarch64 once it's supported again + exclude: + - os: windows + arch: aarch64 + - os: macos + arch: x86 + steps: + - uses: actions/checkout@v4 + - name: Set commit-based dev version + # Release tags keep the real crate version; every other build gets a unique + # PEP 440 dev version (e.g. 0.10.0.dev123) so TestPyPI accepts each commit. + if: ${{ !startsWith(github.ref, 'refs/tags/') }} + shell: bash + run: bash scripts/set-dev-version.sh crates/olpat-cli/Cargo.toml "${{ github.run_number }}" + - name: Set CFLAGS for aarch64 on Ubuntu + if: matrix.os == 'ubuntu' && matrix.arch == 'aarch64' + # Workaround issue cross-compiling to aarch64 https://github.com/bobzilladev/ring-poc + run: | + echo "CFLAGS_aarch64_unknown_linux_gnu=-D__ARM_ARCH=8" >> $GITHUB_ENV + - name: Build sdist + if: matrix.os == 'ubuntu' && matrix.arch == 'x64' + uses: PyO3/maturin-action@v1 + with: + command: sdist + args: --out dist + - name: Build wheels + uses: PyO3/maturin-action@v1 + with: + target: ${{ matrix.arch }} + args: --release --out dist + sccache: "true" + manylinux: auto + - name: Upload wheels + uses: actions/upload-artifact@v7 + with: + name: wheels-${{ matrix.os }}-${{ matrix.arch }} + path: dist + + publish-to-testpypi: + name: Publish Python 🐍 distribution 📦 to TestPyPI + needs: + - build_test_pypi_olpat_cli + runs-on: ubuntu-latest + + concurrency: + group: publish-to-testpypi + cancel-in-progress: false + + environment: + name: testpypi + url: https://test.pypi.org/p/olpat + + permissions: + id-token: write # IMPORTANT: mandatory for trusted publishing + + steps: + - name: Download all the dists + uses: actions/download-artifact@v8 + with: + pattern: wheels-* + merge-multiple: true + path: dist/ + - name: Publish distribution 📦 to TestPyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + repository-url: https://test.pypi.org/legacy/ diff --git a/.github/workflows/releases-pypi.yaml b/.github/workflows/releases-pypi.yaml new file mode 100644 index 000000000..e6e7bd576 --- /dev/null +++ b/.github/workflows/releases-pypi.yaml @@ -0,0 +1,75 @@ +name: Releases-pypi + +on: + push: + tags: + - olpat-cli-* + workflow_dispatch: + + build_pypi_olpat_cli: + name: Build python wheels + runs-on: ${{ matrix.os }}-latest + strategy: + fail-fast: false + matrix: + os: [ubuntu, windows, macos] + arch: [x86, x64] # TODO: add aarch64 once it's supported again + exclude: + - os: windows + arch: aarch64 + - os: macos + arch: x86 + steps: + - uses: actions/checkout@v4 + - name: Set CFLAGS for aarch64 on Ubuntu + if: matrix.os == 'ubuntu' && matrix.arch == 'aarch64' + # Workaround issue cross-compiling to aarch64 https://github.com/bobzilladev/ring-poc + run: | + echo "CFLAGS_aarch64_unknown_linux_gnu=-D__ARM_ARCH=8" >> $GITHUB_ENV + - name: Build sdist + if: matrix.os == 'ubuntu' && matrix.arch == 'x64' + uses: PyO3/maturin-action@v1 + with: + command: sdist + args: --out dist + - name: Build wheels + uses: PyO3/maturin-action@v1 + with: + target: ${{ matrix.arch }} + args: --release --out dist + sccache: "true" + manylinux: auto + - name: Upload wheels + uses: actions/upload-artifact@v7 + with: + name: wheels-${{ matrix.os }}-${{ matrix.arch }} + path: dist + + publish-to-pypi: + name: Publish Python 🐍 distribution 📦 to PyPi + needs: + - build_pypi_olpat_cli + runs-on: ubuntu-latest + + concurrency: + group: publish-to-pypi + cancel-in-progress: false + + environment: + name: pypi + url: https://pypi.org/p/olpat + + permissions: + id-token: write # IMPORTANT: mandatory for trusted publishing + + steps: + - name: Download all the dists + uses: actions/download-artifact@v8 + with: + pattern: wheels-* + merge-multiple: true + path: dist/ + - name: Publish distribution 📦 to PyPi + uses: pypa/gh-action-pypi-publish@release/v1 + with: + repository-url: https://pypi.org/legacy/ diff --git a/pyproject.toml b/pyproject.toml index 32eaa31d9..9e395cf8a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,8 +5,8 @@ build-backend = "maturin" [project] name = "olpat" description = "A CLI for the olpat TOML toolkit (a maintained fork of taplo)" -authors = [{ name = "tamasfe" }] -maintainers = [{ name = "Jakub Panek" }] +authors = [{ name = "tamasfe" }, { name = "weichweich" }] +maintainers = [{ name = "weichweich" }] requires-python = ">=3.8" dynamic = ["version"] @@ -36,7 +36,7 @@ classifiers = [ [project.urls] Homepage = "https://github.com/weichweich/olpat" -Documentation = "https://taplo.tamasfe.dev/cli/introduction.html" +Documentation = "https://docs.olpat.eu" Repository = "https://github.com/weichweich/olpat.git" Tracker = "https://github.com/weichweich/olpat/issues" Changelog = "https://github.com/weichweich/olpat/blob/master/crates/olpat-cli/CHANGELOG.md" @@ -44,3 +44,7 @@ Changelog = "https://github.com/weichweich/olpat/blob/master/crates/olpat-cl [tool.maturin] bindings = "bin" manifest-path = "crates/olpat-cli/Cargo.toml" +# The workspace-root LICENSE lives outside the crate dir, so `cargo package` +# leaves it out of the sdist even though maturin records `License-File: LICENSE`. +# Explicitly ship it so PyPI's metadata validation passes. +include = [{ path = "LICENSE", format = "sdist" }] diff --git a/scripts/set-dev-version.sh b/scripts/set-dev-version.sh new file mode 100755 index 000000000..4310a7e69 --- /dev/null +++ b/scripts/set-dev-version.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# Rewrite a crate's version to a unique PEP 440 dev version for CI publishing. +# +# maturin parses the Cargo.toml version string directly as a PEP 440 version, +# so "0.10.0-dev.123" (valid SemVer) normalizes to "0.10.0.dev123", which +# TestPyPI accepts as a distinct release for every build. +# +# Usage: set-dev-version.sh +set -euo pipefail + +manifest="${1:?usage: set-dev-version.sh }" +build="${2:?usage: set-dev-version.sh }" + +base=$(grep -m1 '^version' "$manifest" | sed -E 's/.*"([^"]+)".*/\1/') +base=${base%%-*} # drop any existing pre-release suffix +dev="${base}-dev.${build}" + +sed -i.bak -E "s/^version[[:space:]]*=.*/version = \"${dev}\"/" "$manifest" +rm -f "${manifest}.bak" + +echo "Building dev version ${dev}"