Pip: Potencial bug em "tests.lib.create_basic_wheel_for_package"

Criado em 16 abr. 2020  ·  7Comentários  ·  Fonte: pypa/pip

Meio Ambiente

  • versão pip: 20.1.dev0
  • Versão Python: 3.8.2
  • OS: OSX 10.15.4

Descrição

Quando o auxiliar tests.lib.create_basic_wheel_for_package é utilizado em um teste de unidade para criar uma roda com o nome contendo - , por exemplo, simple-package , e então a roda é instalada, o nome do pacote é usado como simple e a versão é considerada como package

Comportamento esperado

Parece que, de acordo com a convenção de nome de arquivo PEP-491 , o nome do pacote não pode conter - , portanto, esses nomes de pacote não devem ser permitidos durante a criação de rodas para fins de teste. (Meu entendimento do PEP também pode estar errado aqui)

Como reproduzir

Execute o seguinte teste de unidade

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)

Resultado

O teste falha com um erro de asserção porque a saída de pip list --format=json lista o nome do pacote como simple e a versão como 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

Comentários muito úteis

Ah, isso faz sentido. O culpado é esta linha:

archive_name = "{}-{}-py2.py3-none-any.whl".format(name, version)

o que resultaria em simple-package-1.0-py2.py3-none-any.whl , mas a especificação da roda espera simple_package-1.0-py2.py3-none-any.whl .

A correção também deve ser simples:

archive_name = "{}-{}-py2.py3-none-any.whl".format(
    canonicalize_name(name).replace('-', '_'),
    version,
)

Todos 7 comentários

Ah, isso faz sentido. O culpado é esta linha:

archive_name = "{}-{}-py2.py3-none-any.whl".format(name, version)

o que resultaria em simple-package-1.0-py2.py3-none-any.whl , mas a especificação da roda espera simple_package-1.0-py2.py3-none-any.whl .

A correção também deve ser simples:

archive_name = "{}-{}-py2.py3-none-any.whl".format(
    canonicalize_name(name).replace('-', '_'),
    version,
)

Eu acho que essa é a abordagem certa, canonizar o nome e substituir - por _ antes de fazer o arquivo wheel. Deixe-me criar uma correção para ele imediatamente e usar o mesmo teste que escrevi no tíquete para verificar se foi corrigido :)

Acabei de perceber que o PEP 491 inclui uma regex para transformar canonicamente um nome de pacote em um nome de arquivo de roda. Talvez devêssemos usar isso (com um link para o PEP); seria muito mais fácil de entender para um futuro leitor.

Acho que você quer dizer re.sub("[^\w\d.]+", "_", distribution, re.UNICODE) presente no PEP-491 Escaping e Unicode ?

Então, criaríamos um nome de arquivo de roda correto usando esse regex? Também queremos fazer algo com o nome da pasta do pacote para essa mudança?

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

Além disso, o teste de unidade para isso será semelhante ao que discutimos em https://github.com/pypa/pip/pull/8054 ? (Observe que o seguinte pode não funcionar devido à peculiaridade que encontramos com pkg_resources.safe_name até começarmos a usar canonicalize_name como 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

Sim é isso. O mesmo nome também pode ser usado para o pacote (eu não acho que o pacote seja realmente usado por muitos testes de qualquer maneira).

@pradyunsg Isso precisa de um teste?

Sim, acho que adicionar um teste em test_lib.py é uma boa ideia.

Sim, acho que adicionar um teste em test_lib.py é uma boa ideia.

Então, o que esse teste fará? É suficiente apenas experimentar variantes de nomes de pacotes com ponto, traço e sublinhado e verificar se o nome do arquivo wheel está correto de acordo com as especificações para todos os 3 casos?

Esta página foi útil?
0 / 5 - 0 avaliações