rgwfuncs 0.0.84__py3-none-any.whl → 0.0.85__py3-none-any.whl
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.
- rgwfuncs/interactive_shell_lib.py +77 -82
- {rgwfuncs-0.0.84.dist-info → rgwfuncs-0.0.85.dist-info}/METADATA +1 -1
- {rgwfuncs-0.0.84.dist-info → rgwfuncs-0.0.85.dist-info}/RECORD +7 -7
- {rgwfuncs-0.0.84.dist-info → rgwfuncs-0.0.85.dist-info}/LICENSE +0 -0
- {rgwfuncs-0.0.84.dist-info → rgwfuncs-0.0.85.dist-info}/WHEEL +0 -0
- {rgwfuncs-0.0.84.dist-info → rgwfuncs-0.0.85.dist-info}/entry_points.txt +0 -0
- {rgwfuncs-0.0.84.dist-info → rgwfuncs-0.0.85.dist-info}/top_level.txt +0 -0
@@ -11,78 +11,21 @@ from .algebra_lib import * # noqa: F401, F403, E402
|
|
11
11
|
from .str_lib import * # noqa: F401, F403, E402
|
12
12
|
from .docs_lib import * # noqa: F401, F403, E402
|
13
13
|
|
14
|
-
# ANSI color escape codes
|
15
|
-
BLUE = "\033[34m"
|
16
|
-
WHITE = "\033[37m"
|
17
|
-
RESET = "\033[0m"
|
18
|
-
|
19
|
-
class BlueStdout:
|
20
|
-
"""
|
21
|
-
A wrapper for sys.stdout that automatically prepends blue
|
22
|
-
color codes on output.
|
23
|
-
"""
|
24
|
-
def __init__(self, wrapped):
|
25
|
-
self.wrapped = wrapped
|
26
|
-
self.at_line_start = True
|
27
|
-
|
28
|
-
def write(self, s):
|
29
|
-
# Do not interfere with prompt strings.
|
30
|
-
if s == sys.ps1 or s == sys.ps2:
|
31
|
-
self.wrapped.write(s)
|
32
|
-
return
|
33
|
-
|
34
|
-
# Process text line by line so that new lines are colored.
|
35
|
-
lines = s.split('\n')
|
36
|
-
for i, line in enumerate(lines):
|
37
|
-
if self.at_line_start and line:
|
38
|
-
self.wrapped.write(BLUE + line)
|
39
|
-
else:
|
40
|
-
self.wrapped.write(line)
|
41
|
-
if i < len(lines) - 1:
|
42
|
-
self.wrapped.write('\n' + RESET)
|
43
|
-
self.at_line_start = True
|
44
|
-
else:
|
45
|
-
self.at_line_start = (line == "")
|
46
|
-
|
47
|
-
def flush(self):
|
48
|
-
self.wrapped.flush()
|
49
|
-
|
50
|
-
def isatty(self):
|
51
|
-
return self.wrapped.isatty()
|
52
|
-
|
53
|
-
def fileno(self):
|
54
|
-
return self.wrapped.fileno()
|
55
|
-
|
56
|
-
def __getattr__(self, attr):
|
57
|
-
# Delegate attribute access to the original stdout.
|
58
|
-
return getattr(self.wrapped, attr)
|
59
|
-
|
60
|
-
class ColorInteractiveConsole(code.InteractiveConsole):
|
61
|
-
"""Subclass InteractiveConsole to temporarily restore the real stdout when reading input."""
|
62
|
-
def raw_input(self, prompt=""):
|
63
|
-
# Before calling input(), restore the original stdout so that readline works properly.
|
64
|
-
saved_stdout = sys.stdout
|
65
|
-
sys.stdout = sys.__stdout__
|
66
|
-
try:
|
67
|
-
line = input(prompt)
|
68
|
-
except EOFError:
|
69
|
-
raise
|
70
|
-
finally:
|
71
|
-
# Restore our blue-printing stdout.
|
72
|
-
sys.stdout = saved_stdout
|
73
|
-
return line
|
74
|
-
|
75
14
|
def interactive_shell(local_vars: Dict[str, Any]) -> None:
|
76
15
|
"""
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
Parameters:
|
82
|
-
local_vars (dict): Dictionary of local variables to be available in the interactive shell.
|
16
|
+
Launch an interactive prompt for inspecting and modifying local variables,
|
17
|
+
with a custom blue output and white prompt. All helper definitions are nested within.
|
18
|
+
|
19
|
+
local_vars: dictionary with local variables to be available in the interactive shell.
|
83
20
|
"""
|
21
|
+
|
22
|
+
# ANSI color escape codes.
|
23
|
+
BLUE = "\033[94m"
|
24
|
+
WHITE = "\033[37m"
|
25
|
+
RESET = "\033[0m"
|
26
|
+
|
27
|
+
# Helper: setup readline for history persistence.
|
84
28
|
def setup_readline() -> None:
|
85
|
-
"""Set up readline for history persistence."""
|
86
29
|
HISTORY_FILE = os.path.expanduser("~/.rgwfuncs_shell_history")
|
87
30
|
readline.set_history_length(1000)
|
88
31
|
readline.parse_and_bind("tab: complete")
|
@@ -92,31 +35,83 @@ def interactive_shell(local_vars: Dict[str, Any]) -> None:
|
|
92
35
|
except Exception as e:
|
93
36
|
print(f"Warning: Could not load history file: {e}")
|
94
37
|
atexit.register(readline.write_history_file, HISTORY_FILE)
|
95
|
-
|
38
|
+
|
39
|
+
# Nested BlueStdout: a wrapper for sys.stdout that prepends blue color on output.
|
40
|
+
class BlueStdout:
|
41
|
+
def __init__(self, wrapped):
|
42
|
+
self.wrapped = wrapped
|
43
|
+
self.at_line_start = True
|
44
|
+
|
45
|
+
def write(self, s):
|
46
|
+
# Do not interfere with the prompt strings.
|
47
|
+
if s == sys.ps1 or s == sys.ps2:
|
48
|
+
self.wrapped.write(s)
|
49
|
+
return
|
50
|
+
# Process output line by line.
|
51
|
+
lines = s.split('\n')
|
52
|
+
for i, line in enumerate(lines):
|
53
|
+
if self.at_line_start and line:
|
54
|
+
self.wrapped.write(BLUE + line)
|
55
|
+
else:
|
56
|
+
self.wrapped.write(line)
|
57
|
+
if i < len(lines) - 1:
|
58
|
+
self.wrapped.write('\n' + RESET)
|
59
|
+
self.at_line_start = True
|
60
|
+
else:
|
61
|
+
self.at_line_start = (line == "")
|
62
|
+
|
63
|
+
def flush(self):
|
64
|
+
self.wrapped.flush()
|
65
|
+
|
66
|
+
def isatty(self):
|
67
|
+
return self.wrapped.isatty()
|
68
|
+
|
69
|
+
def fileno(self):
|
70
|
+
return self.wrapped.fileno()
|
71
|
+
|
72
|
+
def __getattr__(self, attr):
|
73
|
+
return getattr(self.wrapped, attr)
|
74
|
+
|
75
|
+
# Nested ColorInteractiveConsole: a subclass of InteractiveConsole that temporarily
|
76
|
+
# restores the original stdout when reading input so that readline functions properly.
|
77
|
+
class ColorInteractiveConsole(code.InteractiveConsole):
|
78
|
+
def raw_input(self, prompt=""):
|
79
|
+
saved_stdout = sys.stdout
|
80
|
+
sys.stdout = sys.__stdout__
|
81
|
+
try:
|
82
|
+
line = input(prompt)
|
83
|
+
except EOFError:
|
84
|
+
raise
|
85
|
+
finally:
|
86
|
+
sys.stdout = saved_stdout
|
87
|
+
return line
|
88
|
+
|
89
|
+
# Ensure that the passed local_vars is a dictionary.
|
96
90
|
if not isinstance(local_vars, dict):
|
97
91
|
raise TypeError("local_vars must be a dictionary")
|
98
|
-
|
99
|
-
#
|
92
|
+
|
93
|
+
# Setup readline.
|
100
94
|
setup_readline()
|
101
|
-
|
102
|
-
# Make imported functions available in the REPL.
|
95
|
+
|
96
|
+
# Make imported functions available in the REPL by merging globals.
|
103
97
|
local_vars.update(globals())
|
104
|
-
|
105
|
-
#
|
98
|
+
|
99
|
+
# Wrap ANSI escape sequences in markers recognized by readline so that they do not count
|
100
|
+
# toward the visible prompt length.
|
106
101
|
sys.ps1 = "\001" + WHITE + "\002" + ">>> " + "\001" + RESET + "\002"
|
107
102
|
sys.ps2 = "\001" + WHITE + "\002" + "... " + "\001" + RESET + "\002"
|
108
|
-
|
109
|
-
#
|
110
|
-
sys.stdout = BlueStdout(sys.__stdout__)
|
111
|
-
|
112
|
-
#
|
103
|
+
|
104
|
+
# Replace sys.stdout with our blue-printing wrapper.
|
105
|
+
sys.stdout = BlueStdout(sys.__stdout__)
|
106
|
+
|
107
|
+
# Instantiate our custom interactive console.
|
113
108
|
console = ColorInteractiveConsole(locals=local_vars)
|
114
|
-
|
109
|
+
|
115
110
|
banner = ("Welcome to the rgwfuncs interactive shell.\n"
|
116
111
|
"Use up/down arrows for command history.\n"
|
117
112
|
"Type 'exit()' or Ctrl+D to quit.")
|
118
113
|
exitmsg = "Goodbye."
|
119
|
-
|
114
|
+
|
120
115
|
try:
|
121
116
|
console.interact(banner=banner)
|
122
117
|
finally:
|
@@ -2,11 +2,11 @@ rgwfuncs/__init__.py,sha256=LSn54Tlyskcb6Wab_wUpPLB6UGMe5LdrB3GU88mDEbU,1712
|
|
2
2
|
rgwfuncs/algebra_lib.py,sha256=rKFITfpWfgdBswnbMUuS41XgndEt-jUVz2ObO_ik7eM,42234
|
3
3
|
rgwfuncs/df_lib.py,sha256=r6T-MwyDq9NAPW1Xf6NzSy7ZFicIKdemR-UKu6TZt5g,71111
|
4
4
|
rgwfuncs/docs_lib.py,sha256=y3wSAOPO3qsA4HZ7xAtW8HimM8w-c8hjcEzMRLJ96ao,1960
|
5
|
-
rgwfuncs/interactive_shell_lib.py,sha256=
|
5
|
+
rgwfuncs/interactive_shell_lib.py,sha256=zM4WrG425WK3MsPOfSgxvJxRJsUV177IYrSGvE-uAQE,4254
|
6
6
|
rgwfuncs/str_lib.py,sha256=rtAdRlnSJIu3JhI-tA_A0wCiPK2m-zn5RoGpBxv_g-4,2228
|
7
|
-
rgwfuncs-0.0.
|
8
|
-
rgwfuncs-0.0.
|
9
|
-
rgwfuncs-0.0.
|
10
|
-
rgwfuncs-0.0.
|
11
|
-
rgwfuncs-0.0.
|
12
|
-
rgwfuncs-0.0.
|
7
|
+
rgwfuncs-0.0.85.dist-info/LICENSE,sha256=jLvt20gcUZYB8UOvyBvyKQ1qhYYhD__qP7ZDx2lPFkU,1062
|
8
|
+
rgwfuncs-0.0.85.dist-info/METADATA,sha256=28YYKElMTP4Fm5TnxB8iU2F088nrhzQEg8YhM1XaoI4,60288
|
9
|
+
rgwfuncs-0.0.85.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
10
|
+
rgwfuncs-0.0.85.dist-info/entry_points.txt,sha256=j-c5IOPIQ0252EaOV6j6STio56sbXl2C4ym_fQ0lXx0,43
|
11
|
+
rgwfuncs-0.0.85.dist-info/top_level.txt,sha256=aGuVIzWsKiV1f2gCb6mynx0zx5ma0B1EwPGFKVEMTi4,9
|
12
|
+
rgwfuncs-0.0.85.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|