環境
説明
ヘルパー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とUnicodeにre.sub("[^\w\d.]+", "_", distribution, re.UNICODE)
存在するという意味だと思いますか?
では、その正規表現を使用して正しいホイールファイル名を作成しますか? また、この変更のために、パッケージのフォルダー名でも何かをしたいですか?
また、これの単体テストは、 https://github.com/pypa/pip/pull/8054で説明したものと同様ですか? (https://github.com/pypa/pip/pull/8054#discussion_r409654545としてcanonicalize_name
を使い始めるまで、 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にテストを追加するのは良い考えだと思います。
では、そのテストは何をするのでしょうか? ドット、ダッシュ、アンダースコアを使用してパッケージ名のバリエーションを試して、ホイールファイル名が3つのケースすべての仕様に従って正しいことを確認するだけで十分ですか?
最も参考になるコメント
ああ、これは理にかなっています。 犯人はこの行です:
これは
simple-package-1.0-py2.py3-none-any.whl
になりますが、ホイールの仕様ではsimple_package-1.0-py2.py3-none-any.whl
です。修正も簡単なはずです。