pyscript-programming-language 1.6.1__tar.gz → 1.7.1__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 (76) hide show
  1. {pyscript_programming_language-1.6.1/pyscript_programming_language.egg-info → pyscript_programming_language-1.7.1}/PKG-INFO +8 -4
  2. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/README.md +3 -0
  3. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/__init__.py +3 -2
  4. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/__init__.pyi +9 -6
  5. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/__main__.py +11 -14
  6. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/analyzer.py +2 -2
  7. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/cache.py +20 -4
  8. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/checks.py +10 -14
  9. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/constants.py +11 -4
  10. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/exceptions.py +12 -17
  11. pyscript_programming_language-1.7.1/pyscript/core/handlers.py +61 -0
  12. pyscript_programming_language-1.7.1/pyscript/core/highlight.py +425 -0
  13. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/interpreter.py +79 -63
  14. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/lexer.py +42 -39
  15. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/mapping.py +5 -2
  16. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/parser.py +107 -92
  17. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/position.py +3 -3
  18. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/pysbuiltins.py +89 -3
  19. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/results.py +64 -5
  20. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/runner.py +39 -133
  21. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/utils/__init__.py +2 -0
  22. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/utils/ansi.py +1 -1
  23. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/utils/debug.py +2 -2
  24. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/utils/decorators.py +7 -3
  25. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/utils/generic.py +24 -0
  26. pyscript_programming_language-1.7.1/pyscript/core/utils/shell.py +109 -0
  27. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/utils/string.py +3 -2
  28. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/version.py +3 -3
  29. pyscript_programming_language-1.7.1/pyscript/lib/ansi.pys +10 -0
  30. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/ast/__init__.pys +1 -1
  31. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/ast/ast_unparse.py +1 -0
  32. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/explorer.pys +1 -2
  33. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/fpstimer.pys +8 -8
  34. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/inspect.pys +5 -1
  35. pyscript_programming_language-1.7.1/pyscript/lib/jsdict.pys +25 -0
  36. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/parser.pys +23 -43
  37. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/sys.pys +2 -2
  38. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/tokenize/tok_untokenize.py +1 -0
  39. pyscript_programming_language-1.7.1/pyscript/site-packages/67.pys +1 -0
  40. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1/pyscript_programming_language.egg-info}/PKG-INFO +8 -4
  41. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript_programming_language.egg-info/SOURCES.txt +2 -0
  42. pyscript_programming_language-1.7.1/pyscript_programming_language.egg-info/requires.txt +4 -0
  43. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/setup.py +3 -3
  44. pyscript_programming_language-1.6.1/pyscript/core/handlers.py +0 -117
  45. pyscript_programming_language-1.6.1/pyscript/core/highlight.py +0 -217
  46. pyscript_programming_language-1.6.1/pyscript/lib/jsdict.pys +0 -34
  47. pyscript_programming_language-1.6.1/pyscript/site-packages/67.pys +0 -1
  48. pyscript_programming_language-1.6.1/pyscript_programming_language.egg-info/requires.txt +0 -3
  49. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/MANIFEST.in +0 -0
  50. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/__init__.py +0 -0
  51. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/bases.py +0 -0
  52. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/buffer.py +0 -0
  53. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/context.py +0 -0
  54. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/nodes.py +0 -0
  55. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/objects.py +0 -0
  56. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/symtab.py +0 -0
  57. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/token.py +0 -0
  58. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/utils/module.py +0 -0
  59. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/utils/path.py +0 -0
  60. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/core/utils/similarity.py +0 -0
  61. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/__hello__.pys +0 -0
  62. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/ast/ast_dump.py +0 -0
  63. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/ast/ast_walk.py +0 -0
  64. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/brainfuck.pys +0 -0
  65. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/dis.pys +0 -0
  66. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/getch.pys +0 -0
  67. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/keyword.pys +0 -0
  68. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/site.pys +0 -0
  69. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/symtable.pys +0 -0
  70. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/this.pys +0 -0
  71. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/token.pys +0 -0
  72. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/lib/tokenize/__init__.pys +0 -0
  73. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript/this.py +0 -0
  74. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript_programming_language.egg-info/dependency_links.txt +0 -0
  75. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/pyscript_programming_language.egg-info/top_level.txt +0 -0
  76. {pyscript_programming_language-1.6.1 → pyscript_programming_language-1.7.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyscript-programming-language
3
- Version: 1.6.1
3
+ Version: 1.7.1
4
4
  Summary: PyScript Programming Language
5
5
  Home-page: https://github.com/azzammuhyala/pyscript
6
6
  Author: azzammuhyala
@@ -8,7 +8,7 @@ Author-email: azzammuhyala@gmail.com
8
8
  License: MIT
9
9
  Project-URL: Source, https://github.com/azzammuhyala/pyscript
10
10
  Project-URL: Bug Tracker, https://github.com/azzammuhyala/pyscript/issues
11
- Keywords: pyscript,pys,programming,language,programming language
11
+ Keywords: pyscript,pyslang,pys,programming,language,programming language
12
12
  Classifier: Programming Language :: Python
13
13
  Classifier: Programming Language :: Python :: 3
14
14
  Classifier: Intended Audience :: Developers
@@ -17,8 +17,9 @@ Classifier: Topic :: Software Development :: Interpreters
17
17
  Classifier: Topic :: Software Development :: Compilers
18
18
  Requires-Python: >=3.10
19
19
  Description-Content-Type: text/markdown
20
- Provides-Extra: typecheck
21
- Requires-Dist: beartype; extra == "typecheck"
20
+ Provides-Extra: extras
21
+ Requires-Dist: beartype; extra == "extras"
22
+ Requires-Dist: pygments; extra == "extras"
22
23
  Dynamic: author
23
24
  Dynamic: author-email
24
25
  Dynamic: classifier
@@ -73,6 +74,9 @@ python -m pyscript
73
74
  ```
74
75
  If successful, you can see the version, release date, and a `>>>` like Python shell (_REPL_).
75
76
 
77
+ > If you are using the VS Code editor, you can use the
78
+ [PyScript extension](https://marketplace.visualstudio.com/items?itemName=azzammuhyala.pyslang) for Syntax Highlight!
79
+
76
80
  ## Syntax
77
81
  <pre><span style="color:#C586C0">func</span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">greet</span><span style="color:#FFD705">(</span><span style="color:#8CDCFE">name</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"> </span><span style="color:#FFD705">{</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Hello, &quot;</span><span style="color:#D4D4D4"> + </span><span style="color:#8CDCFE">name</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">title</span><span style="color:#1A9FFF">()</span><span style="color:#D4D4D4"> + </span><span style="color:#CE9178">&quot;!&quot;</span><span style="color:#D45DBA">)</span><br><span style="color:#FFD705">}</span><br><br><span style="color:#DCDCAA">greet</span><span style="color:#FFD705">(</span><span style="color:#CE9178">&quot;charlie klik&quot;</span><span style="color:#FFD705">)</span></pre>
78
82
 
@@ -39,6 +39,9 @@ python -m pyscript
39
39
  ```
40
40
  If successful, you can see the version, release date, and a `>>>` like Python shell (_REPL_).
41
41
 
42
+ > If you are using the VS Code editor, you can use the
43
+ [PyScript extension](https://marketplace.visualstudio.com/items?itemName=azzammuhyala.pyslang) for Syntax Highlight!
44
+
42
45
  ## Syntax
43
46
  <pre><span style="color:#C586C0">func</span><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">greet</span><span style="color:#FFD705">(</span><span style="color:#8CDCFE">name</span><span style="color:#FFD705">)</span><span style="color:#D4D4D4"> </span><span style="color:#FFD705">{</span><br><span style="color:#D4D4D4"> </span><span style="color:#DCDCAA">print</span><span style="color:#D45DBA">(</span><span style="color:#CE9178">&quot;Hello, &quot;</span><span style="color:#D4D4D4"> + </span><span style="color:#8CDCFE">name</span><span style="color:#D4D4D4">.</span><span style="color:#DCDCAA">title</span><span style="color:#1A9FFF">()</span><span style="color:#D4D4D4"> + </span><span style="color:#CE9178">&quot;!&quot;</span><span style="color:#D45DBA">)</span><br><span style="color:#FFD705">}</span><br><br><span style="color:#DCDCAA">greet</span><span style="color:#FFD705">(</span><span style="color:#CE9178">&quot;charlie klik&quot;</span><span style="color:#FFD705">)</span></pre>
44
47
 
@@ -10,7 +10,7 @@ from . import core
10
10
 
11
11
  from .core.constants import DEFAULT, DEBUG, SILENT, RETRES, HIGHLIGHT, NO_COLOR, REVERSE_POW_XOR
12
12
  from .core.cache import undefined
13
- from .core.highlight import HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight
13
+ from .core.highlight import HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight, PygmentsPyScriptLexer
14
14
  from .core.runner import pys_exec, pys_eval, pys_require, pys_shell
15
15
  from .core.version import version_info, __version__, __date__
16
16
 
@@ -32,5 +32,6 @@ __all__ = (
32
32
  'pys_exec',
33
33
  'pys_eval',
34
34
  'pys_require',
35
- 'pys_shell'
35
+ 'pys_shell',
36
+ 'PygmentsPyScriptLexer'
36
37
  )
@@ -1,9 +1,11 @@
1
+ from .core.highlight import PygmentsPyScriptLexer as PygmentsPyScriptLexer
2
+
1
3
  from typing import TYPE_CHECKING, Any, Callable, Iterator, Literal, Optional
2
4
 
3
5
  if TYPE_CHECKING:
4
6
  from .core.buffer import PysFileBuffer
5
7
  from .core.cache import PysUndefined
6
- from .core.highlight import _HighlightFormatter
8
+ from .core.highlight import _PysHighlightFormatter
7
9
  from .core.position import PysPosition
8
10
  from .core.results import PysExecuteResult
9
11
  from .core.symtab import PysSymbolTable
@@ -22,9 +24,9 @@ HIGHLIGHT: int
22
24
  NO_COLOR: int
23
25
  REVERSE_POW_XOR: int
24
26
 
25
- HLFMT_HTML: _HighlightFormatter
26
- HLFMT_ANSI: _HighlightFormatter
27
- HLFMT_BBCODE: _HighlightFormatter
27
+ HLFMT_HTML: _PysHighlightFormatter
28
+ HLFMT_ANSI: _PysHighlightFormatter
29
+ HLFMT_BBCODE: _PysHighlightFormatter
28
30
 
29
31
  undefined: PysUndefined
30
32
  version_info: PysVersionInfo
@@ -49,7 +51,7 @@ def pys_highlight(
49
51
  str
50
52
  ]
51
53
  ] = None,
52
- max_parenthesis_level: int = 3
54
+ max_bracket_level: int = 3
53
55
  ) -> str: ...
