pyscript-programming-language 1.15.0.dev1__tar.gz → 1.15.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 (92) hide show
  1. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/PKG-INFO +28 -24
  2. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/README.md +27 -23
  3. pyscript_programming_language-1.15.2/changelog.md +16 -0
  4. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyproject.toml +1 -1
  5. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/__main__.py +11 -9
  6. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/constants.py +2 -1
  7. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/editor/gui.py +16 -8
  8. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/handlers.py +13 -1
  9. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/highlight.py +0 -2
  10. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/interpreter.py +15 -26
  11. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/mapping.py +8 -5
  12. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/nodes.py +56 -19
  13. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/parser.py +92 -61
  14. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/pysbuiltins.py +38 -33
  15. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/pystypes.py +9 -4
  16. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/runner.py +4 -3
  17. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/shell.py +15 -17
  18. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/token.py +1 -0
  19. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/utils/debug.py +2 -2
  20. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/utils/decorators.py +7 -5
  21. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/utils/generic.py +3 -2
  22. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/utils/module.py +3 -0
  23. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/utils/string.py +7 -3
  24. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/version.py +13 -2
  25. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/brainfuck.pys +17 -23
  26. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/dual/__init__.pys +5 -3
  27. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/dual/py_dual.py +103 -64
  28. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/explorer.pys +53 -75
  29. pyscript_programming_language-1.15.2/pyscript/lib/getch/__init__.pys +11 -0
  30. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/getch/py_getch.py +7 -4
  31. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/history.pys +15 -5
  32. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/site.pys +19 -19
  33. pyscript_programming_language-1.15.2/pyscript/other/message.txt +72 -0
  34. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript_programming_language.egg-info/PKG-INFO +28 -24
  35. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript_programming_language.egg-info/SOURCES.txt +2 -1
  36. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/setup.py +2 -2
  37. pyscript_programming_language-1.15.0.dev1/changelog.md +0 -30
  38. pyscript_programming_language-1.15.0.dev1/pyscript/lib/getch/__init__.pys +0 -10
  39. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/MANIFEST.in +0 -0
  40. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/__init__.py +0 -0
  41. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/__init__.pyi +0 -0
  42. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/__init__.py +0 -0
  43. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/analyzer.py +0 -0
  44. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/bases.py +0 -0
  45. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/buffer.py +0 -0
  46. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/cache.py +0 -0
  47. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/checks.py +0 -0
  48. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/context.py +0 -0
  49. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/editor/__init__.py +0 -0
  50. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/editor/bases.py +0 -0
  51. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/editor/terminal.py +0 -0
  52. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/exceptions.py +0 -0
  53. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/lexer.py +0 -0
  54. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/position.py +0 -0
  55. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/results.py +0 -0
  56. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/symtab.py +0 -0
  57. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/utils/__init__.py +0 -0
  58. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/utils/ansi.py +0 -0
  59. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/utils/path.py +0 -0
  60. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/core/utils/similarity.py +0 -0
  61. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/__hello__.pys +0 -0
  62. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/ansi.pys +0 -0
  63. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/ast/__init__.pys +0 -0
  64. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/ast/ast_dump.py +0 -0
  65. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/ast/ast_literal_eval.py +0 -0
  66. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/ast/ast_unparse.py +0 -0
  67. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/ast/ast_walk.py +0 -0
  68. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/code.pys +0 -0
  69. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/dis.pys +0 -0
  70. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/fpstimer/__init__.pys +0 -0
  71. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/fpstimer/py_fpstimer.py +0 -0
  72. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/inspect.pys +0 -0
  73. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/jsdict.pys +0 -0
  74. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/keyword.pys +0 -0
  75. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/opcode.pys +0 -0
  76. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/parser.pys +0 -0
  77. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/pdisplay.pys +0 -0
  78. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/symtable.pys +0 -0
  79. {pyscript_programming_language-1.15.0.dev1/pyscript/site-packages → pyscript_programming_language-1.15.2/pyscript/lib}/this.pys +0 -0
  80. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/token.pys +0 -0
  81. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/tokenize/__init__.pys +0 -0
  82. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/lib/tokenize/tok_untokenize.py +0 -0
  83. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/other/.nomedia +0 -0
  84. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/other/PyScript.ico +0 -0
  85. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/other/copyright +0 -0
  86. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/other/credits +0 -0
  87. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/other/license +0 -0
  88. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript/this.py +0 -0
  89. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript_programming_language.egg-info/dependency_links.txt +0 -0
  90. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript_programming_language.egg-info/requires.txt +0 -0
  91. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/pyscript_programming_language.egg-info/top_level.txt +0 -0
  92. {pyscript_programming_language-1.15.0.dev1 → pyscript_programming_language-1.15.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyscript-programming-language
3
- Version: 1.15.0.dev1
3
+ Version: 1.15.2
4
4
  Summary: PyScript Programming Language
5
5
  Home-page: https://azzammuhyala.github.io/pyscript
6
6
  Author: AzzamMuhyala
@@ -69,8 +69,8 @@ Try [PyScript Shell (_REPL_)](https://azzammuhyala.github.io/pyscript/shell.html
69
69
  (no installation required).
70
70
 
71
71
  ## Installation ⬇️
72
- First, you'll need to download Python. Make sure you're using the latest version above `3.10`, to ensure the code runs
73
- correctly. Visit the official [Python website](https://python.org) to download it.
72
+ First, you'll need to download Python. Make sure you're using the latest version **above `3.10`**, to ensure the code
73
+ runs correctly. Visit the official [Python website](https://python.org) to download it.
74
74
 
75
75
  Next, after downloading and configuring the Python application, you can download the PyScript from
76
76
  [PyScript releases](https://github.com/azzammuhyala/pyscript/releases) or from PIP with this command (_Recommended_):
@@ -119,28 +119,32 @@ Familiar? There it is!
119
119
  | 14 | `os` | **required** |
120
120
  | 15 | `pkgutil` | **required** |
121
121
  | 16 | `re` | **required** |
122
- | 17 | `subprocess` | **required** |
123
- | 18 | `sys` | **required** |
124
- | 19 | `types` | **required** |
125
- | 20 | `typing` | **required** |
126
- | 21 | `unicodedata` | **required** |
122
+ | 17 | `site` | **required** |
123
+ | 18 | `subprocess` | **required** |
124
+ | 19 | `sys` | **required** |
125
+ | 20 | `types` | **required** |
126
+ | 21 | `typing` | **required** |
127
+ | 22 | `unicodedata` | **required** |
127
128
  | 1 | `ast` | **required (library)** |
128
- | 2 | `msvcrt` | **required (library)** |
129
- | 3 | `pprint` | **required (library)** |
130
- | 4 | `shutil` | **required (library)** |
131
- | 5 | `signal` | **required (library)** |
132
- | 6 | `stat` | **required (library)** |
133
- | 7 | `termios` | **required (library)** |
134
- | 8 | `time` | **required (library)** |
135
- | 9 | `tty` | **required (library)** |
129
+ | 2 | `math` | **required (library)** |
130
+ | 3 | `msvcrt` | **required (library)** |
131
+ | 4 | `pprint` | **required (library)** |
132
+ | 5 | `shutil` | **required (library)** |
133
+ | 6 | `signal` | **required (library)** |
134
+ | 7 | `stat` | **required (library)** |
135
+ | 8 | `termios` | **required (library)** |
136
+ | 9 | `time` | **required (library)** |
137
+ | 10 | `tty` | **required (library)** |
136
138
  | 1 | `_colorize` | **optional** |
137
139
  | 2 | `beartype` | **optional** |
138
- | 3 | `prompt_toolkit` | **optional** |
139
- | 4 | `pygments` | **optional** |
140
- | 5 | `readline` | **optional** |
141
- | 6 | `threading` | **optional** |
142
- | 7 | `tkinter` | **optional** |
143
- | 8 | `IPython` | **optional** |
140
+ | 3 | `ctypes` | **optional** |
141
+ | 4 | `numpy` | **optional** |
142
+ | 5 | `prompt_toolkit` | **optional** |
143
+ | 6 | `pygments` | **optional** |
144
+ | 7 | `readline` | **optional** |
145
+ | 8 | `threading` | **optional** |
146
+ | 9 | `tkinter` | **optional** |
147
+ | 10 | `IPython` | **optional** |
144
148
 
145
149
  ### Status Explanation
146
150
  - **required**: Required by PyScript entirely.
@@ -148,9 +152,9 @@ Familiar? There it is!
148
152
  - **optional**: Not required, but if it is present, some features can be used without issue.
149
153
 
150
154
  ## Highlights 🎨
151
- - [PyScript plugin for Acode (Ace Editor)](https://github.com/azzammuhyala/pyscript/releases/download/v1.13.3/plugin-1.0.2.zip)
155
+ - [PyScript plugin for Acode](https://github.com/azzammuhyala/pyscript/tree/main/highlight/acode)
152
156
  - [PyScript nano for Linux](https://github.com/azzammuhyala/pyscript/tree/main/highlight/nano)
153
- - [PyScript extension for VSCode](https://marketplace.visualstudio.com/items?itemName=azzammuhyala.pyslang)
157
+ - [PyScript extension for VSCode](https://github.com/azzammuhyala/pyscript/tree/main/highlight/vscode)
154
158
 
155
159
  ## Behind It 🕰️
156
160
  This language created from based up on a
@@ -37,8 +37,8 @@ Try [PyScript Shell (_REPL_)](https://azzammuhyala.github.io/pyscript/shell.html
37
37
  (no installation required).
38
38
 
39
39
  ## Installation ⬇️
40
- First, you'll need to download Python. Make sure you're using the latest version above `3.10`, to ensure the code runs
41
- correctly. Visit the official [Python website](https://python.org) to download it.
40
+ First, you'll need to download Python. Make sure you're using the latest version **above `3.10`**, to ensure the code
41
+ runs correctly. Visit the official [Python website](https://python.org) to download it.
42
42
 
43
43
  Next, after downloading and configuring the Python application, you can download the PyScript from
44
44
  [PyScript releases](https://github.com/azzammuhyala/pyscript/releases) or from PIP with this command (_Recommended_):
@@ -87,28 +87,32 @@ Familiar? There it is!
87
87
  | 14 | `os` | **required** |
88
88
  | 15 | `pkgutil` | **required** |
89
89
  | 16 | `re` | **required** |
90
- | 17 | `subprocess` | **required** |
91
- | 18 | `sys` | **required** |
92
- | 19 | `types` | **required** |
93
- | 20 | `typing` | **required** |
94
- | 21 | `unicodedata` | **required** |
90
+ | 17 | `site` | **required** |
91
+ | 18 | `subprocess` | **required** |
92
+ | 19 | `sys` | **required** |
93
+ | 20 | `types` | **required** |
94
+ | 21 | `typing` | **required** |
95
+ | 22 | `unicodedata` | **required** |
95
96
  | 1 | `ast` | **required (library)** |
96
- | 2 | `msvcrt` | **required (library)** |
97
- | 3 | `pprint` | **required (library)** |
98
- | 4 | `shutil` | **required (library)** |
99
- | 5 | `signal` | **required (library)** |
100
- | 6 | `stat` | **required (library)** |
101
- | 7 | `termios` | **required (library)** |
102
- | 8 | `time` | **required (library)** |
103
- | 9 | `tty` | **required (library)** |
97
+ | 2 | `math` | **required (library)** |
98
+ | 3 | `msvcrt` | **required (library)** |
99
+ | 4 | `pprint` | **required (library)** |
100
+ | 5 | `shutil` | **required (library)** |
101
+ | 6 | `signal` | **required (library)** |
102
+ | 7 | `stat` | **required (library)** |
103
+ | 8 | `termios` | **required (library)** |
104
+ | 9 | `time` | **required (library)** |
105
+ | 10 | `tty` | **required (library)** |
104
106
  | 1 | `_colorize` | **optional** |
105
107
  | 2 | `beartype` | **optional** |
106
- | 3 | `prompt_toolkit` | **optional** |
107
- | 4 | `pygments` | **optional** |
108
- | 5 | `readline` | **optional** |
109
- | 6 | `threading` | **optional** |
110
- | 7 | `tkinter` | **optional** |
111
- | 8 | `IPython` | **optional** |
108
+ | 3 | `ctypes` | **optional** |
109
+ | 4 | `numpy` | **optional** |
110
+ | 5 | `prompt_toolkit` | **optional** |
111
+ | 6 | `pygments` | **optional** |
112
+ | 7 | `readline` | **optional** |
113
+ | 8 | `threading` | **optional** |
114
+ | 9 | `tkinter` | **optional** |
115
+ | 10 | `IPython` | **optional** |
112
116
 
113
117
  ### Status Explanation
114
118
  - **required**: Required by PyScript entirely.
@@ -116,9 +120,9 @@ Familiar? There it is!
116
120
  - **optional**: Not required, but if it is present, some features can be used without issue.
117
121
 
118
122
  ## Highlights 🎨
119
- - [PyScript plugin for Acode (Ace Editor)](https://github.com/azzammuhyala/pyscript/releases/download/v1.13.3/plugin-1.0.2.zip)
123
+ - [PyScript plugin for Acode](https://github.com/azzammuhyala/pyscript/tree/main/highlight/acode)
120
124
  - [PyScript nano for Linux](https://github.com/azzammuhyala/pyscript/tree/main/highlight/nano)
121
- - [PyScript extension for VSCode](https://marketplace.visualstudio.com/items?itemName=azzammuhyala.pyslang)
125
+ - [PyScript extension for VSCode](https://github.com/azzammuhyala/pyscript/tree/main/highlight/vscode)
122
126
 
123
127
  ## Behind It 🕰️
124
128
  This language created from based up on a
@@ -0,0 +1,16 @@
1
+ # Change Logs
2
+
3
+ ## [1.15.2] - 08/11/2026
4
+
5
+ ### Added
6
+ - Site packages have been moved to `site.getusersitepackages()` within the `pyscript` folder.
7
+ - The body of a `switch` statement can use semicolons `;`.
8
+ - Optimizations applied to several nodes.
9
+ - `getch` library includes the function `getch.is_initialized()`.
10
+ - `site` library includes the function `site.getusersitepackages()`.
11
+ - Added support for conversion to `complex` types in the `dual` library.
12
+ - Added the `make_dirs` parameter to the `newfile`, `move`, and `copy` functions in the `explorer` library.
13
+
14
+ ### Fixed
15
+ - Fixed several bugs.
16
+ - _etc._
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pyscript-programming-language"
7
- version = "1.15.0.dev1"
7
+ version = "1.15.2"
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,11 @@ from .core.highlight import (
9
9
  PYGMENTS, HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight, PygmentsPyScriptStyle, PygmentsPyScriptLexer
10
10
  )
11
11
  from .core.runner import _namespace_to_symbol_table, pys_runner, pys_shell
12
- from .core.utils.debug import USE_NOTEBOOK
12
+ from .core.utils.debug import USE_NOTEBOOK, custom_print
13
13
  from .core.utils.generic import is_environ
14
14
  from .core.utils.module import find_module_path, remove_python_path
15
15
  from .core.utils.path import getcwd, base, normpath
16
+ from .core.utils.string import join
16
17
  from .core.version import __version__
17
18
 
18
19
  if PYGMENTS:
@@ -41,7 +42,7 @@ if sys.version_info >= (3, 13):
41
42
  from _colorize import can_colorize
42
43
  COLORIZE = can_colorize()
43
44
  except:
44
- # respect for NO_COLOR, see more here: https://no-color.org
45
+ # rule NO_COLOR, see more here: https://no-color.org
45
46
  COLORIZE = not is_environ('NO_COLOR')
46
47
  else:
47
48
  COLORIZE = True
@@ -138,7 +139,7 @@ parser.add_argument(
138
139
  parser.add_argument(
139
140
  '-t', '--terminal',
140
141
  action='store_true',
141
- help="configure terminal encoding to UTF-8 and enable ANSI escape code processing on Windows"
142
+ help=f"configure terminal encoding to {pys_sys.encoding} and enable ANSI escape code processing on Windows"
142
143
  )
143
144
 
144
145
  parser.add_argument(
@@ -215,7 +216,7 @@ if args.terminal:
215
216
 
216
217
  for fd in (sys.stdout, sys.stderr, sys.stdin):
217
218
  try:
218
- fd.reconfigure(encoding='utf-8')
219
+ fd.reconfigure(encoding=pys_sys.encoding)
219
220
  except:
220
221
  continue
221
222
 
@@ -354,10 +355,11 @@ def execute(file: PysFileBuffer) -> None:
354
355
  code, _ = result.end_process()
355
356
 
356
357
  if inspect:
357
- if sys.stdout.closed or sys.stderr.closed:
358
+ if sys.stderr.closed:
358
359
  code = 1
359
- elif sys.stdin.closed:
360
- print("Can't run interactive shell: sys.stdin closed", file=sys.stderr)
360
+ elif sys.stdout.closed or sys.stdin.closed:
361
+ io_closed = join([f'sys.{std}' for std in ('stdout', 'stdin') if getattr(sys, std).closed])
362
+ custom_print(f"Cannot run interactive shell: {io_closed} closed", file=sys.stderr)
361
363
  code = 1
362
364
  else:
363
365
  code = pys_shell(
@@ -382,14 +384,14 @@ if args.file is not None:
382
384
  elif args.highlight:
383
385
  try:
384
386
  if args.highlight in FORMATER_HIGHLIGHT_MAP:
385
- print(
387
+ custom_print(
386
388
  pys_highlight(
387
389
  source=file,
388
390
  formatter=FORMATER_HIGHLIGHT_MAP[args.highlight]
389
391
  )
390
392
  )
391
393
  else:
392
- print(
394
+ custom_print(
393
395
  highlight(
394
396
  code=file.text,
395
397
  lexer=PygmentsPyScriptLexer(),
@@ -1,10 +1,11 @@
1
1
  import os
2
+ import site
2
3
 
3
4
  PYSCRIPT_PATH = os.path.sep.join(__file__.split(os.path.sep)[:-2])
4
5
  CORE_PATH = os.path.join(PYSCRIPT_PATH, 'core')
5
6
  LIBRARIES_PATH = os.path.join(PYSCRIPT_PATH, 'lib')
6
7
  OTHER_PATH = os.path.join(PYSCRIPT_PATH, 'other')
7
- SITE_PACKAGES_PATH = os.path.join(PYSCRIPT_PATH, 'site-packages')
8
+ SITE_PACKAGES_PATH = os.path.join(site.getusersitepackages(), 'pyscript')
8
9
  ICON_PATH = os.path.join(OTHER_PATH, 'PyScript.ico')
9
10
  GLOBAL_HISTORY_PATH = os.path.join(os.path.expanduser('~'), '.pyscript_history')
10
11
  CONFIGURATIONS_PATH = os.path.join(OTHER_PATH, 'configurations.json')
@@ -151,11 +151,18 @@ try:
151
151
  else:
152
152
  font_name = 'monospace'
153
153
 
154
- self.lexer = PygmentsPyScriptLexer()
155
- self.font = Font(family=font_name, size=boundary(self.get_configuration('gui-size-font', 10), 1, 127))
156
154
  self.line_job = None
155
+ self.font = Font(
156
+ family=font_name,
157
+ size=boundary(self.get_configuration('gui-size-font', 10), 1, 127)
158
+ )
157
159
  self.scrollbar = Scrollbar(self)
158
- self.line_numbers = Canvas(self, width=0, highlightthickness=0, bd=0)
160
+ self.line_numbers = Canvas(
161
+ self,
162
+ width=0,
163
+ highlightthickness=0,
164
+ bd=0
165
+ )
159
166
  self.text = Text(
160
167
  self,
161
168
  undo=True,
@@ -217,7 +224,8 @@ try:
217
224
  self.wm_protocol('WM_DELETE_WINDOW', on_close)
218
225
 
219
226
  if PYGMENTS and colored:
220
- self.update_job = None
227
+ self.lexer = PygmentsPyScriptLexer()
228
+ self.refresh_job = None
221
229
 
222
230
  tag_configure = self.text.tag_configure
223
231
  for token, style in PygmentsPyScriptStyle.list_styles():
@@ -226,7 +234,7 @@ try:
226
234
  tag_configure(str(token), foreground=f'#{color}')
227
235
 
228
236
  def refresh_highlight():
229
- self.update_job = None
237
+ self.refresh_job = None
230
238
 
231
239
  index = '1.0'
232
240
 
@@ -248,9 +256,9 @@ try:
248
256
 
249
257
  def update():
250
258
  self.title(f'PyScript {__version__} - {self.basename}{"*" if self.modified else ""}')
251
- if self.update_job is not None:
252
- self.after_cancel(self.update_job)
253
- self.update_job = self.after(500, refresh_highlight)
259
+ if self.refresh_job is not None:
260
+ self.after_cancel(self.refresh_job)
261
+ self.refresh_job = self.after(1000, refresh_highlight)
254
262
 
255
263
  else:
256
264
  def update():
@@ -1,15 +1,27 @@
1
1
  from .cache import pys_sys
2
- from .constants import ENV_PYSCRIPT_WITH_GIL
2
+ from .constants import SITE_PACKAGES_PATH, ENV_PYSCRIPT_WITH_GIL
3
3
  from .context import PysContext
4
4
  from .position import PysPosition
5
5
  from .pystypes import PysFunction
6
6
  from .utils.generic import is_environ
7
7
 
8
+ from site import ENABLE_USER_SITE
8
9
  from types import MethodType
9
10
  from typing import Any
10
11
 
12
+ import os
13
+
11
14
  wrapper_function = (MethodType, classmethod, staticmethod)
12
15
 
16
+ if ENABLE_USER_SITE:
17
+ try:
18
+ if os.path.isfile(SITE_PACKAGES_PATH):
19
+ os.remove(SITE_PACKAGES_PATH)
20
+ if not os.path.exists(SITE_PACKAGES_PATH):
21
+ os.mkdir(SITE_PACKAGES_PATH)
22
+ except:
23
+ pass
24
+
13
25
  GIL = pys_sys.gil = False
14
26
  if is_environ(ENV_PYSCRIPT_WITH_GIL):
15
27
  try:
@@ -28,7 +28,6 @@ BUILTIN_FUNCTIONS = frozenset(
28
28
  )
29
29
 
30
30
  try:
31
- # if pygments module already exists
32
31
  from pygments.lexer import RegexLexer, include, bygroups
33
32
  from pygments.style import Style
34
33
  from pygments.token import (
@@ -114,7 +113,6 @@ try:
114
113
  Comment.Single: HIGHLIGHT_MAP['comment'],
115
114
  Error: HIGHLIGHT_MAP['invalid'],
116
115
  Generic.Prompt: HIGHLIGHT_MAP['keyword-other'],
117
-
118
116
  Punctuation.Brackets0: HIGHLIGHT_MAP['brackets-0'],
119
117
  Punctuation.Brackets1: HIGHLIGHT_MAP['brackets-1'],
120
118
  Punctuation.Brackets2: HIGHLIGHT_MAP['brackets-2']
@@ -308,17 +308,19 @@ def visit_BinaryOperatorNode(node: PysBinaryOperatorNode, context: PysContext) -
308
308
  result._context = context
309
309
  result._position = node.position
310
310
  with result:
311
- return_right = True
312
311
 
313
312
  if otype == T_OR:
314
313
  if left:
315
314
  return result.success(left)
315
+ return_right = True
316
316
  elif otype == T_AND:
317
317
  if not left:
318
318
  return result.success(left)
319
+ return_right = True
319
320
  elif otype == T_NULLISH:
320
321
  if left is not None:
321
322
  return result.success(left)
323
+ return_right = True
322
324
  else:
323
325
  return_right = False
324
326
 
@@ -582,11 +584,8 @@ def visit_SwitchNode(node: PysSwitchNode, context: PysContext) -> PysRunTimeResu
582
584
 
583
585
  if (fall_through or no_match_found) and (ndefault := node.default):
584
586
  register(get_visitor(ndefault.__class__)(ndefault, context))
585
- if should_return():
586
- if result.should_break:
587
- result.should_break = False
588
- else:
589
- return result
587
+ if should_return() and not result.should_break:
588
+ return result
590
589
 
591
590
  return result.success(None)
592
591
 
@@ -598,13 +597,13 @@ def visit_MatchNode(node: PysMatchNode, context: PysContext) -> PysRunTimeResult
598
597
  should_return = result.should_return
599
598
  ntarget = node.target
600
599
 
601
- compare = False
602
-
603
600
  if ntarget:
604
601
  target = register(get_visitor(ntarget.__class__)(ntarget, context))
605
602
  if should_return():
606
603
  return result
607
604
  compare = True
605
+ else:
606
+ compare = False
608
607
 
609
608
  for ncondition, nvalue in node.cases:
610
609
  condition = register(get_visitor(ncondition.__class__)(ncondition, context))
@@ -614,7 +613,7 @@ def visit_MatchNode(node: PysMatchNode, context: PysContext) -> PysRunTimeResult
614
613
  result._position = ncondition.position
615
614
  with result:
616
615
 
617
- if target == condition if compare else (True if condition else False):
616
+ if (target == condition) if compare else condition:
618
617
  value = register(get_visitor(nvalue.__class__)(nvalue, context))
619
618
  if should_return():
620
619
  return result
@@ -657,7 +656,6 @@ def visit_TryNode(node: PysTryNode, context: PysContext) -> PysRunTimeResult:
657
656
  failure(None)
658
657
 
659
658
  for (targets, tparameter), body in node.catches:
660
- handle_exception = True
661
659
  stop = False
662
660
 
663
661
  if targets:
@@ -686,6 +684,9 @@ def visit_TryNode(node: PysTryNode, context: PysContext) -> PysRunTimeResult:
686
684
  handle_exception = True
687
685
  break
688
686
 
687
+ else:
688
+ handle_exception = True
689
+
689
690
  if stop:
690
691
  break
691
692
 
@@ -902,10 +903,7 @@ def visit_ForNode(node: PysForNode, context: PysContext) -> PysRunTimeResult:
902
903
  if should_return():
903
904
  return result
904
905
 
905
- if result.should_break:
906
- result.should_break = False
907
-
908
- elif nelse := node.else_:
906
+ if not result.should_break and (nelse := node.else_):
909
907
  register(get_visitor(nelse.__class__)(nelse, context))
910
908
  if should_return():
911
909
  return result
@@ -945,10 +943,7 @@ def visit_WhileNode(node: PysWhileNode, context: PysContext) -> PysRunTimeResult
945
943
  else:
946
944
  return result
947
945
 
948
- if result.should_break:
949
- result.should_break = False
950
-
951
- elif nelse := node.else_:
946
+ if not result.should_break and (nelse := node.else_):
952
947
  register(get_visitor(nelse.__class__)(nelse, context))
953
948
  if should_return():
954
949
  return result
@@ -988,10 +983,7 @@ def visit_DoWhileNode(node: PysDoWhileNode, context: PysContext) -> PysRunTimeRe
988
983
  if should_return():
989
984
  return result
990
985
 
991
- if result.should_break:
992
- result.should_break = False
993
-
994
- elif nelse := node.else_:
986
+ if not result.should_break and (nelse := node.else_):
995
987
  register(get_visitor(nelse.__class__)(nelse, context))
996
988
  if should_return():
997
989
  return result
@@ -1033,10 +1025,7 @@ def visit_RepeatNode(node: PysRepeatNode, context: PysContext) -> PysRunTimeResu
1033
1025
  if should_return():
1034
1026
  return result
1035
1027
 
1036
- if result.should_break:
1037
- result.should_break = False
1038
-
1039
- elif nelse := node.else_:
1028
+ if not result.should_break and (nelse := node.else_):
1040
1029
  register(get_visitor(nelse.__class__)(nelse, context))
1041
1030
  if should_return():
1042
1031
  return result
@@ -9,16 +9,18 @@ from operator import (
9
9
  neg, inv
10
10
  )
11
11
 
12
- contains = lambda a, b : a in b
13
- not_contains = lambda a, b : a not in b
14
- and_op = lambda a, b : a and b
15
- or_op = lambda a, b : a or b
16
- typeof = lambda a : type(a).__name__
12
+ contains = lambda a, b : a in b
13
+ not_contains = lambda a, b : a not in b
14
+ and_op = lambda a, b : a and b
15
+ or_op = lambda a, b : a or b
16
+ not_isinstance = lambda a, b : not isinstance(a, b)
17
+ typeof = lambda a : type(a).__name__
17
18
 
18
19
  GET_BINARY_FUNCTION = {
19
20
  TOKENS['IS']: is_,
20
21
  TOKENS['IS_NOT']: is_not,
21
22
  TOKENS['INSTANCEOF']: isinstance,
23
+ TOKENS['NOT_INSTANCEOF']: not_isinstance,
22
24
  TOKENS['PERCENT']: mod,
23
25
  TOKENS['AMPERSAND']: and_,
24
26
  TOKENS['STAR']: mul,
@@ -150,6 +152,7 @@ SYMBOLS_TOKEN_MAP = dfrozen({
150
152
  TOKENS['IS_NOT']: 'is not',
151
153
  TOKENS['TYPEOF']: 'typeof',
152
154
  TOKENS['INSTANCEOF']: 'instanceof',
155
+ TOKENS['NOT_INSTANCEOF']: 'not instanceof',
153
156
  TOKENS['NEWLINE']: '\n',
154
157
  TOKENS['EXCLAMATION']: '!',
155
158
  TOKENS['COMMENT']: '#',