Commit
[ka2] fix connecteur simplex: pagination plafonnée par la RPC + erreur franche sur réponse non-liste — le zéro depuis le 2026-09-30 est un VRAI zéro. La RPC Supabase get_public_rental_listings_page plafonne désormais côté serveur à 24 lignes/appel quel que soit p_limit (le site utilise p_limit:12 et ne le voit pas) : le connecteur demandait 100, recevait 24, avançait l'offset de 100 (≥ total 28) et SAUTAIT les lignes 24-27 — où se trouvaient précisément les 3 anciennes annonces disponibles (dont le 2½ du Cégep 740 $). Chute found=3→0 le 2026-09-30 08:33, puis 49 runs « found=0 ok » ; le dernier run (10-07 21:08) était un échec DNS transitoire (vague systémique connue du nœud). Vérifié live : RPC 200, 28 fiches (25 rented + 3 unavailable) ; le code du site (publicRentalCatalog.js) ne considère « disponible » que available/coming_soon et affiche tout le reste « Indisponible » → le filtre _KEEP du connecteur est aligné, found=0 est le vrai état du marché. Fix minimal : offset += len(batch) au lieu de PAGE (toutes les lignes vues : 28/28 au lieu de 24/28), et _rpc lève une erreur FRANCHE si la réponse n'est pas une liste (clé révoquée/dict d'erreur → plus jamais de zéro silencieux, indétectable avec médiane 0.0 — pattern sotramont bcdf125). Pas de fixture enregistrée : test_listings_are_valid exige des annonces non vides, impossible pendant un vrai zéro. Testé : fetch() venv → 28/28 lignes brutes, 0 annonce (vrai zéro), run.py sync simplex → found=0 ok (1,1 s), pm2 restart lou-ka-sync, site :8095 → 200.
modified
louka/connectors/simplex.py
+9 −2
@@ -49,7 +49,12 @@ class SimplexConnector(BaseConnector): | ||
| 49 | 49 | "Authorization": f"Bearer {API_KEY}", |
| 50 | 50 | "Content-Type": "application/json"}) |
| 51 | 51 | data = resp.json() |
| 52 | − return data if isinstance(data, list) else [] | |
| 52 | + if not isinstance(data, list): | |
| 53 | + # clé révoquée / RPC renommée → dict d'erreur : erreur FRANCHE, | |
| 54 | + # jamais un zéro silencieux (médiane 0.0 → indétectable sinon) | |
| 55 | + raise RuntimeError( | |
| 56 | + f"simplex : réponse RPC inattendue — {str(data)[:200]}") | |
| 57 | + return data | |
| 53 | 58 | |
| 54 | 59 | def fetch(self) -> list[Listing]: |
| 55 | 60 | rows: list[dict] = [] |
@@ -58,7 +63,9 @@ class SimplexConnector(BaseConnector): | ||
| 58 | 63 | batch = self._rpc(offset) |
| 59 | 64 | rows.extend(batch) |
| 60 | 65 | total = batch[0].get("total_count", 0) if batch else 0 |
| 61 | − offset += PAGE | |
| 66 | + # la RPC plafonne côté serveur (~24 lignes/appel, quel que soit | |
| 67 | + # p_limit) : avancer de la taille reçue, sinon la queue est sautée | |
| 68 | + offset += len(batch) | |
| 62 | 69 | if not batch or offset >= total: |
| 63 | 70 | break |
| 64 | 71 | listings: dict[str, Listing] = {} |
| 65 | 72 | |