Skip to content

Commit 41839f0

Browse files
driftregionNick James
andauthored
Bugfix/474 (#1081)
* work around issues in #474 * add test * use cleaned name for class retrieval Co-authored-by: Nick James <nick.james@dorabot.com>
1 parent 2487dc9 commit 41839f0

File tree

3 files changed

+11
-3
lines changed

3 files changed

+11
-3
lines changed

opcua/common/structures.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def __init__(self, name, value):
8181

8282
class Struct(object):
8383
def __init__(self, name):
84-
self.name = name
84+
self.name = _clean_name(name)
8585
self.fields = []
8686
self.typeid = None
8787

@@ -258,7 +258,6 @@ def load_type_definitions(server, nodes=None):
258258
generators = []
259259
for node in nodes:
260260
xml = node.get_value()
261-
xml = xml.decode("utf-8")
262261
generator = StructGenerator()
263262
generators.append(generator)
264263
generator.make_model_from_string(xml)
@@ -299,6 +298,8 @@ def _clean_name(name):
299298
but cannot be part of of Python class names
300299
"""
301300
name = re.sub(r'\W+', '_', name)
301+
name = re.sub(r'\.', '_', name)
302+
name = re.sub(r'"', '_', name)
302303
name = re.sub(r'^[0-9]+', r'_\g<0>', name)
303304

304305
return name

opcua/common/type_dictionary_buider.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from opcua import ua
22
from enum import Enum
33
import logging
4+
from .structures import _clean_name
45

56
import xml.etree.ElementTree as Et
67
import re
@@ -282,4 +283,4 @@ def add_field(self, field_name, data_type, is_array=False):
282283

283284
def get_ua_class(ua_class_name):
284285
#return getattr(ua, _to_camel_case(ua_class_name))
285-
return getattr(ua, ua_class_name)
286+
return getattr(ua, _clean_name(ua_class_name))

tests/tests_custom_structures.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,12 @@ def test_functional_advance(self):
374374
nested_result = nested_var.get_value()
375375
self.assertEqual(nested_result, nested_msg)
376376

377+
def test_siemens_flavored_struct_name(self):
378+
struct_name = '"Siemens"."OPC-UA"."Identifiers_LookLikeThis"'
379+
struct_node = self.dict_builder.create_data_type(struct_name)
380+
struct_node.add_field('"a"."field"', ua.VariantType.Int32)
381+
self.dict_builder.set_dict_byte_string()
382+
self.srv.load_type_definitions()
377383

378384
if __name__ == '__main__':
379385
logging.basicConfig(level=logging.WARNING)

0 commit comments

Comments
 (0)