| #!/usr/bin/env python | 
 |  | 
 | r""" | 
 | Define the var_stack class. | 
 | """ | 
 |  | 
 | import sys | 
 | import collections | 
 | import copy | 
 |  | 
 | try: | 
 |     from robot.utils import DotDict | 
 | except ImportError: | 
 |     pass | 
 |  | 
 | import gen_print as gp | 
 |  | 
 |  | 
 | class var_stack: | 
 |  | 
 |     r""" | 
 |     Define the variable stack class. | 
 |  | 
 |     An object of this class can be used to push variable name/variable value pairs which may be popped off | 
 |     the stack at a later time.  The most obvious use for this is for saving variables that are to be restored | 
 |     later. | 
 |  | 
 |     Example code: | 
 |  | 
 |     save_stack = var_stack('save_stack') | 
 |     var1 = "johnson" | 
 |     save_stack.push(var1) | 
 |     var1 = "smith" | 
 |     ... | 
 |     var1 = save_stack.pop('var1') | 
 |     # var1 has now been restored to the value "johnson". | 
 |  | 
 |  | 
 |     Example use: | 
 |  | 
 |     var1 = "mike" | 
 |     save_stack.push(var1) | 
 |     var1 = "james" | 
 |     save_stack.push(var1) | 
 |     save_stack.print_obj() | 
 |  | 
 |     # The print-out of the object would then look like this: | 
 |  | 
 |     save_stack: | 
 |       stack_dict: | 
 |         [var1]: | 
 |           [var1][0]:  mike | 
 |           [var1][1]:  james | 
 |  | 
 |     # Continuing with this code... | 
 |  | 
 |     var1 = save_stack.pop('var1') | 
 |     save_stack.print_obj() | 
 |  | 
 |     # The print-out of the object would then look like this: | 
 |  | 
 |     save_stack: | 
 |       stack_dict: | 
 |         [var1]: | 
 |           [var1][0]:  mike | 
 |     """ | 
 |  | 
 |     def __init__(self, | 
 |                  obj_name='var_stack'): | 
 |         r""" | 
 |         Initialize a new object of this class type. | 
 |  | 
 |         Description of argument(s): | 
 |         obj_name                    The name of the object.  This is useful for printing out the object. | 
 |         """ | 
 |  | 
 |         self.__obj_name = obj_name | 
 |         # Create a stack dictionary. | 
 |         try: | 
 |             self.__stack_dict = collections.OrderedDict() | 
 |         except AttributeError: | 
 |             self.__stack_dict = DotDict() | 
 |  | 
 |     def sprint_obj(self): | 
 |         r""" | 
 |         sprint the fields of this object.  This would normally be for debug purposes. | 
 |         """ | 
 |  | 
 |         buffer = "" | 
 |  | 
 |         buffer += self.__obj_name + ":\n" | 
 |         indent = 2 | 
 |         buffer += gp.sprint_varx('stack_dict', self.__stack_dict, indent) | 
 |  | 
 |         return buffer | 
 |  | 
 |     def print_obj(self): | 
 |         r""" | 
 |         print the fields of this object to stdout.  This would normally be for debug purposes. | 
 |         """ | 
 |  | 
 |         sys.stdout.write(self.sprint_obj()) | 
 |  | 
 |     def push(self, | 
 |              var_value, | 
 |              var_name=""): | 
 |         r""" | 
 |         push the var_name/var_value pair onto the stack. | 
 |  | 
 |         Description of argument(s): | 
 |         var_value                   The value being pushed. | 
 |         var_name                    The name of the variable containing the value to be pushed.  This | 
 |                                     parameter is normally unnecessary as this function can figure out the | 
 |                                     var_name.  This is provided for Robot callers.  In this scenario, we are | 
 |                                     unable to get the variable name ourselves. | 
 |         """ | 
 |  | 
 |         if var_name == "": | 
 |             # The caller has not passed a var_name so we will try to figure it out. | 
 |             stack_frame_ix = 2 | 
 |             var_name = gp.get_arg_name(0, 1, stack_frame_ix) | 
 |         if var_name in self.__stack_dict: | 
 |             self.__stack_dict[var_name].append(var_value) | 
 |         else: | 
 |             self.__stack_dict[var_name] = copy.deepcopy([var_value]) | 
 |  | 
 |     def pop(self, | 
 |             var_name=""): | 
 |         r""" | 
 |         Pop the value for the given var_name from the stack and return it. | 
 |  | 
 |         Description of argument(s): | 
 |         var_name                    The name of the variable whose value is to be popped. | 
 |         """ | 
 |  | 
 |         return self.__stack_dict[var_name].pop() |