#!/usr/bin/env python r""" This module is the python counterpart to run_keyword.robot. """ import gen_robot_print as grp import gen_robot_valid as grv import gen_robot_utils as gru from robot.libraries.BuiltIn import BuiltIn import re ############################################################################### def main_py(): r""" Do main program processing. """ setup() # NOTE: During code review the following question was raised: Why support # 1) variable assignments 2) multiple keywords? Couldn't a user simply # call this program twice to get what they need. If necessary, the user # could take the output of the first call and specify it as a literal on # the second call. # # However, this approach would not work in all cases. The following case # would be such an example: # Let's say the first keyword string is as follows: # Create Dictionary foo=bar # You wish to take the output of that call and specify it as a literal # value when running the following: # Want Dictionary parm= # The problem is that there is no way to specify a dictionary as a # literal in Robot Framework. # By having this program support variable assignments and multiple # keywords, the user can invoke it with the following keyword string. # ${my_dict}= Create Dictionary foo=bar ; Want Dictionary ${my_dict} # The user can pass multiple lib/resource paths by separating them with a # colon. lib_file_path_list = \ BuiltIn().get_variable_value("${lib_file_path}").split(":") # Get rid of empty entry if it exists. if lib_file_path_list[0] == "": del lib_file_path_list[0] for lib_file_path in lib_file_path_list: # We don't want global variable getting changed when an import is done # so we'll save it and restore it. quiet = int(BuiltIn().get_variable_value("${quiet}")) if lib_file_path.endswith(".py"): grp.rdprint_issuing("import_library(\"" + lib_file_path + "\")") BuiltIn().import_library(lib_file_path) else: grp.rdprint_issuing("my_import_resource(\"" + lib_file_path + "\")") gru.my_import_resource(lib_file_path) BuiltIn().set_global_variable("${quiet}", quiet) # The user can pass multiple keyword strings by separating them with " ; ". keyword_list = \ BuiltIn().get_variable_value("${keyword_string}").split(" ; ") for keyword_string in keyword_list: cmd_buf = keyword_string.split(" ") if re.match(r"\$\{", cmd_buf[0]): # This looks like an assignment (e.g. ${var}= ). # We'll extract the variable name, remove element 0 from # cmd_buf and set the global variable with the results # after running the keyword. var_name = cmd_buf[0].strip("${}=") del cmd_buf[0] else: var_name = "" test_mode = int(BuiltIn().get_variable_value("${test_mode}")) grp.rqprint_issuing_keyword(cmd_buf, test_mode) if test_mode: return output = BuiltIn().run_keyword(*cmd_buf) if var_name != "": BuiltIn().set_global_variable("${" + var_name + "}", output) else: if output is not None: grp.rprint_var(output) ############################################################################### ############################################################################### def setup(): r""" Do general program setup tasks. """ grp.rqprintn() validate_parms() grp.rqprint_pgm_header() ############################################################################### ############################################################################### def validate_parms(): r""" Validate all program parameters. """ grv.rvalid_value("keyword_string") return True ############################################################################### ############################################################################### def program_teardown(): r""" Clean up after this program. """ grp.rqprint_pgm_footer() ###############################################################################