From bd50da724f540413d72124dcf36a54207160c6b6 Mon Sep 17 00:00:00 2001 From: Stefan Wehr Date: Wed, 8 Oct 2025 10:00:04 +0200 Subject: [PATCH 1/4] Fix #181, removing "loading failed" line --- python/code/wypp/i18n.py | 2 -- python/code/wypp/interactive.py | 3 --- 2 files changed, 5 deletions(-) diff --git a/python/code/wypp/i18n.py b/python/code/wypp/i18n.py index e8492bf..032e03e 100644 --- a/python/code/wypp/i18n.py +++ b/python/code/wypp/i18n.py @@ -155,8 +155,6 @@ def tr(key: str, **kws) -> str: 'all successful': 'alle erfolgreich', 'and stop of execution': 'und Abbruch der Ausführung', - 'NOTE: running the code failed, some definitions might not be available in the interactive window!': - 'ACHTUNG: Das Ausführen des Codes ist fehlgeschlagen; einige Definitionen sind möglicherweise im interaktiven Fenster nicht verfügbar!', '=== WELCOME to ': '=== WILLKOMMEN bei ' } diff --git a/python/code/wypp/interactive.py b/python/code/wypp/interactive.py index 9cf55ff..46fd3bf 100644 --- a/python/code/wypp/interactive.py +++ b/python/code/wypp/interactive.py @@ -41,9 +41,6 @@ def enterInteractive(userDefs: dict, checkTypes: bool, loadingFailed: bool): for k, v in userDefs.items(): globals()[k] = v print() - if loadingFailed: - print(i18n.tr('NOTE: running the code failed, some definitions might not be available in the interactive window!')) - print() if checkTypes: consoleClass = TypecheckedInteractiveConsole else: From 9d81ed541278237698771506ae8cd35fad87c06b Mon Sep 17 00:00:00 2001 From: Stefan Wehr Date: Wed, 8 Oct 2025 10:46:26 +0200 Subject: [PATCH 2/4] only warn (not error) when settings cannot be changed. Fixes #182 --- src/extension.ts | 57 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 7fc9d82..0f26bcd 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -231,6 +231,30 @@ async function fixPylanceConfig( const target = folder ? vscode.ConfigurationTarget.WorkspaceFolder : vscode.ConfigurationTarget.Workspace; + const errors: string[] = []; + + // Two special errors + const noWorkspaceOpen = '__NO_WORKSPACE_OPEN__'; + + // helper to update config and collect errors; treat "no folder open" specially + async function tryUpdate(key: string, value: any) { + // If target is workspace-wide and there is no workspace open at all + const workspaceFolders = vscode.workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + // nothing to update at workspace level + errors.push(noWorkspaceOpen); + return; + } + + try { + await cfg.update(key, value, target); + } catch (e) { + // If the error message explicitly mentions the workspace/folder, capture it, but prefer the proactive checks above + const msg = e instanceof Error ? e.message : String(e); + errors.push(`Failed to update ${key}: ${msg}`); + } + } + // wildcard warnings const keyOverride = 'analysis.diagnosticSeverityOverrides'; const overrides = cfg.get>(keyOverride) ?? {}; @@ -239,33 +263,36 @@ async function fixPylanceConfig( ...overrides, reportWildcardImportFromLibrary: 'none', }; - await cfg.update( - 'analysis.diagnosticSeverityOverrides', - updated, - target - ); + await tryUpdate(keyOverride, updated); } // extraPaths const keyExtraPaths = 'analysis.extraPaths'; const extra = cfg.get(keyExtraPaths) ?? []; if (extra.length !== 1 || extra[0] !== libDir) { - await cfg.update( - keyExtraPaths, - [libDir], - target - ); + await tryUpdate(keyExtraPaths, [libDir]); } // typechecking off const keyMode = 'analysis.typeCheckingMode'; const mode = cfg.get(keyMode) ?? ''; if (mode !== 'off') { - await cfg.update( - 'analysis.typeCheckingMode', - 'off', - target - ); + await tryUpdate(keyMode, 'off'); + } + + if (errors.length > 0) { + let msg: string; + if (errors.every(e => e === noWorkspaceOpen)) { + msg = 'Write Your Python Program: settings were not changed because no folder is open. Open a folder to apply wypp settings.'; + } else { + const sanitized = errors.map(e => e === noWorkspaceOpen ? 'Skipped workspace update because no folder is open' : e); + msg = `Write Your Python Program: failed to update settings. ` + sanitized.join('. '); + } + try { + vscode.window.showWarningMessage(msg); + } catch (_e) { + // ignore any error while showing the warning + } } } From 37d501cb5c27f950efb7825e184ef2b83513a249 Mon Sep 17 00:00:00 2001 From: Stefan Wehr Date: Wed, 8 Oct 2025 10:54:27 +0200 Subject: [PATCH 3/4] setting option for language #180 --- package.json | 6 ++++++ src/extension.ts | 23 +++++++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a622e9b..9ba6936 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,12 @@ "type": "boolean", "required": false, "description": "Disable checking of type annotations." + }, + "write-your-python-program.language": { + "type": "string", + "enum": ["german", "english", "system default"], + "default": "system default", + "description": "Choose the language for error messages." } } } diff --git a/src/extension.ts b/src/extension.ts index 0f26bcd..6453793 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -13,6 +13,7 @@ const extensionId = 'write-your-python-program'; const python3ConfigKey = 'python3Cmd'; const verboseConfigKey = 'verbose'; const debugConfigKey = 'debug'; +const languageKey = 'language'; const disableTypecheckingConfigKey = 'disableTypechecking'; const isWindows = process.platform === "win32"; const exeExt = isWindows ? ".exe" : ""; @@ -217,6 +218,19 @@ function disableTypechecking(context: vscode.ExtensionContext): boolean { return !!config[disableTypecheckingConfigKey]; } +function getLanguage(context: vscode.ExtensionContext): 'en' | 'de' | undefined { + const config = vscode.workspace.getConfiguration(extensionId); + const lang = config[languageKey]; + if (lang === 'english') { + return 'en'; + } else if (lang === 'german') { + return 'de'; + } else { + return undefined; + } +} + + async function fixPylanceConfig( context: vscode.ExtensionContext, folder?: vscode.WorkspaceFolder @@ -413,7 +427,6 @@ export async function activate(context: vscode.ExtensionContext) { "run", "▶ RUN", async (cmdId) => { - await fixPylanceConfig(context); const file = (vscode.window.activeTextEditor) ? vscode.window.activeTextEditor.document.fileName : @@ -426,6 +439,7 @@ export async function activate(context: vscode.ExtensionContext) { vscode.window.showWarningMessage('Not a python file'); return; } + await fixPylanceConfig(context); await vscode.window.activeTextEditor?.document.save(); const pyCmd = getPythonCmd(pyExt); let verboseOpt = ""; @@ -437,6 +451,11 @@ export async function activate(context: vscode.ExtensionContext) { if (verboseOpt !== "") { verboseOpt = " " + verboseOpt + " --no-clear"; } + const lang = getLanguage(context); + let langOpt = ""; + if (lang) { + langOpt = " --lang " + lang; + } const disableOpt = disableTypechecking(context) ? " --no-typechecking" : ""; if (pyCmd.kind !== "error") { const pythonCmd = commandListToArgument(pyCmd.cmd); @@ -444,7 +463,7 @@ export async function activate(context: vscode.ExtensionContext) { terminals[cmdId]?.terminal, "WYPP - RUN", pythonCmd + " " + fileToCommandArgument(runProg) + verboseOpt + - disableOpt + + disableOpt + langOpt + " --interactive " + " --change-directory " + fileToCommandArgument(file) From 996478851b08e4b4c7856f0f5ca61625f42fba1d Mon Sep 17 00:00:00 2001 From: Stefan Wehr Date: Wed, 8 Oct 2025 11:01:05 +0200 Subject: [PATCH 4/4] version bump and changelog for 2.0.6 --- ChangeLog.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index 71d957c..a52a2d4 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,9 @@ # Write Your Python Program - CHANGELOG +* 2.0.6 (2025-10-08) + * Settings for language #180 + * Only warn of settings cannot be saved #182 + * Remove unnecessary warning line #181 * 2.0.1 - 2.0.5 (2025-09-24) * Many minor fixes * 2.0.0 (2025-09-24) diff --git a/package.json b/package.json index 9ba6936..1d638b5 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Write Your Python Program!", "description": "A user friendly python environment for beginners", "license": "See license in LICENSE", - "version": "2.0.5", + "version": "2.0.6", "publisher": "StefanWehr", "icon": "icon.png", "engines": {