/
liquid-g
/
liquid-code
Обзор
Документация
Войти
/
liquid-g
/
liquid-code
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop-0.4
src/liquidcode/commands/core/interactive_utils.py
76 строк
3 KB
User
v0.4.16: middleware priorities docs, code refactoring, logging and reserved words check
07 июл 2026, 00:02
07 июл 2026, 00:02
6c94e1e
Код
Авторство
О чём код?
import re from typing import Optional, Dict, Any, List from .naming_utils import RESERVED_WORDS def ask_field() -> Optional[Dict[str, Any]]: """ Интерактивно запрашивает поле для сущности. Возвращает словарь с полями: name, type, nullable, length. Если пользователь ввёл пустое имя, возвращает None. """ print("\nДобавление поля (оставьте имя пустым для завершения):") name = input("Имя поля: ").strip() if not name: return None if not re.match(r'^[a-zA-Z_][a-zA-Z0-9_]*$', name): print("❌ Недопустимое имя поля. Используйте буквы, цифры, подчёркивание.") return ask_field() # Проверка на зарезервированные слова Python if name in RESERVED_WORDS: print(f"⚠️ '{name}' — это зарезервированное слово Python. Будет преобразовано в '{name}_field'.") print(" Для избежания путаницы выберите другое имя.") ftype = input("Тип (string, int, float, bool, list, dict, ...) [string]: ").strip() or "string" nullable = input("Может быть null? (y/n) [n]: ").strip().lower() == 'y' length = input("Длина (для string, опционально): ").strip() if length: try: length = int(length) except ValueError: length = None else: length = None return { 'name': name, 'type': ftype, 'nullable': nullable, 'length': length, } def ask_fields() -> List[Dict[str, Any]]: """Циклически запрашивает поля до тех пор, пока пользователь не введёт пустое имя.""" fields = [] while True: field = ask_field() if field is None: break fields.append(field) return fields def ask_methods() -> List[str]: """Интерактивный выбор методов для контроллера.""" methods = [ ('index', 'GET /', 'список'), ('show', 'GET /{id}', 'просмотр'), ('create', 'POST /', 'создание'), ('update', 'PUT /{id}', 'обновление'), ('delete', 'DELETE /{id}', 'удаление'), ] print("\nВыберите методы для контроллера:") for i, (name, route, desc) in enumerate(methods, 1): print(f" {i}. {name} ({route}) — {desc}") default = "1,2,3,4,5" choice = input(f"Введите номера через запятую (по умолчанию все: {default}): ").strip() if not choice: choice = default try: selected = [int(x.strip()) for x in choice.split(',') if x.strip()] return [methods[i - 1][0] for i in selected if 1 <= i <= len(methods)] except ValueError: print("Неверный ввод. Будут созданы все методы.") return [m[0] for m in methods]