mirror of
https://github.com/PR0M3TH3AN/VoxVera.git
synced 2025-09-08 06:58:42 +00:00
Add validators for interactive prompts
This commit is contained in:
110
voxvera/cli.py
110
voxvera/cli.py
@@ -72,23 +72,83 @@ def _len_transform(limit: int):
|
|||||||
return _t
|
return _t
|
||||||
|
|
||||||
|
|
||||||
|
def _len_validator(limit: int):
|
||||||
|
def _v(val: str):
|
||||||
|
l = len(val)
|
||||||
|
if l > limit:
|
||||||
|
return f"Must be at most {limit} characters ({l})"
|
||||||
|
return True
|
||||||
|
return _v
|
||||||
|
|
||||||
|
|
||||||
|
def _subdomain_validator(val: str):
|
||||||
|
if len(val) > 63:
|
||||||
|
return "Subdomain must be at most 63 characters"
|
||||||
|
if not re.fullmatch(r"[a-z0-9-]+", val):
|
||||||
|
return "Use only lowercase letters, numbers and '-'"
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
def interactive_update(config_path: str):
|
def interactive_update(config_path: str):
|
||||||
data = load_config(config_path)
|
data = load_config(config_path)
|
||||||
console = Console()
|
console = Console()
|
||||||
|
|
||||||
console.rule("Metadata")
|
console.rule("Metadata")
|
||||||
meta_qs = [
|
meta_qs = [
|
||||||
{"type": "input", "message": "Name", "name": "name", "default": data.get("name", ""), "transformer": _len_transform(60)},
|
{
|
||||||
{"type": "input", "message": "Subdomain", "name": "subdomain", "default": data.get("subdomain", ""), "transformer": _len_transform(63)},
|
"type": "input",
|
||||||
{"type": "input", "message": "Title", "name": "title", "default": data.get("title", ""), "transformer": _len_transform(60)},
|
"message": "Name",
|
||||||
{"type": "input", "message": "Subtitle", "name": "subtitle", "default": data.get("subtitle", ""), "transformer": _len_transform(80)},
|
"name": "name",
|
||||||
{"type": "input", "message": "Headline", "name": "headline", "default": data.get("headline", ""), "transformer": _len_transform(80)},
|
"default": data.get("name", ""),
|
||||||
|
"transformer": _len_transform(60),
|
||||||
|
"validate": _len_validator(60),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"message": "Subdomain",
|
||||||
|
"name": "subdomain",
|
||||||
|
"default": data.get("subdomain", ""),
|
||||||
|
"transformer": _len_transform(63),
|
||||||
|
"validate": _subdomain_validator,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"message": "Title",
|
||||||
|
"name": "title",
|
||||||
|
"default": data.get("title", ""),
|
||||||
|
"transformer": _len_transform(60),
|
||||||
|
"validate": _len_validator(60),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"message": "Subtitle",
|
||||||
|
"name": "subtitle",
|
||||||
|
"default": data.get("subtitle", ""),
|
||||||
|
"transformer": _len_transform(80),
|
||||||
|
"validate": _len_validator(80),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"message": "Headline",
|
||||||
|
"name": "headline",
|
||||||
|
"default": data.get("headline", ""),
|
||||||
|
"transformer": _len_transform(80),
|
||||||
|
"validate": _len_validator(80),
|
||||||
|
},
|
||||||
]
|
]
|
||||||
data.update(prompt(meta_qs))
|
data.update(prompt(meta_qs))
|
||||||
|
|
||||||
console.rule("Body text")
|
console.rule("Body text")
|
||||||
body = open_editor(data.get("content", ""))
|
while True:
|
||||||
console.print(f"Body length: {len(body)}/1000", style="red" if len(body) > 1000 else "green")
|
body = open_editor(data.get("content", ""))
|
||||||
|
l = len(body)
|
||||||
|
if l > 1000:
|
||||||
|
console.print(f"Body length: {l}/1000 exceeds limit", style="red")
|
||||||
|
if not inquirer.confirm(message="Edit again?", default=True).execute():
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
console.print(f"Body length: {l}/1000", style="green")
|
||||||
|
break
|
||||||
data["content"] = body
|
data["content"] = body
|
||||||
|
|
||||||
console.rule("Links")
|
console.rule("Links")
|
||||||
@@ -105,10 +165,38 @@ def interactive_update(config_path: str):
|
|||||||
constructed = f"https://{data['subdomain']}.example.com"
|
constructed = f"https://{data['subdomain']}.example.com"
|
||||||
|
|
||||||
link_qs = [
|
link_qs = [
|
||||||
{"type": "input", "message": "URL", "name": "url", "default": data.get("url", constructed), "transformer": _len_transform(200)},
|
{
|
||||||
{"type": "input", "message": "Tear-off link", "name": "tear_off_link", "default": data.get("tear_off_link", constructed), "transformer": _len_transform(200)},
|
"type": "input",
|
||||||
{"type": "input", "message": "URL message", "name": "url_message", "default": data.get("url_message", ""), "transformer": _len_transform(120)},
|
"message": "URL",
|
||||||
{"type": "input", "message": "Binary message", "name": "binary_message", "default": data.get("binary_message", ""), "transformer": _len_transform(120)},
|
"name": "url",
|
||||||
|
"default": data.get("url", constructed),
|
||||||
|
"transformer": _len_transform(200),
|
||||||
|
"validate": _len_validator(200),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"message": "Tear-off link",
|
||||||
|
"name": "tear_off_link",
|
||||||
|
"default": data.get("tear_off_link", constructed),
|
||||||
|
"transformer": _len_transform(200),
|
||||||
|
"validate": _len_validator(200),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"message": "URL message",
|
||||||
|
"name": "url_message",
|
||||||
|
"default": data.get("url_message", ""),
|
||||||
|
"transformer": _len_transform(120),
|
||||||
|
"validate": _len_validator(120),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "input",
|
||||||
|
"message": "Binary message",
|
||||||
|
"name": "binary_message",
|
||||||
|
"default": data.get("binary_message", ""),
|
||||||
|
"transformer": _len_transform(120),
|
||||||
|
"validate": _len_validator(120),
|
||||||
|
},
|
||||||
]
|
]
|
||||||
data.update(prompt(link_qs))
|
data.update(prompt(link_qs))
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user