buildz 0.6.22__tar.gz → 0.6.23__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 (208) hide show
  1. {buildz-0.6.22/buildz.egg-info → buildz-0.6.23}/PKG-INFO +1 -1
  2. {buildz-0.6.22 → buildz-0.6.23}/buildz/auto/cache.py +30 -8
  3. {buildz-0.6.22 → buildz-0.6.23}/buildz/auto/config.py +3 -1
  4. {buildz-0.6.22 → buildz-0.6.23}/buildz/auto/dbs.py +15 -2
  5. {buildz-0.6.22 → buildz-0.6.23}/buildz/auto/deal_list.py +3 -2
  6. {buildz-0.6.22 → buildz-0.6.23}/buildz/auto/defs.py +1 -1
  7. {buildz-0.6.22 → buildz-0.6.23}/buildz/auto/factory.py +4 -0
  8. {buildz-0.6.22 → buildz-0.6.23}/buildz/auto/log.py +6 -0
  9. {buildz-0.6.22 → buildz-0.6.23}/buildz/auto/request.py +1 -1
  10. {buildz-0.6.22 → buildz-0.6.23}/buildz/auto/run.py +11 -3
  11. {buildz-0.6.22 → buildz-0.6.23}/buildz/auto/save.py +10 -3
  12. buildz-0.6.23/buildz/auto/test/res/config/base.js +13 -0
  13. buildz-0.6.23/buildz/auto/test/res/config/config.js +4 -0
  14. {buildz-0.6.22/buildz/auto/test → buildz-0.6.23/buildz/auto/test/res}/data/test.js +11 -1
  15. {buildz-0.6.22 → buildz-0.6.23}/buildz/auto/test/test.py +3 -3
  16. buildz-0.6.23/buildz/auto/test/xtest.py +20 -0
  17. {buildz-0.6.22 → buildz-0.6.23}/buildz/auto/verify.py +1 -1
  18. {buildz-0.6.22 → buildz-0.6.23}/buildz/db/runz.py +2 -2
  19. {buildz-0.6.22 → buildz-0.6.23}/buildz/fz/__init__.py +1 -1
  20. {buildz-0.6.22 → buildz-0.6.23}/buildz/fz/fio.py +17 -1
  21. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc/confs.py +2 -0
  22. buildz-0.6.23/buildz/ioc/ioc/decorator.py +97 -0
  23. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/obj.py +1 -1
  24. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/wrap.py +1 -1
  25. buildz-0.6.23/buildz/tz/log.py +84 -0
  26. {buildz-0.6.22 → buildz-0.6.23/buildz.egg-info}/PKG-INFO +1 -1
  27. {buildz-0.6.22 → buildz-0.6.23}/buildz.egg-info/SOURCES.txt +8 -6
  28. {buildz-0.6.22 → buildz-0.6.23}/setup.py +1 -1
  29. buildz-0.6.22/buildz/auto/test/config/config.js +0 -12
  30. buildz-0.6.22/buildz/ioc/ioc/decorator.py +0 -44
  31. buildz-0.6.22/buildz/tz/log.py +0 -50
  32. {buildz-0.6.22 → buildz-0.6.23}/LICENSE +0 -0
  33. {buildz-0.6.22 → buildz-0.6.23}/MANIFEST.in +0 -0
  34. {buildz-0.6.22 → buildz-0.6.23}/README.md +0 -0
  35. {buildz-0.6.22 → buildz-0.6.23}/buildz/__init__.py +0 -0
  36. {buildz-0.6.22 → buildz-0.6.23}/buildz/__main__.py +0 -0
  37. {buildz-0.6.22 → buildz-0.6.23}/buildz/argx.py +0 -0
  38. {buildz-0.6.22 → buildz-0.6.23}/buildz/auto/__init__.py +0 -0
  39. {buildz-0.6.22 → buildz-0.6.23}/buildz/auto/deal.py +0 -0
  40. {buildz-0.6.22 → buildz-0.6.23}/buildz/auto/deal_type.py +0 -0
  41. {buildz-0.6.22 → buildz-0.6.23}/buildz/auto/init.py +0 -0
  42. {buildz-0.6.22/buildz/auto/test → buildz-0.6.23/buildz/auto/test/res}/cache/cache.js +0 -0
  43. {buildz-0.6.22/buildz/auto/test → buildz-0.6.23/buildz/auto/test/res}/data/fp.js +0 -0
  44. {buildz-0.6.22/buildz/auto/test → buildz-0.6.23/buildz/auto/test/res}/data/item1.js +0 -0
  45. {buildz-0.6.22/buildz/auto/test → buildz-0.6.23/buildz/auto/test/res}/data/item2.js +0 -0
  46. {buildz-0.6.22 → buildz-0.6.23}/buildz/base.py +0 -0
  47. {buildz-0.6.22 → buildz-0.6.23}/buildz/cmd.py +0 -0
  48. {buildz-0.6.22 → buildz-0.6.23}/buildz/db/__main__.py +0 -0
  49. {buildz-0.6.22 → buildz-0.6.23}/buildz/db/dv/__init__.py +0 -0
  50. {buildz-0.6.22 → buildz-0.6.23}/buildz/db/dv/basez.py +0 -0
  51. {buildz-0.6.22 → buildz-0.6.23}/buildz/db/dv/clickhousez.py +0 -0
  52. {buildz-0.6.22 → buildz-0.6.23}/buildz/db/dv/lib/readme +0 -0
  53. {buildz-0.6.22 → buildz-0.6.23}/buildz/db/dv/mysqlz.py +0 -0
  54. {buildz-0.6.22 → buildz-0.6.23}/buildz/db/dv/oraclez.py +0 -0
  55. {buildz-0.6.22 → buildz-0.6.23}/buildz/db/dv/structz.py +0 -0
  56. {buildz-0.6.22 → buildz-0.6.23}/buildz/db/install.txt +0 -0
  57. {buildz-0.6.22 → buildz-0.6.23}/buildz/db/run.conf +0 -0
  58. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/ioc/deal.py +0 -0
  59. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/ioc/help.py +0 -0
  60. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/myers/deal.py +0 -0
  61. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/myers/help.py +0 -0
  62. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/res/conf/ioc.js +0 -0
  63. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/res/conf/main.js +0 -0
  64. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/res/conf/myers.js +0 -0
  65. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/res/conf/search.js +0 -0
  66. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/res/conf/xf.js +0 -0
  67. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/res/help/default.js +0 -0
  68. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/res/help/ioc.js +0 -0
  69. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/res/help/myers.js +0 -0
  70. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/res/help/search.js +0 -0
  71. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/res/help/xf.js +0 -0
  72. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/res/test.js +0 -0
  73. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/search/deal.py +0 -0
  74. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/search/help.py +0 -0
  75. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/test.py +0 -0
  76. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/xf/deal.py +0 -0
  77. {buildz-0.6.22 → buildz-0.6.23}/buildz/demo/xf/help.py +0 -0
  78. {buildz-0.6.22 → buildz-0.6.23}/buildz/fz/dirz.py +0 -0
  79. {buildz-0.6.22 → buildz-0.6.23}/buildz/fz/fhs.py +0 -0
  80. {buildz-0.6.22 → buildz-0.6.23}/buildz/fz/lsf.py +0 -0
  81. {buildz-0.6.22 → buildz-0.6.23}/buildz/html/__init__.py +0 -0
  82. {buildz-0.6.22 → buildz-0.6.23}/buildz/html/test/demo.html +0 -0
  83. {buildz-0.6.22 → buildz-0.6.23}/buildz/html/test/test.py +0 -0
  84. {buildz-0.6.22 → buildz-0.6.23}/buildz/html/xml.py +0 -0
  85. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/__init__.py +0 -0
  86. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/base.py +0 -0
  87. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/init.py +0 -0
  88. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc/base.py +0 -0
  89. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc/conf.py +0 -0
  90. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc/single.py +0 -0
  91. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/base.py +0 -0
  92. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/branch.py +0 -0
  93. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/call.py +0 -0
  94. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/calls.py +0 -0
  95. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/branch_lists.js +0 -0
  96. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/call_defaults.js +0 -0
  97. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/call_lists.js +0 -0
  98. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/calls_defaults.js +0 -0
  99. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/calls_lists.js +0 -0
  100. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/deal_lists.js +0 -0
  101. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/deals.js +0 -0
  102. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/env_lists.js +0 -0
  103. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/ioc_lists.js +0 -0
  104. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/iocf_lists.js +0 -0
  105. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/join_lists.js +0 -0
  106. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/list_lists.js +0 -0
  107. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/map_lists.js +0 -0
  108. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/mcall_defaults.js +0 -0
  109. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/mcall_lists.js +0 -0
  110. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/obj_cst_lists.js +0 -0
  111. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/obj_defaults.js +0 -0
  112. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/obj_lists.js +0 -0
  113. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/obj_set_lists.js +0 -0
  114. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/ovar_lists.js +0 -0
  115. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/ref_lists.js +0 -0
  116. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/refs_lists.js +0 -0
  117. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/var_lists.js +0 -0
  118. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/xfile_defaults.js +0 -0
  119. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/conf/xfile_lists.js +0 -0
  120. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/deal.py +0 -0
  121. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/demo.py +0 -0
  122. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/env.py +0 -0
  123. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/init.py +0 -0
  124. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/ioc.py +0 -0
  125. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/iocf.py +0 -0
  126. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/join.py +0 -0
  127. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/list.py +0 -0
  128. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/map.py +0 -0
  129. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/mcall.py +0 -0
  130. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/ovar.py +0 -0
  131. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/ref.py +0 -0
  132. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/refs.py +0 -0
  133. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/val.py +0 -0
  134. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/var.py +0 -0
  135. {buildz-0.6.22 → buildz-0.6.23}/buildz/ioc/ioc_deal/xfile.py +0 -0
  136. {buildz-0.6.22 → buildz-0.6.23}/buildz/pyz.py +0 -0
  137. {buildz-0.6.22 → buildz-0.6.23}/buildz/tools.py +0 -0
  138. {buildz-0.6.22 → buildz-0.6.23}/buildz/tz/__init__.py +0 -0
  139. {buildz-0.6.22 → buildz-0.6.23}/buildz/tz/myers_diff.py +0 -0
  140. {buildz-0.6.22 → buildz-0.6.23}/buildz/tz/time/__init__.py +0 -0
  141. {buildz-0.6.22 → buildz-0.6.23}/buildz/tz/time/timez.py +0 -0
  142. {buildz-0.6.22 → buildz-0.6.23}/buildz/tz/tio/__init__.py +0 -0
  143. {buildz-0.6.22 → buildz-0.6.23}/buildz/tz/tio/base.py +0 -0
  144. {buildz-0.6.22 → buildz-0.6.23}/buildz/tz/tio/getch.py +0 -0
  145. {buildz-0.6.22 → buildz-0.6.23}/buildz/tz/tio/lx.py +0 -0
  146. {buildz-0.6.22 → buildz-0.6.23}/buildz/tz/tio/test.py +0 -0
  147. {buildz-0.6.22 → buildz-0.6.23}/buildz/tz/tio/win.py +0 -0
  148. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/__init__.py +0 -0
  149. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/__main__.py +0 -0
  150. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/code.py +0 -0
  151. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/code_modify.py +0 -0
  152. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/copy_old.py +0 -0
  153. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/file.py +0 -0
  154. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loader/base.py +0 -0
  155. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loader/buffer.py +0 -0
  156. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loader/deal/listz.py +0 -0
  157. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loader/deal/lr.py +0 -0
  158. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loader/deal/lrval.py +0 -0
  159. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loader/deal/mapz.py +0 -0
  160. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loader/deal/nextz.py +0 -0
  161. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loader/deal/reval.py +0 -0
  162. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loader/deal/setz.py +0 -0
  163. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loader/deal/spc.py +0 -0
  164. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loader/deal/spt.py +0 -0
  165. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loader/deal/strz.py +0 -0
  166. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loader/exp.py +0 -0
  167. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loader/item.py +0 -0
  168. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loader/mg.py +0 -0
  169. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loader/pos.py +0 -0
  170. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/base.py +0 -0
  171. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/buffer.py +0 -0
  172. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/deal/listmapz.py +0 -0
  173. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/deal/listz.py +0 -0
  174. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/deal/lr.py +0 -0
  175. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/deal/lrval.py +0 -0
  176. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/deal/mapz.py +0 -0
  177. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/deal/nextz.py +0 -0
  178. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/deal/reval.py +0 -0
  179. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/deal/setz.py +0 -0
  180. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/deal/spc.py +0 -0
  181. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/deal/spt.py +0 -0
  182. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/deal/strz.py +0 -0
  183. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/deal/strz_new.py +0 -0
  184. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/deal/strz_old.py +0 -0
  185. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/exp.py +0 -0
  186. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/item.py +0 -0
  187. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/mg.py +0 -0
  188. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/pos.py +0 -0
  189. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/test.py +0 -0
  190. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/loaderz/test1.py +0 -0
  191. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/mapz.py +0 -0
  192. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/read.py +0 -0
  193. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/readz.py +0 -0
  194. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/stack.py +0 -0
  195. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/write.py +0 -0
  196. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/writer/base.py +0 -0
  197. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/writer/conf.py +0 -0
  198. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/writer/deal/jsonval.py +0 -0
  199. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/writer/deal/listz.py +0 -0
  200. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/writer/deal/mapz.py +0 -0
  201. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/writer/deal/reval.py +0 -0
  202. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/writer/deal/strz.py +0 -0
  203. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/writer/itemz.py +0 -0
  204. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/writer/mg.py +0 -0
  205. {buildz-0.6.22 → buildz-0.6.23}/buildz/xf/xargs.py +0 -0
  206. {buildz-0.6.22 → buildz-0.6.23}/buildz.egg-info/dependency_links.txt +0 -0
  207. {buildz-0.6.22 → buildz-0.6.23}/buildz.egg-info/top_level.txt +0 -0
  208. {buildz-0.6.22 → buildz-0.6.23}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: buildz
