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