[profile gen] Add seda:diagnostic attribute on profile exports
authorSylvain Thénault <sylvain.thenault@logilab.fr>
Fri, 03 Nov 2017 08:16:06 +0100
changeset 2832 77e7486c14c4
parent 2831 854ad0e32400
child 2833 421a40668efe
[profile gen] Add seda:diagnostic attribute on profile exports Attribute is added to rng:grammar/xsd:schema root element using the seda 2 namespace. Closes #39305748
cubicweb_seda/entities/profile_generation.py
doc/profils.rst
test/data/seda_02_export.rng
test/data/seda_02_export.xsd
test/data/seda_1_export.rng
test/data/seda_1_export.xsd
--- a/cubicweb_seda/entities/profile_generation.py	Fri Nov 03 07:45:25 2017 +0100
+++ b/cubicweb_seda/entities/profile_generation.py	Fri Nov 03 08:16:06 2017 +0100
@@ -251,7 +251,17 @@
     content_type = 'application/xml'
     # to be defined in concret implementations
     namespaces = {}
-    root_attributes = {}
+    _root_attributes = {}
+
+    @property
+    def root_attributes(self):
+        if self.entity.compat_list is None:
+            # uncommited transfer may occurs during tests
+            return self._root_attributes
+        diag = '' if 'RNG' in self.entity.compat_list else 'rng-ambiguous'
+        attributes = {'seda:warnings': diag}
+        attributes.update(self._root_attributes)
+        return attributes
 
     def dump(self):
         """Return an schema string for the adapted SEDA profile."""
@@ -403,7 +413,7 @@
         'a': 'http://relaxng.org/ns/compatibility/annotations/1.0',
     }
 
-    root_attributes = {
+    _root_attributes = {
         'ns': 'fr:gouv:culture:archivesdefrance:seda:v2.0',
         'datatypeLibrary': 'http://www.w3.org/2001/XMLSchema-datatypes',
     }
@@ -678,6 +688,7 @@
 
     namespaces = {
         None: 'fr:gouv:culture:archivesdefrance:seda:v1.0',
+        'seda': 'fr:gouv:culture:archivesdefrance:seda:v2.0',
         'xml': 'http://www.w3.org/XML/1998/namespace',
         'xsd': 'http://www.w3.org/2001/XMLSchema',
         'qdt': 'fr:gouv:culture:archivesdefrance:seda:v1.0:QualifiedDataType:1',
@@ -689,7 +700,7 @@
         'urn:un:unece:uncefact:codelist:standard:IANA:MIMEMediaType:2008-11-12',
         'clm60133': 'urn:un:unece:uncefact:codelist:standard:6:0133:40106',
     }
-    root_attributes = {
+    _root_attributes = {
         'targetNamespace': 'fr:gouv:culture:archivesdefrance:seda:v1.0',
         'attributeFormDefault': 'unqualified',
         'elementFormDefault': 'qualified',
@@ -1186,9 +1197,9 @@
     namespaces['qdt'] = 'fr:gouv:ae:archive:draft:standard_echange_v0.2:QualifiedDataType:1'
     namespaces['udt'] = 'urn:un:unece:uncefact:data:standard:UnqualifiedDataType:6'
 
-    root_attributes = SEDA1XSDExport.root_attributes.copy()
-    root_attributes['targetNamespace'] = 'fr:gouv:ae:archive:draft:standard_echange_v0.2'
-    root_attributes['version'] = '1.1'
+    _root_attributes = SEDA1XSDExport._root_attributes.copy()
+    _root_attributes['targetNamespace'] = 'fr:gouv:ae:archive:draft:standard_echange_v0.2'
+    _root_attributes['version'] = '1.1'
 
     concepts_language = 'seda-02'
 
@@ -1359,7 +1370,7 @@
 
     namespaces = SEDA1XSDExport.namespaces.copy()
     namespaces['rng'] = 'http://relaxng.org/ns/structure/1.0'
-    root_attributes = {
+    _root_attributes = {
         'ns': 'fr:gouv:culture:archivesdefrance:seda:v1.0',
         'datatypeLibrary': 'http://www.w3.org/2001/XMLSchema-datatypes',
     }
@@ -1374,7 +1385,7 @@
     namespaces = SEDA1XSDExport.namespaces.copy()
     namespaces['rng'] = 'http://relaxng.org/ns/structure/1.0'
     namespaces['a'] = 'http://relaxng.org/ns/compatibility/annotations/1.0'
-    root_attributes = {
+    _root_attributes = {
         'ns': 'fr:gouv:ae:archive:draft:standard_echange_v0.2',
         'datatypeLibrary': 'http://www.w3.org/2001/XMLSchema-datatypes',
     }
--- a/doc/profils.rst	Fri Nov 03 07:45:25 2017 +0100
+++ b/doc/profils.rst	Fri Nov 03 08:16:06 2017 +0100
@@ -11,16 +11,26 @@
 pour valider un bordereau. Il faut également valider ce dernier contre le schéma XSD de la version
 correspondante, car elle permet de valider certains aspects qui ne seront pas validés par le profil.
 
-Les profils autorisants plusieurs éléments de même nom à un même niveau avec
-plus d'un d'entre eux ayant une cardinalité différente de 1 vont générer des
-schémas RNG valide mais invérifiables par les validateurs existants. Une
-solution technique reste à trouver pour ce problème.
-
-
 .. _SEDA: https://redirect.francearchives.fr/seda/
 .. _RelaxNG: http://relaxng.org/
 .. _`schémas XML`: https://www.w3.org/XML/Schema
 
+Limitation des schémas RelaxNG
+------------------------------
+
+Les profils autorisants plusieurs éléments de même nom à un même niveau avec
+plus d'un d'entre eux ayant une cardinalité différente de 1 vont générer des
+schémas RelaxNG valides mais invérifiables par les validateurs existants
+(`Jing`_ par exemple). Une solution technique reste à trouver pour ce
+problème. Les profils dans ce cas peuvent être identifiés à l'export à l'aide de
+l'attribut `seda:warnings` ([1]_) sur la balise racine (`rng:grammar` ou
+`xsd:schema` selon le format choisi) qui contiendra la chaîne 'rng-ambiguous'
+dans ce cas.
+
+.. _Jing: http://www.thaiopensource.com/relaxng/jing.html
+.. [1] le préfix `seda` étant associé à l'espace de nom
+   "fr:gouv:culture:archivesdefrance:seda:v2.0"
+
 
 Export SEDA 2
 -------------
@@ -30,7 +40,7 @@
 
 Les identifiants spécifiés dans l'interface utilisateur sur les objets-données et les unités
 d'archives sont reportés via un attribut `xml:id` sur l'élément correspond dans le profil
-RelaxNG_ généré ([1]_). La valeur de cette attribut est ensuite utilisée comme valeur par défaut des
+RelaxNG_ généré. La valeur de cette attribut est ensuite utilisée comme valeur par défaut des
 éléments référençant cet élément.
 
 Ce mécanisme permet de gérer des identifiants pour des éléments XSD qui ne sont
@@ -47,9 +57,6 @@
 classiques.
 
 
-.. [1] le préfix `seda` étant associé à l'espace de nom
-   "fr:gouv:culture:archivesdefrance:seda:v2.0"
-
 Autres limitations
 ~~~~~~~~~~~~~~~~~~
 
--- a/test/data/seda_02_export.rng	Fri Nov 03 07:45:25 2017 +0100
+++ b/test/data/seda_02_export.rng	Fri Nov 03 08:16:06 2017 +0100
@@ -7,11 +7,13 @@
     xmlns:clm60133="urn:un:unece:uncefact:codelist:standard:6:0133:40106"
     xmlns:qdt="fr:gouv:culture:archivesdefrance:seda:v1.0:QualifiedDataType:1"
     xmlns:rng="http://relaxng.org/ns/structure/1.0"
+    xmlns:seda="fr:gouv:culture:archivesdefrance:seda:v2.0"
     xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:10"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns="fr:gouv:culture:archivesdefrance:seda:v1.0"
     datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
-    ns="fr:gouv:ae:archive:draft:standard_echange_v0.2">
+    ns="fr:gouv:ae:archive:draft:standard_echange_v0.2"
+    seda:warnings="">
   <rng:start>
     <rng:element name="ArchiveTransfer">
       <xsd:annotation>
--- a/test/data/seda_02_export.xsd	Fri Nov 03 07:45:25 2017 +0100
+++ b/test/data/seda_02_export.xsd	Fri Nov 03 08:16:06 2017 +0100
@@ -5,13 +5,15 @@
     xmlns:clmIANACharacterSetCode="urn:un:unece:uncefact:codelist:standard:IANA:CharacterSetCode:2007-05-14"
     xmlns:clmIANAMIMEMediaType="urn:un:unece:uncefact:codelist:standard:IANA:MIMEMediaType:2008-11-12"
     xmlns:qdt="fr:gouv:culture:archivesdefrance:seda:v1.0:QualifiedDataType:1"
+    xmlns:seda="fr:gouv:culture:archivesdefrance:seda:v2.0"
     xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:10"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns="fr:gouv:culture:archivesdefrance:seda:v1.0"
     attributeFormDefault="unqualified"
     elementFormDefault="qualified"
     targetNamespace="fr:gouv:ae:archive:draft:standard_echange_v0.2"
-    version="1.1">
+    version="1.1"
+    seda:warnings="">
   <xsd:element name="ArchiveTransfer">
     <xsd:annotation>
       <xsd:documentation>my profile title &amp;&amp;</xsd:documentation>
--- a/test/data/seda_1_export.rng	Fri Nov 03 07:45:25 2017 +0100
+++ b/test/data/seda_1_export.rng	Fri Nov 03 08:16:06 2017 +0100
@@ -7,11 +7,13 @@
     xmlns:clmDAFFileTypeCode="urn:un:unece:uncefact:codelist:draft:DAF:fileTypeCode:2009-08-18"
     xmlns:qdt="fr:gouv:culture:archivesdefrance:seda:v1.0:QualifiedDataType:1"
     xmlns:rng="http://relaxng.org/ns/structure/1.0"
+    xmlns:seda="fr:gouv:culture:archivesdefrance:seda:v2.0"
     xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:10"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns="fr:gouv:culture:archivesdefrance:seda:v1.0"
     datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
-    ns="fr:gouv:culture:archivesdefrance:seda:v1.0">
+    ns="fr:gouv:culture:archivesdefrance:seda:v1.0"
+    seda:warnings="">
   <rng:start>
     <rng:element name="ArchiveTransfer">
       <xsd:annotation>
--- a/test/data/seda_1_export.xsd	Fri Nov 03 07:45:25 2017 +0100
+++ b/test/data/seda_1_export.xsd	Fri Nov 03 08:16:06 2017 +0100
@@ -5,13 +5,15 @@
     xmlns:clmIANACharacterSetCode="urn:un:unece:uncefact:codelist:standard:IANA:CharacterSetCode:2007-05-14"
     xmlns:clmIANAMIMEMediaType="urn:un:unece:uncefact:codelist:standard:IANA:MIMEMediaType:2008-11-12"
     xmlns:qdt="fr:gouv:culture:archivesdefrance:seda:v1.0:QualifiedDataType:1"
+    xmlns:seda="fr:gouv:culture:archivesdefrance:seda:v2.0"
     xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:10"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns="fr:gouv:culture:archivesdefrance:seda:v1.0"
     attributeFormDefault="unqualified"
     elementFormDefault="qualified"
     targetNamespace="fr:gouv:culture:archivesdefrance:seda:v1.0"
-    version="1.0">
+    version="1.0"
+    seda:warnings="">
   <xsd:element name="ArchiveTransfer">
     <xsd:annotation>
       <xsd:documentation>my profile title &amp;&amp;</xsd:documentation>