1+ import logging
12import re
2- import sys
33
44import rstr
55import xmlschema
1212from xmlgenerator .randomization import Randomizer
1313from xmlgenerator .substitution import Substitutor
1414
15+ logger = logging .getLogger (__name__ )
16+
1517
1618class XmlGenerator :
1719 def __init__ (self , randomizer : Randomizer , substitutor : Substitutor ):
@@ -28,21 +30,27 @@ def _add_elements(self, xml_element: etree.Element, xsd_element, local_config: G
2830 rnd = self .randomizer .rnd
2931
3032 xsd_element_type = getattr (xsd_element , 'type' , None )
33+ logger .debug ('fill down element "%s" with type %s' , xsd_element .name , type (xsd_element_type ).__name__ )
3134
3235 # Add attributes if they are
3336 attributes = getattr (xsd_element , 'attributes' , dict ())
3437 if len (attributes ) > 0 and xsd_element_type .local_name != 'anyType' :
38+ logger .debug ('add attributes to element %s' , xsd_element .name )
3539 for attr_name , attr in attributes .items ():
40+ logger .debug ('attribute: %s' , attr_name )
3641 use = attr .use # optional | required | prohibited
3742 if use == 'prohibited' :
43+ logger .debug ('skipped' )
3844 continue
3945 elif use == 'optional' :
4046 if rnd .random () > local_config .randomization .probability :
41- continue # skip optional attribute
47+ logger .debug ('skipped' )
48+ continue # skip optional attribute
4249
4350 attr_value = self ._generate_value (attr .type , attr_name , local_config )
4451 if attr_value is not None :
4552 xml_element .set (attr_name , str (attr_value ))
53+ logger .debug (f'attribute %s set with value %s' , attr_name , attr_value )
4654
4755 # Process child elements --------------------------------------------------------------------------------------
4856 if isinstance (xsd_element , XsdElement ):
@@ -69,7 +77,7 @@ def _add_elements(self, xml_element: etree.Element, xsd_element, local_config: G
6977 group_min_occurs = getattr (xsd_element , 'min_occurs' , None )
7078 group_max_occurs = getattr (xsd_element , 'max_occurs' , None )
7179 group_min_occurs = group_min_occurs if group_min_occurs is not None else 0
72- group_max_occurs = group_max_occurs if group_max_occurs is not None else 10 # TODO externalize
80+ group_max_occurs = group_max_occurs if group_max_occurs is not None else 10 # TODO externalize
7381 group_occurs = rnd .randint (group_min_occurs , group_max_occurs )
7482
7583 if model == 'all' :
@@ -80,7 +88,7 @@ def _add_elements(self, xml_element: etree.Element, xsd_element, local_config: G
8088 element_min_occurs = getattr (xsd_child_element_type , 'min_occurs' , None )
8189 element_max_occurs = getattr (xsd_child_element_type , 'max_occurs' , None )
8290 element_min_occurs = element_min_occurs if element_min_occurs is not None else 0
83- element_max_occurs = element_max_occurs if element_max_occurs is not None else 10 # TODO externalize
91+ element_max_occurs = element_max_occurs if element_max_occurs is not None else 10 # TODO externalize
8492 element_occurs = rnd .randint (element_min_occurs , element_max_occurs )
8593
8694 for _ in range (element_occurs ):
@@ -96,7 +104,7 @@ def _add_elements(self, xml_element: etree.Element, xsd_element, local_config: G
96104 element_min_occurs = getattr (xsd_child_element_type , 'min_occurs' , None )
97105 element_max_occurs = getattr (xsd_child_element_type , 'max_occurs' , None )
98106 element_min_occurs = element_min_occurs if element_min_occurs is not None else 0
99- element_max_occurs = element_max_occurs if element_max_occurs is not None else 10 # TODO externalize
107+ element_max_occurs = element_max_occurs if element_max_occurs is not None else 10 # TODO externalize
100108 element_occurs = rnd .randint (element_min_occurs , element_max_occurs )
101109
102110 if isinstance (xsd_child_element_type , XsdElement ):
@@ -123,7 +131,7 @@ def _add_elements(self, xml_element: etree.Element, xsd_element, local_config: G
123131 element_min_occurs = getattr (xsd_child_element_type , 'min_occurs' , None )
124132 element_max_occurs = getattr (xsd_child_element_type , 'max_occurs' , None )
125133 element_min_occurs = element_min_occurs if element_min_occurs is not None else 0
126- element_max_occurs = element_max_occurs if element_max_occurs is not None else 10 # TODO externalize
134+ element_max_occurs = element_max_occurs if element_max_occurs is not None else 10 # TODO externalize
127135 element_occurs = rnd .randint (element_min_occurs , element_max_occurs )
128136
129137 for _ in range (element_occurs ):
@@ -232,7 +240,6 @@ def _generate_value(self, xsd_type, target_name, local_config: GeneratorConfig)
232240
233241 raise RuntimeError (f"Can't generate value - unhandled type. Target name: { target_name } " )
234242
235-
236243 def _generate_value_by_type (self , xsd_type , target_name , patterns , min_length , max_length , min_value , max_value ,
237244 total_digits , fraction_digits ) -> str | None :
238245
@@ -295,11 +302,15 @@ def _generate_string(self, target_name, patterns, min_length, max_length):
295302 xeger = rstr .xeger (random_pattern .attrib ['value' ])
296303 xeger = re .sub (r'\s' , ' ' , xeger )
297304 if min_length > - 1 and len (xeger ) < min_length :
298- print (
299- f"Possible mistake in schema: { target_name } generated value '{ xeger } ' can't be shorter than { min_length } " ,
300- file = sys .stderr )
305+ logger .warning (
306+ "Possible mistake in schema: %s generated value '%s' can't be shorter than %s" ,
307+ target_name , xeger , min_length
308+ )
301309 if - 1 < max_length < len (xeger ):
302- print (f"Possible mistake in schema: { target_name } generated value '{ xeger } ' can't be longer than { max_length } " , file = sys .stderr )
310+ logger .warning (
311+ "Possible mistake in schema: %s generated value '%s' can't be longer than %s" ,
312+ target_name , xeger , max_length
313+ )
303314 return xeger
304315
305316 # Иначе генерируем случайную строку
0 commit comments