Skip to content

Merge upstream 0.8.7 (Fable)#376

Open
3rdIteration wants to merge 271 commits into
devfrom
merge-upstream-0.8.7
Open

Merge upstream 0.8.7 (Fable)#376
3rdIteration wants to merge 271 commits into
devfrom
merge-upstream-0.8.7

Conversation

@3rdIteration

Copy link
Copy Markdown
Owner

This pull request updates documentation and CI workflows to improve clarity, accuracy, and support for localization. The key changes include a more detailed pull request template, updates for the 0.8.6 software release, and enhancements to the test workflow to ensure translations are compiled and tested. Minor corrections and improvements were also made throughout the README.md for accuracy and readability.

Documentation updates:

  • Updated the pull request template .github/pull_request_template.md to include clearer sections for problem description, solution, additional information, screenshots, and improved checklists for testing and contributions. [1] [2]
  • Updated README.md for the 0.8.6 release, including download links, verification instructions, and minor corrections for grammar, spelling, and clarity. [1] [2] [3] [4] [5] [6] [7]

CI workflow improvements:

  • In .github/workflows/tests.yml, the test workflow now installs localization requirements, compiles translation files before running tests, and ensures the package is installed in editable mode for both main and desktop test jobs. [1] [2]

Other minor improvements:

  • Fixed minor typos and improved consistency in terminology and formatting throughout the documentation. [1] [2] [3]

Release process:

  • Removed explicit branch restrictions from the workflow trigger to allow CI to run on all branches for pull requests.

Description

Describe the change simply. Provide a reason for the change.

Include screenshots of any new or modified screens (or at least explain why they were omitted)

This pull request is categorized as a:

  • New feature
  • Bug fix
  • Code refactor
  • Documentation
  • Other

Checklist

  • I’ve run pytest and made sure all unit tests pass before sumbitting the PR

If you modified or added functionality/workflow, did you add new unit tests?

  • No, I’m a fool
  • Yes
  • N/A

I have tested this PR on the following platforms/os:

Note: Keep your changes limited in scope; if you uncover other issues or improvements along the way, ideally submit those as a separate PR. The more complicated the PR the harder to review, test, and merge.

