118176322SMichael Walsh#!/usr/bin/env python 218176322SMichael Walsh 318176322SMichael Walshr""" 484230c20SMichael WalshThis module provides validation functions like valid_value(), valid_integer(), 584230c20SMichael Walshetc. for robot programs. 618176322SMichael Walsh""" 718176322SMichael Walsh 884230c20SMichael Walshimport re 9c108e429SMichael Walshimport gen_print as gp 1018176322SMichael Walshimport gen_valid as gv 1184230c20SMichael Walshimport func_args as fa 1218176322SMichael Walsh 1318176322SMichael Walshfrom robot.libraries.BuiltIn import BuiltIn 1418176322SMichael Walsh 1518176322SMichael Walsh 1684230c20SMichael Walshdef valid_var_name(var_name): 1718176322SMichael Walsh r""" 1884230c20SMichael Walsh Validate the robot variable name and return its value. 193e26e109SMichael Walsh 2084230c20SMichael Walsh If the variable is undefined, this function will print an error message 2184230c20SMichael Walsh and call BuiltIn().fail(). 2218176322SMichael Walsh 2384230c20SMichael Walsh Description of arguments(): 2484230c20SMichael Walsh var_name The name of the robot variable (e.g. 2584230c20SMichael Walsh "var1"). Do not include "${}" (e.g. 2684230c20SMichael Walsh "${var1}". Just provide the simple name 2784230c20SMichael Walsh of the variable. 2818176322SMichael Walsh """ 2918176322SMichael Walsh 3018176322SMichael Walsh # Note: get_variable_value() seems to have no trouble with local variables. 3118176322SMichael Walsh var_value = BuiltIn().get_variable_value("${" + var_name + "}") 3218176322SMichael Walsh if var_value is None: 3384230c20SMichael Walsh var_value = "<undefined>" 3484230c20SMichael Walsh error_message = gv.valid_value(var_value, invalid_values=[var_value], 3584230c20SMichael Walsh var_name=var_name) 3618176322SMichael Walsh BuiltIn().fail(error_message) 3718176322SMichael Walsh 3884230c20SMichael Walsh return var_value 3918176322SMichael Walsh 4084230c20SMichael Walsh 4184230c20SMichael Walshdef valid_init(var_name, *args, **kwargs): 4218176322SMichael Walsh r""" 4384230c20SMichael Walsh Do initialization for variable validation and return var_name, args and 4484230c20SMichael Walsh kwargs. 453e26e109SMichael Walsh 4684230c20SMichael Walsh This function is to be called by all of the various validation functions 4784230c20SMichael Walsh in this module. 4818176322SMichael Walsh 4984230c20SMichael Walsh This function is designed solely for use by other functions in this file. 5018176322SMichael Walsh 5184230c20SMichael Walsh Description of argument(s): 5284230c20SMichael Walsh var_name The name of the variable to be validated. 5384230c20SMichael Walsh args The positional arguments to be passed to a 5484230c20SMichael Walsh validation function. 5584230c20SMichael Walsh kwargs The keyword arguments to be passed to a 5684230c20SMichael Walsh validation function. 5718176322SMichael Walsh """ 5818176322SMichael Walsh 5984230c20SMichael Walsh var_value = valid_var_name(var_name) 6084230c20SMichael Walsh # Convert python string object definitions to objects (useful for robot 6184230c20SMichael Walsh # callers). 6284230c20SMichael Walsh args = fa.args_to_objects(args) 6384230c20SMichael Walsh kwargs = fa.args_to_objects(kwargs) 6484230c20SMichael Walsh return var_value, args, kwargs 652c687e98SMichael Walsh 662c687e98SMichael Walsh 6784230c20SMichael Walshdef process_error_message(error_message): 682c687e98SMichael Walsh r""" 6984230c20SMichael Walsh Process an error message. 702c687e98SMichael Walsh 7184230c20SMichael Walsh If error_message is non-blank, fail. Otherwise, do nothing. 722c687e98SMichael Walsh 7384230c20SMichael Walsh This function is designed solely for use by other functions in this file. 742c687e98SMichael Walsh 7584230c20SMichael Walsh Description of argument(s): 7684230c20SMichael Walsh error_message The error message to be processed. 772c687e98SMichael Walsh """ 782c687e98SMichael Walsh 7984230c20SMichael Walsh if error_message: 80c108e429SMichael Walsh error_message = gp.sprint_error_report(error_message) 812c687e98SMichael Walsh BuiltIn().fail(error_message) 8284230c20SMichael Walsh 8384230c20SMichael Walsh 8484230c20SMichael Walsh# The docstring header will be pre-pended to each validation function's 8584230c20SMichael Walsh# existing docstring. 8684230c20SMichael Walshdocstring_header = \ 8784230c20SMichael Walsh r""" 8884230c20SMichael Walsh Fail if the variable named by var_name is invalid. 8984230c20SMichael Walsh """ 9084230c20SMichael Walsh 9184230c20SMichael Walsh 9284230c20SMichael Walshdef customize_doc_string(doc_string): 9384230c20SMichael Walsh r""" 9484230c20SMichael Walsh Customize a gen_valid function docstring and return the result. 9584230c20SMichael Walsh 9684230c20SMichael Walsh This function is designed solely for use by other functions in this file. 9784230c20SMichael Walsh 9884230c20SMichael Walsh The caller should pass a docstring from a gen_valid.py validation 9984230c20SMichael Walsh function. This docstring will be changed to make a suitable docstring for 10084230c20SMichael Walsh this module's corresponding validation function. 10184230c20SMichael Walsh 10284230c20SMichael Walsh For example: 10384230c20SMichael Walsh 10484230c20SMichael Walsh Let's suppose that gen_valid.py has a function called "valid_value()". 10584230c20SMichael Walsh This module could make the following call to essentially copy gen_valid's 10684230c20SMichael Walsh "valid_value()" function, modify it and then assign it to the local 10784230c20SMichael Walsh version of the valid_value() function. 10884230c20SMichael Walsh 10984230c20SMichael Walsh valid.__doc__ = customize_doc_string(gv.valid.__doc__) 11084230c20SMichael Walsh 11184230c20SMichael Walsh Description of argument(s): 11284230c20SMichael Walsh doc_string The docstring to be customized. 11384230c20SMichael Walsh """ 11484230c20SMichael Walsh 11584230c20SMichael Walsh doc_string = docstring_header + doc_string 11684230c20SMichael Walsh doc_string = doc_string.split("\n") 11784230c20SMichael Walsh 11884230c20SMichael Walsh start_ix = 0 11984230c20SMichael Walsh # Find the "var_value" line. 12084230c20SMichael Walsh start_ix = next((index for index, value in 12184230c20SMichael Walsh enumerate(doc_string[start_ix:], start_ix) 12284230c20SMichael Walsh if re.match("[ ]+var_value ", value)), None) 12384230c20SMichael Walsh # Replace the "var_value" line with our "var_name" line. 12484230c20SMichael Walsh doc_string[start_ix] = " var_name " \ 12584230c20SMichael Walsh + "The name of the variable to be validated." 12684230c20SMichael Walsh 12784230c20SMichael Walsh return "\n".join(doc_string) 12884230c20SMichael Walsh 12984230c20SMichael Walsh 13084230c20SMichael Walsh# All of the following functions are robot wrappers for the equivalent 13184230c20SMichael Walsh# functions defined in gen_valid.py. Note that the only difference between 13284230c20SMichael Walsh# any two of these locally defined functions is the function name and the 13384230c20SMichael Walsh# gv.<function name> which they call. Also, note that the docstring for each 13484230c20SMichael Walsh# is created by modifying the docstring from the supporting gen_valid.py 13584230c20SMichael Walsh# function. 13684230c20SMichael Walsh 13784230c20SMichael Walshdef valid_type(var_name, *args, **kwargs): 13884230c20SMichael Walsh 13984230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 14084230c20SMichael Walsh error_message = \ 14184230c20SMichael Walsh gv.valid_type(var_value, *args, var_name=var_name, **kwargs) 14284230c20SMichael Walsh process_error_message(error_message) 14384230c20SMichael Walsh 14484230c20SMichael Walsh 14584230c20SMichael Walshdef valid_value(var_name, *args, **kwargs): 14684230c20SMichael Walsh 14784230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 14884230c20SMichael Walsh error_message = \ 14984230c20SMichael Walsh gv.valid_value(var_value, *args, var_name=var_name, **kwargs) 15084230c20SMichael Walsh process_error_message(error_message) 15184230c20SMichael Walsh 15284230c20SMichael Walsh 15384230c20SMichael Walshdef valid_range(var_name, *args, **kwargs): 15484230c20SMichael Walsh 15584230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 15684230c20SMichael Walsh error_message = \ 15784230c20SMichael Walsh gv.valid_range(var_value, *args, var_name=var_name, **kwargs) 15884230c20SMichael Walsh process_error_message(error_message) 15984230c20SMichael Walsh 16084230c20SMichael Walsh 16184230c20SMichael Walshdef valid_integer(var_name, *args, **kwargs): 16284230c20SMichael Walsh 16384230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 16484230c20SMichael Walsh error_message = \ 16584230c20SMichael Walsh gv.valid_integer(var_value, *args, var_name=var_name, **kwargs) 16684230c20SMichael Walsh process_error_message(error_message) 16784230c20SMichael Walsh 16884230c20SMichael Walsh 16984230c20SMichael Walshdef valid_dir_path(var_name, *args, **kwargs): 17084230c20SMichael Walsh 17184230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 17284230c20SMichael Walsh error_message = \ 17384230c20SMichael Walsh gv.valid_dir_path(var_value, *args, var_name=var_name, **kwargs) 17484230c20SMichael Walsh process_error_message(error_message) 17584230c20SMichael Walsh 17684230c20SMichael Walsh 17784230c20SMichael Walshdef valid_file_path(var_name, *args, **kwargs): 17884230c20SMichael Walsh 17984230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 18084230c20SMichael Walsh error_message = \ 18184230c20SMichael Walsh gv.valid_file_path(var_value, *args, var_name=var_name, **kwargs) 18284230c20SMichael Walsh process_error_message(error_message) 18384230c20SMichael Walsh 18484230c20SMichael Walsh 18584230c20SMichael Walshdef valid_path(var_name, *args, **kwargs): 18684230c20SMichael Walsh 18784230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 18884230c20SMichael Walsh error_message = \ 18984230c20SMichael Walsh gv.valid_path(var_value, *args, var_name=var_name, **kwargs) 19084230c20SMichael Walsh process_error_message(error_message) 19184230c20SMichael Walsh 19284230c20SMichael Walsh 19384230c20SMichael Walshdef valid_list(var_name, *args, **kwargs): 19484230c20SMichael Walsh 19584230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 19684230c20SMichael Walsh error_message = \ 19784230c20SMichael Walsh gv.valid_list(var_value, *args, var_name=var_name, **kwargs) 19884230c20SMichael Walsh process_error_message(error_message) 19984230c20SMichael Walsh 20084230c20SMichael Walsh 20184230c20SMichael Walshdef valid_dict(var_name, *args, **kwargs): 20284230c20SMichael Walsh 20384230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 20484230c20SMichael Walsh error_message = \ 20584230c20SMichael Walsh gv.valid_dict(var_value, *args, var_name=var_name, **kwargs) 20684230c20SMichael Walsh process_error_message(error_message) 20784230c20SMichael Walsh 20884230c20SMichael Walsh 209be3a8150SMichael Walshdef valid_program(var_name, *args, **kwargs): 210be3a8150SMichael Walsh 211be3a8150SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 212be3a8150SMichael Walsh error_message = \ 213be3a8150SMichael Walsh gv.valid_program(var_value, *args, var_name=var_name, **kwargs) 214be3a8150SMichael Walsh process_error_message(error_message) 215be3a8150SMichael Walsh 216be3a8150SMichael Walsh 217*b9d8dfd2SMichael Walshdef valid_length(var_name, *args, **kwargs): 218*b9d8dfd2SMichael Walsh 219*b9d8dfd2SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 220*b9d8dfd2SMichael Walsh error_message = \ 221*b9d8dfd2SMichael Walsh gv.valid_length(var_value, *args, var_name=var_name, **kwargs) 222*b9d8dfd2SMichael Walsh process_error_message(error_message) 223*b9d8dfd2SMichael Walsh 224*b9d8dfd2SMichael Walsh 22584230c20SMichael Walsh# Modify the validation function docstrings by calling customize_doc_string 22684230c20SMichael Walsh# for each function in the func_names list. 22784230c20SMichael Walshfunc_names = [ 22884230c20SMichael Walsh "valid_type", "valid_value", "valid_range", "valid_integer", 22984230c20SMichael Walsh "valid_dir_path", "valid_file_path", "valid_path", "valid_list", 230be3a8150SMichael Walsh "valid_dict", "valid_program" 23184230c20SMichael Walsh] 23284230c20SMichael Walsh 23384230c20SMichael Walshfor func_name in func_names: 23484230c20SMichael Walsh cmd_buf = func_name \ 23584230c20SMichael Walsh + ".__doc__ = customize_doc_string(gv.raw_doc_strings['" \ 23684230c20SMichael Walsh + func_name + "'])" 23784230c20SMichael Walsh exec(cmd_buf) 238