diff --git a/.github/workflows/bindings_python_ci.yml b/.github/workflows/bindings_python_ci.yml index d4b1aa922..d7cd78a21 100644 --- a/.github/workflows/bindings_python_ci.yml +++ b/.github/workflows/bindings_python_ci.yml @@ -67,7 +67,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: 3.8 + python-version: 3.9 - uses: PyO3/maturin-action@v1 with: working-directory: "bindings/python" diff --git a/.github/workflows/release_python.yml b/.github/workflows/release_python.yml new file mode 100644 index 000000000..7199eaad1 --- /dev/null +++ b/.github/workflows/release_python.yml @@ -0,0 +1,144 @@ +# 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. + +name: Publish Python 🐍 distribution 📦 to PyPI + +on: + push: + tags: + - '*' + pull_request: + branches: + - main + paths: + - ".github/workflows/release_python.yml" + workflow_dispatch: + +env: + rust_msrv: "1.77.1" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + sdist: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: PyO3/maturin-action@v1 + with: + working-directory: "bindings/python" + command: sdist + args: -o dist + - name: Upload sdist + uses: actions/upload-artifact@v3 + with: + name: wheels + path: bindings/python/dist + + wheels: + runs-on: "${{ matrix.os }}" + strategy: + matrix: + include: + - { os: windows-latest } + - { os: macos-latest, target: "universal2-apple-darwin" } + - { os: ubuntu-latest, target: "x86_64" } + - { os: ubuntu-latest, target: "aarch64" } + - { os: ubuntu-latest, target: "armv7l" } + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v4 + with: + python-version: 3.9 + - name: Setup Rust toolchain + uses: ./.github/actions/setup-builder + with: + rust-version: ${{ env.rust_msrv }} + - uses: PyO3/maturin-action@v1 + with: + target: ${{ matrix.target }} + manylinux: auto + working-directory: "bindings/python" + command: build + args: --release -o dist + env: + # Workaround ring 0.17 build issue + CFLAGS_aarch64_unknown_linux_gnu: "-D__ARM_ARCH=8" + - name: Upload wheels + uses: actions/upload-artifact@v3 + with: + name: wheels + path: bindings/python/dist + + pypi-publish: + name: Publish Python 🐍 distribution 📦 to Pypi + needs: [ sdist, wheels ] + runs-on: ubuntu-latest + # Only publish to PyPi if the tag is not a pre-release + if: ${{ startsWith(github.ref, 'refs/tags/') && !contains(github.ref, '-') }} + + environment: + name: pypi + url: https://pypi.org/p/pyiceberg_core + + permissions: + id-token: write # IMPORTANT: mandatory for trusted publishing + + steps: + - name: Download all the dists + uses: actions/download-artifact@v3 + with: + name: wheels + path: bindings/python/dist + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + + with: + skip-existing: true + packages-dir: bindings/python/dist + + testpypi-publish: + name: Publish Python 🐍 distribution 📦 to TestPypi + needs: [ sdist, linux ] + runs-on: ubuntu-latest + # Only publish to TestPyPi if the tag is a pre-release + if: ${{ startsWith(github.ref, 'refs/tags/') && contains(github.ref, '-')}} + + environment: + name: testpypi + url: https://test.pypi.org/p/pyiceberg_core + + permissions: + id-token: write # IMPORTANT: mandatory for trusted publishing + + steps: + - name: Download all the dists + uses: actions/download-artifact@v3 + with: + name: wheels + path: bindings/python/dist + - name: Publish to TestPyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + repository-url: https://test.pypi.org/legacy/ + skip-existing: true + packages-dir: bindings/python/dist diff --git a/bindings/python/Cargo.toml b/bindings/python/Cargo.toml index 8fd71592f..c2769d8c3 100644 --- a/bindings/python/Cargo.toml +++ b/bindings/python/Cargo.toml @@ -32,5 +32,5 @@ crate-type = ["cdylib"] [dependencies] iceberg = { path = "../../crates/iceberg" } -pyo3 = { version = "0.22.3", features = ["extension-module"] } +pyo3 = { version = "0.22.3", features = ["extension-module", "abi3-py39"] } arrow = { version = "53", features = ["pyarrow"] } diff --git a/bindings/python/project-description.md b/bindings/python/project-description.md new file mode 100644 index 000000000..595c9bf59 --- /dev/null +++ b/bindings/python/project-description.md @@ -0,0 +1,28 @@ + + +# Pyiceberg Core + +This project is used to build an iceberg-rust powered core for pyiceberg, and intended for use only by pyiceberg. + +Install via PyPI: + +``` +pip install pyiceberg_core +``` diff --git a/bindings/python/pyproject.toml b/bindings/python/pyproject.toml index f1f0a100f..058415a1b 100644 --- a/bindings/python/pyproject.toml +++ b/bindings/python/pyproject.toml @@ -22,11 +22,14 @@ build-backend = "maturin" [project] name = "pyiceberg_core" version = "0.0.1" +readme = "project-description.md" classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", ]