blob: dcab7abb628b51b0bbe811481d27c277dbd6a306 [file] [log] [blame]
George Keishinge7e91712021-09-03 11:28:44 -05001#!/usr/bin/env python3
Michael Walsha2a553c2017-01-10 11:17:38 -06002
3r"""
4This module is the python counterpart to run_keyword.robot.
5"""
6
George Keishinge635ddc2022-12-08 07:38:02 -06007import re
Patrick Williams57318182022-12-08 06:18:26 -06008
Patrick Williams20f38712022-12-08 06:18:26 -06009import gen_print as gp
10import gen_robot_utils as gru
11import gen_robot_valid as grv
12from robot.libraries.BuiltIn import BuiltIn
13
Michael Walsha2a553c2017-01-10 11:17:38 -060014
Michael Walsha2a553c2017-01-10 11:17:38 -060015def setup():
Michael Walsha2a553c2017-01-10 11:17:38 -060016 r"""
17 Do general program setup tasks.
18 """
19
Michael Walshedb5c942019-03-28 12:40:50 -050020 gp.qprintn()
Michael Walsha2a553c2017-01-10 11:17:38 -060021
22 validate_parms()
23
Michael Walshedb5c942019-03-28 12:40:50 -050024 gp.qprint_pgm_header()
Michael Walsha2a553c2017-01-10 11:17:38 -060025
Michael Walsha2a553c2017-01-10 11:17:38 -060026
Michael Walsha2a553c2017-01-10 11:17:38 -060027def validate_parms():
Michael Walsha2a553c2017-01-10 11:17:38 -060028 r"""
29 Validate all program parameters.
30 """
31
Michael Walshe7edb222019-08-19 17:39:38 -050032 grv.valid_value("keyword_string")
Michael Walsha2a553c2017-01-10 11:17:38 -060033
34 return True
35
Michael Walsha2a553c2017-01-10 11:17:38 -060036
Michael Walsha2a553c2017-01-10 11:17:38 -060037def program_teardown():
Michael Walsha2a553c2017-01-10 11:17:38 -060038 r"""
39 Clean up after this program.
40 """
41
Michael Walshedb5c942019-03-28 12:40:50 -050042 gp.qprint_pgm_footer()
Michael Walsha2a553c2017-01-10 11:17:38 -060043
Michael Walshe9d78c42017-03-02 14:41:15 -060044
Patrick Williams20f38712022-12-08 06:18:26 -060045def my_run_keywords(lib_file_path, keyword_string, quiet=0, test_mode=0):
Michael Walshe9d78c42017-03-02 14:41:15 -060046 r"""
47 Run the keywords in the keyword string.
48
49 Description of arguments:
50 lib_file_path The path to a library or resource needed to run the
51 keywords. This may contain a colon-delimited list of
52 library/resource paths.
53 keyword_string The keyword string to be run by this function. If this
54 keyword string contains " ; " anywhere, it will be taken to
55 be multiple keyword strings. Each keyword may also include
56 a variable assignment. Example:
57 ${my_var}= My Keyword
58 quiet If this parameter is set to "1", this program will print
59 only essential information, i.e. it will not echo
60 parameters, echo commands, print the total run time, etc.
61 test_mode This means that this program should go through all the
62 motions but not actually do anything substantial.
63 """
64
65 # NOTE: During code review the following question was raised: Why support
66 # 1) variable assignments 2) multiple keywords? Couldn't a user simply
67 # call this program twice to get what they need. If necessary, the user
68 # could take the output of the first call and specify it as a literal on
69 # the second call.
70 #
71 # However, this approach would not work in all cases. The following case
72 # would be such an example:
73 # Let's say the first keyword string is as follows:
74 # Create Dictionary foo=bar
75 # You wish to take the output of that call and specify it as a literal
76 # value when running the following:
77 # Want Dictionary parm=<literal dictionary specification>
78 # The problem is that there is no way to specify a dictionary as a
79 # literal in Robot Framework.
80 # By having this program support variable assignments and multiple
81 # keywords, the user can invoke it with the following keyword string.
82 # ${my_dict}= Create Dictionary foo=bar ; Want Dictionary ${my_dict}
83
Michael Walshe9d78c42017-03-02 14:41:15 -060084 # The user can pass multiple lib/resource paths by separating them with a
85 # colon.
86 lib_file_path_list = lib_file_path.split(":")
87 # Get rid of empty entry if it exists.
88 if lib_file_path_list[0] == "":
89 del lib_file_path_list[0]
90 for lib_file_path in lib_file_path_list:
91 if lib_file_path.endswith(".py"):
Patrick Williams20f38712022-12-08 06:18:26 -060092 gp.dprint_issuing('import_library("' + lib_file_path + '")')
Michael Walshe9d78c42017-03-02 14:41:15 -060093 BuiltIn().import_library(lib_file_path)
94 else:
Patrick Williams20f38712022-12-08 06:18:26 -060095 gp.dprint_issuing('my_import_resource("' + lib_file_path + '")')
Michael Walshe9d78c42017-03-02 14:41:15 -060096 gru.my_import_resource(lib_file_path)
97
98 # The user can pass multiple keyword strings by separating them with " ; ".
99 keyword_list = keyword_string.split(" ; ")
100 for keyword_string in keyword_list:
101 cmd_buf = keyword_string.split(" ")
102 if re.match(r"\$\{", cmd_buf[0]):
103 # This looks like an assignment (e.g. ${var}= <keyword>).
104 # We'll extract the variable name, remove element 0 from
105 # cmd_buf and set the global variable with the results
106 # after running the keyword.
107 var_name = cmd_buf[0].strip("${}=")
108 del cmd_buf[0]
109 else:
110 var_name = ""
111
112 if not quiet:
Michael Walshedb5c942019-03-28 12:40:50 -0500113 gp.print_issuing(cmd_buf, test_mode)
Michael Walshe9d78c42017-03-02 14:41:15 -0600114 if test_mode:
115 continue
116
117 output = BuiltIn().run_keyword(*cmd_buf)
118
119 if var_name != "":
120 BuiltIn().set_global_variable("${" + var_name + "}", output)
121 else:
122 if output is not None:
Michael Walshedb5c942019-03-28 12:40:50 -0500123 gp.gp_print(output)
Michael Walshe9d78c42017-03-02 14:41:15 -0600124
Michael Walshe9d78c42017-03-02 14:41:15 -0600125
Michael Walshe9d78c42017-03-02 14:41:15 -0600126def main_py():
Michael Walshe9d78c42017-03-02 14:41:15 -0600127 r"""
128 Do main program processing.
129 """
130
131 setup()
132
133 lib_file_path = BuiltIn().get_variable_value("${lib_file_path}")
134 keyword_string = BuiltIn().get_variable_value("${keyword_string}")
135 quiet = int(BuiltIn().get_variable_value("${quiet}"))
136 test_mode = int(BuiltIn().get_variable_value("${test_mode}"))
137
138 my_run_keywords(lib_file_path, keyword_string, quiet, test_mode)