Как стать автором
Обновить

Сlite — «zero-dependency» фреймворк для создания CLI

Уровень сложностиПростой
Время на прочтение2 мин
Количество просмотров2.1K

Привет, Хабр! Это моя первая статья и я пишу ее в рамках конкурса «Сезон Open Source на Хабре». Сегодня я хочу рассказать о своем pet-проекте, Clite - это легковесный, фреймворк на Python для создания CLI.

О проекте и его цели

Название фреймворка вдохновлено СУБД SQLite, легкой альтернативой современным PostgreSQL, MySQL. Так же и я позиционирую фреймворк как легкая альтернатива Typer, Click и другим похожим фреймворкам.
Цель проекта показать что любой может создать свое CLI приложение при этом используя минимум зависимостей и максимум возможностей языка Python.

История появления

Изначально меня вдохновил аналогичный пакет от Себастьяна Рамиреcа - Typer. Это тоже фреймворк на базе подсказок типов для создания CLI.
Ниже пример простого кода:

from typer import Typer

app = Typer(
    name="myapp",
)

@app.command()
def hello(name: str):
    print(f"Hello, {name}!")

if __name__ == "__main__":
    app()

Вот выглядит запуск команды и вывода

> python main.py Alice
Hello, Alice!

Выглядит круто? Но давайте залезем в "кишочки" Typer и изучим подробнее на чем он базируется.

  ❯ uv tree --package typer
  Resolved 11 packages in 0.51ms
  typer v0.15.3
  ├── click v8.1.8
  ├── rich v14.0.0
  │   ├── markdown-it-py v3.0.0
  │   │   └── mdurl v0.1.2
  │   ├── pygments v2.19.1
  │   └── typing-extensions v4.13.2
  ├── shellingham v1.5.4
  └── typing-extensions v4.13.2

Как видно по зависимостям typer основан на

  • Click - фреймворк для создания CLI, но не использующий type hints для описания команд, аргументов и флагов.

  • Rich - библиотека для стилизации CLI.

  • Shellingham - библиотека для определения shell-оболочки в которой запущен файл Python.

  • typing-extensions - библиотека, которая добавляет новые функции из typing в старые версии Python.


Теперь посмотрим на Clite и разберемся чем он похож на Click и Typer, и в чем его отличие.
Пример кода:

from clite import Clite

app = Clite(
    name="myapp",
)

@app.command()
def hello(name: str):
    print(f"Hello, {name}!")

if __name__ == "__main__":
    app()

Пример команды:

> python main.py hello Alice
Hello, Alice!

Теперь проверим зависимости

  ❯ uv tree --package clite
  Resolved 3 packages in 0.35ms
  clite v0.2.2
  └── typing-extensions v4.13.2

Из примера видно 2 отличия:

  1. Clite имеет немного другой вызов команды :D

  2. Не имеет сторонних зависимостей кроме typing-extensions

Тогда в чем разница, если мы получаем одно и тоже? А разница в том мои дорогие читатели что Clite использует свой парсер команд, аргументов и флагов. Не базируется ни на каком Click, Typer. А просто использует практически всю мощь языка Python.

Из того что уже имеет Clite, это:

  • Парсинг команд, аргументов и флагов

  • Поддержка type hint-ов, сейчас простых по типу int, str и тд. но дальше будет больше

  • Декораторы подобные FastAPI, Flask, Typer, Click

  • Небольшая документация с референсами на код

Что дальше?

На момент написания статьи Clite имеет версию 0.2.2.

В этом году планируется:

  • Улучшить парсер

  • Добавить поддержку Annotated для аргументов и флагов

  • Добавить поддержку sub-команд

  • Добавить свою реализацию echo

Также можно ознакомиться с roadmap-ом в документации

Подписывайтесь на мой telegram-канал - тут больше мыслей про разработку и жизнь в IT.

Заключение

В конце хочу сказать "спасибо" Хабру и конкурсу от GitVerse, которые смотивировали меня рассказать о своем pet-проекте. Также если вы хотите внести свой вклад в развитие Clite, не постесняйтесь оставить свое Issue.

Теги:
Хабы:
+11
Комментарии7

Публикации

Работа

Data Scientist
51 вакансия

Ближайшие события