reportlab/lib/logger.py
author rgbecker
Wed, 25 Oct 2000 08:57:46 +0000
changeset 494 54257447cfe9
parent 407 8c089804207e
child 811 92db8fedcd77
permissions -rw-r--r--
Changed to indirect copyright
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
407
8c089804207e Initial version
rgbecker
parents:
diff changeset
     1
#!/bin/env python
494
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 407
diff changeset
     2
#copyright ReportLab Inc. 2000
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 407
diff changeset
     3
#see license.txt for license details
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 407
diff changeset
     4
#history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/lib/logger.py?cvsroot=reportlab
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 407
diff changeset
     5
#$Header: /tmp/reportlab/reportlab/lib/logger.py,v 1.2 2000/10/25 08:57:45 rgbecker Exp $
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 407
diff changeset
     6
__version__=''' $Id: logger.py,v 1.2 2000/10/25 08:57:45 rgbecker Exp $ '''
407
8c089804207e Initial version
rgbecker
parents:
diff changeset
     7
8c089804207e Initial version
rgbecker
parents:
diff changeset
     8
from sys import stderr
8c089804207e Initial version
rgbecker
parents:
diff changeset
     9
class Logger:
8c089804207e Initial version
rgbecker
parents:
diff changeset
    10
	'''
8c089804207e Initial version
rgbecker
parents:
diff changeset
    11
	An extended file type thing initially equivalent to sys.stderr
8c089804207e Initial version
rgbecker
parents:
diff changeset
    12
	You can add/remove file type things; it has a write method
8c089804207e Initial version
rgbecker
parents:
diff changeset
    13
	'''
8c089804207e Initial version
rgbecker
parents:
diff changeset
    14
	def __init__(self):
8c089804207e Initial version
rgbecker
parents:
diff changeset
    15
		self._fps = [stderr]
8c089804207e Initial version
rgbecker
parents:
diff changeset
    16
		self._fns = {}
8c089804207e Initial version
rgbecker
parents:
diff changeset
    17
8c089804207e Initial version
rgbecker
parents:
diff changeset
    18
	def add(self,fp):
8c089804207e Initial version
rgbecker
parents:
diff changeset
    19
		'''add the file/string fp to the destinations'''
8c089804207e Initial version
rgbecker
parents:
diff changeset
    20
		if type(fp) is StringType:
8c089804207e Initial version
rgbecker
parents:
diff changeset
    21
			if fp in self._fns: return
8c089804207e Initial version
rgbecker
parents:
diff changeset
    22
			fp = open(fn,'wb')
8c089804207e Initial version
rgbecker
parents:
diff changeset
    23
			self._fns[fn] = fp
8c089804207e Initial version
rgbecker
parents:
diff changeset
    24
		self._fps.append(fp)
8c089804207e Initial version
rgbecker
parents:
diff changeset
    25
8c089804207e Initial version
rgbecker
parents:
diff changeset
    26
	def remove(self,fp):
8c089804207e Initial version
rgbecker
parents:
diff changeset
    27
		'''remove the file/string fp from the destinations'''
8c089804207e Initial version
rgbecker
parents:
diff changeset
    28
		if type(fp) is StringType:
8c089804207e Initial version
rgbecker
parents:
diff changeset
    29
			if fp not in self._fns: return
8c089804207e Initial version
rgbecker
parents:
diff changeset
    30
			fn = fp
8c089804207e Initial version
rgbecker
parents:
diff changeset
    31
			fp = self._fns[fn]
8c089804207e Initial version
rgbecker
parents:
diff changeset
    32
			del self.fns[fn]
8c089804207e Initial version
rgbecker
parents:
diff changeset
    33
		if fp in self._fps:
8c089804207e Initial version
rgbecker
parents:
diff changeset
    34
			del self._fps[self._fps.index(fp)]
8c089804207e Initial version
rgbecker
parents:
diff changeset
    35
8c089804207e Initial version
rgbecker
parents:
diff changeset
    36
	def write(self,text):
8c089804207e Initial version
rgbecker
parents:
diff changeset
    37
		'''write text to all the destinations'''
8c089804207e Initial version
rgbecker
parents:
diff changeset
    38
		if text[-1]!='\n': text=text+'\n'
8c089804207e Initial version
rgbecker
parents:
diff changeset
    39
		map(lambda fp,t=text: fp.write(t),self._fps)
8c089804207e Initial version
rgbecker
parents:
diff changeset
    40
8c089804207e Initial version
rgbecker
parents:
diff changeset
    41
	def __call__(self,text):
8c089804207e Initial version
rgbecker
parents:
diff changeset
    42
		self.write(text)
8c089804207e Initial version
rgbecker
parents:
diff changeset
    43
8c089804207e Initial version
rgbecker
parents:
diff changeset
    44
logger=Logger()
8c089804207e Initial version
rgbecker
parents:
diff changeset
    45
8c089804207e Initial version
rgbecker
parents:
diff changeset
    46
class WarnOnce:
8c089804207e Initial version
rgbecker
parents:
diff changeset
    47
8c089804207e Initial version
rgbecker
parents:
diff changeset
    48
	def __init__(self,kind='Warn'):
8c089804207e Initial version
rgbecker
parents:
diff changeset
    49
		self.uttered = {}
8c089804207e Initial version
rgbecker
parents:
diff changeset
    50
		self.pfx = '%s: '%kind
8c089804207e Initial version
rgbecker
parents:
diff changeset
    51
8c089804207e Initial version
rgbecker
parents:
diff changeset
    52
	def once(self,warning):
8c089804207e Initial version
rgbecker
parents:
diff changeset
    53
		if not self.uttered.has_key(warning):
8c089804207e Initial version
rgbecker
parents:
diff changeset
    54
			logger.write(self.pfx + warning)
8c089804207e Initial version
rgbecker
parents:
diff changeset
    55
			self.uttered[warning] = 1
8c089804207e Initial version
rgbecker
parents:
diff changeset
    56
8c089804207e Initial version
rgbecker
parents:
diff changeset
    57
	def __call__(self,warning):
8c089804207e Initial version
rgbecker
parents:
diff changeset
    58
		self.once(warning)
8c089804207e Initial version
rgbecker
parents:
diff changeset
    59
8c089804207e Initial version
rgbecker
parents:
diff changeset
    60
warnOnce=WarnOnce()
8c089804207e Initial version
rgbecker
parents:
diff changeset
    61
infoOnce=WarnOnce('Info')