Added fit.ActionFixture and fixed the loader. Added ListAdapter.
[stuff.git] / pyfit / util.py
blobbf65e9ed29af96d92aaf276886fab571ff448c76
1 import re
2 import sys
3 import traceback
4 import string
6 class BoolAdapter(object):
7 def parse(self, s):
8 if s == 'true':
9 value = True
10 else:
11 if s == 'false':
12 value = False
13 else:
14 raise Exception("Can't convert `%s`" % s)
15 return value
17 def convert(self, s):
18 return s == 'true'
20 class ListAdapter(object):
21 def parse(self, s):
22 return [x.lstrip() for x in s.split(',')]
24 class MethodCall(object):
25 def __init__(self, name):
26 self.name = name
28 def apply(self, fixture, cell, adapters):
29 f = getattr(fixture, self.name)
30 actual = f()
31 if actual is None:
32 raise Exception('returned None')
34 value = str(cell)
35 target_type = type(actual)
36 if adapters.has_key(target_type):
37 adapter = adapters[target_type]
38 expected = adapter.convert(value)
39 else:
40 expected = type(actual)(str(cell))
42 if expected == actual:
43 cell.passed()
44 else:
45 cell.failed(actual)
47 class SetAttribute(object):
48 def __init__(self, name):
49 self.name = name
50 def apply(self, fixture, cell, adapters):
52 try:
53 old = getattr(fixture, self.name)
54 target_type = type(old)
55 cell_value = str(cell)
56 if adapters.has_key(target_type):
57 adapter = adapters[target_type]
58 new = adapter.parse(cell_value)
59 else:
60 new = type(old)(str(cell))
61 setattr(fixture, self.name, new)
63 except AttributeError, inst:
64 cell.error(str(inst))
66 def parse_action(action_desc):
67 res = re.search('(.*)\(\)', action_desc)
68 if res is not None:
69 action_name = res.group(1)
70 action_name = string.replace(action_name, ' ', '_')
71 #return MethodCall(res.group(1))
72 return MethodCall(action_name)
73 else:
74 return SetAttribute(action_desc)
76 class FileAdapter(object):
77 def __init__(self, data):
78 self.data = data
79 self.offset = 0
80 def read(self, n):
81 end = self.offset + n
82 block = self.data[self.offset:end]
83 self.offset = end
84 return block
85 def eof(self):
86 return self.offset < len(self.data)
88 def format_10_digit_number(n):
89 return "%010i" % n
91 def wiki_table_to_html(table):
92 output = "<table>"
93 for line in table.split('\n'):
94 row = line.lstrip().split('|')[1:-1]
95 if len(row):
96 output += "<tr>"
97 for cell in row:
98 output += "<td>%s</td>\n" % cell.lstrip().rstrip()
99 output += "</tr>\n"
100 output += "</table>"
101 return output
103 def rzip(a,b):
104 prev = ''
105 for x,y in zip(a,b):
106 if x == '':
107 x = prev
108 prev = x
109 yield (x,y)
111 class RowIter(object):
112 def __init__(self, iter):
113 self.iter = iter
114 def __iter__(self):
115 return self
116 def next(self):
117 return self.iter.next()
118 def get(self, n):
119 result = []
120 for i in range(0, n):
121 result.append(str(self.next()))
122 return result
124 def print_table(table):
125 print
126 for row in table:
127 print '|' + '|'.join([str(x) for x in row]) + '|'
129 class ImportError(Exception):
130 def __init__(self, value):
131 self.value = value
132 def __str__(self):
133 return repr(self.value)
135 class Importer(object):
136 def do_import_module(self, module_name):
137 pass
138 #__import__(module_name)
140 def import_module(self, name):
141 try:
142 self.do_import_module(name)
143 except Exception, e:
144 tb = traceback.format_exc()
145 lines = tb.split('\n')
146 str = '\n' + lines[0] + '\n' + '\n'.join(lines[5:])
147 raise ImportError(str)
149 class CreateFixture(object):
150 def __init__(self, globals):
151 self.globals = globals
153 def load(self, name):
154 try:
155 type = self.globals[name]
156 except KeyError, inst:
157 raise Exception("Could not create fixture '%s'" % name)
158 fixture = type()
159 fixture.adapters = {}
160 return fixture
162 def add_to_python_path(path):
163 paths = path.split(':')[:-3] # remove classes:fitnesse.jar:fitlibrary.jar'
164 sys.path.extend(paths)
166 def DefaultAdapters():
167 adapters = {}
168 adapters[bool] = BoolAdapter()
169 adapters[list] = ListAdapter()
170 return adapters