ajack 2004/07/21 07:54:34
Modified: python/gump/model project.py module.py
. gumpy.py
python/gump/notify notification.py logic.py notifier.py
python/gump/document/xdocs documenter.py
Log:
More than a few notification fixes...
Revision Changes Path
1.91 +15 -1 gump/python/gump/model/project.py
Index: project.py
===================================================================
RCS file: /home/cvs/gump/python/gump/model/project.py,v
retrieving revision 1.90
retrieving revision 1.91
diff -u -r1.90 -r1.91
--- project.py 19 Jul 2004 20:34:00 -0000 1.90
+++ project.py 21 Jul 2004 14:54:34 -0000 1.91
@@ -77,7 +77,7 @@
self.url=None
self.desc=''
- self.distributable=False
+ self.redistributable=False
self.packageMarker=None
self.jvmargs=gump.process.command.Parameters()
self.packageNames=None
@@ -101,10 +101,24 @@
Positioned.__del__(self)
def hasNotifys(self):
+ """
+ Does this project have any notification addresses, and if not
+ does the module?
+
+ boolean true if some
+ """
if self.notifys: return True
+ if self.module: return self.module.hasNotifys()
return False
def getNotifys(self):
+ """
+ Return the list of notification addresses for this project
+ but if none, see if the module has any.
+ """
+ if not self.notifys:
+ if self.module:
+ return self.module.getNotifys()
return self.notifys
def hasAnt(self):
1.49 +14 -4 gump/python/gump/model/module.py
Index: module.py
===================================================================
RCS file: /home/cvs/gump/python/gump/model/module.py,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -r1.48 -r1.49
--- module.py 14 Jul 2004 23:36:28 -0000 1.48
+++ module.py 21 Jul 2004 14:54:34 -0000 1.49
@@ -15,7 +15,9 @@
# limitations under the License.
"""
- This module contains information on
+
+ This module contains information on <module and it's repository references.
+
"""
from time import localtime, strftime, tzname
@@ -175,7 +177,8 @@
self.svn=None
self.artifacts=None
- self.packaged = False
+ self.packaged = False
+ self.redistributable= False
# Changes were found (when updating)
self.modified = False
@@ -221,6 +224,10 @@
return object
def resolve(self):
+ """
+ Resolving requires creating objects (in the correct lists/maps) for
+ certain high level XML elements, e.g. <project.
+ """
if self.isResolved(): return
@@ -406,6 +413,9 @@
if self.hasDomChild('description'):
self.desc=self.getDomChildValue('description')
+
+ # Existence means 'true'
+ self.redistributable=self.hasDomChild('redistributable')
# For prettiness
self.sortedProjects=createOrderedList(self.getProjects())
@@ -469,8 +479,8 @@
def isRedistributable(self):
# Existence means 'true'
- return self.hasDomChild('redistributable') \
- or (self.repository and self.repository.isRedistributable())
+ return self.redistributable or \
+ (self.repository and self.repository.isRedistributable())
#
# Get a full list of all the projects that depend
1.40 +3 -3 gump/gumpy.py
Index: gumpy.py
===================================================================
RCS file: /home/cvs/gump/gumpy.py,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -r1.39 -r1.40
--- gumpy.py 19 Jul 2004 16:07:53 -0000 1.39
+++ gumpy.py 21 Jul 2004 14:54:34 -0000 1.40
@@ -264,7 +264,7 @@
pass
# Enable a log
-logFileName='gumpy_log.txt'
+logFileName='gumpy_log_' + time.strftime('%d%m%Y_%H%M%S') + '.txt'
logFile=os.path.abspath(logFileName)
log=open(logFile,'w',0) # Unbuffered...
@@ -458,7 +458,7 @@
# Publish logfile
published=0
if logdir:
- publishedLogFile=os.path.abspath(os.path.join(logdir,logFileName))
+ publishedLogFile=os.path.abspath(os.path.join(logdir,'gumpy_log.txt'))
if '--xdocs' in args:
publishedLogFile=os.path.abspath(
os.path.join(
@@ -479,7 +479,7 @@
if result:
# Cat to screen (if running to screen)
- tty=0
+ tty=False
try:
tty=sys.stdout.isatty()
except:
1.6 +8 -4 gump/python/gump/notify/notification.py
Index: notification.py
===================================================================
RCS file: /home/cvs/gump/python/gump/notify/notification.py,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- notification.py 19 Jul 2004 16:07:54 -0000 1.5
+++ notification.py 21 Jul 2004 14:54:34 -0000 1.6
@@ -51,7 +51,11 @@
FAILURE_TYPE=2
WARNING_TYPE=3
- def __init__(self,run,entity,type=SUCCESS_TYPE,intro=''):
+ def __init__(self,run,entity,type=SUCCESS_TYPE,intro=''):
+ """
+ Create a notification (of success/failure/etc.)
+ """
+
RunSpecific.__init__(self,run)
self.entity=entity
@@ -78,13 +82,13 @@
return False
def isSuccess(self):
- return SUCCESS_TYPE == self.type
+ return Notification.SUCCESS_TYPE == self.type
def isFailure(self):
- return FAILURE_TYPE == self.type
+ return Notification.FAILURE_TYPE == self.type
def isWarning(self):
- return WARNING_TYPE == self.type
+ return Notification.WARNING_TYPE == self.type
def resolveContent(self,resolver,id=None,stream=None):
1.7 +17 -4 gump/python/gump/notify/logic.py
Index: logic.py
===================================================================
RCS file: /home/cvs/gump/python/gump/notify/logic.py,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- logic.py 19 Jul 2004 16:07:54 -0000 1.6
+++ logic.py 21 Jul 2004 14:54:34 -0000 1.7
@@ -43,30 +43,43 @@
RunSpecific.__init__(self,run)
# :TODO: First Ever?
- # :TODO What is M$ (i.e. not dbm) and/or no stats db
+ # :TODO What if M$ (i.e. not dbm) and/or no stats db
def notification(self,entity):
+ """
+ Determine if a notification is appropriate, and
+ generate it (the content)
+ """
notification=None
# Stats had better have been set
stats=entity.getStats()
-
- #
- # Determine if we want to notify
+
+ #
+ # Determine if we want to notify, and if so
+ # with what (Failure/Warning/Success)
#
if entity.isFailed():
+ #
# Notify on first failure, or each official
# run.
+ #
if self.run.getOptions().isOfficial() \
or (1 == stats.sequenceInState):
notification=gump.notify.notification.FailureNotification(self.run,entity)
elif entity.isSuccess():
+ #
+ # Notify on first success, after a failure.
+ #
if (stats.sequenceInState == 1):
if not STATE_PREREQ_FAILED == stats.previousState:
if stats.getTotalRuns() > 1:
notification=gump.notify.notification.SuccessNotification(self.run,entity)
else:
+ #
+ # Notify on official if contains 'errors'.
+ #
if self.run.getOptions().isOfficial() and
entity.containsRealNasties():
notification=gump.notify.notification.WarningNotification(self.run,entity,' contains
errors')
1.11 +68 -26 gump/python/gump/notify/notifier.py
Index: notifier.py
===================================================================
RCS file: /home/cvs/gump/python/gump/notify/notifier.py,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- notifier.py 19 Jul 2004 16:07:54 -0000 1.10
+++ notifier.py 21 Jul 2004 14:54:34 -0000 1.11
@@ -50,10 +50,15 @@
AbstractRunActor.__init__(self,run)
+ # Successful notifications
+ self.sents=0
+
+ # Unsuccesful
self.unsent=''
self.unsentSubjects=''
self.unsents=0
+ # Unwanted
self.unwanted=''
self.unwantedSubjects=''
self.unwanteds=0
@@ -62,25 +67,39 @@
self.logic=NotificationLogic(self.run)
self.id=0
-
+
+ def processOtherEvent(self,event):
+ """
+
+ At the end of the run...
+
+ """
+ if isinstance(event,FinalizeRunEvent):
+ self.processWorkspace()
+
def processWorkspace(self):
"""
+
Notify about the workspace (if it needs it)
+
"""
notification = self.logic.notification(self.workspace)
if notification:
self.notifyWorkspace(notification)
+ log.info('Notifications: Sent:%s Unsent:%s Unwanted: %s' % \
+ (self.sents, self.unsents, self.unwanteds) )
+
# Workspace can override...
(wsTo, wsFrom) = self.workspace.getNotifyOverrides()
# Belt and braces (notify to us if not notify to them)
- if self.hasUnwanted():
+ if self._hasUnwanted():
log.info('We have some unwanted\'s to send to list...')
- self.sendEmail(wsTo or self.workspace.mailinglist,wsFrom or
self.workspace.email, \
- 'BATCH: All dressed up, with nowhere to go...',\
- self.getUnwantedContent())
+ self.sendEmail(wsTo or self.workspace.mailinglist,wsFrom or
self.workspace.email,
+ 'BATCH: All dressed up, with nowhere to go...',
+ self._getUnwantedContent())
# A bit paranoid, ought just rely upon object being
# destroyed,
@@ -91,11 +110,11 @@
log.debug('No unwanted notifys.')
# Belt and braces (notify to us if not notify to them)
- if self.hasUnsent():
+ if self._hasUnsent():
log.info('We have some unsented\'s to send to list...')
- self.sendEmail(wsTo or self.workspace.mailinglist,wsFrom or
self.workspace.email, \
- 'BATCH: Unable to send...',\
- self.getUnsentContent())
+ self.sendEmail(wsTo or self.workspace.mailinglist,wsFrom or
self.workspace.email,
+ 'BATCH: Unable to send...',
+ self._getUnsentContent())
# A bit paranoid, ought just rely upon object being
# destroyed,
@@ -136,7 +155,7 @@
log.error("Failed to send notify e-mails for project " +
project.getName()\
+ " : " + str(details), exc_info=1)
- def addUnwanted(self,subject,content):
+ def _addUnwanted(self,subject,content):
"""
Add this notification to the 'unwanted' list, since
no addresses were found for it.
@@ -152,7 +171,7 @@
self.unwantedSubjects += subject + '\n'
self.unwanteds += 1
- def addUnsent(self,subject,content):
+ def _addUnsent(self,subject,content):
"""
Add this notification to the 'unsent' list, since
it failed to be sent.
@@ -169,16 +188,30 @@
self.unsents += 1
def getNextIdentifier(self):
+ """
+ Get's the next identifier.
+
+ Note: Side effect, increments the identifier
+ """
self.id += 1
return self.id
- def getUnwantedContent(self):
- return
self.getBatchContent(self.unwanteds,self.unwantedSubjects,self.unwanted)
+ def _getUnwantedContent(self):
+ """
+ Generate content for the batch of unwanted notifications.
+ """
+ return
self._getBatchContent(self.unwanteds,self.unwantedSubjects,self.unwanted)
- def getUnsentContent(self):
- return self.getBatchContent(self.unsents,self.unsentSubjects,self.unsent)
+ def _getUnsentContent(self):
+ """
+ Generate content for the batch of unsent notifications.
+ """
+ return self._getBatchContent(self.unsents,self.unsentSubjects,self.unsent)
- def getBatchContent(self,count,subjects,batch):
+ def _getBatchContent(self,count,subjects,batch):
+ """
+ Generate batch content
+ """
content = ''
if count:
@@ -204,13 +237,19 @@
return content
- def hasUnwanted(self):
- if self.unwanted: return 1
- return 0
+ def _hasUnwanted(self):
+ """
+ Do we have any mails that should have been sent, but had nowhere to go?
+ """
+ if self.unwanted: return True
+ return False
- def hasUnsent(self):
- if self.unsent: return 1
- return 0
+ def _hasUnsent(self):
+ """
+ Do we have any mails that failed to be sent?
+ """
+ if self.unsent: return True
+ return False
def notifyWorkspace(self,notification):
""" Notify for the workspace """
@@ -273,7 +312,9 @@
def sendEmails(self, addressPairs, subject, content):
"""
- Try to send them (if any to send, or store)
+ Try to send them to interested parties
+
+ Note: if nowhere to send, store them as 'unwanted'
"""
if addressPairs:
for pair in addressPairs:
@@ -286,11 +327,12 @@
# This is a catch-all, for all project that
# don't have <notify's assigned.
#
- self.addUnwanted(subject,content)
+ self._addUnwanted(subject,content)
def sendEmail(self, toaddr, fromaddr, subject, content):
"""
- Perform the SMTP send.
+ Perform the SMTP send.
+ If it fails, add the mail to the list of unsent
"""
#
@@ -331,7 +373,7 @@
if not sent:
content = 'Failed with to: ['+str(toaddr)+'] from:
['+str(fromaddr)+']\n' + content
- self.addUnsent(subject,content)
+ self._addUnsent(subject,content)
log.error('Failed with to: ['+str(toaddr)+'] from: ['+str(fromaddr)+']'
)
return sent
1.21 +1 -1 gump/python/gump/document/xdocs/documenter.py
Index: documenter.py
===================================================================
RCS file: /home/cvs/gump/python/gump/document/xdocs/documenter.py,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- documenter.py 19 Jul 2004 16:07:55 -0000 1.20
+++ documenter.py 21 Jul 2004 14:54:34 -0000 1.21
@@ -256,7 +256,7 @@
xdocWorkDir=self.getXDocWorkDirectory()
logDirectory=self.getXDocLogDirectory()
- log.info('Syncronize work->log, and clean-up...')
+ log.info('Synchronize work->log, and clean-up...')
success=True
try:
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]