91 lines
3.6 KiB
Python
91 lines
3.6 KiB
Python
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}")
|
||
|