Skip to content

[EPIC] Correctifs court-terme à appliquer aux checks portant sur id_pdc_itinerance #74

Description

@thbar

cc @vdegove en particulier car ça nous concerne dès etalab/transport-site#5343, et @stephane-pignal @AurelienC également.

La spécification technique actuelle (v2.3.1) de id_pdc_itinerance est la suivante, et présente des soucis qu'il va être temps de traiter.

{
"name": "id_pdc_itinerance",
"description": "L'identifiant du point de recharge délivré selon les modalités définies à l'article 10 du décret n° 2017-26 du 12 janvier 2017. Cet ID débute par FR suivi de 3 caractères délivrés par l'AFIREV, suivi de \"E\" pour l'équivalent du point de recharge en anglais EVSE - Electric Vehicule Supply Equipment (https://afirev.fr/fr/informations-generales/). Ne pas mettre de séparateur * ou -. Si le point de recharge n'est pas en itinérance, merci d'indiquer \"Non concerné\".",
"example": "FRA68E680210015",
"type": "string",
"constraints": {
"required": true,
"pattern": "(?:(?:^|,)(^[A-Z]{2}[A-Z0-9]{4,33}$|Non concerné))+$"
}
},

1. Pas de contrainte d'unicité sur id_pdc_itinerance

Chaque ligne des fichiers représentant exactement 1 "pdc", id_pdc_itinerance est réputé unique (si on met de côté les Non concernés).

Or rien ne contraint cette unicité dans la spécification technique TableSchema actuellement (voir plus haut).

Je pense que l'explication est peut-être liée à ce que je perçois comme quelque chose de difficile à exprimer correctement avec TableSchema:

  • il est un peu difficile en pratique de mettre en place dans TableSchema une contrainte d'unicité "sauf pour certaines lignes".
  • en temps normal (= si on n'avait pas de "Non concerné"s), il suffirait d'ajouter "primaryKey": "id_pdc_itinerance" au JSON, et ça serait réglé (voir https://specs.frictionlessdata.io/table-schema/#primary-key)
  • on ne peut pas directement dire "sauf si c'est égal à Non concerné
  • on peut tenter de contourner en mettant required: false sur id_pdc_itinerance, mais il faut alors considérer Non concerné comme une valeur manquante, et les déclarer dans missingValues (
    "missingValues": [
    ""
    ]
    )
  • toutefois si on fait ça, missingValues s'applique à tous les champs... et on peut donc avoir "Non concerné" n'importe où, et on devrait le considérer comme une valeur manquante, ce qui est un peu bancal

Ce n'est pas un problème théorique: certains fichiers v2 (un nombre limité actuellement) publiés sur data.gouv contiennent plusieurs lignes pour le même id_pdc_itinerance, et sont donc considérés techniquement comme valides, alors qu'ils sont fondamentalement (pour le coup, dès la clé primaire) invalides.

Donc à voir si on arrive à exprimer ça correctement dans le schéma, ou si ça doit être un custom check en amont chez nous.

2. Reste historique dans la regexp

Si on regarde bien le pattern: (?:(?:^|,)(^[A-Z]{2}[A-Z0-9]{4,33}$|Non concerné))+$, je pense qu'il y a un reste de copié-collé dedans. Ça fait croire qu'il y aurait la possibilité de séparer plusieurs identifiants par des virgules au sein d'une seule cellule, mais ça ne l'autorise pas vraiment non plus.

On pourrait nettoyer cette regexp pour y voir plus clair, à vérifier, par exemple:

^(?:[A-Z]{2}[A-Z0-9]{4,33}|Non concerné)$

3. Durcissement de la regexp

Voir #24 et autres échanges : je ne pense pas que la regexp soit nickel par ailleurs, on ferait bien avant d'élargir ou d'être tentés de s'en inspirer ailleurs (#73) de la mettre au propre.

En vérifiant bien sûr le "taux de casse".

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions