Use parse_to_any, for protfuncs, handle empty list in $choice funcparser func
This commit is contained in:
parent
d3fe999c4b
commit
6e45ac0cb1
2 changed files with 17 additions and 11 deletions
|
|
@ -132,7 +132,7 @@ def homogenize_prototype(prototype, custom_keys=None):
|
||||||
# attrs must be on form [(key, value, category, lockstr)]
|
# attrs must be on form [(key, value, category, lockstr)]
|
||||||
if not is_iter(attr):
|
if not is_iter(attr):
|
||||||
logger.log_error(
|
logger.log_error(
|
||||||
"Prototype's 'attr' field must " f"be a list of tuples: {prototype}"
|
f"Prototype's 'attr' field must be a list of tuples: {prototype}"
|
||||||
)
|
)
|
||||||
elif attr:
|
elif attr:
|
||||||
nattr = len(attr)
|
nattr = len(attr)
|
||||||
|
|
@ -237,8 +237,7 @@ def load_module_prototypes(*mod_or_prototypes, override=True):
|
||||||
for prot in prototype_list:
|
for prot in prototype_list:
|
||||||
if not isinstance(prot, dict):
|
if not isinstance(prot, dict):
|
||||||
logger.log_err(
|
logger.log_err(
|
||||||
f"Prototype read from {mod}.PROTOTYPE_LIST "
|
f"Prototype read from {mod}.PROTOTYPE_LIST is not a dict (skipping): {prot}"
|
||||||
f"is not a dict (skipping): {prot}"
|
|
||||||
)
|
)
|
||||||
continue
|
continue
|
||||||
elif "prototype_key" not in prot:
|
elif "prototype_key" not in prot:
|
||||||
|
|
@ -823,7 +822,7 @@ def validate_prototype(
|
||||||
if strict and not (typeclass or prototype_parent):
|
if strict and not (typeclass or prototype_parent):
|
||||||
if is_prototype_base:
|
if is_prototype_base:
|
||||||
_flags["errors"].append(
|
_flags["errors"].append(
|
||||||
_("Prototype {protkey} requires `typeclass` " "or 'prototype_parent'.").format(
|
_("Prototype {protkey} requires `typeclass` or 'prototype_parent'.").format(
|
||||||
protkey=protkey
|
protkey=protkey
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
@ -866,8 +865,7 @@ def validate_prototype(
|
||||||
if not protparent:
|
if not protparent:
|
||||||
_flags["errors"].append(
|
_flags["errors"].append(
|
||||||
_(
|
_(
|
||||||
"Prototype {protkey}'s `prototype_parent` (named '{parent}') "
|
"Prototype {protkey}'s `prototype_parent` (named '{parent}') was not found."
|
||||||
"was not found."
|
|
||||||
).format(protkey=protkey, parent=protstring)
|
).format(protkey=protkey, parent=protstring)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -959,7 +957,7 @@ def protfunc_parser(
|
||||||
if not isinstance(value, str):
|
if not isinstance(value, str):
|
||||||
return value
|
return value
|
||||||
|
|
||||||
result = FUNC_PARSER.parse(value, raise_errors=True, return_str=False, caller=caller, **kwargs)
|
result = FUNC_PARSER.parse_to_any(value, raise_errors=True, caller=caller, **kwargs)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -587,7 +587,9 @@ class FuncParser:
|
||||||
|
|
||||||
return fullstr
|
return fullstr
|
||||||
|
|
||||||
def parse_to_any(self, string, raise_errors=False, **reserved_kwargs):
|
def parse_to_any(
|
||||||
|
self, string, raise_errors=False, escape=False, strip=False, **reserved_kwargs
|
||||||
|
):
|
||||||
"""
|
"""
|
||||||
This parses a string and if the string only contains a "$func(...)",
|
This parses a string and if the string only contains a "$func(...)",
|
||||||
the return will be the return value of that function, even if it's not
|
the return will be the return value of that function, even if it's not
|
||||||
|
|
@ -599,6 +601,10 @@ class FuncParser:
|
||||||
raise_errors (bool, optional): If unset, leave a failing (or
|
raise_errors (bool, optional): If unset, leave a failing (or
|
||||||
unrecognized) inline function as unparsed in the string. If set,
|
unrecognized) inline function as unparsed in the string. If set,
|
||||||
raise an ParsingError.
|
raise an ParsingError.
|
||||||
|
escape (bool, optional): If set, escape all found functions so they
|
||||||
|
are not executed by later parsing.
|
||||||
|
strip (bool, optional): If set, strip any inline funcs from string
|
||||||
|
as if they were not there.
|
||||||
**reserved_kwargs: If given, these are guaranteed to _always_ pass
|
**reserved_kwargs: If given, these are guaranteed to _always_ pass
|
||||||
as part of each parsed callable's **kwargs. These override
|
as part of each parsed callable's **kwargs. These override
|
||||||
same-named default options given in `__init__` as well as any
|
same-named default options given in `__init__` as well as any
|
||||||
|
|
@ -635,9 +641,9 @@ class FuncParser:
|
||||||
"""
|
"""
|
||||||
return self.parse(
|
return self.parse(
|
||||||
string,
|
string,
|
||||||
raise_errors=False,
|
raise_errors=raise_errors,
|
||||||
escape=False,
|
escape=escape,
|
||||||
strip=False,
|
strip=strip,
|
||||||
return_str=False,
|
return_str=False,
|
||||||
**reserved_kwargs,
|
**reserved_kwargs,
|
||||||
)
|
)
|
||||||
|
|
@ -873,6 +879,8 @@ def funcparser_callable_choice(*args, **kwargs):
|
||||||
if not args:
|
if not args:
|
||||||
return ""
|
return ""
|
||||||
args, _ = safe_convert_to_types(("py", {}), *args, **kwargs)
|
args, _ = safe_convert_to_types(("py", {}), *args, **kwargs)
|
||||||
|
if not args[0]:
|
||||||
|
return ""
|
||||||
try:
|
try:
|
||||||
return random.choice(args[0])
|
return random.choice(args[0])
|
||||||
except Exception:
|
except Exception:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue