From 667108dfe40fd0f105b8f878aed675ea746d3e51 Mon Sep 17 00:00:00 2001 From: VALLONGOL Date: Tue, 24 Jun 2025 07:39:23 +0200 Subject: [PATCH] update main gui, add version --- ProfileAnalyzer.ico | Bin 0 -> 49137 bytes app_config.json | 3 +- profileanalyzer/_version.py | 74 ++++++++++++++++++++++++++++++++++++ profileanalyzer/gui/gui.py | 20 +++++++++- 4 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 profileanalyzer/_version.py diff --git a/ProfileAnalyzer.ico b/ProfileAnalyzer.ico index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e175f2325d1c9886726bad2c61c97d2984fd9aa6 100644 GIT binary patch literal 49137 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 literal 0 HcmV?d00001 diff --git a/app_config.json b/app_config.json index f90e9dd..54880a5 100644 --- a/app_config.json +++ b/app_config.json @@ -1,5 +1,4 @@ { "last_base_profile": "C:/src/____GitProjects/ProfileAnalyzer/execution_profiles/20250623_142502_test_overlay.prof", - "last_comp_profile": "C:/src/____GitProjects/ProfileAnalyzer/execution_profiles/20250623_143417_test_overlay.prof", - "editor_command": "code -g \"{file}:{line}\"" + "last_comp_profile": "C:/src/____GitProjects/ProfileAnalyzer/execution_profiles/20250623_143417_test_overlay.prof" } \ No newline at end of file diff --git a/profileanalyzer/_version.py b/profileanalyzer/_version.py new file mode 100644 index 0000000..ab5d5da --- /dev/null +++ b/profileanalyzer/_version.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# File generated by PyInstaller GUI Wrapper. DO NOT EDIT MANUALLY. +# Contains build-time information scraped from Git (if available) +# and a helper function to format version strings. + +import re + +# --- Version Data (Generated) --- +__version__ = "v.0.0.0.6-0-g7111c4a-dirty" +GIT_COMMIT_HASH = "7111c4a912b78f5c460a0dc104c16d7edb1f4c00" +GIT_BRANCH = "master" +BUILD_TIMESTAMP = "2025-06-24T05:32:28.134016+00:00" +IS_GIT_REPO = True + +# --- Default Values (for comparison or fallback) --- +DEFAULT_VERSION = "0.0.0+unknown" +DEFAULT_COMMIT = "Unknown" +DEFAULT_BRANCH = "Unknown" + +# --- Helper Function --- +def get_version_string(format_string=None): + """ + Returns a formatted string based on the build version information. + + Args: + format_string (str, optional): A format string using placeholders. + Defaults to "{version} ({branch}/{commit_short})" if None. + Placeholders: + {{version}}: Full version string (e.g., 'v1.0.0-5-gabcdef-dirty') + {{tag}}: Clean tag part if exists (e.g., 'v1.0.0'), else DEFAULT_VERSION. + {{commit}}: Full Git commit hash. + {{commit_short}}: Short Git commit hash (7 chars). + {{branch}}: Git branch name. + {{dirty}}: '-dirty' if the repo was dirty, empty otherwise. + {{timestamp}}: Full build timestamp (ISO 8601 UTC). + {{timestamp_short}}: Build date only (YYYY-MM-DD). + {{is_git}}: 'Git' if IS_GIT_REPO is True, 'Unknown' otherwise. + + Returns: + str: The formatted version string, or an error message if formatting fails. + """ + if format_string is None: + format_string = "{version} ({branch}/{commit_short})" # Default format + + replacements = {} + try: + replacements['version'] = __version__ if __version__ else DEFAULT_VERSION + replacements['commit'] = GIT_COMMIT_HASH if GIT_COMMIT_HASH else DEFAULT_COMMIT + replacements['commit_short'] = GIT_COMMIT_HASH[:7] if GIT_COMMIT_HASH and len(GIT_COMMIT_HASH) >= 7 else DEFAULT_COMMIT + replacements['branch'] = GIT_BRANCH if GIT_BRANCH else DEFAULT_BRANCH + replacements['timestamp'] = BUILD_TIMESTAMP if BUILD_TIMESTAMP else "Unknown" + replacements['timestamp_short'] = BUILD_TIMESTAMP.split('T')[0] if BUILD_TIMESTAMP and 'T' in BUILD_TIMESTAMP else "Unknown" + replacements['is_git'] = "Git" if IS_GIT_REPO else "Unknown" + replacements['dirty'] = "-dirty" if __version__ and __version__.endswith('-dirty') else "" + + tag = DEFAULT_VERSION + if __version__ and IS_GIT_REPO: + match = re.match(r'^(v?([0-9]+(?:\.[0-9]+)*))', __version__) + if match: + tag = match.group(1) + replacements['tag'] = tag + + output_string = format_string + for placeholder, value in replacements.items(): + pattern = re.compile(r'{{\s*' + re.escape(placeholder) + r'\s*}}') + output_string = pattern.sub(str(value), output_string) + + if re.search(r'{\s*\w+\s*}', output_string): + pass # Or log a warning: print(f"Warning: Unreplaced placeholders found: {output_string}") + + return output_string + + except Exception as e: + return f"[Formatting Error: {e}]" diff --git a/profileanalyzer/gui/gui.py b/profileanalyzer/gui/gui.py index 3c35cc0..88c6d08 100644 --- a/profileanalyzer/gui/gui.py +++ b/profileanalyzer/gui/gui.py @@ -68,6 +68,24 @@ class ScrolledFrame(ttk.Frame): self.canvas.itemconfigure(self.interior_id, width=self.canvas.winfo_width()) +# --- Import Version Info FOR THE WRAPPER ITSELF --- +try: + # Use absolute import based on package name + from profileanalyzer import _version as wrapper_version + WRAPPER_APP_VERSION_STRING = f"{wrapper_version.__version__} ({wrapper_version.GIT_BRANCH}/{wrapper_version.GIT_COMMIT_HASH[:7]})" + WRAPPER_BUILD_INFO = f"Wrapper Built: {wrapper_version.BUILD_TIMESTAMP}" +except ImportError: + # This might happen if you run the wrapper directly from source + # without generating its _version.py first (if you use that approach for the wrapper itself) + WRAPPER_APP_VERSION_STRING = "(Dev Wrapper)" + WRAPPER_BUILD_INFO = "Wrapper build time unknown" + +# --- Constants for Version Generation --- +DEFAULT_VERSION = "0.0.0+unknown" +DEFAULT_COMMIT = "Unknown" +DEFAULT_BRANCH = "Unknown" +# --- End Constants --- + class ProfileAnalyzerGUI(tk.Frame): """ The main GUI frame for the profile analyzer application. @@ -84,7 +102,7 @@ class ProfileAnalyzerGUI(tk.Frame): def __init__(self, master: tk.Tk): super().__init__(master) self.master = master - self.master.title("Python Profile Analyzer") + self.master.title(f"Python Profile Analyzer - {WRAPPER_APP_VERSION_STRING}") self.master.geometry("1400x800") self.master.protocol("WM_DELETE_WINDOW", self._on_closing)