NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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)