Merge lp:~nataliabidart/magicicada-gui/show-queue-state into lp:magicicada-gui

Proposed by Natalia Bidart
Status: Merged
Approved by: Facundo Batista
Approved revision: 26
Merged at revision: 25
Proposed branch: lp:~nataliabidart/magicicada-gui/show-queue-state
Merge into: lp:magicicada-gui
Diff against target: 544 lines (+211/-151)
3 files modified
data/ui/gui.glade (+161/-121)
magicicada/__init__.py (+4/-2)
magicicada/tests/test_magicicada.py (+46/-28)
To merge this branch: bzr merge lp:~nataliabidart/magicicada-gui/show-queue-state
Reviewer Review Type Date Requested Status
chicharreros Pending
Review via email: mp+25914@code.launchpad.net

Description of the change

Queue state is shown. Queues tree views have now title. Tests can now be run with trial.

To post a comment you must log in.
Revision history for this message
Facundo Batista (facundo) wrote :

Like it!

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-23 23:26:22 +0000
+++ data/ui/gui.glade 2010-05-24 19:21:27 +0000
@@ -119,7 +119,7 @@
119 </child>119 </child>
120 <child>120 <child>
121 <object class="GtkToolButton" id="connect">121 <object class="GtkToolButton" id="connect">
122 <property name="width_request">80</property>122 <property name="width_request">85</property>
123 <property name="visible">True</property>123 <property name="visible">True</property>
124 <property name="sensitive">False</property>124 <property name="sensitive">False</property>
125 <property name="label" translatable="yes">Connect</property>125 <property name="label" translatable="yes">Connect</property>
@@ -134,7 +134,7 @@
134 </child>134 </child>
135 <child>135 <child>
136 <object class="GtkToolButton" id="disconnect">136 <object class="GtkToolButton" id="disconnect">
137 <property name="width_request">80</property>137 <property name="width_request">85</property>
138 <property name="label" translatable="yes">Disconnect</property>138 <property name="label" translatable="yes">Disconnect</property>
139 <property name="use_underline">True</property>139 <property name="use_underline">True</property>
140 <property name="stock_id">gtk-disconnect</property>140 <property name="stock_id">gtk-disconnect</property>
@@ -223,147 +223,187 @@
223 <property name="visible">True</property>223 <property name="visible">True</property>
224 <property name="can_focus">True</property>224 <property name="can_focus">True</property>
225 <child>225 <child>
226 <object class="GtkScrolledWindow" id="scrolledwindow1">226 <object class="GtkHBox" id="hbox3">
227 <property name="visible">True</property>227 <property name="visible">True</property>
228 <property name="can_focus">True</property>228 <child>
229 <property name="hscrollbar_policy">automatic</property>229 <object class="GtkLabel" id="label1">
230 <child>230 <property name="visible">True</property>
231 <object class="GtkTreeView" id="metaq_view">231 <property name="label" translatable="yes">Metadata Queue</property>
232 <property name="visible">True</property>232 <property name="angle">90</property>
233 <property name="sensitive">False</property>233 </object>
234 <packing>
235 <property name="expand">False</property>
236 <property name="fill">False</property>
237 <property name="position">0</property>
238 </packing>
239 </child>
240 <child>
241 <object class="GtkScrolledWindow" id="scrolledwindow1">
242 <property name="visible">True</property>
234 <property name="can_focus">True</property>243 <property name="can_focus">True</property>
235 <property name="model">metaq_store</property>244 <property name="hscrollbar_policy">automatic</property>
236 <property name="headers_clickable">False</property>245 <child>
237 <property name="rules_hint">True</property>246 <object class="GtkTreeView" id="metaq_view">
238 <property name="search_column">0</property>247 <property name="visible">True</property>
239 <property name="enable_grid_lines">both</property>248 <property name="sensitive">False</property>
240 <property name="enable_tree_lines">True</property>249 <property name="can_focus">True</property>
241 <child>250 <property name="model">metaq_store</property>
242 <object class="GtkTreeViewColumn" id="metaq_operation">251 <property name="headers_clickable">False</property>
243 <property name="resizable">True</property>252 <property name="rules_hint">True</property>
244 <property name="title">Operation</property>253 <property name="search_column">0</property>
245 <property name="expand">True</property>254 <property name="enable_grid_lines">both</property>
246 <child>255 <property name="enable_tree_lines">True</property>
247 <object class="GtkCellRendererText" id="cellrenderertext1"/>256 <child>
248 <attributes>257 <object class="GtkTreeViewColumn" id="metaq_operation">
249 <attribute name="text">0</attribute>258 <property name="resizable">True</property>
250 </attributes>259 <property name="title">Operation</property>
251 </child>260 <property name="expand">True</property>
252 </object>261 <child>
253 </child>262 <object class="GtkCellRendererText" id="cellrenderertext1"/>
254 <child>263 <attributes>
255 <object class="GtkTreeViewColumn" id="metaq_path">264 <attribute name="text">0</attribute>
256 <property name="title">Path</property>265 </attributes>
257 <property name="expand">True</property>266 </child>
258 <child>267 </object>
259 <object class="GtkCellRendererText" id="cellrenderertext2"/>268 </child>
260 <attributes>269 <child>
261 <attribute name="text">1</attribute>270 <object class="GtkTreeViewColumn" id="metaq_path">
262 </attributes>271 <property name="title">Path</property>
263 </child>272 <property name="expand">True</property>
264 </object>273 <child>
265 </child>274 <object class="GtkCellRendererText" id="cellrenderertext2"/>
266 <child>275 <attributes>
267 <object class="GtkTreeViewColumn" id="metaq_node">276 <attribute name="text">1</attribute>
268 <property name="title">Node</property>277 </attributes>
269 <property name="expand">True</property>278 </child>
270 <child>279 </object>
271 <object class="GtkCellRendererText" id="cellrenderertext3"/>280 </child>
272 <attributes>281 <child>
273 <attribute name="text">2</attribute>282 <object class="GtkTreeViewColumn" id="metaq_node">
274 </attributes>283 <property name="title">Node</property>
275 </child>284 <property name="expand">True</property>
276 </object>285 <child>
277 </child>286 <object class="GtkCellRendererText" id="cellrenderertext3"/>
278 <child>287 <attributes>
279 <object class="GtkTreeViewColumn" id="metaq_share">288 <attribute name="text">2</attribute>
280 <property name="title">Share</property>289 </attributes>
281 <property name="expand">True</property>290 </child>
282 <child>291 </object>
283 <object class="GtkCellRendererText" id="cellrenderertext4"/>292 </child>
284 <attributes>293 <child>
285 <attribute name="text">3</attribute>294 <object class="GtkTreeViewColumn" id="metaq_share">
286 </attributes>295 <property name="title">Share</property>
296 <property name="expand">True</property>
297 <child>
298 <object class="GtkCellRendererText" id="cellrenderertext4"/>
299 <attributes>
300 <attribute name="text">3</attribute>
301 </attributes>
302 </child>
303 </object>
287 </child>304 </child>
288 </object>305 </object>
289 </child>306 </child>
290 </object>307 </object>
308 <packing>
309 <property name="position">1</property>
310 </packing>
291 </child>311 </child>
292 </object>312 </object>
293 <packing>313 <packing>
294 <property name="resize">False</property>314 <property name="resize">True</property>
295 <property name="shrink">True</property>315 <property name="shrink">True</property>
296 </packing>316 </packing>
297 </child>317 </child>
298 <child>318 <child>
299 <object class="GtkScrolledWindow" id="scrolledwindow2">319 <object class="GtkHBox" id="hbox4">
300 <property name="visible">True</property>320 <property name="visible">True</property>
301 <property name="can_focus">True</property>321 <child>
302 <property name="hscrollbar_policy">automatic</property>322 <object class="GtkLabel" id="label2">
303 <child>323 <property name="visible">True</property>
304 <object class="GtkTreeView" id="contentq_view">324 <property name="label" translatable="yes">Content Queue</property>
305 <property name="visible">True</property>325 <property name="angle">90</property>
306 <property name="sensitive">False</property>326 </object>
327 <packing>
328 <property name="expand">False</property>
329 <property name="fill">False</property>
330 <property name="position">0</property>
331 </packing>
332 </child>
333 <child>
334 <object class="GtkScrolledWindow" id="scrolledwindow2">
335 <property name="visible">True</property>
307 <property name="can_focus">True</property>336 <property name="can_focus">True</property>
308 <property name="model">contentq_store</property>337 <property name="hscrollbar_policy">automatic</property>
309 <property name="headers_clickable">False</property>338 <child>
310 <property name="rules_hint">True</property>339 <object class="GtkTreeView" id="contentq_view">
311 <property name="search_column">0</property>340 <property name="visible">True</property>
312 <property name="enable_grid_lines">both</property>341 <property name="sensitive">False</property>
313 <property name="enable_tree_lines">True</property>342 <property name="can_focus">True</property>
314 <child>343 <property name="model">contentq_store</property>
315 <object class="GtkTreeViewColumn" id="contentq_operation">344 <property name="headers_clickable">False</property>
316 <property name="title">Operation</property>345 <property name="rules_hint">True</property>
317 <property name="expand">True</property>346 <property name="search_column">0</property>
318 <child>347 <property name="enable_grid_lines">both</property>
319 <object class="GtkCellRendererText" id="cellrenderertext5"/>348 <property name="enable_tree_lines">True</property>
320 <attributes>349 <child>
321 <attribute name="text">0</attribute>350 <object class="GtkTreeViewColumn" id="contentq_operation">
322 </attributes>351 <property name="title">Operation</property>
323 </child>352 <property name="expand">True</property>
324 </object>353 <child>
325 </child>354 <object class="GtkCellRendererText" id="cellrenderertext5"/>
326 <child>355 <attributes>
327 <object class="GtkTreeViewColumn" id="contentq_path">356 <attribute name="text">0</attribute>
328 <property name="title">Path</property>357 </attributes>
329 <property name="expand">True</property>358 </child>
330 <child>359 </object>
331 <object class="GtkCellRendererText" id="cellrenderertext6"/>360 </child>
332 <attributes>361 <child>
333 <attribute name="text">1</attribute>362 <object class="GtkTreeViewColumn" id="contentq_path">
334 </attributes>363 <property name="title">Path</property>
335 </child>364 <property name="expand">True</property>
336 </object>365 <child>
337 </child>366 <object class="GtkCellRendererText" id="cellrenderertext6"/>
338 <child>367 <attributes>
339 <object class="GtkTreeViewColumn" id="contentq_node">368 <attribute name="text">1</attribute>
340 <property name="title">Node</property>369 </attributes>
341 <property name="expand">True</property>370 </child>
342 <child>371 </object>
343 <object class="GtkCellRendererText" id="cellrenderertext7"/>372 </child>
344 <attributes>373 <child>
345 <attribute name="text">2</attribute>374 <object class="GtkTreeViewColumn" id="contentq_node">
346 </attributes>375 <property name="title">Node</property>
347 </child>376 <property name="expand">True</property>
348 </object>377 <child>
349 </child>378 <object class="GtkCellRendererText" id="cellrenderertext7"/>
350 <child>379 <attributes>
351 <object class="GtkTreeViewColumn" id="contentq_share">380 <attribute name="text">2</attribute>
352 <property name="title">Share</property>381 </attributes>
353 <property name="expand">True</property>382 </child>
354 <child>383 </object>
355 <object class="GtkCellRendererText" id="cellrenderertext8"/>384 </child>
356 <attributes>385 <child>
357 <attribute name="text">3</attribute>386 <object class="GtkTreeViewColumn" id="contentq_share">
358 </attributes>387 <property name="title">Share</property>
388 <property name="expand">True</property>
389 <child>
390 <object class="GtkCellRendererText" id="cellrenderertext8"/>
391 <attributes>
392 <attribute name="text">3</attribute>
393 </attributes>
394 </child>
395 </object>
359 </child>396 </child>
360 </object>397 </object>
361 </child>398 </child>
362 </object>399 </object>
400 <packing>
401 <property name="position">1</property>
402 </packing>
363 </child>403 </child>
364 </object>404 </object>
365 <packing>405 <packing>
366 <property name="resize">False</property>406 <property name="resize">True</property>
367 <property name="shrink">True</property>407 <property name="shrink">True</property>
368 </packing>408 </packing>
369 </child>409 </child>
370410
=== modified file 'magicicada/__init__.py'
--- magicicada/__init__.py 2010-05-23 23:26:22 +0000
+++ magicicada/__init__.py 2010-05-24 19:21:27 +0000
@@ -171,7 +171,8 @@
171 self._activate_indicator(self.is_online, sensitive=False)171 self._activate_indicator(self.is_online, sensitive=False)
172172
173 cs = self.sd.current_state173 cs = self.sd.current_state
174 self.on_status_changed(cs.name, cs.description)174 self.on_status_changed(name=cs.name, description=cs.description,
175 queues=cs.queues, connection=cs.connection)
175 self.on_meta_queue_changed(self.sd.meta_queue)176 self.on_meta_queue_changed(self.sd.meta_queue)
176 self.on_content_queue_changed(self.sd.content_queue)177 self.on_content_queue_changed(self.sd.content_queue)
177178
@@ -206,7 +207,7 @@
206 is_error=False, is_connected=True, is_online=True,207 is_error=False, is_connected=True, is_online=True,
207 queues=None, connection=None):208 queues=None, connection=None):
208 """Callback'ed when the SD status changed."""209 """Callback'ed when the SD status changed."""
209 values = (v for v in (name, description, connection) if v)210 values = (v for v in (name, description, queues, connection) if v)
210 text = self.STATUS_JOINER.join(values)211 text = self.STATUS_JOINER.join(values)
211 if not (text or self.sd.current_state.is_started):212 if not (text or self.sd.current_state.is_started):
212 text = self.STATUS['initial']213 text = self.STATUS['initial']
@@ -265,4 +266,5 @@
265 self.on_content_queue_changed(self.sd.content_queue)266 self.on_content_queue_changed(self.sd.content_queue)
266 self.on_status_changed(name=current_state.name,267 self.on_status_changed(name=current_state.name,
267 description=current_state.description,268 description=current_state.description,
269 queues=current_state.queues,
268 connection=current_state.connection)270 connection=current_state.connection)
269271
=== modified file 'magicicada/tests/test_magicicada.py'
--- magicicada/tests/test_magicicada.py 2010-05-23 23:26:22 +0000
+++ magicicada/tests/test_magicicada.py 2010-05-24 19:21:27 +0000
@@ -18,6 +18,8 @@
1818
19"""Tests for magicicada."""19"""Tests for magicicada."""
2020
21from functools import wraps
22
21import pango23import pango
2224
23from twisted.trial.unittest import TestCase25from twisted.trial.unittest import TestCase
@@ -58,7 +60,7 @@
58 """Init."""60 """Init."""
59 self.ui = MagicicadaUI(syncdaemon_class=FakedSyncdaemon)61 self.ui = MagicicadaUI(syncdaemon_class=FakedSyncdaemon)
60 self._called = False62 self._called = False
61 self.set_called = lambda *_: setattr(self, '_called', True)63 self.set_called = lambda *args, **kwargs: setattr(self, '_called', True)
6264
63 def tearDown(self):65 def tearDown(self):
64 """Cleanup."""66 """Cleanup."""
@@ -245,6 +247,16 @@
245 self.assertTrue(self.ui.main_window.get_property('visible'), msg)247 self.assertTrue(self.ui.main_window.get_property('visible'), msg)
246248
247249
250def skip_abstract_class(test):
251 """If 'test' belongs to an abstract class, don't run it."""
252 @wraps(test)
253 def inner(klass):
254 """Execute 'test' only if not in an abstract class."""
255 if klass.queue is not None:
256 test(klass)
257 return inner
258
259
248class _MagicicadaUIQueueTestCase(MagicicadaUITestCase):260class _MagicicadaUIQueueTestCase(MagicicadaUITestCase):
249 """Abstratc UI test cases for queue tree views."""261 """Abstratc UI test cases for queue tree views."""
250262
@@ -253,6 +265,8 @@
253 def setUp(self):265 def setUp(self):
254 """Init."""266 """Init."""
255 super(_MagicicadaUIQueueTestCase, self).setUp()267 super(_MagicicadaUIQueueTestCase, self).setUp()
268 if self.queue is None:
269 return
256 self.sd_changed = getattr(self.ui.sd,270 self.sd_changed = getattr(self.ui.sd,
257 '%s_queue_changed_callback' % self.queue)271 '%s_queue_changed_callback' % self.queue)
258 self.ui_changed = getattr(self.ui,272 self.ui_changed = getattr(self.ui,
@@ -289,11 +303,13 @@
289303
290 tree_iter = queue_store.iter_next(tree_iter)304 tree_iter = queue_store.iter_next(tree_iter)
291305
306 @skip_abstract_class
292 def test_callback_is_connected(self):307 def test_callback_is_connected(self):
293 """Queue changed callback is connected."""308 """Queue changed callback is connected."""
294 self.assertEqual(self.sd_changed, self.ui_changed,309 self.assertEqual(self.sd_changed, self.ui_changed,
295 '%s queue callback must be set' % self.queue)310 '%s queue callback must be set' % self.queue)
296311
312 @skip_abstract_class
297 def test_model_is_binded(self):313 def test_model_is_binded(self):
298 """List store is binded."""314 """List store is binded."""
299 actual = self.queue_view.get_model()315 actual = self.queue_view.get_model()
@@ -301,12 +317,14 @@
301 self.assertEqual(self.queue_store, actual,317 self.assertEqual(self.queue_store, actual,
302 msg % (self.queue, self.queue_store))318 msg % (self.queue, self.queue_store))
303319
320 @skip_abstract_class
304 def test_on_queue_changed_updates_view(self):321 def test_on_queue_changed_updates_view(self):
305 """On queue changed the view is updated."""322 """On queue changed the view is updated."""
306 items = self.build_some_data()323 items = self.build_some_data()
307 self.sd_changed(items)324 self.sd_changed(items)
308 self.assert_queue_store_correct(self.queue_store, items)325 self.assert_queue_store_correct(self.queue_store, items)
309326
327 @skip_abstract_class
310 def test_model_is_cleared_before_updating(self):328 def test_model_is_cleared_before_updating(self):
311 """The model is cleared before upadting with a new set of data."""329 """The model is cleared before upadting with a new set of data."""
312 items = self.build_some_data()330 items = self.build_some_data()
@@ -316,6 +334,7 @@
316 self.sd_changed(items)334 self.sd_changed(items)
317 self.assertEqual(len(self.queue_store), len(items))335 self.assertEqual(len(self.queue_store), len(items))
318336
337 @skip_abstract_class
319 def test_view_is_enabled_if_disabled_on_changed(self):338 def test_view_is_enabled_if_disabled_on_changed(self):
320 """The tree view is enabled on changed if it was disabled."""339 """The tree view is enabled on changed if it was disabled."""
321 self.assertFalse(self.queue_view.is_sensitive(),340 self.assertFalse(self.queue_view.is_sensitive(),
@@ -326,6 +345,7 @@
326 self.assertTrue(self.queue_view.is_sensitive(),345 self.assertTrue(self.queue_view.is_sensitive(),
327 'Tree view must be enabled on changed.')346 'Tree view must be enabled on changed.')
328347
348 @skip_abstract_class
329 def test_update_is_correct_for_queue(self):349 def test_update_is_correct_for_queue(self):
330 """Correctly updates the queue state."""350 """Correctly updates the queue state."""
331 data = self.build_some_data()351 data = self.build_some_data()
@@ -335,6 +355,7 @@
335355
336 self.assert_queue_store_correct(self.queue_store, data)356 self.assert_queue_store_correct(self.queue_store, data)
337357
358 @skip_abstract_class
338 def test_on_stopped_updates_queue(self):359 def test_on_stopped_updates_queue(self):
339 """On SD stoppped, the UI updates the queue state."""360 """On SD stoppped, the UI updates the queue state."""
340 cb = 'on_%s_queue_changed' % self.queue361 cb = 'on_%s_queue_changed' % self.queue
@@ -359,14 +380,26 @@
359class MagicicadaUIStatusTestCase(MagicicadaUITestCase):380class MagicicadaUIStatusTestCase(MagicicadaUITestCase):
360 """UI test cases for the status label."""381 """UI test cases for the status label."""
361382
383 def setUp(self):
384 """Init."""
385 super(MagicicadaUIStatusTestCase, self).setUp()
386 name = 'TEST'
387 description = 'the status for testing'
388 connection = 'Funny funny connection'
389 queues = 'The queues are hilarious'
390 self.kwargs = dict(name=name, description=description,
391 connection=connection, queues=queues)
392
362 def assert_status_label_correct(self, name=None, description=None,393 def assert_status_label_correct(self, name=None, description=None,
363 connection=None, expected=None):394 connection=None, queues=None,
395 expected=None):
364 """Test that the status label is of the form name: description."""396 """Test that the status label is of the form name: description."""
365 if expected is None:397 if expected is None:
366 assert name is not None398 assert name is not None
367 assert description is not None399 assert description is not None
368 assert connection is not None400 assert connection is not None
369 values = (name, description, connection)401 assert queues is not None
402 values = (name, description, queues, connection)
370 expected = self.ui.STATUS_JOINER.join(values)403 expected = self.ui.STATUS_JOINER.join(values)
371404
372 actual = self.ui.status_label.get_text()405 actual = self.ui.status_label.get_text()
@@ -387,46 +420,31 @@
387420
388 def test_on_status_changed_updates_status_label(self):421 def test_on_status_changed_updates_status_label(self):
389 """On status changed, the status label is updated."""422 """On status changed, the status label is updated."""
390 name = 'TEST'
391 description = 'the status for testing'
392 connection = 'funny funny connection'
393 kwargs = dict(name=name, description=description, connection=connection)
394
395 # usual case, all values are defined423 # usual case, all values are defined
396 self.ui.on_status_changed(**kwargs)424 self.ui.on_status_changed(**self.kwargs)
397 self.assert_status_label_correct(**kwargs)425 self.assert_status_label_correct(**self.kwargs)
398426
399 def test_on_status_changed_updates_status_label_even_on_weird_cases(self):427 def test_on_status_changed_updates_status_label_even_on_weird_cases(self):
400 """On status changed, the status label is updated."""428 """On status changed, the status label is updated."""
401 name = 'TEST'429 keywords = ('name', 'description', 'queues', 'connection') # need order
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:430 for attr in keywords:
408 old_value = kwargs[attr]431 old_value = self.kwargs[attr]
409432
410 # some weird cases: attr is '' or None433 # some weird cases: attr is '' or None
411 for value in ('', None):434 for value in ('', None):
412 kwargs[attr] = value435 self.kwargs[attr] = value
413 self.ui.on_status_changed(**kwargs)436 self.ui.on_status_changed(**self.kwargs)
414 others = (kwargs[k] for k in keywords if k != attr)437 others = (self.kwargs[k] for k in keywords if k != attr)
415 expected = self.ui.STATUS_JOINER.join(others)438 expected = self.ui.STATUS_JOINER.join(others)
416 self.assert_status_label_correct(expected=expected)439 self.assert_status_label_correct(expected=expected)
417440
418 kwargs[attr] = old_value441 self.kwargs[attr] = old_value
419442
420 def test_update_is_correct_for_status_label(self):443 def test_update_is_correct_for_status_label(self):
421 """Correctly updates the status label."""444 """Correctly updates the status label."""
422 name = 'TEST'445 self.ui.sd.current_state._set(**self.kwargs)
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)
427
428 self.ui.update()446 self.ui.update()
429 self.assert_status_label_correct(**kwargs)447 self.assert_status_label_correct(**self.kwargs)
430448
431 def test_on_stopped_updates_status_label(self):449 def test_on_stopped_updates_status_label(self):
432 """On SD stoppped, the UI updates the status label."""450 """On SD stoppped, the UI updates the status label."""

Subscribers

People subscribed via source and target branches

to all changes: