From df527d605380881f197efd358a7f4298f6fb8449 Mon Sep 17 00:00:00 2001 From: Pierre Camilleri <22995923+pierrecamilleri@users.noreply.github.com> Date: Fri, 23 Aug 2024 09:53:26 +0200 Subject: [PATCH 1/6] update fixtures with new simplified report format squash! update fixtures with new simplified report format squash! update fixtures with new simplified report format --- .../test/fixtures/validata_unknown_custom_check_error.json | 2 +- apps/shared/test/fixtures/validata_with_errors.json | 2 +- apps/shared/test/fixtures/validata_with_file_error.json | 2 +- apps/shared/test/fixtures/validata_with_no_errors.json | 2 +- .../shared/test/fixtures/validata_with_opening_hours_error.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/shared/test/fixtures/validata_unknown_custom_check_error.json b/apps/shared/test/fixtures/validata_unknown_custom_check_error.json index 3da547c9d9..c97252c8f1 100644 --- a/apps/shared/test/fixtures/validata_unknown_custom_check_error.json +++ b/apps/shared/test/fixtures/validata_unknown_custom_check_error.json @@ -1 +1 @@ -{"_meta":{"args":{"schema":"https:\/\/schema.data.gouv.fr\/schemas\/etalab\/schema-stationnement-cyclable\/1.1.2\/schema.json","url":"https:\/\/static.data.gouv.fr\/resources\/stationnement-cyclable-communaute-lesneven-cote-des-legendes\/20220617-135734\/data.csv"},"validata-table-version":"0.6.1","validata-core-version":"0.8.4"},"report":{"date":"2022-06-20T07:49:33.810216+00:00","errors":[],"stats":{"errors":0,"tasks":1},"tasks":[{"errors":[{"code":"check-error","description":"Provided check is not valid","message":"Check is not valid: 'french_gps_coordinates': custom check inconnu.","name":"Check Error","note":"'french_gps_coordinates': custom check inconnu.","tags":[]}],"partial":false,"resource":{"data":[["id_local","id_osm","code_com","coordonneesxy","capacite","capacite_cargo","type_accroche","mobilier","acces","gratuit","protection","couverture","surveillance","lumiere","url_info","d_service","source","proprietaire","gestionnaire","date_maj","commentaires"],["291240012","","29124","[-4.326557440419178,48.57543459297002]","1","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240013","","29124","[-4.320793564175779,48.57137499642261]","2","0","CADRE ET ROUE","ARCEAU","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240014","","29124","[-4.324479664084158,48.571912884065696]","1","0","CADRE ET ROUE","ARCEAU","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240015","","29124","[-4.326219820336316,48.57384450751532]","2","0","CADRE ET ROUE","POTELET","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240005","","29124","[-4.323463931829632,48.56982053323818]","5","0","CADRE","ARCEAU","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240017","","29124","[-4.317963501452376,48.56938485531128]","3","0","CADRE","POTELET","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240018","","29124","[-4.323496945023761,48.57204268965947]","1","0","CADRE","POTELET","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["290910001","","29091","[-4.366835514083503,48.64471628330647]","3","0","CADRE","ARCEAU VELO GRANDE TAILLE","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Kerlouan","Commune de Kerlouan","2022-01-19",""],["290910002","","29091","[-4.365690945162477,48.64435858670584]","2","0","CADRE","ARCEAU VELO GRANDE TAILLE","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Kerlouan","Commune de Kerlouan","2022-01-19",""],["291240036","","29124","[-4.323445500311107,48.572282934843116]","1","0","CADRE","POTELET","LIBRE ACCES","1","STATIONNEMENT NON FERME","1","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240011","","29124","[-4.325482904762988,48.57471918866126]","1","0","ROUE","RATELIER","LIBRE ACCES","0","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291790001","","29179","[-4.3122974879696825,48.537997908315695]","5","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","1","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Ploudaniel","Commune de Ploudaniel","2022-01-19",""],["291240019","","29124","[-4.3243540641685785,48.56943684915794]","100","0","ROUE","RACK DOUBLE ETAGE","PRIVE","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240020","","29124","[-4.321142090041301,48.56661591170906]","46","0","ROUE","RACK DOUBLE ETAGE","PRIVE","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["290550003","","29055","[-4.340491642313593,48.56297797846798]","9","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","1","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Le Folgo\u00ebt","Commune de Le Folgo\u00ebt","2022-01-19",""],["290640001","","29064","[-4.300952232819954,48.62826913191116]","2","0","CADRE","POTELET","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Goulven","Commune de Goulven","2022-01-19",""],["291240001","","29124","[-4.329993339564118,48.57321900694641]","20","0","CADRE","ARCEAU","PRIVE","1","STATIONNEMENT NON FERME","1","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240021","","29124","[-4.32609978527407,48.57169079772248]","1","0","CADRE","POTELET","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240023","","29124","[-4.333295985690998,48.5731025885169]","24","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291000001","","29100","[-4.388568315625117,48.551185167291976]","9","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lanarvily","Commune de Lanarvily","2022-01-19",""],["290210001","","29021","[-4.318745558771385,48.65060718200974]","5","0","CADRE ET ROUE","ARCEAU","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Ploun\u00e9our-Brignogan-Plages","Commune de Ploun\u00e9our-Brignogan-Plages","2022-01-19",""],["291240022","","29124","[-4.326176938887817,48.571602362724924]","1","0","CADRE","POTELET","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240024","","29124","[-4.323784420064722,48.57256271734865]","6","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240025","","29124","[-4.322079775833422,48.57194687355232]","1","0","CADRE ET ROUE","POTELET","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240026","","29124","[-4.321838176904464,48.567531914708105]","6","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240006","","29124","[-4.322982821613547,48.56941083446146]","3","0","CADRE ET ROUE","ARCEAU","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240044","","29124","[-4.322222891947828,48.56927679387654]","12","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240007","","29124","[-4.322174219414593,48.56950856745243]","6","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","1","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240008","","29124","[-4.322796298740558,48.56962610425439]","3","0","CADRE","ARCEAU","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240009","","29124","[-4.31674006395042,48.563569653779275]","5","0","ROUE","RACK DOUBLE ETAGE","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["290550006","","29055","[-4.33954088262673,48.559091330385904]","3","0","CADRE","ARCEAU","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Le Folgo\u00ebt","Commune de Le Folgo\u00ebt","2022-01-19",""],["291240002","","29124","[-4.327001929728497,48.57469239102802]","6","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["290550007","","29055","[-4.3383719120174655,48.56001861859113]","3","0","CADRE","ARCEAU","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Le Folgo\u00ebt","Commune de Le Folgo\u00ebt","2022-01-19",""],["290770001","","29077","[-4.4111072789402535,48.63351833826813]","6","0","ROUE","RATELIER","LIBRE ACCES","0","STATIONNEMENT NON FERME","1","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Guiss\u00e9ny","Commune de Guiss\u00e9ny","2022-01-19",""],["290930002","","29093","[-4.4200795401589605,48.570489222069924]","6","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","1","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Kernilis","Commune de Kernilis","2022-01-19",""],["291980002","","29198","[-4.301036097711556,48.60890404509101]","7","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Plouider","Commune de Plouider","2022-01-19",""],["291240031","","29124","[-4.3272279290452484,48.57461641072911]","1","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["290940001","","29094","[-4.34700780144054,48.591985427009696]","1","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Kernou\u00ebs","Commune de Kernou\u00ebs","2022-01-19",""],["290910003","","29091","[-4.364417837932707,48.644061740487814]","4","0","CADRE","ARCEAU","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Kerlouan","Commune de Kerlouan","2022-01-19",""],["291240032","","29124","[-4.321848034460905,48.567399366484004]","12","0","ROUE","RACK DOUBLE ETAGE","PRIVE","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240033","","29124","[-4.322197113818355,48.572340577130284]","1","0","CADRE","POTELET","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240016","","29124","[-4.323793017716665,48.571736126391535]","1","0","CADRE","POTELET","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240010","","29124","[-4.330237583630323,48.57422563715874]","1","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["290210004","","29021","[-4.326506392943482,48.66415012005106]","1","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Ploun\u00e9our-Brignogan-Plages","Commune de Ploun\u00e9our-Brignogan-Plages","2022-01-19",""],["291240037","","29124","[-4.316461708498365,48.575159018224134]","1","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","1","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291980003","","29198","[-4.298899099230763,48.6084294738248]","3","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","1","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Plouider","Commune de Plouider","2022-01-19",""],["291240003","","29124","[-4.322628361183557,48.572211457104295]","1","0","CADRE","POTELET","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["292550001","","29255","[-4.262198373075445,48.56185422923485]","4","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Saint-M\u00e9en","Commune de Saint-M\u00e9en","2022-01-19",""],["291240004","","29124","[-4.321421066897058,48.57632805048933]","4","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["290210005","","29021","[-4.319033590016463,48.650537283672435]","5","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Ploun\u00e9our-Brignogan-Plages","Commune de Ploun\u00e9our-Brignogan-Plages","2022-01-19",""],["290210006","","29021","[-4.329664592326754,48.645549604309174]","5","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Ploun\u00e9our-Brignogan-Plages","Commune de Ploun\u00e9our-Brignogan-Plages","2022-01-19",""],["291240038","","29124","[-4.324019878232437,48.57243787879477]","1","0","CADRE","POTELET","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["290930003","","29093","[-4.41847370900885,48.571850087773775]","15","0","ROUE","RATELIER","PRIVE","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Kernilis","Commune de Kernilis","2022-01-19",""],["291240034","","29124","[-4.323323338509079,48.57033535682686]","6","0","CADRE","ARCEAU","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240035","","29124","[-4.327102709146094,48.57466995385075]","1","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["290550008","","29055","[-4.3457561881155815,48.56443342642228]","2","0","CADRE","ARCEAU","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Le Folgo\u00ebt","Commune de Le Folgo\u00ebt","2022-01-19",""],["291790002","","29179","[-4.312730309523214,48.536892071207795]","4","0","CADRE","POTELET","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Ploudaniel","Commune de Ploudaniel","2022-01-19",""],["291980004","","29198","[-4.297443411781701,48.60865600373606]","3","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Plouider","Commune de Plouider","2022-01-19",""],["291980001","","29198","[-4.297857710006748,48.608290347512124]","6","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Plouider","Commune de Plouider","2022-01-19",""],["291240039","","29124","[-4.323539639172734,48.57252988671575]","1","0","CADRE","POTELET","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240040","","29124","[-4.326766483402235,48.570195370912]","6","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240041","","29124","[-4.32628807775832,48.569386217758186]","6","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["290550004","","29055","[-4.335685552713981,48.56341880217778]","5","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Le Folgo\u00ebt","Commune de Le Folgo\u00ebt","2022-01-19",""],["290550005","","29055","[-4.334330021056963,48.56208047241958]","1","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Le Folgo\u00ebt","Commune de Le Folgo\u00ebt","2022-01-19",""],["291240027","","29124","[-4.316657216272915,48.573694643515935]","5","0","CADRE","ARCEAU","LIBRE ACCES","1","STATIONNEMENT NON FERME","1","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240028","","29124","[-4.317418984064542,48.57385445042287]","5","0","CADRE","ARCEAU","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240029","","29124","[-4.322153045806157,48.57121140132552]","1","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240042","","29124","[-4.317979845227847,48.57171283697216]","1","0","CADRE","ARCEAU","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["291240043","","29124","[-4.317950790407485,48.572369288038495]","6","0","CADRE","ARCEAU","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["290210002","","29021","[-4.326237601560965,48.664002558308994]","1","0","ROUE","RATELIER","LIBRE ACCES","0","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Ploun\u00e9our-Brignogan-Plages","Commune de Ploun\u00e9our-Brignogan-Plages","2022-01-19",""],["290550001","","29055","[-4.33429095522588,48.567915517396216]","1","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Le Folgo\u00ebt","Commune de Le Folgo\u00ebt","2022-01-19",""],["290640002","","29064","[-4.301566972212209,48.62879850106928]","1","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Goulven","Commune de Goulven","2022-01-19",""],["290930001","","29093","[-4.414252455921004,48.57409260927002]","1","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Kernilis","Commune de Kernilis","2022-01-19",""],["290210003","","29021","[-4.33003262382782,48.64544815929809]","1","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Ploun\u00e9our-Brignogan-Plages","Commune de Ploun\u00e9our-Brignogan-Plages","2022-01-19",""],["291240030","","29124","[-4.323044153804177,48.5729984239538]","1","0","CADRE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","1","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Lesneven","Commune de Lesneven","2022-01-19",""],["290550002","","29055","[-4.332734378783083,48.56824689374016]","2","0","ROUE","RATELIER","LIBRE ACCES","1","STATIONNEMENT NON FERME","0","0","0","","","Communaut\u00e9 Lesneven C\u00f4te des L\u00e9gendes","Commune de Le Folgo\u00ebt","Commune de Le Folgo\u00ebt","2022-01-19",""]],"format":"inline","hashing":"md5","layout":{"limitRows":100000},"name":"memory","profile":"tabular-data-resource","schema":{"$schema":"https:\/\/specs.frictionlessdata.io\/schemas\/table-schema.json","contributors":[{"email":"contact@transport.beta.gouv.fr","organisation":"transport.data.gouv.fr","role":"author","title":"Nicolas Berthelot"},{"email":"miryad.ali@beta.gouv.fr","organisation":"transport.data.gouv.fr","role":"contributor","title":"Miryad Ali"},{"email":"francis.chabouis@beta.gouv.fr","organisation":"transport.data.gouv.fr","role":"contributor","title":"Francis Chabouis"},{"email":"thibaut.barrere@beta.gouv.fr","organisation":"transport.data.gouv.fr","role":"contributor","title":"Thibaut Barr\u00e8re"},{"email":"a.grenier@montpellier3m.fr","organisation":"Montpellier M\u00e9tropole","role":"contributor","title":"Arnaud Grenier"},{"email":"axel@broman.fr","organisation":"L'Heureux Cyclage","role":"contributor","title":"Axel Broman"},{"email":"benoit.chaumeret@paris.fr","organisation":"Ville de Paris","role":"contributor","title":"Beno\u00eet Chaumeret"},{"email":"caperronnet@grandlyon.com","organisation":"M\u00e9tropole du Grand Lyon","role":"contributor","title":"Cassandre Perronnet"},{"email":"cindie.andrieu-dupin@developpement-durable.gouv.fr","organisation":"DRIEA","role":"contributor","title":"Cindie Andrieu-Dupin"},{"email":"emmanuel.roche@grandchambery.fr","organisation":"Grand Chamb\u00e9ry","role":"contributor","title":"Emmanuel Roche"},{"email":"fabien.commeaux@velo-territoires.org","organisation":"V\u00e9lo & Territoires","role":"contributor","title":"Fabien Commeaux"},{"email":"frederick.petit@lametro.fr","organisation":"Grenoble M\u00e9tropole","role":"contributor","title":"Fr\u00e9d\u00e9rick Petit"},{"email":"fripaud@altinnova.com","organisation":"Altinnova","role":"contributor","title":"Fabien Ripaud"},{"email":"j.valentin@montpellier3m.fr","organisation":"Montpellier M\u00e9tropole","role":"contributor","title":"J\u00e9r\u00e9my Valentin"},{"email":"jlb@monunivert.fr","organisation":"MonUnivert","role":"contributor","title":"Jean-Luc Bahri"},{"email":"julien@mobilitydata.org","organisation":"MobilityData","role":"contributor","title":"Julien de Labaca"},{"email":"leo@mobilitydata.org","organisation":"MobilityData","role":"contributor","title":"Leo Frachet"},{"email":"mathieu.richard@here.com","organisation":"Here Technologies","role":"contributor","title":"Mathieu Richard"},{"email":"nicolas.madignier@grandpoitiers.fr","organisation":"Grand Poitiers","role":"contributor","title":"Nicolas Madignier"},{"email":"oasselin@lillemetropole.fr","organisation":"Lille M\u00e9tropole","role":"contributor","title":"Olivier Asselin"},{"email":"s.carette@mobilites-touraine.fr","organisation":"Touraine Mobilit\u00e9s","role":"contributor","title":"Sabine Carette"},{"email":"simon.reau@geovelo.fr","organisation":"G\u00e9ov\u00e9lo","role":"contributor","title":"Simon R\u00e9au"},{"email":"stephane.mevel-viannay@bretagne.bzh","organisation":"R\u00e9gion Bretagne","role":"contributor","title":"Ste\u0301phane Me\u0301vel-Viannay"},{"email":"thomas.montagne@velo-territoires.org","organisation":"V\u00e9lo & Territoires","role":"contributor","title":"Thomas Montagne"},{"email":"yohan.planche@developpement-durable.gouv.fr ","organisation":"DGITM","role":"contributor","title":"Yohan Planche"},{"email":"antoine.coue@velo-territoires.org","organisation":"V\u00e9lo & Territoires","role":"contributor","title":"Antoine Coue\u0301"},{"email":"jcb@apitux.com","organisation":"Apitux","role":"contributor","title":"Jean-Christophe Becquet"},{"email":"pierre.hamburger@grenoblealpesmetropole.fr","organisation":"Grenoble M\u00e9tropole","role":"contributor","title":"Pierre Hamburger"},{"email":"pl@copark.co","organisation":"Copark","role":"contributor","title":"Pierre Lemasson"},{"email":"ttremblay@altinnova.com","organisation":"Altinnova","role":"contributor","title":"Thomas Trembaly"}],"countryCode":"FR","created":"2021-03-10","custom_checks":[{"name":"french_gps_coordinates","params":{"column":"coordonneesxy"}}],"description":"Sp\u00e9cification du fichier d\u00e9crivant les emplacements de stationnement cycable.","fields":[{"constraints":{"required":true},"description":"Identifiant unique du stationnement dans les bases de donn\u00e9es de la collectivit\u00e9 territoriale productrice de donn\u00e9es","example":"STSI01","name":"id_local","type":"string"},{"constraints":{"required":false},"description":"Identifiant OpenStreetMap, si les donn\u00e9es proviennent d'OSM. On compose l'identifiant en utilisant la clef \"n\" s'il s'agit d'un noeud, \"w\" s'il s'agit d'un chemin et \"r\" s'il s'agit d'une relation.","example":"n34172","name":"id_osm","type":"string"},{"constraints":{"pattern":"^([013-9]\\d|2[AB1-9])\\d{3}$","required":false},"description":"Code INSEE de la commune o\u00f9 se trouve le stationnement v\u00e9lo","example":"67023","name":"code_com","type":"string"},{"constraints":{"required":true},"description":"La latitude et la longitude en degr\u00e9s d\u00e9cimaux (point comme s\u00e9parateur d\u00e9cimal) de la localisation du centre de l'emplacement de stationnement exprim\u00e9e dans le syst\u00e8me de coordonn\u00e9es WGS84 [lon,lat].","example":"[7.48710500,48.345345]","format":"array","name":"coordonneesxy","type":"geopoint"},{"constraints":{"required":true},"description":"Nombre de places de stationnement disponibles sur l'emplacement y compris les places adapt\u00e9es \u00e0 des v\u00e9los sp\u00e9ciaux (comme les v\u00e9los de grande taille).","example":"14","name":"capacite","type":"integer"},{"constraints":{"required":false},"description":"Nombre de places de stationnement disponibles pour les v\u00e9los de grande taille","example":"2","name":"capacite_cargo","type":"integer"},{"constraints":{"enum":["ROUE","CADRE","CADRE ET ROUE","SANS ACCROCHE"],"required":true},"description":"Mode d'accrochage possible du v\u00e9lo aux \u00e9quipements de stationnement","example":"CADRE ET ROUE","name":"type_accroche","type":"string"},{"constraints":{"enum":["ARCEAU","RATELIER","RACK DOUBLE ETAGE","CROCHET","SUPPORT GUIDON","POTELET","ARCEAU VELO GRANDE TAILLE","AUCUN EQUIPEMENT","AUTRE"],"required":false},"description":"Type de mobilier de stationnement","example":"ARCEAU","name":"mobilier","type":"string"},{"constraints":{"enum":["LIBRE ACCES","ABONNEMENT OU INSCRIPTION PREALABLE","PRIVE"],"required":false},"description":"Mode d'acc\u00e8s \u00e0 l'emplacement de stationnement","example":"LIBRE ACCES","name":"acces","type":"string"},{"constraints":{"required":false},"description":"L'usage de l'\u00e9quipement de stationnement est-il gratuit ?","example":"true","falseValues":["false","False","FALSE","0","faux","Faux","FAUX"],"name":"gratuit","trueValues":["true","True","TRUE","1","vrai","Vrai","VRAI"],"type":"boolean"},{"constraints":{"enum":["STATIONNEMENT NON FERME","CONSIGNE COLLECTIVE FERMEE","BOX INDIVIDUEL FERME","AUTRE"],"required":false},"description":"Protection du stationnement","example":"STATIONNEMENT NON FERME","name":"protection","type":"string"},{"constraints":{"required":false},"description":"Le stationnement est-il couvert et est donc prot\u00e9g\u00e9 de la pluie, de la neige et de la gr\u00eale ?","example":"true","falseValues":["false","False","FALSE","0","faux","Faux","FAUX"],"name":"couverture","trueValues":["true","True","TRUE","1","vrai","Vrai","VRAI"],"type":"boolean"},{"constraints":{"required":false},"description":"Le stationnement est-il surveill\u00e9 par un gardien ou par de la vid\u00e9osurveillance ?","example":"true","falseValues":["false","False","FALSE","0","faux","Faux","FAUX"],"name":"surveillance","trueValues":["true","True","TRUE","1","vrai","Vrai","VRAI"],"type":"boolean"},{"constraints":{"required":false},"description":"L'emplacement est-il \u00e9clair\u00e9 la nuit (par de l'\u00e9clairage urbain ou d\u00e9di\u00e9 \u00e0 l'emplacement) ?","example":"true","falseValues":["false","False","FALSE","0","faux","Faux","FAUX"],"name":"lumiere","trueValues":["true","True","TRUE","1","vrai","Vrai","VRAI"],"type":"boolean"},{"constraints":{"required":false},"description":"Site web d'information sur l'emplacement (abonnement\/r\u00e9servation...)","example":"https:\/\/www.exemple.fr\/stationnementvelo-maville\/","format":"uri","name":"url_info","type":"string"},{"constraints":{"required":false},"description":"Date de mise en service du stationnement v\u00e9lo (Notation ISO 8601, format AAAA)","example":"2017","name":"d_service","type":"integer"},{"constraints":{"required":false},"description":"Nom de l'organisation ayant fourni les donn\u00e9es","example":"Grand Poitiers","name":"source","type":"string"},{"constraints":{"required":false},"description":"Nom de l'organisation propri\u00e9taire de l'emplacement de stationnement","example":"Ville de Poitiers","name":"proprietaire","type":"string"},{"constraints":{"required":false},"description":"Nom de l'organisation gestionnaire de l'emplacement de stationnement","example":"Ville de Poitiers","name":"gestionnaire","type":"string"},{"constraints":{"required":false},"description":"Date de derni\u00e8re mise \u00e0 jour des donn\u00e9es (Notation ISO 8601, format AAAA-MM-JJ)","example":"2020-02-27","name":"date_maj","type":"date"},{"constraints":{"required":false},"description":"Commentaires divers sur le stationnement v\u00e9lo, conditions d'acc\u00e8s, pr\u00e9cisions sur la localisation, tarifs...","example":"L'acc\u00e8s \u00e0 l'emplacement se fait en sous-sol de la gare","name":"commentaires","type":"string"}],"homepage":"https:\/\/github.com\/etalab\/schema-stationnement-cyclable","keywords":["stationnement","parking","v\u00e9lo","mobilit\u00e9"],"lastModified":"2022-04-20","licenses":[{"name":"etalab-2.0","path":"https:\/\/spdx.org\/licenses\/etalab-2.0.html","title":"Etalab Licence Ouverte 2.0"}],"name":"stationnement-cyclable","path":"https:\/\/github.com\/etalab\/schema-stationnement-cyclable\/raw\/v1.1.2\/schema.json","primaryKey":"id_local","resources":[{"name":"exemple-valide-csv","path":"https:\/\/github.com\/etalab\/schema-stationnement-cyclable\/raw\/v1.1.2\/exemple-valide.csv","title":"Ressource valide (CSV)"},{"name":"exemple-invalide","path":"https:\/\/github.com\/etalab\/schema-stationnement-cyclable\/raw\/v1.1.2\/exemple-invalide.csv","title":"Ressource invalide"}],"title":"Stationnement cyclable","version":"1.1.2"},"scheme":"","stats":{"bytes":0,"fields":21,"hash":"","rows":76}},"scope":["hash-count-error","byte-count-error","field-count-error","row-count-error","blank-header","extra-label","missing-label","blank-label","duplicate-label","incorrect-label","blank-row","primary-key-error","foreign-key-error","extra-cell","missing-cell","type-error","constraint-error","unique-error"],"stats":{"errors":0},"structure_warnings":[],"time":0.04,"valid":true}],"time":0.04,"valid":false,"version":"4.18.2"}} +{"schema":"https://schema.data.gouv.fr/schemas/etalab/schema-stationnement-cyclable/1.1.1/schema.json","url":"https://static.data.gouv.fr/resources/stationnement-cyclable-communaute-lesneven-cote-des-legendes/20220617-135734/data.csv","version":"0.12.0","date":"2022-06-20T07:49:33.810216+00:00","report":{"stats":{"errors":1,"warnings":0,"seconds":0.04,"fields":21,"rows":76},"errors":[{"message":"Check is not valid: 'french_gps_coordinates': custom check inconnu.","type":"check-error","tags":[]}],"valid":false}} diff --git a/apps/shared/test/fixtures/validata_with_errors.json b/apps/shared/test/fixtures/validata_with_errors.json index c910192ae5..d2e81e5abe 100644 --- a/apps/shared/test/fixtures/validata_with_errors.json +++ b/apps/shared/test/fixtures/validata_with_errors.json @@ -1 +1 @@ -{"_meta":{"args":{"schema":"https:\/\/schema.data.gouv.fr\/schemas\/etalab\/schema-irve\/latest\/schema.json","url":"https:\/\/raw.githubusercontent.com\/etalab\/schema-irve\/v1.0.3\/exemple-valide.csv"},"validata-table-version":"0.6.1","validata-core-version":"0.8.3"},"report":{"date":"2022-01-07T09:37:23.536920+00:00","errors":[],"stats":{"errors":32,"tasks":1},"tasks":[{"errors":[{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `siren_amenageur` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `siren_amenageur` est manquante.","rowPositions":[0],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `contact_amenageur` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `contact_amenageur` est manquante.","rowPositions":[1],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `contact_operateur` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `contact_operateur` est manquante.","rowPositions":[2],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `nom_enseigne` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `nom_enseigne` est manquante.","rowPositions":[3],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `id_station_itinerance` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `id_station_itinerance` est manquante.","rowPositions":[4],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `nom_station` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `nom_station` est manquante.","rowPositions":[5],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `implantation_station` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `implantation_station` est manquante.","rowPositions":[6],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `adresse_station` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `adresse_station` est manquante.","rowPositions":[7],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `code_insee_commune` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `code_insee_commune` est manquante.","rowPositions":[8],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `coordonneesXY` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `coordonneesXY` est manquante.","rowPositions":[9],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `id_pdc_itinerance` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `id_pdc_itinerance` est manquante.","rowPositions":[11],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `puissance_nominale` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `puissance_nominale` est manquante.","rowPositions":[12],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `prise_type_ef` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `prise_type_ef` est manquante.","rowPositions":[13],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `prise_type_2` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `prise_type_2` est manquante.","rowPositions":[14],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `prise_type_combo_ccs` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `prise_type_combo_ccs` est manquante.","rowPositions":[15],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `prise_type_chademo` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `prise_type_chademo` est manquante.","rowPositions":[16],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `prise_type_autre` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `prise_type_autre` est manquante.","rowPositions":[17],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `gratuit` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `gratuit` est manquante.","rowPositions":[18],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `paiement_acte` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `paiement_acte` est manquante.","rowPositions":[19],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `paiement_cb` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `paiement_cb` est manquante.","rowPositions":[20],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `paiement_autre` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `paiement_autre` est manquante.","rowPositions":[21],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `condition_acces` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `condition_acces` est manquante.","rowPositions":[22],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `reservation` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `reservation` est manquante.","rowPositions":[23],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `horaires` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `horaires` est manquante.","rowPositions":[24],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `accessibilite_pmr` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `accessibilite_pmr` est manquante.","rowPositions":[25],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `restriction_gabarit` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `restriction_gabarit` est manquante.","rowPositions":[26],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `station_deux_roues` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `station_deux_roues` est manquante.","rowPositions":[27],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `raccordement` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `raccordement` est manquante.","rowPositions":[28],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `num_pdl` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `num_pdl` est manquante.","rowPositions":[29],"tags":["#head","#structure"]},{"code":"missing-required-header","description":"","labels":["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],"message":"La colonne obligatoire `date_mise_en_service` est manquante.","name":"Colonne obligatoire manquante","note":"La colonne obligatoire `date_mise_en_service` est manquante.","rowPositions":[30],"tags":["#head","#structure"]},{"cell":"2018\/03\/31","cells":["XXX","YYY","ZZZ","FR*A17*P*ZZZ*3*_*_*_","Parking 1","D109A","06090","6.92641","43.59413","2","FR*A17*E*ZZZ*3*1*1*_","22.0","T2 - E\/F","Payant (badge, appli et QR code)","24h\/24","RAS","2018\/03\/31"],"code":"type-error","description":"The value does not match the schema type and format for this field.","fieldName":"date_maj","fieldNumber":17,"fieldPosition":17,"message":"La date doit \u00eatre \u00e9crite sous la forme `aaaa-mm-jj`.","name":"Format de date incorrect","note":"type is \"date\/%Y-%m-%d\"","rowNumber":1,"rowPosition":2,"tags":["#table","#row","#cell"]},{"cell":"2018\/3\/31","cells":["XXX","YYY","ZZZ","FR*A17*P*ZZZ*3*_*_*_","Parking 1","D109A","06090","6.92641","43.59413","2","FR*A17*E*ZZZ*3*1*2*_","22.0","T2 - E\/F","Payant (badge, appli et QR code)","24h\/24","RAS","2018\/3\/31"],"code":"type-error","description":"The value does not match the schema type and format for this field.","fieldName":"date_maj","fieldNumber":17,"fieldPosition":17,"message":"La date doit \u00eatre \u00e9crite sous la forme `aaaa-mm-jj`.","name":"Format de date incorrect","note":"type is \"date\/%Y-%m-%d\"","rowNumber":2,"rowPosition":3,"tags":["#table","#row","#cell"]}],"partial":false,"resource":{"data":[["n_amenageur","n_operateur","n_enseigne","id_station","n_station","ad_station","code_insee","Xlongitude","Ylatitude","nbre_pdc","id_pdc","puiss_max","type_prise","acces_recharge","accessibilit\u00e9","observations","date_maj"],["XXX","YYY","ZZZ","FR*A17*P*ZZZ*3*_*_*_","Parking 1","D109A","06090","6.92641","43.59413","2","FR*A17*E*ZZZ*3*1*1*_","22.0","T2 - E\/F","Payant (badge, appli et QR code)","24h\/24","RAS","2018\/03\/31"],["XXX","YYY","ZZZ","FR*A17*P*ZZZ*3*_*_*_","Parking 1","D109A","06090","6.92641","43.59413","2","FR*A17*E*ZZZ*3*1*2*_","22.0","T2 - E\/F","Payant (badge, appli et QR code)","24h\/24","RAS","2018\/3\/31"]],"format":"inline","hashing":"md5","layout":{"limitRows":100000},"name":"memory","profile":"tabular-data-resource","schema":{"$schema":"https:\/\/frictionlessdata.io\/schemas\/table-schema.json","contributors":[{"email":"validation@data.gouv.fr","organisation":"Etalab","role":"author","title":"Alexandre Bult\u00e9"},{"email":"charles.nepote@fing.org","role":"contributor","title":"Charles Nepote"},{"email":"pierre.dittgen@jailbreak.paris","organisation":"Jailbreak","role":"contributor","title":"Pierre Dittgen"},{"email":"johan.richer@jailbreak.paris","organisation":"Jailbreak","role":"contributor","title":"Johan Richer"},{"email":"geoffrey.aldebert@data.gouv.fr","organisation":"Etalab","role":"contributor","title":"Geoffrey Aldebert"},{"email":"julien.barreteau@developpement-durable.gouv.fr","organisation":"DGEC","role":"contributor","title":"Julien Barreteau"}],"countryCode":"FR","created":"2018-06-29","description":"Sp\u00e9cification du fichier d'\u00e9change relatif aux donn\u00e9es concernant la localisation g\u00e9ographique et les caract\u00e9ristiques techniques des stations et des points de recharge pour v\u00e9hicules \u00e9lectriques","fields":[{"name":"n_amenageur","type":"any"},{"name":"n_operateur","type":"any"},{"name":"n_enseigne","type":"any"},{"name":"id_station","type":"any"},{"name":"n_station","type":"any"},{"name":"ad_station","type":"any"},{"name":"code_insee","type":"any"},{"name":"Xlongitude","type":"any"},{"name":"Ylatitude","type":"any"},{"constraints":{"minimum":0,"required":true},"description":"Le nombre de points de recharge sur la station.","example":"1, 10","name":"nbre_pdc","type":"integer"},{"name":"id_pdc","type":"any"},{"name":"puiss_max","type":"any"},{"name":"type_prise","type":"any"},{"name":"acces_recharge","type":"any"},{"name":"accessibilit\u00e9","type":"any"},{"constraints":{"required":false},"description":"Champ destin\u00e9 \u00e0 pr\u00e9ciser les modalit\u00e9s d'acc\u00e8s \u00e0 la recharge, l'accessibilit\u00e9, le tarif, les horaires d'ouverture, ...","example":"Recharge uniquement disponible pendant les horaires d'ouverture du Centre Commercial XY","name":"observations","type":"string"},{"constraints":{"required":true},"description":"Date de mise \u00e0 jour des donn\u00e9es","example":"2021-12-30","format":"%Y-%m-%d","name":"date_maj","type":"date"}],"homepage":"https:\/\/github.com\/etalab\/schema-irve","lastModified":"2021-10-05","missingValues":[""],"name":"irve","path":"https:\/\/github.com\/etalab\/schema-irve\/raw\/v2.0.2\/schema.json","resources":[{"path":"https:\/\/github.com\/etalab\/schema-irve\/raw\/v2.0.2\/exemple-valide.csv","title":"Exemple de fichier IRVE valide"}],"sources":[{"path":"https:\/\/www.legifrance.gouv.fr\/jo_pdf.do?id=JORFTEXT000033860620","title":"D\u00e9cret n\u00b0 2017-26 du 12 janvier 2017 relatif aux infrastructures de recharge pour v\u00e9hicules \u00e9lectriques et portant diverses mesures de transposition de la directive 2014\/94\/UE du Parlement europ\u00e9en et du Conseil du 22 octobre 2014 sur le d\u00e9ploiement d\u2019une infrastructure pour carburants alternatifs"},{"path":"https:\/\/www.legifrance.gouv.fr\/jo_pdf.do?id=JORFTEXT000033860733","title":"Arr\u00eat\u00e9 du 12 janvier 2017 relatif aux donn\u00e9es concernant la localisation g\u00e9ographique et les caract\u00e9ristiques techniques des stations et des points de recharge pour v\u00e9hicules \u00e9lectriques"},{"path":"https:\/\/www.legifrance.gouv.fr\/jo_pdf.do?id=JORFTEXT000033860743","title":"Arr\u00eat\u00e9 du 12 janvier 2017 pr\u00e9cisant les dispositions relatives aux identifiants des unit\u00e9s d\u2019exploitation pour la recharge des v\u00e9hicules \u00e9lectriques"},{"path":"http:\/\/www.afirev.fr\/fr\/informations-generales\/","title":"D\u00e9finition et structure des identifiants attribu\u00e9s par l'Association Fran\u00e7aise pour l'Itin\u00e9rance de la Recharge Electrique des V\u00e9hicules (AFIREV)"}],"title":"Infrastructures de recharge pour v\u00e9hicules \u00e9lectriques","version":"2.0.2"},"scheme":"","stats":{"bytes":0,"fields":17,"hash":"","rows":2}},"scope":["hash-count-error","byte-count-error","field-count-error","row-count-error","blank-header","extra-label","missing-label","blank-label","duplicate-label","incorrect-label","blank-row","primary-key-error","foreign-key-error","extra-cell","missing-cell","type-error","constraint-error","unique-error"],"stats":{"errors":32},"structure_warnings":[{"code":"missing-header-warn","field_name":"nom_amenageur","message":"Ajoutez la colonne manquante `nom_amenageur`.","name":"colonne manquante"},{"code":"missing-header-warn","field_name":"nom_operateur","message":"Ajoutez la colonne manquante `nom_operateur`.","name":"colonne manquante"},{"code":"missing-header-warn","field_name":"telephone_operateur","message":"Ajoutez la colonne manquante `telephone_operateur`.","name":"colonne manquante"},{"code":"missing-header-warn","field_name":"id_station_local","message":"Ajoutez la colonne manquante `id_station_local`.","name":"colonne manquante"},{"code":"missing-header-warn","field_name":"id_pdc_local","message":"Ajoutez la colonne manquante `id_pdc_local`.","name":"colonne manquante"},{"code":"missing-header-warn","field_name":"tarification","message":"Ajoutez la colonne manquante `tarification`.","name":"colonne manquante"},{"code":"extra-header-warn","field_name":"n_amenageur","message":"Retirez la colonne `n_amenageur` non d\u00e9finie dans le sch\u00e9ma.","name":"colonne surnum\u00e9raire"},{"code":"extra-header-warn","field_name":"n_operateur","message":"Retirez la colonne `n_operateur` non d\u00e9finie dans le sch\u00e9ma.","name":"colonne surnum\u00e9raire"},{"code":"extra-header-warn","field_name":"n_enseigne","message":"Retirez la colonne `n_enseigne` non d\u00e9finie dans le sch\u00e9ma.","name":"colonne surnum\u00e9raire"},{"code":"extra-header-warn","field_name":"id_station","message":"Retirez la colonne `id_station` non d\u00e9finie dans le sch\u00e9ma.","name":"colonne surnum\u00e9raire"},{"code":"extra-header-warn","field_name":"n_station","message":"Retirez la colonne `n_station` non d\u00e9finie dans le sch\u00e9ma.","name":"colonne surnum\u00e9raire"},{"code":"extra-header-warn","field_name":"ad_station","message":"Retirez la colonne `ad_station` non d\u00e9finie dans le sch\u00e9ma.","name":"colonne surnum\u00e9raire"},{"code":"extra-header-warn","field_name":"code_insee","message":"Retirez la colonne `code_insee` non d\u00e9finie dans le sch\u00e9ma.","name":"colonne surnum\u00e9raire"},{"code":"extra-header-warn","field_name":"Xlongitude","message":"Retirez la colonne `Xlongitude` non d\u00e9finie dans le sch\u00e9ma.","name":"colonne surnum\u00e9raire"},{"code":"extra-header-warn","field_name":"Ylatitude","message":"Retirez la colonne `Ylatitude` non d\u00e9finie dans le sch\u00e9ma.","name":"colonne surnum\u00e9raire"},{"code":"extra-header-warn","field_name":"id_pdc","message":"Retirez la colonne `id_pdc` non d\u00e9finie dans le sch\u00e9ma.","name":"colonne surnum\u00e9raire"},{"code":"extra-header-warn","field_name":"puiss_max","message":"Retirez la colonne `puiss_max` non d\u00e9finie dans le sch\u00e9ma.","name":"colonne surnum\u00e9raire"},{"code":"extra-header-warn","field_name":"type_prise","message":"Retirez la colonne `type_prise` non d\u00e9finie dans le sch\u00e9ma.","name":"colonne surnum\u00e9raire"},{"code":"extra-header-warn","field_name":"acces_recharge","message":"Retirez la colonne `acces_recharge` non d\u00e9finie dans le sch\u00e9ma.","name":"colonne surnum\u00e9raire"},{"code":"extra-header-warn","field_name":"accessibilit\u00e9","message":"Retirez la colonne `accessibilit\u00e9` non d\u00e9finie dans le sch\u00e9ma.","name":"colonne surnum\u00e9raire"}],"time":0.042,"valid":false}],"time":0.042,"valid":false,"version":"4.18.2"}} +{"schema":"https://schema.data.gouv.fr/schemas/etalab/schema-irve-statique/2.3.1/schema-statique.json","url":"https://raw.githubusercontent.com/etalab/schema-irve/v1.0.3/exemple-valide.csv","options":{"caseSensitiveHeader":"true"},"date":"2024-08-23T09:14:44.729885+00:00","version":"0.12.0","report":{"valid":false,"stats":{"errors":23,"warnings":30,"seconds":0.104,"fields":38,"rows":2},"warnings":["Colonne manquante : Ajoutez la colonne manquante `nom_amenageur`.","Colonne manquante : Ajoutez la colonne manquante `siren_amenageur`.","Colonne manquante : Ajoutez la colonne manquante `contact_amenageur`.","Colonne manquante : Ajoutez la colonne manquante `nom_operateur`.","Colonne manquante : Ajoutez la colonne manquante `telephone_operateur`.","Colonne manquante : Ajoutez la colonne manquante `id_station_local`.","Colonne manquante : Ajoutez la colonne manquante `code_insee_commune`.","Colonne manquante : Ajoutez la colonne manquante `id_pdc_local`.","Colonne manquante : Ajoutez la colonne manquante `gratuit`.","Colonne manquante : Ajoutez la colonne manquante `paiement_cb`.","Colonne manquante : Ajoutez la colonne manquante `paiement_autre`.","Colonne manquante : Ajoutez la colonne manquante `tarification`.","Colonne manquante : Ajoutez la colonne manquante `raccordement`.","Colonne manquante : Ajoutez la colonne manquante `num_pdl`.","Colonne manquante : Ajoutez la colonne manquante `date_mise_en_service`.","Colonne manquante : Ajoutez la colonne manquante `cable_t2_attache`.","Colonne surnuméraire : Retirez la colonne `n_amenageur` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `n_operateur` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `n_enseigne` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `id_station` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `n_station` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `ad_station` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `code_insee` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `Xlongitude` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `Ylatitude` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `id_pdc` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `puiss_max` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `type_prise` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `acces_recharge` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `accessibilité` non définie dans le schéma."],"errors":[{"message":"La colonne obligatoire `contact_operateur` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"contact_operateur","fieldNumber":18},{"message":"La colonne obligatoire `nom_enseigne` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"nom_enseigne","fieldNumber":19},{"message":"La colonne obligatoire `id_station_itinerance` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"id_station_itinerance","fieldNumber":20},{"message":"La colonne obligatoire `nom_station` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"nom_station","fieldNumber":21},{"message":"La colonne obligatoire `implantation_station` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"implantation_station","fieldNumber":22},{"message":"La colonne obligatoire `adresse_station` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"adresse_station","fieldNumber":23},{"message":"La colonne obligatoire `coordonneesXY` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"coordonneesXY","fieldNumber":24},{"message":"La colonne obligatoire `id_pdc_itinerance` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"id_pdc_itinerance","fieldNumber":25},{"message":"La colonne obligatoire `puissance_nominale` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"puissance_nominale","fieldNumber":26},{"message":"La colonne obligatoire `prise_type_ef` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"prise_type_ef","fieldNumber":27},{"message":"La colonne obligatoire `prise_type_2` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"prise_type_2","fieldNumber":28},{"message":"La colonne obligatoire `prise_type_combo_ccs` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"prise_type_combo_ccs","fieldNumber":29},{"message":"La colonne obligatoire `prise_type_chademo` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"prise_type_chademo","fieldNumber":30},{"message":"La colonne obligatoire `prise_type_autre` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"prise_type_autre","fieldNumber":31},{"message":"La colonne obligatoire `paiement_acte` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"paiement_acte","fieldNumber":32},{"message":"La colonne obligatoire `condition_acces` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"condition_acces","fieldNumber":33},{"message":"La colonne obligatoire `reservation` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"reservation","fieldNumber":34},{"message":"La colonne obligatoire `horaires` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"horaires","fieldNumber":35},{"message":"La colonne obligatoire `accessibilite_pmr` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"accessibilite_pmr","fieldNumber":36},{"message":"La colonne obligatoire `restriction_gabarit` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"restriction_gabarit","fieldNumber":37},{"message":"La colonne obligatoire `station_deux_roues` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"station_deux_roues","fieldNumber":38},{"message":"Format de date incorrect : La date doit être écrite sous la forme `aaaa-mm-jj`.","type":"type-error","tags":["#table","#row","#cell"],"rowNumber":2,"fieldName":"date_maj","fieldNumber":17,"cell":"2018/03/31"},{"message":"Format de date incorrect : La date doit être écrite sous la forme `aaaa-mm-jj`.","type":"type-error","tags":["#table","#row","#cell"],"rowNumber":3,"fieldName":"date_maj","fieldNumber":17,"cell":"2018/3/31"}]}} diff --git a/apps/shared/test/fixtures/validata_with_file_error.json b/apps/shared/test/fixtures/validata_with_file_error.json index 4ec89ef748..879ce12ebc 100644 --- a/apps/shared/test/fixtures/validata_with_file_error.json +++ b/apps/shared/test/fixtures/validata_with_file_error.json @@ -1 +1 @@ -{"_meta":{"args":{"schema":"https:\/\/schema.data.gouv.fr\/schemas\/etalab\/schema-irve\/latest\/schema.json","url":"https:\/\/www.data.gouv.fr\/fr\/datasets\/r\/099eb6ff-bcf4-42be-bda7-61dfe1ca4c9f"},"validata-table-version":"0.6.1","validata-core-version":"0.8.3"},"error":{"message":"impossible de lire le contenu","name":"source-error"}} +{"schema":"https://schema.data.gouv.fr/schemas/etalab/schema-irve/latest/schema.json","url":"https://www.data.gouv.fr/fr/datasets/r/099eb6ff-bcf4-42be-bda7-61dfe1ca4c9f","version":"0.12.0","date":"2024-08-23T09:14:44.729885+00:00","error":{"message":"impossible de lire le contenu","type":"source-error"}} diff --git a/apps/shared/test/fixtures/validata_with_no_errors.json b/apps/shared/test/fixtures/validata_with_no_errors.json index ecde02c58c..76ea353f54 100644 --- a/apps/shared/test/fixtures/validata_with_no_errors.json +++ b/apps/shared/test/fixtures/validata_with_no_errors.json @@ -1 +1 @@ -{"_meta":{"args":{"schema":"https:\/\/schema.data.gouv.fr\/schemas\/etalab\/schema-irve\/latest\/schema.json","url":"https:\/\/static.data.gouv.fr\/resources\/fichier-exemple-stations-de-recharge-de-vehicules-electriques\/20210505-170339\/exemple-valide.csv"},"validata-table-version":"0.6.1","validata-core-version":"0.8.3"},"report":{"date":"2022-01-07T09:34:30.893678+00:00","errors":[],"stats":{"errors":0,"tasks":1},"tasks":[{"errors":[],"partial":false,"resource":{"data":[["nom_amenageur","siren_amenageur","contact_amenageur","nom_operateur","contact_operateur","telephone_operateur","nom_enseigne","id_station_itinerance","id_station_local","nom_station","implantation_station","adresse_station","code_insee_commune","coordonneesXY","nbre_pdc","id_pdc_itinerance","id_pdc_local","puissance_nominale","prise_type_ef","prise_type_2","prise_type_combo_ccs","prise_type_chademo","prise_type_autre","gratuit","paiement_acte","paiement_cb","paiement_autre","tarification","condition_acces","reservation","horaires","accessibilite_pmr","restriction_gabarit","station_deux_roues","raccordement","num_pdl","date_mise_en_service","observations","date_maj"],["Soci\u00e9t\u00e9 X","130025265","contact@societe-amenageur.com","Soci\u00e9t\u00e9 Y","contact@societe-operateur.com","0111111111","R\u00e9seau de recharge ABC","FRA68P68021001","","Picpus","Voirie","1 avenue de la Paix 75001 Paris","75001","[48.345345,7.48710500]","10","FRA68P680210015","","22","true","true","false","false","false","false","true","true","true","0.40\u20ac \/ kwh","Acc\u00e8s libre","true","Mo-Fr 08:00-12:00,Mo-Fr 14:00-18:00,Th 08:00-18:00","Accessible mais non r\u00e9serv\u00e9 PMR","Hauteur maximale 2m","false","Direct","12345678912345","2020-01-14","","2021-04-05"]],"format":"inline","hashing":"md5","layout":{"limitRows":100000},"name":"memory","profile":"tabular-data-resource","schema":{"$schema":"https:\/\/frictionlessdata.io\/schemas\/table-schema.json","contributors":[{"email":"validation@data.gouv.fr","organisation":"Etalab","role":"author","title":"Alexandre Bult\u00e9"},{"email":"charles.nepote@fing.org","role":"contributor","title":"Charles Nepote"},{"email":"pierre.dittgen@jailbreak.paris","organisation":"Jailbreak","role":"contributor","title":"Pierre Dittgen"},{"email":"johan.richer@jailbreak.paris","organisation":"Jailbreak","role":"contributor","title":"Johan Richer"},{"email":"geoffrey.aldebert@data.gouv.fr","organisation":"Etalab","role":"contributor","title":"Geoffrey Aldebert"},{"email":"julien.barreteau@developpement-durable.gouv.fr","organisation":"DGEC","role":"contributor","title":"Julien Barreteau"}],"countryCode":"FR","created":"2018-06-29","description":"Sp\u00e9cification du fichier d'\u00e9change relatif aux donn\u00e9es concernant la localisation g\u00e9ographique et les caract\u00e9ristiques techniques des stations et des points de recharge pour v\u00e9hicules \u00e9lectriques","fields":[{"constraints":{"required":false},"description":"La d\u00e9nomination sociale du nom de l'am\u00e9nageur, c'est \u00e0 dire de l'entit\u00e9 publique ou priv\u00e9e propri\u00e9taire des infrastructures. Vous pouvez acc\u00e9der \u00e0 cette d\u00e9nomination exacte sur le site annuaire-entreprises.data.gouv.fr. Ce champs n'est pas obligatoire car il sera automatiquement renseign\u00e9 lors de la constitution du fichier global de consolidation des IRVE.","example":"Soci\u00e9t\u00e9 X, Entit\u00e9 Y","name":"nom_amenageur","type":"string"},{"constraints":{"pattern":"^\\d{9}$","required":true},"description":"Le numero SIREN de l'am\u00e9nageur issue de la base SIRENE des entreprises. Vous pouvez r\u00e9cup\u00e9rer cet identifiant sur le site annuaire-entreprises.data.gouv.fr.","example":"130025265","name":"siren_amenageur","type":"string"},{"constraints":{"required":true},"description":"Adresse courriel de l'am\u00e9nageur. Favoriser les adresses g\u00e9n\u00e9riques de contact. Cette adresse sera utilis\u00e9e par les services de l'Etat en cas d'anomalie ou de besoin de mise \u00e0 jour des donn\u00e9es.","example":"contact@societe-amenageur.com","format":"email","name":"contact_amenageur","type":"string"},{"constraints":{"required":false},"description":"La d\u00e9nomination sociale de l'op\u00e9rateur. L'op\u00e9rateur est la personne qui exploite l'infrastructure de recharger pour le compte d'un am\u00e9nageur dans le cadre d'un contrat ou pour son propre compte s'il est l'am\u00e9nageur. Vous pouvez acc\u00e9der \u00e0 cette d\u00e9nomination exacte sur le site annuaire-entreprises.data.gouv.fr.","example":"Soci\u00e9t\u00e9 X, Entit\u00e9 Y","name":"nom_operateur","type":"string"},{"constraints":{"required":true},"description":"Adresse courriel de l'op\u00e9rateur. Favoriser les adresses g\u00e9n\u00e9riques de contact.","example":"contact@societe-operateur.com","format":"email","name":"contact_operateur","type":"string"},{"constraints":{"required":false},"description":"Num\u00e9ro de t\u00e9l\u00e9phone permettant de contacter l'op\u00e9rateur.","example":"0111111111","name":"telephone_operateur","type":"string"},{"constraints":{"required":true},"description":"Le nom commercial du r\u00e9seau.","example":"R\u00e9seau de recharge ABC","name":"nom_enseigne","type":"string"},{"constraints":{"pattern":"(?:(?:^|,)(^FR[A-Z0-9]{4,33}$|Non concern\u00e9))+$","required":true},"description":"L'identifiant de la station d\u00e9livr\u00e9 selon les modalit\u00e9s d\u00e9finies \u00e0 l'article 10 du d\u00e9cret n\u00b0 2017-26 du 12 janvier 2017. Ne pas ajouter les s\u00e9parateurs *. Si la station n'est pas en itin\u00e9rance, merci d'indiquer \"Non concern\u00e9\".","example":"FRA68P68021001","name":"id_station_itinerance","type":"string"},{"constraints":{"required":false},"description":"Identifiant de la station utilis\u00e9 localement. Si vous n'avez pas d'identifiant unique et que vous souhaitez en r\u00e9cup\u00e9rer un, vous pouvez vous rendre sur https:\/\/heidi.app.etalab.studio. En cas de station qui n'est pas ouverte \u00e0 l'itin\u00e9rance, cet identifiant est indispensable.","example":"01F2KMMRZVQ5FQY882PCJQAPQ0","name":"id_station_local","type":"string"},{"constraints":{"required":true},"description":"Le nom de la station.","example":"Picpus, Belleville, Villiers","name":"nom_station","type":"string"},{"constraints":{"enum":["Voirie","Parking public","Parking priv\u00e9 \u00e0 usage public","Parking priv\u00e9 r\u00e9serv\u00e9 \u00e0 la client\u00e8le","Station d\u00e9di\u00e9e \u00e0 la recharge rapide"],"required":true},"description":"Le type d'implantation de la station. \nPour une station sur voirie, s\u00e9lectionner \"Voirie\". \nPour un parking public, (en ouvrage, en enclos, etc.), s\u00e9lectionner \"Parking public\". Ces parkings sont g\u00e9n\u00e9ralement en gestion directe ou d\u00e9l\u00e9gu\u00e9e de la collectivit\u00e9 territoriale. \nPour un parking priv\u00e9 \u00e0 usage public \/ parking ouvert (ex: zone commerciale), s\u00e9lectionner \"Parking priv\u00e9 \u00e0 usage public\". \nPour un parking r\u00e9serv\u00e9 \u00e0 la client\u00e8le, aux usagers, s\u00e9lectionnez \"Parking priv\u00e9 r\u00e9serv\u00e9 \u00e0 la client\u00e8le\" (il s'agit d'un choix de l'am\u00e9nageur public ou priv\u00e9 sur l'utilisation de son parking. Ex: h\u00f4tel, commerce, \u00e9ventuellement certains b\u00e2timents publics). \nPour une station d\u00e9di\u00e9e \u00e0 la recharge rapide dont la dur\u00e9e d'utilisation est g\u00e9n\u00e9ralement limit\u00e9e \u00e0 la recharge principalement rapide et dont la premi\u00e8re fonction de la station est la recharge et non le stationnement, s\u00e9lectionner \"Station d\u00e9di\u00e9e \u00e0 la recharge rapide\" (ex : aires de service sur axes routiers, stations services, etc.).","example":"Parking public","name":"implantation_station","type":"string"},{"constraints":{"required":true},"description":"L'adresse compl\u00e8te de la station : [num\u00e9ro] [rue] [code postal] [ville].","example":"1 avenue de la Paix 75001 Paris","name":"adresse_station","type":"string"},{"constraints":{"pattern":"^([013-9]\\d|2[AB1-9])\\d{3}$","required":true},"description":"Le code INSEE de la commune d'implantation.","example":"06088, 2B002 (pour une commune corse)","name":"code_insee_commune","type":"string"},{"constraints":{"required":true},"description":"La latitude et la longitude en degr\u00e9s d\u00e9cimaux (point comme s\u00e9parateur d\u00e9cimal) de la localisation de la station exprim\u00e9e dans le syst\u00e8me de coordonn\u00e9es WGS84 au format [lon,lat].","example":"[7.48710500,48.345345]","format":"array","name":"coordonneesXY","type":"geopoint"},{"constraints":{"minimum":0,"required":true},"description":"Le nombre de points de recharge sur la station.","example":"1, 10","name":"nbre_pdc","type":"integer"},{"constraints":{"pattern":"(?:(?:^|,)(^FR[A-Z0-9]{4,33}$|Non concern\u00e9))+$","required":true},"description":"L'identifiant du point de recharge d\u00e9livr\u00e9 selon les modalit\u00e9s d\u00e9finies \u00e0 l'article 10 du d\u00e9cret n\u00b0 2017-26 du 12 janvier 2017. Ne pas mettre de s\u00e9parateur * ou -. Si le point de recharge n'est pas en itin\u00e9rance, merci d'indiquer \"Non concern\u00e9\".","example":"FRA68P680210015","name":"id_pdc_itinerance","type":"string"},{"constraints":{"required":false},"description":"Identifiant du point de recharge utilis\u00e9 localement. Si vous n'avez pas d'identifiant unique et que vous souhaitez en r\u00e9cup\u00e9rer un, vous pouvez vous rendre sur https:\/\/heidi.app.etalab.studio. En cas de point de recharge qui n'est pas ouvert \u00e0 l'itin\u00e9rance, cet identifiant est indispensable.","example":"01F2KNFARDSJG7KEH1YHG4033M","name":"id_pdc_local","type":"string"},{"constraints":{"minimum":0,"required":true},"description":"Puissance maximale en kW que peut recevoir un v\u00e9hicule connect\u00e9 au point de recharge, d\u00e9termin\u00e9e en prenant en compte les capacit\u00e9s techniques propres du point, la puissance souscrite au r\u00e9seau de distribution et les caract\u00e9ristiques de l'installation comme le c\u00e2blage par exemple, mais sans prendre en compte ni les limitations du connecteur ni celles du v\u00e9hicule.","example":"22.00","name":"puissance_nominale","type":"number"},{"constraints":{"required":true},"description":"Disponibilit\u00e9 d'une prise de type E\/F sur le point de recharge. Indiquer \"true\" si vrai, \"false\" si faux.","example":false,"name":"prise_type_ef","type":"boolean"},{"constraints":{"required":true},"description":"Disponibilit\u00e9 d'une prise de type 2 sur le point de recharge. Indiquer \"true\" si vrai, \"false\" si faux.","example":false,"name":"prise_type_2","type":"boolean"},{"constraints":{"required":true},"description":"Disponibilit\u00e9 d'une prise de type Combo \/ CCS sur le point de recharge. Indiquer \"true\" si vrai, \"false\" si faux.","example":false,"name":"prise_type_combo_ccs","type":"boolean"},{"constraints":{"required":true},"description":"Disponibilit\u00e9 d'une prise de type Chademo sur le point de recharge. Indiquer \"true\" si vrai, \"false\" si faux.","example":false,"name":"prise_type_chademo","type":"boolean"},{"constraints":{"required":true},"description":"Disponibilit\u00e9 d'une prise d'un autre type sur le point de recharge. Indiquer \"true\" si vrai, \"false\" si faux. Le ou les types de prises sont \u00e0 pr\u00e9ciser dans le champs \"observations\".","example":false,"name":"prise_type_autre","type":"boolean"},{"constraints":{"required":true},"description":"Gratuit\u00e9 de la recharge. Indiquer \"true\" si vrai, \"false\" si faux.","example":false,"name":"gratuit","type":"boolean"},{"constraints":{"required":true},"description":"Possibilit\u00e9 de paiement \u00e0 l'acte (sans identification ni abonnement). Indiquer \"true\" si vrai, \"false\" si faux.","example":false,"name":"paiement_acte","type":"boolean"},{"constraints":{"required":true},"description":"Possibilit\u00e9 de paiement par carte bancaire (pr\u00e9sence d'un terminal de paiement avec une CB). Indiquer \"true\" si vrai, \"false\" si faux.","example":false,"name":"paiement_cb","type":"boolean"},{"constraints":{"required":true},"description":"Possibilit\u00e9 de paiement par un autre moyen (qui peut \u00eatre pr\u00e9ciser dans le champs \"observation\". Indiquer \"true\" si vrai, \"false\" si faux.","example":false,"name":"paiement_autre","type":"boolean"},{"constraints":{"required":false},"description":"Toutes informations pouvant \u00eatre apport\u00e9es concernant les tarification(s) pratiqu\u00e9e(s).","example":"0,40\u20ac \/ kwh pour les non abonn\u00e9s.","name":"tarification","type":"string"},{"constraints":{"enum":["Acc\u00e8s libre","Acc\u00e8s r\u00e9serv\u00e9"],"required":true},"description":"Eventuelles conditions d\u2019acc\u00e8s \u00e0 la station, hors gabarit. Dans le cas d'un acc\u00e8s libre sans contrainte mat\u00e9rielle physique (ex : absence de barri\u00e8re), indiquer \"Acc\u00e8s libre\". \nDans le cas d'un acc\u00e8s limit\u00e9 \/ r\u00e9serv\u00e9 qui n\u00e9cessite une identification ou passage d'une barri\u00e8re, indiquer \"Acc\u00e8s r\u00e9serv\u00e9\" (ce type d'acc\u00e8s inclut les IRVE sur le r\u00e9seau autoroutier payant - passage p\u00e9age).","example":"Acc\u00e8s libre","name":"condition_acces","type":"string"},{"constraints":{"required":true},"description":"Possibilit\u00e9 de r\u00e9servation \u00e0 l'avance d'un point de recharge. Indiquer \"true\" si vrai, \"false\" si faux.","example":false,"name":"reservation","type":"boolean"},{"constraints":{"pattern":"(.*?)((\\d{1,2}:\\d{2})-(\\d{1,2}:\\d{2})|24\/7)","required":true},"description":"Amplitude d\u2019ouverture de la station. Si ouverte sans interruption indiquer \u00ab 24\/7\u00bb sinon indiquer les horaires sous cette forme : Mo-Fr 08:00-12:00,Mo-Fr 14:00-18:00,Th 08:00-18:00.","example":"Mo-Fr 08:00-12:00,Mo-Fr 14:00-18:00,Th 08:00-18:00","name":"horaires","type":"string"},{"constraints":{"enum":["R\u00e9serv\u00e9 PMR","Accessible mais non r\u00e9serv\u00e9 PMR","Non accessible","Accessibilit\u00e9 inconnue"],"required":true},"description":"Accessibilit\u00e9 du point de recharge aux personnes \u00e0 mobilit\u00e9 r\u00e9duite. Dans le cas d'un point de recharge signalis\u00e9 et r\u00e9serv\u00e9 PMR, indiquer \"R\u00e9serv\u00e9 PMR\". \nDans le cas d'une point de recharge non r\u00e9serv\u00e9 PMR mais accessible PMR, indiquer \"Accessible mais non r\u00e9serv\u00e9 PMR\". \nDans le cas d'un point de recharge non accessible PMR, indiquer \"Non accessible\"","example":false,"name":"accessibilite_pmr","type":"string"},{"constraints":{"required":true},"description":"Toutes informations relatives aux restrictions d\u2019acc\u00e8s li\u00e9es au gabarit des v\u00e9hicules.","example":"Hauteur maximale 2m","name":"restriction_gabarit","type":"string"},{"constraints":{"required":true},"description":"La station est-elle r\u00e9serv\u00e9e aux v\u00e9hicules \u00e0 deux roues ? Indiquer \"true\" si vrai, \"false\" si faux.","example":false,"name":"station_deux_roues","type":"boolean"},{"constraints":{"enum":["Direct","Indirect"],"required":true},"description":"Type de raccordement de la station au r\u00e9seau de distribution d'\u00e9lectricit\u00e9 : direct (point de livraison exclusivement d\u00e9di\u00e9 \u00e0 la station) ou indirect.","example":"Direct","name":"raccordement","type":"string"},{"constraints":{"required":true},"description":"Num\u00e9ro du point de livraison d'\u00e9lectricit\u00e9, y compris en cas de raccordement indirect. Dans le cas d'un territoire desservi par ENEDIS, ce num\u00e9ro doit compoter 14 chiffres.","example":"12345678912345","name":"num_pdl","type":"string"},{"constraints":{"required":true},"description":"Date de mise en service de la station","example":"2021-12-30","format":"%Y-%m-%d","name":"date_mise_en_service","type":"date"},{"constraints":{"required":false},"description":"Champ destin\u00e9 \u00e0 pr\u00e9ciser les modalit\u00e9s d'acc\u00e8s \u00e0 la recharge, l'accessibilit\u00e9, le tarif, les horaires d'ouverture, ...","example":"Recharge uniquement disponible pendant les horaires d'ouverture du Centre Commercial XY","name":"observations","type":"string"},{"constraints":{"required":true},"description":"Date de mise \u00e0 jour des donn\u00e9es","example":"2021-12-30","format":"%Y-%m-%d","name":"date_maj","type":"date"}],"homepage":"https:\/\/github.com\/etalab\/schema-irve","lastModified":"2021-10-05","missingValues":[""],"name":"irve","path":"https:\/\/github.com\/etalab\/schema-irve\/raw\/v2.0.2\/schema.json","resources":[{"path":"https:\/\/github.com\/etalab\/schema-irve\/raw\/v2.0.2\/exemple-valide.csv","title":"Exemple de fichier IRVE valide"}],"sources":[{"path":"https:\/\/www.legifrance.gouv.fr\/jo_pdf.do?id=JORFTEXT000033860620","title":"D\u00e9cret n\u00b0 2017-26 du 12 janvier 2017 relatif aux infrastructures de recharge pour v\u00e9hicules \u00e9lectriques et portant diverses mesures de transposition de la directive 2014\/94\/UE du Parlement europ\u00e9en et du Conseil du 22 octobre 2014 sur le d\u00e9ploiement d\u2019une infrastructure pour carburants alternatifs"},{"path":"https:\/\/www.legifrance.gouv.fr\/jo_pdf.do?id=JORFTEXT000033860733","title":"Arr\u00eat\u00e9 du 12 janvier 2017 relatif aux donn\u00e9es concernant la localisation g\u00e9ographique et les caract\u00e9ristiques techniques des stations et des points de recharge pour v\u00e9hicules \u00e9lectriques"},{"path":"https:\/\/www.legifrance.gouv.fr\/jo_pdf.do?id=JORFTEXT000033860743","title":"Arr\u00eat\u00e9 du 12 janvier 2017 pr\u00e9cisant les dispositions relatives aux identifiants des unit\u00e9s d\u2019exploitation pour la recharge des v\u00e9hicules \u00e9lectriques"},{"path":"http:\/\/www.afirev.fr\/fr\/informations-generales\/","title":"D\u00e9finition et structure des identifiants attribu\u00e9s par l'Association Fran\u00e7aise pour l'Itin\u00e9rance de la Recharge Electrique des V\u00e9hicules (AFIREV)"}],"title":"Infrastructures de recharge pour v\u00e9hicules \u00e9lectriques","version":"2.0.2"},"scheme":"","stats":{"bytes":0,"fields":39,"hash":"","rows":1}},"scope":["hash-count-error","byte-count-error","field-count-error","row-count-error","blank-header","extra-label","missing-label","blank-label","duplicate-label","incorrect-label","blank-row","primary-key-error","foreign-key-error","extra-cell","missing-cell","type-error","constraint-error","unique-error"],"stats":{"errors":0},"structure_warnings":[],"time":0.055,"valid":true}],"time":0.055,"valid":true,"version":"4.18.2"}} +{"schema":"https://schema.data.gouv.fr/schemas/etalab/schema-irve-statique/2.3.1/schema-statique.json","url":"https://static.data.gouv.fr/resources/fichier-exemple-stations-de-recharge-de-vehicules-electriques/20210505-170339/exemple-valide.csv","options":{"case-sensitive-header":"true"},"date":"2024-08-23T12:01:33.190039+00:00","version":"0.12.0","report":{"valid":true,"stats":{"errors":0,"warnings":1,"seconds":0.074,"fields":39,"rows":1},"warnings":["Colonne manquante : Ajoutez la colonne manquante `cable_t2_attache`."],"errors":[]}} diff --git a/apps/shared/test/fixtures/validata_with_opening_hours_error.json b/apps/shared/test/fixtures/validata_with_opening_hours_error.json index acefdec5e7..d3ffd15ff9 100644 --- a/apps/shared/test/fixtures/validata_with_opening_hours_error.json +++ b/apps/shared/test/fixtures/validata_with_opening_hours_error.json @@ -1 +1 @@ -{"_meta":{"args":{"schema":"https:\/\/schema.data.gouv.fr\/schemas\/etalab\/schema-lieux-covoiturage\/0.2.4\/schema.json","url":"https:\/\/gist.githubusercontent.com\/AntoineAugusti\/59889a3e82ecfcdcc40cddaf8bfbd8cc\/raw\/4cd50116e4b8232be0a86136f57153992f737306\/covoit_invalide.csv"},"validata-table-version":"0.6.1","validata-core-version":"0.8.4"},"report":{"date":"2022-04-28T13:08:04.054599+00:00","errors":[],"stats":{"errors":1,"tasks":1},"tasks":[{"errors":[{"cell":"lundi \u00e0 dimanche","cells":["76217-C-001","None","Gare SNCF de Dieppe","2 Boulevard Georges Clemenceau","Dieppe","76217","Parking","2019-06-25","True","217602176","1.081183","49.921823","20","2","None","lundi \u00e0 dimanche","Ville de Dieppe","True","Correspondance avec la ligne TER Dieppe-Rouen"],"code":"opening-hours-value","description":"","fieldName":"horaires","fieldNumber":16,"fieldPosition":16,"message":"La valeur 'lundi \u00e0 dimanche' n'est pas une d\u00e9finition d'horaire d'ouverture correcte.\n\n Celle-ci doit respecter la sp\u00e9cification [OpenStreetMap](https:\/\/wiki.openstreetmap.org\/wiki\/Key:opening_hours) de description d'horaires d'ouverture.","name":"Horaires d'ouverture incorrects","note":"","rowNumber":1,"rowPosition":2,"tags":["#body"]}],"partial":false,"resource":{"data":[["id_lieu","id_local","nom_lieu","ad_lieu","com_lieu","insee","type","date_maj","ouvert","source","Xlong","Ylat","nbre_pl","nbre_pmr","duree","horaires","proprio","lumiere","comm"],["76217-C-001","","Gare SNCF de Dieppe","2 Boulevard Georges Clemenceau","Dieppe","76217","Parking","2019-06-25","true","217602176","1.081183","49.921823","20","2","","lundi \u00e0 dimanche","Ville de Dieppe","true","Correspondance avec la ligne TER Dieppe-Rouen"]],"format":"inline","hashing":"md5","layout":{"limitRows":100000},"name":"memory","profile":"tabular-data-resource","schema":{"$schema":"https:\/\/frictionlessdata.io\/schemas\/table-schema.json","author":"Antoine Augusti pour Etalab","contact":"contact@transport.beta.gouv.fr","contributors":[{"email":"contact@transport.beta.gouv.fr","organisation":"transport.data.gouv.fr","role":"contributor","title":"Miryad Ali et Francis Chabouis"},{"email":"ishan@beta.gouv.fr","organisation":"transport.data.gouv.fr","role":"contributor","title":"Ishan Bhojwani"},{"email":"antoine.augusti@data.gouv.fr","organisation":"Etalab","role":"contributor","title":"Antoine Augusti"},{"email":"loic.hay@gmail.com ","organisation":"Open Data France","role":"contributor","title":"Lo\u00efc Hay"},{"email":"sophie.raspail@ct-corse.fr","organisation":"Agence d'Am\u00e9nagement et d'Urbanisme de Corse","role":"contributor","title":"Sophie Raspail"},{"email":"","organisation":"","role":"contributor","title":"Tristan Roussel"},{"email":"johan.richer@jailbreak.paris","organisation":"Jailbreak","role":"contributor","title":"Johan Richer"}],"countryCode":"FR","created":"2019-06-25","custom_checks":[{"name":"french-siren-value","params":{"column":"source"}},{"name":"opening-hours-value","params":{"column":"horaires"}}],"description":"Sp\u00e9cification des lieux permettant le covoiturage","example":"https:\/\/github.com\/etalab\/schema-lieux-covoiturage\/raw\/v0.2.4\/exemple-valide.csv","fields":[{"constraints":{"pattern":"^([013-9]\\d|2[AB1-9])\\d{3}-C-\\d{3}$","required":true},"description":"Identifiant du lieu de covoiturage, d\u00e9livr\u00e9 par le point d'acc\u00e8s national selon la r\u00e8gle INSEE-C-XXX o\u00f9 INSEE est le code INSEE de la commune et XXX est le num\u00e9ro d\u2019ordre d'arriv\u00e9e dans la base sur 3 chiffres, commen\u00e7ant par 001","example":"35238-C-001 pour la premi\u00e8re aire r\u00e9f\u00e9renc\u00e9e dans la commune de code INSEE 35238","name":"id_lieu","type":"string"},{"constraints":{"required":false},"description":"Identifiant du lieu de covoiturage fix\u00e9 par le producteur de la donn\u00e9e pour son propre usage","example":"23X01","name":"id_local","type":"string"},{"constraints":{"required":true},"description":"Le nom du lieu de covoiturage. Recommandation : inutile de r\u00e9p\u00e9ter la nature du type de covoiturage","example":"Les Romains","name":"nom_lieu","type":"string"},{"constraints":{"required":false},"description":"L'adresse du lieu compr\u00e9hensible par le grand public pour assurer la coordination entre le passager et le conducteur. Exemple : \"3, rue de la gare\" ; pour les lieux proches des sorties d'autoroute ou de nationale : \"A11 sortie 7 Le Mans Nord\" ; pour les zones rurales sans adresse : \"croisement de route 1 - route 2\" ou \"le long de route X apr\u00e8s le passage \u00e0 niveau\"","example":"3, rue de la Gare","name":"ad_lieu","type":"string"},{"constraints":{"required":false},"description":"La commune \/ le lieu-dit du covoiturage","example":"Rouen","name":"com_lieu","type":"string"},{"constraints":{"pattern":"^([013-9]\\d|2[AB1-9])\\d{3}$","required":true},"description":"Le code INSEE de la commune d'implantation","example":"76540","name":"insee","type":"string"},{"constraints":{"enum":["Aire de covoiturage","Sortie d'autoroute","Parking","Supermarch\u00e9","Parking relais","D\u00e9laiss\u00e9 routier","Auto-stop"],"required":true},"description":"Le type de lieu de covoiturage","example":"Parking","name":"type","type":"string"},{"constraints":{"required":true},"description":"Date de derni\u00e8re mise \u00e0 jour des donn\u00e9es. Notation ISO 8601, format AAAA-MM-DD","example":"2016-10-31","format":"%Y-%m-%d","name":"date_maj","type":"date"},{"constraints":{"required":true},"description":"Le lieu est il actuellement accessible (actif ou inactif)","example":"true","name":"ouvert","type":"boolean"},{"constraints":{"pattern":"^\\d{9}$","required":false},"description":"SIREN de l'entit\u00e9 ayant fourni la donn\u00e9e","example":"225300011","name":"source","type":"string"},{"constraints":{"maximum":180,"minimum":-180,"required":true},"description":"La longitude en degr\u00e9s d\u00e9cimaux (point comme s\u00e9parateur d\u00e9cimal, avec au moins 4 chiffres apr\u00e8s le point d\u00e9cimal) de la localisation de l\u2019entr\u00e9e du lieu de covoiturage exprim\u00e9e dans le syst\u00e8me de coordonn\u00e9es WGS84","example":"1.452323","name":"Xlong","type":"number"},{"constraints":{"maximum":90,"minimum":-90,"required":true},"description":"La latitude en degr\u00e9s d\u00e9cimaux (point comme s\u00e9parateur d\u00e9cimal, avec au moins 4 chiffres apr\u00e8s le point d\u00e9cimal) de la localisation de l\u2019entr\u00e9e du lieu de covoiturage exprim\u00e9e dans le syst\u00e8me de coordonn\u00e9es WGS84","example":"46.59698","name":"Ylat","type":"number"},{"constraints":{"minimum":0,"required":false},"description":"Le nombre de places r\u00e9serv\u00e9es au stationnement disponibles","example":"42","name":"nbre_pl","type":"integer"},{"constraints":{"minimum":0,"required":false},"description":"Le nombre de places PMR disponibles","example":"3","name":"nbre_pmr","type":"integer"},{"constraints":{"minimum":0,"required":false},"description":"S'il existe une restriction sur la dur\u00e9e de stationnement autoris\u00e9e, la dur\u00e9e maximale de stationnement autoris\u00e9e exprim\u00e9e en minutes","example":"60","name":"duree","type":"integer"},{"constraints":{"required":false},"description":"Ce champ permet de renseigner, si l'information est connue, les jours et horaires d'ouverture de l'\u00e9quipement","example":"Mo-Fr 08:00-20:00","name":"horaires","type":"string"},{"constraints":{"required":false},"description":"Le nom de l'am\u00e9nageur, c'est-\u00e0-dire de l'entit\u00e9 publique ou priv\u00e9e propri\u00e9taire des infrastructures","example":"D\u00e9partement","name":"proprio","type":"string"},{"constraints":{"required":false},"description":"Un \u00e9clairage nocturne est-il pr\u00e9sent","example":false,"name":"lumiere","type":"boolean"},{"constraints":{"required":false},"description":"Commentaires \u00e9ventuels sur les commodit\u00e9s mises \u00e0 disposition du grand public comme : le num\u00e9ro de t\u00e9l\u00e9phone unique qui indique les services disponibles au moment de l'arriv\u00e9e sur l'aire pour r\u00e9aliser le dernier kilom\u00e8tre ; la pr\u00e9sence de prises 220V ou USB ; acc\u00e8s \u00e0 du r\u00e9seau (t\u00e9l\u00e9com, WiFi) ; sanitaires ; intermodalit\u00e9 en transports","example":"Pr\u00e9sence de sanitaires et acc\u00e8s \u00e0 de l'eau courante","name":"comm","type":"string"}],"homepage":"https:\/\/github.com\/etalab\/schema-lieux-covoiturage","keywords":["covoiturage","transport","mobilit\u00e9"],"licenses":[{"name":"etalab-2.0","path":"https:\/\/www.etalab.gouv.fr\/licence-ouverte-open-licence","title":"Licence Ouverte"}],"missingValues":[""],"primaryKey":"id_lieu","resources":[{"name":"exemple-valide","path":"https:\/\/github.com\/etalab\/schema-lieux-covoiturage\/raw\/v0.2.2\/exemple-valide.csv","title":"Ressource valide"},{"name":"exemple-invalide","path":"https:\/\/github.com\/etalab\/schema-lieux-covoiturage\/raw\/v0.2.2\/exemple-invalide.csv","title":"Ressource invalide"}],"title":"Lieux de covoiturage","updated":"2022-04-13","uri":"https:\/\/github.com\/etalab\/schema-lieux-covoiturage\/raw\/v0.2.4\/schema.json","version":"0.2.4"},"scheme":"","stats":{"bytes":0,"fields":19,"hash":"","rows":1}},"scope":["hash-count-error","byte-count-error","field-count-error","row-count-error","blank-header","extra-label","missing-label","blank-label","duplicate-label","incorrect-label","blank-row","primary-key-error","foreign-key-error","extra-cell","missing-cell","type-error","constraint-error","unique-error"],"stats":{"errors":1},"structure_warnings":[],"time":0.026,"valid":false}],"time":0.026,"valid":false,"version":"4.18.2"}} +{"schema":"https://schema.data.gouv.fr/schemas/etalab/schema-lieux-covoiturage/0.2.4/schema.json","url":"https://gist.githubusercontent.com/AntoineAugusti/59889a3e82ecfcdcc40cddaf8bfbd8cc/raw/4cd50116e4b8232be0a86136f57153992f737306/covoit_invalide.csv","options":{"case-sensitive-header":"true"},"date":"2024-08-23T12:02:37.487948+00:00","version":"0.12.0","report":{"valid":false,"stats":{"errors":1,"warnings":0,"seconds":0.04,"fields":19,"rows":1},"warnings":[],"errors":[{"message":"La valeur 'lundi à dimanche' n'est pas une définition d'horaire d'ouverture correcte.\n\n Celle-ci doit respecter la spécification [OpenStreetMap](https://wiki.openstreetmap.org/wiki/Key:opening_hours) de description d'horaires d'ouverture.","type":"opening-hours-value","tags":["#body"],"rowNumber":2,"fieldName":"horaires","fieldNumber":16,"cell":"lundi à dimanche"}]}} From f66e53a8bc534d2021e2970970015e39ef5df7e8 Mon Sep 17 00:00:00 2001 From: Antoine Augusti Date: Mon, 26 Aug 2024 10:02:09 +0200 Subject: [PATCH 2/6] Update TableSchemaValidator for Validata 0.12.0 --- .../lib/validation/tableschema_validator.ex | 44 ++++++------ .../validation/tableschema_validator_test.exs | 71 ++++++++----------- 2 files changed, 53 insertions(+), 62 deletions(-) diff --git a/apps/shared/lib/validation/tableschema_validator.ex b/apps/shared/lib/validation/tableschema_validator.ex index f674d2dc38..0757c426b8 100644 --- a/apps/shared/lib/validation/tableschema_validator.ex +++ b/apps/shared/lib/validation/tableschema_validator.ex @@ -23,11 +23,13 @@ defmodule Shared.Validation.TableSchemaValidator do """ import Transport.Shared.Schemas @behaviour Shared.Validation.TableSchemaValidator.Wrapper + @timeout 180_000 + @max_nb_errors 100 @validata_web_url URI.parse("https://validata.fr/table-schema") @validata_api_url URI.parse("https://api.validata.etalab.studio/validate") - # https://git.opendatafrance.net/validata/validata-core/-/blob/75ee5258010fc43b6a164122eff2579c2adc01a7/validata_core/helpers.py#L152 - @structure_tags ["#head", "#structure"] + # https://gitlab.com/validata-table/validata-table/-/blob/main/src/validata_core/domain/helpers.py#L57 + @structure_tags MapSet.new(["#head", "#structure", "#header"]) @impl true def validate(schema_name, url, schema_version \\ "latest") when is_binary(schema_name) and is_binary(url) do @@ -70,33 +72,23 @@ defmodule Shared.Validation.TableSchemaValidator do |> URI.to_string() end - defp build_report( - %{"report" => %{"tasks" => tasks}, "_meta" => %{"validata-table-version" => validata_version}} = payload - ) do - if Enum.count(tasks) != 1 do - raise "tasks should have a length of 1 for response #{payload}" - end - - raw_errors = hd(tasks)["errors"] - # We count the errors on our side, because the error count given by the report can be wrong - # see https://git.opendatafrance.net/validata/validata-core/-/issues/37 - nb_errors = Enum.count(raw_errors) + defp build_report(%{ + "report" => %{"valid" => valid, "stats" => %{"errors" => nb_errors}, "errors" => errors}, + "version" => validata_version + }) do + {structure_errors, row_errors} = Enum.split_with(errors, &structure_error?/1) - {row_errors, structure_errors} = - raw_errors |> Enum.split_with(&MapSet.disjoint?(MapSet.new(&1["tags"]), MapSet.new(@structure_tags))) - - structure_errors = structure_errors |> Enum.map(&~s(#{&1["name"]} : #{&1["message"]})) + structure_errors = Enum.map(structure_errors, & &1["message"]) row_errors = - row_errors - |> Enum.map(fn row -> - ~s(#{row["name"]} : colonne #{row["fieldName"]}, ligne #{row["rowPosition"]}. #{row["message"]}) + Enum.map(row_errors, fn row -> + ~s(#{row["message"]} Colonne `#{row["fieldName"]}`, ligne #{row["rowNumber"]}.) end) - errors = (structure_errors ++ row_errors) |> Enum.take(100) + errors = (structure_errors ++ row_errors) |> Enum.take(@max_nb_errors) %{ - "has_errors" => nb_errors > 0, + "has_errors" => not valid, "errors_count" => nb_errors, "errors" => errors, "validator" => __MODULE__, @@ -106,6 +98,14 @@ defmodule Shared.Validation.TableSchemaValidator do defp build_report(_), do: nil + defp structure_error?(%{"tags" => tags, "type" => type} = _row) do + has_structure_tags = not MapSet.disjoint?(MapSet.new(tags), @structure_tags) + # May not need to rely on error type in the future. + # https://gitlab.com/validata-table/validata-table/-/issues/154 + eligible_error_type = type in ["check-error"] + has_structure_tags or eligible_error_type + end + defp ensure_schema_is_tableschema!(schema_name) do unless Enum.member?(tableschema_names(), schema_name) do raise "#{schema_name} is not a tableschema" diff --git a/apps/shared/test/validation/tableschema_validator_test.exs b/apps/shared/test/validation/tableschema_validator_test.exs index 654f89f2a8..ffdcc6323a 100644 --- a/apps/shared/test/validation/tableschema_validator_test.exs +++ b/apps/shared/test/validation/tableschema_validator_test.exs @@ -46,43 +46,34 @@ defmodule Shared.Validation.TableSchemaValidatorTest do assert %{ "errors" => [ - "Colonne obligatoire manquante : La colonne obligatoire `siren_amenageur` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `contact_amenageur` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `contact_operateur` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `nom_enseigne` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `id_station_itinerance` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `nom_station` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `implantation_station` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `adresse_station` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `code_insee_commune` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `coordonneesXY` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `id_pdc_itinerance` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `puissance_nominale` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `prise_type_ef` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `prise_type_2` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `prise_type_combo_ccs` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `prise_type_chademo` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `prise_type_autre` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `gratuit` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `paiement_acte` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `paiement_cb` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `paiement_autre` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `condition_acces` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `reservation` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `horaires` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `accessibilite_pmr` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `restriction_gabarit` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `station_deux_roues` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `raccordement` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `num_pdl` est manquante.", - "Colonne obligatoire manquante : La colonne obligatoire `date_mise_en_service` est manquante.", - "Format de date incorrect : colonne date_maj, ligne 2. La date doit être écrite sous la forme `aaaa-mm-jj`.", - "Format de date incorrect : colonne date_maj, ligne 3. La date doit être écrite sous la forme `aaaa-mm-jj`." + "La colonne obligatoire `contact_operateur` est manquante.", + "La colonne obligatoire `nom_enseigne` est manquante.", + "La colonne obligatoire `id_station_itinerance` est manquante.", + "La colonne obligatoire `nom_station` est manquante.", + "La colonne obligatoire `implantation_station` est manquante.", + "La colonne obligatoire `adresse_station` est manquante.", + "La colonne obligatoire `coordonneesXY` est manquante.", + "La colonne obligatoire `id_pdc_itinerance` est manquante.", + "La colonne obligatoire `puissance_nominale` est manquante.", + "La colonne obligatoire `prise_type_ef` est manquante.", + "La colonne obligatoire `prise_type_2` est manquante.", + "La colonne obligatoire `prise_type_combo_ccs` est manquante.", + "La colonne obligatoire `prise_type_chademo` est manquante.", + "La colonne obligatoire `prise_type_autre` est manquante.", + "La colonne obligatoire `paiement_acte` est manquante.", + "La colonne obligatoire `condition_acces` est manquante.", + "La colonne obligatoire `reservation` est manquante.", + "La colonne obligatoire `horaires` est manquante.", + "La colonne obligatoire `accessibilite_pmr` est manquante.", + "La colonne obligatoire `restriction_gabarit` est manquante.", + "La colonne obligatoire `station_deux_roues` est manquante.", + "Format de date incorrect : La date doit être écrite sous la forme `aaaa-mm-jj`. Colonne `date_maj`, ligne 2.", + "Format de date incorrect : La date doit être écrite sous la forme `aaaa-mm-jj`. Colonne `date_maj`, ligne 3." ], - "errors_count" => 32, + "errors_count" => 23, "has_errors" => true, - "validator" => Shared.Validation.TableSchemaValidator, - "validata_api_version" => "0.6.1" + "validata_api_version" => "0.12.0", + "validator" => Shared.Validation.TableSchemaValidator } == validate(@schema_name, @url) end @@ -95,7 +86,7 @@ defmodule Shared.Validation.TableSchemaValidatorTest do "errors_count" => 0, "has_errors" => false, "validator" => Shared.Validation.TableSchemaValidator, - "validata_api_version" => "0.6.1" + "validata_api_version" => "0.12.0" } == validate(@schema_name, @url) end @@ -118,12 +109,12 @@ defmodule Shared.Validation.TableSchemaValidatorTest do assert %{ "errors" => [ - "Horaires d'ouverture incorrects : colonne horaires, ligne 2. La valeur 'lundi à dimanche' n'est pas une définition d'horaire d'ouverture correcte.\n\n Celle-ci doit respecter la spécification [OpenStreetMap](https://wiki.openstreetmap.org/wiki/Key:opening_hours) de description d'horaires d'ouverture." + "La valeur 'lundi à dimanche' n'est pas une définition d'horaire d'ouverture correcte.\n\n Celle-ci doit respecter la spécification [OpenStreetMap](https://wiki.openstreetmap.org/wiki/Key:opening_hours) de description d'horaires d'ouverture. Colonne `horaires`, ligne 2." ], "errors_count" => 1, "has_errors" => true, "validator" => Shared.Validation.TableSchemaValidator, - "validata_api_version" => "0.6.1" + "validata_api_version" => "0.12.0" } == validate(@schema_name, @url) end @@ -133,12 +124,12 @@ defmodule Shared.Validation.TableSchemaValidatorTest do assert %{ "errors" => [ - "Check Error : colonne , ligne . Check is not valid: 'french_gps_coordinates': custom check inconnu." + "Check is not valid: 'french_gps_coordinates': custom check inconnu." ], "errors_count" => 1, "has_errors" => true, "validator" => Shared.Validation.TableSchemaValidator, - "validata_api_version" => "0.6.1" + "validata_api_version" => "0.12.0" } == validate(@schema_name, @url) end end From 52c51ca2c4bba28cb154c128f4473697c2df80b1 Mon Sep 17 00:00:00 2001 From: Pierre Camilleri <22995923+pierrecamilleri@users.noreply.github.com> Date: Wed, 6 Nov 2024 15:52:18 +0100 Subject: [PATCH 3/6] remove impossible tag "#head" --- apps/shared/lib/validation/tableschema_validator.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/shared/lib/validation/tableschema_validator.ex b/apps/shared/lib/validation/tableschema_validator.ex index 0757c426b8..69b9e0c339 100644 --- a/apps/shared/lib/validation/tableschema_validator.ex +++ b/apps/shared/lib/validation/tableschema_validator.ex @@ -29,7 +29,7 @@ defmodule Shared.Validation.TableSchemaValidator do @validata_web_url URI.parse("https://validata.fr/table-schema") @validata_api_url URI.parse("https://api.validata.etalab.studio/validate") # https://gitlab.com/validata-table/validata-table/-/blob/main/src/validata_core/domain/helpers.py#L57 - @structure_tags MapSet.new(["#head", "#structure", "#header"]) + @structure_tags MapSet.new(["#structure", "#header"]) @impl true def validate(schema_name, url, schema_version \\ "latest") when is_binary(schema_name) and is_binary(url) do From dab719bd23ec828036c0c1f4b5112cade043bef2 Mon Sep 17 00:00:00 2001 From: Pierre Camilleri <22995923+pierrecamilleri@users.noreply.github.com> Date: Wed, 6 Nov 2024 16:47:54 +0100 Subject: [PATCH 4/6] update fixtures after v0.12.0 --- .../test/fixtures/validata_unknown_custom_check_error.json | 2 +- apps/shared/test/fixtures/validata_with_errors.json | 2 +- apps/shared/test/fixtures/validata_with_file_error.json | 2 +- apps/shared/test/fixtures/validata_with_no_errors.json | 2 +- .../shared/test/fixtures/validata_with_opening_hours_error.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/shared/test/fixtures/validata_unknown_custom_check_error.json b/apps/shared/test/fixtures/validata_unknown_custom_check_error.json index c97252c8f1..da253d0187 100644 --- a/apps/shared/test/fixtures/validata_unknown_custom_check_error.json +++ b/apps/shared/test/fixtures/validata_unknown_custom_check_error.json @@ -1 +1 @@ -{"schema":"https://schema.data.gouv.fr/schemas/etalab/schema-stationnement-cyclable/1.1.1/schema.json","url":"https://static.data.gouv.fr/resources/stationnement-cyclable-communaute-lesneven-cote-des-legendes/20220617-135734/data.csv","version":"0.12.0","date":"2022-06-20T07:49:33.810216+00:00","report":{"stats":{"errors":1,"warnings":0,"seconds":0.04,"fields":21,"rows":76},"errors":[{"message":"Check is not valid: 'french_gps_coordinates': custom check inconnu.","type":"check-error","tags":[]}],"valid":false}} +{"schema":"https://schema.data.gouv.fr/schemas/etalab/schema-stationnement-cyclable/1.1.1/schema.json","url":"https://static.data.gouv.fr/resources/stationnement-cyclable-communaute-lesneven-cote-des-legendes/20220617-135734/data.csv","options":{"ignore_header_case":"false"},"version":"0.12.0","date":"2022-06-20T07:49:33.810216+00:00","report":{"valid":false,"stats":{"errors":1,"warnings":0,"seconds":0.04,"fields":21,"rows":76},"errors":[{"message":"Tentative de définir le custom check 'french_gps_coordinates', qui n'est pas connu.","type":"check-error","tags":["#structure"]}]}} diff --git a/apps/shared/test/fixtures/validata_with_errors.json b/apps/shared/test/fixtures/validata_with_errors.json index d2e81e5abe..4ded18f592 100644 --- a/apps/shared/test/fixtures/validata_with_errors.json +++ b/apps/shared/test/fixtures/validata_with_errors.json @@ -1 +1 @@ -{"schema":"https://schema.data.gouv.fr/schemas/etalab/schema-irve-statique/2.3.1/schema-statique.json","url":"https://raw.githubusercontent.com/etalab/schema-irve/v1.0.3/exemple-valide.csv","options":{"caseSensitiveHeader":"true"},"date":"2024-08-23T09:14:44.729885+00:00","version":"0.12.0","report":{"valid":false,"stats":{"errors":23,"warnings":30,"seconds":0.104,"fields":38,"rows":2},"warnings":["Colonne manquante : Ajoutez la colonne manquante `nom_amenageur`.","Colonne manquante : Ajoutez la colonne manquante `siren_amenageur`.","Colonne manquante : Ajoutez la colonne manquante `contact_amenageur`.","Colonne manquante : Ajoutez la colonne manquante `nom_operateur`.","Colonne manquante : Ajoutez la colonne manquante `telephone_operateur`.","Colonne manquante : Ajoutez la colonne manquante `id_station_local`.","Colonne manquante : Ajoutez la colonne manquante `code_insee_commune`.","Colonne manquante : Ajoutez la colonne manquante `id_pdc_local`.","Colonne manquante : Ajoutez la colonne manquante `gratuit`.","Colonne manquante : Ajoutez la colonne manquante `paiement_cb`.","Colonne manquante : Ajoutez la colonne manquante `paiement_autre`.","Colonne manquante : Ajoutez la colonne manquante `tarification`.","Colonne manquante : Ajoutez la colonne manquante `raccordement`.","Colonne manquante : Ajoutez la colonne manquante `num_pdl`.","Colonne manquante : Ajoutez la colonne manquante `date_mise_en_service`.","Colonne manquante : Ajoutez la colonne manquante `cable_t2_attache`.","Colonne surnuméraire : Retirez la colonne `n_amenageur` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `n_operateur` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `n_enseigne` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `id_station` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `n_station` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `ad_station` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `code_insee` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `Xlongitude` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `Ylatitude` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `id_pdc` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `puiss_max` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `type_prise` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `acces_recharge` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `accessibilité` non définie dans le schéma."],"errors":[{"message":"La colonne obligatoire `contact_operateur` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"contact_operateur","fieldNumber":18},{"message":"La colonne obligatoire `nom_enseigne` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"nom_enseigne","fieldNumber":19},{"message":"La colonne obligatoire `id_station_itinerance` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"id_station_itinerance","fieldNumber":20},{"message":"La colonne obligatoire `nom_station` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"nom_station","fieldNumber":21},{"message":"La colonne obligatoire `implantation_station` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"implantation_station","fieldNumber":22},{"message":"La colonne obligatoire `adresse_station` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"adresse_station","fieldNumber":23},{"message":"La colonne obligatoire `coordonneesXY` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"coordonneesXY","fieldNumber":24},{"message":"La colonne obligatoire `id_pdc_itinerance` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"id_pdc_itinerance","fieldNumber":25},{"message":"La colonne obligatoire `puissance_nominale` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"puissance_nominale","fieldNumber":26},{"message":"La colonne obligatoire `prise_type_ef` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"prise_type_ef","fieldNumber":27},{"message":"La colonne obligatoire `prise_type_2` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"prise_type_2","fieldNumber":28},{"message":"La colonne obligatoire `prise_type_combo_ccs` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"prise_type_combo_ccs","fieldNumber":29},{"message":"La colonne obligatoire `prise_type_chademo` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"prise_type_chademo","fieldNumber":30},{"message":"La colonne obligatoire `prise_type_autre` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"prise_type_autre","fieldNumber":31},{"message":"La colonne obligatoire `paiement_acte` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"paiement_acte","fieldNumber":32},{"message":"La colonne obligatoire `condition_acces` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"condition_acces","fieldNumber":33},{"message":"La colonne obligatoire `reservation` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"reservation","fieldNumber":34},{"message":"La colonne obligatoire `horaires` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"horaires","fieldNumber":35},{"message":"La colonne obligatoire `accessibilite_pmr` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"accessibilite_pmr","fieldNumber":36},{"message":"La colonne obligatoire `restriction_gabarit` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"restriction_gabarit","fieldNumber":37},{"message":"La colonne obligatoire `station_deux_roues` est manquante.","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"station_deux_roues","fieldNumber":38},{"message":"Format de date incorrect : La date doit être écrite sous la forme `aaaa-mm-jj`.","type":"type-error","tags":["#table","#row","#cell"],"rowNumber":2,"fieldName":"date_maj","fieldNumber":17,"cell":"2018/03/31"},{"message":"Format de date incorrect : La date doit être écrite sous la forme `aaaa-mm-jj`.","type":"type-error","tags":["#table","#row","#cell"],"rowNumber":3,"fieldName":"date_maj","fieldNumber":17,"cell":"2018/3/31"}]}} +{"schema":"https://schema.data.gouv.fr/schemas/etalab/schema-irve-statique/2.3.1/schema-statique.json","url":"https://raw.githubusercontent.com/etalab/schema-irve/v1.0.3/exemple-valide.csv","options":{"ignore_header_case":"false"},"version":"0.12.0","date":"2024-11-06T15:10:22.595699+00:00","report":{"valid":false,"stats":{"errors":23,"warnings":30,"seconds":0.035,"fields":17,"rows":2,"rows_processed":2},"warnings":["Colonne manquante : Ajoutez la colonne manquante `nom_amenageur`.","Colonne manquante : Ajoutez la colonne manquante `siren_amenageur`.","Colonne manquante : Ajoutez la colonne manquante `contact_amenageur`.","Colonne manquante : Ajoutez la colonne manquante `nom_operateur`.","Colonne manquante : Ajoutez la colonne manquante `telephone_operateur`.","Colonne manquante : Ajoutez la colonne manquante `id_station_local`.","Colonne manquante : Ajoutez la colonne manquante `code_insee_commune`.","Colonne manquante : Ajoutez la colonne manquante `id_pdc_local`.","Colonne manquante : Ajoutez la colonne manquante `gratuit`.","Colonne manquante : Ajoutez la colonne manquante `paiement_cb`.","Colonne manquante : Ajoutez la colonne manquante `paiement_autre`.","Colonne manquante : Ajoutez la colonne manquante `tarification`.","Colonne manquante : Ajoutez la colonne manquante `raccordement`.","Colonne manquante : Ajoutez la colonne manquante `num_pdl`.","Colonne manquante : Ajoutez la colonne manquante `date_mise_en_service`.","Colonne manquante : Ajoutez la colonne manquante `cable_t2_attache`.","Colonne surnuméraire : Retirez la colonne `n_amenageur` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `n_operateur` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `n_enseigne` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `id_station` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `n_station` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `ad_station` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `code_insee` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `Xlongitude` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `Ylatitude` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `id_pdc` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `puiss_max` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `type_prise` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `acces_recharge` non définie dans le schéma.","Colonne surnuméraire : Retirez la colonne `accessibilité` non définie dans le schéma."],"errors":[{"message":"La colonne obligatoire `contact_operateur` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"contact_operateur","fieldNumber":18},{"message":"La colonne obligatoire `nom_enseigne` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"nom_enseigne","fieldNumber":19},{"message":"La colonne obligatoire `id_station_itinerance` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"id_station_itinerance","fieldNumber":20},{"message":"La colonne obligatoire `nom_station` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"nom_station","fieldNumber":21},{"message":"La colonne obligatoire `implantation_station` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"implantation_station","fieldNumber":22},{"message":"La colonne obligatoire `adresse_station` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"adresse_station","fieldNumber":23},{"message":"La colonne obligatoire `coordonneesXY` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"coordonneesXY","fieldNumber":24},{"message":"La colonne obligatoire `id_pdc_itinerance` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"id_pdc_itinerance","fieldNumber":25},{"message":"La colonne obligatoire `puissance_nominale` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"puissance_nominale","fieldNumber":26},{"message":"La colonne obligatoire `prise_type_ef` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"prise_type_ef","fieldNumber":27},{"message":"La colonne obligatoire `prise_type_2` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"prise_type_2","fieldNumber":28},{"message":"La colonne obligatoire `prise_type_combo_ccs` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"prise_type_combo_ccs","fieldNumber":29},{"message":"La colonne obligatoire `prise_type_chademo` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"prise_type_chademo","fieldNumber":30},{"message":"La colonne obligatoire `prise_type_autre` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"prise_type_autre","fieldNumber":31},{"message":"La colonne obligatoire `paiement_acte` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"paiement_acte","fieldNumber":32},{"message":"La colonne obligatoire `condition_acces` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"condition_acces","fieldNumber":33},{"message":"La colonne obligatoire `reservation` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"reservation","fieldNumber":34},{"message":"La colonne obligatoire `horaires` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"horaires","fieldNumber":35},{"message":"La colonne obligatoire `accessibilite_pmr` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"accessibilite_pmr","fieldNumber":36},{"message":"La colonne obligatoire `restriction_gabarit` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"restriction_gabarit","fieldNumber":37},{"message":"La colonne obligatoire `station_deux_roues` est manquante","type":"missing-label","tags":["#table","#header","#label"],"fieldName":"station_deux_roues","fieldNumber":38},{"message":"La date doit être écrite sous la forme `aaaa-mm-jj`","type":"type-error","tags":["#table","#row","#cell"],"rowNumber":2,"fieldName":"date_maj","fieldNumber":17,"cell":"2018/03/31"},{"message":"La date doit être écrite sous la forme `aaaa-mm-jj`","type":"type-error","tags":["#table","#row","#cell"],"rowNumber":3,"fieldName":"date_maj","fieldNumber":17,"cell":"2018/3/31"}]}} diff --git a/apps/shared/test/fixtures/validata_with_file_error.json b/apps/shared/test/fixtures/validata_with_file_error.json index 879ce12ebc..c9f49fff5e 100644 --- a/apps/shared/test/fixtures/validata_with_file_error.json +++ b/apps/shared/test/fixtures/validata_with_file_error.json @@ -1 +1 @@ -{"schema":"https://schema.data.gouv.fr/schemas/etalab/schema-irve/latest/schema.json","url":"https://www.data.gouv.fr/fr/datasets/r/099eb6ff-bcf4-42be-bda7-61dfe1ca4c9f","version":"0.12.0","date":"2024-08-23T09:14:44.729885+00:00","error":{"message":"impossible de lire le contenu","type":"source-error"}} +{"schema":"https://schema.data.gouv.fr/schemas/etalab/schema-irve/latest/schema.json","url":"https://www.data.gouv.fr/fr/datasets/r/099eb6ff-bcf4-42be-bda7-61dfe1ca4c9f","options":{"ignore_header_case":"false"},"error":{"message":"JSON non valide ; Expecting value: line 1 column 1 (char 0)","type":"json-format-error"}} diff --git a/apps/shared/test/fixtures/validata_with_no_errors.json b/apps/shared/test/fixtures/validata_with_no_errors.json index 76ea353f54..59f0671160 100644 --- a/apps/shared/test/fixtures/validata_with_no_errors.json +++ b/apps/shared/test/fixtures/validata_with_no_errors.json @@ -1 +1 @@ -{"schema":"https://schema.data.gouv.fr/schemas/etalab/schema-irve-statique/2.3.1/schema-statique.json","url":"https://static.data.gouv.fr/resources/fichier-exemple-stations-de-recharge-de-vehicules-electriques/20210505-170339/exemple-valide.csv","options":{"case-sensitive-header":"true"},"date":"2024-08-23T12:01:33.190039+00:00","version":"0.12.0","report":{"valid":true,"stats":{"errors":0,"warnings":1,"seconds":0.074,"fields":39,"rows":1},"warnings":["Colonne manquante : Ajoutez la colonne manquante `cable_t2_attache`."],"errors":[]}} +{"schema":"https://schema.data.gouv.fr/schemas/etalab/schema-irve-statique/2.3.1/schema-statique.json","url":"https://static.data.gouv.fr/resources/fichier-exemple-stations-de-recharge-de-vehicules-electriques/20210505-170339/exemple-valide.csv","options":{"ignore_header_case":"false"},"date":"2024-08-23T12:01:33.190039+00:00","version":"0.12.0","report":{"valid":true,"stats":{"errors":0,"warnings":1,"seconds":0.074,"fields":39,"rows":1,"rows_processed":1},"warnings":["Colonne manquante : Ajoutez la colonne manquante `cable_t2_attache`."],"errors":[]}} diff --git a/apps/shared/test/fixtures/validata_with_opening_hours_error.json b/apps/shared/test/fixtures/validata_with_opening_hours_error.json index d3ffd15ff9..ea1ac64e45 100644 --- a/apps/shared/test/fixtures/validata_with_opening_hours_error.json +++ b/apps/shared/test/fixtures/validata_with_opening_hours_error.json @@ -1 +1 @@ -{"schema":"https://schema.data.gouv.fr/schemas/etalab/schema-lieux-covoiturage/0.2.4/schema.json","url":"https://gist.githubusercontent.com/AntoineAugusti/59889a3e82ecfcdcc40cddaf8bfbd8cc/raw/4cd50116e4b8232be0a86136f57153992f737306/covoit_invalide.csv","options":{"case-sensitive-header":"true"},"date":"2024-08-23T12:02:37.487948+00:00","version":"0.12.0","report":{"valid":false,"stats":{"errors":1,"warnings":0,"seconds":0.04,"fields":19,"rows":1},"warnings":[],"errors":[{"message":"La valeur 'lundi à dimanche' n'est pas une définition d'horaire d'ouverture correcte.\n\n Celle-ci doit respecter la spécification [OpenStreetMap](https://wiki.openstreetmap.org/wiki/Key:opening_hours) de description d'horaires d'ouverture.","type":"opening-hours-value","tags":["#body"],"rowNumber":2,"fieldName":"horaires","fieldNumber":16,"cell":"lundi à dimanche"}]}} +{"schema":"https://schema.data.gouv.fr/schemas/etalab/schema-lieux-covoiturage/0.2.4/schema.json","url":"https://gist.githubusercontent.com/AntoineAugusti/59889a3e82ecfcdcc40cddaf8bfbd8cc/raw/4cd50116e4b8232be0a86136f57153992f737306/covoit_invalide.csv","options":{"ignore_header_case":"false"},"date":"2024-08-23T12:02:37.487948+00:00","version":"0.12.0","report":{"valid":false,"stats":{"errors":1,"warnings":0,"seconds":0.04,"fields":19,"rows":1,"rows_processed":1},"warnings":[],"errors":[{"message":"La valeur 'lundi à dimanche' n'est pas une définition d'horaire d'ouverture correcte.\n\n Celle-ci doit respecter la spécification [OpenStreetMap](https://wiki.openstreetmap.org/wiki/Key:opening_hours) de description d'horaires d'ouverture.","type":"opening-hours-value","tags":["#body"],"rowNumber":2,"fieldName":"horaires","fieldNumber":16,"cell":"lundi à dimanche"}]}} From 6c94acbd096ca88fdbadfd8089ee6afc13ef6343 Mon Sep 17 00:00:00 2001 From: Pierre Camilleri <22995923+pierrecamilleri@users.noreply.github.com> Date: Wed, 6 Nov 2024 17:02:11 +0100 Subject: [PATCH 5/6] fix tests accordingly --- .../validation/tableschema_validator_test.exs | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/apps/shared/test/validation/tableschema_validator_test.exs b/apps/shared/test/validation/tableschema_validator_test.exs index ffdcc6323a..ce639ff1cc 100644 --- a/apps/shared/test/validation/tableschema_validator_test.exs +++ b/apps/shared/test/validation/tableschema_validator_test.exs @@ -46,29 +46,29 @@ defmodule Shared.Validation.TableSchemaValidatorTest do assert %{ "errors" => [ - "La colonne obligatoire `contact_operateur` est manquante.", - "La colonne obligatoire `nom_enseigne` est manquante.", - "La colonne obligatoire `id_station_itinerance` est manquante.", - "La colonne obligatoire `nom_station` est manquante.", - "La colonne obligatoire `implantation_station` est manquante.", - "La colonne obligatoire `adresse_station` est manquante.", - "La colonne obligatoire `coordonneesXY` est manquante.", - "La colonne obligatoire `id_pdc_itinerance` est manquante.", - "La colonne obligatoire `puissance_nominale` est manquante.", - "La colonne obligatoire `prise_type_ef` est manquante.", - "La colonne obligatoire `prise_type_2` est manquante.", - "La colonne obligatoire `prise_type_combo_ccs` est manquante.", - "La colonne obligatoire `prise_type_chademo` est manquante.", - "La colonne obligatoire `prise_type_autre` est manquante.", - "La colonne obligatoire `paiement_acte` est manquante.", - "La colonne obligatoire `condition_acces` est manquante.", - "La colonne obligatoire `reservation` est manquante.", - "La colonne obligatoire `horaires` est manquante.", - "La colonne obligatoire `accessibilite_pmr` est manquante.", - "La colonne obligatoire `restriction_gabarit` est manquante.", - "La colonne obligatoire `station_deux_roues` est manquante.", - "Format de date incorrect : La date doit être écrite sous la forme `aaaa-mm-jj`. Colonne `date_maj`, ligne 2.", - "Format de date incorrect : La date doit être écrite sous la forme `aaaa-mm-jj`. Colonne `date_maj`, ligne 3." + "La colonne obligatoire `contact_operateur` est manquante", + "La colonne obligatoire `nom_enseigne` est manquante", + "La colonne obligatoire `id_station_itinerance` est manquante", + "La colonne obligatoire `nom_station` est manquante", + "La colonne obligatoire `implantation_station` est manquante", + "La colonne obligatoire `adresse_station` est manquante", + "La colonne obligatoire `coordonneesXY` est manquante", + "La colonne obligatoire `id_pdc_itinerance` est manquante", + "La colonne obligatoire `puissance_nominale` est manquante", + "La colonne obligatoire `prise_type_ef` est manquante", + "La colonne obligatoire `prise_type_2` est manquante", + "La colonne obligatoire `prise_type_combo_ccs` est manquante", + "La colonne obligatoire `prise_type_chademo` est manquante", + "La colonne obligatoire `prise_type_autre` est manquante", + "La colonne obligatoire `paiement_acte` est manquante", + "La colonne obligatoire `condition_acces` est manquante", + "La colonne obligatoire `reservation` est manquante", + "La colonne obligatoire `horaires` est manquante", + "La colonne obligatoire `accessibilite_pmr` est manquante", + "La colonne obligatoire `restriction_gabarit` est manquante", + "La colonne obligatoire `station_deux_roues` est manquante", + "La date doit être écrite sous la forme `aaaa-mm-jj`. Colonne `date_maj`, ligne 2.", + "La date doit être écrite sous la forme `aaaa-mm-jj`. Colonne `date_maj`, ligne 3." ], "errors_count" => 23, "has_errors" => true, @@ -124,7 +124,7 @@ defmodule Shared.Validation.TableSchemaValidatorTest do assert %{ "errors" => [ - "Check is not valid: 'french_gps_coordinates': custom check inconnu." + "Tentative de définir le custom check 'french_gps_coordinates', qui n'est pas connu." ], "errors_count" => 1, "has_errors" => true, From b53a3ed10f26d3c6c15c68c055703aa358be88ed Mon Sep 17 00:00:00 2001 From: Pierre Camilleri <22995923+pierrecamilleri@users.noreply.github.com> Date: Wed, 6 Nov 2024 17:19:09 +0100 Subject: [PATCH 6/6] extra dots --- apps/shared/test/validation/tableschema_validator_test.exs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/shared/test/validation/tableschema_validator_test.exs b/apps/shared/test/validation/tableschema_validator_test.exs index ce639ff1cc..7fe7ab5605 100644 --- a/apps/shared/test/validation/tableschema_validator_test.exs +++ b/apps/shared/test/validation/tableschema_validator_test.exs @@ -67,8 +67,8 @@ defmodule Shared.Validation.TableSchemaValidatorTest do "La colonne obligatoire `accessibilite_pmr` est manquante", "La colonne obligatoire `restriction_gabarit` est manquante", "La colonne obligatoire `station_deux_roues` est manquante", - "La date doit être écrite sous la forme `aaaa-mm-jj`. Colonne `date_maj`, ligne 2.", - "La date doit être écrite sous la forme `aaaa-mm-jj`. Colonne `date_maj`, ligne 3." + "La date doit être écrite sous la forme `aaaa-mm-jj` Colonne `date_maj`, ligne 2.", + "La date doit être écrite sous la forme `aaaa-mm-jj` Colonne `date_maj`, ligne 3." ], "errors_count" => 23, "has_errors" => true,