diff --git a/python/.vscode/settings.json b/python/.vscode/settings.json index 8b45edc..eab5697 100644 --- a/python/.vscode/settings.json +++ b/python/.vscode/settings.json @@ -1,10 +1,3 @@ { - "python.analysis.diagnosticMode": "workspace", - "python.analysis.diagnosticSeverityOverrides": { - "reportWildcardImportFromLibrary": "none" - }, - "python.analysis.extraPaths": [ - "/Users/swehr/.vscode/extensions/stefanwehr.write-your-python-program-2.0.7/python/code/" - ], - "python.analysis.typeCheckingMode": "off" + "python.analysis.diagnosticMode": "workspace" } diff --git a/python/code/wypp/__init__.py b/python/code/wypp/__init__.py index 38ce591..f8bd8d9 100644 --- a/python/code/wypp/__init__.py +++ b/python/code/wypp/__init__.py @@ -1,14 +1,10 @@ -try: - from . import writeYourProgram as w -except (ImportError, ModuleNotFoundError): - import writeYourProgram as w - +from dataclasses import dataclass import typing - # Exported names that are available for star imports (mostly in alphabetic order) from typing import Any, Callable, Generator, Iterable, Iterator, Literal, Mapping, Optional, \ Protocol, Sequence, Union -from dataclasses import dataclass + +from . import writeYourProgram as w check = w.check checkFail = w.checkFail diff --git a/python/code/wypp/ansi.py b/python/code/wypp/ansi.py index 324002c..6fc47a8 100644 --- a/python/code/wypp/ansi.py +++ b/python/code/wypp/ansi.py @@ -1,6 +1,6 @@ +import os import re import sys -import os RESET = "\u001b[0;0m" BOLD = "\u001b[1m" diff --git a/python/code/wypp/cmdlineArgs.py b/python/code/wypp/cmdlineArgs.py index 2a030f0..2d4e4de 100644 --- a/python/code/wypp/cmdlineArgs.py +++ b/python/code/wypp/cmdlineArgs.py @@ -1,7 +1,8 @@ import argparse import sys -import utils -from myLogging import * + +from .myLogging import * +from . import utils def parseCmdlineArgs(argList): parser = argparse.ArgumentParser(description='Run Your Program!', diff --git a/python/code/wypp/debug.py b/python/code/wypp/debug.py index 70da598..5f7bf84 100644 --- a/python/code/wypp/debug.py +++ b/python/code/wypp/debug.py @@ -1,5 +1,6 @@ import sys -import runner + +from . import runner # Use this file if you want to the some test file under the debugger if __name__ == '__main__': diff --git a/python/code/wypp/drawingLib.py b/python/code/wypp/drawingLib.py index edc940b..8df0f0f 100644 --- a/python/code/wypp/drawingLib.py +++ b/python/code/wypp/drawingLib.py @@ -1,8 +1,9 @@ -import time import threading -import writeYourProgram as _w +import time from typing import Literal, Sequence +from . import writeYourProgram as _w + # Do not import tkinter at the top-level. Someone with no installation of tkinter should # be able to user WYPP without drawing support. diff --git a/python/code/wypp/errors.py b/python/code/wypp/errors.py index b8b4996..82751b4 100644 --- a/python/code/wypp/errors.py +++ b/python/code/wypp/errors.py @@ -1,10 +1,11 @@ from __future__ import annotations -from typing import * import abc import inspect -import location -import i18n -from renderTy import renderTy +from typing import * + +from . import i18n +from . import location +from .renderTy import renderTy class WyppError(abc.ABC): def __init__(self, extraFrames: list[inspect.FrameInfo] = []): diff --git a/python/code/wypp/exceptionHandler.py b/python/code/wypp/exceptionHandler.py index fc8221a..952c5ff 100644 --- a/python/code/wypp/exceptionHandler.py +++ b/python/code/wypp/exceptionHandler.py @@ -1,15 +1,14 @@ +from dataclasses import dataclass +import re import sys import traceback -import re -from dataclasses import dataclass -# local imports -from constants import * -import stacktrace -import paths -from myLogging import * -import errors -import utils +from .constants import * +from . import errors +from .myLogging import * +from . import paths +from . import stacktrace +from . import utils _tbPattern = re.compile(r'(\s*File\s+")([^"]+)(".*)') def _rewriteFilenameInTracebackLine(s: str) -> str: diff --git a/python/code/wypp/i18n.py b/python/code/wypp/i18n.py index 8cf295e..6149a7d 100644 --- a/python/code/wypp/i18n.py +++ b/python/code/wypp/i18n.py @@ -1,9 +1,10 @@ +from contextlib import contextmanager from dataclasses import dataclass -import location from typing import * -from contextlib import contextmanager -import lang -import utils + +from . import lang +from . import location +from . import utils type Lang = Literal['en', 'de'] diff --git a/python/code/wypp/instrument.py b/python/code/wypp/instrument.py index 0658f12..ea742a5 100644 --- a/python/code/wypp/instrument.py +++ b/python/code/wypp/instrument.py @@ -1,19 +1,20 @@ -from typing import * -import os import ast +from collections.abc import Buffer +from contextlib import contextmanager import importlib import importlib.abc -from importlib.machinery import ModuleSpec, SourceFileLoader import importlib.machinery +from importlib.machinery import ModuleSpec, SourceFileLoader from importlib.util import decode_source, spec_from_file_location -from collections.abc import Buffer -import types +import os from os import PathLike -import utils -from myLogging import * -from contextlib import contextmanager -import errors -import location +import types +from typing import * + +from . import errors +from . import location +from .myLogging import * +from . import utils def parseExp(s: str) -> ast.expr: match ast.parse(s): diff --git a/python/code/wypp/interactive.py b/python/code/wypp/interactive.py index 0d7c267..274d318 100644 --- a/python/code/wypp/interactive.py +++ b/python/code/wypp/interactive.py @@ -1,13 +1,12 @@ -import sys -import os import code from dataclasses import dataclass +import os +import sys -# local imports -from constants import * -from myLogging import * -from exceptionHandler import handleCurrentException +from .constants import * +from .exceptionHandler import handleCurrentException +from .myLogging import * HISTORY_SIZE = 1000 diff --git a/python/code/wypp/lang.py b/python/code/wypp/lang.py index 271114b..31021aa 100644 --- a/python/code/wypp/lang.py +++ b/python/code/wypp/lang.py @@ -1,6 +1,6 @@ -import os -import locale from _collections_abc import MutableMapping +import locale +import os def _langFromEnv(env: MutableMapping) -> str | None: # 1) GNU LANGUAGE: colon-separated fallbacks (e.g., "de:en_US:en") diff --git a/python/code/wypp/location.py b/python/code/wypp/location.py index 0cdf99a..7100676 100644 --- a/python/code/wypp/location.py +++ b/python/code/wypp/location.py @@ -1,20 +1,21 @@ from __future__ import annotations -from typing import * +import abc +import ast from dataclasses import dataclass +import dis import inspect import linecache -import dis -import ast -import ansi -import utils -import myLogging +import os import sys -import abc -import parsecache -from parsecache import FunMatcher -import paths import tokenize -import os +from typing import * + +from . import ansi +from . import myLogging +from . import parsecache +from .parsecache import FunMatcher +from . import paths +from . import utils @dataclass class EncodedBytes: diff --git a/python/code/wypp/myLogging.py b/python/code/wypp/myLogging.py index 88f2046..a13a58d 100644 --- a/python/code/wypp/myLogging.py +++ b/python/code/wypp/myLogging.py @@ -1,6 +1,7 @@ -import utils import sys +from . import utils + VERBOSE = False # set via commandline DEBUG = utils.getEnv("WYPP_DEBUG", bool, False) diff --git a/python/code/wypp/myTypeguard.py b/python/code/wypp/myTypeguard.py index b3854ee..d037c0b 100644 --- a/python/code/wypp/myTypeguard.py +++ b/python/code/wypp/myTypeguard.py @@ -1,11 +1,11 @@ # Wrapper module for typeguard. Do not import typeguard directly but always via myTypeguard from __future__ import annotations -from typing import * from dataclasses import dataclass -from myLogging import * - # We externally adjust the PYTHONPATH so that the typeguard module can be resolved -import typeguard # type: ignore +import typeguard # type: ignore +from typing import * + +from .myLogging import * @dataclass(frozen=True) class Namespaces: diff --git a/python/code/wypp/parsecache.py b/python/code/wypp/parsecache.py index 94810c6..d5e7734 100644 --- a/python/code/wypp/parsecache.py +++ b/python/code/wypp/parsecache.py @@ -1,7 +1,7 @@ import ast -import os -import linecache from dataclasses import dataclass +import linecache +import os from typing import * def _firstLineOfFun(node: ast.FunctionDef | ast.AsyncFunctionDef) -> int: diff --git a/python/code/wypp/paths.py b/python/code/wypp/paths.py index 5c438b6..3d805aa 100644 --- a/python/code/wypp/paths.py +++ b/python/code/wypp/paths.py @@ -1,6 +1,6 @@ +from contextlib import contextmanager import os from typing import * -from contextlib import contextmanager _projectDir: Optional[str] = None diff --git a/python/code/wypp/records.py b/python/code/wypp/records.py index c0cbfcb..827d81a 100644 --- a/python/code/wypp/records.py +++ b/python/code/wypp/records.py @@ -1,13 +1,14 @@ -import typing import dataclasses -import utils import sys -import myTypeguard -import errors -import typecheck -import location -import stacktrace -from utils import _call_with_frames_removed +import typing + +from . import errors +from . import location +from . import myTypeguard +from . import stacktrace +from . import typecheck +from . import utils +from .utils import _call_with_frames_removed EQ_ATTRS_ATTR = '__eqAttrs__' diff --git a/python/code/wypp/renderTy.py b/python/code/wypp/renderTy.py index 0b33744..9d95138 100644 --- a/python/code/wypp/renderTy.py +++ b/python/code/wypp/renderTy.py @@ -1,7 +1,8 @@ import collections.abc import types from typing import * -import myTypeguard + +from . import myTypeguard #def renderTy(t: Any) -> str: # if isinstance(t, str): # return t diff --git a/python/code/wypp/replTester.py b/python/code/wypp/replTester.py index 6f94813..0e61ced 100644 --- a/python/code/wypp/replTester.py +++ b/python/code/wypp/replTester.py @@ -1,8 +1,9 @@ -import sys -import doctest from contextlib import contextmanager -import ansi -from myLogging import * +import doctest +import sys + +from . import ansi +from .myLogging import * # We use our own DocTestParser to replace exception names in stacktraces diff --git a/python/code/wypp/runCode.py b/python/code/wypp/runCode.py index 03a4091..978fb59 100644 --- a/python/code/wypp/runCode.py +++ b/python/code/wypp/runCode.py @@ -1,18 +1,17 @@ -import sys -import os +from contextlib import contextmanager +from dataclasses import dataclass import importlib +import os import runpy -from dataclasses import dataclass +import sys from typing import Optional -from contextlib import contextmanager -# local imports -from constants import * -import stacktrace -import instrument -from myLogging import * -from exceptionHandler import handleCurrentException -import utils +from .constants import * +from .exceptionHandler import handleCurrentException +from . import instrument +from .myLogging import * +from . import stacktrace +from . import utils class Lib: def __init__(self, mod, properlyImported): @@ -87,11 +86,7 @@ def debugModule(name): print("Origin:", spec.origin) print("Loader:", type(spec.loader).__name__) -import sys -import os -import contextlib - -@contextlib.contextmanager +@contextmanager def freshModules(): original_modules = sys.modules.copy() stdlib_path = os.path.dirname(os.__file__) diff --git a/python/code/wypp/runYourProgram.py b/python/code/wypp/runYourProgram.py index 672b88b..702b1d8 100644 --- a/python/code/wypp/runYourProgram.py +++ b/python/code/wypp/runYourProgram.py @@ -13,5 +13,5 @@ sys.exit(1) if __name__ == '__main__': - import runner as r + import wypp.runner as r r.main(globals()) diff --git a/python/code/wypp/runner.py b/python/code/wypp/runner.py index 41a9433..38f67a7 100644 --- a/python/code/wypp/runner.py +++ b/python/code/wypp/runner.py @@ -1,9 +1,8 @@ +import os import sys -import constants -sys.path.insert(0, constants.CODE_DIR) -import sys -import os +from . import constants +sys.path.insert(0, constants.CODE_DIR) requiredVersion = (3, 12, 0) def pythonVersionOk(v): @@ -23,17 +22,17 @@ def pythonVersionOk(v): """) sys.exit(1) -# local imports -from constants import * -import i18n -import paths -from myLogging import * -import version as versionMod -import interactive -import runCode -import exceptionHandler -import cmdlineArgs -import ansi +from . import ansi +from . import cmdlineArgs +from .constants import * +from . import exceptionHandler +from . import i18n +from . import interactive +from .myLogging import * +from . import paths +from . import replTester +from . import runCode +from . import version as versionMod def printWelcomeString(file, version, doTypecheck): cwd = os.getcwd() + "/" @@ -70,7 +69,6 @@ def main(globals, argList=None): fileToRun: str|None = args.file if fileToRun is None: if args.repls: - import replTester replTester.testRepls(args.repls, globals) return if not os.path.exists(fileToRun): @@ -109,7 +107,6 @@ def main(globals, argList=None): extraDirs=args.extraDirs, loadingFailed=loadingFailed) if args.repls: - import replTester replTester.testRepls(args.repls, globals) if isInteractive: diff --git a/python/code/wypp/stacktrace.py b/python/code/wypp/stacktrace.py index 231c3ed..5a94df0 100644 --- a/python/code/wypp/stacktrace.py +++ b/python/code/wypp/stacktrace.py @@ -1,13 +1,14 @@ -import types -import traceback -import utils +from collections import deque import inspect -import threading -from typing import Optional, Any import os import sys -from collections import deque -from myLogging import * +import threading +import traceback +import types +from typing import Optional, Any + +from .myLogging import * +from . import utils def tbToFrameList(tb: types.TracebackType) -> list[types.FrameType]: cur = tb diff --git a/python/code/wypp/typecheck.py b/python/code/wypp/typecheck.py index c1261fa..eb141bc 100644 --- a/python/code/wypp/typecheck.py +++ b/python/code/wypp/typecheck.py @@ -1,15 +1,16 @@ from __future__ import annotations from collections.abc import Callable -from typing import ParamSpec, TypeVar, Any, Optional, Literal -import types -import inspect from dataclasses import dataclass -import utils -from myTypeguard import matchesTy, MatchesTyResult, MatchesTyFailure, Namespaces -import stacktrace -import location -import errors -from myLogging import * +import inspect +import types +from typing import ParamSpec, TypeVar, Any, Optional, Literal + +from . import errors +from . import location +from .myLogging import * +from .myTypeguard import matchesTy, MatchesTyResult, MatchesTyFailure, Namespaces +from . import stacktrace +from . import utils def printVars(what: str, *l): s = what + ": " + ', '.join([str(x) for x in l]) diff --git a/python/code/wypp/utils.py b/python/code/wypp/utils.py index 736cbab..43c50d0 100644 --- a/python/code/wypp/utils.py +++ b/python/code/wypp/utils.py @@ -1,7 +1,7 @@ -from typing import * +from contextlib import contextmanager import os import sys -from contextlib import contextmanager +from typing import * P = ParamSpec("P") T = TypeVar("T") diff --git a/python/code/wypp/version.py b/python/code/wypp/version.py index c1c8ece..3412484 100644 --- a/python/code/wypp/version.py +++ b/python/code/wypp/version.py @@ -1,12 +1,11 @@ -import os +from dataclasses import dataclass import json +import os import subprocess -from dataclasses import dataclass -# local imports -from constants import * -from myLogging import * -import utils +from .constants import * +from .myLogging import * +from . import utils def readGitVersion(): thisDir = os.path.basename(SOURCE_DIR) diff --git a/python/code/wypp/writeYourProgram.py b/python/code/wypp/writeYourProgram.py index 218ebc2..aeec9e5 100644 --- a/python/code/wypp/writeYourProgram.py +++ b/python/code/wypp/writeYourProgram.py @@ -1,16 +1,18 @@ -import typing -from typing import Any import dataclasses import inspect -import errors -import typecheck -import records -import stacktrace -import renderTy -import location -import paths -import utils -import i18n +import math as moduleMath +import typing +from typing import Any + +from . import errors +from . import i18n +from . import location +from . import paths +from . import records +from . import renderTy +from . import stacktrace +from . import typecheck +from . import utils _DEBUG = False def _debug(s): @@ -329,8 +331,6 @@ def runUnittests(scope: dict[str, Any]): # Additional functions and aliases -import math as moduleMath - math = moduleMath wrapTypecheck = typecheck.wrapTypecheck diff --git a/python/file-test-data/extras/testImpossible.err b/python/file-test-data/extras/testImpossible.err index c35e73b..1e55c80 100644 --- a/python/file-test-data/extras/testImpossible.err +++ b/python/file-test-data/extras/testImpossible.err @@ -1,7 +1,7 @@ Traceback (most recent call last): File "file-test-data/extras/testImpossible.py", line 3, in impossible() - File "code/wypp/writeYourProgram.py", line 318, in impossible + File "code/wypp/writeYourProgram.py", line 320, in impossible raise errors.ImpossibleError(msg) Das Unmögliche ist passiert! diff --git a/python/file-test-data/extras/testTodo.err b/python/file-test-data/extras/testTodo.err index 459d564..bfa04df 100644 --- a/python/file-test-data/extras/testTodo.err +++ b/python/file-test-data/extras/testTodo.err @@ -1,7 +1,7 @@ Traceback (most recent call last): File "file-test-data/extras/testTodo.py", line 3, in todo() - File "code/wypp/writeYourProgram.py", line 312, in todo + File "code/wypp/writeYourProgram.py", line 314, in todo raise errors.TodoError(msg) TODO diff --git a/python/integration-tests/testIntegration.py b/python/integration-tests/testIntegration.py index 03a4d6a..16eb04e 100644 --- a/python/integration-tests/testIntegration.py +++ b/python/integration-tests/testIntegration.py @@ -90,5 +90,6 @@ class ReplTesterTests(unittest.TestCase): def test_replTester(self): d = shell.pwd() cmd = f'{d}/run {d}/integration-test-data/repl-test-lib.py --repl {d}/integration-test-data/repl-test-checks.py' + print(cmd) res = shell.run(cmd, captureStdout=True, onError='die', cwd='/tmp') self.assertIn('All 1 tests succeeded. Great!', res.stdout) diff --git a/python/pyrightconfig.json b/python/pyrightconfig.json index 1aeadf4..58e1d1b 100644 --- a/python/pyrightconfig.json +++ b/python/pyrightconfig.json @@ -4,7 +4,7 @@ "reportMissingTypeStubs": false, "exclude": ["file-test-data", "integration-test-data"], "ignore": ["code/typing_extensions.py", "code/typeguard"], - "extraPaths": ["code/wypp"], + "extraPaths": ["code/wypp", "./code"], "typeCheckingMode": "basic" } diff --git a/python/tests/test_deepEq.py b/python/tests/test_deepEq.py index b70e4c3..75c1e6b 100644 --- a/python/tests/test_deepEq.py +++ b/python/tests/test_deepEq.py @@ -1,8 +1,8 @@ import unittest import sample -from writeYourProgram import * -from writeYourProgram import deepEq -import writeYourProgram as wypp +from wypp.writeYourProgram import * +from wypp.writeYourProgram import deepEq +import wypp.writeYourProgram as wypp wypp.setDieOnCheckFailures(True) diff --git a/python/tests/test_drawing.py b/python/tests/test_drawing.py index 88acc4c..b41a959 100644 --- a/python/tests/test_drawing.py +++ b/python/tests/test_drawing.py @@ -1,6 +1,6 @@ import unittest -from writeYourProgram import * -from drawingLib import * +from wypp.writeYourProgram import * +from wypp.drawingLib import * setDieOnCheckFailures(True) diff --git a/python/tests/test_i18n.py b/python/tests/test_i18n.py index 90f3eae..a62f1db 100644 --- a/python/tests/test_i18n.py +++ b/python/tests/test_i18n.py @@ -1,6 +1,6 @@ import unittest -import i18n -import location +import wypp.i18n as i18n +import wypp.location as location import inspect import utils diff --git a/python/tests/test_location.py b/python/tests/test_location.py index e4ed81a..df5801e 100644 --- a/python/tests/test_location.py +++ b/python/tests/test_location.py @@ -1,6 +1,6 @@ import unittest import os -import location +import wypp.location as location from locationTestData import * class TestLocation(unittest.TestCase): diff --git a/python/tests/test_misc.py b/python/tests/test_misc.py index 9334883..bf94907 100644 --- a/python/tests/test_misc.py +++ b/python/tests/test_misc.py @@ -1,5 +1,5 @@ import unittest -from writeYourProgram import * +from wypp.writeYourProgram import * from typing import * setDieOnCheckFailures(True) diff --git a/python/tests/test_record.py b/python/tests/test_record.py index e9fc222..9fd49df 100644 --- a/python/tests/test_record.py +++ b/python/tests/test_record.py @@ -1,9 +1,9 @@ import unittest -from writeYourProgram import * +from wypp.writeYourProgram import * import sys import traceback import dataclasses -import stacktrace +import wypp.stacktrace as stacktrace from typing import Literal initModule() diff --git a/python/tests/test_renderTy.py b/python/tests/test_renderTy.py index 0b6f4c7..04b44c0 100644 --- a/python/tests/test_renderTy.py +++ b/python/tests/test_renderTy.py @@ -1,6 +1,6 @@ import unittest from typing import * -from renderTy import renderTy +from wypp.renderTy import renderTy class MyClass: pass diff --git a/python/tests/test_stacktrace.py b/python/tests/test_stacktrace.py index a39b752..2de964f 100644 --- a/python/tests/test_stacktrace.py +++ b/python/tests/test_stacktrace.py @@ -1,7 +1,6 @@ import unittest import sys -import types -import stacktrace +import wypp.stacktrace as stacktrace from stacktraceTestData import * import os