blob: c25d9ab3ad7ebcaa114b1dce6f19d64da0a1e514 [file] [log] [blame]
#!/usr/bin/env python3
r"""
This module provides validation functions like valid_value(), valid_integer(), etc. for robot programs.
"""
import re
import func_args as fa
import gen_print as gp
import gen_valid as gv
from robot.libraries.BuiltIn import BuiltIn
def valid_var_name(var_name):
r"""
Validate the robot variable name and return its value.
If the variable is undefined, this function will print an error message and call BuiltIn().fail().
Description of arguments():
var_name The name of the robot variable (e.g. "var1"). Do not include "${}" (e.g.
"${var1}". Just provide the simple name of the variable.
"""
# Note: get_variable_value() seems to have no trouble with local variables.
var_value = BuiltIn().get_variable_value("${" + var_name + "}")
if var_value is None:
var_value = "<undefined>"
error_message = gv.valid_value(
var_value, invalid_values=[var_value], var_name=var_name
)
BuiltIn().fail(error_message)
return var_value
def valid_init(var_name, *args, **kwargs):
r"""
Do initialization for variable validation and return var_name, args and kwargs.
This function is to be called by all of the various validation functions in this module.
This function is designed solely for use by other functions in this file.
Description of argument(s):
var_name The name of the variable to be validated.
args The positional arguments to be passed to a validation function.
kwargs The keyword arguments to be passed to a validation function.
"""
var_value = valid_var_name(var_name)
# Convert python string object definitions to objects (useful for robot callers).
args = fa.args_to_objects(args)
kwargs = fa.args_to_objects(kwargs)
return var_value, args, kwargs
def process_error_message(error_message):
r"""
Process an error message.
If error_message is non-blank, fail. Otherwise, do nothing.
This function is designed solely for use by other functions in this file.
Description of argument(s):
error_message The error message to be processed.
"""
if error_message:
error_message = gp.sprint_error_report(error_message)
BuiltIn().fail(error_message)
# The docstring header will be prepended to each validation function's existing docstring.
docstring_header = r"""
Fail if the variable named by var_name is invalid.
"""
def customize_doc_string(doc_string):
r"""
Customize a gen_valid function docstring and return the result.
This function is designed solely for use by other functions in this file.
The caller should pass a docstring from a gen_valid.py validation function. This docstring will be
changed to make a suitable docstring for this module's corresponding validation function.
For example:
Let's suppose that gen_valid.py has a function called "valid_value()". This module could make the
following call to essentially copy gen_valid's "valid_value()" function, modify it and then assign it to
the local version of the valid_value() function.
valid.__doc__ = customize_doc_string(gv.valid.__doc__)
Description of argument(s):
doc_string The docstring to be customized.
"""
doc_string = docstring_header + doc_string
doc_string = doc_string.split("\n")
start_ix = 0
# Find the "var_value" line.
start_ix = next(
(
index
for index, value in enumerate(doc_string[start_ix:], start_ix)
if re.match("[ ]+var_value ", value)
),
None,
)
# Replace the "var_value" line with our "var_name" line.
doc_string[start_ix] = (
" var_name "
+ "The name of the variable to be validated."
)
return "\n".join(doc_string)
# All of the following functions are robot wrappers for the equivalent functions defined in gen_valid.py.
# Note that the only difference between any two of these locally defined functions is the function name and
# the gv.<function name> which they call. Also, note that the docstring for each is created by modifying the
# docstring from the supporting gen_valid.py function.
def valid_type(var_name, *args, **kwargs):
var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
error_message = gv.valid_type(
var_value, *args, var_name=var_name, **kwargs
)
process_error_message(error_message)
def valid_value(var_name, *args, **kwargs):
var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
error_message = gv.valid_value(
var_value, *args, var_name=var_name, **kwargs
)
process_error_message(error_message)
def valid_range(var_name, *args, **kwargs):
var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
error_message = gv.valid_range(
var_value, *args, var_name=var_name, **kwargs
)
process_error_message(error_message)
def valid_integer(var_name, *args, **kwargs):
var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
error_message = gv.valid_integer(
var_value, *args, var_name=var_name, **kwargs
)
process_error_message(error_message)
def valid_float(var_name, *args, **kwargs):
var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
error_message = gv.valid_float(
var_value, *args, var_name=var_name, **kwargs
)
process_error_message(error_message)
def valid_date_time(var_name, *args, **kwargs):
var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
error_message = gv.valid_date_time(
var_value, *args, var_name=var_name, **kwargs
)
process_error_message(error_message)
def valid_dir_path(var_name, *args, **kwargs):
var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
error_message = gv.valid_dir_path(
var_value, *args, var_name=var_name, **kwargs
)
process_error_message(error_message)
def valid_file_path(var_name, *args, **kwargs):
var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
error_message = gv.valid_file_path(
var_value, *args, var_name=var_name, **kwargs
)
process_error_message(error_message)
def valid_path(var_name, *args, **kwargs):
var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
error_message = gv.valid_path(
var_value, *args, var_name=var_name, **kwargs
)
process_error_message(error_message)
def valid_list(var_name, *args, **kwargs):
var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
error_message = gv.valid_list(
var_value, *args, var_name=var_name, **kwargs
)
process_error_message(error_message)
def valid_dict(var_name, *args, **kwargs):
var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
error_message = gv.valid_dict(
var_value, *args, var_name=var_name, **kwargs
)
process_error_message(error_message)
def valid_program(var_name, *args, **kwargs):
var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
error_message = gv.valid_program(
var_value, *args, var_name=var_name, **kwargs
)
process_error_message(error_message)
def valid_length(var_name, *args, **kwargs):
var_value, args, kwargs = valid_init(var_name, *args, **kwargs)
error_message = gv.valid_length(
var_value, *args, var_name=var_name, **kwargs
)
process_error_message(error_message)
# Modify the validation function docstrings by calling customize_doc_string for each function in the
# func_names list.
func_names = [
"valid_type",
"valid_value",
"valid_range",
"valid_integer",
"valid_dir_path",
"valid_file_path",
"valid_path",
"valid_list",
"valid_dict",
"valid_program",
"valid_length",
"valid_float",
"valid_date_time",
]
for func_name in func_names:
cmd_buf = (
func_name
+ ".__doc__ = customize_doc_string(gv.raw_doc_strings['"
+ func_name
+ "'])"
)
exec(cmd_buf)