Pip: Potensi bug di "tests.lib.create_basic_wheel_for_package"

Dibuat pada 16 Apr 2020  ·  7Komentar  ·  Sumber: pypa/pip

Lingkungan Hidup

  • versi pip: 20.1.dev0
  • Versi Python: 3.8.2
  • OS: OSX 10.15.4

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'}]
tests auto-locked bug

Komentar yang paling membantu

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,
)

Semua 7 komentar

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?

https://github.com/pypa/pip/blob/2f3a1be1185e3434c0c8d9cc58d4271beff1d122/tests/lib/__init__.py#L1000

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?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat