<p>jinja2 ya no es compatible con el cargador de pytest</p>

Creado en 10 mar. 2020  ·  18Comentarios  ·  Fuente: pallets/jinja

Actualmente, jinja2 espera definir _path o get_filenames: https://github.com/pallets/jinja/blob/master/src/jinja2/loaders.py#L262 -L281

El reescritor de aserciones de pytest no define ninguno (consulte https://github.com/pytest-dev/pytest/blob/master/src/_pytest/assertion/rewrite.py#L48) y, como tal, ejecuta un conjunto de pruebas en un código fuente que tiene el siguiente global:

from jinja2 import PackageLoader
LOADER = PackageLoader(__name__, "templates")

fallará con:

    raise ValueError(
E   ValueError: The 'xxx' package was not installed in a way that PackageLoader understands.

No estoy seguro si aquí jinja2 necesita admitir más formas de obtener la raíz de la plantilla, o si faltan algunos métodos en el cargador de Pytest.

Todos 18 comentarios

Esto parece estar relacionado con el # 1148. Eliminamos pkg_resources y ahora estamos usando pkgutil.get_loader() y loader.get_filename() . Si el cargador de Pytest proporciona get_filename , debería funcionar.

Aquí es donde detectamos el paquete, también hay algunas soluciones en el código circundante para admitir importaciones de espacios de nombres y zip: https://github.com/pallets/jinja/blob/45a76a3794a91e6d7077ced88c814a96cc87d5c2/src/jinja2/loaders.py#L262 -L267

El cargador de Pytest no proporciona get_filename como señalé en la primera publicación. ¿Está seguro de que debe serlo para cualquier cargador?

jinja2 está haciendo suposiciones sobre los cargadores que no son parte de PEP 451 ; probablemente debería usar el atributo .origin de la especificación del módulo en pep451 + worlds

Necesitamos una forma de obtener la ruta a los archivos dentro de un paquete para poder cargarlos. Esta parecía ser la forma de hacerlo con las API proporcionadas por Python, pero es cierto que la documentación sobre cómo hacer algo con esas API era bastante impenetrable para mí.

Si alguien tiene una sugerencia mejor que funciona mejor con diferentes cargadores y al mismo tiempo admite directorios, cremalleras y espacios de nombres, agradecería la ayuda.

cc @jaraco

Si desea cargar algún recurso, ¿no debería usar https://docs.python.org/3/library/importlib.html#module -importlib.resources? no es necesario que conozca el origen del archivo, solo lo que contiene, ¿no?

resources requiere que todos los directorios de "recursos" tengan archivos __init__.py , lo que sería aún más incompatible con el funcionamiento de Jinja. Consulte https://gitlab.com/python-devs/importlib_resources/issues/58#note_232533726 para conocer mis comentarios al respecto.

este podría ser un punto de partida útil, veré si puedo introducir un poco de código en jinja2: https://github.com/asottile/aspy.refactor_imports/blob/519ee18ea75e0045b9b53644c627c6817b2a0748/aspy/refactor_imports/classify.py#L76 -L91

Parece que esto podría ser una oclusión del diseño inicial para imporltib.resources ; adoptarlo en su forma actual provoca la regresión de características para jinja2; es decir, que de repente ya no es compatible con pytest; así que sí, probablemente el código vinculado @asottile debería agregarse para llenar el vacío, mientras que el upstream agrega soporte.

¿Parece que tal vez importlib_resources tiene una actualización que permite subdirectorios? https://importlib-resources.readthedocs.io/en/latest/changelog%20 (enlaces) .html # v1-1-0 También podría ser bueno echarle un vistazo.

1169 es un intento de solución, probablemente todavía necesite el registro de cambios, etc. pero probablemente puedas probarlo y ver si soluciona tu problema @gaborbernat

No importa, el problema sigue siendo válido.

Revertido en # 1182 para usar pkg_resources para 2.11.2, usará # 1169 para 3.0.

¿Podemos tener un comunicado con esto, por favor?

Esperando a otro PR.

¿Puedes vincularlo? 😄

Sospecho que es el # 1183 dado el hito.

Recién lanzado 2.11.2 que revierte el cambio. 3.0 tendrá el nuevo comportamiento con la corrección.

¿Fue útil esta página
0 / 5 - 0 calificaciones