cramjam 2.4.0

Thin Python bindings to de/compression algorithms in Rust
Documentation
name: CI

on:
  pull_request:
  release:
    types:
      - released
      - prereleased

jobs:
  macos:
    runs-on: macos-latest
    strategy:
      matrix:
        python-version: [3.6, 3.7, 3.8, 3.9]
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python-version }}
      - name: Install Rust toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          target: aarch64-apple-darwin
          profile: minimal
          default: true
      - name: Build
        run: cargo build --release
      - name: Tests
        run: cargo test --no-default-features --release
      - name: Build wheels - x86_64
        uses: messense/maturin-action@v1
        with:
          target: x86_64
          args: -i python --release --out dist
      - name: Install built wheel - x86_64
        run: |
          pip install cramjam --no-index --find-links dist --force-reinstall
      - name: Build wheels - universal2
        if: ${{ matrix.python-version >= '3.8' }}
        uses: messense/maturin-action@v1
        with:
          args: -i python --release --universal2 --out dist --no-sdist
      - name: Install built wheel - universal2
        if: ${{ matrix.python-version >= '3.8' }}
        run: |
          pip install cramjam --no-index --find-links dist --force-reinstall
      - name: Python UnitTest
        run: |
          pip install -r dev-requirements.txt
          make test
      - name: Upload wheels
        uses: actions/upload-artifact@v2
        with:
          name: wheels
          path: dist

  windows:
    runs-on: windows-latest
    strategy:
      matrix:
        python-version: [3.6, 3.7, 3.8, 3.9]
        target: [x64, x86]
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python-version }}
          architecture: ${{ matrix.target }}
      - name: Update rustup
        run: rustup self update
      - name: Install Rust toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          profile: minimal
          default: true
      - name: Build
        if: matrix.target == 'x64'
        run: cargo build --release
      - name: Tests
        if: matrix.target == 'x64'
        run: cargo test --no-default-features --release
      - name: Build wheels
        uses: messense/maturin-action@v1
        with:
          target: ${{ matrix.target }}
          args: -i python --release --out dist --no-sdist
      - name: Install built wheel
        run: |
          pip install cramjam --no-index --find-links dist --force-reinstall
      - name: Python UnitTest
        run: |
          pip install -r dev-requirements.txt
          make test
      - name: Upload wheels
        uses: actions/upload-artifact@v2
        with:
          name: wheels
          path: dist

  linux:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: [3.6, 3.7, 3.8, 3.9]
        target: [x86_64, i686]
    steps:
    - uses: actions/checkout@v2
    - name: Install Rust toolchain
      uses: actions-rs/toolchain@v1
      with:
        toolchain: stable
        profile: minimal
        default: true
    - name: Build
      run: cargo build --release
    - name: Tests
      run: cargo test --no-default-features --release
    - uses: actions/setup-python@v2
      with:
        python-version: ${{ matrix.python-version }}
    - name: Build Wheels
      uses: messense/maturin-action@v1
      with:
        target: ${{ matrix.target }}
        manylinux: auto
        args: -i python${{ matrix.python-version }} --release --out dist --no-sdist
    - name: Python UnitTest
      if: matrix.target == 'x86_64'
      run: |
        pip install cramjam --no-index --find-links dist --force-reinstall
        pip install -r dev-requirements.txt
        make test
    - name: Test no numpy installed works
      if: matrix.target == 'x86_64'
      run: |
        pip uninstall numpy -y
        python -m pytest tests/test_no_numpy.py
    - name: Test benchmarks
      if: matrix.target == 'x86_64'
      run: |
        sudo apt-get install -y libsnappy-dev
        pip install -r benchmark-requirements.txt
        make test-bench
    - name: Upload wheels
      uses: actions/upload-artifact@v2
      with:
        name: wheels
        path: dist

  linux-cross:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python: [
          { version: '3.6', abi: 'cp36-cp36m' },
          { version: '3.7', abi: 'cp37-cp37m' },
          { version: '3.8', abi: 'cp38-cp38' },
          { version: '3.9', abi: 'cp39-cp39' },
        ]
        target: [aarch64, armv7, s390x, ppc64le, ppc64]
    steps:
    - uses: actions/checkout@v2
    - name: Build Wheels
      uses: messense/maturin-action@v1
      env:
        PYO3_CROSS_LIB_DIR: /opt/python/${{ matrix.python.abi }}/lib
      with:
        target: ${{ matrix.target }}
        manylinux: auto
        args: -i python3.9 --release --out dist --no-sdist --cargo-extra-args="--no-default-features" --cargo-extra-args="--features=extension-module"  # disable mimallocator
    - uses: uraimo/run-on-arch-action@v2.0.5
      # run-on-arch-action doesn't have ppc64 support
      if: matrix.target != 'ppc64'
      name: Install built wheel
      with:
        arch: ${{ matrix.target }}
        distro: ubuntu20.04
        githubToken: ${{ github.token }}
        # Mount the dist directory as /artifacts in the container
        dockerRunArgs: |
          --volume "${PWD}/dist:/artifacts"
        install: |
          apt-get update
          apt-get install -y --no-install-recommends python3 python3-pip software-properties-common
          add-apt-repository ppa:deadsnakes/ppa
          apt-get update
          apt-get install -y python3.6 python3.7 python3.9
        run: |
          ls -lrth /artifacts
          PYTHON=python${{ matrix.python.version }}
          $PYTHON -m pip install -U pip
          $PYTHON -m pip install cramjam --no-index --find-links /artifacts --force-reinstall
          $PYTHON -c 'import cramjam'
    - name: Upload wheels
      uses: actions/upload-artifact@v2
      with:
        name: wheels
        path: dist

  pypy:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ ubuntu-latest, macos-latest ]
    steps:
    - uses: actions/checkout@v2
    - name: Install Rust toolchain
      uses: actions-rs/toolchain@v1
      with:
        toolchain: stable
        profile: minimal
        default: true
    - name: Build
      run: cargo build --release
    - name: Tests
      run: cargo test --no-default-features --release
    - uses: actions/setup-python@v2
      with:
        python-version: pypy-3.6
    - name: Install maturin
      run: pip install maturin
    - name: Build Wheels
      run: |
        make pypy-build
        ls -l dist
    - name: Python UnitTest
      run: |
        pip install cramjam --no-index --find-links dist
        pypy -c "import cramjam"
    - name: Upload wheels
      uses: actions/upload-artifact@v2
      with:
        name: wheels
        path: dist

  release:
    name: Release
    runs-on: ubuntu-latest
    if: "startsWith(github.ref, 'refs/tags/')"
    needs: [ macos, windows, linux, linux-cross, pypy ]
    steps:
      - uses: actions/download-artifact@v2
        with:
          name: wheels
      - uses: actions/setup-python@v2
        with:
          python-version: 3.9
      - name: Publish to PyPi
        env:
          TWINE_USERNAME: __token__
          TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
        run: |
          pip install --upgrade wheel pip setuptools twine
          twine upload --skip-existing *