lbkit 0.5.18__tar.gz → 0.5.19__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. {lbkit-0.5.18/lbkit.egg-info → lbkit-0.5.19}/PKG-INFO +1 -1
  2. lbkit-0.5.19/lbkit/__init__.py +2 -0
  3. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/idf_interface.py +145 -19
  4. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/template/public.c.mako +1 -1
  5. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/template/server.c.mako +51 -0
  6. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/component/build.py +2 -2
  7. lbkit-0.5.19/lbkit/helper.py +96 -0
  8. {lbkit-0.5.18 → lbkit-0.5.19/lbkit.egg-info}/PKG-INFO +1 -1
  9. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit.egg-info/SOURCES.txt +4 -1
  10. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit.egg-info/top_level.txt +1 -0
  11. lbkit-0.5.19/test/__init__.py +0 -0
  12. lbkit-0.5.19/test/test_codegen.py +279 -0
  13. lbkit-0.5.19/test/test_helper.py +247 -0
  14. lbkit-0.5.18/lbkit/__init__.py +0 -2
  15. lbkit-0.5.18/lbkit/helper.py +0 -27
  16. {lbkit-0.5.18 → lbkit-0.5.19}/AUTHORS +0 -0
  17. {lbkit-0.5.18 → lbkit-0.5.19}/LICENSE +0 -0
  18. {lbkit-0.5.18 → lbkit-0.5.19}/MANIFEST.in +0 -0
  19. {lbkit-0.5.18 → lbkit-0.5.19}/README.md +0 -0
  20. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/ci_robot/__init__.py +0 -0
  21. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/ci_robot/gitee.py +0 -0
  22. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/cli.py +0 -0
  23. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/__init__.py +0 -0
  24. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/codegen.py +0 -0
  25. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/ctype_defination.py +0 -0
  26. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/renderer.py +0 -0
  27. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/template/client.c.mako +0 -0
  28. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/template/client.h.mako +0 -0
  29. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/template/interface.c.mako +0 -0
  30. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/template/interface.introspect.xml.mako +0 -0
  31. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/template/public.h.mako +0 -0
  32. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/template/server.h.mako +0 -0
  33. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/component/__init__.py +0 -0
  34. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/component/arg_parser.py +0 -0
  35. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/component/template/conanbase.mako +0 -0
  36. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/component/template/deploy.mako +0 -0
  37. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/component/test.py +0 -0
  38. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/errors.py +0 -0
  39. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/integration/__init__.py +0 -0
  40. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/integration/build_image.py +0 -0
  41. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/integration/build_manifest.py +0 -0
  42. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/integration/build_prepare.py +0 -0
  43. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/integration/build_rootfs.py +0 -0
  44. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/integration/config.py +0 -0
  45. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/integration/task.py +0 -0
  46. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/integration/template/conanfile.py.mako +0 -0
  47. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/lbkit.py +0 -0
  48. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/log.py +0 -0
  49. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/misc.py +0 -0
  50. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/tools.py +0 -0
  51. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit.egg-info/dependency_links.txt +0 -0
  52. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit.egg-info/entry_points.txt +0 -0
  53. {lbkit-0.5.18 → lbkit-0.5.19}/lbkit.egg-info/requires.txt +0 -0
  54. {lbkit-0.5.18 → lbkit-0.5.19}/setup.cfg +0 -0
  55. {lbkit-0.5.18 → lbkit-0.5.19}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lbkit
3
- Version: 0.5.18
3
+ Version: 0.5.19
4
4
  Summary: Tools provided by litebmc.com
5
5
  Home-page: https://www.litebmc.com
6
6
  Author: xuhj@litebmc.com
@@ -0,0 +1,2 @@
1
+
2
+ __version__ = '0.5.19'
@@ -8,6 +8,7 @@ from lbkit.codegen.renderer import Renderer
8
8
  from lbkit.codegen.ctype_defination import CTYPE_OBJS, RefObjArrayValidator, RefObjValidator
9
9
  from lbkit.misc import load_yml_with_json_schema_validate
10
10
  from lbkit.errors import OdfValidateException
11
+ from lbkit.helper import SigInvalidException, validate_glib_signature
11
12
 
12
13
  log = Logger("gen_interface")
13
14
 
@@ -133,6 +134,7 @@ class IdfCtypeRender():
133
134
  ctype: str = None
134
135
  name: str = ""
135
136
  idf_data = None
137
+ default = None
136
138
  flags: list[str] = []
137
139
 
138
140
  def __init__(self):
@@ -186,20 +188,27 @@ class IdfCtypeRender():
186
188
  log.debug(f"Get odf schema info, name: {self.name}, ctype: {self.ctype}")
187
189
  if "variant" == self.ctype:
188
190
  return None
191
+ validator_cfg = self.validator_cfg
189
192
  match = re.match(f"^array\[({CTYPE_BASE_REG})\]$", self.ctype)
190
193
  if match:
191
194
  if "refobj" in self.flags:
192
195
  valiator = RefObjArrayValidator()
193
196
  return valiator.odf_schema(allow_ref)
194
- ctype_obj = CTYPE_OBJS.get(self.ctype)
195
- return ctype_obj.validator.odf_schema(allow_ref)
197
+ ctype_obj = copy.deepcopy(CTYPE_OBJS.get(self.ctype))
198
+ validator = ctype_obj.validator
199
+ if validator_cfg:
200
+ validator.set_validator(validator_cfg, self.name)
201
+ return validator.odf_schema(allow_ref)
196
202
  match = re.match(f"^({CTYPE_BASE_REG})$", self.ctype)
197
203
  if match:
198
204
  if "refobj" in self.flags:
199
205
  valiator = RefObjValidator()
200
206
  return valiator.odf_schema(allow_ref)
201
207
  ctype_obj = CTYPE_OBJS.get(self.ctype)
202
- return ctype_obj.validator.odf_schema(allow_ref)
208
+ validator = ctype_obj.validator
209
+ if validator_cfg:
210
+ validator.set_validator(validator_cfg, self.name)
211
+ return validator.odf_schema(allow_ref)
203
212
  # 非基础类型
204
213
  is_array = False
205
214
  ctype = self.ctype
@@ -519,13 +528,11 @@ class IdfCtypeRender():
519
528
  value = self.idf_data.get("pattern")
520
529
  if value:
521
530
  cfg["pattern"] = value
