row.py (5240B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\script\sys\row.py 2 from __future__ import print_function 3 from future.utils import raise_ 4 import sys 5 import types 6 import unittest 7 8 class Row(object): 9 __guid__ = 'util.Row' 10 __passbyvalue__ = 1 11 __slots__ = ('header', 'line') 12 13 def __init__(self, header = None, line = None): 14 if header and line and len(header) != len(line): 15 raise ValueError('header and line must be equal length lists') 16 self.header = header or [] 17 self.line = line or [] 18 19 def __ne__(self, other): 20 return self.__cmp__(other) != 0 21 22 def __eq__(self, other): 23 return self.__cmp__(other) == 0 24 25 def __getattr__(self, name): 26 if name in self.__slots__: 27 return object.__getattribute__(self, name) 28 try: 29 return self.line[self.header.index(name)] 30 except ValueError: 31 raise_(AttributeError, name) 32 except KeyError: 33 raise_(AttributeError, name) 34 35 def __getitem__(self, i): 36 if type(i) == types.StringType: 37 try: 38 return getattr(self, i) 39 except AttributeError: 40 raise KeyError(i) 41 42 return self.line[i] 43 44 def __setitem__(self, key, value): 45 if type(key) == types.StringType: 46 return setattr(self, key, value) 47 self.line[key] = value 48 49 def __setattr__(self, key, value): 50 if key in self.__slots__: 51 object.__setattr__(self, key, value) 52 else: 53 try: 54 self.line[self.header.index(key)] = value 55 except ValueError: 56 raise AttributeError(key) 57 58 def __repr__(self): 59 header = self.header 60 line = self.line 61 if len(header) > len(line): 62 return '<Row MANGLED ROW,%s,%r>' % (header, line) 63 ret = '<Row ' 64 for i in range(len(header)): 65 ret += '%s:%r,' % (header[i], line[i]) 66 67 return ret[:-1] + '>' 68 69 def __len__(self): 70 return len(self.line) 71 72 def __getslice__(self, i, j): 73 return self.__class__(self.header[i:j], self.line[i:j]) 74 75 def __cmp__(self, other): 76 if type(other) != type(self): 77 return NotImplemented 78 elif self.header != other.header: 79 return cmp(self.header, other.header) 80 else: 81 return cmp(self.line, other.line) 82 83 def __getstate__(self): 84 return (self.header, self.line) 85 86 def __setstate__(self, state): 87 self.header, self.line = state 88 89 90 class TestRowConstruction(unittest.TestCase): 91 92 def testConstructWithValues(self): 93 self.assertTrue(True) 94 row = Row(['a', 'b'], [1, 2]) 95 self.assertEqual(row.header, ['a', 'b']) 96 self.assertEqual(row.line, [1, 2]) 97 98 def testConstructEmpty(self): 99 row = Row() 100 self.assertEqual(row.header, []) 101 self.assertEqual(row.line, []) 102 103 def testConstructHeaderOnly(self): 104 row = Row(['a', 'b']) 105 self.assertEqual(row.header, ['a', 'b']) 106 row = Row(['a', 'b'], []) 107 self.assertEqual(row.header, ['a', 'b']) 108 109 def testConstructWithValuesRequiresEqualLengthLists(self): 110 with self.assertRaises(ValueError): 111 row = Row(['a', 'b'], [1]) 112 113 114 class TestRowAccess(unittest.TestCase): 115 116 def testAccessByName(self): 117 row = Row(['a', 'b'], [1, 2]) 118 self.assertEqual(row.a, 1) 119 self.assertEqual(row.b, 2) 120 with self.assertRaises(AttributeError): 121 row.c 122 123 def testAccessByIndex(self): 124 row = Row(['a', 'b'], [1, 2]) 125 self.assertEqual(row[0], 1) 126 self.assertEqual(row[1], 2) 127 with self.assertRaises(IndexError): 128 row[2] 129 130 def testAccessLikeDict(self): 131 row = Row(['a', 'b'], [1, 2]) 132 self.assertEqual(row['a'], 1) 133 self.assertEqual(row['b'], 2) 134 with self.assertRaises(KeyError): 135 row['c'] 136 137 138 class TestRowMutation(unittest.TestCase): 139 140 def testMutateByName(self): 141 row = Row(['a', 'b'], [1, 2]) 142 row.a = 3 143 self.assertEqual(row.a, 3) 144 self.assertEqual(row.line, [3, 2]) 145 with self.assertRaises(AttributeError): 146 row.c = 4711 147 148 def testMutateByIndex(self): 149 row = Row(['a', 'b'], [1, 2]) 150 row[0] = 3 151 self.assertEqual(row[0], 3) 152 with self.assertRaises(IndexError): 153 row[2] = 4711 154 155 def testCannotCreateImmutableAttributesThroughDunderDict(self): 156 row = Row(['a', 'b'], [1, 2]) 157 with self.assertRaises(AttributeError): 158 row.__dict__['a'] = 4711 159 160 161 class TestRowSlicing(unittest.TestCase): 162 163 def testSlice(self): 164 row = Row(['a', 'b'], [1, 2]) 165 self.assertEqual(row[:], row) 166 self.assertEqual(row[0:1], Row(['a'], [1])) 167 self.assertEqual(row[1:], Row(['b'], [2])) 168 169 170 class TestRowMarshal(unittest.TestCase): 171 172 def testCanMarshal(self): 173 import blue 174 row = Row(['a', 'b'], [1, 2]) 175 m = blue.marshal.Save(row) 176 try: 177 new = blue.marshal.Load(m) 178 except Exception as exc: 179 print('Could not marshal row: %s' % exc) 180 181 self.assertEqual(row, new)