I have created a Yum Download Base Callback class to make it easier for 3. party users to create custom download progress bars in a simple
ways.
Comments ?

Tim
diff --git a/yum/callbacks.py b/yum/callbacks.py
index e126f54..c1513a5 100644
--- a/yum/callbacks.py
+++ b/yum/callbacks.py
@@ -47,4 +47,113 @@ class ProcessTransNoOutputCallback:
          
     def event(self,state,data=None):
         pass
+    
+class DownloadBaseCallback( BaseMeter ):
+    """ 
+    This is class is a base class to use by implement a download progress
+    handler to be used with YumBase.repos.setProgressBar.
+    
+    Example:
+    
+    from yum.callbacks import DownloadBaseCallback
+    
+    class MyDownloadCallback(  DownloadBaseCallback ):
+    
+        def updateProgress(self,name,frac,fread,ftime):
+            '''
+             Update the progressbar
+            @param name: filename
+            @param frac: Progress fracment (0 -> 1)
+            @param fread: formated string containing BytesRead
+            @param ftime : formated string containing remaining or elapsed time
+            '''
+            pct = int( frac*100 )
+            print " %s : %s " % (name,pct)
+            
+            
+    if __name__ == '__main__':
+        my = YumBase()
+        my.doConfigSetup()
+        dnlcb = MyDownloadCallback()
+        my.repos.repos.setProgressBar( dnlcb )
+        for pkg in my.pkgSack:
+            print pkg.name
+    
+    """
+    
+    def __init__(self):
+        BaseMeter.__init__( self )
+        self.totSize = ""
+        self.oldName = None
+        self.lastPct = 0
+        self.totalPct = 0
+        self.pkgs = None
+        self.numPkgs=0
+        self.bump = 0.0
+
+    def setPackages(self,pkgs,startPct,numPct):
+        self.pkgs = pkgs
+        self.numPkgs = len(self.pkgs)
+        self.bump = numPct/self.numPkgs
+        self.totalPct = startPct
+        
+    def _getPackage(self,name):
+        name = name.split('-')[0]
+        if self.pkgs:
+            for pkg in self.pkgs:
+                if pkg.name == name:
+                    return pkg
+        return None
+        
+    def update( self, amount_read, now=None ):
+        BaseMeter.update( self, amount_read, now )
+
+    def _do_start( self, now=None ):
+        name = self._getName()
+        self.updateProgress(name,0.0,"","")
+        if not self.size is None:
+            self.totSize = format_number( self.size )
+
+    def _do_update( self, amount_read, now=None ):
+        fread = format_number( amount_read )
+        name = self._getName()
+        if self.size is None:
+            # Elapsed time
+            etime = self.re.elapsed_time()
+            fetime = format_time( etime )
+            frac = 0.0
+            self.updateProgress(name,frac,fread,fetime)
+        else:
+            # Remaining time
+            rtime = self.re.remaining_time()
+            frtime = format_time( rtime )
+            frac = self.re.fraction_read()
+            self.updateProgress(name,frac,fread,frtime)
+
+
+    def _do_end( self, amount_read, now=None ):
+        total_time = format_time( self.re.elapsed_time() )
+        total_size = format_number( amount_read )
+        name = self._getName()
+        self.updateProgress(name,1.0,total_size,total_time)
+
+    def _getName(self):
+        '''
+        Get the name of the package being downloaded
+        '''
+        if self.text and type( self.text ) == type( "" ):
+            name = self.text
+        else:
+            name = self.basename
+        return name
+
+    def updateProgress(self,name,frac,fread,ftime):
+        '''
+         Update the progressbar (Overload in child class)
+        @param name: filename
+        @param frac: Progress fracment (0 -> 1)
+        @param fread: formated string containing BytesRead
+        @param ftime : formated string containing remaining or elapsed time
+        '''
+        pass
         
_______________________________________________
Yum-devel mailing list
Yum-devel@linux.duke.edu
https://lists.dulug.duke.edu/mailman/listinfo/yum-devel

Reply via email to