pyscript-programming-language 1.11.2__tar.gz → 1.11.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyscript_programming_language-1.11.2/pyscript_programming_language.egg-info → pyscript_programming_language-1.11.3}/PKG-INFO +1 -1
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/__main__.py +70 -28
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/analyzer.py +9 -7
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/checks.py +1 -1
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/constants.py +1 -1
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/editor/gui.py +6 -3
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/editor/terminal.py +5 -1
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/handlers.py +19 -10
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/interpreter.py +16 -18
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/lexer.py +16 -15
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/nodes.py +2 -2
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/parser.py +15 -15
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/position.py +2 -3
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/pysbuiltins.py +6 -6
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/runner.py +5 -5
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/shell.py +11 -11
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/generic.py +7 -10
- pyscript_programming_language-1.11.3/pyscript/core/utils/jsdict.py +32 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/version.py +2 -2
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/ast/ast_dump.py +1 -1
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/ast/ast_unparse.py +1 -1
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/ast/ast_walk.py +1 -1
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/brainfuck.pys +26 -32
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/site.pys +3 -3
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/tokenize/tok_untokenize.py +2 -2
- pyscript_programming_language-1.11.3/pyscript/other/.nomedia +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3/pyscript_programming_language.egg-info}/PKG-INFO +1 -1
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript_programming_language.egg-info/SOURCES.txt +5 -5
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/setup.py +2 -1
- pyscript_programming_language-1.11.2/pyscript/core/other/.nomedia +0 -1
- pyscript_programming_language-1.11.2/pyscript/core/utils/jsdict.py +0 -34
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/MANIFEST.in +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/README.md +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/__init__.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/__init__.pyi +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/__init__.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/bases.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/buffer.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/cache.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/context.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/editor/__init__.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/editor/bases.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/exceptions.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/highlight.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/mapping.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/objects.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/results.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/symtab.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/token.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/__init__.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/ansi.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/debug.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/decorators.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/module.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/path.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/similarity.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/string.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/__hello__.pys +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/ansi.pys +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/ast/__init__.pys +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/ast/ast_literal_eval.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/dis.pys +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/explorer.pys +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/fpstimer/__init__.pys +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/fpstimer/py_fpstimer.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/getch.pys +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/inspect.pys +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/jsdict.pys +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/keyword.pys +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/opcode.pys +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/parser.pys +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/symtable.pys +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/sys.pys +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/token.pys +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/tokenize/__init__.pys +0 -0
- {pyscript_programming_language-1.11.2/pyscript/core → pyscript_programming_language-1.11.3/pyscript}/other/PyScript.ico +0 -0
- {pyscript_programming_language-1.11.2/pyscript/core → pyscript_programming_language-1.11.3/pyscript}/other/copyright +0 -0
- {pyscript_programming_language-1.11.2/pyscript/core → pyscript_programming_language-1.11.3/pyscript}/other/credits +0 -0
- {pyscript_programming_language-1.11.2/pyscript/core → pyscript_programming_language-1.11.3/pyscript}/other/license +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/site-packages/this.pys +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/this.py +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript_programming_language.egg-info/dependency_links.txt +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript_programming_language.egg-info/requires.txt +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript_programming_language.egg-info/top_level.txt +0 -0
- {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/setup.cfg +0 -0
{pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/__main__.py
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
from .core.buffer import PysFileBuffer
|
|
2
2
|
from .core.cache import undefined, hook
|
|
3
3
|
from .core.constants import DEFAULT, DEBUG, DONT_SHOW_BANNER_ON_SHELL, NO_COLOR
|
|
4
|
-
from .core.editor.gui import PysGUIEditor
|
|
5
|
-
from .core.editor.terminal import PysTerminalEditor
|
|
4
|
+
from .core.editor.gui import PysGUIEditor, GUI_SUPPORT
|
|
5
|
+
from .core.editor.terminal import PysTerminalEditor, TERMINAL_SUPPORT
|
|
6
6
|
from .core.highlight import (
|
|
7
7
|
HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight, PygmentsPyScriptStyle, PygmentsPyScriptLexer
|
|
8
8
|
)
|
|
@@ -42,17 +42,18 @@ FORMAT_HIGHLIGHT_MAP = {
|
|
|
42
42
|
'bbcode': HLFMT_BBCODE
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
EDITOR_MAP = {}
|
|
46
|
+
|
|
47
|
+
if GUI_SUPPORT:
|
|
48
|
+
EDITOR_MAP['gui'] = PysGUIEditor
|
|
49
|
+
if TERMINAL_SUPPORT:
|
|
50
|
+
EDITOR_MAP['terminal'] = PysTerminalEditor
|
|
51
|
+
|
|
45
52
|
parser = ArgumentParser(
|
|
46
53
|
prog=f'{get_name_from_path(sys.executable)} -m pyscript',
|
|
47
54
|
description=f'PyScript Launcher for Python Version {".".join(map(str, sys.version_info))}'
|
|
48
55
|
)
|
|
49
56
|
|
|
50
|
-
parser.add_argument(
|
|
51
|
-
'-v', '--version',
|
|
52
|
-
action='version',
|
|
53
|
-
version=f"PyScript {__version__}",
|
|
54
|
-
)
|
|
55
|
-
|
|
56
57
|
parser.add_argument(
|
|
57
58
|
'-c', '--command',
|
|
58
59
|
type=str,
|
|
@@ -66,17 +67,18 @@ parser.add_argument(
|
|
|
66
67
|
help="Set a debug flag, this will ignore assert statement. Check the flag is active with the __debug__ keyword"
|
|
67
68
|
)
|
|
68
69
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
70
|
+
if EDITOR_MAP:
|
|
71
|
+
parser.add_argument(
|
|
72
|
+
'-e', '--editor',
|
|
73
|
+
choices=tuple(EDITOR_MAP.keys()),
|
|
74
|
+
default=None,
|
|
75
|
+
help="Open the editor panel from a 'file'",
|
|
76
|
+
)
|
|
75
77
|
|
|
76
78
|
parser.add_argument(
|
|
77
79
|
'-i', '--inspect',
|
|
78
80
|
action='store_true',
|
|
79
|
-
help="Inspect interactively after running a
|
|
81
|
+
help="Inspect interactively after running a code",
|
|
80
82
|
)
|
|
81
83
|
|
|
82
84
|
parser.add_argument(
|
|
@@ -100,9 +102,9 @@ parser.add_argument(
|
|
|
100
102
|
)
|
|
101
103
|
|
|
102
104
|
parser.add_argument(
|
|
103
|
-
'-
|
|
105
|
+
'-t', '--terminal',
|
|
104
106
|
action='store_true',
|
|
105
|
-
help="
|
|
107
|
+
help="Configure terminal encoding to UTF-8 and enable ANSI escape code processing on Windows"
|
|
106
108
|
)
|
|
107
109
|
|
|
108
110
|
parser.add_argument(
|
|
@@ -111,6 +113,18 @@ parser.add_argument(
|
|
|
111
113
|
help="Don't print version and copyright messages on interactive startup"
|
|
112
114
|
)
|
|
113
115
|
|
|
116
|
+
parser.add_argument(
|
|
117
|
+
'-v', '-V', '--version',
|
|
118
|
+
action='version',
|
|
119
|
+
version=f"PyScript {__version__}",
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
parser.add_argument(
|
|
123
|
+
'-P',
|
|
124
|
+
action='store_true',
|
|
125
|
+
help="Don't prepend a potentially unsafe path to sys.path (python sys.path)"
|
|
126
|
+
)
|
|
127
|
+
|
|
114
128
|
parser.add_argument(
|
|
115
129
|
'file',
|
|
116
130
|
type=str,
|
|
@@ -131,8 +145,26 @@ def argument_error(argument, message):
|
|
|
131
145
|
|
|
132
146
|
args = parser.parse_args()
|
|
133
147
|
|
|
148
|
+
if args.terminal:
|
|
149
|
+
|
|
150
|
+
for fd in (sys.stdout, sys.stderr, sys.stdin):
|
|
151
|
+
try:
|
|
152
|
+
fd.reconfigure(encoding='utf-8')
|
|
153
|
+
except:
|
|
154
|
+
continue
|
|
155
|
+
|
|
156
|
+
if sys.platform == 'win32':
|
|
157
|
+
try:
|
|
158
|
+
import ctypes
|
|
159
|
+
kernel32 = ctypes.windll.kernel32
|
|
160
|
+
kernel32.SetConsoleMode(kernel32.GetStdHandle(-11), 7) # stdout
|
|
161
|
+
kernel32.SetConsoleMode(kernel32.GetStdHandle(-12), 7) # stderr
|
|
162
|
+
kernel32.SetConsoleMode(kernel32.GetStdHandle(-10), 7) # stdin
|
|
163
|
+
except:
|
|
164
|
+
pass
|
|
165
|
+
|
|
134
166
|
if args.file is None:
|
|
135
|
-
if args.editor:
|
|
167
|
+
if EDITOR_MAP and args.editor:
|
|
136
168
|
argument_error('-e/--editor', "argument 'file' is required")
|
|
137
169
|
elif args.highlight:
|
|
138
170
|
argument_error('-l/--highlight', "argument 'file' is required")
|
|
@@ -156,6 +188,7 @@ if args.P:
|
|
|
156
188
|
if args.q:
|
|
157
189
|
flags |= DONT_SHOW_BANNER_ON_SHELL
|
|
158
190
|
|
|
191
|
+
hook.argv = ['']
|
|
159
192
|
hook.argv[1:] = args.argv
|
|
160
193
|
|
|
161
194
|
if args.file is not None:
|
|
@@ -166,7 +199,7 @@ if args.file is not None:
|
|
|
166
199
|
with open(path, 'r', encoding='utf-8') as file:
|
|
167
200
|
file = PysFileBuffer(file, path)
|
|
168
201
|
except FileNotFoundError:
|
|
169
|
-
if args.editor:
|
|
202
|
+
if EDITOR_MAP and args.editor:
|
|
170
203
|
file = PysFileBuffer('', path)
|
|
171
204
|
else:
|
|
172
205
|
parser.error(f"can't open file {path!r}: No such file or directory")
|
|
@@ -183,13 +216,9 @@ if args.file is not None:
|
|
|
183
216
|
except BaseException as e:
|
|
184
217
|
parser.error(f"file {path!r}: Unexpected error: {e}")
|
|
185
218
|
|
|
186
|
-
if args.editor:
|
|
219
|
+
if EDITOR_MAP and args.editor:
|
|
187
220
|
try:
|
|
188
|
-
|
|
189
|
-
editor = PysGUIEditor
|
|
190
|
-
elif args.editor == 'terminal':
|
|
191
|
-
editor = PysTerminalEditor
|
|
192
|
-
editor(file).run()
|
|
221
|
+
EDITOR_MAP[args.editor](file).run()
|
|
193
222
|
except BaseException as e:
|
|
194
223
|
argument_error('-e/--editor', e)
|
|
195
224
|
|
|
@@ -230,7 +259,7 @@ if args.file is not None:
|
|
|
230
259
|
else:
|
|
231
260
|
code = pys_shell(
|
|
232
261
|
globals=result.context.symbol_table,
|
|
233
|
-
flags=result.context.flags,
|
|
262
|
+
flags=result.context.flags | DONT_SHOW_BANNER_ON_SHELL,
|
|
234
263
|
parser_flags=result.parser_flags
|
|
235
264
|
)
|
|
236
265
|
|
|
@@ -238,12 +267,25 @@ elif args.command is not None:
|
|
|
238
267
|
hook.argv[0] = '-c'
|
|
239
268
|
|
|
240
269
|
file = PysFileBuffer(args.command, '<arg-command>')
|
|
241
|
-
|
|
270
|
+
result = pys_runner(
|
|
242
271
|
file=file,
|
|
243
272
|
mode='exec',
|
|
244
273
|
symbol_table=_normalize_namespace(file, undefined),
|
|
245
274
|
flags=flags
|
|
246
|
-
)
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
code, _ = result.end_process()
|
|
278
|
+
|
|
279
|
+
if args.inspect and not (sys.stdout.closed or sys.stderr.closed):
|
|
280
|
+
if sys.stdin.closed:
|
|
281
|
+
print("Can't run interactive shell: sys.stdin closed", file=sys.stderr)
|
|
282
|
+
code = 1
|
|
283
|
+
else:
|
|
284
|
+
code = pys_shell(
|
|
285
|
+
globals=result.context.symbol_table,
|
|
286
|
+
flags=result.context.flags | DONT_SHOW_BANNER_ON_SHELL,
|
|
287
|
+
parser_flags=result.parser_flags
|
|
288
|
+
)
|
|
247
289
|
|
|
248
290
|
else:
|
|
249
291
|
code = pys_shell(
|
|
@@ -159,7 +159,7 @@ class PysAnalyzer(Pys):
|
|
|
159
159
|
|
|
160
160
|
def visit_IncrementalNode(self, node):
|
|
161
161
|
operator = 'increase' if node.operand.type == TOKENS['DOUBLE-PLUS'] else 'decrease'
|
|
162
|
-
self.
|
|
162
|
+
self.visit_declaration_AssignmentNode(node.target, f"cannot {operator} literal", operator)
|
|
163
163
|
|
|
164
164
|
def visit_StatementsNode(self, node):
|
|
165
165
|
for element in node.body:
|
|
@@ -167,9 +167,11 @@ class PysAnalyzer(Pys):
|
|
|
167
167
|
if self.error:
|
|
168
168
|
return
|
|
169
169
|
|
|
170
|
-
def
|
|
171
|
-
self.
|
|
172
|
-
|
|
170
|
+
def visit_AssignmentNode(self, node):
|
|
171
|
+
self.visit_declaration_AssignmentNode(
|
|
172
|
+
node.target,
|
|
173
|
+
"cannot assign to expression here. Maybe you meant '==' instead of '='?"
|
|
174
|
+
)
|
|
173
175
|
if self.error:
|
|
174
176
|
return
|
|
175
177
|
|
|
@@ -259,7 +261,7 @@ class PysAnalyzer(Pys):
|
|
|
259
261
|
if len(node.header) == 2:
|
|
260
262
|
declaration, iteration = node.header
|
|
261
263
|
|
|
262
|
-
self.
|
|
264
|
+
self.visit_declaration_AssignmentNode(declaration, "cannot assign to expression")
|
|
263
265
|
if self.error:
|
|
264
266
|
return
|
|
265
267
|
|
|
@@ -503,7 +505,7 @@ class PysAnalyzer(Pys):
|
|
|
503
505
|
else:
|
|
504
506
|
self.visit(nslice)
|
|
505
507
|
|
|
506
|
-
def
|
|
508
|
+
def visit_declaration_AssignmentNode(self, node, message, operator_name='assign'):
|
|
507
509
|
type = node.__class__
|
|
508
510
|
|
|
509
511
|
if type is PysAttributeNode:
|
|
@@ -518,7 +520,7 @@ class PysAnalyzer(Pys):
|
|
|
518
520
|
|
|
519
521
|
elif is_list(type):
|
|
520
522
|
for element in node.elements:
|
|
521
|
-
self.
|
|
523
|
+
self.visit_declaration_AssignmentNode(element, message, operator_name)
|
|
522
524
|
if self.error:
|
|
523
525
|
return
|
|
524
526
|
|
|
@@ -9,7 +9,7 @@ is_expression = frozenset([
|
|
|
9
9
|
]).__contains__
|
|
10
10
|
|
|
11
11
|
is_statement = frozenset([
|
|
12
|
-
PysStatementsNode,
|
|
12
|
+
PysStatementsNode, PysAssignmentNode, PysImportNode, PysIfNode, PysSwitchNode, PysTryNode, PysWithNode, PysForNode,
|
|
13
13
|
PysWhileNode, PysDoWhileNode, PysRepeatNode, PysClassNode, PysGlobalNode, PysReturnNode, PysThrowNode,
|
|
14
14
|
PysAssertNode, PysDeleteNode, PysContinueNode, PysBreakNode
|
|
15
15
|
]).__contains__
|
|
@@ -6,7 +6,7 @@ PYSCRIPT_PATH = sep.join(__file__.split(sep)[:-2])
|
|
|
6
6
|
CORE_PATH = join(PYSCRIPT_PATH, 'core')
|
|
7
7
|
LIBRARIES_PATH = join(PYSCRIPT_PATH, 'lib')
|
|
8
8
|
SITE_PACKAGES_PATH = join(PYSCRIPT_PATH, 'site-packages')
|
|
9
|
-
OTHER_PATH = join(
|
|
9
|
+
OTHER_PATH = join(PYSCRIPT_PATH, 'other')
|
|
10
10
|
ICON_PATH = join(OTHER_PATH, 'PyScript.ico')
|
|
11
11
|
|
|
12
12
|
# environment variables
|
|
@@ -127,6 +127,8 @@ try:
|
|
|
127
127
|
self.text.configure(wrap='char' if self.wrapped else 'none')
|
|
128
128
|
return 'break'
|
|
129
129
|
|
|
130
|
+
GUI_SUPPORT = True
|
|
131
|
+
|
|
130
132
|
except ImportError as e:
|
|
131
133
|
_error = e
|
|
132
134
|
|
|
@@ -134,6 +136,7 @@ except ImportError as e:
|
|
|
134
136
|
def __new__(cls, *args, **kwargs):
|
|
135
137
|
raise ImportError(
|
|
136
138
|
"cannot import module tkinter. Did you forgot install separate tkinter module or "
|
|
137
|
-
"not check the option for tkinter during python installation?: "
|
|
138
|
-
|
|
139
|
-
|
|
139
|
+
f"not check the option for tkinter during python installation?: {_error}"
|
|
140
|
+
) from _error
|
|
141
|
+
|
|
142
|
+
GUI_SUPPORT = False
|
|
@@ -140,9 +140,13 @@ try:
|
|
|
140
140
|
title = file
|
|
141
141
|
return ANSI(f'\x1b[7m{title}{" " * max(0, columns - len(title))}\x1b[0m')
|
|
142
142
|
|
|
143
|
+
TERMINAL_SUPPORT = True
|
|
144
|
+
|
|
143
145
|
except ImportError as e:
|
|
144
146
|
_error = e
|
|
145
147
|
|
|
146
148
|
class PysTerminalEditor(PysEditor):
|
|
147
149
|
def __new__(cls, *args, **kwargs):
|
|
148
|
-
raise ImportError(f"cannot import module prompt_toolkit: {_error}") from _error
|
|
150
|
+
raise ImportError(f"cannot import module prompt_toolkit: {_error}") from _error
|
|
151
|
+
|
|
152
|
+
TERMINAL_SUPPORT = False
|
|
@@ -4,6 +4,8 @@ from .objects import PysFunction
|
|
|
4
4
|
from os import environ
|
|
5
5
|
from types import MethodType
|
|
6
6
|
|
|
7
|
+
wrapper_function = (MethodType, classmethod, staticmethod)
|
|
8
|
+
|
|
7
9
|
if environ.get(ENV_PYSCRIPT_NO_GIL) is None:
|
|
8
10
|
from threading import RLock
|
|
9
11
|
|
|
@@ -11,21 +13,24 @@ if environ.get(ENV_PYSCRIPT_NO_GIL) is None:
|
|
|
11
13
|
|
|
12
14
|
def handle_call(object, context, position):
|
|
13
15
|
with lock:
|
|
16
|
+
ins = isinstance
|
|
14
17
|
|
|
15
|
-
if
|
|
18
|
+
if ins(object, PysFunction):
|
|
16
19
|
code = object.__code__
|
|
17
20
|
code.context = context
|
|
18
21
|
code.position = position
|
|
19
22
|
|
|
20
|
-
elif
|
|
23
|
+
elif ins(object, wrapper_function):
|
|
21
24
|
handle_call(object.__func__, context, position)
|
|
22
25
|
|
|
23
|
-
elif
|
|
24
|
-
|
|
26
|
+
elif ins(object, type):
|
|
27
|
+
gt = getattr
|
|
28
|
+
|
|
29
|
+
method = gt(object, '__new__', None)
|
|
25
30
|
if method is not None:
|
|
26
31
|
handle_call(method, context, position)
|
|
27
32
|
|
|
28
|
-
method =
|
|
33
|
+
method = gt(object, '__init__', None)
|
|
29
34
|
if method is not None:
|
|
30
35
|
handle_call(method, context, position)
|
|
31
36
|
|
|
@@ -33,20 +38,24 @@ if environ.get(ENV_PYSCRIPT_NO_GIL) is None:
|
|
|
33
38
|
else:
|
|
34
39
|
|
|
35
40
|
def handle_call(object, context, position):
|
|
36
|
-
|
|
41
|
+
ins = isinstance
|
|
42
|
+
|
|
43
|
+
if ins(object, PysFunction):
|
|
37
44
|
code = object.__code__
|
|
38
45
|
code.context = context
|
|
39
46
|
code.position = position
|
|
40
47
|
|
|
41
|
-
elif
|
|
48
|
+
elif ins(object, wrapper_function):
|
|
42
49
|
handle_call(object.__func__, context, position)
|
|
43
50
|
|
|
44
|
-
elif
|
|
45
|
-
|
|
51
|
+
elif ins(object, type):
|
|
52
|
+
gt = getattr
|
|
53
|
+
|
|
54
|
+
method = gt(object, '__new__', None)
|
|
46
55
|
if method is not None:
|
|
47
56
|
handle_call(method, context, position)
|
|
48
57
|
|
|
49
|
-
method =
|
|
58
|
+
method = gt(object, '__init__', None)
|
|
50
59
|
if method is not None:
|
|
51
60
|
handle_call(method, context, position)
|
|
52
61
|
|
|
@@ -10,7 +10,7 @@ from .objects import PysFunction
|
|
|
10
10
|
from .pysbuiltins import ce, nce, increment, decrement
|
|
11
11
|
from .results import PysRunTimeResult
|
|
12
12
|
from .symtab import PysClassSymbolTable, find_closest
|
|
13
|
-
from .utils.generic import getattribute, setimuattr, is_object_of, get_error_args
|
|
13
|
+
from .utils.generic import getattribute, setimuattr, dkeys, is_object_of, get_error_args
|
|
14
14
|
from .utils.similarity import get_closest
|
|
15
15
|
|
|
16
16
|
from collections.abc import Iterable
|
|
@@ -386,14 +386,13 @@ def visit_IncrementalNode(node, context):
|
|
|
386
386
|
return result
|
|
387
387
|
|
|
388
388
|
with result(context, nposition):
|
|
389
|
-
|
|
389
|
+
handle_call(function := get_incremental_function(node.operand.type), context, nposition)
|
|
390
|
+
increast_value = function(value)
|
|
390
391
|
|
|
391
|
-
handle_call(func, context, nposition)
|
|
392
|
-
increast_value = func(value)
|
|
393
392
|
if node.operand_position == 'left':
|
|
394
393
|
value = increast_value
|
|
395
394
|
|
|
396
|
-
register(
|
|
395
|
+
register(visit_declaration_AssignmentNode(ntarget, context, increast_value))
|
|
397
396
|
if should_return():
|
|
398
397
|
return result
|
|
399
398
|
|
|
@@ -424,7 +423,7 @@ def visit_StatementsNode(node, context):
|
|
|
424
423
|
|
|
425
424
|
return result.success(None)
|
|
426
425
|
|
|
427
|
-
def
|
|
426
|
+
def visit_AssignmentNode(node, context):
|
|
428
427
|
result = PysRunTimeResult()
|
|
429
428
|
|
|
430
429
|
register = result.register
|
|
@@ -435,7 +434,7 @@ def visit_AssignNode(node, context):
|
|
|
435
434
|
if should_return():
|
|
436
435
|
return result
|
|
437
436
|
|
|
438
|
-
register(
|
|
437
|
+
register(visit_declaration_AssignmentNode(node.target, context, value, node.operand.type))
|
|
439
438
|
if should_return():
|
|
440
439
|
return result
|
|
441
440
|
|
|
@@ -849,8 +848,7 @@ def visit_ForNode(node, context):
|
|
|
849
848
|
|
|
850
849
|
with result(context, niteration_position):
|
|
851
850
|
handle_call(getattr(iteration, '__iter__', None), context, niteration_position)
|
|
852
|
-
|
|
853
|
-
next = iteration.__next__
|
|
851
|
+
next = iter(iteration).__next__
|
|
854
852
|
|
|
855
853
|
if should_return():
|
|
856
854
|
return result
|
|
@@ -858,7 +856,7 @@ def visit_ForNode(node, context):
|
|
|
858
856
|
def condition():
|
|
859
857
|
with result(context, niteration_position):
|
|
860
858
|
handle_call(next, context, niteration_position)
|
|
861
|
-
register(
|
|
859
|
+
register(visit_declaration_AssignmentNode(ndeclaration, context, next()))
|
|
862
860
|
|
|
863
861
|
if should_return():
|
|
864
862
|
if result.error and is_object_of(result.error.exception, StopIteration):
|
|
@@ -1144,7 +1142,7 @@ def visit_FunctionNode(node, context):
|
|
|
1144
1142
|
else:
|
|
1145
1143
|
append(nparameter.value)
|
|
1146
1144
|
|
|
1147
|
-
|
|
1145
|
+
function = PysFunction(
|
|
1148
1146
|
name=name,
|
|
1149
1147
|
qualname=context.qualname,
|
|
1150
1148
|
parameters=parameters,
|
|
@@ -1162,18 +1160,18 @@ def visit_FunctionNode(node, context):
|
|
|
1162
1160
|
|
|
1163
1161
|
with result(context, dposition):
|
|
1164
1162
|
handle_call(decorator, context, dposition)
|
|
1165
|
-
|
|
1163
|
+
function = decorator(function)
|
|
1166
1164
|
|
|
1167
1165
|
if should_return():
|
|
1168
1166
|
return result
|
|
1169
1167
|
|
|
1170
1168
|
if name:
|
|
1171
1169
|
with result(context, nposition):
|
|
1172
|
-
context.symbol_table.set(name,
|
|
1170
|
+
context.symbol_table.set(name, function)
|
|
1173
1171
|
if should_return():
|
|
1174
1172
|
return result
|
|
1175
1173
|
|
|
1176
|
-
return result.success(
|
|
1174
|
+
return result.success(function)
|
|
1177
1175
|
|
|
1178
1176
|
def visit_GlobalNode(node, context):
|
|
1179
1177
|
context.symbol_table.globals.update(name.value for name in node.identifiers)
|
|
@@ -1306,7 +1304,7 @@ def visit_DeleteNode(node, context):
|
|
|
1306
1304
|
with result(context, target_position):
|
|
1307
1305
|
|
|
1308
1306
|
if not symbol_table.remove(name):
|
|
1309
|
-
closest_symbol = get_closest(symbol_table.symbols
|
|
1307
|
+
closest_symbol = get_closest(dkeys(symbol_table.symbols), name)
|
|
1310
1308
|
|
|
1311
1309
|
return result.failure(
|
|
1312
1310
|
PysTraceback(
|
|
@@ -1417,7 +1415,7 @@ def visit_slice_SubscriptNode(node, context):
|
|
|
1417
1415
|
|
|
1418
1416
|
return result.success(value)
|
|
1419
1417
|
|
|
1420
|
-
def
|
|
1418
|
+
def visit_declaration_AssignmentNode(node, context, value, operand=TOKENS['EQUAL']):
|
|
1421
1419
|
result = PysRunTimeResult()
|
|
1422
1420
|
|
|
1423
1421
|
register = result.register
|
|
@@ -1431,7 +1429,7 @@ def visit_declaration_AssignNode(node, context, value, operand=TOKENS['EQUAL']):
|
|
|
1431
1429
|
with result(context, node.position):
|
|
1432
1430
|
|
|
1433
1431
|
if not symbol_table.set(name, value, operand=operand):
|
|
1434
|
-
closest_symbol = get_closest(symbol_table.symbols
|
|
1432
|
+
closest_symbol = get_closest(dkeys(symbol_table.symbols), name)
|
|
1435
1433
|
|
|
1436
1434
|
result.failure(
|
|
1437
1435
|
PysTraceback(
|
|
@@ -1510,7 +1508,7 @@ def visit_declaration_AssignNode(node, context, value, operand=TOKENS['EQUAL']):
|
|
|
1510
1508
|
with result(context, position):
|
|
1511
1509
|
|
|
1512
1510
|
for element, element_value in zip(elements, value):
|
|
1513
|
-
register(
|
|
1511
|
+
register(visit_declaration_AssignmentNode(element, context, element_value, operand))
|
|
1514
1512
|
if should_return():
|
|
1515
1513
|
return result
|
|
1516
1514
|
|
{pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/lexer.py
RENAMED
|
@@ -58,8 +58,8 @@ class PysLexer(Pys):
|
|
|
58
58
|
while self.read_more():
|
|
59
59
|
|
|
60
60
|
if self.current_character == '\n':
|
|
61
|
-
self.add_token(TOKENS['NEWLINE'])
|
|
62
61
|
self.advance()
|
|
62
|
+
self.add_token(TOKENS['NEWLINE'])
|
|
63
63
|
|
|
64
64
|
elif self.current_character == '\\':
|
|
65
65
|
self.make_back_slash()
|
|
@@ -128,49 +128,50 @@ class PysLexer(Pys):
|
|
|
128
128
|
self.make_comment()
|
|
129
129
|
|
|
130
130
|
elif self.current_character == '(':
|
|
131
|
-
self.add_token(TOKENS['LEFT-PARENTHESIS'])
|
|
132
131
|
self.advance()
|
|
132
|
+
self.add_token(TOKENS['LEFT-PARENTHESIS'])
|
|
133
133
|
|
|
134
134
|
elif self.current_character == ')':
|
|
135
|
-
self.add_token(TOKENS['RIGHT-PARENTHESIS'])
|
|
136
135
|
self.advance()
|
|
136
|
+
self.add_token(TOKENS['RIGHT-PARENTHESIS'])
|
|
137
137
|
|
|
138
138
|
elif self.current_character == '[':
|
|
139
|
-
self.add_token(TOKENS['LEFT-SQUARE'])
|
|
140
139
|
self.advance()
|
|
140
|
+
self.add_token(TOKENS['LEFT-SQUARE'])
|
|
141
141
|
|
|
142
142
|
elif self.current_character == ']':
|
|
143
|
-
self.add_token(TOKENS['RIGHT-SQUARE'])
|
|
144
143
|
self.advance()
|
|
144
|
+
self.add_token(TOKENS['RIGHT-SQUARE'])
|
|
145
145
|
|
|
146
146
|
elif self.current_character == '{':
|
|
147
|
-
self.add_token(TOKENS['LEFT-CURLY'])
|
|
148
147
|
self.advance()
|
|
148
|
+
self.add_token(TOKENS['LEFT-CURLY'])
|
|
149
149
|
|
|
150
150
|
elif self.current_character == '}':
|
|
151
|
-
self.add_token(TOKENS['RIGHT-CURLY'])
|
|
152
151
|
self.advance()
|
|
152
|
+
self.add_token(TOKENS['RIGHT-CURLY'])
|
|
153
153
|
|
|
154
154
|
elif self.current_character == ',':
|
|
155
|
-
self.add_token(TOKENS['COMMA'])
|
|
156
155
|
self.advance()
|
|
156
|
+
self.add_token(TOKENS['COMMA'])
|
|
157
157
|
|
|
158
158
|
elif self.current_character == ';':
|
|
159
|
-
self.add_token(TOKENS['SEMICOLON'])
|
|
160
159
|
self.advance()
|
|
160
|
+
self.add_token(TOKENS['SEMICOLON'])
|
|
161
161
|
|
|
162
162
|
else:
|
|
163
|
-
|
|
164
|
-
unicode = ord(
|
|
163
|
+
character = self.current_character
|
|
164
|
+
unicode = ord(character)
|
|
165
165
|
|
|
166
166
|
self.advance()
|
|
167
167
|
self.throw(
|
|
168
168
|
self.index - 1, self.index,
|
|
169
|
-
f"invalid character '{
|
|
170
|
-
if
|
|
169
|
+
f"invalid character '{character}' (U+{unicode:04X})"
|
|
170
|
+
if character.isprintable() else
|
|
171
171
|
f"invalid non-printable character U+{unicode:04X}"
|
|
172
172
|
)
|
|
173
173
|
|
|
174
|
+
self.advance()
|
|
174
175
|
self.add_token(TOKENS['NULL'])
|
|
175
176
|
|
|
176
177
|
return (None if self.tokens is None else tuple(self.tokens)), self.error
|
|
@@ -201,8 +202,8 @@ class PysLexer(Pys):
|
|
|
201
202
|
if self.error is None and self.tokens is not None:
|
|
202
203
|
|
|
203
204
|
if start is None:
|
|
204
|
-
start = self.index
|
|
205
|
-
end = self.index
|
|
205
|
+
start = self.index - 1
|
|
206
|
+
end = self.index
|
|
206
207
|
else:
|
|
207
208
|
end = self.index
|
|
208
209
|
|
{pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/nodes.py
RENAMED
|
@@ -294,7 +294,7 @@ class PysStatementsNode(PysNode):
|
|
|
294
294
|
def __repr__(self) -> str:
|
|
295
295
|
return f'Statements(body={self.body!r})'
|
|
296
296
|
|
|
297
|
-
class
|
|
297
|
+
class PysAssignmentNode(PysNode):
|
|
298
298
|
|
|
299
299
|
__slots__ = ('target', 'operand', 'value')
|
|
300
300
|
|
|
@@ -306,7 +306,7 @@ class PysAssignNode(PysNode):
|
|
|
306
306
|
setimuattr(self, 'value', value)
|
|
307
307
|
|
|
308
308
|
def __repr__(self) -> str:
|
|
309
|
-
return f'
|
|
309
|
+
return f'Assignment(target={self.target!r}, operand={self.operand!r}, value={self.value!r})'
|
|
310
310
|
|
|
311
311
|
class PysImportNode(PysNode):
|
|
312
312
|
|