Skip to content

Commit 497819e

Browse files
authored
Fixed windows support. (#144)
Signed-off-by: Pavel Kirilin <win10@list.ru>
1 parent 1258847 commit 497819e

1 file changed

Lines changed: 53 additions & 29 deletions

File tree

fastapi_template/input_model.py

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@
44
from pydantic import BaseModel
55
import click
66
import abc
7-
from simple_term_menu import TerminalMenu
87
from collections import UserDict
8+
from prompt_toolkit.shortcuts import checkboxlist_dialog, radiolist_dialog
9+
10+
try:
11+
from simple_term_menu import TerminalMenu
12+
except Exception:
13+
TerminalMenu = None
914

1015

1116
class Database(BaseModel):
@@ -50,6 +55,7 @@ def generated_name(self) -> str:
5055
class BaseMenuModel(BaseModel, abc.ABC):
5156
title: str
5257
entries: list[MenuEntry]
58+
description: str = ""
5359

5460
def _preview(self, current_value: str):
5561

@@ -122,20 +128,31 @@ def ask(self, context: "BuilderContext") -> Optional["BuilderContext"]:
122128
available_entries.append(entry)
123129
elif not entry.is_hidden(context):
124130
available_entries.append(entry)
125-
126-
menu = TerminalMenu(
127-
title=self.title,
128-
menu_entries=[entry.user_view for entry in available_entries],
129-
multi_select=False,
130-
preview_title="Description",
131-
preview_command=self._preview,
132-
preview_size=0.5,
133-
)
134-
idx = menu.show()
135-
if idx is None:
136-
return None
137-
138-
chosen_entry = available_entries[idx]
131+
if TerminalMenu is not None:
132+
menu = TerminalMenu(
133+
title=self.title,
134+
menu_entries=[entry.user_view for entry in available_entries],
135+
multi_select=False,
136+
preview_title="Description",
137+
preview_command=self._preview,
138+
preview_size=0.5,
139+
)
140+
idx = menu.show()
141+
if idx is None:
142+
return None
143+
144+
chosen_entry = available_entries[idx]
145+
else:
146+
chosen_entry = (
147+
radiolist_dialog(
148+
title=self.title,
149+
text=self.description,
150+
values=[
151+
(entry, entry.user_view) for entry in available_entries
152+
],
153+
).run()
154+
or SKIP_ENTRY
155+
)
139156

140157
if chosen_entry == SKIP_ENTRY:
141158
return
@@ -190,22 +207,29 @@ def ask(self, context: "BuilderContext") -> Optional["BuilderContext"]:
190207
elif not entry.is_hidden(context):
191208
visible_entries.append(entry)
192209

193-
menu = TerminalMenu(
194-
title=self.title,
195-
menu_entries=[entry.user_view for entry in visible_entries],
196-
multi_select=True,
197-
preview_title="Description",
198-
preview_command=self._preview,
199-
)
210+
if TerminalMenu is not None:
211+
menu = TerminalMenu(
212+
title=self.title,
213+
menu_entries=[entry.user_view for entry in visible_entries],
214+
multi_select=True,
215+
preview_title="Description",
216+
preview_command=self._preview,
217+
)
200218

201-
idxs = menu.show()
219+
idxs = menu.show()
202220

203-
if idxs is None:
204-
return None
221+
if idxs is None:
222+
return None
205223

206-
chosen_entries = []
207-
for idx in idxs:
208-
chosen_entries.append(visible_entries[idx])
224+
chosen_entries = []
225+
for idx in idxs:
226+
chosen_entries.append(visible_entries[idx])
227+
else:
228+
chosen_entries = checkboxlist_dialog(
229+
title=self.title,
230+
text=self.description,
231+
values=[(entry, entry.user_view) for entry in visible_entries],
232+
).run() or [SKIP_ENTRY]
209233

210234
if chosen_entries == [SKIP_ENTRY]:
211235
return context
@@ -232,5 +256,5 @@ def __getattr__(self, name: str) -> Any:
232256
def __setattr__(self, name: str, value: Any) -> None:
233257
self[name] = value
234258

235-
def dict(self) -> str:
259+
def dict(self) -> dict[str, Any]:
236260
return self.__dict__["data"]

0 commit comments

Comments
 (0)