Saat ini, jinja2 mengharapkan _path didefinisikan atau get_filenames: https://github.com/pallets/jinja/blob/master/src/jinja2/loaders.py#L262 -L281
Penulis ulang pernyataan pytest tidak mendefinisikan keduanya (lihat https://github.com/pytest-dev/pytest/blob/master/src/_pytest/assertion/rewrite.py#L48 ), dan dengan demikian menjalankan rangkaian pengujian pada kode sumber yang memiliki global berikut:
from jinja2 import PackageLoader
LOADER = PackageLoader(__name__, "templates")
akan gagal dengan:
raise ValueError(
E ValueError: The 'xxx' package was not installed in a way that PackageLoader understands.
Tidak yakin apakah di sini jinja2 perlu mendukung lebih banyak cara untuk mendapatkan root template, atau pytest loader kehilangan beberapa metode.
Ini sepertinya terkait dengan #1148. Kami menjatuhkan pkg_resources
dan sekarang menggunakan pkgutil.get_loader()
dan loader.get_filename()
. Jika pemuat Pytest menyediakan get_filename
itu akan berfungsi.
Di sinilah kami mendeteksi paket, ada juga beberapa solusi dalam kode sekitarnya untuk mendukung impor zip dan namespace: https://github.com/pallets/jinja/blob/45a76a3794a91e6d7077ced88c814a96cc87d5c2/src/jinja2/loaders.py#L262 -L267
Pemuat Pytest tidak menyediakan get_filename seperti yang saya tunjukkan di posting pertama. Apakah Anda yakin itu harus untuk loader apa pun?
jinja2 membuat asumsi tentang loader yang bukan bagian dari PEP 451 -- mungkin harus menggunakan atribut .origin
dari spesifikasi modul di dunia pep451+
Kami membutuhkan cara untuk mendapatkan jalur ke file dalam sebuah paket untuk memuatnya. Tampaknya ini adalah cara untuk melakukannya dengan API yang disediakan oleh Python, tetapi memang dokumentasi tentang cara melakukan apa pun dengan API tersebut tidak dapat ditembus oleh saya.
Jika ada yang punya saran lebih baik yang bermain lebih bagus dengan loader yang berbeda sambil tetap mendukung direktori, zip, dan ruang nama, saya akan sangat menghargai bantuannya.
cc @jaraco
Jika Anda ingin memuat beberapa sumber, bukankah Anda harus menggunakan https://docs.python.org/3/library/importlib.html#module -importlib.resources; Anda tidak perlu tahu sumber filenya, hanya apa isinya, bukan?
resources
mengharuskan semua direktori "sumber daya" untuk memiliki file __init__.py
, yang akan lebih tidak sesuai dengan cara kerja Jinja. Lihat https://gitlab.com/python-devs/importlib_resources/issues/58#note_232533726 untuk umpan balik saya tentang itu.
ini mungkin merupakan titik awal yang membantu, saya akan melihat apakah saya dapat memasukkan beberapa kode ke jinja2: https://github.com/asottile/aspy.refactor_imports/blob/519ee18ea75e0045b9b53644c627c6817b2a0748/aspy/refactor_imports/classify.py#L76 -L91
Tampaknya ini mungkin merupakan oklusi dari desain awal untuk imporltib.resources
; mengadopsinya dalam bentuknya saat ini meskipun menyebabkan regresi fitur untuk jinja2; yaitu tiba-tiba tidak lagi mendukung pytest; jadi ya mungkin kode tertaut @asottile harus ditambahkan untuk mengisi celah sementara upstream menambahkan dukungan.
Sepertinya mungkin importlib_resources
mendapat pembaruan yang memungkinkan subdirektori? https://importlib-resources.readthedocs.io/en/latest/changelog%20 (links).html#v1-1-0 Mungkin bagus untuk dilihat juga.
Tidak apa-apa, masalah ini masih berlaku.
Dikembalikan di #1182 kembali menggunakan pkg_resources untuk 2.11.2, akan menggunakan #1169 untuk 3.0.
Bisakah kita mendapatkan rilis dengan ini?
Menunggu satu PR lainnya.
Bisakah Anda menghubungkannya? 😄
Saya menduga itu #1183 mengingat tonggak sejarah
Baru saja merilis 2.11.2 yang mengembalikan perubahan. 3.0 akan memiliki perilaku baru dengan perbaikan.