CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-cowpy

A Python implementation of the classic cowsay program for generating ASCII art with various characters delivering messages

Pending

Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

Overview
Eval results
Files

utilities.mddocs/

Utilities

Helper functions and constants for working with cowpy, including option discovery, random generation, and content filtering.

Capabilities

Option Discovery

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
    """

Random Generation

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
    """

Content Filtering

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
    """

Constants

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 classes

Usage Examples

from 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}')}")

Command Line Interface

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
    """

Error Handling

# 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

docs

cowacters.md

index.md

utilities.md

tile.json