Cleo

2.1.0 · active · verified Thu Apr 09

Cleo is a Python library designed to help developers create beautiful and testable command-line interfaces. It draws significant inspiration from the Symfony Console Component, providing a robust and familiar structure for building CLI applications. The library is actively maintained, with a release cadence that includes support for new Python versions and essential bug fixes, as demonstrated by the recent 2.1.0 update.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to create a basic command-line application with Cleo. It defines a `GreetCommand` that accepts an optional name argument and a 'yell' flag. The command uses `cleo.helpers.argument` and `cleo.helpers.option` for modern argument and option definitions. An `Application` instance registers the command, and a simulated `io` stream is used to run the command programmatically for demonstration purposes, mimicking command-line execution.

import os
from cleo.application import Application
from cleo.commands.command import Command
from cleo.helpers import argument, option


class GreetCommand(Command):
    name = "greet"
    description = "Greets someone"

    arguments = [
        argument("name", description="Who do you want to greet?", optional=True)
    ]
    options = [
        option("yell", "y", description="If set, the task will yell in uppercase letters", flag=True)
    ]

    def handle(self):
        name = self.argument("name")
        if name:
            text = f"Hello {name}"
        else:
            text = "Hello"

        if self.option("yell"):
            text = text.upper()

        self.line(text)


application = Application("My CLI App", "1.0.0")
application.add(GreetCommand())

if __name__ == "__main__":
    # Example of how to run, in a real app this would be called via command line
    # e.g., `python your_script.py greet John --yell`
    # For quickstart, we'll simulate it for programmatic execution and testing
    try:
        # Simulate a command-line call for demonstration
        # In a real scenario, this would be invoked via sys.argv
        from cleo.io.buffered_io import BufferedIO
        from cleo.io.inputs.string_input import StringInput
        from cleo.io.outputs.buffered_output import BufferedOutput
        
        # Example: running 'greet John --yell'
        input_stream = StringInput('greet John --yell')
        output_stream = BufferedOutput()
        error_stream = BufferedOutput()
        
        io = BufferedIO(input_stream, output_stream, error_stream)
        application.run(io)
        
        print("\n--- Output ---")
        print(output_stream.fetch())
        print("--- Error ---")
        print(error_stream.fetch())
        print("--------------")

        # Example: running 'greet'
        input_stream_no_args = StringInput('greet')
        output_stream_no_args = BufferedOutput()
        error_stream_no_args = BufferedOutput()

        io_no_args = BufferedIO(input_stream_no_args, output_stream_no_args, error_stream_no_args)
        application.run(io_no_args)

        print("\n--- Output (No Args) ---")
        print(output_stream_no_args.fetch())
        print("--- Error (No Args) ---")
        print(error_stream_no_args.fetch())
        print("------------------------")

    except Exception as e:
        print(f"An error occurred: {e}")

view raw JSON →