YouTubeDownloader v1.1.2
YouTube content downloader
Loading...
Searching...
No Matches
update_py_requirements.py
Go to the documentation of this file.
1"""!
2********************************************************************************
3@file update_py_requirements.py
4@brief Update version in requirement files
5********************************************************************************
6"""
7
8# autopep8: off
9import sys
10import os
11import logging
12import re
13from typing import NamedTuple
14import requests
15
16sys.path.append(os.path.join(os.path.dirname(__file__), "../../"))
17from Source.Util.colored_log import init_console_logging # pylint: disable=wrong-import-position
18from Source.Util.openpyxl_util import XLSCreator # pylint: disable=wrong-import-position
19# autopep8: on
20
21log = logging.getLogger("UpdatePyRequirements")
22init_console_logging(logging.INFO)
23
24L_FILES = ["requirements.txt", "constraints.txt"] # files to update
25L_IGNORE_PACKAGES: list[str] = []
26FONT_NAME = "Consolas"
27I_TIMEOUT = 2 # timeout to get pip data
28
29L_PACKAGE_INFO_TITLE = ["Package", "Version", "Author", "Author_Mail", "License", "Homepage", "Package URL", "Requires", "Requires Py"]
30
31
32class PackageInfo(NamedTuple):
33 """!
34 @brief Package Information.
35 """
36 package: str
37 version: int
38 author: str
39 author_mail: str
40 license_info: str
41 home_page: str
42 package_url: str
43 requires_dist: list[str]
44 requires_py: str
45
46
47def create_package_summary_xls(l_package_info: list[PackageInfo]) -> None:
48 """!
49 @brief Update xls field with package summary
50 @param l_package_info : list with package infos
51 """
52 xls_creator = XLSCreator(font_name=FONT_NAME)
53 worksheet = xls_creator.workbook.active
54 worksheet.title = "PackageInfo"
55 for i, title in enumerate(L_PACKAGE_INFO_TITLE):
56 xls_creator.set_cell(worksheet, 1, i + 1, title, bold=True)
57 l_added_package = []
58 i_package = 0
59 for package in l_package_info:
60 if package not in l_added_package:
61 l_added_package.append(package)
62 for i, value in enumerate(package):
63 if isinstance(value, list):
64 if not value:
65 value = ""
66 else:
67 value = "\n".join(value)
68 elif isinstance(value, str):
69 pass
70 elif not value:
71 value = ""
72 xls_creator.set_cell(worksheet, i_package + 2, i + 1, str(value))
73 i_package += 1
74 xls_creator.set_table(worksheet, max_col=len(l_added_package[0]), max_row=len(l_added_package) + 1)
75 xls_creator.set_column_autowidth(worksheet)
76 worksheet.freeze_panes = "C2"
77 xls_creator.save(filename="PackageInfos.xlsx")
78 log.info("Write %s package infos to file", len(l_added_package))
79
80
81def get_package_info(package: str) -> PackageInfo | None:
82 """!
83 @brief Upgrade package from text file to latest version
84 @param package : check latest version of this package
85 @return package info
86 """
87 try:
88 url = f"https://pypi.org/pypi/{package}/json"
89 response = requests.get(url, timeout=I_TIMEOUT)
90 response.raise_for_status()
91 d_package_info = response.json()
92 except requests.exceptions.RequestException as e:
93 log.error("Error occurred: %s", e)
94 package_info = None
95 else:
96 l_requires_dist: list[str] = []
97 requires_dist = d_package_info["info"]["requires_dist"]
98 if requires_dist:
99 for req in requires_dist:
100 l_requires_dist.append(req)
101 package_info = PackageInfo(package,
102 d_package_info["info"]["version"],
103 d_package_info["info"]["author"],
104 d_package_info["info"]["author_email"],
105 d_package_info["info"]["license"],
106 d_package_info["info"]["home_page"],
107 d_package_info["info"]["package_url"],
108 l_requires_dist,
109 d_package_info["info"]["requires_python"])
110 return package_info
111
112
113def update_packages(filename: str) -> list[PackageInfo]:
114 """!
115 @brief Update package from text file to latest version
116 @param filename : file name
117 @return list with updated packages
118 """
119 with open(filename, mode="r", encoding="utf-8") as file:
120 lines = file.readlines()
121
122 i_update_cnt = 0
123 l_package_info = []
124 updated_lines = []
125 for line in lines:
126 if re.match(r"^\s*#", line): # comment line
127 updated_lines.append(line)
128 elif re.match(r"^\s*([\w\-]+)==([\w\.\-]+)\s*(#.*)?$", line): # check for fix version 'package==version'
129 package, version, comment = re.findall(r"^\s*([\w\-]+)==([\w\.\-]+)\s*(#.*)?$", line)[0]
130 if comment != "":
131 comment = f" {comment}"
132 package_info = get_package_info(package)
133 if (package_info is not None) and (package not in L_IGNORE_PACKAGES):
134 if package_info.version and (package_info.version != version):
135 updated_lines.append(f"{package}=={package_info.version}{comment}\n")
136 i_update_cnt += 1
137 log.info("Updated: %s %s", package, package_info.version)
138 else:
139 updated_lines.append(line)
140 log.debug(line)
141 l_package_info.append(package_info)
142 else:
143 updated_lines.append(line)
144 log.debug(line)
145 else: # package without version
146 updated_lines.append(line)
147 if line.strip():
148 package_info = get_package_info(line)
149 if package_info is not None:
150 l_package_info.append(package_info)
151 log.debug(line)
152
153 with open(filename, mode="w", encoding="utf-8") as file:
154 file.writelines(updated_lines)
155 log.info("%s packages updates in %s\n", i_update_cnt, filename)
156 return l_package_info
157
158
159if __name__ == "__main__":
160 l_all_package_info = []
161 for req_file in L_FILES:
162 l_file_package = update_packages(req_file)
163 l_all_package_info += l_file_package
164 if l_all_package_info:
165 create_package_summary_xls(l_all_package_info)
166 log.info("All packages checked and updated!")
None create_package_summary_xls(list[PackageInfo] l_package_info)
Update xls field with package summary.
PackageInfo|None get_package_info(str package)
Upgrade package from text file to latest version.
list[PackageInfo] update_packages(str filename)
Update package from text file to latest version.