コード例 #1
0
    def setUp(self):
        self.env = EnvironmentStub()
        self.out = FileIRCLogProvider(self.env)
        self.chmgr = IRCChannelManager(self.env)
        self.supylines = (
            '2008-05-03T02:28:19  <rcorsaro> will it work if I install it?',
            '2008-05-03T02:30:22  <dgynn> ok.  i copied it over',
            '2008-05-03T02:30:25  *** dgynn has left #etf',
            '2008-05-03T02:30:26  *** dgynn has joined #etf',
            '2008-05-03T02:30:27  *** dgynn has quit IRC',
            '2008-05-03T02:31:27  * cbalan feels lonely...',
            '2008-05-03T02:32:27  * rcorsaro nods',
            '2008-05-03T02:33:27  *** vmiliano was kicked by dgynn (dgynn)',
            '2008-05-03T02:34:27  *** rcorsaro sets mode: +o cbalan',
            '2008-05-03T02:35:27  *** dgynn changes topic to "Enterprise Tools and Frameworks"',
            '2008-05-03T02:36:27  *** rcorsaro is now known as bobby-robert',
            '2008-05-03T02:37:27  -rcorsaro- hello there',
            '2008-08-15T02:37:27  -rcorsaro- goodbye there',
            '* SOME SPECIAL MESSAGE *',
        )

        self.simplegozerlines = (
            '2009-07-03 22:18:00 | <rcorsaro> !chatlog-on',
            '2009-07-03 22:19:00 | <gozerbot> chatlog enabled on (default,#test2)',
            '2009-07-03 22:20:00 | gozerbot ([email protected]) has left',
            '2009-07-03 22:21:00 | gozerbot ([email protected]) has joined',
            '2009-07-03 22:22:00 | rcorsaro ([email protected]) has quit: Quit: leaving',
            '2009-07-03 22:23:00 | * rcorsaro2 is strong',
            '2009-07-03 22:24:00 | * rcorsaro feels strange',
            '2009-07-03 22:25:00 | gozerbot was kicked by rcorsaro2 (rcorsaro2)',
            '2009-07-03 22:26:00 | rcorsaro2 sets mode: -o gozerbot',
            '2009-07-03 22:27:00 | rcorsaro2 changes topic to "testing topic"',
            '2009-07-03 22:28:00 | rcorsaro ([email protected]) is now known as rcorsaro2',
            '2009-07-03 22:29:00 | -rcorsaro- hello there',
            '* SOME SPECIAL MESSAGE *',
        )

        # supybot emulation on gozerbot
        self.supygozerlines = (
            '2009-07-03T22:18:00  <gozerbot> chatlog enabled on (default,#test2)',
            '2009-07-03T22:19:00  <rcorsaro> hello',
            '2009-07-03T22:20:00  *** rcorsaro_ ([email protected]) has left',
            '2009-07-03T22:21:00  *** rcorsaro_ ([email protected]) has joined',
            '2009-07-03T22:22:00  *** rcorsaro_ ([email protected]) has quit: Quit: leaving',
            '2009-07-03T22:23:00  * rcorsaro is strong',
            '2009-07-03T22:24:00  * rcorsaro is manly',
            '2009-07-03T22:25:00  *** rcorsaro_ was kicked by rcorsaro (rcorsaro)',
            '2009-07-03T22:26:00  *** rcorsaro sets mode: +o rcorsaro_',
            '2009-07-03T22:27:00  *** rcorsaro changes topic to "testing topic"',
            '2009-07-03T22:28:00  *** lsjdf ([email protected]) is now known as rcorsaro2',
            '2009-07-03T22:29:00  -rcorsaro- hello there',
            '* SOME SPECIAL MESSAGE *',
        )
コード例 #2
0
ファイル: wiki.py プロジェクト: dokipen/trac-irclogs-plugin
 def _format_link(self, formatter, ns, target, label):
    m = self.date_re.match(target)
    if not m:
        return system_message('Invalid IRC Log Link: '
                  'Must be of the format channel-UTCYYYY-MM-DDTHH:MM:SS %s')
    if not m.group('datetime'):
        return html.a(label, title=label, href=formatter.href.irclogs(
            m.group('channel')))
    else:
        ch_mgr = IRCChannelManager(self.env)
        t = strptime(m.group('datetime'), self.date_format)
        dt = UTC.localize(datetime(*t[:6]))
        dt = ch_mgr.to_user_tz(formatter.req, dt)
        timestr = dt.strftime(self.time_format)
        return html.a(label, title=label, href=formatter.href.irclogs(
                  m.group('channel'), '%02d'%dt.year, '%02d'%dt.month, 
                  '%02d'%dt.day,) + '#%s'%timestr)
