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.
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.
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.