3
- Version: 0.6.22
3
+ Version: 0.6.23
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
@@ -14,7 +14,7 @@ class Update(Base):
14
14
  """
15
15
  def init(self, cache, log, pt = "(#\{([^\{\}]*)\})"):
16
16
  self.cache = cache
17
- self.log = log
17
+ self.log = log.tag("Cache.Update")
18
18
  self.pt = pt
19
19
  def call(self, s):
20
20
  if type(s)==dict:
@@ -51,24 +51,30 @@ pass
51
51
  @wrap.obj(id="cache.save")
52
52
  @wrap.obj_args("ref, cache.file", "ref, log")
53
53
  class Save(Base):
54
- def init(self, cache, log, fkey = "cache.save"):
54
+ def init(self, cache, log, fkey = "cache.save", fp = None):
55
55
  self.fkey = fkey
56
56
  self.cache = cache
57
- self.log = log
58
- def call(self, maps, fp):
59
- fp = xf.get(maps, self.fkey, None)
57
+ self.log = log.tag("Cache.Save")
58
+ self.fp = fp
59
+ def save(self):
60
+ fp = self.fp
60
61
  if fp is None:
61
62
  self.log.warn(f"cache not save cause 'cache.save' is None")
62
- return
63
+ return False
63
64
  fz.makefdir(fp)
64
65
  rst = self.cache.data
65
66
  rs = xf.dumps(rst, format=True).encode("utf-8")
66
67
  fz.write(rs, fp, 'wb')
67
68
  return True
69
+ def call(self, maps, fp):
70
+ fp = xf.get(maps, self.fkey, None)
71
+ fp = self.cache.rfp(fp)
72
+ self.fp = fp
73
+ return self.save()
68
74
 
69
75
  pass
70
76
  @wrap.obj(id="cache.file")
71
- @wrap.obj_args("ref, log", "env, cache.rfp.current.first, false")
77
+ @wrap.obj_args("mcall, log, tag, [Cache.File]", "env, cache.rfp.current.first, false")
72
78
  class Cache(Base):
73
79
  def get(self, key):
74
80
  ks = key.split(".")
@@ -96,10 +102,18 @@ class Cache(Base):
96
102
  self.set_current(dps)
97
103
  def get_current(self):
98
104
  dps = self.get("cache.path.current")
105
+ if dps is None:
106
+ dps = []
99
107
  if type(dps)!=list:
100
108
  dps = [dps]
101
109
  return dps
110
+ def set_basedir(self, dp):
111
+ self.set("cache.path.base", dp)
112
+ def get_basedir(self):
113
+ return self.get("cache.path.base")
102
114
  def rfp(self, fp):
115
+ if fz.is_abs(fp):
116
+ return fp
103
117
  dps = [None,"."]
104
118
  cfps = self.get_current()
105
119
  if cfps is not None:
@@ -107,12 +121,18 @@ class Cache(Base):
107
121
  dps = cfps+dps
108
122
  else:
109
123
  dps = dps+cfps
124
+ basedir = self.get_basedir()
125
+ if basedir is not None:
126
+ dps = [basedir]+dps
110
127
  for dp in dps:
111
128
  _fp = fp
112
129
  if dp is not None:
113
130
  _fp = os.path.join(dp, fp)
114
131
  if os.path.isfile(_fp):
115
132
  return _fp
133
+ basedir = self.get_basedir()
134
+ if basedir is not None:
135
+ fp = os.path.join(basedir, fp)
116
136
  return fp
117
137
  def call(self, maps, fp):
118
138
  fp = xf.get(maps, self.fkey, "cache.js")
@@ -132,7 +152,7 @@ class Cache(Base):
132
152
  pass
133
153
 
134
154
  @wrap.obj(id="cache.mem")
135
- @wrap.obj_args("ref, log")
155
+ @wrap.obj_args("mcall, log, tag, [Cache.Mem]")
136
156
  class Mem(Cache):
137
157
  def init(self, log, current_first=False, fkey = "mem"):
138
158
  super().init(log)
@@ -152,6 +172,8 @@ class Caches(Base):
152
172
  self.get_current = cache.get_current
153
173
  self.add_current = cache.add_current
154
174
  self.set_current = cache.set_current
175
+ self.set_basedir = cache.set_basedir
176
+ self.get_basedir = cache.get_basedir
155
177
  def get_file(self, key):
156
178
  return self.cache.get(key)
157
179
  def get_mem(self, key):
@@ -11,13 +11,15 @@ class Config(Base):
11
11
  configs = xf.g(maps, configs=[])
12
12
  if type(configs)!=list:
13
13
  configs = [configs]
14
+ dts = {}
14
15
  for cfp in configs:
15
16
  cfp = self.cache.rfp(cfp)
16
17
  if not os.path.isfile(cfp):
17
18
  self.log.error(f"config file not exist: {cfp}")
18
19
  return False
19
20
  dt = xf.loadf(cfp)
20
- xf.fill(dt, maps, replace=0)
21
+ xf.fill(dt, dts, replace=1)
22
+ xf.fill(dts, maps, replace=0)
21
23
  return True
22
24
 
23
25
  pass
@@ -8,17 +8,30 @@ from buildz.db.dv import build
8
8
  class Dbs(Base):
9
9
  def init(self, cache, log):
10
10
  self.cache = cache
11
- self.log = log
11
+ self.log = log.tag("Dbs")
12
12
  self.dbs = {}
13
13
  def call(self, maps, fp):
14
14
  confs = xf.g(maps, dbs={})
15
15
  for key,conf in confs.items():
16
16
  url,user,pwd,dv = xf.g(conf, url=None, user=None, pwd=None, device=key)
17
- dv = build(dv, [url, user, pwd], val)
17
+ dv = build(dv, [url, user, pwd], conf)
18
+ dv.begin()
18
19
  self.dbs[key] = dv
19
20
  self.cache.set_mem("dbs", self.dbs)
20
21
  return True
21
22
 
22
23
  pass
23
24
 
25
+ @wrap.obj(id="dbs.close")
26
+ @wrap.obj_sets(cache="ref, cache", log="ref, log")
27
+ class DbsClose(Base):
28
+ def call(self, maps, fp):
29
+ dbs = self.cache.get_mem("dbs")
30
+ if dbs is None:
31
+ return True
32
+ for k,dv in dbs:
33
+ dv.close()
34
+ return True
35
+
36
+ pass
24
37
 
@@ -7,7 +7,7 @@ import os
7
7
  class List(Base):
8
8
  def init(self, cache, log, upd, lst):
9
9
  self.cache = cache
10
- self.log = log
10
+ self.log = log.tag("List")
11
11
  self.upd = upd
12
12
  self.lst = lst
13
13
  def call(self, data, fc):
@@ -21,9 +21,10 @@ class List(Base):
21
21
  if type(datas)==dict:
22
22
  datas = xf.g(datas, datas=[])
23
23
  deal = self.lst.curr()
24
- print(f"List.datas: {xf.dumps(datas,format=1,deep=1)}")
24
+ #print(f"List.datas: {xf.dumps(datas,format=1,deep=1)}")
25
25
  for data in datas:
26
26
  if not deal(data):
27
+ self.log.error(f"failed in data: {data}")
27
28
  return False
28
29
  return True
29
30
 
@@ -6,7 +6,7 @@ from buildz.ioc import wrap
6
6
  class Defs(Base):
7
7
  def init(self, cache, log, upd):
8
8
  self.cache = cache
9
- self.log = log
9
+ self.log = log.tag("Defs")
10
10
  self.upd = upd
11
11
  def update(self, s, defs, ignore=None):
12
12
  if type(s)==dict:
@@ -25,6 +25,10 @@ class Fill(Base):
25
25
  def init(self, mg):
26
26
  self.mg = mg
27
27
  def call(self, orders, default=None):
28
+ if type(orders)==str:
29
+ orders = xf.loads(orders)
30
+ if type(orders)==str:
31
+ orders = [orders]
28
32
  fcs = [self.mg.get(id) for id in orders]
29
33
  return DeepFc(fcs,default)
30
34
 
@@ -9,14 +9,20 @@ from ..tools import *
9
9
  import time, sys
10
10
  from ..tz.log import FpLog
11
11
  @wrap.obj(id="log")
12
+ @wrap.obj_sets(cache="ref,cache")
12
13
  class AutoLog(FpLog):
13
14
  def call(self, maps, fp):
14
15
  fp = xf.g(maps, log = None)
16
+ fp = self.cache.rfp(fp)
15
17
  self.fp = fp
16
18
  shows = xf.get(maps, "log.shows")
17
19
  if shows is None:
18
20
  shows = ["info", "warn", "error"]
19
21
  self.shows = shows
22
+ format = xf.get(maps, "log.format")
23
+ if format is not None:
24
+ self.format = format
25
+ #print(f"[TETSZ] format: {format}")
20
26
  return True
21
27
 
22
28
  pass
@@ -17,7 +17,7 @@ class Request(Base):
17
17
  self.type = http_type
18
18
  self.cache = cache
19
19
  self.use_session = use_session
20
- self.log = log
20
+ self.log = log.tag("Request")
21
21
  self.upd = upd
22
22
  self.fc = None
23
23
  self.fcs = None
@@ -4,20 +4,28 @@ from ..base import Base
4
4
  from . import init
5
5
  import os
6
6
  class Run(Base):
7
- def init(self, fps=None, init=None):
7
+ def init(self, fps=None, init=None, basedir=None):
8
8
  mg = ioc.build(init)
9
9
  if fps is not None:
10
10
  mg.add_fps(fps)
11
11
  self.mg = mg
12
+ if basedir is not None:
13
+ self.basedir(basedir)
14
+ def basedir(self, dp):
15
+ self._base = dp
16
+ self.mg.get("cache").set_basedir(dp)
12
17
  def add_current(self, dp):
13
18
  self.mg.get("cache").add_current(dp)
14
19
  def call(self, fp):
15
- self.log = self.mg.get("log")
20
+ self.log = self.mg.get("log").tag("Run")
21
+ basedir = self.mg.get("cache").get_basedir()
22
+ if basedir is not None and not fz.is_abs(fp):
23
+ fp = os.path.join(basedir, fp)
16
24
  if not os.path.isfile(fp):
17
25
  dp = os.path.dirname(fp)
18
26
  fn = os.path.basename(fp)
19
27
  fps = fz.search(dp, fn)
20
- print(f"search dp:{dp}, fn: {fn}, rst: {fps}")
28
+ self.log.info(f"search dp:{dp}, fn: {fn}, rst: {fps}")
21
29
  if len(fps)!=1:
22
30
  self.log.error(f"can't find filepath: {fp}")
23
31
  return False
@@ -1,14 +1,17 @@
1
1
  #
2
2
  from ..tools import *
3
3
  from buildz.ioc import wrap
4
+ #print(f"warp.obj_sets: {wrap.obj_sets}")
5
+ #raise Exception("test")
4
6
  @wrap.obj(id="save")
5
7
  @wrap.obj_args("ref, cache", "ref, log", "ref, cache.modify")
8
+ @wrap.obj_sets(cache_save = "ref, cache.save")
6
9
  class Save(Base):
7
10
  def init(self, cache, log, upd):
8
11
  self.cache = cache
9
- self.log = log
12
+ self.log = log.tag("Save")
10
13
  self.upd = upd
11
- def call(self, data, fc=None):
14
+ def call(self, data, next_fc=None):
12
15
  data = self.upd(data)
13
16
  save = xf.g(data, save={})
14
17
  fsave = xf.get(data, "save.file", {})
@@ -31,7 +34,11 @@ class Save(Base):
31
34
  else:
32
35
  val = xf.gets(data, v)
33
36
  fc(k, val)
34
- return True
37
+ save = saves[0]
38
+ if len(save)+len(fsave)>0:
39
+ sv = self.cache_save.save()
40
+ self.log.debug(f"cache_save in save: {sv}")
41
+ return next_fc(data)
35
42
 
36
43
  pass
37
44
 
@@ -0,0 +1,13 @@
1
+ calls: [log, cache, cache.save, dbs, def.deal.type, list, cache.save, dbs.close]
2
+ log.shows: [info, warn, debug, error]
3
+ //默认格式是 "[{LEVEL}] %Y-%m-%d %H:%M:%S {tag} {msg}\n" (注意LEVEL是大写,有三种:level,Level, LEVEL)
4
+ //变量: {level}, {Level}, {LEVEL}, {tag}, {msg}, %Y, %m, %d, %H, %M, %S
5
+ log.format: "[{Level}] %Y-%m-%d %H:%M:%S [{tag}] {msg}\n"
6
+ def.deal: {
7
+ types: {
8
+ http.get: [defs, request, verify, save]
9
+ get: [defs, request.get, verify, save]
10
+ list: [defs, deal.list]
11
+ test: [defs, save]
12
+ }
13
+ }
@@ -0,0 +1,4 @@
1
+
2
+ cache: [cache/cache.js,cache/save.js]
3
+ cache.save: cache/save.js
4
+ log: log/%Y%m%d_log_test.txt
@@ -1,5 +1,15 @@
1
- configs: config/config.js
1
+ configs: [config/base.js, config/config.js]
2
2
  datas: [
3
+ {
4
+ note: empty
5
+ type: test
6
+ data: {
7
+ a:b
8
+ }
9
+ save: {
10
+ curr1010: data.a
11
+ }
12
+ }
3
13
  //写一个配置
4
14
  {
5
15
  note: test
@@ -6,7 +6,7 @@ from buildz.ioc import wrap
6
6
  class Req(Base):
7
7
  def init(self, log, upd):
8
8
  self.upd = upd
9
- self.log = log
9
+ self.log = log.tag("Test.Req")
10
10
  def call(self, data, fc=None):
11
11
  data = self.upd(data)
12
12
  self.log.debug(f"test data: {data}")
@@ -19,8 +19,8 @@ from buildz.auto import Run
19
19
  from buildz.ioc.wrap import decorator
20
20
  import sys
21
21
  def test():
22
- print(f"wrap: {xf.dumps(decorator(),format=1,deep=1)}")
23
- rst = Run()("data/test")
22
+ #print(f"wrap: {xf.dumps(decorator(),format=1,deep=1)}")
23
+ rst = Run(basedir="res")("data/test")
24
24
  print(f"rst: {rst}")
25
25
 
26
26
  pass
@@ -0,0 +1,20 @@
1
+
2
+ from buildz.ioc import wrap
3
+ x = wrap.ns("test")
4
+ @wrap.obj(id='x')
5
+ class A:
6
+ pass
7
+
8
+ pass
9
+ @x.obj(id='y')
10
+ class B:
11
+ pass
12
+
13
+ pass
14
+ from buildz import ioc
15
+ mg= ioc.build()
16
+ x = mg.get('x')
17
+ y = mg.get('test.y')
18
+ print(x)
19
+ print(y)
20
+
@@ -6,7 +6,7 @@ from buildz.ioc import wrap
6
6
  @wrap.obj_args("ref, log", "ref, cache.modify")
7
7
  class Verify(Base):
8
8
  def init(self, log, upd):
9
- self.log = log
9
+ self.log = log.tag("Verify")
10
10
  self.upd = upd
11
11
  self.opts = {}
12
12
  self.opts[">"] = self.make_val_cmp(lambda val,v:val>v)
@@ -15,7 +15,7 @@ def test(fp):
15
15
  obj = xf.loads(xf.fread(fp))
16
16
  dv = obj['dv']
17
17
  if __name__ == "__main__":
18
- from db.basez import CMD
18
+ from dv.structz import CMD
19
19
  if dv == 'mysql':
20
20
  from dv.mysqlz import build
21
21
  elif dv == 'oracle':
@@ -23,7 +23,7 @@ def test(fp):
23
23
  elif dv == 'clickhouse':
24
24
  from dv.clickhousez import build
25
25
  else:
26
- from .db.basez import CMD
26
+ from .dv.structz import CMD
27
27
  if dv == 'mysql':
28
28
  from .dv.mysqlz import build
29
29
  elif dv == 'oracle':
@@ -2,7 +2,7 @@
2
2
  #author:
3
3
  from .dirz import dirs, FileDeal
4
4
  from .lsf import lists, search, searchd,searchs,_search
5
- from .fio import fread, freads, fwrite, fwrites, read,reads,write,writes, makefdir, dirpath,makedir,removes, cover, fcover, sread, swrite
5
+ from .fio import fread, freads, fwrite, fwrites, read,reads,write,writes, makefdir, dirpath,makedir,removes, cover, fcover, sread, swrite, is_abs
6
6
  from .fhs import fhash, fhashs
7
7
 
8
8
  __author__ = "Zzz, emails: 1174534295@qq.com, 1309458652@qq.com"
@@ -107,4 +107,20 @@ def swrite(dt, fp, code="utf-8", mode = "w"):
107
107
  dt = dt.encode(code)
108
108
  write(dt, fp, mode)
109
109
 
110
- pass
110
+ pass
111
+
112
+ def is_abs(fp):
113
+ if fp is None:
114
+ return False
115
+ if fp.strip()=="":
116
+ return False
117
+ fp = fp.strip().replace("\\", "/")
118
+ if fp[0]=="/":
119
+ return True
120
+ arr = fp.split("/")
121
+ if arr[0].find(":")>=0:
122
+ return True
123
+ return False
124
+
125
+ pass
126
+
@@ -362,6 +362,8 @@ class Confs(Base):
362
362
  raise
363
363
  #return self.add(conf)
364
364
  def add_decorator(self):
365
+ confs = decorator.all()
366
+ return self.adds(confs)
365
367
  conf = decorator()
366
368
  #print(f"[TESTZ] CONFS add decorator(): {conf}")
367
369
  return self.add(conf)
@@ -0,0 +1,97 @@
1
+ #coding=utf-8
2
+ from buildz.base import Base
3
+ from buildz import xf
4
+ from threading import Lock
5
+ class Decorator(Base):
6
+ def init(self):
7
+ self.conf = {}
8
+ self.confs = {}
9
+ self.confs[None] = self.conf
10
+ self.namespace = None
11
+ self.fcs = {}
12
+ self._ns = {}
13
+ self.regist("add_datas", self.add_datas)
14
+ def fcns(self, namespace, fc):
15
+ self._ns[fc] = namespace
16
+ def ns(self, namespace):
17
+ self.namespace = namespace
18
+ def curr_ns(self):
19
+ return self.namespace
20
+ def regist(self, key, fc):
21
+ self.fcs[key] = fc
22
+ def get_conf(self, src):
23
+ ns = self.namespace
24
+ if src in self._ns:
25
+ ns = self._ns[src]
26
+ if ns not in self.confs:
27
+ conf = {}
28
+ conf['namespace'] = ns
29
+ self.confs[ns] = conf
30
+ return self.confs[ns]
31
+ def get(self, tag, index, src=None):
32
+ conf = self.get_conf(src)
33
+ if tag not in conf:
34
+ conf[tag]=[]
35
+ return conf[tag][index]
36
+ def add(self, tag, data, src = None):
37
+ conf = self.get_conf(src)
38
+ if tag not in conf:
39
+ conf[tag]=[]
40
+ id = len(conf[tag])
41
+ conf[tag].append(data)
42
+ return id
43
+ def set(self, tag, key, val, src=None):
44
+ conf = self.get_conf(src)
45
+ if tag not in conf:
46
+ conf[tag]={}
47
+ conf[tag][key]=val
48
+ def add_datas(self, item, key):
49
+ if type(item)==str:
50
+ item = xf.loads(item)
51
+ return self.add("datas", item, key)
52
+ def get_datas(self, id):
53
+ return self.get("datas", id)
54
+ def set_datas(self, id, val):
55
+ return self.set("datas", id, val)
56
+ def set_envs(self, key, val):
57
+ return self.set("env", key, val)
58
+ def add_inits(self, val):
59
+ return self.add("inits", val)
60
+ def add_locals(self, item):
61
+ return self.add("locals", item)
62
+ def all(self):
63
+ arr = [val for k,val in self.confs.items()]
64
+ return arr
65
+ def call(self):
66
+ return self.conf
67
+
68
+ pass
69
+
70
+ decorator = Decorator()
71
+ class Fcs:
72
+ pass
73
+
74
+ pass
75
+ class NameSpace(Base):
76
+ def init(self, decorator):
77
+ self.decorator = decorator
78
+ self.lock = Lock()
79
+ def fc(self, namespace, rfc):
80
+ def wfc(*a, **b):
81
+ with self.lock:
82
+ ns = self.decorator.curr_ns()
83
+ self.decorator.ns(namespace)
84
+ rst = rfc(*a,**b)
85
+ self.decorator.fcns(namespace, rst)
86
+ self.decorator.ns(ns)
87
+ return rst
88
+ return wfc
89
+ def call(self, namespace):
90
+ fcs = self.decorator.fcs
91
+ obj = Fcs()
92
+ for k,f in fcs.items():
93
+ setattr(obj, k, self.fc(namespace, f))
94
+ return obj
95
+
96
+ pass
97
+ ns = NameSpace(decorator)
@@ -340,7 +340,7 @@ class IOCObject(Basez):
340
340
  conf['type'] = 'object'
341
341
  if 'mcalls' in conf and 'call' not in conf:
342
342
  conf['call'] = {'type': "calls", 'calls': conf['mcalls']}
343
- conf[g_obj_cid] = decorator.add_datas(conf)
343
+ conf[g_obj_cid] = decorator.add_datas(conf, self)
344
344
  g_ioc_conf.set(cls, conf)
345
345
  return cls
346
346
 
@@ -1,5 +1,5 @@
1
1
  #
2
- from .ioc.decorator import decorator
2
+ from .ioc.decorator import decorator, ns
3
3
  from .ioc_deal import init
4
4
  #print(f"decorator.fcs: {decorator.fcs}")
5
5
  locals().update(decorator.fcs)
@@ -0,0 +1,84 @@
1
+ #
2
+
3
+
4
+ from .. import xf
5
+ from .. import ioc
6
+ from ..base import Base
7
+ from ..ioc import wrap
8
+ from ..tools import *
9
+ import time, sys
10
+ class Log(Base):
11
+ def tag(self, _tag):
12
+ log = Log(self.shows, _tag, self)
13
+ return log
14
+ def get_tag(self):
15
+ return self._tag
16
+ def init(self, shows = None, tag= None, base = None):
17
+ if shows is None:
18
+ shows = ["info", "debug", "warn", "error"]
19
+ self.shows=shows
20
+ self._tag = tag
21
+ self.base = base
22
+ def xlog(self, level, *args):
23
+ if level not in self.shows:
24
+ return
25
+ self.log(level, self.tag, *args)
26
+ def log(self, level, tag, *args):
27
+ if self.base is not None:
28
+ return self.base.log(level, tag, *args)
29
+ raise Exception("unimpl")
30
+ def info(self, *args):
31
+ if "info" not in self.shows:
32
+ return
33
+ self.log("info", self._tag, *args)
34
+ def warn(self, *args):
35
+ if "warn" not in self.shows:
36
+ return
37
+ self.log("warn", self._tag, *args)
38
+ def debug(self, *args):
39
+ if "debug" not in self.shows:
40
+ return
41
+ self.log("debug", self._tag, *args)
42
+ def error(self, *args):
43
+ if "error" not in self.shows:
44
+ return
45
+ self.log("error", self._tag, *args)
46
+
47
+ pass
48
+ def replaces(s, *args):
49
+ for i in range(0,len(args),2):
50
+ k,v = args[i],args[i+1]
51
+ s = s.replace(k,v)
52
+ return s
53
+
54
+ pass
55
+ def mstr(s):
56
+ if s is None or len(s)==0:
57
+ return s
58
+ return s[:1].upper()+s[1:].lower()
59
+ class FpLog(Log):
60
+ def init(self, fp = None,shows =None, tag=None, format=None):
61
+ if format is None:
62
+ format = "[{LEVEL}] %Y-%m-%d %H:%M:%S {tag} {msg}\n"
63
+ self.format=format
64
+ super().init(shows, tag)
65
+ self.fp = fp
66
+ def log(self, level, tag, *args):
67
+ m_level = level.lower()
68
+ u_level = level.upper()
69
+ x_level = mstr(level)
70
+ args = [str(k) for k in args]
71
+ msg = " ".join(args)
72
+ if tag is None:
73
+ tag = "base"
74
+ rst = time.strftime(self.format, time.localtime(time.time()))
75
+ msg = replaces(rst, "{Level}", x_level, "{level}", m_level, "{LEVEL}", u_level, "{tag}", tag, "{msg}", msg)
76
+ # rst = rst.replace("{level}",level).replace("{tag}", tag).replace
77
+ # msg = f"[{level}] {date} {tag} {msg}\n"
78
+ sys.stdout.write(msg)
79
+ if self.fp is not None:
80
+ fp = time.strftime(self.fp)
81
+ fz.makefdir(fp)
82
+ fz.write(msg.encode("utf-8"), fp, 'ab')
83
+
84
+ pass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: buildz
3
- Version: 0.6.22
3
+ Version: 0.6.23
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