Skip to content

Commit 43c9146

Browse files
committed
add test for online structure generator from xml
1 parent 2b78b12 commit 43c9146

4 files changed

Lines changed: 325 additions & 27 deletions

File tree

opcua/common/structures_generator.py

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,20 @@
44
for custom structures
55
"""
66

7-
import sys
87
from lxml import etree
98
from lxml import objectify
109

1110
from IPython import embed
1211

1312

14-
from opcua.ua.ua_binary import Primitives1, Primitives
15-
#from opcua.common.ua_utils import get_default_value
13+
from opcua.ua.ua_binary import Primitives
1614

1715

1816
def get_default_value(uatype):
1917
if uatype in ("String"):
20-
return None
18+
return "None"
19+
elif uatype == "Guid":
20+
return "uuid.uuid4()"
2121
elif uatype in ("ByteString", "CharArray", "Char"):
2222
return None
2323
elif uatype in ("Boolean"):
@@ -26,8 +26,6 @@ def get_default_value(uatype):
2626
return "datetime.utcnow()"
2727
elif uatype in ("Int8", "Int16", "Int32", "Int64", "UInt8", "UInt16", "UInt32", "UInt64", "Double", "Float", "Byte", "SByte"):
2828
return 0
29-
elif uatype in ("ExtensionObject"):
30-
return "None"
3129
else:
3230
return "ua." + uatype + "()"
3331

@@ -51,13 +49,22 @@ class {0}(object):
5149
'''
5250
{0} autogenerated from xml
5351
'''
54-
def __init__(self):
52+
def __init__(self, data=None):
53+
if data is not None:
54+
self._binary_init(data)
55+
return
5556
""".format(self.name)
5657
for field in self.fields:
5758
self.code += " self.{} = {}\n".format(field.name, field.value)
5859

5960
def _make_from_binary(self):
60-
self.code += '\n def from_binary(self, data):\n'
61+
self.code += '''
62+
@staticmethod
63+
def from_binary(data):
64+
return {}(data=data)
65+
66+
def _binary_init(self, data):
67+
'''.format(self.name)
6168
for field in self.fields:
6269
if hasattr(Primitives, field.uatype):
6370
if field.array:
@@ -96,13 +103,10 @@ def to_binary(self):
96103
packet.append(element.to_binary())
97104
'''.format(field.name, field.uatype)
98105
else:
99-
self.code += " packet.append(ua.{}.to_binary())\n".format(field.name)
106+
self.code += " packet.append(self.{}.to_binary())\n".format(field.name)
100107
self.code += ' return b"".join(packet)'
101108

102109

103-
104-
105-
106110
class Field(object):
107111
def __init__(self, name):
108112
self.name = name
@@ -111,7 +115,7 @@ def __init__(self, name):
111115
self.array = False
112116

113117

114-
class CodeGenerator(object):
118+
class StructGenerator(object):
115119
def __init__(self, path, output):
116120
self.path = path
117121
self.output = output
@@ -157,13 +161,23 @@ def run(self):
157161
self._file.write(struct.get_code())
158162
self._file.close()
159163

164+
def get_structures(self):
165+
self._make_model()
166+
ld = {}
167+
for struct in self.model:
168+
exec(struct.get_code(), ld)
169+
return ld
170+
171+
172+
160173
def _make_header(self):
161174
self._file.write("""
162175
'''
163176
THIS FILE IS AUTOGENERATED, DO NOT EDIT!!!
164177
'''
165178
166179
from datetime import datetime
180+
import uuid
167181
168182
from opcua import ua
169183
@@ -174,17 +188,14 @@ def _make_header(self):
174188

175189

176190
if __name__ == "__main__":
191+
import sys
192+
sys.path.insert(0, ".") # necessary for import in current dir
177193

178194
xmlpath = "/home/olivier/python-opcua/schemas/example.bsd"
179-
#p = gm.Parser(xmlpath)
180-
#model = p.parse()
181-
#gm.add_basetype_members(model)
182-
#gm.add_encoding_field(model)
183-
#gm.remove_duplicates(model)
184-
#gm.remove_vector_length(model)
185-
#gm.split_requests(model)
186-
#gm.fix_names(model)
187-
c = CodeGenerator(xmlpath, "structures.py")
188-
#c.generate()
195+
c = StructGenerator(xmlpath, "structures.py")
189196
c.run()
190-
#embed()
197+
import structures as s
198+
199+
200+
#sts = c.get_structures()
201+
embed()

opcua/ua/uatypes.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -899,20 +899,20 @@ class XmlElement(FrozenClass):
899899
An XML element encoded as an UTF-8 string.
900900
"""
901901

902-
def __init__(self, binary=None):
902+
def __init__(self, value=None, binary=None):
903903
if binary is not None:
904904
self._binary_init(binary)
905905
self._freeze = True
906906
return
907-
self.Value = []
907+
self.Value = value
908908
self._freeze = True
909909

910910
def to_binary(self):
911911
return uabin.Primitives.String.pack(self.Value)
912912

913913
@staticmethod
914914
def from_binary(data):
915-
return XmlElement(data)
915+
return XmlElement(binary=data)
916916

917917
def _binary_init(self, data):
918918
self.Value = uabin.Primitives.String.unpack(data)

tests/example.bsd

Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
<opc:TypeDictionary
2+
xmlns:opc="http://opcfoundation.org/BinarySchema/"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xmlns:ua="http://opcfoundation.org/UA/"
5+
xmlns:tns="http://test.org/UA/Data/"
6+
DefaultByteOrder="LittleEndian"
7+
TargetNamespace="http://test.org/UA/Data/"
8+
>
9+
<!-- This File was generated on 2013-01-22 and supports the specifications supported by version 1.1.334.0 of the OPC UA deliverables. -->
10+
<opc:Import Namespace="http://opcfoundation.org/UA/" Location="Opc.Ua.BinarySchema.bsd"/>
11+
12+
<opc:StructuredType Name="ScalarValueDataType" BaseType="ua:ExtensionObject">
13+
<opc:Field Name="BooleanValue" TypeName="opc:Boolean" />
14+
<opc:Field Name="SByteValue" TypeName="opc:SByte" />
15+
<opc:Field Name="ByteValue" TypeName="opc:Byte" />
16+
<opc:Field Name="Int16Value" TypeName="opc:Int16" />
17+
<opc:Field Name="UInt16Value" TypeName="opc:UInt16" />
18+
<opc:Field Name="Int32Value" TypeName="opc:Int32" />
19+
<opc:Field Name="UInt32Value" TypeName="opc:UInt32" />
20+
<opc:Field Name="Int64Value" TypeName="opc:Int64" />
21+
<opc:Field Name="UInt64Value" TypeName="opc:UInt64" />
22+
<opc:Field Name="FloatValue" TypeName="opc:Float" />
23+
<opc:Field Name="DoubleValue" TypeName="opc:Double" />
24+
<opc:Field Name="StringValue" TypeName="opc:String" />
25+
<opc:Field Name="DateTimeValue" TypeName="opc:DateTime" />
26+
<opc:Field Name="GuidValue" TypeName="opc:Guid" />
27+
<opc:Field Name="ByteStringValue" TypeName="opc:ByteString" />
28+
<opc:Field Name="XmlElementValue" TypeName="ua:XmlElement" />
29+
<opc:Field Name="NodeIdValue" TypeName="ua:NodeId" />
30+
<opc:Field Name="ExpandedNodeIdValue" TypeName="ua:ExpandedNodeId" />
31+
<opc:Field Name="QualifiedNameValue" TypeName="ua:QualifiedName" />
32+
<opc:Field Name="LocalizedTextValue" TypeName="ua:LocalizedText" />
33+
<opc:Field Name="StatusCodeValue" TypeName="ua:StatusCode" />
34+
<opc:Field Name="VariantValue" TypeName="ua:Variant" />
35+
<opc:Field Name="EnumerationValue" TypeName="ua:Int32" />
36+
<opc:Field Name="StructureValue" TypeName="ua:ExtensionObject" />
37+
<opc:Field Name="Number" TypeName="ua:Variant" />
38+
<opc:Field Name="Integer" TypeName="ua:Variant" />
39+
<opc:Field Name="UInteger" TypeName="ua:Variant" />
40+
</opc:StructuredType>
41+
42+
<opc:StructuredType Name="ArrayValueDataType" BaseType="ua:ExtensionObject">
43+
<opc:Field Name="NoOfBooleanValue" TypeName="opc:Int32" />
44+
<opc:Field Name="BooleanValue" TypeName="opc:Boolean" LengthField="NoOfBooleanValue" />
45+
<opc:Field Name="NoOfSByteValue" TypeName="opc:Int32" />
46+
<opc:Field Name="SByteValue" TypeName="opc:SByte" LengthField="NoOfSByteValue" />
47+
<opc:Field Name="NoOfByteValue" TypeName="opc:Int32" />
48+
<opc:Field Name="ByteValue" TypeName="opc:Byte" LengthField="NoOfByteValue" />
49+
<opc:Field Name="NoOfInt16Value" TypeName="opc:Int32" />
50+
<opc:Field Name="Int16Value" TypeName="opc:Int16" LengthField="NoOfInt16Value" />
51+
<opc:Field Name="NoOfUInt16Value" TypeName="opc:Int32" />
52+
<opc:Field Name="UInt16Value" TypeName="opc:UInt16" LengthField="NoOfUInt16Value" />
53+
<opc:Field Name="NoOfInt32Value" TypeName="opc:Int32" />
54+
<opc:Field Name="Int32Value" TypeName="opc:Int32" LengthField="NoOfInt32Value" />
55+
<opc:Field Name="NoOfUInt32Value" TypeName="opc:Int32" />
56+
<opc:Field Name="UInt32Value" TypeName="opc:UInt32" LengthField="NoOfUInt32Value" />
57+
<opc:Field Name="NoOfInt64Value" TypeName="opc:Int32" />
58+
<opc:Field Name="Int64Value" TypeName="opc:Int64" LengthField="NoOfInt64Value" />
59+
<opc:Field Name="NoOfUInt64Value" TypeName="opc:Int32" />
60+
<opc:Field Name="UInt64Value" TypeName="opc:UInt64" LengthField="NoOfUInt64Value" />
61+
<opc:Field Name="NoOfFloatValue" TypeName="opc:Int32" />
62+
<opc:Field Name="FloatValue" TypeName="opc:Float" LengthField="NoOfFloatValue" />
63+
<opc:Field Name="NoOfDoubleValue" TypeName="opc:Int32" />
64+
<opc:Field Name="DoubleValue" TypeName="opc:Double" LengthField="NoOfDoubleValue" />
65+
<opc:Field Name="NoOfStringValue" TypeName="opc:Int32" />
66+
<opc:Field Name="StringValue" TypeName="opc:String" LengthField="NoOfStringValue" />
67+
<opc:Field Name="NoOfDateTimeValue" TypeName="opc:Int32" />
68+
<opc:Field Name="DateTimeValue" TypeName="opc:DateTime" LengthField="NoOfDateTimeValue" />
69+
<opc:Field Name="NoOfGuidValue" TypeName="opc:Int32" />
70+
<opc:Field Name="GuidValue" TypeName="opc:Guid" LengthField="NoOfGuidValue" />
71+
<opc:Field Name="NoOfByteStringValue" TypeName="opc:Int32" />
72+
<opc:Field Name="ByteStringValue" TypeName="opc:ByteString" LengthField="NoOfByteStringValue" />
73+
<opc:Field Name="NoOfXmlElementValue" TypeName="opc:Int32" />
74+
<opc:Field Name="XmlElementValue" TypeName="ua:XmlElement" LengthField="NoOfXmlElementValue" />
75+
<opc:Field Name="NoOfNodeIdValue" TypeName="opc:Int32" />
76+
<opc:Field Name="NodeIdValue" TypeName="ua:NodeId" LengthField="NoOfNodeIdValue" />
77+
<opc:Field Name="NoOfExpandedNodeIdValue" TypeName="opc:Int32" />
78+
<opc:Field Name="ExpandedNodeIdValue" TypeName="ua:ExpandedNodeId" LengthField="NoOfExpandedNodeIdValue" />
79+
<opc:Field Name="NoOfQualifiedNameValue" TypeName="opc:Int32" />
80+
<opc:Field Name="QualifiedNameValue" TypeName="ua:QualifiedName" LengthField="NoOfQualifiedNameValue" />
81+
<opc:Field Name="NoOfLocalizedTextValue" TypeName="opc:Int32" />
82+
<opc:Field Name="LocalizedTextValue" TypeName="ua:LocalizedText" LengthField="NoOfLocalizedTextValue" />
83+
<opc:Field Name="NoOfStatusCodeValue" TypeName="opc:Int32" />
84+
<opc:Field Name="StatusCodeValue" TypeName="ua:StatusCode" LengthField="NoOfStatusCodeValue" />
85+
<opc:Field Name="NoOfVariantValue" TypeName="opc:Int32" />
86+
<opc:Field Name="VariantValue" TypeName="ua:Variant" LengthField="NoOfVariantValue" />
87+
<opc:Field Name="NoOfEnumerationValue" TypeName="opc:Int32" />
88+
<opc:Field Name="EnumerationValue" TypeName="ua:Int32" LengthField="NoOfEnumerationValue" />
89+
<opc:Field Name="NoOfStructureValue" TypeName="opc:Int32" />
90+
<opc:Field Name="StructureValue" TypeName="ua:ExtensionObject" LengthField="NoOfStructureValue" />
91+
<opc:Field Name="NoOfNumber" TypeName="opc:Int32" />
92+
<opc:Field Name="Number" TypeName="ua:Variant" LengthField="NoOfNumber" />
93+
<opc:Field Name="NoOfInteger" TypeName="opc:Int32" />
94+
<opc:Field Name="Integer" TypeName="ua:Variant" LengthField="NoOfInteger" />
95+
<opc:Field Name="NoOfUInteger" TypeName="opc:Int32" />
96+
<opc:Field Name="UInteger" TypeName="ua:Variant" LengthField="NoOfUInteger" />
97+
</opc:StructuredType>
98+
99+
<opc:OpaqueType Name="BooleanDataType">
100+
</opc:OpaqueType>
101+
102+
<opc:OpaqueType Name="SByteDataType">
103+
</opc:OpaqueType>
104+
105+
<opc:OpaqueType Name="ByteDataType">
106+
</opc:OpaqueType>
107+
108+
<opc:OpaqueType Name="Int16DataType">
109+
</opc:OpaqueType>
110+
111+
<opc:OpaqueType Name="UInt16DataType">
112+
</opc:OpaqueType>
113+
114+
<opc:OpaqueType Name="Int32DataType">
115+
</opc:OpaqueType>
116+
117+
<opc:OpaqueType Name="UInt32DataType">
118+
</opc:OpaqueType>
119+
120+
<opc:OpaqueType Name="Int64DataType">
121+
</opc:OpaqueType>
122+
123+
<opc:OpaqueType Name="UInt64DataType">
124+
</opc:OpaqueType>
125+
126+
<opc:OpaqueType Name="FloatDataType">
127+
</opc:OpaqueType>
128+
129+
<opc:OpaqueType Name="DoubleDataType">
130+
</opc:OpaqueType>
131+
132+
<opc:OpaqueType Name="StringDataType">
133+
</opc:OpaqueType>
134+
135+
<opc:OpaqueType Name="DateTimeDataType">
136+
</opc:OpaqueType>
137+
138+
<opc:OpaqueType Name="GuidDataType">
139+
</opc:OpaqueType>
140+
141+
<opc:OpaqueType Name="ByteStringDataType">
142+
</opc:OpaqueType>
143+
144+
<opc:OpaqueType Name="XmlElementDataType">
145+
</opc:OpaqueType>
146+
147+
<opc:OpaqueType Name="NodeIdDataType">
148+
</opc:OpaqueType>
149+
150+
<opc:OpaqueType Name="ExpandedNodeIdDataType">
151+
</opc:OpaqueType>
152+
153+
<opc:OpaqueType Name="QualifiedNameDataType">
154+
</opc:OpaqueType>
155+
156+
<opc:OpaqueType Name="LocalizedTextDataType">
157+
</opc:OpaqueType>
158+
159+
<opc:OpaqueType Name="StatusCodeDataType">
160+
</opc:OpaqueType>
161+
162+
<opc:OpaqueType Name="VariantDataType">
163+
</opc:OpaqueType>
164+
165+
<opc:StructuredType Name="UserScalarValueDataType" BaseType="ua:ExtensionObject">
166+
<opc:Field Name="BooleanDataType" TypeName="opc:Boolean" />
167+
<opc:Field Name="SByteDataType" TypeName="opc:SByte" />
168+
<opc:Field Name="ByteDataType" TypeName="opc:Byte" />
169+
<opc:Field Name="Int16DataType" TypeName="opc:Int16" />
170+
<opc:Field Name="UInt16DataType" TypeName="opc:UInt16" />
171+
<opc:Field Name="Int32DataType" TypeName="opc:Int32" />
172+
<opc:Field Name="UInt32DataType" TypeName="opc:UInt32" />
173+
<opc:Field Name="Int64DataType" TypeName="opc:Int64" />
174+
<opc:Field Name="UInt64DataType" TypeName="opc:UInt64" />
175+
<opc:Field Name="FloatDataType" TypeName="opc:Float" />
176+
<opc:Field Name="DoubleDataType" TypeName="opc:Double" />
177+
<opc:Field Name="StringDataType" TypeName="opc:String" />
178+
<opc:Field Name="DateTimeDataType" TypeName="opc:DateTime" />
179+
<opc:Field Name="GuidDataType" TypeName="opc:Guid" />
180+
<opc:Field Name="ByteStringDataType" TypeName="opc:ByteString" />
181+
<opc:Field Name="XmlElementDataType" TypeName="ua:XmlElement" />
182+
<opc:Field Name="NodeIdDataType" TypeName="ua:NodeId" />
183+
<opc:Field Name="ExpandedNodeIdDataType" TypeName="ua:ExpandedNodeId" />
184+
<opc:Field Name="QualifiedNameDataType" TypeName="ua:QualifiedName" />
185+
<opc:Field Name="LocalizedTextDataType" TypeName="ua:LocalizedText" />
186+
<opc:Field Name="StatusCodeDataType" TypeName="ua:StatusCode" />
187+
<opc:Field Name="VariantDataType" TypeName="ua:Variant" />
188+
</opc:StructuredType>
189+
190+
<opc:StructuredType Name="UserArrayValueDataType" BaseType="ua:ExtensionObject">
191+
<opc:Field Name="NoOfBooleanDataType" TypeName="opc:Int32" />
192+
<opc:Field Name="BooleanDataType" TypeName="opc:Boolean" LengthField="NoOfBooleanDataType" />
193+
<opc:Field Name="NoOfSByteDataType" TypeName="opc:Int32" />
194+
<opc:Field Name="SByteDataType" TypeName="opc:SByte" LengthField="NoOfSByteDataType" />
195+
<opc:Field Name="NoOfByteDataType" TypeName="opc:Int32" />
196+
<opc:Field Name="ByteDataType" TypeName="opc:Byte" LengthField="NoOfByteDataType" />
197+
<opc:Field Name="NoOfInt16DataType" TypeName="opc:Int32" />
198+
<opc:Field Name="Int16DataType" TypeName="opc:Int16" LengthField="NoOfInt16DataType" />
199+
<opc:Field Name="NoOfUInt16DataType" TypeName="opc:Int32" />
200+
<opc:Field Name="UInt16DataType" TypeName="opc:UInt16" LengthField="NoOfUInt16DataType" />
201+
<opc:Field Name="NoOfInt32DataType" TypeName="opc:Int32" />
202+
<opc:Field Name="Int32DataType" TypeName="opc:Int32" LengthField="NoOfInt32DataType" />
203+
<opc:Field Name="NoOfUInt32DataType" TypeName="opc:Int32" />
204+
<opc:Field Name="UInt32DataType" TypeName="opc:UInt32" LengthField="NoOfUInt32DataType" />
205+
<opc:Field Name="NoOfInt64DataType" TypeName="opc:Int32" />
206+
<opc:Field Name="Int64DataType" TypeName="opc:Int64" LengthField="NoOfInt64DataType" />
207+
<opc:Field Name="NoOfUInt64DataType" TypeName="opc:Int32" />
208+
<opc:Field Name="UInt64DataType" TypeName="opc:UInt64" LengthField="NoOfUInt64DataType" />
209+
<opc:Field Name="NoOfFloatDataType" TypeName="opc:Int32" />
210+
<opc:Field Name="FloatDataType" TypeName="opc:Float" LengthField="NoOfFloatDataType" />
211+
<opc:Field Name="NoOfDoubleDataType" TypeName="opc:Int32" />
212+
<opc:Field Name="DoubleDataType" TypeName="opc:Double" LengthField="NoOfDoubleDataType" />
213+
<opc:Field Name="NoOfStringDataType" TypeName="opc:Int32" />
214+
<opc:Field Name="StringDataType" TypeName="opc:String" LengthField="NoOfStringDataType" />
215+
<opc:Field Name="NoOfDateTimeDataType" TypeName="opc:Int32" />
216+
<opc:Field Name="DateTimeDataType" TypeName="opc:DateTime" LengthField="NoOfDateTimeDataType" />
217+
<opc:Field Name="NoOfGuidDataType" TypeName="opc:Int32" />
218+
<opc:Field Name="GuidDataType" TypeName="opc:Guid" LengthField="NoOfGuidDataType" />
219+
<opc:Field Name="NoOfByteStringDataType" TypeName="opc:Int32" />
220+
<opc:Field Name="ByteStringDataType" TypeName="opc:ByteString" LengthField="NoOfByteStringDataType" />
221+
<opc:Field Name="NoOfXmlElementDataType" TypeName="opc:Int32" />
222+
<opc:Field Name="XmlElementDataType" TypeName="ua:XmlElement" LengthField="NoOfXmlElementDataType" />
223+
<opc:Field Name="NoOfNodeIdDataType" TypeName="opc:Int32" />
224+
<opc:Field Name="NodeIdDataType" TypeName="ua:NodeId" LengthField="NoOfNodeIdDataType" />
225+
<opc:Field Name="NoOfExpandedNodeIdDataType" TypeName="opc:Int32" />
226+
<opc:Field Name="ExpandedNodeIdDataType" TypeName="ua:ExpandedNodeId" LengthField="NoOfExpandedNodeIdDataType" />
227+
<opc:Field Name="NoOfQualifiedNameDataType" TypeName="opc:Int32" />
228+
<opc:Field Name="QualifiedNameDataType" TypeName="ua:QualifiedName" LengthField="NoOfQualifiedNameDataType" />
229+
<opc:Field Name="NoOfLocalizedTextDataType" TypeName="opc:Int32" />
230+
<opc:Field Name="LocalizedTextDataType" TypeName="ua:LocalizedText" LengthField="NoOfLocalizedTextDataType" />
231+
<opc:Field Name="NoOfStatusCodeDataType" TypeName="opc:Int32" />
232+
<opc:Field Name="StatusCodeDataType" TypeName="ua:StatusCode" LengthField="NoOfStatusCodeDataType" />
233+
<opc:Field Name="NoOfVariantDataType" TypeName="opc:Int32" />
234+
<opc:Field Name="VariantDataType" TypeName="ua:Variant" LengthField="NoOfVariantDataType" />
235+
</opc:StructuredType>
236+
237+
</opc:TypeDictionary>

0 commit comments

Comments
 (0)