Pip: “ tests.lib.create_basic_wheel_for_package”中的潜在错误

创建于 2020-04-16  ·  7评论  ·  资料来源: pypa/pip

环境

  • pip版本:20.1.dev0
  • python版本:3.8.2
  • 作业系统:OSX 10.15.4

描述

当在单元测试中使用帮助程序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'}]
tests auto-locked bug

最有用的评论

嗯,这很有道理。 罪魁祸首是这条线:

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,
)

所有7条评论

嗯,这很有道理。 罪魁祸首是这条线:

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的链接); 对于将来的读者来说,理解起来会容易得多。

我认为您的意思是在PEP-491转义和Unicode上出现re.sub("[^\w\d.]+", "_", distribution, re.UNICODE)吗?

因此,我们将使用该正则表达式创建正确的wheel文件名吗? 我们是否还想对包的文件夹名称进行任何更改?

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

单元测试是否也将与我们在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种情况的规范,验证wheel文件名是否正确就足够了吗?

此页面是否有帮助?
0 / 5 - 0 等级