lbkit 0.7.2__tar.gz → 0.7.4__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.7.2/lbkit.egg-info → lbkit-0.7.4}/PKG-INFO +1 -1
- lbkit-0.7.4/lbkit/__init__.py +2 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/codegen.py +46 -14
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/idf_interface.py +13 -7
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/template/client.c.mako +1 -1
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/template/client.h.mako +1 -1
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/template/public.c.mako +46 -2
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/template/public.h.mako +4 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/template/server.c.mako +15 -1
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/template/server.h.mako +1 -1
- lbkit-0.7.4/lbkit/utils/version.py +41 -0
- {lbkit-0.7.2 → lbkit-0.7.4/lbkit.egg-info}/PKG-INFO +1 -1
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit.egg-info/SOURCES.txt +1 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/test/test_codegen.py +90 -45
- lbkit-0.7.2/lbkit/__init__.py +0 -2
- {lbkit-0.7.2 → lbkit-0.7.4}/AUTHORS +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/LICENSE +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/MANIFEST.in +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/README.md +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/build_conan_parallel.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/ci_robot/__init__.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/ci_robot/gitee.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/cli.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/__init__.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/ctype_defination.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/renderer.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/template/interface.c.mako +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/template/interface.introspect.xml.mako +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/component/__init__.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/component/arg_parser.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/component/build.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/component/template/conanbase.mako +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/component/template/deploy.mako +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/component/test.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/errors.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/helper.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/__init__.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/build_image.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/build_manifest.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/build_prepare.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/build_rootfs.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/config.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/task.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/template/conanfile.py.mako +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/template/rootfs.py.mako +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/lbkit.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/log.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/misc.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/tools.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/utils/__init__.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/utils/images/__init__.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/utils/images/emmc.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit.egg-info/dependency_links.txt +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit.egg-info/entry_points.txt +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit.egg-info/requires.txt +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/lbkit.egg-info/top_level.txt +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/setup.cfg +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/setup.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/test/__init__.py +0 -0
- {lbkit-0.7.2 → lbkit-0.7.4}/test/test_helper.py +0 -0
|
@@ -7,6 +7,7 @@ import json
|
|
|
7
7
|
import yaml
|
|
8
8
|
import argparse
|
|
9
9
|
from lbkit.codegen.idf_interface import IdfInterface
|
|
10
|
+
from lbkit.utils.version import Version, X_VER
|
|
10
11
|
|
|
11
12
|
from mako.lookup import TemplateLookup
|
|
12
13
|
from lbkit.log import Logger
|
|
@@ -17,13 +18,36 @@ from lbkit.misc import SmartFormatter
|
|
|
17
18
|
lb_cwd = os.path.split(os.path.realpath(__file__))[0]
|
|
18
19
|
log = Logger("codegen")
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
# 历史自动生成版本号,计划用于用于生成代码稳定性测试
|
|
22
|
+
# TODO: 支持生成代码稳定性测试,确保生成的代码一致性
|
|
23
|
+
history_versions = {
|
|
24
|
+
"5.0": "简化枚举变更在接口间传递时的字符串定义"
|
|
25
|
+
}
|
|
26
|
+
__version__=Version("5.0")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def version_check(ver_str: str):
|
|
30
|
+
ver = Version(ver_str)
|
|
31
|
+
if history_versions.get(ver_str):
|
|
32
|
+
return ver
|
|
33
|
+
found = False
|
|
34
|
+
if ver.minor == X_VER:
|
|
35
|
+
major_str = str(ver.major) + "."
|
|
36
|
+
for v, _ in history_versions.items():
|
|
37
|
+
if v.startswith(major_str):
|
|
38
|
+
found = True
|
|
39
|
+
break
|
|
40
|
+
if not found:
|
|
41
|
+
log.error(f"Unkonw codegen version {ver_str}, supported versions:")
|
|
42
|
+
for ver, msg in history_versions.items():
|
|
43
|
+
log.error(f" {ver}: {msg}")
|
|
44
|
+
raise Exception("Unkonw codegen version get")
|
|
45
|
+
return ver
|
|
21
46
|
|
|
22
47
|
class CodeGen(object):
|
|
23
48
|
def __init__(self, args):
|
|
24
49
|
self.args = args
|
|
25
50
|
self.codegen_version = __version__
|
|
26
|
-
pass
|
|
27
51
|
|
|
28
52
|
def _gen(self, idf_file, directory="."):
|
|
29
53
|
directory = os.path.realpath(directory)
|
|
@@ -32,12 +56,12 @@ class CodeGen(object):
|
|
|
32
56
|
os.makedirs(os.path.join(directory, "client"), exist_ok=True)
|
|
33
57
|
interface = self.get_interface(idf_file)
|
|
34
58
|
out_file = os.path.join(directory, "public", interface.name + ".xml")
|
|
35
|
-
interface.render_dbus_xml("interface.introspect.xml.mako", out_file
|
|
59
|
+
interface.render_dbus_xml("interface.introspect.xml.mako", out_file)
|
|
36
60
|
for code_type in ["server", "client", "public"]:
|
|
37
61
|
out_file = os.path.join(directory, code_type, interface.name + ".h")
|
|
38
|
-
interface.render_c_source(code_type + ".h.mako", out_file
|
|
62
|
+
interface.render_c_source(code_type + ".h.mako", out_file)
|
|
39
63
|
out_file = os.path.join(directory, code_type, interface.name + ".c")
|
|
40
|
-
interface.render_c_source(code_type + ".c.mako", out_file
|
|
64
|
+
interface.render_c_source(code_type + ".c.mako", out_file)
|
|
41
65
|
json_file = os.path.join(directory, "package.yml")
|
|
42
66
|
data = {
|
|
43
67
|
"version": interface.version,
|
|
@@ -55,7 +79,7 @@ class CodeGen(object):
|
|
|
55
79
|
|
|
56
80
|
def get_interface(self, idf_file):
|
|
57
81
|
lookup = TemplateLookup(directories=os.path.join(lb_cwd, "template"))
|
|
58
|
-
return IdfInterface(lookup, idf_file)
|
|
82
|
+
return IdfInterface(lookup, idf_file, self.codegen_version)
|
|
59
83
|
|
|
60
84
|
def run(self):
|
|
61
85
|
"""
|
|
@@ -67,12 +91,16 @@ class CodeGen(object):
|
|
|
67
91
|
prog="lbkit gen",
|
|
68
92
|
formatter_class=SmartFormatter)
|
|
69
93
|
# 默认的自动生成工具版本号为2
|
|
70
|
-
parser.add_argument("-cv", "--codegen_version", help=f'''must less than or equal to {__version__}, default:
|
|
94
|
+
parser.add_argument("-cv", "--codegen_version", help=f'''must less than or equal to {__version__.str}, default: {__version__.str}
|
|
95
|
+
format: major.version
|
|
96
|
+
for example: 1.3、2.4、3.3
|
|
97
|
+
|
|
71
98
|
description of changes:
|
|
72
|
-
|
|
73
|
-
|
|
99
|
+
4.x: compatible with lb_base/0.8.x
|
|
100
|
+
3.x: compatible with lb_base/0.7.x
|
|
101
|
+
2.x: compatible with lb_base/0.6.x
|
|
74
102
|
''',
|
|
75
|
-
type=
|
|
103
|
+
type=str, default=__version__.str)
|
|
76
104
|
parser.add_argument("-d", "--directory", help='generate code directory', default=".")
|
|
77
105
|
group2 = parser.add_argument_group('cdf file', 'Generate code using the specified CDF file')
|
|
78
106
|
group2.add_argument("-c", "--cdf_file", help='component description file, default metadata/package.yml', default=None)
|
|
@@ -86,7 +114,9 @@ class CodeGen(object):
|
|
|
86
114
|
raise ArgException(f"argument -c/--cdf_file: {args.cdf_file} not exist")
|
|
87
115
|
configs = Helper.read_yaml(args.cdf_file, "codegen", [])
|
|
88
116
|
# 为保障兼容,package.yml未指定版本号的,默认使用2,该版本配套lb_base/0.6.0版本,其LBProperty无set/get成员
|
|
89
|
-
|
|
117
|
+
ver_str = Helper.read_yaml(args.cdf_file, "codegen_version", args.codegen_version)
|
|
118
|
+
version_check(ver_str)
|
|
119
|
+
self.codegen_version = Version(ver_str)
|
|
90
120
|
for cfg in configs:
|
|
91
121
|
file = cfg.get("file")
|
|
92
122
|
if file is None:
|
|
@@ -101,15 +131,17 @@ class CodeGen(object):
|
|
|
101
131
|
outdir = cfg.get("outdir", os.getcwd())
|
|
102
132
|
self._gen(file, outdir)
|
|
103
133
|
return
|
|
134
|
+
else:
|
|
135
|
+
version_check(args.codegen_version)
|
|
136
|
+
self.codegen_version = Version(args.codegen_version)
|
|
104
137
|
|
|
105
138
|
intf_file = args.idf_file
|
|
106
139
|
if not intf_file:
|
|
107
140
|
raise ArgException(f"argument error, arguments -c/--cdf_file and -i/--idf_file are not set")
|
|
108
141
|
if not os.path.isfile(intf_file):
|
|
109
142
|
raise ArgException(f"argument -i/--idf_file: {args.idf_file} not exist")
|
|
110
|
-
if
|
|
111
|
-
raise ArgException(f"argument -
|
|
112
|
-
self.codegen_version = args.codegen_version
|
|
143
|
+
if self.codegen_version.bt(__version__.str):
|
|
144
|
+
raise ArgException(f"argument -cv/--codegen_version: validate failed, must less than or equal to {__version__.str}")
|
|
113
145
|
out_dir = os.path.join(os.getcwd(), args.directory)
|
|
114
146
|
if not intf_file.endswith(".yaml"):
|
|
115
147
|
raise ArgException(f"The IDF file ({intf_file}) not endswith .yaml")
|
|
@@ -9,6 +9,7 @@ from lbkit.codegen.ctype_defination import CTYPE_OBJS, RefObjArrayValidator, Ref
|
|
|
9
9
|
from lbkit.misc import load_yml_with_json_schema_validate
|
|
10
10
|
from lbkit.errors import OdfValidateException, LiteBmcException
|
|
11
11
|
from lbkit.helper import SigInvalidException, validate_glib_signature
|
|
12
|
+
from lbkit.utils.version import Version
|
|
12
13
|
|
|
13
14
|
log = Logger("gen_interface")
|
|
14
15
|
|
|
@@ -35,6 +36,7 @@ class IdfInterfaceBase(Renderer):
|
|
|
35
36
|
self.description = None
|
|
36
37
|
self.version = None
|
|
37
38
|
self.alias = None
|
|
39
|
+
self.codegen_version: Version = None
|
|
38
40
|
|
|
39
41
|
class IdfAnnotation():
|
|
40
42
|
def __init__(self, name, value):
|
|
@@ -929,7 +931,10 @@ class IdfEnumeration(IdfBase):
|
|
|
929
931
|
def odf_schema(self):
|
|
930
932
|
values = []
|
|
931
933
|
for prop in self.values.parameters:
|
|
932
|
-
|
|
934
|
+
if self.intf.codegen_version.lt("5.0"):
|
|
935
|
+
val = self.intf.name + "." + self.name + "." + prop.name
|
|
936
|
+
else:
|
|
937
|
+
val = prop.name
|
|
933
938
|
values.append(val)
|
|
934
939
|
|
|
935
940
|
odf = {
|
|
@@ -1030,7 +1035,7 @@ class IdfDictionary():
|
|
|
1030
1035
|
|
|
1031
1036
|
|
|
1032
1037
|
class IdfInterface(IdfInterfaceBase):
|
|
1033
|
-
def __init__(self, lookup, idf_file):
|
|
1038
|
+
def __init__(self, lookup, idf_file, codegen_version: Version):
|
|
1034
1039
|
if not idf_file.endswith(".yaml") and not idf_file.endswith(".yml"):
|
|
1035
1040
|
raise IDFException(f"IDF file {idf_file} neither endswith .yaml nor endswith .yml")
|
|
1036
1041
|
super().__init__()
|
|
@@ -1049,6 +1054,7 @@ class IdfInterface(IdfInterfaceBase):
|
|
|
1049
1054
|
self.description = None
|
|
1050
1055
|
self.version = None
|
|
1051
1056
|
self.alias = None
|
|
1057
|
+
self.codegen_version = codegen_version
|
|
1052
1058
|
self.load_elements()
|
|
1053
1059
|
|
|
1054
1060
|
@cached_property
|
|
@@ -1069,7 +1075,7 @@ class IdfInterface(IdfInterfaceBase):
|
|
|
1069
1075
|
if not realpath:
|
|
1070
1076
|
raise FileNotFoundError(f"Dependency interface {intf} not exist")
|
|
1071
1077
|
log.debug(f"Found dependency interface: {realpath}")
|
|
1072
|
-
deps[intf] = (IdfInterface(self.lookup, realpath))
|
|
1078
|
+
deps[intf] = (IdfInterface(self.lookup, realpath, self.codegen_version))
|
|
1073
1079
|
return deps
|
|
1074
1080
|
|
|
1075
1081
|
@cached_property
|
|
@@ -1233,8 +1239,8 @@ class IdfInterface(IdfInterfaceBase):
|
|
|
1233
1239
|
intf_stru = IdfStructure(self, idf, propety_key="properties")
|
|
1234
1240
|
self.structures[self.alias] = intf_stru
|
|
1235
1241
|
|
|
1236
|
-
def render_dbus_xml(self, template, out_file
|
|
1237
|
-
out = self.render(self.lookup, template, intf=self, codegen_version=codegen_version)
|
|
1242
|
+
def render_dbus_xml(self, template, out_file):
|
|
1243
|
+
out = self.render(self.lookup, template, intf=self, codegen_version=self.codegen_version)
|
|
1238
1244
|
hash = hashlib.sha256()
|
|
1239
1245
|
hash.update(out.encode('utf-8'))
|
|
1240
1246
|
self.introspect_xml_sha256 = hash.hexdigest()
|
|
@@ -1242,9 +1248,9 @@ class IdfInterface(IdfInterfaceBase):
|
|
|
1242
1248
|
with open(out_file, "w") as fd:
|
|
1243
1249
|
fd.write(out)
|
|
1244
1250
|
|
|
1245
|
-
def render_c_source(self, template, out_file
|
|
1251
|
+
def render_c_source(self, template, out_file):
|
|
1246
1252
|
|
|
1247
|
-
out = self.render(self.lookup, template, intf=self, codegen_version=codegen_version)
|
|
1253
|
+
out = self.render(self.lookup, template, intf=self, codegen_version=self.codegen_version)
|
|
1248
1254
|
with open(out_file, "w") as fd:
|
|
1249
1255
|
fd.write(out)
|
|
1250
1256
|
|
|
@@ -192,7 +192,7 @@ ${class_name}_Properties *${class_name}_properties(void)
|
|
|
192
192
|
return &${properties};
|
|
193
193
|
}
|
|
194
194
|
|
|
195
|
-
% if codegen_version
|
|
195
|
+
% if codegen_version.be("4.0"):
|
|
196
196
|
${class_name} ${class_name}_get(const gchar *well_known, const gchar *name)
|
|
197
197
|
{
|
|
198
198
|
return lb_impl._cli_get(&_${class_name}_interface, well_known, name);
|
|
@@ -110,7 +110,7 @@ ${class_name}_Properties *${class_name}_properties(void);
|
|
|
110
110
|
LBInterface *${class_name}_interface(void);
|
|
111
111
|
#define ${hump2underline(class_name).upper()} ${class_name}_interface()
|
|
112
112
|
|
|
113
|
-
% if codegen_version
|
|
113
|
+
% if codegen_version.be("4.0"):
|
|
114
114
|
/* notes: 对象变更加回调函数 */
|
|
115
115
|
typedef void (*${class_name}_on_changed_hook)(${class_name} lb_obj, gpointer user_data);
|
|
116
116
|
/* notes: 属性变更后回调,远程对象或本地对象变更后都会调用 */
|
|
@@ -265,6 +265,49 @@ gboolean _validate_odf_as_struct_${name}_v(yaml_document_t *doc, yaml_node_t *no
|
|
|
265
265
|
|
|
266
266
|
%endfor
|
|
267
267
|
% for name, enum in intf.enumerations.items():
|
|
268
|
+
% if codegen_version.be("5.0"):
|
|
269
|
+
## 枚举序列化和反序列化函数
|
|
270
|
+
static const gchar *_${name}StrMap[] = {
|
|
271
|
+
% for value in enum.values.parameters:
|
|
272
|
+
"${value.name}",
|
|
273
|
+
% endfor
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
const gchar *${name}_as_string(${name} value)
|
|
277
|
+
{
|
|
278
|
+
if (value >= _${name}_Invalid) {
|
|
279
|
+
return "_Invalid";
|
|
280
|
+
}
|
|
281
|
+
return _${name}StrMap[value];
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/* ${name}枚举类型序列化(enum转string)函数 */
|
|
285
|
+
GVariant *${name}_encode(${name} value)
|
|
286
|
+
{
|
|
287
|
+
## 非法值返回com.litebmc.Errors.Enum.Invalid
|
|
288
|
+
if (value > ${name}_${enum.values.parameters[len(enum.values.parameters) - 1].name}) {
|
|
289
|
+
return g_variant_new_string("_Invalid");
|
|
290
|
+
}
|
|
291
|
+
return g_variant_new_string(_${name}StrMap[value]);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/* ${name}枚举类型反序列化(string转enum)函数 */
|
|
295
|
+
${name} ${name}_decode(GVariant *in)
|
|
296
|
+
{
|
|
297
|
+
if (!in) {
|
|
298
|
+
return _${name}_Invalid;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
const gchar *in_val = g_variant_get_string(in, NULL);
|
|
302
|
+
for (int i = 0; i <= ${len(enum.values.parameters)}; i++) {
|
|
303
|
+
if (g_strcmp0(in_val, _${name}StrMap[i]) == 0) {
|
|
304
|
+
return (${name})i;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return _${name}_Invalid;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
% else:
|
|
268
311
|
## 枚举序列化和反序列化函数
|
|
269
312
|
static const gchar *_${name}StrMap[] = {
|
|
270
313
|
% for value in enum.values.parameters:
|
|
@@ -306,6 +349,7 @@ ${name} ${name}_decode(GVariant *in)
|
|
|
306
349
|
return _${name}Invalid;
|
|
307
350
|
}
|
|
308
351
|
|
|
352
|
+
% endif
|
|
309
353
|
/* ${name}枚举类型序列化(enum转string)函数 */
|
|
310
354
|
GVariant *${name}_encode_v(const ${name} *values, gsize n)
|
|
311
355
|
{
|
|
@@ -844,7 +888,7 @@ static GDBusPropertyInfo ${class_name}_property_${prop.name} =
|
|
|
844
888
|
% endif
|
|
845
889
|
% endfor
|
|
846
890
|
## 只有自动生成工具版本号大于等于3的才会生成get和set方法
|
|
847
|
-
% if codegen_version
|
|
891
|
+
% if codegen_version.be("3.0"):
|
|
848
892
|
% if len(intf.properties):
|
|
849
893
|
static LBBase *_get_real_object(${class_name} object)
|
|
850
894
|
{
|
|
@@ -895,7 +939,7 @@ static ${class_name}_Properties _${class_name}_properties =
|
|
|
895
939
|
.info = NULL, /* load from /usr/share/dbus-1/interfaces/${intf.name} by lb_init */
|
|
896
940
|
% endif
|
|
897
941
|
.offset = offsetof(struct _${class_name}, ${prop.name}),
|
|
898
|
-
% if codegen_version
|
|
942
|
+
% if codegen_version.be("3.0"):
|
|
899
943
|
.flags = ${prop.desc_flags},
|
|
900
944
|
.set = ${class_name}_set_${prop.name}_variant,
|
|
901
945
|
.get = ${class_name}_get_${prop.name}_variant
|
|
@@ -60,7 +60,11 @@ typedef enum {
|
|
|
60
60
|
% for value in enum.values.parameters:
|
|
61
61
|
${name}_${value.name},
|
|
62
62
|
% endfor
|
|
63
|
+
% if codegen_version.be("5.0"):
|
|
64
|
+
_${name}_Invalid,
|
|
65
|
+
% else:
|
|
63
66
|
_${name}Invalid,
|
|
67
|
+
% endif
|
|
64
68
|
} ${name};
|
|
65
69
|
const gchar *${name}_as_string(${name} value);
|
|
66
70
|
|
|
@@ -86,6 +86,19 @@ struct _${name} **_load_odf_as_${name}_v(yaml_document_t *doc, yaml_node_t *node
|
|
|
86
86
|
% for name, enum in intf.enumerations.items():
|
|
87
87
|
${name} _load_odf_as_${name}(yaml_document_t *doc, yaml_node_t *node)
|
|
88
88
|
{
|
|
89
|
+
% if codegen_version.be("5.0"):
|
|
90
|
+
g_assert(node->type == YAML_SCALAR_NODE);
|
|
91
|
+
if (node->type != YAML_SCALAR_NODE) {
|
|
92
|
+
return _${name}_Invalid;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
for (int i = 0; i <= ${len(enum.values.parameters)}; i++) {
|
|
96
|
+
if (g_strcmp0((const gchar *)node->data.scalar.value, ${name}_as_string(i)) == 0) {
|
|
97
|
+
return (${name})i;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return _${name}_Invalid;
|
|
101
|
+
% else:
|
|
89
102
|
g_assert(node->type == YAML_SCALAR_NODE);
|
|
90
103
|
if (node->type != YAML_SCALAR_NODE) {
|
|
91
104
|
return _${name}Invalid;
|
|
@@ -97,6 +110,7 @@ ${name} _load_odf_as_${name}(yaml_document_t *doc, yaml_node_t *node)
|
|
|
97
110
|
}
|
|
98
111
|
}
|
|
99
112
|
return _${name}Invalid;
|
|
113
|
+
% endif
|
|
100
114
|
}
|
|
101
115
|
|
|
102
116
|
${name} *_load_odf_as_${name}_v(yaml_document_t *doc, yaml_node_t *node, gsize *n)
|
|
@@ -468,7 +482,7 @@ ${class_name}_Properties *${class_name}_properties(void)
|
|
|
468
482
|
return &${properties};
|
|
469
483
|
}
|
|
470
484
|
|
|
471
|
-
% if codegen_version
|
|
485
|
+
% if codegen_version.be("4.0"):
|
|
472
486
|
${class_name} ${class_name}_get(const gchar *name)
|
|
473
487
|
{
|
|
474
488
|
return lb_impl._get(&_${class_name}_interface, name);
|
|
@@ -56,7 +56,7 @@ ${class_name}_Properties *${class_name}_properties(void);
|
|
|
56
56
|
|
|
57
57
|
#define ${hump2underline(class_name).upper()} ${class_name}_interface()
|
|
58
58
|
|
|
59
|
-
% if codegen_version
|
|
59
|
+
% if codegen_version.be("4.0"):
|
|
60
60
|
/* notes: 对象变更加回调函数 */
|
|
61
61
|
typedef void (*${class_name}_on_changed_hook)(${class_name} lb_obj, gpointer user_data);
|
|
62
62
|
/* notes: 属性变更后回调,远程对象或本地对象变更后都会调用 */
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"""环境准备"""
|
|
2
|
+
import re
|
|
3
|
+
|
|
4
|
+
X_VER = 0x7fff_ffff
|
|
5
|
+
|
|
6
|
+
class Version():
|
|
7
|
+
def __init__(self, ver_str):
|
|
8
|
+
if not re.match("^([0-9]|([1-9][0-9]*))\\.(x|[0-9]|([1-9][0-9]*))$", ver_str):
|
|
9
|
+
raise Exception("Version string {ver_str} not match with regex ^([0-9]|([1-9][0-9]*))\\.([0-9]|([1-9][0-9]*))$")
|
|
10
|
+
chunks = ver_str.split(".")
|
|
11
|
+
self.major = int(chunks[0])
|
|
12
|
+
if chunks[1] == "x":
|
|
13
|
+
self.minor = X_VER
|
|
14
|
+
else:
|
|
15
|
+
self.minor = int(chunks[1])
|
|
16
|
+
self.str = ver_str
|
|
17
|
+
|
|
18
|
+
def bt(self, next_ver):
|
|
19
|
+
next = Version(next_ver)
|
|
20
|
+
if self.major > next.major or (self.major == next.major and (self.minor > next.minor and self.minor != X_VER)):
|
|
21
|
+
return True
|
|
22
|
+
return False
|
|
23
|
+
|
|
24
|
+
def be(self, next_ver):
|
|
25
|
+
next = Version(next_ver)
|
|
26
|
+
if self.major > next.major or (self.major == next.major and self.minor >= next.minor):
|
|
27
|
+
return True
|
|
28
|
+
return False
|
|
29
|
+
|
|
30
|
+
def lt(self, next_ver):
|
|
31
|
+
next = Version(next_ver)
|
|
32
|
+
if self.major < next.major or (self.major == next.major and (self.minor < next.minor and next.minor != X_VER and next.minor != X_VER)):
|
|
33
|
+
return True
|
|
34
|
+
return False
|
|
35
|
+
|
|
36
|
+
def le(self, next_ver):
|
|
37
|
+
next = Version(next_ver)
|
|
38
|
+
if self.major < next.major or (self.major == next.major and (self.minor <= next.minor or self.minor == X_VER)):
|
|
39
|
+
return True
|
|
40
|
+
return False
|
|
41
|
+
|
|
@@ -4,8 +4,10 @@ import os
|
|
|
4
4
|
import tracemalloc
|
|
5
5
|
|
|
6
6
|
tracemalloc.start()
|
|
7
|
-
from lbkit.codegen.idf_interface import IdfInterface
|
|
7
|
+
from lbkit.codegen.idf_interface import IdfInterface
|
|
8
8
|
from lbkit import errors
|
|
9
|
+
from lbkit.codegen.codegen import __version__ as codegen_version
|
|
10
|
+
from lbkit.utils.version import Version
|
|
9
11
|
|
|
10
12
|
schema_dir = os.path.realpath(os.path.join(os.getcwd(), "..", "schema"))
|
|
11
13
|
|
|
@@ -86,39 +88,39 @@ class TestCodeGenClass(unittest.TestCase):
|
|
|
86
88
|
|
|
87
89
|
def test_validate_default_bool(self):
|
|
88
90
|
self.validate_boolean("b", "boolean", "true")
|
|
89
|
-
IdfInterface(None, self.tmp_file)
|
|
91
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
90
92
|
self.validate_boolean("b", "boolean", "false")
|
|
91
|
-
IdfInterface(None, self.tmp_file)
|
|
93
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
92
94
|
self.validate_boolean("b", "boolean", "False")
|
|
93
|
-
IdfInterface(None, self.tmp_file)
|
|
95
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
94
96
|
self.validate_boolean("b", "boolean", "True")
|
|
95
|
-
IdfInterface(None, self.tmp_file)
|
|
97
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
96
98
|
self.validate_boolean("b", "boolean", "ONsdf")
|
|
97
99
|
with self.assertRaises(errors.PackageConfigException):
|
|
98
|
-
IdfInterface(None, self.tmp_file)
|
|
100
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
99
101
|
self.validate_boolean("b", "boolean", "asdaffa")
|
|
100
102
|
with self.assertRaises(errors.PackageConfigException):
|
|
101
|
-
IdfInterface(None, self.tmp_file)
|
|
103
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
102
104
|
|
|
103
105
|
def test_validate_default_array_bool(self):
|
|
104
106
|
self.validate_boolean("b", "array[boolean]", "[false, true]")
|
|
105
|
-
IdfInterface(None, self.tmp_file)
|
|
107
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
106
108
|
self.validate_boolean("b", "array[boolean]", "[on, 1]")
|
|
107
109
|
# boolean值比较特殊,由json schema校验验证
|
|
108
110
|
with self.assertRaises(errors.PackageConfigException):
|
|
109
|
-
IdfInterface(None, self.tmp_file)
|
|
111
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
110
112
|
|
|
111
113
|
def validate_number(self, name, type):
|
|
112
114
|
self.mk_interface_with_number_property(name, type, "100", "1", "1")
|
|
113
|
-
IdfInterface(None, self.tmp_file)
|
|
115
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
114
116
|
self.mk_interface_with_number_property(name, type, "100", "1", "100")
|
|
115
|
-
IdfInterface(None, self.tmp_file)
|
|
117
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
116
118
|
self.mk_interface_with_number_property(name, type, "100", "1", "0")
|
|
117
119
|
with self.assertRaises(errors.OdfValidateException):
|
|
118
|
-
IdfInterface(None, self.tmp_file)
|
|
120
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
119
121
|
self.mk_interface_with_number_property(name, type, "100", "1", "101")
|
|
120
122
|
with self.assertRaises(errors.OdfValidateException):
|
|
121
|
-
IdfInterface(None, self.tmp_file)
|
|
123
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
122
124
|
|
|
123
125
|
def test_validate_default_byte(self):
|
|
124
126
|
self.validate_number("y", "byte")
|
|
@@ -152,15 +154,15 @@ class TestCodeGenClass(unittest.TestCase):
|
|
|
152
154
|
|
|
153
155
|
def validate_array_number(self, name, type):
|
|
154
156
|
self.mk_interface_with_number_property(name, f"array[{type}]", "100", "1", "[1, 1]")
|
|
155
|
-
IdfInterface(None, self.tmp_file)
|
|
157
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
156
158
|
self.mk_interface_with_number_property(name, f"array[{type}]", "100", "1", "[100, 100]")
|
|
157
|
-
IdfInterface(None, self.tmp_file)
|
|
159
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
158
160
|
self.mk_interface_with_number_property(name, f"array[{type}]", "100", "1", "[0, 0]")
|
|
159
161
|
with self.assertRaises(errors.OdfValidateException):
|
|
160
|
-
IdfInterface(None, self.tmp_file)
|
|
162
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
161
163
|
self.mk_interface_with_number_property(name, f"array[{type}]", "100", "1", "[101, 101]")
|
|
162
164
|
with self.assertRaises(errors.OdfValidateException):
|
|
163
|
-
IdfInterface(None, self.tmp_file)
|
|
165
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
164
166
|
|
|
165
167
|
def test_validate_default_array_byte(self):
|
|
166
168
|
self.validate_array_number("y", "byte")
|
|
@@ -195,88 +197,131 @@ class TestCodeGenClass(unittest.TestCase):
|
|
|
195
197
|
def test_validate_array_double(self):
|
|
196
198
|
self.mk_interface_with_double_property("double", f"array[double]", "[1, 1]", exclusive_max="100", exclusive_min="1")
|
|
197
199
|
with self.assertRaises(errors.OdfValidateException):
|
|
198
|
-
IdfInterface(None, self.tmp_file)
|
|
200
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
199
201
|
self.mk_interface_with_double_property("double", f"array[double]", "[100, 100]", exclusive_max="100", exclusive_min="1")
|
|
200
202
|
with self.assertRaises(errors.OdfValidateException):
|
|
201
|
-
IdfInterface(None, self.tmp_file)
|
|
203
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
202
204
|
self.mk_interface_with_double_property("double", f"array[double]", "[0.9, 0.9]", exclusive_max="100", exclusive_min="1")
|
|
203
205
|
with self.assertRaises(errors.OdfValidateException):
|
|
204
|
-
IdfInterface(None, self.tmp_file)
|
|
206
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
205
207
|
self.mk_interface_with_double_property("double", f"array[double]", "[100.1, 100.1]", exclusive_max="100", exclusive_min="1")
|
|
206
208
|
with self.assertRaises(errors.OdfValidateException):
|
|
207
|
-
IdfInterface(None, self.tmp_file)
|
|
209
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
208
210
|
|
|
209
211
|
def test_validate_double(self):
|
|
210
212
|
self.mk_interface_with_double_property("double", "double", "1", exclusive_max="100", exclusive_min="1")
|
|
211
213
|
with self.assertRaises(errors.OdfValidateException):
|
|
212
|
-
IdfInterface(None, self.tmp_file)
|
|
214
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
213
215
|
self.mk_interface_with_double_property("double", "double", "100", exclusive_max="100", exclusive_min="1")
|
|
214
216
|
with self.assertRaises(errors.OdfValidateException):
|
|
215
|
-
IdfInterface(None, self.tmp_file)
|
|
217
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
216
218
|
self.mk_interface_with_double_property("double", "double", "0.9", exclusive_max="100", exclusive_min="1")
|
|
217
219
|
with self.assertRaises(errors.OdfValidateException):
|
|
218
|
-
IdfInterface(None, self.tmp_file)
|
|
220
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
219
221
|
self.mk_interface_with_double_property("double", "double", "100.1", exclusive_max="100", exclusive_min="1")
|
|
220
222
|
with self.assertRaises(errors.OdfValidateException):
|
|
221
|
-
IdfInterface(None, self.tmp_file)
|
|
223
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
222
224
|
|
|
223
225
|
def test_validate_string(self):
|
|
224
226
|
self.mk_interface_with_string_property("string", "string", None, "as")
|
|
225
|
-
IdfInterface(None, self.tmp_file)
|
|
227
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
226
228
|
self.mk_interface_with_string_property("string", "string", "^a[s]{1,2}$", "as")
|
|
227
|
-
IdfInterface(None, self.tmp_file)
|
|
229
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
228
230
|
self.mk_interface_with_string_property("string", "string", "^a[s]{1,2}$", "ass")
|
|
229
|
-
IdfInterface(None, self.tmp_file)
|
|
231
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
230
232
|
self.mk_interface_with_string_property("string", "string", "^a[s]{1,2}$", "asss")
|
|
231
233
|
with self.assertRaises(errors.OdfValidateException):
|
|
232
|
-
IdfInterface(None, self.tmp_file)
|
|
234
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
233
235
|
self.mk_interface_with_string_property("string", "string", "^a[s]{1,2}$", "a")
|
|
234
236
|
with self.assertRaises(errors.OdfValidateException):
|
|
235
|
-
IdfInterface(None, self.tmp_file)
|
|
237
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
236
238
|
self.mk_interface_with_string_property("string", "string", "^a[s]{1,2}$", "0.123")
|
|
237
239
|
with self.assertRaises(errors.PackageConfigException):
|
|
238
|
-
IdfInterface(None, self.tmp_file)
|
|
240
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
239
241
|
|
|
240
242
|
def test_validate_array_string(self):
|
|
241
243
|
self.mk_interface_with_string_property("string", "array[string]", None, "[as, as]")
|
|
242
|
-
IdfInterface(None, self.tmp_file)
|
|
244
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
243
245
|
self.mk_interface_with_string_property("string", "array[string]", "^a[s]{1,2}$", "[as, as]")
|
|
244
|
-
IdfInterface(None, self.tmp_file)
|
|
246
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
245
247
|
self.mk_interface_with_string_property("string", "array[string]", "^a[s]{1,2}$", "[ass, ass]")
|
|
246
|
-
IdfInterface(None, self.tmp_file)
|
|
248
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
247
249
|
self.mk_interface_with_string_property("string", "array[string]", "^a[s]{1,2}$", "[asss, asss]")
|
|
248
250
|
with self.assertRaises(errors.OdfValidateException):
|
|
249
|
-
IdfInterface(None, self.tmp_file)
|
|
251
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
250
252
|
self.mk_interface_with_string_property("string", "array[string]", "^a[s]{1,2}$", "[a, a]")
|
|
251
253
|
with self.assertRaises(errors.OdfValidateException):
|
|
252
|
-
IdfInterface(None, self.tmp_file)
|
|
254
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
253
255
|
self.mk_interface_with_string_property("string", "array[string]", "^a[s]{1,2}$", "[0.123, 0.123]")
|
|
254
256
|
with self.assertRaises(errors.PackageConfigException):
|
|
255
|
-
IdfInterface(None, self.tmp_file)
|
|
257
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
256
258
|
|
|
257
259
|
def test_validate_object_path(self):
|
|
258
260
|
self.mk_interface_with_string_property("object_path", "object_path", None, "/as")
|
|
259
|
-
IdfInterface(None, self.tmp_file)
|
|
261
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
260
262
|
self.mk_interface_with_string_property("object_path", "object_path", None, "/a/s")
|
|
261
|
-
IdfInterface(None, self.tmp_file)
|
|
263
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
262
264
|
self.mk_interface_with_string_property("object_path", "object_path", None, "a/s")
|
|
263
265
|
with self.assertRaises(errors.PackageConfigException):
|
|
264
|
-
IdfInterface(None, self.tmp_file)
|
|
266
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
265
267
|
self.mk_interface_with_string_property("object_path", "object_path", None, "/a/s/")
|
|
266
268
|
with self.assertRaises(errors.PackageConfigException):
|
|
267
|
-
IdfInterface(None, self.tmp_file)
|
|
269
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
268
270
|
|
|
269
271
|
def test_validate_array_object_path(self):
|
|
270
272
|
self.mk_interface_with_string_property("object_path", "array[object_path]", None, "[/as, /as]")
|
|
271
|
-
IdfInterface(None, self.tmp_file)
|
|
273
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
272
274
|
self.mk_interface_with_string_property("object_path", "array[object_path]", None, "[/a/s, /a]")
|
|
273
|
-
IdfInterface(None, self.tmp_file)
|
|
275
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
274
276
|
self.mk_interface_with_string_property("object_path", "array[object_path]", None, "[a/s, a/s]")
|
|
275
277
|
with self.assertRaises(errors.PackageConfigException):
|
|
276
|
-
IdfInterface(None, self.tmp_file)
|
|
278
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
277
279
|
self.mk_interface_with_string_property("object_path", "array[object_path]", None, "[/a/s/, /a/s/]")
|
|
278
280
|
with self.assertRaises(errors.PackageConfigException):
|
|
279
|
-
IdfInterface(None, self.tmp_file)
|
|
281
|
+
IdfInterface(None, self.tmp_file, codegen_version)
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
class TestVersionClass(unittest.TestCase):
|
|
285
|
+
def test_version_bt(self):
|
|
286
|
+
self.assertTrue(Version("5.2").bt("5.1"))
|
|
287
|
+
self.assertTrue(Version("6.2").bt("5.1"))
|
|
288
|
+
self.assertTrue(Version("6.2").bt("5.2"))
|
|
289
|
+
self.assertTrue(Version("6.2").bt("5.3"))
|
|
290
|
+
self.assertFalse(Version("5.x").bt("5.1"))
|
|
291
|
+
self.assertFalse(Version("5.x").bt("5.x"))
|
|
292
|
+
self.assertFalse(Version("5.1").bt("5.2"))
|
|
293
|
+
self.assertFalse(Version("5.2").bt("5.2"))
|
|
294
|
+
self.assertFalse(Version("4.2").bt("5.2"))
|
|
295
|
+
self.assertFalse(Version("4.x").bt("5.2"))
|
|
296
|
+
self.assertFalse(Version("4.x").bt("5.x"))
|
|
297
|
+
|
|
298
|
+
def test_version_be(self):
|
|
299
|
+
self.assertTrue(Version("5.2").be("5.2"))
|
|
300
|
+
self.assertTrue(Version("5.x").be("5.3"))
|
|
301
|
+
self.assertTrue(Version("5.x").be("5.x"))
|
|
302
|
+
self.assertFalse(Version("5.1").be("5.x"))
|
|
303
|
+
|
|
304
|
+
def test_version_le(self):
|
|
305
|
+
self.assertFalse(Version("5.2").le("5.1"))
|
|
306
|
+
self.assertFalse(Version("6.2").le("5.1"))
|
|
307
|
+
self.assertFalse(Version("6.2").le("5.2"))
|
|
308
|
+
self.assertFalse(Version("6.2").le("5.3"))
|
|
309
|
+
self.assertTrue(Version("5.x").le("5.1"))
|
|
310
|
+
self.assertTrue(Version("5.x").le("5.x"))
|
|
311
|
+
self.assertTrue(Version("5.1").le("5.2"))
|
|
312
|
+
self.assertTrue(Version("5.2").le("5.2"))
|
|
313
|
+
self.assertTrue(Version("4.2").le("5.2"))
|
|
314
|
+
self.assertTrue(Version("4.x").le("5.2"))
|
|
315
|
+
self.assertTrue(Version("4.x").le("5.x"))
|
|
316
|
+
|
|
317
|
+
def test_version_lt(self):
|
|
318
|
+
self.assertFalse(Version("5.2").lt("5.2"))
|
|
319
|
+
self.assertFalse(Version("5.x").lt("5.3"))
|
|
320
|
+
self.assertFalse(Version("5.x").lt("5.x"))
|
|
321
|
+
self.assertFalse(Version("5.1").lt("5.x"))
|
|
322
|
+
self.assertTrue(Version("5.1").lt("5.2"))
|
|
323
|
+
self.assertTrue(Version("4.3").lt("5.2"))
|
|
324
|
+
self.assertTrue(Version("4.3").lt("5.3"))
|
|
280
325
|
|
|
281
326
|
|
|
282
327
|
if __name__ == "__main__":
|
lbkit-0.7.2/lbkit/__init__.py
DELETED
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|