author | Edouard Tisserant |
Fri, 09 Nov 2018 13:26:06 +0100 | |
changeset 2333 | 81abf93b4684 |
parent 2297 | 96ca6b056c55 |
child 2343 | 33071a451021 |
permissions | -rw-r--r-- |
814 | 1 |
#!/usr/bin/env python |
2 |
# -*- coding: utf-8 -*- |
|
3 |
||
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1563
diff
changeset
|
4 |
# This file is part of Beremiz, a Integrated Development Environment for |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1563
diff
changeset
|
5 |
# programming IEC 61131-3 automates supporting plcopen standard and CanFestival. |
814 | 6 |
# |
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1563
diff
changeset
|
7 |
# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD |
814 | 8 |
# |
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1563
diff
changeset
|
9 |
# See COPYING file for copyrights details. |
814 | 10 |
# |
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1563
diff
changeset
|
11 |
# This program is free software; you can redistribute it and/or |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1563
diff
changeset
|
12 |
# modify it under the terms of the GNU General Public License |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1563
diff
changeset
|
13 |
# as published by the Free Software Foundation; either version 2 |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1563
diff
changeset
|
14 |
# of the License, or (at your option) any later version. |
814 | 15 |
# |
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1563
diff
changeset
|
16 |
# This program is distributed in the hope that it will be useful, |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1563
diff
changeset
|
17 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1563
diff
changeset
|
18 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1563
diff
changeset
|
19 |
# GNU General Public License for more details. |
814 | 20 |
# |
1571
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1563
diff
changeset
|
21 |
# You should have received a copy of the GNU General Public License |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1563
diff
changeset
|
22 |
# along with this program; if not, write to the Free Software |
486f94a8032c
fix license notices in source files and license files under GPLv2+
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1563
diff
changeset
|
23 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
814 | 24 |
|
1826
91796f408540
fix usage of python2-only print statement
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1782
diff
changeset
|
25 |
|
1881
091005ec69c4
fix pylint py3k conversion warning: "(no-absolute-import) import missing `from __future__ import absolute_import`"
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1878
diff
changeset
|
26 |
from __future__ import absolute_import |
1826
91796f408540
fix usage of python2-only print statement
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1782
diff
changeset
|
27 |
from __future__ import print_function |
1732
94ffe74e6895
clean-up: fix PEP8 E401 multiple imports on one line
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1730
diff
changeset
|
28 |
import os |
814 | 29 |
import re |
30 |
import datetime |
|
31 |
from types import * |
|
32 |
from xml.dom import minidom |
|
1850
614396cbffbf
fix pylint warning '(unused-import), Unused import connectors'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1847
diff
changeset
|
33 |
from xml.sax.saxutils import unescape |
814 | 34 |
from new import classobj |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
35 |
from collections import OrderedDict |
814 | 36 |
|
1832
0f1081928d65
fix wrong-import-order. first standard modules are imported, then others
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1831
diff
changeset
|
37 |
from lxml import etree |
0f1081928d65
fix wrong-import-order. first standard modules are imported, then others
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1831
diff
changeset
|
38 |
|
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
39 |
|
814 | 40 |
def CreateNode(name): |
41 |
node = minidom.Node() |
|
42 |
node.nodeName = name |
|
43 |
node._attrs = {} |
|
44 |
node.childNodes = [] |
|
45 |
return node |
|
46 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
47 |
|
814 | 48 |
def NodeRenameAttr(node, old_name, new_name): |
49 |
node._attrs[new_name] = node._attrs.pop(old_name) |
|
50 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
51 |
|
814 | 52 |
def NodeSetAttr(node, name, value): |
53 |
attr = minidom.Attr(name) |
|
54 |
text = minidom.Text() |
|
55 |
text.data = value |
|
56 |
attr.childNodes[0] = text |
|
57 |
node._attrs[name] = attr |
|
58 |
||
1749
d73b64672238
clean-up: fix PEP8 E305 expected 2 blank lines after class or function definition
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1744
diff
changeset
|
59 |
|
1837
c507c363625e
fix pylint warning '(pointless-string-statement) String statement has no effect'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1832
diff
changeset
|
60 |
# Regular expression models for checking all kind of |
c507c363625e
fix pylint warning '(pointless-string-statement) String statement has no effect'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1832
diff
changeset
|
61 |
# string values defined in XML standard |
c507c363625e
fix pylint warning '(pointless-string-statement) String statement has no effect'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1832
diff
changeset
|
62 |
|
814 | 63 |
Name_model = re.compile('([a-zA-Z_\:][\w\.\-\:]*)$') |
64 |
Names_model = re.compile('([a-zA-Z_\:][\w\.\-\:]*(?: [a-zA-Z_\:][\w\.\-\:]*)*)$') |
|
65 |
NMToken_model = re.compile('([\w\.\-\:]*)$') |
|
66 |
NMTokens_model = re.compile('([\w\.\-\:]*(?: [\w\.\-\:]*)*)$') |
|
67 |
QName_model = re.compile('((?:[a-zA-Z_][\w]*:)?[a-zA-Z_][\w]*)$') |
|
68 |
QNames_model = re.compile('((?:[a-zA-Z_][\w]*:)?[a-zA-Z_][\w]*(?: (?:[a-zA-Z_][\w]*:)?[a-zA-Z_][\w]*)*)$') |
|
69 |
NCName_model = re.compile('([a-zA-Z_][\w]*)$') |
|
1971
62403f9b6ca9
make the URI model compatible with https
Surkov Sergey <surkovsv93@gmail.com>
parents:
1881
diff
changeset
|
70 |
URI_model = re.compile('((?:htt(p|ps)://|/)?(?:[\w.-]*/?)*)$') |
814 | 71 |
LANGUAGE_model = re.compile('([a-zA-Z]{1,8}(?:-[a-zA-Z0-9]{1,8})*)$') |
72 |
||
73 |
ONLY_ANNOTATION = re.compile("((?:annotation )?)") |
|
74 |
||
75 |
""" |
|
76 |
Regular expression models for extracting dates and times from a string |
|
77 |
""" |
|
78 |
time_model = re.compile('([0-9]{2}):([0-9]{2}):([0-9]{2}(?:\.[0-9]*)?)(?:Z)?$') |
|
79 |
date_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})((?:[\-\+][0-9]{2}:[0-9]{2})|Z)?$') |
|
80 |
datetime_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})[ T]([0-9]{2}):([0-9]{2}):([0-9]{2}(?:\.[0-9]*)?)((?:[\-\+][0-9]{2}:[0-9]{2})|Z)?$') |
|
81 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
82 |
|
814 | 83 |
class xml_timezone(datetime.tzinfo): |
84 |
||
85 |
def SetOffset(self, offset): |
|
86 |
if offset == "Z": |
|
1872
866fb3ab8778
fix pylint error "(undefined-variable) Undefined variable 'X'"
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1860
diff
changeset
|
87 |
self.__offset = datetime.timedelta(minutes=0) |
814 | 88 |
self.__name = "UTC" |
89 |
else: |
|
1739
ec153828ded2
clean-up: fix PEP8 E203 whitespace before ':' and whitespace before ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1736
diff
changeset
|
90 |
sign = {"-": -1, "+": 1}[offset[0]] |
814 | 91 |
hours, minutes = [int(val) for val in offset[1:].split(":")] |
1872
866fb3ab8778
fix pylint error "(undefined-variable) Undefined variable 'X'"
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1860
diff
changeset
|
92 |
self.__offset = datetime.timedelta(minutes=sign * (hours * 60 + minutes)) |
814 | 93 |
self.__name = "" |
94 |
||
95 |
def utcoffset(self, dt): |
|
96 |
return self.__offset |
|
97 |
||
98 |
def tzname(self, dt): |
|
99 |
return self.__name |
|
100 |
||
101 |
def dst(self, dt): |
|
1872
866fb3ab8778
fix pylint error "(undefined-variable) Undefined variable 'X'"
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1860
diff
changeset
|
102 |
return datetime.timedelta(0) |
814 | 103 |
|
1749
d73b64672238
clean-up: fix PEP8 E305 expected 2 blank lines after class or function definition
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1744
diff
changeset
|
104 |
|
1773
38fde37c3766
clean-up: fix PEP8 E124 closing bracket does not match visual indentation
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1768
diff
changeset
|
105 |
[ |
38fde37c3766
clean-up: fix PEP8 E124 closing bracket does not match visual indentation
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1768
diff
changeset
|
106 |
SYNTAXELEMENT, SYNTAXATTRIBUTE, SIMPLETYPE, COMPLEXTYPE, COMPILEDCOMPLEXTYPE, |
38fde37c3766
clean-up: fix PEP8 E124 closing bracket does not match visual indentation
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1768
diff
changeset
|
107 |
ATTRIBUTESGROUP, ELEMENTSGROUP, ATTRIBUTE, ELEMENT, CHOICE, ANY, TAG, CONSTRAINT, |
814 | 108 |
] = range(13) |
109 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
110 |
|
814 | 111 |
def NotSupportedYet(type): |
112 |
""" |
|
113 |
Function that generates a function that point out to user that datatype |
|
114 |
used is not supported by xmlclass yet |
|
115 |
@param type: data type |
|
116 |
@return: function generated |
|
117 |
""" |
|
118 |
def GetUnknownValue(attr): |
|
1764
d5df428640ff
clean-up: fix PEP8 E502 the backslash is redundant between brackets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1763
diff
changeset
|
119 |
raise ValueError("\"%s\" type isn't supported by \"xmlclass\" yet!" % type) |
814 | 120 |
return GetUnknownValue |
121 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
122 |
|
814 | 123 |
def getIndent(indent, balise): |
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
124 |
""" |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
125 |
This function calculates the number of whitespace for indentation |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
126 |
""" |
814 | 127 |
first = indent * 2 |
128 |
second = first + len(balise) + 1 |
|
129 |
return u'\t'.expandtabs(first), u'\t'.expandtabs(second) |
|
130 |
||
131 |
||
132 |
def GetAttributeValue(attr, extract=True): |
|
133 |
""" |
|
134 |
Function that extracts data from a tree node |
|
135 |
@param attr: tree node containing data to extract |
|
136 |
@param extract: attr is a tree node or not |
|
137 |
@return: data extracted as string |
|
138 |
""" |
|
139 |
if not extract: |
|
140 |
return attr |
|
141 |
if len(attr.childNodes) == 1: |
|
142 |
return unicode(unescape(attr.childNodes[0].data)) |
|
143 |
else: |
|
144 |
# content is a CDATA |
|
145 |
text = u'' |
|
146 |
for node in attr.childNodes: |
|
147 |
if not (node.nodeName == "#text" and node.data.strip() == u''): |
|
148 |
text += unicode(unescape(node.data)) |
|
149 |
return text |
|
150 |
||
151 |
||
152 |
def GetNormalizedString(attr, extract=True): |
|
153 |
""" |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
154 |
Function that normalizes a string according to XML 1.0. Replace |
814 | 155 |
tabulations, line feed and carriage return by white space |
156 |
@param attr: tree node containing data to extract or data to normalize |
|
157 |
@param extract: attr is a tree node or not |
|
158 |
@return: data normalized as string |
|
159 |
""" |
|
160 |
if extract: |
|
161 |
value = GetAttributeValue(attr) |
|
162 |
else: |
|
163 |
value = attr |
|
164 |
return value.replace("\t", " ").replace("\r", " ").replace("\n", " ") |
|
165 |
||
166 |
||
167 |
def GetToken(attr, extract=True): |
|
168 |
""" |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
169 |
Function that tokenizes a string according to XML 1.0. Remove any leading |
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
170 |
and trailing white space and replace internal sequence of two or more |
814 | 171 |
spaces by only one white space |
172 |
@param attr: tree node containing data to extract or data to tokenize |
|
173 |
@param extract: attr is a tree node or not |
|
174 |
@return: data tokenized as string |
|
175 |
""" |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
176 |
return " ".join([part for part in |
814 | 177 |
GetNormalizedString(attr, extract).split(" ") |
178 |
if part]) |
|
179 |
||
180 |
||
181 |
def GetHexInteger(attr, extract=True): |
|
182 |
""" |
|
183 |
Function that extracts an hexadecimal integer from a tree node or a string |
|
184 |
@param attr: tree node containing data to extract or data as a string |
|
185 |
@param extract: attr is a tree node or not |
|
186 |
@return: data as an integer |
|
187 |
""" |
|
188 |
if extract: |
|
189 |
value = GetAttributeValue(attr) |
|
190 |
else: |
|
191 |
value = attr |
|
192 |
if len(value) % 2 != 0: |
|
193 |
raise ValueError("\"%s\" isn't a valid hexadecimal integer!" % value) |
|
194 |
try: |
|
195 |
return int(value, 16) |
|
1780
c52d1460cea8
clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1777
diff
changeset
|
196 |
except Exception: |
814 | 197 |
raise ValueError("\"%s\" isn't a valid hexadecimal integer!" % value) |
198 |
||
199 |
||
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
200 |
def GenerateIntegerExtraction(minInclusive=None, maxInclusive=None, |
814 | 201 |
minExclusive=None, maxExclusive=None): |
202 |
""" |
|
203 |
Function that generates an extraction function for integer defining min and |
|
204 |
max of integer value |
|
205 |
@param minInclusive: inclusive minimum |
|
206 |
@param maxInclusive: inclusive maximum |
|
207 |
@param minExclusive: exclusive minimum |
|
208 |
@param maxExclusive: exclusive maximum |
|
209 |
@return: function generated |
|
210 |
""" |
|
211 |
def GetInteger(attr, extract=True): |
|
212 |
""" |
|
213 |
Function that extracts an integer from a tree node or a string |
|
214 |
@param attr: tree node containing data to extract or data as a string |
|
215 |
@param extract: attr is a tree node or not |
|
216 |
@return: data as an integer |
|
217 |
""" |
|
218 |
||
219 |
if extract: |
|
220 |
value = GetAttributeValue(attr) |
|
221 |
else: |
|
222 |
value = attr |
|
223 |
try: |
|
224 |
# TODO: permit to write value like 1E2 |
|
225 |
value = int(value) |
|
1780
c52d1460cea8
clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1777
diff
changeset
|
226 |
except Exception: |
814 | 227 |
raise ValueError("\"%s\" isn't a valid integer!" % value) |
228 |
if minInclusive is not None and value < minInclusive: |
|
1764
d5df428640ff
clean-up: fix PEP8 E502 the backslash is redundant between brackets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1763
diff
changeset
|
229 |
raise ValueError("\"%d\" isn't greater or equal to %d!" % |
814 | 230 |
(value, minInclusive)) |
231 |
if maxInclusive is not None and value > maxInclusive: |
|
1764
d5df428640ff
clean-up: fix PEP8 E502 the backslash is redundant between brackets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1763
diff
changeset
|
232 |
raise ValueError("\"%d\" isn't lesser or equal to %d!" % |
814 | 233 |
(value, maxInclusive)) |
234 |
if minExclusive is not None and value <= minExclusive: |
|
1764
d5df428640ff
clean-up: fix PEP8 E502 the backslash is redundant between brackets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1763
diff
changeset
|
235 |
raise ValueError("\"%d\" isn't greater than %d!" % |
814 | 236 |
(value, minExclusive)) |
237 |
if maxExclusive is not None and value >= maxExclusive: |
|
1764
d5df428640ff
clean-up: fix PEP8 E502 the backslash is redundant between brackets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1763
diff
changeset
|
238 |
raise ValueError("\"%d\" isn't lesser than %d!" % |
814 | 239 |
(value, maxExclusive)) |
240 |
return value |
|
241 |
return GetInteger |
|
242 |
||
243 |
||
1852
70c1cc354a8f
fix pylint warning '(dangerous-default-value) Dangerous default value {} as argument'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1850
diff
changeset
|
244 |
def GenerateFloatExtraction(type, extra_values=None): |
814 | 245 |
""" |
246 |
Function that generates an extraction function for float |
|
247 |
@param type: name of the type of float |
|
248 |
@return: function generated |
|
249 |
""" |
|
1852
70c1cc354a8f
fix pylint warning '(dangerous-default-value) Dangerous default value {} as argument'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1850
diff
changeset
|
250 |
extra_values = [] if extra_values is None else extra_values |
70c1cc354a8f
fix pylint warning '(dangerous-default-value) Dangerous default value {} as argument'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1850
diff
changeset
|
251 |
|
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
252 |
def GetFloat(attr, extract=True): |
814 | 253 |
""" |
254 |
Function that extracts a float from a tree node or a string |
|
255 |
@param attr: tree node containing data to extract or data as a string |
|
256 |
@param extract: attr is a tree node or not |
|
257 |
@return: data as a float |
|
258 |
""" |
|
259 |
if extract: |
|
260 |
value = GetAttributeValue(attr) |
|
261 |
else: |
|
262 |
value = attr |
|
263 |
if value in extra_values: |
|
264 |
return value |
|
265 |
try: |
|
266 |
return float(value) |
|
1780
c52d1460cea8
clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1777
diff
changeset
|
267 |
except Exception: |
814 | 268 |
raise ValueError("\"%s\" isn't a valid %s!" % (value, type)) |
269 |
return GetFloat |
|
270 |
||
271 |
||
272 |
def GetBoolean(attr, extract=True): |
|
273 |
""" |
|
274 |
Function that extracts a boolean from a tree node or a string |
|
275 |
@param attr: tree node containing data to extract or data as a string |
|
276 |
@param extract: attr is a tree node or not |
|
277 |
@return: data as a boolean |
|
278 |
""" |
|
279 |
if extract: |
|
280 |
value = GetAttributeValue(attr) |
|
281 |
else: |
|
282 |
value = attr |
|
283 |
if value == "true" or value == "1": |
|
284 |
return True |
|
285 |
elif value == "false" or value == "0": |
|
286 |
return False |
|
287 |
else: |
|
288 |
raise ValueError("\"%s\" isn't a valid boolean!" % value) |
|
289 |
||
290 |
||
291 |
def GetTime(attr, extract=True): |
|
292 |
""" |
|
293 |
Function that extracts a time from a tree node or a string |
|
294 |
@param attr: tree node containing data to extract or data as a string |
|
295 |
@param extract: attr is a tree node or not |
|
296 |
@return: data as a time |
|
297 |
""" |
|
298 |
if extract: |
|
299 |
value = GetAttributeValue(attr) |
|
300 |
else: |
|
301 |
value = attr |
|
302 |
result = time_model.match(value) |
|
303 |
if result: |
|
304 |
values = result.groups() |
|
305 |
time_values = [int(v) for v in values[:2]] |
|
306 |
seconds = float(values[2]) |
|
307 |
time_values.extend([int(seconds), int((seconds % 1) * 1000000)]) |
|
308 |
return datetime.time(*time_values) |
|
309 |
else: |
|
310 |
raise ValueError("\"%s\" isn't a valid time!" % value) |
|
311 |
||
312 |
||
313 |
def GetDate(attr, extract=True): |
|
314 |
""" |
|
315 |
Function that extracts a date from a tree node or a string |
|
316 |
@param attr: tree node containing data to extract or data as a string |
|
317 |
@param extract: attr is a tree node or not |
|
318 |
@return: data as a date |
|
319 |
""" |
|
320 |
if extract: |
|
321 |
value = GetAttributeValue(attr) |
|
322 |
else: |
|
323 |
value = attr |
|
324 |
result = date_model.match(value) |
|
325 |
if result: |
|
326 |
values = result.groups() |
|
327 |
date_values = [int(v) for v in values[:3]] |
|
328 |
if values[3] is not None: |
|
329 |
tz = xml_timezone() |
|
330 |
tz.SetOffset(values[3]) |
|
331 |
date_values.append(tz) |
|
332 |
return datetime.date(*date_values) |
|
333 |
else: |
|
334 |
raise ValueError("\"%s\" isn't a valid date!" % value) |
|
335 |
||
336 |
||
337 |
def GetDateTime(attr, extract=True): |
|
338 |
""" |
|
339 |
Function that extracts date and time from a tree node or a string |
|
340 |
@param attr: tree node containing data to extract or data as a string |
|
341 |
@param extract: attr is a tree node or not |
|
342 |
@return: data as date and time |
|
343 |
""" |
|
344 |
if extract: |
|
345 |
value = GetAttributeValue(attr) |
|
346 |
else: |
|
347 |
value = attr |
|
348 |
result = datetime_model.match(value) |
|
349 |
if result: |
|
350 |
values = result.groups() |
|
351 |
datetime_values = [int(v) for v in values[:5]] |
|
352 |
seconds = float(values[5]) |
|
353 |
datetime_values.extend([int(seconds), int((seconds % 1) * 1000000)]) |
|
354 |
if values[6] is not None: |
|
355 |
tz = xml_timezone() |
|
356 |
tz.SetOffset(values[6]) |
|
357 |
datetime_values.append(tz) |
|
358 |
return datetime.datetime(*datetime_values) |
|
359 |
else: |
|
360 |
raise ValueError("\"%s\" isn't a valid datetime!" % value) |
|
361 |
||
362 |
||
363 |
def GenerateModelNameExtraction(type, model): |
|
364 |
""" |
|
365 |
Function that generates an extraction function for string matching a model |
|
366 |
@param type: name of the data type |
|
367 |
@param model: model that data must match |
|
368 |
@return: function generated |
|
369 |
""" |
|
370 |
def GetModelName(attr, extract=True): |
|
371 |
""" |
|
372 |
Function that extracts a string from a tree node or not and check that |
|
373 |
string extracted or given match the model |
|
374 |
@param attr: tree node containing data to extract or data as a string |
|
375 |
@param extract: attr is a tree node or not |
|
376 |
@return: data as a string if matching |
|
377 |
""" |
|
378 |
if extract: |
|
379 |
value = GetAttributeValue(attr) |
|
380 |
else: |
|
381 |
value = attr |
|
382 |
result = model.match(value) |
|
383 |
if not result: |
|
384 |
raise ValueError("\"%s\" isn't a valid %s!" % (value, type)) |
|
385 |
return value |
|
386 |
return GetModelName |
|
387 |
||
388 |
||
389 |
def GenerateLimitExtraction(min=None, max=None, unbounded=True): |
|
390 |
""" |
|
391 |
Function that generates an extraction function for integer defining min and |
|
392 |
max of integer value |
|
393 |
@param min: minimum limit value |
|
394 |
@param max: maximum limit value |
|
395 |
@param unbounded: value can be "unbounded" or not |
|
396 |
@return: function generated |
|
397 |
""" |
|
398 |
def GetLimit(attr, extract=True): |
|
399 |
""" |
|
400 |
Function that extracts a string from a tree node or not and check that |
|
401 |
string extracted or given is in a list of values |
|
402 |
@param attr: tree node containing data to extract or data as a string |
|
403 |
@param extract: attr is a tree node or not |
|
404 |
@return: data as a string |
|
405 |
""" |
|
406 |
if extract: |
|
407 |
value = GetAttributeValue(attr) |
|
408 |
else: |
|
409 |
value = attr |
|
410 |
if value == "unbounded": |
|
411 |
if unbounded: |
|
412 |
return value |
|
413 |
else: |
|
414 |
raise ValueError("Member limit can't be defined to \"unbounded\"!") |
|
415 |
try: |
|
416 |
limit = int(value) |
|
1780
c52d1460cea8
clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1777
diff
changeset
|
417 |
except Exception: |
814 | 418 |
raise ValueError("\"%s\" isn't a valid value for this member limit!" % value) |
419 |
if limit < 0: |
|
420 |
raise ValueError("Member limit can't be negative!") |
|
421 |
elif min is not None and limit < min: |
|
422 |
raise ValueError("Member limit can't be lower than \"%d\"!" % min) |
|
423 |
elif max is not None and limit > max: |
|
424 |
raise ValueError("Member limit can't be upper than \"%d\"!" % max) |
|
425 |
return limit |
|
426 |
return GetLimit |
|
427 |
||
428 |
||
429 |
def GenerateEnumeratedExtraction(type, list): |
|
430 |
""" |
|
431 |
Function that generates an extraction function for enumerated values |
|
432 |
@param type: name of the data type |
|
433 |
@param list: list of possible values |
|
434 |
@return: function generated |
|
435 |
""" |
|
436 |
def GetEnumerated(attr, extract=True): |
|
437 |
""" |
|
438 |
Function that extracts a string from a tree node or not and check that |
|
439 |
string extracted or given is in a list of values |
|
440 |
@param attr: tree node containing data to extract or data as a string |
|
441 |
@param extract: attr is a tree node or not |
|
442 |
@return: data as a string |
|
443 |
""" |
|
444 |
if extract: |
|
445 |
value = GetAttributeValue(attr) |
|
446 |
else: |
|
447 |
value = attr |
|
448 |
if value in list: |
|
449 |
return value |
|
450 |
else: |
|
1764
d5df428640ff
clean-up: fix PEP8 E502 the backslash is redundant between brackets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1763
diff
changeset
|
451 |
raise ValueError( |
d5df428640ff
clean-up: fix PEP8 E502 the backslash is redundant between brackets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1763
diff
changeset
|
452 |
"\"%s\" isn't a valid value for %s!" % (value, type)) |
814 | 453 |
return GetEnumerated |
454 |
||
455 |
||
456 |
def GetNamespaces(attr, extract=True): |
|
457 |
""" |
|
458 |
Function that extracts a list of namespaces from a tree node or a string |
|
459 |
@param attr: tree node containing data to extract or data as a string |
|
460 |
@param extract: attr is a tree node or not |
|
461 |
@return: list of namespaces |
|
462 |
""" |
|
463 |
if extract: |
|
464 |
value = GetAttributeValue(attr) |
|
465 |
else: |
|
466 |
value = attr |
|
467 |
if value == "": |
|
468 |
return [] |
|
469 |
elif value == "##any" or value == "##other": |
|
470 |
namespaces = [value] |
|
471 |
else: |
|
472 |
namespaces = [] |
|
473 |
for item in value.split(" "): |
|
474 |
if item == "##targetNamespace" or item == "##local": |
|
475 |
namespaces.append(item) |
|
476 |
else: |
|
477 |
result = URI_model.match(item) |
|
478 |
if result is not None: |
|
479 |
namespaces.append(item) |
|
480 |
else: |
|
481 |
raise ValueError("\"%s\" isn't a valid value for namespace!" % value) |
|
482 |
return namespaces |
|
483 |
||
484 |
||
485 |
def GenerateGetList(type, list): |
|
486 |
""" |
|
487 |
Function that generates an extraction function for a list of values |
|
488 |
@param type: name of the data type |
|
489 |
@param list: list of possible values |
|
490 |
@return: function generated |
|
491 |
""" |
|
492 |
def GetLists(attr, extract=True): |
|
493 |
""" |
|
494 |
Function that extracts a list of values from a tree node or a string |
|
495 |
@param attr: tree node containing data to extract or data as a string |
|
496 |
@param extract: attr is a tree node or not |
|
497 |
@return: list of values |
|
498 |
""" |
|
499 |
if extract: |
|
500 |
value = GetAttributeValue(attr) |
|
501 |
else: |
|
502 |
value = attr |
|
503 |
if value == "": |
|
504 |
return [] |
|
505 |
elif value == "#all": |
|
506 |
return [value] |
|
507 |
else: |
|
508 |
values = [] |
|
509 |
for item in value.split(" "): |
|
510 |
if item in list: |
|
511 |
values.append(item) |
|
512 |
else: |
|
1764
d5df428640ff
clean-up: fix PEP8 E502 the backslash is redundant between brackets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1763
diff
changeset
|
513 |
raise ValueError( |
d5df428640ff
clean-up: fix PEP8 E502 the backslash is redundant between brackets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1763
diff
changeset
|
514 |
"\"%s\" isn't a valid value for %s!" % (value, type)) |
814 | 515 |
return values |
516 |
return GetLists |
|
517 |
||
518 |
||
519 |
def GenerateModelNameListExtraction(type, model): |
|
520 |
""" |
|
521 |
Function that generates an extraction function for list of string matching |
|
522 |
a model |
|
523 |
@param type: name of the data type |
|
524 |
@param model: model that list elements must match |
|
525 |
@return: function generated |
|
526 |
""" |
|
527 |
def GetModelNameList(attr, extract=True): |
|
528 |
""" |
|
529 |
Function that extracts a list of string from a tree node or not and |
|
530 |
check that all extracted items match the model |
|
531 |
@param attr: tree node containing data to extract or data as a string |
|
532 |
@param extract: attr is a tree node or not |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
533 |
@return: data as a list of string if matching |
814 | 534 |
""" |
535 |
if extract: |
|
536 |
value = GetAttributeValue(attr) |
|
537 |
else: |
|
538 |
value = attr |
|
539 |
values = [] |
|
540 |
for item in value.split(" "): |
|
541 |
result = model.match(item) |
|
542 |
if result is not None: |
|
543 |
values.append(item) |
|
544 |
else: |
|
1764
d5df428640ff
clean-up: fix PEP8 E502 the backslash is redundant between brackets
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1763
diff
changeset
|
545 |
raise ValueError("\"%s\" isn't a valid value for %s!" % (value, type)) |
814 | 546 |
return values |
547 |
return GetModelNameList |
|
548 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
549 |
|
814 | 550 |
def GenerateAnyInfos(infos): |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
551 |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
552 |
def GetTextElement(tree): |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
553 |
if infos["namespace"][0] == "##any": |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
554 |
return tree.xpath("p")[0] |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
555 |
return tree.xpath("ns:p", namespaces={"ns": infos["namespace"][0]})[0] |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
556 |
|
814 | 557 |
def ExtractAny(tree): |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
558 |
return GetTextElement(tree).text |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
559 |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
560 |
def GenerateAny(tree, value): |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
561 |
GetTextElement(tree).text = etree.CDATA(value) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
562 |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
563 |
def InitialAny(): |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
564 |
if infos["namespace"][0] == "##any": |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
565 |
element_name = "p" |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
566 |
else: |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
567 |
element_name = "{%s}p" % infos["namespace"][0] |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
568 |
p = etree.Element(element_name) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
569 |
p.text = etree.CDATA("") |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
570 |
return p |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
571 |
|
814 | 572 |
return { |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
573 |
"type": COMPLEXTYPE, |
814 | 574 |
"extract": ExtractAny, |
575 |
"generate": GenerateAny, |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
576 |
"initial": InitialAny, |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
577 |
"check": lambda x: isinstance(x, (StringType, UnicodeType, etree.ElementBase)) |
814 | 578 |
} |
579 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
580 |
|
814 | 581 |
def GenerateTagInfos(infos): |
582 |
def ExtractTag(tree): |
|
583 |
if len(tree._attrs) > 0: |
|
584 |
raise ValueError("\"%s\" musn't have attributes!" % infos["name"]) |
|
585 |
if len(tree.childNodes) > 0: |
|
586 |
raise ValueError("\"%s\" musn't have children!" % infos["name"]) |
|
587 |
if infos["minOccurs"] == 0: |
|
588 |
return True |
|
589 |
else: |
|
590 |
return None |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
591 |
|
814 | 592 |
def GenerateTag(value, name=None, indent=0): |
593 |
if name is not None and not (infos["minOccurs"] == 0 and value is None): |
|
1847
6198190bc121
explicitly mark unused variables found by pylint with _ or dummy
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1846
diff
changeset
|
594 |
ind1, _ind2 = getIndent(indent, name) |
814 | 595 |
return ind1 + "<%s/>\n" % name |
596 |
else: |
|
597 |
return "" |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
598 |
|
814 | 599 |
return { |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
600 |
"type": TAG, |
814 | 601 |
"extract": ExtractTag, |
602 |
"generate": GenerateTag, |
|
603 |
"initial": lambda: None, |
|
1872
866fb3ab8778
fix pylint error "(undefined-variable) Undefined variable 'X'"
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1860
diff
changeset
|
604 |
"check": lambda x: x is None or infos["minOccurs"] == 0 and x |
814 | 605 |
} |
606 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
607 |
|
814 | 608 |
def FindTypeInfos(factory, infos): |
609 |
if isinstance(infos, (UnicodeType, StringType)): |
|
610 |
namespace, name = DecomposeQualifiedName(infos) |
|
611 |
return factory.GetQualifiedNameInfos(name, namespace) |
|
612 |
return infos |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
613 |
|
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
614 |
|
814 | 615 |
def GetElementInitialValue(factory, infos): |
616 |
infos["elmt_type"] = FindTypeInfos(factory, infos["elmt_type"]) |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
617 |
if infos["minOccurs"] == 1: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
618 |
element_name = factory.etreeNamespaceFormat % infos["name"] |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
619 |
if infos["elmt_type"]["type"] == SIMPLETYPE: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
620 |
def initial_value(): |
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
621 |
value = factory.Parser.makeelement(element_name) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
622 |
value.text = (infos["elmt_type"]["generate"](infos["elmt_type"]["initial"]())) |
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
623 |
value._init_() |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
624 |
return value |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
625 |
else: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
626 |
def initial_value(): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
627 |
value = infos["elmt_type"]["initial"]() |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
628 |
if infos["type"] != ANY: |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
629 |
DefaultElementClass.__setattr__(value, "tag", element_name) |
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
630 |
value._init_() |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
631 |
return value |
1847
6198190bc121
explicitly mark unused variables found by pylint with _ or dummy
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1846
diff
changeset
|
632 |
return [initial_value() for dummy in xrange(infos["minOccurs"])] |
814 | 633 |
else: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
634 |
return [] |
814 | 635 |
|
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
636 |
|
814 | 637 |
def GetContentInfos(name, choices): |
638 |
for choice_infos in choices: |
|
1872
866fb3ab8778
fix pylint error "(undefined-variable) Undefined variable 'X'"
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1860
diff
changeset
|
639 |
if choice_infos["type"] == "sequence": |
866fb3ab8778
fix pylint error "(undefined-variable) Undefined variable 'X'"
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1860
diff
changeset
|
640 |
for element_infos in choice_infos["elements"]: |
814 | 641 |
if element_infos["type"] == CHOICE: |
642 |
if GetContentInfos(name, element_infos["choices"]): |
|
1872
866fb3ab8778
fix pylint error "(undefined-variable) Undefined variable 'X'"
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1860
diff
changeset
|
643 |
return choice_infos |
814 | 644 |
elif element_infos["name"] == name: |
1872
866fb3ab8778
fix pylint error "(undefined-variable) Undefined variable 'X'"
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1860
diff
changeset
|
645 |
return choice_infos |
814 | 646 |
elif choice_infos["name"] == name: |
1872
866fb3ab8778
fix pylint error "(undefined-variable) Undefined variable 'X'"
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1860
diff
changeset
|
647 |
return choice_infos |
814 | 648 |
return None |
649 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
650 |
|
814 | 651 |
def ComputeContentChoices(factory, name, infos): |
652 |
choices = [] |
|
653 |
for choice in infos["choices"]: |
|
654 |
if choice["type"] == "sequence": |
|
655 |
choice["name"] = "sequence" |
|
656 |
for sequence_element in choice["elements"]: |
|
657 |
if sequence_element["type"] != CHOICE: |
|
658 |
element_infos = factory.ExtractTypeInfos(sequence_element["name"], name, sequence_element["elmt_type"]) |
|
659 |
if element_infos is not None: |
|
660 |
sequence_element["elmt_type"] = element_infos |
|
661 |
elif choice["elmt_type"] == "tag": |
|
662 |
choice["elmt_type"] = GenerateTagInfos(choice) |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
663 |
factory.AddToLookupClass(choice["name"], name, DefaultElementClass) |
814 | 664 |
else: |
665 |
choice_infos = factory.ExtractTypeInfos(choice["name"], name, choice["elmt_type"]) |
|
666 |
if choice_infos is not None: |
|
667 |
choice["elmt_type"] = choice_infos |
|
668 |
choices.append((choice["name"], choice)) |
|
669 |
return choices |
|
670 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
671 |
|
814 | 672 |
def GenerateContentInfos(factory, name, choices): |
673 |
choices_dict = {} |
|
674 |
for choice_name, infos in choices: |
|
675 |
if choice_name == "sequence": |
|
676 |
for element in infos["elements"]: |
|
677 |
if element["type"] == CHOICE: |
|
678 |
element["elmt_type"] = GenerateContentInfos(factory, name, ComputeContentChoices(factory, name, element)) |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
679 |
elif element["name"] in choices_dict: |
814 | 680 |
raise ValueError("'%s' element defined two times in choice" % choice_name) |
681 |
else: |
|
682 |
choices_dict[element["name"]] = infos |
|
683 |
else: |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
684 |
if choice_name in choices_dict: |
814 | 685 |
raise ValueError("'%s' element defined two times in choice" % choice_name) |
686 |
choices_dict[choice_name] = infos |
|
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
687 |
prefix = ("%s:" % factory.TargetNamespace |
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
688 |
if factory.TargetNamespace is not None else "") |
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
689 |
choices_xpath = "|".join(map(lambda x: prefix + x, choices_dict.keys())) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
690 |
|
814 | 691 |
def GetContentInitial(): |
692 |
content_name, infos = choices[0] |
|
693 |
if content_name == "sequence": |
|
694 |
content_value = [] |
|
1847
6198190bc121
explicitly mark unused variables found by pylint with _ or dummy
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1846
diff
changeset
|
695 |
for dummy in xrange(infos["minOccurs"]): |
814 | 696 |
for element_infos in infos["elements"]: |
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1304
diff
changeset
|
697 |
content_value.extend(GetElementInitialValue(factory, element_infos)) |
814 | 698 |
else: |
699 |
content_value = GetElementInitialValue(factory, infos) |
|
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1304
diff
changeset
|
700 |
return content_value |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
701 |
|
814 | 702 |
return { |
703 |
"type": COMPLEXTYPE, |
|
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1304
diff
changeset
|
704 |
"choices_xpath": etree.XPath(choices_xpath, namespaces=factory.NSMAP), |
814 | 705 |
"initial": GetContentInitial, |
706 |
} |
|
707 |
||
1782
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
708 |
# ------------------------------------------------------------------------------- |
814 | 709 |
# Structure extraction functions |
1782
5b6ad7a7fd9d
clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1780
diff
changeset
|
710 |
# ------------------------------------------------------------------------------- |
814 | 711 |
|
712 |
||
713 |
def DecomposeQualifiedName(name): |
|
714 |
result = QName_model.match(name) |
|
715 |
if not result: |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
716 |
raise ValueError("\"%s\" isn't a valid QName value!" % name) |
814 | 717 |
parts = result.groups()[0].split(':') |
718 |
if len(parts) == 1: |
|
719 |
return None, parts[0] |
|
720 |
return parts |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
721 |
|
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
722 |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
723 |
def GenerateElement(element_name, attributes, elements_model, |
814 | 724 |
accept_text=False): |
725 |
def ExtractElement(factory, node): |
|
726 |
attrs = factory.ExtractNodeAttrs(element_name, node, attributes) |
|
727 |
children_structure = "" |
|
728 |
children = [] |
|
729 |
for child in node.childNodes: |
|
730 |
if child.nodeName not in ["#comment", "#text"]: |
|
731 |
namespace, childname = DecomposeQualifiedName(child.nodeName) |
|
1734
750eeb7230a1
clean-up: fix some PEP8 E228 missing whitespace around modulo operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1732
diff
changeset
|
732 |
children_structure += "%s " % childname |
814 | 733 |
result = elements_model.match(children_structure) |
734 |
if not result: |
|
735 |
raise ValueError("Invalid structure for \"%s\" children!. First element invalid." % node.nodeName) |
|
736 |
valid = result.groups()[0] |
|
737 |
if len(valid) < len(children_structure): |
|
738 |
raise ValueError("Invalid structure for \"%s\" children!. Element number %d invalid." % (node.nodeName, len(valid.split(" ")) - 1)) |
|
739 |
for child in node.childNodes: |
|
740 |
if child.nodeName != "#comment" and \ |
|
741 |
(accept_text or child.nodeName != "#text"): |
|
742 |
if child.nodeName == "#text": |
|
743 |
children.append(GetAttributeValue(node)) |
|
744 |
else: |
|
745 |
namespace, childname = DecomposeQualifiedName(child.nodeName) |
|
746 |
infos = factory.GetQualifiedNameInfos(childname, namespace) |
|
747 |
if infos["type"] != SYNTAXELEMENT: |
|
1872
866fb3ab8778
fix pylint error "(undefined-variable) Undefined variable 'X'"
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1860
diff
changeset
|
748 |
raise ValueError("\"%s\" can't be a member child!" % childname) |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
749 |
if element_name in infos["extract"]: |
814 | 750 |
children.append(infos["extract"][element_name](factory, child)) |
751 |
else: |
|
752 |
children.append(infos["extract"]["default"](factory, child)) |
|
753 |
return node.nodeName, attrs, children |
|
754 |
return ExtractElement |
|
755 |
||
756 |
||
1831
56b48961cc68
fix (old-style-class) Old-style class defined error for most parts of
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1826
diff
changeset
|
757 |
class ClassFactory(object): |
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
758 |
""" |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
759 |
Class that generate class from an XML Tree |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
760 |
""" |
814 | 761 |
|
762 |
def __init__(self, document, filepath=None, debug=False): |
|
763 |
self.Document = document |
|
764 |
if filepath is not None: |
|
765 |
self.BaseFolder, self.FileName = os.path.split(filepath) |
|
766 |
else: |
|
767 |
self.BaseFolder = self.FileName = None |
|
768 |
self.Debug = debug |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
769 |
|
814 | 770 |
# Dictionary for stocking Classes and Types definitions created from |
771 |
# the XML tree |
|
772 |
self.XMLClassDefinitions = {} |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
773 |
|
814 | 774 |
self.DefinedNamespaces = {} |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
775 |
self.NSMAP = {} |
814 | 776 |
self.Namespaces = {} |
777 |
self.SchemaNamespace = None |
|
778 |
self.TargetNamespace = None |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
779 |
self.etreeNamespaceFormat = "%s" |
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
780 |
self.Parser = None |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
781 |
|
814 | 782 |
self.CurrentCompilations = [] |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
783 |
|
814 | 784 |
# Dictionaries for stocking Classes and Types generated |
785 |
self.ComputeAfter = [] |
|
786 |
if self.FileName is not None: |
|
787 |
self.ComputedClasses = {self.FileName: {}} |
|
788 |
else: |
|
789 |
self.ComputedClasses = {} |
|
790 |
self.ComputedClassesInfos = {} |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
791 |
self.ComputedClassesLookUp = {} |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
792 |
self.EquivalentClassesParent = {} |
814 | 793 |
self.AlreadyComputed = {} |
794 |
||
795 |
def GetQualifiedNameInfos(self, name, namespace=None, canbenone=False): |
|
796 |
if namespace is None: |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
797 |
if name in self.Namespaces[self.SchemaNamespace]: |
814 | 798 |
return self.Namespaces[self.SchemaNamespace][name] |
799 |
for space, elements in self.Namespaces.iteritems(): |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
800 |
if space != self.SchemaNamespace and name in elements: |
814 | 801 |
return elements[name] |
802 |
parts = name.split("_", 1) |
|
803 |
if len(parts) > 1: |
|
804 |
group = self.GetQualifiedNameInfos(parts[0], namespace) |
|
805 |
if group is not None and group["type"] == ELEMENTSGROUP: |
|
806 |
elements = [] |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
807 |
if "elements" in group: |
814 | 808 |
elements = group["elements"] |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
809 |
elif "choices" in group: |
814 | 810 |
elements = group["choices"] |
811 |
for element in elements: |
|
812 |
if element["name"] == parts[1]: |
|
813 |
return element |
|
814 |
if not canbenone: |
|
815 |
raise ValueError("Unknown element \"%s\" for any defined namespaces!" % name) |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
816 |
elif namespace in self.Namespaces: |
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
817 |
if name in self.Namespaces[namespace]: |
814 | 818 |
return self.Namespaces[namespace][name] |
819 |
parts = name.split("_", 1) |
|
820 |
if len(parts) > 1: |
|
821 |
group = self.GetQualifiedNameInfos(parts[0], namespace) |
|
822 |
if group is not None and group["type"] == ELEMENTSGROUP: |
|
823 |
elements = [] |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
824 |
if "elements" in group: |
814 | 825 |
elements = group["elements"] |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
826 |
elif "choices" in group: |
814 | 827 |
elements = group["choices"] |
828 |
for element in elements: |
|
829 |
if element["name"] == parts[1]: |
|
830 |
return element |
|
831 |
if not canbenone: |
|
832 |
raise ValueError("Unknown element \"%s\" for namespace \"%s\"!" % (name, namespace)) |
|
833 |
elif not canbenone: |
|
834 |
raise ValueError("Unknown namespace \"%s\"!" % namespace) |
|
835 |
return None |
|
836 |
||
837 |
def SplitQualifiedName(self, name, namespace=None, canbenone=False): |
|
838 |
if namespace is None: |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
839 |
if name in self.Namespaces[self.SchemaNamespace]: |
814 | 840 |
return name, None |
841 |
for space, elements in self.Namespaces.items(): |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
842 |
if space != self.SchemaNamespace and name in elements: |
814 | 843 |
return name, None |
844 |
parts = name.split("_", 1) |
|
845 |
if len(parts) > 1: |
|
846 |
group = self.GetQualifiedNameInfos(parts[0], namespace) |
|
847 |
if group is not None and group["type"] == ELEMENTSGROUP: |
|
848 |
elements = [] |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
849 |
if "elements" in group: |
814 | 850 |
elements = group["elements"] |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
851 |
elif "choices" in group: |
814 | 852 |
elements = group["choices"] |
853 |
for element in elements: |
|
854 |
if element["name"] == parts[1]: |
|
1872
866fb3ab8778
fix pylint error "(undefined-variable) Undefined variable 'X'"
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1860
diff
changeset
|
855 |
return parts[1], parts[0] |
814 | 856 |
if not canbenone: |
857 |
raise ValueError("Unknown element \"%s\" for any defined namespaces!" % name) |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
858 |
elif namespace in self.Namespaces: |
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
859 |
if name in self.Namespaces[namespace]: |
814 | 860 |
return name, None |
861 |
parts = name.split("_", 1) |
|
862 |
if len(parts) > 1: |
|
863 |
group = self.GetQualifiedNameInfos(parts[0], namespace) |
|
864 |
if group is not None and group["type"] == ELEMENTSGROUP: |
|
865 |
elements = [] |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
866 |
if "elements" in group: |
814 | 867 |
elements = group["elements"] |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
868 |
elif "choices" in group: |
814 | 869 |
elements = group["choices"] |
870 |
for element in elements: |
|
871 |
if element["name"] == parts[1]: |
|
872 |
return parts[1], parts[0] |
|
873 |
if not canbenone: |
|
874 |
raise ValueError("Unknown element \"%s\" for namespace \"%s\"!" % (name, namespace)) |
|
875 |
elif not canbenone: |
|
876 |
raise ValueError("Unknown namespace \"%s\"!" % namespace) |
|
877 |
return None, None |
|
878 |
||
879 |
def ExtractNodeAttrs(self, element_name, node, valid_attrs): |
|
880 |
attrs = {} |
|
881 |
for qualified_name, attr in node._attrs.items(): |
|
1758
845ca626db09
clean-up: fix PEP8 E222 multiple spaces after operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1750
diff
changeset
|
882 |
namespace, name = DecomposeQualifiedName(qualified_name) |
814 | 883 |
if name in valid_attrs: |
884 |
infos = self.GetQualifiedNameInfos(name, namespace) |
|
885 |
if infos["type"] != SYNTAXATTRIBUTE: |
|
886 |
raise ValueError("\"%s\" can't be a member attribute!" % name) |
|
887 |
elif name in attrs: |
|
888 |
raise ValueError("\"%s\" attribute has been twice!" % name) |
|
889 |
elif element_name in infos["extract"]: |
|
890 |
attrs[name] = infos["extract"][element_name](attr) |
|
891 |
else: |
|
892 |
attrs[name] = infos["extract"]["default"](attr) |
|
893 |
elif namespace == "xmlns": |
|
894 |
infos = self.GetQualifiedNameInfos("anyURI", self.SchemaNamespace) |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
895 |
value = infos["extract"](attr) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
896 |
self.DefinedNamespaces[value] = name |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
897 |
self.NSMAP[name] = value |
814 | 898 |
else: |
899 |
raise ValueError("Invalid attribute \"%s\" for member \"%s\"!" % (qualified_name, node.nodeName)) |
|
900 |
for attr in valid_attrs: |
|
901 |
if attr not in attrs and \ |
|
1774
ac0fe8aabb5e
clean-up: fix PEP8 E272 multiple spaces before keyword
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1773
diff
changeset
|
902 |
attr in self.Namespaces[self.SchemaNamespace] and \ |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
903 |
"default" in self.Namespaces[self.SchemaNamespace][attr]: |
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
904 |
if element_name in self.Namespaces[self.SchemaNamespace][attr]["default"]: |
814 | 905 |
default = self.Namespaces[self.SchemaNamespace][attr]["default"][element_name] |
906 |
else: |
|
907 |
default = self.Namespaces[self.SchemaNamespace][attr]["default"]["default"] |
|
908 |
if default is not None: |
|
909 |
attrs[attr] = default |
|
910 |
return attrs |
|
911 |
||
912 |
def ReduceElements(self, elements, schema=False): |
|
913 |
result = [] |
|
914 |
for child_infos in elements: |
|
915 |
if child_infos is not None: |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
916 |
if "name" in child_infos[1] and schema: |
814 | 917 |
self.CurrentCompilations.append(child_infos[1]["name"]) |
918 |
namespace, name = DecomposeQualifiedName(child_infos[0]) |
|
919 |
infos = self.GetQualifiedNameInfos(name, namespace) |
|
920 |
if infos["type"] != SYNTAXELEMENT: |
|
921 |
raise ValueError("\"%s\" can't be a member child!" % name) |
|
922 |
element = infos["reduce"](self, child_infos[1], child_infos[2]) |
|
923 |
if element is not None: |
|
924 |
result.append(element) |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
925 |
if "name" in child_infos[1] and schema: |
814 | 926 |
self.CurrentCompilations.pop(-1) |
927 |
annotations = [] |
|
928 |
children = [] |
|
929 |
for element in result: |
|
930 |
if element["type"] == "annotation": |
|
931 |
annotations.append(element) |
|
932 |
else: |
|
933 |
children.append(element) |
|
934 |
return annotations, children |
|
935 |
||
936 |
def AddComplexType(self, typename, infos): |
|
1775
b45f2768fab1
clean-up: fix PEP8 E713 test for membership should be 'not in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1774
diff
changeset
|
937 |
if typename not in self.XMLClassDefinitions: |
814 | 938 |
self.XMLClassDefinitions[typename] = infos |
939 |
else: |
|
940 |
raise ValueError("\"%s\" class already defined. Choose another name!" % typename) |
|
941 |
||
942 |
def ParseSchema(self): |
|
943 |
pass |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
944 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
945 |
def AddEquivalentClass(self, name, base): |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
946 |
if name != base: |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
947 |
equivalences = self.EquivalentClassesParent.setdefault(self.etreeNamespaceFormat % base, {}) |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
948 |
equivalences[self.etreeNamespaceFormat % name] = True |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
949 |
|
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
950 |
def AddDistinctionBetweenParentsInLookupClass( |
1878
fb73a6b6622d
fix pylint warning '(bad-continuation) Wrong hanging indentation before block'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1872
diff
changeset
|
951 |
self, lookup_classes, parent, typeinfos): |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
952 |
parent = (self.etreeNamespaceFormat % parent |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
953 |
if parent is not None else None) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
954 |
parent_class = lookup_classes.get(parent) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
955 |
if parent_class is not None: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
956 |
if isinstance(parent_class, ListType): |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
957 |
if typeinfos not in parent_class: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
958 |
lookup_classes[parent].append(typeinfos) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
959 |
elif parent_class != typeinfos: |
1405
0b9cd761a356
xmlclass : Ensured precedence of newly defined class in case of conflicting declaration
Edouard Tisserant
parents:
1385
diff
changeset
|
960 |
lookup_classes[parent] = [typeinfos, parent_class] |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
961 |
else: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
962 |
lookup_classes[parent] = typeinfos |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
963 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
964 |
def AddToLookupClass(self, name, parent, typeinfos): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
965 |
lookup_name = self.etreeNamespaceFormat % name |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
966 |
if isinstance(typeinfos, (StringType, UnicodeType)): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
967 |
self.AddEquivalentClass(name, typeinfos) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
968 |
typeinfos = self.etreeNamespaceFormat % typeinfos |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
969 |
lookup_classes = self.ComputedClassesLookUp.get(lookup_name) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
970 |
if lookup_classes is None: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
971 |
self.ComputedClassesLookUp[lookup_name] = (typeinfos, parent) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
972 |
elif isinstance(lookup_classes, DictType): |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
973 |
self.AddDistinctionBetweenParentsInLookupClass( |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
974 |
lookup_classes, parent, typeinfos) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
975 |
else: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
976 |
lookup_classes = { |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
977 |
self.etreeNamespaceFormat % lookup_classes[1] |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
978 |
if lookup_classes[1] is not None else None: lookup_classes[0]} |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
979 |
self.AddDistinctionBetweenParentsInLookupClass( |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
980 |
lookup_classes, parent, typeinfos) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
981 |
self.ComputedClassesLookUp[lookup_name] = lookup_classes |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
982 |
|
814 | 983 |
def ExtractTypeInfos(self, name, parent, typeinfos): |
984 |
if isinstance(typeinfos, (StringType, UnicodeType)): |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
985 |
namespace, type_name = DecomposeQualifiedName(typeinfos) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
986 |
infos = self.GetQualifiedNameInfos(type_name, namespace) |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
987 |
if name != "base": |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
988 |
if infos["type"] == SIMPLETYPE: |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
989 |
self.AddToLookupClass(name, parent, DefaultElementClass) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
990 |
elif namespace == self.TargetNamespace: |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
991 |
self.AddToLookupClass(name, parent, type_name) |
814 | 992 |
if infos["type"] == COMPLEXTYPE: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
993 |
type_name, parent = self.SplitQualifiedName(type_name, namespace) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
994 |
result = self.CreateClass(type_name, parent, infos) |
814 | 995 |
if result is not None and not isinstance(result, (UnicodeType, StringType)): |
996 |
self.Namespaces[self.TargetNamespace][result["name"]] = result |
|
997 |
return result |
|
998 |
elif infos["type"] == ELEMENT and infos["elmt_type"]["type"] == COMPLEXTYPE: |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
999 |
type_name, parent = self.SplitQualifiedName(type_name, namespace) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1000 |
result = self.CreateClass(type_name, parent, infos["elmt_type"]) |
814 | 1001 |
if result is not None and not isinstance(result, (UnicodeType, StringType)): |
1002 |
self.Namespaces[self.TargetNamespace][result["name"]] = result |
|
1003 |
return result |
|
1004 |
else: |
|
1005 |
return infos |
|
1006 |
elif typeinfos["type"] == COMPLEXTYPE: |
|
1007 |
return self.CreateClass(name, parent, typeinfos) |
|
1008 |
elif typeinfos["type"] == SIMPLETYPE: |
|
1009 |
return typeinfos |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1010 |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1011 |
def GetEquivalentParents(self, parent): |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1012 |
return reduce(lambda x, y: x + y, |
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1013 |
[[p] + self.GetEquivalentParents(p) |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1014 |
for p in self.EquivalentClassesParent.get(parent, {}).keys()], []) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1015 |
|
814 | 1016 |
def CreateClasses(self): |
1837
c507c363625e
fix pylint warning '(pointless-string-statement) String statement has no effect'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1832
diff
changeset
|
1017 |
""" |
c507c363625e
fix pylint warning '(pointless-string-statement) String statement has no effect'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1832
diff
changeset
|
1018 |
Method that generates the classes |
c507c363625e
fix pylint warning '(pointless-string-statement) String statement has no effect'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1832
diff
changeset
|
1019 |
""" |
814 | 1020 |
self.ParseSchema() |
1021 |
for name, infos in self.Namespaces[self.TargetNamespace].items(): |
|
1022 |
if infos["type"] == ELEMENT: |
|
1023 |
if not isinstance(infos["elmt_type"], (UnicodeType, StringType)) and \ |
|
1024 |
infos["elmt_type"]["type"] == COMPLEXTYPE: |
|
1025 |
self.ComputeAfter.append((name, None, infos["elmt_type"], True)) |
|
1026 |
while len(self.ComputeAfter) > 0: |
|
1027 |
result = self.CreateClass(*self.ComputeAfter.pop(0)) |
|
1028 |
if result is not None and not isinstance(result, (UnicodeType, StringType)): |
|
1029 |
self.Namespaces[self.TargetNamespace][result["name"]] = result |
|
1030 |
elif infos["type"] == COMPLEXTYPE: |
|
1031 |
self.ComputeAfter.append((name, None, infos)) |
|
1032 |
while len(self.ComputeAfter) > 0: |
|
1033 |
result = self.CreateClass(*self.ComputeAfter.pop(0)) |
|
1034 |
if result is not None and \ |
|
1035 |
not isinstance(result, (UnicodeType, StringType)): |
|
1036 |
self.Namespaces[self.TargetNamespace][result["name"]] = result |
|
1037 |
elif infos["type"] == ELEMENTSGROUP: |
|
1038 |
elements = [] |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1039 |
if "elements" in infos: |
814 | 1040 |
elements = infos["elements"] |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1041 |
elif "choices" in infos: |
814 | 1042 |
elements = infos["choices"] |
1043 |
for element in elements: |
|
1044 |
if not isinstance(element["elmt_type"], (UnicodeType, StringType)) and \ |
|
1045 |
element["elmt_type"]["type"] == COMPLEXTYPE: |
|
1046 |
self.ComputeAfter.append((element["name"], infos["name"], element["elmt_type"])) |
|
1047 |
while len(self.ComputeAfter) > 0: |
|
1048 |
result = self.CreateClass(*self.ComputeAfter.pop(0)) |
|
1049 |
if result is not None and \ |
|
1050 |
not isinstance(result, (UnicodeType, StringType)): |
|
1051 |
self.Namespaces[self.TargetNamespace][result["name"]] = result |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1052 |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1053 |
for name, parents in self.ComputedClassesLookUp.iteritems(): |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1054 |
if isinstance(parents, DictType): |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1055 |
computed_classes = parents.items() |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1056 |
elif parents[1] is not None: |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1057 |
computed_classes = [(self.etreeNamespaceFormat % parents[1], parents[0])] |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1058 |
else: |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1059 |
computed_classes = [] |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1060 |
for parent, computed_class in computed_classes: |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1061 |
for equivalent_parent in self.GetEquivalentParents(parent): |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1062 |
if not isinstance(parents, DictType): |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1063 |
parents = dict(computed_classes) |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1064 |
self.ComputedClassesLookUp[name] = parents |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1065 |
parents[equivalent_parent] = computed_class |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1066 |
|
814 | 1067 |
return self.ComputedClasses |
1068 |
||
1744
69dfdb26f600
clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1743
diff
changeset
|
1069 |
def CreateClass(self, name, parent, classinfos, baseclass=False): |
814 | 1070 |
if parent is not None: |
1071 |
classname = "%s_%s" % (parent, name) |
|
1072 |
else: |
|
1073 |
classname = name |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1074 |
|
814 | 1075 |
# Checks that classe haven't been generated yet |
1076 |
if self.AlreadyComputed.get(classname, False): |
|
1077 |
return self.ComputedClassesInfos.get(classname, None) |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1078 |
|
814 | 1079 |
# If base classes haven't been generated |
1080 |
bases = [] |
|
1081 |
base_infos = classinfos.get("base", None) |
|
1082 |
if base_infos is not None: |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1083 |
namespace, base_name = DecomposeQualifiedName(base_infos) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1084 |
if namespace == self.TargetNamespace: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1085 |
self.AddEquivalentClass(name, base_name) |
814 | 1086 |
result = self.ExtractTypeInfos("base", name, base_infos) |
1087 |
if result is None: |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1088 |
namespace, base_name = DecomposeQualifiedName(base_infos) |
814 | 1089 |
if self.AlreadyComputed.get(base_name, False): |
1090 |
self.ComputeAfter.append((name, parent, classinfos)) |
|
1091 |
if self.TargetNamespace is not None: |
|
1092 |
return "%s:%s" % (self.TargetNamespace, classname) |
|
1093 |
else: |
|
1094 |
return classname |
|
1095 |
elif result is not None: |
|
1096 |
if self.FileName is not None: |
|
1097 |
classinfos["base"] = self.ComputedClasses[self.FileName].get(result["name"], None) |
|
1098 |
if classinfos["base"] is None: |
|
1099 |
for filename, classes in self.ComputedClasses.iteritems(): |
|
1100 |
if filename != self.FileName: |
|
1101 |
classinfos["base"] = classes.get(result["name"], None) |
|
1102 |
if classinfos["base"] is not None: |
|
1103 |
break |
|
1104 |
else: |
|
1105 |
classinfos["base"] = self.ComputedClasses.get(result["name"], None) |
|
1106 |
if classinfos["base"] is None: |
|
1107 |
raise ValueError("No class found for base type") |
|
1108 |
bases.append(classinfos["base"]) |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1109 |
bases.append(DefaultElementClass) |
814 | 1110 |
bases = tuple(bases) |
1111 |
classmembers = {"__doc__": classinfos.get("doc", ""), "IsBaseClass": baseclass} |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1112 |
|
814 | 1113 |
self.AlreadyComputed[classname] = True |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1114 |
|
814 | 1115 |
for attribute in classinfos["attributes"]: |
1116 |
infos = self.ExtractTypeInfos(attribute["name"], name, attribute["attr_type"]) |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1117 |
if infos is not None: |
814 | 1118 |
if infos["type"] != SIMPLETYPE: |
1119 |
raise ValueError("\"%s\" type is not a simple type!" % attribute["attr_type"]) |
|
1120 |
attrname = attribute["name"] |
|
1121 |
if attribute["use"] == "optional": |
|
1734
750eeb7230a1
clean-up: fix some PEP8 E228 missing whitespace around modulo operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1732
diff
changeset
|
1122 |
classmembers["add%s" % attrname] = generateAddMethod(attrname, self, attribute) |
750eeb7230a1
clean-up: fix some PEP8 E228 missing whitespace around modulo operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1732
diff
changeset
|
1123 |
classmembers["delete%s" % attrname] = generateDeleteMethod(attrname) |
750eeb7230a1
clean-up: fix some PEP8 E228 missing whitespace around modulo operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1732
diff
changeset
|
1124 |
classmembers["set%s" % attrname] = generateSetMethod(attrname) |
750eeb7230a1
clean-up: fix some PEP8 E228 missing whitespace around modulo operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1732
diff
changeset
|
1125 |
classmembers["get%s" % attrname] = generateGetMethod(attrname) |
814 | 1126 |
else: |
1127 |
raise ValueError("\"%s\" type unrecognized!" % attribute["attr_type"]) |
|
1128 |
attribute["attr_type"] = infos |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1129 |
|
814 | 1130 |
for element in classinfos["elements"]: |
1131 |
if element["type"] == CHOICE: |
|
1132 |
elmtname = element["name"] |
|
1133 |
choices = ComputeContentChoices(self, name, element) |
|
1734
750eeb7230a1
clean-up: fix some PEP8 E228 missing whitespace around modulo operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1732
diff
changeset
|
1134 |
classmembers["get%schoices" % elmtname] = generateGetChoicesMethod(element["choices"]) |
814 | 1135 |
if element["maxOccurs"] == "unbounded" or element["maxOccurs"] > 1: |
1136 |
classmembers["append%sbytype" % elmtname] = generateAppendChoiceByTypeMethod(element["maxOccurs"], self, element["choices"]) |
|
1137 |
classmembers["insert%sbytype" % elmtname] = generateInsertChoiceByTypeMethod(element["maxOccurs"], self, element["choices"]) |
|
1138 |
else: |
|
1139 |
classmembers["set%sbytype" % elmtname] = generateSetChoiceByTypeMethod(self, element["choices"]) |
|
1140 |
infos = GenerateContentInfos(self, name, choices) |
|
1141 |
elif element["type"] == ANY: |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1142 |
elmtname = element["name"] = "anyText" |
814 | 1143 |
element["minOccurs"] = element["maxOccurs"] = 1 |
1144 |
infos = GenerateAnyInfos(element) |
|
1145 |
else: |
|
1146 |
elmtname = element["name"] |
|
1147 |
if element["elmt_type"] == "tag": |
|
1148 |
infos = GenerateTagInfos(element) |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1149 |
self.AddToLookupClass(element["name"], name, DefaultElementClass) |
814 | 1150 |
else: |
1151 |
infos = self.ExtractTypeInfos(element["name"], name, element["elmt_type"]) |
|
1152 |
if infos is not None: |
|
1153 |
element["elmt_type"] = infos |
|
1154 |
if element["maxOccurs"] == "unbounded" or element["maxOccurs"] > 1: |
|
1155 |
classmembers["append%s" % elmtname] = generateAppendMethod(elmtname, element["maxOccurs"], self, element) |
|
1156 |
classmembers["insert%s" % elmtname] = generateInsertMethod(elmtname, element["maxOccurs"], self, element) |
|
1157 |
classmembers["remove%s" % elmtname] = generateRemoveMethod(elmtname, element["minOccurs"]) |
|
1158 |
classmembers["count%s" % elmtname] = generateCountMethod(elmtname) |
|
1159 |
else: |
|
1160 |
if element["minOccurs"] == 0: |
|
1161 |
classmembers["add%s" % elmtname] = generateAddMethod(elmtname, self, element) |
|
1162 |
classmembers["delete%s" % elmtname] = generateDeleteMethod(elmtname) |
|
1163 |
classmembers["set%s" % elmtname] = generateSetMethod(elmtname) |
|
1164 |
classmembers["get%s" % elmtname] = generateGetMethod(elmtname) |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1165 |
|
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1166 |
classmembers["_init_"] = generateInitMethod(self, classinfos) |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1167 |
classmembers["StructurePattern"] = GetStructurePattern(classinfos) |
814 | 1168 |
classmembers["getElementAttributes"] = generateGetElementAttributes(self, classinfos) |
1169 |
classmembers["getElementInfos"] = generateGetElementInfos(self, classinfos) |
|
1170 |
classmembers["setElementValue"] = generateSetElementValue(self, classinfos) |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1171 |
|
1385
816705d1e512
Fixed xmlclass bug when enabling/disabling libraries in root CTN
Edouard Tisserant
parents:
1330
diff
changeset
|
1172 |
class_definition = classobj(str(name), bases, classmembers) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1173 |
setattr(class_definition, "__getattr__", generateGetattrMethod(self, class_definition, classinfos)) |
814 | 1174 |
setattr(class_definition, "__setattr__", generateSetattrMethod(self, class_definition, classinfos)) |
1773
38fde37c3766
clean-up: fix PEP8 E124 closing bracket does not match visual indentation
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1768
diff
changeset
|
1175 |
class_infos = { |
38fde37c3766
clean-up: fix PEP8 E124 closing bracket does not match visual indentation
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1768
diff
changeset
|
1176 |
"type": COMPILEDCOMPLEXTYPE, |
38fde37c3766
clean-up: fix PEP8 E124 closing bracket does not match visual indentation
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1768
diff
changeset
|
1177 |
"name": classname, |
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1178 |
"initial": generateClassCreateFunction(self, class_definition), |
1303
908a5803c2cc
Removed obsolete functions for extracting values for xml dom tree and generating xml string
Laurent Bessard
parents:
1300
diff
changeset
|
1179 |
} |
814 | 1180 |
if self.FileName is not None: |
1181 |
self.ComputedClasses[self.FileName][classname] = class_definition |
|
1182 |
else: |
|
1183 |
self.ComputedClasses[classname] = class_definition |
|
1184 |
self.ComputedClassesInfos[classname] = class_infos |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1185 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1186 |
self.AddToLookupClass(name, parent, class_definition) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1187 |
self.AddToLookupClass(classname, None, class_definition) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1188 |
|
814 | 1189 |
return class_infos |
1190 |
||
1191 |
def PrintClasses(self): |
|
1837
c507c363625e
fix pylint warning '(pointless-string-statement) String statement has no effect'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1832
diff
changeset
|
1192 |
""" |
c507c363625e
fix pylint warning '(pointless-string-statement) String statement has no effect'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1832
diff
changeset
|
1193 |
Method that print the classes generated |
c507c363625e
fix pylint warning '(pointless-string-statement) String statement has no effect'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1832
diff
changeset
|
1194 |
""" |
814 | 1195 |
items = self.ComputedClasses.items() |
1196 |
items.sort() |
|
1197 |
if self.FileName is not None: |
|
1198 |
for filename, classes in items: |
|
1826
91796f408540
fix usage of python2-only print statement
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1782
diff
changeset
|
1199 |
print("File '%s':" % filename) |
814 | 1200 |
class_items = classes.items() |
1201 |
class_items.sort() |
|
1202 |
for classname, xmlclass in class_items: |
|
1826
91796f408540
fix usage of python2-only print statement
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1782
diff
changeset
|
1203 |
print("%s: %s" % (classname, str(xmlclass))) |
814 | 1204 |
else: |
1205 |
for classname, xmlclass in items: |
|
1826
91796f408540
fix usage of python2-only print statement
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1782
diff
changeset
|
1206 |
print("%s: %s" % (classname, str(xmlclass))) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1207 |
|
814 | 1208 |
def PrintClassNames(self): |
1209 |
classnames = self.XMLClassDefinitions.keys() |
|
1210 |
classnames.sort() |
|
1211 |
for classname in classnames: |
|
1826
91796f408540
fix usage of python2-only print statement
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1782
diff
changeset
|
1212 |
print(classname) |
814 | 1213 |
|
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1214 |
|
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1215 |
def ComputeMultiplicity(name, infos): |
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1216 |
""" |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1217 |
Method that generate the method for generating the xml tree structure model by |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1218 |
following the attributes list defined |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1219 |
""" |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1220 |
if infos["minOccurs"] == 0: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1221 |
if infos["maxOccurs"] == "unbounded": |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1222 |
return "(?:%s)*" % name |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1223 |
elif infos["maxOccurs"] == 1: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1224 |
return "(?:%s)?" % name |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1225 |
else: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1226 |
return "(?:%s){,%d}" % (name, infos["maxOccurs"]) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1227 |
elif infos["minOccurs"] == 1: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1228 |
if infos["maxOccurs"] == "unbounded": |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1229 |
return "(?:%s)+" % name |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1230 |
elif infos["maxOccurs"] == 1: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1231 |
return "(?:%s)" % name |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1232 |
else: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1233 |
return "(?:%s){1,%d}" % (name, infos["maxOccurs"]) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1234 |
else: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1235 |
if infos["maxOccurs"] == "unbounded": |
1860
4eeddef7f973
fix format string argument error found by pylint '(too-many-format-args) Too many arguments for format string'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1852
diff
changeset
|
1236 |
return "(?:%s){%d,}" % (name, infos["minOccurs"]) |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1237 |
else: |
1767
c74815729afd
clean-up: fix PEP8 E127 continuation line over-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1765
diff
changeset
|
1238 |
return "(?:%s){%d,%d}" % (name, |
c74815729afd
clean-up: fix PEP8 E127 continuation line over-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1765
diff
changeset
|
1239 |
infos["minOccurs"], |
c74815729afd
clean-up: fix PEP8 E127 continuation line over-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1765
diff
changeset
|
1240 |
infos["maxOccurs"]) |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1241 |
|
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1242 |
|
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1243 |
def GetStructurePattern(classinfos): |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1244 |
base_structure_pattern = ( |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1245 |
classinfos["base"].StructurePattern.pattern[:-1] |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1246 |
if "base" in classinfos else "") |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1247 |
elements = [] |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1248 |
for element in classinfos["elements"]: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1249 |
if element["type"] == ANY: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1250 |
infos = element.copy() |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1251 |
infos["minOccurs"] = 0 |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1252 |
elements.append(ComputeMultiplicity("#text |#cdata-section |\w* ", infos)) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1253 |
elif element["type"] == CHOICE: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1254 |
choices = [] |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1255 |
for infos in element["choices"]: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1256 |
if infos["type"] == "sequence": |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1257 |
structure = "(?:%s)" % GetStructurePattern(infos) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1258 |
else: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1259 |
structure = "%s " % infos["name"] |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1260 |
choices.append(ComputeMultiplicity(structure, infos)) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1261 |
elements.append(ComputeMultiplicity("|".join(choices), element)) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1262 |
elif element["name"] == "content" and element["elmt_type"]["type"] == SIMPLETYPE: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1263 |
elements.append("(?:#text |#cdata-section )?") |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1264 |
else: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1265 |
elements.append(ComputeMultiplicity("%s " % element["name"], element)) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1266 |
if classinfos.get("order", True) or len(elements) == 0: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1267 |
return re.compile(base_structure_pattern + "".join(elements) + "$") |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1268 |
else: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1269 |
raise ValueError("XSD structure not yet supported!") |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1270 |
|
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1271 |
|
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1272 |
def generateClassCreateFunction(factory, class_definition): |
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1273 |
""" |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1274 |
Method that generate the method for creating a class instance |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1275 |
""" |
814 | 1276 |
def classCreatefunction(): |
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1277 |
return factory.Parser.CreateElementFromClass(class_definition) |
814 | 1278 |
return classCreatefunction |
1279 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1280 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1281 |
def generateGetattrMethod(factory, class_definition, classinfos): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1282 |
attributes = dict([(attr["name"], attr) for attr in classinfos["attributes"] if attr["use"] != "prohibited"]) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1283 |
elements = dict([(element["name"], element) for element in classinfos["elements"]]) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1284 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1285 |
def getattrMethod(self, name): |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1286 |
if name in attributes: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1287 |
attribute_infos = attributes[name] |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1288 |
attribute_infos["attr_type"] = FindTypeInfos(factory, attribute_infos["attr_type"]) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1289 |
value = self.get(name) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1290 |
if value is not None: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1291 |
return attribute_infos["attr_type"]["extract"](value, extract=False) |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1292 |
elif "fixed" in attribute_infos: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1293 |
return attribute_infos["attr_type"]["extract"](attribute_infos["fixed"], extract=False) |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1294 |
elif "default" in attribute_infos: |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1295 |
return attribute_infos["attr_type"]["extract"](attribute_infos["default"], extract=False) |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1296 |
return None |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1297 |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1298 |
elif name in elements: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1299 |
element_infos = elements[name] |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1300 |
element_infos["elmt_type"] = FindTypeInfos(factory, element_infos["elmt_type"]) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1301 |
if element_infos["type"] == CHOICE: |
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1304
diff
changeset
|
1302 |
content = element_infos["elmt_type"]["choices_xpath"](self) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1303 |
if element_infos["maxOccurs"] == "unbounded" or element_infos["maxOccurs"] > 1: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1304 |
return content |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1305 |
elif len(content) > 0: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1306 |
return content[0] |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1307 |
return None |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1308 |
elif element_infos["type"] == ANY: |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1309 |
return element_infos["elmt_type"]["extract"](self) |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1310 |
elif name == "content" and element_infos["elmt_type"]["type"] == SIMPLETYPE: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1311 |
return element_infos["elmt_type"]["extract"](self.text, extract=False) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1312 |
else: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1313 |
element_name = factory.etreeNamespaceFormat % name |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1314 |
if element_infos["maxOccurs"] == "unbounded" or element_infos["maxOccurs"] > 1: |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1315 |
values = self.findall(element_name) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1316 |
if element_infos["elmt_type"]["type"] == SIMPLETYPE: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1317 |
return map(lambda value: |
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1318 |
element_infos["elmt_type"]["extract"](value.text, extract=False), |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1319 |
values) |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1320 |
return values |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1321 |
else: |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1322 |
value = self.find(element_name) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1323 |
if element_infos["elmt_type"]["type"] == SIMPLETYPE: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1324 |
return element_infos["elmt_type"]["extract"](value.text, extract=False) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1325 |
return value |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1326 |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1327 |
elif "base" in classinfos: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1328 |
return classinfos["base"].__getattr__(self, name) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1329 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1330 |
return DefaultElementClass.__getattribute__(self, name) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1331 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1332 |
return getattrMethod |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1333 |
|
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1334 |
|
814 | 1335 |
def generateSetattrMethod(factory, class_definition, classinfos): |
1336 |
attributes = dict([(attr["name"], attr) for attr in classinfos["attributes"] if attr["use"] != "prohibited"]) |
|
1337 |
optional_attributes = dict([(attr["name"], True) for attr in classinfos["attributes"] if attr["use"] == "optional"]) |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1338 |
elements = OrderedDict([(element["name"], element) for element in classinfos["elements"]]) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1339 |
|
814 | 1340 |
def setattrMethod(self, name, value): |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1341 |
if name in attributes: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1342 |
attribute_infos = attributes[name] |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1343 |
attribute_infos["attr_type"] = FindTypeInfos(factory, attribute_infos["attr_type"]) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1344 |
if optional_attributes.get(name, False): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1345 |
default = attribute_infos.get("default", None) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1346 |
if value is None or value == default: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1347 |
self.attrib.pop(name, None) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1348 |
return |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1349 |
elif "fixed" in attribute_infos: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1350 |
return |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1351 |
return self.set(name, attribute_infos["attr_type"]["generate"](value)) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1352 |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1353 |
elif name in elements: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1354 |
element_infos = elements[name] |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1355 |
element_infos["elmt_type"] = FindTypeInfos(factory, element_infos["elmt_type"]) |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1356 |
if element_infos["type"] == ANY: |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1357 |
element_infos["elmt_type"]["generate"](self, value) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1358 |
|
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1359 |
elif name == "content" and element_infos["elmt_type"]["type"] == SIMPLETYPE: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1360 |
self.text = element_infos["elmt_type"]["generate"](value) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1361 |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1362 |
else: |
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1363 |
prefix = ("%s:" % factory.TargetNamespace |
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1364 |
if factory.TargetNamespace is not None else "") |
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1365 |
element_xpath = (prefix + name |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1366 |
if name != "content" |
1305
714f1381a09a
Fixed xmlclass and plcopen using precompile xpath where possible
Laurent Bessard
parents:
1304
diff
changeset
|
1367 |
else elements["content"]["elmt_type"]["choices_xpath"].path) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1368 |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1369 |
for element in self.xpath(element_xpath, namespaces=factory.NSMAP): |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1370 |
self.remove(element) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1371 |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1372 |
if value is not None: |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1373 |
element_idx = elements.keys().index(name) |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1374 |
if element_idx > 0: |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1375 |
previous_elements_xpath = "|".join(map( |
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1376 |
lambda x: prefix + x |
1777
c46ec818bdd7
clean-up: fix PEP8 E131 continuation line unaligned for hanging indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1775
diff
changeset
|
1377 |
if x != "content" |
c46ec818bdd7
clean-up: fix PEP8 E131 continuation line unaligned for hanging indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1775
diff
changeset
|
1378 |
else elements["content"]["elmt_type"]["choices_xpath"].path, |
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1379 |
elements.keys()[:element_idx])) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1380 |
|
1294
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1381 |
insertion_point = len(self.xpath(previous_elements_xpath, namespaces=factory.NSMAP)) |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1382 |
else: |
f02ba5b83811
Fixed datatype and configuration editing in xmlclass refactoring
Laurent Bessard
parents:
1293
diff
changeset
|
1383 |
insertion_point = 0 |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1384 |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1385 |
if not isinstance(value, ListType): |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1386 |
value = [value] |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1387 |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1388 |
for element in reversed(value): |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1389 |
if element_infos["elmt_type"]["type"] == SIMPLETYPE: |
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1390 |
tmp_element = factory.Parser.makeelement(factory.etreeNamespaceFormat % name) |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1391 |
tmp_element.text = element_infos["elmt_type"]["generate"](element) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1392 |
element = tmp_element |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1393 |
self.insert(insertion_point, element) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1394 |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1395 |
elif "base" in classinfos: |
814 | 1396 |
return classinfos["base"].__setattr__(self, name, value) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1397 |
|
814 | 1398 |
else: |
1399 |
raise AttributeError("'%s' can't have an attribute '%s'." % (self.__class__.__name__, name)) |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1400 |
|
814 | 1401 |
return setattrMethod |
1402 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1403 |
|
814 | 1404 |
def gettypeinfos(name, facets): |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1405 |
if "enumeration" in facets and facets["enumeration"][0] is not None: |
814 | 1406 |
return facets["enumeration"][0] |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1407 |
elif "maxInclusive" in facets: |
1739
ec153828ded2
clean-up: fix PEP8 E203 whitespace before ':' and whitespace before ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1736
diff
changeset
|
1408 |
limits = {"max": None, "min": None} |
814 | 1409 |
if facets["maxInclusive"][0] is not None: |
1410 |
limits["max"] = facets["maxInclusive"][0] |
|
1411 |
elif facets["maxExclusive"][0] is not None: |
|
1412 |
limits["max"] = facets["maxExclusive"][0] - 1 |
|
1413 |
if facets["minInclusive"][0] is not None: |
|
1414 |
limits["min"] = facets["minInclusive"][0] |
|
1415 |
elif facets["minExclusive"][0] is not None: |
|
1416 |
limits["min"] = facets["minExclusive"][0] + 1 |
|
1417 |
if limits["max"] is not None or limits["min"] is not None: |
|
1418 |
return limits |
|
1419 |
return name |
|
1420 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1421 |
|
814 | 1422 |
def generateGetElementAttributes(factory, classinfos): |
1423 |
def getElementAttributes(self): |
|
1424 |
attr_list = [] |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1425 |
if "base" in classinfos: |
814 | 1426 |
attr_list.extend(classinfos["base"].getElementAttributes(self)) |
1427 |
for attr in classinfos["attributes"]: |
|
1428 |
if attr["use"] != "prohibited": |
|
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1429 |
attr_params = { |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1430 |
"name": attr["name"], |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1431 |
"use": attr["use"], |
1739
ec153828ded2
clean-up: fix PEP8 E203 whitespace before ':' and whitespace before ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1736
diff
changeset
|
1432 |
"type": gettypeinfos(attr["attr_type"]["basename"], attr["attr_type"]["facets"]), |
ec153828ded2
clean-up: fix PEP8 E203 whitespace before ':' and whitespace before ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1736
diff
changeset
|
1433 |
"value": getattr(self, attr["name"], "")} |
814 | 1434 |
attr_list.append(attr_params) |
1435 |
return attr_list |
|
1436 |
return getElementAttributes |
|
1437 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1438 |
|
814 | 1439 |
def generateGetElementInfos(factory, classinfos): |
1440 |
attributes = dict([(attr["name"], attr) for attr in classinfos["attributes"] if attr["use"] != "prohibited"]) |
|
1441 |
elements = dict([(element["name"], element) for element in classinfos["elements"]]) |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1442 |
|
814 | 1443 |
def getElementInfos(self, name, path=None, derived=False): |
1444 |
attr_type = "element" |
|
1445 |
value = None |
|
1446 |
use = "required" |
|
1447 |
children = [] |
|
1448 |
if path is not None: |
|
1449 |
parts = path.split(".", 1) |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1450 |
if parts[0] in attributes: |
1179
3e7bd88fcff7
Fixed inconsistency in value display when setting integer value for float parameter
Laurent Bessard
parents:
1124
diff
changeset
|
1451 |
if len(parts) != 1: |
814 | 1452 |
raise ValueError("Wrong path!") |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1453 |
attr_type = gettypeinfos(attributes[parts[0]]["attr_type"]["basename"], |
814 | 1454 |
attributes[parts[0]]["attr_type"]["facets"]) |
1455 |
value = getattr(self, parts[0], "") |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1456 |
elif parts[0] in elements: |
814 | 1457 |
if elements[parts[0]]["elmt_type"]["type"] == SIMPLETYPE: |
1179
3e7bd88fcff7
Fixed inconsistency in value display when setting integer value for float parameter
Laurent Bessard
parents:
1124
diff
changeset
|
1458 |
if len(parts) != 1: |
814 | 1459 |
raise ValueError("Wrong path!") |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1460 |
attr_type = gettypeinfos(elements[parts[0]]["elmt_type"]["basename"], |
814 | 1461 |
elements[parts[0]]["elmt_type"]["facets"]) |
1462 |
value = getattr(self, parts[0], "") |
|
1463 |
elif parts[0] == "content": |
|
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1464 |
return self.content.getElementInfos(self.content.getLocalTag(), path) |
814 | 1465 |
else: |
1466 |
attr = getattr(self, parts[0], None) |
|
1467 |
if attr is None: |
|
1468 |
raise ValueError("Wrong path!") |
|
1469 |
if len(parts) == 1: |
|
1470 |
return attr.getElementInfos(parts[0]) |
|
1471 |
else: |
|
1472 |
return attr.getElementInfos(parts[0], parts[1]) |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1473 |
elif "content" in elements: |
1179
3e7bd88fcff7
Fixed inconsistency in value display when setting integer value for float parameter
Laurent Bessard
parents:
1124
diff
changeset
|
1474 |
if len(parts) > 0: |
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1475 |
return self.content.getElementInfos(name, path) |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1476 |
elif "base" in classinfos: |
1179
3e7bd88fcff7
Fixed inconsistency in value display when setting integer value for float parameter
Laurent Bessard
parents:
1124
diff
changeset
|
1477 |
classinfos["base"].getElementInfos(name, path) |
814 | 1478 |
else: |
1479 |
raise ValueError("Wrong path!") |
|
1480 |
else: |
|
1481 |
if not derived: |
|
1482 |
children.extend(self.getElementAttributes()) |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1483 |
if "base" in classinfos: |
814 | 1484 |
children.extend(classinfos["base"].getElementInfos(self, name, derived=True)["children"]) |
1485 |
for element_name, element in elements.items(): |
|
1486 |
if element["minOccurs"] == 0: |
|
1487 |
use = "optional" |
|
1488 |
if element_name == "content" and element["type"] == CHOICE: |
|
1489 |
attr_type = [(choice["name"], None) for choice in element["choices"]] |
|
1490 |
if self.content is None: |
|
1491 |
value = "" |
|
1492 |
else: |
|
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1493 |
value = self.content.getLocalTag() |
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1494 |
if self.content is not None: |
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1495 |
children.extend(self.content.getElementInfos(value)["children"]) |
814 | 1496 |
elif element["elmt_type"]["type"] == SIMPLETYPE: |
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1497 |
children.append({ |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1498 |
"name": element_name, |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1499 |
"require": element["minOccurs"] != 0, |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1500 |
"type": gettypeinfos(element["elmt_type"]["basename"], |
814 | 1501 |
element["elmt_type"]["facets"]), |
1502 |
"value": getattr(self, element_name, None)}) |
|
1503 |
else: |
|
1504 |
instance = getattr(self, element_name, None) |
|
1505 |
if instance is None: |
|
1506 |
instance = element["elmt_type"]["initial"]() |
|
1507 |
children.append(instance.getElementInfos(element_name)) |
|
1508 |
return {"name": name, "type": attr_type, "value": value, "use": use, "children": children} |
|
1509 |
return getElementInfos |
|
1510 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1511 |
|
814 | 1512 |
def generateSetElementValue(factory, classinfos): |
1513 |
attributes = dict([(attr["name"], attr) for attr in classinfos["attributes"] if attr["use"] != "prohibited"]) |
|
1514 |
elements = dict([(element["name"], element) for element in classinfos["elements"]]) |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1515 |
|
814 | 1516 |
def setElementValue(self, path, value): |
1517 |
if path is not None: |
|
1518 |
parts = path.split(".", 1) |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1519 |
if parts[0] in attributes: |
814 | 1520 |
if len(parts) != 1: |
1521 |
raise ValueError("Wrong path!") |
|
1522 |
if attributes[parts[0]]["attr_type"]["basename"] == "boolean": |
|
1523 |
setattr(self, parts[0], value) |
|
1017
2925d6e49893
Fixed bug when setting empty value to optional non-string parameters
Laurent Bessard
parents:
814
diff
changeset
|
1524 |
elif attributes[parts[0]]["use"] == "optional" and value == "": |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1525 |
if "default" in attributes[parts[0]]: |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1526 |
setattr(self, parts[0], |
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1527 |
attributes[parts[0]]["attr_type"]["extract"]( |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1528 |
attributes[parts[0]]["default"], False)) |
1022
ec30c12b1d67
Fixed bug when connecting and URI_location is empty
Laurent Bessard
parents:
1017
diff
changeset
|
1529 |
else: |
ec30c12b1d67
Fixed bug when connecting and URI_location is empty
Laurent Bessard
parents:
1017
diff
changeset
|
1530 |
setattr(self, parts[0], None) |
814 | 1531 |
else: |
1532 |
setattr(self, parts[0], attributes[parts[0]]["attr_type"]["extract"](value, False)) |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1533 |
elif parts[0] in elements: |
814 | 1534 |
if elements[parts[0]]["elmt_type"]["type"] == SIMPLETYPE: |
1535 |
if len(parts) != 1: |
|
1536 |
raise ValueError("Wrong path!") |
|
1537 |
if elements[parts[0]]["elmt_type"]["basename"] == "boolean": |
|
1538 |
setattr(self, parts[0], value) |
|
1017
2925d6e49893
Fixed bug when setting empty value to optional non-string parameters
Laurent Bessard
parents:
814
diff
changeset
|
1539 |
elif attributes[parts[0]]["minOccurs"] == 0 and value == "": |
2925d6e49893
Fixed bug when setting empty value to optional non-string parameters
Laurent Bessard
parents:
814
diff
changeset
|
1540 |
setattr(self, parts[0], None) |
814 | 1541 |
else: |
1542 |
setattr(self, parts[0], elements[parts[0]]["elmt_type"]["extract"](value, False)) |
|
1543 |
else: |
|
1544 |
instance = getattr(self, parts[0], None) |
|
1545 |
if instance is None and elements[parts[0]]["minOccurs"] == 0: |
|
1546 |
instance = elements[parts[0]]["elmt_type"]["initial"]() |
|
1547 |
setattr(self, parts[0], instance) |
|
1743
c3c3d1318130
clean-up: fix PEP8 E711 comparison to None should be 'if cond is not None:'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1739
diff
changeset
|
1548 |
if instance is not None: |
814 | 1549 |
if len(parts) > 1: |
1550 |
instance.setElementValue(parts[1], value) |
|
1551 |
else: |
|
1552 |
instance.setElementValue(None, value) |
|
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1553 |
elif "content" in elements: |
814 | 1554 |
if len(parts) > 0: |
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1555 |
self.content.setElementValue(path, value) |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1556 |
elif "base" in classinfos: |
814 | 1557 |
classinfos["base"].setElementValue(self, path, value) |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1558 |
elif "content" in elements: |
814 | 1559 |
if value == "": |
1560 |
if elements["content"]["minOccurs"] == 0: |
|
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1561 |
self.setcontent([]) |
814 | 1562 |
else: |
1563 |
raise ValueError("\"content\" element is required!") |
|
1564 |
else: |
|
1565 |
self.setcontentbytype(value) |
|
1566 |
return setElementValue |
|
1567 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1568 |
|
814 | 1569 |
def generateInitMethod(factory, classinfos): |
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1570 |
""" |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1571 |
Methods that generates the different methods for setting and getting the attributes |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1572 |
""" |
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1573 |
|
814 | 1574 |
def initMethod(self): |
1763
bcc07ff2362c
clean-up: fix PEP8 W601 .has_key() is deprecated, use 'in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1759
diff
changeset
|
1575 |
if "base" in classinfos: |
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1576 |
classinfos["base"]._init_(self) |
814 | 1577 |
for attribute in classinfos["attributes"]: |
1578 |
attribute["attr_type"] = FindTypeInfos(factory, attribute["attr_type"]) |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1579 |
if attribute["use"] == "required": |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1580 |
self.set(attribute["name"], attribute["attr_type"]["generate"](attribute["attr_type"]["initial"]())) |
814 | 1581 |
for element in classinfos["elements"]: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1582 |
if element["type"] != CHOICE: |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1583 |
initial = GetElementInitialValue(factory, element) |
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1584 |
if initial is not None: |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1585 |
map(self.append, initial) |
814 | 1586 |
return initMethod |
1587 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1588 |
|
814 | 1589 |
def generateSetMethod(attr): |
1590 |
def setMethod(self, value): |
|
1591 |
setattr(self, attr, value) |
|
1592 |
return setMethod |
|
1593 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1594 |
|
814 | 1595 |
def generateGetMethod(attr): |
1596 |
def getMethod(self): |
|
1597 |
return getattr(self, attr, None) |
|
1598 |
return getMethod |
|
1599 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1600 |
|
814 | 1601 |
def generateAddMethod(attr, factory, infos): |
1602 |
def addMethod(self): |
|
1603 |
if infos["type"] == ATTRIBUTE: |
|
1604 |
infos["attr_type"] = FindTypeInfos(factory, infos["attr_type"]) |
|
1775
b45f2768fab1
clean-up: fix PEP8 E713 test for membership should be 'not in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1774
diff
changeset
|
1605 |
if "default" not in infos: |
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1606 |
setattr(self, attr, infos["attr_type"]["initial"]()) |
814 | 1607 |
elif infos["type"] == ELEMENT: |
1608 |
infos["elmt_type"] = FindTypeInfos(factory, infos["elmt_type"]) |
|
1293
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1609 |
value = infos["elmt_type"]["initial"]() |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1610 |
DefaultElementClass.__setattr__(value, "tag", factory.etreeNamespaceFormat % attr) |
40117d02601b
Fixed diagram editing in xmlclass refactoring
Laurent Bessard
parents:
1291
diff
changeset
|
1611 |
setattr(self, attr, value) |
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1612 |
value._init_() |
814 | 1613 |
else: |
1614 |
raise ValueError("Invalid class attribute!") |
|
1615 |
return addMethod |
|
1616 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1617 |
|
814 | 1618 |
def generateDeleteMethod(attr): |
1619 |
def deleteMethod(self): |
|
1620 |
setattr(self, attr, None) |
|
1621 |
return deleteMethod |
|
1622 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1623 |
|
814 | 1624 |
def generateAppendMethod(attr, maxOccurs, factory, infos): |
1625 |
def appendMethod(self, value): |
|
1626 |
infos["elmt_type"] = FindTypeInfos(factory, infos["elmt_type"]) |
|
1627 |
attr_list = getattr(self, attr) |
|
1628 |
if maxOccurs == "unbounded" or len(attr_list) < maxOccurs: |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1629 |
if len(attr_list) == 0: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1630 |
setattr(self, attr, [value]) |
814 | 1631 |
else: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1632 |
attr_list[-1].addnext(value) |
814 | 1633 |
else: |
1634 |
raise ValueError("There can't be more than %d values in \"%s\"!" % (maxOccurs, attr)) |
|
1635 |
return appendMethod |
|
1636 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1637 |
|
814 | 1638 |
def generateInsertMethod(attr, maxOccurs, factory, infos): |
1639 |
def insertMethod(self, index, value): |
|
1640 |
infos["elmt_type"] = FindTypeInfos(factory, infos["elmt_type"]) |
|
1641 |
attr_list = getattr(self, attr) |
|
1642 |
if maxOccurs == "unbounded" or len(attr_list) < maxOccurs: |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1643 |
if len(attr_list) == 0: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1644 |
setattr(self, attr, [value]) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1645 |
elif index == 0: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1646 |
attr_list[0].addprevious(value) |
814 | 1647 |
else: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1648 |
attr_list[min(index - 1, len(attr_list) - 1)].addnext(value) |
814 | 1649 |
else: |
1650 |
raise ValueError("There can't be more than %d values in \"%s\"!" % (maxOccurs, attr)) |
|
1651 |
return insertMethod |
|
1652 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1653 |
|
814 | 1654 |
def generateGetChoicesMethod(choice_types): |
1655 |
def getChoicesMethod(self): |
|
1656 |
return [choice["name"] for choice in choice_types] |
|
1657 |
return getChoicesMethod |
|
1658 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1659 |
|
814 | 1660 |
def generateSetChoiceByTypeMethod(factory, choice_types): |
1661 |
choices = dict([(choice["name"], choice) for choice in choice_types]) |
|
1750
acf02488f37f
clean-up: fix PEP8 E306 expected 1 blank line before a nested definition, found X
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1749
diff
changeset
|
1662 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1663 |
def setChoiceMethod(self, content_type): |
1775
b45f2768fab1
clean-up: fix PEP8 E713 test for membership should be 'not in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1774
diff
changeset
|
1664 |
if content_type not in choices: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1665 |
raise ValueError("Unknown \"%s\" choice type for \"content\"!" % content_type) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1666 |
choices[content_type]["elmt_type"] = FindTypeInfos(factory, choices[content_type]["elmt_type"]) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1667 |
new_content = choices[content_type]["elmt_type"]["initial"]() |
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1668 |
DefaultElementClass.__setattr__(new_content, "tag", factory.etreeNamespaceFormat % content_type) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1669 |
self.content = new_content |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1670 |
return new_content |
814 | 1671 |
return setChoiceMethod |
1672 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1673 |
|
814 | 1674 |
def generateAppendChoiceByTypeMethod(maxOccurs, factory, choice_types): |
1675 |
choices = dict([(choice["name"], choice) for choice in choice_types]) |
|
1750
acf02488f37f
clean-up: fix PEP8 E306 expected 1 blank line before a nested definition, found X
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1749
diff
changeset
|
1676 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1677 |
def appendChoiceMethod(self, content_type): |
1775
b45f2768fab1
clean-up: fix PEP8 E713 test for membership should be 'not in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1774
diff
changeset
|
1678 |
if content_type not in choices: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1679 |
raise ValueError("Unknown \"%s\" choice type for \"content\"!" % content_type) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1680 |
choices[content_type]["elmt_type"] = FindTypeInfos(factory, choices[content_type]["elmt_type"]) |
814 | 1681 |
if maxOccurs == "unbounded" or len(self.content) < maxOccurs: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1682 |
new_element = choices[content_type]["elmt_type"]["initial"]() |
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1683 |
DefaultElementClass.__setattr__(new_element, "tag", factory.etreeNamespaceFormat % content_type) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1684 |
self.appendcontent(new_element) |
814 | 1685 |
return new_element |
1686 |
else: |
|
1687 |
raise ValueError("There can't be more than %d values in \"content\"!" % maxOccurs) |
|
1688 |
return appendChoiceMethod |
|
1689 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1690 |
|
814 | 1691 |
def generateInsertChoiceByTypeMethod(maxOccurs, factory, choice_types): |
1692 |
choices = dict([(choice["name"], choice) for choice in choice_types]) |
|
1750
acf02488f37f
clean-up: fix PEP8 E306 expected 1 blank line before a nested definition, found X
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1749
diff
changeset
|
1693 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1694 |
def insertChoiceMethod(self, index, content_type): |
1775
b45f2768fab1
clean-up: fix PEP8 E713 test for membership should be 'not in'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1774
diff
changeset
|
1695 |
if content_type not in choices: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1696 |
raise ValueError("Unknown \"%s\" choice type for \"content\"!" % content_type) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1697 |
choices[type]["elmt_type"] = FindTypeInfos(factory, choices[content_type]["elmt_type"]) |
814 | 1698 |
if maxOccurs == "unbounded" or len(self.content) < maxOccurs: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1699 |
new_element = choices[content_type]["elmt_type"]["initial"]() |
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1700 |
DefaultElementClass.__setattr__(new_element, "tag", factory.etreeNamespaceFormat % content_type) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1701 |
self.insertcontent(index, new_element) |
814 | 1702 |
return new_element |
1703 |
else: |
|
1704 |
raise ValueError("There can't be more than %d values in \"content\"!" % maxOccurs) |
|
1705 |
return insertChoiceMethod |
|
1706 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1707 |
|
814 | 1708 |
def generateRemoveMethod(attr, minOccurs): |
1709 |
def removeMethod(self, index): |
|
1710 |
attr_list = getattr(self, attr) |
|
1711 |
if len(attr_list) > minOccurs: |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1712 |
self.remove(attr_list[index]) |
814 | 1713 |
else: |
1714 |
raise ValueError("There can't be less than %d values in \"%s\"!" % (minOccurs, attr)) |
|
1715 |
return removeMethod |
|
1716 |
||
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1717 |
|
814 | 1718 |
def generateCountMethod(attr): |
1719 |
def countMethod(self): |
|
1720 |
return len(getattr(self, attr)) |
|
1721 |
return countMethod |
|
1722 |
||
1749
d73b64672238
clean-up: fix PEP8 E305 expected 2 blank lines after class or function definition
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1744
diff
changeset
|
1723 |
|
1300
8e1ee07bdff8
Removed namespaces declaration in subtree elements xml description when copy/paste
Laurent Bessard
parents:
1294
diff
changeset
|
1724 |
NAMESPACE_PATTERN = re.compile("xmlns(?:\:[^\=]*)?=\"[^\"]*\" ") |
8e1ee07bdff8
Removed namespaces declaration in subtree elements xml description when copy/paste
Laurent Bessard
parents:
1294
diff
changeset
|
1725 |
|
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1726 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1727 |
class DefaultElementClass(etree.ElementBase): |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1728 |
|
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1729 |
StructurePattern = re.compile("$") |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1730 |
|
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1731 |
def _init_(self): |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1732 |
pass |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1733 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1734 |
def getLocalTag(self): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1735 |
return etree.QName(self.tag).localname |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1736 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1737 |
def tostring(self): |
1505
5ecb16be9a3c
fix copying elements with non-latin content like comment element, or
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1405
diff
changeset
|
1738 |
return NAMESPACE_PATTERN.sub("", etree.tostring(self, pretty_print=True, encoding='utf-8')).decode('utf-8') |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1739 |
|
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1740 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1741 |
class XMLElementClassLookUp(etree.PythonElementClassLookup): |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1742 |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1743 |
def __init__(self, classes, *args, **kwargs): |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1744 |
etree.PythonElementClassLookup.__init__(self, *args, **kwargs) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1745 |
self.LookUpClasses = classes |
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1746 |
self.ElementTag = None |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1747 |
self.ElementClass = None |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1748 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1749 |
def GetElementClass(self, element_tag, parent_tag=None, default=DefaultElementClass): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1750 |
element_class = self.LookUpClasses.get(element_tag, (default, None)) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1751 |
if not isinstance(element_class, DictType): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1752 |
if isinstance(element_class[0], (StringType, UnicodeType)): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1753 |
return self.GetElementClass(element_class[0], default=default) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1754 |
return element_class[0] |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1755 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1756 |
element_with_parent_class = element_class.get(parent_tag, default) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1757 |
if isinstance(element_with_parent_class, (StringType, UnicodeType)): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1758 |
return self.GetElementClass(element_with_parent_class, default=default) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1759 |
return element_with_parent_class |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1760 |
|
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1761 |
def SetLookupResult(self, element, element_class): |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1762 |
""" |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1763 |
Set lookup result for the next 'lookup' callback made by lxml backend. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1764 |
Lookup result is used only if element matches with tag's name submited to 'lookup'. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1765 |
This is done, because there is no way to submit extra search parameters for |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1766 |
etree.PythonElementClassLookup.lookup() from etree.XMLParser.makeelement() |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1767 |
It's valid only for a signle 'lookup' call. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1768 |
|
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1769 |
:param element: |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1770 |
element's tag name |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1771 |
:param element_class: |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1772 |
element class that should be returned on |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1773 |
match in the next 'lookup' call. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1774 |
:return: |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1775 |
Nothing |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1776 |
""" |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1777 |
self.ElementTag = element |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1778 |
self.ElementClass = element_class |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1779 |
|
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1780 |
def ResetLookupResult(self): |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1781 |
"""Reset lookup result, so it don't influence next lookups""" |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1782 |
self.ElementTag = None |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1783 |
self.ElementClass = None |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1784 |
|
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1785 |
def GetLookupResult(self, element): |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1786 |
"""Returns previously set SetLookupResult() lookup result""" |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1787 |
element_class = None |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1788 |
if self.ElementTag is not None and self.ElementTag == element.tag: |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1789 |
element_class = self.ElementClass |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1790 |
self.ResetLookupResult() |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1791 |
return element_class |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1792 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1793 |
def lookup(self, document, element): |
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1794 |
""" |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1795 |
Lookup for element class for given element tag. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1796 |
If return None from this method, the fallback is called. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1797 |
|
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1798 |
:param document: |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1799 |
opaque document instance that contains the Element |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1800 |
:param element: |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1801 |
lightweight Element proxy implementation that is only valid during the lookup. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1802 |
Do not try to keep a reference to it. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1803 |
Once the lookup is done, the proxy will be invalid. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1804 |
:return: |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1805 |
Returns element class corresponding to given element. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1806 |
""" |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1807 |
element_class = self.GetLookupResult(element) |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1808 |
if element_class is not None: |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1809 |
return element_class |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1810 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1811 |
parent = element.getparent() |
1768
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1812 |
element_class = self.GetElementClass( |
691083b5682a
clean-up: fix PEP8 E128 continuation line under-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1767
diff
changeset
|
1813 |
element.tag, parent.tag if parent is not None else None) |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1814 |
if isinstance(element_class, ListType): |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1815 |
children = "".join([ |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1816 |
"%s " % etree.QName(child.tag).localname |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1817 |
for child in element]) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1818 |
for possible_class in element_class: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1819 |
if isinstance(possible_class, (StringType, UnicodeType)): |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1820 |
possible_class = self.GetElementClass(possible_class) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1821 |
if possible_class.StructurePattern.match(children) is not None: |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1822 |
return possible_class |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1823 |
return element_class[0] |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1824 |
return element_class |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1825 |
|
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1826 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1827 |
class XMLClassParser(etree.XMLParser): |
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1828 |
def __init__(self, *args, **kwargs): |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1829 |
etree.XMLParser.__init__(self, *args, **kwargs) |
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1830 |
|
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1831 |
def initMembers(self, namespaces, default_namespace_format, base_class, xsd_schema): |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1832 |
self.DefaultNamespaceFormat = default_namespace_format |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1833 |
self.NSMAP = namespaces |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1834 |
targetNamespace = etree.QName(default_namespace_format % "d").namespace |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1835 |
if targetNamespace is not None: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1836 |
self.RootNSMAP = { |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1837 |
name if targetNamespace != uri else None: uri |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1838 |
for name, uri in namespaces.iteritems()} |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1839 |
else: |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1840 |
self.RootNSMAP = namespaces |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1841 |
self.BaseClass = base_class |
1330
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
1842 |
self.XSDSchema = xsd_schema |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1843 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1844 |
def set_element_class_lookup(self, class_lookup): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1845 |
etree.XMLParser.set_element_class_lookup(self, class_lookup) |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1846 |
self.ClassLookup = class_lookup |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1847 |
|
1330
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
1848 |
def LoadXMLString(self, xml_string): |
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
1849 |
tree = etree.fromstring(xml_string, self) |
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
1850 |
if not self.XSDSchema.validate(tree): |
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
1851 |
error = self.XSDSchema.error_log.last_error |
96b242e4c59d
Added support for loading XML file even if not following XSD schema (but still following XML syntax), warning user of errors in XML file
Laurent Bessard
parents:
1322
diff
changeset
|
1852 |
return tree, (error.line, error.message) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1853 |
return tree, None |
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1854 |
|
1304 | 1855 |
def Dumps(self, xml_obj): |
1563
584b6fdb949e
fix breaking non-latin description and comments in FBD, LD, SFC and
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1505
diff
changeset
|
1856 |
return etree.tostring(xml_obj, encoding='utf-8') |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1857 |
|
1304 | 1858 |
def Loads(self, xml_string): |
1859 |
return etree.fromstring(xml_string, self) |
|
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1860 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1861 |
def CreateRoot(self): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1862 |
if self.BaseClass is not None: |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1863 |
root = self.makeelement( |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1864 |
self.DefaultNamespaceFormat % self.BaseClass[0], |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1865 |
nsmap=self.RootNSMAP) |
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1866 |
root._init_() |
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1867 |
return root |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1868 |
return None |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1869 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1870 |
def GetElementClass(self, element_tag, parent_tag=None): |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1871 |
return self.ClassLookup.GetElementClass( |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1872 |
self.DefaultNamespaceFormat % element_tag, |
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1873 |
self.DefaultNamespaceFormat % parent_tag |
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1874 |
if parent_tag is not None else parent_tag, |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1875 |
None) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1876 |
|
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1877 |
def CreateElement(self, element_tag, parent_tag=None, class_idx=None): |
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1878 |
""" |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1879 |
Create XML element based on elements and parent's tag names. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1880 |
|
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1881 |
:param element_tag: |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1882 |
element's tag name |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1883 |
:param parent_tag: |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1884 |
optional parent's tag name. Default value is None. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1885 |
:param class_idx: |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1886 |
optional index of class in list of founded classes |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1887 |
with same element and parent. Default value is None. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1888 |
:return: |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1889 |
created XML element |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1890 |
(subclass of lxml.etree._Element created by class factory) |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1891 |
""" |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1892 |
element_class = self.GetElementClass(element_tag, parent_tag) |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1893 |
if isinstance(element_class, ListType): |
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1894 |
if class_idx is not None and class_idx < len(element_class): |
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1895 |
element_class = element_class[class_idx] |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1896 |
else: |
1765
ccf59c1f0b45
clean-up: fix PEP8 W602 deprecated form of raising exception
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1764
diff
changeset
|
1897 |
raise ValueError("No corresponding class found!") |
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1898 |
return self.CreateElementFromClass(element_class, element_tag) |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1899 |
|
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1900 |
def CreateElementFromClass(self, element_class, element_tag=None): |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1901 |
""" |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1902 |
Create XML element instance of submitted element's class. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1903 |
Submitted class should be subclass of lxml.etree._Element. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1904 |
|
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1905 |
element_class shouldn't be used to create XML element |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1906 |
directly using element_class(), because lxml backend |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1907 |
should be aware what class handles what xml element, |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1908 |
otherwise default lxml.etree._Element will be used. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1909 |
|
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1910 |
:param element_class: |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1911 |
element class |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1912 |
:param element_tag: |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1913 |
optional element's tag name. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1914 |
If omitted it's calculated from element_class instance. |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1915 |
:return: |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1916 |
created XML element |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1917 |
(subclass of lxml.etree._Element created by class factory) |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1918 |
""" |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1919 |
if element_tag is None: |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1920 |
element_tag = element_class().tag |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1921 |
etag = self.DefaultNamespaceFormat % element_tag |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1922 |
self.ClassLookup.SetLookupResult(etag, element_class) |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1923 |
new_element = self.makeelement(etag) |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1924 |
self.ClassLookup.ResetLookupResult() |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1925 |
DefaultElementClass.__setattr__(new_element, "tag", self.DefaultNamespaceFormat % element_tag) |
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1926 |
new_element._init_() |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1927 |
return new_element |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1928 |
|
1736
7e61baa047f0
clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1734
diff
changeset
|
1929 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1930 |
def GenerateParser(factory, xsdstring): |
1837
c507c363625e
fix pylint warning '(pointless-string-statement) String statement has no effect'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1832
diff
changeset
|
1931 |
""" |
c507c363625e
fix pylint warning '(pointless-string-statement) String statement has no effect'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1832
diff
changeset
|
1932 |
This function generate a xml parser from a class factory |
c507c363625e
fix pylint warning '(pointless-string-statement) String statement has no effect'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1832
diff
changeset
|
1933 |
""" |
c507c363625e
fix pylint warning '(pointless-string-statement) String statement has no effect'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1832
diff
changeset
|
1934 |
|
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1935 |
parser = XMLClassParser(strip_cdata=False, remove_blank_text=True) |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1936 |
factory.Parser = parser |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1937 |
|
814 | 1938 |
ComputedClasses = factory.CreateClasses() |
1322
0a9227f743b3
Fixed xmlclass for working with included files, adding support for SimpleType elements and solving ambiguity in extension class when different elements share the same name and parent name
Laurent Bessard
parents:
1315
diff
changeset
|
1939 |
if factory.FileName is not None: |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1940 |
ComputedClasses = ComputedClasses[factory.FileName] |
1315
ff14a66bbd12
Fixed Beremiz for working with new xmlclass support using lxml
Laurent Bessard
parents:
1305
diff
changeset
|
1941 |
BaseClass = [(name, XSDclass) for name, XSDclass in ComputedClasses.items() if XSDclass.IsBaseClass] |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1942 |
|
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1943 |
parser.initMembers( |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1944 |
factory.NSMAP, |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1945 |
factory.etreeNamespaceFormat, |
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1946 |
BaseClass[0] if len(BaseClass) == 1 else None, |
2297
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1947 |
etree.XMLSchema(etree.fromstring(xsdstring))) |
96ca6b056c55
Proper fix for error 'object has no attribute 'getSlave' in EtherCAT extension
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
2278
diff
changeset
|
1948 |
|
1291
42ea51d083ce
Second stage of xmlclass refactoring using lxml , project are loaded and displayed successfully
Laurent Bessard
parents:
1290
diff
changeset
|
1949 |
class_lookup = XMLElementClassLookUp(factory.ComputedClassesLookUp) |
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1950 |
parser.set_element_class_lookup(class_lookup) |
1730
64d8f52bc8c8
clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
1571
diff
changeset
|
1951 |
|
1290
13ee5f4ab612
First stage of xmlclass refactoring using lxml
Laurent Bessard
parents:
1179
diff
changeset
|
1952 |
return parser |