Skip to content

Nuitka zip + GUI 14-language + comprehensive docs + app icon#6

Merged
JE-Chen merged 4 commits into
mainfrom
dev
May 17, 2026
Merged

Nuitka zip + GUI 14-language + comprehensive docs + app icon#6
JE-Chen merged 4 commits into
mainfrom
dev

Conversation

@JE-Chen
Copy link
Copy Markdown
Member

@JE-Chen JE-Chen commented May 17, 2026

Summary

Four-commit follow-up bundling the post-PR-5 work.

4a9c423 — Nuitka build: standalone folder + zip + -m entry

Drops --onefile in favour of --standalone. Build produces autopapertoppt.dist/, which is then zipped with Compress-Archive and attached to the release as autopapertoppt-windows-x86_64.zip. Entry point switches to --python-flag=-m + bare autopapertoppt so the bundle mirrors python -m autopapertoppt. Rationale: onefile self-extracts to %TEMP% on every launch (~1-3 s, antivirus-flagged); the zip ships once and runs in place.

1bb3913 — GUI: 14 languages + responsive layout + HiDPI

UI labels expanded from 2 → 14 languages (en, zh-tw, zh-cn, ja, es, fr, de, ko, pt, ru, it, vi, hi, id), same set as the slide-deck exporter. First-run language picked from QLocale().name() with locale-suffix fallback (zh_TWzh-tw, zh-Hant-TWzh-tw, es_ESes). Settings dropdown renders each language in its own script.

Layout: every form sits in a QScrollArea (widgetResizable=True), window min 900×600 / default 1280×800. HiDPI policy + font fallback chain pinned before QApplication.__init__.

+31 GUI tests (parametrised 14-language coverage + responsive checks + per-language MainWindow construction smoke).

eb7f57c — Docs: eight comprehensive reference pages

/docs goes from ~2000 lines / 7 files to ~3977 lines / 15 files. New: installation.md, configuration.md, architecture.md, data_model.md, troubleshooting.md, source_plugins.md, contributing.md, releases.md. docs/index.rst master TOC reorganised into Languages / Getting started / Surfaces / Concepts / Operations / Contributing.

e45edb8 — App icon + Nuitka / GUI wiring

assets/generate_icon.py Pillow recipe → assets/icon.ico (multi-res 16/32/48/64/128/256, 19 KB) + assets/icon-256.png. Design: rounded blue-800 square + white paper-sheet with text-line placeholders + amber slide tile with play triangle.

Wired into:

  • Nuitka via --windows-icon-from-ico=assets/icon.ico — Explorer / Taskbar / Alt-Tab show the icon.
  • QApplication.setWindowIcon at GUI boot — same in source runs.

+4 icon tests (file present, QIcon loads, missing-file soft-fails, path under repo).

Validation

  • 451 tests pass locally on Windows + venv (up from 416)
  • ruff check . clean
  • bandit -c pyproject.toml -r autopapertoppt/ sources/ clean

Test plan

  • CI matrix (Ubuntu + Windows × Python 3.12 / 3.13 / 3.14) passes
  • On merge: bump-version reads 0.1.X → bumps to 0.1.X+1publish-pypi uploads → Nuitka build succeeds within 90 min and attaches autopapertoppt-windows-x86_64.zip (with icon embedded) + .sha256publish-release unmarks the draft → release shows up in sidebar
  • The unzipped .exe shows the new icon in Explorer + Taskbar
  • autopapertoppt.exe gui opens with the icon in its title bar

JE-Chen added 4 commits May 17, 2026 09:54
Three coupled changes to the windows-latest release build:

1. Entry point. Pass 'autopapertoppt' (the package) instead of
   'autopapertoppt/__main__.py' (the file), with --python-flag=-m.
   This matches how the CLI is invoked at runtime (python -m
   autopapertoppt) and silences the 'specify its containing
   directory' warning Nuitka was emitting on every build.

