我如何才能使诗歌和诗歌协同工作以支持测试Python依赖项的多个版本?

时间:2019-12-17 15:10:11

标签: django tox python-poetry

我正在将当前使用pipenv的项目切换为poetry作为测试,以查看有什么区别。该项目是一个简单的可重新分发的Django应用。它支持Python 3.6-8,Django 2.2和3.0。我有一个tox.ini文件,该文件涵盖了Python和Django的所有组合:

[tox]
envlist = py{36,37,38}-django{22,30}

[testenv]
whitelist_externals = poetry
skip_install = true

deps =
    django22: Django==2.2
    django30: Django==3.0

commands =
    poetry install -vvv
    poetry run pytest --cov=my_app tests/
    poetry run coverage report -m

我遇到的问题(pipenv世界中不存在)是poetry install语句将始终用deps部分中的内容覆盖poetry.lock部分中的内容。 poetry文件(如果不存在,将自动生成)。这意味着测试矩阵永远不会针对Django 2.2进行测试-默认情况下,每个tox virtualenv都会安装Django 3.0。

我不知道这应该如何工作-使用pyproject.toml安装依赖项是否应该尊重要安装依赖项的现有环境?

所以-我的问题是-如何建立以诗歌为依存关系管理器的多版本tox(或travis)测试矩阵?

我的[tool.poetry.dependencies] python = "^3.6" django = "^2.2 || ^3.0" 将Python / Django版本定义为:

poetry.lock

生成的[[package]] category = "main" description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." name = "django" optional = false python-versions = ">=3.6" version = "3.0" 文件(未提交)具有以下Django版本信息:

Django==2.2

更新:包括干净的毒物输出

这是删除锁文件并重新创建tox环境时的结果。如您所见,tox将poetry作为依赖项安装在virtualenv中,但是3.0然后在安装时将其更新为pyproject.toml

我需要一个运行诗歌安装的解决方案,同时尊重现有的软件包安装。也就是说,如果Django = "^2.2 || ^3.0"声明my-app$ tox -r -e py36-django22 py36-django22 recreate: .tox/py36-django22 py36-django22 installdeps: Django==2.2 py36-django22 installed: Django==2.2,my-app==0.1.0,pytz==2019.3,sqlparse==0.3.0 py36-django22 run-test: commands[0] | poetry install -vvv Using virtualenv: .tox/py36-django22 Updating dependencies Resolving dependencies... 1: derived: django (^2.2 || ^3.0) ... PyPI: 10 packages found for django >=2.2,<4.0 ... 1: Version solving took 3.330 seconds. 1: Tried 1 solutions. Writing lock file Package operations: 52 installs, 1 update, 0 removals, 3 skipped - ... - Updating django (2.2 -> 3.0) - ... ,并且已经安装了2.2,则请固定到该版本-不要尝试升级。

import re

diff_list = diff.split("\n")      
regx = re.compile("(<.*predicted_serotype.*\/>)\s.*predicted_serotype.*")
matches = regx.findall(diff)

for match in matches:
    print(match)

1 个答案:

答案 0 :(得分:0)

还没有对它进行彻底的测试,但是我相信这样应该可以:

[tox]
envlist = py{36,37,38}-django{22,30}
isolated_build = True

[testenv]
deps =
    django22: Django==2.2
    django30: Django==3.0

commands =
    pytest --cov=my_app tests/
    coverage report -m