Merge lp:~nataliabidart/magicicada-gui/expand-status into lp:magicicada-gui

Proposed by Natalia Bidart
Status: Merged
Approved by: Facundo Batista
Approved revision: 27
Merged at revision: 24
Proposed branch: lp:~nataliabidart/magicicada-gui/expand-status
Merge into: lp:magicicada-gui
Prerequisite: lp:~nataliabidart/magicicada-gui/set-initial-state
Diff against target: 383 lines (+132/-63)
3 files modified
data/ui/gui.glade (+2/-1)
magicicada/__init__.py (+18/-10)
magicicada/tests/test_magicicada.py (+112/-52)
To merge this branch: bzr merge lp:~nataliabidart/magicicada-gui/expand-status
Reviewer Review Type Date Requested Status
chicharreros Pending
Review via email: mp+25899@code.launchpad.net

Description of the change

Status label tweaks: added connection status, added ellipsize, added initial status.

To post a comment you must log in.
28. By Natalia Bidart

Merged trunk in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'data/ui/gui.glade'
--- data/ui/gui.glade 2010-05-16 21:43:51 +0000
+++ data/ui/gui.glade 2010-05-24 16:14:33 +0000
@@ -199,13 +199,14 @@
199 </object>199 </object>
200 <packing>200 <packing>
201 <property name="expand">False</property>201 <property name="expand">False</property>
202 <property name="padding">3</property>
202 <property name="position">0</property>203 <property name="position">0</property>
203 </packing>204 </packing>
204 </child>205 </child>
205 <child>206 <child>
206 <object class="GtkLabel" id="status_label">207 <object class="GtkLabel" id="status_label">
207 <property name="visible">True</property>208 <property name="visible">True</property>
208 <property name="label" translatable="yes">Service not started, click Start to continue.</property>209 <property name="ellipsize">end</property>
209 </object>210 </object>
210 <packing>211 <packing>
211 <property name="position">1</property>212 <property name="position">1</property>
212213
=== modified file 'magicicada/__init__.py'
--- magicicada/__init__.py 2010-05-23 10:23:35 +0000
+++ magicicada/__init__.py 2010-05-24 16:14:33 +0000
@@ -29,16 +29,16 @@
29gtk2reactor.install()29gtk2reactor.install()
3030
31from magicicada import syncdaemon31from magicicada import syncdaemon
32from magicicada.helpers import get_data_file, get_builder, NO_OP, print_debug32from magicicada.helpers import get_data_file, get_builder, NO_OP
3333
34CONTENT_QUEUE = 'content'34CONTENT_QUEUE = 'content'
35META_QUEUE = 'meta'35META_QUEUE = 'meta'
3636
37class MagicicadaUI(object):37class MagicicadaUI(object):
3838
39 STATUS_JOINER = " - "
39 STATUS = {40 STATUS = {
40 'started': _('Service started, click Connect to continue.'),41 'initial': _('Service is not started, click Start to continue.'),
41 'connected': _('Service connected. Doing internal synchronization...'),
42 }42 }
4343
44 def __init__(self, launchpad_available=False, on_destroy=NO_OP,44 def __init__(self, launchpad_available=False, on_destroy=NO_OP,
@@ -142,7 +142,6 @@
142 self.disconnect.set_sensitive(False)142 self.disconnect.set_sensitive(False)
143 self.sd.disconnect()143 self.sd.disconnect()
144144
145 @print_debug
146 def on_status_icon_activate(self, widget, data=None):145 def on_status_icon_activate(self, widget, data=None):
147 """Systray icon was clicked."""146 """Systray icon was clicked."""
148 if self.main_window.get_property('visible'):147 if self.main_window.get_property('visible'):
@@ -171,6 +170,11 @@
171 self._activate_indicator(self.is_connected, sensitive=False)170 self._activate_indicator(self.is_connected, sensitive=False)
172 self._activate_indicator(self.is_online, sensitive=False)171 self._activate_indicator(self.is_online, sensitive=False)
173172
173 cs = self.sd.current_state
174 self.on_status_changed(cs.name, cs.description)
175 self.on_meta_queue_changed(self.sd.meta_queue)
176 self.on_content_queue_changed(self.sd.content_queue)
177
174 def on_connected(self, *args, **kwargs):178 def on_connected(self, *args, **kwargs):
175 """Callback'ed when syncadaemon is connected."""179 """Callback'ed when syncadaemon is connected."""
176 self.connect.hide()180 self.connect.hide()
@@ -199,12 +203,14 @@
199 self._activate_indicator(self.is_online, sensitive=False)203 self._activate_indicator(self.is_online, sensitive=False)
200204
201 def on_status_changed(self, name=None, description=None,205 def on_status_changed(self, name=None, description=None,
202 is_error=False, is_connected=True,206 is_error=False, is_connected=True, is_online=True,
203 is_online=True, queues=None, connection=None):207 queues=None, connection=None):
204 """Callback'ed when the SD status changed."""208 """Callback'ed when the SD status changed."""
205 if description is None:209 values = (v for v in (name, description, connection) if v)
206 description = ''210 text = self.STATUS_JOINER.join(values)
207 self.status_label.set_text(description)211 if not (text or self.sd.current_state.is_started):
212 text = self.STATUS['initial']
213 self.status_label.set_text(text)
208214
209 def _on_queue_changed(self, queue_name, items, *args, **kwargs):215 def _on_queue_changed(self, queue_name, items, *args, **kwargs):
210 """Callback'ed when a queue changed."""216 """Callback'ed when a queue changed."""
@@ -257,4 +263,6 @@
257263
258 self.on_meta_queue_changed(self.sd.meta_queue)264 self.on_meta_queue_changed(self.sd.meta_queue)
259 self.on_content_queue_changed(self.sd.content_queue)265 self.on_content_queue_changed(self.sd.content_queue)
260 self.on_status_changed(description=current_state.description)266 self.on_status_changed(name=current_state.name,
267 description=current_state.description,
268 connection=current_state.connection)
261269
=== modified file 'magicicada/tests/test_magicicada.py'
--- magicicada/tests/test_magicicada.py 2010-05-23 10:23:35 +0000
+++ magicicada/tests/test_magicicada.py 2010-05-24 16:14:33 +0000
@@ -18,6 +18,8 @@
1818
19"""Tests for magicicada."""19"""Tests for magicicada."""
2020
21import pango
22
21from twisted.trial.unittest import TestCase23from twisted.trial.unittest import TestCase
2224
23from magicicada import MagicicadaUI, CONTENT_QUEUE, META_QUEUE, syncdaemon25from magicicada import MagicicadaUI, CONTENT_QUEUE, META_QUEUE, syncdaemon
@@ -28,6 +30,10 @@
28 """A faked syncdaemon."""30 """A faked syncdaemon."""
2931
30 def __init__(self):32 def __init__(self):
33 self.current_state = syncdaemon.State()
34 self.meta_queue = []
35 self.content_queue = []
36
31 self.on_started_callback = NO_OP37 self.on_started_callback = NO_OP
32 self.on_stopped_callback = NO_OP38 self.on_stopped_callback = NO_OP
33 self.on_connected_callback = NO_OP39 self.on_connected_callback = NO_OP
@@ -38,14 +44,11 @@
38 self.content_queue_changed_callback = NO_OP44 self.content_queue_changed_callback = NO_OP
39 self.meta_queue_changed_callback = NO_OP45 self.meta_queue_changed_callback = NO_OP
40 self.shutdown = NO_OP46 self.shutdown = NO_OP
41 self.start = NO_OP47 self.start = lambda: setattr(self.current_state, 'is_started', True)
42 self.quit = NO_OP48 self.quit = lambda: setattr(self.current_state, 'is_started', False)
43 self.connect = NO_OP49 self.connect = lambda: setattr(self.current_state, 'is_connected', True)
44 self.disconnect = NO_OP50 self.disconnect = \
4551 lambda: setattr(self.current_state, 'is_connected', False)
46 self.current_state = syncdaemon.State()
47 self.meta_queue = []
48 self.content_queue = []
4952
5053
51class MagicicadaUITestCase(TestCase):54class MagicicadaUITestCase(TestCase):
@@ -62,6 +65,17 @@
62 self.ui.on_main_window_destroy(self.ui.main_window)65 self.ui.on_main_window_destroy(self.ui.main_window)
63 self._called = False66 self._called = False
6467
68 def do_start(self):
69 """Simulate that start fully happened."""
70 self.ui.on_start_clicked(self.ui.start)
71 self.ui.on_started()
72
73 def do_connect(self):
74 """Simulate that connect fully happened."""
75 self.do_start()
76 self.ui.on_connect_clicked(self.ui.connect)
77 self.ui.on_connected()
78
65 def assert_indicator_disabled(self, indicator):79 def assert_indicator_disabled(self, indicator):
66 """Test that 'indicator' is not sensitive."""80 """Test that 'indicator' is not sensitive."""
67 self.assertFalse(indicator.is_sensitive(), 'indicator is not sensitive')81 self.assertFalse(indicator.is_sensitive(), 'indicator is not sensitive')
@@ -150,8 +164,7 @@
150164
151 def test_on_connect_clicked(self):165 def test_on_connect_clicked(self):
152 """Test on_connect_clicked."""166 """Test on_connect_clicked."""
153 self.ui.on_start_clicked(self.ui.start) # need to be started167 self.do_start() # need to be started
154 self.ui.on_started()
155 self.ui.on_connect_clicked(self.ui.connect)168 self.ui.on_connect_clicked(self.ui.connect)
156169
157 self.assertTrue(self.ui.connect.get_property('visible'))170 self.assertTrue(self.ui.connect.get_property('visible'))
@@ -170,8 +183,7 @@
170183
171 def test_on_stop_clicked(self):184 def test_on_stop_clicked(self):
172 """Test on_stop_clicked."""185 """Test on_stop_clicked."""
173 self.ui.on_start_clicked(self.ui.start)186 self.do_start()
174 self.ui.on_started()
175 assert not self.ui.widget_enabled(self.ui.disconnect)187 assert not self.ui.widget_enabled(self.ui.disconnect)
176 self.patch(self.ui, 'on_disconnect_clicked', self.set_called)188 self.patch(self.ui, 'on_disconnect_clicked', self.set_called)
177 self.ui.on_stop_clicked(self.ui.stop)189 self.ui.on_stop_clicked(self.ui.stop)
@@ -188,10 +200,7 @@
188200
189 def test_on_stop_clicked_if_connected(self):201 def test_on_stop_clicked_if_connected(self):
190 """Test on_stop_clicked."""202 """Test on_stop_clicked."""
191 self.ui.on_start_clicked(self.ui.start)203 self.do_connect()
192 self.ui.on_started()
193 self.ui.on_connect_clicked(self.ui.connect)
194 self.ui.on_connected()
195 self.patch(self.ui, 'on_disconnect_clicked', self.set_called)204 self.patch(self.ui, 'on_disconnect_clicked', self.set_called)
196 self.ui.on_stop_clicked(self.ui.stop)205 self.ui.on_stop_clicked(self.ui.stop)
197206
@@ -205,10 +214,7 @@
205214
206 def test_on_disconnect_clicked(self):215 def test_on_disconnect_clicked(self):
207 """Test on_disconnect_clicked."""216 """Test on_disconnect_clicked."""
208 self.ui.on_start_clicked(self.ui.start)217 self.do_connect()
209 self.ui.on_started()
210 self.ui.on_connect_clicked(self.ui.connect)
211 self.ui.on_connected()
212 self.ui.on_disconnect_clicked(self.ui.disconnect)218 self.ui.on_disconnect_clicked(self.ui.disconnect)
213219
214 self.assertFalse(self.ui.connect.get_property('visible'))220 self.assertFalse(self.ui.connect.get_property('visible'))
@@ -329,6 +335,14 @@
329335
330 self.assert_queue_store_correct(self.queue_store, data)336 self.assert_queue_store_correct(self.queue_store, data)
331337
338 def test_on_stopped_updates_queue(self):
339 """On SD stoppped, the UI updates the queue state."""
340 cb = 'on_%s_queue_changed' % self.queue
341 self.patch(self.ui, cb, self.set_called)
342 self.ui.on_stopped()
343 self.assertTrue(self._called,
344 '%s was called on_stopped.' % cb)
345
332346
333class MagicicadaUIContentQueueTestCase(_MagicicadaUIQueueTestCase):347class MagicicadaUIContentQueueTestCase(_MagicicadaUIQueueTestCase):
334 """UI test cases for content queue view."""348 """UI test cases for content queue view."""
@@ -345,28 +359,91 @@
345class MagicicadaUIStatusTestCase(MagicicadaUITestCase):359class MagicicadaUIStatusTestCase(MagicicadaUITestCase):
346 """UI test cases for the status label."""360 """UI test cases for the status label."""
347361
362 def assert_status_label_correct(self, name=None, description=None,
363 connection=None, expected=None):
364 """Test that the status label is of the form name: description."""
365 if expected is None:
366 assert name is not None
367 assert description is not None
368 assert connection is not None
369 values = (name, description, connection)
370 expected = self.ui.STATUS_JOINER.join(values)
371
372 actual = self.ui.status_label.get_text()
373 msg = 'status label test must be "%s" (got "%s" instead).'
374 self.assertEqual(expected, actual, msg % (expected, actual))
375
348 def test_callback_is_connected(self):376 def test_callback_is_connected(self):
349 """Status callback is connected."""377 """Status callback is connected."""
350 self.assertEqual(self.ui.sd.status_changed_callback,378 self.assertEqual(self.ui.sd.status_changed_callback,
351 self.ui.on_status_changed,379 self.ui.on_status_changed,
352 'status_changed callback must be set')380 'status_changed callback must be set')
353381
382 def test_status_label_ellipsizes(self):
383 """The status label ellipsizes."""
384 expected = pango.ELLIPSIZE_END
385 actual = self.ui.status_label.get_ellipsize()
386 self.assertEqual(expected, actual, 'label ellipsizes is ELLIPSIZE_END.')
387
354 def test_on_status_changed_updates_status_label(self):388 def test_on_status_changed_updates_status_label(self):
355 """On status changed the status label is updated."""389 """On status changed, the status label is updated."""
356 kwargs = dict(name='test', description='the status for testing',390 name = 'TEST'
357 is_error=False, is_connected=True, is_online=False,391 description = 'the status for testing'
358 queues=None, connection=None)392 connection = 'funny funny connection'
393 kwargs = dict(name=name, description=description, connection=connection)
394
395 # usual case, all values are defined
359 self.ui.on_status_changed(**kwargs)396 self.ui.on_status_changed(**kwargs)
360 self.assertEqual(self.ui.status_label.get_text(), kwargs['description'])397 self.assert_status_label_correct(**kwargs)
398
399 def test_on_status_changed_updates_status_label_even_on_weird_cases(self):
400 """On status changed, the status label is updated."""
401 name = 'TEST'
402 description = 'the status for testing'
403 connection = 'funny funny connection'
404 kwargs = dict(name=name, description=description, connection=connection)
405
406 keywords = ('name', 'description', 'connection') # need ordering
407 for attr in keywords:
408 old_value = kwargs[attr]
409
410 # some weird cases: attr is '' or None
411 for value in ('', None):
412 kwargs[attr] = value
413 self.ui.on_status_changed(**kwargs)
414 others = (kwargs[k] for k in keywords if k != attr)
415 expected = self.ui.STATUS_JOINER.join(others)
416 self.assert_status_label_correct(expected=expected)
417
418 kwargs[attr] = old_value
361419
362 def test_update_is_correct_for_status_label(self):420 def test_update_is_correct_for_status_label(self):
363 """Correctly updates the status label."""421 """Correctly updates the status label."""
364 expected = 'dummy test'422 name = 'TEST'
365 self.ui.sd.current_state._set(description=expected)423 description = 'the status for testing'
424 connection = 'funny funny connection'
425 kwargs = dict(name=name, description=description, connection=connection)
426 self.ui.sd.current_state._set(**kwargs)
366427
367 self.ui.update()428 self.ui.update()
368429 self.assert_status_label_correct(**kwargs)
369 self.assertEqual(expected, self.ui.status_label.get_text())430
431 def test_on_stopped_updates_status_label(self):
432 """On SD stoppped, the UI updates the status label."""
433 self.patch(self.ui, 'on_status_changed', self.set_called)
434 self.ui.on_stopped()
435 self.assertTrue(self._called,
436 'on_status_changed was called on_stopped.')
437
438 def test_status_label_default_if_not_started(self):
439 """Status label is the default if not started."""
440 self.assert_status_label_correct(expected=self.ui.STATUS['initial'])
441
442 def test_status_label_empty_if_started_and_no_name_nor_desc(self):
443 """Status label is empty if started but no name and no description."""
444 self.do_start()
445 self.ui.on_status_changed(name=None, description=None)
446 self.assert_status_label_correct(expected='')
370447
371448
372class MagicicadaUIConnectionTestCase(MagicicadaUITestCase):449class MagicicadaUIConnectionTestCase(MagicicadaUITestCase):
@@ -425,10 +502,7 @@
425502
426 def test_on_started_is_correct(self):503 def test_on_started_is_correct(self):
427 """On SD started, the UI enables connect and indicator."""504 """On SD started, the UI enables connect and indicator."""
428 # must have click start first505 self.do_start()
429 self.ui.on_start_clicked(self.ui.start)
430
431 self.ui.on_started()
432506
433 self.assertTrue(self.ui.widget_enabled(self.ui.stop))507 self.assertTrue(self.ui.widget_enabled(self.ui.stop))
434 self.assertTrue(self.ui.widget_enabled(self.ui.connect))508 self.assertTrue(self.ui.widget_enabled(self.ui.connect))
@@ -438,11 +512,7 @@
438512
439 def test_on_connected_is_correct(self):513 def test_on_connected_is_correct(self):
440 """On SD connected, the UI enables indicator."""514 """On SD connected, the UI enables indicator."""
441 self.ui.on_start_clicked(self.ui.start)515 self.do_connect()
442 self.ui.on_started()
443 self.ui.on_connect_clicked(self.ui.start)
444
445 self.ui.on_connected()
446516
447 self.assertTrue(self.ui.widget_enabled(self.ui.disconnect))517 self.assertTrue(self.ui.widget_enabled(self.ui.disconnect))
448 self.assert_indicator_ready(self.ui.is_started)518 self.assert_indicator_ready(self.ui.is_started)
@@ -451,10 +521,7 @@
451521
452 def test_on_online_is_correct(self):522 def test_on_online_is_correct(self):
453 """On SD online, the UI enables indicator."""523 """On SD online, the UI enables indicator."""
454 self.ui.on_start_clicked(self.ui.start)524 self.do_connect()
455 self.ui.on_started()
456 self.ui.on_connect_clicked(self.ui.connect)
457 self.ui.on_connected()
458525
459 self.ui.on_online()526 self.ui.on_online()
460527
@@ -464,8 +531,7 @@
464531
465 def test_on_stopped_is_correct(self):532 def test_on_stopped_is_correct(self):
466 """On SD stopped, the UI disables stop and indicator."""533 """On SD stopped, the UI disables stop and indicator."""
467 self.ui.on_start_clicked(self.ui.start)534 self.do_start()
468 self.ui.on_started()
469 self.ui.on_stop_clicked(self.ui.stop)535 self.ui.on_stop_clicked(self.ui.stop)
470536
471 self.ui.on_stopped()537 self.ui.on_stopped()
@@ -478,10 +544,7 @@
478544
479 def test_on_disconnected_is_correct(self):545 def test_on_disconnected_is_correct(self):
480 """On SD disconnected, the UI disables connect and indicator."""546 """On SD disconnected, the UI disables connect and indicator."""
481 self.ui.on_start_clicked(self.ui.start)547 self.do_connect()
482 self.ui.on_started()
483 self.ui.on_connect_clicked(self.ui.connect)
484 self.ui.on_connected()
485 self.ui.on_disconnect_clicked(self.ui.disconnect)548 self.ui.on_disconnect_clicked(self.ui.disconnect)
486549
487 self.ui.on_disconnected()550 self.ui.on_disconnected()
@@ -493,10 +556,7 @@
493556
494 def test_on_offline_is_correct(self):557 def test_on_offline_is_correct(self):
495 """On SD offline, the UI disables indicator."""558 """On SD offline, the UI disables indicator."""
496 self.ui.on_start_clicked(self.ui.start)559 self.do_connect()
497 self.ui.on_started()
498 self.ui.on_connect_clicked(self.ui.connect)
499 self.ui.on_connected()
500560
501 self.ui.on_offline()561 self.ui.on_offline()
502562

Subscribers

People subscribed via source and target branches

to all changes: