[LOGGER] Switch to built-in logging class
authorIra W. Snyder <devel@irasnyder.com>
Mon, 1 Jan 2007 21:33:04 +0000 (13:33 -0800)
committerIra W. Snyder <devel@irasnyder.com>
Mon, 1 Jan 2007 21:33:04 +0000 (13:33 -0800)
Switch from the homegrown RarslaveLogger class to the built-in logging
class. Convert all code that used RarslaveLogger to use the logging class,
and remove the RarslaveLogger class completely.

Signed-off-by: Ira W. Snyder <devel@irasnyder.com>
PAR2Set.py
PAR2Set_EXTRACTFIRST.py
PAR2Set_JOIN.py
RarslaveCommon.py
RarslaveDetector.py
RarslaveLogger.py [deleted file]
rarslave.py

index 323fc24..e58cc16 100644 (file)
@@ -7,6 +7,7 @@ import Par2Parser
 
 import re
 import os
+import logging
 
 # This is a fairly generic class which does all of the major things that a PAR2
 # set will need to have done to be verified and extracted. For most "normal" types
@@ -87,7 +88,7 @@ class PAR2Set (object):
 
                # check the result
                if ret != 0:
-                       fatalMessage ('PAR2 Check / Repair failed: %s' % self.p2file)
+                       logging.critical ('PAR2 Check / Repair failed: %s' % self.p2file)
                        return -ECHECK
 
                return SUCCESS
@@ -123,9 +124,9 @@ class PAR2Set (object):
                for f in files:
                        try:
                                os.remove (os.path.join (dir, f))
-                               debugMessage ('Deleteing: %s' % os.path.join (dir, f))
+                               logging.debug ('Deleteing: %s' % os.path.join (dir, f))
                        except:
-                               fatalMessage ('Failed to delete: %s' % os.path.join (dir, f))
+                               logging.error ('Failed to delete: %s' % os.path.join (dir, f))
                                return -EDELETE
 
                return SUCCESS
@@ -143,7 +144,7 @@ class PAR2Set (object):
                ret = self.runVerifyAndRepair ()
 
                if ret != SUCCESS:
-                       fatalMessage ('Repair stage failed for: %s' % self.p2file)
+                       logging.critical ('Repair stage failed for: %s' % self.p2file)
                        return -ECHECK
 
                self.update_matches ()
@@ -152,7 +153,7 @@ class PAR2Set (object):
                ret = self.runExtract ()
 
                if ret != SUCCESS:
-                       fatalMessage ('Extraction stage failed for: %s' % self.p2file)
+                       logging.critical ('Extraction stage failed for: %s' % self.p2file)
                        return -EEXTRACT
 
                self.update_matches ()
@@ -161,10 +162,10 @@ class PAR2Set (object):
                ret = self.runDelete ()
 
                if ret != SUCCESS:
-                       fatalMessage ('Deletion stage failed for: %s' % self.p2file)
+                       logging.critical ('Deletion stage failed for: %s' % self.p2file)
                        return -EDELETE
 
-               normalMessage ('Successfully completed: %s' % self.p2file)
+               logging.info ('Successfully completed: %s' % self.p2file)
                return SUCCESS
 
        def safe_create_directory (self, dir):
@@ -176,9 +177,9 @@ class PAR2Set (object):
 
                try:
                        os.makedirs (dir)
-                       verboseMessage ('Created directory: %s' % dir)
+                       logging.info ('Created directory: %s' % dir)
                except OSError:
-                       fatalMessage ('FAILED to create directory: %s' % dir)
+                       logging.critical ('FAILED to create directory: %s' % dir)
                        return -ECREATE
 
                return SUCCESS
@@ -200,11 +201,11 @@ class PAR2Set (object):
                for h in self.find_extraction_heads ():
                        full_head = full_abspath (os.path.join (self.dir, h))
                        ret = self.extraction_function (full_head, todir)
-                       debugMessage ('Extraction Function returned: %d' % ret)
+                       logging.debug ('Extraction Function returned: %d' % ret)
 
                        # Check error code
                        if ret != SUCCESS:
-                               fatalMessage ('Failed extracting: %s' % h)
+                               logging.critical ('Failed extracting: %s' % h)
                                return -EEXTRACT
 
                return SUCCESS
