Coverage for heritrace/utils/datatypes_validation.py: 99%
243 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-08-01 22:12 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-08-01 22:12 +0000
1import base64
2import re
3from datetime import datetime
4from urllib.parse import urlparse
7def validate_string(value):
8 try:
9 value = str(value)
10 return isinstance(value, str)
11 except ValueError:
12 return False
15def validate_normalizedString(value):
16 try:
17 return "\n" not in value and "\r" not in value and "\t" not in value
18 except Exception:
19 return False
22def validate_integer(value):
23 try:
24 int(value)
25 return True
26 except ValueError:
27 return False
30def validate_positive_integer(value):
31 try:
32 return int(value) > 0
33 except ValueError:
34 return False
37def validate_negative_integer(value):
38 try:
39 return int(value) < 0
40 except ValueError:
41 return False
44def validate_non_negative_integer(value):
45 try:
46 return int(value) >= 0
47 except ValueError:
48 return False
51def validate_non_positive_integer(value):
52 try:
53 return int(value) <= 0
54 except ValueError:
55 return False
58def validate_byte(value):
59 try:
60 val = int(value)
61 return -128 <= val <= 127
62 except ValueError:
63 return False
66def validate_short(value):
67 try:
68 val = int(value)
69 return -32_768 <= val <= 32_767
70 except ValueError:
71 return False
74def validate_long(value):
75 try:
76 val = int(value)
77 return -2_147_483_648 <= val <= 2_147_483_647
78 except ValueError:
79 return False
82def validate_unsigned_byte(value):
83 try:
84 val = int(value)
85 return 0 <= val <= 255
86 except ValueError:
87 return False
90def validate_unsigned_short(value):
91 try:
92 val = int(value)
93 return 0 <= val <= 65_535
94 except ValueError:
95 return False
98def validate_unsigned_long(value):
99 try:
100 val = int(value)
101 return 0 <= val <= 4_294_967_295
102 except ValueError:
103 return False
106def validate_unsigned_int(value):
107 try:
108 val = int(value)
109 return 0 <= val <= 4_294_967_295
110 except ValueError:
111 return False
114def validate_float(value):
115 try:
116 float(value)
117 return True
118 except ValueError:
119 return False
122def validate_double(value):
123 try:
124 float(value)
125 return True
126 except ValueError:
127 return False
130def validate_decimal(value):
131 try:
132 float(value)
133 return True
134 except ValueError:
135 return False
138def validate_duration(value):
139 try:
140 duration_pattern = re.compile(
141 r"^P(?=\d|T\d)(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+?)?)S)?)?$"
142 )
143 return bool(duration_pattern.match(value))
144 except Exception:
145 return False
148def validate_dayTimeDuration(value):
149 try:
150 dayTimeDuration_pattern = re.compile(
151 r"^P(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?$"
152 )
153 return bool(dayTimeDuration_pattern.match(value))
154 except Exception:
155 return False
158def validate_yearMonthDuration(value):
159 try:
160 yearMonthDuration_pattern = re.compile(r"^P(?:\d+Y)?(?:\d+M)?$")
161 return bool(yearMonthDuration_pattern.match(value))
162 except Exception:
163 return False
166def validate_gYearMonth(value):
167 try:
168 pattern = re.compile(r"^(\d{4})-(\d{2})$")
169 match = pattern.match(value)
170 if match:
171 year, month = map(int, match.groups())
172 return year <= 9999 and 1 <= month <= 12
173 return False
174 except Exception:
175 return False
178def validate_gYear(value):
179 try:
180 pattern = re.compile(r"^\d{4}$")
181 if pattern.match(value):
182 year = int(value)
183 return 1582 <= year <= 9999
184 return False
185 except Exception:
186 return False
189def validate_dateTime(value):
190 try:
191 pattern = re.compile(
192 r"^-?\d{4,}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?$"
193 )
194 return bool(pattern.match(value))
195 except Exception:
196 return False
199def validate_dateTimeStamp(value):
200 try:
201 pattern = re.compile(
202 r"^-?\d{4,}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(Z|[+-]\d{2}:\d{2})$"
203 )
204 return bool(pattern.match(value))
205 except Exception:
206 return False
209def validate_date(value):
210 try:
211 datetime.strptime(value, "%Y-%m-%d").date()
212 return True
213 except ValueError:
214 return False
217def validate_time(value):
218 try:
219 return bool(re.match(r"^([01]\d|2[0-3]):?([0-5]\d):?([0-5]\d)$", value))
220 except Exception:
221 return False
224def validate_hour(value):
225 try:
226 return 0 <= int(value) <= 23
227 except ValueError:
228 return False
231def validate_minute(value):
232 try:
233 return 0 <= int(value) <= 59
234 except ValueError:
235 return False
238def validate_second(value):
239 try:
240 return 0 <= float(value) < 60
241 except ValueError:
242 return False
245def validate_timezoneOffset(value):
246 try:
247 timezoneOffset_pattern = re.compile(r"^[+-]\d{2}:\d{2}$")
248 return bool(timezoneOffset_pattern.match(value))
249 except Exception:
250 return False
253def validate_boolean(value):
254 try:
255 return value.lower() in ["true", "false"]
256 except Exception:
257 return False
260def validate_hexBinary(value):
261 try:
262 bytes.fromhex(value)
263 return True
264 except ValueError:
265 return False
268def validate_base64Binary(value):
269 try:
270 base64.b64decode(value)
271 return True
272 except ValueError:
273 return False
276def validate_url(value):
277 try:
278 result = urlparse(value)
279 return all([result.scheme, result.netloc])
280 except ValueError:
281 return False
284def validate_QName(value):
285 try:
286 QName_pattern = re.compile(r"^(?:[a-zA-Z_][\w.-]*:)?[a-zA-Z_][\w.-]*$")
287 return bool(QName_pattern.match(value))
288 except Exception:
289 return False
292def validate_ENTITIES(value):
293 try:
294 entities = value.split()
295 return all(re.match(r"^[a-zA-Z_][\w.-]*$", entity) for entity in entities)
296 except Exception:
297 return False
300validate_ENTITY = validate_ENTITIES
303def validate_ID(value):
304 try:
305 return re.match(r"^[a-zA-Z_][\w.-]*$", value) is not None
306 except Exception:
307 return False
310validate_IDREF = validate_ID
311validate_IDREFS = validate_ENTITIES
312validate_NCName = validate_ID
315def validate_NMTOKEN(value):
316 try:
317 return re.match(r"^[\w.-]+$", value) is not None
318 except Exception:
319 return False
322def validate_NMTOKENS(value):
323 try:
324 tokens = value.split()
325 return all(re.match(r"^[\w.-]+$", token) for token in tokens)
326 except Exception:
327 return False
330validate_NOTATION = validate_QName
333def validate_Name(value):
334 try:
335 return re.match(r"^[a-zA-Z_:][\w.-]*$", value) is not None
336 except Exception:
337 return False