1e7e9171eSGeorge Keishing#!/usr/bin/env python3
2bdb3965aSMichael Walsh
3bdb3965aSMichael Walshr"""
4bdb3965aSMichael WalshThis module contains utility and wrapper functions useful to robot python
5bdb3965aSMichael Walshprograms.
6bdb3965aSMichael Walsh"""
7bdb3965aSMichael Walsh
8bdb3965aSMichael Walshimport re
9*20f38712SPatrick Williams
10bdb3965aSMichael Walshfrom robot.libraries.BuiltIn import BuiltIn
11bdb3965aSMichael Walsh
12bdb3965aSMichael Walsh
13bdb3965aSMichael Walshdef my_import_resource(path):
14bdb3965aSMichael Walsh    r"""
15bdb3965aSMichael Walsh    Import the resource file specified in path.
16bdb3965aSMichael Walsh
17bdb3965aSMichael Walsh    Description of arguments:
18bdb3965aSMichael Walsh    path   The path to your resource file.
19bdb3965aSMichael Walsh
20bdb3965aSMichael Walsh    This function is a wrapper for BuiltIn().import_resource() and provides
21bdb3965aSMichael Walsh    the following benefits:
22bdb3965aSMichael Walsh    - When you invoke a robot program from a command line, you may specify
23bdb3965aSMichael Walsh      program parameters as follows:
24bdb3965aSMichael Walsh
25bdb3965aSMichael Walsh      -v --variable name:values
26bdb3965aSMichael Walsh
27bdb3965aSMichael Walsh      For example:
28bdb3965aSMichael Walsh
29bdb3965aSMichael Walsh      robot -v parm_x:1 file_x.robot
30bdb3965aSMichael Walsh
31bdb3965aSMichael Walsh      When you do "Resource utils_x.robot" in a .robot program, it processes
32bdb3965aSMichael Walsh      "utils_x.robot" BEFORE your command line parms are processed, as one
33bdb3965aSMichael Walsh      might expect.  On the other hand, if one of your python library files
34bdb3965aSMichael Walsh      were to run BuiltIn().import_resource("utils_x.robot"), it will process
35bdb3965aSMichael Walsh      "utils_x.robot" AFTER your program parms are processed.  Let's suppose
36bdb3965aSMichael Walsh      that utils_x.robot contains the following:
37bdb3965aSMichael Walsh
38bdb3965aSMichael Walsh      *** Variables ***
39bdb3965aSMichael Walsh      ${parm_x}  ${0}
40bdb3965aSMichael Walsh
41bdb3965aSMichael Walsh      If your program is invoked like this:
42bdb3965aSMichael Walsh
43bdb3965aSMichael Walsh      robot -v parm_x:3 file_x.robot
44bdb3965aSMichael Walsh
45bdb3965aSMichael Walsh      And if your program has a python library file that invokes
46bdb3965aSMichael Walsh      BuiltIn().import_resource("utils_x.robot"), then parm_x will get set to
47bdb3965aSMichael Walsh      ${0}.  In other words, instead of utils_x.robot serving to set a default
48bdb3965aSMichael Walsh      value for parm_x, it actually causes the user's specification of
49bdb3965aSMichael Walsh      "-v parm_x:3" to be overwritten.
50bdb3965aSMichael Walsh
51bdb3965aSMichael Walsh      This function will remedy that problem by keeping your -v parms intact.
52bdb3965aSMichael Walsh
53bdb3965aSMichael Walsh    - The problems with -v parms mentioned above are also found with variables
54bdb3965aSMichael Walsh      from your file_x.robot "** Variables **" section.  Namely, they may get
55bdb3965aSMichael Walsh      overwritten when import_resource() is used.  This function will likewise
56bdb3965aSMichael Walsh      remedy that problem.
57bdb3965aSMichael Walsh
58bdb3965aSMichael Walsh    """
59bdb3965aSMichael Walsh
60bdb3965aSMichael Walsh    # Retrieve the values of all current variables into a dictionary.
61bdb3965aSMichael Walsh    pre_var_dict = BuiltIn().get_variables()
62bdb3965aSMichael Walsh    # Do the import.
63bdb3965aSMichael Walsh    BuiltIn().import_resource(path)
64bdb3965aSMichael Walsh    # Once again, retrieve the values of all current variables into a
65bdb3965aSMichael Walsh    # dictionary.
66bdb3965aSMichael Walsh    post_var_dict = BuiltIn().get_variables()
67bdb3965aSMichael Walsh
68bdb3965aSMichael Walsh    # If any variable values were changed due to the prior import, set them
69bdb3965aSMichael Walsh    # back to their original values.
7036efbc04SGeorge Keishing    for key, value in post_var_dict.items():
71bdb3965aSMichael Walsh        if key in pre_var_dict:
72bdb3965aSMichael Walsh            if value != pre_var_dict[key]:
73bdb3965aSMichael Walsh                global_var_name = re.sub("[@&]", "$", key)
74*20f38712SPatrick Williams                BuiltIn().set_global_variable(
75*20f38712SPatrick Williams                    global_var_name, pre_var_dict[key]
76*20f38712SPatrick Williams                )
77