index ab4b1f6..dbd1749 100644 (file)
@@ -1,6 +1,7 @@
 #!/usr/bin/env python
 # vim: set ts=4 sts=4 sw=4 textwidth=92:
 
+import logging
 import PAR2Set
 from RarslaveCommon import *
 
@@ -28,7 +29,7 @@ class PAR2Set_EXTRACTFIRST (PAR2Set.PAR2Set):
                ret = self.runExtract ()
 
                if ret != SUCCESS:
-                       fatalMessage ('Extraction stage failed for: %s' % self.p2file)
+                       logging.critical ('Extraction stage failed for: %s' % self.p2file)
                        return -EEXTRACT
 
                self.update_matches ()
@@ -37,7 +38,7 @@ class PAR2Set_EXTRACTFIRST (PAR2Set.PAR2Set):
                ret = self.runVerifyAndRepair ()
 
                if ret != SUCCESS:
-                       fatalMessage ('Repair stage failed for: %s' % self.p2file)
+                       logging.critical ('Repair stage failed for: %s' % self.p2file)
                        return -ECHECK
 
                self.update_matches ()
@@ -46,9 +47,9 @@ class PAR2Set_EXTRACTFIRST (PAR2Set.PAR2Set):
                ret = self.runDelete ()
 
                if ret != SUCCESS:
-                       fatalMessage ('Deletion stage failed for: %s' % self.p2file)
+                       logging.critical ('Deletion stage failed for: %s' % self.p2file)
                        return -EDELETE
 
-               normalMessage ('Successfully completed: %s' % self.p2file)
+               logging.info ('Successfully completed: %s' % self.p2file)
                return SUCCESS
 
index 3381e72..bf0dc56 100644 (file)
@@ -1,6 +1,7 @@
 #!/usr/bin/env python
 # vim: set ts=4 sts=4 sw=4 textwidth=92:
 
+import logging
 import PAR2Set
 from RarslaveCommon import *
 
@@ -51,7 +52,7 @@ class PAR2Set_JOIN (PAR2Set.PAR2Set):
 
                # check the result
                if ret != 0:
-                       fatalMessage ('PAR2 Check / Repair failed: %s' % self.p2file)
+                       logging.critical ('PAR2 Check / Repair failed: %s' % self.p2file)
                        return -ECHECK
 
                return SUCCESS
index 1ed864c..8ffac91 100644 (file)
@@ -9,9 +9,9 @@ __license__   = "GNU GPL v2 (or, at your option, any later version)"
 
 import os
 import re
+import logging
 
 import RarslaveGlobals
-import RarslaveLogger
 import Par2Parser
 
 # Global constants
@@ -93,11 +93,11 @@ def parse_all_par2 (dir, p2head, p2files):
                        files = Par2Parser.get_protected_files (dir, f)
                        done = True
                except (EnvironmentError, OSError, OverflowError):
-                       verboseMessage ('Corrupt PAR2 file: %s' % f)
+                       logging.warning ('Corrupt PAR2 file: %s' % f)
 
        # Now that we're out of the loop, check if we really finished
        if not done:
-               fatalMessage ('All PAR2 files corrupt for: %s' % p2head)
+               logging.critical ('All PAR2 files corrupt for: %s' % p2head)
 
        # Return whatever we've got, empty or not
        return files
@@ -130,20 +130,6 @@ def list_eq (l1, l2):
 
        return True
 
-# Convience functions for the logger
-
-def fatalMessage (msg):
-       RarslaveGlobals.logger.addMessage (msg, RarslaveLogger.MessageType.Fatal)
-
-def normalMessage (msg):
-       RarslaveGlobals.logger.addMessage (msg, RarslaveLogger.MessageType.Normal)
-
-def verboseMessage (msg):
-       RarslaveGlobals.logger.addMessage (msg, RarslaveLogger.MessageType.Verbose)
-
-def debugMessage (msg):
-       RarslaveGlobals.logger.addMessage (msg, RarslaveLogger.MessageType.Debug)
-
 # Convience functions for the config
 
 def config_get_value (section, name):
index 85316ca..9f14261 100644 (file)
@@ -11,6 +11,8 @@ import PAR2Set_NEWRAR
 import PAR2Set_EF_OLDRAR
 import PAR2Set_EF_NEWRAR
 
+import logging
+
 class RarslaveDetector (object):
 
        # A tuple of tuples with the following definition:
@@ -53,7 +55,7 @@ class RarslaveDetector (object):
                                p2set = classname (self.dir, self.p2file)
 
                                detected = True
-                               debugMessage ('Detected type: %s' % p2set)
+                               logging.debug ('Detected type: %s' % p2set)
 
                                # Try to have rarslave do it's thing
                                ret = p2set.runAll ()
@@ -63,19 +65,19 @@ class RarslaveDetector (object):
                                if ret == SUCCESS:
                                        break
                                else:
-                                       fatalMessage ('Detected type failed for: %s' % self.p2file)
+                                       logging.error ('Detected type failed for: %s' % self.p2file)
 
                # Make sure we detected at least one valid type
                if not detected:
-                       fatalMessage ('Unable to determine type: %s' % self.p2file)
-                       verboseMessage ('The following information will help in writing a detector:')
-                       verboseMessage ('name_matches: %s' % self.name_matched_files)
-                       verboseMessage ('prot_matches: %s' % self.prot_matched_files)
+                       logging.warning ('Unable to determine type: %s' % self.p2file)
+                       logging.debug ('The following information will help in writing a detector:')
+                       logging.debug ('name_matches: %s' % self.name_matched_files)
+                       logging.debug ('prot_matches: %s' % self.prot_matched_files)
                        return -EDETECT
 
                # Make sure that something worked
                if ret != SUCCESS:
-                       fatalMessage ('All types failed for: %s' % self.p2file)
+                       logging.critical ('All types failed for: %s' % self.p2file)
 
                return ret
 
diff --git a/RarslaveLogger.py b/RarslaveLogger.py
deleted file mode 100644 (file)
index ae39913..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/usr/bin/env python
-# vim: set ts=4 sts=4 sw=4 textwidth=92:
-
-class MessageType (object):
-       Fatal = -1
-       Normal = 0
-       Verbose = 1
-       Debug = 2
-
-class RarslaveMessage (object):
-
-       # Instance Variables:
-       # ==========================================================================
-       # msg   -- The message to be printed
-       # type  -- The type of message (Fatal, Normal, Verbose, or Debug)
-
-       def __init__ (self, msg, type=MessageType.Normal):
-               self.msg = msg
-               self.type = type
-
-       def __repr__ (self):
-               return "%s" % self.msg
-
-       def isFatal (self):
-               return self.type == MessageType.Fatal
-
-       def isNormal (self):
-               return self.type == MessageType.Normal
-
-       def isVerbose (self):
-               return self.type == MessageType.Verbose
-
-       def isDebug (self):
-               return self.type == MessageType.Debug
-
-class RarslaveLogger (object):
-       # This class will log multiple messages, one for each set that is operated on.
-       # It will then be able to print all of them out.
-
-       # Instance Variables:
-       # ==========================================================================
-       # __messages    -- The list of RarslaveMessage()s to be printed later.
-
-       def __init__ (self):
-               self.__messages = []
-
-       def addMessage (self, msg, type=MessageType.Normal):
-               self.__messages.append (RarslaveMessage (msg, type))
-
-       def hasFatalMessages (self):
-               for m in self.__messages:
-                       if m.isFatal ():
-                               return True
-
-               return False
-
-       def hasNormalMessages (self):
-               for m in self.__messages:
-                       if m.isNormal ():
-                               return True
-
-               return False
-
-       def hasVerboseMessages (self):
-               for m in self.__messages:
-                       if m.isVerbose ():
-                               return True
-
-               return False
-
-       def hasDebugMessages (self):
-               for m in self.__messages:
-                       if m.isDebug ():
-                               return True
-
-               return False
-
-       def printAllMessages (self, level=MessageType.Normal):
-               # Print all messages with level upto and including $level.
-               for m in self.__messages:
-                       if m.type <= level:
-                               print m
-
-       def printLoglevel (self, level=MessageType.Normal):
-               # Print all message with exactly the loglevel given
-               for m in self.__messages:
-                       if m.type == level:
-                               print m
-
-def main ():
-       pass
-
-if __name__ == '__main__':
-       main ()
-
index 3f7ee54..a18e6a3 100644 (file)
@@ -4,8 +4,7 @@
 VERSION="2.0.0"
 PROGRAM="rarslave2"
 
