[PATCH 1 of 1 seda] [dataimport] Fix lcsv files

Sylvain Thenault sylvain.thenault at logilab.fr
Wed Mar 29 16:03:23 CEST 2017


# HG changeset patch
# User Sylvain Thénault <sylvain.thenault at logilab.fr>
# Date 1490794905 -7200
#      Wed Mar 29 15:41:45 2017 +0200
# Node ID 0145618f8da77ab0d0f73a3679787f4bcb943083
# Parent  ac722d56776be2836ca485e4d48e5f9dfd3b53cb
[dataimport] Fix lcsv files

Added a test checking that we've a consistent number of separators in each line
of lcsv files. This led to fix some some headers as well as some definitions
containing the separator in text, leading to no error but unconsidered text.

Along the way, uniformize column labels.

We do not mind fixing definitions in existing database for now, since there are
now production databases in the wild yet.

Related to #17066564

diff --git a/cubicweb_seda/dataimport.py b/cubicweb_seda/dataimport.py
--- a/cubicweb_seda/dataimport.py
+++ b/cubicweb_seda/dataimport.py
@@ -100,23 +100,33 @@ def lcsv_import(cnx, store, fname, schem
         import_log = SimpleImportLog(fname)
         skos.store_skos_extentities(cnx, store, extentities, import_log,
                                     raise_on_error=True, extid_as_cwuri=False)
 
 
-def lcsv_check(cnx, store, fname, scheme_uri):
+def lcsv_check(cnx, store, fname, scheme_uri, separator=';'):
     """Simply check data file consistency."""
     counter = count()
 
     def uri_generator(val):
         return text_type(next(counter)) + val
 
     with open(join(dirname(__file__), 'migration', 'data', fname)) as stream:
-        lcsv2rdf = lcsv.LCSV2RDF(stream, ';', 'utf-8',
+        lcsv2rdf = lcsv.LCSV2RDF(stream, separator, 'utf-8',
                                  # XXX drop once skos is released
                                  uri_generator=uri_generator, uri_cls=text_type)
         list(lcsv2rdf.triples())
 
+        # also check there are the expected number of separator for each line
+        stream.seek(0)
+        expected_separators = stream.readline().count(separator)
+        for i, line in enumerate(stream):
+            if line.count(separator) != expected_separators:
+                linenum = i + 2
+                raise AssertionError('Got %s %s on line %s of %s, %s where expected'
+                                     % (line.count(separator), separator, linenum,
+                                        fname, expected_separators))
+
 
 def init_seda_scheme(cnx, title):
     """Create a scheme to hold SEDA concepts with the given title.
 
     Separated function to be monkey-patched if one need to customize the store (eg saem).
diff --git a/cubicweb_seda/migration/data/classification_levels.csv b/cubicweb_seda/migration/data/classification_levels.csv
--- a/cubicweb_seda/migration/data/classification_levels.csv
+++ b/cubicweb_seda/migration/data/classification_levels.csv
@@ -1,7 +1,7 @@
-#;$id;label;
-type;url;string;
-lang;;seda-2;
-url;skos:Concept;skos:prefLabel;
+#;$id;label
+type;url;string
+lang;;seda-2
+url;skos:Concept;skos:prefLabel
 ;;Confidentiel-Défense
 ;;Secret-Défense
 ;;Très Secret-Défense
diff --git a/cubicweb_seda/migration/data/code_keyword_type.csv b/cubicweb_seda/migration/data/code_keyword_type.csv
--- a/cubicweb_seda/migration/data/code_keyword_type.csv
+++ b/cubicweb_seda/migration/data/code_keyword_type.csv
@@ -1,6 +1,6 @@
-#;$id;label
+#;$id;libellé SEDA;libellé français
 type;url;string;string
 lang;;seda;fr
 url;skos:Concept;skos:prefLabel;skos:prefLabel
 ;;corpname;Collectivité
 ;;famname;Nom de famille
diff --git a/cubicweb_seda/migration/data/encodings.csv b/cubicweb_seda/migration/data/encodings.csv
--- a/cubicweb_seda/migration/data/encodings.csv
+++ b/cubicweb_seda/migration/data/encodings.csv
@@ -1,6 +1,6 @@
-#;$id;seda 2 value;seda 1 and 0.2 value;label;
+#;$id;libellé SEDA 2;libellé SEDA antérieur;libellé anglais
 type;url;string;string;string
 lang;;seda-2;seda;en
 url;skos:Concept;skos:prefLabel;skos:prefLabel;skos:prefLabel
 ;;ASCII 7 bit;1;ASCII 7 bit
 ;;ASCII 8 bit;2;ASCII 8 bit
diff --git a/cubicweb_seda/migration/data/event_types.csv b/cubicweb_seda/migration/data/event_types.csv
--- a/cubicweb_seda/migration/data/event_types.csv
+++ b/cubicweb_seda/migration/data/event_types.csv
@@ -1,9 +1,9 @@
-#;$id;label;
-type;url;string;
-lang;;seda-2;
-url;skos:Concept;skos:prefLabel;
+#;$id;libellé SEDA 2
+type;url;string
+lang;;seda-2
+url;skos:Concept;skos:prefLabel
 ;;Created
 ;;Revised
 ;;Updated
 ;;Deleted
 ;;Derived
diff --git a/cubicweb_seda/migration/data/final_action_appraisal_code_type.csv b/cubicweb_seda/migration/data/final_action_appraisal_code_type.csv
--- a/cubicweb_seda/migration/data/final_action_appraisal_code_type.csv
+++ b/cubicweb_seda/migration/data/final_action_appraisal_code_type.csv
@@ -1,6 +1,6 @@
-#;$id;label
+#;$id;libellé SEDA 2;libellé SEDA antérieur;libellé français
 type;url;string;string;string
 lang;;seda-2;seda;fr
 url;skos:Concept;skos:prefLabel;skos:prefLabel;skos:prefLabel
 ;;Keep;conserver;conserver
 ;;Destroy;detruire;détruire
diff --git a/cubicweb_seda/migration/data/languages.csv b/cubicweb_seda/migration/data/languages.csv
--- a/cubicweb_seda/migration/data/languages.csv
+++ b/cubicweb_seda/migration/data/languages.csv
@@ -1,9 +1,9 @@
-#;$id;label;alt label;
-type;url;string;string;
-lang;;seda-2;en;
-url;skos:Concept;skos:prefLabel;skos:prefLabel;
+#;$id;libellé SEDA 2;libellé anglais
+type;url;string;string
+lang;;seda-2;en
+url;skos:Concept;skos:prefLabel;skos:prefLabel
 ;;yob;Yoba
 ;;bqy;Bengkala Sign Language
 ;;nuv;Northern Nuni
 ;;quy;Ayacucho Quechua
 ;;biz;Baloi
diff --git a/cubicweb_seda/migration/data/level_type.csv b/cubicweb_seda/migration/data/level_type.csv
--- a/cubicweb_seda/migration/data/level_type.csv
+++ b/cubicweb_seda/migration/data/level_type.csv
@@ -1,14 +1,14 @@
-#;$id;Libellé court (utilisé pour l'échange);Libellé long;définition
-type;url;string;string;string
+#;$id;Libellé SEDA 2;Libellé SEDA antérieur;Libellé français;Définition
+type;url;string;string;string;string
 lang;;seda-2;seda;fr;fr
 url;skos:Concept;skos:prefLabel;skos:prefLabel;skos:prefLabel;skos:definition
 ;;Class ;class ;Classe;Cette valeur, issue de la tradition archivistique allemande, ne correspond pas pour l'instant aux pratiques archivistiques françaises
 ;;Collection ;collection ;Collection;Réunion artificielle de documents en fonction de critères communs liés à  leur contenu ou à leur support, sans considération de leur provenance, par opposition au fonds d'archives constitué de façon organique
 ;;File ;file ;Dossier;Ensemble de documents regroupés, soit par le producteur pour son usage courant, soit dans le processus du classement d'archives, parce qu'ils concernent un même sujet ou une même affaire. Le dossier est ordinairement l'unité de base à l'intérieur d'une série organique
 ;;Fonds ;fonds ;Fonds ;Ensemble de documents quels que soit leur type et leur support, créé ou reçu de manière organique et utilisé par une personne physique ou morale dans l'exercice de ses activités
 ;;Item ;item ;Pièce;Plus petite unité documentaire, par exemple une lettre, un mémoire, un rapport, une photographie, un enregistrement sonore
-;;RecordGrp ;recordgrp ;Groupe de documents;Niveau de description intermédiaire qui ne correspond pas à une division organique (sous-fonds, série ou sous-série organique); parties au sein d'une collection, versements, épaves d'un fonds, subdivisions de fonds dont on ne connait pas la nature exacte, sous-ensemble classés thématiquement
-;;Series ;series ;Serie organique ;Division organique d'un fonds, correspondant à un ensemble de dossiers maintenus groupés parce qu'ils résultent d'une même activité, se rapportent à une même fonction ou à un même sujet ou revêtent une même forme
-;;Subfonds ;subfonds ;Sous fonds;Division organique d'un fonds correspondant aux divisions administratives de l'institution ou de l'organisme producteur, ou, à défaut, à un regroupement géographique, chronologique, fonctionnel ou autre des documents; quand le producteur a une structure hiérarchique complexe , chaque sous-fonds est lui-même subdivisé, autant que nécessaire pour refléter les niveaux hiérarchiques
+;;RecordGrp ;recordgrp ;Groupe de documents;Niveau de description intermédiaire qui ne correspond pas à une division organique (sous-fonds, série ou sous-série organique). Parties au sein d'une collection, versements, épaves d'un fonds, subdivisions de fonds dont on ne connait pas la nature exacte, sous-ensemble classés thématiquement
+;;Series ;series ;Série organique ;Division organique d'un fonds, correspondant à un ensemble de dossiers maintenus groupés parce qu'ils résultent d'une même activité, se rapportent à une même fonction ou à un même sujet ou revêtent une même forme
+;;Subfonds ;subfonds ;Sous-fonds;Division organique d'un fonds correspondant aux divisions administratives de l'institution ou de l'organisme producteur, ou, à défaut, à un regroupement géographique, chronologique, fonctionnel ou autre des documents. Quand le producteur a une structure hiérarchique complexe , chaque sous-fonds est lui-même subdivisé, autant que nécessaire pour refléter les niveaux hiérarchiques
 ;;SubGrp ;subgrp ;Sous-groupe de documents;Subdivision du groupe de documents
 ;;Subseries ;subseries ;Sous-série organique;Subdivision de la série organique
diff --git a/cubicweb_seda/migration/data/mime_types.csv b/cubicweb_seda/migration/data/mime_types.csv
--- a/cubicweb_seda/migration/data/mime_types.csv
+++ b/cubicweb_seda/migration/data/mime_types.csv
@@ -1,9 +1,9 @@
-#;$id;label;alt label;
-type;url;string;string;
-lang;;seda-2;en;
-url;skos:Concept;skos:prefLabel;skos:prefLabel;
+#;$id;libellé SEDA 2;libellé anglais
+type;url;string;string
+lang;;seda-2;en
+url;skos:Concept;skos:prefLabel;skos:prefLabel
 ;;application/1d-interleaved-parityfec;1d-interleaved-parityfec
 ;;application/3gpp-ims+xml;3gpp-ims+xml
 ;;application/activemessage;activemessage
 ;;application/andrew-inset;andrew-inset
 ;;application/applefile;applefile


More information about the saem-devel mailing list