kamaradclimber/vigieau

Automatisation de la vérification des matcher

Closed this issue · 13 comments

Plus une suggestion d'amélioration qu'un bug, mais la catégorie n'existe pas.
L'idée de :

  • collecter le maximum de réponse de l'api Vigieau avec l'aide de la communauté HACF, (voir un script qui s"executerai sur tout ou partie des codes INSEE)
  • développer un script (sous forme de test auto ?) pour exécuter sur toutes les réponses collectées, les matcher dans la définition des sensors.
    Ceci permettrai de vérifier :
  • que le maximum est supporté (avant la déclaration d'un bug
  • la non regression lors de l'ajout d'une valeur,
  • la non regression lors de la mise à jour des matcher (optimisation)

Je peux m'y atteler, mais je logue pour référence et discussion.
De mon coté j'aurai besoin de pas mal de temps pour la mise en oeuvre (manque d'XP sur les tests auto en python) et ne pourrai m'y mettre avant milieu de semaine prochaine.

Bonne idée!

Il n’est pas probablement pas facile de catégoriser automatiquement les restrictions (c’est ce que fait l’intégration à base de regexp).

Cela dit, avoir un petit scrit qui récupère un maximum de réponse de l’api serait déjà très utile pour tester la couverture.

Je propose les étapes suivantes:

  1. un script qui récupère automatiquement un maximum de réponse de l’api. Il fonctionne en tirant au hasard des coordonnées GPS, trouve le code insee et appelle l’api. Il fabrique une liste de toutes les restrictions et l’écrit dans un fichier
  2. un test unitaire de l’intégration lit ce fichier et vérifie que toutes les restrictions sont matchées dans un sensor
  3. un second script est capable de prendre en entrée le même ichier, de le faire passer dans la moulinette de l’intégration et de sortir la table de correspondance: =>
  4. un test de non regression prend ce fichier et compare à la réalité

Si tu n’as pas bcp d’expérience sur le testing en python, je pense que le premier script est une super étape.

#!/usr/bin/python

import pycristoforo as pyc
from .api import AddressApi, AddressApiError
import asyncio


async def main():
    for valid_point in await get_sample():
        print(valid_point)


async def get_sample(sample_size=100, country_name="France"):
    country_name = "France"
    sample_size = 100
    country = pyc.get_shape(country_name)
    points = pyc.geoloc_generation(country, sample_size, country_name)

    # returns a list of {"type": "Feature", "geometry": {"type": "Point", "coordinates": [-0.6605139134878257, 47.129260050347554]}, "properties": {"point": 100, "country": "France"}} object

    api = AddressApi()

    sample = []

    for point in points:
        lon, lat = point["geometry"]["coordinates"]
        try:
            res = await api.get_data(lat, lon)
            sample.append(res)
        except AddressApiError:
            # ignore it
            pass
    return sample


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

peut-être un bon début pour 1. Le script est mis custom_components/vigieau/__main__.py.

J'ai également poussé un commit (e8348ad) pour faciliter la réutilisation de l'api vigieau

Pas de pression pour travailler la dessus, je pars en vacances pour quelques semaines sans ordinateur.

Salut @kamaradclimber,
De mon coté je viens de rentrer et l'esprit reposé m'a permis d'adresser les points 1,2 et 4 (en fait j'avoue ne pas avoir compris le point 3) ;-)
Ma proposition dans https://github.com/sebcaps/vigieau/tree/Add-test.
Dans le détails:

  • un script generate_list.py permet de générer un JSON avec "presque" toutes les restrictions possibles. Presque car j'ai l'impression que toutes les communes n'ont pas de données (car pas de restrictions?) en tous cas je pars de la liste de toutes les communes et pour chacune, récupére la restriction et construit un fichier.
  • un fichier usage_list.json contenant toutes (le max) de restrictions (346 distinctes trouvées). (30min d'exec chez moi pour le générer => je l'ai mis dans le code source)
  • un fichier de test test_regexp.py qui permet de comparer les matcher avec ce fichiers. Avec 346 lignes autant dire qu'il y a pas mal d'erreur...
    Exemple
