Umgebung
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'}]
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?
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?
Hilfreichster Kommentar
Ah, das macht Sinn. Der Schuldige ist diese Linie:
Das würde
simple-package-1.0-py2.py3-none-any.whl
, aber die Radspezifikation erwartetsimple_package-1.0-py2.py3-none-any.whl
.Das Update sollte ebenfalls unkompliziert sein: