¿Cómo ejecutar tox -e myenv contra otros entornos?

2

¿Es posible en tox que se tox -e helloactive el entorno de saludo y se ejecute en la lista de entorno global?

La ejecución se toxejecuta correctamente contra py2 y py3.

La ejecución tox -e hellosolo se ejecuta contra py3.

[tox]
skipsdist = True
envlist = py{27,37}

[testenv]
deps =
    pytest
    !py27: mock
commands =
    {envpython} --version

; How to run this hello against the complete envlist?
[testenv:hello]
envlist = py{27,37}
commands =
    echo hello

Parece que este es el comportamiento esperado de alguna manera, pero no puedo entender cómo usar tox para resolver el problema además de hacer un montón de archivos tox: quiero tener diferentes puntos de entrada de comando para tox. Por ejemplo, simplemente ejecute las pruebas unitarias contra py27, simplemente ejecute las pruebas unitarias contra py{27,37}, simplemente ejecute las pruebas de integración contra py27-{libA,libB}, etc.

Tal vez sea solo un patrón anti que ~ puede usar tox -e de esta manera para un solo entorno, pero ¿rompe la lista de envio?

Entonces, ¿tengo que hacer otro tox.ini? Eso parece muy torpe dado lo flexible y orientado a la reutilización que es todo lo demás sobre toxinas. Siento que me estoy perdiendo algo.

2

Hay dos cosas principales para entender aquí:

  1. envlistes un escenario global en la [tox]sección. Definirlo en [testenv:hello]no tiene ningún efecto
  2. envlistdefine o genera una lista de envnombres. Esto se puede hacer de forma estática proporcionando una lista simple separada por comas o, como lo hizo, generando la lista de forma combinatoria a partir de factores proporcionados mediante una sintaxis especial {...}. El resultado en ambos casos es una lista de nombres de entorno que luego se ejecutarán separados por virtualenvs/ venvs.

Entonces, para dejarlo perfectamente claro: al final, an envlistes una simple lista de envnombres, nada más. Lo que se está haciendo con esos nombres (o sus partes (también conocidos como factores )) está sucediendo durante la ejecución en envs.

Todos estos estos entornos se ejecutan si llama a tox sin -e . En su ejemplo, está generando un envlist con la {<factorX>,<factorY>}sintaxis que se basa en el mismo principio que proporcionan los shells de línea de comandos. Si solicita los entornos generados en su configuración de toxinas, el resultado será:

$ tox -a

py27-hello
py37-hello
hello

Esto podría mostrar ya que las cosas están un poco fuera de lugar en tu configuración, porque no creo que quieras un helloenv no calificado .

Entonces, lo que está haciendo al crear generativamente el envlist y proporcionar estáticamente el hellotestenv usando la [testenv:hello]sintaxis es mezclarlos de una manera que luego no produzca el resultado que le gustaría tener.

Así que adaptemos el suyo tox.inipara deshacernos de eso innecesario definido estáticamente testenv:hello. También nos deshacemos de la envlistclave local, ya que de todos modos no tuvo ningún efecto. No arrojó un error porque las claves con nombres arbitrarios envsestán explícitamente permitidas y, a veces, son útiles.

[tox]
skipsdist = True
envlist = py{27,37}-hello

[testenv]
deps =
    pytest
    !py27: mock
# do not warn that echo is a command not in the venv
whitelist_externals = echo
commands =
    {envpython} --version
    hello: echo hello

Para asegurarse de que el comando hello solo se ejecute, cuando el env tiene un hellofactor que puede usar <factor>[,<factor>]: <some command>para especificar qué se debe ejecutar si el nombre del env contiene un factor determinado (que son partes de nombre separadas por -), se genera una lista de nombres de entorno que luego sirven como información para los entornos concretos que se están ejecutando.

Si vuelvo a llamar tox -aal ini cambiado, obtengo:

py27-hello
py37-hello

Ahora puedo pedir envs completos o solo factores llamando a eg tox -e py27-helloo incluso tox -e helloque luego usará basepython y hará todo lo que se ajuste al factor.

