Pip: 「tests.lib.create_basic_wheel_for_package」の潜在的なバグ

作成日 2020年04月16日  ·  7コメント  ·  ソース: pypa/pip

環境

  • pipバージョン:20.1.dev0
  • Pythonバージョン:3.8.2
  • OS: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,
)

ホイールファイルを作成する前に、名前を正規化し、 -_に置き換えるのが正しいアプローチだと思います。 すぐに修正を作成し、チケットに書き込んだのと同じテストを使用して、修正されたことを確認します:)

PEP 491には​​、実際には、ホイールのファイル名のパッケージ名を正規に変換するための正規表現が含まれていることに気付きました。 代わりにそれを使用する必要があるかもしれません(PEPへのリンク付き)。 将来の読者にとっては、はるかに理解しやすいでしょう。

PEP-491 EscapingとUnicodeにre.sub("[^\w\d.]+", "_", distribution, re.UNICODE)存在するという意味だと思いますか?

では、その正規表現を使用して正しいホイールファイル名を作成しますか? また、この変更のために、パッケージのフォルダー名でも何かをしたいですか?

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

また、これの単体テストは、 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つのケースすべての仕様に従って正しいことを確認するだけで十分ですか?

このページは役に立ちましたか?
0 / 5 - 0 評価