Skip to content

Commit

Permalink
Reworked how FancyInfobarbPangler works
Browse files Browse the repository at this point in the history
  • Loading branch information
lvh committed Mar 29, 2011
1 parent 6d40de3 commit 577dee7
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 34 deletions.
55 changes: 33 additions & 22 deletions infobarb/irc.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,39 +6,50 @@
from twisted.words.protocols import irc


class FancyInfobarbPangler(panglery.Pangler):
class FancyInfobarbPangler(object):
"""
A Pangler with some infobarb-specific hook shortcuts.
Some infobarb-specific event hook shortcuts.
"""
def onPrivateMessage(self, _func=None):
return self.subscribe(_func,
event="privateMessageReceived",
needs=["user", "message"])
def __init__(self, boundPangler):
self.p = boundPangler


def onChannelMessage(self, _func=None):
return self.subscribe(_func,
event="channelMessageReceived",
needs=["user", "channel", "message"])
_SHORTCUTS = {
"onPrivateMessage": {
"event": "privateMessageReceived",
"needs": ("user", "message")},

"onChannelMessage": {
"event": "channelMessageReceived",
"needs": ("user", "channel", "message")},

def onPrivateNotice(self, _func=None):
return self.subscribe(_func,
event="privateNoticeReceived",
needs=["user", "message"])
"onPrivateNotice": {
"event": "privateNoticeReceived",
"needs": ("user", "message")},

"onChannelNotice": {
"event": "channelNoticeReceived",
"needs": ("user", "channel", "message")},

def onChannelNotice(self, _func=None):
return self.subscribe(_func,
event="channelNoticeReceived",
needs=["user", "channel", "message"])
"onUserJoin": {
"event": "userJoined",
"needs": ("user", "channel")}
}


def onUserJoin(self, _func=None):
return self.subscribe(_func,
event="userJoined",
needs=["user", "channel"])
def _buildShortcut(defaultKwargs):
def shortcut(self, _func=None, **kwargs):
if any(k in defaultKwargs for k in kwargs):
raise KeyError("duplicated shortcut kwarg")

kwargs.update(defaultKwargs)
return self.p.subscribe(_func, **kwargs)

return shortcut


for name, defaultKwargs in FancyInfobarbPangler._SHORTCUTS.iteritems():
setattr(FancyInfobarbPangler, name, _buildShortcut(defaultKwargs))


class InfobarbClient(irc.IRCClient):
Expand Down
45 changes: 33 additions & 12 deletions infobarb/test/test_irc.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
"""
Tests for the IRC abstraction.
"""
import panglery

from twisted.trial import unittest

from infobarb.irc import FancyInfobarbPangler, InfobarbClient
Expand All @@ -22,7 +24,7 @@ class PanglerCallStubTestCase(unittest.TestCase):
"""
A test case that verifies if a pangler called a stub.
"""
p = FancyInfobarbPangler()
p = panglery.Pangler()

def assertStubCalled(self, stub, *args, **kwargs):
"""
Expand Down Expand Up @@ -63,6 +65,23 @@ class FancyInfobarbPanglerTestCase(PanglerCallStubTestCase):
"""
Tests that the event hook shortcuts provided by FancyInfobobPangler work.
"""
def setUp(self):
self.f = FancyInfobarbPangler(self.p)


def test_raiseOnMissingAttribute(self):
self.assertRaises(AttributeError, getattr, self.f, "nonexistentHook")


def test_raiseOnOverriddenKwarg(self):
"""
Tests that if you use the fancy shortcut with a keyword that would get
overridden by the shortcut, an exception gets raised.
"""
decorator = self.f.onPrivateMessage
self.assertRaises(KeyError, decorator, event="privateMessageReceived")


def _test_fancyShortcut(self, hook, event, eventData):
hooks = [hook, hook()] # Hook should work directly and as a decorator

Expand All @@ -71,38 +90,38 @@ def _test_fancyShortcut(self, hook, event, eventData):
hook(stub)
self.p.trigger(event=event, **eventData)
self.assertEventFired(stub, eventData)


def test_onPrivateMessage(self):
hook = self.p.onPrivateMessage
hook = self.f.onPrivateMessage
event = "privateMessageReceived"
eventData = _buildEventData("user", "message")
self._test_fancyShortcut(hook, event, eventData)


def test_onChannelMessage(self):
hook = self.p.onChannelMessage
hook = self.f.onChannelMessage
event = "channelMessageReceived"
eventData = _buildEventData("user", "channel", "message")
self._test_fancyShortcut(hook, event, eventData)


def test_onPrivateNotice(self):
hook = self.p.onPrivateNotice
hook = self.f.onPrivateNotice
event = "privateNoticeReceived"
eventData = _buildEventData("user", "message")
self._test_fancyShortcut(hook, event, eventData)


def test_onChannelNotice(self):
hook = self.p.onChannelNotice
hook = self.f.onChannelNotice
event = "channelNoticeReceived"
eventData = _buildEventData("user", "channel", "message")
self._test_fancyShortcut(hook, event, eventData)


def test_onUserJoin(self):
hook = self.p.onUserJoin
hook = self.f.onUserJoin
event = "userJoined"
eventData = _buildEventData("user", "channel")
self._test_fancyShortcut(hook, event, eventData)
Expand All @@ -117,6 +136,8 @@ class ClientTestCase(PanglerCallStubTestCase):
def setUp(self):
super(ClientTestCase, self).setUp()

self.f = FancyInfobarbPangler(self.p)

self.client = InfobarbClient(self.p)
self.client.nickname = "testbarb"

Expand All @@ -141,7 +162,7 @@ def test_privateMessage(self):
event = _buildEventData("user", "message")
event["channel"] = self.client.nickname

self._test_clientMessage(hook=self.p.onPrivateMessage,
self._test_clientMessage(hook=self.f.onPrivateMessage,
trigger=self.client.privmsg,
event=event,
expectedKeys=["user", "message"])
Expand All @@ -153,7 +174,7 @@ def test_channelMessage(self):
"""
event = _buildEventData("user", "channel", "message")

self._test_clientMessage(hook=self.p.onChannelMessage,
self._test_clientMessage(hook=self.f.onChannelMessage,
trigger=self.client.privmsg,
event=event)

Expand All @@ -165,7 +186,7 @@ def test_privateNotice(self):
event = _buildEventData("user", "message")
event["channel"] = self.client.nickname

self._test_clientMessage(hook=self.p.onPrivateNotice,
self._test_clientMessage(hook=self.f.onPrivateNotice,
trigger=self.client.noticed,
event=event,
expectedKeys=["user", "message"])
Expand All @@ -177,7 +198,7 @@ def test_channelNotice(self):
"""
event = _buildEventData("user", "channel", "message")

self._test_clientMessage(hook=self.p.onChannelNotice,
self._test_clientMessage(hook=self.f.onChannelNotice,
trigger=self.client.noticed,
event=event)

Expand All @@ -188,6 +209,6 @@ def test_userJoined(self):
"""
event = _buildEventData("user", "channel")

self._test_clientMessage(hook=self.p.onUserJoin,
self._test_clientMessage(hook=self.f.onUserJoin,
trigger=self.client.userJoined,
event=event)

0 comments on commit 577dee7

Please sign in to comment.