diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..99bc46512dd15197e54f086572a5aef764bc6abf --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.pyc +*.xlsx diff --git a/Helper/__init__.py b/Helper/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Helper/package_helper.py b/Helper/package_helper.py new file mode 100644 index 0000000000000000000000000000000000000000..68c127f4981965e61747b3a11a2ffc5cafed9c36 --- /dev/null +++ b/Helper/package_helper.py @@ -0,0 +1,44 @@ + +import urllib.request +import bs4 + +from utils.Package import Package +from utils.Issue import Issue +from utils.PullRequest import PullRequest + + +class PackageHelper: + + @staticmethod + def generate_issue_info(package): + issue_url = package.get_url() + "/issues" + print("Issue_URL: ", issue_url) + page = urllib.request.urlopen(issue_url) + contents = page.read().decode('utf-8') + + # parse html + soup = bs4.BeautifulSoup(contents, 'html.parser') + elem_list = soup.find_all('a', attrs=['class', 'title'], href=True) + for elem in elem_list: + issue_title = elem.attrs['title'].strip() + issue_url = "https://gitee.com" + elem.attrs['href'] + issue = Issue(issue_title, issue_url) + package.add_issue(issue) + print(issue_title, issue_url) + + @staticmethod + def generate_pr_info(package): + pr_url = package.get_url() + "/pulls" + print("PullRequest URL: ", pr_url) + page = urllib.request.urlopen(pr_url) + contents = page.read().decode('utf-8') + + # parse html + soup = bs4.BeautifulSoup(contents, 'html.parser') + elem_list = soup.find_all('a', attrs=['class', 'title'], href=True) + for elem in elem_list: + pr_title = elem.attrs['title'].strip() + pr_url = "https://gitee.com" + elem.attrs['href'] + pr = PullRequest(pr_title, pr_url) + package.add_pr(pr) + print(pr_title, pr_url) diff --git a/Helper/report_helper.py b/Helper/report_helper.py new file mode 100644 index 0000000000000000000000000000000000000000..09e57bc1b23f13326faa1e237576dccfbd56120e --- /dev/null +++ b/Helper/report_helper.py @@ -0,0 +1,85 @@ +import xlsxwriter + + +class ReportHelper: + + @staticmethod + def generate_sheet_sig(sig_sheet, sig_list): + sig_sheet.write('A1', 'Sig') + sig_sheet.write('B1', '软件包') + sig_sheet.write('C1', '软件包URL') + + row = 1 + col = 0 + for sig in sig_list: + for package in sig.get_package_list(): + sig_sheet.write(row, col, sig.get_sig_name()) + sig_sheet.write(row, col + 1, package.get_package_name()) + sig_sheet.write(row, col + 2, package.get_url()) + row = row + 1 + + @staticmethod + def generate_sheet_pr(pr_sheet, sig_list): + pr_sheet.write('A1', 'Sig') + pr_sheet.write('B1', '软件包') + pr_sheet.write('C1', '软件包URL') + pr_sheet.write('D1', 'PR title') + pr_sheet.write('E1', 'PR url') + + row = 1 + col = 0 + for sig in sig_list: + for package in sig.get_package_list(): + for pr in package.get_pr_list(): + pr_sheet.write(row, col, sig.get_sig_name()) + pr_sheet.write(row, col + 1, package.get_package_name()) + pr_sheet.write(row, col + 2, package.get_url()) + pr_sheet.write(row, col + 3, pr.get_title()) + pr_sheet.write(row, col + 4, pr.get_url()) + row = row + 1 + + @staticmethod + def generate_sheet_issue(issue_sheet, sig_list): + issue_sheet.write('A1', 'Sig') + issue_sheet.write('B1', '软件包') + issue_sheet.write('C1', '软件包URL') + issue_sheet.write('D1', 'Issue title') + issue_sheet.write('E1', 'Issue url') + + row = 1 + col = 0 + for sig in sig_list: + for package in sig.get_package_list(): + for issue in package.get_issue_list(): + issue_sheet.write(row, col, sig.get_sig_name()) + issue_sheet.write(row, col + 1, package.get_package_name()) + issue_sheet.write(row, col + 2, package.get_url()) + issue_sheet.write(row, col + 3, issue.get_title()) + issue_sheet.write(row, col + 4, issue.get_url()) + row = row + 1 + + @staticmethod + def generate_report(sig_list, file_path='sig_info.xlsx'): + print("===== Start Generate Report =====") + workbook = xlsxwriter.Workbook(file_path) + sig_sheet = workbook.add_worksheet(name="sig_info") + ReportHelper.generate_sheet_sig(sig_sheet, sig_list) + + pr_sheet = workbook.add_worksheet(name="pr_info") + ReportHelper.generate_sheet_pr(pr_sheet, sig_list) + + issue_sheet = workbook.add_worksheet(name="issue_info") + ReportHelper.generate_sheet_issue(issue_sheet, sig_list) + + workbook.close() + print("===== Generate Report Done =====") + print("Report file: ", file_path) + + @staticmethod + def print_sig_list(sig_list): + print("===== Start Print Sig List =====") + for sig in sig_list: + print(sig.get_sig_name()) + print("Total sig num: ", len(sig_list)) + print("===== Print Sig List Done =====") + diff --git a/Helper/sig_helper.py b/Helper/sig_helper.py new file mode 100644 index 0000000000000000000000000000000000000000..46eee1f021d44634235df9edaebb12159dd444fe --- /dev/null +++ b/Helper/sig_helper.py @@ -0,0 +1,76 @@ +import urllib.request +import re + +from utils.Sig import Sig +from utils.Package import Package + +from Helper.package_helper import PackageHelper + + +sig_info_url = "https://gitee.com/openeuler/community/raw/master/sig/sigs.yaml" +sig_pattern = r"- name: (.*)" +openeuler_software_pattern = r"- (openeuler/.*)" +src_openeuler_software_pattern = r"- (src-openeuler/.*)" + +BlockList = [ + "openeuler/blog", +] + + +class SigHelper: + + @staticmethod + def init_sig_info(sig_list): + print("===== Start Init Sig Info... =====") + tmp_sig = None + + page = urllib.request.urlopen(sig_info_url) + contents = page.read().decode('utf-8') + # print(contents) + lines = contents.split("\n") + for line in lines: + result = re.search(sig_pattern, line) + if result: + # print("get one sig: ", result.group(1)) + tmp_sig = Sig(result.group(1)) + sig_list.append(tmp_sig) + continue + + result = re.search(openeuler_software_pattern, line) + if result: + # print("get one openeuler software: ", result.group(1)) + tmp_package = Package(result.group(1)) + if tmp_package.get_package_name() in BlockList: + # print(tmp_package.getSoftwareName(), " is blocked, skip and continue") + continue + if tmp_sig: + tmp_sig.add_software(tmp_package) + continue + + result = re.search(src_openeuler_software_pattern, line) + if result: + # print("get one src-openeuler software: ", result.group(1)) + tmp_package = Package(result.group(1)) + if tmp_package.get_package_name() in BlockList: + # print(tmp_package.getSoftwareName(), " is blocked, skip and continue") + continue + if tmp_sig: + tmp_sig.add_software(tmp_package) + continue + print("===== Init Sig Info Done =====") + + @staticmethod + def process_sig_issue(sig_list): + print("===== Start Process Sig Issue =====") + for sig in sig_list: + for package in sig.get_package_list(): + PackageHelper.generate_issue_info(package) + print("===== Process Sig Issue Done =====") + + @staticmethod + def process_sig_pr(sig_list): + print("===== Start Process Sig Pull Request =====") + for sig in sig_list: + for package in sig.get_package_list(): + PackageHelper.generate_pr_info(package) + print("===== Process Sig Pull Request Done =====") diff --git a/README.en.md b/README.en.md deleted file mode 100644 index 2d61621774f56ffbd5d29dba8039f2b0aa72eea8..0000000000000000000000000000000000000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# openeuler-wiki-bot - -#### Description -A wiki-generate tool for openEuler sigs - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md deleted file mode 100644 index 866e7d1182fe718f4a75fc2ade528258bca80578..0000000000000000000000000000000000000000 --- a/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# openeuler-wiki-bot - -#### 介绍 -A wiki-generate tool for openEuler sigs - -#### 软件架构 -软件架构说明 - - -#### 安装教程 - -1. xxxx -2. xxxx -3. xxxx - -#### 使用说明 - -1. xxxx -2. xxxx -3. xxxx - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/openeuler-wiki-bot.py b/openeuler-wiki-bot.py new file mode 100644 index 0000000000000000000000000000000000000000..2ffb0a18180e2e3150204ff7592f05aa1a4eeaf9 --- /dev/null +++ b/openeuler-wiki-bot.py @@ -0,0 +1,63 @@ +import argparse + + +from Helper.sig_helper import SigHelper +from Helper.report_helper import ReportHelper + +sig_list = [] + + +def init_parser(): + parser = argparse.ArgumentParser(description="openEuler wiki bot.") + + parser.add_argument("-l", "--list", action="store_true", default=False, help="List all sig info.") + parser.add_argument("-r", "--report", action="store_true", default=False, help="Generate information report.") + + parser.add_argument("-s", "--sig", type=str, help="Specify sig group.") + parser.add_argument("-a", "--all", action="store_true", default=False, help="Report information for all sig.") + return parser + + +def process_list(): + SigHelper.init_sig_info(sig_list) + ReportHelper.print_sig_list(sig_list) + + +def process_report_sig(): + SigHelper.init_sig_info(sig_list) + for sig in sig_list: + if sig.get_sig_name() == args.sig: + tmp_sig_list = [sig] + SigHelper.process_sig_pr(tmp_sig_list) + SigHelper.process_sig_issue(tmp_sig_list) + ReportHelper.generate_report(tmp_sig_list) + return + print("Unrecognized sig: ", args.sig, ", please check input.") + + +def process_report_all(): + SigHelper.init_sig_info(sig_list) + SigHelper.process_sig_pr(sig_list) + SigHelper.process_sig_issue(sig_list) + ReportHelper.generate_report(sig_list) + + +def process_report(args): + if args.sig: + process_report_sig() + elif args.all: + process_report_all() + else: + print("Unrecognized command option, please check input.") + + +if __name__ == '__main__': + parser = init_parser() + args = parser.parse_args() + if args.list: + process_list() + elif args.report: + process_report(args) + else: + parser.print_help() + diff --git a/utils/Issue.py b/utils/Issue.py new file mode 100644 index 0000000000000000000000000000000000000000..ebf14a09d066d3d249d4deb243e2f223fece4db3 --- /dev/null +++ b/utils/Issue.py @@ -0,0 +1,18 @@ + + +class Issue: + + def __init__(self, title, url): + self.__title = title + self.__creator = None + self.__assigner = None + self.__description = None + self.__create_date = None + self.__url = url + + def get_title(self): + return self.__title + + def get_url(self): + return self.__url + diff --git a/utils/Package.py b/utils/Package.py new file mode 100644 index 0000000000000000000000000000000000000000..0ff0a98e22be1ffd7b6464cbe9af4b65194cbdc4 --- /dev/null +++ b/utils/Package.py @@ -0,0 +1,26 @@ + + +class Package: + + def __init__(self, softwareName): + self.__package_name = softwareName + self.__issues = [] + self.__pull_requests = [] + + def add_issue(self, issue): + self.__issues.append(issue) + + def add_pr(self, pull_request): + self.__pull_requests.append(pull_request) + + def get_package_name(self): + return self.__package_name + + def get_url(self): + return "https://gitee.com/" + self.__package_name + + def get_issue_list(self): + return self.__issues + + def get_pr_list(self): + return self.__pull_requests diff --git a/utils/PullRequest.py b/utils/PullRequest.py new file mode 100644 index 0000000000000000000000000000000000000000..988bd83453f7551134e73b8d3c0ef3555d92f591 --- /dev/null +++ b/utils/PullRequest.py @@ -0,0 +1,17 @@ + + +class PullRequest: + + def __init__(self, title, url): + self.__title = title + self.__creator = None + self.__create_date = None + self.__ci_status = None + self.__url = url + self.__status = None + + def get_title(self): + return self.__title + + def get_url(self): + return self.__url diff --git a/utils/Sig.py b/utils/Sig.py new file mode 100644 index 0000000000000000000000000000000000000000..f67afd06e9b1c3c61d787c9e005630483046c0e3 --- /dev/null +++ b/utils/Sig.py @@ -0,0 +1,26 @@ + + +class Sig: + + def __init__(self, sigName): + self.__sigName = sigName + self.__packages = [] + self.__maintainers = [] + self.__committers = [] + + def add_software(self, software): + self.__packages.append(software) + + def add_maintainer(self, maintainer): + self.__maintainers.append(maintainer) + + def add_committer(self, committer): + self.__committers.append(committer) + + def get_sig_name(self): + return self.__sigName + + def get_package_list(self): + return self.__packages + + diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391