[Pymoul-svn] SF.net SVN: pymoul: [102] pymoul/trunk/src/moul
Status: Alpha
Brought to you by:
tiran
|
From: <ti...@us...> - 2007-01-30 16:43:56
|
Revision: 102
http://pymoul.svn.sourceforge.net/pymoul/?rev=102&view=rev
Author: tiran
Date: 2007-01-30 08:43:51 -0800 (Tue, 30 Jan 2007)
Log Message:
-----------
Disabled moulcli
Added chatview and directoryview
Modified Paths:
--------------
pymoul/trunk/src/moul/cli/moullauncher.py
pymoul/trunk/src/moul/file/chatlog.py
pymoul/trunk/src/moul/file/tests/test_plasmalog.py
pymoul/trunk/src/moul/qt/ui/mainwindow.py
Modified: pymoul/trunk/src/moul/cli/moullauncher.py
===================================================================
--- pymoul/trunk/src/moul/cli/moullauncher.py 2007-01-30 14:39:03 UTC (rev 101)
+++ pymoul/trunk/src/moul/cli/moullauncher.py 2007-01-30 16:43:51 UTC (rev 102)
@@ -102,5 +102,5 @@
ml()
if __name__ == '__main__':
- main(sys.argv)
-
+ #main(sys.argv)
+ raise NotImplementedError("Moul Launcher disabled!")
Modified: pymoul/trunk/src/moul/file/chatlog.py
===================================================================
--- pymoul/trunk/src/moul/file/chatlog.py 2007-01-30 14:39:03 UTC (rev 101)
+++ pymoul/trunk/src/moul/file/chatlog.py 2007-01-30 16:43:51 UTC (rev 102)
@@ -41,28 +41,40 @@
from moul.log import getLogger
+RE_FLAGS = re.LOCALE
CHAT_RE = re.compile(
r"^\((?P<M>\d{1,2})/(?P<D>\d{1,2})\ " # MM/DD
r"(?P<h>\d{1,2}):(?P<m>\d\d{1,2}):(?P<s>\d{1,2})\)" # hh:mm:ss
- r"(?P<space>\ {1,2})(?P<msg>.*)$") # text
+ r"(?P<space>\s{1,2})(?P<msg>.*)$", # text
+ RE_FLAGS)
+CHAT_SIMPLE_RE = re.compile(
+ r"^\((?P<date>[\d/]*)\ (?P<time>[\d:]*)\)" # (date time)
+ r"(?P<space>\s{1,2})" # spaces
+ r"(?P<msg>.*)$", # message
+ RE_FLAGS)
CHATLOG_STARTED = "Chat.log started..."
CHATLOG_STOPPED = "...Chat.log stopped."
-TEXT_MSGFROM = re.compile(
- r"From (?P<user>.*) in (?P<location>.*): (?P<msg>.*)"
+TEXT_MSGFROM_RE = re.compile(
# From USER in LOCATION: msg
+ r"From (?P<user>.*) in (?P<location>.*): (?P<msg>.*)",
+ RE_FLAGS)
+TEXT_MSGTO_RE = re.compile(
+ r"To (?P<user>.*): (?P<msg>.*)", # From USER in LOCATION: msg
+ RE_FLAGS)
+TEXT_ERROR_RE = re.compile(
+ r"Error: (?P<msg>.*)", # Error: message
+ RE_FLAGS)
+TEXT_RE = re.compile(
+ r"(?P<user>.*): (?P<msg>.*)", # User: message
+ RE_FLAGS)
+CHATLOG_DATE_FNAME_RE = re.compile(
+ r"chatlog_(?P<Y>\d{4})(?P<M>\d{2})(?P<D>\d{2})_" # chatlog_YYMMDD_
+ r"(?P<ch>\d{2})(?P<cm>\d{2})_(?P<sh>\d{2})(?P<sm>\d{2})\.txt", # hhmm_hhmm.txt
+ RE_FLAGS
)
-TEXT_MSGTO = re.compile(
- r"To (?P<user>.*): (?P<msg>.*)"
- # From USER in LOCATION: msg
- )
-TEXT_ERROR = re.compile(
- r"Error: (?P<msg>.*)"
- # Error: message
- )
-TEXT = re.compile(
- r"(?P<user>.*): (?P<msg>.*)"
- # User: message
- )
+#CHATLOG_FNAME_RE = re.compile(
+# r"[cC]hat.*\.log", # chat*.log
+# RE_FLAGS)
LOG = getLogger('moul.chat')
@@ -162,3 +174,95 @@
def __call__(self):
self.findLogs()
self.moveChatlogs()
+
+class ChatlogDirectoryView(object):
+ """A view of a chat log directory
+
+ Lists all chat logs in the directory
+ """
+ def __init__(self, logdir):
+ self._logdir = logdir
+ self._logfiles = [] # list of ChatlogViews
+
+ if not os.path.isdir(logdir):
+ LOG.critical("%s is not a directory" % logdir)
+ self._findChatlogs()
+
+ def _findChatlogs(self):
+ """Find chat logs in logdir directory
+ """
+ for name in os.listdir(self._logdir):
+ fname = os.path.join(self._logdir, name)
+ if not os.path.isfile(fname):
+ continue
+ chatlog = ChatlogView(fname)
+ if chatlog.date is not None:
+ self._logfiles.append(chatlog)
+
+ @property
+ def names(self):
+ return [clv.name for clv in self]
+
+ def __iter__(self):
+ return iter(self._logfiles)
+
+class ChatlogView(object):
+ """A view of a single chat log file
+ """
+
+ def __init__(self, fname):
+ self._fname = fname
+ self._name = os.path.basename(fname)
+ self._opened = False
+
+ self._parsed = None
+ self._fd = None
+ self._date = None
+
+ if not os.path.isfile(fname):
+ LOG.critical("%s is not a file" % fname)
+
+ @property
+ def name(self):
+ """Plain file name
+ """
+ return self._name
+
+ @property
+ def date(self):
+ """Date
+ """
+ if self._date:
+ return self._date
+ mo = CHATLOG_DATE_FNAME_RE.match(self.name)
+ if not mo:
+ # urks
+ return None
+ d = mo.groupdict()
+ self._date = d
+ return d
+
+ def open(self):
+ """Open fhe file
+ """
+ if not self._opened:
+ self._fd = open(self._fname, 'r')
+ self._opened = True
+
+ def close(self):
+ """Close the file
+ """
+ if self._opened:
+ self._fd.close()
+ self._fd = None
+ self._parsed = None
+ self._opened = False
+
+ def view(self):
+ """View the file
+
+ Returns an iterator which iterates over the lines of the file
+ """
+ self.open()
+ # TODO: add parser, currently simply iterates over the file
+ return iter(self._fd)
Modified: pymoul/trunk/src/moul/file/tests/test_plasmalog.py
===================================================================
--- pymoul/trunk/src/moul/file/tests/test_plasmalog.py 2007-01-30 14:39:03 UTC (rev 101)
+++ pymoul/trunk/src/moul/file/tests/test_plasmalog.py 2007-01-30 16:43:51 UTC (rev 102)
@@ -30,6 +30,8 @@
from moul.file.plasmalog import PlasmalogZipper
from moul.file.chatlog import ChatlogMover
+from moul.file.chatlog import ChatlogDirectoryView
+from moul.file.chatlog import ChatlogView
from moul.file.kiimage import KIImageFixer
from moul.file.kiimage import KIImage
@@ -124,7 +126,17 @@
self.failUnless(c.startswith("chatlog_"))
self.failUnless(c.endswith(".txt"))
self.failUnlessEqual(len(c), length, c)
+
+ def test_chatlogview(self):
+ clm = ChatlogMover(self._logdir, self._chatdest)
+ clm.findLogs()
+ clm.moveChatlogs()
+ cdv = ChatlogDirectoryView(self._chatdest)
+ names = cdv.names
+ self.failUnlessEqual(len(names), 1, names)
+ self.failUnless(names[0].startswith("chatlog_"))
+
def test_kiImageMover(self):
kif = KIImageFixer(self._kidir, self._kidest)
self.failUnless(os.path.isdir(self._kidest), self._kidest)
Modified: pymoul/trunk/src/moul/qt/ui/mainwindow.py
===================================================================
--- pymoul/trunk/src/moul/qt/ui/mainwindow.py 2007-01-30 14:39:03 UTC (rev 101)
+++ pymoul/trunk/src/moul/qt/ui/mainwindow.py 2007-01-30 16:43:51 UTC (rev 102)
@@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'src/moul/qt/ui/mainwindow.ui'
#
-# Created: Tue Jan 30 15:36:49 2007
+# Created: Tue Jan 30 17:23:46 2007
# by: PyQt4 UI code generator 4.1.1
#
# WARNING! All changes made in this file will be lost!
@@ -849,7 +849,7 @@
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
- self.tabwidget.setCurrentIndex(4)
+ self.tabwidget.setCurrentIndex(0)
self.tab_sub_settings.setCurrentIndex(0)
self.tabWidget.setCurrentIndex(0)
QtCore.QObject.connect(self.main_buttonbox,QtCore.SIGNAL("rejected()"),MainWindow.close)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|