From a07682769872c471fe7b7af87c55e031ed64c9f9 Mon Sep 17 00:00:00 2001 From: Ilya Kulakov Date: Tue, 5 Nov 2019 19:02:27 -0800 Subject: [PATCH] Use tox and pyenv to specify different python environments. --- .appveyor.yml | 36 ++--- .travis.yml | 308 +++++++++++++++------------------------- requirements.txt | 16 ++- setup.cfg | 48 ++++++- test_git_archive_all.py | 1 - 5 files changed, 189 insertions(+), 220 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 73b50d6..f94c139 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1,26 +1,30 @@ +clone_depth: 1 + +image: + - Visual Studio 2019 + environment: + PYTHON: "C:\\Python37-x64" + matrix: -# Python 2.6 builds do not work because bundled OpenSSL does not support TLS. -# - PYTHON: "C:\\Python26" -# - PYTHON: "C:\\Python26-x64" -# Python 2.x builds do not work, because readlink for Windows is not available before Python 3.3 -# - PYTHON: "C:\\Python27" -# - PYTHON: "C:\\Python27-x64" - - PYTHON: "C:\\Python34" - - PYTHON: "C:\\Python34-x64" - - PYTHON: "C:\\Python35" - - PYTHON: "C:\\Python35-x64" - - PYTHON: "C:\\Python36" - - PYTHON: "C:\\Python36-x64" - - PYTHON: "C:\\Python37" - - PYTHON: "C:\\Python37-x64" +# Python 2.x builds do not work because implementation of os.readlink did not support Windows till 3.2 + - TOXENV: "py34" + - TOXENV: "py35" + - TOXENV: "py36" + - TOXENV: "py37" + +matrix: + fast_finish: true build: off install: - "%PYTHON%\\python.exe -m pip install --upgrade pip" - "%PYTHON%\\python.exe -m pip install --upgrade wheel>=0.30.0 setuptools>=36.6.0" + - "%PYTHON%\\python.exe -m pip install --upgrade tox==3.14.0 codecov==2.0.15 tox-venv==0.4.0" test_script: - - "%PYTHON%\\python.exe -m pip install -r requirements.txt" - - "%PYTHON%\\python.exe setup.py test" + - "%PYTHON%\\python.exe -m tox -vv -- --cov-report=xml" + +after_test: + - "%PYTHON%\\python.exe -m codecov --required --file %APPVEYOR_BUILD_FOLDER%\\coverage.xml" diff --git a/.travis.yml b/.travis.yml index 6da3cd8..64aaa80 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,204 +1,132 @@ +git: + depth: 1 + +before_cache: + - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew cleanup; fi + +cache: + directories: + - $HOME/.cache/pyenv + - /opt/pyenv/versions/$PYENV_VERSION + - $HOME/pyenv/versions/$PYENV_VERSION + - $HOME/Library/Caches/Homebrew + pip: true + env: global: - - PIP_URL="https://bootstrap.pypa.io/get-pip.py" - - PIP="python -m pip" + - PYTHON_BUILD_CACHE_PATH=$HOME/.cache/pyenv + - HOMEBREW_NO_INSTALL_CLEANUP=1 -matrix: +jobs: fast_finish: true include: - - os: osx - language: generic - env: - - NAME="Python 2.6" - - PIP_URL="https://bootstrap.pypa.io/2.6/get-pip.py" - - PIP=pip - before_install: - - brew update - - brew upgrade pyenv || brew install pyenv || true - - pyenv install 2.6.9 - - pyenv local 2.6.9 - - eval "$(pyenv init -)" - - pip install virtualenv - - python2.6 -m virtualenv env - - pyenv local --unset - - source env/bin/activate - - python -c "import sys; print(sys.platform)" - - os: osx - language: generic - env: NAME="Python 2 Homebrew" - before_install: - - brew update - - brew upgrade python2 || true - - python2.7 -m pip install virtualenv - - python2.7 -m virtualenv env - - source env/bin/activate - - os: osx - language: generic - env: NAME="Python pypy Homebrew" - before_install: - - brew update - - brew upgrade pypy || brew install pypy || true - - pypy -m pip install virtualenv - - pypy -m virtualenv env - - source env/bin/activate - - os: osx - language: generic - env: NAME="Python 3.4" - before_install: - - brew update - - brew upgrade pyenv || brew install pyenv || true - - pyenv install 3.4.9 - - pyenv local 3.4.9 - - eval "$(pyenv init -)" - - python3.4 -m venv env - - pyenv local --unset - - source env/bin/activate - - os: osx - language: generic - env: NAME="Python 3.5" - before_install: - - brew update - - brew upgrade pyenv || brew install pyenv || true - - pyenv install 3.5.9 - - pyenv local 3.5.9 - - eval "$(pyenv init -)" - - python3.5 -m venv env - - pyenv local --unset - - source env/bin/activate - - os: osx - language: generic - env: NAME="Python 3.6" - before_install: - - brew update - - brew upgrade pyenv || brew install pyenv || true - - pyenv install 3.6.9 - - pyenv local 3.6.9 - - eval "$(pyenv init -)" - - python3.6 -m venv env - - pyenv local --unset - - source env/bin/activate - - os: osx - language: generic - env: NAME="Python 3.7" - before_install: - - brew update - - brew upgrade pyenv || brew install pyenv || true - - pyenv install 3.7.5 - - pyenv local 3.7.5 - - eval "$(pyenv init -)" - - python3.6 -m venv env - - pyenv local --unset - - source env/bin/activate - - os: osx - language: generic - env: NAME="Python 3 Homebrew" - before_install: - - brew update - - brew upgrade python || true - - python3.7 -m venv env - - source env/bin/activate - - os: osx - language: generic - env: NAME="Python pypy3 Homebrew" - before_install: - - brew update - - brew upgrade pypy3 || brew install pypy3 || true - - pypy3 -m venv env - - source env/bin/activate - - os: osx - language: generic - env: NAME="Python HEAD" - before_install: - - brew update - - brew unlink python - - brew install python --HEAD - - python3 -m venv env - - source env/bin/activate - - os: linux - env: - - PIP_URL="https://bootstrap.pypa.io/2.6/get-pip.py" - - PIP=pip - language: python - python: 2.6 - dist: trusty - - os: linux - language: python - python: 2.7 - - os: linux - language: python - python: pypy - - os: linux - language: python - python: 3.4 - - os: linux - language: python - python: 3.5 - - os: linux - language: python - python: 3.6 - - os: linux - language: python - python: 3.7 - sudo: true - - os: linux - language: python - python: 3.8 - sudo: true - - os: linux - language: python - python: 3.6-dev - - os: linux - language: python - python: 3.7-dev - - os: linux - language: python - python: 3.8-dev - - os: linux - language: python - python: nightly - - os: linux - language: python - python: pypy3 + - &linux + os: linux + language: python + env: PYENV_VERSION=2.6.9 TOXENV=py26 + - <<: *linux + env: PYENV_VERSION=2.7.17 TOXENV=py27 + - <<: *linux + env: PYENV_VERSION=2.7-dev TOXENV=py27 + - <<: *linux + env: PYENV_VERSION=3.4.10 TOXENV=py34 + - <<: *linux + env: PYENV_VERSION=3.5.8 TOXENV=py35 + - <<: *linux + env: PYENV_VERSION=3.5-dev TOXENV=py35 + - <<: *linux + env: PYENV_VERSION=3.6.9 TOXENV=py36 + - <<: *linux + env: PYENV_VERSION=3.6-dev TOXENV=py36 + - <<: *linux + env: PYENV_VERSION=3.7.5 TOXENV=py37 + - <<: *linux + env: PYENV_VERSION=3.7-dev TOXENV=py37 + - <<: *linux + env: PYENV_VERSION=3.8.0 TOXENV=py38 + - <<: *linux + env: PYENV_VERSION=3.8-dev TOXENV=py38 + - <<: *linux + env: PYENV_VERSION=3.9-dev TOXENV=py39 + - <<: *linux + env: PYENV_VERSION=pypy2.7-7.2.0 TOXENV=pypy + - <<: *linux + env: PYENV_VERSION=pypy3.6-7.2.0 TOXENV=pypy3 + - &osx + os: osx + language: generic + env: PYENV_VERSION=2.6.9 TOXENV=py26 + - <<: *osx + env: PYENV_VERSION=2.7.17 TOXENV=py27 + - <<: *osx + env: PYENV_VERSION=2.7-dev TOXENV=py27 + - <<: *osx + env: PYENV_VERSION=3.4.10 TOXENV=py34 + - <<: *osx + env: PYENV_VERSION=3.5.8 TOXENV=py35 + - <<: *osx + env: PYENV_VERSION=3.5-dev TOXENV=py35 + - <<: *osx + env: PYENV_VERSION=3.6.9 TOXENV=py36 + - <<: *osx + env: PYENV_VERSION=3.6-dev TOXENV=py36 + - <<: *osx + env: PYENV_VERSION=3.7.5 TOXENV=py37 + - <<: *osx + env: PYENV_VERSION=3.7-dev TOXENV=py37 + - <<: *osx + env: PYENV_VERSION=3.8.0 TOXENV=py38 + - <<: *osx + env: PYENV_VERSION=3.8-dev TOXENV=py38 + - <<: *osx + env: PYENV_VERSION=3.9-dev TOXENV=py39 + - <<: *osx + env: PYENV_VERSION=pypy2.7-7.2.0 TOXENV=pypy + - <<: *osx + env: PYENV_VERSION=pypy3.6-7.2.0 TOXENV=pypy3 allow_failures: - - os: osx - env: NAME="Python HEAD" - - os: linux - python: 3.6-dev - - os: linux - python: 3.7-dev - - os: linux - python: 3.8-dev - - os: linux - python: nightly + - env: PYENV_VERSION=2.7-dev TOXENV=py27 + - env: PYENV_VERSION=3.5-dev TOXENV=py35 + - env: PYENV_VERSION=3.6-dev TOXENV=py36 + - env: PYENV_VERSION=3.7-dev TOXENV=py37 + - env: PYENV_VERSION=3.8-dev TOXENV=py38 + - env: PYENV_VERSION=3.9-dev TOXENV=py39 + +before_install: + - mkdir -p ${HOME}/.cache/pyenv + - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew update && (brew upgrade pyenv || true); fi + - if [ "$TRAVIS_OS_NAME" = "linux" ]; then git -C "$(pyenv root)" fetch && git -C "$(pyenv root)" checkout master && git -C "$(pyenv root)" pull; fi install: -- curl ${PIP_URL} | python -- ${PIP} install -r requirements.txt + - python -m pip install tox==3.14.0 codecov==2.0.15 tox-pyenv==1.1.0 virtualenv==15.2.0 + - pyenv install $(pyenv exec python --version >/dev/null 2>&1 && echo "--skip-existing" || echo "--force") "${PYENV_VERSION}" script: -- make test + - python -m tox -vv -- --cov-report=xml after_success: -- python -m codecov -- python setup.py sdist bdist_wheel + - python -m codecov --required + +before_deploy: + - python setup.py sdist bdist_wheel deploy: -- provider: pypi - user: Ilya.Kulakov - password: - secure: "fDYi/HJvYyqUggKmN/Dc6YewUsBAzHWBdTYMpDfHETeOIvv2G268atnIwcoWav63fwPUpagwOlzQhRklqeLRmjEzr4M+wzFsAQVAnj6a7ChLPWPmgZlClFRpm6leWZjzGD+1FPnH/vvwTHlDi7j+1zgfh4WEellnw3hU+Lzjx+o=" - distributions: "sdist bdist_wheel" - on: - tags: true - branch: master - python: 3.6 -- provider: releases - skip_cleanup: true - api_key: - secure: "QHn7vzWo7rbgemP37qdNU4h+q7Xb2CQ7HxPFfa7yTsxFd8V4+sQLVrnaQtzYTM8dJWvRgi8PVHVGl2VGnQAiRM4Nd/NE/3HL9aHQIfWRtZ6XHfNVQ55bxJzLfZZy2M+32b8W268ELj3ty4C3Mo7TuOTv4svQoRDrLzGozJCpu+w=" - file_glob: true - file: dist/* - on: - tags: true - branch: master - python: 3.6 + - provider: pypi + user: Ilya.Kulakov + password: + secure: "fDYi/HJvYyqUggKmN/Dc6YewUsBAzHWBdTYMpDfHETeOIvv2G268atnIwcoWav63fwPUpagwOlzQhRklqeLRmjEzr4M+wzFsAQVAnj6a7ChLPWPmgZlClFRpm6leWZjzGD+1FPnH/vvwTHlDi7j+1zgfh4WEellnw3hU+Lzjx+o=" + distributions: "sdist bdist_wheel" + on: + tags: true + branch: master + python: 3.6 + - provider: releases + skip_cleanup: true + api_key: + secure: "QHn7vzWo7rbgemP37qdNU4h+q7Xb2CQ7HxPFfa7yTsxFd8V4+sQLVrnaQtzYTM8dJWvRgi8PVHVGl2VGnQAiRM4Nd/NE/3HL9aHQIfWRtZ6XHfNVQ55bxJzLfZZy2M+32b8W268ELj3ty4C3Mo7TuOTv4svQoRDrLzGozJCpu+w=" + file_glob: true + file: dist/* + on: + tags: true + branch: master + python: 3.6 diff --git a/requirements.txt b/requirements.txt index bc36c9b..35e7b45 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,10 @@ -pytest==3.7.1; python_version > "2.6" -pytest==3.2.5; python_version <= "2.6" -pytest-cov==2.5.1 -pytest-mock; python_version > "2.6" -codecov==2.0.15 -pycodestyle==2.4.0 +pycodestyle==2.4.0; python_version < "2.7" +pycodestyle==2.5.0; python_version >= "2.7" +pytest==3.2.5; python_version < "2.7" +pytest==4.6.6; python_version >= "2.7" and python_version < "3.5" +pytest==5.2.2; python_version >= "3.5" +pytest-cov==2.5.1; python_version < "2.7" +pytest-cov==2.8.1; python_version >= "2.7" +pytest-mock==1.6.3; python_version < "2.7" +pytest-mock==1.11.2; python_version >= "2.7" +setuptools==36.8.0; python_version < "2.7" diff --git a/setup.cfg b/setup.cfg index 35dc238..476d748 100644 --- a/setup.cfg +++ b/setup.cfg @@ -18,8 +18,10 @@ classifiers = Natural Language :: English Programming Language :: Python :: Implementation :: CPython Programming Language :: Python :: Implementation :: PyPy + Programming Language :: Python :: 2 Programming Language :: Python :: 2.6 Programming Language :: Python :: 2.7 + Programming Language :: Python :: 3 Programming Language :: Python :: 3.4 Programming Language :: Python :: 3.5 Programming Language :: Python :: 3.6 @@ -27,17 +29,49 @@ classifiers = Programming Language :: Python :: 3.8 Topic :: Software Development :: Version Control Topic :: System :: Archiving -platforms = any +platforms = + Darwin + Linux + Windows long_description = file: README.rst [options] zip_safe = 1 python_requires = >=2.6,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*, -test_require = - pytest - pytest-cov - pycodestyle - pytest-mock; python_version > "2.6" +tests_require = + pycodestyle<2.5.0; python_version < "2.7" + pycodestyle>=2.5.0; python_version >= "2.7" + pytest<=3.2.5; python_version < "2.7" + pytest<5.0.0; python_version >= "2.7" and python_version < "3.5" + pytest>=5.0.0; python_version >= "3.5" + pytest-cov<2.6.0; python_version < "2.7" + pytest-cov>=2.6.0; python_version >= "2.7" + pytest-mock<1.7.0; python_version < "2.7" + pytest-mock>=1.7.0; python_version >= "2.7" + setuptools<=36.8.0; python_version < "2.7" [tool:pytest] -addopts= --cov=git_archive_all --cov-report=term --cov-report=html --cov-branch --showlocals -vv +addopts= --cov=git_archive_all --cov-report=term --cov-branch --showlocals -vv + +[tox:tox] +envlist = + py26 + py27 + py34 + py35 + py36 + py37 + py38 + py39 + pypy + pypy3 +skipsdist = true + +[testenv] +deps = -rrequirements.txt +commands = pytest {posargs} +tox_pyenv_fallback = false + +[testenv:py26] +install_command = pip install {opts} {packages} +list_dependencies_command = pip freeze diff --git a/test_git_archive_all.py b/test_git_archive_all.py index c5df30e..7c589a7 100644 --- a/test_git_archive_all.py +++ b/test_git_archive_all.py @@ -396,7 +396,6 @@ def test_cli(tmpdir, git_env, monkeypatch): assert actual == expected -@pytest.mark.skipif(sys.version_info < (2, 7), reason="No mocking on Python 2.6") @pytest.mark.parametrize('version', [ b'git version 2.21.0.0.1', b'git version 2.21.0.windows.1'