Meio Ambiente
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'}]
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?
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?
Comentários muito úteis
Ah, isso faz sentido. O culpado é esta linha:
o que resultaria em
simple-package-1.0-py2.py3-none-any.whl
, mas a especificação da roda esperasimple_package-1.0-py2.py3-none-any.whl
.A correção também deve ser simples: