4 Commits

Author SHA1 Message Date
0d614c2921 release: 0.1.2 2026-05-13 14:05:47 +02:00
9466b091dd docs: rebuild manual PDF 2026-05-13 14:05:47 +02:00
511288bd03 build_all.sh: build wheel + pyinstaller + flatpak + appimage in one go
Collects all four artifacts under <repo>/dist/ (PyInstaller and Flatpak
renamed to testium-<version>(.suff); wheel and AppImage keep PEP 427 /
appimage-builder original names). Re-uses scripts/build_env.sh and
set_env.sh, same venv as run.sh. AppImage build.sh now picks the actual
output file dynamically instead of a hardcoded lowercase name.
2026-05-13 14:03:20 +02:00
51b144f60c Flatpak: bypass XDG portal for .tum open dialog
Native file dialog routes through the XDG document portal, which exposes
only the selected file at /run/user/UID/doc/... — siblings (param.yaml,
.py) are unreachable. Force Qt's non-native dialog in Flatpak so it walks
the real filesystem via --filesystem=home and returns a usable path.
2026-05-13 12:49:46 +02:00
6 changed files with 114 additions and 23 deletions

85
build_all.sh Executable file
View File

@@ -0,0 +1,85 @@
#!/bin/bash
# Build every distribution channel of testium, in order:
# 1. Wheel -> dist/testium-<v>-py3-none-any.whl (PEP 427 name)
# 2. PyInstaller binary -> dist/testium-<v>
# 3. Flatpak bundle -> dist/testium-<v>.flatpak
# 4. AppImage -> dist/Testium-<v>-x86_64.AppImage (original name)
# All artifacts are collected (copied) under <repo>/dist/. Original outputs in
# src/dist/, package/*/dist/ are left in place. The wheel and AppImage keep
# their original names (which already contain the version); pyinstaller and
# flatpak are renamed to a normalized testium-<version>(.suff) form.
#
# Re-uses scripts/build_env.sh and scripts/set_env.sh — the same pair invoked
# by run.sh — so the venv at test/tmp/.venv stays the single source of Python
# dependencies. `build` and `pyinstaller` are installed into that venv on
# demand if not already there. Flatpak and AppImage build in their own
# container/sandbox; their build.sh scripts have their own toolchain checks.
set -e
SCRIPT_DIR=$(realpath "$(dirname "$0")")
VERSION=$(cat "$SCRIPT_DIR/src/VERSION")
DIST_DIR="$SCRIPT_DIR/dist"
mkdir -p "$DIST_DIR"
export PY_VENV_NAME=".venv"
export PY_VENV_DIR="$SCRIPT_DIR/test/tmp/$PY_VENV_NAME"
export REQ_PATH="$SCRIPT_DIR/src/requirements.txt"
bash "$SCRIPT_DIR/scripts/build_env.sh"
source "$SCRIPT_DIR/scripts/set_env.sh"
# Ensure wheel/PyInstaller toolchains are present in the venv.
python -m pip install --quiet --upgrade build pyinstaller
step() {
echo
echo "================================================================"
echo " $1"
echo "================================================================"
}
# 1. Wheel — PEP 427 name kept (already contains version)
step "1/4 Wheel (version $VERSION)"
(
cd "$SCRIPT_DIR/src"
rm -rf dist build *.egg-info
python -m build --wheel
)
WHEEL_SRC=$(ls -1t "$SCRIPT_DIR/src/dist"/*.whl | head -1)
WHEEL="$DIST_DIR/$(basename "$WHEEL_SRC")"
cp -f "$WHEEL_SRC" "$WHEEL"
# 2. PyInstaller binary
step "2/4 PyInstaller binary (version $VERSION)"
bash "$SCRIPT_DIR/package/pyinstaller/build.sh"
PYI_SRC="$SCRIPT_DIR/package/pyinstaller/dist/testium"
PYI_BIN="$DIST_DIR/testium-${VERSION}"
cp -f "$PYI_SRC" "$PYI_BIN"
# 3. Flatpak bundle
step "3/4 Flatpak bundle (version $VERSION)"
(
cd "$SCRIPT_DIR/package/flatpak"
bash build.sh
)
FLATPAK_SRC="$SCRIPT_DIR/package/flatpak/testium.flatpak"
FLATPAK_BUNDLE="$DIST_DIR/testium-${VERSION}.flatpak"
cp -f "$FLATPAK_SRC" "$FLATPAK_BUNDLE"
# 4. AppImage
step "4/4 AppImage (version $VERSION)"
(
cd "$SCRIPT_DIR/package/appimage"
bash build.sh
)
APPIMAGE_SRC=$(ls -1t "$SCRIPT_DIR/package/appimage"/*.AppImage 2>/dev/null | head -1)
APPIMAGE="$DIST_DIR/$(basename "$APPIMAGE_SRC")"
cp -f "$APPIMAGE_SRC" "$APPIMAGE"
chmod +x "$APPIMAGE"
step "All packages built"
printf " wheel : %s\n" "$WHEEL"
printf " pyinstaller : %s\n" "$PYI_BIN"
printf " flatpak : %s\n" "$FLATPAK_BUNDLE"
printf " appimage : %s\n" "$APPIMAGE"

Binary file not shown.

View File

@@ -46,8 +46,9 @@ $RUNTIME run --rm \
appimage-builder --recipe AppImageBuilder.yml --skip-test appimage-builder --recipe AppImageBuilder.yml --skip-test
" "
echo "Done: testium-${APP_VERSION}-x86_64.AppImage" APPIMAGE_FILE=$(ls -1t Testium-*-x86_64.AppImage 2>/dev/null | head -1)
echo "Done: ${APPIMAGE_FILE}"
if [ "${1}" = "install" ]; then if [ "${1}" = "install" ] && [ -n "${APPIMAGE_FILE}" ]; then
install -v "testium-${APP_VERSION}-x86_64.AppImage" "${HOME}/.local/bin/testium" install -v "${APPIMAGE_FILE}" "${HOME}/.local/bin/testium"
fi fi

View File

@@ -1,23 +1,19 @@
version 0.1.2
==============
- Flatpak: opening a test from the GUI now correctly finds its companion
files (param.yaml, .py scripts, ...).
version 0.1.1 version 0.1.1
============== ==============
- Packaging: Flatpak bundle (desktop entry, MIME, distributable .flatpak) - New install channels: Flatpak bundle and AppImage. The AppImage runs
and AppImage (containerized build, runs on Arch / non-Debian hosts). on any distribution (built inside a Debian container).
- bins.py: host-only Python/Lua resolution from sandboxed bundles - About dialog: version is now correct in Flatpak and AppImage builds
(Flatpak / AppImage); fail fast at test load if the host interpreter (used to display "unknown").
is missing. - GUI dialogs no longer hang on pure-Wayland sessions.
- run item: runtime-aware launcher (AppImage / Flatpak / PyInstaller / - Plot "last values" API: more tolerant timeout on loaded machines.
source / wheel); drop testium_path / python_bin parameters. - run item: `testium_path` and `python_bin` parameters removed —
- dialog_env: auto-detect Wayland vs xcb from $DISPLAY / $WAYLAND_DISPLAY sub-instances are launched in the same packaging mode as the parent.
instead of forcing xcb (was hanging dialogs on pure-Wayland sessions). - License: EUPL-1.2.
- version: read TESTIUM_VERSION env in Flatpak/AppImage so the About
dialog stops reporting "unknown".
- runtime_plot last_values: bump timeout 1s -> 5s and narrow the bare
except to queue.Empty.
- py_func/__main__: robust sys.path init, diagnostic on import failure.
- Subprocess stdio (py_func / lua_func) routed into the parent log.
- README refocused on users (quick_start, tutorial); CONTRIBUTING filled.
- Docs: CLAUDE.md Packaging section rewritten.
- LICENSE file (EUPL-1.2) added.
version 0.1 version 0.1
============== ==============

View File

@@ -1 +1 @@
0.1.1 0.1.2

View File

@@ -212,8 +212,17 @@ class TestFileManager:
d = "" d = ""
if w.testFile is not None: if w.testFile is not None:
d = os.path.dirname(w.testFile) d = os.path.dirname(w.testFile)
# In Flatpak the native dialog goes through the XDG document portal,
# which returns /run/user/UID/doc/.../test.tum and only exposes the
# selected file — sibling files (param.yaml, .py, etc.) are unreachable.
# Force Qt's own dialog, which walks the real filesystem mounted via
# --filesystem=home and returns a regular path with sibling access.
options = QFileDialog.Options()
if os.path.isfile("/.flatpak-info"):
options |= QFileDialog.Option.DontUseNativeDialog
file_name, _ = QFileDialog.getOpenFileName( file_name, _ = QFileDialog.getOpenFileName(
w, "Open the test file", d, "testium file (*.tum);;All Files (*)" w, "Open the test file", d,
"testium file (*.tum);;All Files (*)", options=options
) )
if file_name: if file_name:
self.reload(file_name) self.reload(file_name)