Chaitanya-Keyal and others added 30 commits May 22, 2025 16:23
Update instances of 0.8.5 to 0.8.6
[Enhancement] Add support for BBQr PSBT decoding
Update encode_qr.py - Adds comments to code (Fixes SeedSigner#582)
Resolves issue 678 - Clean up else condition to catch ALL remaining possibilities
…r-docs

[Documentation] Clarify that SeedQR uses English BIP39 wordlist
[CI Fix] Modify CI to run test checks on all commits
SeedSigner and others added 26 commits February 24, 2026 13:17
style: fix typos in source code comments and strings
[Feature] Move foreign font files to seedsigner-translations repo
…anslations-20260304

Update seedsigner-translations submodule to latest dev (6b911be)
…vision

Update the PR template: Set more explicit expectations re: tests, our slow pace, "@" mentions
…wallet-policy

l10n: make multisig wallet policy display translatable
…ntion_mock

[Bugfix] Fix inadvertently persistent test artifacts
…nguages_v0_8_7

[l10n] Finalize v0.8.7 languages
Co-authored-by: kdmukai <934746+kdmukai@users.noreply.github.com>
…ranslations-submodule

Update seedsigner-translations submodule to latest dev (708961)
[Bugfix] Back Navigation in Seed Entry Views
Merges 269 upstream commits since merge-base bd4b2a8. Upstream refactors
adopted with fork functionality preserved:

- Settings: 'coordinators' replaced by 'xpub_qr_type' (fork's Satochip xpub
  export chain ported); SettingsQR validation extended to handle the fork's
  plain-string and FREE_ENTRY settings; multiselect empty-value handling
  merged with the fork's legacy [value, label] format support.
- Display drivers: adopted BaseDisplayDriver + DisplayDriverFactory; fork's
  ST7735 and DesktopDisplay drivers ported to the new base class; fork's
  io_config pin mapping and chunked SPI retained in all drivers;
  BaseDisplayDriver.cleanup() delegates to the fork drivers' close().
- GUI: TextArea.allow_text_overflow removal propagated to all fork screens;
  scrolling refactor adopted; fork's FontAwesome icon set restored
  (LOCK/UNLOCK/PEN/etc. still used by fork views); JP fixed-width fonts kept.
- Camera: upstream's CameraConnectionError integrated into the fork's
  multi-backend VideoStream startup.
- PSBT: upstream's missing-fingerprint fill merged with the fork's WIF/BIP38
  bare-private-key signing and root-xprv fingerprint matching.
- Views: passphrase skip/discard UX merged with Aezeed/SLIP39 handling;
  blocking_view/unblocking_view navigation adopted (Load Backup Files
  submenu ported from parent_destination); l10n string updates and
  translatable multisig policy adopted with single-sig descriptor fallback.
- l10n: translations submodule bumped to upstream 0.8.7 pointer (708961a);
  messages.pot regenerated from merged sources (now includes fork strings);
  CI compiles catalogs in both test jobs.
- Tests: upstream test-infra changes reconciled with the fork's async
  settings saves and Luckfox/io_config hardware tests; full suite passes
  (824 passed, 185 skipped; screenshot generator validated in CI).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 9, 2026 02:32

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR merges upstream changes for the 0.8.7 line, spanning documentation/CI improvements for localization plus substantial runtime updates across QR handling, settings flows, UI screens, and hardware/display abstractions.

Changes:

  • Updated CI to install l10n requirements, compile translations, and run tests against an editable install.
  • Expanded/refactored settings + flow logic (e.g., new MicroSD notification duration setting, multiselect behavior, SettingsQR test baselining).
  • Added/adjusted runtime behaviors across scanning/signing UX and hardware integration (e.g., BBQR PSBT decoding path, display-driver base/factory refactor, camera connection error routing, screensaver gating).

Reviewed changes

Copilot reviewed 70 out of 75 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
tests/test_settingsqr_decoder.py Reuses a shared SettingsQR test base for SettingsQR strings.
tests/test_settings.py Adds SettingsDefinition-driven defaults tests and a reusable SettingsQRBase.
tests/test_settings_definition.py Switches os.walk mocking to patch context manager.
tests/test_luckfox_camera_backend.py Temporarily swaps real pivideostream module into sys.modules for backend tests.
tests/test_io_config_profiles.py Updates display driver instantiation in tests to pass explicit dimensions.
tests/test_flows.py Adds/remove-microsd blocking flow test and updates some button text expectations/imports.
tests/test_flows_view.py Adds camera connection error flow test and adjusts imports/hostname handling.
tests/test_flows_settings.py Expands multiselect behavior test and updates SettingsQR strings for xpub_qr.
tests/test_flows_seed.py Updates xpub export flow tests to use xpub_qr_format and copy edits.
tests/test_flows_menu_navigation.py Removes XPUB-export-disabled navigation test and related settings enablement.
tests/test_encodepsbtqr.py Renames Specter Xpub encoder class used by tests.
tests/test_embit_utils.py Adds multisig policy extraction test vectors.
tests/test_controller.py Removes a controller settings-defaults test (moved/covered elsewhere).
tests/screenshot_generator/utils.py Improves screenshot renderer behavior/config for isolated mocking and render tracking.
tests/base.py Adjusts test-suite stubbing for hardware/optional deps (numpy, pivideostream, etc.).
src/seedsigner/views/view.py Adds camera error reroute view, restart guard for screenshot generator, MicroSD removal blocking view, and UI copy tweaks.
src/seedsigner/views/tools_views.py Normalizes UI labels, replaces direct Screen().display() calls with run_screen, and improves multisig descriptor display naming.
src/seedsigner/views/smartcard_views.py Updates xpub export flow to use xpub_qr_format setting and updated coordinator constant.
src/seedsigner/views/settings_views.py Adds blocking/unblocking navigation semantics, selection-required warning view, and updated back behavior for multiselects.
src/seedsigner/views/screensaver.py Uses renderer.is_screenshot_generator instead of explicit is_screenshot_renderer flags.
src/seedsigner/views/scan_views.py Renames PSBT scan messaging to “transaction” and updates unknown-QR button label.
src/seedsigner/views/psbt_views.py Updates PSBT UX copy to “transaction” and uses run_screen for some warnings.
src/seedsigner/models/settings.py Tightens SettingsQR parsing/validation and multiselect normalization.
src/seedsigner/models/settings_definition.py Introduces xpub_qr_format + MicroSD toast timer settings, expands locale list, improves language detection path logic, and extends get_defaults API.
src/seedsigner/models/qr_type.py Adds BBQR PSBT QR type constant.
src/seedsigner/models/psbt_parser.py Adds missing-fingerprint fill logic and matching-fingerprint fallback logic; adjusts has_matching_input_fingerprint signature.
src/seedsigner/models/encode_qr.py Renames Specter legacy xpub encoder and adds UR HDKey “use_info” handling for testnet.
src/seedsigner/models/decode_qr.py Adds BBQR PSBT decoder path, zlib/base32 helpers, and animated progress support for BBQR.
src/seedsigner/helpers/mnemonic_generation.py Removes unused image-based mnemonic generation helper.
src/seedsigner/helpers/embit_utils.py Adds multisig policy extraction helper and minor comment fixes.
src/seedsigner/hardware/displays/ST7789.py Converts driver to dataclass inheriting BaseDisplayDriver and fixes docstring typo.
src/seedsigner/hardware/displays/st7789_mpy.py Converts to dataclass BaseDisplayDriver and adapts init/rotation handling.
src/seedsigner/hardware/displays/ST7735.py Converts driver to dataclass inheriting BaseDisplayDriver.
src/seedsigner/hardware/displays/ili9341.py Converts driver to dataclass BaseDisplayDriver and renames invert param.
src/seedsigner/hardware/displays/display_driver.py Introduces BaseDisplayDriver + DisplayDriverFactory and centralizes driver instantiation/cleanup.
src/seedsigner/hardware/displays/desktop_display.py Makes desktop display a BaseDisplayDriver dataclass with post_init setup.
src/seedsigner/hardware/camera.py Adds CameraConnectionError and wraps VideoStream startup to classify camera backend failures.
src/seedsigner/hardware/buttons.py Gates screensaver start based on controller’s is_screensaver_start_allowed.
src/seedsigner/gui/toast.py Adjusts toast timing defaults and removes an unconditional initial sleep.
src/seedsigner/gui/screens/tools_screens.py Removes allow_text_overflow usage and fixes bbox tuple unpacking.
src/seedsigner/gui/screens/settings_screens.py Removes checked-selection UI flag and tweaks screenshot-generator translation visibility.
src/seedsigner/gui/screens/seed_screens.py Removes passphrase flags from some screens and cleans up overflow flags and copy.
src/seedsigner/gui/screens/screen.py Adds ButtonOptionWithoutTranslation and refactors label translation wrapping and keyboard title update logic.
src/seedsigner/gui/screens/scan_screens.py Simplifies preview thread signature/debug code and adjusts scan abort behavior.
src/seedsigner/gui/screens/psbt_screens.py Renames PSBT UI to transaction language and refactors some layout components.
src/seedsigner/gui/renderer.py Switches to DisplayDriverFactory and adds cleanup + is_screenshot_generator flag.
src/seedsigner/gui/keyboard.py Removes unused key definitions/fields and simplifies update_from_input signature.
src/seedsigner/gui/components.py Adds locale font support, font search paths, and refactors TextArea overflow/scroll behavior.
src/seedsigner/controller.py Bumps version, adds libraqm availability logging, updates startup MicroSD toast/warning routing, and adds screensaver gating property.
README.md Updates release download/verifications text and various documentation copy/formatting.
pyproject.toml Bumps project version to 0.8.7 and adjusts coverage omit paths.
l10n/requirements-l10n.txt Adds setuptools minimum requirement for localization tooling.
docs/usb_relay.md Improves wording, command formatting, and general clarity.
docs/seed_qr/README.md Clarifies SeedQR assumptions/English wordlist recommendation and improves phrasing.
docs/qr_formats.md Updates formatting and clarifies QR format descriptions.
docs/legacy_hardware.md Fixes terminology/spelling and improves readability.
docs/feature_roadmap.md Clarifies roadmap wording and formatting.
docs/electrum.md Improves capitalization, wording, and formatting.
docs/dice_verification.md Fixes typos/wording and command examples.
docs/developer_tips.md Improves formatting and step clarity for developer workflows.
docs/debug_crash.md Restructures and clarifies advanced crash-debugging instructions.
docs/code_structure.md Improves terminology/clarity and fixes typos.
.github/workflows/tests.yml Installs l10n deps, installs package editable, compiles catalogs, and removes branch restrictions.
.github/pull_request_template.md Reworks template sections/checklists for clearer contribution/test/screenshot expectations.
Comments suppressed due to low confidence (1)

docs/qr_formats.md:37

  • Same language-support claim appears again here; it should be clarified consistently to avoid implying SeedQR language autodetection.
    - SeedSigner Seed QR format
        - A 48 or 96 length string of numbers representing a BIP-39 wordlist (all wordlist languages supported). The numeric sequence is a concatenation of four-digit, zero-padded segments. Each four-digit segment represents a BIP-39 word expressed by a zero-indexed position in the wordlist. For example, "0000" is "abandon" in the English BIP-39 wordlist.

Comment on lines +678 to +679
logger.debug(f"segment string: {s}")
logger.debug(f"segment string length: {len(s)}")
Comment on lines +422 to +431
if derivation_path_obj.fingerprint == b"\x00\x00\x00\x00":
fallback_root = root
if fallback_root is None:
fallback_root = bip32.HDKey.from_seed(seed.seed_bytes, version=NETWORKS[SettingsConstants.map_network_to_embit(network)]["xprv"])
try:
derived_key = fallback_root.derive(derivation_path_obj.derivation)
return derived_key.key.sec() == public_key.sec() # Public keys match
except Exception as e:
logger.debug("Fingerprint fallback derive failed: %s", e, exc_info=True)
return False
Comment on lines +349 to +355
if self.settings_entry.type == SettingsConstants.TYPE__MULTISELECT:
# After the user finishes toggling multiselect options, initial_value will
# have their final selections when they hit BACK to exit. All current
# multiselect settings require at least one option to be selected.
if not initial_value:
return Destination(SettingsSelectionRequiredWarningView, view_args={"attr_name": self.settings_entry.attr_name})

return Destination(self.blocking_view, clear_history=True)
return settings_menu_view_destination

value = self.settings_entry.get_selection_option_value(ret_value)
Comment thread tests/base.py
sys.modules['seedsigner.gui.toast'] = MagicMock()
sys.modules['seedsigner.hardware.buttons'] = MagicMock()
sys.modules['seedsigner.hardware.camera'] = MagicMock()
sys.modules['seedsigner.hardware.camera.Camera'] = MagicMock()

origin = derivation_to_keypath(self.derivation)

# Implemts "use_info" member on HDKey class (urtypes/crypto packages-libs folder) construct,
Comment thread docs/qr_formats.md
- Seed
- [SeedSigner SeedQR](seed_qr/README.md) format
- A 48 or 96 length string of numbers representing a bip39 wordlist (all wordlist languages supported). The numeric sequence is a concatenation of four-digit, zero-padded segments. Each four-digit segment represents a bip39 word expressed by a zero-indexed position in the wordlist. For example "0000" is abandon in the english bip39 wordlist.
- A 48 or 96 length string of numbers representing a BIP-39 wordlist (all wordlist languages supported). The numeric sequence is a concatenation of four-digit, zero-padded segments. Each four-digit segment represents a BIP-39 word expressed by a zero-indexed position in the wordlist. For example, "0000" is "abandon" in the English BIP-39 wordlist.
Comment thread pyproject.toml
readme = "README.md"
requires-python = ">=3.10"
version = "0.8.6"
version = "0.8.7"
- tests/base.py: only mock numpy when it isn't installed. Upstream's
  unconditional MagicMock breaks pygame's import (pygame probes
  importlib.util.find_spec('numpy'), which raises ValueError on a mock
  without __spec__), which crashed pytest collection (exit 2) on every
  desktop matrix job.
- screenshot generator: port the fork's SLIP39 run_before/run_after
  callbacks to upstream's mock_context_manager API; keep the camera
  module real (CameraConnectionError must be a real exception class for
  CameraConnectionErrorView) and stub VideoStream instead; add utf-8
  encoding to README/template file I/O for Windows compatibility.
- tools_views: restore the dropped run_screen() call in
  ToolsDiceEntropyMnemonicLengthView (screen was constructed but never
  displayed — merge stitching error).

Verified locally: full suite with desktop deps 824 passed / 185 skipped;
screenshot generator renders all 174 'en' screens (raqm-gated locales
validated in CI).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.