Pip: ВозмоТная ошибка Π² "tests.lib.create_basic_wheel_for_package"

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 16 Π°ΠΏΡ€. 2020  Β·  7ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: pypa/pip

ΠžΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π°Ρ обстановка

  • вСрсия pip: 20.1.dev0
  • ВСрсия Python: 3.8.2
  • ОБ: OSX 10.15.4

ОписаниС

Когда ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ tests.lib.create_basic_wheel_for_package ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠΌ тСстС для создания колСса с ΠΈΠΌΠ΅Π½Π΅ΠΌ, содСрТащим - , Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, simple-package , Π° Π·Π°Ρ‚Π΅ΠΌ колСсо установлСно, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ имя ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΊΠ°ΠΊ simple ΠΈ вСрсия принимаСтся ΠΊΠ°ΠΊ package

ОТидаСмоС повСдСниС

ΠŸΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π² соотвСтствии с соглашСниСм ΠΎΠ± ΠΈΠΌΠ΅Π½Π°Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² PEP-491 имя ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ - , поэтому Ρ‚Π°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ создании колСс для Ρ†Π΅Π»Π΅ΠΉ тСстирования. (МоС ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ PEP Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ)

Как Ρ€Π°Π·ΠΌΠ½ΠΎΠΆΠ°Ρ‚ΡŒΡΡ

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΉ тСст

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)

Π’Ρ‹Π²ΠΎΠ΄

ВСст Π½Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ с ошибкой утвСрТдСния, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… pip list --format=json имя ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΡƒΠΊΠ°Π·Π°Π½ΠΎ ΠΊΠ°ΠΊ simple Π° вСрсия - ΠΊΠ°ΠΊ 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

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Ах, Π² этом Π΅ΡΡ‚ΡŒ смысл. Π’ΠΈΠ½ΠΎΠΉ всСму такая строчка:

archive_name = "{}-{}-py2.py3-none-any.whl".format(name, version)

Ρ‡Ρ‚ΠΎ даст simple-package-1.0-py2.py3-none-any.whl , Π½ΠΎ Π² спСцификации колСса оТидаСтся simple_package-1.0-py2.py3-none-any.whl .

Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ простым:

archive_name = "{}-{}-py2.py3-none-any.whl".format(
    canonicalize_name(name).replace('-', '_'),
    version,
)

ВсС 7 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Ах, Π² этом Π΅ΡΡ‚ΡŒ смысл. Π’ΠΈΠ½ΠΎΠΉ всСму такая строчка:

archive_name = "{}-{}-py2.py3-none-any.whl".format(name, version)

Ρ‡Ρ‚ΠΎ даст simple-package-1.0-py2.py3-none-any.whl , Π½ΠΎ Π² спСцификации колСса оТидаСтся simple_package-1.0-py2.py3-none-any.whl .

Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ простым:

archive_name = "{}-{}-py2.py3-none-any.whl".format(
    canonicalize_name(name).replace('-', '_'),
    version,
)

Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ - ΠΊΠ°Π½ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ имя ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ - Π½Π° _ ΠΏΠ΅Ρ€Π΅Π΄ созданиСм Ρ„Π°ΠΉΠ»Π° wheel. ΠŸΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ ΠΌΠ½Π΅ сразу ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ тСст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я написал Π² заявкС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ исправлСн :)

Π― Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ понял, Ρ‡Ρ‚ΠΎ PEP 491 Π½Π° самом Π΄Π΅Π»Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для каноничСского прСобразования ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π² имя Ρ„Π°ΠΉΠ»Π° колСса. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°ΠΌ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это вмСсто этого (со ссылкой Π½Π° PEP); это Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅Π³Ρ‡Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌΡƒ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŽ.

Π― Π΄ΡƒΠΌΠ°ΡŽ, Π²Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ re.sub("[^\w\d.]+", "_", distribution, re.UNICODE) ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² PEP-491 Escaping ΠΈ Unicode ?

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π° колСса, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ это рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅? Π’Π°ΠΊΠΆΠ΅ Ρ…ΠΎΡ‚ΠΈΠΌ Π»ΠΈ ΠΌΡ‹ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ°ΠΏΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° для этого измСнСния?

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

Π’Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΉ тСст для этого Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ обсуТдали Π² https://github.com/pypa/pip/pull/8054 ? (ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π½ΠΈΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈΠ·-Π·Π° ΠΏΡ€ΠΈΡ‡ΡƒΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ с pkg_resources.safe_name ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π½Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ canonicalize_name ΠΊΠ°ΠΊ 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

Π”Π° это ΠΎΠ½ΠΎ. Π­Ρ‚ΠΎ ΠΆΠ΅ имя ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ для ΠΏΠ°ΠΊΠ΅Ρ‚Π° (я Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… тСстах).

@pradyunsg НуТСн Π»ΠΈ тСст?

Π”Π°, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ тСста Π² test_lib.py - Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ идСя.

Π”Π°, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ тСста Π² test_lib.py - Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ идСя.

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ этот тСст? Достаточно Π»ΠΈ просто ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ ΠΈΠΌΠ΅Π½ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² с Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, Ρ‚ΠΈΡ€Π΅ ΠΈ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ имя Ρ„Π°ΠΉΠ»Π° колСса ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Π² соотвСтствии со спСцификациСй для всСх 3 случаСв?

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