summaryrefslogtreecommitdiff
path: root/src/tablib/packages
diff options
context:
space:
mode:
Diffstat (limited to 'src/tablib/packages')
-rw-r--r--src/tablib/packages/dbfpy/fields.py41
-rw-r--r--src/tablib/packages/dbfpy/header.py28
-rw-r--r--src/tablib/packages/dbfpy/record.py18
-rw-r--r--src/tablib/packages/dbfpy/utils.py1
4 files changed, 46 insertions, 42 deletions
diff --git a/src/tablib/packages/dbfpy/fields.py b/src/tablib/packages/dbfpy/fields.py
index bc39d57..c763e1e 100644
--- a/src/tablib/packages/dbfpy/fields.py
+++ b/src/tablib/packages/dbfpy/fields.py
@@ -28,7 +28,7 @@ TODO:
__version__ = "$Revision: 1.14 $"[11:-2]
__date__ = "$Date: 2009/05/26 05:16:51 $"[7:-2]
-__all__ = ["lookupFor",] # field classes added at the end of the module
+__all__ = ["lookupFor"] # field classes added at the end of the module
import datetime
import struct
@@ -36,7 +36,8 @@ import sys
from . import utils
-## abstract definitions
+# abstract definitions
+
class DbfFieldDef:
"""Abstract field definition.
@@ -56,8 +57,7 @@ class DbfFieldDef:
"""
- __slots__ = ("name", "decimalCount",
- "start", "end", "ignoreErrors")
+ __slots__ = ("name", "decimalCount", "start", "end", "ignoreErrors")
# length of the field, None in case of variable-length field,
# or a number if this field is a fixed-length field
@@ -73,13 +73,12 @@ class DbfFieldDef:
defaultValue = None
def __init__(self, name, length=None, decimalCount=None,
- start=None, stop=None, ignoreErrors=False,
- ):
+ start=None, stop=None, ignoreErrors=False):
"""Initialize instance."""
assert self.typeCode is not None, "Type code must be overridden"
assert self.defaultValue is not None, "Default value must be overridden"
- ## fix arguments
- if len(name) >10:
+ # fix arguments
+ if len(name) > 10:
raise ValueError("Field name \"%s\" is too long" % name)
name = str(name).upper()
if self.__class__.length is None:
@@ -87,13 +86,12 @@ class DbfFieldDef:
raise ValueError("[%s] Length isn't specified" % name)
length = int(length)
if length <= 0:
- raise ValueError("[%s] Length must be a positive integer"
- % name)
+ raise ValueError("[%s] Length must be a positive integer" % name)
else:
length = self.length
if decimalCount is None:
decimalCount = 0
- ## set fields
+ # set fields
self.name = name
# FIXME: validate length according to the specification at
# http://www.clicketyclick.dk/databases/xbase/format/data_types.html
@@ -144,7 +142,7 @@ class DbfFieldDef:
return (
_name +
self.typeCode +
- #data address
+ # data address
chr(0) * 4 +
chr(self.length) +
chr(self.decimalCount) +
@@ -171,7 +169,7 @@ class DbfFieldDef:
"""Return decoded field value from the record string."""
try:
return self.decodeValue(self.rawFromRecord(record))
- except:
+ except Exception:
if self.ignoreErrors:
return utils.INVALID_VALUE
else:
@@ -194,7 +192,8 @@ class DbfFieldDef:
"""
raise NotImplementedError
-## real classes
+# real classes
+
class DbfCharacterFieldDef(DbfFieldDef):
"""Definition of the character field."""
@@ -257,11 +256,13 @@ class DbfNumericFieldDef(DbfFieldDef):
% (self.name, _rv, self.length))
return _rv
+
class DbfFloatFieldDef(DbfNumericFieldDef):
"""Definition of the float field - same as numeric."""
typeCode = "F"
+
class DbfIntegerFieldDef(DbfFieldDef):
"""Definition of the integer field."""
@@ -277,6 +278,7 @@ class DbfIntegerFieldDef(DbfFieldDef):
"""Return string containing encoded ``value``."""
return struct.pack("<i", int(value))
+
class DbfCurrencyFieldDef(DbfFieldDef):
"""Definition of the currency field."""
@@ -292,6 +294,7 @@ class DbfCurrencyFieldDef(DbfFieldDef):
"""Return string containing encoded ``value``."""
return struct.pack("<q", round(value * 10000))
+
class DbfLogicalFieldDef(DbfFieldDef):
"""Definition of the logical field."""
@@ -338,7 +341,7 @@ class DbfMemoFieldDef(DbfFieldDef):
def decodeValue(self, value):
"""Return int .dbt block number decoded from the string object."""
- #return int(value)
+ # return int(value)
raise NotImplementedError
def encodeValue(self, value):
@@ -347,7 +350,7 @@ class DbfMemoFieldDef(DbfFieldDef):
Note: this is an internal method.
"""
- #return str(value)[:self.length].ljust(self.length)
+ # return str(value)[:self.length].ljust(self.length)
raise NotImplementedError
@@ -423,6 +426,7 @@ class DbfDateTimeFieldDef(DbfFieldDef):
_fieldsRegistry = {}
+
def registerField(fieldCls):
"""Register field definition class.
@@ -454,11 +458,12 @@ def lookupFor(typeCode):
# forget to look to the same comment in ``registerField``
return _fieldsRegistry[chr(typeCode)]
-## register generic types
+# register generic types
+
for (_name, _val) in list(globals().items()):
if isinstance(_val, type) and issubclass(_val, DbfFieldDef) \
- and (_name != "DbfFieldDef"):
+ and (_name != "DbfFieldDef"):
__all__.append(_name)
registerField(_val)
del _name, _val
diff --git a/src/tablib/packages/dbfpy/header.py b/src/tablib/packages/dbfpy/header.py
index cb0050a..3eff673 100644
--- a/src/tablib/packages/dbfpy/header.py
+++ b/src/tablib/packages/dbfpy/header.py
@@ -51,13 +51,12 @@ class DbfHeader:
"""
__slots__ = ("signature", "fields", "lastUpdate", "recordLength",
- "recordCount", "headerLength", "changed", "_ignore_errors")
+ "recordCount", "headerLength", "changed", "_ignore_errors")
- ## instance construction and initialization methods
+ # instance construction and initialization methods
def __init__(self, fields=None, headerLength=0, recordLength=0,
- recordCount=0, signature=0x03, lastUpdate=None, ignoreErrors=False,
- ):
+ recordCount=0, signature=0x03, lastUpdate=None, ignoreErrors=False):
"""Initialize instance.
Arguments:
@@ -111,7 +110,7 @@ class DbfHeader:
_data = bytes(first_32, sys.getfilesystemencoding())
_data = first_32
(_cnt, _hdrLen, _recLen) = struct.unpack("<I2H", _data[4:12])
- #reserved = _data[12:32]
+ # reserved = _data[12:32]
_year = _data[1]
if _year < 80:
# dBase II started at 1980. It is quite unlikely
@@ -119,10 +118,10 @@ class DbfHeader:
_year += 2000
else:
_year += 1900
- ## create header object
+ # create header object
_obj = cls(None, _hdrLen, _recLen, _cnt, _data[0],
- (_year, _data[2], _data[3]))
- ## append field definitions
+ (_year, _data[2], _data[3]))
+ # append field definitions
# position 0 is for the deletion flag
_pos = 1
_data = stream.read(1)
@@ -135,7 +134,7 @@ class DbfHeader:
return _obj
fromStream = classmethod(fromStream)
- ## properties
+ # properties
year = property(lambda self: self.lastUpdate.year)
month = property(lambda self: self.lastUpdate.month)
@@ -156,7 +155,7 @@ class DbfHeader:
""")
- ## object representation
+ # object representation
def __repr__(self):
_rv = """\
@@ -173,7 +172,7 @@ Version (signature): 0x%02x
)
return _rv
- ## internal methods
+ # internal methods
def _addField(self, *defs):
"""Internal variant of the `addField` method.
@@ -197,8 +196,7 @@ Version (signature): 0x%02x
else:
(_name, _type, _len, _dec) = (tuple(_def) + (None,) * 4)[:4]
_cls = fields.lookupFor(_type)
- _obj = _cls(_name, _len, _dec,
- ignoreErrors=self._ignore_errors)
+ _obj = _cls(_name, _len, _dec, ignoreErrors=self._ignore_errors)
_recordLength += _obj.length
_defs.append(_obj)
# and now extend field definitions and
@@ -206,7 +204,7 @@ Version (signature): 0x%02x
self.fields += _defs
return _recordLength
- ## interface methods
+ # interface methods
def addField(self, *defs):
"""Add field definition to the header.
@@ -251,7 +249,7 @@ Version (signature): 0x%02x
self.recordCount,
self.headerLength,
self.recordLength) + (b'\x00' * 20)
- #TODO: figure out if bytes(utf-8) is correct here.
+ # TODO: figure out if bytes(utf-8) is correct here.
def setCurrentDate(self):
"""Update ``self.lastUpdate`` field with current date value."""
diff --git a/src/tablib/packages/dbfpy/record.py b/src/tablib/packages/dbfpy/record.py
index 90dc468..db79e86 100644
--- a/src/tablib/packages/dbfpy/record.py
+++ b/src/tablib/packages/dbfpy/record.py
@@ -52,7 +52,7 @@ class DbfRecord:
__slots__ = "dbf", "index", "deleted", "fieldData"
- ## creation and initialization
+ # creation and initialization
def __init__(self, dbf, index=None, deleted=False, data=None):
"""Instance initialization.
@@ -82,7 +82,7 @@ class DbfRecord:
# XXX: validate self.index before calculating position?
position = property(lambda self: self.dbf.header.headerLength + \
- self.index * self.dbf.header.recordLength)
+ self.index * self.dbf.header.recordLength)
def rawFromStream(cls, dbf, index):
"""Return raw record contents read from the stream.
@@ -137,10 +137,10 @@ class DbfRecord:
"""
return cls(dbf, index, string[0]=="*",
- [_fd.decodeFromRecord(string) for _fd in dbf.header.fields])
+ [_fd.decodeFromRecord(string) for _fd in dbf.header.fields])
fromString = classmethod(fromString)
- ## object representation
+ # object representation
def __repr__(self):
_template = "%%%ds: %%s (%%s)" % max([len(_fld)
@@ -155,7 +155,7 @@ class DbfRecord:
_rv.append(_template % (_fld, _val, type(_val)))
return "\n".join(_rv)
- ## protected methods
+ # protected methods
def _write(self):
"""Write data to the dbf stream.
@@ -171,7 +171,7 @@ class DbfRecord:
self._validateIndex(False)
self.dbf.stream.seek(self.position)
self.dbf.stream.write(bytes(self.toString(),
- sys.getfilesystemencoding()))
+ sys.getfilesystemencoding()))
# FIXME: may be move this write somewhere else?
# why we should check this condition for each record?
if self.index == len(self.dbf):
@@ -179,7 +179,7 @@ class DbfRecord:
# we should write SUB (ASCII 26)
self.dbf.stream.write(b"\x1A")
- ## utility methods
+ # utility methods
def _validateIndex(self, allowUndefined=True, checkRange=False):
"""Valid ``self.index`` value.
@@ -195,9 +195,9 @@ class DbfRecord:
raise ValueError("Index can't be negative (%s)" % self.index)
elif checkRange and self.index <= self.dbf.header.recordCount:
raise ValueError("There are only %d records in the DBF" %
- self.dbf.header.recordCount)
+ self.dbf.header.recordCount)
- ## interface methods
+ # interface methods
def store(self):
"""Store current record in the DBF.
diff --git a/src/tablib/packages/dbfpy/utils.py b/src/tablib/packages/dbfpy/utils.py
index ee4396e..b3388a7 100644
--- a/src/tablib/packages/dbfpy/utils.py
+++ b/src/tablib/packages/dbfpy/utils.py
@@ -164,6 +164,7 @@ class _InvalidValue:
def __repr__(self):
return "<INVALID>"
+
# invalid value is a constant singleton
INVALID_VALUE = _InvalidValue()