Flet est un framework qui permet de développer des applications web, desktop et mobile avec un seul code Python. Il propose plus de 150 contrôles et services, des paquets Python précompilés pour iOS et Android (NumPy, pandas, Pillow), ainsi que la commande flet build pour préparer la distribution, App Store et Google Play compris. Le framework gère aussi les tests avec pytest, l’exécution dans le navigateur via Pyodide et WebAssembly, les extensions basées sur Flutter, l’accessibilité et un serveur MCP pour assistants de code.
En C++ (comme en C), nous n'avons pas de telle garantie, si bien que l'affichage est non spécifié : cela peut aussi bien être 0 suivi de 1 que 1 suivi de 0 pour :
Mais avec la petite astuce suivante on peut forcer l'ordre d’exécution, car les arguments d'une initializer_list sont ordonnés (cf. https://timsong-cpp.github.io/cppwp/n3337/dcl.init.list#4) (ici en utilisant les deduction guide).
std::apply(foo,std::tuple{0,1});
Cependant on force alors tous les arguments de foo à être passés par valeur. On peut améliorer ce comportement pour respecter les r-value etc de la façon suivante :
On a ainsi ordonné les arguments d'appel sans perdre le contrôle fin du passage d'argument que permet C++.
Et voilà, une petite sucrerie de C++, probablement rien de nouveau sous le soleil pour les experts, mais ça m'a beaucoup amusé de jouer avec ça hier soir !
Et accessoirement, ça résout un bug dans Pythran, mais ça, c'est juste pour mon plaisir personnel.
En 2022, nos amis d'IndieHosters ont obtenu le soutien de la fondation NLNet pour financer plusieurs développements autour du protocole SCIM2. Ils avaient fait appel à nous pour travailler sur l'intégration de SCIM dans le protocole Matrix, dans le serveur synapse et pour créer un utilitaire de test en ligne de commande. On vous en parlait ici. Les contributions à Matrix et synapse n'avaient pas été intégrées, mais la création de l'utilitaire en ligne de commande avait déclenché chez nous la création d'un ensemble de bibliothèques Python autour du protocole SCIM que nous avons rassemblées sous python-scim :
L'hiver dernier nous avons à nouveau souscrit et obtenu le soutien du programme NGIZero Entrust pour fortifier python-scim et créer de nouvelles intégrations. Notamment en proposant une solution différente pour l'implémentation du protocole avec synapse, et dans des outils de LaSuite, on vous en reparle plus tard.
Voici notre premier point d'étape.
Nous avons traité la grande majorité des tickets et requêtes de fusion ouverts, et ré-organisé les bibliothèques de cette manière :
scim2-models s'occupe de la validation et de la production des données, et offre une interface de manipulation native en Python. C'est elle qui implémente la plupart des règles des spécifications sur le modèle de données et porte une grande partie de la complexité.
scim2-server propose des primitives pour implémenter un serveur SCIM. La plupart des traitements courants sont implémentés (comme la gestion des erreurs HTTP, la pagination des réponses, les ETags etc.). La bibliothèque est faite pour être branchée à un framework web (comme Django, Flask ou FastAPI par exemple) et à une base de données (via SQLAlchemy ou l'ORM Django). La bibliothèque embarque aussi deux serveurs SCIM2 d'exemple (fonctionnant en WSGI et ASGI) avec un stockage volatile en mémoire.
pytest-scim2-server embarque un serveur de test dans une fixture pytest, pour tester facilement des applications clientes.
scim2-client permet de découvrir les ressources exposées par un serveur, et créer et envoyer des requêtes SCIM vers ce serveur. Elle permet de vérifier la conformité des requêtes avant envoi, et se branche sur n'importe quel moteur de requêtes HTTP. Elle embarque des moteurs ASGI et WSGI pour faire des tests unitaires rapides sans passer par le réseau, et un moteur httpx2 pour le monde réel.
scim2-tester joue une série de scénarios pour vérifier la conformité du comportement de serveurs de test ou de production. La bibliothèque tente d'être exhaustive et de faire des vérifications sur chacun des attributs de chacune des ressources proposées par le serveur.
scim2-cli est un utilitaire en ligne de commande qui permet de faire des requêtes à un serveur, et de lancer un test de conformité sur ce serveur.
La première passe d'amélioration a consisté en :
L'implémentation des filtres. Les filtres permettent de faire des requêtes sur certaines ressources précisément selon certains critères, ainsi que de patcher des sous-attributs précis de ressources. La difficulté de cette tâche résidait principalement dans la traduction de la grammaire des filtres en un AST Python, la manipulation de cet AST par la bibliothèque pour effectuer un vrai filtrage, et enfin en offrir un transpileur pour convertir cet AST en requêtes SQL par exemple.
L'implémentation des opérations par lots. Les opérations par lots (ou BULK) permettent d'effectuer plusieurs opérations en une seule requête, mais apportent la possibilité de dépendances cycliques entre les opérations.
L'implémentation de la pagination par curseurs décrite par la RFC 9865. La pagination par curseurs s'oppose à la traditionnelle pagination par indexes, et s'illustre par sa stabilité et la garantie de ne pas présenter de ressource en doublon, même quand le jeu de données évolue en cours de lecture.
De nombreux nettoyages, améliorations et corrections de bugs, notamment pour la conformité des cas spéciaux de PATCH.
À venir dans l'écosystème, des intégrations officielles pour Django, Flask, FastAPI et SQLAlchemy. Possiblement un peu de réorganisation (peut-être que nous allons extraire les serveurs d'exemple dans leur propre projet, ainsi que la gestion des storages).
Nous remercions à nouveau chaleureusement la fondation NLNet pour nous permettre de travailler sur ces projets.
On vous tient au courant rapidement pour la suite.
Last winter, we applied again and received support from the NGIZero Entrust program to strengthen python-scim and build new integrations. This includes a different approach to implementing the protocol in synapse, and integrations in LaSuite tools. We will tell you more about it later.
Here is our first progress report.
We handled most of the open issues and merge requests, and reorganized the libraries this way:
scim2-models validates and produces data, and offers a native Python interface to manipulate it. It implements most of the specification rules about the data model, and carries a large part of the complexity.
scim2-server provides primitives to implement a SCIM server. Most common operations are implemented (such as HTTP error handling, response pagination, ETags, etc.). The library is designed to plug into a web framework (such as Django, Flask or FastAPI) and a database (with SQLAlchemy or the Django ORM). The library also ships two example SCIM2 servers (WSGI and ASGI) with volatile in-memory storage.
scim2-client discovers the resources exposed by a server, and builds and sends SCIM requests to this server. It can check that requests are compliant before sending them, and works with any HTTP request engine. It ships ASGI and WSGI engines for fast unit tests without network access, and an httpx2 engine for the real world.
scim2-tester runs a series of scenarios to check that test or production servers behave according to the specifications. The library aims to be exhaustive. It checks each attribute of each resource exposed by the server.
scim2-cli is a command line tool to send requests to a server, and to run a compliance test on this server.
The first round of improvements included:
The implementation of filters. Filters let you query specific resources based on given criteria, and patch specific sub-attributes of resources. The main difficulty was to translate the filter grammar into a Python AST. The library then manipulates this AST to perform actual filtering. Finally, it provides a transpiler to convert this AST into SQL queries, for instance.
The implementation of bulk operations. Bulk operations perform several operations in a single request, but they also allow cyclic dependencies between operations.
The implementation of cursor-based pagination, described in RFC 9865. Unlike traditional index-based pagination, cursor-based pagination is stable. It guarantees that no resource is returned twice, even when the dataset changes during reading.
Many cleanups, improvements and bug fixes, especially for compliance with PATCH edge cases.
Coming next in the ecosystem: official integrations for Django, Flask, FastAPI and SQLAlchemy. Maybe some reorganization too: we might move the example servers and the storage management into their own projects.
Once again, we warmly thank the NLNet foundation for allowing us to work on these projects.
We will keep you posted soon.
Je suis développeur en formation et j’apprends principalement Python. Je commence à contribuer à des projets open source sur GitHub et j’aimerais aussi participer aux projets de l’AFPy.
Est-ce que vous pourriez m’indiquer comment commencer à contribuer et s’il existe des tâches accessibles aux nouveaux contributeurs ?
Bonjour à tous. Je développe le projet IJRAP labs, un logiciel Open Source pour le collecte des données scientifiques directement sur le terrain en mode déconnecté (offline).
L’outil cible l’écosystème python et le framework kivy pour sa capacité cross Platforms (Android et ordinateur). Le projet est enregistré sur zenodo pour garantir son cadre scientifique et open source.
Je vous invite tous a rejoindre cette coproduition. Si vous souhaitez consulter la fiche zenodo ou échanger sur le code, contacter moi en message privé et je vous partagerai le lien direct.
Je n'ai pas réussi à tirer parti des accolades des dictionnaires Python pour avoir quelque chose qui contienne des instructions C. Mais si quelqu'un du lectorat voit d'autres moyens de détourner la syntax Python pour l'adapter au C, j'ai hâte de lire ça :-)
Est-ce utile ? Pas directement, mais c'est très amusant (ce qui est déjà utile en soi). La page wikipedia anglaise sur le sujet est un petit bonbon de geekerie, j'adore:
Quand un logement est saisi en France, il finit vendu aux enchères au tribunal. C'est une procédure publique de bout en bout : l'annonce est publiée, n'importe qui peut assister à l'audience, et le prix final est annoncé dans la salle.
Je me suis dit qu'il devait bien exister quelque part un fichier avec toutes ces ventes et leurs prix. Pour les ventes immobilières classiques, il y a DVF depuis 2019, et tout le monde s'en sert. Pour les ventes au tribunal, rien. J'ai cherché un moment avant de me résoudre à le construire moi-même, et c'est ce chantier que je voulais raconter ici.
Je précise d'emblée que j'en ai fait un site, MdB Scanner. Il a une partie payante et son code n'est pas libre. Les chiffres que j'en ai tirés sont en revanche publiés sous Licence Ouverte.
Trois sources, aucun format
Les annonces, ce sont les avocats qui les publient, soit sur le site de leur cabinet, soit sur des plateformes privées. Une même vente se retrouve souvent sur deux ou trois sites, pas toujours avec la même surface ni la même mise à prix.
Les documents de la vente sont des PDF, souvent des scans. Certains sont barrés d'un filigrane en diagonale sur chaque page, et là, l'OCR rend de la bouillie. Sur un lot de dix dossiers, j'en ai eu six inexploitables. J'ai fini par faire lire les pages en image par un modèle de vision. Ça marche, mais je n'en suis pas très fier.
Quant aux prix d'adjudication, je n'ai trouvé aucune publication officielle. Un seul site les publie pour toute la France, quelques cabinets d'avocats le font pour leurs propres ventes, et pour presque une audience sur trois, je ne trouve le résultat nulle part.
DVF voit passer les enchères, mais de loin
DVF contient bien des ventes marquées « Adjudication ». Le problème, c'est qu'on ne sait pas s'il s'agit d'une saisie ou d'une vente volontaire chez un notaire, qu'il n'y a pas la mise à prix, et que rien ne permet de relier la ligne à une audience. La base a aussi du retard : aujourd'hui, elle s'arrête fin 2025.
Je me sers donc de DVF pour autre chose : savoir à combien se vendent les logements autour.
Les petites surprises en chemin
Le dédoublonnage m'a coûté cher. Même adresse, même jour, même mise à prix : j'étais sûr d'avoir affaire à la même vente. Sauf qu'une procédure vend souvent plusieurs lots le même jour dans le même immeuble. Et dans l'autre sens, j'ai réussi à coller une annonce du 16ᵉ arrondissement sur le résultat d'une vente du 15ᵉ.
Pour situer les biens, la Base Adresse Nationale m'a sauvé, mais pas avant que je découvre des villes nommées « Une » ou « Usage D'Habitation », et un appartement de Meaux rangé dans l'Aube.
Mention spéciale à l'API Géorisques à Paris, Lyon et Marseille : selon la donnée demandée, elle veut le code de la commune ou celui de l'arrondissement. Si on se trompe, elle répond poliment qu'il n'y a aucun risque.
Au bout du compte
J'ai réuni 4 728 ventes entre fin 2022 et septembre 2026. Pour 2 961 logements, j'ai pu comparer le prix final aux ventes voisines dans DVF : la moitié est partie à moins de 60 % du prix du quartier, frais non compris, et une sur onze au prix du quartier ou plus cher. Avec une réserve de taille : DVF ne dit rien de l'état des biens, et beaucoup sont abîmés ou occupés.
D'abord ces filigranes. Quelqu'un a-t-il déjà réussi à les nettoyer avec des outils libres avant l'OCR, que ce soit avec ImageMagick, OpenCV, ocrmypdf ou autre chose ? J'aimerais bien me passer du modèle de vision.
Ensuite les résultats. Quelqu'un a-t-il déjà essayé de les obtenir directement auprès d'un greffe, ou connaît-il une source officielle qui m'aurait échappé ?
Merci d'avance, et merci à ceux qui maintiennent DVF, la Base Adresse Nationale et Géorisques.
Bonjour à tous. Je développe le projet IJRAP labs, un logiciel Open Source pour le collecte des données scientifiques directement sur le terrain en mode déconnecté (offline).
L’outil cible l’écosystème python et le framework kivy pour sa capacité cross Platforms (Android et ordinateur). Le projet est enregistré sur zenodo pour garantir son cadre scientifique et open source.
Je vous invite tous a rejoindre cette coproduition. Si vous souhaitez consulter la fiche zenodo ou échanger sur le code, contacter moi en message privé et je vous partagerai le lien direct.