-import os, sys, optparse
-import RarslaveLogger
+import os, sys, optparse, logging
 import RarslaveDetector
 import RarslaveGlobals
 from RarslaveCommon import *
@@ -13,7 +12,29 @@ from RarslaveCommon import *
 # Global options from the RarslaveGlobals class
 options = RarslaveGlobals.options
 config = RarslaveGlobals.config
-logger = RarslaveGlobals.logger
+
+# A tiny class to hold logging output until we're finished
+class DelayedLogger (object):
+       def __init__ (self, output=sys.stdout.write):
+               self.__messages = []
+               self.__output = output
+
+       def write (self, msg):
+               self.__messages.append (msg)
+
+       def flush (self):
+               pass
+
+       def size (self):
+               """Returns the number of messages queued for printing"""
+               return len (self.__messages)
+
+       def close (self):
+               """Print all messages, clear the queue"""
+               for m in self.__messages:
+                       self.__output (m)
+
+               self.__messages = []
 
 # A tiny class used to find unique PAR2 sets
 class CompareSet (object):
@@ -117,45 +138,28 @@ def find_loglevel (options):
 
        loglevel = options.verbose - options.quiet
 
-       if loglevel < RarslaveLogger.MessageType.Fatal:
-               loglevel = RarslaveLogger.MessageType.Fatal
-
-       if loglevel > RarslaveLogger.MessageType.Debug:
-               loglevel = RarslaveLogger.MessageType.Debug
-
-       return loglevel
+       if loglevel > 1:
+               loglevel = 1
 
-def printMessageTable (loglevel):
+       if loglevel < -3:
+               loglevel = -3
 
-       if logger.hasFatalMessages ():
-               print '\nFatal Messages\n' + '=' * 80
-               logger.printLoglevel (RarslaveLogger.MessageType.Fatal)
+       LEVELS = {      1 : logging.DEBUG,
+                               0 : logging.INFO,
+                               -1: logging.WARNING,
+                               -2: logging.ERROR,
+                               -3: logging.CRITICAL
+       }
 
-       if loglevel == RarslaveLogger.MessageType.Fatal:
-               return
-
-       if logger.hasNormalMessages ():
-               print '\nNormal Messages\n' + '=' * 80
-               logger.printLoglevel (RarslaveLogger.MessageType.Normal)
-
-       if loglevel == RarslaveLogger.MessageType.Normal:
-               return
-
-       if logger.hasVerboseMessages ():
-               print '\nVerbose Messages\n' + '=' * 80
-               logger.printLoglevel (RarslaveLogger.MessageType.Verbose)
-
-       if loglevel == RarslaveLogger.MessageType.Verbose:
-               return
-
-       if logger.hasDebugMessages ():
-               print '\nDebug Messages\n' + '=' * 80
-               logger.printLoglevel (RarslaveLogger.MessageType.Debug)
-
-       return
+       return LEVELS [loglevel]
 
 def main ():
 
+       # Setup the logger
+       logger = DelayedLogger ()
+       logging.basicConfig (stream=logger, level=logging.WARNING, \
+                       format='%(levelname)-8s %(message)s')
+
        # Build the OptionParser
        parser = optparse.OptionParser()
        parser.add_option('-n', '--not-recursive',
@@ -210,7 +214,7 @@ def main ():
        run_options (options)
 
        # Find the loglevel using the options given 
-       loglevel = find_loglevel (options)
+       logging.getLogger().setLevel (find_loglevel (options))
 
        # Run recursively
        if options.recursive:
@@ -228,7 +232,9 @@ def main ():
                        ret = detector.runMatchingTypes ()
 
        # Print the results
-       printMessageTable (loglevel)
+       if logger.size () > 0:
+               print 'Log\n' + '=' * 80
+               logger.close ()
 
        # Done!
        return 0