Para obtener más información sobre lo que está sucediendo, puede mostrar la configuración completamente resuelta para todos los entornos, que se parece a esto:

$ tox --showconfig

[testenv:py27-hello]
  envdir          = /home/ob/do/play/.tox/py27-hello
  setenv          = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'py27-hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py27-hello'}
  basepython      = python2.7
  description     = 
  envtmpdir       = /home/ob/do/play/.tox/py27-hello/tmp
  envlogdir       = /home/ob/do/play/.tox/py27-hello/log
  downloadcache   = None
  changedir       = /home/ob/do/play
  args_are_paths  = True
  skip_install    = False
  ignore_errors   = False
  recreate        = False
  passenv         = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
  whitelist_externals = []
  platform        = .*
  sitepackages    = False
  alwayscopy      = False
  pip_pre         = False
  usedevelop      = False
  install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
  list_dependencies_command = ['python', '-m', 'pip', 'freeze']
  deps            = [pytest]
  commands        = [['/home/ob/do/play/.tox/py27-hello/bin/python', '--version'], ['echo', 'hello']]
  commands_pre    = []
  commands_post   = []
  ignore_outcome  = False
  extras          = []
  depends         = ()
  parallel_show_output = False
[testenv:py37-hello]
  envdir          = /home/ob/do/play/.tox/py37-hello
  setenv          = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'py37-hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/py37-hello'}
  basepython      = python3.7
  description     = 
  envtmpdir       = /home/ob/do/play/.tox/py37-hello/tmp
  envlogdir       = /home/ob/do/play/.tox/py37-hello/log
  downloadcache   = None
  changedir       = /home/ob/do/play
  args_are_paths  = True
  skip_install    = False
  ignore_errors   = False
  recreate        = False
  passenv         = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
  whitelist_externals = []
  platform        = .*
  sitepackages    = False
  alwayscopy      = False
  pip_pre         = False
  usedevelop      = False
  install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
  list_dependencies_command = ['python', '-m', 'pip', 'freeze']
  deps            = [pytest, mock]
  commands        = [['/home/ob/do/play/.tox/py37-hello/bin/python', '--version'], ['echo', 'hello']]
  commands_pre    = []
  commands_post   = []
  ignore_outcome  = False
  extras          = []
  depends         = ()
  parallel_show_output = False
[testenv:hello]
  envdir          = /home/ob/do/play/.tox/hello
  setenv          = SetenvDict: {'PYTHONHASHSEED': '1602746531', 'TOX_ENV_NAME': 'hello', 'TOX_ENV_DIR': '/home/ob/do/play/.tox/hello'}
  basepython      = /usr/bin/python
  description     = 
  envtmpdir       = /home/ob/do/play/.tox/hello/tmp
  envlogdir       = /home/ob/do/play/.tox/hello/log
  downloadcache   = None
  changedir       = /home/ob/do/play
  args_are_paths  = True
  skip_install    = False
  ignore_errors   = False
  recreate        = False
  passenv         = {'TOX_REPORTER_TIMESTAMP', 'TOX_WORK_DIR', 'TMPDIR', 'TOX_PARALLEL_ENV', 'LANGUAGE', 'LANG', 'PATH', 'LD_LIBRARY_PATH', 'PIP_INDEX_URL'}
  whitelist_externals = []
  platform        = .*
  sitepackages    = False
  alwayscopy      = False
  pip_pre         = False
  usedevelop      = False
  install_command = ['python', '-m', 'pip', 'install', '{opts}', '{packages}']
  list_dependencies_command = ['python', '-m', 'pip', 'freeze']
  deps            = [pytest, mock]
  commands        = [['/home/ob/do/play/.tox/hello/bin/python', '--version'], ['echo', 'hello']]
  commands_pre    = []
  commands_post   = []
  ignore_outcome  = False
  extras          = []
  depends         = ()
  parallel_show_output = False
1
  • 2
    ¡Esto es perfecto y lo que necesitaba! La hello: echo hellopieza es la pieza crítica que buscaba a tientas y la forma correcta de hacerlo. ¡Y gracias por el showconfig, eso es muy útil! 18 de mayo de 2019 y 19:57