buildz 0.6.1__tar.gz → 0.6.2__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.
- {buildz-0.6.1/buildz.egg-info → buildz-0.6.2}/PKG-INFO +1 -1
- buildz-0.6.2/buildz/xf/code.py +71 -0
- buildz-0.6.2/buildz/xf/code_modify.py +71 -0
- buildz-0.6.2/buildz/xf/loaderz/deal/strz.py +284 -0
- buildz-0.6.1/buildz/xf/loaderz/deal/strz.py → buildz-0.6.2/buildz/xf/loaderz/deal/strz_new.py +1 -0
- buildz-0.6.2/buildz/xf/loaderz/deal/strz_old.py +197 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loaderz/test.py +4 -3
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/readz.py +5 -0
- {buildz-0.6.1 → buildz-0.6.2/buildz.egg-info}/PKG-INFO +1 -1
- {buildz-0.6.1 → buildz-0.6.2}/buildz.egg-info/SOURCES.txt +4 -0
- {buildz-0.6.1 → buildz-0.6.2}/setup.py +1 -1
- {buildz-0.6.1 → buildz-0.6.2}/LICENSE +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/MANIFEST.in +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/README.md +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/__init__.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/__main__.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/argx.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/cmd.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/db/__main__.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/db/dv/basez.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/db/dv/clickhousez.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/db/dv/lib/readme +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/db/dv/mysqlz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/db/dv/oraclez.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/db/dv/structz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/db/install.txt +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/db/run.conf +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/db/runz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/ioc/deal.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/ioc/help.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/myers/deal.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/myers/help.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/res/conf/ioc.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/res/conf/main.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/res/conf/myers.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/res/conf/search.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/res/conf/xf.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/res/help/default.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/res/help/ioc.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/res/help/myers.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/res/help/search.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/res/help/xf.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/res/test.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/search/deal.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/search/help.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/test.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/xf/deal.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/demo/xf/help.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/fz/__init__.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/fz/dirz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/fz/fhs.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/fz/fio.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/fz/lsf.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/__init__.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/base.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/init.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc/base.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc/conf.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc/confs.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc/single.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/base.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/call.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/calls.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/call_defaults.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/call_lists.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/calls_defaults.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/calls_lists.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/deal_lists.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/deals.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/env_lists.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/ioc_lists.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/iocf_lists.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/join_lists.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/list_lists.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/map_lists.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/mcall_defaults.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/mcall_lists.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/obj_cst_lists.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/obj_defaults.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/obj_lists.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/obj_set_lists.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/ovar_lists.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/ref_lists.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/var_lists.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/xfile_defaults.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/conf/xfile_lists.js +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/deal.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/demo.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/env.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/ioc.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/iocf.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/join.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/list.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/map.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/mcall.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/obj.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/ovar.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/ref.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/val.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/var.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/ioc/ioc_deal/xfile.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/pyz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/tz/__init__.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/tz/myers_diff.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/__init__.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/__main__.py +0 -0
- /buildz-0.6.1/buildz/xf/code.py → /buildz-0.6.2/buildz/xf/copy_old.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/file.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loader/base.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loader/buffer.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loader/deal/listz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loader/deal/lr.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loader/deal/lrval.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loader/deal/mapz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loader/deal/nextz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loader/deal/reval.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loader/deal/setz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loader/deal/spc.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loader/deal/spt.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loader/deal/strz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loader/exp.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loader/item.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loader/mg.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loader/pos.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loaderz/base.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loaderz/buffer.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loaderz/deal/listz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loaderz/deal/lr.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loaderz/deal/lrval.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loaderz/deal/mapz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loaderz/deal/nextz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loaderz/deal/reval.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loaderz/deal/setz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loaderz/deal/spc.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loaderz/deal/spt.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loaderz/exp.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loaderz/item.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loaderz/mg.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loaderz/pos.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/loaderz/test1.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/mapz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/read.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/stack.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/write.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/writer/base.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/writer/conf.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/writer/deal/jsonval.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/writer/deal/listz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/writer/deal/mapz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/writer/deal/reval.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/writer/deal/strz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/writer/itemz.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/writer/mg.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz/xf/xargs.py +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz.egg-info/dependency_links.txt +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/buildz.egg-info/top_level.txt +0 -0
- {buildz-0.6.1 → buildz-0.6.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: buildz
|
3
|
-
Version: 0.6.
|
3
|
+
Version: 0.6.2
|
4
4
|
Summary: 配置读写(基于json格式进行简化)、ioc、以及其他工具代码。a json-base file format's read and write code by python, and codes to read and product object from configure file in such format(ioc), and other tool codes
|
5
5
|
Home-page: https://github.com/buildCodeZ/buildz
|
6
6
|
Author: Zzz
|
@@ -0,0 +1,71 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
maps = {
|
4
|
+
'"': '"', '\\': '\\', '/': '/',
|
5
|
+
'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t',
|
6
|
+
}
|
7
|
+
bmaps = {k.encode()[0]:v.encode()[0] for k,v in maps.items()}
|
8
|
+
barr = [-1]*256
|
9
|
+
for k,v in bmaps.items():
|
10
|
+
barr[k] = v
|
11
|
+
|
12
|
+
pass
|
13
|
+
def ustr(s):
|
14
|
+
i = 0
|
15
|
+
l=len(s)
|
16
|
+
rs = ""
|
17
|
+
while i<l:
|
18
|
+
c = s[i]
|
19
|
+
i+=1
|
20
|
+
if c == '\\':
|
21
|
+
x = s[i]
|
22
|
+
i+=1
|
23
|
+
if x == 'u':
|
24
|
+
v = int(s[i:i+4], 16)
|
25
|
+
r = chr(v)
|
26
|
+
rs+=r
|
27
|
+
i+=4
|
28
|
+
continue
|
29
|
+
elif x in maps:
|
30
|
+
r = maps[x]
|
31
|
+
rs+=r
|
32
|
+
continue
|
33
|
+
rs+=c
|
34
|
+
return rs
|
35
|
+
|
36
|
+
pass
|
37
|
+
bl2,bu = b'\\u'
|
38
|
+
def ubytes(s, code = "utf-8"):
|
39
|
+
i = 0
|
40
|
+
l=len(s)
|
41
|
+
rs = b""
|
42
|
+
rs = []
|
43
|
+
while i<l:
|
44
|
+
c = s[i]
|
45
|
+
i+=1
|
46
|
+
if c != bl2:
|
47
|
+
rs.append(c)
|
48
|
+
continue
|
49
|
+
x = s[i]
|
50
|
+
i+=1
|
51
|
+
rx = barr[x]
|
52
|
+
if rx>=0:
|
53
|
+
rs.append(rx)
|
54
|
+
continue
|
55
|
+
elif x == bu:
|
56
|
+
v = int(s[i:i+4], 16)
|
57
|
+
r = chr(v).encode(code)
|
58
|
+
rs+=list(r)
|
59
|
+
i+=4
|
60
|
+
continue
|
61
|
+
rs.append(c)
|
62
|
+
rs.append(x)
|
63
|
+
#print(rs)
|
64
|
+
rs = bytes(rs)
|
65
|
+
return rs
|
66
|
+
|
67
|
+
pass
|
68
|
+
def ub2s(s, code = "utf-8"):
|
69
|
+
return ubytes(s, code).decode(code)
|
70
|
+
|
71
|
+
pass
|
@@ -0,0 +1,71 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
maps = {
|
4
|
+
'"': '"', '\\': '\\', '/': '/',
|
5
|
+
'b': '\b', 'f': '\f', 'n': '\n', 'r': '\r', 't': '\t',
|
6
|
+
}
|
7
|
+
bmaps = {k.encode()[0]:v.encode()[0] for k,v in maps.items()}
|
8
|
+
barr = [-1]*256
|
9
|
+
for k,v in bmaps.items():
|
10
|
+
barr[k] = v
|
11
|
+
|
12
|
+
pass
|
13
|
+
def ustr(s):
|
14
|
+
i = 0
|
15
|
+
l=len(s)
|
16
|
+
rs = ""
|
17
|
+
while i<l:
|
18
|
+
c = s[i]
|
19
|
+
i+=1
|
20
|
+
if c == '\\':
|
21
|
+
x = s[i]
|
22
|
+
i+=1
|
23
|
+
if x == 'u':
|
24
|
+
v = int(s[i:i+4], 16)
|
25
|
+
r = chr(v)
|
26
|
+
rs+=r
|
27
|
+
i+=4
|
28
|
+
continue
|
29
|
+
elif x in maps:
|
30
|
+
r = maps[x]
|
31
|
+
rs+=r
|
32
|
+
continue
|
33
|
+
rs+=c
|
34
|
+
return rs
|
35
|
+
|
36
|
+
pass
|
37
|
+
bl2,bu = b'\\u'
|
38
|
+
def ubytes(s, code = "utf-8"):
|
39
|
+
i = 0
|
40
|
+
l=len(s)
|
41
|
+
rs = b""
|
42
|
+
rs = []
|
43
|
+
while i<l:
|
44
|
+
c = s[i]
|
45
|
+
i+=1
|
46
|
+
if c != bl2:
|
47
|
+
rs.append(c)
|
48
|
+
continue
|
49
|
+
x = s[i]
|
50
|
+
i+=1
|
51
|
+
rx = barr[x]
|
52
|
+
if rx>=0:
|
53
|
+
rs.append(rx)
|
54
|
+
continue
|
55
|
+
elif x == bu:
|
56
|
+
v = int(s[i:i+4], 16)
|
57
|
+
r = chr(v).encode(code)
|
58
|
+
rs+=list(r)
|
59
|
+
i+=4
|
60
|
+
continue
|
61
|
+
rs.append(c)
|
62
|
+
rs.append(x)
|
63
|
+
#print(rs)
|
64
|
+
rs = bytes(rs)
|
65
|
+
return rs
|
66
|
+
|
67
|
+
pass
|
68
|
+
def ub2s(s, code = "utf-8"):
|
69
|
+
return ubytes(s, code).decode(code)
|
70
|
+
|
71
|
+
pass
|
@@ -0,0 +1,284 @@
|
|
1
|
+
from .. import base
|
2
|
+
from .. import item
|
3
|
+
from .. import exp
|
4
|
+
from ... import file
|
5
|
+
from ... import code as codez
|
6
|
+
from . import lr
|
7
|
+
|
8
|
+
def init():
|
9
|
+
cs = "abfnrtv\\'\"?0123456789xcde"
|
10
|
+
maps = {k:k.encode()[0] for k in cs}
|
11
|
+
global c2b
|
12
|
+
c2b = maps
|
13
|
+
global special_keys
|
14
|
+
special_keys = [-1]*256
|
15
|
+
s = "abfnrtv\\'\""
|
16
|
+
ts = b"\a\b\f\n\r\t\v\\\'\""
|
17
|
+
for c,t in zip(s, ts):
|
18
|
+
special_keys[c2b[c]] = t
|
19
|
+
symbal_a = [False]*256
|
20
|
+
for c in s:
|
21
|
+
symbal_a[c2b[c]] = True
|
22
|
+
global id_0,id_a,id_x,id_A
|
23
|
+
global c2nums
|
24
|
+
c2nums = [-1]*256
|
25
|
+
id_0,id_a,id_A,id_x,id_u = b'0aAxu'
|
26
|
+
for i in range(128):
|
27
|
+
v = i-id_0
|
28
|
+
if v>=0 and v<=9:
|
29
|
+
c2nums[i] = v
|
30
|
+
continue
|
31
|
+
v = i-id_a
|
32
|
+
if v>=0 and v<=5:
|
33
|
+
c2nums[i]=v+10
|
34
|
+
continue
|
35
|
+
v = i-id_A
|
36
|
+
if v>=0 and v<=5:
|
37
|
+
c2nums[i]=v+10
|
38
|
+
|
39
|
+
pass
|
40
|
+
init()
|
41
|
+
def cs2num(bts, base, min, max, oct = False):
|
42
|
+
cnt = 0
|
43
|
+
rst = 0
|
44
|
+
mv = 4
|
45
|
+
if oct:
|
46
|
+
mv = 3
|
47
|
+
for i in range(max):
|
48
|
+
if base+i>=len(bts):
|
49
|
+
if i<min:
|
50
|
+
return -1,0
|
51
|
+
else:
|
52
|
+
break
|
53
|
+
bt = bts[base+i]
|
54
|
+
v = c2nums[bt]
|
55
|
+
if v<0 or (oct and v>9):
|
56
|
+
if i<min:
|
57
|
+
return -1,0
|
58
|
+
else:
|
59
|
+
break
|
60
|
+
cnt+=1
|
61
|
+
rst = (rst<<mv)|v
|
62
|
+
return rst, cnt
|
63
|
+
|
64
|
+
pass
|
65
|
+
def decode_u(val):
|
66
|
+
"""
|
67
|
+
1 byte: 7 0?
|
68
|
+
2 byte: 11 110? 10?
|
69
|
+
3 byte: 16 1110? 10? 10?
|
70
|
+
4 byte: 21 11110? 10? 10? 10?
|
71
|
+
"""
|
72
|
+
if val<0x80:
|
73
|
+
return [val]
|
74
|
+
elif val<0x800:
|
75
|
+
b0 = 0x80|(val&0x7f)
|
76
|
+
b1 = 0x60|(val>>6)
|
77
|
+
return [b1, b0]
|
78
|
+
elif val<0x10000:
|
79
|
+
b0 = 0x80|(val&0x3f)
|
80
|
+
val>>=6
|
81
|
+
b1 = 0x80|(val&0x3f)
|
82
|
+
b2 = 0xe0|(val>>6)
|
83
|
+
return [b2,b1,b0]
|
84
|
+
else:
|
85
|
+
b0 = 0x80|(val&0x3f)
|
86
|
+
val>>=6
|
87
|
+
b1 = 0x80|(val&0x3f)
|
88
|
+
val>>=6
|
89
|
+
b2 = 0x80|(val&0x3f)
|
90
|
+
b3 = 0xf0|(val>>6)
|
91
|
+
return [b3,b2,b1,b0]
|
92
|
+
|
93
|
+
pass
|
94
|
+
def translate_bts(bts, octs = None, hexs = None):
|
95
|
+
i = 0
|
96
|
+
rs = []
|
97
|
+
while i<len(bts):
|
98
|
+
c = bts[i]
|
99
|
+
i+=1
|
100
|
+
if c!=c2b['\\']:
|
101
|
+
rs.append(c)
|
102
|
+
continue
|
103
|
+
x0 = bts[i]
|
104
|
+
i+=1
|
105
|
+
if special_keys[x0]>=0:
|
106
|
+
rs.append(special_keys[x0])
|
107
|
+
continue
|
108
|
+
if x0==b'u'[0]:
|
109
|
+
c_val, c_cnt = cs2num(bts, i, 4,4, 0)
|
110
|
+
if c_cnt==0:
|
111
|
+
raise Exception("\\uXXXX error")
|
112
|
+
tmp = decode_u(c_val)
|
113
|
+
i+=c_cnt
|
114
|
+
rs+=tmp
|
115
|
+
continue
|
116
|
+
if x0==id_x:
|
117
|
+
c_val, c_cnt = cs2num(bts, i, 2, 2, 0)
|
118
|
+
if c_cnt==0:
|
119
|
+
raise Exception("\\xXX error")
|
120
|
+
if hexs is not None:
|
121
|
+
tmp = hexs[c_val]
|
122
|
+
else:
|
123
|
+
tmp = [c_val]
|
124
|
+
rs+=tmp
|
125
|
+
i+=c_cnt
|
126
|
+
continue
|
127
|
+
c_val,c_cnt = cs2num(bts, i-1, 1, 3, 1)
|
128
|
+
if c_cnt>0:
|
129
|
+
if octs is not None:
|
130
|
+
tmp = octs[c_val]
|
131
|
+
else:
|
132
|
+
tmp = [c_val%256]
|
133
|
+
rs+=tmp
|
134
|
+
i+=c_cnt-1
|
135
|
+
continue
|
136
|
+
rs.append(c)
|
137
|
+
rs.append(x0)
|
138
|
+
#i-=1
|
139
|
+
return bytes(rs)
|
140
|
+
|
141
|
+
pass
|
142
|
+
def gen_chars(code="utf-8"):
|
143
|
+
simple = "abfnrtv\\'\""
|
144
|
+
octs = [0]*512
|
145
|
+
hexs = [0]*256
|
146
|
+
for i in range(512):
|
147
|
+
if i<256:
|
148
|
+
vhex = hex(i)[2:]
|
149
|
+
if len(vhex)==1:
|
150
|
+
vhex = "0"+vhex
|
151
|
+
cmd = f"'\\x{vhex}'"
|
152
|
+
hexs[i] = list(eval(cmd).encode(code))
|
153
|
+
voct = oct(i)[2:]
|
154
|
+
cmd = f"'\\{voct}'"
|
155
|
+
octs[i] = list(eval(cmd).encode(code))
|
156
|
+
return octs, hexs
|
157
|
+
|
158
|
+
pass
|
159
|
+
class PrevStrDeal(lr.LRDeal):
|
160
|
+
def types(self):
|
161
|
+
if not self.deal_build:
|
162
|
+
return []
|
163
|
+
return ['str']
|
164
|
+
def build(self, obj):
|
165
|
+
obj.is_val = 1
|
166
|
+
if self.translate:
|
167
|
+
val = obj.val
|
168
|
+
val = self.do_translate(val)
|
169
|
+
obj.val = val
|
170
|
+
return obj
|
171
|
+
def prepare(self, mg):
|
172
|
+
super().prepare(mg)
|
173
|
+
self.as_bytes = mg.as_bytes
|
174
|
+
#if not self.as_bytes:
|
175
|
+
# self.octs,self.hexs = gen_chars()
|
176
|
+
self.label_l2 = mg.like("\\")
|
177
|
+
self.label_qt = mg.like('"')
|
178
|
+
self.label_et = mg.like("\n")
|
179
|
+
self.label_lr = mg.like("\r")
|
180
|
+
self.label_nl = mg.like("")
|
181
|
+
self.et_in_right = self.right.count(self.label_et)
|
182
|
+
def init(self, left = '"', right= '"', single_line = False, note = False, translate = False, deal_build = False):
|
183
|
+
super().init(left, right, 'str')
|
184
|
+
self.single_line = single_line
|
185
|
+
self.note = note
|
186
|
+
self.translate = translate
|
187
|
+
self.deal_build = deal_build
|
188
|
+
self.as_bytes = True
|
189
|
+
self.octs = None
|
190
|
+
self.hexs = None
|
191
|
+
def json_loads(self, s):
|
192
|
+
import json
|
193
|
+
x = s
|
194
|
+
cd = None
|
195
|
+
if type(x)==bytes:
|
196
|
+
x, cd = file.decode_c(x)
|
197
|
+
rs = json.loads(x)
|
198
|
+
if type(s)==bytes:
|
199
|
+
rs = rs.encode(cd)
|
200
|
+
return rs
|
201
|
+
def do_translate(self, s):
|
202
|
+
"""
|
203
|
+
取巧用python的eval来生成字符表
|
204
|
+
"""
|
205
|
+
is_bytes = type(s)==bytes
|
206
|
+
if is_bytes:
|
207
|
+
return codez.ubytes(s, "utf-8")
|
208
|
+
else:
|
209
|
+
return codez.ub2s(s.encode("utf-8"), "utf-8")
|
210
|
+
return codez.ustr(s)
|
211
|
+
if not is_bytes:
|
212
|
+
s = s.encode("utf-8")
|
213
|
+
#s = s.decode("unicode_escape")
|
214
|
+
s = translate_bts(s, self.octs, self.hexs)
|
215
|
+
if is_bytes:
|
216
|
+
#s = s.encode("utf-8")
|
217
|
+
s = s.decode("utf-8")
|
218
|
+
return s
|
219
|
+
"""
|
220
|
+
取巧直接调用json
|
221
|
+
"""
|
222
|
+
qt = self.label_qt
|
223
|
+
ql = self.label_l2
|
224
|
+
et = self.label_et
|
225
|
+
tr = self.label_lr
|
226
|
+
nt = self.label_nl
|
227
|
+
pt = ql+qt
|
228
|
+
arr = s.split(pt)
|
229
|
+
arr = [k.replace(qt, pt) for k in arr]
|
230
|
+
s = pt.join(arr)
|
231
|
+
#s = s.replace(qt, ql+qt)
|
232
|
+
s = s.replace(tr, nt)
|
233
|
+
arr = s.split(et)
|
234
|
+
outs = [self.json_loads(qt+k+qt) for k in arr]
|
235
|
+
outs = et.join(outs)
|
236
|
+
return outs
|
237
|
+
def deal(self, buffer, rst, mg):
|
238
|
+
cl = buffer.read(self.ll)
|
239
|
+
if cl != self.left:
|
240
|
+
return False
|
241
|
+
rm = buffer.full().strip()
|
242
|
+
buffer.clean2read(self.ll)
|
243
|
+
if len(rm)>0:
|
244
|
+
if not self.note:
|
245
|
+
raise Exception(f"unexcept char before string: {rm}")
|
246
|
+
else:
|
247
|
+
rst.append(item.Item(rm, type = "str", is_val = 0))
|
248
|
+
tmp = cl[:0]
|
249
|
+
ctmp = tmp[:0]
|
250
|
+
do_judge = 1
|
251
|
+
mark_et = 0
|
252
|
+
mark_l2 = 0
|
253
|
+
while True:
|
254
|
+
if do_judge and self.right == buffer.rget(self.lr):
|
255
|
+
break
|
256
|
+
c = buffer.read_cache(1)
|
257
|
+
if do_judge and c == self.label_et:
|
258
|
+
mark_et += 1
|
259
|
+
if len(c)==0:
|
260
|
+
if self.single_line and self.note:
|
261
|
+
break
|
262
|
+
raise Exception(f"unexcept string end while reading str")
|
263
|
+
do_judge = 1
|
264
|
+
if c == self.label_l2:
|
265
|
+
mark_l2 = 1
|
266
|
+
do_judge = 0
|
267
|
+
c = buffer.read_cache(1)
|
268
|
+
if len(c)==0:
|
269
|
+
raise Exception(f"unexcept string end while reading str")
|
270
|
+
data = buffer.full()
|
271
|
+
data = data[:-self.lr]
|
272
|
+
buffer.clean()
|
273
|
+
mark_et -= self.et_in_right
|
274
|
+
if self.single_line and mark_et>0:
|
275
|
+
print("left:",self.left, "right:", self.right)
|
276
|
+
raise Exception(f"contain enter in single line string")
|
277
|
+
if self.translate and mark_l2:
|
278
|
+
data = self.do_translate(data)
|
279
|
+
if self.note:
|
280
|
+
return True
|
281
|
+
rst.append(item.Item(data, type='str', is_val = 1))
|
282
|
+
return True
|
283
|
+
|
284
|
+
pass
|
@@ -0,0 +1,197 @@
|
|
1
|
+
from .. import base
|
2
|
+
from .. import item
|
3
|
+
from .. import exp
|
4
|
+
from ... import file
|
5
|
+
import json
|
6
|
+
from . import lr
|
7
|
+
from ... import code as codez
|
8
|
+
def init():
|
9
|
+
cs = "abfnrtv\\'\"?0123456789xcde"
|
10
|
+
maps = {k:k.encode()[0] for k in cs}
|
11
|
+
global c2b
|
12
|
+
c2b = maps
|
13
|
+
global symbal_a
|
14
|
+
global a_map
|
15
|
+
a_map = [0]*256
|
16
|
+
s = "abfnrtv\\'\"?"
|
17
|
+
ts = b"\a\b\f\n\r\t\v\\\'\"\?"
|
18
|
+
for c,t in zip(s, ts):
|
19
|
+
a_map[c2b[c]] = t
|
20
|
+
symbal_a = [False]*256
|
21
|
+
for c in s:
|
22
|
+
symbal_a[c2b[c]] = True
|
23
|
+
global id_0,id_a,id_x
|
24
|
+
id_0 = b'0'[0]
|
25
|
+
id_a = b'a'[0]
|
26
|
+
id_x = b'x'[0]
|
27
|
+
|
28
|
+
pass
|
29
|
+
|
30
|
+
init()
|
31
|
+
def translate_bts(bts):
|
32
|
+
i = 0
|
33
|
+
rs = []
|
34
|
+
while i<len(bts):
|
35
|
+
c = bts[i]
|
36
|
+
i+=1
|
37
|
+
if c!=c2b['\\']:
|
38
|
+
rs.append(c)
|
39
|
+
continue
|
40
|
+
x0 = bts[i]
|
41
|
+
i+=1
|
42
|
+
if symbal_a[x0]:
|
43
|
+
rs.append(a_map[x0])
|
44
|
+
continue
|
45
|
+
v = x0-id_0
|
46
|
+
if v>=0 and v<=7:
|
47
|
+
tmp = v
|
48
|
+
for j in range(2):
|
49
|
+
if i+j+1>=len(bts):
|
50
|
+
break
|
51
|
+
xi = bts[i+j+1]
|
52
|
+
vi = xi-id_0
|
53
|
+
if vi>=0 and vi<=7:
|
54
|
+
i+=1
|
55
|
+
tmp = (rs<<3)+vi
|
56
|
+
else:
|
57
|
+
break
|
58
|
+
rs.append(tmp)
|
59
|
+
continue
|
60
|
+
if x0 == id_x:
|
61
|
+
tmp = 0
|
62
|
+
for j in range(2):
|
63
|
+
if i+j+1>=len(bts):
|
64
|
+
raise Exception("\\xXX error")
|
65
|
+
xi = bts[i+j+1]
|
66
|
+
vi = xi-id_0
|
67
|
+
if vi<0 or vi>7:
|
68
|
+
vi = xi-id_a
|
69
|
+
if vi<0 or vi > 5:
|
70
|
+
raise Exception("\\xXX error")
|
71
|
+
vi +=10
|
72
|
+
tmp=(tmp<<4)+vi
|
73
|
+
rs.append(tmp)
|
74
|
+
continue
|
75
|
+
rs.append(c)
|
76
|
+
rs.append(x0)
|
77
|
+
#i-=1
|
78
|
+
return bytes(rs)
|
79
|
+
|
80
|
+
pass
|
81
|
+
|
82
|
+
class PrevStrDeal(lr.LRDeal):
|
83
|
+
def types(self):
|
84
|
+
if not self.deal_build:
|
85
|
+
return []
|
86
|
+
return ['str']
|
87
|
+
def build(self, obj):
|
88
|
+
if type(obj.val)==list:
|
89
|
+
return None
|
90
|
+
if obj.is_val:
|
91
|
+
print("error str build")
|
92
|
+
return obj
|
93
|
+
obj.is_val = 1
|
94
|
+
if self.translate:
|
95
|
+
print("error str build tr")
|
96
|
+
val = obj.val
|
97
|
+
val = self.do_translate(val)
|
98
|
+
obj.val = val
|
99
|
+
return obj
|
100
|
+
def prepare(self, mg):
|
101
|
+
super().prepare(mg)
|
102
|
+
self.label_l2 = mg.like("\\")
|
103
|
+
self.label_qt = mg.like('"')
|
104
|
+
self.label_et = mg.like("\n")
|
105
|
+
self.label_lr = mg.like("\r")
|
106
|
+
self.label_nl = mg.like("")
|
107
|
+
self.et_in_right = self.right.count(self.label_et)
|
108
|
+
def init(self, left = '"', right= '"', single_line = False, note = False, translate = False, deal_build = False):
|
109
|
+
super().init(left, right, 'str')
|
110
|
+
self.single_line = single_line
|
111
|
+
self.note = note
|
112
|
+
self.translate = translate
|
113
|
+
self.deal_build = deal_build
|
114
|
+
def json_loads(self, s):
|
115
|
+
x = s
|
116
|
+
cd = None
|
117
|
+
if type(x)==bytes:
|
118
|
+
x, cd = file.decode_c(x)
|
119
|
+
rs = json.loads(x)
|
120
|
+
if type(s)==bytes:
|
121
|
+
rs = rs.encode(cd)
|
122
|
+
return rs
|
123
|
+
def do_translate(self, s):
|
124
|
+
is_bytes = type(s)==bytes
|
125
|
+
if not is_bytes:
|
126
|
+
s = s.encode("utf-8")
|
127
|
+
#s = translate_bts(s)
|
128
|
+
s = codez.ubytes(s, "utf-8")
|
129
|
+
if not is_bytes:
|
130
|
+
s = s.decode("utf-8")
|
131
|
+
return s
|
132
|
+
"""
|
133
|
+
取巧直接调用json
|
134
|
+
"""
|
135
|
+
qt = self.label_qt
|
136
|
+
ql = self.label_l2
|
137
|
+
et = self.label_et
|
138
|
+
tr = self.label_lr
|
139
|
+
nt = self.label_nl
|
140
|
+
pt = ql+qt
|
141
|
+
arr = s.split(pt)
|
142
|
+
arr = [k.replace(qt, pt) for k in arr]
|
143
|
+
s = pt.join(arr)
|
144
|
+
#s = s.replace(qt, ql+qt)
|
145
|
+
s = s.replace(tr, nt)
|
146
|
+
arr = s.split(et)
|
147
|
+
outs = [self.json_loads(qt+k+qt) for k in arr]
|
148
|
+
outs = et.join(outs)
|
149
|
+
return outs
|
150
|
+
def deal(self, buffer, rst, mg):
|
151
|
+
cl = buffer.read(self.ll)
|
152
|
+
if cl != self.left:
|
153
|
+
return False
|
154
|
+
rm = buffer.full().strip()
|
155
|
+
buffer.clean2read(self.ll)
|
156
|
+
if len(rm)>0:
|
157
|
+
if not self.note:
|
158
|
+
raise Exception(f"unexcept char before string: {rm}")
|
159
|
+
else:
|
160
|
+
rst.append(item.Item(rm, type = "str", is_val = 0))
|
161
|
+
tmp = cl[:0]
|
162
|
+
ctmp = tmp[:0]
|
163
|
+
do_judge = 1
|
164
|
+
mark_et = 0
|
165
|
+
mark_l2 = 0
|
166
|
+
while True:
|
167
|
+
if do_judge and self.right == buffer.rget(self.lr):
|
168
|
+
break
|
169
|
+
c = buffer.read_cache(1)
|
170
|
+
if do_judge and c == self.label_et:
|
171
|
+
mark_et += 1
|
172
|
+
if len(c)==0:
|
173
|
+
if self.single_line and self.note:
|
174
|
+
break
|
175
|
+
raise Exception(f"unexcept string end while reading str")
|
176
|
+
do_judge = 1
|
177
|
+
if c == self.label_l2:
|
178
|
+
mark_l2 = 1
|
179
|
+
do_judge = 0
|
180
|
+
c = buffer.read_cache(1)
|
181
|
+
if len(c)==0:
|
182
|
+
raise Exception(f"unexcept string end while reading str")
|
183
|
+
data = buffer.full()
|
184
|
+
data = data[:-self.lr]
|
185
|
+
buffer.clean()
|
186
|
+
mark_et -= self.et_in_right
|
187
|
+
if self.single_line and mark_et>0:
|
188
|
+
print("left:",self.left, "right:", self.right)
|
189
|
+
raise Exception(f"contain enter in single line string")
|
190
|
+
if self.translate and mark_l2:
|
191
|
+
data = self.do_translate(data)
|
192
|
+
if self.note:
|
193
|
+
return True
|
194
|
+
rst.append(item.Item(data, type='str', is_val = 1))
|
195
|
+
return True
|
196
|
+
|
197
|
+
pass
|
@@ -12,19 +12,20 @@ xf
|
|
12
12
|
time cost in <function loads at 0x0000015DEDD0F100>: 0.3307473659515381
|
13
13
|
|
14
14
|
慢7倍多,感觉还能接受,之前没注意速度,更早的版本(buildz.xf.read.loads,后面可能会删掉)耗时要三四秒,对比之后就重新写了个,也不管什么堆栈了,就递归调用,后面有时间再改回堆栈吧(python的list的append和pop效率貌似不咋地,尤其是pop(0))
|
15
|
-
又写了个C版本的代码来加速,速度大概比C加速版json的慢三到四倍(汗,和没用C加速版的json
|
15
|
+
又写了个C版本的代码来加速,速度大概比C加速版json的慢三到四倍(汗,和没用C加速版的json差不多速度,追求结构化不追求速度,逻辑上本来就多了不少内存分配和运算,用C只是因为C本身比python快,起码满足自己使用了,本测试代码里C加速版xf比python版快7倍,在其他场景里实际使用快了十倍以上,不过也比C版json慢了六七倍),源码暂不公布(C语言要自己写垃圾回收真累,还只是写了个计数器的,还要自己写List和Map,另外就是用C写了后,发现除了当库给其他语言使用,貌似没啥用,还有cython调用C真方便,后续可能会优化下,配置文件格式错误把错误位置打印出来,这个实现起来简单,不过不一定写,不是必要的,还有C版本的垃圾回收在抛错的时候清理下数据,不清理的话,配置文件格式错误会导致之前分配的内存未释放,内存占用增多,因为不打算直接在C用xf,打算抛错的时候,C用的内存全释放算了,之后调用再重新分配)
|
16
|
+
还有个比较操蛋的点是,用java也写了一版读取xf格式配置文件,结果java版比C版还快,一脸问号,是在C写的内存分配和回收占用时间了吗?更无语的是,java做循环读取配置文件,貌似会触发java的优化,平均速度还会更快(循环100次后和C加速版python的json差不多一样快了),不清楚是因为循环读的是一样的字符串导致的java优化,还是其他原因导致的java优化,如果是其他原因,说明读多个配置文件的时候java版会越来越快,java版会比C版更适合使用,而且java自己有垃圾回收,有List和Map,有时间下个python库用python调java试试
|
16
17
|
"""
|
17
18
|
from buildz.xf import readz as rz
|
18
19
|
from buildz.xf import read as rd
|
19
20
|
from buildz import xf, fz
|
20
21
|
import json
|
21
|
-
import time
|
22
|
+
import time,sys
|
22
23
|
|
23
24
|
try:
|
24
25
|
# C加速代码
|
25
26
|
import cxf
|
26
27
|
except:
|
27
|
-
from buildz.xf import
|
28
|
+
from buildz.xf import readz as cxf
|
28
29
|
pass
|
29
30
|
pass
|
30
31
|
def cost(n, f,*a,**b):
|
@@ -43,7 +43,11 @@ def build_val(mgs):
|
|
43
43
|
mgs.add(reval.ValDeal("false", lambda x:False))
|
44
44
|
|
45
45
|
pass
|
46
|
+
g_mg = None
|
46
47
|
def build(as_bytes=False):
|
48
|
+
global g_mg
|
49
|
+
if g_mg is not None and g_mg.as_bytes == as_bytes:
|
50
|
+
return g_mg
|
47
51
|
mgs = mg.Manager(as_bytes)
|
48
52
|
mgs.add(setz.SetDeal(':'))
|
49
53
|
mgs.add(setz.SetDeal('='))
|
@@ -70,6 +74,7 @@ def build(as_bytes=False):
|
|
70
74
|
mgs.add(strz.PrevStrDeal("'","'",1,0,1))
|
71
75
|
mgs.add(strz.PrevStrDeal('"','"',1,0,1))
|
72
76
|
mgs.add(nextz.PrevNextDeal())
|
77
|
+
g_mg = mgs
|
73
78
|
return mgs
|
74
79
|
|
75
80
|
pass
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: buildz
|
3
|
-
Version: 0.6.
|
3
|
+
Version: 0.6.2
|
4
4
|
Summary: 配置读写(基于json格式进行简化)、ioc、以及其他工具代码。a json-base file format's read and write code by python, and codes to read and product object from configure file in such format(ioc), and other tool codes
|
5
5
|
Home-page: https://github.com/buildCodeZ/buildz
|
6
6
|
Author: Zzz
|