Pip: "рдЯреЗрд╕реНрдЯ.рд▓рд┐рдм.рдХреНрд░рд┐рдПрдЯ_рдмрд╛рд╕рд┐рдХ_рд╡реНрд╣реАрд▓_рдлреЙрд░рдкреИрдХ" рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдмрдЧ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 16 рдЕрдкреНрд░реИрд▓ 2020  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pypa/pip

рд╡рд╛рддрд╛рд╡рд░рдг

  • рдкрд╛рдЗрдк рд╕рдВрд╕реНрдХрд░рдг: 20.1.dev0
  • рдкрд╛рдпрдерди рд╕рдВрд╕реНрдХрд░рдг: 3.8.2
  • OS: OSX 10.15.4

рд╡рд┐рд╡рд░рдг

рдЬрдм рд╣реЗрд▓реНрдкрд░ tests.lib.create_basic_wheel_for_package рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ - , рдЬреИрд╕реЗ simple-package рд╡рд╛рд▓реЗ рдирд╛рдо рдХрд╛ рдПрдХ рдкрд╣рд┐рдпрд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкрд╣рд┐рдпрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреИрдХреЗрдЬ рдХрд╛ рдирд╛рдо рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ simple рдФрд░ рд╕рдВрд╕реНрдХрд░рдг package рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░

PEP-491 рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рд╕рдореНрдореЗрд▓рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓рдЧрддрд╛ рд╣реИ, рдкреИрдХреЗрдЬ рдирд╛рдо рдореЗрдВ - рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рддреЗ рд╕рдордп рдРрд╕реЗ рдкреИрдХреЗрдЬ рдирд╛рдореЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред (рдкреАрдИрдкреА рдХреА рдореЗрд░реА рд╕рдордЭ рдпрд╣рд╛рдВ рднреА рдЧрд▓рдд рд╣реЛ рд╕рдХрддреА рд╣реИ)

рдХреИрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░реЗрдВ

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рдирд╛рдо canonicalize рдФрд░ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП - рдХреЗ рд╕рд╛рде _ рдкрд╣рд┐рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗред рдореБрдЭреЗ рддреБрд░рдВрдд рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рд┐рдХреНрд╕ рдмрдирд╛рдирд╛ рд╣реИ рдФрд░ рдЙрд╕реА рдЯреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдЯрд┐рдХрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ рдХрд┐ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рддрдп рд╣реЛ рдЧрдпрд╛ рд╣реИ :)

рдореБрдЭреЗ рдмрд╕ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдкреАрдИрдкреА 491 рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╣рд┐рдпрд╛ рдХреЗ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рдирд╛рдо рдХреЛ рдХреИрдиреЛрдирд┐рдХ рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реЗрдЧреЗрдХреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп (рдкреАрдИрдкреА рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ; рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк PEP-491 рдПрд╕реНрдХреЗрдкрд┐рдВрдЧ рдФрд░ рдпреВрдирд┐рдХреЛрдб рдореЗрдВ re.sub("[^\w\d.]+", "_", distribution, re.UNICODE) рдореМрдЬреВрдж рд╣реИрдВ?

рддреЛ рд╣рдо рдЙрд╕ regex рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд╣реА рд╡реНрд╣реАрд▓ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдмрдирд╛рдПрдВрдЧреЗ? рдХреНрдпрд╛ рд╣рдо рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рдХреЗ рдлрд╝реЛрд▓реНрдбрд░ рдирд╛рдо рдХреЗ рд╕рд╛рде рднреА рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

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#discussuss_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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

yizhang-zen picture yizhang-zen  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

cjolowicz picture cjolowicz  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wrouesnel picture wrouesnel  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kkom picture kkom  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dstufft picture dstufft  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