Hi, seth! >>>>> "sv" == seth vidal <skvidal@xxxxxxxxxxxx> writes: >> > I offer to allocate the common functions in a separate module. >> > package.py, rpmStuff.py, pkgStuff.py, pkg_tools.py... >> > I do not know, I like all these names;-) >> Thats fine w/me - two prerequisites: >> 1. no classes. make it all procedural for now. ok. ;-) >> 2. comment the code heavily. surely sv> one more thing - it would probably be most useful if the functions got sv> broken out into: sv> rpmUtils.py, hdrUtils.py and sysUtils.py sv> they being, respectively, stuff to manipulate rpms, stuff to sv> manipulate the headers and/or info in the headers (ie ver comparison) where best place for def readHeader(file_name): """get rpm-header data from file""" ... with current implementation (read header from .rpm as well as .hdr)? hdrUtil? rpmUtil? split function? with OO-decomposition I will write: class rpm_header: """rpm-header data representation and routines""" def __init__(self, file_name): """read header from a given file""" # part of readHeader implementation: read from .hdr try: log(6, 'load gzipped header "%s"' % file_name) _fd = gzip.open(file_name, 'r') _hdr = _fd.read() except: log(6, 'load plain header "%s"' % file_name) _fd = open(file_name, 'r') _hdr = _fd.read() try: log(6, 'decode header "%s"' % file_name) self.hdr = rpm.headerLoad(_hdr) except: log(4, 'Error decoding header file "%s"' % file_name) self.hdr = None fd.close() def getTag(self, tag_name): """get header field by name""" if tag_name == 'NAME': return self.hdr[rpm.RPMTAG_NAME] ... # map other string tag_names, to rpm.RPMTAG_* elif tag_name == 'EPOCH': _epoch = self.hdr[rpm.RPMTAG_EPOCH] if _epoch is None: return '0' else: return str(self.hdr[rpm.RPMTAG_EPOCH]) else: return 'Unknown tag name %s' % tag_name # or # raise ValueError, 'Unknown tag_name = %s' % tag_name def getENVRA(self): """get epoch, name, ver, rel, arch from""" ... # map list of tag-names to tuple with tag values class rpm_package(rpm_header): """rpm-package data representation and routines""" def __init__(self, file_name): """read package data from given file""" # some code portion from current readHader log(6, 'load header from package "%s"' % file_name) _fd = os.open(file_name, os.O_RDONLY) self.hdr = rpm.headerFromPackage(fd)[0] os.close(fd) ... result: - we not mix rpm/hdr routines. All code clean, and transparetn like glass ;-) - real getTag() code will be only at one place - rpm_header class implementation, and can be easy used from rpm_package class instances. - many other code will be writed once. Mostly, in rpm_header implementation from every instance of rpm_header class or rpm_pckage class we can call getTag('NAME') method, and get (for example) same result as we get after call rpm -qp --queryformat '%{NAME}' some-package-file.rpm at shell prompt. nice? But, ok, "no classs for now". Just say "where best place of readHader function?" ;-) sv> and generic stuff to mkdirs/find stuff on the system. no questions/suggestions ;-) -- Bor.