Установка консольных скриптов (например, flake8) в среду как часть test_requires - PullRequest
0 голосов
/ 11 сентября 2018

Я хочу разделить зависимости пакета Python на setup_requires и tests_require, чтобы обеспечить чистое разделение зависимостей.

Для запуска тестовой команды требуется, чтобы в среду было установлено несколько консольных сценариев (flake8, mypy, nosetests). Они перечислены как зависимости в test_requires.

Когда я запускаю python setup.py test, требования в tests_require загружаются как яйца, но консольные сценарии, которые обычно устанавливаются в вашей виртуальной среде, недоступны.

Таким образом, команды тестирования не выполняются, так как flake8 и т. Д. Недоступны.

Есть ли способ обойти это?

Это очень похоже на Указание, куда устанавливать зависимости 'tests_require' пакета distre / setuptools , но не идентично; поскольку мне не особо важно, где установлены пакеты, доступны только те консольные сценарии, которые предоставляются этими пакетами.

Единственный найденный мной обходной путь - это расширение setup_requires содержимым tests_require, но это противоречит цели отделения требований только для тестирования от требований для установки пакета.

Пример setup.py, который может воспроизвести это:

import subprocess
import sys

from setuptools import setup
from setuptools.command.test import test as TestCommand

install_requires = ["flask", "gunicorn"]
tests_require = ["flake8", "mypy", "nose"]

# Uncommenting this fixes the problem, but is not optimal
# install_requires += tests_require


class FooTests(TestCommand):
    description = "run linters, and tests"

    def run_tests(self):
        self._run(["flake8", "tests", "my_package"])
        self._run(["mypy", "--ignore-missing-imports", "my_package"])
        self._run(["nosetests", "-vv"])

    def _run(self, command):
        subprocess.check_call(command)


setup(
    name="my_package",
    version="1.0",
    description="Example package",
    packages=["my_package"],
    install_requires=install_requires,
    tests_require=tests_require,
    cmdclass={"test": FooTests},
)
...