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.
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/PKG-INFO +5 -2
- pyscript_programming_language-1.12.12/changelog.md +10 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyproject.toml +5 -2
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/__main__.py +114 -91
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/cache.py +15 -23
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/checks.py +2 -1
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/constants.py +2 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/editor/gui.py +46 -9
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/exceptions.py +9 -3
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/highlight.py +26 -15
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/interpreter.py +145 -87
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/lexer.py +2 -2
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/mapping.py +0 -2
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/parser.py +7 -4
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/pysbuiltins.py +59 -62
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/pystypes.py +14 -10
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/results.py +7 -12
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/runner.py +14 -8
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/shell.py +38 -45
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/symtab.py +2 -2
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/token.py +2 -2
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/utils/decorators.py +1 -2
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/utils/generic.py +6 -3
- pyscript_programming_language-1.12.12/pyscript/core/utils/module.py +42 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/utils/path.py +2 -5
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/version.py +2 -2
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/ast/ast_dump.py +4 -3
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/ast/ast_literal_eval.py +3 -3
- pyscript_programming_language-1.12.12/pyscript/lib/site.pys +129 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/tokenize/__init__.pys +2 -1
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/tokenize/tok_untokenize.py +2 -2
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript_programming_language.egg-info/PKG-INFO +5 -2
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/setup.py +5 -2
- pyscript_programming_language-1.12.10/changelog.md +0 -20
- pyscript_programming_language-1.12.10/pyscript/core/utils/module.py +0 -27
- pyscript_programming_language-1.12.10/pyscript/lib/site.pys +0 -55
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/MANIFEST.in +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/README.md +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/__init__.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/__init__.pyi +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/__init__.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/analyzer.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/bases.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/buffer.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/context.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/editor/__init__.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/editor/bases.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/editor/terminal.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/handlers.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/nodes.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/position.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/utils/__init__.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/utils/ansi.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/utils/debug.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/utils/similarity.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/core/utils/string.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/__hello__.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/ansi.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/ast/__init__.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/ast/ast_unparse.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/ast/ast_walk.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/brainfuck.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/code.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/dis.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/explorer.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/fpstimer/__init__.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/fpstimer/py_fpstimer.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/getch/__init__.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/getch/py_getch.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/history.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/inspect.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/jsdict.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/keyword.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/opcode.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/parser.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/pdisplay.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/symtable.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/lib/token.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/other/.nomedia +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/other/PyScript.ico +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/other/copyright +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/other/credits +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/other/license +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/site-packages/this.pys +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/this.py +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript_programming_language.egg-info/SOURCES.txt +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript_programming_language.egg-info/dependency_links.txt +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript_programming_language.egg-info/requires.txt +0 -0
- {pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript_programming_language.egg-info/top_level.txt +0 -0
- {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.
|
|
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:
|
|
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
|
{pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyproject.toml
RENAMED
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pyscript-programming-language"
|
|
7
|
-
version = "1.12.
|
|
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
|
-
|
|
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 = [
|
{pyscript_programming_language-1.12.10 → pyscript_programming_language-1.12.12}/pyscript/__main__.py
RENAMED
|
@@ -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
|
|
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,
|
|
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'{
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
|
176
|
-
arg = args.arg
|
|
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
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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
|
-
|
|
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
|
-
|
|
283
|
+
argument_error('file', f"can't open file \"{path}\": Permission denied")
|
|
265
284
|
except IsADirectoryError:
|
|
266
|
-
|
|
285
|
+
argument_error('file', f"can't open file \"{path}\": Path is not a file")
|
|
267
286
|
except NotADirectoryError:
|
|
268
|
-
|
|
287
|
+
argument_error('file', f"can't open file \"{path}\": Attempting to access directory from file")
|
|
269
288
|
except (OSError, IOError):
|
|
270
|
-
|
|
289
|
+
argument_error('file', f"can't open file \"{path}\": Attempting to access a system directory or file")
|
|
271
290
|
except UnicodeDecodeError:
|
|
272
|
-
|
|
291
|
+
argument_error('file', f"can't read file \"{path}\": Bad file")
|
|
273
292
|
except BaseException as e:
|
|
274
|
-
|
|
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
|
-
|
|
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.
|
|
326
|
-
|
|
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 =
|
|
329
|
-
|
|
330
|
-
|
|
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
|
-
|
|
339
|
-
|
|
340
|
-
|
|
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.
|
|
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'
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
'.
|
|
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.
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|