Propositions liées à la qualité du code (pep8, pylint, ...) #58

Merged
Fred merged 7 commits from propal/pep8-pylint into master 2021-06-19 08:29:36 +02:00
Owner

Setup.cfg

Dans le fichier setup.cfg, j'ai ajouté deux lignes la configuration de flake8 (max-line-lenght et max-complexity)

Requirements

J'ai ajouté pylint, pour avoir une idée de la qualité de code par application.

pylint

J'ai modifié deux points dans l'appli base et pylint est tout content !

************* Module base.models
base/models.py:11:4: C0115: Missing class docstring (missing-class-docstring)
base/models.py:11:4: R0903: Too few public methods (0/2) (too-few-public-methods)

------------------------------------------------------------------
Your code has been rated at 8.57/10 (previous run: 7.86/10, +0.71)

En customisant un peu la config' (voir ici, on arrive à 10/10 pour l'application base 😙 )

--errors-only

En fait, outre sa tendance à noyer le développeur sous une multitude de messages parfois chelous, pylint propore aussi une option --errors-only, qui ne liste que les erreurs qu'il détecte. Par exemple:

$ pylint competition --errors-only
************* Module competition.views
competition/views.py:63:12: E0602: Undefined variable 'Q' (undefined-variable)
competition/views.py:63:42: E0602: Undefined variable 'Q' (undefined-variable)

Du coup, le fait que Python soit un langage dynamique peut être compensé par ce genre d'outils (en plus de mypy, mais perso, je ne le maîtrise pas).

Il suffit ensuite de regarder aux lignes mentionnées ci-dessus:

[...]

@login_required
@require_http_methods(["GET"])
def score_listing(request):
    """
    Revoie la liste des scores
    """

    pattern = request.GET.get("pattern", None)

    if pattern:
        score_list = Point.objects.filter(
            Q(event__icontains=pattern) | Q(gymnast__icontains=pattern)
        )
    else:
        score_list = Point.objects.all()

En gros, si on passe un pattern à cette fonction, elle va de toutes façons planter.
C'est le genre d'étapes que l'on passe à la CI pour être averti au plus tôt d'une fonctionnalité qui pourrait planter 🙂

Intégration avec l'éditeur

J'aime bien aussi intégrer Pylint avec l'éditeur.
VSCodium propose une bonne intégration:

image

Le seul soucis concerne la création correcte de la structure du projet - et je suis un peu coincé avec le répertoire src/, parce que je ne sais pas exactement comment configurer pylint pour que ce soit correct.

Quelques idées

trim des lignes

Configure ton éditeur de texte (SublimeText?) pour avoir un trim des lignes à chaque sauvegarde. Si tu utilises VSCodium, tu peux ajouter la ligne suivante dans ton fichier .vscode/settings.json:

{
 	[...]
    "files.trimTrailingWhitespace": true,
    [...]
}

A chaque sauvegarde, l'éditeur dégagera tous les espaces qui pourraient terminer une ligne. Chaque commit sera alors propre et aura le poil soyeux - et cela évitera les "faux positifs" qui hurlent "y'a un changement! y'a un changement!" alors que seul le dernier caractère aura été modifié 😉

Ordre des imports

Les imports sont mis au début de chaque fichier. L'ordre a son importance pour la lisibilité:

  1. d'abord les imports systèmes (os, sys, datetime, ...),
  2. puis les imports des librairies tierces (django, pytest, flake, ...)
  3. et seulement après, tes propres librairies et applications (.models, communication.views, ...).

nommage des variables

Evite les variables m, u, ... Elles doivent signifier quelque chose et respecter le snake_case: user_messages, current_message, ...

