Lingkungan Hidup
Deskripsi
Ketika helper tests.lib.create_basic_wheel_for_package
digunakan dalam unit test untuk membuat sebuah roda dengan nama yang berisi -
, misalnya simple-package
, dan kemudian roda dipasang, nama paket diambil sebagai simple
dan versinya diambil sebagai package
Perilaku yang diharapkan
Sepertinya menurut konvensi nama file PEP-491 , nama paket tidak boleh berisi -
, jadi nama paket tersebut tidak boleh diizinkan saat membuat roda untuk tujuan pengujian. (Pemahaman saya tentang PEP mungkin juga salah di sini)
Bagaimana cara bereproduksi
Jalankan tes unit berikut
def test_create_wheel_bug(script):
package = create_basic_wheel_for_package(script, 'simple-package', '1.0')
script.pip("install", "--no-cache-dir", "--no-index", package)
result = script.pip('list', '--format=json')
assert 'simple-package' in json.loads(result.stdout)
Keluaran
Pengujian gagal dengan kesalahan pernyataan karena keluaran dari pip list --format=json
mencantumkan nama paket sebagai simple
dan versinya sebagai package
assert 'simple-package' in [{'name': 'pip', 'version': '20.1.dev0'},
{'name': 'setuptools', 'version': '46.1.3'}, {'name': 'simple', 'version': 'package'}]
Ah, ini masuk akal. Pelakunya adalah baris ini:
archive_name = "{}-{}-py2.py3-none-any.whl".format(name, version)
yang akan memberikan simple-package-1.0-py2.py3-none-any.whl
, tetapi spesifikasi roda mengharapkan simple_package-1.0-py2.py3-none-any.whl
.
Perbaikannya juga harus langsung:
archive_name = "{}-{}-py2.py3-none-any.whl".format(
canonicalize_name(name).replace('-', '_'),
version,
)
Saya pikir itu pendekatan yang tepat, untuk mengkanonikalisasi nama dan mengganti -
dengan _
sebelum membuat file roda. Izinkan saya membuat perbaikan untuk itu segera dan menggunakan tes yang sama yang saya tulis di tiket untuk memverifikasi bahwa itu telah diperbaiki :)
Saya baru menyadari PEP 491 sebenarnya menyertakan regex untuk secara kanonik mengubah nama paket untuk nama file roda. Mungkin kita harus menggunakannya sebagai gantinya (dengan tautan ke PEP); akan lebih mudah untuk dipahami oleh pembaca yang akan datang.
Saya pikir maksud Anda re.sub("[^\w\d.]+", "_", distribution, re.UNICODE)
hadir di PEP-491 Escaping dan Unicode ?
Jadi kita akan membuat nama file roda yang benar menggunakan regex itu? Juga apakah kami ingin melakukan sesuatu dengan nama folder paket juga untuk perubahan ini?
Juga apakah unit test untuk ini akan serupa dengan yang kita diskusikan di https://github.com/pypa/pip/pull/8054 ? (Perhatikan bahwa di bawah ini mungkin tidak berfungsi karena quirk yang kami temukan dengan pkg_resources.safe_name
hingga kami mulai menggunakan canonicalize_name
sebagai https://github.com/pypa/pip/pull/8054#discussion_r409654545)
@pytest.mark.parametrize(
'package_name',
['simple-package', 'simple_package', 'simple.package'],
)
def test_create_wheel_bug(script):
package = create_basic_wheel_for_package(script, package_name, '1.0')
script.pip("install", "--no-cache-dir", "--no-index", package)
result = script.pip('list', '--format=freeze')
assert package_name in result.stdout
Ya itu dia. Nama yang sama dapat digunakan untuk paket juga (menurut saya paket tersebut sebenarnya tidak digunakan oleh banyak pengujian).
@pradyunsg Apakah ini perlu tes?
Ya, saya pikir menambahkan tes di test_lib.py adalah ide yang bagus.
Ya, saya pikir menambahkan tes di test_lib.py adalah ide yang bagus.
Jadi apa yang akan dilakukan tes itu? Apakah cukup dengan mencoba varian nama paket dengan titik, tanda hubung, dan garis bawah, dan memverifikasi bahwa nama file roda sudah benar menurut spesifikasi untuk ketiga kasus tersebut?
Komentar yang paling membantu
Ah, ini masuk akal. Pelakunya adalah baris ini:
yang akan memberikan
simple-package-1.0-py2.py3-none-any.whl
, tetapi spesifikasi roda mengharapkansimple_package-1.0-py2.py3-none-any.whl
.Perbaikannya juga harus langsung: