Vega strike Python Modules doc  0.5.1
Documentation of the " Modules " folder of Vega strike
 All Data Structures Namespaces Files Functions Variables
Folder Class Reference

Public Member Functions

def __init__
 
def __repr__
 
def error
 
def getfullname
 
def getsequencesfilename
 
def getmessagefilename
 
def listsubfolders
 
def listallsubfolders
 
def listmessages
 
def getsequences
 
def putsequences
 
def getcurrent
 
def setcurrent
 
def parsesequence
 
def openmessage
 
def removemessages
 
def refilemessages
 
def movemessage
 
def copymessage
 
def createmessage
 
def removefromallsequences
 
def getlast
 
def setlast
 

Data Fields

 mh
 
 name
 
 last
 

Detailed Description

Class representing a particular folder.

Definition at line 241 of file mhlib.py.

Constructor & Destructor Documentation

def __init__ (   self,
  mh,
  name 
)
Constructor.

Definition at line 244 of file mhlib.py.

245  def __init__(self, mh, name):
246  """Constructor."""
247  self.mh = mh
248  self.name = name
249  if not os.path.isdir(self.getfullname()):
250  raise Error, 'no folder %s' % name

Member Function Documentation

def __repr__ (   self)
String representation.

Definition at line 251 of file mhlib.py.

References Folder.mh, Folder.name, MiniFieldStorage.name, and FieldStorage.name.

252  def __repr__(self):
253  """String representation."""
254  return 'Folder(%s, %s)' % (`self.mh`, `self.name`)
def copymessage (   self,
  n,
  tofolder,
  ton 
)
Copy one message over a specific destination message,
which may or may not already exist.

Definition at line 577 of file mhlib.py.

References shutil.copy2(), Folder.getmessagefilename(), and aifc.open().

578  def copymessage(self, n, tofolder, ton):
579  """Copy one message over a specific destination message,
580  which may or may not already exist."""
581  path = self.getmessagefilename(n)
582  # Open it to check that it exists
583  f = open(path)
584  f.close()
585  del f
586  topath = tofolder.getmessagefilename(ton)
587  backuptopath = tofolder.getmessagefilename(',%d' % ton)
588  try:
589  os.rename(topath, backuptopath)
590  except os.error:
591  pass
592  ok = 0
593  try:
594  tofolder.setlast(None)
595  shutil.copy2(path, topath)
596  ok = 1
597  finally:
598  if not ok:
599  try:
600  os.unlink(topath)
601  except os.error:
602  pass
def createmessage (   self,
  n,
  txt 
)
Create a message, with text from the open file txt.

Definition at line 603 of file mhlib.py.

References Folder.getmessagefilename(), and aifc.open().

604  def createmessage(self, n, txt):
605  """Create a message, with text from the open file txt."""
606  path = self.getmessagefilename(n)
607  backuppath = self.getmessagefilename(',%d' % n)
608  try:
609  os.rename(path, backuppath)
610  except os.error:
611  pass
612  ok = 0
613  BUFSIZE = 16*1024
614  try:
615  f = open(path, "w")
616  while 1:
617  buf = txt.read(BUFSIZE)
618  if not buf:
619  break
620  f.write(buf)
621  f.close()
622  ok = 1
623  finally:
624  if not ok:
625  try:
626  os.unlink(path)
627  except os.error:
628  pass
def error (   self,
  args 
)
Error message handler.

Definition at line 255 of file mhlib.py.

256  def error(self, *args):
257  """Error message handler."""
258  apply(self.mh.error, args)
def getcurrent (   self)
Return the current message.  Raise Error when there is none.

Definition at line 333 of file mhlib.py.

References Folder.getsequences(), and sre_parse.max.

334  def getcurrent(self):
335  """Return the current message. Raise Error when there is none."""
336  seqs = self.getsequences()
337  try:
338  return max(seqs['cur'])
339  except (ValueError, KeyError):
340  raise Error, "no cur message"
def getfullname (   self)
Return the full pathname of the folder.

Definition at line 259 of file mhlib.py.

References Folder.name, MiniFieldStorage.name, and FieldStorage.name.

260  def getfullname(self):
261  """Return the full pathname of the folder."""
262  return os.path.join(self.mh.path, self.name)
def getlast (   self)
Return the last message number.

Definition at line 648 of file mhlib.py.

References Folder.last, BlockFinder.last, and Folder.listmessages().

649  def getlast(self):
650  """Return the last message number."""
651  if not hasattr(self, 'last'):
652  self.listmessages() # Set self.last
653  return self.last
def getmessagefilename (   self,
  n 
)
Return the full pathname of a message in the folder.

Definition at line 267 of file mhlib.py.

References Folder.getfullname(), and locale.str().

268  def getmessagefilename(self, n):
269  """Return the full pathname of a message in the folder."""
270  return os.path.join(self.getfullname(), str(n))
def getsequences (   self)
Return the set of sequences for the folder.

Definition at line 296 of file mhlib.py.

References MH.error(), Folder.error(), Folder.getsequencesfilename(), aifc.open(), and string.strip().

297  def getsequences(self):
298  """Return the set of sequences for the folder."""
299  sequences = {}
300  fullname = self.getsequencesfilename()
301  try:
302  f = open(fullname, 'r')
303  except IOError:
304  return sequences
305  while 1:
306  line = f.readline()
307  if not line: break
308  fields = line.split(':')
309  if len(fields) != 2:
310  self.error('bad sequence in %s: %s' %
311  (fullname, line.strip()))
312  key = fields[0].strip()
313  value = IntSet(fields[1].strip(), ' ').tolist()
314  sequences[key] = value
315  return sequences
def getsequencesfilename (   self)
Return the full pathname of the folder's sequences file.

Definition at line 263 of file mhlib.py.

References Folder.getfullname().

264  def getsequencesfilename(self):
265  """Return the full pathname of the folder's sequences file."""
266  return os.path.join(self.getfullname(), MH_SEQUENCES)
def listallsubfolders (   self)
Return list of all subfolders.

Definition at line 275 of file mhlib.py.

References Folder.name, MiniFieldStorage.name, and FieldStorage.name.

276  def listallsubfolders(self):
277  """Return list of all subfolders."""
278  return self.mh.listallsubfolders(self.name)
def listmessages (   self)
Return the list of messages currently present in the folder.
As a side effect, set self.last to the last message (or 0).

Definition at line 279 of file mhlib.py.

References reconvert.append, Folder.getfullname(), and pre.match().

280  def listmessages(self):
281  """Return the list of messages currently present in the folder.
282  As a side effect, set self.last to the last message (or 0)."""
283  messages = []
284  match = numericprog.match
285  append = messages.append
286  for name in os.listdir(self.getfullname()):
287  if match(name):
288  append(name)
289  messages = map(int, messages)
290  messages.sort()
291  if messages:
292  self.last = messages[-1]
293  else:
294  self.last = 0
295  return messages
def listsubfolders (   self)
Return list of direct subfolders.

Definition at line 271 of file mhlib.py.

References Folder.name, MiniFieldStorage.name, and FieldStorage.name.

272  def listsubfolders(self):
273  """Return list of direct subfolders."""
274  return self.mh.listsubfolders(self.name)
def movemessage (   self,
  n,
  tofolder,
  ton 
)
Move one message over a specific destination message,
which may or may not already exist.

Definition at line 545 of file mhlib.py.

References shutil.copy2(), Folder.getmessagefilename(), aifc.open(), and Folder.removefromallsequences().

546  def movemessage(self, n, tofolder, ton):
547  """Move one message over a specific destination message,
548  which may or may not already exist."""
549  path = self.getmessagefilename(n)
550  # Open it to check that it exists
551  f = open(path)
552  f.close()
553  del f
554  topath = tofolder.getmessagefilename(ton)
555  backuptopath = tofolder.getmessagefilename(',%d' % ton)
556  try:
557  os.rename(topath, backuptopath)
558  except os.error:
559  pass
560  try:
561  os.rename(path, topath)
562  except os.error:
563  # Try copying
564  ok = 0
565  try:
566  tofolder.setlast(None)
567  shutil.copy2(path, topath)
568  ok = 1
569  finally:
570  if not ok:
571  try:
572  os.unlink(topath)
573  except os.error:
574  pass
575  os.unlink(path)
576  self.removefromallsequences([n])
def openmessage (   self,
  n 
)
Open a message -- returns a Message object.

Definition at line 460 of file mhlib.py.

461  def openmessage(self, n):
462  """Open a message -- returns a Message object."""
463  return Message(self, n)
def parsesequence (   self,
  seq 
)
Parse an MH sequence specification into a message list.
Attempt to mimic mh-sequence(5) as close as possible.
Also attempt to mimic observed behavior regarding which
conditions cause which error messages.

Definition at line 345 of file mhlib.py.

References Folder._parseindex(), Folder.getcurrent(), Folder.getsequences(), mhlib.isnumeric(), Folder.listmessages(), sre_parse.max, Folder.name, MiniFieldStorage.name, and FieldStorage.name.

346  def parsesequence(self, seq):
347  """Parse an MH sequence specification into a message list.
348  Attempt to mimic mh-sequence(5) as close as possible.
349  Also attempt to mimic observed behavior regarding which
350  conditions cause which error messages."""
351  # XXX Still not complete (see mh-format(5)).
352  # Missing are:
353  # - 'prev', 'next' as count
354  # - Sequence-Negation option
355  all = self.listmessages()
356  # Observed behavior: test for empty folder is done first
357  if not all:
358  raise Error, "no messages in %s" % self.name
359  # Common case first: all is frequently the default
360  if seq == 'all':
361  return all
362  # Test for X:Y before X-Y because 'seq:-n' matches both
363  i = seq.find(':')
364  if i >= 0:
365  head, dir, tail = seq[:i], '', seq[i+1:]
366  if tail[:1] in '-+':
367  dir, tail = tail[:1], tail[1:]
368  if not isnumeric(tail):
369  raise Error, "bad message list %s" % seq
370  try:
371  count = int(tail)
372  except (ValueError, OverflowError):
373  # Can't use sys.maxint because of i+count below
374  count = len(all)
375  try:
376  anchor = self._parseindex(head, all)
377  except Error, msg:
378  seqs = self.getsequences()
379  if not seqs.has_key(head):
380  if not msg:
381  msg = "bad message list %s" % seq
382  raise Error, msg, sys.exc_info()[2]
383  msgs = seqs[head]
384  if not msgs:
385  raise Error, "sequence %s empty" % head
386  if dir == '-':
387  return msgs[-count:]
388  else:
389  return msgs[:count]
390  else:
391  if not dir:
392  if head in ('prev', 'last'):
393  dir = '-'
394  if dir == '-':
395  i = bisect(all, anchor)
396  return all[max(0, i-count):i]
397  else:
398  i = bisect(all, anchor-1)
399  return all[i:i+count]
400  # Test for X-Y next
401  i = seq.find('-')
402  if i >= 0:
403  begin = self._parseindex(seq[:i], all)
404  end = self._parseindex(seq[i+1:], all)
405  i = bisect(all, begin-1)
406  j = bisect(all, end)
407  r = all[i:j]
408  if not r:
409  raise Error, "bad message list %s" % seq
410  return r
411  # Neither X:Y nor X-Y; must be a number or a (pseudo-)sequence
412  try:
413  n = self._parseindex(seq, all)
414  except Error, msg:
415  seqs = self.getsequences()
416  if not seqs.has_key(seq):
417  if not msg:
418  msg = "bad message list %s" % seq
419  raise Error, msg
420  return seqs[seq]
421  else:
422  if n not in all:
423  if isnumeric(seq):
424  raise Error, "message %d doesn't exist" % n
425  else:
426  raise Error, "no %s message" % seq
427  else:
428  return [n]
def putsequences (   self,
  sequences 
)
Write the set of sequences back to the folder.

Definition at line 316 of file mhlib.py.

References Folder.getsequencesfilename(), and aifc.open().

317  def putsequences(self, sequences):
318  """Write the set of sequences back to the folder."""
319  fullname = self.getsequencesfilename()
320  f = None
321  for key in sequences.keys():
322  s = IntSet('', ' ')
323  s.fromlist(sequences[key])
324  if not f: f = open(fullname, 'w')
325  f.write('%s: %s\n' % (key, s.tostring()))
326  if not f:
327  try:
328  os.unlink(fullname)
329  except os.error:
330  pass
331  else:
332  f.close()
def refilemessages (   self,
  list,
  tofolder,
  keepsequences = 0 
)
Refile one or more messages -- may raise os.error.
'tofolder' is an open folder object.

Definition at line 489 of file mhlib.py.

References shutil.copy2(), Folder.getmessagefilename(), Folder.getsequences(), Folder.putsequences(), and Folder.removefromallsequences().

490  def refilemessages(self, list, tofolder, keepsequences=0):
491  """Refile one or more messages -- may raise os.error.
492  'tofolder' is an open folder object."""
493  errors = []
494  refiled = {}
495  for n in list:
496  ton = tofolder.getlast() + 1
497  path = self.getmessagefilename(n)
498  topath = tofolder.getmessagefilename(ton)
499  try:
500  os.rename(path, topath)
501  except os.error:
502  # Try copying
503  try:
504  shutil.copy2(path, topath)
505  os.unlink(path)
506  except (IOError, os.error), msg:
507  errors.append(msg)
508  try:
509  os.unlink(topath)
510  except os.error:
511  pass
512  continue
513  tofolder.setlast(ton)
514  refiled[n] = ton
515  if refiled:
516  if keepsequences:
517  tofolder._copysequences(self, refiled.items())
518  self.removefromallsequences(refiled.keys())
519  if errors:
520  if len(errors) == 1:
521  raise os.error, errors[0]
522  else:
523  raise os.error, ('multiple errors:', errors)
def removefromallsequences (   self,
  list 
)
Remove one or more messages from all sequences (including last)
-- but not from 'cur'!!!

Definition at line 629 of file mhlib.py.

References Folder.getsequences(), Folder.last, BlockFinder.last, and Folder.putsequences().

630  def removefromallsequences(self, list):
631  """Remove one or more messages from all sequences (including last)
632  -- but not from 'cur'!!!"""
633  if hasattr(self, 'last') and self.last in list:
634  del self.last
635  sequences = self.getsequences()
636  changed = 0
637  for name, seq in sequences.items():
638  if name == 'cur':
639  continue
640  for n in list:
641  if n in seq:
642  seq.remove(n)
643  changed = 1
644  if not seq:
645  del sequences[name]
646  if changed:
647  self.putsequences(sequences)
def removemessages (   self,
  list 
)
Remove one or more messages -- may raise os.error.

Definition at line 464 of file mhlib.py.

References Folder.getmessagefilename(), Folder.removefromallsequences(), and locale.str().

465  def removemessages(self, list):
466  """Remove one or more messages -- may raise os.error."""
467  errors = []
468  deleted = []
469  for n in list:
470  path = self.getmessagefilename(n)
471  commapath = self.getmessagefilename(',' + str(n))
472  try:
473  os.unlink(commapath)
474  except os.error:
475  pass
476  try:
477  os.rename(path, commapath)
478  except os.error, msg:
479  errors.append(msg)
480  else:
481  deleted.append(n)
482  if deleted:
483  self.removefromallsequences(deleted)
484  if errors:
485  if len(errors) == 1:
486  raise os.error, errors[0]
487  else:
488  raise os.error, ('multiple errors:', errors)
def setcurrent (   self,
  n 
)
Set the current message.

Definition at line 341 of file mhlib.py.

References Folder.getsequencesfilename(), locale.str(), and mhlib.updateline().

342  def setcurrent(self, n):
343  """Set the current message."""
344  updateline(self.getsequencesfilename(), 'cur', str(n), 0)
def setlast (   self,
  last 
)
Set the last message number.

Definition at line 654 of file mhlib.py.

References Folder.last, and BlockFinder.last.

655  def setlast(self, last):
656  """Set the last message number."""
657  if last is None:
658  if hasattr(self, 'last'):
659  del self.last
660  else:
661  self.last = last

Field Documentation

last

Definition at line 291 of file mhlib.py.

mh

Definition at line 246 of file mhlib.py.

name

Definition at line 247 of file mhlib.py.


The documentation for this class was generated from the following file: