pyscript-programming-language 1.13.3__tar.gz → 1.14.0__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 (91) hide show
  1. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/PKG-INFO +34 -32
  2. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/README.md +33 -31
  3. pyscript_programming_language-1.14.0/changelog.md +21 -0
  4. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyproject.toml +1 -1
  5. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/__init__.py +6 -4
  6. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/__init__.pyi +3 -1
  7. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/__main__.py +99 -53
  8. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/cache.py +1 -0
  9. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/constants.py +8 -7
  10. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/context.py +7 -10
  11. pyscript_programming_language-1.14.0/pyscript/core/editor/__init__.py +31 -0
  12. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/editor/bases.py +20 -19
  13. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/editor/gui.py +23 -22
  14. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/editor/terminal.py +5 -5
  15. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/exceptions.py +8 -19
  16. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/handlers.py +34 -32
  17. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/highlight.py +7 -25
  18. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/interpreter.py +21 -18
  19. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/lexer.py +8 -36
  20. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/mapping.py +55 -3
  21. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/parser.py +102 -48
  22. pyscript_programming_language-1.14.0/pyscript/core/position.py +120 -0
  23. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/pysbuiltins.py +55 -61
  24. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/pystypes.py +19 -14
  25. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/runner.py +10 -9
  26. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/shell.py +14 -16
  27. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/symtab.py +14 -15
  28. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/token.py +3 -4
  29. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/utils/ansi.py +70 -45
  30. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/utils/debug.py +18 -5
  31. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/utils/generic.py +22 -3
  32. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/utils/similarity.py +8 -7
  33. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/utils/string.py +10 -12
  34. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/version.py +5 -14
  35. pyscript_programming_language-1.14.0/pyscript/lib/ansi.pys +1 -0
  36. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/brainfuck.pys +3 -6
  37. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/fpstimer/py_fpstimer.py +11 -1
  38. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/history.pys +2 -3
  39. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/parser.pys +9 -3
  40. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/this.py +2 -2
  41. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript_programming_language.egg-info/PKG-INFO +34 -32
  42. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/setup.py +1 -2
  43. pyscript_programming_language-1.13.3/changelog.md +0 -13
  44. pyscript_programming_language-1.13.3/pyscript/core/editor/__init__.py +0 -15
  45. pyscript_programming_language-1.13.3/pyscript/core/position.py +0 -115
  46. pyscript_programming_language-1.13.3/pyscript/lib/ansi.pys +0 -14
  47. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/MANIFEST.in +0 -0
  48. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/__init__.py +0 -0
  49. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/analyzer.py +0 -0
  50. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/bases.py +0 -0
  51. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/buffer.py +0 -0
  52. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/checks.py +0 -0
  53. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/nodes.py +0 -0
  54. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/results.py +0 -0
  55. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/utils/__init__.py +0 -0
  56. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/utils/decorators.py +0 -0
  57. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/utils/module.py +0 -0
  58. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/core/utils/path.py +0 -0
  59. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/__hello__.pys +0 -0
  60. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/ast/__init__.pys +0 -0
  61. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/ast/ast_dump.py +0 -0
  62. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/ast/ast_literal_eval.py +0 -0
  63. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/ast/ast_unparse.py +0 -0
  64. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/ast/ast_walk.py +0 -0
  65. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/code.pys +0 -0
  66. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/dis.pys +0 -0
  67. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/explorer.pys +0 -0
  68. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/fpstimer/__init__.pys +0 -0
  69. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/getch/__init__.pys +0 -0
  70. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/getch/py_getch.py +0 -0
  71. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/inspect.pys +0 -0
  72. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/jsdict.pys +0 -0
  73. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/keyword.pys +0 -0
  74. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/opcode.pys +0 -0
  75. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/pdisplay.pys +0 -0
  76. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/site.pys +0 -0
  77. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/symtable.pys +0 -0
  78. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/token.pys +0 -0
  79. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/tokenize/__init__.pys +0 -0
  80. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/lib/tokenize/tok_untokenize.py +0 -0
  81. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/other/.nomedia +0 -0
  82. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/other/PyScript.ico +0 -0
  83. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/other/copyright +0 -0
  84. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/other/credits +0 -0
  85. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/other/license +0 -0
  86. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript/site-packages/this.pys +0 -0
  87. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript_programming_language.egg-info/SOURCES.txt +0 -0
  88. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript_programming_language.egg-info/dependency_links.txt +0 -0
  89. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript_programming_language.egg-info/requires.txt +0 -0
  90. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/pyscript_programming_language.egg-info/top_level.txt +0 -0
  91. {pyscript_programming_language-1.13.3 → pyscript_programming_language-1.14.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyscript-programming-language
3
- Version: 1.13.3
3
+ Version: 1.14.0
4
4
  Summary: PyScript Programming Language
5
5
  Home-page: https://azzammuhyala.github.io/pyscript
6
6
  Author: AzzamMuhyala
@@ -39,7 +39,7 @@ Dynamic: requires-python
39
39
  <img src="https://static.pepy.tech/personalized-badge/pyscript-programming-language?period=total&units=NONE&left_color=GRAY&right_color=GREEN&left_text=downloads" alt="PyPI Downloads">
40
40
  </a>
41
41
  <a href="https://en.wikipedia.org/wiki/MIT_License">
42
- <img src="https://img.shields.io/badge/license-MIT-orange" alt="License MIT">
42
+ <img src="https://img.shields.io/badge/license-MIT-orange" alt="MIT License">
43
43
  </a>
44
44
  <a href="https://www.python.org/">
45
45
  <img src="https://img.shields.io/badge/python-3.10+-yellow" alt="Python 3.10+">
@@ -50,10 +50,10 @@ PyScript is a programming language built on top of Python. It combines some synt
50
50
  you're already familiar with Python, JavaScript or both, it should be quite easy to learn.
51
51
 
52
52
  ## Introduction 📖
53
- PyScript may not be the language we'll be discussing, but the name PyScript already exists, a flexible and platform for
54
- running Python in a browser. Since it's inception, the language was inspired by Python and JavaScript, which are
55
- relatively easy for humans to read. This name was chosen because it wasn't immediately known whether this name was
56
- already in use.
53
+ The name of "PyScript" was previously used by a well-known framework designed to run Python directly in the browser.
54
+ Designed from the outset with inspiration from both Python and JavaScript, this language emphasizes human readability.
55
+ Its name was derived by combining **Py**thon and Java**Script**. Please note that this language is an independent
56
+ programming language project written in Python and has no affiliation with the aforementioned PyScript framework.
57
57
 
58
58
  This language wasn't designed to compete with other modern programming languages, but rather as a learning for
59
59
  understanding how programming languages ​​work and how human written code can be understood by machines. Furthermore, this
@@ -105,24 +105,25 @@ Familiar? There it is!
105
105
  |:--:|:------------------|:----------------------:|
106
106
  | 1 | `argparse` | **required** |
107
107
  | 2 | `builtins` | **required** |
108
- | 3 | `collections.abc` | **required** |
109
- | 4 | `functools` | **required** |
110
- | 5 | `html` | **required** |
111
- | 6 | `importlib` | **required** |
112
- | 7 | `inspect` | **required** |
113
- | 8 | `io` | **required** |
114
- | 9 | `itertools` | **required** |
115
- | 10 | `json` | **required** |
116
- | 11 | `math` | **required** |
117
- | 12 | `operator` | **required** |
118
- | 13 | `os` | **required** |
119
- | 14 | `re` | **required** |
120
- | 15 | `subprocess` | **required** |
121
- | 16 | `sys` | **required** |
122
- | 17 | `threading` | **required** |
123
- | 18 | `types` | **required** |
124
- | 19 | `typing` | **required** |
125
- | 20 | `unicodedata` | **required** |
108
+ | 3 | `cmath` | **required** |
109
+ | 4 | `collections.abc` | **required** |
110
+ | 5 | `difflib` | **required** |
111
+ | 6 | `functools` | **required** |
112
+ | 7 | `html` | **required** |
113
+ | 8 | `importlib` | **required** |
114
+ | 9 | `inspect` | **required** |
115
+ | 10 | `io` | **required** |
116
+ | 11 | `itertools` | **required** |
117
+ | 12 | `json` | **required** |
118
+ | 13 | `operator` | **required** |
119
+ | 14 | `os` | **required** |
120
+ | 15 | `pkgutil` | **required** |
121
+ | 16 | `re` | **required** |
122
+ | 17 | `subprocess` | **required** |
123
+ | 18 | `sys` | **required** |
124
+ | 19 | `types` | **required** |
125
+ | 20 | `typing` | **required** |
126
+ | 21 | `unicodedata` | **required** |
126
127
  | 1 | `ast` | **required (library)** |
127
128
  | 2 | `msvcrt` | **required (library)** |
128
129
  | 3 | `pprint` | **required (library)** |
@@ -131,17 +132,18 @@ Familiar? There it is!
131
132
  | 6 | `termios` | **required (library)** |
132
133
  | 7 | `time` | **required (library)** |
133
134
  | 8 | `tty` | **required (library)** |
134
- | 1 | `beartype` | **optional** |
135
- | 2 | `prompt_toolkit` | **optional** |
136
- | 3 | `pygments` | **optional** |
137
- | 4 | `readline` | **optional** |
138
- | 5 | `tkinter` | **optional** |
139
- | 6 | `IPython` | **optional** |
135
+ | 1 | `_colorize` | **optional** |
136
+ | 2 | `beartype` | **optional** |
137
+ | 3 | `prompt_toolkit` | **optional** |
138
+ | 4 | `pygments` | **optional** |
139
+ | 5 | `readline` | **optional** |
140
+ | 6 | `threading` | **optional** |
141
+ | 7 | `tkinter` | **optional** |
142
+ | 8 | `IPython` | **optional** |
140
143
 
141
144
  ### Status Explanation
142
145
  - **required**: Required by PyScript entirely.
143
- - **required (library)**: Required PyScript library (located in `pyscript/lib`). PyScript is not affected unless you
144
- import it.
146
+ - **required (library)**: Required by PyScript optional library. PyScript is not affected, unless you import it.
145
147
  - **optional**: Not required, but if it is present, some features can be used without issue.
146
148
 
147
149
  ## Highlights 🎨
@@ -7,7 +7,7 @@
7
7
  <img src="https://static.pepy.tech/personalized-badge/pyscript-programming-language?period=total&units=NONE&left_color=GRAY&right_color=GREEN&left_text=downloads" alt="PyPI Downloads">
8
8
  </a>
9
9
  <a href="https://en.wikipedia.org/wiki/MIT_License">
10
- <img src="https://img.shields.io/badge/license-MIT-orange" alt="License MIT">
10
+ <img src="https://img.shields.io/badge/license-MIT-orange" alt="MIT License">
11
11
  </a>
12
12
  <a href="https://www.python.org/">
13
13
  <img src="https://img.shields.io/badge/python-3.10+-yellow" alt="Python 3.10+">
@@ -18,10 +18,10 @@ PyScript is a programming language built on top of Python. It combines some synt
18
18
  you're already familiar with Python, JavaScript or both, it should be quite easy to learn.
19
19
 
20
20
  ## Introduction 📖
21
- PyScript may not be the language we'll be discussing, but the name PyScript already exists, a flexible and platform for
22
- running Python in a browser. Since it's inception, the language was inspired by Python and JavaScript, which are
23
- relatively easy for humans to read. This name was chosen because it wasn't immediately known whether this name was
24
- already in use.
21
+ The name of "PyScript" was previously used by a well-known framework designed to run Python directly in the browser.
22
+ Designed from the outset with inspiration from both Python and JavaScript, this language emphasizes human readability.
23
+ Its name was derived by combining **Py**thon and Java**Script**. Please note that this language is an independent
24
+ programming language project written in Python and has no affiliation with the aforementioned PyScript framework.
25
25
 
26
26
  This language wasn't designed to compete with other modern programming languages, but rather as a learning for
27
27
  understanding how programming languages ​​work and how human written code can be understood by machines. Furthermore, this
@@ -73,24 +73,25 @@ Familiar? There it is!
73
73
  |:--:|:------------------|:----------------------:|
74
74
  | 1 | `argparse` | **required** |
75
75
  | 2 | `builtins` | **required** |
76
- | 3 | `collections.abc` | **required** |
77
- | 4 | `functools` | **required** |
78
- | 5 | `html` | **required** |
79
- | 6 | `importlib` | **required** |
80
- | 7 | `inspect` | **required** |
81
- | 8 | `io` | **required** |
82
- | 9 | `itertools` | **required** |
83
- | 10 | `json` | **required** |
84
- | 11 | `math` | **required** |
85
- | 12 | `operator` | **required** |
86
- | 13 | `os` | **required** |
87
- | 14 | `re` | **required** |
88
- | 15 | `subprocess` | **required** |
89
- | 16 | `sys` | **required** |
90
- | 17 | `threading` | **required** |
91
- | 18 | `types` | **required** |
92
- | 19 | `typing` | **required** |
93
- | 20 | `unicodedata` | **required** |
76
+ | 3 | `cmath` | **required** |
77
+ | 4 | `collections.abc` | **required** |
78
+ | 5 | `difflib` | **required** |
79
+ | 6 | `functools` | **required** |
80
+ | 7 | `html` | **required** |
81
+ | 8 | `importlib` | **required** |
82
+ | 9 | `inspect` | **required** |
83
+ | 10 | `io` | **required** |
84
+ | 11 | `itertools` | **required** |
85
+ | 12 | `json` | **required** |
86
+ | 13 | `operator` | **required** |
87
+ | 14 | `os` | **required** |
88
+ | 15 | `pkgutil` | **required** |
89
+ | 16 | `re` | **required** |
90
+ | 17 | `subprocess` | **required** |
91
+ | 18 | `sys` | **required** |
92
+ | 19 | `types` | **required** |
93
+ | 20 | `typing` | **required** |
94
+ | 21 | `unicodedata` | **required** |
94
95
  | 1 | `ast` | **required (library)** |
95
96
  | 2 | `msvcrt` | **required (library)** |
96
97
  | 3 | `pprint` | **required (library)** |
@@ -99,17 +100,18 @@ Familiar? There it is!
99
100
  | 6 | `termios` | **required (library)** |
100
101
  | 7 | `time` | **required (library)** |
101
102
  | 8 | `tty` | **required (library)** |
102
- | 1 | `beartype` | **optional** |
103
- | 2 | `prompt_toolkit` | **optional** |
104
- | 3 | `pygments` | **optional** |
105
- | 4 | `readline` | **optional** |
106
- | 5 | `tkinter` | **optional** |
107
- | 6 | `IPython` | **optional** |
103
+ | 1 | `_colorize` | **optional** |
104
+ | 2 | `beartype` | **optional** |
105
+ | 3 | `prompt_toolkit` | **optional** |
106
+ | 4 | `pygments` | **optional** |
107
+ | 5 | `readline` | **optional** |
108
+ | 6 | `threading` | **optional** |
109
+ | 7 | `tkinter` | **optional** |
110
+ | 8 | `IPython` | **optional** |
108
111
 
109
112
  ### Status Explanation
110
113
  - **required**: Required by PyScript entirely.
111
- - **required (library)**: Required PyScript library (located in `pyscript/lib`). PyScript is not affected unless you
112
- import it.
114
+ - **required (library)**: Required by PyScript optional library. PyScript is not affected, unless you import it.
113
115
  - **optional**: Not required, but if it is present, some features can be used without issue.
114
116
 
115
117
  ## Highlights 🎨
@@ -0,0 +1,21 @@
1
+ # Change Logs
2
+
3
+ ## [1.14.0] - 05/10/2026
4
+
5
+ ### Added
6
+ - All editors are not loaded when PyScript is loaded.
7
+ - `pys_sys` is available in the main `__init__`.
8
+ - The `import` statement can import several modules at once with a comma (`,`) as separator.
9
+ - Display of help, error, etc. arguments in argparser can be colored and not from `-n` / `--no-color` arguments.
10
+ - _etc._
11
+
12
+ ### Fixed
13
+ - Fixed some bugs.
14
+ - `PysContext`, `PysSymbolTable`, and `PysTraceback` are now mutable for performance.
15
+ - Environ `PYSCRIPT_NO_GIL` changed to `PYSCRIPT_WITH_GIL` (default without GIL).
16
+ - _etc._
17
+
18
+ ### Removed
19
+ - The `NotImplementedError` exception is not catch by the builtin function as a sign that the object does not support an
20
+ operation.
21
+ - _etc._
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pyscript-programming-language"
7
- version = "1.13.3"
7
+ version = "1.14.0"
8
8
  description = "PyScript Programming Language"
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  requires-python = ">=3.10"
@@ -9,10 +9,10 @@ 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, NO_COLOR_PROMPT,
13
- NOTEBOOK, LEXER_HIGHLIGHT, DICT_TO_JSDICT
12
+ DEFAULT, NO_COLOR, NO_WARNING, SILENT, DEBUG, RETURN_RESULT, DONT_SHOW_BANNER_ON_SHELL, CLASSIC_LINE_SHELL,
13
+ NO_COLOR_PROMPT, NOTEBOOK, LEXER_HIGHLIGHT, DICT_TO_JSDICT
14
14
  )
15
- from .core.cache import undefined
15
+ from .core.cache import pys_sys, undefined
16
16
  from .core.highlight import (
17
17
  HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight, PygmentsPyScriptStyle, PygmentsPyScriptLexer,
18
18
  PygmentsPyScriptShellLexer
@@ -24,8 +24,9 @@ __all__ = (
24
24
  'core',
25
25
  'DEFAULT',
26
26
  'NO_COLOR',
27
- 'DEBUG',
27
+ 'NO_WARNING',
28
28
  'SILENT',
29
+ 'DEBUG',
29
30
  'RETURN_RESULT',
30
31
  'DONT_SHOW_BANNER_ON_SHELL',
31
32
  'CLASSIC_LINE_SHELL',
@@ -37,6 +38,7 @@ __all__ = (
37
38
  'HLFMT_ANSI',
38
39
  'HLFMT_BBCODE',
39
40
  'undefined',
41
+ 'pys_sys',
40
42
  'version',
41
43
  'version_info',
42
44
  'pys_highlight',
@@ -22,8 +22,9 @@ from .core.highlight import (
22
22
 
23
23
  DEFAULT: int
24
24
  NO_COLOR: int
25
- DEBUG: int
25
+ NO_WARNING: int
26
26
  SILENT: int
27
+ DEBUG: int
27
28
  RETURN_RESULT: int
28
29
  DONT_SHOW_BANNER_ON_SHELL: int
29
30
  CLASSIC_LINE_SHELL: int
@@ -36,6 +37,7 @@ HLFMT_HTML: PysHighlightFormatter
36
37
  HLFMT_ANSI: PysHighlightFormatter
37
38
  HLFMT_BBCODE: PysHighlightFormatter
38
39
 
40
+ pys_sys: ModuleType
39
41
  undefined: PysUndefined
40
42
  version: str
41
43
  version_info: PysVersionInfo
@@ -1,11 +1,10 @@
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_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
4
+ ENV_PYSCRIPT_NO_COLOR_PROMPT, ENV_PYSCRIPT_CLASSIC_LINE_SHELL, DEFAULT, NO_COLOR, NO_WARNING, DEBUG,
5
+ DONT_SHOW_BANNER_ON_SHELL, CLASSIC_LINE_SHELL, NO_COLOR_PROMPT, NOTEBOOK
6
6
  )
7
- from .core.editor.gui import PysGUIEditor, GUI_SUPPORT
8
- from .core.editor.terminal import PysTerminalEditor, TERMINAL_SUPPORT
7
+ from .core import editor
9
8
  from .core.highlight import (
10
9
  PYGMENTS, HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight, PygmentsPyScriptStyle, PygmentsPyScriptLexer
11
10
  )
@@ -33,24 +32,29 @@ if PYGMENTS:
33
32
  }
34
33
 
35
34
  from argparse import OPTIONAL, REMAINDER, ArgumentParser
35
+ from re import compile as compile_regex
36
36
 
37
37
  import sys
38
38
 
39
+ if sys.version_info >= (3, 13):
40
+ try:
41
+ from _colorize import can_colorize
42
+ COLORIZE = can_colorize()
43
+ except:
44
+ # respect for NO_COLOR, see more here: https://no-color.org
45
+ COLORIZE = not is_environ('NO_COLOR')
46
+ else:
47
+ COLORIZE = True
48
+
39
49
  FORMATER_HIGHLIGHT_MAP = {
40
50
  'html': HLFMT_HTML,
41
51
  'ansi': HLFMT_ANSI,
42
52
  'bbcode': HLFMT_BBCODE
43
53
  }
44
54
 
45
- EDITOR_MAP = {
46
- name: cls
47
- for support, name, cls in [
48
- (GUI_SUPPORT, 'gui', PysGUIEditor),
49
- (TERMINAL_SUPPORT, 'terminal', PysTerminalEditor)
50
- ] if support
51
- }
52
-
53
- arguments_requiring_value = {'-l', '--highlight', '-r', '--py-recursion'}
55
+ editors = tuple(editor for editor in editor.__all__ if editor != 'bases')
56
+ arguments_requiring_argv = {'-c', '--command', '-m', '--module'}
57
+ arguments_requiring_value = {'-e', '--editor', '-l', '--highlight', '-r', '--py-recursion'}
54
58
 
55
59
  parser = ArgumentParser(
56
60
  prog=f'{base(sys.executable)} -m pyscript',
@@ -77,14 +81,12 @@ parser.add_argument(
77
81
  help="set a debug flag, this will ignore assert statement. Check the flag is active with the __debug__ keyword"
78
82
  )
79
83
 
80
- if EDITOR_MAP:
81
- parser.add_argument(
82
- '-e', '--editor',
83
- choices=tuple(EDITOR_MAP.keys()),
84
- default=None,
85
- help="open the editor panel from a 'file'",
86
- )
87
- arguments_requiring_value.update({'-e', '--editor'})
84
+ parser.add_argument(
85
+ '-e', '--editor',
86
+ choices=editors,
87
+ default=None,
88
+ help="open the editor panel from a 'file'",
89
+ )
88
90
 
89
91
  parser.add_argument(
90
92
  '-i', '--inspect',
@@ -100,7 +102,7 @@ parser.add_argument(
100
102
 
101
103
  parser.add_argument(
102
104
  '-l', '--highlight',
103
- choices=tuple(FORMATER_HIGHLIGHT_MAP.keys()) + tuple(FORMATER_PYGMENTS_MAP.keys() if PYGMENTS else ()),
105
+ choices=tuple(FORMATER_HIGHLIGHT_MAP.keys()) + (tuple(FORMATER_PYGMENTS_MAP.keys()) if PYGMENTS else ()),
104
106
  default=None,
105
107
  help="generate highlight code from a 'file'"
106
108
  )
@@ -139,6 +141,12 @@ parser.add_argument(
139
141
  help="configure terminal encoding to UTF-8 and enable ANSI escape code processing on Windows"
140
142
  )
141
143
 
144
+ parser.add_argument(
145
+ '-w', '--no-warning',
146
+ action='store_true',
147
+ help="disabled warning (especially syntax warnings)"
148
+ )
149
+
142
150
  parser.add_argument(
143
151
  '-q',
144
152
  action='store_true',
@@ -179,23 +187,27 @@ argv = sys.argv[1:]
179
187
  argc = len(argv)
180
188
  index = 0
181
189
  arg_index = -1
190
+ parser_color = COLORIZE
182
191
 
183
192
  while index < argc:
184
193
  arg = argv[index]
185
- if not arg.startswith('-') or arg == '--':
186
- break
187
194
 
188
- if arg in ('-c', '--command'):
189
- arg_index = index + 2
195
+ if not arg.startswith('-') or arg == '--':
190
196
  break
191
- elif arg in ('-m', '--module'):
197
+ elif arg in arguments_requiring_argv:
192
198
  arg_index = index + 2
193
199
  break
200
+ elif arg in ('-n', '--no-color'):
201
+ parser_color = False
194
202
 
195
203
  index += 1
196
204
  if arg in arguments_requiring_value:
197
205
  index += 1
198
206
 
207
+ if sys.version_info >= (3, 14):
208
+ parser.color = parser_color
209
+ parser.suggest_on_error = True
210
+
199
211
  args = parser.parse_args(argv if arg_index == -1 else argv[:arg_index])
200
212
  arg = args.arg if arg_index == -1 else argv[arg_index:]
201
213
 
@@ -220,7 +232,7 @@ if args.terminal:
220
232
  pass
221
233
 
222
234
  if args.file is None:
223
- if EDITOR_MAP and args.editor:
235
+ if args.editor:
224
236
  argument_error('-e/--editor', "argument 'file' is required")
225
237
  elif args.highlight:
226
238
  argument_error('-l/--highlight', "argument 'file' is required")
@@ -231,66 +243,97 @@ if args.py_recursion is not None:
231
243
  except BaseException as e:
232
244
  argument_error('-r/--py-recursion', e)
233
245
 
246
+ if args.P:
247
+ for cwd in {'', '.', getcwd()}:
248
+ remove_python_path(cwd)
249
+
234
250
  code = 0
235
251
  flags = DEFAULT
236
252
 
237
253
  for condition, flag in [
238
254
  (args.notebook or USE_NOTEBOOK, NOTEBOOK),
239
255
  (args.classic_line_shell or is_environ(ENV_PYSCRIPT_CLASSIC_LINE_SHELL), CLASSIC_LINE_SHELL),
240
- (args.no_color or is_environ('NO_COLOR'), NO_COLOR),
256
+ (args.no_color or not COLORIZE, NO_COLOR),
241
257
  (args.no_color_prompt or is_environ(ENV_PYSCRIPT_NO_COLOR_PROMPT), NO_COLOR_PROMPT),
242
258
  (args.debug, DEBUG),
259
+ (args.no_warning, NO_WARNING),
243
260
  (args.q, DONT_SHOW_BANNER_ON_SHELL)
244
261
  ]:
245
262
  if condition:
246
263
  flags |= flag
247
264
 
248
- if args.P:
249
- for cwd in {'', '.', getcwd()}:
250
- remove_python_path(cwd)
251
-
252
265
  pys_sys.argv = argv = ['', *arg]
253
266
 
254
267
  def clean_up() -> None:
255
268
  g = globals()
256
269
 
257
270
  for name in {
258
- 'ArgumentParser', 'BBCodeFormatter', 'CLASSIC_LINE_SHELL', 'DEBUG', 'DEFAULT', 'EDITOR_MAP',
259
- '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', 'clean_up', 'condition', 'ctypes', 'execute', 'fd', 'file', 'find_module_path', 'flag',
266
- 'getcwd', 'highlight', 'i', 'index', 'is_environ', 'kernel32', 'load_file', 'module_path', 'parser',
267
- 'pys_highlight', 'pys_sys', 'remove_python_path'
271
+ 'ArgumentParser', 'BBCodeFormatter', 'CLASSIC_LINE_SHELL', 'DEBUG', 'DEFAULT', 'i', 'index', 'is_environ', 'fd',
272
+ 'kernel32', 'ENV_PYSCRIPT_CLASSIC_LINE_SHELL', 'ENV_PYSCRIPT_NO_COLOR_PROMPT', 'FORMATER_HIGHLIGHT_MAP', 'arg',
273
+ 'FORMATER_PYGMENTS_MAP', 'HLFMT_ANSI', 'HLFMT_BBCODE', 'HLFMT_HTML', 'HtmlFormatter', 'OPTIONAL', 'PYGMENTS',
274
+ 'LatexFormatter', 'NOTEBOOK', 'NO_COLOR', 'NO_WARNING', 'NO_COLOR_PROMPT', 'PygmentsPyScriptLexer', 'args',
275
+ 'PygmentsPyScriptStyle', 'PysFileBuffer', 'REMAINDER', 'Terminal256Formatter', 'TerminalFormatter', 'flag',
276
+ 'TerminalTrueColorFormatter', 'USE_NOTEBOOK', '__version__', '_namespace_to_symbol_table', 'arg_index', 'argc',
277
+ 'argument_error', 'arguments_requiring_value', 'argv', 'base', 'clean_up', 'condition', 'ctypes', 'execute',
278
+ 'file', 'find_module_path', 'getcwd', 'highlight', 'load_editor_module', 'load_file', 'module_path', 'parser',
279
+ 'pys_highlight', 'pys_sys', 'remove_python_path', 'editors', 'editor', 'compile_regex', 'can_colorize',
280
+ 'arguments_requiring_argv', 'COLORIZE', 'parser_color'
268
281
  }:
269
282
  try:
270
283
  del g[name]
271
284
  except:
272
285
  continue
273
286
 
287
+ def load_editor_module(name: str) -> tuple[type | None, bool]:
288
+ if name not in editors:
289
+ return None, False
290
+
291
+ module = getattr(editor, name, None)
292
+ if module is None:
293
+ return None, False
294
+
295
+ class_name = compile_regex(r'Pys[A-Za-z0-9_]+Editor').fullmatch
296
+ support_name = compile_regex(r'[A-Z0-9_]+_SUPPORT').fullmatch
297
+
298
+ cls = None
299
+ support = None
300
+ for name in dir(module):
301
+ if not (cls is None or support is None):
302
+ break
303
+ elif class_name(name) and cls is None:
304
+ cls = getattr(module, name)
305
+ elif support_name(name) and support is None:
306
+ support = getattr(module, name)
307
+ else:
308
+ return None, False
309
+
310
+ return cls, support
311
+
274
312
  def load_file(path) -> PysFileBuffer:
275
313
  normalized = normpath(path)
314
+
315
+ def open_error(message: str) -> None:
316
+ argument_error('file', f"can't open file \"{normalized}\": {message}")
317
+
276
318
  try:
277
- with open(normalized, 'r', encoding='utf-8') as file:
319
+ with open(normalized, 'r', encoding=pys_sys.encoding) as file:
278
320
  return PysFileBuffer(file, normalized)
279
321
  except FileNotFoundError:
280
- if not (EDITOR_MAP and args.editor):
281
- argument_error('file', f"can't open file \"{normalized}\": No such file or directory")
322
+ if not args.editor:
323
+ open_error("No such file or directory")
282
324
  except PermissionError:
283
- argument_error('file', f"can't open file \"{normalized}\": Permission denied")
325
+ open_error("Permission denied")
284
326
  except IsADirectoryError:
285
- argument_error('file', f"can't open file \"{normalized}\": Path is not a file")
327
+ open_error("Path is not a file")
286
328
  except NotADirectoryError:
287
- argument_error('file', f"can't open file \"{normalized}\": Attempting to access directory from file")
329
+ open_error("Attempting to access directory from file")
288
330
  except (OSError, IOError):
289
- argument_error('file', f"can't open file \"{normalized}\": Attempting to access a system directory or file")
331
+ open_error("Attempting to access a system directory or file")
290
332
  except UnicodeDecodeError:
291
- argument_error('file', f"can't read file \"{normalized}\": Bad file")
333
+ open_error("Bad file")
292
334
  except BaseException as e:
293
335
  argument_error('file', f"file \"{normalized}\": Unexpected error: {e}")
336
+
294
337
  return PysFileBuffer('', path)
295
338
 
296
339
  def execute(file: PysFileBuffer) -> None:
@@ -327,9 +370,12 @@ if args.file is not None:
327
370
  argv[0] = args.file
328
371
  file = load_file(args.file)
329
372
 
330
- if EDITOR_MAP and args.editor:
373
+ if args.editor:
374
+ cls, supported = load_editor_module(args.editor)
375
+ if not supported:
376
+ argument_error('-e/--editor', f"'{args.editor}' mode not supported")
331
377
  try:
332
- EDITOR_MAP[args.editor](file=file, colored=not (flags & NO_COLOR)).run()
378
+ cls(file, colored=not (flags & NO_COLOR)).run()
333
379
  except BaseException as e:
334
380
  argument_error('-e/--editor', e)
335
381
 
@@ -31,6 +31,7 @@ pys_sys.modules = {}
31
31
  pys_sys.interns = {}
32
32
  pys_sys.singletons = {}
33
33
  pys_sys.argv = ['']
34
+ pys_sys.encoding = 'utf-8'
34
35
  pys_sys.flags = DEFAULT
35
36
  pys_sys.displayhook = print_display
36
37
  pys_sys.excepthook = print_traceback
@@ -10,7 +10,7 @@ GLOBAL_HISTORY_PATH = os.path.join(os.path.expanduser('~'), '.pyscript_history')
10
10
  CONFIGURATIONS_PATH = os.path.join(OTHER_PATH, 'configurations.json')
11
11
 
12
12
  ENV_PYSCRIPT_NO_EXCEPTHOOK = 'PYSCRIPT_NO_EXCEPTHOOK'
13
- ENV_PYSCRIPT_NO_GIL = 'PYSCRIPT_NO_GIL'
13
+ ENV_PYSCRIPT_WITH_GIL = 'PYSCRIPT_WITH_GIL'
14
14
  ENV_PYSCRIPT_NO_READLINE = 'PYSCRIPT_NO_READLINE'
15
15
  ENV_PYSCRIPT_NO_TYPECHECK = 'PYSCRIPT_NO_TYPECHECK'
16
16
  ENV_PYSCRIPT_NO_COLOR_PROMPT = 'PYSCRIPT_NO_COLOR_PROMPT'
@@ -34,12 +34,13 @@ CONSTANT_KEYWORDS = (
34
34
 
35
35
  DEFAULT = 0
36
36
  NO_COLOR = 1 << 0
37
- DEBUG = 1 << 1
38
- SILENT = 1 << 2
39
- RETURN_RESULT = 1 << 3
40
- DONT_SHOW_BANNER_ON_SHELL = 1 << 4
41
- CLASSIC_LINE_SHELL = 1 << 5
42
- NO_COLOR_PROMPT = 1 << 6
37
+ NO_WARNING = 1 << 1
38
+ SILENT = 1 << 2 | NO_WARNING
39
+ DEBUG = 1 << 3
40
+ RETURN_RESULT = 1 << 4
41
+ DONT_SHOW_BANNER_ON_SHELL = 1 << 5
42
+ CLASSIC_LINE_SHELL = 1 << 6
43
+ NO_COLOR_PROMPT = 1 << 7
43
44
  NOTEBOOK = CLASSIC_LINE_SHELL | NO_COLOR_PROMPT
44
45
 
45
46
  LEXER_HIGHLIGHT = 1 << 0
@@ -3,12 +3,9 @@ from .buffer import PysFileBuffer
3
3
  from .constants import DEFAULT
4
4
  from .position import PysPosition
5
5
  from .symtab import PysSymbolTable, PysClassSymbolTable
6
- from .utils.decorators import immutable
7
- from .utils.generic import setimuattr
8
6
 
9
7
  from typing import Optional
10
8
 
11
- @immutable
12
9
  class PysContext(Pys):
13
10
 
14
11
  __slots__ = ('file', 'name', 'qualname', 'flags', 'symbol_table', 'parent', 'parent_entry_position')
@@ -28,13 +25,13 @@ class PysContext(Pys):
28
25
  if flags is None and parent:
29
26
  flags = parent.flags
30
27
 
31
- setimuattr(self, 'file', file)
32
- setimuattr(self, 'name', name)
33
- setimuattr(self, 'qualname', qualname)
34
- setimuattr(self, 'flags', DEFAULT if flags is None else flags)
35
- setimuattr(self, 'symbol_table', symbol_table)
36
- setimuattr(self, 'parent', parent)
37
- setimuattr(self, 'parent_entry_position', parent_entry_position)
28
+ self.file = file
29
+ self.name = name
30
+ self.qualname = qualname
31
+ self.flags = DEFAULT if flags is None else flags
32
+ self.symbol_table = symbol_table
33
+ self.parent = parent
34
+ self.parent_entry_position = parent_entry_position
38
35
 
39
36
  class PysClassContext(PysContext):
40
37