rgwfuncs 0.0.84__py3-none-any.whl → 0.0.86__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 +78 -82
- {rgwfuncs-0.0.84.dist-info → rgwfuncs-0.0.86.dist-info}/METADATA +1 -1
- {rgwfuncs-0.0.84.dist-info → rgwfuncs-0.0.86.dist-info}/RECORD +7 -7
- {rgwfuncs-0.0.84.dist-info → rgwfuncs-0.0.86.dist-info}/LICENSE +0 -0
- {rgwfuncs-0.0.84.dist-info → rgwfuncs-0.0.86.dist-info}/WHEEL +0 -0
- {rgwfuncs-0.0.84.dist-info → rgwfuncs-0.0.86.dist-info}/entry_points.txt +0 -0
- {rgwfuncs-0.0.84.dist-info → rgwfuncs-0.0.86.dist-info}/top_level.txt +0 -0
@@ -11,78 +11,22 @@ 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
|
-
|
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 blue-colored output and a prompt in white. An extra blank line is inserted
|
18
|
+
before each new input prompt.
|
19
|
+
|
20
|
+
local_vars: dictionary of local variables to be available in the interactive shell.
|
83
21
|
"""
|
22
|
+
|
23
|
+
# ANSI color escape codes.
|
24
|
+
BLUE = "\033[94m"
|
25
|
+
WHITE = "\033[37m"
|
26
|
+
RESET = "\033[0m"
|
27
|
+
|
28
|
+
# Function to set up readline history.
|
84
29
|
def setup_readline() -> None:
|
85
|
-
"""Set up readline for history persistence."""
|
86
30
|
HISTORY_FILE = os.path.expanduser("~/.rgwfuncs_shell_history")
|
87
31
|
readline.set_history_length(1000)
|
88
32
|
readline.parse_and_bind("tab: complete")
|
@@ -92,31 +36,83 @@ def interactive_shell(local_vars: Dict[str, Any]) -> None:
|
|
92
36
|
except Exception as e:
|
93
37
|
print(f"Warning: Could not load history file: {e}")
|
94
38
|
atexit.register(readline.write_history_file, HISTORY_FILE)
|
95
|
-
|
39
|
+
|
40
|
+
# BlueStdout: wrap stdout so output is printed in blue.
|
41
|
+
class BlueStdout:
|
42
|
+
def __init__(self, wrapped):
|
43
|
+
self.wrapped = wrapped
|
44
|
+
self.at_line_start = True
|
45
|
+
|
46
|
+
def write(self, s):
|
47
|
+
# If s matches our prompt strings, write verbatim.
|
48
|
+
if s == sys.ps1 or s == sys.ps2:
|
49
|
+
self.wrapped.write(s)
|
50
|
+
return
|
51
|
+
# Write each new line in blue.
|
52
|
+
lines = s.split('\n')
|
53
|
+
for i, line in enumerate(lines):
|
54
|
+
if self.at_line_start and line:
|
55
|
+
self.wrapped.write(BLUE + line)
|
56
|
+
else:
|
57
|
+
self.wrapped.write(line)
|
58
|
+
if i < len(lines) - 1:
|
59
|
+
self.wrapped.write('\n' + RESET)
|
60
|
+
self.at_line_start = True
|
61
|
+
else:
|
62
|
+
self.at_line_start = (line == "")
|
63
|
+
|
64
|
+
def flush(self):
|
65
|
+
self.wrapped.flush()
|
66
|
+
|
67
|
+
def isatty(self):
|
68
|
+
return self.wrapped.isatty()
|
69
|
+
|
70
|
+
def fileno(self):
|
71
|
+
return self.wrapped.fileno()
|
72
|
+
|
73
|
+
def __getattr__(self, attr):
|
74
|
+
return getattr(self.wrapped, attr)
|
75
|
+
|
76
|
+
# ColorInteractiveConsole: subclass InteractiveConsole to restore the original
|
77
|
+
# stdout during input, and print an extra blank line before each prompt.
|
78
|
+
class ColorInteractiveConsole(code.InteractiveConsole):
|
79
|
+
def raw_input(self, prompt=""):
|
80
|
+
saved_stdout = sys.stdout
|
81
|
+
sys.stdout = sys.__stdout__
|
82
|
+
try:
|
83
|
+
# Print an extra newline before the prompt.
|
84
|
+
print("")
|
85
|
+
line = input(prompt)
|
86
|
+
except EOFError:
|
87
|
+
raise
|
88
|
+
finally:
|
89
|
+
sys.stdout = saved_stdout
|
90
|
+
return line
|
91
|
+
|
92
|
+
# Validate that local_vars is a dictionary.
|
96
93
|
if not isinstance(local_vars, dict):
|
97
94
|
raise TypeError("local_vars must be a dictionary")
|
98
|
-
|
99
|
-
# Set up readline.
|
95
|
+
|
100
96
|
setup_readline()
|
101
|
-
|
102
|
-
#
|
97
|
+
|
98
|
+
# Merge globals into local_vars.
|
103
99
|
local_vars.update(globals())
|
104
|
-
|
105
|
-
#
|
100
|
+
|
101
|
+
# Wrap ANSI color codes with markers for zero-width in the prompt.
|
106
102
|
sys.ps1 = "\001" + WHITE + "\002" + ">>> " + "\001" + RESET + "\002"
|
107
103
|
sys.ps2 = "\001" + WHITE + "\002" + "... " + "\001" + RESET + "\002"
|
108
|
-
|
109
|
-
#
|
110
|
-
sys.stdout = BlueStdout(sys.__stdout__)
|
111
|
-
|
112
|
-
#
|
104
|
+
|
105
|
+
# Use BlueStdout to wrap the original stdout.
|
106
|
+
sys.stdout = BlueStdout(sys.__stdout__)
|
107
|
+
|
108
|
+
# Create the custom interactive console.
|
113
109
|
console = ColorInteractiveConsole(locals=local_vars)
|
114
|
-
|
110
|
+
|
115
111
|
banner = ("Welcome to the rgwfuncs interactive shell.\n"
|
116
112
|
"Use up/down arrows for command history.\n"
|
117
113
|
"Type 'exit()' or Ctrl+D to quit.")
|
118
114
|
exitmsg = "Goodbye."
|
119
|
-
|
115
|
+
|
120
116
|
try:
|
121
117
|
console.interact(banner=banner)
|
122
118
|
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=rebSWi6L8akWA9LlQXjv9jlG2VoT9B8PqgCB4Oz9hEc,4177
|
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.86.dist-info/LICENSE,sha256=jLvt20gcUZYB8UOvyBvyKQ1qhYYhD__qP7ZDx2lPFkU,1062
|
8
|
+
rgwfuncs-0.0.86.dist-info/METADATA,sha256=pY5udapgOBioWgi1uxLFdPyGIxj9q9BRioqVxZzLYlI,60288
|
9
|
+
rgwfuncs-0.0.86.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
10
|
+
rgwfuncs-0.0.86.dist-info/entry_points.txt,sha256=j-c5IOPIQ0252EaOV6j6STio56sbXl2C4ym_fQ0lXx0,43
|
11
|
+
rgwfuncs-0.0.86.dist-info/top_level.txt,sha256=aGuVIzWsKiV1f2gCb6mynx0zx5ma0B1EwPGFKVEMTi4,9
|
12
|
+
rgwfuncs-0.0.86.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|