Skip to main content

Opinionated decorators that turn callables into CLI commands with structured logging.

Project description

Data Platform Toolkit

Набор инструментов, которые помогают:

  • превращать функции в CLI команды c помощью argparse;
  • автоматически добавлять структурированные JSON-логи вокруг вызова;
  • переиспользовать один и тот же стек в разных проектах с минимальными зависимостями.

Установка

pip install data-platform-toolkit

Быстрый старт

from decorators import cli, configure_toolkit, get_logger

configure_toolkit(logger_structured_messages=True)  # один раз на старте приложения
logger = get_logger()  # использует настройки из configure_toolkit

@cli.command()
def greet(name: str, excited: bool = False):
    """Простое приветствие."""
    message = f"Hello, {name}"
    return message.upper() if excited else message

if __name__ == "__main__":
    cli.run()
$ python app.py greet Artem --excited
HELLO, ARTEM

Каждый запуск создаёт три лог-события (start, success, error) в JSON-формате; адаптер добавляет timestamp и invocation_id:

{"event": "start", "function": "greet", "call": {"args": ["Artem"], "kwargs": {"excited": true}}, "timestamp": "<ts>", "invocation_id": "<id>"}
{"event": "success", "function": "greet", "duration": 0.000021, "message": "HELLO, ARTEM", "timestamp": "<ts>", "invocation_id": "<id>"}

Примеры: позиционные и опции

Правила формирования CLI-аргументов берутся из CLIRegistry._add_argument:

  • Параметры без значения по умолчанию добавляются как позиционные.
  • Параметры со значением по умолчанию добавляются как именованные опции --name.

Это влияет на способ вызова команды:

  1. Позиционный аргумент (без дефолта)
from decorators import cli

@cli.command()
def hello(name: str) -> str:
    return f"Hello, {name}!"

if __name__ == "__main__":
    cli.run()

Запуск:

python app.py hello artem
  1. Именованная опция (с дефолтом)
from decorators import cli

@cli.command()
def hello(name: str = "World") -> str:
    return f"Hello, {name}!"

if __name__ == "__main__":
    cli.run()

Запуски:

# Использовать дефолтное значение
python app.py hello

# Явно передать значение через опцию
python app.py hello --name artem
  1. Булевы флаги (--flag / --no-flag)
from decorators import cli

@cli.command()
def toggle(verbose: bool = False) -> bool:
    return verbose

if __name__ == "__main__":
    cli.run()

Запуски:

python app.py toggle --verbose    # → True
python app.py toggle --no-verbose # → False

Дополнительные возможности

  • CLIRegistry() — создаёт собственный реестр команд (удобно для библиотек).
  • @cli.command(log=False) — отключает логирование, если оно не требуется.
  • @structured — декоратор для обычных функций, которым не нужен CLI, но нужны структурированные логи.

Dry-run (стандартный тестовый режим)

Каждая CLI‑команда поддерживает флаг --dry-run, который выводит структурированный JSON‑превью вызова и пропускает выполнение функции. Чтобы реестр распознал флаг как глобальный, его нужно указывать до имени команды. Это удобно для тестирования интеграций в проектах, импортирующих библиотеку.

$ python app.py --dry-run greet Artem --excited
{"event": "dry_run", "function": "greet", "call": {"kwargs": {"name": "Artem", "excited": true}}}

Также поддерживается глобальный вызов без указания команды:

$ python app.py --dry-run
{"event": "dry_run", "function": null, "available": ["greet", "toggle", "..."]}

Флаг доступен для всех команд автоматически и не влияет на сигнатуру функций.

Ограничения

  • Поддерживаются только позиционные и именованные аргументы (без *args и **kwargs).
  • Для булевых параметров автоматически добавляются флаги --flag/--no-flag.
  • Типы аргументов выводятся из аннотаций или значений по умолчанию и ограничены str, int, float, bool.

Лицензия

MIT License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

data_platform_toolkit-0.6.0.tar.gz (12.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

data_platform_toolkit-0.6.0-py3-none-any.whl (10.7 kB view details)

Uploaded Python 3

File details

Details for the file data_platform_toolkit-0.6.0.tar.gz.

File metadata

  • Download URL: data_platform_toolkit-0.6.0.tar.gz
  • Upload date:
  • Size: 12.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for data_platform_toolkit-0.6.0.tar.gz
Algorithm Hash digest
SHA256 77533bde856447bc49b8100f28d9e301d8475b1dd64e506efcffbc340ab36ce0
MD5 ccafc9dd9b2be3cb3f0f5af88160fb13
BLAKE2b-256 b9c759f28ae9a9c52fffefb1a7a54a51272b2604dc5bc83793993d836a58c879

See more details on using hashes here.

File details

Details for the file data_platform_toolkit-0.6.0-py3-none-any.whl.

File metadata

File hashes

Hashes for data_platform_toolkit-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0ae4495f4f90d140a519d0fa4434cb59b1aac7193c0bc8ba81ee41dd39703f4e
MD5 35dc8b19d284c54f4488c054f5255988
BLAKE2b-256 bd994088e2398e80194ce4bd8838f5a7359c96d4fadc6da84cbb380d8be35dbe

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page