PK}F5GCB dirstat/TreemapView.py#!/usr/bin/env python DefaultMinTileSize = 3 UpdateMinSize = 2 from SimuQT import Point, Rect, Canvas from TreemapTile import TreemapTile class TreemapView( object ): """This class is the main class of pydirstat that make the drawing. It is directly inspired from KTreemapView (from KDirStat). This class build the tree of files and work with the dumper/drawer to draw the tree.""" def __init__( self, tree, initialSize ): """Constructor""" self._tree = tree self._rootTile = None self._selectedTile = None self._selectionRect = None self._tilestodraw = [] # Not in KDirStat self._initialSize = initialSize self.readConfig() # self.resize( initialSize ) if tree and tree.root() : if not self._rootTile : self.rebuildTreemap( tree.root() ) def selectedTile(self) : return self._selectedTile def rootTile(self) : return self._rootTile def tree(self) : return self._tree def minTileSize(self) : return self._minTileSize def readConfig( self ) : self._minTileSize = DefaultMinTileSize def canvas( self ) : """Return a new simulated Qt Canvas.""" return Canvas() def tileAt( self, pos ) : """Find the tile at a certain position. Anyway, need to implement Canvas.collisions first. Not used. DO NOT USE.""" tile = None for canvasitem in self.canvas().collisions( pos ) : if canvasitem : return canvasitem return None def rebuildTreemap( self, newRoot, newSize=None ): """Build/Rebuild the tree.""" if not newSize : newSize = self.visibleSize() self._selectedTile = None; self._selectionRect = None; self._rootTile = None; self.canvas().resize( newSize.width(), newSize.height() ) if newSize.width() >= UpdateMinSize and newSize.height() >= UpdateMinSize : if newRoot : self._rootTile = TreemapTile( self, # parentView None, # parentTile newRoot, # fileinfo Rect( point=Point(0, 0), size=newSize ), 'Auto' ) def visibleSize( self ) : """Access to the size of the tree""" return self._initialSize def draw(self,painter): """Draw the tree in a painter/dumper.""" for tile in self._tilestodraw : tile.drawShape(painter) def addTileToDraw(self,tile) : """Add a new TreemapTile to the View""" self._tilestodraw.append(tile) if __name__ == '__main__' : pass PKF5RУdirstat/FileProvider.py#!/usr/bin/env python from FileProviderLocal import FileProviderLocal # For now, only the local file provider can be used FileProvider = FileProviderLocal PK?4/IN,N,dirstat/DirInfo.py#!/usr/bin/env python from FileInfo import FileInfo from FileInfoList import FileInfoList class DirInfo( FileInfo ): """This class override the FileInfo for directory""" def __init__( self, tree=None, parent=None, name=None, statInfo=None, asDotEntry=False ): FileInfo.__init__(self, tree, parent, name, statInfo) self._isDotEntry = False # Flag: is this entry a "dot entry"? self._isMountPoint = False # Flag: is this a mount point? self._pendingReadJobs = 0 # number of open directories in this subtree # Children management self._firstChild = None # pointer to the first child self._dotEntry = None # pseudo entry to hold non-dir children # Some cached values self._totalSize = self._size self._totalArea = self._area self._totalBlocks = self._blocks self._totalItems = 0 self._totalSubDirs = 0 self._totalFiles = 0 self._latestMtime = self._mtime self._summaryDirty = False # dirty flag for the cached values self._beingDestroyed = False # [TODO] : Queue system self._readState = None if asDotEntry : self._isDotEntry = True self._dotEntry = None self._name = "." else : self._isDotEntry = False # self._dotEntry = DirInfo( tree=tree, parent=self, asDotEntry=True ) def totalSize(self) : """Return the total size of the special data used for area of tiles.""" if self._summaryDirty : self.recalc() return self._totalSize def totalArea(self) : """Return the total area of the special data used for area of tiles.""" if self._summaryDirty : self.recalc() return self._totalArea def totalBlocks(self) : """Return the total dir size used by block.""" if self._summaryDirty : self.recalc() return self._totalBlocks def totalItems(self) : """Return the number of items in the directory.""" if self._summaryDirty : self.recalc() return self._totalItems def totalSubDirs(self) : """Return the number of sub directories in the directory.""" if self._summaryDirty : self.recalc() return self._totalSubDirs def totalFiles(self) : """Return the number of normal file in the directory.""" if self._summaryDirty : self.recalc() return self._totalFiles def latestMtime(self) : """Return the latest modified file in the directory.""" if self._summaryDirty : self.recalc() return self._latestMtime def isMountPoint(self) : return self._isMountPoint def setMountPoint(self,isMountPoint) : self._isMountPoint = isMountPoint def isFinished(self) : return not(self.isBusy()) def isBusy(self) : if self._pendingReadJobs > 0 and self._readState != 'Aborted': return True if self.readState() == 'Reading' or self.readState() == 'Queued' : self.readState() == 'Queued' return self.False def pendingReadJobs(self) : return self._pendingReadJobs def firstChild(self) : return self._firstChild def setFirstChild(self,firstChild) : self._firstChild = firstChild def insertChild(self,newChild) : """Insert a new child in the directory.""" if newChild.isDir() or (self._dotEntry == None) or self._isDotEntry : # print "-[%s]-[%s]-[%s]" % (self._name,newChild._name,'YES') # Only directories are stored directly in pure directory nodes - # unless something went terribly wrong, e.g. there is no dot entry to use. # If this is a dot entry, store everything it gets directly within it. # # In any of those cases, insert the new child in the children list. # # We don't bother with this list's order - it's explicitly declared to # be unordered, so be warned! We simply insert this new child at the # list head since this operation can be performed in constant time # without the need for any additional lastChild etc. pointers or - # even worse - seeking the correct place for insertion first. This is # none of our business; the corresponding "view" object for this tree # will take care of such niceties. newChild.setNext( self._firstChild ) self._firstChild = newChild newChild.setParent( self ) # make sure the parent pointer is correct self.childAdded( newChild ) # update summaries else : # print "-[%s]-[%s]-[%s]" % (self._name,newChild._name,'NAD') # If the child is not a directory, don't store it directly here - use # this entry's dot entry instead. self._dotEntry.insertChild( newChild ) def dotEntry(self) : return self._dotEntry def setDotEntry(self,dotEntry) : self._dotEntry = dotEntry def isDotEntry(self) : return self._isDotEntry def childAdded(self,newChild) : """Called when a new child is added.""" if not(self._summaryDirty) : self._totalSize += newChild.totalSize() self._totalArea += newChild.totalArea() self._totalBlocks += newChild.totalBlocks() self._totalItems += 1 if newChild.isDir() : self._totalSubDirs+=1 if newChild.isFile() : self._totalFiles+=1 if newChild.mtime() > self._latestMtime : self._latestMtime = newChild.mtime() else : pass # Don't bother updating the summary fields if the summary is dirty # (i.e. outdated) anyway: As soon as anybody wants to know some exact # value a complete recalculation of the entire subtree will be # triggered. On the other hand, if nobody wants to know (which is very # likely) we can save this effort. if self._parent : self._parent.childAdded( newChild ) def unlinkChild(self,deletedChild) : """Remove a child from the directory.""" if deletedChild.parent() != self : return None if deletedChild == self._firstChild : self._firstChild = deletedChild.next() return child = firstChild() while child : if child.next() == deletedChild : child.setNext( deletedChild.next() ) return child = child.next() def deletingChild(self,deletedChild) : """Remove a child from the directory.""" # When children are deleted, things go downhill: Marking the summary # fields as dirty (i.e. outdated) is the only thing that can be done here. # # The accumulated sizes could be updated (by subtracting this deleted # child's values from them), but the latest mtime definitely has to be # recalculated: The child now being deleted might just be the one with the # latest mtime, and figuring out the second-latest cannot easily be # done. So we merely mark the summary as dirty and wait until a recalc() # will be triggered from outside - which might as well never happen when # nobody wants to know some summary field anyway. self._summaryDirty = True if self._parent : self._parent.deletingChild( deletedChild ) if not(self._beingDestroyed) and (deletedChild.parent() == self) : # Unlink the child from the children's list - but only if this doesn't # happen recursively in the destructor of this object: No use # bothering about the validity of the children's list if this will all # be history anyway in a moment. self.unlinkChild( deletedChild ) def readJobAdded(self) : self._pendingReadJobs+=1 if self._parent : self._parent.readJobAdded() def readJobFinished(self) : self._pendingReadJobs-=1 if self._parent : self._parent.readJobFinished() def readJobAborted(self) : self._readState = 'Aborted' if self._parent : self._parent.readJobAborted() def finalizeLocal(self) : self.cleanupDotEntries() def readState(self) : if self._isDotEntry and self._parent : return self._parent.readState() else : return self._readState def setReadState(self,readState) : if self._readState == 'Aborted' and newReadState == 'Finished' : return self._readState = newReadState def isDirInfo(self) : return True def recalc(self) : """recalc data for the directory. Used as a cache to calculate only once information if nothing changed since last call.""" self._totalSize = self._size self._totalArea = self._area self._totalBlocks = self._blocks self._totalItems = 0 self._totalSubDirs = 0 self._totalFiles = 0 self._latestMtime = self._mtime for fileInfo in FileInfoList(self,'AsSubDir') : self._totalSize += fileInfo.totalSize() self._totalArea += fileInfo.totalArea() self._totalBlocks += fileInfo.totalBlocks() self._totalItems += fileInfo.totalItems() + 1 self._totalSubDirs += fileInfo.totalSubDirs() self._totalFiles += fileInfo.totalFiles() if fileInfo.isDir() : self._totalSubDirs+=1 if fileInfo.isFile() : self._totalFiles+=1 childLatestMtime = fileInfo.latestMtime() if childLatestMtime > self._latestMtime : self._latestMtime = childLatestMtime self._summaryDirty = False def cleanupDotEntries(self) : if not(self._dotEntry) or self._isDotEntry : return # Reparent dot entry children if there are no subdirectories on this level if not(self._firstChild) : child = self._dotEntry.firstChild() self._firstChild = child; # Move the entire children chain here. self._dotEntry.setFirstChild( 0 ) # self._dotEntry will be deleted below. while child : child.setParent( self ) child = child.next() if not( self._dotEntry.firstChild() ) : self._dotEntry = None def test(): pass if __name__ == '__main__' : test() PK}F5r_##dirstat/FileInfo.py#!/usr/bin/env python from SizeColorProvider import sizeColorProvider FileSizeMax = 9223372036854775807L class FileInfo( object ): """This class sotre informations about a file. Directories are stored in a child of this class : DirInfo""" def __init__( self, tree=None, parent=None, name=None, statInfo=None ): # elif statInfo : # # Constructor from a stat buffer (i.e. based on an lstat() call). # pass # else statInfo : # # Constructor from tree/parent/name # pass #print "Const : %s" % (( self, tree, parent, name, statInfo ),) self._name = name or '' # the file name (without path!) self._isLocalFile = True # flag: local or remote file? self._device = 0 # device this object resides on self._mode = 0 # file permissions + object type self._links = 0 # number of links self._size = 0 # size in bytes self._blocks = 0 # 512 bytes blocks self._mtime = 0 # modification time self._area = 0 # area self._parent = parent # pointer to the parent entry self._next = None # pointer to the next entry self._tree = tree # pointer to the parent tree self._statInfo = statInfo if statInfo : self._device = self._statInfo.st_dev() self._mode = self._statInfo.st_mode() self._links = self._statInfo.st_nlink() self._mtime = self._statInfo.st_mtime() if not(self.isSpecial()) : self._size = self._statInfo.st_size() self._blocks = self._statInfo.st_blocks() sizeColorProvider.updateFileInfo(self) self._area = sizeColorProvider.get_area(self) def isLocalFile(self) : return self._isLocalFile def name(self) : return self._name def url(self) : """Return url of the file (currently only support local files)""" if self._parent : parentUrl = self._parent.url() if self.isDotEntry() : return parentUrl return self._tree.file_provider().join(parentUrl,self._name) else : return self._name def urlPart( self, targetLevel ) : level = self.treeLevel() if level < targetLevel : return "" item = self while level > targetLevel : level-=1 item = item.parent() return item.name() def device(self) : return self._device def mode(self) : return self._mode def links(self) : return self._links def size(self) : return self._size def area(self) : return self._area def blocks(self) : return self._blocks def blockSize(self) : return 512 def mtime(self) : return self._mtime def totalSize(self) : return self._size def totalArea(self) : return self._area def totalBlocks(self) : return self._blocks def totalItems(self) : return 0 def totalSubDirs(self) : return 0 def totalFiles(self) : return 0 def latestMtime(self) : return self._mtime def isMountPoint(self) : return False def setMountPoint(self,isMountPoint) : pass def isFinished(self) : return True def isBusy(self) : return False def pendingReadJobs(self) : return 0 def tree(self) : return self._tree def parent(self) : return self._parent def setParent(self,parent) : self._parent = parent def next(self) : return self._next def setNext(self,next) : self._next = next def firstChild(self) : return None def setFirstChild(self,firstChild) : pass def hasChildren(self) : return self.firstChild() or self.dotEntry() def isInSubtree(self,subtree) : ancestor = self while ancestor : if ancestor == subtree : return True ancestor = ancestor.parent() return False def insertChild(self) : pass def dotEntry(self) : return None def setDotEntry(self,dotEntry) : pass def isDotEntry(self) : return False def treeLevel(self) : level = 0 parent = self._parent while parent : level+=1 parent = parent.parent() return level def childAdded(self,newChild) : pass def unlinkChild(self) : pass def deletingChild(self) : pass def readState(self) : return 'Finished' def isDirInfo(self) : return False def isDir(self) : return self._statInfo.is_dir() def isFile(self) : return self._statInfo.is_reg() def isSymLink(self) : return self._statInfo.is_lnk() def isDevice(self) : return self._statInfo.is_blk() or self._statInfo.is_chr() def isBlockDevice(self) : return self._statInfo.is_blk() def isCharDevice(self) : return self._statInfo.is_chr() def isSpecial(self) : return ( self._statInfo.is_blk() or self._statInfo.is_chr() or self._statInfo.is_fifo() or self._statInfo.is_sock() ) def test(): pass if __name__ == '__main__' : test() PKb5wЉ  dirstat/Dumper.py#!/usr/bin/env python import os import time import sys from FileTree import FileTree from Configuration import Configuration from TreemapView import TreemapView from __version__ import __version__ from SimuQT import Size,Color from SimuQT import fmtsize class FileDumper( object ) : """This is the mother class of all dumpers. A dumper is a plugin that receive informations about a file and how to draw it. It usually dump a file, but you can do whatever you want with it.""" EXT=".dump" NEEDHANDLE=True def __init__(self, rootpath=None, outputfile=None) : self._configuration = Configuration() if self._configuration.get_value('path') != '' : rootpath = self._configuration.get_value('path') # Gruik Gruik : C:" -> C:\ Thanks Windows ! if rootpath and (len(rootpath)==3) and (rootpath[2]) == '"' : rootpath = rootpath[0:2] + '\\' if rootpath == None : rootpath = '.' tree = FileTree(rootpath) # handle --exclude-list, to exclude some files/path based on name exclude_list_sep = self._configuration.get_value('exclude-list-sep') # Ok, we split the string 'exclude-list' on exclude_list_sep, then we remove starting and ending whitespaces, and we remove empty strings # " praf,,, ,glut, ,monk " will return [ 'praf', 'glut, 'monk' ] exclude_list = filter(lambda x:len(x)>0,map(lambda x:x.strip(' '),self._configuration.get_value('exclude-list').split(exclude_list_sep))) # Ok, we split the string 'exclude-list-re' on exclude_list_sep, then we remove starting and ending whitespaces, and we remove empty strings # " praf,,, ,glut, ,monk " will return [ 'praf', 'glut, 'monk' ] exclude_list_re = filter(lambda x:len(x)>0,map(lambda x:x.strip(' '),self._configuration.get_value('exclude-list-re').split(exclude_list_sep))) tree.set_exclude_list(exclude_list) tree.set_exclude_list_re(exclude_list_re) tree.scan() self._rootpath = tree.rootpath() self._tree = tree filename = outputfile if filename == None : filename = self._configuration.get_value('outputfile') if filename == '' : if os.path.isdir(self._rootpath) : filename = os.path.join(self._rootpath,self._configuration.get_value('basename')+self.EXT) else : name = os.path.split(self._rootpath)[1] filename = name + '.' + self._configuration.get_value('basename') + self.EXT self._filename = filename self._size = None def dump(self,gsize=None) : """This method really start the dump. You should not override it. Override _start_dump, _end_dump or add_rect instead.""" if gsize != None : self._size = gsize if self._size == None : self._size = Size(self._configuration.get_value('width'),self._configuration.get_value('height')) self._treemapview = TreemapView( self._tree, self._size ) size = self._treemapview.visibleSize() if self.NEEDHANDLE : self._file = file(self._filename,'wt') self._start_dump() self._treemapview.draw(self) self._end_dump() if self.NEEDHANDLE : self._file.close() def get_metadata(self) : '''This method may be called by plugin to print metadata''' return [ ('Generator', 'pydirstat'), ('Version', __version__), ('Directory', self._tree.file_provider().abspath(self._rootpath)), ('Total Size',fmtsize(self._treemapview.rootTile().fileinfo().totalSize())), ('Date', time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())), ('Configuration File',self._configuration.get_filename()), ('Python version',sys.version), ] def get_colors(self) : '''This method may be called by plugin to print legend''' method_by_type = {} types = [] colors = {} for section_name in self._configuration.get_sections() : if section_name.startswith('type:') : section_content = self._configuration.get_section(section_name) for key in section_content : value = section_content[key] if value not in method_by_type : method_by_type[value] = {} if section_name not in method_by_type[value] : method_by_type[value][section_name] = [] method_by_type[value][section_name].append(key) if value not in types : types.append(value) elif section_name == 'color' : colors_conf = self._configuration.get_section('color') for color in colors_conf : colors[color] = Color(colors_conf[color]) types.sort() if 'file' not in types : types.append('file') if 'dir' not in types : types.append('dir') if '_' not in types : types.append('_') for typename in types : if typename not in colors : colors[typename] = colors['_'] return types,colors,method_by_type def get_size(self) : """Return the size of the TreemapView""" return self._treemapview.visibleSize() def _start_dump(self) : '''You should override this method. Called once before starting dump.''' pass def _end_dump(self) : '''You should override this method. Called once after dumping all rectangle.''' pass def addrect(self,**kwargs) : '''You should override this method. It will be called on each rectangle. kwargs contains x,y,width,height,filename,filesize,color...''' pass PK<4"B B dirstat/__init__.py#!/usr/bin/env python # from HTMLDumper import Dumper from SimuQT import Size from CommandLine import CommandLine, ParseError from Configuration import Configuration import sys import encodings import imp import os from __version__ import __version__ def config() : configuration = Configuration() for key in configuration : if configuration.need_configure(key) : doc = configuration.get_doc(key) strvalue = configuration.get_strvalue(key) print "%s ?[%s]" % (doc,strvalue) line = sys.stdin.readline().replace('\r','').replace('\n','') if line != '' : configuration.set_strvalue(key,line) configuration.save() print "The file %s has been updated. Press RETURN to continue." % (configuration.get_filename(),) sys.stdin.readline() def main() : commandline = CommandLine(sys.argv) e = None try : #if True : action = commandline.parse() if action == CommandLine.ACTION_DUMP : configuration = Configuration() dumpername = configuration.get_value('dumper') pluginpath = [] pluginsubpath = os.path.join('dirstat','Dumpers') if os.path.exists(sys.argv[0]) : pluginpath.append(os.path.join(os.path.dirname(sys.argv[0]),pluginsubpath)) if configuration.get_value('pluginpath') != '' : pluginpath.append(os.path.join(configuration.get_value('pluginpath'),pluginsubpath)) pluginpath.append(configuration.get_value('pluginpath')) for pathname in sys.path : pluginpath.append(os.path.join(pathname,pluginsubpath)) try : modulename = dumpername #print (modulename,pluginpath) moduleinfo = imp.find_module(modulename,pluginpath) #print (moduleinfo,) module = imp.load_module(modulename,*moduleinfo) moduleinfo[0].close() Dumper = module.Dumper Dumper().dump() except ImportError : raise ParseError('Dumper %s cannot be loaded' % (dumpername,)) elif action == CommandLine.ACTION_USAGE : print commandline.get_usage(), elif action == CommandLine.ACTION_VERSION : print commandline.get_version_text(), elif action == CommandLine.ACTION_CONFIG : config() except (ParseError,ValueError), e : print commandline.get_usage() raise e if __name__ == '__main__' : sys.argv = ['praf','--dumper=HTML',] main() PK+b5QE1XXdirstat/FileTree.py#!/usr/bin/env python from DirInfo import DirInfo from FileInfo import FileInfo from SizeColorProvider import sizeColorProvider from FileProvider import FileProvider import re class FileTree( object ) : """This class scan a directory and create a tree of FileInfo.""" def __init__(self, rootpath=None) : """Constructor""" if FileProvider.supports_unicode_filenames : rootpath = unicode(rootpath) else : rootpath = str(rootpath) self._rootpath = rootpath self._root = None self._file_provider = FileProvider(self._rootpath) self._exclude_list = [] self._exclude_list_re = [] def set_exclude_list(self,exclude_list) : self._exclude_list = exclude_list def set_exclude_list_re(self,exclude_list_re) : self._exclude_list_re = exclude_list_re def file_provider(self) : return self._file_provider def root( self ) : """Return the root FileInfo (usually a DirInfo).""" return self._root def rootpath( self ) : """Return the rootpath (a str or unicode).""" return self._rootpath def scan( self, rootpath=None ) : """Scan the rootpath and build the tree.""" if rootpath : self._rootpath = rootpath self._root = None pathinfos = {} sizeColorProvider.reinitFileTree() exclude_list_re = [] for exclude_item in self._exclude_list : exclude_list_re.append(re.compile('^'+str(exclude_item).replace('\\','\\\\').replace('.','\\.').replace('[','\\[').replace(']','\\]').replace('(','\\(').replace(')','\\)').replace('+','\\+').replace('*','.*').replace('?','.')+'$')) for exclude_item_re in self._exclude_list_re : exclude_list_re.append(re.compile(exclude_item_re)) for infopath in self.file_provider().walk() : #print "[%s]" % (pathinfos,) (path,subpaths,files) = infopath if path == self._rootpath : name = path else : name = self.file_provider().split(path)[1] dirInfo = DirInfo( name=self.file_provider().get_clean_name(name), statInfo=self.file_provider().stat(path), tree=self ) pathinfos[path] = dirInfo for file in files : exclude = False for exclude_item_re in exclude_list_re : if exclude_item_re.match(file) : exclude = True if not(exclude) : completepath = self.file_provider().join(path,file) try : fileInfo = FileInfo( name=self.file_provider().get_clean_name(file), statInfo=self.file_provider().stat(completepath), tree=self, parent=dirInfo ) dirInfo.insertChild(fileInfo) except : pass for subpath in subpaths : exclude = False for exclude_item_re in exclude_list_re : if exclude_item_re.match(subpath) : exclude = True if not(exclude) : completepath = self.file_provider().join(path,subpath) if completepath in pathinfos : # print "[%s] : %d v (%s)" % (subpath,pathinfos[completepath].totalArea(),completepath) dirInfo.insertChild(pathinfos[completepath]) # print "[%s] : %d ^ (%s)" % (subpath,pathinfos[completepath].totalArea(),completepath) del pathinfos[completepath] dirInfo.finalizeLocal() if path == self._rootpath : self._root = dirInfo # print "[%s]" % (pathinfos,) return self._root def test(): f = FileTree(rootpath='c:\\home\\gissehel').scan() print "(%d,%d)" % (f.totalArea(),f.area()) print "(%d)" % (f.totalSubDirs(),) print "(%d)" % (f.totalItems(),) if __name__ == '__main__' : test() PK!F5  dirstat/FileProviderLocal.py#!/usr/bin/env python import os import walker from FileProviderBase import StatInfoBase from FileProviderBase import FileProviderBase class FileProviderLocal(FileProviderBase) : """The local FileProvider. It use the os package to do its dirty job, so it may be quite portable.""" supports_unicode_filenames = os.path.supports_unicode_filenames def __init__(self,url) : self._url = url self._walker = None if hasattr(os,'walk') : self._walker = os.walk else : self._walker = walker.walker def walk(self) : return self._walker(self._url,False) def split(self,path) : return os.path.split(path) def join(self,*args) : return os.path.join(*args) def abspath(self,path) : return os.path.abspath(path) def stat(self,file) : class StatInfo(StatInfoBase) : def __init__(self,file) : self._lstat = os.lstat(file) def st_dev(self) : return self._lstat.st_dev def st_mode(self) : return self._lstat.st_mode def st_nlink(self) : return self._lstat.st_nlink def st_mtime(self) : return self._lstat.st_mtime def st_size(self) : return self._lstat.st_size def st_blocks(self) : return getattr(self._lstat,'st_blocks',int(self._lstat.st_size/512L)) def st_dev(self) : return self._lstat.st_dev def is_dir(self) : return os.path.stat.S_ISDIR ( self._lstat.st_mode ) def is_reg(self) : return os.path.stat.S_ISREG ( self._lstat.st_mode ) def is_lnk(self) : return os.path.stat.S_ISLNK ( self._lstat.st_mode ) def is_blk(self) : return os.path.stat.S_ISBLK ( self._lstat.st_mode ) def is_chr(self) : return os.path.stat.S_ISCHR ( self._lstat.st_mode ) def is_fifo(self) : return os.path.stat.S_ISFIFO ( self._lstat.st_mode ) def is_sock(self) : return os.path.stat.S_ISSOCK ( self._lstat.st_mode ) return StatInfo(file) PKb5IHHdirstat/Configuration.py#!/usr/bin/env python # -*- coding : iso-8859-1 -*- import os import sys CONFIGURATION_NAME = '.pydirstat.ini' schema = { 'width' : { 'default' : '810', 'type' : int, 'minialias' : 'w', 'doc' : { 'en' : "Width of the graphic", 'fr' : "Largeur du graphique en pixel", }, 'sortidx' : 0, 'needvalue' : True, 'cmdlinename' : 'WIDTH', }, 'height' : { 'default' : '540', 'type' : int, 'minialias' : 'h', 'doc' : { 'en' : "Height of the graphic", 'fr' : "Hauteur du graphique en pixel", }, 'sortidx' : 1, 'needvalue' : True, 'cmdlinename' : 'HEIGHT', }, 'basename' : { 'default' : 'dirstat', 'type' : str, 'minialias' : 'b', 'doc' : { 'en' : "Basename of the final file", 'fr' : "Base du nom du fichier final", }, 'sortidx' : 10, 'needvalue' : True, 'cmdlinename' : 'BASENAME', }, 'outputfile' : { 'default' : '', 'type' : str, 'minialias' : 'f', 'nosave' : True, 'doc' : { 'en' : "Final filename", 'fr' : "Nom du fichier final", }, 'sortidx' : 100, 'needvalue' : True, 'cmdlinename' : 'FILE', }, 'path' : { 'default' : '', 'type' : str, 'minialias' : 'p', 'nosave' : True, 'doc' : { 'en' : "The path to analyse", 'fr' : "Le dossier a analyser", }, 'sortidx' : 100, 'needvalue' : True, 'cmdlinename' : 'PATH', }, 'help' : { 'default' : 0, 'type' : bool, 'minialias' : 'H', 'nosave' : True, 'doc' : { 'en' : "Show help", 'fr' : "Affiche l'aide", }, 'sortidx' : 999, 'needvalue' : False, 'cmdlinename' : 'HELP', }, 'version' : { 'default' : 0, 'type' : bool, 'minialias' : 'v', 'nosave' : True, 'doc' : { 'en' : "Show version", 'fr' : "Affiche le numero de version", }, 'sortidx' : 999, 'needvalue' : False, 'cmdlinename' : 'VERSION', }, 'config' : { 'default' : 0, 'type' : bool, 'minialias' : 'c', 'nosave' : True, 'doc' : { 'en' : "Start configuration mode", 'fr' : "Lance le mode configuration", }, 'sortidx' : 200, 'needvalue' : False, 'cmdlinename' : 'CFG', }, 'dumper' : { 'default' : 'HTML', 'type' : str, 'minialias' : 'd', 'nosave' : False, 'doc' : { 'en' : "Dumper used", 'fr' : "Generateur a utiliser", }, 'sortidx' : 50, 'needvalue' : True, 'cmdlinename' : 'DUMPER', }, 'pluginpath' : { 'default' : '', 'type' : str, 'minialias' : 'P', 'nosave' : False, 'doc' : { 'en' : "Path to plugins", 'fr' : "Chemin des plugins", }, 'sortidx' : 100, 'needvalue' : True, 'cmdlinename' : 'PPATH', }, 'area' : { 'default' : 'int:size', 'type' : str, 'minialias' : '', 'nosave' : False, 'doc' : { 'en' : "Data prodiver for tiles area", 'fr' : "Fournisseur de donnee pour l'aire des rectangles", }, 'sortidx' : 200, 'needvalue' : True, 'cmdlinename' : 'DATAPROV', }, 'color' : { 'default' : 'type', 'type' : str, 'minialias' : '', 'nosave' : False, 'doc' : { 'en' : "Data prodiver for tiles color", 'fr' : "Fournisseur de donnee pour la couleur des rectangles", }, 'sortidx' : 200, 'needvalue' : True, 'cmdlinename' : 'DATAPROV', }, 'exclude-list' : { 'default' : '', 'type' : str, 'minialias' : 'e', 'nosave' : False, 'doc' : { 'en' : "List of patterns to exclude when searching files", 'fr' : "Liste de motifs a exclure dans les noms de fichiers", }, 'sortidx' : 110, 'needvalue' : True, 'cmdlinename' : 'LIST', }, 'exclude-list-re' : { 'default' : '', 'type' : str, 'minialias' : '', 'nosave' : False, 'doc' : { 'en' : "Like exclude-list but use regexp", 'fr' : "Fonctionne comme exclude-list mais avec des regexp", }, 'sortidx' : 111, 'needvalue' : True, 'cmdlinename' : 'LIST', }, 'exclude-list-sep' : { 'default' : ',', 'type' : str, 'minialias' : '', 'nosave' : False, 'doc' : { 'en' : "Char to separate exclude-list items", 'fr' : "Caractere de sepration pour les items de exclude-list", }, 'sortidx' : 120, 'needvalue' : True, 'cmdlinename' : 'CHAR', }, } othersections = { 'type:extension' : { "~" : 'tmp', "bak" : 'tmp', "svn-base" : 'tmp', "svn-work" : 'tmp', "c" : 'dev', "cpp" : 'dev', "cc" : 'dev', "h" : 'dev', "hpp" : 'dev', "el" : 'dev', "y" : 'dev', "l" : 'dev', "py" : 'dev', "pl" : 'dev', "sh" : 'dev', "o" : 'compiled', "lo" : 'compiled', "Po" : 'compiled', "al" : 'compiled', "moc.cpp" : 'compiled', "moc.cc" : 'compiled', "elc" : 'compiled', "la" : 'compiled', "a" : 'compiled', "rpm" : 'compiled', "pyc" : 'compiled', }, 'type:extensionlower' : { "tar.bz2" : 'compress' , "tar.gz" : 'compress' , "tgz" : 'compress' , "bz2" : 'compress' , "bz" : 'compress' , "gz" : 'compress' , "html" : 'document' , "htm" : 'document' , "txt" : 'document' , "doc" : 'document' , "png" : 'image' , "jpg" : 'image' , "jpeg" : 'image' , "gif" : 'image' , "tif" : 'image' , "tiff" : 'image' , "bmp" : 'image' , "xpm" : 'image' , "tga" : 'image' , "svg" : 'image' , "wav" : 'sound' , "mp3" : 'sound' , "avi" : 'movie' , "mov" : 'movie' , "mpg" : 'movie' , "mpeg" : 'movie' , "wmv" : 'movie' , "asf" : 'movie' , "ogm" : 'movie' , "mkv" : 'movie' , "pdf" : 'document' , "ps" : 'image' , "exe" : 'exec', "com" : 'exec', "dll" : 'lib', "zip" : 'compress', "rar" : 'compress', "arj" : 'compress', "iso" : 'compress', "bpk" : 'dev', "tds" : 'compiled', "obj" : 'compiled', "bpl" : 'lib', }, 'type:contain' : { ".so." : 'lib', }, 'type:exactmatch' : { "core" : 'tmp', "entries" : 'tmp', }, 'color' : { 'tmp' : 'orange', 'dev' : 'slateblue', 'document' : 'blue', 'compiled' : 'darkblue', 'compress' : 'green', 'image' : 'darkred', 'sound' : 'yellow', 'movie' : '#a0ff00', 'lib' : '#ffa0a0', 'exec' : 'magenta', 'file' : 'lightblue', 'dir' : 'white', '_' : 'purple', }, 'gradient:lava' : { '0' : '#ffff00', '0.06' : '#ffee00', '0.13' : '#ffdd00', '0.20' : '#ffcc00', '0.26' : '#ffbb00', '0.33' : '#ffaa00', '0.40' : '#ff9900', '0.46' : '#ff8800', '0.53' : '#ff7700', '0.60' : '#ff6600', '0.66' : '#ff5500', '0.73' : '#ff4400', '0.80' : '#ff3300', '0.86' : '#ff2200', '0.93' : '#ff1100', '1.00' : '#ff0000', }, 'gradient:dunkerque' : { '0' : '#ffffff', '0.06' : '#eeeeee', '0.13' : '#dddddd', '0.20' : '#cccccc', '0.26' : '#bbbbbb', '0.33' : '#aaaaaa', '0.40' : '#999999', '0.46' : '#888888', '0.53' : '#777777', '0.60' : '#666666', '0.66' : '#555555', '0.73' : '#444444', '0.80' : '#333333', '0.86' : '#222222', '0.93' : '#111111', '1.00' : '#000000', }, 'gradient:picardia' : { '0.00' : '#ffffff', '0.11' : '#eee3f4', '0.22' : '#ddc7e9', '0.33' : '#ccaadd', '0.44' : '#bb8ed2', '0.55' : '#aa72c7', '0.66' : '#9955bb', '0.77' : '#8839b0', '0.88' : '#771da5', '1.00' : '#660099', }, } class _Configuration (object) : """This class Handle configuration. It can serialize from/to a file. CommandLine can change this class content.""" def __init__(self,load=True) : """Constructor""" self._schema = schema self._strvalues = {} self._values = {} self._othersections = {} self._filename = None if load : self.load() def get_filename(self,filename=None) : """Acces to the filename of the configuration file.""" if filename == None : home = os.path.expanduser('~') if not os.path.isdir(home) : # Now, we're not on unix-like environnement, nor under Win NT/2k/XP, look like Win9x !!!! paths_to_test = [] if 'HOME' in os.environ : paths_to_test.append(os.environ['HOME']) if len(sys.argv) >= 1 : exe_path = os.path.split(sys.argv[0])[0] if exe_path == '' : exe_path = '.' paths_to_test.append(exe_path) # We're desperate, we didn't find neither somathing looking like a "home" so we try to save config files in tmp dir !!! if 'TEMP' in os.environ : paths_to_test.append(os.environ['TEMP']) # We're desperate, we didn't find neither somathing looking like a "home" so we try to save config files in tmp dir !!! if 'TMP' in os.environ : paths_to_test.append(os.environ['TMP']) # As an ultimate try, we'll store this in C:\ !!! At least Win 95 have it (yes, that's Win 95 who is bothering me !) paths_to_test.append("C:\\") for path in paths_to_test : if os.path.isdir(path) : home = path break filename = os.path.join(home,CONFIGURATION_NAME) elif self._filename != None : filename = self._filename return filename def _get_value_from_strvalue(self,key,strvalue) : """Convert string to the native format of the value.""" keytype = self._schema[key].get('type',str) functable = { bool : lambda x:str(x).lower() not in ('0','','False') } if keytype in functable : return functable[keytype](strvalue) return keytype(strvalue) def _get_strvalue_from_value(self,key,value) : """Convert the native format of the value to string.""" keytype = self._schema[key].get('type',str) if keytype in functable : return functable[keytype](value) return "%s" % (value,) def load(self,filename=None) : """Load configuration from file.""" filename = self.get_filename(filename) if os.path.isfile(filename) : self._filename = filename handle = open(filename,'rt') mode = '' for line in handle : line = line.replace('\r','').replace('\n','') if len(line)>0 and line[0] == '[' : mode = '' if len(line)>1 and line[-1:] == ']' : mode = line[1:-1] elif '=' in line : (key,strvalue) = line.split('=',1) if mode == 'options' : if key in self._schema : self._strvalues[key] = strvalue self._values[key] = self._get_value_from_strvalue(key,strvalue) else : if mode not in self._othersections : self._othersections[mode] = {} self._othersections[mode][key] = strvalue for section in othersections : if section not in self._othersections : self._othersections[section] = {} for key in othersections[section] : self._othersections[section][key] = othersections[section][key] def save(self,filename=None) : """Save configuration to file.""" filename = self.get_filename(filename) handle = open(filename,'wt') self._filename = filename handle.write("[options]\n") for key in self._schema : if ('nosave' not in self._schema[key]) or not(self._schema[key]['nosave']) : if key in self._strvalues : handle.write("%s=%s\n" % (key,self._strvalues[key])) else : handle.write("%s=%s\n" % (key,self._schema[key].get('default',''))) sections = self.get_sections() sections.sort() if len(sections)>0 : for section in sections : handle.write("\n") handle.write("[%s]\n" % (section,)) section_content = self.get_section(section) section_content_keys = section_content.keys() section_content_keys.sort() for key in section_content_keys : handle.write("%s=%s\n" % (key,section_content[key])) handle.write("\n") handle.close() def show(self) : """Show configuration (debug).""" for key in self._schema : if key in self._strvalues : print "%s=%s" % (key,self._values[key]) else : print "%s=%s" % (key,self._schema[key].get('default','')) def get_value(self,key) : """Get value for a key in native format.""" if key in self._schema : if key in self._values : return self._values[key] else : self._strvalues[key] = self._schema[key].get('default','') self._values[key] = self._get_value_from_strvalue(key,self._strvalues[key]) return self._values[key] else : return None def get_strvalue(self,key) : """Get value for a key as string.""" if key in self._schema : if key in self._strvalues : return self._strvalues[key] else : self._strvalues[key] = self._schema[key].get('default','') self._values[key] = self._get_value_from_strvalue(key,self._strvalues[key]) return self._strvalues[key] else : return None def set_value(self,key,value) : """Set value in native format for a key.""" if key in self._schema : strvalue = self._get_strvalue_from_value(key,value) self._strvalues[key] = strvalue self._values[key] = value def set_strvalue(self,key,strvalue) : """Set value as string for a key.""" if key in self._schema : value = self._get_value_from_strvalue(key,strvalue) self._strvalues[key] = strvalue self._values[key] = value def __len__(self) : """The number of the keys.""" return len(self._schema) def __contains__(self,key) : return key in self._schema def __iter__(self) : """foreach key in configuration.""" keys = self._schema.keys() keys.sort(lambda x,y:cmp(self._schema[x]['sortidx'],self._schema[y]['sortidx']) or cmp(x,y)) return iter(keys) def get_doc(self,key,lang='en') : """Return the short help (one used in --help).""" if key in self._schema : return self._schema[key].get('doc',{}).get(lang,'') return '' def need_configure(self,key) : """Return true is the key need to be in the configuration file.""" need = True if ('nosave' in self._schema[key]) and self._schema[key]['nosave'] : need = False return need def get_sections(self) : """Return the spectial section (colors for example).""" return self._othersections.keys() def get_section(self,section) : """Return the content of a spectial section.""" if section in self._othersections : return self._othersections[section] return None def set_othersection_item(self,section,key,value) : """Set the content of a key from a spectial section.""" if section not in self._othersections : self._othersections[section] = {} self._othersections[section][key] = value class Configuration (object) : """Borg of _Configuration""" _borg_element = _Configuration() def __getattribute__(self,name) : return object.__getattribute__(self,'_borg_element').__getattribute__(name) def __iter__(self) : return object.__getattribute__(self,'_borg_element').__getattribute__('__iter__')() def test() : c=Configuration() c.load() c.show() d=Configuration() d.set_value('width',c.get_value('width')+10) c.save() c.show() if __name__ == '__main__' : test() PK?4J))dirstat/TreemapTile.py#!/usr/bin/env python from FileInfoList import FileInfoList from SimuQT import fmtsize from SimuQT import Size, Point, Rect from SizeColorProvider import sizeColorProvider class TreemapTile( object ) : """This class is the one the fill the TreemapView. It is directly inspired from KTreemapTile (from KDirStat). This class represent a rectangle of a view and work with the dumper/drawer to draw a leaf of the tree.""" def __init__( self, parentView, parentTile, fileinfo, rect, orientation = 'Auto' ) : """Constructor""" self._rect = Rect(rect=rect) # parentView is a TreemapView self._parentView = parentView self._parentTile = parentTile self._fileinfo = fileinfo self._init() self._parentView.addTileToDraw(self) self.createChildren( rect, orientation ) def rect(self) : return self._rect def fileinfo(self) : return self._fileinfo def parentView(self) : return self._parentView def parentTile(self) : return self._parentTile def createChildren( self, rect, orientation ) : """This method create the tile, and if needed the sub tiles.""" if self._fileinfo.totalArea() == 0 : return None self.createSquarifiedChildren( rect ) def createSquarifiedChildren( self, rect ) : """This method create the tile, and if needed the sub tiles using the squarification algo from KDirStat.""" if self._fileinfo.totalArea() == 0 : return scale = (1.0*rect.width()) * (1.0*rect.height()) / (1.0*self._fileinfo.totalArea()) minSize = int( self._parentView.minTileSize() / scale ) fileInfoList = FileInfoList( self._fileinfo, minSize=minSize, bySize=True, param='AsSubDir' ) fileInfoListIterator = iter(fileInfoList) childrenRect = Rect(rect=rect) fileInfoListIterator.next_nofail() while fileInfoListIterator.isValid() : #fileInfoListIterator.next_nofail() row = self.squarify( childrenRect, scale, fileInfoListIterator ) # print " %s" % map(lambda x:x.name(),row._list) childrenRect = self.layoutRow( childrenRect, scale, row ) def squarify( self, rect, scale, it ) : row = [] fileInfo = it.current() # if fileInfo : # print "** [%s]" % (fileInfo.name(),) length = max( rect.width(), rect.height() ) if length == 0 : fileInfo = it.next_nofail() # if fileInfo : # print "*- [%s]" % (fileInfo.name(),) return row improvingAspectRatio = True lastWorstAspectRatio = -1.0 sum = 0 # This is a bit ugly, but doing all calculations in the 'size' dimension # is more efficient here since that requires only one scaling before # doing all other calculations in the loop. scaledLengthSquare = length * (1.0*length) / scale while fileInfo and improvingAspectRatio : sum += fileInfo.totalArea() if (len(row)!=0) and (sum != 0) and (fileInfo.totalArea() != 0) : sumSquare = sum * sum worstAspectRatio = max( scaledLengthSquare * row[0].totalArea() / sumSquare, sumSquare / ( scaledLengthSquare * fileInfo.totalArea() ) ) if (lastWorstAspectRatio >= 0.0) and (worstAspectRatio > lastWorstAspectRatio) : improvingAspectRatio = False lastWorstAspectRatio = worstAspectRatio if improvingAspectRatio : row.append( fileInfo ) fileInfo = it.next_nofail() # if fileInfo : # print "*+ [%s]" % (fileInfo.name(),) return row def layoutRow( self, rect, scale, row ): # [TODO] if len(row) == 0 : return rect if rect.width() > rect.height() : dir = 'Horizontal' else : dir = 'Vertical' primary = max( rect.width(), rect.height() ) sum = 0 for fileInfo in row : sum += fileInfo.totalArea() secondary = int( sum * (1.0*scale) / primary ) if sum == 0 : # Prevent division by zero. return rect if secondary < self._parentView.minTileSize() : # We don't want tiles that small. return rect offset = 0 remaining = primary for fileInfo in row : childSize = int( (1.0*fileInfo.totalArea()) / (1.0* sum) * primary + 0.5 ) if childSize > remaining : # Prevent overflow because of accumulated rounding errors childSize = remaining remaining -= childSize if childSize >= self._parentView.minTileSize() : if dir == 'Horizontal' : childRect = Rect( Point(rect.x()+offset, rect.y()), Size(childSize, secondary) ) else : childRect = Rect( Point(rect.x(), rect.y()+offset), Size(secondary, childSize) ) tile = TreemapTile( self._parentView, self, fileInfo, childRect, orientation='Auto' ) # What should I do with the tile ? offset += childSize if ( dir == 'Horizontal' ) : newRect = Rect( Point(rect.x(), rect.y()+secondary), Size(rect.width(), rect.height()-secondary) ) else : newRect = Rect( Point(rect.x()+secondary, rect.y()), Size(rect.width()-secondary, rect.height()) ) return newRect def drawShape( self, painter ): """Draw the tile in a painter/dumper.""" size = self.rect().size() if size.height() < 1 or size.width() < 1 : return def iconv(name) : result = "" for letter in name : if ord(letter) < 255 : result += chr(ord(letter)) else : result += "." return result painter.addrect( x=self.rect().x(), y=self.rect().y(), width=self.rect().width(), height=self.rect().height(), color=self.tileColor(), filename=self._fileinfo.url(), filenamestr=iconv(self._fileinfo.url()), filesize=fmtsize(self._fileinfo.totalArea()) ) def tileColor(self) : return sizeColorProvider.get_color(self._fileinfo) def _init( self ): # [TODO] : find if I need to use Z order # setZ( _parentTile ? ( _parentTile->z() + 1.0 ) : 0.0 ); # setBrush( QColor( 0x60, 0x60, 0x60 ) ); # setPen( NoPen ); pass if __name__ == '__main__' : pass PKb5[*dirstat/__version__.py__version__ = "0.9.15" PK?4_dfs1s1dirstat/SimuQT.py#!/usr/bin/env python """This module simulate QT class that TreemapView needs""" class BiXY( object ) : """Point and Size store quite the same content. This is the mother class for any class that store X and Y""" def __init__( self, x=0, y=0 ) : self._affect(x,y) def x(self, x=None) : if x != None : self._x = x return self._x def y(self, y=None) : if y != None : self._y = y return self._y def zero(self) : self._affect() def _affect(self, x=0, y=0) : self.x(x) self.y(y) def _copyfrom(self, fromobj) : self._affect(fromobj.x(),fromobj.y()) def __str__(self): return "%s(%dx%d)" % (type(self).__name__,self.x(),self.y()) def __add__(self,bi): return type(self)(self.x()+bi.x(),self.y()+bi.y()) class Point( BiXY ) : """Simulate a QPoint""" pass class Size( BiXY ) : """Simulate a QSize""" pass Size.width = Size.x Size.height = Size.y class Rect( Point ) : """Simulate a QRect""" def __init__( self, point=None, size=None, rect=None ) : if not(rect) : if not(point) : point=Point() if not(size) : size=Size() else : if not(point) : point=rect.point() if not(size) : size=rect.size() self._copyfrom(point) self._size = Size() self._size._copyfrom(size) self.width = self._size.width self.height = self._size.height def point(self): return Point(self.x(),self.y()) def size(self): return Size(self.width(),self.height()) def __str__(self): return "%s(%dx%d+%d+%d)" % (type(self).__name__,self.width(),self.height(),self.x(),self.y()) def __add__(self,bi): return type(self)(point=self.point()+bi,size=self.size()) class Color( object ): """Simulate a QColor, and store color conversions. Color names can be used. They are official SVG colors. They can be used even in non-SVG dumper.""" COLORCONV = { 'aliceblue' : (240, 248, 255) , 'antiquewhite' : (250, 235, 215) , 'aqua' : ( 0, 255, 255) , 'aquamarine' : (127, 255, 212) , 'azure' : (240, 255, 255) , 'beige' : (245, 245, 220) , 'bisque' : (255, 228, 196) , 'black' : ( 0, 0, 0) , 'blanchedalmond' : (255, 235, 205) , 'blue' : ( 0, 0, 255) , 'blueviolet' : (138, 43, 226) , 'brown' : (165, 42, 42) , 'burlywood' : (222, 184, 135) , 'cadetblue' : ( 95, 158, 160) , 'chartreuse' : (127, 255, 0) , 'chocolate' : (210, 105, 30) , 'coral' : (255, 127, 80) , 'cornflowerblue' : (100, 149, 237) , 'cornsilk' : (255, 248, 220) , 'crimson' : (220, 20, 60) , 'cyan' : ( 0, 255, 255) , 'darkblue' : ( 0, 0, 139) , 'darkcyan' : ( 0, 139, 139) , 'darkgoldenrod' : (184, 134, 11) , 'darkgray' : (169, 169, 169) , 'darkgreen' : ( 0, 100, 0) , 'darkgrey' : (169, 169, 169) , 'darkkhaki' : (189, 183, 107) , 'darkmagenta' : (139, 0, 139) , 'darkolivegreen' : ( 85, 107, 47) , 'darkorange' : (255, 140, 0) , 'darkorchid' : (153, 50, 204) , 'darkred' : (139, 0, 0) , 'darksalmon' : (233, 150, 122) , 'darkseagreen' : (143, 188, 143) , 'darkslateblue' : ( 72, 61, 139) , 'darkslategray' : ( 47, 79, 79) , 'darkslategrey' : ( 47, 79, 79) , 'darkturquoise' : ( 0, 206, 209) , 'darkviolet' : (148, 0, 211) , 'deeppink' : (255, 20, 147) , 'deepskyblue' : ( 0, 191, 255) , 'dimgray' : (105, 105, 105) , 'dimgrey' : (105, 105, 105) , 'dodgerblue' : ( 30, 144, 255) , 'firebrick' : (178, 34, 34) , 'floralwhite' : (255, 250, 240) , 'forestgreen' : ( 34, 139, 34) , 'fuchsia' : (255, 0, 255) , 'gainsboro' : (220, 220, 220) , 'ghostwhite' : (248, 248, 255) , 'gold' : (255, 215, 0) , 'goldenrod' : (218, 165, 32) , 'gray' : (128, 128, 128) , 'grey' : (128, 128, 128) , 'green' : ( 0, 128, 0) , 'greenyellow' : (173, 255, 47) , 'honeydew' : (240, 255, 240) , 'hotpink' : (255, 105, 180) , 'indianred' : (205, 92, 92) , 'indigo' : ( 75, 0, 130) , 'ivory' : (255, 255, 240) , 'khaki' : (240, 230, 140) , 'lavender' : (230, 230, 250) , 'lavenderblush' : (255, 240, 245) , 'lawngreen' : (124, 252, 0) , 'lemonchiffon' : (255, 250, 205) , 'lightblue' : (173, 216, 230) , 'lightcoral' : (240, 128, 128) , 'lightcyan' : (224, 255, 255) , 'lightgoldenrodyellow' : (250, 250, 210), 'lightgray' : (211, 211, 211) , 'lightgreen' : (144, 238, 144) , 'lightgrey' : (211, 211, 211) , 'lightpink' : (255, 182, 193) , 'lightsalmon' : (255, 160, 122) , 'lightseagreen' : ( 32, 178, 170) , 'lightskyblue' : (135, 206, 250) , 'lightslategray' : (119, 136, 153) , 'lightslategrey' : (119, 136, 153) , 'lightsteelblue' : (176, 196, 222) , 'lightyellow' : (255, 255, 224) , 'lime' : ( 0, 255, 0) , 'limegreen' : ( 50, 205, 50) , 'linen' : (250, 240, 230) , 'magenta' : (255, 0, 255) , 'maroon' : (128, 0, 0) , 'mediumaquamarine' : (102, 205, 170) , 'mediumblue' : ( 0, 0, 205) , 'mediumorchid' : (186, 85, 211) , 'mediumpurple' : (147, 112, 219) , 'mediumseagreen' : ( 60, 179, 113) , 'mediumslateblue' : (123, 104, 238) , 'mediumspringgreen' : ( 0, 250, 154) , 'mediumturquoise' : ( 72, 209, 204) , 'mediumvioletred' : (199, 21, 133) , 'midnightblue' : ( 25, 25, 112) , 'mintcream' : (245, 255, 250) , 'mistyrose' : (255, 228, 225) , 'moccasin' : (255, 228, 181) , 'navajowhite' : (255, 222, 173) , 'navy' : ( 0, 0, 128) , 'oldlace' : (253, 245, 230) , 'olive' : (128, 128, 0) , 'olivedrab' : (107, 142, 35) , 'orange' : (255, 165, 0) , 'orangered' : (255, 69, 0) , 'orchid' : (218, 112, 214) , 'palegoldenrod' : (238, 232, 170) , 'palegreen' : (152, 251, 152) , 'paleturquoise' : (175, 238, 238) , 'palevioletred' : (219, 112, 147) , 'papayawhip' : (255, 239, 213) , 'peachpuff' : (255, 218, 185) , 'peru' : (205, 133, 63) , 'pink' : (255, 192, 203) , 'plum' : (221, 160, 221) , 'powderblue' : (176, 224, 230) , 'purple' : (128, 0, 128) , 'red' : (255, 0, 0) , 'rosybrown' : (188, 143, 143) , 'royalblue' : ( 65, 105, 225) , 'saddlebrown' : (139, 69, 19) , 'salmon' : (250, 128, 114) , 'sandybrown' : (244, 164, 96) , 'seagreen' : ( 46, 139, 87) , 'seashell' : (255, 245, 238) , 'sienna' : (160, 82, 45) , 'silver' : (192, 192, 192) , 'skyblue' : (135, 206, 235) , 'slateblue' : (106, 90, 205) , 'slategray' : (112, 128, 144) , 'slategrey' : (112, 128, 144) , 'snow' : (255, 250, 250) , 'springgreen' : ( 0, 255, 127) , 'steelblue' : ( 70, 130, 180) , 'tan' : (210, 180, 140) , 'teal' : ( 0, 128, 128) , 'thistle' : (216, 191, 216) , 'tomato' : (255, 99, 71) , 'turquoise' : ( 64, 224, 208) , 'violet' : (238, 130, 238) , 'wheat' : (245, 222, 179) , 'white' : (255, 255, 255) , 'whitesmoke' : (245, 245, 245) , 'yellow' : (255, 255, 0) , 'yellowgreen' : (154, 205, 50) , } def __init__( self, arg=None, g=None, b=None ): if b!=None : (self._r, self._g, self._b) = (arg, g, b) self._colorname = None else : self._colorname = arg colors = self.COLORCONV.get(arg,None) if colors : (self._r, self._g, self._b) = colors else : colok_ok = False HEXDIGITS = '0123456789abcdef' if (self._colorname[0] == '#') and (len(self._colorname) in (4,7)) : listcolor = [] for hexdigit in self._colorname[1:].lower() : if hexdigit in HEXDIGITS : listcolor.append(HEXDIGITS.index(hexdigit)) if len(listcolor) == 3 : (self._r, self._g, self._b) = (listcolor[0]*0x11,listcolor[1]*0x11,listcolor[2]*0x11) colok_ok = True if len(listcolor) == 6 : (self._r, self._g, self._b) = (listcolor[0]*0x10+listcolor[1],listcolor[2]*0x10+listcolor[3],listcolor[4]*0x10+listcolor[5]) colok_ok = True if not(colok_ok) : (self._r, self._g, self._b) = (0x33, 0x33, 0x33) def get_svgcolor( self ): if self._colorname : return self._colorname return self.get_htmlcolor() def get_htmlcolor( self ): return '#%02x%02x%02x' % ( self._r, self._g, self._b ) def get_htmlcolor_extended( self, func ): return '#%02x%02x%02x' % ( func(self._r), func(self._g), func(self._b) ) def get_rgb( self ): return ( self._r, self._g, self._b ) def __str__( self ): return self.get_htmlcolor() def __repr__( self ): return "Color(0x%02x,0x%02x,0x%02x)" % (self._r, self._g, self._b) class Canvas( object ): """Simulate a QCanvas.""" def __init__( self ) : self._size = Size() def size( self ) : return self._size def resize( self, width, height ) : self._size = Size(width, height) def fmtsize(size) : """Format a number with space every 3 digits.""" size = "%d" % (size,) newsize = "" while len(size) > 0 : if newsize != "" : newsize = " " + newsize newsize = size[-3:] + newsize size = size[:-3] return newsize def test(): r = Point(7,4) s = Size(100,600) print "r : %s" % (r,) print "s : %s" % (s,) print "r+s : %s" % (r+s,) t = Rect(point=r,size=s) print "t : %s" % (t,) print "t+r : %s" % (t+r,) print "t+t : %s" % (t+t,) print "t+s : %s" % (t+s,) print Color('cyan') if __name__ == '__main__' : test() PK:4eBBdirstat/SizeColorProvider.py#!/usr/bin/env python from Configuration import Configuration from SimuQT import Color import time class SizeColorProvider( object ) : def __init__(self) : self._configuration = Configuration() self._data_provider = { 'int:size' : self.get_integer_size, 'int:blocks' : self.get_integer_blocks, 'int:mtime' : self.get_integer_mtime, 'int:mtimefromnow' : self.get_integer_mtimefromnow, 'int:one' : self.get_integer_one, 'int:onefile' : self.get_integer_onefile, 'type' : self.get_color_type, } self.get_color = self.get_color_type self.get_area = self.get_integer_size def reinitFileTree(self) : area_data_provider = self._configuration.get_value('area') color_data_provider = self._configuration.get_value('color') self._now = time.time() if color_data_provider[0:len('int:')]=='int:' : # gradient color_data_provider_list = color_data_provider.split(':',2) if len(color_data_provider_list) == 2 : color_data_provider_list.append('lava') data_provider = color_data_provider_list[0]+':'+color_data_provider_list[1] self._gradient_name = color_data_provider_list[2] gradient = self._configuration.get_section('gradient:'+self._gradient_name) self._gradient = map(lambda x:(float(x[0]),Color(x[1])),gradient.items()) self._gradient.sort(lambda x,y:cmp(x[0],y[0])) self._max_gradient = None self._min_gradient = None self.updateFileInfo = self.updateFileInfo_gradient self.get_color = self.get_color_gradient if data_provider in self._data_provider : self.get_gradient = self._data_provider[data_provider] else : self.get_gradient = self.get_integer_size elif color_data_provider in self._data_provider : self.get_gradient = self._data_provider[color_data_provider] else : self.get_gradient = get_color_type if area_data_provider[0:len('int:')]=='int:' : if area_data_provider in self._data_provider : self.get_area = self._data_provider[area_data_provider] def updateFileInfo_gradient(self,fileinfo) : if not(fileinfo.isDir()) : gradient = self.get_gradient(fileinfo) if self._max_gradient==None or gradient>self._max_gradient : self._max_gradient = gradient if self._min_gradient==None or gradientmode() & S_IXUSR ) == S_IXUSR ) return Qt::magenta; # if ??*isexec*?? : return colormatch.get('exec',defaultColor) else : return colormatch.get('dir',defaultColor) return colormatch.get('file',defaultColor) def get_color_gradient(self,fileinfo) : color = self._gradient[0][1] value = 1.0*(self.get_gradient(fileinfo)-self._min_gradient)/(self._max_gradient-self._min_gradient) for pair in self._gradient : if value < pair[0] : return color else : color = pair[1] return color def get_integer_size(self,fileinfo) : return fileinfo.size() def get_integer_blocks(self,fileinfo) : return fileinfo.blocks() def get_integer_mtime(self,fileinfo) : return int(fileinfo.mtime()) def get_integer_mtimefromnow(self,fileinfo) : if fileinfo.isDir() : return 0 return int(self._now-fileinfo.mtime()) def get_integer_one(self,fileinfo) : return 1 def get_integer_onefile(self,fileinfo) : if fileinfo.isDir() : return 0 return 1 def get_color(self,fileinfo) : """This method should not be called because get_color is overridden by another method""" def get_area(self,fileinfo) : """This method should not be called because get_area is overridden by another method""" def updateFileInfo(self,fileinfo) : """This method may or may not be called""" pass sizeColorProvider = SizeColorProvider() if __name__ == '__main__' : pass PK!F5/dirstat/FileProviderBase.py#!/usr/bin/env python import posixpath class StatInfoBase(object) : def __init__(self,url) : self._url = url def st_dev(self) : return 0 def st_mode(self) : return 0 def st_nlink(self) : return 0 def st_mtime(self) : return 0 def st_size(self) : return 0 def st_blocks(self) : return 0 def st_dev(self) : return 0 def is_dir(self) : return False def is_reg(self) : return False def is_lnk(self) : return False def is_blk(self) : return False def is_chr(self) : return False def is_fifo(self) : return False def is_sock(self) : return False class FileProviderBase(object) : """The base of all classes of FileProvider. This class does quite nothing. It's purpose is to provide basic default implementation for a FileProvider. posixpath (/ style path) is used even on windows (\\ style path). It can't walk.""" supports_unicode_filenames = False def __init__(self,url) : self._url = url def walk(self) : return [] def split(self,path) : return posixpath.split(path) def join(self,*args) : return posixpath.join(*args) def abspath(self,path) : return path def stat(self,url) : return StatInfoBase(file) def get_clean_name(self,file) : return file PKrY4Ekkdirstat/walker.py#!/usr/bin/python import os class walker( object ): def __init__(self,path,order=False) : self._path = path def __iter__(self) : self._result = [] self._tmpresult = {} os.path.walk(self._path,walker.callback,self) self._index = len(self._result) return self def next(self) : if self._index > 0: self._index-=1 # print self._result[self._index] return self._result[self._index] raise StopIteration def callback(self, path, files) : dirs = [] fileonlys = [] for file in files : if os.path.isdir(os.path.join(path,file)) : dirs.append(file) else : fileonlys.append(file) self._tmpresult[path] = (path,dirs,fileonlys) self._result.append((path,dirs,fileonlys)) PKB4V..dirstat/CommandLine.py#!/usr/bin/env python # -*- coding : iso-8859-1 -*- from Configuration import Configuration from Configuration import schema import os from __version__ import __version__ schema_default = ['path','width','height','outputfile'] class ParseError(Exception) : pass class CommandLine(object) : """This is the command line engine. It doesn't use parseopt because I feel like parseopt is too simple. Command line options should not be separated from configuration file options.""" ACTION_NONE = 0 ACTION_DUMP = 1 ACTION_USAGE = 2 ACTION_CONFIG = 3 ACTION_VERSION = 4 def __init__(self,commandline) : """Constructor. Take a command line list.""" self._commandline = commandline def parse(self) : """Parse the command line given to constructor.""" configuration = Configuration() minialiases = {} aliases = {} for key in schema : if 'minialias' in schema[key] : for letter in schema[key]['minialias'] : minialiases[letter] = key aliases[key] = key rest = [] remaining_args_to_parse = [] next_arg_is_value = False next_arg_key = None no_name_offset = 0 for arg in self._commandline[1:] : if len(remaining_args_to_parse) > 0 : configuration.set_strvalue(remaining_args_to_parse[0],arg) remaining_args_to_parse = remaining_args_to_parse[1:] elif arg[:2] == '--' : if '=' in arg : (key,value) = arg[2:].split('=',1) else : (key,value) = (arg[2:],'') if key in aliases : if schema[aliases[key]]['needvalue'] : configuration.set_strvalue(aliases[key],value) else : configuration.set_strvalue(aliases[key],1) else : # error raise ParseError('parameter %s does not exist' % (key,)) elif arg[:1] == '-' : for letter in arg[1:] : if letter in minialiases : key = minialiases[letter] if schema[key]['needvalue'] : remaining_args_to_parse.append(key) else : configuration.set_strvalue(key,'1') else : # error raise ParseError('miniparameter %s does not exist' % (letter,)) else : if no_name_offset 0 : raise ParseError('need value for parameter %s' % (remaining_args_to_parse[0],)) if configuration.get_value('help') != 0 : return self.ACTION_USAGE if configuration.get_value('version') != 0 : return self.ACTION_VERSION if configuration.get_value('config') != 0 : return self.ACTION_CONFIG return self.ACTION_DUMP def get_usage(self) : """Return a usage string created from configuration.""" configuration = Configuration() usage = '%s [OPTION]...' % (os.path.basename(self._commandline[0]),) for key in schema_default : if key in schema : if 'cmdlinename' in schema[key] : usage += ' [%s]' % (schema[key]['cmdlinename'] ,) else : # strange error pass else : # strange error pass usage += '\n' usage += 'Get informations about a directory.\n' usage += '\n' usage += 'Options may be :\n' for key in configuration : if ('minialias' in schema[key]) and (schema[key]['minialias']!='') : minialiasstring = '-%s,' % schema[key]['minialias'] else : minialiasstring = ' ' if schema[key]['needvalue'] : partline = ' %s --%s=%s' % (minialiasstring,key,schema[key]['cmdlinename']) else : partline = ' %s --%s' % (minialiasstring,key,) partline += ' '*(30-len(partline)) partline += '%s\n' % (schema[key]['doc']['en'],) usage += partline str # usage += '\n' return usage def get_version_text(self) : """Return a version string.""" output = '%s %s\n' % (os.path.basename(self._commandline[0]),__version__) return output def test() : cl = CommandLine(['poide','KUUU','-fhw','88888','45','1','7']) cl.parse() print cl.get_usage() configuration = Configuration() configuration.show() if __name__ == '__main__' : test() PK?4bK- - dirstat/FileInfoList.py#!/usr/bin/env python class FileInfoList( object ) : """This class store a list of FileInfo and provide iterators that sort the list as requested.""" def __init__( self, fileInfo, param=None, bySize=False, minSize=None ) : self._fileInfo = fileInfo self._param = param self._bySize = bySize self._minSize = minSize def __iter__(self) : """Iterate on the FileInfo children, ordering them by size or not.""" class FileInfoListIterator( object ): def next(self) : fileInfo = self.next_nofail() if fileInfo : return fileInfo else : raise StopIteration() class FileInfoListIteratorSort( FileInfoListIterator ): def __init__(self, fileInfo, fileInfoList) : self._fileInfoList = fileInfoList currentFileInfo = fileInfo self._fileInfoListSorted = [] while currentFileInfo : if not(self._fileInfoList._minSize) or currentFileInfo.totalArea() >= self._fileInfoList._minSize : self._fileInfoListSorted.append(currentFileInfo) currentFileInfo = currentFileInfo.next() self._sort() self._index = -1 def isValid(self) : return (self._index < len(self._fileInfoListSorted)) and (self._index >= 0) def current(self) : if self.isValid() : return self._fileInfoListSorted[self._index] else : return None def next_nofail(self) : self._index += 1 return self.current() def next(self) : fileInfo = self.next_nofail() if fileInfo : return fileInfo else : raise StopIteration() class FileInfoListIteratorDefault( FileInfoListIterator ): def __init__(self, fileInfo, fileInfoList) : self._fileInfo = fileInfo self._fileInfoList = fileInfoList def isValid(self) : if self._fileInfo : return True return False def current(self) : return self._fileInfo def next_nofail(self) : if self.isValid() : fileInfo = self._fileInfo self._fileInfo = fileInfo.next() while self._fileInfo and self._fileInfoList._minSize and self._fileInfo.totalArea() < self._fileInfoList._minSize : self._fileInfo = fileInfo.next() return fileInfo else : return None iteratorclass = FileInfoListIteratorDefault if self._bySize : class FileInfoListIteratorBySize( FileInfoListIteratorSort ): def _sort(self) : self._fileInfoListSorted.sort(lambda x,y:-cmp(x.totalArea(),y.totalArea())) iteratorclass = FileInfoListIteratorBySize return iteratorclass(self._fileInfo.firstChild(),self) def test(): pass if __name__ == '__main__' : test() PKab5iv  dirstat/TreemapView.pyc; <^&Ec@s]dZdZdklZlZlZdklZdefdYZe djondS(ii(sPointsRectsCanvas(s TreemapTiles TreemapViewcBs}tZdZdZdZdZdZdZdZdZ dZ e d Z d Z d Zd ZRS( sThis class is the main class of pydirstat that make the drawing. It is directly inspired from KTreemapView (from KDirStat). This class build the tree of files and work with the dumper/drawer to draw the tree.cCs~||_t|_t|_t|_g|_||_ |i |o |i o&|i o|i |i qzndS(s ConstructorN( streesselfs_treesNones _rootTiles _selectedTiles_selectionRects _tilestodraws initialSizes _initialSizes readConfigsrootsrebuildTreemap(sselfstrees initialSize((s,build\bdist.win32\egg\dirstat\TreemapView.pys__init__ s        cCs |iSdS(N(sselfs _selectedTile(sself((s,build\bdist.win32\egg\dirstat\TreemapView.pys selectedTilescCs |iSdS(N(sselfs _rootTile(sself((s,build\bdist.win32\egg\dirstat\TreemapView.pysrootTilescCs |iSdS(N(sselfs_tree(sself((s,build\bdist.win32\egg\dirstat\TreemapView.pystree scCs |iSdS(N(sselfs _minTileSize(sself((s,build\bdist.win32\egg\dirstat\TreemapView.pys minTileSize!scCs t|_dS(N(sDefaultMinTileSizesselfs _minTileSize(sself((s,build\bdist.win32\egg\dirstat\TreemapView.pys readConfig#scCs tSdS(s!Return a new simulated Qt Canvas.N(sCanvas(sself((s,build\bdist.win32\egg\dirstat\TreemapView.pyscanvas'scCs=t}x,|ii|D]}|o|SqqWtSdS(smFind the tile at a certain position. Anyway, need to implement Canvas.collisions first. Not used. DO NOT USE.N(sNonestilesselfscanvass collisionssposs canvasitem(sselfsposstiles canvasitem((s,build\bdist.win32\egg\dirstat\TreemapView.pystileAt+s c Cs| o|i}nt|_t|_t|_|ii|i |i |i t jo|i t joB|o7t |t|tdtddd|d|_qndS(sBuild/Rebuild the tree.spointissizesAutoN(snewSizesselfs visibleSizesNones _selectedTiles_selectionRects _rootTilescanvassresizeswidthsheights UpdateMinSizesnewRoots TreemapTilesRectsPoint(sselfsnewRootsnewSize((s,build\bdist.win32\egg\dirstat\TreemapView.pysrebuildTreemap5s   "&cCs |iSdS(sAccess to the size of the treeN(sselfs _initialSize(sself((s,build\bdist.win32\egg\dirstat\TreemapView.pys visibleSizeIscCs%x|iD]}|i|q WdS(s"Draw the tree in a painter/dumper.N(sselfs _tilestodrawstiles drawShapespainter(sselfspainterstile((s,build\bdist.win32\egg\dirstat\TreemapView.pysdrawMs cCs|ii|dS(s!Add a new TreemapTile to the ViewN(sselfs _tilestodrawsappendstile(sselfstile((s,build\bdist.win32\egg\dirstat\TreemapView.pys addTileToDrawRs(s__name__s __module__s__doc__s__init__s selectedTilesrootTilestrees minTileSizes readConfigscanvasstileAtsNonesrebuildTreemaps visibleSizesdraws addTileToDraw(((s,build\bdist.win32\egg\dirstat\TreemapView.pys TreemapView s           s__main__N( sDefaultMinTileSizes UpdateMinSizesSimuQTsPointsRectsCanvass TreemapTilesobjects TreemapViews__name__(sCanvass TreemapViewsPoints UpdateMinSizes TreemapTilesDefaultMinTileSizesRect((s,build\bdist.win32\egg\dirstat\TreemapView.pys?s  M PKab5Vndirstat/FileProvider.pyc; i&Ec@sdklZeZdS((sFileProviderLocalN(sFileProviderLocals FileProvider(s FileProvidersFileProviderLocal((s-build\bdist.win32\egg\dirstat\FileProvider.pys?s PKab5^--dirstat/DirInfo.pyc; Dc@sUdklZdklZdefdYZdZedjo endS((sFileInfo(s FileInfoListsDirInfocBs4tZdZeeeeedZdZdZdZdZ dZ dZ dZ d Z d Zd Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#RS( s.This class override the FileInfo for directorycCsti|||||t|_t|_ d|_ t |_ t |_ |i|_|i|_|i|_d|_d|_d|_|i|_t|_t|_t |_|ot|_t |_ d|_n t|_dS(Nis.(sFileInfos__init__sselfstreesparentsnamesstatInfosFalses _isDotEntrys _isMountPoints_pendingReadJobssNones _firstChilds _dotEntrys_sizes _totalSizes_areas _totalAreas_blockss _totalBlockss _totalItemss _totalSubDirss _totalFiless_mtimes _latestMtimes _summaryDirtys_beingDestroyeds _readStates asDotEntrysTrues_name(sselfstreesparentsnamesstatInfos asDotEntry((s(build\bdist.win32\egg\dirstat\DirInfo.pys__init__s*                  cCs#|io|in|iSdS(sAReturn the total size of the special data used for area of tiles.N(sselfs _summaryDirtysrecalcs _totalSize(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pys totalSize+s cCs#|io|in|iSdS(sAReturn the total area of the special data used for area of tiles.N(sselfs _summaryDirtysrecalcs _totalArea(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pys totalArea1s cCs#|io|in|iSdS(s(Return the total dir size used by block.N(sselfs _summaryDirtysrecalcs _totalBlocks(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pys totalBlocks7s cCs#|io|in|iSdS(s,Return the number of items in the directory.N(sselfs _summaryDirtysrecalcs _totalItems(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pys totalItems=s cCs#|io|in|iSdS(s6Return the number of sub directories in the directory.N(sselfs _summaryDirtysrecalcs _totalSubDirs(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pys totalSubDirsCs cCs#|io|in|iSdS(s2Return the number of normal file in the directory.N(sselfs _summaryDirtysrecalcs _totalFiles(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pys totalFilesIs cCs#|io|in|iSdS(s1Return the latest modified file in the directory.N(sselfs _summaryDirtysrecalcs _latestMtime(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pys latestMtimeOs cCs |iSdS(N(sselfs _isMountPoint(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pys isMountPointVscCs ||_dS(N(s isMountPointsselfs _isMountPoint(sselfs isMountPoint((s(build\bdist.win32\egg\dirstat\DirInfo.pys setMountPointWscCs|i SdS(N(sselfsisBusy(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pys isFinishedZscCsm|idjo |idjotSn|idjp|idjo|idjn|iSdS(NisAbortedsReadingsQueued(sselfs_pendingReadJobss _readStatesTrues readStatesFalse(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pysisBusy]s  &cCs |iSdS(N(sselfs_pendingReadJobs(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pyspendingReadJobsdscCs |iSdS(N(sselfs _firstChild(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pys firstChildfscCs ||_dS(N(s firstChildsselfs _firstChild(sselfs firstChild((s(build\bdist.win32\egg\dirstat\DirInfo.pys setFirstChildgscCsr|ip|itjp|io7|i|i||_|i||i |n|ii |dS(s$Insert a new child in the directory.N( snewChildsisDirsselfs _dotEntrysNones _isDotEntryssetNexts _firstChilds setParents childAddeds insertChild(sselfsnewChild((s(build\bdist.win32\egg\dirstat\DirInfo.pys insertChildis'  cCs |iSdS(N(sselfs _dotEntry(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pysdotEntryscCs ||_dS(N(sdotEntrysselfs _dotEntry(sselfsdotEntry((s(build\bdist.win32\egg\dirstat\DirInfo.pys setDotEntryscCs |iSdS(N(sselfs _isDotEntry(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pys isDotEntryscCs|i o|i|i7_|i|i7_|i|i7_|i d7_ |i o|i d7_ n|i o|i d7_ n|i|ijo|i|_qn|io|ii|ndS(s!Called when a new child is added.iN(sselfs _summaryDirtys _totalSizesnewChilds totalSizes _totalAreas totalAreas _totalBlockss totalBlockss _totalItemssisDirs _totalSubDirssisFiles _totalFilessmtimes _latestMtimes_parents childAdded(sselfsnewChild((s(build\bdist.win32\egg\dirstat\DirInfo.pys childAddeds    cCs|i|jotSn||ijo|i|_dSnt}xF|o>|i|jo|i|idSn|i}qNWdS(s"Remove a child from the directory.N( s deletedChildsparentsselfsNones _firstChildsnexts firstChildschildssetNext(sselfs deletedChildschild((s(build\bdist.win32\egg\dirstat\DirInfo.pys unlinkChilds cCsZt|_|io|ii|n|i o|i|jo|i|ndS(s"Remove a child from the directory.N( sTruesselfs _summaryDirtys_parents deletingChilds deletedChilds_beingDestroyedsparents unlinkChild(sselfs deletedChild((s(build\bdist.win32\egg\dirstat\DirInfo.pys deletingChilds   cCs.|id7_|io|iindS(Ni(sselfs_pendingReadJobss_parents readJobAdded(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pys readJobAddeds cCs.|id8_|io|iindS(Ni(sselfs_pendingReadJobss_parentsreadJobFinished(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pysreadJobFinisheds cCs(d|_|io|iindS(NsAborted(sselfs _readStates_parentsreadJobAborted(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pysreadJobAborteds  cCs|idS(N(sselfscleanupDotEntries(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pys finalizeLocalscCs0|io|io|iiSn|iSdS(N(sselfs _isDotEntrys_parents readStates _readState(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pys readStatescCs2|idjo tdjodSnt|_dS(NsAbortedsFinished(sselfs _readStates newReadState(sselfs readState((s(build\bdist.win32\egg\dirstat\DirInfo.pys setReadStatescCstSdS(N(sTrue(sself((s(build\bdist.win32\egg\dirstat\DirInfo.pys isDirInfoscCs]|i|_|i|_|i|_d|_d|_d|_ |i |_ xt |dD]}|i|i7_|i|i7_|i|i7_|i|id7_|i|i7_|i |i7_ |io|id7_n|io|i d7_ n|i}||i jo ||_ q[q[Wt|_dS(surecalc data for the directory. Used as a cache to calculate only once information if nothing changed since last call.isAsSubDiriN(sselfs_sizes _totalSizes_areas _totalAreas_blockss _totalBlockss _totalItemss _totalSubDirss _totalFiless_mtimes _latestMtimes FileInfoListsfileInfos totalSizes totalAreas totalBlockss totalItemss totalSubDirss totalFilessisDirsisFiles latestMtimeschildLatestMtimesFalses _summaryDirty(sselfschildLatestMtimesfileInfo((s(build\bdist.win32\egg\dirstat\DirInfo.pysrecalcs0          cCs|i p|iodSn|i oT|ii}||_|iidx)|o|i||i}qSWn|ii o t |_ndS(Ni( sselfs _dotEntrys _isDotEntrys _firstChilds firstChildschilds setFirstChilds setParentsnextsNone(sselfschild((s(build\bdist.win32\egg\dirstat\DirInfo.pyscleanupDotEntriess   ($s__name__s __module__s__doc__sNonesFalses__init__s totalSizes totalAreas totalBlockss totalItemss totalSubDirss totalFiless latestMtimes isMountPoints setMountPoints isFinishedsisBusyspendingReadJobss firstChilds setFirstChilds insertChildsdotEntrys setDotEntrys isDotEntrys childAddeds unlinkChilds deletingChilds readJobAddedsreadJobFinishedsreadJobAborteds finalizeLocals readStates setReadStates isDirInfosrecalcscleanupDotEntries(((s(build\bdist.win32\egg\dirstat\DirInfo.pysDirInfos@ #                             cCsdS(N((((s(build\bdist.win32\egg\dirstat\DirInfo.pystestss__main__N(sFileInfos FileInfoListsDirInfostests__name__(stestsFileInfos FileInfoListsDirInfo((s(build\bdist.win32\egg\dirstat\DirInfo.pys?s    PKab5--dirstat/FileInfo.pyc; <^&Ec@sNdklZdZdefdYZdZedjo endS((ssizeColorProviderlsFileInfocBstZdZeeeedZdZdZdZdZdZ dZ dZ d Z d Z d Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"d Z#d!Z$d"Z%d#Z&d$Z'd%Z(d&Z)d'Z*d(Z+d)Z,d*Z-d+Z.d,Z/d-Z0d.Z1d/Z2d0Z3d1Z4d2Z5d3Z6RS(4seThis class sotre informations about a file. Directories are stored in a child of this class : DirInfocCs(|pd|_t|_d|_d|_d|_d|_d|_ d|_ d|_ ||_ t|_||_||_|o|ii|_|ii|_|ii|_|ii|_ |i o(|ii|_|ii|_ qnti|ti||_ dS(Nsi(snamesselfs_namesTrues _isLocalFiles_devices_modes_linkss_sizes_blockss_mtimes_areasparents_parentsNones_nextstrees_treesstatInfos _statInfosst_devsst_modesst_nlinksst_mtimes isSpecialsst_sizes st_blocksssizeColorProvidersupdateFileInfosget_area(sselfstreesparentsnamesstatInfo((s)build\bdist.win32\egg\dirstat\FileInfo.pys__init__ s.              cCs |iSdS(N(sselfs _isLocalFile(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys isLocalFile.scCs |iSdS(N(sselfs_name(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pysname/scCsY|ioD|ii}|io|Sn|iii||iSn|iSdS(s;Return url of the file (currently only support local files)N( sselfs_parentsurls parentUrls isDotEntrys_trees file_providersjoins_name(sselfs parentUrl((s)build\bdist.win32\egg\dirstat\FileInfo.pysurl1s   cCs`|i}||jodSn|}x(||jo|d8}|i}q*W|iSdS(Nsi(sselfs treeLevelslevels targetLevelsitemsparentsname(sselfs targetLevelsitemslevel((s)build\bdist.win32\egg\dirstat\FileInfo.pysurlPart;s    cCs |iSdS(N(sselfs_device(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pysdeviceGscCs |iSdS(N(sselfs_mode(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pysmodeHscCs |iSdS(N(sselfs_links(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pyslinksIscCs |iSdS(N(sselfs_size(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pyssizeJscCs |iSdS(N(sselfs_area(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pysareaKscCs |iSdS(N(sselfs_blocks(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pysblocksLscCsdSdS(Ni((sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys blockSizeMscCs |iSdS(N(sselfs_mtime(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pysmtimeNscCs |iSdS(N(sselfs_size(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys totalSizeOscCs |iSdS(N(sselfs_area(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys totalAreaPscCs |iSdS(N(sselfs_blocks(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys totalBlocksQscCsdSdS(Ni((sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys totalItemsRscCsdSdS(Ni((sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys totalSubDirsSscCsdSdS(Ni((sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys totalFilesTscCs |iSdS(N(sselfs_mtime(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys latestMtimeUscCstSdS(N(sFalse(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys isMountPointVscCsdS(N((sselfs isMountPoint((s)build\bdist.win32\egg\dirstat\FileInfo.pys setMountPointWscCstSdS(N(sTrue(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys isFinishedXscCstSdS(N(sFalse(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pysisBusyYscCsdSdS(Ni((sself((s)build\bdist.win32\egg\dirstat\FileInfo.pyspendingReadJobsZscCs |iSdS(N(sselfs_tree(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pystree\scCs |iSdS(N(sselfs_parent(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pysparent]scCs ||_dS(N(sparentsselfs_parent(sselfsparent((s)build\bdist.win32\egg\dirstat\FileInfo.pys setParent^scCs |iSdS(N(sselfs_next(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pysnext_scCs ||_dS(N(snextsselfs_next(sselfsnext((s)build\bdist.win32\egg\dirstat\FileInfo.pyssetNext`scCstSdS(N(sNone(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys firstChildbscCsdS(N((sselfs firstChild((s)build\bdist.win32\egg\dirstat\FileInfo.pys setFirstChildcscCs|ip |iSdS(N(sselfs firstChildsdotEntry(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys hasChildrenhscCs>|}x-|o%||jotSn|i}q WtSdS(N(sselfsancestorssubtreesTruesparentsFalse(sselfssubtreesancestor((s)build\bdist.win32\egg\dirstat\FileInfo.pys isInSubtreeks cCsdS(N((sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys insertChildsscCstSdS(N(sNone(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pysdotEntrytscCsdS(N((sselfsdotEntry((s)build\bdist.win32\egg\dirstat\FileInfo.pys setDotEntryuscCstSdS(N(sFalse(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys isDotEntryvscCs<d}|i}x"|o|d7}|i}qW|SdS(Nii(slevelsselfs_parentsparent(sselfsparentslevel((s)build\bdist.win32\egg\dirstat\FileInfo.pys treeLevelws  cCsdS(N((sselfsnewChild((s)build\bdist.win32\egg\dirstat\FileInfo.pys childAddedscCsdS(N((sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys unlinkChildscCsdS(N((sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys deletingChildscCsdSdS(NsFinished((sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys readStatescCstSdS(N(sFalse(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys isDirInfoscCs|iiSdS(N(sselfs _statInfosis_dir(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pysisDirscCs|iiSdS(N(sselfs _statInfosis_reg(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pysisFilescCs|iiSdS(N(sselfs _statInfosis_lnk(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys isSymLinkscCs!|iip |iiSdS(N(sselfs _statInfosis_blksis_chr(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pysisDevicescCs|iiSdS(N(sselfs _statInfosis_blk(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys isBlockDevicescCs|iiSdS(N(sselfs _statInfosis_chr(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys isCharDevicescCsA|iip-|iip|iip |iiSdS(N(sselfs _statInfosis_blksis_chrsis_fifosis_sock(sself((s)build\bdist.win32\egg\dirstat\FileInfo.pys isSpecials(7s__name__s __module__s__doc__sNones__init__s isLocalFilesnamesurlsurlPartsdevicesmodeslinksssizesareasblockss blockSizesmtimes totalSizes totalAreas totalBlockss totalItemss totalSubDirss totalFiless latestMtimes isMountPoints setMountPoints isFinishedsisBusyspendingReadJobsstreesparents setParentsnextssetNexts firstChilds setFirstChilds hasChildrens isInSubtrees insertChildsdotEntrys setDotEntrys isDotEntrys treeLevels childAddeds unlinkChilds deletingChilds readStates isDirInfosisDirsisFiles isSymLinksisDevices isBlockDevices isCharDevices isSpecial(((s)build\bdist.win32\egg\dirstat\FileInfo.pysFileInfosh %                                               cCsdS(N((((s)build\bdist.win32\egg\dirstat\FileInfo.pystestss__main__N(sSizeColorProviderssizeColorProviders FileSizeMaxsobjectsFileInfostests__name__(stestssizeColorProvidersFileInfos FileSizeMax((s)build\bdist.win32\egg\dirstat\FileInfo.pys?s   PKab5Udirstat/Dumper.pyc; oJEc@sdkZdkZdkZdklZdklZdklZdklZdklZl Z dkl Z de fdYZ dS( N(sFileTree(s Configuration(s TreemapView(s __version__(sSizesColor(sfmtsizes FileDumpercBsktZdZdZeZeedZedZdZ dZ dZ dZ dZ d ZRS( sThis is the mother class of all dumpers. A dumper is a plugin that receive informations about a file and how to draw it. It usually dump a file, but you can do whatever you want with it.s.dumpc Cs!t|_|iiddjo|iid}n|o!t|djo|ddjo|dd!d}n|tjo d}nt|}|iid }t d t d |iid i |}t d t d |iid i |}|i||i||i|i|_||_|}|tjo|iid}n|djotii|io/tii|i|iid|i}q tii |id}|d|iid|i}n||_t|_dS(Nspathsiis"is\s.sexclude-list-sepcCst|djS(Ni(slensx(sx((s'build\bdist.win32\egg\dirstat\Dumper.pys%scCs |idS(Ns (sxsstrip(sx((s'build\bdist.win32\egg\dirstat\Dumper.pys%ss exclude-listsexclude-list-res outputfilesbasenamei(s Configurationsselfs_configurations get_valuesrootpathslensNonesFileTreestreesexclude_list_sepsfiltersmapssplits exclude_listsexclude_list_resset_exclude_listsset_exclude_list_resscans _rootpaths_trees outputfilesfilenamesosspathsisdirsjoinsEXTsnames _filenames_size( sselfsrootpaths outputfiles exclude_listsexclude_list_resnamestreesfilenamesexclude_list_sep((s'build\bdist.win32\egg\dirstat\Dumper.pys__init__s4 +   33      /% cCs|tjo ||_n|itjo.t|iid|iid|_nt|i|i|_ |i i }|i ot |id|_n|i|i i||i|i o|iindS(ssThis method really start the dump. You should not override it. Override _start_dump, _end_dump or add_rect instead.swidthsheightswtN(sgsizesNonesselfs_sizesSizes_configurations get_values TreemapViews_trees _treemapviews visibleSizessizes NEEDHANDLEsfiles _filenames_files _start_dumpsdraws _end_dumpsclose(sselfsgsizessize((s'build\bdist.win32\egg\dirstat\Dumper.pysdump@s  .    cCsddfdtfd|iii|ifdt|iii i fdt i dt i fd|iifd tifgSd S( s5This method may be called by plugin to print metadatas Generators pydirstatsVersions Directorys Total SizesDates%Y-%m-%d %H:%M:%SsConfiguration FilesPython versionN(s __version__sselfs_trees file_providersabspaths _rootpathsfmtsizes _treemapviewsrootTilesfileinfos totalSizestimesstrftimes localtimes_configurations get_filenamessyssversion(sself((s'build\bdist.win32\egg\dirstat\Dumper.pys get_metadataSsc Csh}g} h}x|iiD]}|ido|ii|}x|D]}||}||joh||hdd?<de<dd@<d#e<dhd dA<d dB<<d dC<de<ddD<<dEhdd!<de<ddF<d#e<dhd dG<d dH<<d d&<de<ddI<<dJhddK<de<dd!<d#e<dhd dL<d dM<<d d<<de<ddN<<dOhdd<de<dd!<d#e<dhd dP<d dQ<<d d<<de<ddN<<dRhdd!<de<ddS<d#e<dhd dT<d dU<<d dV<de<ddW<<dXhdd!<de<dd!<d#e<dhd dY<d dZ<<d d[<de<ddW<<d\hdd]<de<dd!<d#e<dhd d^<d d_<<d d`<de<dda<sN( sselfs_schemaskeysgetsstrskeytypesbools functablesstrvalue(sselfskeysstrvalues functableskeytype((s.build\bdist.win32\egg\dirstat\Configuration.pys_get_value_from_strvalues  cCsG|i|idt}|tjot||Snd|fSdS(s1Convert the native format of the value to string.stypes%sN(sselfs_schemaskeysgetsstrskeytypes functablesvalue(sselfskeysvalueskeytype((s.build\bdist.win32\egg\dirstat\Configuration.pys_get_strvalue_from_values  cCs|i|}tii|oZ||_t|d}d}x9|D]-}|i ddi dd}t |djo|ddjo?d}t |djo|dd jo|dd!}qtqGd |jo|i d d\}}|d jo>||ijo*||i|<|i|||i|q>W|i }|i t|djox|D]x}|id|id |f|i|}|i}|i x)|D]!}|id|||fqRWqWn|id|id S( sSave configuration to file.swts [options] snosaves%s=%s sdefaultsis s[%s] N(sselfs get_filenamesfilenamesopenshandles _filenameswrites_schemaskeys _strvaluessgets get_sectionsssectionsssortslenssections get_sectionssection_contentskeysssection_content_keyssclose(sselfsfilenamessection_contentssection_content_keysshandlessectionsskeyssection((s.build\bdist.win32\egg\dirstat\Configuration.pyssaves4   '"2     ' cCsdx]|iD]R}||ijod||i|fGHq d||i|iddfGHq WdS(sShow configuration (debug).s%s=%ssdefaultsN(sselfs_schemaskeys _strvaluess_valuessget(sselfskey((s.build\bdist.win32\egg\dirstat\Configuration.pysshows  cCs||ijon||ijo|i|Sq|i|idd|i|<|i||i||i|<|i|SntSdS(s%Get value for a key in native format.sdefaultsN(skeysselfs_schemas_valuessgets _strvaluess_get_value_from_strvaluesNone(sselfskey((s.build\bdist.win32\egg\dirstat\Configuration.pys get_values  cCs||ijon||ijo|i|Sq|i|idd|i|<|i||i||i|<|i|SntSdS(sGet value for a key as string.sdefaultsN(skeysselfs_schemas _strvaluessgets_get_value_from_strvalues_valuessNone(sselfskey((s.build\bdist.win32\egg\dirstat\Configuration.pys get_strvalues  cCsD||ijo0|i||}||i|<||i|sN(sselfs_schemaskeysssortsiter(sselfskeys((sselfs.build\bdist.win32\egg\dirstat\Configuration.pys__iter__ssencCs?||ijo'|i|idhi|dSndSdS(s+Return the short help (one used in --help).sdocsN(skeysselfs_schemasgetslang(sselfskeyslang((s.build\bdist.win32\egg\dirstat\Configuration.pysget_docs'cCs>t}d|i|jo|i|do t}n|SdS(s<Return true is the key need to be in the configuration file.snosaveN(sTruesneedsselfs_schemaskeysFalse(sselfskeysneed((s.build\bdist.win32\egg\dirstat\Configuration.pysneed_configure s & cCs|iiSdS(s1Return the spectial section (colors for example).N(sselfs_othersectionsskeys(sself((s.build\bdist.win32\egg\dirstat\Configuration.pys get_sections'scCs'||ijo|i|SntSdS(s)Return the content of a spectial section.N(ssectionsselfs_othersectionssNone(sselfssection((s.build\bdist.win32\egg\dirstat\Configuration.pys get_section+scCs6||ijoh|i|d?d?d?f<d@d d0d f<dAd?d?d?f<dBdCdDdEf<dFd9d d9f<dGdHdEdIf<dJddKd f<dLdMdNdOf<dPd9d d f<dQdRdSdTf<dUdVdWdVf<dXdYdZd9f<d[dId\d\f<d]dId\d\f<d^d d_d`f<dadbd dcf<dddd5def<dfd dgdf<dhd+d+d+f<did+d+d+f<djd,dkdf<dldmdndnf<dodddf<dpdnd9dnf<dqdd df<drdddf<dsdddf<dtddd f<dudvddwf<dxdydydyf<dzdydydyf<d{d dyd f<d|d}ddIf<d~dddf<ddd+df<ddddf<ddd df<ddddf<ddddKf<ddddf<ddddf<dddd f<ddddf<dd}ddf<dddydyf<ddddf<dddd*f<ddcdcdcf<ddkddkf<ddcdcdcf<ddddf<ddd'dTf<ddwdmdf<dd#d_df<ddddMf<ddddMf<dddd!f<ddddf<dd dd f<ddNddNf<ddddf<ddd df<ddyd d f<ddddf<dd d df<dddHdcf<ddeddf<dd6ddf<ddddf<dd ddf<ddYd`dOf<ddddf<ddddf<ddddf<ddddf<ddddf<ddd!d}f<dd d dyf<ddddf<ddydyd f<ddEddf<dddd f<dddd f<ddvddf<ddddf<ddddf<ddddf<ddddef<ddddf<dddvdf<ddddf<ddddf<ddd'df<ddddf<ddyd dyf<ddd d f<ddWdVdVf<ddd+df<dd9ddf<dddydf<ddddf<ddd9df<ddddf<dd'ddf<ddddf<dd#d_df<ddddf<dddydkf<dddydkf<ddddf<dd dd f<ddddf<d d*ddKf<d d dydyf<d ddgdf<d dd df<ddddf<ddddf<ddd!df<ddddf<ddddf<dddd f<ddddNf&scCst|d|dS(Ni(scmpsxsy(sxsy((s2build\bdist.win32\egg\dirstat\SizeColorProvider.pys's(sselfs_configurations get_valuesarea_data_providerscolor_data_providerstimes_nowslenssplitscolor_data_provider_listsappends data_providers_gradient_names get_sectionsgradientsmapsitemss _gradientssortsNones _max_gradients _min_gradientsupdateFileInfo_gradientsupdateFileInfosget_color_gradients get_colors_data_providers get_gradientsget_integer_sizesget_color_typesget_area(sselfsarea_data_providersgradientscolor_data_provider_lists data_providerscolor_data_provider((s2build\bdist.win32\egg\dirstat\SizeColorProvider.pysreinitFileTrees2      cCs|i om|i|}|itjp ||ijo ||_n|itjp ||ijo ||_q{ndS(N(sfileinfosisDirsselfs get_gradientsgradients _max_gradientsNones _min_gradient(sselfsfileinfosgradient((s2build\bdist.win32\egg\dirstat\SizeColorProvider.pysupdateFileInfo_gradient=s    c Cs|iid}|iid} |iid} |iid}h} |iid} x"| D]}t | || || |}t|do|i|q | i|d qtd |fqWq|ttjoBt|}|tjo| i||qztd |fntd|f|d7}qWt|djotd|dfn| iddjo |iSn| iddjo |iSn| iddjo |iSn|iSdS(s,Parse the command line given to constructor.s minialiasiiis--s=ss needvaluesparameter %s does not exists-s1sminiparameter %s does not exists%parameter %s does not exist in schemasneed value for parameter %sshelpsversionsconfigN(s Configurations configurations minialiasessaliasessschemaskeyslettersrestsremaining_args_to_parsesFalsesnext_arg_is_valuesNones next_arg_keysno_name_offsetsselfs _commandlinesargslens set_strvaluessplitsvalues ParseErrorsappendsschema_defaults get_values ACTION_USAGEsACTION_VERSIONs ACTION_CONFIGs ACTION_DUMP( sselfslettersvaluesno_name_offsetsrestsremaining_args_to_parses next_arg_keyskeysargs configurations minialiasessnext_arg_is_valuesaliases((s,build\bdist.win32\egg\dirstat\CommandLine.pysparsesr            cCs}t}dtii|idf}xMtD]E}|t jo2dt |jo|dt |df7}quq0q0W|d7}|d7}|d7}|d7}x|D]}dt |jot |dd jod t |d}nd }t |d od ||t |df}nd||f}|ddt |7}|dt |ddf7}||7}tqW|SdS(s1Return a usage string created from configuration.s%s [OPTION]...is cmdlinenames [%s]s s$Get informations about a directory. sOptions may be : s minialiasss-%s,s s needvalues %s --%s=%ss %s --%ss is%s sdocsenN(s Configurations configurationsosspathsbasenamesselfs _commandlinesusagesschema_defaultskeysschemasminialiasstringspartlineslensstr(sselfspartlinesminialiasstringskeysusages configuration((s,build\bdist.win32\egg\dirstat\CommandLine.pys get_usagebs6       & cCs+dtii|idtf}|SdS(sReturn a version string.s%s %s iN(sosspathsbasenamesselfs _commandlines __version__soutput(sselfsoutput((s,build\bdist.win32\egg\dirstat\CommandLine.pysget_version_texts#( s__name__s __module__s__doc__s ACTION_NONEs ACTION_DUMPs ACTION_USAGEs ACTION_CONFIGsACTION_VERSIONs__init__sparses get_usagesget_version_text(((s,build\bdist.win32\egg\dirstat\CommandLine.pys CommandLines   H "cCsMtdddddddg}|i|iGHt}|idS(NspoidesKUUUs-fhws88888s45s1s7(s CommandLinesclsparses get_usages Configurations configurationsshow(s configurationscl((s,build\bdist.win32\egg\dirstat\CommandLine.pystests !   s__main__( s Configurationsschemasoss __version__sschema_defaults Exceptions ParseErrorsobjects CommandLinestests__name__(s __version__sschema_defaults CommandLines ParseErrorstests Configurationsossschema((s,build\bdist.win32\egg\dirstat\CommandLine.pys?s    {  PKab5+?dirstat/FileInfoList.pyc; Dc@s;defdYZdZedjo endS(s FileInfoListcBs)tZdZeeedZdZRS(sZThis class store a list of FileInfo and provide iterators that sort the list as requested.cCs(||_||_||_||_dS(N( sfileInfosselfs _fileInfosparams_paramsbySizes_bySizesminSizes_minSize(sselfsfileInfosparamsbySizesminSize((s-build\bdist.win32\egg\dirstat\FileInfoList.pys__init__s   cCsdtfdY}d|fdY}d|fdY}|}|io d|fdY}|}n||ii |Sd S( s?Iterate on the FileInfo children, ordering them by size or not.sFileInfoListIteratorcBstZdZRS(NcCs(|i}|o|Sn tdS(N(sselfs next_nofailsfileInfos StopIteration(sselfsfileInfo((s-build\bdist.win32\egg\dirstat\FileInfoList.pysnext s (s__name__s __module__snext(((s-build\bdist.win32\egg\dirstat\FileInfoList.pysFileInfoListIterator ssFileInfoListIteratorSortcBs5tZdZdZdZdZdZRS(NcCs||_|}g|_xS|oK|ii p|i|iijo|ii|n|i }qW|i d|_ dS(Ni( s fileInfoListsselfs _fileInfoListsfileInfoscurrentFileInfos_fileInfoListSorteds_minSizes totalAreasappendsnexts_sorts_index(sselfsfileInfos fileInfoListscurrentFileInfo((s-build\bdist.win32\egg\dirstat\FileInfoList.pys__init__s  ' cCs*|it|ijo |idjSdS(Ni(sselfs_indexslens_fileInfoListSorted(sself((s-build\bdist.win32\egg\dirstat\FileInfoList.pysisValidscCs'|io|i|iSntSdS(N(sselfsisValids_fileInfoListSorteds_indexsNone(sself((s-build\bdist.win32\egg\dirstat\FileInfoList.pyscurrent!s cCs|id7_|iSdS(Ni(sselfs_indexscurrent(sself((s-build\bdist.win32\egg\dirstat\FileInfoList.pys next_nofail&scCs(|i}|o|Sn tdS(N(sselfs next_nofailsfileInfos StopIteration(sselfsfileInfo((s-build\bdist.win32\egg\dirstat\FileInfoList.pysnext)s (s__name__s __module__s__init__sisValidscurrents next_nofailsnext(((s-build\bdist.win32\egg\dirstat\FileInfoList.pysFileInfoListIteratorSorts    sFileInfoListIteratorDefaultcBs,tZdZdZdZdZRS(NcCs||_||_dS(N(sfileInfosselfs _fileInfos fileInfoLists _fileInfoList(sselfsfileInfos fileInfoList((s-build\bdist.win32\egg\dirstat\FileInfoList.pys__init__1s cCs|iotSntSdS(N(sselfs _fileInfosTruesFalse(sself((s-build\bdist.win32\egg\dirstat\FileInfoList.pysisValid4s cCs |iSdS(N(sselfs _fileInfo(sself((s-build\bdist.win32\egg\dirstat\FileInfoList.pyscurrent8scCs|ioj|i}|i|_xG|io&|iio|ii|iijo|i|_q(W|SntSdS(N( sselfsisValids _fileInfosfileInfosnexts _fileInfoLists_minSizes totalAreasNone(sselfsfileInfo((s-build\bdist.win32\egg\dirstat\FileInfoList.pys next_nofail:s  3(s__name__s __module__s__init__sisValidscurrents next_nofail(((s-build\bdist.win32\egg\dirstat\FileInfoList.pysFileInfoListIteratorDefault0s   sFileInfoListIteratorBySizecBstZdZRS(NcCs|iiddS(NcCst|i|i S(N(scmpsxs totalAreasy(sxsy((s-build\bdist.win32\egg\dirstat\FileInfoList.pysIs(sselfs_fileInfoListSortedssort(sself((s-build\bdist.win32\egg\dirstat\FileInfoList.pys_sortHs(s__name__s __module__s_sort(((s-build\bdist.win32\egg\dirstat\FileInfoList.pysFileInfoListIteratorBySizeGsN( sobjectsFileInfoListIteratorsFileInfoListIteratorSortsFileInfoListIteratorDefaults iteratorclasssselfs_bySizesFileInfoListIteratorBySizes _fileInfos firstChild(sselfs iteratorclasssFileInfoListIteratorSortsFileInfoListIteratorDefaultsFileInfoListIteratorBySizesFileInfoListIterator((s-build\bdist.win32\egg\dirstat\FileInfoList.pys__iter__ s  (s__name__s __module__s__doc__sNonesFalses__init__s__iter__(((s-build\bdist.win32\egg\dirstat\FileInfoList.pys FileInfoLists cCsdS(N((((s-build\bdist.win32\egg\dirstat\FileInfoList.pystestOss__main__N(sobjects FileInfoListstests__name__(stests FileInfoList((s-build\bdist.win32\egg\dirstat\FileInfoList.pys?sL  PK Z42zdirstat/Dumpers/Ming.py#!/usr/bin/env python from dirstat.Dumper import FileDumper from ming import * class Dumper( FileDumper ) : EXT='.swf' NEEDHANDLE=False def getcolor(self, colorname): return colorname.get_rgb() def _start_dump(self) : size = self.get_size() self._movie = SWFMovie() self._movie.setDimension(self._size.x(),self._size.y()) self._movie.setBackground(0xcc,0xcc,0xcc) self._movie.setRate(12) def _end_dump(self) : self._movie.save(str(self._filename)) def addrect(self,**kwargs) : squareshape=SWFShape() squareshape.setLine(1,0,0,0) squareshape.setRightFill(squareshape.addFill(*self.getcolor(kwargs['color']))) squareshape.movePenTo(kwargs['x'],kwargs['y']) squareshape.drawLine(kwargs['width'],0) squareshape.drawLine(0,kwargs['height']) squareshape.drawLine(-kwargs['width'],0) squareshape.drawLine(0,-kwargs['height']) b = SWFButton() b.addShape(squareshape, SWFBUTTON_HIT | SWFBUTTON_UP | SWFBUTTON_DOWN | SWFBUTTON_OVER) filename = "" #filename = kwargs['filenamestr'].replace('\\','\\\\\\\\').replace('\'','\\\\\\\'') + " " + kwargs['filesize'] #filename = kwargs['filenamestr'].replace('\\','\\\\\\\\').replace('\'','\\\\\\\'') + " " + kwargs['filesize'] filename = kwargs['filenamestr'].replace('\\','\\\\\\\\').replace('\n','').replace('\'','\\\\\\\'') + " " + kwargs['filesize'] b.addAction(SWFAction("this.geturl('javascript:alert(\\'"+filename+" \\')');"), SWFBUTTON_MOUSEDOWN) i=self._movie.add(b) i.moveTo(0,0) def test(): Dumper().dump() if __name__ == '__main__' : test() PK Z4Šdirstat/Dumpers/SVG.py#!/usr/bin/env python from dirstat.Dumper import FileDumper class Dumper( FileDumper ) : EXT='.svg' def _start_dump(self) : header=''' \n''' size = self.get_size() self._file.write(header % {'sizex':size.x(),'sizey':size.y()}) def _end_dump(self) : footer=''' \n''' size = self.get_size() self._file.write(footer % {'sizex':size.x(),'sizey':size.y()}) def addrect(self,**kwargs) : kwargs['filename'] = kwargs['filename'].replace('\\','\\\\').replace('\'','\\\'').replace('&','&').encode('iso-8859-1','replace'); self._file.write(''' \n''' % kwargs) def test(): Dumper().dump() if __name__ == '__main__' : test() PK#I4dirstat/Dumpers/__init__.pyPK Z4`e&e&dirstat/Dumpers/HTML.py#!/usr/bin/env python from dirstat.Dumper import FileDumper HEADER=''' Repertoire
''' FOOTER_PART1=''' ''' FOOTER_PART2=''' ''' FOOTER_PART3=''' ''' class Dumper( FileDumper ) : EXT='.html' def _start_dump(self) : size = self.get_size() self.__dump_params = {'sizex':size.x(),'sizey':size.y(),'sizexmd':size.x()/2-20,'sizeymd':size.y()-20} header=HEADER self._file.write(header % self.__dump_params) def _end_dump(self) : footer=FOOTER_PART1 self._file.write(footer % self.__dump_params) params = {'Generator' : 'pydirstat','Version':'0.9.12'} for param in self.get_metadata() : self._file.write('

%s : %s

\n' % (param[0],param[1])) footer=FOOTER_PART2 self._file.write(footer % self.__dump_params) #-------------------------------------------------- # legend #-------------------------------------------------- types,colors,method_by_type = self.get_colors() border = 5 if self.__dump_params['sizey'] < border*2*len(types)*1.3 : border = 0 height=int( (self.__dump_params['sizey']-border*2.0*len(types))/len(types) ) ypos=border for typename in types : ypos kwargs = {} kwargs['innertext'] = (typename=='_') and 'Unknown' or typename kwargs['x'] = int(self.__dump_params['sizex']/2+5) kwargs['width'] = int(self.__dump_params['sizex']/2-10) kwargs['y'] = ypos kwargs['height'] = height-2*border kwargs['filename'] = '' kwargs['filesize'] = '' kwargs['color'] = colors[typename] filelisting = [] if typename in method_by_type : if 'type:extension' in method_by_type[typename] : for mask in method_by_type[typename]['type:extension'] : filelisting.append('*.'+mask) if 'type:extensionlower' in method_by_type[typename] : for mask in method_by_type[typename]['type:extensionlower'] : filelisting.append('*.'+mask) if 'type:contain' in method_by_type[typename] : for mask in method_by_type[typename]['type:contain'] : filelisting.append('*'+mask+'*') if 'type:exactmatch' in method_by_type[typename] : for mask in method_by_type[typename]['type:exactmatch'] : filelisting.append(mask) filelisting.sort() kwargs['filename'] = ", ".join(filelisting) if typename=='file' : if len(filelisting) > 0 : kwargs['filename'] += ' and ' kwargs['filename'] += 'any other file' if typename=='dir' : if len(filelisting) > 0 : kwargs['filename'] += ' and ' kwargs['filename'] += 'any directory' self.addrect(**kwargs) ypos += height #-------------------------------------------------- # legend (end) #-------------------------------------------------- footer=FOOTER_PART3 self._file.write(footer % self.__dump_params) def addrect(self,**kwargs) : filename = kwargs['filename'].replace('\\','\\\\').replace('\'',''').replace('\"','"').replace('&','&') if type(filename) != type(u'') : try : filename = filename.decode('utf8','replace') except LookupError : pass filename = filename.encode('iso-8859-1','replace'); kwargs['filename'] = filename kwargs['colorx'] = kwargs['color'].get_htmlcolor_extended(lambda x:int(x*0.6)) color = kwargs['color'].get_rgb() if color[0]+color[1]+color[2] > 3*128 : kwargs['colort'] = kwargs['color'].__class__(0,0,0) else : kwargs['colort'] = kwargs['color'].__class__(255,255,255) if 'innertext' not in kwargs : kwargs['innertext'] = '' self._file.write('''%(innertext)s\n''' % kwargs) def test(): Dumper().dump() if __name__ == '__main__' : test() PKab5P2 dirstat/Dumpers/Ming.pyc; dkDc@sOdklZdkTdefdYZdZedjo endS((s FileDumper(s*sDumpercBs8tZdZeZdZdZdZdZRS(Ns.swfcCs|iSdS(N(s colornamesget_rgb(sselfs colorname((s-build\bdist.win32\egg\dirstat\Dumpers\Ming.pysgetcolor scCsg|i}t|_|ii|ii|ii|ii ddd|ii ddS(Nii ( sselfsget_sizessizesSWFMovies_movies setDimensions_sizesxsys setBackgroundssetRate(sselfssize((s-build\bdist.win32\egg\dirstat\Dumpers\Ming.pys _start_dump s   %cCs|iit|idS(N(sselfs_moviessavesstrs _filename(sself((s-build\bdist.win32\egg\dirstat\Dumpers\Ming.pys _end_dumpscKsUt}|idddd|i|i|i|d|i|d|d|i |dd|i d|d|i |d d|i d|d t }|i |t tBtBtBd}|d id d id did dd|d}|itd|dt|ii|}|idddS(Niiscolorsxsyswidthsheightss filenamestrs\s\\\\s s's\\\'s sfilesizes this.geturl('javascript:alert(\'s \')');(sSWFShapes squareshapessetLines setRightFillsaddFillsselfsgetcolorskwargss movePenTosdrawLines SWFButtonsbsaddShapes SWFBUTTON_HITs SWFBUTTON_UPsSWFBUTTON_DOWNsSWFBUTTON_OVERsfilenamesreplaces addActions SWFActionsSWFBUTTON_MOUSEDOWNs_moviesaddsismoveTo(sselfskwargss squareshapesisfilenamesb((s-build\bdist.win32\egg\dirstat\Dumpers\Ming.pysaddrects # :( s__name__s __module__sEXTsFalses NEEDHANDLEsgetcolors _start_dumps _end_dumpsaddrect(((s-build\bdist.win32\egg\dirstat\Dumpers\Ming.pysDumpers    cCstidS(N(sDumpersdump(((s-build\bdist.win32\egg\dirstat\Dumpers\Ming.pystest.ss__main__N(sdirstat.Dumpers FileDumpersmingsDumperstests__name__(stests FileDumpersDumper((s-build\bdist.win32\egg\dirstat\Dumpers\Ming.pys?s (  PKab5!!dirstat/Dumpers/SVG.pyc; dkDc@sHdklZdefdYZdZedjo endS((s FileDumpersDumpercBs)tZdZdZdZdZRS(Ns.svgcCsHd}|i}|ii|hd|i<d|i<dS(Ns s���sizexs���sizey(���s���headers���selfs���get_sizes���sizes���_files���writes���xs���y(���s���selfs���headers���size(����(����s,���build\bdist.win32\egg\dirstat\Dumpers\SVG.pys ���_start_dump���s����M c���������C���sH���d�}�|��i���}�|��i�i�|�h��d�|�i���<d�|�i���<�d��S(���Ns^�� ssizexssizey(sfootersselfsget_sizessizes_fileswritesxsy(sselfssizesfooter((s,build\bdist.win32\egg\dirstat\Dumpers\SVG.pys _end_dumpZs cKsV|diddiddiddidd |d<|iid |dS( Nsfilenames\s\\s's\'s&s&s iso-8859-1sreplaces (skwargssreplacesencodesselfs_fileswrite(sselfskwargs((s,build\bdist.win32\egg\dirstat\Dumpers\SVG.pysaddrectfs>(s__name__s __module__sEXTs _start_dumps _end_dumpsaddrect(((s,build\bdist.win32\egg\dirstat\Dumpers\SVG.pysDumpers R cCstidS(N(sDumpersdump(((s,build\bdist.win32\egg\dirstat\Dumpers\SVG.pystestjss__main__N(sdirstat.Dumpers FileDumpersDumperstests__name__(stests FileDumpersDumper((s,build\bdist.win32\egg\dirstat\Dumpers\SVG.pys?s e  PKab5hdirstat/Dumpers/__init__.pyc; yLDc@sdS(N((((s1build\bdist.win32\egg\dirstat\Dumpers\__init__.pys?sPKab5n''dirstat/Dumpers/HTML.pyc; dkDc@s`dklZdZdZdZdZdefdYZdZedjo end S( (s FileDumpers: Repertoire
s] s s sDumpercBs)tZdZdZdZdZRS(Ns.htmlcCs~|i}hd|i<d|i<d|idd<d|id<|_t}|ii ||idS(Nssizexssizeyssizexmdiissizeymd( sselfsget_sizessizesxsys_Dumper__dump_paramssHEADERsheaders_fileswrite(sselfsheaderssize((s-build\bdist.win32\egg\dirstat\Dumpers\HTML.pys _start_dumps QcCst}|ii||ihdd<dd<} x6|iD](}|iid|d|dfqBWt }|ii||i|i \} } } d}|id |d t| d jo d}nt|id |d t| t| }|}x| D]}|h} |d jodp|| d%s : %s

iiissizeyif1.3f2.0s_sUnknowns innertextssizexsxi swidthsysheightssfilenamesfilesizescolorstype:extensions*.stype:extensionlowers type:contains*stype:exactmatchs, sfiles and sany other filesdirs any directory(s FOOTER_PART1sfootersselfs_fileswrites_Dumper__dump_paramssparamss get_metadatasparams FOOTER_PART2s get_colorsstypesscolorssmethod_by_typesborderslensintsheightsyposstypenameskwargss filelistingsmasksappendssortsjoinsaddrects FOOTER_PART3(sselfs filelistingsfootersbordersmasksypossparamsheightstypenamescolorssparamsskwargssmethod_by_typestypes((s-build\bdist.win32\egg\dirstat\Dumpers\HTML.pys _end_dumpst && /        cKs_|diddiddiddidd }t|td jo0y|id d }Wqtj oqXn|id d }||d<|did|d<|di}|d|d|dddjo!|di ddd|d,sscolorxiiiiiscolortis innertextss %(innertext)s (skwargssreplacesfilenamestypesdecodes LookupErrorsencodesget_htmlcolor_extendedsget_rgbscolors __class__sselfs_fileswrite(sselfskwargsscolorsfilename((s-build\bdist.win32\egg\dirstat\Dumpers\HTML.pysaddrect#s :  %! (s__name__s __module__sEXTs _start_dumps _end_dumpsaddrect(((s-build\bdist.win32\egg\dirstat\Dumpers\HTML.pysDumpers  HcCstidS(N(sDumpersdump(((s-build\bdist.win32\egg\dirstat\Dumpers\HTML.pystest8ss__main__N( sdirstat.Dumpers FileDumpersHEADERs FOOTER_PART1s FOOTER_PART2s FOOTER_PART3sDumperstests__name__(s FileDumpersHEADERstests FOOTER_PART1sDumpers FOOTER_PART3s FOOTER_PART2((s-build\bdist.win32\egg\dirstat\Dumpers\HTML.pys?s g  PKab5JiEGG-INFO/PKG-INFOMetadata-Version: 1.0 Name: pydirstat Version: 0.9.15 Summary: Show statistics informations for a directory in HTML, SVG, or Flash. Home-page: http://pydirstat.berlios.de/ Author: Arthibus Gissehel Author-email: public-pds-setup@giss.ath.cx License: UNKNOWN Description: pyDirStat is a small tool to view statistical information about a directory. It will generate a view of all files contained in a directory (and subdirectories) with rectangles. Each rectangle area is proportional to file size. It's a perfect tool to view disk usage with graphics. Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Environment :: Console Classifier: Environment :: Web Environment Classifier: Environment :: Win32 (MS Windows) Classifier: Intended Audience :: End Users/Desktop Classifier: Intended Audience :: System Administrators Classifier: License :: OSI Approved :: GNU General Public License (GPL) Classifier: Operating System :: Microsoft :: Windows Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Topic :: System :: Filesystems Classifier: Topic :: System :: Systems Administration PKab5FoĆEGG-INFO/SOURCES.txtChangeLog VERSION makerelease.py setup.py doc/index.html ez_setup/README.txt ez_setup/__init__.py nsis/pydirstat.nsi nsis/version.nsi res/msvcr71.dll res/pydirstat.ico src/pds-config.py src/pdshtml.py src/pdssvg.py src/pdsswf.py src/pydirstat.py src/dirstat/CommandLine.py src/dirstat/Configuration.py src/dirstat/DirInfo.py src/dirstat/Dumper.py src/dirstat/FileInfo.py src/dirstat/FileInfoList.py src/dirstat/FileProvider.py src/dirstat/FileProviderBase.py src/dirstat/FileProviderLocal.py src/dirstat/FileTree.py src/dirstat/SimuQT.py src/dirstat/SizeColorProvider.py src/dirstat/TreemapTile.py src/dirstat/TreemapView.py src/dirstat/__init__.py src/dirstat/__version__.py src/dirstat/walker.py src/dirstat/Dumpers/HTML.py src/dirstat/Dumpers/Ming.py src/dirstat/Dumpers/SVG.py src/dirstat/Dumpers/__init__.py src/dirstat/Dumpers/HTML.py src/dirstat/Dumpers/Ming.py src/dirstat/Dumpers/SVG.py src/dirstat/Dumpers/__init__.py src/pydirstat.egg-info/PKG-INFO src/pydirstat.egg-info/SOURCES.txt src/pydirstat.egg-info/dependency_links.txt src/pydirstat.egg-info/not-zip-safe src/pydirstat.egg-info/top_level.txt PKab52EGG-INFO/dependency_links.txt PKb52EGG-INFO/not-zip-safe PKab5"ȪEGG-INFO/top_level.txtdirstat dirstat/Dumpers PKbb5$ ooEGG-INFO/scripts/pds-config.py#!c:\usr\lib\python23\python.exe from dirstat import config if __name__ == '__main__' : config() PKbb5UEGG-INFO/scripts/pdshtml.py#!c:\usr\lib\python23\python.exe from dirstat.Configuration import Configuration import dirstat def main() : Configuration().set_strvalue('dumper','HTML') dirstat.main() if __name__ == '__main__' : main() PKbb5^EGG-INFO/scripts/pdssvg.py#!c:\usr\lib\python23\python.exe from dirstat.Configuration import Configuration import dirstat def main() : Configuration().set_strvalue('dumper','SVG') dirstat.main() if __name__ == '__main__' : main() PKbb57EGG-INFO/scripts/pdsswf.py#!c:\usr\lib\python23\python.exe from dirstat.Configuration import Configuration import dirstat def main() : Configuration().set_strvalue('dumper','Ming') dirstat.main() if __name__ == '__main__' : main() PKbb5$iiEGG-INFO/scripts/pydirstat.py#!c:\usr\lib\python23\python.exe import dirstat if __name__ == '__main__' : dirstat.main() PK}F5GCB dirstat/TreemapView.pyPKF5RУ dirstat/FileProvider.pyPK?4/IN,N, dirstat/DirInfo.pyPK}F5r_##F8dirstat/FileInfo.pyPKb5wЉ  Pdirstat/Dumper.pyPK<4"B B gdirstat/__init__.pyPK+b5QE1XXGrdirstat/FileTree.pyPK!F5  Ђdirstat/FileProviderLocal.pyPKb5IHH)dirstat/Configuration.pyPK?4J))dirstat/TreemapTile.pyPKb5[*mdirstat/__version__.pyPK?4_dfs1s1dirstat/SimuQT.pyPK:4eBB["dirstat/SizeColorProvider.pyPK!F5/9dirstat/FileProviderBase.pyPKrY4Ekk?dirstat/walker.pyPKB4V..Cdirstat/CommandLine.pyPK?4bK- - Xdirstat/FileInfoList.pyPKab5iv  Mfdirstat/TreemapView.pycPKab5Vnxdirstat/FileProvider.pycPKab5^--ydirstat/DirInfo.pycPKab5--dirstat/FileInfo.pycPKab5UBdirstat/Dumper.pycPKab5Pi dirstat/__init__.pycPKab5sdirstat/FileTree.pycPKab5eff dirstat/FileProviderLocal.pycPKab5䦨EE#dirstat/Configuration.pycPKab5{ h$hdirstat/TreemapTile.pycPKab5,-"ndirstat/__version__.pycPKab5r#M9M9ydirstat/SimuQT.pycPKab5o{"dirstat/SizeColorProvider.pycPKab5D!dirstat/FileProviderBase.pycPKab5dirstat/walker.pycPKab5dirstat/Dumpers/__init__.pyPK Z4`e&e&>dirstat/Dumpers/HTML.pyPKab5P2 Redirstat/Dumpers/Ming.pycPKab5!! pdirstat/Dumpers/SVG.pycPKab5hvdirstat/Dumpers/__init__.pycPKab5n''1dirstat/Dumpers/HTML.pycPKab5JiEGG-INFO/PKG-INFOPKab5FoĆEGG-INFO/SOURCES.txtPKab52EGG-INFO/dependency_links.txtPKb52EGG-INFO/not-zip-safePKab5"Ȫ$EGG-INFO/top_level.txtPKbb5$ oopEGG-INFO/scripts/pds-config.pyPKbb5UEGG-INFO/scripts/pdshtml.pyPKbb5^=EGG-INFO/scripts/pdssvg.pyPKbb57]EGG-INFO/scripts/pdsswf.pyPKbb5$ii~EGG-INFO/scripts/pydirstat.pyPK44"