| Michael Walsh | a2a553c | 2017-01-10 11:17:38 -0600 | [diff] [blame] | 1 | #!/usr/bin/env python | 
 | 2 |  | 
 | 3 | r""" | 
 | 4 | This module is the python counterpart to run_keyword.robot. | 
 | 5 | """ | 
 | 6 |  | 
| Michael Walsh | a2a553c | 2017-01-10 11:17:38 -0600 | [diff] [blame] | 7 | import gen_robot_print as grp | 
 | 8 | import gen_robot_valid as grv | 
| Michael Walsh | 16cbb7f | 2017-02-02 15:54:16 -0600 | [diff] [blame] | 9 | import gen_robot_utils as gru | 
 | 10 |  | 
| Michael Walsh | a2a553c | 2017-01-10 11:17:38 -0600 | [diff] [blame] | 11 | from robot.libraries.BuiltIn import BuiltIn | 
| Michael Walsh | e7a7a18 | 2017-01-19 10:37:10 -0600 | [diff] [blame] | 12 | import re | 
| Michael Walsh | a2a553c | 2017-01-10 11:17:38 -0600 | [diff] [blame] | 13 |  | 
 | 14 |  | 
| Michael Walsh | a2a553c | 2017-01-10 11:17:38 -0600 | [diff] [blame] | 15 | def setup(): | 
| Michael Walsh | a2a553c | 2017-01-10 11:17:38 -0600 | [diff] [blame] | 16 |     r""" | 
 | 17 |     Do general program setup tasks. | 
 | 18 |     """ | 
 | 19 |  | 
 | 20 |     grp.rqprintn() | 
 | 21 |  | 
 | 22 |     validate_parms() | 
 | 23 |  | 
 | 24 |     grp.rqprint_pgm_header() | 
 | 25 |  | 
| Michael Walsh | a2a553c | 2017-01-10 11:17:38 -0600 | [diff] [blame] | 26 |  | 
| Michael Walsh | a2a553c | 2017-01-10 11:17:38 -0600 | [diff] [blame] | 27 | def validate_parms(): | 
| Michael Walsh | a2a553c | 2017-01-10 11:17:38 -0600 | [diff] [blame] | 28 |     r""" | 
 | 29 |     Validate all program parameters. | 
 | 30 |     """ | 
 | 31 |  | 
 | 32 |     grv.rvalid_value("keyword_string") | 
 | 33 |  | 
 | 34 |     return True | 
 | 35 |  | 
| Michael Walsh | a2a553c | 2017-01-10 11:17:38 -0600 | [diff] [blame] | 36 |  | 
| Michael Walsh | a2a553c | 2017-01-10 11:17:38 -0600 | [diff] [blame] | 37 | def program_teardown(): | 
| Michael Walsh | a2a553c | 2017-01-10 11:17:38 -0600 | [diff] [blame] | 38 |     r""" | 
 | 39 |     Clean up after this program. | 
 | 40 |     """ | 
 | 41 |  | 
 | 42 |     grp.rqprint_pgm_footer() | 
 | 43 |  | 
| Michael Walsh | e9d78c4 | 2017-03-02 14:41:15 -0600 | [diff] [blame] | 44 |  | 
| Michael Walsh | e9d78c4 | 2017-03-02 14:41:15 -0600 | [diff] [blame] | 45 | def my_run_keywords(lib_file_path, | 
 | 46 |                     keyword_string, | 
 | 47 |                     quiet=0, | 
 | 48 |                     test_mode=0): | 
| Michael Walsh | e9d78c4 | 2017-03-02 14:41:15 -0600 | [diff] [blame] | 49 |     r""" | 
 | 50 |     Run the keywords in the keyword string. | 
 | 51 |  | 
 | 52 |     Description of arguments: | 
 | 53 |     lib_file_path   The path to a library or resource needed to run the | 
 | 54 |                     keywords.  This may contain a colon-delimited list of | 
 | 55 |                     library/resource paths. | 
 | 56 |     keyword_string  The keyword string to be run by this function.  If this | 
 | 57 |                     keyword string contains " ; " anywhere, it will be taken to | 
 | 58 |                     be multiple keyword strings.  Each keyword may also include | 
 | 59 |                     a variable assignment.  Example: | 
 | 60 |                     ${my_var}=  My Keyword | 
 | 61 |     quiet           If this parameter is set to "1", this program will print | 
 | 62 |                     only essential information, i.e. it will not echo | 
 | 63 |                     parameters, echo commands, print the total run time, etc. | 
 | 64 |     test_mode       This means that this program should go through all the | 
 | 65 |                     motions but not actually do anything substantial. | 
 | 66 |     """ | 
 | 67 |  | 
 | 68 |     # NOTE: During code review the following question was raised: Why support | 
 | 69 |     # 1) variable assignments 2) multiple keywords?  Couldn't a user simply | 
 | 70 |     # call this program twice to get what they need.  If necessary, the user | 
 | 71 |     # could take the output of the first call and specify it as a literal on | 
 | 72 |     # the second call. | 
 | 73 |     # | 
 | 74 |     # However, this approach would not work in all cases.  The following case | 
 | 75 |     # would be such an example: | 
 | 76 |     # Let's say the first keyword string is as follows: | 
 | 77 |     # Create Dictionary  foo=bar | 
 | 78 |     # You wish to take the output of that call and specify it as a literal | 
 | 79 |     # value when running the following: | 
 | 80 |     # Want Dictionary  parm=<literal dictionary specification> | 
 | 81 |     # The problem is that there is no way to specify a dictionary as a | 
 | 82 |     # literal in Robot Framework. | 
 | 83 |     # By having this program support variable assignments and multiple | 
 | 84 |     # keywords, the user can invoke it with the following keyword string. | 
 | 85 |     # ${my_dict}=  Create Dictionary  foo=bar ; Want Dictionary  ${my_dict} | 
 | 86 |  | 
