From 740a07cdfa6e824a9b19188505921753efbbfbd7 Mon Sep 17 00:00:00 2001 From: kazisean Date: Mon, 3 Nov 2025 14:17:31 -0500 Subject: [PATCH 01/14] added sample hello world --- pytermai/main.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 pytermai/main.py diff --git a/pytermai/main.py b/pytermai/main.py new file mode 100644 index 0000000..972ad06 --- /dev/null +++ b/pytermai/main.py @@ -0,0 +1,9 @@ +from openai import OpenAI +client = OpenAI(api_key="...") +stream = client.chat.completions.create( + model="gpt-4", + messages=[{"role": "user", "content": "hello world"}], + stream=True, +) +for part in stream: + print(part.choices[0].delta.content or "") \ No newline at end of file From 61aefd3450b009ec81bef2ba9924a804cf0d8f03 Mon Sep 17 00:00:00 2001 From: kazisean Date: Mon, 3 Nov 2025 14:57:45 -0500 Subject: [PATCH 02/14] added bloomberg as ascii --- bloomsays/bloomberg/black.txt | 76 +++++++++++++++++++++++++++++++++ bloomsays/bloomberg/color.txt | 80 +++++++++++++++++++++++++++++++++++ bloomsays/main.py | 0 pytermai/main.py | 9 ---- 4 files changed, 156 insertions(+), 9 deletions(-) create mode 100644 bloomsays/bloomberg/black.txt create mode 100644 bloomsays/bloomberg/color.txt create mode 100644 bloomsays/main.py delete mode 100644 pytermai/main.py diff --git a/bloomsays/bloomberg/black.txt b/bloomsays/bloomberg/black.txt new file mode 100644 index 0000000..ed1b18c --- /dev/null +++ b/bloomsays/bloomberg/black.txt @@ -0,0 +1,76 @@ + . .,. . . + .,,,,,,,,*****///**,/,,. + .,,,,,**,**//*/*,*,,,,**/**/*//****,,,, + ,,,,,,,****,,,,,,,,,,****,*//*,,*/(///*****,*, + ..,,,,,,,,*,.,,,,,.,,,,,,......,,*,,,,,,**,,,,/(****,*,,. .. . + ,,,,,,,..,,,....,,,...,.,,,,,,,,***,,,,,,,,,,**,,..,,***,,,,,,,,,..... + ,,,,**,,..,,...,,,,,,,,*******,,,,,******/*/*/***,,,.,......,,,.,,,,,...... + .,,,,,.,...,,,,,,*******/*/*//*************////*////(((///*,,,...........,,.,... + ,,,,,........,,**//////(/////(//////////(((/((((((((((((((((((//*,...........,,,,.... + ,,,...... ...,,***////(((((((((((((((((((((((((#########((((((((((((//**,.. .....,,,. + ,.......... ..,,*////(((((((((((((##############################((((((((((///*.. ............ + .*....... .....,***///(((((((((((#####################################(#(((((((////,. ........ + ......... ...,,**//((((((((###############################################((((((((//*,. ....... + ......... ..,**//(((((((((###################################%%%#############((((((///,.. .. ... + ... .. ....*///(((((((((#################%####%%%%#######%%#%###%%%###########((((((((/*. .... + ,.... ......,*//((((((((#################%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%########(((((((((/,.. . .... + ..... .... ..,*//((((((((((####################%%%%%%%%%%%%%#%%%%%%%%%%%%##%#######((((((((//,.... ...... + ........ ....,*//(((((((((###############%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#########((((((((/,........... + ...........,*///((((((((((#########%%%%%%%%%%%#%%%%%%%%%%%%##%#%%%%%%%%%%%%%##########((((((/*...... .... + ...........,,*/(/((((((((((###########%%%%%%%%#%%%%%%%%%%%%%%%%%%%%%###################((((((/*,..... .... + ..........,,*/(((((((((((((#########%%%##%%%%%%%%%%%%%%%%%%%%%%%%%%###%%##%##############((((//,........... + ............,,*//(((((((((((############%##%##%%%%%%%%%%%%%%%%%%%%%%%######################(((((/,...... ..... + ............,,*//(((((((((##################%####%%%%%%%%%%%%%%%%%%%##%%###################(((((/,,........... + ..... ........,*/(((((((((################%##########%%%%%%%%%%%%%%%%%%%%#%%%###############(((((/*,,.... ... . + ... ........,,*//((((((((((###############%%%#####%%%%%%%%%%%%%%%%%%%%%%%%%%%%#############(((((//,.,......... + ... . ......,*///((((((((##############%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%##############((((((/*,.. ....... + .. . ......,*////((((((##################%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%###############((((((*,.. ...... + ... . .......,*//(((((((########################%%%%%%%%%%%%%%%%%%%############((((///((###((((((/,. .. ...., + ... . ...*///(((((((#((((/////////(((((((########%%%%%%%%#########(////****////***//(((((((((/,. ....... + ,... ...,*///(((((((/******,,,,,.,,,,,**///((###############(((//**,,,,,....,,*,,****/(/((/(((*.. ...... + ... ....,/(//////***********,,,,,,,,,..,,**//((((########(((///**,,*,,***////***////*,,*////((*.. . ...*.. + ,. .. ....*/(((((*,,**/*****,*,***,,,,,,*******///((#######(((///////**,..... ....,,*******///((/... ..*(((((. + .*///*,. .....*/((((//////***.. ....,*.//,//*******///((##%%%###(((///***,//,(*./*,*((,....*///(((((/,....,*/((//(/ + .///(((/*,.....,//(((((/////,,..,,///******/%%#/**(/////((####%%###((////**(##(******(#(/**,,**/(((((((,....,,*(//*//. + (/*,,*////,....*/(((((((///******//(((#((###((((((((((//((####%####(((((///(((((###(#((/////(//((((((((/ ...,*/(((/((, + (/***//((/,....*/(((((((((//((((((((/(/(/////(((((#(((((((###%%####(((((#((((///(((((/(((((((####(##(((/..,//(##((/((, + ((/**/((((*....///((((((#(#((((((((((((((((((((((((((((((((########((((##((((#######((##############((//*,*(####(((((, + ((/*/((#(((,..,*/((((((###########################(#((((((#########((((######(((####################(((/*,*/(###(((#(, + .((//((((((*...*//((((((##########################(#(((((####%%%%###(((####################%#######((((/*,,*/((#(((#/ + .((//(((/**,,.,*//((((((########(#################(((((((#####%%%####(((###########%%#%%%%%%%######((((/**////(##(#(, + ,((/((/**,,*,.*////(((((########################(((((((((###%%%%%#%##(((##########################((((/*,,((/((#((( + *((((/***//,..*//(((((((######################((((((((###%%%%%%%%###(((((######################((((((/,..((/((#(* + .((((/**/*..,,//((((((((###################((((((((((##%%#%%%%%%###(((((####################(((((((//,..*/(##((. + .(/((/*//,..,*//((((((((#################(((((((((((((#########(((((#((##################(##((((((/*,../((((((. + ,((////(*...,*/(((((((((((#############(((((/(//***/((###((((((/..*///###################(((((((//,..,/(##((, + *((((((*...,**//((((((((((#############(((//*,,,,***,/(/////**//*,**(###############((((((((((/*,,...(((((* + //(((*.....*****/////(((((((####((((((////**,,.,*,****,***,/**,,///((((((######(((((((/*****,*,...,((((/ + .//(//,...,,*,,**,***////((#((///***///**,*,*,,/*/**/***//*,*,,,/***//////(((((((((///*///***,,....*((. + *//*. ....,.,,*,**///((((*****,**/****,,,,,,,*******,****,,,*,*/,,****/**/*/////(/**//***,,,....,/. + *,, ......,,,**/*///(/*,.,,,,,,,,,*,,,,,**,*,****,,,*****,,.,,..,*,,,,,*,,,,**///****,,........ + ........,.,*,****/*,,..,,.,...,,,,,,*,****,**,*,,,,***,,,*,*,,,,,,,.,,**,.,,,/**,.,*.,...... + .,........,,,*,***.,.,,......,,,*,******,***/**/////****//**,,,,,,.,,,*,,,,,,.*,,,,,......... + .........,.,.,,,**,.,....,.. ..,,,,,,,,,,,,*****,********,****,....,..,.,,*,.,,,,.......... + ...... .......,,,....,,..,,*////////((((((((((((((((((((///////,...,......,*,........... + ,,...........,..,.**,..**/(((((((/((((((((#((###(((((((((((((((/*,,,,.,..,.,,..... .... + ,*,............,,..,.,**/(/(((((((((((((((((((((((((((((//(((((//,,,,.,.,.,.. .. ... + .//*.... ...........,,,*///////////*******,,******//////(/((/*//,,........... .... + /(#(//*..... ...........,,,**///******,,,.,,,,,,.,,,***////////***,,,........ . ... + *%%(/*,/(/*,.. ..............,***,*//***,,,,,.,,.,,,,***///**//***,,.,..... . . .... + .&%**,,./((((/,..................,,.,,,***,,,*******,,**//****,/**,.,........ .. .... + &&&%,.../((((/**,.. .............., ....,,,*,,****,*,*********,.,,.......... ..,. + %&&&&#*../((((((/,..,....................*,,,,,,,,,,*,,,,*/*,,.,....... .. ... .,/* + *%%&&&&&%*.*(((((((*,,..........................,,,*,*,,,,,,,,,,....... . . ...,((## + .&%&%&%&&&%*,/((((((/**,,,....... .. ......,...,.,,.,,,..,,,,..... . .. . . ...,/(((%&&, + /&%&%&&&%&%&&#/(((((((((*,,,..........................,,,,,........,............,/((((#%&&@, + &&&&&%&%&&%&#&%//((((((((//*,,,,........ .... ..........,,,........ . .......*((((((#%%&&&& + ,%&&&&&&&&&&&&&&&&%(/(((((((///*/***,................. ...,... . .. .........,*/(((((((#%%&&&&&##( + .%&&&&&&&&&@&&&&&&&&&%/(((/((//////////***,......... ........... ...........**/(((((((/(#%%&&&&&@&&&&%* + .&&&%%&&&&&@&&&&&&&&&&&@&&&%//(((((/(////////////***,... .. .. ... . .....,**/(((((((((/./#(&%&@&&%&&&@@&&&&&, + &&&&%&&&&&&%&&&&@&@@&&@#&&#@&%&&#%////(//////((//////////***,,,.... ............,*///(((((((((((/..(#%%&&&&&&&&&&&&&&&@&&&@. + /&&&&&&&&&%&&&&&%&%&&%@%&@%@&&&@&&&&&&&&#//((((((((((//(///(///////***,*,**********((((((((((####(((/. .(#%&&&&@&&&&&&&&&&&&&&&&&&&@. + ,%&&&&&&&@&&&&&&&&&&&@&&@&@@&&@@@@@@&&&&&&&&%#/((((((((((((((((///(////////////////(((((((((((((####(((/,..,(%&&&&%&@&&&&&&&&&&&&@&@&@@@&&*, + *&&&&&@&&@&@@@&@@@@&&@@@@@@@@@@@@@@@@&&@%&@&&&%&&#%(/(((((((((((((((((((((/////////((((((((((((((######(((/*..,/#%&&&@&&&&&&&&&&&&&&&&&&&&&&@@@&&&/, + (&&&@&@@%@@&@@@@@&&@@&&&&@@@@@@@@@&@@&@&%@&&@&%@%&@%@@&%(/((((((((((((((((((((((((((/(((((((((((((########((((*.,*/(#%&&%&@@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&%(. + #&&&@@@@&@@&&@@@@@@@&@@&@@%@&&&@@&@@%@@#@@&@@@@@@@@@@&@&@@@&&#((((##########(((((((((((((((((((((#############(((*,/((((#%&@@@&@@@&&&&&&&&@@&&&&&&&&&&&&&&&&&&&&&&## + .%&&&&@@@@@@@@@@%@@&@@@@@&&@@&@@@&@@#@@&@@@@@@@@@@@@@@@&@&@@@&&@&@&%#((#################(#(((((((##################((//#####%&@@&@&@@@&&&&&&&&@&&@&&&&&&&&&@&&&&&&&&&&&&&&%% diff --git a/bloomsays/bloomberg/color.txt b/bloomsays/bloomberg/color.txt new file mode 100644 index 0000000..9e3c048 --- /dev/null +++ b/bloomsays/bloomberg/color.txt @@ -0,0 +1,80 @@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@&%&@&@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%%%%%%%%#####(((##%(%%&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%%%%%##%%#((#(#%#%%%%##(##(#((####%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%####%%%%%%%%%%#%##%#((#%%#(/(((#####%#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&%%%%%%%%#%&%%%%%&%%%%%%&&&&&&%%#%%%%%%#%%%%%(/####%#%%%@&&@@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%&&%&%&&&&%%%&&&%&%%%%%%%%###%%%%%%%%%%##%%&&%%###%%%%%%%%%&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%##%%&&%%&&&%%%&%%%%#######%%%%%###%##(#(#(###%%%&%&&&&&&%%%&%%%%%&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%%%%%&%&&&%%%%%%#######(#(#((##############(((#((((///(((#%%&&&&&&&&&&&&%%&%%&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%%%%&&&&&&&&&%%##(((((((((((((((((((((((///(//////////////////((#%&&&&&&&&&&&%%%%&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%&&&&&@@&&&&%###((((//////////(/////////////**********////////////((#%%&&@@@&&&&&%%%&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%&&&&&&&&&&@&&%%#((((/////////////******************************//////////(((#&&@@&&&&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&#&&&&&&&@&&&&&%%##(((///////////*************************************/////////((((%&@@@&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&@&@@&&&%%##((/////////**********************************************////////((#%&@@@&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&&@&&%##((//////////**********************************,,*************///////(((%&&@@@@@&@&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&@&&@&&&&#(((//////////*********************,,,,*******,,*,***,,,***********////////(#&@@@@@@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%&&&&@&&&&&&%#((////////******************,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,********/////////(%&&@@@@@@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&@&&&&@&&%#(((//////////*******************,,,,,,,,,,,,,,,,,,,,,,,,,,**,*******////////((%&&&&@&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&@&&&&%#((//////////**************,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*********///////((%&&&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&@&&&&%#(((//////////*********,,,,,,,,,,,*,,,,,,,,,,,,*,,,,,,,,,,,,,,,,*********///////(#&&&&&&@@&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&&&&%%#(((///////////**********,,,,,,,,*,,,,,,,,,,,,,,,,,,,,,*******************//////(#%&&&&&@@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&&&%%#((////////////*********,,,**,,,,,,,,,,,,,,,,,,,,,,,,,,***,,**,**************////((%&&&&&&@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&&&&&%%#((////////////*****************,,,,,,,,,,,,,,,,,,,,,,,,*********************/////(%%&&&&&@&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&&&&&%%#((//////////*****************,****,,,,,,,,,,,,,,,,,,,,*,,*******************/////(%%&&&&&&@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&@&&&&&&&&%#(///////////*//**********************,,,,,,,,,,,,,,,,,,,,*,,,***************/////(#%%&&&&@&&&@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&@@&&&&&&&&%%#((///////////**************,,,*****,,,,,,,,,,,,,,,,,,,,,,,,,,,,*************/////((%%%&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&@&@@&&&&&&%#(((/////////*/************,*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*************///////(#%&&@&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&@&@@@&&&&&&%#((((///////****************,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,***************//////#%&&@@&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&@@@@&&&&&&&%#((/(/////************************,,,,,,,,,,,,,,,,,,,,,**,*******////(((/****//////(%&@&@@&&&&%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%&@@@@@@@@&&#(((((/////*////(((((((((//////*********,,,,,,,,*********/((((####((((###((/////////(%&@&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%&&&@@@@@&&&%#((((((////(######%%%%%%%%%%%##(((//***************///((##%%%%%&%%&%%##%####(/(//(//(%&&@&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&@@@&&&&%((((((((###########%%%%%%%%%&%%%##((////********///(((##%%#%####((((###(((/#%%#((((//#&&@&@&&&#&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%&@&&@@&&&&#(/////#%%##(#######%###%%%%%%#######(((//*******///(((((((##%&&&&&&&&&&%%#######(((//(&&&@@&&(/////&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&((((#%&@@&&&&&#(/(//((((((###&&@&&&&#(&((%((#######(((//***,,***///(((####((%/#&/#%(//%&&&&#(((/////(%&&&&%#(//((/(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&(/(///(#%&&&&&%((/////(((((%%&&%%((/######(,,*/##/(((((//****,,***///(((##/**/#####(/*/((#%%##(///////%&&&&%%#/((#((&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/(#%%#((((%&&&&#((//////(((######((///******//////////((//***,,,,**///*///(/////*****//(((((/(/////////(@&&%%#(///(//%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//###((//(%&&@&#((////////((////////(/(/((((//////*///////***,,*,**////**////(((/////(////**/****/**///(&&%(//**/////%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//(#((////#&&&&(((//////*/*///////////////////**//////////***,,,***////****/********/***************//((#%#*****////*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//(#(//*///%&&%#(//////*****************************//////***,,*,,*////******///********************///(#%#(******/**%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&//((//////#&&&#((//////**************************/*/////****,,,,,***//********************,*******////(#%%#(//**/**(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&//((///(##%%&%#((((/////*******/*****************///////*****,,,****///***********,,*,,,,,,,******////(##((((/**/*/%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%//(//(##%%#%&#(((((/////***********************////////****,,,,,*,**//***************************////(#%%//(//**//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#////(###((%&&#(((//////**********************////////***,,,,,,,,***/////**********************//////(%&&//(//**#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&////(##(#&&%%((////////*******************//////////**,,,,,,,,,***//*//********************///////((%&&(//**//&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&////((((%&%%#((////////*****************////////////***,**,****////*//******************/****////(#%&&(////*/&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%//((((/#&&&%#(///////////*************/////(/((###(//****/***/(&&#((/********************//////((%&&%(/***/#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#//////#&&&%##(((/////////*************///((#%%%%###%(/(((((#(((#%#(/****************/////////(#%%&&&/***/#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(////#&&&&&#####(((((///////****//////((((##%%&%#%####%###%(####(((/**//*******///////(#####%#%&&&%////(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&((/((%&&&%%#%%%#%###((((//*//(((###(((##%#%#%%(#(##((##((#%#%%%(###((((((/////////(((#(((###%%&&&%(//&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(((#&@&&&&%&%%%%##(((////#####%##(####%%%%%%%#######%##(#%%%#%#(%%####(##(#(((((/(##((###%%%&&&&%(&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#%%@&&&&&&%%%##(#(((((#%&%%%%%%%%%#%%%%%##%#%####%%%#####%%&%%&&%#%%%%%#%%%%##(((####%%&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&%&%#%####(#%%&&%%&%&&&%%%%%%%%####%#(##%%%%###%%%#%#%%%%%%%&%%##%&%%%(##%&%#&%&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%&&&&&&&&&%%#%###&%&%%&&&&&&%%%#%##########(##(((((###(((##%%%%%%&%%%%%%%%%%&#%%%%%&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&&%&%&%%%%#%&%&&&&%&&@@&&%%%%%%%%%%%%##############%####%&&&&%&&%&%%#%%%%%%&&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&@&&&&&&&%%%&&&&%%&&%%#((((((((//////////////////////(((((%&&&%&&&&&&%#%&&&&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%&&@&&&&&&&&%&&%&##%&&##(//////////////********//*///*////////(#%%%%%%&&%%%%&&&&&@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#%&&&&&&&&&&&&%%&&%&%##(/(//////////////////////*//////((/////((%%%%&%%%%%&&@@&&@&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%((#&&&&@@&&&&&&&&&&&%%%#(((((((((((########%######((((((((//(#((%%&&&&&&&&&&&@@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(**/((#&&&&&@&&&&&&&&&&&%%%##(((######%%%%%%%%%%&%%%###((((((((###%%%&&&&&&&&@@@&@&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#,,/(#%(((#%&@@@&&&&&&&&&&&&&&%##%%#((###%%%%%&%%&%%%%###(((##((###%%%%&&&&&&&@&@@@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%.,#%%%&(///((%&&&&&&&&&&&&&&&&&&%%&%%%###%%%#######%%##((####%(##%&%&&&&&&&&@&&@@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...,%&&&(////(##%&&@&&&&&&&&&&&&&&%@&&&&%%%#%%####%#%#########%&%%&&&&&&&&&&@@@@&&%&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,....*#&&(/////((%&&%&&&&&&&&&&&&&&&&&&&&#%%%%%%%%%%#%%%%#(#%%&%&&&&&&&@&&@&&&@@&%((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#,,.....,#&#///////#%%&&&&&&&&&&@&&&&&&&&&&&&&%&%%%#%#%%%%%%%%%%&&&&&&&@@&@&@@&&&%//**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%.,.,.,...,#%(//////((#%%%&&&&&&&@&&@&&&&&&%&&&%&%%&%%%&&%%%%&&&&&@&@&&@@&@&@&&&%(///,..%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(...,...,.,..*(////////(#%%%&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%&&&&&&&&%&&&&&&&&&&&&%/////*,.. %@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....,.,..,.*.,((////////((#%%%%&&&&&&&&@&&&&@&&&&&&&&&&%%%&&&&&&&&@@&@&&&&&&&&#//////*,,....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%,................,/(///////(((#(###%&&@&&&&&&&&&&&&&&@&&&%&&&@&@@&&@@&&&&&&&&&%#(///////,,,. ...,*/@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&,......... .........,(///(//((((((((((###%&&&&&&&&&@&&&&&&&&&&&@@@@&&&&&&&&&&&##(///////(**,,..... ....,#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%...,,.... ...... .. . ...,((/////(/((((((((((((###%&&&@@@&&@&&@@@&&&@@&@&&&&&%##(/////////(&(*/.,. . .. ....%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&...........,.... . .. *..* ., .*,((((/((((((//((((((((((###%%%&&&&@&&&&&&&&&&&&%#(((////**/////(&&/*,,.. ............ ... &@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(..... ...,.....,., ., , , .. ........*((//////////((/(((/(((((((###%#%##########//////////*****//(&@&/,,.... .................. &@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%,..... . ..... ... . .. . .. . ...,*(////////////////((((((((((((((((((((/////////////****///(%&&%/,....,. ............ . . ..#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@#..... .. . . . .. .. ,..*,/(/////////////////////(((((((((//////////////******///(%&&%(*,... .......... .......... ..(%@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@/... . . . .. . . .. .. .. ,. . .,/(//////////////////////////(/////////////********////#&%#(/*,. , ............... ...... .....,/&@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@*... . .. . , .. . , * . . ..*///************////////////////////*************///#%(///**,. . ..... .. ..... ... ......... ..**@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@&,.... , .. . . , . . . .,*//*******************///////******************//((*****, . ...... .. ........ ... . .... ...,,@@@@@@@@@@@ diff --git a/bloomsays/main.py b/bloomsays/main.py new file mode 100644 index 0000000..e69de29 diff --git a/pytermai/main.py b/pytermai/main.py deleted file mode 100644 index 972ad06..0000000 --- a/pytermai/main.py +++ /dev/null @@ -1,9 +0,0 @@ -from openai import OpenAI -client = OpenAI(api_key="...") -stream = client.chat.completions.create( - model="gpt-4", - messages=[{"role": "user", "content": "hello world"}], - stream=True, -) -for part in stream: - print(part.choices[0].delta.content or "") \ No newline at end of file From 38e54b90cc1b18c66634e073c579938af2f425c0 Mon Sep 17 00:00:00 2001 From: kazisean Date: Mon, 3 Nov 2025 15:02:45 -0500 Subject: [PATCH 03/14] improved quality ascii --- bloomsays/bloomberg/black.txt | 108 ++++++++++----------------------- bloomsays/bloomberg/color.txt | 110 ++++++++++------------------------ 2 files changed, 62 insertions(+), 156 deletions(-) diff --git a/bloomsays/bloomberg/black.txt b/bloomsays/bloomberg/black.txt index ed1b18c..5267c42 100644 --- a/bloomsays/bloomberg/black.txt +++ b/bloomsays/bloomberg/black.txt @@ -1,76 +1,32 @@ - . .,. . . - .,,,,,,,,*****///**,/,,. - .,,,,,**,**//*/*,*,,,,**/**/*//****,,,, - ,,,,,,,****,,,,,,,,,,****,*//*,,*/(///*****,*, - ..,,,,,,,,*,.,,,,,.,,,,,,......,,*,,,,,,**,,,,/(****,*,,. .. . - ,,,,,,,..,,,....,,,...,.,,,,,,,,***,,,,,,,,,,**,,..,,***,,,,,,,,,..... - ,,,,**,,..,,...,,,,,,,,*******,,,,,******/*/*/***,,,.,......,,,.,,,,,...... - .,,,,,.,...,,,,,,*******/*/*//*************////*////(((///*,,,...........,,.,... - ,,,,,........,,**//////(/////(//////////(((/((((((((((((((((((//*,...........,,,,.... - ,,,...... ...,,***////(((((((((((((((((((((((((#########((((((((((((//**,.. .....,,,. - ,.......... ..,,*////(((((((((((((##############################((((((((((///*.. ............ - .*....... .....,***///(((((((((((#####################################(#(((((((////,. ........ - ......... ...,,**//((((((((###############################################((((((((//*,. ....... - ......... ..,**//(((((((((###################################%%%#############((((((///,.. .. ... - ... .. ....*///(((((((((#################%####%%%%#######%%#%###%%%###########((((((((/*. .... - ,.... ......,*//((((((((#################%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%########(((((((((/,.. . .... - ..... .... ..,*//((((((((((####################%%%%%%%%%%%%%#%%%%%%%%%%%%##%#######((((((((//,.... ...... - ........ ....,*//(((((((((###############%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#########((((((((/,........... - ...........,*///((((((((((#########%%%%%%%%%%%#%%%%%%%%%%%%##%#%%%%%%%%%%%%%##########((((((/*...... .... - ...........,,*/(/((((((((((###########%%%%%%%%#%%%%%%%%%%%%%%%%%%%%%###################((((((/*,..... .... - ..........,,*/(((((((((((((#########%%%##%%%%%%%%%%%%%%%%%%%%%%%%%%###%%##%##############((((//,........... - ............,,*//(((((((((((############%##%##%%%%%%%%%%%%%%%%%%%%%%%######################(((((/,...... ..... - ............,,*//(((((((((##################%####%%%%%%%%%%%%%%%%%%%##%%###################(((((/,,........... - ..... ........,*/(((((((((################%##########%%%%%%%%%%%%%%%%%%%%#%%%###############(((((/*,,.... ... . - ... ........,,*//((((((((((###############%%%#####%%%%%%%%%%%%%%%%%%%%%%%%%%%%#############(((((//,.,......... - ... . ......,*///((((((((##############%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%##############((((((/*,.. ....... - .. . ......,*////((((((##################%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%###############((((((*,.. ...... - ... . .......,*//(((((((########################%%%%%%%%%%%%%%%%%%%############((((///((###((((((/,. .. ...., - ... . ...*///(((((((#((((/////////(((((((########%%%%%%%%#########(////****////***//(((((((((/,. ....... - ,... ...,*///(((((((/******,,,,,.,,,,,**///((###############(((//**,,,,,....,,*,,****/(/((/(((*.. ...... - ... ....,/(//////***********,,,,,,,,,..,,**//((((########(((///**,,*,,***////***////*,,*////((*.. . ...*.. - ,. .. ....*/(((((*,,**/*****,*,***,,,,,,*******///((#######(((///////**,..... ....,,*******///((/... ..*(((((. - .*///*,. .....*/((((//////***.. ....,*.//,//*******///((##%%%###(((///***,//,(*./*,*((,....*///(((((/,....,*/((//(/ - .///(((/*,.....,//(((((/////,,..,,///******/%%#/**(/////((####%%###((////**(##(******(#(/**,,**/(((((((,....,,*(//*//. - (/*,,*////,....*/(((((((///******//(((#((###((((((((((//((####%####(((((///(((((###(#((/////(//((((((((/ ...,*/(((/((, - (/***//((/,....*/(((((((((//((((((((/(/(/////(((((#(((((((###%%####(((((#((((///(((((/(((((((####(##(((/..,//(##((/((, - ((/**/((((*....///((((((#(#((((((((((((((((((((((((((((((((########((((##((((#######((##############((//*,*(####(((((, - ((/*/((#(((,..,*/((((((###########################(#((((((#########((((######(((####################(((/*,*/(###(((#(, - .((//((((((*...*//((((((##########################(#(((((####%%%%###(((####################%#######((((/*,,*/((#(((#/ - .((//(((/**,,.,*//((((((########(#################(((((((#####%%%####(((###########%%#%%%%%%%######((((/**////(##(#(, - ,((/((/**,,*,.*////(((((########################(((((((((###%%%%%#%##(((##########################((((/*,,((/((#((( - *((((/***//,..*//(((((((######################((((((((###%%%%%%%%###(((((######################((((((/,..((/((#(* - .((((/**/*..,,//((((((((###################((((((((((##%%#%%%%%%###(((((####################(((((((//,..*/(##((. - .(/((/*//,..,*//((((((((#################(((((((((((((#########(((((#((##################(##((((((/*,../((((((. - ,((////(*...,*/(((((((((((#############(((((/(//***/((###((((((/..*///###################(((((((//,..,/(##((, - *((((((*...,**//((((((((((#############(((//*,,,,***,/(/////**//*,**(###############((((((((((/*,,...(((((* - //(((*.....*****/////(((((((####((((((////**,,.,*,****,***,/**,,///((((((######(((((((/*****,*,...,((((/ - .//(//,...,,*,,**,***////((#((///***///**,*,*,,/*/**/***//*,*,,,/***//////(((((((((///*///***,,....*((. - *//*. ....,.,,*,**///((((*****,**/****,,,,,,,*******,****,,,*,*/,,****/**/*/////(/**//***,,,....,/. - *,, ......,,,**/*///(/*,.,,,,,,,,,*,,,,,**,*,****,,,*****,,.,,..,*,,,,,*,,,,**///****,,........ - ........,.,*,****/*,,..,,.,...,,,,,,*,****,**,*,,,,***,,,*,*,,,,,,,.,,**,.,,,/**,.,*.,...... - .,........,,,*,***.,.,,......,,,*,******,***/**/////****//**,,,,,,.,,,*,,,,,,.*,,,,,......... - .........,.,.,,,**,.,....,.. ..,,,,,,,,,,,,*****,********,****,....,..,.,,*,.,,,,.......... - ...... .......,,,....,,..,,*////////((((((((((((((((((((///////,...,......,*,........... - ,,...........,..,.**,..**/(((((((/((((((((#((###(((((((((((((((/*,,,,.,..,.,,..... .... - ,*,............,,..,.,**/(/(((((((((((((((((((((((((((((//(((((//,,,,.,.,.,.. .. ... - .//*.... ...........,,,*///////////*******,,******//////(/((/*//,,........... .... - /(#(//*..... ...........,,,**///******,,,.,,,,,,.,,,***////////***,,,........ . ... - *%%(/*,/(/*,.. ..............,***,*//***,,,,,.,,.,,,,***///**//***,,.,..... . . .... - .&%**,,./((((/,..................,,.,,,***,,,*******,,**//****,/**,.,........ .. .... - &&&%,.../((((/**,.. .............., ....,,,*,,****,*,*********,.,,.......... ..,. - %&&&&#*../((((((/,..,....................*,,,,,,,,,,*,,,,*/*,,.,....... .. ... .,/* - *%%&&&&&%*.*(((((((*,,..........................,,,*,*,,,,,,,,,,....... . . ...,((## - .&%&%&%&&&%*,/((((((/**,,,....... .. ......,...,.,,.,,,..,,,,..... . .. . . ...,/(((%&&, - /&%&%&&&%&%&&#/(((((((((*,,,..........................,,,,,........,............,/((((#%&&@, - &&&&&%&%&&%&#&%//((((((((//*,,,,........ .... ..........,,,........ . .......*((((((#%%&&&& - ,%&&&&&&&&&&&&&&&&%(/(((((((///*/***,................. ...,... . .. .........,*/(((((((#%%&&&&&##( - .%&&&&&&&&&@&&&&&&&&&%/(((/((//////////***,......... ........... ...........**/(((((((/(#%%&&&&&@&&&&%* - .&&&%%&&&&&@&&&&&&&&&&&@&&&%//(((((/(////////////***,... .. .. ... . .....,**/(((((((((/./#(&%&@&&%&&&@@&&&&&, - &&&&%&&&&&&%&&&&@&@@&&@#&&#@&%&&#%////(//////((//////////***,,,.... ............,*///(((((((((((/..(#%%&&&&&&&&&&&&&&&@&&&@. - /&&&&&&&&&%&&&&&%&%&&%@%&@%@&&&@&&&&&&&&#//((((((((((//(///(///////***,*,**********((((((((((####(((/. .(#%&&&&@&&&&&&&&&&&&&&&&&&&@. - ,%&&&&&&&@&&&&&&&&&&&@&&@&@@&&@@@@@@&&&&&&&&%#/((((((((((((((((///(////////////////(((((((((((((####(((/,..,(%&&&&%&@&&&&&&&&&&&&@&@&@@@&&*, - *&&&&&@&&@&@@@&@@@@&&@@@@@@@@@@@@@@@@&&@%&@&&&%&&#%(/(((((((((((((((((((((/////////((((((((((((((######(((/*..,/#%&&&@&&&&&&&&&&&&&&&&&&&&&&@@@&&&/, - (&&&@&@@%@@&@@@@@&&@@&&&&@@@@@@@@@&@@&@&%@&&@&%@%&@%@@&%(/((((((((((((((((((((((((((/(((((((((((((########((((*.,*/(#%&&%&@@@&&&&&&&&&&&&&&&&&&&&&&&&&&&&%(. - #&&&@@@@&@@&&@@@@@@@&@@&@@%@&&&@@&@@%@@#@@&@@@@@@@@@@&@&@@@&&#((((##########(((((((((((((((((((((#############(((*,/((((#%&@@@&@@@&&&&&&&&@@&&&&&&&&&&&&&&&&&&&&&&## - .%&&&&@@@@@@@@@@%@@&@@@@@&&@@&@@@&@@#@@&@@@@@@@@@@@@@@@&@&@@@&&@&@&%#((#################(#(((((((##################((//#####%&@@&@&@@@&&&&&&&&@&&@&&&&&&&&&@&&&&&&&&&&&&&&%% +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%%%##(##&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%#%%%%%%%%%#######%@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@%%#%%&%%%###%%####(#%&&&%%%%&&@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@%&&&&&#((///((((////**////(#&&&&&&%@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@&&&&&&%#(////***************////(#@@&&&@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@&&&@&#(///***************,*****///(&@&&&@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@&&&&&#(///********,,,,,,,,,,,****///(&&&&&@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@&&&&%(////*****,*,*,,,,,,,,,,,,****//#&&@&@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@&&&&&%(////*******,,,,,,,,,,********//(&&&&&@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@&@&&&%////**********,,,,,,,,,,******//(%&&&&@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@&@@&&%(///*******,,,,,,,,,,,,,,******//#&@&&@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@&&@@&%(///(#(####(/****,**//(%%%%##(///(&&&@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@&&&&(//%###%##%%###(/***/(((%&&&&%###((&@&//@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@(((#&&(//(#%#(*##,/(/(/***///(**#*/(((///&%#((/@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@/(//&&(//***//*////////****/*****/******/#(**/*@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@/(/(%&(//***/*******//**,,*/*******,,**//##(*/@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@/(#(&(///*********///*,,,,*//*********//%%(*#@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@///&%(//********/////****///*******///(&%//&@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@(/&&##((///**//((#&##%####(//***//(###&#/&@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@(&&&&%#(/(%%###%%%##%##%%%((##(((##%&&&@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@&&&&%##%&%&&%###%##((###%%%%#%%%%%&&&@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@&&&&&&%&%%#//(////////////%&&&#&&&&@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@(%&@&&&&%#((((###%##((((((%&&&&@&%@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@,#%/#&&&&&&&&%##%%#%%%##(#%&&%&&@&@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@..(&//(&&&&&&&&&%%%%#%%(%%&&@&&@%(@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@....,///(%&&&&@&&&&%%%%%&&&&@@@&(/..@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@.......////((#%&&&&&&@&&&@&@&&@%(//*,../@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@............//(((((((##&&@@@@@&&#/////#,,......(@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@%.......... ...*///////(((((((//////*//&(.......... *@@@@@@@@@@@@ +@@@@@@@@@%. ..,..//**///////////****//%/*. ............ .&@@@@@@ \ No newline at end of file diff --git a/bloomsays/bloomberg/color.txt b/bloomsays/bloomberg/color.txt index 9e3c048..a3e6ab3 100644 --- a/bloomsays/bloomberg/color.txt +++ b/bloomsays/bloomberg/color.txt @@ -1,80 +1,30 @@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@&%&@&@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%%%%%%%%#####(((##%(%%&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%%%%%##%%#((#(#%#%%%%##(##(#((####%%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%####%%%%%%%%%%#%##%#((#%%#(/(((#####%#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&%%%%%%%%#%&%%%%%&%%%%%%&&&&&&%%#%%%%%%#%%%%%(/####%#%%%@&&@@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%&&%&%&&&&%%%&&&%&%%%%%%%%###%%%%%%%%%%##%%&&%%###%%%%%%%%%&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%##%%&&%%&&&%%%&%%%%#######%%%%%###%##(#(#(###%%%&%&&&&&&%%%&%%%%%&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%%%%%&%&&&%%%%%%#######(#(#((##############(((#((((///(((#%%&&&&&&&&&&&&%%&%%&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%%%%&&&&&&&&&%%##(((((((((((((((((((((((///(//////////////////((#%&&&&&&&&&&&%%%%&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%&&&&&@@&&&&%###((((//////////(/////////////**********////////////((#%%&&@@@&&&&&%%%&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%&&&&&&&&&&@&&%%#((((/////////////******************************//////////(((#&&@@&&&&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&#&&&&&&&@&&&&&%%##(((///////////*************************************/////////((((%&@@@&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&@&@@&&&%%##((/////////**********************************************////////((#%&@@@&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&&@&&%##((//////////**********************************,,*************///////(((%&&@@@@@&@&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&@&&@&&&&#(((//////////*********************,,,,*******,,*,***,,,***********////////(#&@@@@@@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%&&&&@&&&&&&%#((////////******************,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,********/////////(%&&@@@@@@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&@&&&&@&&%#(((//////////*******************,,,,,,,,,,,,,,,,,,,,,,,,,,**,*******////////((%&&&&@&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&@&&&&%#((//////////**************,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*********///////((%&&&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&@&&&&%#(((//////////*********,,,,,,,,,,,*,,,,,,,,,,,,*,,,,,,,,,,,,,,,,*********///////(#&&&&&&@@&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&&&&%%#(((///////////**********,,,,,,,,*,,,,,,,,,,,,,,,,,,,,,*******************//////(#%&&&&&@@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&&&%%#((////////////*********,,,**,,,,,,,,,,,,,,,,,,,,,,,,,,***,,**,**************////((%&&&&&&@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&&&&&%%#((////////////*****************,,,,,,,,,,,,,,,,,,,,,,,,*********************/////(%%&&&&&@&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&&&&&%%#((//////////*****************,****,,,,,,,,,,,,,,,,,,,,*,,*******************/////(%%&&&&&&@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&@&&&&&&&&%#(///////////*//**********************,,,,,,,,,,,,,,,,,,,,*,,,***************/////(#%%&&&&@&&&@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&@@&&&&&&&&%%#((///////////**************,,,*****,,,,,,,,,,,,,,,,,,,,,,,,,,,,*************/////((%%%&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&@&@@&&&&&&%#(((/////////*/************,*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,*************///////(#%&&@&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&@&@@@&&&&&&%#((((///////****************,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,***************//////#%&&@@&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&@@@@&&&&&&&%#((/(/////************************,,,,,,,,,,,,,,,,,,,,,**,*******////(((/****//////(%&@&@@&&&&%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%&@@@@@@@@&&#(((((/////*////(((((((((//////*********,,,,,,,,*********/((((####((((###((/////////(%&@&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%&&&@@@@@&&&%#((((((////(######%%%%%%%%%%%##(((//***************///((##%%%%%&%%&%%##%####(/(//(//(%&&@&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&@@@&&&&%((((((((###########%%%%%%%%%&%%%##((////********///(((##%%#%####((((###(((/#%%#((((//#&&@&@&&&#&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%&@&&@@&&&&#(/////#%%##(#######%###%%%%%%#######(((//*******///(((((((##%&&&&&&&&&&%%#######(((//(&&&@@&&(/////&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&((((#%&@@&&&&&#(/(//((((((###&&@&&&&#(&((%((#######(((//***,,***///(((####((%/#&/#%(//%&&&&#(((/////(%&&&&%#(//((/(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&(/(///(#%&&&&&%((/////(((((%%&&%%((/######(,,*/##/(((((//****,,***///(((##/**/#####(/*/((#%%##(///////%&&&&%%#/((#((&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/(#%%#((((%&&&&#((//////(((######((///******//////////((//***,,,,**///*///(/////*****//(((((/(/////////(@&&%%#(///(//%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//###((//(%&&@&#((////////((////////(/(/((((//////*///////***,,*,**////**////(((/////(////**/****/**///(&&%(//**/////%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//(#((////#&&&&(((//////*/*///////////////////**//////////***,,,***////****/********/***************//((#%#*****////*#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//(#(//*///%&&%#(//////*****************************//////***,,*,,*////******///********************///(#%#(******/**%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&//((//////#&&&#((//////**************************/*/////****,,,,,***//********************,*******////(#%%#(//**/**(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&//((///(##%%&%#((((/////*******/*****************///////*****,,,****///***********,,*,,,,,,,******////(##((((/**/*/%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%//(//(##%%#%&#(((((/////***********************////////****,,,,,*,**//***************************////(#%%//(//**//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#////(###((%&&#(((//////**********************////////***,,,,,,,,***/////**********************//////(%&&//(//**#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&////(##(#&&%%((////////*******************//////////**,,,,,,,,,***//*//********************///////((%&&(//**//&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&////((((%&%%#((////////*****************////////////***,**,****////*//******************/****////(#%&&(////*/&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%//((((/#&&&%#(///////////*************/////(/((###(//****/***/(&&#((/********************//////((%&&%(/***/#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#//////#&&&%##(((/////////*************///((#%%%%###%(/(((((#(((#%#(/****************/////////(#%%&&&/***/#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(////#&&&&&#####(((((///////****//////((((##%%&%#%####%###%(####(((/**//*******///////(#####%#%&&&%////(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&((/((%&&&%%#%%%#%###((((//*//(((###(((##%#%#%%(#(##((##((#%#%%%(###((((((/////////(((#(((###%%&&&%(//&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(((#&@&&&&%&%%%%##(((////#####%##(####%%%%%%%#######%##(#%%%#%#(%%####(##(#(((((/(##((###%%%&&&&%(&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#%%@&&&&&&%%%##(#(((((#%&%%%%%%%%%#%%%%%##%#%####%%%#####%%&%%&&%#%%%%%#%%%%##(((####%%&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&%&%#%####(#%%&&%%&%&&&%%%%%%%%####%#(##%%%%###%%%#%#%%%%%%%&%%##%&%%%(##%&%#&%&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%&&&&&&&&&%%#%###&%&%%&&&&&&%%%#%##########(##(((((###(((##%%%%%%&%%%%%%%%%%&#%%%%%&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&&%&%&%%%%#%&%&&&&%&&@@&&%%%%%%%%%%%%##############%####%&&&&%&&%&%%#%%%%%%&&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&&@&&&&&&&%%%&&&&%%&&%%#((((((((//////////////////////(((((%&&&%&&&&&&%#%&&&&&&&&&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%&&@&&&&&&&&%&&%&##%&&##(//////////////********//*///*////////(#%%%%%%&&%%%%&&&&&@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#%&&&&&&&&&&&&%%&&%&%##(/(//////////////////////*//////((/////((%%%%&%%%%%&&@@&&@&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%((#&&&&@@&&&&&&&&&&&%%%#(((((((((((########%######((((((((//(#((%%&&&&&&&&&&&@@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(**/((#&&&&&@&&&&&&&&&&&%%%##(((######%%%%%%%%%%&%%%###((((((((###%%%&&&&&&&&@@@&@&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#,,/(#%(((#%&@@@&&&&&&&&&&&&&&%##%%#((###%%%%%&%%&%%%%###(((##((###%%%%&&&&&&&@&@@@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%.,#%%%&(///((%&&&&&&&&&&&&&&&&&&%%&%%%###%%%#######%%##((####%(##%&%&&&&&&&&@&&@@&&&&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...,%&&&(////(##%&&@&&&&&&&&&&&&&&%@&&&&%%%#%%####%#%#########%&%%&&&&&&&&&&@@@@&&%&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@,....*#&&(/////((%&&%&&&&&&&&&&&&&&&&&&&&#%%%%%%%%%%#%%%%#(#%%&%&&&&&&&@&&@&&&@@&%((@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#,,.....,#&#///////#%%&&&&&&&&&&@&&&&&&&&&&&&&%&%%%#%#%%%%%%%%%%&&&&&&&@@&@&@@&&&%//**@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%.,.,.,...,#%(//////((#%%%&&&&&&&@&&@&&&&&&%&&&%&%%&%%%&&%%%%&&&&&@&@&&@@&@&@&&&%(///,..%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(...,...,.,..*(////////(#%%%&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%&&&&&&&&%&&&&&&&&&&&&%/////*,.. %@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....,.,..,.*.,((////////((#%%%%&&&&&&&&@&&&&@&&&&&&&&&&%%%&&&&&&&&@@&@&&&&&&&&#//////*,,....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%,................,/(///////(((#(###%&&@&&&&&&&&&&&&&&@&&&%&&&@&@@&&@@&&&&&&&&&%#(///////,,,. ...,*/@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&,......... .........,(///(//((((((((((###%&&&&&&&&&@&&&&&&&&&&&@@@@&&&&&&&&&&&##(///////(**,,..... ....,#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%...,,.... ...... .. . ...,((/////(/((((((((((((###%&&&@@@&&@&&@@@&&&@@&@&&&&&%##(/////////(&(*/.,. . .. ....%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&...........,.... . .. *..* ., .*,((((/((((((//((((((((((###%%%&&&&@&&&&&&&&&&&&%#(((////**/////(&&/*,,.. ............ ... &@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@(..... ...,.....,., ., , , .. ........*((//////////((/(((/(((((((###%#%##########//////////*****//(&@&/,,.... .................. &@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%,..... . ..... ... . .. . .. . ...,*(////////////////((((((((((((((((((((/////////////****///(%&&%/,....,. ............ . . ..#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@#..... .. . . . .. .. ,..*,/(/////////////////////(((((((((//////////////******///(%&&%(*,... .......... .......... ..(%@@@@@@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@@@@/... . . . .. . . .. .. .. ,. . .,/(//////////////////////////(/////////////********////#&%#(/*,. , ............... ...... .....,/&@@@@@@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@@@@@*... . .. . , .. . , * . . ..*///************////////////////////*************///#%(///**,. . ..... .. ..... ... ......... ..**@@@@@@@@@@@@@@@ -@@@@@@@@@@@@@@@@@&,.... , .. . . , . . . .,*//*******************///////******************//((*****, . ...... .. ........ ... . .... ...,,@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@&%%%##(##&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%#%%%%%%%%%#######%@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@%%#%%&%%%%##%%####(#%&&&%%%%&&@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@%&&&&&#((///((((/////*////(#&&&&&&&@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@&&&&&&%#(/////**************////(#@@&&&@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@&&&@&#(///***************,*****///(&@&&&@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@&&&&&#(////*******,,,,,,,,,,,****///(&&&&&@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@&&&&%((////****,*,*,,,,,,,,,,,,***///#&&@&@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@&&&&&%(/////******,,,,,,,,,,********//(&&&&&@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@&@&&&%//////********,,,,,,,,,,******//(%&&&&@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@&@@&&%((///******,,,,,,,,,,,,,,******//#&@&&@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@&&@@@%(///(#(####(/****,**//(%%%%##(///(&&&@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@&&&&(//%######%%###(/***/(((#&&&&%###((&@&//@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@(((#&&(//(#%#(*##,/(/(/****//(**(**(((///&%#/(/@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@/(//&&(//**///*///*////*,**/*****/******/#(**/*@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@/(/(%&(//***/*******//**,,*********,,**//##(**@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@//#(&#(//*********///*,,,,*//*********//%#(*#@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@///&%(////******/////****///*******///(&%/*&@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@//&&##((///**//((#&##%####(//***//(###&#/&@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@(&&&&%#(/(%%%##%%%##%##%%%((###((##%&&&@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@&&&&&%#%&%&&%%#####((#(#%%%%%%%%%%&&&@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@&&&&&&&&%%#//(///*////////%&&&#&&&&@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@(%&@&&&&%#((((######((((((%&&&&@&%@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@,#%/#&&&&&&&&%##%%#%%%##(#%&&%&&@&@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@..(&//(&&&&&&&&&%%%%#%%(%%&&@&&@%(@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@....,///(%&&&&@&&&&%%%%%&&&&&@@&(/..@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@.......////((#%@&&&&&@&&&@&@&&@%(//,.../@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@............//(((((((##&&@@@@@&&#/////#,, .. ..(@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@%..... .... .*///////(((((((//////*//&(.......... *@@@@@@@@@@@@ +@@@@@@@@@%. .,..//*////////////****//%/*. ........... .&@@@@@@ \ No newline at end of file From 9dbf01c5fc20b590de35640dacc112feed18e552 Mon Sep 17 00:00:00 2001 From: lunasuzuki Date: Tue, 4 Nov 2025 15:32:34 -0500 Subject: [PATCH 04/14] added necessary files --- bloomsays/art.py | 1 + bloomsays/bubble.py | 1 + bloomsays/cli.py | 1 + 3 files changed, 3 insertions(+) create mode 100644 bloomsays/art.py create mode 100644 bloomsays/bubble.py create mode 100644 bloomsays/cli.py diff --git a/bloomsays/art.py b/bloomsays/art.py new file mode 100644 index 0000000..ae6b52a --- /dev/null +++ b/bloomsays/art.py @@ -0,0 +1 @@ +#load beard ASCII \ No newline at end of file diff --git a/bloomsays/bubble.py b/bloomsays/bubble.py new file mode 100644 index 0000000..877c3bb --- /dev/null +++ b/bloomsays/bubble.py @@ -0,0 +1 @@ +#speech bubble code \ No newline at end of file diff --git a/bloomsays/cli.py b/bloomsays/cli.py new file mode 100644 index 0000000..759cde2 --- /dev/null +++ b/bloomsays/cli.py @@ -0,0 +1 @@ +#command line implementations \ No newline at end of file From edc7be52b9ced45521b64b3c20752c2bf4be252f Mon Sep 17 00:00:00 2001 From: hna2019 Date: Tue, 4 Nov 2025 17:27:33 -0500 Subject: [PATCH 05/14] Started us off with a pipfile and code that shows ASCII art and message --- Pipfile | 11 +++++++ Pipfile.lock | 20 +++++++++++++ pyproject.toml | 0 src/bloomsayspackage/__init__.py | 0 src/bloomsayspackage/wisdom.py | 49 ++++++++++++++++++++++++++++++++ 5 files changed, 80 insertions(+) create mode 100644 Pipfile create mode 100644 Pipfile.lock create mode 100644 pyproject.toml create mode 100644 src/bloomsayspackage/__init__.py create mode 100644 src/bloomsayspackage/wisdom.py diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..d61ea53 --- /dev/null +++ b/Pipfile @@ -0,0 +1,11 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] + +[dev-packages] + +[requires] +python_version = "3.13" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..bc0ddb5 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,20 @@ +{ + "_meta": { + "hash": { + "sha256": "494d5b4f482f0ef471f49afe28f00ec1a2ff75da2ce65060d8cabaeb3da2f100" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.13" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": {}, + "develop": {} +} diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..e69de29 diff --git a/src/bloomsayspackage/__init__.py b/src/bloomsayspackage/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/bloomsayspackage/wisdom.py b/src/bloomsayspackage/wisdom.py new file mode 100644 index 0000000..c9e949f --- /dev/null +++ b/src/bloomsayspackage/wisdom.py @@ -0,0 +1,49 @@ +import random; + +def bloomsays(): + profLines = ["everything is due at class time", "ask Bloombot", "Quizzes: 25%", "Exercises & Projects: 75%", "Discord is our main source of communitcation"] + + quote = random.choice(profLines) + + border = "-" * (len(quote) + 2) + bubble = f" {border}\n< {quote} >\n {border}" + + ascii_art = r""" + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%%%##(##&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%#%%%%%%%%%#######%@&@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@@@@@%%#%%&%%%###%%####(#%&&&%%%%&&@@@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@@%&&&&&#((///((((////**////(#&&&&&&%@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@&&&&&&%#(////***************////(#@@&&&@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@&&&@&#(///***************,*****///(&@&&&@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@&&&&&#(///********,,,,,,,,,,,****///(&&&&&@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@&&&&%(////*****,*,*,,,,,,,,,,,,****//#&&@&@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@&&&&&%(////*******,,,,,,,,,,********//(&&&&&@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@&@&&&%////**********,,,,,,,,,,******//(%&&&&@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@&@@&&%(///*******,,,,,,,,,,,,,,******//#&@&&@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@&&@@&%(///(#(####(/****,**//(%%%%##(///(&&&@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@&&&&(//%###%##%%###(/***/(((%&&&&%###((&@&//@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@(((#&&(//(#%#(*##,/(/(/***///(**#*/(((///&%#((/@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@/(//&&(//***//*////////****/*****/******/#(**/*@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@/(/(%&(//***/*******//**,,*/*******,,**//##(*/@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@/(#(&(///*********///*,,,,*//*********//%%(*#@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@///&%(//********/////****///*******///(&%//&@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@(/&&##((///**//((#&##%####(//***//(###&#/&@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@(&&&&%#(/(%%###%%%##%##%%%((##(((##%&&&@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@&&&&%##%&%&&%###%##((###%%%%#%%%%%&&&@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@@&&&&&&%&%%#//(////////////%&&&#&&&&@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@@@(%&@&&&&%#((((###%##((((((%&&&&@&%@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@,#%/#&&&&&&&&%##%%#%%%##(#%&&%&&@&@@@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@..(&//(&&&&&&&&&%%%%#%%(%%&&@&&@%(@@@@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@....,///(%&&&&@&&&&%%%%%&&&&@@@&(/..@@@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@.......////((#%&&&&&&@&&&@&@&&@%(//*,../@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@............//(((((((##&&@@@@@&&#/////#,,......(@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@%.......... ...*///////(((((((//////*//&(.......... *@@@@@@@@@@@@ + @@@@@@@@@%. ..,..//**///////////****//%/*. ............ .&@@@@@@ + """ + + print(f"{bubble}\n{ascii_art}") + +if __name__ == "__main__": + bloomsays() From aef1b8a4a6cd47582cbb4af25a1ca9cc75fcf133 Mon Sep 17 00:00:00 2001 From: lunasuzuki Date: Tue, 4 Nov 2025 17:59:23 -0500 Subject: [PATCH 06/14] added bubble.py --- bloomsays/bubble.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/bloomsays/bubble.py b/bloomsays/bubble.py index 877c3bb..89ff3d6 100644 --- a/bloomsays/bubble.py +++ b/bloomsays/bubble.py @@ -1 +1,17 @@ -#speech bubble code \ No newline at end of file +def make_bubble(text: str) -> str: + lines = text.split("\n") + width = max(len(line) for line in lines) + + top = " " + "_" * (width + 2) + + body = "\n".join(f"| {line.ljust(width)} |" for line in lines) + bottom = " " + "=" * (width + 2) + + tail = " \\\n \\" + + return f"{top}\n {body}\n{bottom}\n{tail}" + +#test - run: python3 -m bloomsays.bubble +if __name__ == "__main__": + print(make_bubble("Ask Bloombot!")) + From 19be87b7631737682f49ae6b1cdf93c833901e93 Mon Sep 17 00:00:00 2001 From: hna2019 Date: Wed, 5 Nov 2025 02:55:44 -0500 Subject: [PATCH 07/14] added new avg function and gave random function a parameter --- pyproject.toml | 28 +++++++++++++++++++ src/bloomsayspackage/__main__.py | 30 +++++++++++++++++++++ src/bloomsayspackage/wisdom.py | 38 +++++++++++++++++++------- tests/__init__.py | 0 tests/test_wisdom.py | 46 ++++++++++++++++++++++++++++++++ 5 files changed, 132 insertions(+), 10 deletions(-) create mode 100644 src/bloomsayspackage/__main__.py create mode 100644 tests/__init__.py create mode 100644 tests/test_wisdom.py diff --git a/pyproject.toml b/pyproject.toml index e69de29..319f84e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -0,0 +1,28 @@ +[build-system] +requires = ["setuptools>=61.0", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "bloomsays" +description = "A package that gives quotes from the professor" +version = "0.1.0" +license = { file = "LICENSE" } +readme = "README.md" +keywords = ["python", "package", "build", "lighthearted"] +requires-python = ">=3.7" +classifiers = [ + "Programming Language :: Python :: 3", + "Intended Audience :: Education", + "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", + "Operating System :: OS Independent", +] + +[project.optional-dependencies] +dev = ["pytest"] + +[project.urls] +"Repository" = "https://github.com/swe-students-fall2025/3-python-package-team_orchid.git" + + +[project.scripts] +bloomsays = "bloomsayspackage.__main__:main" diff --git a/src/bloomsayspackage/__main__.py b/src/bloomsayspackage/__main__.py new file mode 100644 index 0000000..cc0c59b --- /dev/null +++ b/src/bloomsayspackage/__main__.py @@ -0,0 +1,30 @@ +import sys +import wisdom + +def main(): + args = sys.argv[1:] + if not args: + print("Usage: bloomsays randomQuote [n] | bloomsays avg num1 num2 ...") + return + + command = args[0] + + if command == "randomQuote": + n = int(args[1]) if len(args) > 1 else 1 + randomQuote(n) + elif command == "avg": + if len(args) < 2: + print("Usage: bloomsays avg num1 num2 ...") + return + try: + numbers = [float(x) for x in args[1:]] + except ValueError: + print("All arguments for avg must be numbers.") + return + print(f"Your average grade is {avg(*numbers):.2f}") + else: + print(f"Unknown command: {command}") + print("Usage: bloomsays randomQuote [n] | bloomsays avg num1 num2 ...") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/src/bloomsayspackage/wisdom.py b/src/bloomsayspackage/wisdom.py index c9e949f..2481c01 100644 --- a/src/bloomsayspackage/wisdom.py +++ b/src/bloomsayspackage/wisdom.py @@ -1,14 +1,8 @@ import random; +import textwrap -def bloomsays(): - profLines = ["everything is due at class time", "ask Bloombot", "Quizzes: 25%", "Exercises & Projects: 75%", "Discord is our main source of communitcation"] - - quote = random.choice(profLines) - border = "-" * (len(quote) + 2) - bubble = f" {border}\n< {quote} >\n {border}" - - ascii_art = r""" +ascii_art = r""" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%%%##(##&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -43,7 +37,31 @@ def bloomsays(): @@@@@@@@@%. ..,..//**///////////****//%/*. ............ .&@@@@@@ """ + +def avg(*grades): + + average = sum(grades)/ len(grades) + message = f"Your average grade is {average:.2f}" + + border = "-" * (len(message) + 2) + bubble = f" {border}\n< {message} >\n {border}" + + print(f"{bubble}\n{ascii_art}") -if __name__ == "__main__": - bloomsays() + + +def randomQuote(n=1): + profLines = ["everything is due at class time", "ask Bloombot", "Quizzes: 25%", "Exercises & Projects: 75%", "Discord is our main source of communitcation"] + selected_quotes = [random.choice(profLines) for _ in range(n)] + + max_length = max(len(quote) for quote in selected_quotes) + + border = "-" * (max_length + 2) + bubble_lines = [f" {border}"] + for quote in selected_quotes: + bubble_lines.append(f"< {quote.ljust(max_length)} >") + bubble_lines.append(f" {border}") + + print("\n".join(bubble_lines)) + print(ascii_art) \ No newline at end of file diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_wisdom.py b/tests/test_wisdom.py new file mode 100644 index 0000000..b9d5b6e --- /dev/null +++ b/tests/test_wisdom.py @@ -0,0 +1,46 @@ +import pytest +from bloomsayspackage import wisdom + +class Tests: + + + def test_avg_simple(self, capsys): + wisdom.avg(97, 76, 67) + captured = capsys.readouterr() + assert "Your average grade is 80.00" in captured.out + assert "----------------" in captured.out + assert "@@@@" in captured.out + + def test_avg_identical_numbers(self, capsys): + wisdom.avg(67, 67, 67) + captured = capsys.readouterr() + assert "Your average grade is 67.00" in captured.out + assert "----------------" in captured.out + assert "@@@@" in captured.out + + def test_avg_random_floats(self, capsys): + wisdom.avg(5.5, 7.3, 8.2) + captured = capsys.readouterr() + assert "Your average grade is 7.00" in captured.out + assert "----------------" in captured.out + assert "@@@@" in captured.out + + def test_randomQuote_runs(self, capsys): + wisdom.randomQuote(3) + captured = capsys.readouterr() + assert "----------------" in captured.out + assert "@@@@" in captured.out + + def test_randomQuote_default(self, capsys): + wisdom.randomQuote() + captured = capsys.readouterr() + assert "----------------" in captured.out + assert "@@@@" in captured.out + + def test_randomQuote_multiple_quotes_in_bubble(self, capsys): + wisdom.randomQuote(2) + captured = capsys.readouterr() + lines = captured.out.splitlines() + bubble_lines = [line for line in lines if line.strip().startswith("<") and line.strip().endswith(">")] + assert len(bubble_lines) >= 2 + assert "@@@@" in captured.out From ede2b9d7d0fc614cfa05db1dad56209db0291c06 Mon Sep 17 00:00:00 2001 From: a247686991 Date: Fri, 7 Nov 2025 00:07:25 +0800 Subject: [PATCH 08/14] added helper function wrap_text --- {bloomsays => src/bloomsayspackage}/bubble.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {bloomsays => src/bloomsayspackage}/bubble.py (100%) diff --git a/bloomsays/bubble.py b/src/bloomsayspackage/bubble.py similarity index 100% rename from bloomsays/bubble.py rename to src/bloomsayspackage/bubble.py From 11776ebcd4e699520b7406d05484985aeac6472c Mon Sep 17 00:00:00 2001 From: a247686991 Date: Fri, 7 Nov 2025 00:13:45 +0800 Subject: [PATCH 09/14] added tests for bubble --- src/bloomsayspackage/bubble.py | 61 ++++++++++++++++++++++++++++++---- tests/test_bubble.py | 56 +++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+), 6 deletions(-) create mode 100644 tests/test_bubble.py diff --git a/src/bloomsayspackage/bubble.py b/src/bloomsayspackage/bubble.py index 89ff3d6..0826c7d 100644 --- a/src/bloomsayspackage/bubble.py +++ b/src/bloomsayspackage/bubble.py @@ -1,12 +1,61 @@ -def make_bubble(text: str) -> str: - lines = text.split("\n") - width = max(len(line) for line in lines) +from __future__ import annotations +from typing import List - top = " " + "_" * (width + 2) - body = "\n".join(f"| {line.ljust(width)} |" for line in lines) - bottom = " " + "=" * (width + 2) +def wrap_text(text: str, width: int) -> List[str]: + """ + Pure text wrapper (no printing). + - Splits on whitespace. + - If a single word is longer than width, it is put on its own line (no hyphenation). + """ + if width is None or width < 1: + raise ValueError("width must be >= 1") + words = text.split() + if not words: + return [""] + + lines: List[str] = [] + cur = words[0] + for w in words[1:]: + if len(cur) + 1 + len(w) <= width: + cur += " " + w + else: + lines.append(cur) + cur = w + lines.append(cur) + return lines + + +def make_bubble(text: str, width: int | None = None) -> str: + """ + Build a speech bubble as a single string. + - If width is provided, wrap the text to that width. + - Supports multi-line input already containing '\n' (each line is treated as a paragraph). + """ + if text is None: + raise ValueError("text must be a string") + + # split paragraphs first + paragraphs = text.split("\n") + if width is not None: + if width < 1: + raise ValueError("width must be >= 1") + lines = [] + for p in paragraphs: + if p.strip() == "": + lines.append("") # preserve empty line + else: + lines.extend(wrap_text(p, width)) + else: + lines = paragraphs + + # compute max visible width + maxw = max((len(line) for line in lines), default=0) + + top = " " + "_" * (maxw + 2) + body = "\n".join(f"| {line.ljust(maxw)} |" for line in lines) + bottom = " " + "=" * (maxw + 2) tail = " \\\n \\" return f"{top}\n {body}\n{bottom}\n{tail}" diff --git a/tests/test_bubble.py b/tests/test_bubble.py new file mode 100644 index 0000000..a88ad09 --- /dev/null +++ b/tests/test_bubble.py @@ -0,0 +1,56 @@ +import pytest + +from bloomsayspackage.bubble import make_bubble + + +def _assert_bubble_matches(out: str, expected_lines: list[str]): + parts = out.splitlines() + # top + maxw = max((len(l) for l in expected_lines), default=0) + assert parts[0] == " " + "_" * (maxw + 2) + + # body + body = parts[1 : 1 + len(expected_lines)] + assert len(body) == len(expected_lines) + for idx, (got, expect) in enumerate(zip(body, expected_lines)): + # the first body line is prefixed with a single space in the output + if idx == 0: + assert got.startswith(" | ") + inner = got[3:-2] + else: + # subsequent lines start with '|' directly + assert got.startswith("| ") + inner = got[2:-2] + assert got.endswith(" |") + assert inner.strip() == expect + + # bottom + bottom = parts[1 + len(expected_lines)] + assert bottom == " " + "=" * (maxw + 2) + + # tail should be two lines that each end with a backslash + assert parts[-2].endswith("\\") + assert parts[-1].endswith("\\") + + +def test_simple_bubble_no_width(): + out = make_bubble("Hi") + _assert_bubble_matches(out, ["Hi"]) + + +def test_wrap_with_width(): + out = make_bubble("one two three", width=6) + # wrapped into three lines + _assert_bubble_matches(out, ["one", "two", "three"]) + + +def test_preserve_empty_line(): + out = make_bubble("a\n\nb") + # empty paragraph should be preserved as an empty line + _assert_bubble_matches(out, ["a", "", "b"]) + + +def test_text_none_raises(): + with pytest.raises(ValueError): + make_bubble(None) + From 27783e8cf2cef3e93a69c783173c4af126c22676 Mon Sep 17 00:00:00 2001 From: a247686991 Date: Fri, 7 Nov 2025 00:22:42 +0800 Subject: [PATCH 10/14] added compute_avg and random_quote --- src/bloomsayspackage/wisdom.py | 86 +++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 37 deletions(-) diff --git a/src/bloomsayspackage/wisdom.py b/src/bloomsayspackage/wisdom.py index 2481c01..772bbb9 100644 --- a/src/bloomsayspackage/wisdom.py +++ b/src/bloomsayspackage/wisdom.py @@ -1,8 +1,9 @@ -import random; -import textwrap +from __future__ import annotations +import random +from typing import Iterable, List -ascii_art = r""" +ASCII_ART = r""" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%%%##(##&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -19,49 +20,60 @@ @@@@@@@@@@@@@@@@@@&&@@&%(///(#(####(/****,**//(%%%%##(///(&&&@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@&&&&(//%###%##%%###(/***/(((%&&&&%###((&@&//@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@(((#&&(//(#%#(*##,/(/(/***///(**#*/(((///&%#((/@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@/(//&&(//***//*////////****/*****/******/#(**/*@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@/(/(%&(//***/*******//**,,*/*******,,**//##(*/@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@/(#(&(///*********///*,,,,*//*********//%%(*#@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@///&%(//********/////****///*******///(&%//&@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@(/&&##((///**//((#&##%####(//***//(###&#/&@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@(&&&&%#(/(%%###%%%##%##%%%((##(((##%&&&@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@&&&&%##%&%&&%###%##((###%%%%#%%%%%&&&@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@&&&&&&%&%%#//(////////////%&&&#&&&&@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@(%&@&&&&%#((((###%##((((((%&&&&@&%@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@,#%/#&&&&&&&&%##%%#%%%##(#%&&%&&@&@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@..(&//(&&&&&&&&&%%%%#%%(%%&&@&&@%(@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@....,///(%&&&&@&&&&%%%%%&&&&@@@&(/..@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@.......////((#%&&&&&&@&&&@&@&&@%(//*,../@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@............//(((((((##&&@@@@@&&#/////#,,......(@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@%.......... ...*///////(((((((//////*//&(.......... *@@@@@@@@@@@@ - @@@@@@@@@%. ..,..//**///////////****//%/*. ............ .&@@@@@@ - """ +""" -def avg(*grades): +def compute_avg(*grades: float) -> float: + """ + Pure function: returns the numeric average. + Raises: + - ValueError if no grades are provided. + - TypeError if a non-numeric is passed. + """ + if len(grades) == 0: + raise ValueError("at least one grade is required") + total = 0.0 + for g in grades: + total += float(g) # will raise if not convertible to float + return total / len(grades) - average = sum(grades)/ len(grades) - message = f"Your average grade is {average:.2f}" - border = "-" * (len(message) + 2) - bubble = f" {border}\n< {message} >\n {border}" +DEFAULT_QUOTES = [ + "everything is due at class time", + "ask Bloombot", + "Quizzes: 25%", + "Exercises & Projects: 75%", + "Discord is our main source of communication", +] - print(f"{bubble}\n{ascii_art}") +def pick_quotes(n: int = 1, pool: Iterable[str] | None = None) -> List[str]: + if n < 1: + raise ValueError("n must be >= 1") + src = list(pool) if pool is not None else DEFAULT_QUOTES + return [random.choice(src) for _ in range(n)] -def randomQuote(n=1): - profLines = ["everything is due at class time", "ask Bloombot", "Quizzes: 25%", "Exercises & Projects: 75%", "Discord is our main source of communitcation"] - selected_quotes = [random.choice(profLines) for _ in range(n)] - max_length = max(len(quote) for quote in selected_quotes) +def _bubble_block(lines: List[str]) -> str: + max_len = max((len(line) for line in lines), default=0) + border = "-" * (max_len + 2) + out = [f" {border}"] + for line in lines: + out.append(f"< {line.ljust(max_len)} >") + out.append(f" {border}") + return "\n".join(out) - border = "-" * (max_length + 2) - bubble_lines = [f" {border}"] - for quote in selected_quotes: - bubble_lines.append(f"< {quote.ljust(max_length)} >") - bubble_lines.append(f" {border}") - print("\n".join(bubble_lines)) - print(ascii_art) \ No newline at end of file +def avg_print(*grades: float) -> None: + avg = compute_avg(*grades) + msg = f"Your average grade is {avg:.2f}" + print(_bubble_block([msg])) + print(ASCII_ART) + + +def random_quote_print(n: int = 1) -> None: + lines = pick_quotes(n) + print(_bubble_block(lines)) + print(ASCII_ART) From 1a0c9bd12f2aa2c3aa44b75304a043ed9f5596e6 Mon Sep 17 00:00:00 2001 From: a247686991 Date: Fri, 7 Nov 2025 00:32:56 +0800 Subject: [PATCH 11/14] fixed test_wisdom.py --- src/bloomsayspackage/wisdom.py | 86 +++++++++++++++------------------- tests/test_wisdom.py | 2 +- 2 files changed, 38 insertions(+), 50 deletions(-) diff --git a/src/bloomsayspackage/wisdom.py b/src/bloomsayspackage/wisdom.py index 772bbb9..2481c01 100644 --- a/src/bloomsayspackage/wisdom.py +++ b/src/bloomsayspackage/wisdom.py @@ -1,9 +1,8 @@ -from __future__ import annotations -import random -from typing import Iterable, List +import random; +import textwrap -ASCII_ART = r""" +ascii_art = r""" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&%%%##(##&@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -20,60 +19,49 @@ @@@@@@@@@@@@@@@@@@&&@@&%(///(#(####(/****,**//(%%%%##(///(&&&@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@&&&&(//%###%##%%###(/***/(((%&&&&%###((&@&//@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@(((#&&(//(#%#(*##,/(/(/***///(**#*/(((///&%#((/@@@@@@@@@@@@@@@@ -""" + @@@@@@@@@@@@@@@@@/(//&&(//***//*////////****/*****/******/#(**/*@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@/(/(%&(//***/*******//**,,*/*******,,**//##(*/@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@/(#(&(///*********///*,,,,*//*********//%%(*#@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@///&%(//********/////****///*******///(&%//&@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@(/&&##((///**//((#&##%####(//***//(###&#/&@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@(&&&&%#(/(%%###%%%##%##%%%((##(((##%&&&@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@&&&&%##%&%&&%###%##((###%%%%#%%%%%&&&@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@@&&&&&&%&%%#//(////////////%&&&#&&&&@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@@@(%&@&&&&%#((((###%##((((((%&&&&@&%@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@@,#%/#&&&&&&&&%##%%#%%%##(#%&&%&&@&@@@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@@..(&//(&&&&&&&&&%%%%#%%(%%&&@&&@%(@@@@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@@....,///(%&&&&@&&&&%%%%%&&&&@@@&(/..@@@@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@@@@.......////((#%&&&&&&@&&&@&@&&@%(//*,../@@@@@@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@@@@@............//(((((((##&&@@@@@&&#/////#,,......(@@@@@@@@@@@@@@@@ + @@@@@@@@@@@@%.......... ...*///////(((((((//////*//&(.......... *@@@@@@@@@@@@ + @@@@@@@@@%. ..,..//**///////////****//%/*. ............ .&@@@@@@ + """ -def compute_avg(*grades: float) -> float: - """ - Pure function: returns the numeric average. - Raises: - - ValueError if no grades are provided. - - TypeError if a non-numeric is passed. - """ - if len(grades) == 0: - raise ValueError("at least one grade is required") - total = 0.0 - for g in grades: - total += float(g) # will raise if not convertible to float - return total / len(grades) +def avg(*grades): + average = sum(grades)/ len(grades) + message = f"Your average grade is {average:.2f}" -DEFAULT_QUOTES = [ - "everything is due at class time", - "ask Bloombot", - "Quizzes: 25%", - "Exercises & Projects: 75%", - "Discord is our main source of communication", -] + border = "-" * (len(message) + 2) + bubble = f" {border}\n< {message} >\n {border}" -def pick_quotes(n: int = 1, pool: Iterable[str] | None = None) -> List[str]: - if n < 1: - raise ValueError("n must be >= 1") - src = list(pool) if pool is not None else DEFAULT_QUOTES - return [random.choice(src) for _ in range(n)] + print(f"{bubble}\n{ascii_art}") +def randomQuote(n=1): + profLines = ["everything is due at class time", "ask Bloombot", "Quizzes: 25%", "Exercises & Projects: 75%", "Discord is our main source of communitcation"] + selected_quotes = [random.choice(profLines) for _ in range(n)] -def _bubble_block(lines: List[str]) -> str: - max_len = max((len(line) for line in lines), default=0) - border = "-" * (max_len + 2) - out = [f" {border}"] - for line in lines: - out.append(f"< {line.ljust(max_len)} >") - out.append(f" {border}") - return "\n".join(out) + max_length = max(len(quote) for quote in selected_quotes) + border = "-" * (max_length + 2) + bubble_lines = [f" {border}"] + for quote in selected_quotes: + bubble_lines.append(f"< {quote.ljust(max_length)} >") + bubble_lines.append(f" {border}") -def avg_print(*grades: float) -> None: - avg = compute_avg(*grades) - msg = f"Your average grade is {avg:.2f}" - print(_bubble_block([msg])) - print(ASCII_ART) - - -def random_quote_print(n: int = 1) -> None: - lines = pick_quotes(n) - print(_bubble_block(lines)) - print(ASCII_ART) + print("\n".join(bubble_lines)) + print(ascii_art) \ No newline at end of file diff --git a/tests/test_wisdom.py b/tests/test_wisdom.py index b9d5b6e..61957f4 100644 --- a/tests/test_wisdom.py +++ b/tests/test_wisdom.py @@ -34,7 +34,7 @@ def test_randomQuote_runs(self, capsys): def test_randomQuote_default(self, capsys): wisdom.randomQuote() captured = capsys.readouterr() - assert "----------------" in captured.out + assert any(line.strip().startswith("-") for line in captured.out.splitlines()) assert "@@@@" in captured.out def test_randomQuote_multiple_quotes_in_bubble(self, capsys): From 6d8438eddd67dc2e18e09c1c5c7250e6e9ad7491 Mon Sep 17 00:00:00 2001 From: a247686991 Date: Fri, 7 Nov 2025 00:33:59 +0800 Subject: [PATCH 12/14] added init.py --- src/bloomsayspackage/__init__.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/bloomsayspackage/__init__.py b/src/bloomsayspackage/__init__.py index e69de29..1c2be9c 100644 --- a/src/bloomsayspackage/__init__.py +++ b/src/bloomsayspackage/__init__.py @@ -0,0 +1,8 @@ +from .bubble import wrap_text, make_bubble + +from . import wisdom +__all__ = [ + "wrap_text", + "make_bubble", + "wisdom", +] From fa7552635870d16d0f77567647f83e5d35433012 Mon Sep 17 00:00:00 2001 From: a247686991 Date: Fri, 7 Nov 2025 00:38:55 +0800 Subject: [PATCH 13/14] added test for wrap_texgt --- tests/test_bubble.py | 49 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/tests/test_bubble.py b/tests/test_bubble.py index a88ad09..ddef51d 100644 --- a/tests/test_bubble.py +++ b/tests/test_bubble.py @@ -1,6 +1,6 @@ import pytest -from bloomsayspackage.bubble import make_bubble +from bloomsayspackage.bubble import make_bubble, wrap_text def _assert_bubble_matches(out: str, expected_lines: list[str]): @@ -54,3 +54,50 @@ def test_text_none_raises(): with pytest.raises(ValueError): make_bubble(None) + +# Tests for wrap_text function +def test_wrap_text_simple(): + result = wrap_text("hello world", 10) + assert result == ["hello", "world"] + + +def test_wrap_text_fits_on_one_line(): + result = wrap_text("hello", 10) + assert result == ["hello"] + + +def test_wrap_text_multiple_words_fit(): + result = wrap_text("one two three four", 15) + assert result == ["one two three", "four"] + + +def test_wrap_text_long_word_exceeds_width(): + # A single word longer than width should be on its own line + result = wrap_text("short verylongword short", 10) + assert result == ["short", "verylongword", "short"] + + +def test_wrap_text_empty_string(): + result = wrap_text("", 10) + assert result == [""] + + +def test_wrap_text_width_one(): + result = wrap_text("a b c", 1) + assert result == ["a", "b", "c"] + + +def test_wrap_text_invalid_width_zero(): + with pytest.raises(ValueError, match="width must be >= 1"): + wrap_text("text", 0) + + +def test_wrap_text_invalid_width_negative(): + with pytest.raises(ValueError, match="width must be >= 1"): + wrap_text("text", -5) + + +def test_wrap_text_invalid_width_none(): + with pytest.raises(ValueError, match="width must be >= 1"): + wrap_text("text", None) + From f96f8837602787b62a107a74d953920250d275a1 Mon Sep 17 00:00:00 2001 From: a247686991 Date: Fri, 7 Nov 2025 01:08:25 +0800 Subject: [PATCH 14/14] fixed yml --- .github/workflows/event-logger.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/event-logger.yml b/.github/workflows/event-logger.yml index 31f231e..2a6ca80 100644 --- a/.github/workflows/event-logger.yml +++ b/.github/workflows/event-logger.yml @@ -35,20 +35,32 @@ jobs: - name: Log pull request opened if: github.event_name == 'pull_request' && github.event.action == 'opened' run: | + if [ -z "$COMMIT_LOG_API" ]; then + echo "COMMIT_LOG_API is not set"; exit 1 + fi pipenv run gitcommitlogger -r $(echo $REPOSITORY_URL) -t pull_request_opened -d $(echo $PR_CREATED_AT) -un $(echo $GITHUB_LOGIN) -o commit_stats.csv -u $(echo $COMMIT_LOG_API) -v - name: Log pull request closed and merged if: github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged == true run: | + if [ -z "$COMMIT_LOG_API" ]; then + echo "COMMIT_LOG_API is not set"; exit 1 + fi echo $COMMITS > commits.json cat commits.json # debugging pipenv run gitcommitlogger -r $(echo $REPOSITORY_URL) -t pull_request_merged -d $(echo $PR_CLOSED_AT) -un $(echo $GITHUB_LOGIN) -i commits.json -o commit_stats.csv -u $(echo $COMMIT_LOG_API) -v - name: Log pull request closed without merge if: github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged == false run: | + if [ -z "$COMMIT_LOG_API" ]; then + echo "COMMIT_LOG_API is not set"; exit 1 + fi pipenv run gitcommitlogger -r $(echo $REPOSITORY_URL) -t pull_request_closed -d $(echo $PR_CLOSED_AT) -un $(echo $GITHUB_LOGIN) -o commit_stats.csv -u $(echo $COMMIT_LOG_API) -v - name: Log push if: github.event_name == 'push' run: | + if [ -z "$COMMIT_LOG_API" ]; then + echo "COMMIT_LOG_API is not set"; exit 1 + fi echo $COMMITS > commits.json cat commits.json # debugging pipenv run gitcommitlogger -r $(echo $REPOSITORY_URL) -t $(echo $EVENT_TYPE) -i commits.json -o commit_stats.csv -u $(echo $COMMIT_LOG_API) -v