Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.1.0/).
## [Unreleased]

### Store-Paket 1.0.7.0 (T-20260928-288887892, 2026-09-28)
- Laufzeit, Über-Dialog und Workspace-Export lesen die Version jetzt aus `pyproject.toml`; der Paketbau prüft die Übereinstimmung mit `store_package.json`.
- Desktop-, Fenster-, EXE-, Mobile- und Legacy-Icons nutzen jetzt das vom Nutzer ausgewählte neue Store-Kachelmotiv. `scripts/gen_store_icons.py` erzeugt daraus alle benötigten Größen einschließlich der MSIX-`targetsize`- und `altform`-Varianten.
- `scripts/build_store_msix.ps1` erzeugt die Icons vor dem PyInstaller-Build, prüft den Quellbaum und ruft den Store-Builder mit Paket-Gate auf. Dadurch wird `resources.pri` in das MSIX aufgenommen.
- Der Store-Readiness-Check prüft jetzt den versionierten Paketpfad `releases/windowsstore/v1.0.7/ExplorerPro.msix`.
Expand Down
2 changes: 1 addition & 1 deletion EXPORTFORMAT.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ Nicht exportieren:
"created_at": "2026-07-22T00:00:00+00:00",
"app": {
"name": "ExplorerPro",
"version": "1.0.0",
"version": "1.0.7",
"platform": "windows"
},
"export_options": {
Expand Down
1 change: 1 addition & 0 deletions ExplorerPro.spec
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ a = Analysis(
pathex=[str(src_dir), str(project_root)],
binaries=[],
datas=[
(str(project_root / 'pyproject.toml'), '.'),
(str(icon_file), '.'),
(str(project_root / 'assets'), 'assets'),
(str(project_root / 'locales'), 'locales'),
Expand Down
4 changes: 4 additions & 0 deletions scripts/build_store_msix.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ if ($CheckToolsOnly) {
}
$config = Get-Content (Join-Path $projectRoot 'store_package.json') -Raw | ConvertFrom-Json
$releaseVersion = $config.version -replace '\.0$', ''
$projectVersion = & python -c "import sys; sys.path.insert(0, r'$projectRoot\src'); from version import __version__; print(__version__)"
if ($LASTEXITCODE -ne 0 -or $releaseVersion -ne $projectVersion) {
throw "Store package version $($config.version) differs from pyproject.toml version $projectVersion."
}
$output = Join-Path $projectRoot "releases\windowsstore\v$releaseVersion\ExplorerPro.msix"
$exe = Join-Path $projectRoot 'dist\ExplorerPro\ExplorerPro.exe'

Expand Down
3 changes: 1 addition & 2 deletions src/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@
ExplorerPro - Intelligenter Datei-Explorer
Fusion aus: ProFiler, PythonBox, ProSync, AmpelTool, SoftwareCenter, ProfiPrompt

Version: 0.1.0
"""

__version__ = "0.1.0"
from .version import __version__ as __version__
__author__ = "ExplorerPro Team"

from .app import ExplorerProApp
Expand Down
4 changes: 2 additions & 2 deletions src/core/export_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from pathlib import Path
from typing import Any

APP_VERSION = "1.0.0"
from version import __version__
SCHEMA = "explorerpro-workspace-v1"

# Nur Muster die standardmäßig aktiv sind (default=True in privacy_monitor.py)
Expand Down Expand Up @@ -46,7 +46,7 @@ def build_export(
"created_at": datetime.now(timezone.utc).isoformat(),
"app": {
"name": "ExplorerPro",
"version": APP_VERSION,
"version": __version__,
"platform": platform.system().lower(),
},
"export_options": {
Expand Down
5 changes: 3 additions & 2 deletions src/gui/main_window.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from .browser.file_browser import FileBrowser
from .preview.preview_panel import PreviewPanel
from .status_bar import StatusBarWidget
from version import __version__


class SearchToolBar(QToolBar):
Expand Down Expand Up @@ -776,8 +777,8 @@ def _show_about(self):
QMessageBox.about(
self,
"Über ExplorerPro",
"""<h2>ExplorerPro</h2>
<p>Version 1.0.0</p>
f"""<h2>ExplorerPro</h2>
<p>Version {__version__}</p>
<p>Ein intelligenter Datei-Explorer mit:</p>
<ul>
<li>Datenbank-gestützter Volltextsuche</li>
Expand Down
8 changes: 6 additions & 2 deletions src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
ExplorerPro - Ein intelligenter Datei-Explorer
Fusion aus ProFiler, PythonBox, ProSync, AmpelTool, SoftwareCenter, ProfiPrompt

Version: 0.1.0
"""

import sys
Expand All @@ -27,6 +26,7 @@
from PySide6.QtGui import QIcon

from app import ExplorerProApp
from version import __version__


def load_app_icon() -> QIcon:
Expand Down Expand Up @@ -61,6 +61,10 @@ def install_qt_translations(app: QApplication, lang: str):
return None


def set_application_version(app: QApplication) -> None:
app.setApplicationVersion(__version__)


def main():
"""Haupteinstiegspunkt für ExplorerPro"""
# High DPI Support
Expand All @@ -73,7 +77,7 @@ def main():
app.setOrganizationName("ExplorerPro")
from translator import get_translator
install_qt_translations(app, get_translator().get_language())
app.setApplicationVersion("0.1.0")
set_application_version(app)
icon = load_app_icon()
if not icon.isNull():
app.setWindowIcon(icon)
Expand Down
25 changes: 25 additions & 0 deletions src/version.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
"""Read the application version from the project metadata."""

import re
import sys
from pathlib import Path


def _project_metadata_path() -> Path:
if getattr(sys, "frozen", False):
return Path(sys._MEIPASS) / "pyproject.toml"
return Path(__file__).resolve().parents[1] / "pyproject.toml"


def get_version() -> str:
metadata = _project_metadata_path().read_text(encoding="utf-8")
project_section = re.search(r"(?ms)^\[project\]\s*\n(.*?)(?=^\[|\Z)", metadata)
if project_section is None:
raise ValueError("pyproject.toml has no [project] section")
match = re.search(r'^version\s*=\s*"([^\"]+)"\s*$', project_section.group(1), re.MULTILINE)
if match is None:
raise ValueError("pyproject.toml has no project version")
return match.group(1)


__version__ = get_version()
2 changes: 1 addition & 1 deletion tests/test_release_smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@


PROJECT_ROOT = Path(__file__).resolve().parents[1]
RELEASE_EXE = PROJECT_ROOT / "releases" / "v1.0.0" / "ExplorerPro" / "ExplorerPro.exe"
RELEASE_EXE = PROJECT_ROOT / "dist" / "ExplorerPro" / "ExplorerPro.exe"


@pytest.mark.skipif(sys.platform != "win32", reason="Release-EXE-Smoke ist Windows-spezifisch")
Expand Down
26 changes: 26 additions & 0 deletions tests/test_version_single_source.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
"""The packaged and displayed versions follow pyproject.toml."""

import json
from pathlib import Path

from PySide6.QtWidgets import QApplication, QMessageBox

from src import __version__
from src.gui.main_window import MainWindow
from src.main import set_application_version


ROOT = Path(__file__).resolve().parents[1]


def test_runtime_about_and_package_versions_match(monkeypatch):
app = QApplication.instance() or QApplication([])
set_application_version(app)

captured = {}
monkeypatch.setattr(QMessageBox, "about", lambda _parent, _title, body: captured.setdefault("body", body))
MainWindow._show_about(None)

package_version = json.loads((ROOT / "store_package.json").read_text(encoding="utf-8"))["version"]
assert app.applicationVersion() == __version__ == package_version.removesuffix(".0")
assert f"Version {__version__}" in captured["body"]
Loading