/component/python/document/pdoc/bootstrap.py

https://github.com/Huawei/containerops · Python · 185 lines · 128 code · 56 blank · 1 comment · 31 complexity · 104f4879f64adaeb95c67c037517865e MD5 · raw file

  1. #!/usr/bin/env python3
  2. import subprocess
  3. import os
  4. import sys
  5. import glob
  6. from bs4 import BeautifulSoup
  7. import json
  8. import anymarkup
  9. REPO_PATH = 'git-repo'
  10. def git_clone(url):
  11. r = subprocess.run(['git', 'clone', url, REPO_PATH])
  12. if r.returncode == 0:
  13. return True
  14. else:
  15. print("[COUT] Git clone error: Invalid argument to exit",
  16. file=sys.stderr)
  17. print("[COUT] CO_RESULT = false")
  18. return False
  19. def get_pip_cmd(version):
  20. if version == 'py3k' or version == 'python3':
  21. return 'pip3'
  22. return 'pip'
  23. def get_python_cmd(version):
  24. if version == 'py3k' or version == 'python3':
  25. return 'python3'
  26. return 'python'
  27. def init_env(version):
  28. subprocess.run([get_pip_cmd(version), 'install', 'pdoc'])
  29. def validate_version(version):
  30. valid_version = ['python', 'python2', 'python3', 'py3k']
  31. if version not in valid_version:
  32. print("[COUT] Check version failed: the valid version is {}".format(valid_version), file=sys.stderr)
  33. return False
  34. return True
  35. def setup(path, version='py3k'):
  36. file_name = os.path.basename(path)
  37. dir_name = os.path.dirname(path)
  38. r = subprocess.run('cd {}; {} {} install'.format(dir_name, get_python_cmd(version), file_name),
  39. shell=True)
  40. if r.returncode != 0:
  41. print("[COUT] install dependences failed", file=sys.stderr)
  42. return False
  43. return True
  44. def pip_install(file_name, version='py3k'):
  45. r = subprocess.run([get_pip_cmd(version), 'install', '-r', file_name])
  46. if r.returncode != 0:
  47. print("[COUT] install dependences failed", file=sys.stderr)
  48. return False
  49. return True
  50. def pdoc(mod):
  51. r = subprocess.run('pdoc --html-dir /tmp/output --html {} --all-submodules'.format(mod), shell=True)
  52. if r.returncode != 0:
  53. print("[COUT] pdoc error", file=sys.stderr)
  54. return False
  55. return True
  56. def echo_json(use_yaml):
  57. for root, dirs, files in os.walk('/tmp/output'):
  58. for file_name in files:
  59. if file_name.endswith('.html'):
  60. with open(os.path.join(root, file_name), 'r') as f:
  61. data = f.read()
  62. soup = BeautifulSoup(data, 'html.parser')
  63. title = soup.find('title').text
  64. body = soup.find('body').renderContents()
  65. data = {
  66. "title": title,
  67. "body": str(body, 'utf-8', errors='ignore'),
  68. "file": file_name
  69. }
  70. if use_yaml:
  71. data = anymarkup.serialize(data, 'yaml')
  72. print('[COUT] CO_YAML_CONTENT {}'.format(str(data)[1:]))
  73. else:
  74. print('[COUT] CO_JSON_CONTENT {}'.format(json.dumps(data)))
  75. return True
  76. def parse_argument():
  77. data = os.environ.get('CO_DATA', None)
  78. if not data:
  79. return {}
  80. validate = ['git-url', 'entry-mod', 'version', 'out-put-type']
  81. ret = {}
  82. for s in data.split(' '):
  83. s = s.strip()
  84. if not s:
  85. continue
  86. arg = s.split('=')
  87. if len(arg) < 2:
  88. print('[COUT] Unknown Parameter: [{}]'.format(s))
  89. continue
  90. if arg[0] not in validate:
  91. print('[COUT] Unknown Parameter: [{}]'.format(s))
  92. continue
  93. ret[arg[0]] = arg[1]
  94. return ret
  95. def main():
  96. argv = parse_argument()
  97. git_url = argv.get('git-url')
  98. if not git_url:
  99. print("[COUT] The git-url value is null", file=sys.stderr)
  100. print("[COUT] CO_RESULT = false")
  101. return
  102. version = argv.get('version', 'py3k')
  103. if not validate_version(version):
  104. print("[COUT] CO_RESULT = false")
  105. return
  106. init_env(version)
  107. entry_mod = argv.get('entry-mod')
  108. if not entry_mod:
  109. print("[COUT] The entry-path value is null", file=sys.stderr)
  110. print("[COUT] CO_RESULT = false")
  111. return
  112. if not git_clone(git_url):
  113. return
  114. for file_name in glob.glob('{}/setup.py'.format(REPO_PATH)):
  115. setup(file_name, version)
  116. for file_name in glob.glob('{}/*/setup.py'.format(REPO_PATH)):
  117. setup(file_name, version)
  118. for file_name in glob.glob('{}/requirements.txt'.format(REPO_PATH)):
  119. pip_install(file_name, version)
  120. for file_name in glob.glob('{}/*/requirements.txt'.format(REPO_PATH)):
  121. pip_install(file_name, version)
  122. out = pdoc(entry_mod)
  123. use_yaml = argv.get('out-put-type', 'json') == 'yaml'
  124. echo_json(use_yaml)
  125. if out:
  126. print("[COUT] CO_RESULT = true")
  127. else:
  128. print("[COUT] CO_RESULT = false")
  129. main()