pyscript-programming-language 1.12.0__tar.gz → 1.12.2__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 (87) hide show
  1. {pyscript_programming_language-1.12.0/pyscript_programming_language.egg-info → pyscript_programming_language-1.12.2}/PKG-INFO +5 -5
  2. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/README.md +4 -4
  3. pyscript_programming_language-1.12.2/changelog.md +8 -0
  4. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyproject.toml +1 -1
  5. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/__init__.py +5 -3
  6. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/__init__.pyi +7 -4
  7. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/__main__.py +34 -15
  8. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/analyzer.py +2 -2
  9. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/cache.py +3 -1
  10. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/constants.py +3 -0
  11. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/context.py +0 -3
  12. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/editor/bases.py +9 -7
  13. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/editor/gui.py +18 -14
  14. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/editor/terminal.py +24 -30
  15. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/exceptions.py +11 -12
  16. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/handlers.py +2 -2
  17. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/highlight.py +8 -8
  18. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/interpreter.py +16 -16
  19. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/lexer.py +51 -7
  20. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/mapping.py +3 -3
  21. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/nodes.py +5 -5
  22. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/objects.py +19 -20
  23. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/parser.py +3 -3
  24. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/pysbuiltins.py +12 -19
  25. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/runner.py +11 -7
  26. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/shell.py +83 -63
  27. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/symtab.py +1 -1
  28. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/utils/debug.py +24 -7
  29. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/utils/decorators.py +3 -3
  30. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/utils/generic.py +4 -0
  31. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/utils/similarity.py +3 -3
  32. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/version.py +3 -2
  33. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/ast/ast_dump.py +1 -1
  34. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/ast/ast_unparse.py +2 -2
  35. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/ast/ast_walk.py +2 -2
  36. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/brainfuck.pys +23 -14
  37. pyscript_programming_language-1.12.2/pyscript/lib/getch/__init__.pys +5 -0
  38. pyscript_programming_language-1.12.2/pyscript/lib/getch/py_getch.py +18 -0
  39. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/parser.pys +1 -1
  40. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2/pyscript_programming_language.egg-info}/PKG-INFO +5 -5
  41. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript_programming_language.egg-info/SOURCES.txt +2 -1
  42. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/setup.py +1 -1
  43. pyscript_programming_language-1.12.0/changelog.md +0 -21
  44. pyscript_programming_language-1.12.0/pyscript/lib/getch.pys +0 -28
  45. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/MANIFEST.in +0 -0
  46. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/__init__.py +0 -0
  47. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/bases.py +0 -0
  48. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/buffer.py +0 -0
  49. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/checks.py +0 -0
  50. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/editor/__init__.py +0 -0
  51. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/position.py +0 -0
  52. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/results.py +0 -0
  53. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/token.py +0 -0
  54. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/utils/__init__.py +0 -0
  55. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/utils/ansi.py +0 -0
  56. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/utils/jsdict.py +0 -0
  57. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/utils/module.py +0 -0
  58. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/utils/path.py +0 -0
  59. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/core/utils/string.py +0 -0
  60. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/__hello__.pys +0 -0
  61. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/ansi.pys +0 -0
  62. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/ast/__init__.pys +0 -0
  63. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/ast/ast_literal_eval.py +0 -0
  64. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/dis.pys +0 -0
  65. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/explorer.pys +0 -0
  66. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/fpstimer/__init__.pys +0 -0
  67. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/fpstimer/py_fpstimer.py +0 -0
  68. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/inspect.pys +0 -0
  69. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/jsdict.pys +0 -0
  70. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/keyword.pys +0 -0
  71. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/opcode.pys +0 -0
  72. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/site.pys +0 -0
  73. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/symtable.pys +0 -0
  74. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/token.pys +0 -0
  75. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/tokenize/__init__.pys +0 -0
  76. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/lib/tokenize/tok_untokenize.py +0 -0
  77. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/other/.nomedia +0 -0
  78. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/other/PyScript.ico +0 -0
  79. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/other/copyright +0 -0
  80. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/other/credits +0 -0
  81. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/other/license +0 -0
  82. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/site-packages/this.pys +0 -0
  83. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript/this.py +0 -0
  84. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript_programming_language.egg-info/dependency_links.txt +0 -0
  85. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript_programming_language.egg-info/requires.txt +0 -0
  86. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/pyscript_programming_language.egg-info/top_level.txt +0 -0
  87. {pyscript_programming_language-1.12.0 → pyscript_programming_language-1.12.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyscript-programming-language
3
- Version: 1.12.0
3
+ Version: 1.12.2
4
4
  Summary: PyScript Programming Language
5
5
  Home-page: https://azzammuhyala.github.io/pyscript
6
6
  Author: azzammuhyala
@@ -115,10 +115,10 @@ Familiar? There it is!
115
115
  | 5 | `time` | **required (library)** |
116
116
  | 6 | `tty` | **required (library)** |
117
117
  | 1 | `beartype` | **optional** |
118
- | 2 | `google.colab` | **optional** |
119
- | 3 | `prompt_toolkit` | **optional** |
120
- | 4 | `pygments` | **optional** |
121
- | 5 | `tkinter` | **optional** |
118
+ | 2 | `prompt_toolkit` | **optional** |
119
+ | 3 | `pygments` | **optional** |
120
+ | 4 | `tkinter` | **optional** |
121
+ | 5 | `IPython` | **optional** |
122
122
 
123
123
  ### Status Explanation
124
124
  - **required**: Required by PyScript entirely.
@@ -87,10 +87,10 @@ Familiar? There it is!
87
87
  | 5 | `time` | **required (library)** |
88
88
  | 6 | `tty` | **required (library)** |
89
89
  | 1 | `beartype` | **optional** |
90
- | 2 | `google.colab` | **optional** |
91
- | 3 | `prompt_toolkit` | **optional** |
92
- | 4 | `pygments` | **optional** |
93
- | 5 | `tkinter` | **optional** |
90
+ | 2 | `prompt_toolkit` | **optional** |
91
+ | 3 | `pygments` | **optional** |
92
+ | 4 | `tkinter` | **optional** |
93
+ | 5 | `IPython` | **optional** |
94
94
 
95
95
  ### Status Explanation
96
96
  - **required**: Required by PyScript entirely.
@@ -0,0 +1,8 @@
1
+ # Change Log
2
+
3
+ ## [1.12.2] - 26/02/2026
4
+
5
+ ### Fixed
6
+ - **Fixed some bugs**.
7
+ - Fixed some spelling errors.
8
+ - _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.0"
7
+ version = "1.12.2"
8
8
  description = "PyScript Programming Language"
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  requires-python = ">=3.10"
@@ -9,8 +9,8 @@ if __import__('sys').version_info < (3, 10):
9
9
  from . import core
10
10
 
11
11
  from .core.constants import (
12
- DEFAULT, NO_COLOR, DEBUG, SILENT, RETURN_RESULT, DONT_SHOW_BANNER_ON_SHELL, CLASSIC_LINE_SHELL, LEXER_HIGHLIGHT,
13
- DICT_TO_JSDICT
12
+ DEFAULT, NO_COLOR, DEBUG, SILENT, RETURN_RESULT, DONT_SHOW_BANNER_ON_SHELL, CLASSIC_LINE_SHELL, NO_COLOR_PROMPT,
13
+ NOTEBOOK, LEXER_HIGHLIGHT, DICT_TO_JSDICT
14
14
  )
15
15
  from .core.cache import undefined
16
16
  from .core.highlight import (
@@ -18,7 +18,7 @@ from .core.highlight import (
18
18
  PygmentsPyScriptShellLexer
19
19
  )
20
20
  from .core.runner import pys_runner, pys_exec, pys_eval, pys_require, pys_shell
21
- from .core.version import version, version_info, __version__, __date__
21
+ from .core.version import version, version_info, __version__, __date__, __author__
22
22
 
23
23
  __all__ = (
24
24
  'core',
@@ -29,6 +29,8 @@ __all__ = (
29
29
  'RETURN_RESULT',
30
30
  'DONT_SHOW_BANNER_ON_SHELL',
31
31
  'CLASSIC_LINE_SHELL',
32
+ 'NO_COLOR_PROMPT',
33
+ 'NOTEBOOK',
32
34
  'LEXER_HIGHLIGHT',
33
35
  'DICT_TO_JSDICT',
34
36
  'HLFMT_HTML',
@@ -4,7 +4,7 @@ if TYPE_CHECKING:
4
4
  from .core.buffer import PysFileBuffer
5
5
  from .core.cache import PysUndefined
6
6
  from .core.context import PysContext
7
- from .core.highlight import _PysHighlightFormatter
7
+ from .core.highlight import PysHighlightFormatter
8
8
  from .core.position import PysPosition
9
9
  from .core.results import PysExecuteResult
10
10
  from .core.symtab import PysSymbolTable
@@ -27,12 +27,14 @@ SILENT: int
27
27
  RETURN_RESULT: int
28
28
  DONT_SHOW_BANNER_ON_SHELL: int
29
29
  CLASSIC_LINE_SHELL: int
30
+ NO_COLOR_PROMPT: int
31
+ NOTEBOOK: int
30
32
  LEXER_HIGHLIGHT: int
31
33
  DICT_TO_JSDICT: int
32
34
 
33
- HLFMT_HTML: _PysHighlightFormatter
34
- HLFMT_ANSI: _PysHighlightFormatter
35
- HLFMT_BBCODE: _PysHighlightFormatter
35
+ HLFMT_HTML: PysHighlightFormatter
36
+ HLFMT_ANSI: PysHighlightFormatter
37
+ HLFMT_BBCODE: PysHighlightFormatter
36
38
 
37
39
  undefined: PysUndefined
38
40
  version: str
@@ -93,4 +95,5 @@ def pys_shell(
93
95
 
94
96
  __version__: str
95
97
  __date__: str
98
+ __author__: tuple[str]
96
99
  __all__: tuple[str]
@@ -1,7 +1,8 @@
1
1
  from .core.buffer import PysFileBuffer
2
2
  from .core.cache import pys_sys, undefined
3
3
  from .core.constants import (
4
- ENV_PYSCRIPT_CLASSIC_LINE_SHELL, DEFAULT, DEBUG, NO_COLOR, DONT_SHOW_BANNER_ON_SHELL, CLASSIC_LINE_SHELL
4
+ ENV_PYSCRIPT_NO_COLOR_PROMPT, ENV_PYSCRIPT_CLASSIC_LINE_SHELL, DEFAULT, DEBUG, NO_COLOR, DONT_SHOW_BANNER_ON_SHELL,
5
+ CLASSIC_LINE_SHELL, NO_COLOR_PROMPT, NOTEBOOK
5
6
  )
6
7
  from .core.editor.gui import PysGUIEditor, GUI_SUPPORT
7
8
  from .core.editor.terminal import PysTerminalEditor, TERMINAL_SUPPORT
@@ -9,6 +10,8 @@ from .core.highlight import (
9
10
  PYGMENTS, HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight, PygmentsPyScriptStyle, PygmentsPyScriptLexer
10
11
  )
11
12
  from .core.runner import _normalize_namespace, pys_runner, pys_shell
13
+ from .core.utils.debug import USE_NOTEBOOK
14
+ from .core.utils.generic import is_environ
12
15
  from .core.utils.module import remove_python_path
13
16
  from .core.utils.path import getcwd, normpath, get_name_from_path
14
17
  from .core.version import __version__
@@ -30,7 +33,6 @@ if PYGMENTS:
30
33
  }
31
34
 
32
35
  from argparse import OPTIONAL, REMAINDER, ArgumentParser
33
- from os import environ
34
36
 
35
37
  import sys
36
38
 
@@ -42,16 +44,24 @@ FORMAT_HIGHLIGHT_MAP = {
42
44
 
43
45
  EDITOR_MAP = {}
44
46
 
45
- if GUI_SUPPORT:
46
- EDITOR_MAP['gui'] = PysGUIEditor
47
- if TERMINAL_SUPPORT:
48
- EDITOR_MAP['terminal'] = PysTerminalEditor
47
+ for supported, name, class_editor in [
48
+ (GUI_SUPPORT, 'gui', PysGUIEditor),
49
+ (TERMINAL_SUPPORT, 'terminal', PysTerminalEditor)
50
+ ]:
51
+ if supported:
52
+ EDITOR_MAP[name] = class_editor
49
53
 
50
54
  parser = ArgumentParser(
51
55
  prog=f'{get_name_from_path(sys.executable)} -m pyscript',
52
56
  description=f'PyScript Launcher for Python Version {".".join(map(str, sys.version_info))}'
53
57
  )
54
58
 
59
+ parser.add_argument(
60
+ '-b', '--notebook',
61
+ action='store_true',
62
+ help="combination of -k and -p flags, suitable for notebook platforms such as IPython, Jupyter, Google Colab, etc"
63
+ )
64
+
55
65
  parser.add_argument(
56
66
  '-c', '--command',
57
67
  type=str,
@@ -98,6 +108,12 @@ parser.add_argument(
98
108
  help="Suppress colored output"
99
109
  )
100
110
 
111
+ parser.add_argument(
112
+ '-p', '--no-color-prompt',
113
+ action='store_true',
114
+ help="Suppress colored prompt output"
115
+ )
116
+
101
117
  parser.add_argument(
102
118
  '-r', '--py-recursion',
103
119
  type=int,
@@ -140,7 +156,7 @@ parser.add_argument(
140
156
  parser.add_argument(
141
157
  'arg',
142
158
  nargs=REMAINDER,
143
- help="Remaining arguments stored in sys_module.argv (sys.argv)"
159
+ help="Remaining arguments stored in pys_sys.argv (sys.argv)"
144
160
  )
145
161
 
146
162
  def argument_error(argument, message):
@@ -184,14 +200,17 @@ if args.py_recursion is not None:
184
200
  code = 0
185
201
  flags = DEFAULT
186
202
 
187
- if args.debug:
188
- flags |= DEBUG
189
- if args.no_color or environ.get('NO_COLOR') is not None:
190
- flags |= NO_COLOR
191
- if args.classic_line_shell or environ.get(ENV_PYSCRIPT_CLASSIC_LINE_SHELL) is not None:
192
- flags |= CLASSIC_LINE_SHELL
193
- if args.q:
194
- flags |= DONT_SHOW_BANNER_ON_SHELL
203
+ for condition, flag in [
204
+ (args.notebook or USE_NOTEBOOK, NOTEBOOK),
205
+ (args.debug, DEBUG),
206
+ (args.classic_line_shell or is_environ(ENV_PYSCRIPT_CLASSIC_LINE_SHELL), CLASSIC_LINE_SHELL),
207
+ (args.no_color or is_environ('NO_COLOR'), NO_COLOR),
208
+ (args.no_color_prompt or is_environ(ENV_PYSCRIPT_NO_COLOR_PROMPT), NO_COLOR_PROMPT),
209
+ (args.q, DONT_SHOW_BANNER_ON_SHELL)
210
+ ]:
211
+ if condition:
212
+ flags |= flag
213
+
195
214
  if args.P:
196
215
  for cwd in {'', '.', getcwd()}:
197
216
  remove_python_path(cwd)
@@ -432,8 +432,8 @@ class PysAnalyzer(Pys):
432
432
  if self.error:
433
433
  return
434
434
 
435
- if node.cause:
436
- self.visit(node.cause)
435
+ if node.primary:
436
+ self.visit(node.primary)
437
437
 
438
438
  def visit_AssertNode(self, node):
439
439
  self.visit(node.condition)
@@ -18,6 +18,7 @@ pys_sys = ModuleType(
18
18
  pys_sys.__running_shell__ = False
19
19
  pys_sys.__running_breakpoint__ = False
20
20
  pys_sys.argv = ['']
21
+ pys_sys.flags = 0
21
22
  pys_sys.displayhook = print_display
22
23
  pys_sys.excepthook = print_traceback
23
24
  pys_sys.clearhook = clear_shell
@@ -42,7 +43,8 @@ pys_sys.getsizeof = sys.getsizeof
42
43
  pys_sys.setrecursionlimit = sys.setrecursionlimit
43
44
 
44
45
  # added in python>=3.10.7
45
- if hasattr(sys, 'set_int_max_str_digits'):
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
46
48
  pys_sys.set_int_max_str_digits = sys.set_int_max_str_digits
47
49
 
48
50
  pys_sys.path = [SITE_PACKAGES_PATH, LIBRARIES_PATH]
@@ -14,6 +14,7 @@ ENV_PYSCRIPT_NO_EXCEPTHOOK = 'PYSCRIPT_NO_EXCEPTHOOK'
14
14
  ENV_PYSCRIPT_NO_GIL = 'PYSCRIPT_NO_GIL'
15
15
  ENV_PYSCRIPT_NO_READLINE = 'PYSCRIPT_NO_READLINE'
16
16
  ENV_PYSCRIPT_NO_TYPECHECK = 'PYSCRIPT_NO_TYPECHECK'
17
+ ENV_PYSCRIPT_NO_COLOR_PROMPT = 'PYSCRIPT_NO_COLOR_PROMPT'
17
18
  ENV_PYSCRIPT_MAXIMUM_TRACEBACK_LINE = 'PYSCRIPT_MAXIMUM_TRACEBACK_LINE'
18
19
  ENV_PYSCRIPT_CLASSIC_LINE_SHELL = 'PYSCRIPT_CLASSIC_LINE_SHELL'
19
20
 
@@ -117,6 +118,8 @@ SILENT = 1 << 2
117
118
  RETURN_RESULT = 1 << 3
118
119
  DONT_SHOW_BANNER_ON_SHELL = 1 << 4
119
120
  CLASSIC_LINE_SHELL = 1 << 5
121
+ NO_COLOR_PROMPT = 1 << 6
122
+ NOTEBOOK = CLASSIC_LINE_SHELL | NO_COLOR_PROMPT
120
123
 
121
124
  # parser flags
122
125
  LEXER_HIGHLIGHT = 1 << 0
@@ -36,9 +36,6 @@ class PysContext(Pys):
36
36
  setimuattr(self, 'parent', parent)
37
37
  setimuattr(self, 'parent_entry_position', parent_entry_position)
38
38
 
39
- def __repr__(self) -> str:
40
- return f'<Context {self.name!r}>'
41
-
42
39
  class PysClassContext(PysContext):
43
40
 
44
41
  __slots__ = ()
@@ -8,8 +8,6 @@ from os.path import basename
8
8
 
9
9
  class PysEditor(Pys):
10
10
 
11
- __slots__ = ('file', 'used', 'modified', 'wrapped', 'basename')
12
-
13
11
  @typechecked
14
12
  def __init__(self, file: PysFileBuffer) -> None:
15
13
  self.file = file
@@ -23,11 +21,15 @@ class PysEditor(Pys):
23
21
  inheritable(cls)
24
22
 
25
23
  def save(self, text) -> None:
26
- text = normstr(text)
27
- with open(self.file.name, 'w', encoding='utf-8') as file:
28
- file.write(text)
29
- setimuattr(self.file, 'text', text)
30
- self.modified = False
24
+ try:
25
+ text = normstr(text)
26
+ with open(self.file.name, 'w', encoding='utf-8') as file:
27
+ file.write(text)
28
+ setimuattr(self.file, 'text', text)
29
+ except:
30
+ pass
31
+ else:
32
+ self.modified = False
31
33
 
32
34
  def run(self) -> None:
33
35
  if self.used:
@@ -5,7 +5,7 @@ from ..highlight import PygmentsPyScriptStyle, PygmentsPyScriptLexer
5
5
  from ..version import __version__
6
6
 
7
7
  try:
8
- from tkinter import END, Tk, Scrollbar, Text, messagebox
8
+ from tkinter import Tk, Scrollbar, Text, messagebox
9
9
  from tkinter.font import Font
10
10
 
11
11
  class PysGUIEditor(PysEditor, Tk):
@@ -15,18 +15,13 @@ try:
15
15
  Tk.__init__(self)
16
16
 
17
17
  try:
18
- self.iconbitmap(ICON_PATH)
18
+ self.wm_iconbitmap(ICON_PATH)
19
19
  except:
20
20
  pass
21
21
 
22
22
  self.lexer = PygmentsPyScriptLexer()
23
- self.style = PygmentsPyScriptStyle
24
-
25
23
  self.font = Font(family='Consolas', size=10)
26
-
27
24
  self.scrollbar = Scrollbar(self)
28
- self.scrollbar.pack_configure(side='right', fill='y')
29
-
30
25
  self.text = Text(
31
26
  self,
32
27
  undo=True,
@@ -40,12 +35,15 @@ try:
40
35
  )
41
36
 
42
37
  self.text.pack_configure(side='left', expand=True, fill='both')
43
- self.scrollbar.configure(command=self.text.yview)
44
38
 
45
39
  self.text.insert('1.0', self.file.text)
46
40
  self.text.edit_modified(False)
47
41
 
48
42
  self.text.bind('<<Modified>>', self.on_modified)
43
+ self.text.bind('<Return>', self.on_enter)
44
+
45
+ self.scrollbar.pack_configure(side='right', fill='y')
46
+ self.scrollbar.configure(command=self.text.yview)
49
47
 
50
48
  self.bind_all('<Control-S>', self.on_save)
51
49
  self.bind_all('<Control-s>', self.on_save)
@@ -56,7 +54,7 @@ try:
56
54
  self.bind_all('<Control-equal>', self.on_change_font(1, lambda size : size < 128))
57
55
  self.bind_all('<Control-plus>', self.on_change_font(5, lambda size : size < 128))
58
56
 
59
- self.protocol('WM_DELETE_WINDOW', self.on_close)
57
+ self.wm_protocol('WM_DELETE_WINDOW', self.on_close)
60
58
 
61
59
  self.setup_tags()
62
60
  self.update()
@@ -67,7 +65,7 @@ try:
67
65
 
68
66
  def setup_tags(self):
69
67
  tag_configure = self.text.tag_configure
70
- for token, style in self.style.list_styles():
68
+ for token, style in PygmentsPyScriptStyle.list_styles():
71
69
  if color := style['color']:
72
70
  tag_configure(str(token), foreground=f'#{color}')
73
71
 
@@ -85,15 +83,15 @@ try:
85
83
 
86
84
  for tag in text.tag_names():
87
85
  if tag != 'sel':
88
- text_tag_remove(tag, '1.0', END)
86
+ text_tag_remove(tag, '1.0', 'end')
89
87
 
90
- for type, value in self.lexer.get_tokens(text.get('1.0', END)):
88
+ for type, value in self.lexer.get_tokens(text.get('1.0', 'end')):
91
89
  end_index = text_index(f'{index} + {get_length(value)} chars')
92
90
  text_tag_add(to_string(type), index, end_index)
93
91
  index = end_index
94
92
 
95
93
  def on_save(self, event=None):
96
- self.save(self.text.get('1.0', END))
94
+ self.save(self.text.get('1.0', 'end'))
97
95
  self.update()
98
96
  return 'break'
99
97
 
@@ -129,9 +127,15 @@ try:
129
127
  self.text.configure(wrap='char' if self.wrapped else 'none')
130
128
  return 'break'
131
129
 
130
+ def on_enter(self, event=None):
131
+ text = self.text
132
+ line = text.get('insert linestart', 'insert lineend')
133
+ text.insert('insert', '\n' + line[:len(line) - len(line.lstrip())])
134
+ return 'break'
135
+
132
136
  GUI_SUPPORT = True
133
137
 
134
- except ImportError as e:
138
+ except BaseException as e:
135
139
  _error = e
136
140
 
137
141
  class PysGUIEditor(PysEditor):
@@ -8,7 +8,6 @@ try:
8
8
  from prompt_toolkit.filters import Condition
9
9
  from prompt_toolkit.formatted_text import ANSI
10
10
  from prompt_toolkit.key_binding import KeyBindings
11
- from prompt_toolkit.keys import Keys
12
11
  from prompt_toolkit.layout import Layout, HSplit, Window, Float, FloatContainer
13
12
  from prompt_toolkit.layout.containers import ConditionalContainer
14
13
  from prompt_toolkit.layout.controls import FormattedTextControl
@@ -23,7 +22,6 @@ try:
23
22
  PysEditor.__init__(self, file)
24
23
 
25
24
  self.show_exit_window = False
26
- self.overwrite = False
27
25
 
28
26
  on_edit = Condition(lambda: not self.show_exit_window)
29
27
  on_exit = Condition(lambda: self.show_exit_window)
@@ -53,39 +51,45 @@ try:
53
51
  filter=on_exit,
54
52
  )
55
53
 
56
- self.key_bindings = KeyBindings()
54
+ key_bindings = KeyBindings()
57
55
 
58
- @self.key_bindings.add('tab', filter=on_edit, eager=True)
56
+ @key_bindings.add('tab', filter=on_edit, eager=True)
59
57
  def _(event):
60
58
  self.text.buffer.insert_text('\t')
61
59
 
62
- @self.key_bindings.add('insert', filter=on_edit, eager=True)
63
- def _(event):
64
- self.overwrite = not self.overwrite
65
-
66
- @self.key_bindings.add('pageup', filter=on_edit, eager=True)
60
+ @key_bindings.add('pageup', filter=on_edit, eager=True)
67
61
  def _(event):
68
62
  self.current_buffer.cursor_position = 0
69
63
 
70
- @self.key_bindings.add('pagedown', filter=on_edit, eager=True)
64
+ @key_bindings.add('pagedown', filter=on_edit, eager=True)
71
65
  def _(event):
72
66
  buffer = self.current_buffer
73
67
  buffer.cursor_position = len(buffer.text)
74
68
 
75
- @self.key_bindings.add('c-w', filter=on_edit, eager=True)
69
+ @key_bindings.add('enter', filter=on_edit, eager=True)
70
+ def _(event):
71
+ buffer = self.current_buffer
72
+ line = buffer.document.current_line_before_cursor
73
+ buffer.insert_text('\n' + line[:len(line) - len(line.lstrip())])
74
+
75
+ @key_bindings.add('c-w', filter=on_edit, eager=True)
76
76
  def _(event):
77
77
  self.wrapped = not self.wrapped
78
78
 
79
- @self.key_bindings.add('c-z', filter=on_edit, eager=True)
79
+ @key_bindings.add('c-y', filter=on_edit, eager=True)
80
+ def _(event):
81
+ self.current_buffer.redo()
82
+
83
+ @key_bindings.add('c-z', filter=on_edit, eager=True)
80
84
  def _(event):
81
85
  self.current_buffer.undo()
82
86
 
83
- @self.key_bindings.add('c-s', filter=on_edit, eager=True)
87
+ @key_bindings.add('c-s', filter=on_edit, eager=True)
84
88
  def _(event):
85
89
  self.save(self.text.text)
86
90
 
87
- @self.key_bindings.add('c-x', filter=on_edit, eager=True)
88
- @self.key_bindings.add('escape', filter=on_edit, eager=True)
91
+ @key_bindings.add('c-x', filter=on_edit, eager=True)
92
+ @key_bindings.add('escape', filter=on_edit, eager=True)
89
93
  def _(event):
90
94
  if self.modified:
91
95
  self.show_exit_window = True
@@ -93,32 +97,22 @@ try:
93
97
  else:
94
98
  self.exit()
95
99
 
96
- @self.key_bindings.add('y', filter=on_exit)
100
+ @key_bindings.add('y', filter=on_exit)
97
101
  def _(event):
98
102
  self.save(self.text.text)
99
103
  self.show_exit_window = False
100
104
  self.exit()
101
105
 
102
- @self.key_bindings.add('n', filter=on_exit)
106
+ @key_bindings.add('n', filter=on_exit)
103
107
  def _(event):
104
108
  self.show_exit_window = False
105
109
  self.exit()
106
110
 
107
- @self.key_bindings.add('c', filter=on_exit)
111
+ @key_bindings.add('c', filter=on_exit)
108
112
  def _(event):
109
113
  self.show_exit_window = False
110
114
  self.layout.focus(self.text)
111
115
 
112
- @self.key_bindings.add(Keys.Any, filter=on_edit)
113
- def _(event):
114
- buffer = self.current_buffer
115
- text = event.data
116
- if self.overwrite and buffer.cursor_position < len(buffer.text):
117
- buffer.delete(1)
118
- buffer.insert_text(text)
119
- else:
120
- buffer.insert_text(text)
121
-
122
116
  self.root = FloatContainer(
123
117
  content=HSplit(
124
118
  [
@@ -142,7 +136,7 @@ try:
142
136
  self,
143
137
  layout=Layout(self.root),
144
138
  style=style_from_pygments_cls(PygmentsPyScriptStyle),
145
- key_bindings=self.key_bindings,
139
+ key_bindings=key_bindings,
146
140
  full_screen=True,
147
141
  mouse_support=True,
148
142
  paste_mode=True
@@ -165,7 +159,7 @@ try:
165
159
 
166
160
  TERMINAL_SUPPORT = True
167
161
 
168
- except ImportError as e:
162
+ except BaseException as e:
169
163
  _error = e
170
164
 
171
165
  class PysTerminalEditor(PysEditor):
@@ -14,22 +14,22 @@ if TYPE_CHECKING:
14
14
  @immutable
15
15
  class PysTraceback(Pys):
16
16
 
17
- __slots__ = ('exception', 'context', 'position', 'cause', 'directly')
17
+ __slots__ = ('exception', 'context', 'position', 'primary', 'implicit')
18
18
 
19
19
  def __init__(
20
20
  self,
21
21
  exception: BaseException | type[BaseException],
22
22
  context: 'PysContext',
23
23
  position: 'PysPosition',
24
- cause: Optional['PysTraceback'] = None,
25
- directly: bool = False
24
+ primary: Optional['PysTraceback'] = None,
25
+ implicit: bool = False
26
26
  ) -> None:
27
27
 
28
28
  setimuattr(self, 'exception', exception)
29
29
  setimuattr(self, 'context', context)
30
30
  setimuattr(self, 'position', position)
31
- setimuattr(self, 'cause', cause)
32
- setimuattr(self, 'directly', directly)
31
+ setimuattr(self, 'primary', primary)
32
+ setimuattr(self, 'implicit', implicit)
33
33
 
34
34
  def __repr__(self) -> str:
35
35
  return f'<traceback of exception {self.exception!r}>'
@@ -97,14 +97,13 @@ class PysTraceback(Pys):
97
97
  result += f': {magenta}{message}{reset}'
98
98
 
99
99
  return (
100
- self.cause.string_traceback() +
101
100
  (
102
- '\n\nThe above exception was the direct cause of the following exception:\n\n'
103
- if self.directly else
104
- '\n\nDuring handling of the above exception, another exception occurred:\n\n'
105
- ) + result
106
- if self.cause else
107
- result
101
+ f'{self.primary.string_traceback()}\n\n' + (
102
+ "The above exception was the direct cause of the following exception"
103
+ if self.implicit else
104
+ "During handling of the above exception, another exception occurred"
105
+ ) + f':\n\n{result}'
106
+ ) if self.primary else result
108
107
  )
109
108
 
110
109
  class PysSignal(Pys, BaseException):
@@ -1,13 +1,13 @@
1
1
  from .cache import pys_sys
2
2
  from .constants import ENV_PYSCRIPT_NO_GIL
3
3
  from .objects import PysFunction
4
+ from .utils.generic import is_environ
4
5
 
5
- from os import environ
6
6
  from types import MethodType
7
7
 
8
8
  wrapper_function = (MethodType, classmethod, staticmethod)
9
9
 
10
- if environ.get(ENV_PYSCRIPT_NO_GIL) is None:
10
+ if not is_environ(ENV_PYSCRIPT_NO_GIL):
11
11
  from threading import RLock
12
12
 
13
13
  lock = RLock()
@@ -351,17 +351,17 @@ try:
351
351
  tokens = PygmentsPyScriptLexer.tokens.copy()
352
352
  tokens['root'] = [
353
353
  # Shell prompts
354
- (r'^/(clear|clean|exit)$', Generic.Prompt)
354
+ (r'\A/(clear|clean|exit)\Z', Generic.Prompt)
355
355
  ] + tokens['root']
356
356
 
357
- PYGMENTS = True
358
-
359
357
  del (
360
358
  _set_constant_keywords, _unicode_name, _newlines, _integer, _scientific, _imaginary, _dollar,
361
359
  _raw_string_prefixes, _string_or_bytes_prefixes,
362
360
  )
363
361
 
364
- except ImportError as e:
362
+ PYGMENTS = True
363
+
364
+ except BaseException as e:
365
365
  _error = e
366
366
 
367
367
  class PygmentsPyScriptStyle(Pys):
@@ -378,7 +378,7 @@ except ImportError as e:
378
378
  PYGMENTS = False
379
379
 
380
380
  @typechecked
381
- class _PysHighlightFormatter(Pys):
381
+ class PysHighlightFormatter(Pys):
382
382
 
383
383
  def __init__(
384
384
  self,
@@ -420,19 +420,19 @@ def _ansi_open_block(position, type):
420
420
  color = HIGHLIGHT_MAP.get(type, HIGHLIGHT_MAP['default'])
421
421
  return acolor(int(color[i:i+2], 16) for i in range(1, 6, 2))
422
422
 
423
- HLFMT_HTML = _PysHighlightFormatter(
423
+ HLFMT_HTML = PysHighlightFormatter(
424
424
  lambda position, content: normstr(html_escape(content)).replace('\n', '<br>'),
425
425
  lambda position, type: f'<span style="color:{HIGHLIGHT_MAP.get(type, HIGHLIGHT_MAP["default"])}">',
426
426
  lambda position, type: '</span>',
427
427
  )
428
428
 
429
- HLFMT_ANSI = _PysHighlightFormatter(
429
+ HLFMT_ANSI = PysHighlightFormatter(
430
430
  lambda position, content: normstr(content),
431
431
  _ansi_open_block,
432
432
  lambda position, type: '\x1b[0m',
433
433
  )
434
434
 
435
- HLFMT_BBCODE = _PysHighlightFormatter(
435
+ HLFMT_BBCODE = PysHighlightFormatter(
436
436
  lambda position, content: normstr(content),
437
437
  lambda position, type: f'[color={HIGHLIGHT_MAP.get(type, HIGHLIGHT_MAP["default"])}]',
438
438
  lambda position, type: '[/color]',