Closed sebcaps closed 3 months ago
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:
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:
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. 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)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:
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 :
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 fichierduplicate_inside_category
pour detecter les doublons à l'interieur de chaque catégorie (Alimentation des fontaines, Arrosage des jardins potagers...)duplicate_between_categories
pour vérifer la présence de duplicat entre deux catégoriesJ'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:
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é https://github.com/kamaradclimber/vigieau/pull/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!
Plus une suggestion d'amélioration qu'un bug, mais la catégorie n'existe pas. L'idée de :
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.