Data Flow
Builder
Générez des fichiers de données de test structurées — CSV, positionnel, JSON, XML — avec des données françaises réalistes (NIR, SIRET, IBAN, communes).
| Format | CSV · Positionnel · JSON · XML |
| Données | NIR · SIRET · IBAN · Adresses · Communes via API gouv.fr |
| Interface | Desktop multiplateforme (Windows / macOS / Linux) |
| Cohérence | Liaison automatique NIR ↔ Prénom ↔ Civilité ↔ Date naissance |
| Organisation | Dossiers imbriqués · Drag & drop · Import/Export JSON |
| Conformité | Vérification d'un fichier réel vs mapping : encodage, types, formats, SIRET, NIR, IBAN… |
| Stack | Python 3.11+ · Flet · Faker FR |
🚀 Installation & Démarrage
Data Flow Builder fonctionne sur Windows, macOS et Linux. Choisissez l'option adaptée à votre usage.
Prérequis
| Composant | Version minimale | Note |
|---|---|---|
| Python | 3.11+ | Requis uniquement pour l'installation depuis les sources |
| pip | Dernière version | pip install --upgrade pip |
| OS | Windows 10+, macOS 12+, Ubuntu 20.04+ | — |
Option 1 — Depuis les sources
Recommandée pour les développeurs souhaitant modifier ou contribuer au projet.
# 1. Cloner le dépôt
git clone https://github.com/votre-org/DataFlowBuilder.git
cd DataFlowBuilder
# 2. Créer un environnement virtuel (recommandé)
python -m venv .venv
source .venv/bin/activate # Linux/macOS
.venv\Scripts\activate.bat # Windows
# 3. Installer
pip install -e .
# 4. Lancer
python main.py
Option 2 — Binaire autonome
Aucune installation de Python requise. Téléchargez depuis la page Releases.
| Système | Fichier |
|---|---|
| Windows 64-bit | DataFlowBuilder-windows |
| macOS Apple Silicon | DataFlowBuilder-macos |
| Linux 64-bit | DataFlowBuilder-linux |
Dépendances de développement
pip install -e ".[dev]"
pre-commit install
Installe : pytest, ruff, mypy, bandit, pre-commit, pyinstaller.
Structure des données persistées
{tempdir}/DataFlowBuilder/
├── flows/ # Un fichier JSON par flux
│ └── flow_1234567890.json
├── data/
│ ├── folders.json # Arborescence des dossiers
│ └── communes_cache.json # Cache API géographique
├── generated/ # Données générées (un sous-dossier par flux)
│ └── nom_du_flux/
│ └── export_2024-01-15.csv
├── assets/ # Ressources applicatives (favicon.ico)
└── logs/
└── dataflow_builder.log
%TEMP%\DataFlowBuilder\ — Linux/macOS : /tmp/DataFlowBuilder/Premier lancement
- L'écran d'accueil Mes flux s'affiche — vide au premier démarrage
- Cliquez sur + dans la barre latérale pour créer un flux
- L'éditeur s'ouvre sur un flux vierge nommé "Nouveau flux"
- Configurez le format, ajoutez des champs, cliquez Aperçu
- Sauvegarder pour conserver le flux
📐 Concepts fondamentaux
Comprendre la hiérarchie Flux → Sections → Champs est essentiel pour tirer le meilleur parti de Data Flow Builder.
Vue d'ensemble
Application
└── Dossiers (arborescence illimitée)
└── Flux (template de fichier)
├── Configuration (format, encodage, nb lignes…)
├── En-tête (0 ou 1 ligne fixe en début)
├── Données (1-N structures × numRows répétitions)
│ ├── Ligne A [champ1, champ2, …]
│ └── Ligne B [champ1, champ2, …]
└── Pied de page (0 ou 1 ligne fixe en fin)
Le Flux
Un flux est le concept central — un template de fichier de données.
| Paramètre | Valeurs possibles | Description |
|---|---|---|
| Format | csv · fixed · json · xml | Format du fichier de sortie |
| Délimiteur | , · ; · | · \t | Séparateur de champs (CSV) |
| Saut de ligne | CRLF · LF | Windows ou Unix |
| Encodage | UTF-8 · ISO-8859-1… | Encodage du fichier généré |
| Nombre de lignes | Entier ≥ 1 | Répétitions des lignes de données |
| Délimiteur final | true · false | Ajoute le délimiteur en fin de chaque ligne (CSV) |
Les Sections
En-tête (headerFields)
Générée une seule fois en début de fichier. Typiquement : enregistrement de contrôle, date de création, compteur de lignes.
Données (fields)
Contient une ou plusieurs structures de lignes, chacune répétée numRows fois.
Exemple — 2 structures, numRows = 3 :
[En-tête]
[Ligne A] ← répétition 1
[Ligne B] ← répétition 1
[Ligne A] ← répétition 2
[Ligne B] ← répétition 2
[Ligne A] ← répétition 3
[Ligne B] ← répétition 3
[Pied de page]
Pied de page (footerFields)
Générée une seule fois en fin de fichier. Utile pour les enregistrements de clôture ou les totaux.
Le Champ
Un champ produit une valeur par ligne générée. Il a un type de base et un sous-type.
| Propriété | Description |
|---|---|
| Nom | Libellé affiché dans l'interface |
| Type de base | alpha, num, date, bool, decimal |
| Sous-type | Spécialisation (email, NIR, SIRET, dateNaissance…) |
| Longueur | Taille maximale (troncature automatique) |
| Inclure dans la sortie | Si décoché : champ calculé mais non écrit dans le fichier |
Priorité de génération
1. Compteur de lignes (subType == "compteurLignes")
2. Concaténation (subType == "concat")
3. Incrément (num/none + increment == true)
4. Preset prédéfini (si useRandom == false)
5. Génération aléatoire (Faker FR + logique métier)
Les 4 onglets de l'éditeur
| Onglet | Contenu |
|---|---|
| ⚙️ Configuration | Format, délimiteur, encodage, nombre de lignes… |
| 📋 En-tête | Champs de la ligne d'en-tête |
| 📊 Données | Structures de lignes (multi-lignes supporté) |
| 📄 Pied de page | Champs du pied de page |
📋 Référence des types de champs
5 types de base, 30+ sous-types spécialisés pour les données françaises.
🔤 Alpha — Champs textuels
alpha / none — Texte libre
Génère une chaîne aléatoire ou applique la valeur par défaut si elle est renseignée.
| Paramètre | Valeurs | Défaut |
|---|---|---|
| Longueur | Entier | 10 |
| Valeur par défaut | Texte libre | "" |
| Padding | none · before · after · both | none |
| Caractère de padding | 1 caractère | " " |
alpha / email
Adresse e-mail réaliste via Faker FR. Format : [email protected]. Longueur défaut : 50.
alpha / phone / phonePlus33
Numéro FR national (0X XX XX XX XX, long. 14) ou international (+33 X XX XX XX XX, long. 15).
alpha / nom / prenom
Nom de famille ou prénom français (Faker FR). Longueur défaut : 30.
alpha / prenomNir ⚡
Prénom cohérent avec le genre du NIR de la même ligne. NIR 1… → masculin, 2… → féminin. Le lien vers le champ NIR source est configurable (voir Cohérence NIR).
alpha / civilite
| Paramètre | Valeurs |
|---|---|
| Catégorie | classiques · administratives · professionnelles |
| Format de sortie | code (M, Mme) · label (Monsieur, Madame) |
| Catégorie | Civilités |
|---|---|
classiques | M, Mme, Mlle |
administratives | M, Mme, Dr, Pr, Me, Fr, Sr, Père, Abbé, Rabbin, Imam |
professionnelles | Dr, Pr, Me, Ing, Dir, Pres, Chef |
alpha / civiliteNir ⚡
Civilité cohérente avec le genre du NIR. Mêmes paramètres que civilite. Le lien vers le champ NIR source est configurable (voir Cohérence NIR).
alpha / adresse / adresseComplete
adresse : numéro + rue (long. 100). adresseComplete : adresse complète sur une ligne (long. 200). adresseComplete peut être liée à un champ codePostal pour inclure automatiquement la commune et le code postal correspondants.
alpha / ville
Commune française via API geo.api.gouv.fr. Filtrable par préfixe de code postal (31*, 75*… ou * pour toutes les communes). Peut être liée à un champ codePostal de la même ligne pour garantir la cohérence commune/code postal (voir API Géographique).
alpha / lieuNaissance ⚡
Commune de naissance cohérente avec le département extrait du NIR (positions 5-6). Le champ NIR source est configurable.
alpha / codeApe
Code APE/NAF français. Format : XXXXZ (ex : 6201Z). Longueur défaut : 5.
alpha / iban
IBAN français. Format : FR76 XXXX XXXX XXXX XXXX XXXX XXX. Longueur défaut : 27.
alpha / concat — Concaténation
Assemble champs existants et textes libres dans un ordre défini. L'éditeur dédié permet d'ajouter des champs ou des textes libres et de les réordonner via les boutons ↑ ↓.
"concatItems": [
{ "type": "field", "fieldId": "abc123" },
{ "type": "text", "value": "_" },
{ "type": "field", "fieldId": "def456" }
]
🔢 Num — Champs numériques
num / none — Entier libre
Entier aléatoire ou incrémenté. Supporte padding (ex: 00001000).
| Paramètre | Défaut |
|---|---|
| Longueur | 10 |
| Incrément actif | false |
| Valeur de départ | 1 |
| Padding | none |
num / nir — NIR (Sécurité Sociale)
15 chiffres structurés selon les règles françaises. Voir Cohérence NIR pour les liaisons automatiques.
Position : 0 1-2 3-4 5-6 7-9 10-12 13-14
Contenu : Sexe Année Mois Dept Commune Ordre Clé
Exemple : 1 85 04 69 123 456 78
num / siret
SIRET français à 14 chiffres (SIREN 9 chiffres + NIC 5 chiffres).
num / codePostal / codeInsee
Code postal ou INSEE à 5 chiffres. Filtrable par département.
num / departement / departementNaissance ⚡
Département FR (01–95). departementNaissance extrait du NIR.
num / compteurLignes
Nombre total de lignes du fichier (en-tête + données × N + pied de page). Calculé avant la génération.
📅 Date
Formats disponibles
| Format | Exemple | Longueur |
|---|---|---|
DD/MM/YYYY | 15/04/1985 | 10 |
YYYY-MM-DD | 1985-04-15 | 10 |
YYYYMMDD | 19850415 | 8 |
DDMMYYYY | 15041985 | 8 |
timestamp | 482457600 | ~10 |
YYYYMMDDHHmmss | 19850415120000 | 14 |
DD/MM/YYYY HH:mm:ss | 15/04/1985 12:00:00 | 19 |
date / dateNaissance ⚡
Date cohérente avec l'année/mois du NIR. Tous les formats supportés. Le champ NIR source est configurable. Voir Cohérence NIR.
✅ Bool
| Sous-type | Valeur 1 | Valeur 2 | Long. | Notes |
|---|---|---|---|---|
none | Aléatoire parmi les valeurs du preset | 3 | Valeur par défaut configurable | |
ON | O | N | 1 | — |
OUINON | OUI | NON | 3 | — |
OKKO | OK | KO | 2 | — |
BINAIRE | 0 | 1 | 1 | — |
💰 Decimal
| Paramètre | Valeurs | Défaut |
|---|---|---|
| Séparateur décimal | . · , | . |
| Nombre de décimales | 0–10 | 2 |
| Padding | none · before · after · both | none |
⚙️ Configuration d'un champ
Référence complète de tous les paramètres JSON d'un champ, avec leurs valeurs par défaut.
Paramètres communs (tous types)
| Paramètre | Clé JSON | Type | Défaut |
|---|---|---|---|
| Nom | name | string | "" |
| Catégorie | category | string | "" |
| Type de base | type | enum | "alpha" |
| Sous-type | subType | string | "none" |
| Longueur | length | int | 10 |
| Inclure dans la sortie | includeInOutput | bool | true |
| Commentaire | comment | string | "" |
| ID (auto-généré) | id | string | — |
| Lien de cohérence | linkedFieldId | string | "" |
Exemple JSON complet
{
"id": "abc123",
"name": "Code client",
"category": "Identification",
"type": "num",
"subType": "none",
"length": 8,
"includeInOutput": true,
// Padding (alpha/none, num/none, decimal)
"padding": "before",
"paddingChar": "0",
// Valeur fixe / valeur par défaut
"defaultValue": "",
// Incrément (num/none uniquement)
"increment": true,
"incrementStart": 1000,
// Date
"format": "DD/MM/YYYY",
"todayDate": false,
"dateMinEnabled": true,
"dateMinToday": false,
"dateMinExclusive": false,
"dateMin": "01/01/2020",
"dateMaxEnabled": true,
"dateMaxToday": true,
"dateMaxExclusive": false,
"dateMax": "",
// Concaténation (alpha/concat)
"concatItems": [
{ "type": "field", "fieldId": "abc123" },
{ "type": "text", "value": "_" }
],
// Filtre géographique
"codePostalFilter": "31",
// Lien de cohérence (champs dépendants : ville, adresseComplete, civiliteNir, prenomNir,
// lieuNaissance, dateNaissance, departementNaissance)
// "" = auto (lie au premier champ source trouvé dans la ligne)
// "__none__" = indépendant (génère sans tenir compte des autres champs de la ligne)
// "" = lié au champ dont l'ID est
"linkedFieldId": "",
// Civilité
"civiliteCategorie": "classiques",
"civiliteOutput": "code",
// Décimal
"decimalSeparator": ",",
"decimalPlaces": 2,
"comment": "Identifiant numérique unique"
}
Tableau — Paramètres par type
| Paramètre | alpha/none | alpha/concat | alpha/civilite | num/none | num/nir | date | bool | decimal |
|---|---|---|---|---|---|---|---|---|
| Longueur | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Padding | ✅ | — | — | ✅ | — | — | — | ✅ |
| Valeur par défaut | ✅ | — | — | ✅ | — | ✅ | ✅ | — |
| Incrément | — | — | — | ✅ | — | — | — | — |
| Format / Bornes date | — | — | — | — | — | ✅ | — | — |
| Config civilité | — | — | ✅ | — | — | — | — | — |
| Filtre département | ville | — | — | postal/insee | — | — | — | — |
| Concat items | — | ✅ | — | — | — | — | — | — |
| Décimales | — | — | — | — | — | — | — | ✅ |
🔗 Cohérence NIR
Data Flow Builder gère automatiquement la cohérence entre un champ NIR et les champs qui en dépendent sur la même ligne.
Principe
num/nir ──► alpha/prenomNir (prénom selon le sexe)
├── alpha/civiliteNir (civilité selon le sexe)
├── date/dateNaissance (date extraite de l'année/mois)
├── num/departementNaissance (département extrait)
└── alpha/lieuNaissance (commune du département)
Structure du NIR
185046912345678
│ ││ ││ ││ ││ │
│ ││ ││ ││ │└──┘── Clé (positions 13-14)
│ ││ ││ ││ └─────── Ordre (positions 10-12)
│ ││ ││ │└───────── Commune (positions 7-9)
│ ││ ││ └─────────── Département (positions 5-6) → 69 = Rhône
│ ││ │└───────────── Mois de naissance (positions 3-4) → 04 = Avril
│ │└─────────────── Année (positions 1-2) → 85 → 1985
│ └───────────────── Sexe (position 0) → 1 = Masculin
└─────────────────── Exemple complet
Activation
Il suffit d'ajouter les deux types de champs dans la même ligne de données :
- Ajouter un champ
num / nir - Ajouter un ou plusieurs champs liés (
prenomNir,civiliteNir,dateNaissance…) - Le moteur de dépendances gère l'ordre automatiquement
Comportement par champ lié
| Champ | Logique |
|---|---|
alpha/prenomNir | NIR 1… → prénom masculin FR, NIR 2… → prénom féminin FR |
alpha/civiliteNir | NIR 1… → M/Monsieur, NIR 2… → Mme/Madame |
date/dateNaissance | Année et mois extraits du NIR, jour aléatoire 1–28 |
num/departementNaissance | Positions 5-6 du NIR directement |
alpha/lieuNaissance | Commune aléatoire du département extrait |
Exemple de ligne cohérente
NIR : 185046912345678
Civilité NIR : M
Prénom NIR : Jean
Date naissance : 15/04/1985 (mois=04, année=85→1985, jour aléatoire)
Département naiss: 69
Cas particuliers
| Situation | Comportement |
|---|---|
Pas de champ nir dans la ligne | Valeurs aléatoires non cohérentes |
Plusieurs champs nir dans la ligne | Par défaut, le premier dans l'ordre de génération est utilisé. Configurable via le lien de cohérence. |
| NIR invalide | Fallback sur génération aléatoire |
API indisponible (lieuNaissance) | Cache local ou 10 villes de fallback |
Contrôle des liaisons
Les champs dépendants (prenomNir, civiliteNir, dateNaissance, departementNaissance, lieuNaissance) disposent d'un paramètre Lien de cohérence qui contrôle le comportement de liaison.
Valeur linkedFieldId | Comportement | Cas d'usage |
|---|---|---|
"" (auto) | Se lie au premier champ nir trouvé dans la ligne (ordre de génération) | Cas standard, un seul NIR dans la ligne |
"__none__" (indépendant) | Génère sans consulter aucun champ NIR | Champ à générer indépendamment de tout NIR |
"<id>" (lié) | Se lie explicitement au champ dont l'ID est <id> | Plusieurs NIR dans la ligne — chaque dépendant pointe son propre NIR |
// Exemple : 2 NIR indépendants sur la même ligne
// Champ NIR 1 (id: "nir-titulaire")
{ "type": "num", "subType": "nir", "id": "nir-titulaire" }
// Prénom lié au NIR 1
{ "type": "alpha", "subType": "prenomNir", "linkedFieldId": "nir-titulaire" }
// Champ NIR 2 (id: "nir-conjoint")
{ "type": "num", "subType": "nir", "id": "nir-conjoint" }
// Prénom lié au NIR 2 — indépendant du premier
{ "type": "alpha", "subType": "prenomNir", "linkedFieldId": "nir-conjoint" }
ville peut être lié à un codePostal spécifique de la ligne via linkedFieldId.🗓️ Champs Date
Les champs de type date offrent un contrôle fin sur les formats de sortie, les bornes et le comportement dynamique.
Formats de sortie
| Clé | Exemple | Longueur | Placeholder saisie |
|---|---|---|---|
DD/MM/YYYY | 15/04/1985 | 10 | JJ/MM/AAAA |
YYYY-MM-DD | 1985-04-15 | 10 | AAAA-MM-JJ |
DD-MM-YYYY | 15-04-1985 | 10 | JJ-MM-AAAA |
MM/DD/YYYY | 04/15/1985 | 10 | MM/JJ/AAAA |
YYYYMMDD | 19850415 | 8 | AAAAMMJJ |
DDMMYYYY | 15041985 | 8 | JJMMAAAA |
timestamp | 482457600 | ~10 | — |
YYYYMMDDHHmmss | 19850415120000 | 14 | AAAAMMJJHHmmss |
DD/MM/YYYY HH:mm:ss | 15/04/1985 12:00:00 | 19 | JJ/MM/AAAA HH:mm:ss |
Paramètres de bornes
| Paramètre | Clé JSON | Défaut | Description |
|---|---|---|---|
| Date du jour | todayDate | false | Génère toujours la date d'exécution (ignore les bornes) |
| Borne min activée | dateMinEnabled | false | Active la contrainte minimale |
| Borne min = aujourd'hui | dateMinToday | false | Borne dynamique = date du jour |
| Borne min exclusive | dateMinExclusive | false | > au lieu de >= |
| Borne min (valeur) | dateMin | "" | Date fixe dans le format choisi |
| Borne max activée | dateMaxEnabled | false | Active la contrainte maximale |
| Borne max = aujourd'hui | dateMaxToday | false | Borne dynamique = date du jour |
| Borne max exclusive | dateMaxExclusive | false | < au lieu de <= |
| Borne max (valeur) | dateMax | "" | Date fixe dans le format choisi |
Exemples de configuration
Dates sur les 12 derniers mois
{
"dateMinEnabled": true,
"dateMin": "01/04/2024", // il y a 12 mois
"dateMaxEnabled": true,
"dateMaxToday": true // borne max = aujourd'hui
}
Dates dans le futur (strictement)
{
"dateMinEnabled": true,
"dateMinToday": true,
"dateMinExclusive": true // strictement > aujourd'hui
}
Date fixe (toujours identique)
{
"todayDate": false,
"defaultValue": "01/01/2024"
}
Date de naissance NIR
Le sous-type dateNaissance extrait l'année et le mois du NIR de la même ligne :
- Année : positions 1-2 du NIR. Valeur ≥ 30 →
19XX, valeur < 30 →20XX - Mois : positions 3-4 du NIR (01–12)
- Jour : aléatoire entre 1 et 28 (garantit la validité pour tous les mois)
🔢 Presets de valeurs
Les presets permettent de définir une liste de valeurs prédéfinies pour un champ. Le générateur pioche aléatoirement dans cette liste.
Modes de fonctionnement
| Mode | Comportement |
|---|---|
| Valeurs aléatoires (défaut) | Le preset est ignoré, génération normale |
| Valeurs prédéfinies | Tirage aléatoire uniforme dans la liste |
Accès
Dans l'éditeur de champ, cliquez sur le bouton "Presets" (🎲). Une fenêtre de dialogue s'ouvre.
Distribution pondérée
Chaque entrée a une probabilité égale d'être tirée. Pour simuler une distribution pondérée, dupliquez les entrées :
Cible : 75% ACTIF, 25% INACTIF
→ Ajouter :
ACTIF (entrée 1)
ACTIF (entrée 2)
ACTIF (entrée 3)
INACTIF (entrée 4)
Cas d'usage typiques
| Champ | Valeurs de preset utiles |
|---|---|
| Type d'enregistrement | 01, 02, 99 |
| Statut | ACTIF, INACTIF, EN_ATTENTE |
| Code pays | FR, BE, CH, LU |
| Code devise | EUR, USD, GBP |
| Centre de coût | CC001, CC002, CC003 |
Format JSON
"presets": {
"field-id-abc123": {
"useRandom": false,
"values": [
{ "value": "ACTIF", "comment": "Salarié actif", "isDefault": true },
{ "value": "INACTIF", "comment": "Salarié inactif", "isDefault": false },
{ "value": "SUSPENDU", "comment": "Compte suspendu", "isDefault": false }
]
}
}
📁 Gestion des dossiers
Organisez vos flux en arborescence de dossiers (profondeur illimitée) depuis la barre latérale gauche.
Structure de l'arbre
📁 Tous les flux ← Vue globale
📥 Sans dossier ← Flux non classés
📁 RH
📁 Paie
📁 Formation
📁 Finance
📁 Clients
Actions disponibles
| Action | Description |
|---|---|
| Nouveau dossier | Créé à la racine ou sous un dossier existant |
| Renommer | Modifier le nom du dossier courant |
| Sous-dossier | Créer un enfant du dossier courant |
| Supprimer | Supprime le dossier + sous-dossiers ; les flux vont à la racine |
Déplacer un flux
Menu déroulant : sur la carte flux, ouvrez "Déplacer…" et sélectionnez le dossier cible.
Drag & drop : maintenez le clic sur l'icône ⠿ et déposez dans la barre latérale.
Format de stockage JSON
[
{
"id": "1712345678.123",
"name": "RH",
"parentId": null,
"created": "2024-04-05 10:00:00"
},
{
"id": "1712345699.456",
"name": "Paie",
"parentId": "1712345678.123",
"created": "2024-04-05 10:05:00"
}
]
🌍 API Géographique
Les communes françaises sont chargées depuis l'API officielle du gouvernement, avec cache local et fallback offline.
Source
https://geo.api.gouv.fr/communes
API gratuite, sans authentification, maintenue par Etalab.
Stratégie de chargement
Premier lancement : API gov ──► Cache JSON ──► Application
Lancements suivants: Cache JSON ──────────────► Application
API indisponible : Fallback (10 villes) ─────► Application
Communes de fallback
| Commune | Département |
|---|---|
| Paris | 75 |
| Marseille | 13 |
| Lyon | 69 |
| Toulouse | 31 |
| Nice | 06 |
| Nantes | 44 |
| Bordeaux | 33 |
| Lille | 59 |
| Rennes | 35 |
| Strasbourg | 67 |
Filtrage par code postal
Le paramètre codePostalFilter filtre les codes postaux avec support des wildcards :
| Valeur | Effet |
|---|---|
* | Toutes les communes françaises (aucun filtre) |
31* | Codes commençant par 31 → Haute-Garonne |
75* | Codes commençant par 75 → Paris |
97* | Codes commençant par 97 → DOM-TOM |
*10* | Codes contenant 10 |
*25 | Codes se terminant par 25 |
33000 | Correspondance exacte (code postal précis) |
31* pour la Haute-Garonne), pas sur les codes de département. La syntaxe supporte les wildcards * en préfixe, suffixe ou les deux.Cohérence ville / code postal
Les champs ville et adresseComplete peuvent être liés à un champ codePostal de la même ligne pour garantir la cohérence entre les deux valeurs.
Valeur linkedFieldId | Comportement |
|---|---|
"" (auto) | Se lie au premier codePostal de la ligne, puis utilise son filtre département propre |
"__none__" (indépendant) | Ignore les champs codePostal présents — utilise uniquement son propre filtre |
"<id>" (lié) | Se synchronise avec le code postal dont l'ID est <id> |
linkedFieldId explicite, si plusieurs champs codePostal coexistent dans la ligne avec des filtres différents, le dernier trouvé peut prendre le dessus. Préférez un lien explicite dans ce cas.Résolution de problèmes
| Problème | Solution |
|---|---|
| Toujours les mêmes 10 villes | API indisponible au premier lancement — vérifier la connexion et supprimer le cache |
| Supprimer le cache | Effacer {appdir}/data/communes_cache.json et redémarrer |
📦 Import / Export JSON
Les flux peuvent être exportés en JSON et partagés entre utilisateurs ou machines. Le fichier contient la définition complète, pas les données générées.
Exporter
Depuis la vue d'accueil : icône ⬇ sur la carte du flux → choisir l'emplacement.
Importer
Vue d'accueil → Importer → sélectionner un .json. Si vous êtes dans un dossier spécifique, le flux est automatiquement affecté à ce dossier.
Format JSON complet
{
// Métadonnées
"id": "1712345678.123",
"name": "Flux salarié mensuel",
"description": "Fichier RH recette Paie",
"folderId": null,
"format": "csv",
"delimiter": ";",
"lineEnding": "CRLF",
"encoding": "UTF-8",
"hasHeader": true,
"numRows": 500,
"trailingDelimiter": false,
// En-tête
"headerFields": [ /* tableau de champs */ ],
// Lignes de données
"fields": [
{
"id": "line-001",
"name": "Ligne salarié",
"fields": [
{
"id": "fld-nir",
"name": "NIR",
"type": "num",
"subType": "nir",
"length": 15,
"includeInOutput": true,
"category": "Identité"
},
{
"id": "fld-prenom",
"name": "Prénom",
"type": "alpha",
"subType": "prenomNir",
"length": 30,
"includeInOutput": true,
"linkedFieldId": "fld-nir" // lié explicitement au NIR ci-dessus
},
{
"id": "fld-statut",
"name": "Statut",
"type": "alpha",
"subType": "none",
"length": 10,
"defaultValue": "ACTIF",
"includeInOutput": true
}
]
}
],
// Pied de page
"footerFields": [ /* tableau de champs */ ],
// Presets
"presets": {
"fld-statut": {
"useRandom": false,
"values": [
{ "value": "ACTIF", "comment": "", "isDefault": true },
{ "value": "INACTIF", "comment": "", "isDefault": false }
]
}
}
}
🔧 CI/CD & Build
Le projet utilise GitHub Actions pour l'intégration continue, la compilation multi-plateforme et la publication des releases.
Workflows GitHub Actions
| Workflow | Déclencheur | Description |
|---|---|---|
ci.yml | Push / PR | Tests, lint, coverage |
build.yml | Release | Compilation Flet multi-OS |
release.yml | Tag v* | Publication GitHub Release |
dependabot.yml | Hebdomadaire | Mises à jour de dépendances |
dependency-review.yml | PR | Audit CVE des dépendances |
Build multi-plateforme
| Plateforme | Runner | Artefact |
|---|---|---|
| Windows 64-bit | windows-latest | DataFlowBuilder-windows |
| macOS Apple Silicon | macos-latest | DataFlowBuilder-macos |
| Linux 64-bit | ubuntu-latest | DataFlowBuilder-linux |
Outils qualité
Ruff (Linter + Formatter)
ruff check . # Vérifier
ruff check --fix . # Corriger auto
ruff format . # Formater
Bandit (Sécurité)
bandit -r src/
Tests & Coverage
pytest --cov=src --cov-report=term-missing
Build local
pip install -e ".[dev]"
flet build windows/linux ou macos
./dist/DataFlowBuilder
Conventional Commits
feat: ajouter le type de champ SIRET
fix: corriger le padding "both" pour longueurs impaires
docs: mettre à jour la documentation NIR
chore: bumper Faker à 25.0.0
❓ FAQ
Réponses aux questions les plus fréquentes.
Installation & Démarrage
L'application ne démarre pas après python main.py
python --version # Doit afficher 3.11+
pip install -e . # Réinstaller les dépendances
Où sont stockées mes données ?
Windows : %TEMP%\DataFlowBuilder\ — Linux/macOS : /tmp/DataFlowBuilder/
Flux et dossiers
Comment dupliquer un flux ?
Exportez-le en JSON (⬇ sur la carte), puis ré-importez-le. Un nouvel ID lui est attribué automatiquement.
J'ai supprimé un flux par erreur. Récupérable ?
Si je supprime un dossier, mes flux sont-ils supprimés ?
Non. Les flux sont déplacés à la racine. Seul le dossier est supprimé.
Champs et types
Différence entre civilite et civiliteNir ?
civilite : aléatoire dans la catégorie choisie. civiliteNir : cohérente avec le genre du NIR de la même ligne.
J'ai deux champs NIR (ou deux champs code postal) dans la même ligne — comment contrôler les liaisons ?
Les champs dépendants (prenomNir, civiliteNir, ville…) exposent un paramètre Lien de cohérence dans leur panneau d'édition. Trois modes sont disponibles :
- Auto : se lie au premier champ source trouvé dans la ligne (comportement par défaut)
- Indépendant : génère la valeur sans tenir compte des autres champs de la ligne
- → Nom du champ : lié explicitement à un champ source précis
Voir Cohérence NIR pour les détails.
Comment générer un entier auto-incrémenté démarrant à 1000 ?
- Type :
num, sous-type :none - Cochez "Incrément"
- Valeur de départ :
1000 - Longueur :
8, padding :before, char :0→00001000
Comment forcer une valeur fixe ?
Type alpha/none, renseignez la valeur par défaut. Toujours retournée sauf preset actif.
Comment avoir 70% de "ACTIF" et 30% de "INACTIF" ?
Presets : activez "Valeurs prédéfinies", ajoutez ACTIF ×7 et INACTIF ×3.
Données géographiques
L'application génère toujours les mêmes 10 villes
L'API n'a pas été contactée au premier lancement. Vérifiez la connexion internet, supprimez communes_cache.json et redémarrez.
Génération et export
Différence entre "Aperçu" et "Exporter" ?
Aperçu : génère quelques lignes dans l'interface (sans créer de fichier). Exporter : génère le fichier complet sur disque.
Générer un fichier positionnel (largeur fixe)
- Format :
fixed - Chaque champ avec sa longueur exacte
- Champs texte : padding
after, char espace - Champs numériques : padding
before, char0
Développement
Comment ajouter un nouveau type de champ ?
- Ajouter l'entrée dans
FIELD_SUBTYPESdansfield_types.py - Configurer
SUBTYPE_CONFIG(extra_fields, defaults) - Implémenter la logique dans
data_generator.py - Ajouter les tests dans
tests/test_data_generator.py
✅ Vérification de conformité
Contrôlez qu'un fichier de données réel respecte exactement le mapping d'un flux — encodage, délimiteur, nombre de champs, longueurs, types, formats et cohérence des sous-types.
Principe
La vérification de conformité compare un fichier existant (CSV, positionnel, JSON ou XML) au flux actuellement ouvert dans l'éditeur. Elle produit un rapport détaillé listant chaque écart, classé par sévérité.
Accéder au vérificateur
- Ouvrez un flux dans l'éditeur.
- Cliquez sur le bouton Vérifier la conformité (icône
✅) dans la barre d'actions. - Le dialogue de conformité s'ouvre par-dessus l'éditeur.
Utilisation du dialogue
- Cliquez Parcourir… pour sélectionner le fichier à analyser.
- Cliquez Lancer l'analyse — un indicateur de progression s'affiche pendant l'analyse.
- Les résultats apparaissent groupés par sévérité, repliables/dépliables.
- Utilisez les filtres (Erreurs / Avertissements / Infos) pour cibler un type d'écart.
- Cliquez Exporter le rapport pour sauvegarder un compte-rendu texte (
.txt).
Niveaux de sévérité
| Niveau | Icône | Signification |
|---|---|---|
| error | ❌ | Écart bloquant — le fichier ne respecte pas le mapping (encodage incorrect, type invalide, format de date non conforme…) |
| warning | ⚠️ | Anomalie probable — le fichier est lisible mais un champ présente un format suspect (SIRET avec clé Luhn invalide, numéro de téléphone mal formé…) |
| info | ℹ️ | Contrôle réussi — confirmation qu'un point structurel est conforme (encodage OK, fins de ligne OK…) |
Le rapport est marqué CONFORME (✅) uniquement si aucune erreur n'est détectée. Les avertissements n'empêchent pas la conformité.
Contrôles effectués
1. Encodage
Le fichier est décodé selon l'encodage déclaré dans le flux. Si ce décodage échoue, l'outil tente automatiquement utf-8-sig, iso-8859-1, windows-1252 et utf-16, puis signale l'encodage détecté en erreur.
2. Structure (JSON / XML)
Pour les formats json et xml, le contenu est parsé — toute erreur de syntaxe est reportée en erreur.
3. Fins de ligne
Comparaison du saut de ligne observé (CRLF, LF, CR ou mixte) avec la valeur déclarée dans le flux. Un écart génère un avertissement.
4. Délimiteur
Présence du caractère délimiteur déclaré dans au moins une ligne du fichier. L'absence génère une erreur.
5. En-tête et pied de page
Vérification de la cohérence entre la présence d'en-tête / pied de page déclarée dans le flux et le contenu effectif du fichier (nombre de colonnes de la première / dernière ligne).
6. Nombre de champs par ligne
Chaque ligne de données est découpée selon le délimiteur et le nombre de colonnes est comparé au nombre de champs includeInOutput déclarés. Un écart génère une erreur.
7. Longueur des champs
La valeur de chaque colonne est comparée à la longueur maximale déclarée dans le mapping. Un dépassement génère une erreur.
8. Cohérence de type
| Type déclaré | Contrôle |
|---|---|
num | La valeur ne doit contenir que des chiffres (hors espaces). |
decimal | La valeur doit être convertible en nombre flottant avec le séparateur décimal configuré (. ou ,). |
bool | La valeur doit appartenir à l'ensemble attendu selon le sous-type (O/N, OUI/NON, OK/KO, 0/1). |
date | La valeur doit correspondre exactement au format de date déclaré (ex. DD/MM/YYYY). |
9. Cohérence du sous-type
| Sous-type | Validation | Sévérité |
|---|---|---|
email | Regex x@y.z | warning |
siret | 14 chiffres + clé de contrôle Luhn | warning |
nir | 15 chiffres exacts | warning |
iban | Format CC99… (pays 2 lettres + 2 chiffres + alphanumérique) | warning |
codeApe | 4 chiffres + 1 lettre majuscule (ex. 6201Z) | warning |
codePostal | Exactement 5 chiffres | warning |
codeInsee | Exactement 5 chiffres | warning |
phone | Numéro FR national (0X… ou +33…) | warning |
phonePlus33 | Numéro FR international (+33…) | warning |
Limite d'analyse
Pour des raisons de performance, le détail des contrôles par champ (longueur, type, sous-type) est appliqué aux 1 000 premières lignes de données au maximum. Les contrôles globaux (encodage, délimiteur, fins de ligne) portent toujours sur la totalité du fichier.
Rapport exporté
Le bouton Exporter le rapport sauvegarde un fichier conformite_<nom_du_flux>.txt contenant :
- En-tête : nom du flux, chemin du fichier, date d'analyse.
- Résumé technique : résultat de chaque contrôle global sur une ligne.
- Bilan : verdict (CONFORME / NON CONFORME), compteurs erreurs / avertissements / infos, durée, nombre de lignes.
- Détail des écarts : groupés par sévérité, avec localisation (ligne, champ), catégorie, valeur attendue et valeur observée.
════════════════════════════════════════════════════════════════════════
RAPPORT DE CONFORMITÉ – DATA FLOW BUILDER
════════════════════════════════════════════════════════════════════════
Flux : Flux salarié
Fichier : /home/user/salaries_mars.csv
Date : 15/03/2026 à 14:32:07
────────────────────────────────────────────────────────────────────────
Encodage : UTF-8 ✓
Fins de ligne : CRLF ✓
Délimiteur : ; ✓
────────────────────────────────────────────────────────────────────────
✅ CONFORME ❌ 0 erreur(s) ⚠️ 2 avert. ℹ️ 3 info(s) ⏱ 0.12 s 📄 500 ligne(s)
════════════════════════════════════════════════════════════════════════
⚠️ AVERTISSEMENTS (2)
────────────────────────────────────────────────────────────────────────
Ligne 47 | SIRET [Sous-type (siret)] 'SIRET' : le SIRET '12345678900000' échoue à la clé Luhn.
Attendu : clé Luhn valide → Observé : 12345678900000
Architecture
| Fichier | Rôle |
|---|---|
core/compliance_checker.py | Moteur de vérification — classes ComplianceChecker, ComplianceReport, CheckResult |
ui/compliance_ui.py | Dialogue Flet — sélection de fichier, progression, affichage filtrable, export |