Create Beautiful CLI Tools using Typer
Tags: python, programming, opensource, tooling
Published: 2022-12-11 12:50:31

In this post i will discuss about how to create beautiful CLI Tools using library call [typer](https://typer.tiangolo.com/) with this library we can create amazing CLI Tools with that

### Background

on my case i want to create interactive Scraping tools based on python without make confuse my client, then i look helper from my bash terminal, then i search tools on the internet and found the cool  library.

### Task

create sample tools using typer, the case is creating simple greeting apps with object oriented paradigm

### Getting Started

first create repo on github and save your source code and install `poetry` for dependency management [here](https://python-poetry.org/)

and then install the dependencies

```sh
poetry add typer
```

and then create class `Greetings` on `greet.py`

```py
from typing import Optional
from pprint import pprint

class Greetings(object):
    def __init__(self, name: str, address: Optional[str]=None, city: Optional[str]=None, state: Optional[str]=None,):
        self.name = name
        self.address = address
        self.city = city
        self.state = state
    
    def intro(self):
        """introduce yourself in informal event
        """
        print("Hello My name is {}, Nice to meet You".format(self.name))

    def formal_event(self):
        """introduce youself in formal event
        """
        if self.address is not None:
            print("Hello Nice to meet you, my name is {} i live in {}, {}, {}".format(self.name, self.address, self.city, self.state))
        else:
            print("Hello Nice to meet you, my name is {} Nice to Meet Yo Bro")

    def identity(self):
        """Print your identity
        """

        data_dict: dict[str, str] = {
            "name": self.name,
            "address": self.address,
            "city": self.city,
            "state": self.state,
        }
        print("here your identity")
        pprint(data_dict)

    ]
```

then on `main.py` adding typer configuration


```py
from typer import Typer, Option
from typing import Optional

from greet import Greetings

app = Typer()

@app.command()
def main(
    name: str = Option("", help="Enter Your Name"),
    mode: Optional[str] = Option(
        "unformal", help="help you print greeting text with unformal format"
    ),
    address: Optional[str] = Option("", help="Your Address"),
    city: Optional[str] = Option("", help="Your City"),
    state: Optional[str] = Option("", help="Your State Address"),
):
    greeting: Greetings = Greetings(name=name, address=address, city=city, state=state)
    if mode == "unformal":
        greeting.intro()
    elif mode == "formal":
        greeting.intro()
    elif mode == "unformal":
        greeting.formal_event()
    elif mode == "indentity":
        greeting.identity()
    
if __name__ == "__main__":
    app()
```

here is an help pages

```sh
python src/main.py --help       
Usage: main.py [OPTIONS]

Options:
  --name TEXT           Enter Your Name
  --mode TEXT           help you print greeting text with unformal format
                        [default: unformal]
  --address TEXT        Your Address
  --city TEXT           Your City
  --state TEXT          Your State Address
  --install-completion  Install completion for the current shell.
  --show-completion     Show completion for the current shell, to copy it or
                        customize the installation.
  --help                Show this message and exit.
```

### Examples

here is an examples results

```sh
python src/main.py --name="Siti"
Hello My name is Siti, Nice to meet You # <- the results
```

### Conclusion

in this post just demonstrate usage of typer packages, so explore more at [docs](https://typer.tiangolo.com/), see you in the next post :)

> Note: Source Code Available at [here](https://github.com/perymerdeka/greeting-apps)