コード例 #3
0
ファイル: macros.py プロジェクト: dokipen/trac-irclogs-plugin
    def expand_macro(self, formatter, name, content):
        _, kw = parse_args(content)
        channel_name = kw.get('channel')
        utc_dt = kw.get('datetime')
        if not utc_dt:
            return system_message('IrcLogQuote: arguments required '\
                '(channel=channel, datetime=timestamp(UTCYYYY-MM-DDTHH:MM:SS), '\
                'offset=seonds)')
        d = self.date_re.match(utc_dt.strip())
        if not d:
            return system_message('IrcLogQuote: Invalid timestamp format')
        offset = int(kw.get('offset', 10))

        irclogs = IrcLogsView(self.env)        
        ch_mgr = IRCChannelManager(self.env)
        start = datetime(*strptime(utc_dt, self.date_format)[:6])
        start = UTC.localize(start)
        start = ch_mgr.to_user_tz(formatter.req, start)
        end = start + timedelta(seconds=offset)
        channel = ch_mgr.channel(channel_name)
        formatter.req.perm.assert_permission(channel.perm())
        lines = channel.events_in_range(start, end)
        lines = filter(lambda x: not x.get('hidden'), 
                map(irclogs._map_lines, lines))
        rows = map(irclogs._render_line, lines)

        add_stylesheet(formatter.req, 'irclogs/css/irclogs.css')
        data = Chrome(self.env).populate_data(
            formatter.req, 
            {
                'channel': channel_name,
                'lines': lines,
                'year': '%04d'%(start.year),
                'month': '%02d'%(start.month),
                'day': '%02d'%(start.day),
                'time': start.strftime("%H:%M:%S"),
                'rows': rows
            }
        )
        return Chrome(self.env).load_template('macro_quote.html') \
                                    .generate(**data)
コード例 #4
0
ファイル: macros.py プロジェクト: pombredanne/trachacks
    def expand_macro(self, formatter, name, content):
        _, kw = parse_args(content)
        channel_name = kw.get('channel')
        utc_dt = kw.get('datetime')
        if not utc_dt:
            return system_message('IrcLogQuote: arguments required '\
                '(channel=channel, datetime=timestamp(UTCYYYY-MM-DDTHH:MM:SS), '\
                'offset=seonds)')
        d = self.date_re.match(utc_dt.strip())
        if not d:
            return system_message('IrcLogQuote: Invalid timestamp format')
        offset = int(kw.get('offset', 10))

        irclogs = IrcLogsView(self.env)
        ch_mgr = IRCChannelManager(self.env)
        start = datetime(*strptime(utc_dt, self.date_format)[:6])
        start = UTC.localize(start)
        start = ch_mgr.to_user_tz(formatter.req, start)
        end = start + timedelta(seconds=offset)
        channel = ch_mgr.channel(channel_name)
        formatter.req.perm.assert_permission(channel.perm())
        lines = channel.events_in_range(start, end)
        lines = filter(lambda x: not x.get('hidden'),
                       map(irclogs._map_lines, lines))
        rows = map(irclogs._render_line, lines)

        add_stylesheet(formatter.req, 'irclogs/css/irclogs.css')
        data = Chrome(self.env).populate_data(
            formatter.req, {
                'channel': channel_name,
                'lines': lines,
                'year': '%04d' % (start.year),
                'month': '%02d' % (start.month),
                'day': '%02d' % (start.day),
                'time': start.strftime("%H:%M:%S"),
                'rows': rows
            })
        return Chrome(self.env).load_template('macro_quote.html') \
                                    .generate(**data)
コード例 #5
0
ファイル: wiki.py プロジェクト: pombredanne/trachacks
 def _format_link(self, formatter, ns, target, label):
     m = self.date_re.match(target)
     if not m:
         return system_message(
             'Invalid IRC Log Link: '
             'Must be of the format channel-UTCYYYY-MM-DDTHH:MM:SS %s')
     if not m.group('datetime'):
         return html.a(label,
                       title=label,
                       href=formatter.href.irclogs(m.group('channel')))
     else:
         ch_mgr = IRCChannelManager(self.env)
         t = strptime(m.group('datetime'), self.date_format)
         dt = UTC.localize(datetime(*t[:6]))
         dt = ch_mgr.to_user_tz(formatter.req, dt)
         timestr = dt.strftime(self.time_format)
         return html.a(label,
                       title=label,
                       href=formatter.href.irclogs(
                           m.group('channel'),
                           '%02d' % dt.year,
                           '%02d' % dt.month,
                           '%02d' % dt.day,
                       ) + '#%s' % timestr)
コード例 #6
0
ファイル: api.py プロジェクト: dokipen/trac-irclogs-plugin
    def setUp(self):
        self.env = EnvironmentStub()
        self.config = self.env.config

        self.config.set('irclogs', 'provider', 'file1')
        self.config.set('irclogs', 'channel', '#test1')
        self.config.set('irclogs', 'network', 'network1')

        self.config.set('irclogs', 'channel.test2.channel', '#test2')
        self.config.set('irclogs', 'channel.test2.provider', 'file2')
        self.config.set('irclogs', 'channel.test2.network', 'network2')

        self.config.set('irclogs', 'channel.test3.channel', '#test3')

        self.config.set('irclogs', 'channel.test4.blah', 'blah')
        self.out = IRCChannelManager(self.env)
