118176322SMichael Walsh#!/usr/bin/env python 218176322SMichael Walsh 318176322SMichael Walshr""" 4*410b1787SMichael WalshThis module provides validation functions like valid_value(), valid_integer(), etc. for robot programs. 518176322SMichael Walsh""" 618176322SMichael Walsh 784230c20SMichael Walshimport re 8c108e429SMichael Walshimport gen_print as gp 918176322SMichael Walshimport gen_valid as gv 1084230c20SMichael Walshimport func_args as fa 1118176322SMichael Walsh 1218176322SMichael Walshfrom robot.libraries.BuiltIn import BuiltIn 1318176322SMichael Walsh 1418176322SMichael Walsh 1584230c20SMichael Walshdef valid_var_name(var_name): 1618176322SMichael Walsh r""" 1784230c20SMichael Walsh Validate the robot variable name and return its value. 183e26e109SMichael Walsh 19*410b1787SMichael Walsh If the variable is undefined, this function will print an error message and call BuiltIn().fail(). 2018176322SMichael Walsh 2184230c20SMichael Walsh Description of arguments(): 22*410b1787SMichael Walsh var_name The name of the robot variable (e.g. "var1"). Do not include "${}" (e.g. 23*410b1787SMichael Walsh "${var1}". Just provide the simple name of the variable. 2418176322SMichael Walsh """ 2518176322SMichael Walsh 2618176322SMichael Walsh # Note: get_variable_value() seems to have no trouble with local variables. 2718176322SMichael Walsh var_value = BuiltIn().get_variable_value("${" + var_name + "}") 2818176322SMichael Walsh if var_value is None: 2984230c20SMichael Walsh var_value = "<undefined>" 3084230c20SMichael Walsh error_message = gv.valid_value(var_value, invalid_values=[var_value], 3184230c20SMichael Walsh var_name=var_name) 3218176322SMichael Walsh BuiltIn().fail(error_message) 3318176322SMichael Walsh 3484230c20SMichael Walsh return var_value 3518176322SMichael Walsh 3684230c20SMichael Walsh 3784230c20SMichael Walshdef valid_init(var_name, *args, **kwargs): 3818176322SMichael Walsh r""" 39*410b1787SMichael Walsh Do initialization for variable validation and return var_name, args and kwargs. 403e26e109SMichael Walsh 41*410b1787SMichael Walsh This function is to be called by all of the various validation functions in this module. 4218176322SMichael Walsh 4384230c20SMichael Walsh This function is designed solely for use by other functions in this file. 4418176322SMichael Walsh 4584230c20SMichael Walsh Description of argument(s): 4684230c20SMichael Walsh var_name The name of the variable to be validated. 47*410b1787SMichael Walsh args The positional arguments to be passed to a validation function. 48*410b1787SMichael Walsh kwargs The keyword arguments to be passed to a validation function. 4918176322SMichael Walsh """ 5018176322SMichael Walsh 5184230c20SMichael Walsh var_value = valid_var_name(var_name) 52*410b1787SMichael Walsh # Convert python string object definitions to objects (useful for robot callers). 5384230c20SMichael Walsh args = fa.args_to_objects(args) 5484230c20SMichael Walsh kwargs = fa.args_to_objects(kwargs) 5584230c20SMichael Walsh return var_value, args, kwargs 562c687e98SMichael Walsh 572c687e98SMichael Walsh 5884230c20SMichael Walshdef process_error_message(error_message): 592c687e98SMichael Walsh r""" 6084230c20SMichael Walsh Process an error message. 612c687e98SMichael Walsh 6284230c20SMichael Walsh If error_message is non-blank, fail. Otherwise, do nothing. 632c687e98SMichael Walsh 6484230c20SMichael Walsh This function is designed solely for use by other functions in this file. 652c687e98SMichael Walsh 6684230c20SMichael Walsh Description of argument(s): 6784230c20SMichael Walsh error_message The error message to be processed. 682c687e98SMichael Walsh """ 692c687e98SMichael Walsh 7084230c20SMichael Walsh if error_message: 71c108e429SMichael Walsh error_message = gp.sprint_error_report(error_message) 722c687e98SMichael Walsh BuiltIn().fail(error_message) 7384230c20SMichael Walsh 7484230c20SMichael Walsh 75*410b1787SMichael Walsh# The docstring header will be pre-pended to each validation function's existing docstring. 7684230c20SMichael Walshdocstring_header = \ 7784230c20SMichael Walsh r""" 7884230c20SMichael Walsh Fail if the variable named by var_name is invalid. 7984230c20SMichael Walsh """ 8084230c20SMichael Walsh 8184230c20SMichael Walsh 8284230c20SMichael Walshdef customize_doc_string(doc_string): 8384230c20SMichael Walsh r""" 8484230c20SMichael Walsh Customize a gen_valid function docstring and return the result. 8584230c20SMichael Walsh 8684230c20SMichael Walsh This function is designed solely for use by other functions in this file. 8784230c20SMichael Walsh 88*410b1787SMichael Walsh The caller should pass a docstring from a gen_valid.py validation function. This docstring will be 89*410b1787SMichael Walsh changed to make a suitable docstring for this module's corresponding validation function. 9084230c20SMichael Walsh 9184230c20SMichael Walsh For example: 9284230c20SMichael Walsh 93*410b1787SMichael Walsh Let's suppose that gen_valid.py has a function called "valid_value()". This module could make the 94*410b1787SMichael Walsh following call to essentially copy gen_valid's "valid_value()" function, modify it and then assign it to 95*410b1787SMichael Walsh the local version of the valid_value() function. 9684230c20SMichael Walsh 9784230c20SMichael Walsh valid.__doc__ = customize_doc_string(gv.valid.__doc__) 9884230c20SMichael Walsh 9984230c20SMichael Walsh Description of argument(s): 10084230c20SMichael Walsh doc_string The docstring to be customized. 10184230c20SMichael Walsh """ 10284230c20SMichael Walsh 10384230c20SMichael Walsh doc_string = docstring_header + doc_string 10484230c20SMichael Walsh doc_string = doc_string.split("\n") 10584230c20SMichael Walsh 10684230c20SMichael Walsh start_ix = 0 10784230c20SMichael Walsh # Find the "var_value" line. 10884230c20SMichael Walsh start_ix = next((index for index, value in 10984230c20SMichael Walsh enumerate(doc_string[start_ix:], start_ix) 11084230c20SMichael Walsh if re.match("[ ]+var_value ", value)), None) 11184230c20SMichael Walsh # Replace the "var_value" line with our "var_name" line. 11284230c20SMichael Walsh doc_string[start_ix] = " var_name " \ 11384230c20SMichael Walsh + "The name of the variable to be validated." 11484230c20SMichael Walsh 11584230c20SMichael Walsh return "\n".join(doc_string) 11684230c20SMichael Walsh 11784230c20SMichael Walsh 118*410b1787SMichael Walsh# All of the following functions are robot wrappers for the equivalent functions defined in gen_valid.py. 119*410b1787SMichael Walsh# Note that the only difference between any two of these locally defined functions is the function name and 120*410b1787SMichael Walsh# the gv.<function name> which they call. Also, note that the docstring for each is created by modifying the 121*410b1787SMichael Walsh# docstring from the supporting gen_valid.py function. 12284230c20SMichael Walsh 12384230c20SMichael Walshdef valid_type(var_name, *args, **kwargs): 12484230c20SMichael Walsh 12584230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 12684230c20SMichael Walsh error_message = \ 12784230c20SMichael Walsh gv.valid_type(var_value, *args, var_name=var_name, **kwargs) 12884230c20SMichael Walsh process_error_message(error_message) 12984230c20SMichael Walsh 13084230c20SMichael Walsh 13184230c20SMichael Walshdef valid_value(var_name, *args, **kwargs): 13284230c20SMichael Walsh 13384230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 13484230c20SMichael Walsh error_message = \ 13584230c20SMichael Walsh gv.valid_value(var_value, *args, var_name=var_name, **kwargs) 13684230c20SMichael Walsh process_error_message(error_message) 13784230c20SMichael Walsh 13884230c20SMichael Walsh 13984230c20SMichael Walshdef valid_range(var_name, *args, **kwargs): 14084230c20SMichael Walsh 14184230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 14284230c20SMichael Walsh error_message = \ 14384230c20SMichael Walsh gv.valid_range(var_value, *args, var_name=var_name, **kwargs) 14484230c20SMichael Walsh process_error_message(error_message) 14584230c20SMichael Walsh 14684230c20SMichael Walsh 14784230c20SMichael Walshdef valid_integer(var_name, *args, **kwargs): 14884230c20SMichael Walsh 14984230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 15084230c20SMichael Walsh error_message = \ 15184230c20SMichael Walsh gv.valid_integer(var_value, *args, var_name=var_name, **kwargs) 15284230c20SMichael Walsh process_error_message(error_message) 15384230c20SMichael Walsh 15484230c20SMichael Walsh 15584230c20SMichael Walshdef valid_dir_path(var_name, *args, **kwargs): 15684230c20SMichael Walsh 15784230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 15884230c20SMichael Walsh error_message = \ 15984230c20SMichael Walsh gv.valid_dir_path(var_value, *args, var_name=var_name, **kwargs) 16084230c20SMichael Walsh process_error_message(error_message) 16184230c20SMichael Walsh 16284230c20SMichael Walsh 16384230c20SMichael Walshdef valid_file_path(var_name, *args, **kwargs): 16484230c20SMichael Walsh 16584230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 16684230c20SMichael Walsh error_message = \ 16784230c20SMichael Walsh gv.valid_file_path(var_value, *args, var_name=var_name, **kwargs) 16884230c20SMichael Walsh process_error_message(error_message) 16984230c20SMichael Walsh 17084230c20SMichael Walsh 17184230c20SMichael Walshdef valid_path(var_name, *args, **kwargs): 17284230c20SMichael Walsh 17384230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 17484230c20SMichael Walsh error_message = \ 17584230c20SMichael Walsh gv.valid_path(var_value, *args, var_name=var_name, **kwargs) 17684230c20SMichael Walsh process_error_message(error_message) 17784230c20SMichael Walsh 17884230c20SMichael Walsh 17984230c20SMichael Walshdef valid_list(var_name, *args, **kwargs): 18084230c20SMichael Walsh 18184230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 18284230c20SMichael Walsh error_message = \ 18384230c20SMichael Walsh gv.valid_list(var_value, *args, var_name=var_name, **kwargs) 18484230c20SMichael Walsh process_error_message(error_message) 18584230c20SMichael Walsh 18684230c20SMichael Walsh 18784230c20SMichael Walshdef valid_dict(var_name, *args, **kwargs): 18884230c20SMichael Walsh 18984230c20SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 19084230c20SMichael Walsh error_message = \ 19184230c20SMichael Walsh gv.valid_dict(var_value, *args, var_name=var_name, **kwargs) 19284230c20SMichael Walsh process_error_message(error_message) 19384230c20SMichael Walsh 19484230c20SMichael Walsh 195be3a8150SMichael Walshdef valid_program(var_name, *args, **kwargs): 196be3a8150SMichael Walsh 197be3a8150SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 198be3a8150SMichael Walsh error_message = \ 199be3a8150SMichael Walsh gv.valid_program(var_value, *args, var_name=var_name, **kwargs) 200be3a8150SMichael Walsh process_error_message(error_message) 201be3a8150SMichael Walsh 202be3a8150SMichael Walsh 203b9d8dfd2SMichael Walshdef valid_length(var_name, *args, **kwargs): 204b9d8dfd2SMichael Walsh 205b9d8dfd2SMichael Walsh var_value, args, kwargs = valid_init(var_name, *args, **kwargs) 206b9d8dfd2SMichael Walsh error_message = \ 207b9d8dfd2SMichael Walsh gv.valid_length(var_value, *args, var_name=var_name, **kwargs) 208b9d8dfd2SMichael Walsh process_error_message(error_message) 209b9d8dfd2SMichael Walsh 210b9d8dfd2SMichael Walsh 211*410b1787SMichael Walsh# Modify the validation function docstrings by calling customize_doc_string for each function in the 212*410b1787SMichael Walsh# func_names list. 21384230c20SMichael Walshfunc_names = [ 21484230c20SMichael Walsh "valid_type", "valid_value", "valid_range", "valid_integer", 21584230c20SMichael Walsh "valid_dir_path", "valid_file_path", "valid_path", "valid_list", 21689eff544SMichael Walsh "valid_dict", "valid_program", "valid_length" 21784230c20SMichael Walsh] 21884230c20SMichael Walsh 21984230c20SMichael Walshfor func_name in func_names: 22084230c20SMichael Walsh cmd_buf = func_name \ 22184230c20SMichael Walsh + ".__doc__ = customize_doc_string(gv.raw_doc_strings['" \ 22284230c20SMichael Walsh + func_name + "'])" 22384230c20SMichael Walsh exec(cmd_buf) 224