522
- elif (self.ctype == "byte" or self.ctype == "array[byte]" or
523
- self.ctype == "int16" or self.ctype == "array[int16]" or
524
- self.ctype == "uint16" or self.ctype == "array[uint16]" or
525
- self.ctype == "int32" or self.ctype == "array[int32]" or
526
- self.ctype == "uint32" or self.ctype == "array[uint32]" or
527
- self.ctype == "int64" or self.ctype == "array[int64]" or
528
- self.ctype == "uint64" or self.ctype == "array[uint64]"):
531
+ elif self.ctype in ["byte", "array[byte]", "int16", "array[int16]",
532
+ "uint16", "array[uint16]", "int32", "array[int32]",
533
+ "uint32", "array[uint32]","int64", "array[int64]",
534
+ "uint64", "array[uint64]", "size", "array[size]",
535
+ "ssize", "array[ssize]"]:
529
536
  value = self.idf_data.get("max")
530
537
  if value:
531
538
  cfg["max"] = value
@@ -596,6 +603,127 @@ class IdfProperty(IdfCtypeRender):
596
603
  else:
597
604
  self.desc_flags = " | ".join(c_flags)
598
605
 
606
+ self._load_default()
607
+
608
+ def _load_default(self):
609
+ # 只有基础类型有default值
610
+ match = re.match(f"^array\[({CTYPE_BASE_REG})\]$", self.ctype)
611
+ if not match:
612
+ match = re.match(f"^({CTYPE_BASE_REG})$", self.ctype)
613
+ if not match:
614
+ return
615
+ self.default = self.idf_data.get("default")
616
+ if self.default is None:
617
+ return
618
+
619
+ if self.ctype in ["boolean", "array[boolean]"]:
620
+ return
621
+ pattern = self.idf_data.get("pattern")
622
+ if pattern:
623
+ if self.ctype == "string":
624
+ match = re.match(pattern, self.default)
625
+ if not match:
626
+ raise OdfValidateException(f"Fail to validation default value of property {self.name} with pattern \"{pattern}\", get default: {self.default}")
627
+ return
628
+ if self.ctype == "array[string]":
629
+ for val in self.default:
630
+ match = re.match(pattern, val)
631
+ if not match:
632
+ raise OdfValidateException(f"Fail to validation default value of property {self.name} with pattern \"{pattern}\", get default: {val}")
633
+ return
634
+ if self.ctype == "object_path":
635
+ if pattern:
636
+ match = re.match(pattern, self.default)
637
+ if not match:
638
+ raise OdfValidateException(f"Fail to validation default value of property {self.name} with pattern \"{pattern}\", get default: {self.default}")
639
+ match = re.match(f"^(/[A-Z0-9a-z_]+)+$", self.default)
640
+ if not match:
641
+ raise OdfValidateException(f"Fail to validation default value of property {self.name} with pattern \"^(/[A-Z0-9a-z_]+)+$\", get default: {self.default}")
642
+ return
643
+ if self.ctype == "array[object_path]":
644
+ for val in self.default:
645
+ if pattern:
646
+ match = re.match(pattern, val)
647
+ if not match:
648
+ raise OdfValidateException(f"Fail to validation default value of property {self.name} with pattern \"{pattern}\", get default: {val}")
649
+ match = re.match(f"^(/[A-Z0-9a-z_]+)+$", val)
650
+ if not match:
651
+ raise OdfValidateException(f"Fail to validation default value of property {self.name} with pattern \"^(/[A-Z0-9a-z_]+)+$\", get default: {val}")
652
+ return
653
+
654
+ if self.ctype == "signature":
655
+ try:
656
+ validate_glib_signature(self.default)
657
+ if pattern:
658
+ match = re.match(pattern, self.default)
659
+ if not match:
660
+ raise OdfValidateException(f"Fail to validation default value of property {self.name} with pattern \"{pattern}\", get default: {self.default}")
661
+ except SigInvalidException:
662
+ raise OdfValidateException(f"Fail to validation default value of property {self.name}, get default: {self.default}")
663
+ return
664
+ if self.ctype == "array[oobject_path]":
665
+ try:
666
+ for val in self.default:
667
+ validate_glib_signature(val)
668
+ if pattern:
669
+ match = re.match(pattern, self.default)
670
+ if not match:
671
+ raise OdfValidateException(f"Fail to validation default value of property {self.name} with pattern \"{pattern}\", get default: {self.default}")
672
+ except SigInvalidException:
673
+ raise OdfValidateException(f"Fail to validation default value of property {self.name}, get default: {self.default}")
674
+ return
675
+
676
+ cfg = self.validator_cfg
677
+ if self.ctype in ["byte", "int16", "uint16", "int32", "uint32", "size", "ssize",
678
+ "int64", "uint64"]:
679
+ mmax = cfg.get("max")
680
+ if mmax is not None and mmax < self.default:
681
+ raise OdfValidateException(f"Fail to validation default value of property {self.name}, get default: {self.default}, max: {mmax}")
682
+ mmin = cfg.get("min")
683
+ if mmin is not None and mmin > self.default:
684
+ raise OdfValidateException(f"Fail to validation default value of property {self.name}, get default: {self.default}, min: {mmin}")
685
+ return
686
+ if self.ctype in ["array[byte]", "array[int16]", "array[uint16]", "array[int32]", "array[uint32]", "array[size]",
687
+ "array[ssize]", "array[int64]", "array[uint64]"]:
688
+ for val in self.default:
689
+ mmax = cfg.get("max")
690
+ if mmax is not None and mmax < val:
691
+ raise OdfValidateException(f"Fail to validation default value of property {self.name}, get default: {val}, max: {mmax}")
692
+ mmin = cfg.get("min")
693
+ if mmin is not None and mmin > val:
694
+ raise OdfValidateException(f"Fail to validation default value of property {self.name}, get default: {val}, min: {mmin}")
695
+ return
696
+
697
+ if self.ctype == "double":
698
+ emax = cfg.get("exclusive_max")
699
+ mmax = cfg.get("max")
700
+ if emax is not None and emax <= self.default:
701
+ raise OdfValidateException(f"Fail to validation default value of property {self.name}, get default: {self.default}, eclusive_max: {emax}")
702
+ if mmax is not None and mmax < self.default:
703
+ raise OdfValidateException(f"Fail to validation default value of property {self.name}, get default: {self.default}, max: {mmax}")
704
+ emin = cfg.get("exclusive_min")
705
+ mmin = cfg.get("min")
706
+ if emin is not None and emin >= self.default:
707
+ raise OdfValidateException(f"Fail to validation default value of property {self.name}, get default: {self.default}, exclusive_min: {emin}")
708
+ if mmin is not None and mmin > self.default:
709
+ raise OdfValidateException(f"Fail to validation default value of property {self.name}, get default: {self.default}, min: {emin}")
710
+ return
711
+ if self.ctype == "array[double]":
712
+ for val in self.default:
713
+ emax = cfg.get("exclusive_max")
714
+ mmax = cfg.get("max")
715
+ if emax is not None and emax <= val:
716
+ raise OdfValidateException(f"Fail to validation default value of property {self.name}, get default: {val}, eclusive_max: {emax}")
717
+ if mmax is not None and mmax < val:
718
+ raise OdfValidateException(f"Fail to validation default value of property {self.name}, get default: {val}, max: {mmax}")
719
+ emin = cfg.get("exclusive_min")
720
+ mmin = cfg.get("min")
721
+ if emin is not None and emin >= val:
722
+ raise OdfValidateException(f"Fail to validation default value of property {self.name}, get default: {val}, exclusive_min: {emin}")
723
+ if mmin is not None and mmin > val:
724
+ raise OdfValidateException(f"Fail to validation default value of property {self.name}, get default: {val}, min: {emin}")
725
+ return
726
+ raise OdfValidateException(f"Only basic type(byaqiuxtdsog) support default value, Property {self.name} type is {self.ctype}")
599
727
 
