| #!/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 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_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) |