2. Distribution model: drop --onefile, keep --standalone. The
   build now produces autopapertoppt.dist/ — a directory with the
   exe + every DLL it needs. Onefile mode wraps that into a self-
   extracting binary that unpacks to %TEMP% on each launch, which
   adds startup latency and trips antivirus heuristics on locked-
   down corporate machines.

3. Asset format. Compress the dist folder into
   autopapertoppt-windows-x86_64.zip via Compress-Archive (ships
   with PowerShell on every Windows runner) and attach the zip to
   the release. Users unzip once and run the .exe directly — no
   per-launch extraction.

README's release-pipeline description is updated to reflect the
new model + revised cold/warm timings (cold ~70 min with PySide6;
warm ~5-10 min with cache).
i18n
----
GUI label table now covers every language the slide-deck exporter
ships: en, zh-tw, zh-cn, ja, es, fr, de, ko, pt, ru, it, vi, hi, id.
Each of the 45 UI keys gets all 14 entries; coverage is enforced by
tests/gui/test_i18n.py::test_every_key_has_every_language so a
missing translation fails the PR rather than showing up as English
in an otherwise-localised UI.

The two i18n tables (UI labels + slide-deck output) intentionally
stay separate modules but now share the same language set, which a
new test_supported_languages_match_deck_table check locks down.

A LANGUAGE_DISPLAY_NAMES map renders each language in its own
script (繁體中文 / Español / हिन्दी / etc.) in the Settings dropdown,
so users see their language in their own writing system before
they pick it.

First-run language detection uses QLocale().name() and the new
normalise_language fallback path: 'zh_TW' -> 'zh-tw',
'zh-Hant-TW' -> 'zh-tw', 'es_ES' -> 'es', 'fr_CA' -> 'fr',
unknown -> 'en'.

Responsive layout
-----------------
MainWindow now wraps the Search and Settings pages in a
QScrollArea (widgetResizable=True) so the form widgets stretch
horizontally with the window and reveal a vertical scrollbar when
the window shrinks below the form's natural height.

Window bounds: minimum 900x600 (still fits a 720p laptop),
default 1280x800. Tests assert both, plus the can-resize-smaller
invariant.

HiDPI
-----
QT_ENABLE_HIGHDPI_SCALING=1 and QT_SCALE_FACTOR_ROUNDING_POLICY=
PassThrough are pinned in os.environ before QApplication.__init__
runs (the only safe time to set them). Default font bumped to
point size 10 so CJK glyphs stay readable on dense screens, with a
Windows-shipped CJK / Devanagari fallback chain (Microsoft JhengHei
UI, Yu Gothic UI, Malgun Gothic, Nirmala UI) so a missing glyph in
the primary font cascades cleanly instead of rendering tofu.

Tests
-----
+31 GUI tests: parametrised i18n coverage (one assertion per
supported language), responsive-layout checks, MainWindow
constructs cleanly in every language.
Previously /docs covered the surfaces (cli, mcp, gui, pptx_editing,
packaging-*) but had nothing for installation paths, env-var
configuration, architecture / data flow, troubleshooting, source-
plugin authoring, releases, or contributing. Users had to cross-
reference CLAUDE.md and AGENTS.md to find half this material, and
agents trying to add a new source had no walkthrough.

New documents:

- installation.md (281 lines) — every supported install path, OS
  notes, full dep surface per extra, verifying an install,
  uninstall, common install failures.

- configuration.md (180 lines) — env vars by category, QSettings
  paths per OS and key, CLI defaults, per-source rate limits with
  numbers, cache layout, and an explicit 'NOT in this project'
  section so contributors don't accidentally re-add removed knobs.

- architecture.md (367 lines) — layered diagram, dependency
  direction rules, top-level file tree, core-vs-plugin split with
  rationale, pipeline flow ASCII diagram, dedup algorithm passes,
  rank formula, two enrichment paths, every infrastructure
  invariant (HTTPS-only client, token bucket, cache, i18n), and a
  table of design choices with reasons.

