-
-
Notifications
You must be signed in to change notification settings - Fork 0
console
This class includes methods for logging and other actions within the console.
A class property can be accessed with Console.<property name>.
w the current console width in text characters (if there's no console it returns the default console width 80)
h the current console height in lines (if there's no console it returns the default console height 24)
wh a tuple with the console size as (columns, lines) (if there's no console it returns the default console size (80, 24))
usr the current username
This method is used to get the command arguments, for if the current file is run via the console as a command.
Params:
-
find_args: dicta dictionary that specifies where you are looking for which arguments and under which alias they should be returned -
allow_spaces: bool = Falsewhether to take spaces as separator of arg values or as part of an arg value
Returns: an Args object, with the specified aliases and two attributes per alias:
-
existsisTrueif one of the listed arguments is found andFalseotherwise -
Either
valueorvalues:-
valuethe argument value as a string (Noneif no value was provided) — only for regular flagged arguments -
valuesa list of string values ([]if no arguments were found) — only for positional"before"/"after"arguments
-
Note
Argument values are always returned as strings.
If you need to convert them to other types (like int, float, bool, etc.), you must do so explicitly.
The find_args parameter is a dictionary, where the keys specify under which alias the argument will be returned.
The value of a key is one of the following options:
- the literal
"before"which looks for all non-flagged arguments before the first flagged argument (can only be used once) - the literal
"after"which looks for all non-flagged arguments after the value of the last flagged argument (can only be used once) - a list of strings, which are the arg flags to look for (e.g.
["-f", "--file"]) - a dictionary with the following keys:
-
flags(list[str]) the arg flags to look for (e.g.["-f", "--file"]) -
default(Any) the default value of the argument if it is not found
-
Example:
If we want to be able to:
- pass multiple filepaths without a flag
- specify a config file
- specify a number
- activate debugging mode
- show program help
...the find_args could look like this:
ARGS = Console.get_args({
"files": "before",
"config": ["-c", "--config"],
"number": {
"flags": ["-n", "--numbers"],
"default": 0,
},
"debug": ["-d", "--debug"],
"help": ["-h", "--help"],
})The script containing this function could then be executed via the command line like this:
python script.py "/path/to/file1" "/path/to/file2" -c "config.json" --debug...and therefore the method would return:
Args(
# FOUND TWO ARGUMENTS BEFORE THE FIRST FLAG
files=ArgResult(exists=True, values=["/path/to/file1", "/path/to/file2"]),
# FOUND ONE OF THE SPECIFIED FLAGS WITH A FOLLOWING VALUE
config=ArgResult(exists=True, value="config.json"),
# DIDN'T FIND ANY OF THE SPECIFIED FLAGS AND USES DEFAULT VALUE
number=ArgResult(exists=False, value=0),
# FOUND ONE OF THE SPECIFIED FLAGS BUT NO FOLLOWING VALUE
debug=ArgResult(exists=True, value=None),
# DIDN'T FIND ANY OF THE SPECIFIED FLAGS AND HAS NO DEFAULT VALUE
help=ArgResult(exists=False, value=None),
)So if we here would want to check the config arg's value, we can access it like this:
ARGS.config.valueThis is the object that stores found command arguments under their aliases with their results.
The Args object also has some helpful methods:
-
len(ARGS)returns the number of args (aliases) stored in the object -
ARGS.dict()returns the stored args as a dictionary -
ARGS.keys()returns the aliases of the stored args asdict_keys([...]) -
ARGS.values()returns the results of the stored args asdict_values([...]) -
ARGS.items()returns the aliases and results of the stored args asdict_items([...])
Will print a prompt and then pause and/or exit the program.
Params:
-
prompt: object = ""the prompt to print before pausing and/or exiting the program -
pause: bool = Truewhether to pause the program at the message or not -
exit: bool = Falsewhether to exit the program after the message was printed (and the program was unpaused ifpauseis true) or not -
exit_code: int = 0the exit code to use ifexitis true -
reset_ansi: bool = Falsewhether to reset the ANSI formatting after thepromptwas printed
Returns: no return value
Will clear the console in addition to completely resetting the ANSI formats.
Params: no parameters
Returns: no return value
Will print a nicely formatted log message.
The log message supports special formatting codes. For more detailed information about formatting codes, see the format_codes documentation.
Params:
-
title: Optional[str] = Nonethe title of the log message -
prompt: object = ""the prompt to print before the log message -
format_linebreaks: bool = Truewhether to format (indent after) the line breaks or not -
start: str = ""the string to print before the log message -
end: str = "\n"the string to print after the log message (default\n) -
title_bg_color: Optional[Hexa | Rgba] = Nonethe background color of the title -
default_color: Optional[Hexa | Rgba] = Nonethe default color of the log message -
tab_size: int = 8the number of spaces used for the tab, after thetitleand for formatting line breaks -
title_px: int = 1the number of spaces put on the left and right side of thetitle, inside the title background (horizontal padding) -
title_mx: int = 2the number of spaces put on the left and right side of thetitle, outside the title background (horizontal margin)
Returns: no return value
These methods are all presets for the Console.log() method, with the options to pause at the message and exit the program after the message was printed. That means, they have the same params as the Console.log() method, with the two additional ones.
Additional Params:
-
active: boolwhether to print the prompt or not, to easily enable/disable debug logs (only for thedebug()preset) -
pause: boolwhether to pause the program at the prompt or not (different default depending on the log preset) -
exit: boolwhether to exit the program after the prompt was printed (and the program was unpaused ifpauseis true) or not (different default depending on the log preset) -
exit_code: intthe exit code (0or1) to use ifexitis true (different default depending on the log preset) -
reset_ansi: boolwhether to reset the ANSI codes after the prompt was printed (different default depending on the log preset)
Returns: no return value
Will print a box with a colored background, containing a formatted log message.
The *values can be formatted with special formatting codes.
For more detailed information about formatting codes, see the format_codes documentation.
Params:
-
*values: objectthe box content (each value is on a new line) -
start: str = ""the string to print before the log box is printed -
end: str = "\n"the string to print after the log box is printed -
box_bg_color: str | Rgba | Hexa = "green"the background color of the box -
default_color: Optional[Rgba | Hexa] = "#000"the default color of the*values -
w_padding: int = 2the horizontal padding (in chars) to the box content -
w_full: bool = Falsewhether to make the box be the full console width or not
Returns: no return value
Will print a bordered box that can be split with horizontal rules and contains a formatted log message.
The *values can be formatted with special formatting codes.
For more detailed information about formatting codes, see the format_codes documentation.
Params:
-
*values: objectthe box content (each value is on a new line) -
start: str = ""the string to print before -
end: str = "\n"the string to print after -
border_type: Literal["standard", "rounded", "strong", "double"] = "rounded"one of the predefined border character sets -
border_style: str | Rgba | Hexa = f"dim|{COLOR.GRAY}"the style of the border (special formatting codes) -
default_color: Optional[Rgba | Hexa] = "#000"the default color of the*values -
w_padding: int = 2the horizontal padding (in chars) to the box content -
w_full: bool = Falsewhether to make the box be the full console width or not -
indent: int = 0the number of spaces to indent the whole box with -
_border_chars: Optional[tuple[str, ...]] = Nonedefine your own border characters set (overwritesborder_type)
Returns: no return value
If you want to split the box content with horizontal rules, you can do so by putting {hr} inside the *values at the position where you want the horizontal rule to be.
Example:
Console.log_box_bordered(
"Content",
"{hr}",
"More content",
"Another line",
)...would output:
┌──────────────┐
│ Content │
├──────────────┤
│ More content │
│ Another line │
└──────────────┘The border_type can be one of the following predefined border character sets:
(In an actual console the border-line would be connected with no gaps – here it might not be due to rendering limitations.)
-
standarduses the character set('┌', '─', '┐', '│', '┘', '─', '└', '│', '├', '─', '┤')which looks like this:┌──────────────┐ │ Content │ ├──────────────┤ │ More content │ │ Another line │ └──────────────┘
-
roundeduses the character set('╭', '─', '╮', '│', '╯', '─', '╰', '│', '├', '─', '┤')which looks like this:╭──────────────╮ │ Content │ ├──────────────┤ │ More content │ │ Another line │ ╰──────────────╯
-
stronguses the character set('┏', '━', '┓', '┃', '┛', '━', '┗', '┃', '┣', '━', '┫')which looks like this:┏━━━━━━━━━━━━━━┓ ┃ Content ┃ ┣━━━━━━━━━━━━━━┫ ┃ More content ┃ ┃ Another line ┃ ┗━━━━━━━━━━━━━━┛
-
doubleuses the character set('╔', '═', '╗', '║', '╝', '═', '╚', '║', '╠', '═', '╣')which looks like this:╔══════════════╗ ║ Content ║ ╠══════════════╣ ║ More content ║ ║ Another line ║ ╚══════════════╝
You can also define your own border characters set by passing a tuple of 8 strings to the _border_chars parameter.
The characters in the tuple correspond to the following border positions:
- top-left corner
- top border
- top-right corner
- right border
- bottom-right corner
- bottom border
- bottom-left corner
- left border
- left horizontal rule connector
- horizontal rule
- right horizontal rule connector
Example:
For an even better visual understanding, this is what gets output with the character set ('A', 'b', 'C', 'd', 'E', 'f', 'G', 'h', 'I', 'j', 'K'):
AbbbbbbbbbbbbbbC
h Content d
IjjjjjjjjjjjjjjK
h More content d
h Another line d
GffffffffffffffEThis method can be used to ask a yes/no question.
The prompt can be formatted with special formatting codes.
For more detailed information about formatting codes, see the format_codes documentation.
Params:
-
prompt: objectthe input prompt (question) -
start: str = ""the string to print before the question-input -
end: str = ""the string to print after the question-input -
default_color: Optional[Rgba | Hexa] = Nonethe default color of the question -
default_is_yes: bool = Truewhether the default answer is yes or no (if the user continues without entering anything or an unrecognized answer)
Returns:
-
Trueif the user entersYoryesandFalseotherwise - If the user entered nothing:
-
Trueifdefault_is_yesis true -
Falseifdefault_is_yesis false
-
This method allows for user input including linebreaks.
The prompt can be formatted with special formatting codes.
For more detailed information about formatting codes, see the format_codes documentation.
Params:
-
prompt: objectthe input prompt -
start: str = ""the string to print before the input -
end: str = "\n"the string to print after the input -
default_color: Optional[Rgba | Hexa] = Nonethe default color of the input -
show_keybindings: bool = Truewhether to display the special keybindings before the input or not -
input_prefix: str = " ⮡ "the prefix of the first input line -
reset_ansi: bool = Truewhether to reset the ANSI codes after the input or not
Returns: the user's entry as a string, with linebreaks as \n
This method acts like a standard Python input() with the advantage, that you can specify:
- what text characters the user is allowed to type and
- the minimum and/or maximum length of the user's input
- optional mask character (hide user input, e.g. for passwords)
- reset the ANSI formatting codes after the user continues
The prompt can be formatted with special formatting codes.
For more detailed information about formatting codes, see the format_codes documentation.
Params:
-
prompt: objectthe input prompt -
start: str = ""the string to print before the input -
end: str = "\n"the string to print after the input -
default_color: Optional[Rgba | Hexa] = Nonethe default color of the input -
placeholder: Optional[str] = Nonea placeholder text that is shown when the input is empty -
mask_char: Optional[str] = Noneif set, the input will be masked with this character -
min_len: Optional[int] = Nonethe minimum length of the input (required to submit) -
max_len: Optional[int] = Nonethe maximum length of the input (can't write further if reached) -
allowed_chars: str = CHARS.ALLa string of characters that are allowed to be inputted (default allows all characters) -
allow_paste: bool = Truewhether to allow pasting text into the input or not -
validator: Optional[Callable[[str], Optional[str]]] = Nonean optional function that takes the current input as a string and returns a string error message if the input is invalid or nothing (None) if the input is valid -
default_val: Optional[T] = Nonethe default value to return if the input is empty -
output_type: type[T] = strthe type (class) to convert the input to before returning it (will raise an error if conversion fails!)
Returns: the user's entry or the default_val converted to the specified output_type
Raises: ValueError TypeError if the input couldn't be converted to the specified output_type
The validator function is structured the following way:
def my_validator(user_input: str) -> Optional[str]:
...Example:
An E-Mail input with a simple validator function could therefore look like this:
def email_validator(user_input: str) -> Optional[str]:
if not re.match(r"[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}", user_input):
return "Enter a valid E-Mail address (example@domain.com)"
user_input = Console.input(
prompt="E-Mail: ",
placeholder="example@domain.com",
validator=email_validator,
)This class can be used to easily display a nice progress bar in the console.
ProgressBar(
min_width: int = 10,
max_width: int = 50,
bar_format: str = "{l} |{b}| [b]({c})/{t} [dim](([i]({p}%)))",
limited_bar_format: str = "|{b}|",
chars: tuple[str, ...] = ("█", "▉", "▊", "▋", "▌", "▍", "▎", "▏", " ")
)The methods of the ProgressBar instance can be used to show, update and hide a progress bar in the console.
There's also an option to use the ProgressBar instance as a context manager, which has a few advantages, such as auto hiding the progress bar when exiting the context.
This method can be used to update the min_width and/or the max_width.
Params:
-
min_width: Optional[int] = Nonethe new minimum width (greater or equal to1) of the progress bar (orNoneto not change it) -
max_width: Optional[int] = Nonethe new maximum width (greater or equal tomin_width) of the progress bar (orNoneto not change it)
Returns: no return value
This method can be used to update the bar_format and/or the limited_bar_format.
The bar_format and limited_bar_format can additionally be formatted with special formatting codes.
For more detailed information about formatting codes, see the format_codes documentation.
Params:
-
bar_format: Optional[str] = Nonethe new format of the progress bar (orNoneto not change it) -
limited_bar_format: Optional[str] = Nonethe new format of the progress bar, used when the console width is too small for the normalbar_format(orNoneto not change it)
Returns: no return value
The bar_format and limited_bar_format strings can contain the following placeholders:
-
{bar}{b}the progress bar itself -
{current}{c}the current progress value -
{total}{t}the total progress value -
{percent}{p}the current progress in percent -
{label}{l}the optional label
This method can be used to update the chars used to display the progress bar.
Param: chars: tuple[str, ...] a tuple of characters ordered from full to empty progress
Returns: no return value
The chars tuple must contain at least two characters:
- the first character represents completely filled sections
- intermediate characters create smooth transitions
- the last character represents empty sections
Example:
ProgressBar.set_chars(("█", "▓", "▒", "░", " "))This method can be used to show or update the progress bar.
Params:
-
current: intthe current progress value (below0or greater thantotalhides the bar) -
total: intthe total progress value (must be greater than0) -
label: Optional[str] = Nonean optional label which is inserted at the{label}or{l}placeholder
Returns: no return value
This method can be used to hide the progress bar.
Params: no parameters
Returns: no return value
This method can be used to use the ProgressBar instance as a context manager.
Params:
-
total: intthe total progress value (must be greater than0) -
label: Optional[str] = Nonean optional label which is inserted at the{label}or{l}placeholder
Returns: a context manager which yields a method to update the progress and/or the label
The ProgressBar instance can be used as a context manager which yields a method to update the progress and/or the label, within the context.
It will also automatically hide the progress bar when exiting the context, even if an error occurs within the context.
Example:
with ProgressBar().progress_context(500, "Loading...") as update_progress:
update_progress(0) # Show empty bar at start
for i in range(400):
# Do some work...
update_progress(i) # Update progress
update_progress(label="Finalizing...") # Update label
for i in range(400, 500):
# Do some work...
update_progress(i, f"Finalizing ({i})") # Update both★⠀Python Library by XulbuX⠀★
-
Intended Audience:
- Developers
-
License:
- OSI Approved
- MIT License
-
Operating Systems:
- Full Library: OS Independent
-
Supported Python Versions:
- Python 3.13
- Python 3.12
- Python 3.11
- Python 3.10
-
Topics:
- Libraries
- Python Modules
- Software Development