Pip: "tests.lib.create_basic_wheel_for_package"의 잠재적 버그

에 λ§Œλ“  2020λ…„ 04μ›” 16일  Β·  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,
)

휠 νŒŒμΌμ„ λ§Œλ“€κΈ° 전에 이름을 μ •κ·œν™”ν•˜κ³  - λ₯Ό _ λ°”κΎΈλŠ” 것이 μ˜¬λ°”λ₯Έ μ ‘κ·Ό 방식이라고 μƒκ°ν•©λ‹ˆλ‹€. μ¦‰μ‹œ μˆ˜μ •μ„ λ§Œλ“€κ³  티켓에 μž‘μ„±ν•œ 것과 λ™μΌν•œ ν…ŒμŠ€νŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ μˆ˜μ •λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜κ² μŠ΅λ‹ˆλ‹€. :)

PEP 491μ—λŠ” μ‹€μ œλ‘œ 휠의 파일 이름에 λŒ€ν•œ νŒ¨ν‚€μ§€ 이름을 μ •μ‹μœΌλ‘œ λ³€ν™˜ν•˜λŠ” μ •κ·œμ‹μ΄ ν¬ν•¨λ˜μ–΄ μžˆμŒμ„ κΉ¨λ‹¬μ•˜μŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ μš°λ¦¬λŠ” 그것을 λŒ€μ‹  μ‚¬μš©ν•΄μ•Ό ν•  κ²ƒμž…λ‹ˆλ‹€ (PEP에 λŒ€ν•œ 링크와 ν•¨κ»˜); 미래의 λ…μžκ°€ μ΄ν•΄ν•˜κΈ° 훨씬 μ‰¬μšΈ κ²ƒμž…λ‹ˆλ‹€.

PEP-491 Escaping and Unicode에 re.sub("[^\w\d.]+", "_", distribution, re.UNICODE) μ‘΄μž¬ν•œλ‹€κ³  μƒκ°ν•˜μ‹­λ‹ˆκΉŒ?

κ·Έλž˜μ„œ μš°λ¦¬λŠ” κ·Έ μ •κ·œμ‹μ„ μ‚¬μš©ν•˜μ—¬ μ˜¬λ°”λ₯Έ 휠 파일 이름을 λ§Œλ“€ κ²ƒμž…λ‹ˆκΉŒ? λ˜ν•œμ΄ 변경을 μœ„ν•΄ νŒ¨ν‚€μ§€μ˜ 폴더 μ΄λ¦„μœΌλ‘œ 무엇을 ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

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

λ˜ν•œ 이에 λŒ€ν•œ λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” https://github.com/pypa/pip/pull/8054 μ—μ„œ λ…Όμ˜ν•œ 것과 μœ μ‚¬ν•©λ‹ˆκΉŒ? ( canonicalize_name λ₯Ό https://github.com/pypa/pip/pull/8054#discussion_r409654545둜 μ‚¬μš©ν•˜κΈ° μ‹œμž‘ν•  λ•ŒκΉŒμ§€ pkg_resources.safe_name μ—μ„œ 발견 ν•œ νŠΉμ„± λ•Œλ¬Έμ— μ•„λž˜ λ‚΄μš©μ΄ μž‘λ™ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.)

@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에 ν…ŒμŠ€νŠΈλ₯Ό μΆ”κ°€ν•˜λŠ” 것이 쒋은 생각이라고 μƒκ°ν•©λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ κ·Έ ν…ŒμŠ€νŠΈλŠ” λ¬΄μ—‡μ„ν• κΉŒμš”? 점, λŒ€μ‹œ 및 λ°‘μ€„μ΄μžˆλŠ” νŒ¨ν‚€μ§€ μ΄λ¦„μ˜ λ³€ν˜•μ„ μ‹œν—˜ν•΄λ³΄κ³  휠 파일 이름이 μ„Έ 가지 경우 λͺ¨λ‘μ˜ 사양에 따라 μ˜¬λ°”λ₯Έμ§€ ν™•μΈν•˜λŠ” κ²ƒμœΌλ‘œ μΆ©λΆ„ν•©λ‹ˆκΉŒ?

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