Skip to content

Commit 1be048a

Browse files
authored
Merge pull request #178 from skogsbaer/sw/fixes-for-2.0.1
more fixes for 2.0.*
2 parents 0c0ca13 + b1d74b9 commit 1be048a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+143
-147
lines changed

ChangeLog.md

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
# Write Your Python Program - CHANGELOG
22

3-
* 2.0.3 (2025-09-24)
4-
* More fixes
5-
* 2.0.2 (2025-09-24)
6-
* More fixes
7-
* 2.0.1 (2025-09-24)
8-
* Minor fixes
3+
* 2.0.1 - 2.0.5 (2025-09-24)
4+
* Many minor fixes
95
* 2.0.0 (2025-09-24)
106
* Remove wrappers, only check types at function enter/exit points
117
* Restructure directory layout

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"displayName": "Write Your Python Program!",
44
"description": "A user friendly python environment for beginners",
55
"license": "See license in LICENSE",
6-
"version": "2.0.3",
6+
"version": "2.0.5",
77
"publisher": "StefanWehr",
88
"icon": "icon.png",
99
"engines": {

python/code/wypp/i18n.py

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,15 @@ def tr(key: str, **kws) -> str:
4949
DE = {
5050
'Expecting no return value when calling function `{fun}`.':
5151
'Kein Rückgabewert erwartet bei Aufruf der Funktion `{fun}`.',
52-
'Expecting no return value when calling method `{method}` of class `{cls}.':
53-
'Kein Rückgabewert erwartet bei Aufruf der Methode `{method}` aus Klasse `{cls}`.',
52+
'Expecting no return value when calling method `{method}` of class `{cls}`.':
53+
'Kein Rückgabewert erwartet bei Aufruf der Methode `{method}` der Klasse `{cls}`.',
5454
'Expecting no return value when calling constructor of record `{cls}`.':
5555
'Kein Rückgabewert erwartet bei Aufruf des Konstruktors des Records `{cls}`.',
5656

5757
'Expecting return value of type `{ty}` when calling function `{fun}`.':
5858
'Rückgabewert vom Typ `{ty}` erwartet bei Aufruf der Funktion `{fun}`.',
5959
'Expecting return value of type `{ty}` when calling method `{method}` of class `{cls}`.':
60-
'Rückgabewert vom Typ `{ty}` erwartet bei Aufruf von Methode `{method}` aus Klasse `{cls}`.',
60+
'Rückgabewert vom Typ `{ty}` erwartet bei Aufruf der Methode `{method}` der Klasse `{cls}`.',
6161
'Expecting return value of type `{ty}` when calling constructor of record `{cls}`.':
6262
'Rückgabewert vom Typ `{ty}` erwartet bei Aufruf des Konstruktors des Records `{cls}`.',
6363

@@ -71,14 +71,14 @@ def tr(key: str, **kws) -> str:
7171
'Aufruf in Zeile {line} führt dazu, dass die Funktion keinen Wert zurückgibt:',
7272

7373
'The call of function `{fun}` expects value of type `{ty}` as {arg}.':
74-
'Der Aufruf der Funktion `{fun}` erwartet Wert vom Typ `{ty}` als {arg}.',
74+
'Der Aufruf der Funktion `{fun}` erwartet einen Wert vom Typ `{ty}` als {arg}.',
7575
'The call of method `{method}` of class `{cls}` expects value of type `{ty}` as {arg}.':
76-
'Der Aufruf der Methode `{method}` aus Klasse `{cls}` erwartet Wert vom Typ `{ty}` als {arg}.',
76+
'Der Aufruf der Methode `{method}` der Klasse `{cls}` erwartet einen Wert vom Typ `{ty}` als {arg}.',
7777
'The call of the constructor of record `{cls}` expects value of type `{ty}` as {arg}.':
78-
'Der Aufruf des Konstruktors des Records `{cls}` erwartet Wert vom Typ `{ty}` als {arg}.',
78+
'Der Aufruf des Konstruktors des Records `{cls}` erwartet einen Wert vom Typ `{ty}` als {arg}.',
7979

80-
'But the value given has type `{ty}`.': 'Aber der übergebene Wert hat Typ `{ty}`.',
81-
'But the default value has type `{ty}`.': 'Aber der Default-Wert hat Typ `{ty}`.',
80+
'But the value given has type `{ty}`.': 'Aber der übergebene Wert hat den Typ `{ty}`.',
81+
'But the default value has type `{ty}`.': 'Aber der Default-Wert hat den Typ `{ty}`.',
8282

8383
'File': 'Datei',
8484
'Line': 'Zeile',
@@ -93,22 +93,22 @@ def tr(key: str, **kws) -> str:
9393
'Parameter `{param}` of function `{fun}` requires a type annotation.':
9494
'Parameter `{param}` der Funktion `{fun}` benötigt eine Typannotation.',
9595
'Parameter `{param}` of method `{method}` from class `{cls}` requires a type annotation.':
96-
'Parameter `{param}` der Methode `{method}` aus Klasse `{cls}` benötigt eine Typannotation.',
96+
'Parameter `{param}` der Methode `{method}` der Klasse `{cls}` benötigt eine Typannotation.',
9797
'Parameter `{param}` of constructor of record `{cls}` requires a type annotation.':
9898
'Parameter `{param}` des Konstruktors des Records `{cls}` benötigt eine Typannotation.',
9999

100-
'Attribute `{name}` of record `{record}` required a type annotation.':
100+
'Attribute `{name}` of record `{record}` requires a type annotation.':
101101
'Attribut `{name}` des Records `{record}` benötigt eine Typannotation.',
102102

103103
'invalid type `{ty}`':
104104
'ungültiger Typ `{ty}`',
105105
'Cannot set attribute to value of type `{ty}`.':
106-
'Das Attribute kann nicht auf einen Wert vom Typ `{ty}` gesetzt werden.',
106+
'Das Attribut kann nicht auf einen Wert vom Typ `{ty}` gesetzt werden.',
107107
'Problematic assignment in line': 'Fehlerhafte Zuweisung in Zeile',
108-
'Attribute `{attrName}` of record `{recordName}` declared with type `{ty}.`':
108+
'Attribute `{attrName}` of record `{recordName}` declared with type `{ty}`.':
109109
'Attribut `{attrName}` des Records `{recordName}` deklariert als Typ `{ty}`.',
110110

111-
'argument count mismatch': 'Anzahl der Argument passt nicht',
111+
'argument count mismatch': 'Anzahl der Argumente stimmt nicht',
112112
'Call in line': 'Aufruf in Zeile',
113113
'Function `{fun}` takes ': 'Funktion `{fun}` benötigt ',
114114
'Function `{fun}` takes at least ': 'Funktion `{fun}` benötigt mindestens ',
@@ -124,12 +124,12 @@ def tr(key: str, **kws) -> str:
124124
'Default value for parameter `{paramName}` of function `{fun}` must have type `{ty}`.':
125125
'Default-Wert des Parameters `{paramName}` der Funktion `{fun}` muss vom Typ `{ty}` sein.',
126126
'Default value for parameter `{paramName}` of method `{method}` in class `{cls}` must have type `{ty}`.':
127-
'Default-Wert des Parameters `{paramName}` der Methode `{method}` aus Klasse `{cls}` muss vom Typ `{ty}` sein.',
127+
'Default-Wert des Parameters `{paramName}` der Methode `{method}` der Klasse `{cls}` muss vom Typ `{ty}` sein.',
128128
'Default value for attribute `{paramName}` of record `{cls}` must have type `{ty}`.':
129129
'Default-Wert des Attributs `{paramName}` des Records `{cls}` muss vom Typ `{ty}` sein.',
130130

131131
'Unknown attribute {attrName} for record {clsName}':
132-
'Attribut {attrName} ist nicht bekannt für Record {clsName}',
132+
'Attribut {attrName} ist nicht bekannt für den Record {clsName}',
133133
'Did you mean `{ty}`?': 'Wolltest du `{ty}` schreiben?',
134134

135135
'unknown keyword argument': 'unbekanntes Schlüsselwort-Argument',
@@ -152,13 +152,12 @@ def tr(key: str, **kws) -> str:
152152
'The impossible happened!': 'Das Unmögliche ist passiert!',
153153
'Stop of execution': 'Abbruch der Ausführung',
154154
'1 successful test': '1 erfolgreicher Test',
155-
'all succesful': 'alle erfolgreich',
156-
'and stop of execution': 'und Abbruch der Ausführung',
157155
'all successful': 'alle erfolgreich',
156+
'and stop of execution': 'und Abbruch der Ausführung',
158157

159158
'NOTE: running the code failed, some definitions might not be available in the interactive window!':
160-
'ACHTUNG: der Code enthält Fehler, einige Definition sind möglicherweise in interaktiven Fenster nicht verfügbar!'
161-
159+
'ACHTUNG: Das Ausführen des Codes ist fehlgeschlagen; einige Definitionen sind möglicherweise im interaktiven Fenster nicht verfügbar!',
160+
'=== WELCOME to ': '=== WILLKOMMEN bei '
162161
}
163162

164163
def expectingNoReturn(cn: location.CallableName) -> str:
@@ -167,7 +166,7 @@ def expectingNoReturn(cn: location.CallableName) -> str:
167166
return tr('Expecting no return value when calling function `{fun}`.',
168167
fun=cn.name)
169168
case location.ClassMember('method', cls):
170-
return tr('Expecting no return value when calling method `{method}` of class `{cls}.',
169+
return tr('Expecting no return value when calling method `{method}` of class `{cls}`.',
171170
method=cn.name, cls=cls)
172171
case location.ClassMember('recordConstructor', cls):
173172
return tr('Expecting no return value when calling constructor of record `{cls}`.',
@@ -339,7 +338,7 @@ def expectingTypeAnnotation(cn: location.CallableName, param: str) -> str:
339338
raise ValueError(f'Unexpected: {cn}')
340339

341340
def noTypeAnnotationForAttribute(attrName: str, recordName: str) -> str:
342-
return tr('Attribute `{name}` of record `{record}` required a type annotation.',
341+
return tr('Attribute `{name}` of record `{record}` requires a type annotation.',
343342
name=attrName, record=recordName)
344343

345344
def invalidTy(ty: Any) -> str:
@@ -349,7 +348,7 @@ def didYouMean(ty: str) -> str:
349348
return tr('Did you mean `{ty}`?', ty=ty)
350349

351350
def recordAttrDeclTy(recordName: str, attrName: str, ty: Any) -> str:
352-
return tr('Attribute `{attrName}` of record `{recordName}` declared with type `{ty}.`',
351+
return tr('Attribute `{attrName}` of record `{recordName}` declared with type `{ty}`.',
353352
recordName=recordName, attrName=attrName, ty=ty)
354353

355354
def unknownKeywordArgument(cn: location.CallableName, name: str) -> str:

python/code/wypp/paths.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ def projectDir(d: str):
1010
global _projectDir
1111
old = _projectDir
1212
_projectDir = _normPath(d)
13-
if _projectDir and not _projectDir[-1] == '/':
14-
_projectDir = _projectDir + '/'
13+
sep = os.path.sep
14+
if _projectDir and _projectDir[-1] != sep:
15+
_projectDir = _projectDir + sep
1516
try:
1617
yield
1718
finally:

python/code/wypp/runner.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,24 @@
55
import sys
66
import os
77

8+
requiredVersion = (3, 12, 0)
9+
def pythonVersionOk(v):
10+
(reqMajor, reqMinor, reqMicro) = requiredVersion
11+
if v.major < reqMajor or v.minor < reqMinor:
12+
return False
13+
if v.major == reqMajor and v.minor == reqMinor and v.micro < reqMicro:
14+
return False
15+
else:
16+
return True
17+
18+
if not pythonVersionOk(sys.version_info):
19+
vStr = sys.version.split()[0]
20+
reqVStr = '.'.join([str(x) for x in requiredVersion])
21+
print(f"""
22+
Python in version {reqVStr} or newer is required. You are still using version {vStr}, please upgrade!
23+
""")
24+
sys.exit(1)
25+
826
# local imports
927
from constants import *
1028
import i18n
@@ -16,15 +34,6 @@
1634
import exceptionHandler
1735
import cmdlineArgs
1836

19-
requiredVersion = (3, 12, 0)
20-
def pythonVersionOk(v):
21-
(reqMajor, reqMinor, reqMicro) = requiredVersion
22-
if v.major < reqMajor or v.minor < reqMinor:
23-
return False
24-
if v.major == reqMajor and v.minor == reqMinor and v.micro < reqMicro:
25-
return False
26-
else:
27-
return True
2837

2938
def printWelcomeString(file, version, doTypecheck):
3039
cwd = os.getcwd() + "/"
@@ -35,19 +44,10 @@ def printWelcomeString(file, version, doTypecheck):
3544
tycheck = ''
3645
if not doTypecheck:
3746
tycheck = ', no typechecking'
38-
printStderr('=== WELCOME to "Write Your Python Program" ' +
47+
printStderr(i18n.tr('=== WELCOME to ') + '"Write Your Python Program" ' +
3948
'(%sPython %s, %s%s) ===' % (versionStr, pythonVersion, file, tycheck))
4049

4150
def main(globals, argList=None):
42-
v = sys.version_info
43-
if not pythonVersionOk(v):
44-
vStr = sys.version.split()[0]
45-
reqVStr = '.'.join([str(x) for x in requiredVersion])
46-
print(f"""
47-
Python in version {reqVStr} or newer is required. You are still using version {vStr}, please upgrade!
48-
""")
49-
sys.exit(1)
50-
5151
(args, restArgs) = cmdlineArgs.parseCmdlineArgs(argList)
5252
if args.verbose:
5353
enableVerbose()
@@ -92,7 +92,7 @@ def main(globals, argList=None):
9292
globals = runCode.runStudentCode(fileToRun, globals, args.checkRunnable,
9393
doTypecheck=args.checkTypes, extraDirs=args.extraDirs)
9494
except Exception as e:
95-
verbose(f'Error while running code in {fileToRun}: {e}')
95+
verbose(f'Error while running code in {fileToRun}')
9696
exceptionHandler.handleCurrentException(exit=not isInteractive)
9797
loadingFailed = True
9898

python/file-test-data/basics/async.err

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ Traceback (most recent call last):
1212

1313
WyppTypeError: "blub"
1414

15-
Der Aufruf der Funktion `foo` erwartet Wert vom Typ `int` als erstes Argument.
16-
Aber der übergebene Wert hat Typ `str`.
15+
Der Aufruf der Funktion `foo` erwartet einen Wert vom Typ `int` als erstes Argument.
16+
Aber der übergebene Wert hat den Typ `str`.
1717

1818
## Datei file-test-data/basics/async.py
1919
## Fehlerhafter Aufruf in Zeile 7:
@@ -22,4 +22,4 @@ Aber der übergebene Wert hat Typ `str`.
2222

2323
## Typ deklariert in Zeile 3:
2424

25-
async def foo(i: int):
25+
async def foo(i: int):

python/file-test-data/basics/constructor.err

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ Traceback (most recent call last):
44

55
WyppTypeError: "1"
66

7-
Der Aufruf der Methode `__init__` aus Klasse `C` erwartet Wert vom Typ `int` als erstes Argument.
8-
Aber der übergebene Wert hat Typ `str`.
7+
Der Aufruf der Methode `__init__` der Klasse `C` erwartet einen Wert vom Typ `int` als erstes Argument.
8+
Aber der übergebene Wert hat den Typ `str`.
99

1010
## Datei file-test-data/basics/constructor.py
1111
## Fehlerhafter Aufruf in Zeile 5:

python/file-test-data/basics/forwardRefs.err

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ Traceback (most recent call last):
44

55
WyppTypeError: <__wypp__.A object at 0x00>
66

7-
Der Aufruf der Methode `foo` aus Klasse `A` erwartet Wert vom Typ `B` als erstes Argument.
8-
Aber der übergebene Wert hat Typ `A`.
7+
Der Aufruf der Methode `foo` der Klasse `A` erwartet einen Wert vom Typ `B` als erstes Argument.
8+
Aber der übergebene Wert hat den Typ `A`.
99

1010
## Datei file-test-data/basics/forwardRefs.py
1111
## Fehlerhafter Aufruf in Zeile 12:

python/file-test-data/basics/functionArg.err

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ Traceback (most recent call last):
44

55
WyppTypeError: "1"
66

7-
Der Aufruf der Funktion `foo` erwartet Wert vom Typ `int` als zweites Argument.
8-
Aber der übergebene Wert hat Typ `str`.
7+
Der Aufruf der Funktion `foo` erwartet einen Wert vom Typ `int` als zweites Argument.
8+
Aber der übergebene Wert hat den Typ `str`.
99

1010
## Datei file-test-data/basics/functionArg.py
1111
## Fehlerhafter Aufruf in Zeile 8:

python/file-test-data/basics/kwargs.err

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ Traceback (most recent call last):
44

55
WyppTypeError: 2
66

7-
Der Aufruf der Funktion `foo` erwartet Wert vom Typ `str` als Argument `z`.
8-
Aber der übergebene Wert hat Typ `int`.
7+
Der Aufruf der Funktion `foo` erwartet einen Wert vom Typ `str` als Argument `z`.
8+
Aber der übergebene Wert hat den Typ `int`.
99

1010
## Datei file-test-data/basics/kwargs.py
1111
## Fehlerhafter Aufruf in Zeile 4:

0 commit comments

Comments
 (0)