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.
- {lbkit-0.5.18/lbkit.egg-info → lbkit-0.5.19}/PKG-INFO +1 -1
- lbkit-0.5.19/lbkit/__init__.py +2 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/idf_interface.py +145 -19
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/template/public.c.mako +1 -1
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/template/server.c.mako +51 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/component/build.py +2 -2
- lbkit-0.5.19/lbkit/helper.py +96 -0
- {lbkit-0.5.18 → lbkit-0.5.19/lbkit.egg-info}/PKG-INFO +1 -1
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit.egg-info/SOURCES.txt +4 -1
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit.egg-info/top_level.txt +1 -0
- lbkit-0.5.19/test/__init__.py +0 -0
- lbkit-0.5.19/test/test_codegen.py +279 -0
- lbkit-0.5.19/test/test_helper.py +247 -0
- lbkit-0.5.18/lbkit/__init__.py +0 -2
- lbkit-0.5.18/lbkit/helper.py +0 -27
- {lbkit-0.5.18 → lbkit-0.5.19}/AUTHORS +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/LICENSE +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/MANIFEST.in +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/README.md +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/ci_robot/__init__.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/ci_robot/gitee.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/cli.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/__init__.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/codegen.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/ctype_defination.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/renderer.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/template/client.c.mako +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/template/client.h.mako +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/template/interface.c.mako +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/template/interface.introspect.xml.mako +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/template/public.h.mako +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/codegen/template/server.h.mako +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/component/__init__.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/component/arg_parser.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/component/template/conanbase.mako +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/component/template/deploy.mako +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/component/test.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/errors.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/integration/__init__.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/integration/build_image.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/integration/build_manifest.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/integration/build_prepare.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/integration/build_rootfs.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/integration/config.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/integration/task.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/integration/template/conanfile.py.mako +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/lbkit.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/log.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/misc.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit/tools.py +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit.egg-info/dependency_links.txt +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit.egg-info/entry_points.txt +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/lbkit.egg-info/requires.txt +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/setup.cfg +0 -0
- {lbkit-0.5.18 → lbkit-0.5.19}/setup.py +0 -0
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
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}
|
|
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.
|
|
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
|
-
|
|
985
|
-
|
|
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
|
-
|
|
992
|
-
|
|
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
|
|
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
|
-
|
|
89
|
-
|
|
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()
|
|
@@ -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()
|
lbkit-0.5.18/lbkit/__init__.py
DELETED
lbkit-0.5.18/lbkit/helper.py
DELETED
|
@@ -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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|