600
728
  @property
601
729
  def signature(self):
@@ -819,8 +947,8 @@ class IdfDictionary():
819
947
 
820
948
  class IdfInterface(IdfInterfaceBase):
821
949
  def __init__(self, lookup, idf_file):
822
- if not idf_file.endswith(".yaml"):
823
- raise IDFException(f"IDF file {idf_file} not endswith .yaml")
950
+ if not idf_file.endswith(".yaml") and not idf_file.endswith(".yml"):
951
+ raise IDFException(f"IDF file {idf_file} neither endswith .yaml nor endswith .yml")
824
952
  super().__init__()
825
953
  self.lookup = lookup
826
954
  self.file = idf_file
@@ -920,7 +1048,7 @@ class IdfInterface(IdfInterfaceBase):
920
1048
  # 使用schema校验数据,确保IDF文件符合格式要求,减少程序处理过程中的异常处理
921
1049
  # 验证失败时抛异常,此处不用处理,由外层处理
922
1050
  idf = load_yml_with_json_schema_validate(self.file, "/usr/share/litebmc/schema/idf.v1.json")
923
- log.info(f"validate {self.file} successfully")
1051
+ log.debug(f"validate {self.file} successfully")
924
1052
  self.version = idf.get("version")
925
1053
  self.description = idf.get("description", "")
926
1054
  # 别名
@@ -974,19 +1102,17 @@ class IdfInterface(IdfInterfaceBase):
974
1102
  self.structures[self.alias] = intf_stru
975
1103
 
976
1104
  def render_dbus_xml(self, template, out_file):
977
- fd = open(out_file, "w")
978
1105
 
979
1106
  out = self.render(self.lookup, template, intf=self)
980
1107
  hash = hashlib.sha256()
981
1108
  hash.update(out.encode('utf-8'))
982
1109
  self.introspect_xml_sha256 = hash.hexdigest()
983
1110
  log.info("The sha256sum of interface {} is {}".format(out_file, self.introspect_xml_sha256))
984
- fd.write(out)
985
- fd.close()
1111
+ with open(out_file, "w") as fd:
1112
+ fd.write(out)
986
1113
 
987
1114
  def render_c_source(self, template, out_file):
988
- fd = open(out_file, "w")
989
1115
 
990
1116
  out = self.render(self.lookup, template, intf=self)
991
- fd.write(out)
992
- fd.close()
1117
+ with open(out_file, "w") as fd:
1118
+ fd.write(out)
@@ -282,7 +282,7 @@ ${name} *${name}_decode_v(GVariant *in, gsize *n)
282
282
  }
283
283
  ${name} *output = g_new0(${name}, *n);