コード例 #7
0
ファイル: search.py プロジェクト: pombredanne/trachacks
    def setUp(self):
        self.indexdir = os.tempnam()
        self.env = EnvironmentStub()
        self.config = self.env.config
        self.config.set('irclogs', 'search_db_path', self.indexdir)
        self.config.set('irclogs', 'last_index', None)
        self.chmgr = IRCChannelManager(self.env)

        def events(start, end):
            self.assertTrue(start < end)
            self.dt = start
            dt = self.dt
            delta = timedelta(seconds=1)
            for i in range(0, 20):
                yield {
                    'timestamp': dt,
                    'network': u'freenode',
                    'channel': u'#trac',
                    'nick': u'doki_pen',
                    'type': u'comment',
                    'comment': u'hello %d' % i
                }
                dt += delta

        def fake_channels():
            obj = IRCChannel(self.env)
            obj.events_in_range = events
            yield obj

        def fake_channel(name):
            obj = IRCChannel(self.env)
            obj.events_in_range = events
            return obj

        self.chmgr.channels = fake_channels
        self.chmgr.channel = fake_channel
        self.out = WhooshIrcLogsIndex(self.env)
コード例 #8
0
    def get_events_in_range(self, ch, start, end):
        global ENCODED_FIELDS

        ch_mgr = IRCChannelManager(self.env)
        self.log.debug(ch.settings())
        def_tzname = self.config.get('irclogs', 'timezone', 'utc')
        tzname = ch.setting('timezone', def_tzname)
        try:
            tz = timezone(tzname)
        except UnknownTimeZoneError:
            self.log.warn("input timezone %s not supported, irclogs will be "\
                    "parsed as UTC")
            tzname = 'UTC'
            tz = timezone(tzname)
        cnx = self._getdb(ch)
        try:
            ttz = timezone(start.tzname())
        except UnknownTimeZoneError:
            self.log.warn("timezone %s not supported, irclog output will be "\
                    "%s"%(start.tzname(), tzname))
            ttz = tz

        try:
            self.log.debug("""executing
              SELECT * FROM chatlog 
              WHERE network = %s AND target = %s AND time >= %s AND
                time < %s ORDER BY "time" """)
            self.log.debug("with %s, %s, %s, %s" %
                           (ch.network() or '', ch.channel(), start, end))
            cur = cnx.cursor()
            cur.execute(
                """
              SELECT * FROM chatlog 
              WHERE network = %s AND target = %s AND time >= %s AND
                time < %s ORDER BY "time" """,
                (ch.network() or '', ch.channel(), start, end))
            ignore_charset = False
            for l in cur:
                timestamp = l[1]
                timestamp = tz.localize(timestamp)
                dt = ttz.normalize(timestamp.astimezone(ttz))
                line = {
                    'timestamp': dt,
                    'network': l[2],
                    'channel': l[3],
                    'nick': l[4],
                    'type': l[5],
                    'message': l[6],
                    'comment': l[6],
                    'action': l[6].lstrip('* ')
                }
                ignore_charset = ignore_charset or isinstance(
                    line['message'], unicode)
                if (not ignore_charset) and ch.setting('charset'):
                    for k in ENCODED_FIELDS:
                        line[k] = unicode(line[k],
                                          ch.setting('charset'),
                                          errors='ignore')
                        continue
                yield line
            cnx.close()
        except Exception, e:
            cnx.close()
            self.log.error(e)
            raise e
