blob: 38033c744b7c159148fecdbd77ab70031cc3a3f7 [file] [log] [blame]
Michael Walsha2a553c2017-01-10 11:17:38 -06001#!/usr/bin/env python
2
3r"""
4This module is the python counterpart to run_keyword.robot.
5"""
6
Michael Walsha2a553c2017-01-10 11:17:38 -06007import gen_robot_print as grp
8import gen_robot_valid as grv
Michael Walsha2a553c2017-01-10 11:17:38 -06009from robot.libraries.BuiltIn import BuiltIn
Michael Walshe7a7a182017-01-19 10:37:10 -060010import re
Michael Walsha2a553c2017-01-10 11:17:38 -060011
12
13###############################################################################
14def main_py():
15
16 r"""
17 Do main program processing.
18 """
19
20 setup()
21
Michael Walshe7a7a182017-01-19 10:37:10 -060022 # NOTE: During code review the following question was raised: Why support
23 # 1) variable assignments 2) multiple keywords? Couldn't a user simply
24 # call this program twice to get what they need. If necessary, the user
25 # could take the output of the first call and specify it as a literal on
26 # the second call.
27 #
28 # However, this approach would not work in all cases. The following case
29 # would be such an example:
30 # Let's say the first keyword string is as follows:
31 # Create Dictionary foo=bar
32 # You wish to take the output of that call and specify it as a literal
33 # value when running the following:
34 # Want Dictionary parm=<literal dictionary specification>
35 # The problem is that there is no way to specify a dictionary as a
36 # literal in Robot Framework.
37 # By having this program support variable assignments and multiple
38 # keywords, the user can invoke it with the following keyword string.
39 # ${my_dict}= Create Dictionary foo=bar ; Want Dictionary ${my_dict}
Michael Walsha2a553c2017-01-10 11:17:38 -060040
Michael Walshe7a7a182017-01-19 10:37:10 -060041 # The user can pass multiple lib/resource paths by separating them with a
42 # colon.
Michael Walsha2a553c2017-01-10 11:17:38 -060043
Michael Walshe7a7a182017-01-19 10:37:10 -060044 lib_file_path_list = \
45 BuiltIn().get_variable_value("${lib_file_path}").split(":")
46 # Get rid of empty entry if it exists.
47 if lib_file_path_list[0] == "":
48 del lib_file_path_list[0]
49 for lib_file_path in lib_file_path_list:
Michael Walsha2a553c2017-01-10 11:17:38 -060050 # We don't want global variable getting changed when an import is done
51 # so we'll save it and restore it.
52 quiet = int(BuiltIn().get_variable_value("${quiet}"))
53 if lib_file_path.endswith(".py"):
54 grp.rdprint_issuing("import_library(\"" + lib_file_path + "\")")
55 BuiltIn().import_library(lib_file_path)
56 else:
57 grp.rdprint_issuing("import_resource(\"" + lib_file_path + "\")")
58 BuiltIn().import_resource(lib_file_path)
59 BuiltIn().set_global_variable("${quiet}", quiet)
60
Michael Walshe7a7a182017-01-19 10:37:10 -060061 # The user can pass multiple keyword strings by separating them with " ; ".
62 keyword_list = \
63 BuiltIn().get_variable_value("${keyword_string}").split(" ; ")
64 for keyword_string in keyword_list:
65 cmd_buf = keyword_string.split(" ")
66 if re.match(r"\$\{", cmd_buf[0]):
67 # This looks like an assignment (e.g. ${var}= <keyword>).
68 # We'll extract the variable name, remove element 0 from
69 # cmd_buf and set the global variable with the results
70 # after running the keyword.
71 var_name = cmd_buf[0].strip("${}=")
72 del cmd_buf[0]
73 else:
74 var_name = ""
Michael Walsha2a553c2017-01-10 11:17:38 -060075
Michael Walshe7a7a182017-01-19 10:37:10 -060076 test_mode = int(BuiltIn().get_variable_value("${test_mode}"))
77 grp.rqprint_issuing_keyword(cmd_buf, test_mode)
78 if test_mode:
79 return
Michael Walsha2a553c2017-01-10 11:17:38 -060080
Michael Walshe7a7a182017-01-19 10:37:10 -060081 output = BuiltIn().run_keyword(*cmd_buf)
82
83 if var_name != "":
84 BuiltIn().set_global_variable("${" + var_name + "}", output)
85 else:
86 if output is not None:
87 grp.rprint_var(output)
Michael Walsha2a553c2017-01-10 11:17:38 -060088
89###############################################################################
90
91
92###############################################################################
93def setup():
94
95 r"""
96 Do general program setup tasks.
97 """
98
99 grp.rqprintn()
100
101 validate_parms()
102
103 grp.rqprint_pgm_header()
104
105###############################################################################
106
107
108###############################################################################
109def validate_parms():
110
111 r"""
112 Validate all program parameters.
113 """
114
115 grv.rvalid_value("keyword_string")
116
117 return True
118
119###############################################################################
120
121
122###############################################################################
123def program_teardown():
124
125 r"""
126 Clean up after this program.
127 """
128
129 grp.rqprint_pgm_footer()
130
131###############################################################################