Merge lp:~moea/mutant/amp-dialog-api-change into lp:mutant

Proposed by Moe Aboulkheir
Status: Merged
Merged at revision: not available
Proposed branch: lp:~moea/mutant/amp-dialog-api-change
Merge into: lp:mutant
Diff against target: None lines
To merge this branch: bzr merge lp:~moea/mutant/amp-dialog-api-change
Reviewer Review Type Date Requested Status
Glyph Lefkowitz Approve
Review via email: mp+7218@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Glyph Lefkowitz (glyph) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'mutant/amp_login_dialog.py'
2--- mutant/amp_login_dialog.py 2009-05-26 13:29:56 +0000
3+++ mutant/amp_login_dialog.py 2009-06-01 20:59:15 +0000
4@@ -15,19 +15,22 @@
5
6
7
8+class NoAMPCredentials(Exception):
9+ """
10+ L{Exception} indicating that no credentials were supplied to
11+ L{AMPLoginDialog} before it was closed.
12+ """
13+
14+
15+
16 class AMPLoginDialog:
17 """
18 Object responsible for responding to events generated by the
19 C{loginDialog} in C{login.glade}.
20-
21- @ivar credentialsDeferred: Deferred firing with a 3-tuple of (username,
22- password, host), once the I{Login} button has been clicked, or C{None}
23- if the dialog is cancelled or deleted.
24- @type credentialsDeferred: L{Deferred}
25 """
26 def __init__(self):
27 self.widget = GladeLoginDialog.load(self)
28- self.credentialsDeferred = Deferred()
29+ self.deferreds = []
30
31
32 def show(self):
33@@ -37,11 +40,35 @@
34 self.widget.loginDialog.show_all()
35
36
37+ def _callback(self, result):
38+ while self.deferreds:
39+ self.deferreds.pop().callback(result)
40+
41+
42+ def _errback(self, result):
43+ while self.deferreds:
44+ self.deferreds.pop().errback(result)
45+
46+
47+ def onComplete(self):
48+ """
49+ Return a Deferred which will fire once the dialog has completed.
50+
51+ @return: Deferred firing with a 3-tuple of (username, password, host),
52+ once the I{Login} button has been clicked, or with
53+ L{NoAMPCredentials} if the dialog is closed/deleted.
54+ @rtype: L{Deferred}
55+ """
56+ d = Deferred()
57+ self.deferreds.append(d)
58+ return d
59+
60+
61 def widget_dialogDeleted(self, dialog, event):
62 """
63 Called when a I{delete_event} fires for C{loginDialog}.
64 """
65- self.credentialsDeferred.callback(None)
66+ self._errback(NoAMPCredentials())
67 return True
68
69
70@@ -54,7 +81,7 @@
71 password = self.widget.password.get_text()
72 hostname = self.widget.hostname.get_text()
73 self.widget.loginDialog.destroy()
74- self.credentialsDeferred.callback((username, password, hostname))
75+ self._callback((username, password, hostname))
76
77
78 def widget_cancelButtonClicked(self, button):
79@@ -62,4 +89,4 @@
80 Called when the I{Cancel} button is clicked. Destroys C{loginDialog}.
81 """
82 self.widget.loginDialog.destroy()
83- self.credentialsDeferred.callback(None)
84+ self._errback(NoAMPCredentials())
85
86=== modified file 'mutant/test/test_amp_login_dialog.py'
87--- mutant/test/test_amp_login_dialog.py 2009-05-26 13:29:56 +0000
88+++ mutant/test/test_amp_login_dialog.py 2009-06-01 20:59:15 +0000
89@@ -4,7 +4,7 @@
90
91 from twisted.trial.unittest import TestCase
92
93-from mutant.amp_login_dialog import AMPLoginDialog
94+from mutant.amp_login_dialog import AMPLoginDialog, NoAMPCredentials
95
96
97 class AMPLoginDialogTests(TestCase):
98@@ -19,7 +19,7 @@
99 def test_loginButtonClicked(self):
100 """
101 L{AMPLoginDialog.widget_loginButtonClicked} should fire
102- L{AMPLoginDialog.credentialsDeferred} with the correct values.
103+ L{AMPLoginDialog.onComplete} with the correct values.
104 """
105 dialog = AMPLoginDialog()
106 widget = dialog.widget
107@@ -30,9 +30,10 @@
108 self.assertEqual(username, self.USERNAME)
109 self.assertEqual(password, self.PASSWORD)
110 self.assertEqual(hostname, self.HOSTNAME)
111- dialog.credentialsDeferred.addCallback(cbCredentials)
112+ onComplete = dialog.onComplete()
113+ onComplete.addCallback(cbCredentials)
114 dialog.widget_loginButtonClicked(None)
115- return dialog.credentialsDeferred
116+ return onComplete
117
118
119 def test_cancelButtonClicked(self):
120@@ -41,6 +42,7 @@
121 C{loginDialog}.
122 """
123 dialog = AMPLoginDialog()
124+ onComplete = dialog.onComplete()
125 widget = dialog.widget
126
127 def destroyed(widget):
128@@ -51,21 +53,23 @@
129 dialog.widget_cancelButtonClicked(False)
130 self.assertTrue(destroyed.destroyed)
131
132- dialog.credentialsDeferred.addCallback(
133- self.assertIdentical, None)
134- return dialog.credentialsDeferred
135+ onComplete.addCallbacks(
136+ self.fail, lambda f: f.trap(NoAMPCredentials))
137+ return onComplete
138
139
140 def test_dialogDeleted(self):
141 """
142 L{AMPLoginDialog.widget_dialogDeleted} should fire
143- L{AMPLoginDialog.credentialsDeferred}.
144+ L{AMPLoginDialog.onComplete}.
145 """
146 dialog = AMPLoginDialog()
147+ onComplete = dialog.onComplete()
148 self.assertTrue(dialog.widget_dialogDeleted(None, None))
149- dialog.credentialsDeferred.addCallback(
150- self.assertIdentical, None)
151- return dialog.credentialsDeferred
152+ onComplete.addCallbacks(
153+ self.fail,
154+ lambda f: f.trap(NoAMPCredentials))
155+ return onComplete
156
157
158 def test_dialogDeletedCalled(self):

Subscribers

People subscribed via source and target branches