Files
kanboard-api/lib/interactive.py
2025-10-18 00:52:08 +03:00

91 lines
3.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import json
from lib.kanboard_api import KanboardAPI
class KanboardInteractive:
"""Позволяет выполнять произвольные JSON-RPC запросы через KanboardAPI."""
def __init__(self, api: KanboardAPI):
self.api = api
def parse_simple_syntax(self, line):
"""Парсит упрощенный синтаксис: метод param1=value1 param2=value2"""
parts = line.strip().split()
if not parts:
return None, None
method = parts[0]
params = {}
for part in parts[1:]:
# Парсим key=value
if '=' in part:
key, value = part.split('=', 1)
# Пробуем преобразовать значение в число, если возможно
try:
value = int(value)
except ValueError:
try:
value = float(value)
except ValueError:
# Оставляем как строку
pass
params[key] = value
else:
# Если нет '=', считаем позиционным параметром с числовым ключом
try:
value = int(part)
except ValueError:
value = part
params[str(len(params))] = value
return method, params
def convert_to_array_params(self, params):
"""Конвертирует словарь параметров в массив, если ключи числовые"""
if all(key.isdigit() for key in params.keys()):
# Сортируем по числовым ключам и возвращаем массив значений
return [params[str(i)] for i in range(len(params))]
return params
def run(self):
print("Введите метод Kanboard API и параметры.")
print("Форматы:")
print(' JSON: {"method": "getProjectById", "params": {"project_id": 1}}')
print(' Простой: getProjectUsers project_id=32')
print(' Позиционный: getProjectUserRole 32 8')
print("Для выхода введите 'exit'")
while True:
line = input("Kanboard> ").strip()
if line.lower() in ("exit", "quit"):
break
if not line:
continue
# Определяем формат ввода
if line.startswith('{'):
# JSON формат
try:
data = json.loads(line)
method = data.get("method")
params = data.get("params", {})
except json.JSONDecodeError as e:
print(f"Ошибка JSON: {e}")
continue
else:
# Упрощенный формат
method, params = self.parse_simple_syntax(line)
if not method:
print("Не указан метод.")
continue
# Для методов, которые ожидают массив параметров, конвертируем
params = self.convert_to_array_params(params)
try:
result = self.api.call(method, params)
print(json.dumps(result, ensure_ascii=False, indent=2))
except Exception as e:
print(f"Ошибка API: {e}")