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.
Files changed (60) hide show
  1. {lbkit-0.7.2/lbkit.egg-info → lbkit-0.7.4}/PKG-INFO +1 -1
  2. lbkit-0.7.4/lbkit/__init__.py +2 -0
  3. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/codegen.py +46 -14
  4. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/idf_interface.py +13 -7
  5. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/template/client.c.mako +1 -1
  6. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/template/client.h.mako +1 -1
  7. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/template/public.c.mako +46 -2
  8. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/template/public.h.mako +4 -0
  9. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/template/server.c.mako +15 -1
  10. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/template/server.h.mako +1 -1
  11. lbkit-0.7.4/lbkit/utils/version.py +41 -0
  12. {lbkit-0.7.2 → lbkit-0.7.4/lbkit.egg-info}/PKG-INFO +1 -1
  13. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit.egg-info/SOURCES.txt +1 -0
  14. {lbkit-0.7.2 → lbkit-0.7.4}/test/test_codegen.py +90 -45
  15. lbkit-0.7.2/lbkit/__init__.py +0 -2
  16. {lbkit-0.7.2 → lbkit-0.7.4}/AUTHORS +0 -0
  17. {lbkit-0.7.2 → lbkit-0.7.4}/LICENSE +0 -0
  18. {lbkit-0.7.2 → lbkit-0.7.4}/MANIFEST.in +0 -0
  19. {lbkit-0.7.2 → lbkit-0.7.4}/README.md +0 -0
  20. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/build_conan_parallel.py +0 -0
  21. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/ci_robot/__init__.py +0 -0
  22. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/ci_robot/gitee.py +0 -0
  23. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/cli.py +0 -0
  24. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/__init__.py +0 -0
  25. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/ctype_defination.py +0 -0
  26. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/renderer.py +0 -0
  27. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/template/interface.c.mako +0 -0
  28. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/codegen/template/interface.introspect.xml.mako +0 -0
  29. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/component/__init__.py +0 -0
  30. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/component/arg_parser.py +0 -0
  31. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/component/build.py +0 -0
  32. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/component/template/conanbase.mako +0 -0
  33. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/component/template/deploy.mako +0 -0
  34. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/component/test.py +0 -0
  35. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/errors.py +0 -0
  36. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/helper.py +0 -0
  37. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/__init__.py +0 -0
  38. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/build_image.py +0 -0
  39. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/build_manifest.py +0 -0
  40. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/build_prepare.py +0 -0
  41. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/build_rootfs.py +0 -0
  42. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/config.py +0 -0
  43. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/task.py +0 -0
  44. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/template/conanfile.py.mako +0 -0
  45. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/integration/template/rootfs.py.mako +0 -0
  46. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/lbkit.py +0 -0
  47. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/log.py +0 -0
  48. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/misc.py +0 -0
  49. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/tools.py +0 -0
  50. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/utils/__init__.py +0 -0
  51. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/utils/images/__init__.py +0 -0
  52. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit/utils/images/emmc.py +0 -0
  53. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit.egg-info/dependency_links.txt +0 -0
  54. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit.egg-info/entry_points.txt +0 -0
  55. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit.egg-info/requires.txt +0 -0
  56. {lbkit-0.7.2 → lbkit-0.7.4}/lbkit.egg-info/top_level.txt +0 -0
  57. {lbkit-0.7.2 → lbkit-0.7.4}/setup.cfg +0 -0
  58. {lbkit-0.7.2 → lbkit-0.7.4}/setup.py +0 -0
  59. {lbkit-0.7.2 → lbkit-0.7.4}/test/__init__.py +0 -0
  60. {lbkit-0.7.2 → lbkit-0.7.4}/test/test_helper.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: lbkit
3
- Version: 0.7.2
3
+ Version: 0.7.4
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.7.4'
@@ -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
- __version__=4
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, self.codegen_version)
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, self.codegen_version)
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, self.codegen_version)
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: 2
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
- 3: compatible with lb_base/0.7.x
73
- 2: compatible with lb_base/0.6.x
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=int, default=2)
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
- self.codegen_version = Helper.read_yaml(args.cdf_file, "codegen_version", 2)
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 args.codegen_version > __version__ or args.codegen_version <= 0:
111
- raise ArgException(f"argument -v/--codegen_version: validate failed, must less than or equal to {__version__} and bigger than 0")
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
- val = self.intf.name + "." + self.name + "." + prop.name
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, codegen_version):
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, codegen_version):
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 >= 4:
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 >= 4:
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 >= 3:
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 >= 3:
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 >= 4:
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 >= 4:
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
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: lbkit
3
- Version: 0.7.2
3
+ Version: 0.7.4
4
4
  Summary: Tools provided by litebmc.com
5
5
  Home-page: https://www.litebmc.com
6
6
  Author: xuhj@litebmc.com
@@ -49,6 +49,7 @@ lbkit/integration/task.py
49
49
  lbkit/integration/template/conanfile.py.mako
50
50
  lbkit/integration/template/rootfs.py.mako
51
51
  lbkit/utils/__init__.py
52
+ lbkit/utils/version.py
52
53
  lbkit/utils/images/__init__.py
53
54
  lbkit/utils/images/emmc.py
54
55
  test/__init__.py
@@ -4,8 +4,10 @@ import os
4
4
  import tracemalloc
5
5
 
6
6
  tracemalloc.start()
7
- from lbkit.codegen.idf_interface import IdfInterface, IdfProperty
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__":
@@ -1,2 +0,0 @@
1
-
2
- __version__ = '0.7.2'
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