Initial commit

This commit is contained in:
2025-10-18 00:52:08 +03:00
commit e049a302d3
18 changed files with 1541 additions and 0 deletions

90
lib/interactive.py Normal file
View 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}")