コード例 #9
0
class FileIRCLogProviderTestCase(unittest.TestCase):
    def setUp(self):
        self.env = EnvironmentStub()
        self.out = FileIRCLogProvider(self.env)
        self.chmgr = IRCChannelManager(self.env)
        self.supylines = (
            '2008-05-03T02:28:19  <rcorsaro> will it work if I install it?',
            '2008-05-03T02:30:22  <dgynn> ok.  i copied it over',
            '2008-05-03T02:30:25  *** dgynn has left #etf',
            '2008-05-03T02:30:26  *** dgynn has joined #etf',
            '2008-05-03T02:30:27  *** dgynn has quit IRC',
            '2008-05-03T02:31:27  * cbalan feels lonely...',
            '2008-05-03T02:32:27  * rcorsaro nods',
            '2008-05-03T02:33:27  *** vmiliano was kicked by dgynn (dgynn)',
            '2008-05-03T02:34:27  *** rcorsaro sets mode: +o cbalan',
            '2008-05-03T02:35:27  *** dgynn changes topic to "Enterprise Tools and Frameworks"',
            '2008-05-03T02:36:27  *** rcorsaro is now known as bobby-robert',
            '2008-05-03T02:37:27  -rcorsaro- hello there',
            '2008-08-15T02:37:27  -rcorsaro- goodbye there',
            '* SOME SPECIAL MESSAGE *',
        )

        self.simplegozerlines = (
            '2009-07-03 22:18:00 | <rcorsaro> !chatlog-on',
            '2009-07-03 22:19:00 | <gozerbot> chatlog enabled on (default,#test2)',
            '2009-07-03 22:20:00 | gozerbot ([email protected]) has left',
            '2009-07-03 22:21:00 | gozerbot ([email protected]) has joined',
            '2009-07-03 22:22:00 | rcorsaro ([email protected]) has quit: Quit: leaving',
            '2009-07-03 22:23:00 | * rcorsaro2 is strong',
            '2009-07-03 22:24:00 | * rcorsaro feels strange',
            '2009-07-03 22:25:00 | gozerbot was kicked by rcorsaro2 (rcorsaro2)',
            '2009-07-03 22:26:00 | rcorsaro2 sets mode: -o gozerbot',
            '2009-07-03 22:27:00 | rcorsaro2 changes topic to "testing topic"',
            '2009-07-03 22:28:00 | rcorsaro ([email protected]) is now known as rcorsaro2',
            '2009-07-03 22:29:00 | -rcorsaro- hello there',
            '* SOME SPECIAL MESSAGE *',
        )

        # supybot emulation on gozerbot
        self.supygozerlines = (
            '2009-07-03T22:18:00  <gozerbot> chatlog enabled on (default,#test2)',
            '2009-07-03T22:19:00  <rcorsaro> hello',
            '2009-07-03T22:20:00  *** rcorsaro_ ([email protected]) has left',
            '2009-07-03T22:21:00  *** rcorsaro_ ([email protected]) has joined',
            '2009-07-03T22:22:00  *** rcorsaro_ ([email protected]) has quit: Quit: leaving',
            '2009-07-03T22:23:00  * rcorsaro is strong',
            '2009-07-03T22:24:00  * rcorsaro is manly',
            '2009-07-03T22:25:00  *** rcorsaro_ was kicked by rcorsaro (rcorsaro)',
            '2009-07-03T22:26:00  *** rcorsaro sets mode: +o rcorsaro_',
            '2009-07-03T22:27:00  *** rcorsaro changes topic to "testing topic"',
            '2009-07-03T22:28:00  *** lsjdf ([email protected]) is now known as rcorsaro2',
            '2009-07-03T22:29:00  -rcorsaro- hello there',
            '* SOME SPECIAL MESSAGE *',
        )

    def test_target_tz(self):
        tz = 'America/New_York'
        tzo = timezone(tz)
        results = [
            i for i in self.out.parse_lines(
                self.supylines, self.chmgr.channel(None), target_tz=tzo)
        ]

        self.assertEquals(self._date('20080502222819', tz),
                          results[0]['timestamp'])
        self.assertEquals(self._date("20080502223022", tz),
                          results[1]['timestamp'])
        self.assertEquals(self._date("20080502223025", tz),
                          results[2]['timestamp'])
        self.assertEquals(self._date("20080502223026", tz),
                          results[3]['timestamp'])
        self.assertEquals(self._date("20080502223027", tz),
                          results[4]['timestamp'])
        self.assertEquals(self._date("20080502223127", tz),
                          results[5]['timestamp'])
        self.assertEquals(self._date("20080502223227", tz),
                          results[6]['timestamp'])
        self.assertEquals(self._date("20080502223327", tz),
                          results[7]['timestamp'])
        self.assertEquals(self._date("20080502223427", tz),
                          results[8]['timestamp'])
        self.assertEquals(self._date("20080502223527", tz),
                          results[9]['timestamp'])
        self.assertEquals(self._date("20080502223627", tz),
                          results[10]['timestamp'])
        self.assertEquals(self._date("20080502223727", tz),
                          results[11]['timestamp'])
        self.assertEquals(self._date("20080502223727", tz),
                          results[11]['timestamp'])

    def _date(self, d, tz='UTC'):
        t = strptime(d, "%Y%m%d%H%M%S")
        tz = timezone(tz)
        dt = tz.localize(datetime(*t[:6]))
        return dt

    def test_parse_supybot(self):
        f = self.chmgr.channel(None)
        results = [i for i in self.out.parse_lines(self.supylines, f)]

        self.assertEquals('comment', results[0]['type'])
        self.assertEquals(self._date("20080503022819"),
                          results[0]['timestamp'])
        self.assertEquals('<rcorsaro> will it work if I install it?',
                          results[0]['message'])
        self.assertEquals('rcorsaro', results[0]['nick'])
        self.assertEquals('will it work if I install it?',
                          results[0]['comment'])

        self.assertEquals('comment', results[1]['type'])
        self.assertEquals(self._date("20080503023022"),
                          results[1]['timestamp'])
        self.assertEquals('<dgynn> ok.  i copied it over',
                          results[1]['message'])
        self.assertEquals('dgynn', results[1]['nick'])
        self.assertEquals('ok.  i copied it over', results[1]['comment'])

        self.assertEquals('part', results[2]['type'])
        self.assertEquals(self._date("20080503023025"),
                          results[2]['timestamp'])
        self.assertEquals('*** dgynn has left #etf', results[2]['message'])
        self.assertEquals('dgynn', results[2]['nick'])

        self.assertEquals('join', results[3]['type'])
        self.assertEquals(self._date("20080503023026"),
                          results[3]['timestamp'])
        self.assertEquals('*** dgynn has joined #etf', results[3]['message'])
        self.assertEquals('dgynn', results[3]['nick'])

        self.assertEquals('quit', results[4]['type'])
        self.assertEquals(self._date("20080503023027"),
                          results[4]['timestamp'])
        self.assertEquals('*** dgynn has quit IRC', results[4]['message'])
        self.assertEquals('dgynn', results[4]['nick'])

        self.assertEquals('action', results[5]['type'])
        self.assertEquals(self._date("20080503023127"),
                          results[5]['timestamp'])
        self.assertEquals('* cbalan feels lonely...', results[5]['message'])
        self.assertEquals('cbalan', results[5]['nick'])
        self.assertEquals('feels lonely...', results[5]['action'])

        self.assertEquals('action', results[6]['type'])
        self.assertEquals(self._date("20080503023227"),
                          results[6]['timestamp'])
        self.assertEquals('* rcorsaro nods', results[6]['message'])
        self.assertEquals('rcorsaro', results[6]['nick'])
        self.assertEquals('nods', results[6]['action'])

        self.assertEquals('kick', results[7]['type'])
        self.assertEquals(self._date("20080503023327"),
                          results[7]['timestamp'])
        self.assertEquals('*** vmiliano was kicked by dgynn (dgynn)',
                          results[7]['message'])
        self.assertEquals('dgynn', results[7]['nick'])
        self.assertEquals('vmiliano', results[7]['kicked'])

        self.assertEquals('mode', results[8]['type'])
        self.assertEquals(self._date("20080503023427"),
                          results[8]['timestamp'])
        self.assertEquals('*** rcorsaro sets mode: +o cbalan',
                          results[8]['message'])
        self.assertEquals('rcorsaro', results[8]['nick'])
        self.assertEquals('+o cbalan', results[8]['mode'])

        self.assertEquals('topic', results[9]['type'])
        self.assertEquals(self._date("20080503023527"),
                          results[9]['timestamp'])
        self.assertEquals(
            '*** dgynn changes topic to "Enterprise Tools and Frameworks"',
            results[9]['message'])
        self.assertEquals('dgynn', results[9]['nick'])
        self.assertEquals('Enterprise Tools and Frameworks',
                          results[9]['topic'])

        self.assertEquals('nick', results[10]['type'])
        self.assertEquals(self._date("20080503023627"),
                          results[10]['timestamp'])
        self.assertEquals('*** rcorsaro is now known as bobby-robert',
                          results[10]['message'])
        self.assertEquals('rcorsaro', results[10]['nick'])
        self.assertEquals('bobby-robert', results[10]['newnick'])

        self.assertEquals('notice', results[11]['type'])
        self.assertEquals(self._date("20080503023727"),
                          results[11]['timestamp'])
        self.assertEquals('-rcorsaro- hello there', results[11]['message'])
        self.assertEquals('rcorsaro', results[11]['nick'])
        self.assertEquals('hello there', results[11]['comment'])

        self.assertEquals('other', results[13]['type'])
        self.assertEquals('* SOME SPECIAL MESSAGE *', results[13]['message'])

    def test_parse_simple_gozerbot(self):
        self.out.config.set('irclogs', 'channel.test.format', 'gozer')
        f = self.chmgr.channel('test')
        results = [i for i in self.out.parse_lines(self.simplegozerlines, f)]

        self.assertEquals('comment', results[0]['type'])
        self.assertEquals(self._date("20090703221800"),
                          results[0]['timestamp'])
        self.assertEquals('<rcorsaro> !chatlog-on', results[0]['message'])
        self.assertEquals('rcorsaro', results[0]['nick'])
        self.assertEquals('!chatlog-on', results[0]['comment'])

        self.assertEquals('comment', results[1]['type'])
        self.assertEquals(self._date("20090703221900"),
                          results[1]['timestamp'])
        self.assertEquals('<gozerbot> chatlog enabled on (default,#test2)',
                          results[1]['message'])
        self.assertEquals('gozerbot', results[1]['nick'])
        self.assertEquals('chatlog enabled on (default,#test2)',
                          results[1]['comment'])

        self.assertEquals('part', results[2]['type'])
        self.assertEquals(self._date("20090703222000"),
                          results[2]['timestamp'])
        self.assertEquals(
            'gozerbot ([email protected]) has left',
            results[2]['message'])
        self.assertEquals('gozerbot', results[2]['nick'])

        self.assertEquals('join', results[3]['type'])
        self.assertEquals(self._date("20090703222100"),
                          results[3]['timestamp'])
        self.assertEquals(
            'gozerbot ([email protected]) has joined',
            results[3]['message'])
        self.assertEquals('gozerbot', results[3]['nick'])

        self.assertEquals('quit', results[4]['type'])
        self.assertEquals(self._date("20090703222200"),
                          results[4]['timestamp'])
        self.assertEquals(
            'rcorsaro ([email protected]) has quit: Quit: leaving',
            results[4]['message'])
        self.assertEquals('rcorsaro', results[4]['nick'])

        self.assertEquals('action', results[5]['type'])
        self.assertEquals(self._date("20090703222300"),
                          results[5]['timestamp'])
        self.assertEquals('* rcorsaro2 is strong', results[5]['message'])
        self.assertEquals('rcorsaro2', results[5]['nick'])
        self.assertEquals('is strong', results[5]['action'])

        self.assertEquals('action', results[6]['type'])
        self.assertEquals(self._date("20090703222400"),
                          results[6]['timestamp'])
        self.assertEquals('* rcorsaro feels strange', results[6]['message'])
        self.assertEquals('rcorsaro', results[6]['nick'])
        self.assertEquals('feels strange', results[6]['action'])

        self.assertEquals('kick', results[7]['type'])
        self.assertEquals(self._date("20090703222500"),
                          results[7]['timestamp'])
        self.assertEquals('gozerbot was kicked by rcorsaro2 (rcorsaro2)',
                          results[7]['message'])
        self.assertEquals('rcorsaro2', results[7]['nick'])
        self.assertEquals('gozerbot', results[7]['kicked'])

        self.assertEquals('mode', results[8]['type'])
        self.assertEquals(self._date("20090703222600"),
                          results[8]['timestamp'])
        self.assertEquals('rcorsaro2 sets mode: -o gozerbot',
                          results[8]['message'])
        self.assertEquals('rcorsaro2', results[8]['nick'])
        self.assertEquals('-o gozerbot', results[8]['mode'])

        self.assertEquals('topic', results[9]['type'])
        self.assertEquals(self._date("20090703222700"),
                          results[9]['timestamp'])
        self.assertEquals('rcorsaro2 changes topic to "testing topic"',
                          results[9]['message'])
        self.assertEquals('rcorsaro2', results[9]['nick'])
        self.assertEquals('testing topic', results[9]['topic'])

        self.assertEquals('nick', results[10]['type'])
        self.assertEquals(self._date("20090703222800"),
                          results[10]['timestamp'])
        self.assertEquals(
            'rcorsaro ([email protected]) is now known as rcorsaro2',
            results[10]['message'])
        self.assertEquals('rcorsaro', results[10]['nick'])
        self.assertEquals('rcorsaro2', results[10]['newnick'])

        self.assertEquals('notice', results[11]['type'])
        self.assertEquals(self._date("20090703222900"),
                          results[11]['timestamp'])
        self.assertEquals('-rcorsaro- hello there', results[11]['message'])
        self.assertEquals('rcorsaro', results[11]['nick'])
        self.assertEquals('hello there', results[11]['comment'])

        self.assertEquals('other', results[12]['type'])
        self.assertEquals('* SOME SPECIAL MESSAGE *', results[12]['message'])

    # gozerbot in supy emulation mode
    def test_parse_supy_gozerbot(self):
        f = self.chmgr.channel(None)
        results = [i for i in self.out.parse_lines(self.supygozerlines, f)]

        self.assertEquals('comment', results[0]['type'])
        self.assertEquals(self._date("20090703221800"),
                          results[0]['timestamp'])
        self.assertEquals('<gozerbot> chatlog enabled on (default,#test2)',
                          results[0]['message'])
        self.assertEquals('gozerbot', results[0]['nick'])
        self.assertEquals('chatlog enabled on (default,#test2)',
                          results[0]['comment'])

        self.assertEquals('comment', results[1]['type'])
        self.assertEquals(self._date("20090703221900"),
                          results[1]['timestamp'])
        self.assertEquals('<rcorsaro> hello', results[1]['message'])
        self.assertEquals('rcorsaro', results[1]['nick'])
        self.assertEquals('hello', results[1]['comment'])

        self.assertEquals('part', results[2]['type'])
        self.assertEquals(self._date("20090703222000"),
                          results[2]['timestamp'])
        self.assertEquals(
            '*** rcorsaro_ ([email protected]) has left',
            results[2]['message'])
        self.assertEquals('rcorsaro_', results[2]['nick'])

        self.assertEquals('join', results[3]['type'])
        self.assertEquals(self._date("20090703222100"),
                          results[3]['timestamp'])
        self.assertEquals(
            '*** rcorsaro_ ([email protected]) has joined',
            results[3]['message'])
        self.assertEquals('rcorsaro_', results[3]['nick'])

        self.assertEquals('quit', results[4]['type'])
        self.assertEquals(self._date("20090703222200"),
                          results[4]['timestamp'])
        self.assertEquals(
            '*** rcorsaro_ ([email protected]) has quit: Quit: leaving',
            results[4]['message'])
        self.assertEquals('rcorsaro_', results[4]['nick'])

        self.assertEquals('action', results[5]['type'])
        self.assertEquals(self._date("20090703222300"),
                          results[5]['timestamp'])
        self.assertEquals('* rcorsaro is strong', results[5]['message'])
        self.assertEquals('rcorsaro', results[5]['nick'])
        self.assertEquals('is strong', results[5]['action'])

        self.assertEquals('action', results[6]['type'])
        self.assertEquals(self._date("20090703222400"),
                          results[6]['timestamp'])
        self.assertEquals('* rcorsaro is manly', results[6]['message'])
        self.assertEquals('rcorsaro', results[6]['nick'])
        self.assertEquals('is manly', results[6]['action'])

        self.assertEquals('kick', results[7]['type'])
        self.assertEquals(self._date("20090703222500"),
                          results[7]['timestamp'])
        self.assertEquals('*** rcorsaro_ was kicked by rcorsaro (rcorsaro)',
                          results[7]['message'])
        self.assertEquals('rcorsaro', results[7]['nick'])
        self.assertEquals('rcorsaro_', results[7]['kicked'])

        self.assertEquals('mode', results[8]['type'])
        self.assertEquals(self._date("20090703222600"),
                          results[8]['timestamp'])
        self.assertEquals('*** rcorsaro sets mode: +o rcorsaro_',
                          results[8]['message'])
        self.assertEquals('rcorsaro', results[8]['nick'])
        self.assertEquals('+o rcorsaro_', results[8]['mode'])

        self.assertEquals('topic', results[9]['type'])
        self.assertEquals(self._date("20090703222700"),
                          results[9]['timestamp'])
        self.assertEquals('*** rcorsaro changes topic to "testing topic"',
                          results[9]['message'])
        self.assertEquals('rcorsaro', results[9]['nick'])
        self.assertEquals('testing topic', results[9]['topic'])

        self.assertEquals('nick', results[10]['type'])
        self.assertEquals(self._date("20090703222800"),
                          results[10]['timestamp'])
        self.assertEquals(
            '*** lsjdf ([email protected]) is now known as rcorsaro2',
            results[10]['message'])
        self.assertEquals('lsjdf', results[10]['nick'])
        self.assertEquals('rcorsaro2', results[10]['newnick'])

        self.assertEquals('notice', results[11]['type'])
        self.assertEquals(self._date("20090703222900"),
                          results[11]['timestamp'])
        self.assertEquals('-rcorsaro- hello there', results[11]['message'])
        self.assertEquals('rcorsaro', results[11]['nick'])
        self.assertEquals('hello there', results[11]['comment'])

        self.assertEquals('other', results[12]['type'])
        self.assertEquals('* SOME SPECIAL MESSAGE *', results[12]['message'])

    def test_default_format(self):
        df = self.chmgr.channel('blah').format()
        self.assertEquals('/var/lib/irclogs', df['basepath'])
        self.assertEquals('%(channel)s/%(channel)s.%Y-%m-%d.log', df['paths'])
        self.assertEquals('%Y-%m-%dT%H:%M:%S', df['timestamp_format'])
        self.assertEquals('utc', df['timezone'])
        self.assert_(df['timestamp_regex'])
        self.assert_(df['match_order'])
        for m in re.split('[ |:,]+', df['match_order']):
            self.assert_(df['%s_regex' % (m)])
            re.compile(df['%s_regex' % (m)])

    def test_supy_format(self):
        self.out.config.set('irclogs', 'channel.test.format', 'supy')
        df = self.chmgr.channel('test').format()
        self.assertEquals('/var/lib/irclogs', df['basepath'])
        self.assertEquals('%(channel)s/%(channel)s.%Y-%m-%d.log', df['paths'])
        self.assertEquals('%Y-%m-%dT%H:%M:%S', df['timestamp_format'])
        self.assertEquals('utc', df['timezone'])
        self.assert_(df['timestamp_regex'])
        self.assert_(df['match_order'])
        for m in re.split('[ |:,]+', df['match_order']):
            self.assert_(df['%s_regex' % (m)])
            re.compile(df['%s_regex' % (m)])

    def test_nonexistant_format(self):
        df = self.chmgr.channel('sdflkjlskjf').format()
        self.assertEquals('/var/lib/irclogs', df['basepath'])
        self.assertEquals('%(channel)s/%(channel)s.%Y-%m-%d.log', df['paths'])
        self.assertEquals('%Y-%m-%dT%H:%M:%S', df['timestamp_format'])
        self.assertEquals('utc', df['timezone'])
        self.assert_(df['timestamp_regex'])
        self.assert_(df['match_order'])
        for m in re.split('[ |:,]+', df['match_order']):
            self.assert_(df['%s_regex' % (m)])
            re.compile(df['%s_regex' % (m)])

    def test_gozer_format(self):
        self.out.config.set('irclogs', 'channel.test.format', 'gozer')
        #import pdb; pdb.set_trace()
        df = self.chmgr.channel('test').format()
        self.assertEquals('/var/lib/irclogs', df['basepath'])
        self.assertEquals([
            'logs/%(network)s/simple/%(channel)s.%Y%m%d.slog',
            'logs/%(network)s/simple/%(channel_name)s.%Y%m%d.slog'
        ], df['paths'])
        self.assertEquals('%Y-%m-%d %H:%M:%S', df['timestamp_format'])
        self.assertEquals('utc', df['timezone'])
        self.assert_(df['timestamp_regex'])
        self.assert_(df['match_order'])
        for m in re.split('[ |:,]+', df['match_order']):
            self.assert_(df['%s_regex' % (m)])
            re.compile(df['%s_regex' % (m)])

    def test_none_format(self):
        df = self.chmgr.channel(None).format()
        self.assertEquals('/var/lib/irclogs', df['basepath'])
        self.assertEquals('%(channel)s/%(channel)s.%Y-%m-%d.log', df['paths'])
        self.assertEquals('%Y-%m-%dT%H:%M:%S', df['timestamp_format'])
        self.assertEquals('utc', df['timezone'])
        self.assert_(df['timestamp_regex'])
        self.assert_(df['match_order'])
        for m in re.split('[ |:,]+', df['match_order']):
            self.assert_(df['%s_regex' % (m)])
            re.compile(df['%s_regex' % (m)])

    def test_channel(self):
        self.out.config.set('irclogs', 'channel.test.channel', '#test')
        self.out.config.set('irclogs', 'channel.test.format', '')
        ch = self.chmgr.channel('test')
        format = ch.format()
        self.assert_(ch)
        self.assertEquals('#test', ch.channel())
        self.assertEquals('/var/lib/irclogs', format['basepath'])
        self.assertEquals('%(channel)s/%(channel)s.%Y-%m-%d.log',
                          format['paths'])
        self.assertEquals('%Y-%m-%dT%H:%M:%S', format['timestamp_format'])
        self.assertEquals('utc', format['timezone'])
        self.assert_(format['timestamp_regex'])
        self.assert_(format['match_order'])
        for m in re.split('[ |:,]+', format['match_order']):
            self.assert_(format['%s_regex' % (m)])
            re.compile(format['%s_regex' % (m)])

    def test_channel_funny_name(self):
        self.out.config.set('irclogs', 'channel.mingya.channel', '#test')
        self.out.config.set('irclogs', 'channel.mingya.format', '')
        ch = self.chmgr.channel('mingya')
        self.assert_(ch)

    def test_channel_with_supy_format(self):
        self.out.config.set('irclogs', 'channel.test.channel', '#test')
        self.out.config.set('irclogs', 'channel.test.format', 'supy')
        ch = self.chmgr.channel('test')
        self.assert_(ch)

    def test_channel_with_gozer_format(self):
        self.out.config.set('irclogs', 'channel.test.channel', '#test')
        self.out.config.set('irclogs', 'channel.test.format', 'gozer')
        ch = self.chmgr.channel('test')
        self.assert_(ch)

    def test_get_file_dates(self):
        s = self._date("20090101050500")
        e = self._date("20090104050500")
        days = list(self.out._get_file_dates(s, e))
        self.assertEquals(4, len(days))
        self.assertEquals(s.date(), days[0])
        self.assertEquals(e.date(), days[3])

    def test_get_file_dates_tz(self):
        s = self._date("20090102010000", "America/New_York")
        e = self._date("20090104010000", "America/New_York")
        days = list(self.out._get_file_dates(s, e))
        self.assertEquals(3, len(days))
        self.assertEquals(self._date("20090102060000").date(), days[0])
        self.assertEquals(self._date("20090104060000").date(), days[2])

        s = self._date("20090102010000", "America/New_York")
        e = self._date("20090104200000", "America/New_York")
        days = list(self.out._get_file_dates(s, e))
        self.assertEquals(4, len(days))
        self.assertEquals(self._date("20090102060000").date(), days[0])
        self.assertEquals(self._date("20090105060000").date(), days[3])

    def test_merge_iseq(self):
        parsers = []
        self.out.config.set('irclogs', 'channel.test.format', 'gozer')
        df = self.chmgr.channel('test')
        for f in ((self.supygozerlines, self.chmgr.channel(None)),
                  (self.simplegozerlines, df), (self.supylines,
                                                self.chmgr.channel(None))):
            parsers.append(self.out.parse_lines(f[0], channel=f[1]))

        def _key(x):
            return x.get('timestamp',
                         datetime(1970, 1, 1, 0, 0, 0, tzinfo=timezone('utc')))

        lines = list(merge_iseq(parsers, key=_key))
        self.assertEquals(40, len(lines))

    def test_file_dates(self):
        start = self._date("20090215120000").replace(tzinfo=UTC)
        end = self._date("20090215121500").replace(tzinfo=UTC)
        dates = [i for i in self.out._get_file_dates(start, end)]
        for i in range(0, len(dates) - 1):
            self.assertTrue(
                dates[i] < dates[i + 1], "(%s) Assertion Failed: %s < %s" %
                (dates, dates[i], dates[i + 1]))