## Setup.cfg Dans le fichier `setup.cfg`, j'ai ajouté deux lignes la configuration de flake8 (max-line-lenght et max-complexity) ## Requirements J'ai ajouté `pylint`, pour avoir une idée de la qualité de code par application. ### pylint J'ai modifié deux points dans l'appli `base` et pylint est tout content ! ```test ************* Module base.models base/models.py:11:4: C0115: Missing class docstring (missing-class-docstring) base/models.py:11:4: R0903: Too few public methods (0/2) (too-few-public-methods) ------------------------------------------------------------------ Your code has been rated at 8.57/10 (previous run: 7.86/10, +0.71) ``` En customisant un peu la config' (voir [ici](https://sources.grimbox.be/Sulley/khana/commit/b9466342ad320fd4f391145488aabc2c1963c42d), on arrive à 10/10 pour l'application base 😙 ) ### --errors-only En fait, outre sa tendance à noyer le développeur sous une multitude de messages parfois chelous, pylint propore aussi une option `--errors-only`, qui ne liste **que** les erreurs qu'il détecte. Par exemple: ```bash $ pylint competition --errors-only ************* Module competition.views competition/views.py:63:12: E0602: Undefined variable 'Q' (undefined-variable) competition/views.py:63:42: E0602: Undefined variable 'Q' (undefined-variable) ``` Du coup, le fait que Python soit un langage dynamique peut être compensé par ce genre d'outils (en plus de `mypy`, mais perso, je ne le maîtrise pas). Il suffit ensuite de regarder aux lignes mentionnées ci-dessus: ```python [...] @login_required @require_http_methods(["GET"]) def score_listing(request): """ Revoie la liste des scores """ pattern = request.GET.get("pattern", None) if pattern: score_list = Point.objects.filter( Q(event__icontains=pattern) | Q(gymnast__icontains=pattern) ) else: score_list = Point.objects.all() ``` En gros, si on passe un pattern à cette fonction, elle va de toutes façons planter. C'est le genre d'étapes que l'on passe à la CI pour être averti au plus tôt d'une fonctionnalité qui pourrait planter 🙂 ### Intégration avec l'éditeur J'aime bien aussi intégrer Pylint avec l'éditeur. VSCodium propose une bonne intégration: ![image](/attachments/4e58d482-dc65-43b7-a16e-d2d53511aaf0) Le seul soucis concerne la création correcte de la structure du projet - et je suis un peu coincé avec le répertoire `src/`, parce que je ne sais pas exactement comment configurer pylint pour que ce soit correct. ## Quelques idées ### trim des lignes Configure ton éditeur de texte (SublimeText?) pour avoir un trim des lignes à chaque sauvegarde. Si tu utilises VSCodium, tu peux ajouter la ligne suivante dans ton fichier .vscode/settings.json: ```json { [...] "files.trimTrailingWhitespace": true, [...] } ``` A chaque sauvegarde, l'éditeur dégagera tous les espaces qui pourraient terminer une ligne. Chaque commit sera alors propre et aura le poil soyeux - et cela évitera les "faux positifs" qui hurlent "y'a un changement! y'a un changement!" alors que seul le dernier caractère aura été modifié :wink: ### Ordre des imports Les imports sont mis au début de chaque fichier. L'ordre a son importance pour la lisibilité: 1. d'abord les imports systèmes (os, sys, datetime, ...), 2. puis les imports des librairies tierces (django, pytest, flake, ...) 3. et seulement après, tes propres librairies et applications (.models, communication.views, ...). ### nommage des variables Evite les variables `m`, `u`, ... Elles doivent signifier quelque chose et respecter le `snake_case`: `user_messages`, `current_message`, ...
Fred added the
enhancement
label 2021-05-14 20:44:24 +02:00
Sulley was assigned by Fred 2021-05-14 20:44:24 +02:00
Fred added 1 commit 2021-05-14 20:44:25 +02:00
1d182cf5e7 Add setup.cfg to limit max line length to 100
... and complexity at 10.
but this won't be needed, right? ;-)
Fred added 1 commit 2021-05-14 21:07:04 +02:00
Fred added 1 commit 2021-05-14 21:23:28 +02:00
Fred added 1 commit 2021-05-14 21:40:14 +02:00
Fred added 1 commit 2021-05-15 15:08:59 +02:00
c390f06801 Move .pylintrc at the root directory
This allows an easier integration with the editor
and pylint can still be run with pylint src/*
Sulley added 1 commit 2021-05-17 10:43:24 +02:00
Author
Owner

"merge master into propal/pep8" ? Pourquoi ? 😥

"merge master into propal/pep8" ? Pourquoi ? 😥
Fred added 1 commit 2021-06-19 08:28:06 +02:00
Fred changed title from [WIP] Propositions liées à la qualité du code (pep8, pylint, ...) to Propositions liées à la qualité du code (pep8, pylint, ...) 2021-06-19 08:29:25 +02:00
Fred merged commit 3376abd5b2 into master 2021-06-19 08:29:36 +02:00
Sign in to join this conversation.
No reviewers
No Milestone
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: Sulley/khana#58
No description provided.