#!/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()