pyscript-programming-language 1.12.10__tar.gz → 1.12.12__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 (90) hide show
  1. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/PKG-INFO +5 -2
  2. pyscript_programming_language-1.12.12/changelog.md +10 -0
  3. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyproject.toml +5 -2
  4. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/__main__.py +114 -91
  5. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/cache.py +15 -23
  6. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/checks.py +2 -1
  7. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/constants.py +2 -0
  8. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/editor/gui.py +46 -9
  9. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/exceptions.py +9 -3
  10. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/highlight.py +26 -15
  11. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/interpreter.py +145 -87
  12. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/lexer.py +2 -2
  13. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/mapping.py +0 -2
  14. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/parser.py +7 -4
  15. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/pysbuiltins.py +59 -62
  16. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/pystypes.py +14 -10
  17. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/results.py +7 -12
  18. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/runner.py +14 -8
  19. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/shell.py +38 -45
  20. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/symtab.py +2 -2
  21. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/token.py +2 -2
  22. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/utils/decorators.py +1 -2
  23. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/utils/generic.py +6 -3
  24. pyscript_programming_language-1.12.12/pyscript/core/utils/module.py +42 -0
  25. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/utils/path.py +2 -5
  26. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/version.py +2 -2
  27. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/ast/ast_dump.py +4 -3
  28. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/ast/ast_literal_eval.py +3 -3
  29. pyscript_programming_language-1.12.12/pyscript/lib/site.pys +129 -0
  30. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/tokenize/__init__.pys +2 -1
  31. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/tokenize/tok_untokenize.py +2 -2
  32. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript_programming_language.egg-info/PKG-INFO +5 -2
  33. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/setup.py +5 -2
  34. pyscript_programming_language-1.12.10/changelog.md +0 -20
  35. pyscript_programming_language-1.12.10/pyscript/core/utils/module.py +0 -27
  36. pyscript_programming_language-1.12.10/pyscript/lib/site.pys +0 -55
  37. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/MANIFEST.in +0 -0
  38. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/README.md +0 -0
  39. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/__init__.py +0 -0
  40. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/__init__.pyi +0 -0
  41. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/__init__.py +0 -0
  42. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/analyzer.py +0 -0
  43. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/bases.py +0 -0
  44. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/buffer.py +0 -0
  45. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/context.py +0 -0
  46. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/editor/__init__.py +0 -0
  47. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/editor/bases.py +0 -0
  48. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/editor/terminal.py +0 -0
  49. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/handlers.py +0 -0
  50. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/nodes.py +0 -0
  51. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/position.py +0 -0
  52. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/utils/__init__.py +0 -0
  53. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/utils/ansi.py +0 -0
  54. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/utils/debug.py +0 -0
  55. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/utils/similarity.py +0 -0
  56. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/utils/string.py +0 -0
  57. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/__hello__.pys +0 -0
  58. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/ansi.pys +0 -0
  59. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/ast/__init__.pys +0 -0
  60. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/ast/ast_unparse.py +0 -0
  61. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/ast/ast_walk.py +0 -0
  62. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/brainfuck.pys +0 -0
  63. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/code.pys +0 -0
  64. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/dis.pys +0 -0
  65. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/explorer.pys +0 -0
  66. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/fpstimer/__init__.pys +0 -0
  67. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/fpstimer/py_fpstimer.py +0 -0
  68. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/getch/__init__.pys +0 -0
  69. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/getch/py_getch.py +0 -0
  70. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/history.pys +0 -0
  71. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/inspect.pys +0 -0
  72. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/jsdict.pys +0 -0
  73. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/keyword.pys +0 -0
  74. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/opcode.pys +0 -0
  75. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/parser.pys +0 -0
  76. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/pdisplay.pys +0 -0
  77. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/symtable.pys +0 -0
  78. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/token.pys +0 -0
  79. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/other/.nomedia +0 -0
  80. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/other/PyScript.ico +0 -0
  81. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/other/copyright +0 -0
  82. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/other/credits +0 -0
  83. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/other/license +0 -0
  84. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/site-packages/this.pys +0 -0
  85. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/this.py +0 -0
  86. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript_programming_language.egg-info/SOURCES.txt +0 -0
  87. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript_programming_language.egg-info/dependency_links.txt +0 -0
  88. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript_programming_language.egg-info/requires.txt +0 -0
  89. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript_programming_language.egg-info/top_level.txt +0 -0
  90. {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/setup.cfg +0 -0
@@ -1,15 +1,18 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyscript-programming-language
3
- Version: 1.12.10
3
+ Version: 1.12.12
4
4
  Summary: PyScript Programming Language
5
5
  Home-page: https://azzammuhyala.github.io/pyscript
6
6
  Author: azzammuhyala
7
7
  Author-email: azzammuhyala <azzammuhyala@gmail.com>
8
8
  License-Expression: MIT
9
9
  Project-URL: Homepage, https://azzammuhyala.github.io/pyscript
10
+ Project-URL: Documentation, https://azzammuhyala.github.io/pyscript
10
11
  Project-URL: Source, https://github.com/azzammuhyala/pyscript
11
- Project-URL: Bug Tracker, https://github.com/azzammuhyala/pyscript/issues
12
+ Project-URL: Releases, https://github.com/azzammuhyala/pyscript/releases
12
13
  Project-URL: Change Log, https://github.com/azzammuhyala/pyscript/blob/main/changelog.md
14
+ Project-URL: Bug Tracker, https://github.com/azzammuhyala/pyscript/issues
15
+ Project-URL: PyPi Stats, https://pepy.tech/projects/pyscript-programming-language
13
16
  Keywords: pyscript,pyslang,pys,programming,language,programming language
14
17
  Classifier: Programming Language :: Python
15
18
  Classifier: Programming Language :: Python :: 3
@@ -0,0 +1,10 @@
1
+ # Change Log
2
+
3
+ ## [1.12.12] - 29/04/2026
4
+
5
+ ### Added
6
+ - Saves screen geometry in gui editor.
7
+
8
+ ### Fixed
9
+ - Fixed some bugs.
10
+ - _etc._
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pyscript-programming-language"
7
- version = "1.12.10"
7
+ version = "1.12.12"
8
8
  description = "PyScript Programming Language"
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  requires-python = ">=3.10"
@@ -34,9 +34,12 @@ classifiers = [
34
34
 
35
35
  [project.urls]
36
36
  Homepage = "https://azzammuhyala.github.io/pyscript"
37
+ Documentation = "https://azzammuhyala.github.io/pyscript"
37
38
  Source = "https://github.com/azzammuhyala/pyscript"
38
- "Bug Tracker" = "https://github.com/azzammuhyala/pyscript/issues"
39
+ Releases = "https://github.com/azzammuhyala/pyscript/releases"
39
40
  "Change Log" = "https://github.com/azzammuhyala/pyscript/blob/main/changelog.md"
41
+ "Bug Tracker" = "https://github.com/azzammuhyala/pyscript/issues"
42
+ "PyPi Stats" = "https://pepy.tech/projects/pyscript-programming-language"
40
43
 
41
44
  [project.optional-dependencies]
42
45
  other = [
@@ -9,11 +9,11 @@ from .core.editor.terminal import PysTerminalEditor, TERMINAL_SUPPORT
9
9
  from .core.highlight import (
10
10
  PYGMENTS, HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight, PygmentsPyScriptStyle, PygmentsPyScriptLexer
11
11
  )
12
- from .core.runner import _normalize_namespace, pys_runner, pys_shell
12
+ from .core.runner import _namespace_to_symbol_table, pys_runner, pys_shell
13
13
  from .core.utils.debug import USE_NOTEBOOK
14
14
  from .core.utils.generic import is_environ
15
- from .core.utils.module import remove_python_path
16
- from .core.utils.path import getcwd, normpath, get_name_from_path
15
+ from .core.utils.module import find_module_path, remove_python_path
16
+ from .core.utils.path import getcwd, base, normpath
17
17
  from .core.version import __version__
18
18
 
19
19
  if PYGMENTS:
@@ -43,7 +43,6 @@ FORMATER_HIGHLIGHT_MAP = {
43
43
  }
44
44
 
45
45
  EDITOR_MAP = {}
46
-
47
46
  for supported, name, class_editor in [
48
47
  (GUI_SUPPORT, 'gui', PysGUIEditor),
49
48
  (TERMINAL_SUPPORT, 'terminal', PysTerminalEditor)
@@ -51,8 +50,10 @@ for supported, name, class_editor in [
51
50
  if supported:
52
51
  EDITOR_MAP[name] = class_editor
53
52
 
53
+ arguments_requiring_value = {'-l', '--highlight', '-r', '--py-recursion'}
54
+
54
55
  parser = ArgumentParser(
55
- prog=f'{get_name_from_path(sys.executable)} -m pyscript',
56
+ prog=f'{base(sys.executable)} -m pyscript',
56
57
  description=f'PyScript Launcher for Python Version {".".join(map(str, sys.version_info))}'
57
58
  )
58
59
 
@@ -66,6 +67,7 @@ parser.add_argument(
66
67
  '-c', '--command',
67
68
  type=str,
68
69
  default=None,
70
+ metavar='STRING',
69
71
  help="execute program from a string argument",
70
72
  )
71
73
 
@@ -82,6 +84,7 @@ if EDITOR_MAP:
82
84
  default=None,
83
85
  help="open the editor panel from a 'file'",
84
86
  )
87
+ arguments_requiring_value.update({'-e', '--editor'})
85
88
 
86
89
  parser.add_argument(
87
90
  '-i', '--inspect',
@@ -102,6 +105,14 @@ parser.add_argument(
102
105
  help="generate highlight code from a 'file'"
103
106
  )
104
107
 
108
+ parser.add_argument(
109
+ '-m', '--module',
110
+ type=str,
111
+ default=None,
112
+ metavar='NAME',
113
+ help="run library module as a script"
114
+ )
115
+
105
116
  parser.add_argument(
106
117
  '-n', '--no-color',
107
118
  action='store_true',
@@ -118,6 +129,7 @@ parser.add_argument(
118
129
  '-r', '--py-recursion',
119
130
  type=int,
120
131
  default=None,
132
+ metavar='UINTEGER',
121
133
  help="set a Python recursion limit"
122
134
  )
123
135
 
@@ -164,16 +176,28 @@ def argument_error(argument, message):
164
176
  parser.exit(2, f"{parser.prog}: error: argument {argument}: {message}\n")
165
177
 
166
178
  argv = sys.argv[1:]
179
+ argc = len(argv)
180
+ index = 0
181
+ arg_index = -1
182
+
183
+ while index < argc:
184
+ arg = argv[index]
185
+ if not arg.startswith('-') or arg == '--':
186
+ break
187
+
188
+ if arg in ('-c', '--command'):
189
+ arg_index = index + 2
190
+ break
191
+ elif arg in ('-m', '--module'):
192
+ arg_index = index + 2
193
+ break
167
194
 
168
- file_idx = sum(1 for arg in argv if arg.startswith('-'))
169
- end_idx = argv.index('--', 0, file_idx) if '--' in argv[:file_idx] else -1
170
- end_com = file_idx if end_idx == -1 else end_idx
171
- arg_com = argv[:end_com]
172
- com_idx = argv.index('-c', 0, end_com) if '-c' in arg_com else \
173
- (argv.index('--command', 0, end_com) if '--command' in arg_com else -1)
195
+ index += 1
196
+ if arg in arguments_requiring_value:
197
+ index += 1
174
198
 
175
- args = parser.parse_args(argv if com_idx == -1 else argv[:com_idx + 2])
176
- arg = args.arg if com_idx == -1 else argv[com_idx + 2:]
199
+ args = parser.parse_args(argv if arg_index == -1 else argv[:arg_index])
200
+ arg = args.arg if arg_index == -1 else argv[arg_index:]
177
201
 
178
202
  if args.terminal:
179
203
 
@@ -227,51 +251,82 @@ if args.P:
227
251
 
228
252
  pys_sys.argv = argv = ['', *arg]
229
253
 
230
- # clean up
231
- try:
232
- if PYGMENTS:
233
- del (
234
- BBCodeFormatter, HtmlFormatter, LatexFormatter, TerminalFormatter, TerminalTrueColorFormatter,
235
- Terminal256Formatter
236
- )
237
-
238
- del (
239
- ENV_PYSCRIPT_NO_COLOR_PROMPT, ENV_PYSCRIPT_CLASSIC_LINE_SHELL, DEFAULT, DEBUG, CLASSIC_LINE_SHELL,
240
- NO_COLOR_PROMPT, NOTEBOOK, GUI_SUPPORT, TERMINAL_SUPPORT, PYGMENTS, HLFMT_ANSI, HLFMT_HTML, HLFMT_BBCODE,
241
- USE_NOTEBOOK, OPTIONAL, REMAINDER, file_idx, end_idx, end_com, arg_com, com_idx, arg, pys_sys, __version__,
242
- is_environ, remove_python_path, getcwd, get_name_from_path, PysGUIEditor, PysTerminalEditor, ArgumentParser
243
- )
244
-
245
- del (
246
- supported, name, class_editor, condition, flag, fd, kernel32, i
247
- )
248
- except:
249
- pass
250
-
251
- if args.file is not None:
252
- argv[0] = args.file
253
- path = normpath(args.file)
254
+ def clean_up() -> None:
255
+ g = globals()
256
+
257
+ for name in {
258
+ 'ArgumentParser', 'BBCodeFormatter', 'CLASSIC_LINE_SHELL', 'DEBUG', 'DEFAULT', 'DONT_SHOW_BANNER_ON_SHELL',
259
+ 'EDITOR_MAP', 'ENV_PYSCRIPT_CLASSIC_LINE_SHELL', 'ENV_PYSCRIPT_NO_COLOR_PROMPT', 'FORMATER_HIGHLIGHT_MAP',
260
+ 'FORMATER_PYGMENTS_MAP', 'GUI_SUPPORT', 'HLFMT_ANSI', 'HLFMT_BBCODE', 'HLFMT_HTML', 'HtmlFormatter',
261
+ 'LatexFormatter', 'NOTEBOOK', 'NO_COLOR', 'NO_COLOR_PROMPT', 'OPTIONAL', 'PYGMENTS', 'PygmentsPyScriptLexer',
262
+ 'PygmentsPyScriptStyle', 'PysFileBuffer', 'PysGUIEditor', 'PysTerminalEditor', 'REMAINDER', 'TERMINAL_SUPPORT',
263
+ 'Terminal256Formatter', 'TerminalFormatter', 'TerminalTrueColorFormatter', 'USE_NOTEBOOK', '__version__',
264
+ '_namespace_to_symbol_table', 'arg', 'arg_index', 'argc', 'args', 'argument_error', 'arguments_requiring_value',
265
+ 'argv', 'base', 'class_editor', 'clean_up', 'condition', 'ctypes', 'execute', 'fd', 'file', 'find_module_path',
266
+ 'flag', 'getcwd', 'highlight', 'i', 'index', 'is_environ', 'kernel32', 'load_file', 'module_path', 'name',
267
+ 'normpath', 'parser', 'pys_highlight', 'pys_sys', 'remove_python_path', 'supported'
268
+ }:
269
+ try:
270
+ del g[name]
271
+ except:
272
+ continue
254
273
 
274
+ def load_file(path) -> PysFileBuffer:
275
+ file = PysFileBuffer('', path)
255
276
  try:
256
277
  with open(path, 'r', encoding='utf-8') as file:
257
278
  file = PysFileBuffer(file, path)
258
279
  except FileNotFoundError:
259
- if EDITOR_MAP and args.editor:
260
- file = PysFileBuffer('', path)
261
- else:
262
- parser.error(f"can't open file {path!r}: No such file or directory")
280
+ if not (EDITOR_MAP and args.editor):
281
+ argument_error('file', f"can't open file \"{path}\": No such file or directory")
263
282
  except PermissionError:
264
- parser.error(f"can't open file {path!r}: Permission denied")
283
+ argument_error('file', f"can't open file \"{path}\": Permission denied")
265
284
  except IsADirectoryError:
266
- parser.error(f"can't open file {path!r}: Path is not a file")
285
+ argument_error('file', f"can't open file \"{path}\": Path is not a file")
267
286
  except NotADirectoryError:
268
- parser.error(f"can't open file {path!r}: Attempting to access directory from file")
287
+ argument_error('file', f"can't open file \"{path}\": Attempting to access directory from file")
269
288
  except (OSError, IOError):
270
- parser.error(f"can't open file {path!r}: Attempting to access a system directory or file")
289
+ argument_error('file', f"can't open file \"{path}\": Attempting to access a system directory or file")
271
290
  except UnicodeDecodeError:
272
- parser.error(f"can't read file {path!r}: Bad file")
291
+ argument_error('file', f"can't read file \"{path}\": Bad file")
273
292
  except BaseException as e:
274
- parser.error(f"file {path!r}: Unexpected error: {e}")
293
+ argument_error('file', f"file \"{path}\": Unexpected error: {e}")
294
+ return file
295
+
296
+ def execute(file: PysFileBuffer) -> None:
297
+ global code
298
+
299
+ not_show_banner_flag = DONT_SHOW_BANNER_ON_SHELL
300
+ inspect = args.inspect
301
+ symtab = _namespace_to_symbol_table(undefined, file)
302
+
303
+ clean_up()
304
+
305
+ result = pys_runner(
306
+ file=file,
307
+ mode='exec',
308
+ symbol_table=symtab,
309
+ flags=flags
310
+ )
311
+
312
+ code, _ = result.end_process()
313
+
314
+ if inspect:
315
+ if sys.stdout.closed or sys.stderr.closed:
316
+ code = 1
317
+ elif sys.stdin.closed:
318
+ print("Can't run interactive shell: sys.stdin closed", file=sys.stderr)
319
+ code = 1
320
+ else:
321
+ code = pys_shell(
322
+ globals=result.context.symbol_table,
323
+ flags=result.context.flags | not_show_banner_flag,
324
+ parser_flags=result.parser_flags
325
+ )
326
+
327
+ if args.file is not None:
328
+ argv[0] = args.file
329
+ file = load_file(normpath(args.file))
275
330
 
276
331
  if EDITOR_MAP and args.editor:
277
332
  try:
@@ -300,55 +355,23 @@ if args.file is not None:
300
355
  argument_error('-l/--highlight', e)
301
356
 
302
357
  else:
303
- result = pys_runner(
304
- file=file,
305
- mode='exec',
306
- symbol_table=_normalize_namespace(undefined, file),
307
- flags=flags
308
- )
309
-
310
- code, _ = result.end_process()
311
-
312
- if args.inspect:
313
- if sys.stdout.closed or sys.stderr.closed:
314
- code = 1
315
- elif sys.stdin.closed:
316
- print("Can't run interactive shell: sys.stdin closed", file=sys.stderr)
317
- code = 1
318
- else:
319
- code = pys_shell(
320
- globals=result.context.symbol_table,
321
- flags=result.context.flags | DONT_SHOW_BANNER_ON_SHELL,
322
- parser_flags=result.parser_flags
323
- )
358
+ execute(file)
324
359
 
325
- elif args.command is not None:
326
- argv[0] = '-c'
360
+ elif args.module is not None:
361
+ _, module_path = find_module_path(None, args.module, '__main__')
362
+ if module_path is None:
363
+ argument_error('-m/--module', f"can't find module \"{args.module}\"")
327
364
 
328
- file = PysFileBuffer(args.command, '<arg-command>')
329
- result = pys_runner(
330
- file=file,
331
- mode='exec',
332
- symbol_table=_normalize_namespace(undefined, file),
333
- flags=flags
334
- )
335
-
336
- code, _ = result.end_process()
365
+ file = load_file(module_path)
366
+ argv[0] = file.name
367
+ execute(file)
337
368
 
338
- if args.inspect:
339
- if sys.stdout.closed or sys.stderr.closed:
340
- code = 1
341
- elif sys.stdin.closed:
342
- print("Can't run interactive shell: sys.stdin closed", file=sys.stderr)
343
- code = 1
344
- else:
345
- code = pys_shell(
346
- globals=result.context.symbol_table,
347
- flags=result.context.flags | DONT_SHOW_BANNER_ON_SHELL,
348
- parser_flags=result.parser_flags
349
- )
369
+ elif args.command is not None:
370
+ argv[0] = '-c'
371
+ execute(PysFileBuffer(args.command, '<arg-command>'))
350
372
 
351
373
  else:
374
+ clean_up()
352
375
  code = pys_shell(
353
376
  globals=undefined,
354
377
  flags=flags
@@ -2,6 +2,7 @@ from .bases import Pys
2
2
  from .constants import PYSCRIPT_PATH, CORE_PATH, LIBRARIES_PATH, SITE_PACKAGES_PATH, DEFAULT
3
3
  from .utils.debug import print_display, print_traceback, clear_shell
4
4
  from .utils.decorators import inheritable, singleton
5
+ from .utils.path import base
5
6
 
6
7
  from types import ModuleType
7
8
  from typing import Literal
@@ -17,40 +18,31 @@ pys_sys = ModuleType(
17
18
 
18
19
  pys_sys.__running_shell__ = False
19
20
  pys_sys.__running_breakpoint__ = False
21
+ pys_sys.path = [LIBRARIES_PATH, SITE_PACKAGES_PATH]
22
+ pys_sys.loading_modules = set()
23
+ pys_sys.modules = {}
24
+ pys_sys.singletons = {}
20
25
  pys_sys.argv = ['']
21
26
  pys_sys.flags = DEFAULT
22
27
  pys_sys.displayhook = print_display
23
28
  pys_sys.excepthook = print_traceback
24
29
  pys_sys.clearhook = clear_shell
25
- pys_sys.exec_prefix = pys_sys.prefix = pys_sys.pyscript_path = PYSCRIPT_PATH
30
+ pys_sys.pyscript_path = PYSCRIPT_PATH
26
31
  pys_sys.core_path = CORE_PATH
27
32
  pys_sys.libraries_path = LIBRARIES_PATH
28
33
  pys_sys.site_packages_path = SITE_PACKAGES_PATH
29
- pys_sys.executable = f'"{sys.executable}" -m pyscript'
34
+ pys_sys.executable = f'{base(sys.executable)} -m pyscript'
30
35
  pys_sys.ps1 = '>>> '
31
36
  pys_sys.ps2 = '... '
32
- pys_sys.float_info = sys.float_info
33
- pys_sys.int_info = sys.int_info
34
- pys_sys.hash_info = sys.hash_info
35
- pys_sys.stderr = sys.stderr
36
- pys_sys.stdout = sys.stdout
37
- pys_sys.stdin = sys.stdin
38
- pys_sys.platform = sys.platform
39
- pys_sys.exit = sys.exit
40
- pys_sys.getrecursionlimit = sys.getrecursionlimit
41
- pys_sys.getrefcount = sys.getrefcount
42
- pys_sys.getsizeof = sys.getsizeof
43
- pys_sys.setrecursionlimit = sys.setrecursionlimit
44
-
45
- # added in python>=3.10.7
46
- if hasattr(sys, 'get_int_max_str_digits') and hasattr(sys, 'set_int_max_str_digits'):
47
- pys_sys.get_int_max_str_digits = sys.get_int_max_str_digits
48
- pys_sys.set_int_max_str_digits = sys.set_int_max_str_digits
49
37
 
50
- pys_sys.path = [SITE_PACKAGES_PATH, LIBRARIES_PATH]
51
- pys_sys.loading_modules = set()
52
- pys_sys.modules = {}
53
- pys_sys.singletons = {}
38
+ for name in (
39
+ 'exit', 'float_info', 'float_repr_style', 'get_int_max_str_digits', 'getdefaultencoding',
40
+ 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getrecursionlimit', 'getrefcount', 'getsizeof',
41
+ 'gettotalrefcount', 'hash_info', 'hexversion', 'int_info', 'intern', 'maxsize', 'maxunicode', 'platform',
42
+ 'set_int_max_str_digits', 'setrecursionlimit', 'stderr', 'stdin', 'stdout', 'thread_info'
43
+ ):
44
+ if hasattr(sys, name):
45
+ setattr(pys_sys, name, getattr(sys, name))
54
46
 
55
47
  @singleton
56
48
  @inheritable
@@ -37,7 +37,8 @@ is_blacklist_python_builtin = frozenset([
37
37
  ]).__contains__
38
38
 
39
39
  is_python_extension = frozenset([
40
- '.py', '.ipy', '.pyc', '.pyd', '.pyi', '.pyo', '.pyp', '.pyw', '.pyz', '.rpy', '.xpy', '.pyproj'
40
+ '.cgi', '.fcgi', '.gyp', '.gypi', '.ipy', '.lmi', '.pxd', '.pxi', '.py', '.py3', '.pyc', '.pyd', '.pyde', '.pyi',
41
+ '.pyo', '.pyp', '.pyproj', '.pyt', '.pyw', '.pyx', '.pyz', '.rpy', '.spec', '.tac', '.wsgi', '.xpy'
41
42
  ]).__contains__
42
43
 
43
44
  is_left_bracket = frozenset(BRACKETS_MAP.keys()).__contains__
@@ -6,6 +6,8 @@ LIBRARIES_PATH = os.path.join(PYSCRIPT_PATH, 'lib')
6
6
  OTHER_PATH = os.path.join(PYSCRIPT_PATH, 'other')
7
7
  SITE_PACKAGES_PATH = os.path.join(PYSCRIPT_PATH, 'site-packages')
8
8
  ICON_PATH = os.path.join(OTHER_PATH, 'PyScript.ico')
9
+ GLOBAL_HISTORY_PATH = os.path.join(os.path.expanduser('~'), '.pyscript_history')
10
+ GUI_GEOMETRY_PATH = os.path.join(OTHER_PATH, 'gui_geometry.txt')
9
11
 
10
12
  ENV_PYSCRIPT_NO_EXCEPTHOOK = 'PYSCRIPT_NO_EXCEPTHOOK'
11
13
  ENV_PYSCRIPT_NO_GIL = 'PYSCRIPT_NO_GIL'
@@ -1,9 +1,11 @@
1
1
  from .bases import PysEditor
2
2
  from ..buffer import PysFileBuffer
3
- from ..constants import ICON_PATH
3
+ from ..constants import GUI_GEOMETRY_PATH, ICON_PATH
4
4
  from ..highlight import PygmentsPyScriptStyle, PygmentsPyScriptLexer
5
5
  from ..version import __version__
6
6
 
7
+ import re
8
+
7
9
  try:
8
10
  from tkinter import Tk, Scrollbar, Text, messagebox
9
11
  from tkinter.font import Font
@@ -15,7 +17,8 @@ try:
15
17
  Tk.__init__(self)
16
18
 
17
19
  def on_save(event=None):
18
- self.save(self.text.get('1.0', 'end'))
20
+ text = self.text.get('1.0', 'end')
21
+ self.save(text[:-1] if text.endswith(('\r\n', '\r', '\n')) else text)
19
22
  update()
20
23
  return 'break'
21
24
 
@@ -30,6 +33,10 @@ try:
30
33
  else:
31
34
  self.destroy()
32
35
 
36
+ def on_configure(event):
37
+ if event.widget == self:
38
+ save_geometry(event.x, event.y, event.width, event.height, self.wm_state() == 'zoomed')
39
+
33
40
  def on_modified(event=None):
34
41
  text = self.text
35
42
  if text.edit_modified():
@@ -69,10 +76,15 @@ try:
69
76
  text.insert('insert', '\n' + line[:len(line) - len(line.lstrip())])
70
77
  return 'break'
71
78
 
72
- try:
73
- self.wm_iconbitmap(ICON_PATH)
74
- except:
75
- pass
79
+ def save_geometry(left, top, width, height, zoom):
80
+ try:
81
+ with open(GUI_GEOMETRY_PATH, 'w') as f:
82
+ zoom = bool(zoom)
83
+ if not zoom:
84
+ self.last_geometry = f'{width}x{height}+{left}+{top}'
85
+ f.write(f'{self.last_geometry},{int(zoom)}')
86
+ except:
87
+ pass
76
88
 
77
89
  self.lexer = PygmentsPyScriptLexer()
78
90
  self.font = Font(family='Consolas', size=10)
@@ -89,6 +101,9 @@ try:
89
101
  yscrollcommand=self.scrollbar.set
90
102
  )
91
103
 
104
+ self.scrollbar.pack_configure(side='right', fill='y')
105
+ self.scrollbar.configure(command=self.text.yview)
106
+
92
107
  self.text.pack_configure(side='left', expand=True, fill='both')
93
108
 
94
109
  self.text.insert('1.0', self.file.text)
@@ -99,9 +114,7 @@ try:
99
114
  self.text.bind('<Prior>', on_page_up)
100
115
  self.text.bind('<Next>', on_page_down)
101
116
 
102
- self.scrollbar.pack_configure(side='right', fill='y')
103
- self.scrollbar.configure(command=self.text.yview)
104
-
117
+ self.bind('<Configure>', on_configure)
105
118
  self.bind_all('<Control-S>', on_save)
106
119
  self.bind_all('<Control-s>', on_save)
107
120
  self.bind_all('<Control-W>', on_toggle_wrap)
@@ -111,6 +124,30 @@ try:
111
124
  self.bind_all('<Control-equal>', on_change_font(1, lambda size : size < 128))
112
125
  self.bind_all('<Control-plus>', on_change_font(5, lambda size : size < 128))
113
126
 
127
+ try:
128
+ with open(GUI_GEOMETRY_PATH, 'r') as f:
129
+ width, height, left, top, zoom = map(
130
+ int,
131
+ re.match(r'(\d{1,7})x(\d{1,7})\+(-?\d{1,7})\+(-?\d{1,7}),(0|1)', f.read(64)).groups()
132
+ )
133
+ self.last_geometry = f'{width}x{height}+{left}+{top}'
134
+ except:
135
+ left = self.winfo_screenwidth() // 2 - 250
136
+ top = self.winfo_screenheight() // 2 - 250
137
+ zoom = False
138
+ self.last_geometry = f'500x500+{left}+{top}'
139
+ save_geometry(left, top, 500, 500, zoom)
140
+
141
+ try:
142
+ self.wm_iconbitmap(ICON_PATH)
143
+ except:
144
+ pass
145
+
146
+ if zoom:
147
+ self.wm_state('zoomed')
148
+
149
+ self.wm_geometry(self.last_geometry)
150
+ self.wm_minsize(300, 250)
114
151
  self.wm_protocol('WM_DELETE_WINDOW', on_close)
115
152
 
116
153
  if colored:
@@ -24,6 +24,8 @@ class PysTraceback(Pys):
24
24
  primary: Optional['PysTraceback'] = None,
25
25
  implicit: bool = False
26
26
  ) -> None:
27
+ # circular import problem solved
28
+ from .cache import pys_sys
27
29
 
28
30
  setimuattr(self, 'exception', exception)
29
31
  setimuattr(self, 'context', context)
@@ -31,8 +33,12 @@ class PysTraceback(Pys):
31
33
  setimuattr(self, 'primary', primary)
32
34
  setimuattr(self, 'implicit', implicit)
33
35
 
36
+ pys_sys.last_type = type(exception) if isinstance(exception, BaseException) else exception
37
+ pys_sys.last_value = exception if isinstance(exception, BaseException) else None
38
+ pys_sys.last_traceback = self
39
+
34
40
  def __repr__(self) -> str:
35
- return f'<traceback of exception {self.exception!r}>'
41
+ return f'<traceback of {self.exception!r}>'
36
42
 
37
43
  def string_traceback(self) -> str:
38
44
  # circular import problem solved
@@ -60,9 +66,9 @@ class PysTraceback(Pys):
60
66
 
61
67
  frames.append(
62
68
  f' File {magenta}"{position.file.name}"{reset}' +
63
- ('' if is_positionless else f', line {magenta}{position.start_line}{reset}') +
69
+ ('' if is_positionless else f', line {magenta}{position.start_line}{reset}') +
64
70
  ('' if context_name is None else f', in {magenta}{context_name}{reset}') +
65
- ('' if is_positionless else f'\n{indent(format_error_arrow(position, colored), 4)}')
71
+ ('' if is_positionless else f'\n{indent(format_error_arrow(position, colored), 4)}')
66
72
  )
67
73
 
68
74
  position = context.parent_entry_position