| Michael Walsh | e9d78c4 | 2017-03-02 14:41:15 -0600 | [diff] [blame] | 87 |     # The user can pass multiple lib/resource paths by separating them with a | 
 | 88 |     # colon. | 
 | 89 |     lib_file_path_list = lib_file_path.split(":") | 
 | 90 |     # Get rid of empty entry if it exists. | 
 | 91 |     if lib_file_path_list[0] == "": | 
 | 92 |         del lib_file_path_list[0] | 
 | 93 |     for lib_file_path in lib_file_path_list: | 
 | 94 |         if lib_file_path.endswith(".py"): | 
 | 95 |             grp.rdprint_issuing("import_library(\"" + lib_file_path + "\")") | 
 | 96 |             BuiltIn().import_library(lib_file_path) | 
 | 97 |         else: | 
 | 98 |             grp.rdprint_issuing("my_import_resource(\"" + lib_file_path + | 
 | 99 |                                 "\")") | 
 | 100 |             gru.my_import_resource(lib_file_path) | 
 | 101 |  | 
 | 102 |     # The user can pass multiple keyword strings by separating them with " ; ". | 
 | 103 |     keyword_list = keyword_string.split(" ; ") | 
 | 104 |     for keyword_string in keyword_list: | 
 | 105 |         cmd_buf = keyword_string.split("  ") | 
 | 106 |         if re.match(r"\$\{", cmd_buf[0]): | 
 | 107 |             # This looks like an assignment (e.g. ${var}=  <keyword>). | 
 | 108 |             # We'll extract the variable name, remove element 0 from | 
 | 109 |             # cmd_buf and set the global variable with the results | 
 | 110 |             # after running the keyword. | 
 | 111 |             var_name = cmd_buf[0].strip("${}=") | 
 | 112 |             del cmd_buf[0] | 
 | 113 |         else: | 
 | 114 |             var_name = "" | 
 | 115 |  | 
 | 116 |         if not quiet: | 
 | 117 |             grp.rprint_issuing_keyword(cmd_buf, test_mode) | 
 | 118 |         if test_mode: | 
 | 119 |             continue | 
 | 120 |  | 
 | 121 |         output = BuiltIn().run_keyword(*cmd_buf) | 
 | 122 |  | 
 | 123 |         if var_name != "": | 
 | 124 |             BuiltIn().set_global_variable("${" + var_name + "}", output) | 
 | 125 |         else: | 
 | 126 |             if output is not None: | 
 | 127 |                 grp.rprint(output) | 
 | 128 |  | 
| Michael Walsh | e9d78c4 | 2017-03-02 14:41:15 -0600 | [diff] [blame] | 129 |  | 
| Michael Walsh | e9d78c4 | 2017-03-02 14:41:15 -0600 | [diff] [blame] | 130 | def main_py(): | 
| Michael Walsh | e9d78c4 | 2017-03-02 14:41:15 -0600 | [diff] [blame] | 131 |     r""" | 
 | 132 |     Do main program processing. | 
 | 133 |     """ | 
 | 134 |  | 
 | 135 |     setup() | 
 | 136 |  | 
 | 137 |     lib_file_path = BuiltIn().get_variable_value("${lib_file_path}") | 
 | 138 |     keyword_string = BuiltIn().get_variable_value("${keyword_string}") | 
 | 139 |     quiet = int(BuiltIn().get_variable_value("${quiet}")) | 
 | 140 |     test_mode = int(BuiltIn().get_variable_value("${test_mode}")) | 
 | 141 |  | 
 | 142 |     my_run_keywords(lib_file_path, keyword_string, quiet, test_mode) |