blob: 77cf4a0db4f66b34fac17027c5dbdfc7fdcd26b9 [file] [log] [blame]
#!/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()