рд╡рд╛рддрд╛рд╡рд░рдг
рд╡рд┐рд╡рд░рдг
рдЬрдм рд╣реЗрд▓реНрдкрд░ 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'}]
рдЖрд╣, рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЕрдкрд░рд╛рдзреА рдпрд╣ рдкрдВрдХреНрддрд┐ рд╣реИ:
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/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 рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╡реНрд╣реАрд▓ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рд╕рд╣реА рд╣реИ?
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЖрд╣, рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЕрдкрд░рд╛рдзреА рдпрд╣ рдкрдВрдХреНрддрд┐ рд╣реИ:
рдЬреЛ
simple-package-1.0-py2.py3-none-any.whl
, рд▓реЗрдХрд┐рди рдкрд╣рд┐рдпрд╛ рдпреБрдХреНрддрд┐simple_package-1.0-py2.py3-none-any.whl
рдЙрдореНрдореАрдж рдХрд░рддреА рд╣реИредрдлрд┐рдХреНрд╕ рд╕реАрдзрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: