Projet

Général

Profil

0001-utils-xml-fix-parsing-of-simpleContent-XML-schema-63.patch

Benjamin Dauvergne, 07 juillet 2022 13:37

Télécharger (9,86 ko)

Voir les différences:

Subject: [PATCH] utils/xml: fix parsing of simpleContent XML schema (#63191)

 passerelle/utils/xml.py |   3 +-
 tests/exemple.xsd       | 146 ++++++++++++++++++++++++++++++++++++++++
 tests/test_utils_xml.py |  24 ++++++-
 3 files changed, 171 insertions(+), 2 deletions(-)
 create mode 100644 tests/exemple.xsd
passerelle/utils/xml.py
337 337
            if not xmltype.attributes:
338 338
                schema = base_schema
339 339
            else:
340
                cls.attributegroup_to_jsonschema(xmltype.attributes)  # pylint: disable=no-value-for-parameter
340
                schema = OrderedDict({'type': 'object', 'properties': OrderedDict()})
341 341
                schema['properties']['$'] = base_schema
342
                cls.attributegroup_to_jsonschema(xmltype.attributes, schema)
342 343
            return schema
343 344
        else:
344 345
            if xmltype.has_mixed_content() or xmltype.name == xmlschema_names.XSD_ANY_TYPE:
tests/exemple.xsd
1
<?xml version="1.0" encoding="UTF-8"?>
2
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
3
    <xs:element name="PACS" type="PacsType"/>
4
    <xs:simpleType name="testSimpleType">
5
        <xs:restriction base="xs:integer">
6
            <xs:minInclusive value="0"/>
7
            <xs:maxInclusive value="1000"/>
8
        </xs:restriction>
9
    </xs:simpleType>
10
    <xs:complexType name="PacsType">
11
        <xs:sequence>
12
            <xs:element name="partenaire1" type="PartenaireType" />
13
            <xs:element name="partenaire2" type="PartenaireType" />
14
            <xs:element name="convention" type="ConventionType" maxOccurs="1" minOccurs="1" />
15
            <xs:element name="residenceCommune" type="AdresseType" />
16
            <xs:element name="attestationHonneur" type="AttestationHonneurType" />
17
            <!-- extending a simple content element with an attribute -->
18
            <xs:element name="testSimpleContent" minOccurs="0">
19
                <xs:complexType>
20
                    <xs:simpleContent>
21
                        <!-- populationType is a simple type -->
22
                        <xs:extension base="testSimpleType">
23
                            <xs:attribute name="attribute" type="xs:string" use="required"/>
24
                        </xs:extension>
25
                    </xs:simpleContent>
26
                </xs:complexType>
27
            </xs:element>
28
        </xs:sequence>
29
    </xs:complexType>
30
    <xs:complexType name = "AttestationHonneurType">
31
        <xs:sequence>
32
            <xs:element name="nonParente" type="xs:boolean"/>
33
            <xs:element name="residenceCommune" type="xs:boolean"/>
34
        </xs:sequence>
35
    </xs:complexType>
36
    <xs:complexType name="PartenaireType">
37
        <xs:sequence>
38
            <xs:element name="civilite" type="CiviliteType"></xs:element>
39
            <xs:element name="nomNaissance" type="xs:string" />
40
            <xs:element name="prenoms" type="xs:string" />
41
            <xs:element name="codeNationalite" type="xs:string" maxOccurs="unbounded"/>
42
            <xs:element name="jourNaissance" type="xs:integer" maxOccurs="1" minOccurs="0" />
43
            <xs:element name="moisNaissance" type="xs:integer" maxOccurs="1" minOccurs="0" />
44
            <xs:element name="anneeNaissance" type="xs:integer" />
45
            <xs:element name="LieuNaissance" type="LieuNaissanceType" />
46
            <xs:element name="ofpra" type="xs:boolean" />
47
            <xs:element name="mesureJuridique" type="xs:boolean" />
48
            <xs:element name="adressePostale" type="AdresseType" />
49
            <xs:element name="adresseElectronique" type="xs:string" />
50
            <xs:element name="telephone" type="xs:string" minOccurs="0"/>
51
            <xs:element name="filiationParent1" type="FiliationType" minOccurs="0"/>
52
            <xs:element name="filiationParent2" type="FiliationType" minOccurs="0" />
53
            <xs:element name="titreIdentiteVerifie" type="xs:boolean"/>
54
        </xs:sequence>
55
    </xs:complexType>
56
    <xs:complexType name="ConventionType">
57
        <xs:choice>
58
            <xs:element name="conventionType" type="ConventionTypeType" />
59
            <xs:element name="conventionSpecifique" type="xs:boolean" />
60
        </xs:choice>
61
    </xs:complexType>
62
    <xs:complexType name="ConventionTypeType">
63
        <xs:sequence>
64
            <xs:element name="aideMaterielMontant" type="xs:double" maxOccurs="1" minOccurs="0"/>
65
            <xs:element name="regimePacs" type="regimePacsType" />
66
            <xs:element name="aideMateriel" type="AideMaterielType" />
67
        </xs:sequence>
68
    </xs:complexType>
69
    <xs:complexType name="AdresseType">
70
        <xs:sequence>
71
            <xs:element name="NumeroLibelleVoie" type="xs:string" minOccurs="0" />
72
            <xs:element name="Complement1" type="xs:string" minOccurs="0" />
73
            <xs:element name="Complement2" type="xs:string" minOccurs="0" />
74
            <xs:element name="LieuDitBpCommuneDeleguee" type="xs:string" minOccurs="0" />
75
            <xs:element name="CodePostal" type="codePostalType" />
76
            <xs:element name="Localite" type="localiteType" />
77
            <xs:element name="Pays" type="xs:string" />
78
        </xs:sequence>
79
    </xs:complexType>
80
    <xs:complexType name="LieuNaissanceType">
81
        <xs:sequence>
82
            <xs:element name="localite" type="localiteType"/>
83
            <xs:element name="codePostal" type="xs:string"/>
84
            <xs:element name="codeInsee" type="xs:string" minOccurs="0"/>
85
            <xs:element name="departement" type="xs:string" maxOccurs="1" minOccurs="0"/>
86
            <xs:element name="codePays" type="xs:string"/>
87
        </xs:sequence>
88
    </xs:complexType>
89
    <xs:simpleType name="localiteType">
90
        <xs:restriction base="xs:string">
91
            <xs:minLength value="1" />
92
        </xs:restriction>
93
    </xs:simpleType>
94
    <xs:simpleType name="codePostalType">
95
        <xs:restriction base="xs:string">
96
            <xs:length value="5" />
97
        </xs:restriction>
98
    </xs:simpleType>
99
    <xs:simpleType name="regimePacsType">
100
        <xs:restriction base="xs:string">
101
            <xs:enumeration value="indivision"/>
102
            <xs:enumeration value="legal"/>
103
        </xs:restriction>
104
    </xs:simpleType>
105
    <xs:complexType name="FiliationType">
106
        <xs:sequence>
107
            <xs:choice>
108
                <xs:element name="filiationInconnu" type="xs:boolean"></xs:element>
109
                <xs:element name="filiationConnu" type="FiliationConnuType">
110
                </xs:element>
111
            </xs:choice>
112
        </xs:sequence>
113
    </xs:complexType>
114
    <xs:simpleType name="CiviliteType">
115
        <xs:restriction base="xs:string">
116
            <xs:enumeration value="M"></xs:enumeration>
117
            <xs:enumeration value="MME"></xs:enumeration>
118
        </xs:restriction>
119
    </xs:simpleType>
120
    <xs:simpleType name="TypeAideMaterielType">
121
        <xs:restriction base="xs:string">
122
            <xs:enumeration value="aideFixe"/>
123
            <xs:enumeration value="aideProportionnel"/>
124
        </xs:restriction>
125
    </xs:simpleType>
126
    <xs:complexType name="AideMaterielType">
127
        <xs:sequence>
128
            <xs:element name="typeAideMateriel" type="TypeAideMaterielType"></xs:element>
129
        </xs:sequence>
130
    </xs:complexType>
131
    <xs:complexType name="FiliationConnuType">
132
        <xs:sequence>
133
            <xs:element name="sexe" type="SexeType"/>
134
            <xs:element name="nomNaissance" type="xs:string" maxOccurs="1" minOccurs="0" />
135
            <xs:element name="prenoms" type="xs:string" maxOccurs="1" minOccurs="0" />
136
            <xs:element name="dateNaissance" type="xs:string" maxOccurs="1" minOccurs="0" />
137
            <xs:element name="lieuNaissance" type="LieuNaissanceType" maxOccurs="1" minOccurs="0" />
138
        </xs:sequence>
139
    </xs:complexType>
140
    <xs:simpleType name="SexeType">
141
        <xs:restriction base="xs:string">
142
            <xs:enumeration value="M"/>
143
            <xs:enumeration value="F"/>
144
        </xs:restriction>
145
    </xs:simpleType>
146
</xs:schema>
tests/test_utils_xml.py
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16

  
17 17
import xml.etree.ElementTree as ET
18
from collections import OrderedDict
19
from decimal import Decimal
18 20

  
19 21
import jsonschema
20 22
import xmlschema
......
56 58

  
57 59

  
58 60
def test_xmlschema_to_jsonschema():
59
    schema_path = 'passerelle/apps/sp_fr/depotDossierPACS.XSD'
61
    schema_path = 'tests/exemple.xsd'
60 62

  
61 63
    # go from XML to JSON,
62 64
    # convert XMLSchema to JSONSchema
......
82 84
    tree = schema.elements['PACS'].encode(d2['PACS'], converter=xmlschema.UnorderedConverter)
83 85
    d3 = schema.elements['PACS'].decode(tree)
84 86
    assert d == {'PACS': d3}
87

  
88
    assert json_schema.json_schema['properties']['PACS']['properties']['testSimpleContent'] == OrderedDict(
89
        [
90
            ('type', 'object'),
91
            (
92
                'properties',
93
                OrderedDict(
94
                    [
95
                        (
96
                            '$',
97
                            OrderedDict(
98
                                [('type', 'integer'), ('minimum', Decimal('0')), ('maximum', Decimal('1000'))]
99
                            ),
100
                        ),
101
                        ('attribute', {'type': 'string'}),
102
                    ]
103
                ),
104
            ),
105
        ]
106
    )
85
-