284
284
  while (g_variant_iter_loop(&iter, "s", &str_val)) {
285
- for (int i = 0; i <= ${len(enum.values.parameters)}; i++) {
285
+ for (int i = 0; i < ${len(enum.values.parameters)}; i++) {
286
286
  if (g_strcmp0(str_val, _${name}StrMap[i]) == 0) {
287
287
  output[id++] = (${name})i;
288
288
  }
@@ -319,6 +319,7 @@ static void _load_from_odf(yaml_document_t *doc, yaml_node_t *node, GclObject *g
319
319
  */
320
320
  GclObject *_${class_name}_create(const gchar *obj_name, gpointer opaque)
321
321
  {
322
+ __attribute__((unused)) gint i = 0;
322
323
  ${class_name} *obj = g_new0(${class_name}, 1);
323
324
  memcpy(obj->_base.magic, GCL_MAGIC, strlen(GCL_MAGIC) + 1);
324
325
  obj->_base.lock = g_new0(GRecMutex, 1);
@@ -326,6 +327,56 @@ GclObject *_${class_name}_create(const gchar *obj_name, gpointer opaque)
326
327
  obj->_base.name = obj_name;
327
328
  obj->_base.intf = &_${class_name}_interface;
328
329
  obj->_base.opaque = opaque;
330
+ % for prop in intf.properties:
331
+ % if prop.default:
332
+ % if prop.ctype == "boolean":
333
+ % if prop.default:
334
+ obj->${prop.name} = TRUE;
335
+ % endif
336
+ % elif prop.ctype in ["byte", "int16", "uint16", "int32", "uint32", "int64", "uint64", "size", "ssize", "double"]:
337
+ % if prop.ctype == "uint64":
338
+ obj->${prop.name} = ${prop.default}UL;
339
+ % elif prop.ctype == "int64":
340
+ obj->${prop.name} = ${prop.default}LL;
341
+ % else:
342
+ obj->${prop.name} = ${prop.default};
343
+ % endif
344
+ % elif prop.ctype in ["object_path", "string", "signature"]:
345
+ obj->${prop.name} = g_strdup("${prop.default}");
346
+ % elif prop.ctype == "array[boolean]":
347
+ i = 0;
348
+ obj->n_${prop.name} = ${len(prop.default)};
349
+ obj->${prop.name} = g_new0(gboolean, obj->n_${prop.name});
350
+ % for val in prop.default:
351
+ % if val:
352
+ obj->${prop.name}[i++] = TRUE;
353
+ % else:
354
+ obj->${prop.name}[i++] = FALSE;
355
+ % endif
356
+ % endfor
357
+ % elif prop.ctype in ["array[byte]", "array[int16]", "array[uint16]", "array[int32]", "array[uint32]", "array[int64]", "array[uint64]", "array[size]", "array[ssize]", "array[double]"]:
358
+ <% ctype = prop.ctype[6:-1]%>
359
+ i = 0;
360
+ obj->n_${prop.name} = ${len(prop.default)};
361
+ obj->${prop.name} = g_new0(g${ctype}, obj->n_${prop.name});
362
+ % for val in prop.default:
363
+ % if prop.ctype == "array[uint64]":
364
+ obj->${prop.name}[i++] = ${val}UL;
365
+ % elif prop.ctype == "array[int64]":
366
+ obj->${prop.name}[i++] = ${val}LL;
367
+ % else:
368
+ obj->${prop.name}[i++] = ${val};
369
+ % endif
370
+ % endfor
371
+ % elif prop.ctype in ["array[object_path]", "array[string]", "array[signature]"]:
372
+ i = 0;
373
+ obj->${prop.name} = g_new0(gchar *, ${len(prop.default) + 1});
374
+ % for val in prop.default:
375
+ obj->${prop.name}[i++] = g_strdup("${val}");
376
+ % endfor
377
+ % endif
378
+ % endif
379
+ % endfor
329
380
  return (GclObject *)obj;
330
381
  }
331
382
 
@@ -85,8 +85,8 @@ class BuildComponent():
85
85
  示例: project(gcom LANGUAGES C VERSION 0.1.0)
86
86
  """
87
87
  try:
88
- fp = open("CMakeLists.txt", "r")
89
- content = fp.read()
88
+ with open("CMakeLists.txt", "r") as fp:
89
+ content = fp.read()
90
90
  version = re.search("project\((.*)VERSION ([0-9][1-9]*.[0-9][1-9]*.[0-9][1-9]*)\)", content).group(2)
91
91
  return version.strip()
92
92
  except Exception as e:
@@ -0,0 +1,96 @@
1
+ import os
2
+ import yaml
3
+ import unittest
4
+ from xml.dom import minidom, Node
5
+
6
+ class Helper():
7
+ @staticmethod
8
+ def get_node_value(dom: Node, name, default=None):
9
+ node: minidom.Attr = dom.attributes.get(name)
10
+ if node is None:
11
+ if default is None:
12
+ raise Exception("Parse node failed, abort")
13
+ return default
14
+ return node.childNodes[0].nodeValue.strip()
15
+
16
+ def read_yaml(file: str, key, default=None):
17
+ if not os.path.isfile(file):
18
+ return default
19
+ fd = open(file, "r");
20
+ try:
21
+ data = yaml.load(fd, Loader=yaml.FullLoader)
22
+ for split in key.split("/", -1):
23
+ data = data.get(split)
24
+ if data is None:
25
+ return default
26
+ return data
27
+ except:
28
+ return default
29
+
30
+
31
+ generate_sig_chars = [
32
+ "y", "b", "n", "q", "i", "u", "x", "t", "h",
33
+ "d", "v", "s", "o", "g"]
34
+
35
+
36
+ class SigInvalidException(Exception):
37
+ pass
38
+
39
+ def _validate_glib_signature(sig_str, sigs):
40
+ if len(sigs) == 0:
41
+ raise SigInvalidException(f"String {sig_str} is not a valid signature str")
42
+ if sigs[0] in generate_sig_chars:
43
+ if len(sigs) > 1:
44
+ return _validate_glib_signature(sig_str, sigs[1:])
45
+ return
46
+ if sigs[0] == "a":
47
+ return _validate_glib_signature(sig_str, sigs[1:])
48
+ if sigs[0] in ["(", "{"]:
49
+ next_chr = ")"
50
+ if sigs[0] == "{":
51
+ next_chr = "}"
52
+
53
+ cnt = 0
54
+ next_pos = -1
55
+ for i, c in enumerate(sigs):
56
+ if c == sigs[0]:
57
+ cnt += 1
58
+ elif c == next_chr:
59
+ cnt -= 1
60
+ if cnt == 0:
61
+ next_pos = i
62
+ break
63
+ # 未找到下一个右括号
64
+ if next_pos == -1:
65
+ raise SigInvalidException(f"String {sig_str} is not a valid signature str")
66
+ # 元组()之间可以为空
67
+ if sigs[0] == '(' and next_pos == 1:
68
+ return
69
+ if sigs[0] == "{":
70
+ # 字典至少需要两个字符
71
+ if next_pos < 3:
72
+ raise SigInvalidException(f"String {sig_str} is not a valid signature str")
73
+ # 字典第一个签名必须是简单类型
74
+ if sigs[1] not in generate_sig_chars:
75
+ raise SigInvalidException(f"String {sig_str} is not a valid signature str")
76
+ _validate_glib_signature(sig_str, sigs[1:next_pos])
77
+ sigs = sigs[next_pos + 1:]
78
+ if not sigs:
79
+ return
80
+ _validate_glib_signature(sig_str, sigs)
81
+ return
82
+
83
+ # '}' 和 ')'及其它字符起始的认为是非法字符
84
+ raise SigInvalidException(f"String {sig_str} is not a valid signature str")
85
+
86
+
87
+ def validate_glib_signature(sig_str):
88
+ _validate_glib_signature(sig_str, list(sig_str))
89
+
90
+
91
+ class TestSignatureValidateClass(unittest.TestCase):
92
+ def test_validate_glib_signature(self):
93
+ validate_glib_signature("as")
94
+
95
+ if __name__ == "__main__":
96
+ unittest.main()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lbkit
3
- Version: 0.5.18
3
+ Version: 0.5.19
4
4
  Summary: Tools provided by litebmc.com
5
5
  Home-page: https://www.litebmc.com
6
6
  Author: xuhj@litebmc.com
@@ -45,4 +45,7 @@ lbkit/integration/build_prepare.py
45
45
  lbkit/integration/build_rootfs.py
46
46
  lbkit/integration/config.py
47
47
  lbkit/integration/task.py
48
- lbkit/integration/template/conanfile.py.mako
48
+ lbkit/integration/template/conanfile.py.mako
49
+ test/__init__.py
50
+ test/test_codegen.py
51
+ test/test_helper.py
File without changes
@@ -0,0 +1,279 @@
1
+ import unittest
2
+ import tempfile
3
+ import os
4
+ import tracemalloc
5
+
6
+ tracemalloc.start()
7
+ from lbkit.codegen.idf_interface import IdfInterface, IdfProperty
8
+ from lbkit import errors
9
+
10
+ schema_dir = os.path.realpath(os.path.join(os.getcwd(), "..", "schema"))
11
+
12
+ class TestCodeGenClass(unittest.TestCase):
13
+ tmp_file = None
14
+
15
+ @classmethod
16
+ def setUpClass(cls) -> None:
17
+ cls.tmp_file = tempfile.mktemp(prefix="idf_test", suffix=".yaml")
18
+ return super().setUpClass()
19
+
20
+ @classmethod
21
+ def tearDownClass(cls) -> None:
22
+ os.unlink(cls.tmp_file)
23
+ return super().tearDownClass()
24
+
25
+
26
+ def mk_interface_with_number_property(self, name, type, max, min, default_val):
27
+ with open(self.tmp_file, mode="w+") as fp:
28
+ fp.write(f"# yaml-language-server: $schema={schema_dir}/idf.v1.json\n")
29
+ fp.write("version: \"0.1\"\n")
30
+ fp.write("description: 测试接口,用于验证libgcom/gdbusplus,同时验证自动生成逻辑\n")
31
+ fp.write("alias: Test\n")
32
+ fp.write("properties:\n")
33
+ fp.write(f" - name: {name}\n")
34
+ fp.write(f" description: {name}\n")
35
+ fp.write(f" type: {type}\n")
36
+ fp.write(f" max: {max}\n")
37
+ fp.write(f" min: {min}\n")
38
+ fp.write(f" default: {default_val}\n")
39
+
40
+ def mk_interface_with_string_property(self, name, type, pattern, default_val):
41
+ with open(self.tmp_file, mode="w+") as fp:
42
+ fp.write(f"# yaml-language-server: $schema={schema_dir}/idf.v1.json\n")
43
+ fp.write("version: \"0.1\"\n")
44
+ fp.write("description: 测试接口,用于验证libgcom/gdbusplus,同时验证自动生成逻辑\n")
45
+ fp.write("alias: Test\n")
46
+ fp.write("properties:\n")
47
+ fp.write(f" - name: {name}\n")
48
+ fp.write(f" description: {name}\n")
49
+ fp.write(f" type: {type}\n")
50
+ if pattern:
51
+ fp.write(f" pattern: {pattern}\n")
52
+ fp.write(f" default: {default_val}\n")
53
+
54
+ def mk_interface_with_double_property(self, name, type, default_val, max=None, min=None, exclusive_max=None, exclusive_min=None):
55
+ with open(self.tmp_file, mode="w+") as fp:
56
+ fp.write(f"# yaml-language-server: $schema={schema_dir}/idf.v1.json\n")
57
+ fp.write("version: \"0.1\"\n")
58
+ fp.write("description: 测试接口,用于验证libgcom/gdbusplus,同时验证自动生成逻辑\n")
59
+ fp.write("alias: Test\n")
60
+ fp.write("properties:\n")
61
+ fp.write(f" - name: {name}\n")
62
+ fp.write(f" description: {name}\n")
63
+ fp.write(f" type: {type}\n")
64
+ if max is not None:
65
+ fp.write(f" max: {max}\n")
66
+ if min is not None:
67
+ fp.write(f" min: {min}\n")
68
+ if exclusive_max is not None:
69
+ fp.write(f" exclusive_max: {exclusive_max}\n")
70
+ if exclusive_min is not None:
71
+ fp.write(f" exclusive_min: {exclusive_min}\n")
72
+ fp.write(f" default: {default_val}\n")
73
+
74
+
75
+ def validate_boolean(self, name, type, default):
76
+ with open(self.tmp_file, mode="w+") as fp:
77
+ fp.write(f"# yaml-language-server: $schema={schema_dir}/idf.v1.json\n")
78
+ fp.write("version: \"0.1\"\n")
79
+ fp.write("description: 测试接口,用于验证libgcom/gdbusplus,同时验证自动生成逻辑\n")
80
+ fp.write("alias: Test\n")
81
+ fp.write("properties:\n")
82
+ fp.write(f" - name: {name}\n")
83
+ fp.write(f" description: {name}\n")
84
+ fp.write(f" type: {type}\n")
85
+ fp.write(f" default: {default}\n")
86
+
87
+ def test_validate_default_bool(self):
88
+ self.validate_boolean("b", "boolean", "true")
89
+ IdfInterface(None, self.tmp_file)
90
+ self.validate_boolean("b", "boolean", "false")
91
+ IdfInterface(None, self.tmp_file)
92
+ self.validate_boolean("b", "boolean", "False")
93
+ IdfInterface(None, self.tmp_file)
94
+ self.validate_boolean("b", "boolean", "True")
95
+ IdfInterface(None, self.tmp_file)
96
+ self.validate_boolean("b", "boolean", "ONsdf")
97
+ with self.assertRaises(errors.PackageConfigException):
98
+ IdfInterface(None, self.tmp_file)
99
+ self.validate_boolean("b", "boolean", "asdaffa")
100
+ with self.assertRaises(errors.PackageConfigException):
101
+ IdfInterface(None, self.tmp_file)
102
+
103
+ def test_validate_default_array_bool(self):
104
+ self.validate_boolean("b", "array[boolean]", "[false, true]")
105
+ IdfInterface(None, self.tmp_file)
106
+ self.validate_boolean("b", "array[boolean]", "[on, 1]")
107
+ # boolean值比较特殊,由json schema校验验证
108
+ with self.assertRaises(errors.PackageConfigException):
109
+ IdfInterface(None, self.tmp_file)
110
+
111
+ def validate_number(self, name, type):
112
+ self.mk_interface_with_number_property(name, type, "100", "1", "1")
113
+ IdfInterface(None, self.tmp_file)
114
+ self.mk_interface_with_number_property(name, type, "100", "1", "100")
115
+ IdfInterface(None, self.tmp_file)
116
+ self.mk_interface_with_number_property(name, type, "100", "1", "0")
117
+ with self.assertRaises(errors.OdfValidateException):
118
+ IdfInterface(None, self.tmp_file)
119
+ self.mk_interface_with_number_property(name, type, "100", "1", "101")
120
+ with self.assertRaises(errors.OdfValidateException):
121
+ IdfInterface(None, self.tmp_file)
122
+
123
+ def test_validate_default_byte(self):
124
+ self.validate_number("y", "byte")
125
+
126
+ def test_validate_default_uint16(self):
127
+ self.validate_number("n", "uint16")
128
+
129
+ def test_validate_default_int16(self):
130
+ self.validate_number("q", "int16")
131
+
132
+ def test_validate_default_int32(self):
133
+ self.validate_number("i", "int32")
134
+
135
+ def test_validate_default_uint32(self):
136
+ self.validate_number("u", "uint32")
137
+
138
+ def test_validate_default_int64(self):
139
+ self.validate_number("x", "int64")
140
+
141
+ def test_validate_default_uint64(self):
142
+ self.validate_number("t", "uint64")
143
+
144
+ def test_validate_default_size(self):
145
+ self.validate_number("size", "size")
146
+
147
+ def test_validate_default_uint16(self):
148
+ self.validate_number("ssize", "ssize")
149
+
150
+ def test_validate_default_boolean(self):
151
+ self.validate_number("double", "double")
152
+
153
+ def validate_array_number(self, name, type):
154
+ self.mk_interface_with_number_property(name, f"array[{type}]", "100", "1", "[1, 1]")
155
+ IdfInterface(None, self.tmp_file)
156
+ self.mk_interface_with_number_property(name, f"array[{type}]", "100", "1", "[100, 100]")
157
+ IdfInterface(None, self.tmp_file)
158
+ self.mk_interface_with_number_property(name, f"array[{type}]", "100", "1", "[0, 0]")
159
+ with self.assertRaises(errors.OdfValidateException):
160
+ IdfInterface(None, self.tmp_file)
161
+ self.mk_interface_with_number_property(name, f"array[{type}]", "100", "1", "[101, 101]")
162
+ with self.assertRaises(errors.OdfValidateException):
163
+ IdfInterface(None, self.tmp_file)
164
+
165
+ def test_validate_default_array_byte(self):
166
+ self.validate_array_number("y", "byte")
167
+
168
+ def test_validate_default_array_uint16(self):
169
+ self.validate_array_number("n", "uint16")
170
+
171
+ def test_validate_default_array_int16(self):
172
+ self.validate_array_number("q", "int16")
173
+
174
+ def test_validate_default_array_int32(self):
175
+ self.validate_array_number("i", "int32")
176
+
177
+ def test_validate_default_array_uint32(self):
178
+ self.validate_array_number("u", "uint32")
179
+
180
+ def test_validate_default_array_int64(self):
181
+ self.validate_array_number("x", "int64")
182
+
183
+ def test_validate_default_array_uint64(self):
184
+ self.validate_array_number("t", "uint64")
185
+
186
+ def test_validate_default_array_size(self):
187
+ self.validate_array_number("size", "size")
188
+
189
+ def test_validate_default_array_uint16(self):
190
+ self.validate_array_number("ssize", "ssize")
191
+
192
+ def test_validate_default_array_double(self):
193
+ self.validate_array_number("double", "double")
194
+
195
+ def test_validate_array_double(self):
196
+ self.mk_interface_with_double_property("double", f"array[double]", "[1, 1]", exclusive_max="100", exclusive_min="1")
197
+ with self.assertRaises(errors.OdfValidateException):
198
+ IdfInterface(None, self.tmp_file)
199
+ self.mk_interface_with_double_property("double", f"array[double]", "[100, 100]", exclusive_max="100", exclusive_min="1")
200
+ with self.assertRaises(errors.OdfValidateException):
201
+ IdfInterface(None, self.tmp_file)
202
+ self.mk_interface_with_double_property("double", f"array[double]", "[0.9, 0.9]", exclusive_max="100", exclusive_min="1")
203
+ with self.assertRaises(errors.OdfValidateException):
204
+ IdfInterface(None, self.tmp_file)
205
+ self.mk_interface_with_double_property("double", f"array[double]", "[100.1, 100.1]", exclusive_max="100", exclusive_min="1")
206
+ with self.assertRaises(errors.OdfValidateException):
207
+ IdfInterface(None, self.tmp_file)
208
+
209
+ def test_validate_double(self):
210
+ self.mk_interface_with_double_property("double", "double", "1", exclusive_max="100", exclusive_min="1")
211
+ with self.assertRaises(errors.OdfValidateException):
212
+ IdfInterface(None, self.tmp_file)
213
+ self.mk_interface_with_double_property("double", "double", "100", exclusive_max="100", exclusive_min="1")
214
+ with self.assertRaises(errors.OdfValidateException):
215
+ IdfInterface(None, self.tmp_file)
216
+ self.mk_interface_with_double_property("double", "double", "0.9", exclusive_max="100", exclusive_min="1")
217
+ with self.assertRaises(errors.OdfValidateException):
218
+ IdfInterface(None, self.tmp_file)
219
+ self.mk_interface_with_double_property("double", "double", "100.1", exclusive_max="100", exclusive_min="1")
220
+ with self.assertRaises(errors.OdfValidateException):
221
+ IdfInterface(None, self.tmp_file)
222
+
223
+ def test_validate_string(self):
224
+ self.mk_interface_with_string_property("string", "string", "^a[s]{1,2}$", "as")
225
+ IdfInterface(None, self.tmp_file)
226
+ self.mk_interface_with_string_property("string", "string", "^a[s]{1,2}$", "ass")
227
+ IdfInterface(None, self.tmp_file)
228
+ self.mk_interface_with_string_property("string", "string", "^a[s]{1,2}$", "asss")
229
+ with self.assertRaises(errors.OdfValidateException):
230
+ IdfInterface(None, self.tmp_file)
231
+ self.mk_interface_with_string_property("string", "string", "^a[s]{1,2}$", "a")
232
+ with self.assertRaises(errors.OdfValidateException):
233
+ IdfInterface(None, self.tmp_file)
234
+ self.mk_interface_with_string_property("string", "string", "^a[s]{1,2}$", "0.123")
235
+ with self.assertRaises(errors.PackageConfigException):
236
+ IdfInterface(None, self.tmp_file)
237
+
238
+ def test_validate_array_string(self):
239
+ self.mk_interface_with_string_property("string", "array[string]", "^a[s]{1,2}$", "[as, as]")
240
+ IdfInterface(None, self.tmp_file)
241
+ self.mk_interface_with_string_property("string", "array[string]", "^a[s]{1,2}$", "[ass, ass]")
242
+ IdfInterface(None, self.tmp_file)
243
+ self.mk_interface_with_string_property("string", "array[string]", "^a[s]{1,2}$", "[asss, asss]")
244
+ with self.assertRaises(errors.OdfValidateException):
245
+ IdfInterface(None, self.tmp_file)
246
+ self.mk_interface_with_string_property("string", "array[string]", "^a[s]{1,2}$", "[a, a]")
247
+ with self.assertRaises(errors.OdfValidateException):
248
+ IdfInterface(None, self.tmp_file)
249
+ self.mk_interface_with_string_property("string", "array[string]", "^a[s]{1,2}$", "[0.123, 0.123]")
250
+ with self.assertRaises(errors.PackageConfigException):
251
+ IdfInterface(None, self.tmp_file)
252
+
253
+ def test_validate_object_path(self):
254
+ self.mk_interface_with_string_property("object_path", "object_path", None, "/as")
255
+ IdfInterface(None, self.tmp_file)
256
+ self.mk_interface_with_string_property("object_path", "object_path", None, "/a/s")
257
+ IdfInterface(None, self.tmp_file)
258
+ self.mk_interface_with_string_property("object_path", "object_path", None, "a/s")
259
+ with self.assertRaises(errors.PackageConfigException):
260
+ IdfInterface(None, self.tmp_file)
261
+ self.mk_interface_with_string_property("object_path", "object_path", None, "/a/s/")
262
+ with self.assertRaises(errors.PackageConfigException):
263
+ IdfInterface(None, self.tmp_file)
264
+
265
+ def test_validate_array_object_path(self):
266
+ self.mk_interface_with_string_property("object_path", "array[object_path]", None, "[/as, /as]")
267
+ IdfInterface(None, self.tmp_file)
268
+ self.mk_interface_with_string_property("object_path", "array[object_path]", None, "[/a/s, /a]")
269
+ IdfInterface(None, self.tmp_file)
270
+ self.mk_interface_with_string_property("object_path", "array[object_path]", None, "[a/s, a/s]")
271
+ with self.assertRaises(errors.PackageConfigException):
272
+ IdfInterface(None, self.tmp_file)
273
+ self.mk_interface_with_string_property("object_path", "array[object_path]", None, "[/a/s/, /a/s/]")
274
+ with self.assertRaises(errors.PackageConfigException):
275
+ IdfInterface(None, self.tmp_file)
276
+
277
+
278
+ if __name__ == "__main__":
279
+ unittest.main()
@@ -0,0 +1,247 @@
1
+ import unittest
2
+ from lbkit.helper import SigInvalidException, validate_glib_signature
3
+
4
+ class TestSignatureValidateClass(unittest.TestCase):
5
+ def test_validate_glib_signature_b(self):
6
+ validate_glib_signature("b")
7
+ validate_glib_signature("ab")
8
+ validate_glib_signature("bbb")
9
+ validate_glib_signature("{bb}")
10
+ validate_glib_signature("{bb}bbabaab")
11
+ validate_glib_signature("({bb}bbabaab()(b))")
12
+ validate_glib_signature("a{sb}")
13
+ validate_glib_signature("(b)")
14
+ validate_glib_signature("a(b)")
15
+ validate_glib_signature("a(sb)")
16
+ def test_validate_glib_signature_y(self):
17
+ validate_glib_signature("y")
18
+ validate_glib_signature("ay")
19
+ validate_glib_signature("yyy")
20
+ validate_glib_signature("{yy}")
21
+ validate_glib_signature("{yy}yyayaay")
22
+ validate_glib_signature("({yy}yyayaay()(y))")
23
+ validate_glib_signature("a{sy}")
24
+ validate_glib_signature("(b)")
25
+ validate_glib_signature("a(b)")
26
+ validate_glib_signature("a(sb)")
27
+ def test_validate_glib_signature_n(self):
28
+ validate_glib_signature("n")
29
+ validate_glib_signature("an")
30
+ validate_glib_signature("nnn")
31
+ validate_glib_signature("{nn}")
32
+ validate_glib_signature("{nn}nnanaan")
33
+ validate_glib_signature("({nn}nnanaan()(n))")
34
+ validate_glib_signature("a{sn}")
35
+ validate_glib_signature("(b)")
36
+ validate_glib_signature("a(b)")
37
+ validate_glib_signature("a(sb)")
38
+ def test_validate_glib_signature_q(self):
39
+ validate_glib_signature("q")
40
+ validate_glib_signature("aq")
41
+ validate_glib_signature("qqq")
42
+ validate_glib_signature("{qq}")
43
+ validate_glib_signature("{qq}qqaqaaq")
44
+ validate_glib_signature("({qq}qqaqaaq()(q))")
45
+ validate_glib_signature("a{sq}")
46
+ validate_glib_signature("(b)")
47
+ validate_glib_signature("a(b)")
48
+ validate_glib_signature("a(sb)")
49
+ def test_validate_glib_signature_i(self):
50
+ validate_glib_signature("i")
51
+ validate_glib_signature("ai")
52
+ validate_glib_signature("iii")
53
+ validate_glib_signature("{ii}")
54
+ validate_glib_signature("{ii}iiaiaai")
55
+ validate_glib_signature("({ii}iiaiaai()(i))")
56
+ validate_glib_signature("a{si}")
57
+ validate_glib_signature("(b)")
58
+ validate_glib_signature("a(b)")
59
+ validate_glib_signature("a(sb)")
60
+ def test_validate_glib_signature_u(self):
61
+ validate_glib_signature("u")
62
+ validate_glib_signature("au")
63
+ validate_glib_signature("uuu")
64
+ validate_glib_signature("{uu}")
65
+ validate_glib_signature("{uu}uuauaau")
66
+ validate_glib_signature("({uu}uuauaau()(u))")
67
+ validate_glib_signature("a{su}")
68
+ validate_glib_signature("(b)")
69
+ validate_glib_signature("a(b)")
70
+ validate_glib_signature("a(sb)")
71
+ def test_validate_glib_signature_x(self):
72
+ validate_glib_signature("x")
73
+ validate_glib_signature("ax")
74
+ validate_glib_signature("xxx")
75
+ validate_glib_signature("{xx}")
76
+ validate_glib_signature("{xx}xxaxaax")
77
+ validate_glib_signature("({xx}xxaxaax()(x))")
78
+ validate_glib_signature("a{sx}")
79
+ validate_glib_signature("(b)")
80
+ validate_glib_signature("a(b)")
81
+ validate_glib_signature("a(sb)")
82
+ def test_validate_glib_signature_t(self):
83
+ validate_glib_signature("t")
84
+ validate_glib_signature("at")
85
+ validate_glib_signature("ttt")
86
+ validate_glib_signature("{tt}")
87
+ validate_glib_signature("{tt}ttataat")
88
+ validate_glib_signature("({tt}ttataat()(t))")
89
+ validate_glib_signature("a{st}")
90
+ validate_glib_signature("(b)")
91
+ validate_glib_signature("a(b)")
92
+ validate_glib_signature("a(sb)")
93
+ def test_validate_glib_signature_d(self):
94
+ validate_glib_signature("d")
95
+ validate_glib_signature("ad")
96
+ validate_glib_signature("ddd")
97
+ validate_glib_signature("{dd}")
98
+ validate_glib_signature("{dd}ddadaad")
99
+ validate_glib_signature("({dd}ddadaad()(d))")
100
+ validate_glib_signature("a{sd}")
101
+ validate_glib_signature("(b)")
102
+ validate_glib_signature("a(b)")
103
+ validate_glib_signature("a(sb)")
104
+ def test_validate_glib_signature_h(self):
105
+ validate_glib_signature("h")
106
+ validate_glib_signature("ah")
107
+ validate_glib_signature("hhh")
108
+ validate_glib_signature("{hh}")
109
+ validate_glib_signature("{hh}hhahaah")
110
+ validate_glib_signature("({hh}hhahaah()(h))")
111
+ validate_glib_signature("a{sh}")
112
+ validate_glib_signature("(b)")
113
+ validate_glib_signature("a(b)")
114
+ validate_glib_signature("a(sb)")
115
+ def test_validate_glib_signature_s(self):
116
+ validate_glib_signature("s")
117
+ validate_glib_signature("as")
118
+ validate_glib_signature("sss")
119
+ validate_glib_signature("{ss}")
120
+ validate_glib_signature("{ss}ssasaas")
121
+ validate_glib_signature("({ss}ssasaas()(s))")
122
+ validate_glib_signature("a{ss}")
123
+ validate_glib_signature("(b)")
124
+ validate_glib_signature("a(b)")
125
+ validate_glib_signature("a(sb)")
126
+ def test_validate_glib_signature_g(self):
127
+ validate_glib_signature("g")
128
+ validate_glib_signature("ag")
129
+ validate_glib_signature("ggg")
130
+ validate_glib_signature("{gg}")
131
+ validate_glib_signature("{gg}ggagaag")
132
+ validate_glib_signature("({gg}ggagaag()(g))")
133
+ validate_glib_signature("a{sg}")
134
+ validate_glib_signature("(b)")
135
+ validate_glib_signature("a(b)")
136
+ validate_glib_signature("a(sb)")
137
+ def test_validate_glib_signature_o(self):
138
+ validate_glib_signature("o")
139
+ validate_glib_signature("ao")
140
+ validate_glib_signature("ooo")
141
+ validate_glib_signature("{oo}")
142
+ validate_glib_signature("{oo}ooaoaao")
143
+ validate_glib_signature("({oo}ooaoaao()(o))")
144
+ validate_glib_signature("a{so}")
145
+ validate_glib_signature("(b)")
146
+ validate_glib_signature("a(b)")
147
+ validate_glib_signature("a(sb)")
148
+
149
+ def test_validate_glib_signature(self):
150
+ validate_glib_signature("()")
151
+ validate_glib_signature("(ss)")
152
+ validate_glib_signature("(aaaaaaaaaaaaaaaaaaaaaay)")
153
+ validate_glib_signature("aaaaaaaaaaaaaaaaaaaaaay")
154
+ validate_glib_signature("{saaaaaaaaaaaaaaaaaaaaaay}")
155
+
156
+ def test_validate_glib_signature_failed(self):
157
+ with self.assertRaises(SigInvalidException):
158
+ validate_glib_signature("{}")
159
+ with self.assertRaises(SigInvalidException):
160
+ validate_glib_signature("a")
161
+ with self.assertRaises(SigInvalidException):
162
+ validate_glib_signature("aaa")
163
+ with self.assertRaises(SigInvalidException):
164
+ validate_glib_signature("{b}")
165
+ with self.assertRaises(SigInvalidException):
166
+ validate_glib_signature("{ayy}")
167
+ with self.assertRaises(SigInvalidException):
168
+ validate_glib_signature("{b}")
169
+ with self.assertRaises(SigInvalidException):
170
+ validate_glib_signature("{ab}")
171
+ with self.assertRaises(SigInvalidException):
172
+ validate_glib_signature("{aby}")
173
+ with self.assertRaises(SigInvalidException):
174
+ validate_glib_signature("{y}")
175
+ with self.assertRaises(SigInvalidException):
176
+ validate_glib_signature("{ay}")
177
+ with self.assertRaises(SigInvalidException):
178
+ validate_glib_signature("{ayy}")
179
+ with self.assertRaises(SigInvalidException):
180
+ validate_glib_signature("{n}")
181
+ with self.assertRaises(SigInvalidException):
182
+ validate_glib_signature("{an}")
183
+ with self.assertRaises(SigInvalidException):
184
+ validate_glib_signature("{any}")
185
+ with self.assertRaises(SigInvalidException):
186
+ validate_glib_signature("{q}")
187
+ with self.assertRaises(SigInvalidException):
188
+ validate_glib_signature("{aq}")
189
+ with self.assertRaises(SigInvalidException):
190
+ validate_glib_signature("{aqy}")
191
+ with self.assertRaises(SigInvalidException):
192
+ validate_glib_signature("{i}")
193
+ with self.assertRaises(SigInvalidException):
194
+ validate_glib_signature("{ai}")
195
+ with self.assertRaises(SigInvalidException):
196
+ validate_glib_signature("{aiy}")
197
+ with self.assertRaises(SigInvalidException):
198
+ validate_glib_signature("{u}")
199
+ with self.assertRaises(SigInvalidException):
200
+ validate_glib_signature("{au}")
201
+ with self.assertRaises(SigInvalidException):
202
+ validate_glib_signature("{auy}")
203
+ with self.assertRaises(SigInvalidException):
204
+ validate_glib_signature("{x}")
205
+ with self.assertRaises(SigInvalidException):
206
+ validate_glib_signature("{ax}")
207
+ with self.assertRaises(SigInvalidException):
208
+ validate_glib_signature("{axy}")
209
+ with self.assertRaises(SigInvalidException):
210
+ validate_glib_signature("{t}")
211
+ with self.assertRaises(SigInvalidException):
212
+ validate_glib_signature("{at}")
213
+ with self.assertRaises(SigInvalidException):
214
+ validate_glib_signature("{aty}")
215
+ with self.assertRaises(SigInvalidException):
216
+ validate_glib_signature("{d}")
217
+ with self.assertRaises(SigInvalidException):
218
+ validate_glib_signature("{ad}")
219
+ with self.assertRaises(SigInvalidException):
220
+ validate_glib_signature("{ady}")
221
+ with self.assertRaises(SigInvalidException):
222
+ validate_glib_signature("{h}")
223
+ with self.assertRaises(SigInvalidException):
224
+ validate_glib_signature("{ah}")
225
+ with self.assertRaises(SigInvalidException):
226
+ validate_glib_signature("{ahy}")
227
+ with self.assertRaises(SigInvalidException):
228
+ validate_glib_signature("{s}")
229
+ with self.assertRaises(SigInvalidException):
230
+ validate_glib_signature("{as}")
231
+ with self.assertRaises(SigInvalidException):
232
+ validate_glib_signature("{asy}")
233
+ with self.assertRaises(SigInvalidException):
234
+ validate_glib_signature("{o}")
235
+ with self.assertRaises(SigInvalidException):
236
+ validate_glib_signature("{ao}")
237
+ with self.assertRaises(SigInvalidException):
238
+ validate_glib_signature("{aoy}")
239
+ with self.assertRaises(SigInvalidException):
240
+ validate_glib_signature("{g}")
241
+ with self.assertRaises(SigInvalidException):
242
+ validate_glib_signature("{ag}")
243
+ with self.assertRaises(SigInvalidException):
244
+ validate_glib_signature("{agy}")
245
+
246
+ if __name__ == "__main__":
247
+ unittest.main()
@@ -1,2 +0,0 @@
1
-
2
- __version__ = '0.5.18'
@@ -1,27 +0,0 @@
1
- import os
2
- import yaml
3
- from xml.dom import minidom, Node
4
-
5
- class Helper():
6
- @staticmethod
7
- def get_node_value(dom: Node, name, default=None):
8
- node: minidom.Attr = dom.attributes.get(name)
9
- if node is None:
10
- if default is None:
11
- raise Exception("Parse node failed, abort")
12
- return default
13
- return node.childNodes[0].nodeValue.strip()
14
-
15
- def read_yaml(file: str, key, default=None):
16
- if not os.path.isfile(file):
17
- return default
18
- fd = open(file, "r");
19
- try:
20
- data = yaml.load(fd, Loader=yaml.FullLoader)
21
- for split in key.split("/", -1):
22
- data = data.get(split)
23
- if data is None:
24
- return default
25
- return data
26
- except:
27
- return default
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes