Cleo

2.1.0 · active · verified Sat Mar 28

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.

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 →