On 12/4/18 8:11 AM, Petr Blahoš wrote:
[...]
Já jsem to na začátku neřekl jasně, Chtěl jsem pouze použít ty funkce pipu, které umí vyextrahovat verzi z názvy souboru, a verze porovnat. Protože to číslování verzí, když uvážíme veškeré bety a rc a různé formáty je zatraceně složitý, takže by bylo lepší použít už existující funkce spíš než to psát, a to i přesto, že ty balíčky, o kterých mluvíme jsou moje, takže
to jejich schéma verzování znám, a můžu to postavit přímo na ně.

Ahoj!
pip není knihovna, nemá veřejné funkce. Jeho vnitřnosti se mění dost často na to, aby se nevyplatilo ho importovat. Určité části pipu se postupně reimplementují ve znovupoužitelných knihovnách, ale parsování jmen wheel souborů v tomhle myslím není moc priorita. Naštěstí je relativně jednoduché.

Jména wheelů jsou standardizována v [PEP 427]. Části jména souboru jsou oddělené pomlčkama, a verze je druhá část. (Specifikace dál říká, že ty části jsou navíc pozměněné aby obsahovaly jen písmena/čísla/tečku. Ale validní verze nemůže obsahovat jiné znaky, takže ji lze z jména wheelu korektně získat.)

Verze a jejich porovnání jsou standardizovány v [PEP 440], ale tam je to trochu složitější než `name.split('-')[1]`. Naštěstí na porovnávání verzí existuje oficiální knihovna [packaging]. Chceš třídu `packaging.version.Version`.

----

Implementace v pipu je ještě složitější, protože pip se umí postarat i o starší způsoby verzování, které už by jako wheel nemělo být možné vydat. (Ani se nedají rozumně zakódovat do jména wheelu.) Tyhle způsoby nebyly standardizované; "správně" je porovnat byl ideál kterému se dá přibližovat, ale nedá se ho dosáhnout. Pro úplnost: na verze pip aktuálně používá [heuristiku] která se snaží být kompatibilní s [distutils.version], jehož [nedokumentované] třídy LooseVersion a StrictVersion jsou sbírka černé magie (s odpovídajícím komentářem!), resp. nepovedený pokus to nějak vyřešit. Asi si dokážeš představit, že udržovat kód který takové věci dělá není jednoduché. To je asi hlavní důvod proč samotný pip nemá API a je tendence standardizované/korektní části dávat z pipu ven do knihoven jako `packaging`.


[PEP 427]: https://www.python.org/dev/peps/pep-0427/#file-name-convention
[PEP 503]: https://www.python.org/dev/peps/pep-0503/#normalized-names
[packaging]: https://packaging.pypa.io/en/latest/version/
[heuristiku]: https://github.com/pypa/pip/blob/873662179aebbf5eacdf681078f47bbfe5ee6149/src/pip/_vendor/distlib/version.py [distutils.version]: https://github.com/python/cpython/blob/master/Lib/distutils/version.py [nedokumentované]: https://docs.python.org/3/distutils/apiref.html#module-distutils.version
_______________________________________________
Python mailing list
python@py.cz
http://www.py.cz/mailman/listinfo/python

Visit: http://www.py.cz

Odpovedet emailem