ΠΠΊΡΡΠΆΠ°ΡΡΠ°Ρ ΠΎΠ±ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
ΠΠΎΠ³Π΄Π° ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊ 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'}]
ΠΡ , Π² ΡΡΠΎΠΌ Π΅ΡΡΡ ΡΠΌΡΡΠ». ΠΠΈΠ½ΠΎΠΉ Π²ΡΠ΅ΠΌΡ ΡΠ°ΠΊΠ°Ρ ΡΡΡΠΎΡΠΊΠ°:
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/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 ΡΠ»ΡΡΠ°Π΅Π²?
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
ΠΡ , Π² ΡΡΠΎΠΌ Π΅ΡΡΡ ΡΠΌΡΡΠ». ΠΠΈΠ½ΠΎΠΉ Π²ΡΠ΅ΠΌΡ ΡΠ°ΠΊΠ°Ρ ΡΡΡΠΎΡΠΊΠ°:
ΡΡΠΎ Π΄Π°ΡΡ
simple-package-1.0-py2.py3-none-any.whl
, Π½ΠΎ Π² ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΊΠΎΠ»Π΅ΡΠ° ΠΎΠΆΠΈΠ΄Π°Π΅ΡΡΡsimple_package-1.0-py2.py3-none-any.whl
.ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΏΡΠΎΡΡΡΠΌ: