diff --git a/.gitignore b/.gitignore index 66fc7dc..020285c 100644 --- a/.gitignore +++ b/.gitignore @@ -148,3 +148,5 @@ dmypy.json # Temporary files *.swp *~ +_dist/* +_build/* diff --git a/PyHasher.ico b/PyHasher.ico index e69de29..06a9ac1 100644 Binary files a/PyHasher.ico and b/PyHasher.ico differ diff --git a/pyhasher/_version.py b/pyhasher/_version.py new file mode 100644 index 0000000..73d0a40 --- /dev/null +++ b/pyhasher/_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.1-0-gf0149af-dirty" +GIT_COMMIT_HASH = "f0149af3b3d61c9959a5c14fbd2b8105ef333364" +GIT_BRANCH = "master" +BUILD_TIMESTAMP = "2025-08-25T06:19:22.500895+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/pyhasher/gui/gui.py b/pyhasher/gui/gui.py index a61e303..fb14937 100644 --- a/pyhasher/gui/gui.py +++ b/pyhasher/gui/gui.py @@ -21,6 +21,26 @@ HASH_DISPLAY_ORDER = ( "BLAKE2b", ) +# --- Import Version Info FOR THE WRAPPER ITSELF --- +try: + # Use absolute import based on package name + from pyhasher 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" +# --- End Import Version Info --- + +# --- Constants for Version Generation --- +DEFAULT_VERSION = "0.0.0+unknown" +DEFAULT_COMMIT = "Unknown" +DEFAULT_BRANCH = "Unknown" +# --- End Constants --- + class PyHasherApp: """ The main GUI application class for PyHasher. @@ -34,7 +54,10 @@ class PyHasherApp: root_window: The main tkinter window. """ self.root = root_window - self.root.title("PyHasher") + self.root.title( + f"PyHasher - {WRAPPER_APP_VERSION_STRING}" + ) + self.root.geometry("1024x400") # Increased height for more hashes self.file_path = tk.StringVar()