54
56
 
55
57
  def pys_exec(
@@ -65,7 +67,8 @@ def pys_eval(
65
67
  ) -> Any | PysExecuteResult: ...
66
68
 
67
69
  def pys_require(
68
- name: str | bytes
70
+ name: str | bytes,
71
+ flags: int = DEFAULT
69
72
  ) -> ModuleType | Any: ...
70
73
 
71
74
  def pys_shell(
@@ -1,15 +1,14 @@
1
1
  from .core.buffer import PysFileBuffer
2
2
  from .core.cache import path, undefined
3
3
  from .core.constants import DEFAULT, DEBUG, NO_COLOR
4
- from .core.handlers import handle_execute
5
4
  from .core.highlight import HLFMT_HTML, HLFMT_ANSI, HLFMT_BBCODE, pys_highlight
6
- from .core.runner import pys_runner, pys_shell
7
- from .core.symtab import new_symbol_table
5
+ from .core.runner import _normalize_globals, pys_runner, pys_shell
8
6
  from .core.utils.module import get_module_name_from_path
9
7
  from .core.utils.path import normpath
10
8
  from .core.version import __version__
11
9
 
12
10
  from argparse import ArgumentParser
11
+ from os import environ
13
12
  from sys import executable, stderr, version_info, exit, setrecursionlimit
14
13
 
15
14
  FORMAT_HIGHLIGHT_MAP = {
@@ -96,7 +95,7 @@ flags = DEFAULT
96
95
 
97
96
  if args.debug:
98
97
  flags |= DEBUG
99
- if args.no_color:
98
+ if args.no_color or environ.get('NO_COLOR') is not None:
100
99
  flags |= NO_COLOR
101
100
 
102
101
  if args.file is not None:
@@ -130,25 +129,23 @@ if args.file is not None:
130
129
  result = pys_runner(
131
130
  file=file,
132
131
  mode='exec',
133
- symbol_table=new_symbol_table(file=file.name, name='__main__')[0],
132
+ symbol_table=_normalize_globals(file, undefined),
134
133
  flags=flags
135
134
  )
136
135
 
137
136
  if args.inspect:
138
137
  code = pys_shell(result.context.symbol_table, result.context.flags)
139
138
  else:
140
- code = handle_execute(result)
139
+ code = result.process()[0]
141
140
 
142
141
  elif args.command is not None:
143
142
  file = PysFileBuffer(args.command)
144
- code = handle_execute(
145
- pys_runner(
146
- file=file,
147
- mode='exec',
148
- symbol_table=new_symbol_table(file=file.name, name='__main__')[0],
149
- flags=flags
150
- )
151
- )
143
+ code = pys_runner(
144
+ file=file,
145
+ mode='exec',
146
+ symbol_table=_normalize_globals(file, undefined),
147
+ flags=flags
148
+ ).process()[0]
152
149
 
153
150
  else:
154
151
  code = pys_shell(undefined, flags)
@@ -454,7 +454,7 @@ class PysAnalyzer(Pys):
454
454
  if self.in_loop == 0 and self.in_switch == 0:
455
455
  self.throw("break outside of loop or switch case", node.position)
456
456
 
457
- def visit_slice_SubscriptNode(self, nslice: tuple | slice | PysNode):
457
+ def visit_slice_SubscriptNode(self, nslice):
458
458
  type = nslice.__class__
459
459
 
460
460
  if type is slice:
@@ -482,7 +482,7 @@ class PysAnalyzer(Pys):
482
482
  else:
483
483
  self.visit(nslice)
484
484
 
485
- def visit_declaration_AssignNode(self, node: PysNode, message: str):
485
+ def visit_declaration_AssignNode(self, node, message):
486
486
  type = node.__class__
487
487
 
488
488
  if type is PysAttributeNode:
@@ -1,17 +1,15 @@
1
1
  from .bases import Pys
2
2
  from .constants import LIBRARIES_PATH, SITE_PACKAGES_PATH
3
- from .utils.debug import print_traceback
3
+ from .utils.debug import print_display, print_traceback
4
4
  from .utils.decorators import inheritable, singleton
5
5
 
6
6
  from threading import RLock
7
- from re import compile as re_compile
8
7
 
9
8
  loading_modules = set()
10
9
  lock = RLock()
11
10
  modules = dict()
12
11
  path = [SITE_PACKAGES_PATH, LIBRARIES_PATH]
13
12
  singletons = dict()
14
- version_match = re_compile(r'^(\d+)\.(\d+)\.(\d+)((?:a|b|rc)(\d+)|\.(dev|post)(\d+))?$').match
15
13
 
16
14
  @singleton
17
15
  @inheritable
@@ -39,7 +37,9 @@ class PysHook(Pys):
39
37
  def __new_singleton__(cls):
40
38
  global hook
41
39
  hook = super(cls, cls).__new__(cls)
42
- hook.display = None
40
+ hook.running_shell = False
41
+ hook.running_breakpoint = False
42
+ hook.display = print_display
43
43
  hook.exception = print_traceback
44
44
  hook.ps1 = '>>> '
45
45
  hook.ps2 = '... '
@@ -48,6 +48,22 @@ class PysHook(Pys):
48
48
  def __repr__(self):
49
49
  return f'<hook object at {id(self):016X}>'
50
50
 
51
+ @property
52
+ def running_shell(self):
53
+ return singletons['hook.running_shell']
54
+
55
+ @running_shell.setter
56
+ def running_shell(self, value):
57
+ singletons['hook.running_shell'] = bool(value)
58
+
59
+ @property
60
+ def running_breakpoint(self):
61
+ return singletons['hook.running_breakpoint']
62
+
63
+ @running_breakpoint.setter
64
+ def running_breakpoint(self, value):
65
+ singletons['hook.running_breakpoint'] = bool(value)
66
+
51
67
  @property
52
68
  def display(self):
53
69
  return singletons['hook.display']
@@ -1,5 +1,5 @@
1
- from .constants import TOKENS, KEYWORDS
2
- from .mapping import PARENTHESISES_MAP
1
+ from .constants import TOKENS, KEYWORDS, CONSTANT_KEYWORDS
2
+ from .mapping import BRACKETS_MAP
3
3
  from .nodes import *
4
4
 
5
5
  is_expression = frozenset([
@@ -33,19 +33,15 @@ is_incremental = frozenset([
33
33
  ]).__contains__
34
34
 
35
35
  is_blacklist_python_builtins = frozenset([
36
- 'IndentationError', 'TabError', 'compile', 'copyright', 'credits', 'dir', 'eval', 'exec', 'help', 'globals',
37
- 'license', 'locals', 'vars'
36
+ 'IndentationError', 'TabError', 'breakpoint', 'compile', 'copyright', 'credits', 'dir', 'eval', 'exec', 'help',
37
+ 'globals', 'license', 'locals', 'vars'
38
38
  ]).__contains__
39
39
 
40
- is_left_parenthesis = frozenset(PARENTHESISES_MAP.keys()).__contains__
41
- is_right_parenthesis = frozenset(PARENTHESISES_MAP.values()).__contains__
42
- is_parenthesis = frozenset(PARENTHESISES_MAP.keys() | PARENTHESISES_MAP.values()).__contains__
40
+ is_left_bracket = frozenset(BRACKETS_MAP.keys()).__contains__
41
+ is_right_bracket = frozenset(BRACKETS_MAP.values()).__contains__
42
+ is_bracket = frozenset(BRACKETS_MAP.keys() | BRACKETS_MAP.values()).__contains__
43
43
 
44
- is_constant_keywords = frozenset([
45
- KEYWORDS['__debug__'], KEYWORDS['of'], KEYWORDS['in'], KEYWORDS['is'], KEYWORDS['and'], KEYWORDS['or'],
46
- KEYWORDS['not'], KEYWORDS['False'], KEYWORDS['None'], KEYWORDS['True'], KEYWORDS['class'], KEYWORDS['false'],
47
- KEYWORDS['func'], KEYWORDS['function'], KEYWORDS['global'], KEYWORDS['none'], KEYWORDS['true']
48
- ]).__contains__
44
+ is_constant_keywords = frozenset(CONSTANT_KEYWORDS).__contains__
49
45
 
50
- is_private_attribute = lambda name : name.startswith('_')
51
- is_public_attribute = lambda name : not name.startswith('_')
46
+ is_private_attribute = lambda name : name.startswith('_') if isinstance(name, str) else name
47
+ is_public_attribute = lambda name : not name.startswith('_') if isinstance(name, str) else name
@@ -8,10 +8,10 @@ LIBRARIES_PATH = join(PYSCRIPT_PATH, 'lib')
8
8
  SITE_PACKAGES_PATH = join(PYSCRIPT_PATH, 'site-packages')
9
9
 
10
10
  # environment variables
11
- PYSCRIPT_TYPECHECKING = 'PYSCRIPT_TYPECHECKING'
12
- PYSCRIPT_EXCEPTHOOK = 'PYSCRIPT_EXCEPTHOOK'
13
- PYSCRIPT_SHELL = 'PYSCRIPT_SHELL'
14
- PYSCRIPT_GIL = 'PYSCRIPT_GIL'
11
+ ENV_PYSCRIPT_NO_EXCEPTHOOK = 'PYSCRIPT_NO_EXCEPTHOOK'
12
+ ENV_PYSCRIPT_NO_GIL = 'PYSCRIPT_NO_GIL'
13
+ ENV_PYSCRIPT_NO_READLINE = 'PYSCRIPT_NO_READLINE'
14
+ ENV_PYSCRIPT_NO_TYPECHECK = 'PYSCRIPT_NO_TYPECHECK'
15
15
 
16
16
  # tokens offset
17
17
  DOUBLE = 2**8
@@ -85,6 +85,7 @@ TOKENS = MappingProxyType({
85
85
  'EQUAL-DOUBLE-LESS-THAN': ord('<') + DOUBLE + WITH_EQUAL,
86
86
  'EQUAL-DOUBLE-GREATER-THAN': ord('>') + DOUBLE + WITH_EQUAL,
87
87
  'NONE': SPECIAL,
88
+ 'EQUAL-ARROW': ord('>') + SPECIAL,
88
89
  'EXCLAMATION-TILDE': ord('~') + SPECIAL
89
90
  })
90
91
 
@@ -133,6 +134,12 @@ KEYWORDS = MappingProxyType({
133
134
  'with': 'with'
134
135
  })
135
136
 
137
+ CONSTANT_KEYWORDS = (
138
+ KEYWORDS['__debug__'], KEYWORDS['False'], KEYWORDS['None'], KEYWORDS['True'], KEYWORDS['and'], KEYWORDS['class'],
139
+ KEYWORDS['extends'], KEYWORDS['func'], KEYWORDS['function'], KEYWORDS['false'], KEYWORDS['global'], KEYWORDS['in'],
140
+ KEYWORDS['is'], KEYWORDS['not'], KEYWORDS['none'], KEYWORDS['of'], KEYWORDS['or'], KEYWORDS['true']
141
+ )
142
+
136
143
  # flags
137
144
  DEFAULT = 0
138
145
  DEBUG = 1 << 0
@@ -24,17 +24,14 @@ class PysTraceback(Pys):
24
24
  context = self.context
25
25
  position = self.position
26
26
 
27
- no_colored = context.flags & NO_COLOR
28
- colored = not no_colored
29
-
30
- if no_colored:
31
- reset = ''
32
- magenta = ''
33
- bmagenta = ''
34
- else:
27
+ if colored := not (context.flags & NO_COLOR):
35
28
  reset = acolor('reset')
36
29
  magenta = acolor('magenta')
37
30
  bmagenta = acolor('magenta', BOLD)
31
+ else:
32
+ reset = ''
33
+ magenta = ''
34
+ bmagenta = ''
38
35
 
39
36
  frames = []
40
37
 
@@ -79,17 +76,15 @@ class PysTraceback(Pys):
79
76
  result += f'{bmagenta}{self.exception.__name__}{reset}'
80
77
  else:
81
78
  message = str(self.exception)
82
- result += (
83
- f'{bmagenta}{type(self.exception).__name__}{reset}' +
84
- (f': {magenta}{message}{reset}' if message else '')
85
- )
79
+ result += f'{bmagenta}{type(self.exception).__name__}{reset}'
80
+ if message:
81
+ result += f': {magenta}{message}{reset}'
86
82
 
87
83
  return (
88
- self.cause.string_traceback() + (
89
- '\n\nThe above exception was the direct cause of the following exception:\n\n'
90
- if self.directly else
91
- '\n\nDuring handling of the above exception, another exception occurred:\n\n'
92
- ) + result
84
+ self.cause.string_traceback() +
85
+ ('\n\nThe above exception was the direct cause of the following exception:\n\n'
86
+ if self.directly else
87
+ '\n\nDuring handling of the above exception, another exception occurred:\n\n') + result
93
88
  if self.cause else
94
89
  result
95
90
  )
@@ -0,0 +1,61 @@
1
+ from .cache import lock
2
+ from .constants import ENV_PYSCRIPT_NO_GIL
3
+ from .objects import PysPythonFunction, PysFunction
4
+
5
+ from os import environ
6
+ from types import MethodType
7
+
8
+ if environ.get(ENV_PYSCRIPT_NO_GIL) is None:
9
+
10
+ def handle_call(object, context, position):
11
+ with lock:
12
+
13
+ if isinstance(object, PysFunction):
14
+ code = object.__code__
15
+ code.call_context = context
16
+ code.position = position
17
+
18
+ elif isinstance(object, PysPythonFunction):
19
+ code = object.__code__
20
+ code.context = context
21
+ code.position = position
22
+
23
+ elif isinstance(object, type):
24
+ method = getattr(object, '__new__', None)
25
+ if method is not None:
26
+ handle_call(method, context, position)
27
+
28
+ method = getattr(object, '__init__', None)
29
+ if method is not None:
30
+ handle_call(method, context, position)
31
+
32
+ elif isinstance(object, MethodType):
33
+ handle_call(object.__func__, context, position)
34
+
35
+ _GIL = True
36
+ else:
37
+
38
+ def handle_call(object, context, position):
39
+ if isinstance(object, PysFunction):
40
+ code = object.__code__
41
+ code.call_context = context
42
+ code.position = position
43
+
44
+ elif isinstance(object, PysPythonFunction):
45
+ code = object.__code__
46
+ code.context = context
47
+ code.position = position
48
+
49
+ elif isinstance(object, type):
50
+ method = getattr(object, '__new__', None)
51
+ if method is not None:
52
+ handle_call(method, context, position)
53
+
54
+ method = getattr(object, '__init__', None)
55
+ if method is not None:
56
+ handle_call(method, context, position)
57
+
58
+ elif isinstance(object, MethodType):
59
+ handle_call(object.__func__, context, position)
60
+
61
+ _GIL = False