summaryrefslogtreecommitdiff
path: root/summainlib.py
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2011-05-16 14:25:45 +0100
committerLars Wirzenius <liw@liw.fi>2011-05-16 14:25:45 +0100
commit9870c8baec72251ad757e122dda75e9890d8587c (patch)
tree81748302a92dbaa4329da6dc2424892065668900 /summainlib.py
parentec4944dd95fb2e85b117861ff90b1adcdad75233 (diff)
downloadsummain-9870c8baec72251ad757e122dda75e9890d8587c.tar.gz
Compute all fields lazily.
Diffstat (limited to 'summainlib.py')
-rw-r--r--summainlib.py88
1 files changed, 60 insertions, 28 deletions
diff --git a/summainlib.py b/summainlib.py
index 48127d3..3ba8529 100644
--- a/summainlib.py
+++ b/summainlib.py
@@ -161,30 +161,57 @@ class FilesystemObject(object):
def __init__(self, filename, nn, pn, exclude, stat_result=None, sha1=None,
open_file=None, readlink=None):
- stat_result = stat_result or os.lstat(filename)
- sha1 = sha1 or hashlib.sha1()
+ self._filename = filename
+ self._exclude = exclude
+ self._pn = pn
+ self._nn = nn
+ self._sha1 = sha1 or hashlib.sha1()
+ self._stat_result = stat_result or os.lstat(filename)
self.open_file = open_file or file
- readlink = readlink or os.readlink
-
- self.exclude = exclude
-
+ self.readlink = readlink or os.readlink
self.values = dict()
- self['Name'] = pn.normalize(filename)
- self['Mtime'] = self.format_time(stat_result.st_mtime)
- self['Mode'] = '%o' % stat_result.st_mode
- self['Ino'] = '%d' % nn.get_ino(stat_result.st_ino)
- self['Dev'] = '%d' % nn.get_dev(stat_result.st_dev)
- self['Nlink'] = '%d' % stat_result.st_nlink
- if not stat.S_ISDIR(stat_result.st_mode):
- self['Size'] = '%d' % stat_result.st_size
- self['Uid'] = '%d' % stat_result.st_uid
- self['Username'] = self.lookup_username(stat_result.st_uid)
- self['Gid'] = '%d' % stat_result.st_gid
- self['Group'] = self.lookup_group(stat_result.st_gid)
- if stat.S_ISREG(stat_result.st_mode):
- self['Sha-1'] = self.compute_sha1(filename, sha1)
- if stat.S_ISLNK(stat_result.st_mode):
- self['Target'] = readlink(filename)
+
+ def _compute_name(self):
+ return urllib.quote(self._pn.normalize(self._filename))
+
+ def _compute_mtime(self):
+ return self.format_time(self._stat_result.st_mtime)
+
+ def _compute_mode(self):
+ return '%o' % self._stat_result.st_mode
+
+ def _compute_ino(self):
+ return '%d' % self._nn.get_ino(self._stat_result.st_ino)
+
+ def _compute_dev(self):
+ return '%d' % self._nn.get_dev(self._stat_result.st_dev)
+
+ def _compute_nlink(self):
+ return '%d' % self._stat_result.st_nlink
+
+ def _compute_size(self):
+ if not stat.S_ISDIR(self._stat_result.st_mode):
+ return '%d' % self._stat_result.st_size
+
+ def _compute_uid(self):
+ return '%d' % self._stat_result.st_uid
+
+ def _compute_username(self):
+ return self.lookup_username(self._stat_result.st_uid)
+
+ def _compute_gid(self):
+ return '%d' % self._stat_result.st_gid
+
+ def _compute_group(self):
+ return self.lookup_group(self._stat_result.st_gid)
+
+ def _compute_sha_1(self):
+ if stat.S_ISREG(self._stat_result.st_mode):
+ return self.compute_sha1(self._filename, self._sha1)
+
+ def _compute_target(self):
+ if stat.S_ISLNK(self._stat_result.st_mode):
+ return self.readlink(self._filename)
def format_time(self, timestamp):
return time.strftime('%Y-%m-%d %H:%M:%S +0000',
@@ -206,16 +233,21 @@ class FilesystemObject(object):
f.close()
return sha1.hexdigest()
- def hook_name(self, value):
- return urllib.quote(value)
-
def __setitem__(self, key, value):
- hook_name = 'hook_%s' % key.lower()
- if hasattr(self, hook_name):
- value = getattr(self, hook_name)(value)
self.values[key] = value
+ def _normalize_key(self, key):
+ key = key.lower()
+ key = '_'.join(key.split('-'))
+ return key
+
def __getitem__(self, key):
+ if key not in self.values:
+ method = '_compute_%s' % self._normalize_key(key)
+ if hasattr(self, method):
+ value = getattr(self, method)()
+ if value is not None:
+ self.values[key] = value
return self.values.get(key, '')
def _isdir(self):