BonPrinter v1.2.0
Thermal Printer tool
Loading...
Searching...
No Matches
update_service.py
Go to the documentation of this file.
1"""!
2********************************************************************************
3@file update_service.py
4@brief check for newer tool version
5********************************************************************************
6"""
7
8import logging
9import requests
10
11from Source.version import __title__, __version__, __owner__, __repo__
12
13log = logging.getLogger(__title__)
14
15I_TIMEOUT = 5
16S_UPDATE_URL = f"https://github.com/{__owner__}/{__repo__}/releases/latest"
17S_UPDATE_URL_API = f"https://api.github.com/repos/{__owner__}/{__repo__}/releases/latest"
18
19
20def compare_versions(current_version: str, latest_version: str) -> bool:
21 """!
22 @brief Compare version for newer status
23 @param current_version : current version
24 @param latest_version : latest version
25 @return status if newer version
26 """
27 newer_version = None
28 l_current_version = current_version.split('.')
29 l_latest_version = latest_version.split('.')
30 try:
31 _all_int = all(isinstance(int(x), int) for x in (l_current_version + l_latest_version))
32 except ValueError:
33 newer_version = False
34 log.debug("Version not int; current: %s; latest: %s", current_version, latest_version)
35 else:
36 current_parts = list(map(int, l_current_version))
37 latest_parts = list(map(int, l_latest_version))
38 if current_parts == latest_parts:
39 newer_version = False
40 log.debug("Current and latest versions are same")
41 else:
42 for current, latest in zip(current_parts, latest_parts):
43 if current > latest:
44 newer_version = False
45 break
46 if latest > current:
47 newer_version = True
48 break
49 if newer_version is None:
50 newer_version = len(latest_parts) > len(current_parts)
51 return newer_version
52
53
54def get_newest_tool_version() -> str | None:
55 """!
56 @brief Get newest tool version
57 @return latest version
58 """
59 latest_release = None
60 try:
61 response = requests.get(S_UPDATE_URL_API, timeout=I_TIMEOUT)
62 except requests.Timeout:
63 pass # timeout
64 except requests.RequestException:
65 pass # request exception
66 else:
67 if response.status_code == 200:
68 latest_release = response.json().get("tag_name", "")
69 latest_release = "".join(c for c in latest_release if c.isdigit() or c == ".")
70 return latest_release
71
72
73def get_tool_update_status() -> str | None:
74 """!
75 @brief Get tool update status
76 @return tool status: None: not update required or no connection; else newest version
77 """
78 current_version = __version__
79 latest_release = get_newest_tool_version()
80 if latest_release is not None:
81 b_newer_version = compare_versions(current_version, latest_release)
82 update_to_version = latest_release if b_newer_version else None
83 else:
84 update_to_version = None
85 return update_to_version
str|None get_tool_update_status()
Get tool update status.
bool compare_versions(str current_version, str latest_version)
Compare version for newer status.
str|None get_newest_tool_version()
Get newest tool version.