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.
Files changed (85) hide show
  1. {pyscript_programming_language-1.11.2/pyscript_programming_language.egg-info → pyscript_programming_language-1.11.3}/PKG-INFO +1 -1
  2. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/__main__.py +70 -28
  3. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/analyzer.py +9 -7
  4. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/checks.py +1 -1
  5. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/constants.py +1 -1
  6. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/editor/gui.py +6 -3
  7. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/editor/terminal.py +5 -1
  8. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/handlers.py +19 -10
  9. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/interpreter.py +16 -18
  10. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/lexer.py +16 -15
  11. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/nodes.py +2 -2
  12. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/parser.py +15 -15
  13. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/position.py +2 -3
  14. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/pysbuiltins.py +6 -6
  15. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/runner.py +5 -5
  16. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/shell.py +11 -11
  17. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/generic.py +7 -10
  18. pyscript_programming_language-1.11.3/pyscript/core/utils/jsdict.py +32 -0
  19. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/version.py +2 -2
  20. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/ast/ast_dump.py +1 -1
  21. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/ast/ast_unparse.py +1 -1
  22. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/ast/ast_walk.py +1 -1
  23. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/brainfuck.pys +26 -32
  24. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/site.pys +3 -3
  25. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/tokenize/tok_untokenize.py +2 -2
  26. pyscript_programming_language-1.11.3/pyscript/other/.nomedia +0 -0
  27. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3/pyscript_programming_language.egg-info}/PKG-INFO +1 -1
  28. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript_programming_language.egg-info/SOURCES.txt +5 -5
  29. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/setup.py +2 -1
  30. pyscript_programming_language-1.11.2/pyscript/core/other/.nomedia +0 -1
  31. pyscript_programming_language-1.11.2/pyscript/core/utils/jsdict.py +0 -34
  32. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/MANIFEST.in +0 -0
  33. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/README.md +0 -0
  34. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/__init__.py +0 -0
  35. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/__init__.pyi +0 -0
  36. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/__init__.py +0 -0
  37. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/bases.py +0 -0
  38. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/buffer.py +0 -0
  39. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/cache.py +0 -0
  40. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/context.py +0 -0
  41. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/editor/__init__.py +0 -0
  42. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/editor/bases.py +0 -0
  43. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/exceptions.py +0 -0
  44. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/highlight.py +0 -0
  45. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/mapping.py +0 -0
  46. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/objects.py +0 -0
  47. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/results.py +0 -0
  48. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/symtab.py +0 -0
  49. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/token.py +0 -0
  50. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/__init__.py +0 -0
  51. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/ansi.py +0 -0
  52. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/debug.py +0 -0
  53. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/decorators.py +0 -0
  54. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/module.py +0 -0
  55. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/path.py +0 -0
  56. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/similarity.py +0 -0
  57. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/core/utils/string.py +0 -0
  58. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/__hello__.pys +0 -0
  59. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/ansi.pys +0 -0
  60. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/ast/__init__.pys +0 -0
  61. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/ast/ast_literal_eval.py +0 -0
  62. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/dis.pys +0 -0
  63. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/explorer.pys +0 -0
  64. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/fpstimer/__init__.pys +0 -0
  65. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/fpstimer/py_fpstimer.py +0 -0
  66. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/getch.pys +0 -0
  67. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/inspect.pys +0 -0
  68. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/jsdict.pys +0 -0
  69. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/keyword.pys +0 -0
  70. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/opcode.pys +0 -0
  71. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/parser.pys +0 -0
  72. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/symtable.pys +0 -0
  73. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/sys.pys +0 -0
  74. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/token.pys +0 -0
  75. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/lib/tokenize/__init__.pys +0 -0
  76. {pyscript_programming_language-1.11.2/pyscript/core → pyscript_programming_language-1.11.3/pyscript}/other/PyScript.ico +0 -0
  77. {pyscript_programming_language-1.11.2/pyscript/core → pyscript_programming_language-1.11.3/pyscript}/other/copyright +0 -0
  78. {pyscript_programming_language-1.11.2/pyscript/core → pyscript_programming_language-1.11.3/pyscript}/other/credits +0 -0
  79. {pyscript_programming_language-1.11.2/pyscript/core → pyscript_programming_language-1.11.3/pyscript}/other/license +0 -0
  80. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/site-packages/this.pys +0 -0
  81. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript/this.py +0 -0
  82. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript_programming_language.egg-info/dependency_links.txt +0 -0
  83. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript_programming_language.egg-info/requires.txt +0 -0
  84. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/pyscript_programming_language.egg-info/top_level.txt +0 -0
  85. {pyscript_programming_language-1.11.2 → pyscript_programming_language-1.11.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyscript-programming-language
3
- Version: 1.11.2
3
+ Version: 1.11.3
4
4
  Summary: PyScript Programming Language
5
5
  Home-page: https://azzammuhyala.github.io/pyscript
6
6
  Author: azzammuhyala
@@ -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
- parser.add_argument(
70
- '-e', '--editor',
71
- choices=('gui', 'terminal'),
72
- default=None,
73
- help="Open the editor panel from a 'file'",
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 'file'",
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
- '-P',
105
+ '-t', '--terminal',
104
106
  action='store_true',
105
- help="Don't prepend a potentially unsafe path to sys.path (python sys.path)"
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
- if args.editor == 'gui':
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
- code = pys_runner(
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
- ).end_process()[0]
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.visit_declaration_AssignNode(node.target, f"cannot {operator} literal", operator)
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 visit_AssignNode(self, node):
171
- self.visit_declaration_AssignNode(node.target,
172
- "cannot assign to expression here. Maybe you meant '==' instead of '='?")
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.visit_declaration_AssignNode(declaration, "cannot assign to expression")
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 visit_declaration_AssignNode(self, node, message, operator_name='assign'):
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.visit_declaration_AssignNode(element, message, operator_name)
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, PysAssignNode, PysImportNode, PysIfNode, PysSwitchNode, PysTryNode, PysWithNode, PysForNode,
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(CORE_PATH, 'other')
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
- str(_error)
139
- ) from _error
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 isinstance(object, PysFunction):
18
+ if ins(object, PysFunction):
16
19
  code = object.__code__
17
20
  code.context = context
18
21
  code.position = position
19
22
 
20
- elif isinstance(object, MethodType):
23
+ elif ins(object, wrapper_function):
21
24
  handle_call(object.__func__, context, position)
22
25
 
23
- elif isinstance(object, type):
24
- method = getattr(object, '__new__', None)
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 = getattr(object, '__init__', None)
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
- if isinstance(object, PysFunction):
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 isinstance(object, MethodType):
48
+ elif ins(object, wrapper_function):
42
49
  handle_call(object.__func__, context, position)
43
50
 
44
- elif isinstance(object, type):
45
- method = getattr(object, '__new__', None)
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 = getattr(object, '__init__', None)
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
- func = get_incremental_function(node.operand.type)
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(visit_declaration_AssignNode(ntarget, context, increast_value))
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 visit_AssignNode(node, context):
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(visit_declaration_AssignNode(node.target, context, value, node.operand.type))
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
- iteration = iter(iteration)
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(visit_declaration_AssignNode(ndeclaration, context, next()))
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
- func = PysFunction(
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
- func = decorator(func)
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, func)
1170
+ context.symbol_table.set(name, function)
1173
1171
  if should_return():
1174
1172
  return result
1175
1173
 
1176
- return result.success(func)
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.keys(), name)
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 visit_declaration_AssignNode(node, context, value, operand=TOKENS['EQUAL']):
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.keys(), name)
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(visit_declaration_AssignNode(element, context, element_value, operand))
1511
+ register(visit_declaration_AssignmentNode(element, context, element_value, operand))
1514
1512
  if should_return():
1515
1513
  return result
1516
1514
 
@@ -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
- char = self.current_character
164
- unicode = ord(char)
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 '{char}' (U+{unicode:04X})"
170
- if char.isprintable() else
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 + 1
205
+ start = self.index - 1
206
+ end = self.index
206
207
  else:
207
208
  end = self.index
208
209
 
@@ -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 PysAssignNode(PysNode):
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'Assign(target={self.target!r}, operand={self.operand!r}, value={self.value!r})'
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