Panversion, un outil pour comparer des numéros de versions simplement

Coucou ici,

J’ai créé une toute petite librairie nommée “panversion” permettant de comparer et donc trier des versions.
L’idée de base c’est de l’utiliser dans mon autre projet “packmon”, mais je voulais la séparer pour qu’elle puisse potentiellement servir à d’autres projets.

Elle support les versions sémantiques et les versions specifiers de Python pour le moment. Si vous connaissez un autre système de numérotation de version, ça m’intéresse ;o)

Le lien : panversion · PyPI

1 « J'aime »

J’aime beaucoup l’exemple avec sorted et key, super propre !

Par contre dans le code je vois une regex pas verbeuse, la PEP 440 (et Version specifiers - Python Packaging User Guide) donnent une regex verbeuse :

VERSION_PATTERN = r"""
    v?
    (?:
        (?:(?P<epoch>[0-9]+)!)?                           # epoch
        (?P<release>[0-9]+(?:\.[0-9]+)*)                  # release segment
        (?P<pre>                                          # pre-release
            [-_\.]?
            (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
            [-_\.]?
            (?P<pre_n>[0-9]+)?
        )?
        (?P<post>                                         # post release
            (?:-(?P<post_n1>[0-9]+))
            |
            (?:
                [-_\.]?
                (?P<post_l>post|rev|r)
                [-_\.]?
                (?P<post_n2>[0-9]+)?
            )
        )?
        (?P<dev>                                          # dev release
            [-_\.]?
            (?P<dev_l>dev)
            [-_\.]?
            (?P<dev_n>[0-9]+)?
        )?
    )
    (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
"""

c’est plus mignon qu’une colonne de r", ne trouve-tu pas ?

Tu peux peut-être piquer des tests ici :

d’ailleurs ils semblent avoir une implèm aussi :

mais leur classe Version n’implémente pas de parseur, les classes filles s’en occupent, c’est différent. Par contre j’aime bien leur implémentation des comparaison riches !

une regex verbeuse c’est un truc avec des commentaires ?
Je peux en rajouter. J’ai fait une ligne par “truc important” pour bien visualiser. Je mélange plusieurs regex (semantic et specifiers), je trouvais ça plus lisible.

Je vais voir pour les tests oui, merci !

Et enfin, c’est quoi ce que tu appelles les comparaisons riches ?

Oui, qui utilise re.VERBOSE pour autoriser les espaces (pour indenter), les commentaires, et les retours à la ligne, exemple :sphinx-lint/sphinxlint/rst.py at b1bec138033385653f42606a95af79a184dd08a5 · sphinx-contrib/sphinx-lint · GitHub

Et enfin, c’est quoi ce que tu appelles les comparaisons riches ?

Par comparaison riche j’entend l’ensemble : __lt_, __le__, __gt__, __ge__, __eq__, __ne__.

Typiquement ici je trouve ça propre :

de simplement comparer des tuples de parts.

C’est propre quand tu gères les version sémantiques. J’avais fait ça au départ, mais avec les versions pythonesques, c’est devenu compliqué.

Je peux regarder, je trouvais pas ça beaucoup plus lisible au départ.

Bonjour,
Je l’ai découverte l’année dernière, mais pourquoi ne pas utiliser la librairie packaging disponible en standard ?

Elle n’accepte pas “1.0.0-alpha.beta”, mais elle sert à comparer les versions et semble aussi fonctionner avec le tri proposé

In [6]: Version("1.0.0-alpha.beta")
---------------------------------------------------------------------------
InvalidVersion          

In [9]: sorted(["1.0.0", "1.0.0-beta", "1.0.0-rc.1", "1.0.0-alpha"], key=Version)
Out[9]: ['1.0.0-alpha', '1.0.0-beta', '1.0.0-rc.1', '1.0.0']

Voici l’article qui me l’a fait découvrir : Quirks of Python package versioning

Bonne fin de semaine

Voilà pourquoi ? :slight_smile:
Elle est orientée python seulement et pas Semantic Version typiquement.

Mais les numéros de version, même s’il ne sont pas des Semantic Version, doivent être conforme à la spécification

Selon la spécification et la librairie de vérification, "1.0.0-alpha.beta” n’est pas une “version” conforme. Le build d’un package échoue avec cette chaîne de caractères.

On peut avoir “1.0.0-alpha”, “1.0.0-beta”, “1.0.0-alpha.post”, “1.0.0-alpha+beta” mais quel en serait le sens ?

Voir l’article : Quirks of Python package versioning

Oui, mais mon paquet python n’est pas fait que pour du python. Il gère plusieurs types de Version. Donc pour un paquet python, utiliser la lib packaging peut être suffisante.

Mais pour d’autres sujets, ça prend en compte les autres types de nommage de Versions.

Ok merci pour la précision, je n’avais pas compris ou je n’avais pas le contexte.

J’avais raté ça aussi ! Tu devrais le rajouter au README bien en évidence :slight_smile:

ok, je vais essayer d’être plus explicite alors. Mais pas tout de suite, je fais mes bagages :wink: