| 1948 | #--- DATASHEET COLUMNS ----------------------------------------------------------------------------- |
| 1949 | |
| 1950 | class DatasheetColumns(list): |
| 1951 | |
| 1952 | def __init__(self, datasheet): |
| 1953 | self._datasheet = datasheet |
| 1954 | self._cache = {} # Keep a reference to DatasheetColumn objects generated with Datasheet.columns[j]. |
| 1955 | # This way we can unlink them when they are deleted. |
| 1956 | |
| 1957 | def __setitem__(self, j, column): |
| 1958 | if self._datasheet.fields is not None and j < len(self._datasheet.fields): |
| 1959 | # Preserve the column header if it exists. |
| 1960 | f = self._datasheet.fields[j] |
| 1961 | else: |
| 1962 | f = None |
| 1963 | self.pop(j) |
| 1964 | self.insert(j, column, field=f) |
| 1965 | def __getitem__(self, j): |
| 1966 | if j < 0: j = j % len(self) # DatasheetColumns[-1] |
| 1967 | if j >= len(self): |
| 1968 | raise IndexError, "list index out of range" |
| 1969 | return self._cache.setdefault(j, DatasheetColumn(self._datasheet, j)) |
| 1970 | def __delitem__(self, j): |
| 1971 | self.pop(j) |
| 1972 | def __len__(self): |
| 1973 | return len(self._datasheet) > 0 and len(self._datasheet[0]) or 0 |
| 1974 | def __iter__(self): |
| 1975 | for i in xrange(len(self)): yield self.__getitem__(i) |
| 1976 | def __repr__(self): |
| 1977 | return repr(list(iter(self))) |
| 1978 | def __add__(self, column): |
| 1979 | raise TypeError, "unsupported operand type(s) for +: 'Datasheet.columns' and '%s'" % column.__class__.__name__ |
| 1980 | def __iadd__(self, column): |
| 1981 | self.append(column); return self |
| 1982 | def __eq__(self, columns): |
| 1983 | return list(self) == columns |
| 1984 | def __ne__(self, columns): |
| 1985 | return not self.__eq__(self, columns) |
| 1986 | |
| 1987 | def insert(self, j, column, default=None, field=None): |
| 1988 | """ Inserts the given column into the matrix. |
| 1989 | Missing rows at the end (bottom) will be filled with the default value. |
| 1990 | """ |
| 1991 | try: column = [v for v in column] |
| 1992 | except: |
| 1993 | raise TypeError, "Datasheet.columns.insert(x): x must be list" |
| 1994 | column = column + [default] * (len(self._datasheet) - len(column)) |
| 1995 | if len(column) > len(self._datasheet): |
| 1996 | self._datasheet.extend([[None]] * (len(column)-len(self._datasheet))) |
| 1997 | for i, row in enumerate(self._datasheet): |
| 1998 | row.insert(j, column[i]) |
| 1999 | self._datasheet.__dict__["_m"] += 1 # Increase column count. |
| 2000 | # Add a new header. |
| 2001 | if self._datasheet.fields is not None: |
| 2002 | self._datasheet.fields += [(None, None)] * (len(self) - len(self._datasheet.fields) - 1) |
| 2003 | self._datasheet.fields.insert(j, field or (None, None)) |
| 2004 | |
| 2005 | def append(self, column, default=None, field=None): |
| 2006 | self.insert(len(self), column, default, field) |
| 2007 | def extend(self, columns, default=None, fields=[]): |
no outgoing calls
no test coverage detected
searching dependent graphs…