======================================================================
FAIL: test_matcher (custom_components.vigieau.tests.test_regexp.Test.test_matcher) [One matcher failed]
----------------------------------------------------------------------
Traceback (most recent call last):
 File "/workspaces/vigieau/custom_components/vigieau/tests/test_regexp.py", line 39, in test_matcher
   self.assertTrue(
AssertionError: False is not true : Value **Rejets et travaux en rivière** in category **Travaux en cours d’eau** not found in matcher

----------------------------------------------------------------------```
  • une tentative pour ajouter une action auto d'execution des tests dans github, mais ne fonctionne pas correctement.

Tout cela étant dit => je te laisse jeter un oeil et integrer tout ou partie (je soumettrai une PR si tu es OK ;-) )
Bon retour

Super merci, je regarde ça en rentrant de vacances

@kamaradclimber
Salut,
Des updates dans la même branche:

  • tentative de modif des matcher pour assurer le max d'exhaustivité,

Suite à cette modif; le test est OK => toutes les restrictions passent dans un matcher, mais : des doublons à l'intérieur d'une catégorie ainsi qu'entre catégorie.

Au vu du volume, je me suis attelé à outiller pour détecter ces doublons, via le nouveau script : verify_category.py qui contient :

  • une fonction generate_matcher_by_category pour 'générer le résultat de la correspondance entre les matchers décrit & l'ensemble des valeurs possible (ie reproduit le fonctionnement du composant), les résultats sont écrit dans un fichier
  • une fonction duplicate_inside_category pour detecter les doublons à l'interieur de chaque catégorie (Alimentation des fontaines, Arrosage des jardins potagers...)
  • une fonction duplicate_between_categories pour vérifer la présence de duplicat entre deux catégories

J'ai également ajouté un nouveau test pour executer ces 3 fonctions et assurer la non reg.

Maintenant qu'on est pas mal sur la forme, y'a plus qu'a utiliser tout cela et arriver à une liste convenable de matcher ;-)

Hello, j'ai regardé rapidement, ca me semble être la bonne direction, n'hésite pas à ouvrir une PR et je soumettrai des changements sur la branche à mon retour de vacances.

Petit tuyau pour augmenter la couverture: l'api geo permet d'obtenir les coordonnées gps d'une commune, par ex avec https://geo.api.gouv.fr/communes?codePostal=78000&format=geojson

Je suis en train d'intégrer tes changements dans la branche https://github.com/kamaradclimber/vigieau/tree/wip/all_restrictions.
En gros:

  • tout est mergé dans un seul commit
  • j'ai fait quelques modifs mineures pour réutiliser les classes d'api existantes
  • changement de structures pour stocker les restrictions, le but est déviter les doublons
  • les tests ne passent pas encore, je suis en train de regarder

Salut.
Je viens de pousser l'état de mon travail en cours.
En gros, pas mal sur les scripts de tests/détection.
Mais très galère pour arriver à une version des matchers 'satisfaisante' (ie exhaustive & sans doublons). Chaque modif qui corrige un cas, en casse un autre....
Je souhaitais vraiment un truc complet :scripts/tests & mise à jour des matcher, avant de proposer une PR
Bon je ne suis pas un expert en regexp non plus, j'apprends en marchant ;-)

Hope it helps

Une idée que je viens de tester pour faciliter ce travail qui doit être assez pénible: utiliser chatgpt.

Voici un prompt qui semble fonctionner: https://chat.openai.com/share/f4fe07ad-117f-4e2a-b1c5-802bf6d5dbe9

Peux-tu répartir les usages décrits dans le fichier json suivant entre les différentes catégories:
- Prélèvement en canaux
- Abreuvement des animaux
- Arrosage des golfs
- Navigation fluviales
- Travaux sur cours d'eau
- Remplissage/Vidange des plans d'eau
- Vidange et remplissage des piscines
- Lavage des toitures façades
- Lavage des engins nautiques
- Lavage des véhicules
- Arrosage des pelouses
- Arrosage voirie et trottoirs
- Arrosage des jardins potagers
- Alimentation des fontaines
chaque usage doit être réparti dans une seule catégorie.

puis on copie un bout du fichier json. Un essai rapide est assez probant

Effectivement ça se tente. Une fois la catégorisation (re)faite on pourra lancer chatGPT sur les regexp!

J'ai mergé #49 qui reprend une grande partie de tes changements. Ca va permettre de mieux gérer un grand nombre de restrictions (et dans le futur d'aller plus vite pour obtenir toutes les restrictions possibles).

Il reste à intégrer la partie gestion des catégories avec laquelle j'ai un peu plus de mal, pas sûr de trouver le temps pour m'en occuper avant plusieurs semaines.

Merci déjà du travail accompli, c'est vraiment un grand pas en avant.

Après quasiment un an, je pense que la mise à jour (manuelle) graçe au script est suffisante. La mise à jour réalisée aujourd'hui montre que les matchers couvrent quasiment tous les formats de restrictions sans modification (seulement 3 changements mineurs à faire aujourd'hui).

je vais fermer l'issue, merci @sebcaps pour l'idée et la réalisation!