twine upload --skip-existing dist/*
make-wheel-linux:
+ # any changes should be duplicated in `make-wheel-linux-legacy`
name: ${{ matrix.python-version }}-${{ matrix.architecture }}-${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
- "ubuntu-latest"
python-version:
# the versions are <python tag>-<abi tag> as specified in PEP 425.
- - cp27-cp27m
- - cp27-cp27mu
- - cp36-cp36m
- cp37-cp37m
- cp38-cp38
- cp39-cp39
pip install -U twine
twine upload --skip-existing dist/*manylinux*
+ make-wheel-linux-legacy:
+ # this is identical to `make-wheel-linux`, but pins ubuntu to 20.04
+ # ubuntu-20.04 is necessary to run: py27, py36
+ name: ${{ matrix.python-version }}-${{ matrix.architecture }}-${{ matrix.os }}
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os:
+ - "ubuntu-20.04"
+ python-version:
+ # the versions are <python tag>-<abi tag> as specified in PEP 425.
+ - cp27-cp27m
+ - cp27-cp27mu
+ - cp36-cp36m
+ architecture:
+ - x64
+
+ include:
+ - python-version: "cp27-cp27m"
+ extra-requires: "mock"
+ - python-version: "cp27-cp27mu"
+ extra-requires: "mock"
+
+ fail-fast: false
+
+ steps:
+ - name: Checkout repo
+ uses: actions/checkout@v3
+
+ - name: Get python version
+ id: linux-py-version
+ env:
+ py_tag: ${{ matrix.python-version }}
+ # the command `echo "::set-output ...` is used to create an step output that can be used in following steps
+ # this is from https://github.community/t5/GitHub-Actions/Using-the-output-of-run-inside-of-if-condition/td-p/33920
+ run: |
+ version="`echo $py_tag | sed --regexp-extended 's/cp([0-9])([0-9]+)-.*/\1.\2/g'`"
+ version=$([[ $version = "3.11" ]] && echo 3.11.0-rc - 3.11 || echo $version )
+ echo $version
+ echo "::set-output name=python-version::$version"
+
+ - name: Remove tag_build from setup.cfg
+ # sqlalchemy has `tag_build` set to `dev` in setup.cfg. We need to remove it before creating the weel
+ # otherwise it gets tagged with `dev0`
+ shell: pwsh
+ # This is equivalent to the sed commands:
+ # `sed -i '/tag_build=dev/d' setup.cfg`
+ # `sed -i '/tag_build = dev/d' setup.cfg`
+
+ # `-replace` uses a regexp match
+ # alternative form: `(get-content setup.cfg) | foreach-object{$_ -replace "tag_build.=.dev",""} | set-content setup.cfg`
+ run: |
+ (cat setup.cfg) | %{$_ -replace "tag_build.?=.?dev",""} | set-content setup.cfg
+
+ - name: Create wheel for manylinux1 and manylinux2010 for py3
+ if: ${{ matrix.python-version != 'cp27-cp27m' && matrix.python-version != 'cp27-cp27mu' && matrix.python-version != 'cp311-cp311' }}
+ # this step uses the image provided by pypa here https://github.com/pypa/manylinux to generate the wheels on linux
+ # the action uses the image for manylinux2010 but can generate also a manylinux1 wheel
+ # change the tag of this image to change the image used
+ uses: RalfG/python-wheels-manylinux-build@v0.5.0-manylinux2010_x86_64
+ # this action generates 3 wheels in dist/. linux, manylinux1 and manylinux2010
+ with:
+ # python-versions is the output of the previous step and is in the form <python tag>-<abi tag>. Eg cp27-cp27mu
+ python-versions: ${{ matrix.python-version }}
+ build-requirements: "setuptools>=44 wheel>=0.34"
+ # Create the wheel using --no-use-pep517 since locally we have pyproject
+ # This flag should be removed once sqlalchemy supports pep517
+ # `--no-deps` is used to only generate the wheel for the current library. Redundant in sqlalchemy since it has no dependencies
+ pip-wheel-args: "-w ./dist --no-use-pep517 -v --no-deps"
+
+ - name: Create wheel for manylinux2014 for py3
+ if: ${{ matrix.python-version != 'cp27-cp27m' && matrix.python-version != 'cp27-cp27mu' }}
+ # this step uses the image provided by pypa here https://github.com/pypa/manylinux to generate the wheels on linux
+ # the action uses the image for manylinux2010 but can generate also a manylinux1 wheel
+ # change the tag of this image to change the image used
+ uses: RalfG/python-wheels-manylinux-build@v0.5.0-manylinux2014_x86_64
+ # this action generates 2 wheels in dist/. linux and manylinux2014
+ with:
+ # python-versions is the output of the previous step and is in the form <python tag>-<abi tag>. Eg cp27-cp27mu
+ python-versions: ${{ matrix.python-version }}
+ build-requirements: "setuptools>=44 wheel>=0.34"
+ # Create the wheel using --no-use-pep517 since locally we have pyproject
+ # This flag should be removed once sqlalchemy supports pep517
+ # `--no-deps` is used to only generate the wheel for the current library. Redundant in sqlalchemy since it has no dependencies
+ pip-wheel-args: "-w ./dist --no-use-pep517 -v --no-deps"
+
+ - name: Create wheel for manylinux py2
+ if: ${{ matrix.python-version == 'cp27-cp27m' || matrix.python-version == 'cp27-cp27mu' }}
+ # this step uses the image provided by pypa here https://github.com/pypa/manylinux to generate the wheels on linux
+ # the action uses the image for manylinux2010 but can generate also a manylinux1 wheel
+ # change the tag of this image to change the image used
+ uses: RalfG/python-wheels-manylinux-build@v0.5.0-manylinux1_x86_64
+ # this action generates 2 wheels in dist/. linux and manylinux1
+ with:
+ # python-versions is the output of the previous step and is in the form <python tag>-<abi tag>. Eg cp27-cp27mu
+ python-versions: ${{ matrix.python-version }}
+ build-requirements: "setuptools>=44 wheel>=0.34"
+ # Create the wheel using --no-use-pep517 since locally we have pyproject
+ # This flag should be removed once sqlalchemy supports pep517
+ # `--no-deps` is used to only generate the wheel for the current library. Redundant in sqlalchemy since it has no dependencies
+ pip-wheel-args: "-w ./dist --no-use-pep517 -v --no-deps"
+
+ - name: Set up Python
+ uses: actions/setup-python@v4
+ with:
+ python-version: ${{ steps.linux-py-version.outputs.python-version }}
+ architecture: ${{ matrix.architecture }}
+
+ - name: Check created wheel
+ # check that the wheel is compatible with the current installation.
+ # If it is then does:
+ # - install the created wheel without using the pypi index
+ # - check the c extension
+ # - runs the tests
+ run: |
+ pip install 'packaging>=20.4'
+ if python .github/workflows/scripts/can_install.py "${{ matrix.python-version }}"
+ then
+ pip install greenlet "importlib-metadata;python_version<'3.8'"
+ pip install -f dist --no-index sqlalchemy
+ python -c 'from sqlalchemy.util import has_compiled_ext; assert has_compiled_ext()'
+ pip install pytest pytest-xdist ${{ matrix.extra-requires }}
+ pytest -n2 -q test --nomemory --notimingintensive
+ else
+ echo Not compatible. Skipping install.
+ fi
+
+ - name: Upload wheels to release
+ # upload the generated wheels to the github release
+ uses: sqlalchemyorg/upload-release-assets@sa
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ files: 'dist/*manylinux*'
+
+ - name: Set up Python for twine
+ # twine on py2 is very old and is no longer updated, so we change to python 3.8 before upload
+ uses: actions/setup-python@v4
+ with:
+ python-version: "3.8"
+
+ - name: Publish wheel
+ # the action https://github.com/marketplace/actions/pypi-publish runs only on linux and we cannot specify
+ # additional options
+ # We upload both manylinux1 and manylinux2010 wheels. pip will download the appropriate one according to the system.
+ # manylinux1 is an older format and is now not very used since many environments can use manylinux2010
+ # currently (April 2020) manylinux2014 is still wip, so we do not generate it.
+ env:
+ TWINE_USERNAME: __token__
+ # replace TWINE_PASSWORD with token for real pypi
+ # TWINE_PASSWORD: ${{ secrets.test_pypi_token }}
+ TWINE_PASSWORD: ${{ secrets.pypi_token }}
+ run: |
+ pip install -U twine
+ twine upload --skip-existing dist/*manylinux*
+
+
make-wheel-linux-arm64:
+ # any changes should be duplicated in `make-wheel-linux-arm64-legacy`
name: ${{ matrix.python-version }}-arm64-${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
- "ubuntu-latest"
python-version:
# the versions are <python tag>-<abi tag> as specified in PEP 425.
- - cp36-cp36m
- cp37-cp37m
- cp38-cp38
- cp39-cp39
run: |
pip install -U twine
twine upload --skip-existing dist/*manylinux*
+
+ make-wheel-linux-arm64-legacy:
+ # this is identical to `make-wheel-linux-arm64`, but pins ubuntu to 20.04
+ # ubuntu-20.04 is necessary to run: py27, py36
+ name: ${{ matrix.python-version }}-arm64-${{ matrix.os }}
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os:
+ - "ubuntu-20.04"
+ python-version:
+ # the versions are <python tag>-<abi tag> as specified in PEP 425.
+ - cp36-cp36m
+
+ fail-fast: false
+
+ steps:
+ - name: Checkout repo
+ uses: actions/checkout@v3
+
+ - name: Remove tag_build from setup.cfg
+ # sqlalchemy has `tag_build` set to `dev` in setup.cfg. We need to remove it before creating the weel
+ # otherwise it gets tagged with `dev0`
+ shell: pwsh
+ # This is equivalent to the sed commands:
+ # `sed -i '/tag_build=dev/d' setup.cfg`
+ # `sed -i '/tag_build = dev/d' setup.cfg`
+
+ # `-replace` uses a regexp match
+ # alternative form: `(get-content setup.cfg) | foreach-object{$_ -replace "tag_build.=.dev",""} | set-content setup.cfg`
+ run: |
+ (cat setup.cfg) | %{$_ -replace "tag_build.?=.?dev",""} | set-content setup.cfg
+
+ - name: Set up emulation
+ run: |
+ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
+
+ - name: Create wheel for manylinux2014
+ # this step uses the image provided by pypa here https://github.com/pypa/manylinux to generate the wheels on linux
+ # the action uses the image for manylinux2014 but can generate also a manylinux1 wheel
+ # change the tag of this image to change the image used
+ uses: RalfG/python-wheels-manylinux-build@v0.5.0-manylinux2014_aarch64
+ # this action generates 2 wheels in dist/. linux and manylinux2014
+ with:
+ # python-versions is the output of the previous step and is in the form <python tag>-<abi tag>. Eg cp37-cp37mu
+ python-versions: ${{ matrix.python-version }}
+ build-requirements: "setuptools>=44 wheel>=0.34"
+ # Create the wheel using --no-use-pep517 since locally we have pyproject
+ # This flag should be removed once sqlalchemy supports pep517
+ # `--no-deps` is used to only generate the wheel for the current library. Redundant in sqlalchemy since it has no dependencies
+ pip-wheel-args: "-w ./dist --no-use-pep517 -v --no-deps"
+
+ - name: Check created wheel
+ # check that the wheel is compatible with the current installation.
+ # - runs the tests
+ uses: docker://quay.io/pypa/manylinux2014_aarch64
+ with:
+ args: |
+ bash -c "
+ export PATH=/opt/python/${{ matrix.python-version }}/bin:$PATH &&
+ python --version &&
+ pip install greenlet \"importlib-metadata;python_version<'3.8'\" &&
+ pip install -f dist --no-index sqlalchemy &&
+ python -c 'from sqlalchemy.util import has_compiled_ext; assert has_compiled_ext()' &&
+ pip install pytest pytest-xdist ${{ matrix.extra-requires }} &&
+ pytest -n2 -q test --nomemory --notimingintensive"
+
+ - name: Upload wheels to release
+ # upload the generated wheels to the github release
+ uses: sqlalchemyorg/upload-release-assets@sa
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ files: 'dist/*manylinux*'
+
+ - name: Set up Python for twine
+ # Setup python after creating the wheel, otherwise LD_LIBRARY_PATH gets set and it will break wheel generation
+ # twine on py2 is very old and is no longer updated, so we change to python 3.8 before upload
+ uses: actions/setup-python@v4
+ with:
+ python-version: "3.8"
+
+ - name: Publish wheel
+ # the action https://github.com/marketplace/actions/pypi-publish runs only on linux and we cannot specify
+ # additional options
+ # We upload manylinux2014 arm64 wheels. pip will download the appropriate one according to the system.
+ env:
+ TWINE_USERNAME: __token__
+ # replace TWINE_PASSWORD with token for real pypi
+ # TWINE_PASSWORD: ${{ secrets.test_pypi_token }}
+ TWINE_PASSWORD: ${{ secrets.pypi_token }}
+ run: |
+ pip install -U twine
+ twine upload --skip-existing dist/*manylinux*
\ No newline at end of file
jobs:
run-test:
+ # any changes to this job should be duplicated in `run-test-legacy`
name: ${{ matrix.python-version }}-${{ matrix.build-type }}-${{ matrix.architecture }}-${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
- "windows-latest"
- "macos-latest"
python-version:
- - "2.7"
- - "3.6"
- "3.7"
- "3.8"
- "3.9"
# - python-version: "pypy-3.9"
# pytest-args: "-k 'not test_autocommit_on and not test_turn_autocommit_off_via_default_iso_level and not test_autocommit_isolation_level'"
# add aiosqlite on linux
- - os: "ubuntu-latest"
+ - os: "ubuntu-20.04"
+ pytest-args: "--dbdriver pysqlite --dbdriver aiosqlite"
+
+ exclude:
+ # c-extensions fail to build on windows for python 2.7
+ - os: "windows-latest"
+ python-version: "2.7"
+ build-type: "cext"
+ # linux and osx do not have x86 python
+ - os: "ubuntu-20.04"
+ architecture: x86
+ - os: "macos-latest"
+ architecture: x86
+ # pypy does not have cext
+ # - python-version: "pypy-3.9"
+ # build-type: "cext"
+ # - os: "windows-latest"
+ # python-version: "pypy-3.9"
+ # architecture: x86
+
+ fail-fast: false
+
+ # steps to run in each job. Some are github actions, others run shell commands
+ steps:
+ - name: Checkout repo
+ uses: actions/checkout@v3
+
+ - name: Set up python
+ uses: actions/setup-python@v4
+ with:
+ python-version: ${{ matrix.python-version }}
+ architecture: ${{ matrix.architecture }}
+
+ - name: Install dependencies
+ run: |
+ python -m pip install --upgrade pip
+ pip install --upgrade tox setuptools
+ pip list
+
+ - name: Run tests
+ run: tox -e github-${{ matrix.build-type }} -- -q --nomemory --notimingintensive ${{ matrix.pytest-args }}
+
+ run-test-legacy:
+ # this is identical to `run-test`, but pins ubuntu to 20.04
+ # ubuntu-20.04 is necessary to run: py27, py36
+ name: ${{ matrix.python-version }}-${{ matrix.build-type }}-${{ matrix.architecture }}-${{ matrix.os }}
+ runs-on: ${{ matrix.os }}
+ strategy:
+ # run this job using this matrix, excluding some combinations below.
+ matrix:
+ os:
+ - "ubuntu-20.04"
+ - "windows-latest"
+ - "macos-latest"
+ python-version:
+ - "2.7"
+ - "3.6"
+ build-type:
+ - "cext"
+ - "nocext"
+ architecture:
+ - x64
+ - x86
+
+ include:
+ # autocommit tests fail on the ci for some reason
+ # - python-version: "pypy-3.9"
+ # pytest-args: "-k 'not test_autocommit_on and not test_turn_autocommit_off_via_default_iso_level and not test_autocommit_isolation_level'"
+ # add aiosqlite on linux
+ - os: "ubuntu-20.04"
pytest-args: "--dbdriver pysqlite --dbdriver aiosqlite"
exclude:
python-version: "2.7"
build-type: "cext"
# linux and osx do not have x86 python
- - os: "ubuntu-latest"
+ - os: "ubuntu-20.04"
architecture: x86
- os: "macos-latest"
architecture: x86
run: tox -e github-${{ matrix.build-type }} -- -q --nomemory --notimingintensive ${{ matrix.pytest-args }}
run-test-arm64:
+ # any changes to this job should be duplicated in `run-test-arm64`
name: ${{ matrix.python-version }}-${{ matrix.build-type }}-arm64-ubuntu-latest
runs-on: ubuntu-latest
strategy:
matrix:
python-version:
- - cp36-cp36m
- cp37-cp37m
- cp38-cp38
- cp39-cp39
tox -e github-${{ matrix.build-type }} -- -q --nomemory --notimingintensive ${{ matrix.pytest-args }}
"
+ run-test-arm64-legacy:
+ # this is identical to `run-test-arm64-legacy`, but pins ubuntu to 20.04
+ # ubuntu-20.04 is necessary to run: py27, py36
+ name: ${{ matrix.python-version }}-${{ matrix.build-type }}-arm64-ubuntu-20.04
+ runs-on: ubuntu-20.04
+ strategy:
+ matrix:
+ python-version:
+ - cp36-cp36m
+ build-type:
+ - "cext"
+ - "nocext"
+
+ fail-fast: false
+
+ steps:
+ - name: Checkout repo
+ uses: actions/checkout@v3
+
+ - name: Set up emulation
+ run: |
+ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
+
+ - name: Run tests
+ uses: docker://quay.io/pypa/manylinux2014_aarch64
+ with:
+ args: |
+ bash -c "
+ export PATH=/opt/python/${{ matrix.python-version }}/bin:$PATH &&
+ python --version &&
+ python -m pip install --upgrade pip &&
+ pip install --upgrade tox setuptools &&
+ pip list &&
+ tox -e github-${{ matrix.build-type }} -- -q --nomemory --notimingintensive ${{ matrix.pytest-args }}
+ "
+
run-mypy:
+ # any changes to this job should be duplicated in `run-mypy-legacy`
name: mypy-${{ matrix.python-version }}
runs-on: ${{ matrix.os }}
strategy:
os:
- "ubuntu-latest"
python-version:
- - "3.6"
- "3.7"
- "3.8"
- "3.9"
- name: Run tests
run: tox -e mypy ${{ matrix.pytest-args }}
+ run-mypy-legacy:
+ # this is identical to `run-mypy`, but pins ubuntu to 20.04
+ # ubuntu-20.04 is necessary to run: py27, py36
+ name: mypy-${{ matrix.python-version }}
+ runs-on: ${{ matrix.os }}
+ strategy:
+ # run this job using this matrix, excluding some combinations below.
+ matrix:
+ os:
+ - "ubuntu-20.04"
+ python-version:
+ - "3.6"
+ fail-fast: false
+
+ # steps to run in each job. Some are github actions, others run shell commands
+ steps:
+ - name: Checkout repo
+ uses: actions/checkout@v3
+
+ - name: Set up python
+ uses: actions/setup-python@v4
+ with:
+ python-version: ${{ matrix.python-version }}
+ architecture: ${{ matrix.architecture }}
+
+ - name: Install dependencies
+ run: |
+ python -m pip install --upgrade pip
+ pip install --upgrade tox setuptools
+ pip list
+
+ - name: Run tests
+ run: tox -e mypy ${{ matrix.pytest-args }}
+
run-pep8:
name: pep8-${{ matrix.python-version }}
runs-on: ${{ matrix.os }}