A Python implementation of the classic cowsay program for generating ASCII art with various characters delivering messages
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Helper functions and constants for working with cowpy, including option discovery, random generation, and content filtering.
Functions to discover available cowacters and eye types, with support for SFW filtering and sorting.
def cow_options():
"""
Get all available cowacter names.
Returns:
dict_keys: Keys from COWACTERS dictionary containing all cowacter names
"""
def eye_options():
"""
Get all available eye types.
Returns:
dict_keys: Keys from EYES dictionary containing all eye type names
"""
def get_cowacters(sfw=True, sort=False):
"""
Get cowacter name and class pairs.
Args:
sfw (bool): If True, filter out NSFW cowacters
sort (bool): If True, sort results alphabetically by name
Returns:
dict_items or list: Cowacter name/class pairs, sorted if requested
"""
def get_eyes(sfw=True, sort=False):
"""
Get eye type name and value pairs.
Args:
sfw (bool): If True, filter out NSFW eye types
sort (bool): If True, sort results alphabetically by name
Returns:
dict_items or list: Eye name/value pairs, sorted if requested
"""Generate random cowsay output with randomized cowacter, eyes, and options.
def milk_random_cow(msg, sfw=True):
"""
Generate cowsay output using a random cowacter with random attributes.
Args:
msg (str): Message for the random cowacter to say
sfw (bool): If True, only use safe-for-work cowacters and eyes
Returns:
str: Complete ASCII art output with random cowacter
"""Check whether cowacters or eye types contain adult content.
def not_safe_for_work(cow='', eyes=''):
"""
Check if cowacter or eye type contains NSFW content.
Args:
cow (str): Cowacter name to check
eyes (str): Eye type name to check
Returns:
bool: True if either parameter contains NSFW content
"""Global constants defining available options and NSFW content identifiers.
# Eye type definitions
EYES = {
'default': "oo", # Standard cow eyes
'borg': "==", # Borg/robotic eyes
'dead': "xx", # Dead/deceased eyes
'greedy': "$$", # Money/greedy eyes
'paranoid': "@@", # Paranoid/worried eyes
'stoned': "**", # Stoned eyes (NSFW)
'tired': "--", # Tired/sleepy eyes
'wired': "OO", # Wired/alert eyes
'young': ".." # Young/innocent eyes
}
# NSFW content identifiers
NOT_SAFE_FOR_WORK_COWACTERS = ['bongcow', 'sodomized', 'headincow', 'telebears']
NOT_SAFE_FOR_WORK_EYES = ['stoned']
# Cowacter registry (populated at module load)
COWACTERS = {...} # Dictionary mapping cowacter names to classesfrom cowpy import cow
# Discover available options
all_cowacters = cow.cow_options()
all_eyes = cow.eye_options()
print(f"Available cowacters: {list(all_cowacters)}")
print(f"Available eyes: {list(all_eyes)}")
# Get SFW-only options, sorted
sfw_cowacters = cow.get_cowacters(sfw=True, sort=True)
sfw_eyes = cow.get_eyes(sfw=True, sort=True)
# Generate random output
random_msg = cow.milk_random_cow("Hello random world!")
print(random_msg)
# Include NSFW content in random generation
nsfw_random = cow.milk_random_cow("Edgy message", sfw=False)
print(nsfw_random)
# Check NSFW status
is_nsfw = cow.not_safe_for_work(cow='bongcow') # Returns True
is_sfw = cow.not_safe_for_work(cow='moose') # Returns False
eye_nsfw = cow.not_safe_for_work(eyes='stoned') # Returns True
# Access constants directly - all constants are module-level and directly accessible
print(f"Dead eyes look like: {cow.EYES['dead']}")
print(f"NSFW cowacters: {cow.NOT_SAFE_FOR_WORK_COWACTERS}")
print(f"All registered cowacters: {list(cow.COWACTERS.keys())}")
# Iterate through all cowacters
for name, cowacter_class in cow.get_cowacters(sfw=True, sort=True):
instance = cowacter_class()
print(f"{name}: {instance.milk(f'I am {name}')}")The main() function provides complete CLI functionality with argument parsing.
def main():
"""
Command-line interface entry point with full argument parsing.
CLI Arguments:
message: Positional arguments joined as the message
-l, --list: List all available cowacters
-L, --list-variations: List cowacters with all eye variations
-t, --thoughts: Use thought bubble instead of speech bubble
-u, --tongue: Add tongue to the cowacter
-e, --eyes: Specify eye type
-c, --cowacter: Specify cowacter name (case insensitive)
-E, --list-eyes: List available eye types
-r, --random: Choose random cowacter
-x, --nsfw: Enable NSFW content
-C, --copy: Copy cow.py to current directory
Input Methods:
- Command line arguments: cowpy hello world
- Standard input: echo "hello" | cowpy
"""# get_cow() returns string 'default' for unknown names instead of raising KeyError
unknown_cow = cow.get_cow('nonexistent') # Returns string 'default'
# milk() method catches exceptions and returns error message
try:
broken_cow = cow.Cowacter()
result = broken_cow.milk(None) # Handles gracefully
except Exception:
pass # Exception caught internally, returns error string
# CLI provides user-friendly error messages for invalid cowacters
# cowpy -c invalidname -> "invalidname is an invalid cowacter"Install with Tessl CLI
npx tessl i tessl/pypi-cowpy