コード例 #10
0
ファイル: api.py プロジェクト: dokipen/trac-irclogs-plugin
class ApiTestCase(unittest.TestCase):
    def setUp(self):
        self.env = EnvironmentStub()
        self.config = self.env.config

        self.config.set('irclogs', 'provider', 'file1')
        self.config.set('irclogs', 'channel', '#test1')
        self.config.set('irclogs', 'network', 'network1')

        self.config.set('irclogs', 'channel.test2.channel', '#test2')
        self.config.set('irclogs', 'channel.test2.provider', 'file2')
        self.config.set('irclogs', 'channel.test2.network', 'network2')

        self.config.set('irclogs', 'channel.test3.channel', '#test3')

        self.config.set('irclogs', 'channel.test4.blah', 'blah')
        self.out = IRCChannelManager(self.env)

    def test_get_channel_by_name(self):
        c = self.out.channel('crap')
        self.assertEqual('file1', c.provider())
        self.assertEqual('#test1', c.channel())
        self.assertEqual('network1', c.network())
        self.assertEqual(None, c.name())

        c = self.out.channel(None)
        self.assertEqual('file1', c.provider())
        self.assertEqual('#test1', c.channel())
        self.assertEqual('network1', c.network())
        self.assertEqual(None, c.name())

        c = self.out.channel('test2')
        self.assertEqual('file2', c.provider())
        self.assertEqual('#test2', c.channel())
        self.assertEqual('network2', c.network())
        self.assertEqual('test2', c.name())

        c = self.out.channel('test3')
        self.assertEqual('file1', c.provider())
        self.assertEqual('#test3', c.channel())
        self.assertEqual('network1', c.network())
        self.assertEqual('test3', c.name())

        c = self.out.channel('test4')
        self.assertEqual('file1', c.provider())
        self.assertEqual('#test1', c.channel())
        self.assertEqual('network1', c.network())
        self.assertEqual('blah', c.settings()['blah'])
        self.assertEqual('test4', c.name())

    def test_user_tz(self):
        req = Mock(session={'tz': 'America/New_York'})
        self.assertEqual('America/New_York', req.session.get('tz'))
        dt = UTC.localize(datetime.today())
        udt = self.out.to_user_tz(req, dt)
        self.assertEqual('America/New_York', str(udt.tzinfo))

    def test_tz_conversion(self):
        NYC = timezone('America/New_York')
        nydt = NYC.localize(datetime(2009, 8, 15, 12, 0, 0), None)
        udt = UTC.normalize(nydt.astimezone(UTC))
        nydt2 = NYC.normalize(udt.astimezone(NYC))
        self.assertEqual(nydt, nydt2)