blob: 88048f18bc7a83b10103f46f64eaccfc362bb34c [file] [log] [blame]
#!/usr/bin/env python
r"""
This module provides validation functions like valid_value(), valid_integer(),
etc. for robot programs.
"""
import re
import gen_print as gp
import gen_valid as gv
import func_args as fa
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 pre-pended 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_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)
# 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"
]
for func_name in func_names:
cmd_buf = func_name \
+ ".__doc__ = customize_doc_string(gv.raw_doc_strings['" \
+ func_name + "'])"
exec(cmd_buf)
# Define aliases for backward compatibility.
rvalid_value = valid_value