| #!/usr/bin/env python3 |
| |
| r""" |
| Define the var_stack class. |
| """ |
| |
| import collections |
| import copy |
| import sys |
| |
| 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() |