- data_model.md (323 lines) — every field on Query / Paper /
  PaperSummary / PaperCollection / ExportOptions with type,
  whether required, who populates it, and example values. Nested
  rich-tier types (ContributionDetail, Metric, TechniqueRow,
  LiteratureRow, MethodSection, EvaluationSection, RqResult)
  documented separately. Identifier parsing forms enumerated.
  Exception hierarchy laid out.

- troubleshooting.md (392 lines) — failure modes by surface
  (install, CLI, MCP, PPTX, GUI, CI, tests) with cause + fix for
  each. Replaces the scattered troubleshooting paragraphs in
  en/index.rst with a single consolidated reference.

- source_plugins.md (419 lines) — step-by-step source-plugin
  authoring guide. File layout, RateLimit declaration, parser
  pattern, fetcher pattern, registration, fixture recording, test
  coverage expected. Common pitfalls section (constructing your
  own httpx client, hardcoded keys, missing source_id, HTML in
  abstract field, xml.etree on untrusted input). When-to-promote-
  to-core criteria.

- contributing.md (299 lines) — Definition of Done from CLAUDE.md
  surfaced for first-time contributors. Commit message rules.
  Test coverage matrix per change type. SonarQube / Codacy /
  ruff / bandit rule set with thresholds. Branch / PR conventions.
  Local CI reproduction commands. 'Where to put new code' table.

- releases.md (217 lines) — auto-bump pipeline diagram, every
  artefact a release produces, version-bump strategy, [skip
  release] escape hatch, loop prevention layers, --standalone vs
  --onefile trade-off table, Windows-only rationale, build
  timings, repo settings required, recovering from a failed
  release, branch protection notes.

Updated docs/index.rst master TOC: 'Getting started' grouping
adds installation + configuration; 'Concepts' adds architecture +
data_model; 'Operations' adds releases + troubleshooting;
'Contributing' adds contributing + source_plugins. Quick links
block points at GitHub repo, PyPI, latest release, issue tracker.

Net: /docs goes from ~2000 lines across 7 docs to ~3977 lines
across 15 docs. Every reference question a user or contributor
can ask now has a dedicated page; the en/index.rst remains the
narrative user-guide and the new docs are deep-dive references
it can link into.
Adds the project's first visual identity:

assets/generate_icon.py - reproducible Pillow recipe that renders
the icon at 1024x1024 and LANCZOS-downsamples to 16 / 32 / 48 / 64
/ 128 / 256 px. Re-run the script whenever the design changes.

assets/icon.ico - multi-resolution Windows icon committed to the
repo so the Nuitka build step does not need Pillow installed. 19 KB,
six embedded sizes.

assets/icon-256.png - single 256x256 PNG for README / docs use and
as a fallback for platforms that do not read .ico.

assets/README.md - design rationale (paper + slide metaphor, colour
palette: blue-800 ground + amber-500 accent + slate-400 text rules)
and a note on why we ship the .ico directly rather than converting
SVG at build time.

Wiring:

- .github/workflows/release.yml - Nuitka step now takes
  --windows-icon-from-ico=assets/icon.ico so the built .exe
  carries the icon in its PE resource table. Windows Explorer +
  Taskbar + Alt-Tab pick it up automatically.

- autopapertoppt/gui/app.py - QApplication.setWindowIcon is set
  to the same .ico at startup, so the desktop GUI's title bar /
  taskbar / Alt-Tab all show the icon when running from source
  as well as from the Nuitka bundle. _load_app_icon soft-fails
  with None when the .ico is not reachable (future repackaging
  safety net) so the GUI never crashes for an icon-related reason.

- tests/gui/test_app_icon.py - four smoke tests: file is present
  in the repo, QIcon loads with the right embedded sizes, missing
  file returns None instead of raising, computed path lives under
  the repo root.

Net: 451 tests pass, ruff + bandit clean.
@JE-Chen JE-Chen merged commit 479b3f2 into main May 17, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant