diff options
author | Lars Wirzenius <liw@liw.fi> | 2011-05-16 14:25:45 +0100 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2011-05-16 14:25:45 +0100 |
commit | 9870c8baec72251ad757e122dda75e9890d8587c (patch) | |
tree | 81748302a92dbaa4329da6dc2424892065668900 /summainlib.py | |
parent | ec4944dd95fb2e85b117861ff90b1adcdad75233 (diff) | |
download | summain-9870c8baec72251ad757e122dda75e9890d8587c.tar.gz |
Compute all fields lazily.
Diffstat (limited to 'summainlib.py')
-rw-r--r-- | summainlib.py | 88 |
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): |