νκ²½
κΈ°μ
ν¬νΌ κ²½μ° 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,
)
ν νμΌμ λ§λ€κΈ° μ μ μ΄λ¦μ μ κ·ννκ³ -
λ₯Ό _
λ°κΎΈλ κ²μ΄ μ¬λ°λ₯Έ μ κ·Ό λ°©μμ΄λΌκ³ μκ°ν©λλ€. μ¦μ μμ μ λ§λ€κ³ ν°μΌμ μμ±ν κ²κ³Ό λμΌν ν
μ€νΈλ₯Ό μ¬μ©νμ¬ μμ λμλμ§ νμΈνκ² μ΅λλ€. :)
PEP 491μλ μ€μ λ‘ ν μ νμΌ μ΄λ¦μ λν ν¨ν€μ§ μ΄λ¦μ μ μμΌλ‘ λ³ννλ μ κ·μμ΄ ν¬ν¨λμ΄ μμμ κΉ¨λ¬μμ΅λλ€. μλ§λ μ°λ¦¬λ κ·Έκ²μ λμ μ¬μ©ν΄μΌ ν κ²μ λλ€ (PEPμ λν λ§ν¬μ ν¨κ»); λ―Έλμ λ μκ° μ΄ν΄νκΈ° ν¨μ¬ μ¬μΈ κ²μ λλ€.
PEP-491 Escaping and Unicodeμ re.sub("[^\w\d.]+", "_", distribution, re.UNICODE)
μ‘΄μ¬νλ€κ³ μκ°νμλκΉ?
κ·Έλμ μ°λ¦¬λ κ·Έ μ κ·μμ μ¬μ©νμ¬ μ¬λ°λ₯Έ ν νμΌ μ΄λ¦μ λ§λ€ κ²μ λκΉ? λνμ΄ λ³κ²½μ μν΄ ν¨ν€μ§μ ν΄λ μ΄λ¦μΌλ‘ 무μμ νμκ² μ΅λκΉ?
λν μ΄μ λν λ¨μ ν
μ€νΈλ 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μ ν μ€νΈλ₯Ό μΆκ°νλ κ²μ΄ μ’μ μκ°μ΄λΌκ³ μκ°ν©λλ€.
κ·Έλ λ€λ©΄ κ·Έ ν μ€νΈλ 무μμν κΉμ? μ , λμ λ° λ°μ€μ΄μλ ν¨ν€μ§ μ΄λ¦μ λ³νμ μνν΄λ³΄κ³ ν νμΌ μ΄λ¦μ΄ μΈ κ°μ§ κ²½μ° λͺ¨λμ μ¬μμ λ°λΌ μ¬λ°λ₯Έμ§ νμΈνλ κ²μΌλ‘ μΆ©λΆν©λκΉ?
κ°μ₯ μ μ©ν λκΈ
μ, λ§μ΄ λλ€μ. λ²μΈμ λ€μ μ€μ λλ€.
simple-package-1.0-py2.py3-none-any.whl
λ₯Ό μ 곡νμ§λ§ ν μ¬μμsimple_package-1.0-py2.py3-none-any.whl
μμν©λλ€.μμ λ κ°λ¨ν΄μΌν©λλ€.