New gen_robot_utils.py file with my_import_resource function.

This function will preserve existing global values when importing
resource.

Change-Id: Ia79dc2762b3764e9c3d8af321e04da78cfb666d7
Signed-off-by: Michael Walsh <micwalsh@us.ibm.com>
diff --git a/lib/gen_robot_utils.py b/lib/gen_robot_utils.py
new file mode 100644
index 0000000..8f275b0
--- /dev/null
+++ b/lib/gen_robot_utils.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+
+r"""
+This module contains utility and wrapper functions useful to robot python
+programs.
+"""
+
+import re
+from robot.libraries.BuiltIn import BuiltIn
+
+
+###############################################################################
+def my_import_resource(path):
+
+    r"""
+    Import the resource file specified in path.
+
+    Description of arguments:
+    path   The path to your resource file.
+
+    This function is a wrapper for BuiltIn().import_resource() and provides
+    the following benefits:
+    - When you invoke a robot program from a command line, you may specify
+      program parameters as follows:
+
+      -v --variable name:values
+
+      For example:
+
+      robot -v parm_x:1 file_x.robot
+
+      When you do "Resource utils_x.robot" in a .robot program, it processes
+      "utils_x.robot" BEFORE your command line parms are processed, as one
+      might expect.  On the other hand, if one of your python library files
+      were to run BuiltIn().import_resource("utils_x.robot"), it will process
+      "utils_x.robot" AFTER your program parms are processed.  Let's suppose
+      that utils_x.robot contains the following:
+
+      *** Variables ***
+      ${parm_x}  ${0}
+
+      If your program is invoked like this:
+
+      robot -v parm_x:3 file_x.robot
+
+      And if your program has a python library file that invokes
+      BuiltIn().import_resource("utils_x.robot"), then parm_x will get set to
+      ${0}.  In other words, instead of utils_x.robot serving to set a default
+      value for parm_x, it actually causes the user's specification of
+      "-v parm_x:3" to be overwritten.
+
+      This function will remedy that problem by keeping your -v parms intact.
+
+    - The problems with -v parms mentioned above are also found with variables
+      from your file_x.robot "** Variables **" section.  Namely, they may get
+      overwritten when import_resource() is used.  This function will likewise
+      remedy that problem.
+
+    """
+
+    # Retrieve the values of all current variables into a dictionary.
+    pre_var_dict = BuiltIn().get_variables()
+    # Do the import.
+    BuiltIn().import_resource(path)
+    # Once again, retrieve the values of all current variables into a
+    # dictionary.
+    post_var_dict = BuiltIn().get_variables()
+
+    # If any variable values were changed due to the prior import, set them
+    # back to their original values.
+    for key, value in post_var_dict.iteritems():
+        if key in pre_var_dict:
+            if value != pre_var_dict[key]:
+                global_var_name = re.sub("[@&]", "$", key)
+                BuiltIn().set_global_variable(global_var_name,
+                                              pre_var_dict[key])
+
+###############################################################################