From 27a7c60802142d7a3343703e24b2c343cdd0bb04 Mon Sep 17 00:00:00 2001 From: Chris Hennes Date: Fri, 25 Feb 2022 20:40:52 -0600 Subject: [PATCH] Addon Manager: Minor improvements to utilities --- .../AddonManager/addonmanager_utilities.py | 101 ++++++++++-------- 1 file changed, 59 insertions(+), 42 deletions(-) diff --git a/src/Mod/AddonManager/addonmanager_utilities.py b/src/Mod/AddonManager/addonmanager_utilities.py index 07d24de53e..03969bbb31 100644 --- a/src/Mod/AddonManager/addonmanager_utilities.py +++ b/src/Mod/AddonManager/addonmanager_utilities.py @@ -26,11 +26,7 @@ import re import ctypes from typing import Union, Optional, Any -import urllib -from urllib.request import Request -from urllib.error import URLError from urllib.parse import urlparse -from http.client import HTTPResponse from PySide2 import QtCore, QtWidgets @@ -70,12 +66,6 @@ def symlink(source, link_name): raise ctypes.WinError() -def getserver(url): - """returns the server part of an url""" - - return "{uri.scheme}://{uri.netloc}/".format(uri=urlparse(url)) - - def update_macro_details(old_macro, new_macro): """Update a macro with information from another one @@ -112,7 +102,7 @@ def remove_directory_if_empty(dir): def restart_freecad(): - "Shuts down and restarts FreeCAD" + """Shuts down and restarts FreeCAD""" args = QtWidgets.QApplication.arguments()[1:] if FreeCADGui.getMainWindow().close(): @@ -122,18 +112,12 @@ def restart_freecad(): def get_zip_url(repo): - "Returns the location of a zip file from a repo, if available" + """Returns the location of a zip file from a repo, if available""" parsedUrl = urlparse(repo.url) if parsedUrl.netloc == "github.com": return f"{repo.url}/archive/{repo.branch}.zip" - elif ( - parsedUrl.netloc == "framagit.org" - or parsedUrl.netloc == "gitlab.com" - or parsedUrl.netloc == "salsa.debian.org" - ): - # https://framagit.org/freecad-france/mooc-workbench/-/archive/master/mooc-workbench-master.zip - # https://salsa.debian.org/mess42/pyrate/-/archive/master/pyrate-master.zip + elif parsed_url.netloc in ["gitlab.com", "framagit.org", "salsa.debian.org"]: return f"{repo.url}/-/archive/{repo.branch}/{repo.name}-{repo.branch}.zip" else: FreeCAD.Console.PrintLog( @@ -141,15 +125,17 @@ def get_zip_url(repo): parsedUrl.netloc, "\n", ) - return None + return f"{repo.url}/-/archive/{repo.branch}/{repo.name}-{repo.branch}.zip" def recognized_git_location(repo) -> bool: + """Returns whether this repo is based at a known git repo location: works with github, gitlab, framagit, and salsa.debian.org""" + parsed_url = urlparse(repo.url) if parsed_url.netloc in [ "github.com", - "framagit.org", "gitlab.com", + "framagit.org", "salsa.debian.org", ]: return True @@ -158,7 +144,7 @@ def recognized_git_location(repo) -> bool: def construct_git_url(repo, filename): - "Returns a direct download link to a file in an online Git repo: works with github, gitlab, framagit, and salsa.debian.org" + """Returns a direct download link to a file in an online Git repo""" parsed_url = urlparse(repo.url) if parsed_url.netloc == "github.com": @@ -171,17 +157,18 @@ def construct_git_url(repo, filename): + parsed_url.netloc + f" for file {filename}\n" ) - return None + # Assume it's some kind of local GitLab instance... + return f"{repo.url}/-/raw/{repo.branch}/{filename}" def get_readme_url(repo): - "Returns the location of a readme file" + """Returns the location of a readme file""" return construct_git_url(repo, "README.md") def get_metadata_url(url): - "Returns the location of a package.xml metadata file" + """Returns the location of a package.xml metadata file""" return construct_git_url(url, "package.xml") @@ -193,18 +180,15 @@ def get_desc_regex(repo): parsedUrl = urlparse(repo.url) if parsedUrl.netloc == "github.com": return r'' + else: + FreeCAD.Console.PrintLog( + "Debug: addonmanager_utilities.get_desc_regex: Unknown git host:", + repo.url, + "\n", + ) return r'' - FreeCAD.Console.PrintLog( - "Debug: addonmanager_utilities.get_desc_regex: Unknown git host:", - repo.url, - "\n", - ) - return None def get_readme_html_url(repo): @@ -216,7 +200,10 @@ def get_readme_html_url(repo): elif parsedUrl.netloc in ["gitlab.com", "salsa.debian.org", "framagit.org"]: return f"{repo.url}/-/blob/{repo.branch}/README.md" else: - return None + FreeCAD.Console.PrintLog( + "Unrecognized git repo location '' -- guessing it is a GitLab instance..." + ) + return f"{repo.url}/-/blob/{repo.branch}/README.md" def repair_git_repo(repo_url: str, clone_dir: str) -> None: @@ -273,6 +260,11 @@ def is_darkmode() -> bool: if hasattr(QtWidgets.QApplication.instance(), "styleSheet"): if "dark" in QtWidgets.QApplication.instance().styleSheet().lower(): return True + else: + pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/MainWindow") + style = pref.GetString("StyleSheet") + if "dark" in style.lower(): + return True return False @@ -305,19 +297,44 @@ def attention_color_string() -> str: attentionColorString = "rgb(255,149,0)" return attentionColorString +def get_assigned_string_literal(line:str) -> Optional[str]: + """Look for a line of the form my_var = "A string literal" and return the string literal. + If the assignment is of a floating point value, that value is converted to a string + and returned. If neither is true, returns None.""" + + string_search_regex = re.compile(r"\s*(['\"])(.*)\1") + _,_,after_equals = line.partition("=") + match = re.match(string_search_regex, after_equals) + if match: + return str(match.group(2)) + if is_float(after_equals): + return str(after_equals).strip() + return None def get_macro_version_from_file(filename: str) -> str: - re_version = re.compile(r"^__Version__\s*=\s*(['\"])(.*)\1", flags=re.IGNORECASE) + """ Get the version of the macro from a local macro file. Supports strings, ints, and floats, as + well as a reference to __date__ """ + + date = "" with open(filename, "r", errors="ignore") as f: line_counter = 0 - max_lines_to_scan = 50 + max_lines_to_scan = 200 while line_counter < max_lines_to_scan: line_counter += 1 line = f.readline() - if line.startswith("__"): - match = re.match(re_version, line) + if not line: # EOF + break + if line.lower().startswith("__version__"): + match = get_assigned_string_literal(line) if match: - return match.group(2) + return match + elif "__date__" in line.lower(): + # Don't do any real syntax checking, just assume the line is something like __version__ = __date__ + return date + elif line.lower().startswith("__date__"): + match = get_assigned_string_literal(line) + if match: + date = match return ""