From 5f875fa5af8ea01dcb3e1595f79a92dd43a2e00a Mon Sep 17 00:00:00 2001 From: kdmukai Date: Wed, 25 May 2022 10:29:25 -0500 Subject: [PATCH] Adds --locale option to screenshot generator; DE translation update * Filter out LANCZOS deprecation warnings from pytest output * Prevent ScreenshotRenderer from attempting to capture background task rendering jobs. * Bugfix to stop loading screen spinner if PSBTParser fails. * --- pytest.ini | 5 +- src/seedsigner/gui/renderer.py | 5 +- src/seedsigner/gui/screens/screen.py | 2 +- .../babel/de/LC_MESSAGES/messages.po | 68 +++++++++---------- src/seedsigner/views/psbt_views.py | 16 +++-- tests/screenshot_generator/conftest.py | 11 +++ tests/screenshot_generator/generator.py | 27 +++++--- tests/screenshot_generator/utils.py | 5 +- 8 files changed, 84 insertions(+), 55 deletions(-) create mode 100644 tests/screenshot_generator/conftest.py diff --git a/pytest.ini b/pytest.ini index de19c9f0..41640929 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,2 +1,5 @@ [pytest] -testpaths = tests \ No newline at end of file +testpaths = tests +filterwarnings = + # LANCZOS is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.LANCZOS instead. + ignore::DeprecationWarning:qrcode.* diff --git a/src/seedsigner/gui/renderer.py b/src/seedsigner/gui/renderer.py index 05dadf3d..8aa78134 100644 --- a/src/seedsigner/gui/renderer.py +++ b/src/seedsigner/gui/renderer.py @@ -34,7 +34,10 @@ class Renderer(ConfigurableSingleton): renderer.draw = ImageDraw.Draw(renderer.canvas) - def show_image(self, image=None, alpha_overlay=None): + def show_image(self, image=None, alpha_overlay=None, is_background_thread: bool = False): + """ + is_background_thread: Only used by the ScreenshotRenderer. + """ if alpha_overlay: if image == None: image = self.canvas diff --git a/src/seedsigner/gui/screens/screen.py b/src/seedsigner/gui/screens/screen.py index 2d4999f5..eda056aa 100644 --- a/src/seedsigner/gui/screens/screen.py +++ b/src/seedsigner/gui/screens/screen.py @@ -187,7 +187,7 @@ class LoadingScreenThread(BaseThread): width=GUIConstants.COMPONENT_PADDING ) - renderer.show_image() + renderer.show_image(is_background_thread=True) position += arc_sweep diff --git a/src/seedsigner/resources/babel/de/LC_MESSAGES/messages.po b/src/seedsigner/resources/babel/de/LC_MESSAGES/messages.po index 58e21daa..1783f300 100644 --- a/src/seedsigner/resources/babel/de/LC_MESSAGES/messages.po +++ b/src/seedsigner/resources/babel/de/LC_MESSAGES/messages.po @@ -91,7 +91,7 @@ msgstr "{}..." #: src/seedsigner/gui/screens/psbt_screens.py:136 msgid "self-transfer" -msgstr "selbst zahlung" +msgstr "selbst zahlungs" #: src/seedsigner/gui/screens/psbt_screens.py:139 msgid "recipient 1" @@ -144,7 +144,7 @@ msgstr[1] "Empfänger" #. Denonination is inserted (e.g. your "btc change" or "sats change") #: src/seedsigner/gui/screens/psbt_screens.py:566 msgid "{} change" -msgstr "{} change" +msgstr "{} wechselg." #: src/seedsigner/gui/screens/psbt_screens.py:671 msgid "Address verified!" @@ -166,7 +166,7 @@ msgstr "Signierte PSBT" #. etc) #: src/seedsigner/gui/screens/psbt_screens.py:713 msgid "Export as a QR code for:" -msgstr "Als QR Code exportieren, für::" +msgstr "QR Code exportieren für:" #: src/seedsigner/gui/screens/scan_screens.py:22 msgid "Scan a QR code" @@ -174,7 +174,7 @@ msgstr "Scanne einen QR Code" #: src/seedsigner/gui/screens/scan_screens.py:138 msgid "Settings QR" -msgstr "Einstellungs QR" +msgstr "QR Konfig." #: src/seedsigner/gui/screens/scan_screens.py:156 msgid "Settings imported successfully!" @@ -218,7 +218,7 @@ msgstr "Fingerabruck" #. Displays the page number and total: (e.g. page 1 of 6) #: src/seedsigner/gui/screens/seed_screens.py:461 msgid "Seed Words: {}/{}" -msgstr "Seed-Phrase: {}/{}" +msgstr "Seed Wörter: {}/{}" #: src/seedsigner/gui/screens/seed_screens.py:541 msgid "Verify Backup?" @@ -261,7 +261,7 @@ msgstr "Xpub" #: src/seedsigner/gui/screens/seed_screens.py:754 #: src/seedsigner/views/seed_views.py:217 msgid "Add Passphrase" -msgstr "Passphrase hinzufügen" +msgstr "Passphrase hinzufüg." #: src/seedsigner/gui/screens/seed_screens.py:1106 msgid "Verify Passphrase" @@ -311,8 +311,8 @@ msgid "" "Optionally scan your transcribed SeedQR to confirm that it reads back " "correctly." msgstr "" -"Optional können Sie Ihren übersetzten SeedQR scannen um zu verifizieren, " -"dass er korrekt gelesen wird." +"Optional, übersetzten SeedQR scannen um zu verifizieren, dass er korrekt " +"gelesen wird." #: src/seedsigner/gui/screens/seed_screens.py:1468 #: src/seedsigner/views/seed_views.py:1284 @@ -344,7 +344,7 @@ msgstr "Deskriptor geladen" #. Label for the multisig wallet's signing policy (e.g. 2-of-3) #: src/seedsigner/gui/screens/seed_screens.py:1568 msgid "Policy" -msgstr "Richtlinie" +msgstr "Policy" #: src/seedsigner/gui/screens/seed_screens.py:1576 msgid "Signing Keys" @@ -354,7 +354,7 @@ msgstr "Singnier Schlüssel" #: src/seedsigner/views/main_menu_views.py:21 #: src/seedsigner/views/settings_views.py:36 msgid "Settings" -msgstr "Einst." +msgstr "Setup" #. Short for "Input/Output"; screen to make sure the buttons and camera are #. working properly @@ -412,7 +412,7 @@ msgstr " < wiederholen | akzeptieren > " #: src/seedsigner/gui/screens/tools_screens.py:120 #: src/seedsigner/gui/screens/tools_screens.py:245 msgid "Dice Roll {}/{}" -msgstr "Würfeln {}/{}" +msgstr "Wurf {}/{}" #: src/seedsigner/gui/screens/tools_screens.py:274 msgid "12th Word" @@ -526,7 +526,7 @@ msgstr "Koordinator Software" #: src/seedsigner/models/settings_definition.py:383 msgid "Denomination display" -msgstr "Nennwertanzeige" +msgstr "Sats/Btc anzeige" #: src/seedsigner/models/settings_definition.py:392 msgid "Bitcoin network" @@ -534,7 +534,7 @@ msgstr "Bitcoin Netzwerk" #: src/seedsigner/models/settings_definition.py:400 msgid "QR code density" -msgstr "QR Code Dichte" +msgstr "Auflösung QR Code" #: src/seedsigner/models/settings_definition.py:408 msgid "Xpub export" @@ -566,11 +566,11 @@ msgstr "Kompakt SeedQR" #: src/seedsigner/models/settings_definition.py:458 msgid "Show privacy warnings" -msgstr "Zeige Privatsphäre Warnungen" +msgstr "Privatsphäre Warnungen" #: src/seedsigner/models/settings_definition.py:464 msgid "Show dire warnings" -msgstr "Zeige dringliche Warnungen" +msgstr "dringliche Warnungen" #: src/seedsigner/models/settings_definition.py:470 msgid "Show partner logos" @@ -625,7 +625,7 @@ msgstr "Analysiert PSBT... " #: src/seedsigner/views/psbt_views.py:155 msgid "Unsupported Script Type!" -msgstr "Nicht unterstützter Skipt Typ!" +msgstr "Skript nicht unterstützt!" #: src/seedsigner/views/psbt_views.py:156 msgid "" @@ -701,9 +701,7 @@ msgstr "Verifiziere Selbstzahlung..." msgid "" "PSBT's {} address could not be verified with your multisig wallet " "descriptor." -msgstr "" -"PSBT Adresse {} konnte mit Ihrem Multisig-Wallet Deskriptor nicht " -"verifiziert werden." +msgstr "PSBT Adresse {} konnte mit Ihrem Deskriptor nicht verifiziert werden." #: src/seedsigner/views/psbt_views.py:433 msgid "Suspicious PSBT" @@ -711,7 +709,7 @@ msgstr "Verdächtige PSBT" #: src/seedsigner/views/psbt_views.py:434 msgid "PSBT's {} address could not be generated from your seed." -msgstr "PSBT's {} Adresse konnte von Ihrem Seed nicht generiert werden." +msgstr "PSBT's {}. Adresse konnte vom Seed nicht generiert werden." #: src/seedsigner/views/psbt_views.py:438 msgid "Address Verification Failed" @@ -764,11 +762,11 @@ msgstr "Scanne einen SeedQR" #: src/seedsigner/views/seed_views.py:78 msgid "Enter 24-word seed" -msgstr "24-Wort Seed Eingabe" +msgstr "24Wort Seed Eingabe" #: src/seedsigner/views/seed_views.py:79 msgid "Enter 12-word seed" -msgstr "12-Wort Seed Eingabe" +msgstr "12Wort Seed Eingabe" #: src/seedsigner/views/seed_views.py:80 msgid "Create a seed" @@ -799,7 +797,7 @@ msgstr "Ungültiger Seed!" #: src/seedsigner/views/seed_views.py:194 msgid "Checksum failure; not a valid seed phrase." -msgstr "Prüfsumme fehlerhaft, keine valide Seedphrase." +msgstr "Prüfsumme fehlerhaft, kein valider Seed." #: src/seedsigner/views/seed_views.py:216 #: src/seedsigner/views/seed_views.py:268 @@ -866,7 +864,7 @@ msgstr "Generiere xpub..." #: src/seedsigner/views/seed_views.py:771 msgid "You must keep your seed words private & away from all online devices." msgstr "" -"Halten Sie Ihre Seed-Phrase privat & geben sie diese NIE in ein Gerät mit " +"Halten Sie Ihren Seed privat & geben sie diese NIE in ein Gerät mit " "Internetzugang ein." #: src/seedsigner/views/seed_views.py:836 @@ -931,24 +929,22 @@ msgstr "SeedQR Format" #: src/seedsigner/views/seed_views.py:1052 msgid "SeedQR is your private key!" -msgstr "SeedQR ist Ihr privater Schlüssel!" +msgstr "Der SeedQR ist dein privater Schlüssel!" #: src/seedsigner/views/seed_views.py:1053 msgid "Never photograph it or scan it into an online device." -msgstr "" -"Fotografieren Sie diesen niemals und scannen Sie Ihn auch niemals mit einem " -"Online-Gerät." +msgstr "Niemals mit einem online Gerät scannen bzw. fotografieren!" #: src/seedsigner/views/seed_views.py:1145 #: src/seedsigner/views/seed_views.py:1189 #: src/seedsigner/views/seed_views.py:1200 #: src/seedsigner/views/seed_views.py:1212 msgid "Confirm SeedQR" -msgstr "SeedQR bestätigen" +msgstr "SeedQR verifizieren" #: src/seedsigner/views/seed_views.py:1150 msgid "Confirm SeedQR?" -msgstr "SeedQR bestätigen?" +msgstr "SeedQR verifizieren?" #: src/seedsigner/views/seed_views.py:1180 msgid "Scan your SeedQR" @@ -1050,15 +1046,15 @@ msgstr "Entwickler Optionen" #: src/seedsigner/views/tools_views.py:24 msgid " New seed" -msgstr "Neuer Seed" +msgstr "Generiere Seed" #: src/seedsigner/views/tools_views.py:25 msgid "New seed" -msgstr "Neuer Seed" +msgstr "Würfle Seed" #: src/seedsigner/views/tools_views.py:26 msgid "Calc 12th/24th word" -msgstr "Berechne 12./24. Wort" +msgstr "Ber. 12./24. Wort" #: src/seedsigner/views/tools_views.py:102 #: src/seedsigner/views/tools_views.py:228 @@ -1076,16 +1072,16 @@ msgstr "Seedphrasen Länge?" #: src/seedsigner/views/tools_views.py:174 msgid "12 words (50 rolls)" -msgstr "12 Wörter (50 würfe)" +msgstr "12 Wörter (50 Würfe)" #: src/seedsigner/views/tools_views.py:175 msgid "24 words (99 rolls)" -msgstr "24 Wörter (99 würfe)" +msgstr "24 Wörter (99 Würfe)" #: src/seedsigner/views/tools_views.py:179 #: src/seedsigner/views/tools_views.py:233 msgid "Mnemonic Length" -msgstr "Seedphrasen länge" +msgstr "Seedphrasen Länge" #: src/seedsigner/views/tools_views.py:258 msgid "Load seed" diff --git a/src/seedsigner/views/psbt_views.py b/src/seedsigner/views/psbt_views.py index 2df4c820..f6508811 100644 --- a/src/seedsigner/views/psbt_views.py +++ b/src/seedsigner/views/psbt_views.py @@ -87,11 +87,15 @@ class PSBTOverviewView(View): if not self.controller.psbt_parser or self.controller.psbt_parser.seed != self.controller.psbt_seed: # Must run the PSBTParser or re-parse - self.controller.psbt_parser = PSBTParser( - self.controller.psbt, - seed=self.controller.psbt_seed, - network=self.settings.get_value(SettingsConstants.SETTING__NETWORK) - ) + try: + self.controller.psbt_parser = PSBTParser( + self.controller.psbt, + seed=self.controller.psbt_seed, + network=self.settings.get_value(SettingsConstants.SETTING__NETWORK) + ) + except Exception as e: + self.loading_screen.stop() + raise e def run(self): @@ -260,7 +264,7 @@ class PSBTAddressDetailsView(View): if selected_menu_num == 0: if self.address_num < len(psbt_parser.destination_addresses) - 1: # Show the next receive addr - return Destination(PSBTAddressDetailsView, view_args={"address_num": self.address_num + 1, "is_change": False}) + return Destination(PSBTAddressDetailsView, view_args={"address_num": self.address_num + 1}) elif psbt_parser.change_amount > 0: # Move on to display change diff --git a/tests/screenshot_generator/conftest.py b/tests/screenshot_generator/conftest.py new file mode 100644 index 00000000..43f690b8 --- /dev/null +++ b/tests/screenshot_generator/conftest.py @@ -0,0 +1,11 @@ +import pytest + + + +def pytest_addoption(parser): + parser.addoption("--locale", action="store", default=None) + + +@pytest.fixture(scope='session') +def target_locale(request): + return request.config.option.locale diff --git a/tests/screenshot_generator/generator.py b/tests/screenshot_generator/generator.py index 4fe8653c..224f1e7c 100644 --- a/tests/screenshot_generator/generator.py +++ b/tests/screenshot_generator/generator.py @@ -20,7 +20,8 @@ from seedsigner.views.view import View from .utils import ScreenshotComplete, ScreenshotRenderer -def test_generate_screenshots(): + +def test_generate_screenshots(target_locale): """ The `Renderer` class is mocked so that calls in the normal code are ignored (necessary to avoid having it trying to wire up hardware dependencies). @@ -157,22 +158,24 @@ def test_generate_screenshots(): "Settings Views": settings_views_list, } - main_readme = """# SeedSigner Screenshots \n\n""" - for locale, display_name in SettingsConstants.ALL_LOCALES: + locales = [] + if target_locale is None: + locales = SettingsConstants.ALL_LOCALES + else: + locales = [locale_tuple for locale_tuple in SettingsConstants.ALL_LOCALES if locale_tuple[0] == target_locale] + + if not locales: + raise Exception(f"Invalid locale: {target_locale}") + + for locale, display_name in locales: Settings.get_instance().set_value(SettingsConstants.SETTING__LOCALE, value=locale) screenshot_renderer.set_screenshot_path(os.path.join(screenshot_root, locale)) - main_readme += f"* [{display_name}]({locale}/README.md)\n" locale_readme = f"""# SeedSigner Screenshots: {display_name}\n""" # Report the translation progress if locale != SettingsConstants.LOCALE__ENGLISH: - - # DEBUGGING - continue - # /DEBUGGING - translated_messages_path = os.path.join(pathlib.Path(__file__).parent.resolve().parent.resolve().parent.resolve(), "src", "seedsigner", "resources", "babel", locale, "LC_MESSAGES", "messages.po") with open(translated_messages_path, 'r') as translation_file: locale_translations = translation_file.read() @@ -208,5 +211,11 @@ def test_generate_screenshots(): with open(os.path.join(screenshot_renderer.screenshot_path, "README.md"), 'w') as readme_file: readme_file.write(locale_readme) + # Write the main README; ensure it writes all locales, not just the one that may + # have been specified for this run. + main_readme = """# SeedSigner Screenshots \n\n""" + for locale in SettingsConstants.ALL_LOCALES: + main_readme += f"* [{display_name}]({locale}/README.md)\n" + with open(os.path.join(screenshot_root, "README.md"), 'w') as readme_file: readme_file.write(main_readme) diff --git a/tests/screenshot_generator/utils.py b/tests/screenshot_generator/utils.py index 378dc8fd..26d232a4 100644 --- a/tests/screenshot_generator/utils.py +++ b/tests/screenshot_generator/utils.py @@ -35,7 +35,10 @@ class ScreenshotRenderer(Renderer): self.screenshot_path = path - def show_image(self, image=None, alpha_overlay=None): + def show_image(self, image=None, alpha_overlay=None, is_background_thread: bool = False): + if is_background_thread: + return + if alpha_overlay: if image == None: image = self.canvas