From dda95f87ceb384a8c3e10df8fd0429f26590f898 Mon Sep 17 00:00:00 2001 From: wangxiyuan Date: Thu, 6 May 2021 16:07:30 +0800 Subject: [PATCH] Add dependence fetch tool --- README.en.md | 1 + README.md | 1 + tools/fetch_dep | 190 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 192 insertions(+) create mode 100755 tools/fetch_dep diff --git a/README.en.md b/README.en.md index e9251d1..03e4d7e 100644 --- a/README.en.md +++ b/README.en.md @@ -53,6 +53,7 @@ Meeting agenda and summary: =' in version: + version = version.split('>=')[-1].strip(' ')[:-1].split(',')[0] + elif '<' in version: + version = version.split('<')[-1].strip(' ')[:-1].split(',')[0] + except ValueError: + project, version = item, "N/A" + if version not in ['N/A', "0a"]: + # TODO: Add special project list + if not self.dep_list.get(project) or p_version.parse(version) > p_version.parse(self.dep_list[project]): + if project.lower() == 'prettytable' and p_version.parse(version) < p_version.parse('0.7.1'): + version = '0.7.1' + if project.lower() == 'msgpack' and p_version.parse(version) < p_version.parse('0.5.0'): + version = '0.5.0' + self.dep_list[project] = version + self._get_dep(project, version, is_init) + + def _purge(self): + """Purge the duplicated json file""" + file_path = "./pypi_json_%s/" % self.openstack_release + file_list = os.listdir(file_path) + file_dict = {} + for file_name in file_list: + if not file_name.endswith("json"): + continue + project_name, project_version = file_name.rsplit('-', 1)[0], file_name.rsplit('-', 1)[1].rsplit('.', 1)[0] + if not file_dict.get(project_name): + file_dict[project_name] = project_version + elif p_version.parse(project_version) < p_version.parse(file_dict[project_name]): + os.remove(file_path+file_name) + elif p_version.parse(project_version) > p_version.parse(file_dict[project_name]): + os.remove(file_path+project_name+"-"+file_dict[project_name]+".json") + file_dict[project_name] = project_version + + def init_all_dep(self): + """download all related json file of packages""" + self.dep_list = {} + for project, version in self.project_dict.items(): + self._get_dep(project, version, True) + self._purge() + + def get_all_dep(self): + """fetch all related dependent packages""" + self.dep_list = {} + for project, version in self.project_dict.items(): + self._get_dep(project, version, False) + + with open(self.output, "w") as csv_file: + writer=csv.writer(csv_file) + writer.writerow(["Project", "Version"]) + for key, value in self.dep_list.items(): + writer.writerow([key, value]) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("-o", "--output", help="Output file name, default: result", type=str, default="result") + parser.add_argument("-s", "--skip-init", help="Skip init step", action="store_true") + parser.add_argument("release", type=str, help="OpenStack release name", choices=OPENSTACK_RELEASE_MAP.keys()) + + args = parser.parse_args() + + myobj = FetchDependence(args.release, args.output) + + if not args.skip_init: + print("Start fetch caching files to pypi_json_%s folder" % args.release) + print("...") + myobj.init_all_dep() + print("Success cached pypi files.") + print("...") + print("Note: There is no need to fetch pypi again from next time, unless you want to refresh the cache. " + "Please use -s to skip this step.") + print("...") + print("Start count dependencies") + print("...") + myobj.get_all_dep() + print("Success fetched dependencies, the result is saved into %s file" % args.output) -- Gitee