Pip: Möglicher Fehler in "tests.lib.create_basic_wheel_for_package"

Erstellt am 16. Apr. 2020  ·  7Kommentare  ·  Quelle: pypa/pip

Umgebung

  • Pip-Version: 20.1.dev0
  • Python-Version: 3.8.2
  • Betriebssystem: OSX 10.15.4

Beschreibung

Wenn der Helfer tests.lib.create_basic_wheel_for_package in einem Komponententest verwendet wird, um ein Rad mit einem Namen zu erstellen, der ein - , z. B. simple-package , und dann das Rad installiert wird, wird der Paketname verwendet als simple und die Version wird als package

Erwartetes Verhalten

Gemäß der PEP-491-Dateinamenkonvention darf der Paketname kein - enthalten. Daher sollten solche Paketnamen beim Erstellen von Rädern zu Testzwecken nicht zugelassen werden. (Mein Verständnis des PEP könnte auch hier falsch sein)

Wie zu reproduzieren

Führen Sie den folgenden Komponententest durch

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)

Ausgabe

Der Test schlägt mit einem Assertionsfehler fehl, da in der Ausgabe von pip list --format=json der Paketname als simple und die Version als 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

Hilfreichster Kommentar

Ah, das macht Sinn. Der Schuldige ist diese Linie:

archive_name = "{}-{}-py2.py3-none-any.whl".format(name, version)

Das würde simple-package-1.0-py2.py3-none-any.whl , aber die Radspezifikation erwartet simple_package-1.0-py2.py3-none-any.whl .

Das Update sollte ebenfalls unkompliziert sein:

archive_name = "{}-{}-py2.py3-none-any.whl".format(
    canonicalize_name(name).replace('-', '_'),
    version,
)

Alle 7 Kommentare

Ah, das macht Sinn. Der Schuldige ist diese Linie:

archive_name = "{}-{}-py2.py3-none-any.whl".format(name, version)

Das würde simple-package-1.0-py2.py3-none-any.whl , aber die Radspezifikation erwartet simple_package-1.0-py2.py3-none-any.whl .

Das Update sollte ebenfalls unkompliziert sein:

archive_name = "{}-{}-py2.py3-none-any.whl".format(
    canonicalize_name(name).replace('-', '_'),
    version,
)

Ich denke, das ist der richtige Ansatz, um den Namen zu kanonisieren und - durch _ ersetzen, bevor die Raddatei erstellt wird. Lassen Sie mich sofort einen Fix dafür erstellen und den gleichen Test verwenden, den ich im Ticket geschrieben habe, um zu überprüfen, ob er behoben wurde :)

Ich habe gerade festgestellt, dass PEP 491 tatsächlich einen regulären Ausdruck enthält, um einen Paketnamen für den Dateinamen eines Rads kanonisch zu transformieren. Vielleicht sollten wir das stattdessen verwenden (mit einem Link zum PEP); Für einen zukünftigen Leser wäre es viel einfacher zu verstehen.

Ich denke du meinst re.sub("[^\w\d.]+", "_", distribution, re.UNICODE) bei PEP-491 Escaping und Unicode vorhanden ?

Also würden wir mit diesem regulären Ausdruck einen korrekten Raddateinamen erstellen? Wollen wir für diese Änderung auch etwas mit dem Ordnernamen des Pakets tun?

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

Wird der Komponententest dafür auch dem ähnlich sein, was wir unter https://github.com/pypa/pip/pull/8054 besprochen haben? (Beachten Sie, dass das Folgende aufgrund der Eigenart, die wir mit pkg_resources.safe_name gefunden haben, möglicherweise nicht funktioniert, bis wir anfangen, canonicalize_name als https://github.com/pypa/pip/pull/8054#discussion_r409654545 zu verwenden.)

@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

Ja das ist es. Der gleiche Name kann auch für das Paket verwendet werden (ich glaube nicht, dass das Paket tatsächlich von vielen Tests verwendet wird).

@pradyunsg Benötigt dies einen Test?

Ja, ich denke, das Hinzufügen eines Tests in test_lib.py ist eine gute Idee.

Ja, ich denke, das Hinzufügen eines Tests in test_lib.py ist eine gute Idee.

Was wird dieser Test also tun? Reicht es aus, nur Varianten von Paketnamen mit Punkt, Bindestrich und Unterstrich auszuprobieren und zu überprüfen, ob der Name der Raddatei gemäß der Spezifikation für alle drei Fälle korrekt ist?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen