blob: fd7d9bd440e888d1cbab7df15bda0ee4a5879dd8 [file] [log] [blame]
Michael Walsh05cd10e2017-08-29 10:53:28 -05001#!/usr/bin/env python
2
3r"""
4Define the var_stack class.
5"""
6
7import sys
8import collections
9
10try:
11 from robot.utils import DotDict
12except ImportError:
13 pass
14
15import gen_print as gp
16
17
18###############################################################################
19class var_stack:
20
21 r"""
22 Define the variable stack class.
23
24 An object of this class can be used to push variable name/variable value
25 pairs which may be popped off the stack at a later time. The most obvious
26 use for this is for saving variables that are to be restored later.
27
28 Example code:
29
30 save_stack = var_stack('save_stack')
31 var1 = "johnson"
32 save_stack.push(var1)
33 var1 = "smith"
34 ...
35 var1 = save_stack.pop('var1')
36 # var1 has now been restored to the value "johnson".
37
38
39 Example use:
40
41 var1 = "mike"
42 save_stack.push(var1)
43 var1 = "james"
44 save_stack.push(var1)
45 save_stack.print_obj()
46
47 # The print-out of the object would then look like this:
48
49 save_stack:
50 stack_dict:
51 [var1]:
52 [var1][0]: mike
53 [var1][1]: james
54
55 # Continuing with this code...
56
57 var1 = save_stack.pop('var1')
58 save_stack.print_obj()
59
60 # The print-out of the object would then look like this:
61
62 save_stack:
63 stack_dict:
64 [var1]:
65 [var1][0]: mike
66 """
67
68 def __init__(self,
69 obj_name='var_stack'):
70
71 r"""
72 Initialize a new object of this class type.
73
74 Description of argument(s):
75 obj_name The name of the object. This is useful
76 for printing out the object.
77 """
78
79 self.__obj_name = obj_name
80 # Create a stack dictionary.
81 try:
82 self.__stack_dict = collections.OrderedDict()
83 except AttributeError:
84 self.__stack_dict = DotDict()
85
86 def sprint_obj(self):
87
88 r"""
89 sprint the fields of this object. This would normally be for debug
90 purposes.
91 """
92
93 buffer = ""
94
95 buffer += self.__obj_name + ":\n"
96 indent = 2
97 buffer += gp.sprint_varx('stack_dict', self.__stack_dict, 1, indent)
98
99 return buffer
100
101 def print_obj(self):
102
103 r"""
104 print the fields of this object to stdout. This would normally be for
105 debug purposes.
106 """
107
108 sys.stdout.write(self.sprint_obj())
109
110 def push(self,
111 var_value,
112 var_name=""):
113
114 r"""
115 push the var_name/var_value pair onto the stack.
116
117 Description of argument(s):
118 var_value The value being pushed.
119 var_name The name of the variable containing the
120 value to be pushed. This parameter is
121 normally unnecessary as this function can
122 figure out the var_name. This is provided
123 for Robot callers. In this scenario, we
124 are unable to get the variable name
125 ourselves.
126 """
127
128 if var_name == "":
129 # The caller has not passed a var_name so we will try to figure
130 # it out.
131 stack_frame_ix = 2
132 var_name = gp.get_arg_name(0, 1, stack_frame_ix)
133 if var_name in self.__stack_dict:
134 self.__stack_dict[var_name].append(var_value)
135 else:
136 self.__stack_dict[var_name] = [var_value]
137
138 def pop(self,
139 var_name=""):
140
141 r"""
142 Pop the value for the given var_name from the stack and return it.
143
144 Description of argument(s):
145 var_name The name of the variable whose value is to
146 be popped.
147 """
148
149 return self.__stack_dict[var_name].pop()
150
151###############################################################################