Initial commit
This commit is contained in:
90
lib/interactive.py
Normal file
90
lib/interactive.py
Normal file
@@ -0,0 +1,90 @@
|
||||
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}")
|
||||
|
||||
Reference in New Issue
Block a user