环境
描述
当在单元测试中使用帮助程序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的链接); 对于将来的读者来说,理解起来会容易得多。
我认为您的意思是在PEP-491转义和Unicode上出现re.sub("[^\w\d.]+", "_", distribution, re.UNICODE)
吗?
因此,我们将使用该正则表达式创建正确的wheel文件名吗? 我们是否还想对包的文件夹名称进行任何更改?
单元测试是否也将与我们在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文件名是否正确就足够了吗?
最有用的评论
嗯,这很有道理。 罪魁祸首是这条线:
这将给出
simple-package-1.0-py2.py3-none-any.whl
,但是车轮规格要求simple_package-1.0-py2.py3-none-any.whl
。该修复程序也应该很简单: